From 2c19d432c270027af8692ce1ff73f7d339bea9c7 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Thu, 10 Jun 2010 20:18:29 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=B0=20trunk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +YUCHENG HU+ git-svn-id: https://svn.code.sf.net/p/hawebs/svn@111 a2543c7e-f6e9-4f8a-8bff-1ffc34733512 --- .../modules/Accounts/AccountHierarchy.php | 43 + oss/vtiger/trunk/modules/Accounts/Accounts.js | 414 + .../trunk/modules/Accounts/Accounts.php | 1233 + .../trunk/modules/Accounts/AccountsAjax.php | 14 + .../trunk/modules/Accounts/AddressChange.php | 52 + .../modules/Accounts/CallRelatedList.php | 79 + .../trunk/modules/Accounts/CustomAction.php | 12 + .../trunk/modules/Accounts/CustomView.php | 14 + oss/vtiger/trunk/modules/Accounts/Delete.php | 39 + .../trunk/modules/Accounts/DetailView.php | 165 + .../trunk/modules/Accounts/DetailViewAjax.php | 53 + .../trunk/modules/Accounts/EditView.php | 134 + .../trunk/modules/Accounts/ExportRecords.php | 14 + .../modules/Accounts/FindDuplicateRecords.php | 106 + oss/vtiger/trunk/modules/Accounts/Import.php | 45 + .../trunk/modules/Accounts/ListView.php | 344 + .../modules/Accounts/ListViewPagging.php | 11 + .../trunk/modules/Accounts/ListViewTop.php | 107 + .../trunk/modules/Accounts/MailerExport.php | 325 + .../trunk/modules/Accounts/MassEdit.php | 45 + .../trunk/modules/Accounts/MassEditSave.php | 67 + oss/vtiger/trunk/modules/Accounts/Merge.php | 298 + oss/vtiger/trunk/modules/Accounts/Popup.php | 16 + .../modules/Accounts/ProcessDuplicates.php | 134 + .../trunk/modules/Accounts/QuickCreate.php | 12 + oss/vtiger/trunk/modules/Accounts/Save.php | 217 + .../trunk/modules/Accounts/Settings.php | 13 + .../trunk/modules/Accounts/TagCloud.php | 12 + .../trunk/modules/Accounts/Tickerdetail.php | 100 + .../trunk/modules/Accounts/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/Accounts/index.php | 57 + .../modules/Accounts/language/en_us.lang.php | 242 + .../modules/Accounts/language/zh_cn.lang.php | 240 + .../modules/Accounts/updateRelations.php | 50 + .../Activities/language/zh_cn.lang.php | 89 + .../trunk/modules/Administration/Forms.php | 24 + .../trunk/modules/Administration/index.php | 25 + .../Administration/language/en_us.lang.php | 28 + .../Administration/language/zh_cn.lang.php | 27 + .../trunk/modules/Calendar/Activity.php | 952 + .../trunk/modules/Calendar/ActivityAjax.php | 239 + .../Calendar/ActivityReminderCallbackAjax.php | 128 + .../ActivityReminderSetupCallbackAjax.php | 45 + .../trunk/modules/Calendar/Appointment.php | 297 + oss/vtiger/trunk/modules/Calendar/Calendar.js | 99 + .../trunk/modules/Calendar/Calendar.php | 297 + .../trunk/modules/Calendar/CalendarAjax.php | 13 + .../trunk/modules/Calendar/CalendarCommon.php | 617 + .../trunk/modules/Calendar/CustomView.php | 14 + oss/vtiger/trunk/modules/Calendar/Date.php | 511 + oss/vtiger/trunk/modules/Calendar/Delete.php | 36 + .../trunk/modules/Calendar/DetailView.php | 358 + .../trunk/modules/Calendar/EditView.php | 297 + .../trunk/modules/Calendar/ListView.php | 276 + .../modules/Calendar/ListViewPagging.php | 11 + .../trunk/modules/Calendar/OpenListView.php | 201 + .../trunk/modules/Calendar/QuickCreate.php | 19 + .../modules/Calendar/RenderRelatedListUI.php | 164 + .../trunk/modules/Calendar/RepeatEvents.php | 182 + oss/vtiger/trunk/modules/Calendar/Save.php | 306 + .../trunk/modules/Calendar/SendReminder.bat | 3 + .../trunk/modules/Calendar/Settings.php | 42 + .../trunk/modules/Calendar/TagCloud.php | 12 + .../trunk/modules/Calendar/TodoSave.php | 88 + .../trunk/modules/Calendar/UnifiedSearch.php | 11 + .../trunk/modules/Calendar/addEventUI.php | 1106 + .../trunk/modules/Calendar/calendarLayout.php | 2196 ++ .../trunk/modules/Calendar/calendar_share.php | 169 + .../modules/Calendar/disable_sharing.php | 22 + oss/vtiger/trunk/modules/Calendar/header.php | 120 + oss/vtiger/trunk/modules/Calendar/index.php | 32 + .../modules/Calendar/language/en_us.lang.php | 442 + .../modules/Calendar/language/zh_cn.lang.php | 441 + .../trunk/modules/Calendar/new_calendar.php | 92 + oss/vtiger/trunk/modules/Calendar/script.js | 1399 + .../Calendar/updateCalendarSharing.php | 45 + .../modules/Calendar/updateRelations.php | 64 + .../modules/Calls/language/zh_cn.lang.php | 45 + .../modules/Campaigns/CallRelatedList.php | 104 + .../trunk/modules/Campaigns/Campaigns.js | 42 + .../trunk/modules/Campaigns/Campaigns.php | 466 + .../trunk/modules/Campaigns/CampaignsAjax.php | 13 + .../trunk/modules/Campaigns/CustomView.php | 14 + oss/vtiger/trunk/modules/Campaigns/Delete.php | 39 + .../trunk/modules/Campaigns/DetailView.php | 107 + .../modules/Campaigns/DetailViewAjax.php | 45 + .../trunk/modules/Campaigns/EditView.php | 131 + .../trunk/modules/Campaigns/ListView.php | 262 + .../modules/Campaigns/ListViewPagging.php | 11 + .../trunk/modules/Campaigns/LoadList.php | 38 + .../trunk/modules/Campaigns/MassEdit.php | 45 + .../trunk/modules/Campaigns/MassEditSave.php | 67 + oss/vtiger/trunk/modules/Campaigns/Popup.php | 23 + .../trunk/modules/Campaigns/QuickCreate.php | 12 + oss/vtiger/trunk/modules/Campaigns/Save.php | 80 + .../trunk/modules/Campaigns/Settings.php | 13 + .../trunk/modules/Campaigns/TagCloud.php | 12 + .../trunk/modules/Campaigns/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/Campaigns/index.php | 17 + .../modules/Campaigns/language/en_us.lang.php | 91 + .../modules/Campaigns/language/zh_cn.lang.php | 92 + .../modules/Campaigns/updateRelations.php | 57 + .../modules/Cases/language/zh_cn.lang.php | 39 + .../modules/Contacts/CallRelatedList.php | 101 + oss/vtiger/trunk/modules/Contacts/Contacts.js | 250 + .../trunk/modules/Contacts/Contacts.php | 1380 + .../trunk/modules/Contacts/ContactsAjax.php | 13 + .../trunk/modules/Contacts/CustomAction.php | 12 + .../trunk/modules/Contacts/CustomView.php | 14 + .../trunk/modules/Contacts/DelImage.php | 52 + oss/vtiger/trunk/modules/Contacts/Delete.php | 39 + .../trunk/modules/Contacts/DetailView.php | 183 + .../trunk/modules/Contacts/DetailViewAjax.php | 112 + .../trunk/modules/Contacts/EditView.php | 239 + .../trunk/modules/Contacts/ExportRecords.php | 13 + .../modules/Contacts/FindDuplicateRecords.php | 106 + oss/vtiger/trunk/modules/Contacts/Import.php | 45 + .../trunk/modules/Contacts/ListView.php | 308 + .../modules/Contacts/ListViewPagging.php | 11 + .../trunk/modules/Contacts/MassEdit.php | 45 + .../trunk/modules/Contacts/MassEditSave.php | 67 + oss/vtiger/trunk/modules/Contacts/Merge.php | 282 + oss/vtiger/trunk/modules/Contacts/Popup.php | 23 + .../modules/Contacts/ProcessDuplicates.php | 133 + .../trunk/modules/Contacts/QuickCreate.php | 12 + oss/vtiger/trunk/modules/Contacts/Save.php | 223 + .../trunk/modules/Contacts/Settings.php | 13 + .../trunk/modules/Contacts/TagCloud.php | 12 + .../trunk/modules/Contacts/UnifiedSearch.php | 11 + .../modules/Contacts/contactSeedData.php | 21190 ++++++++++++++++ .../Contacts/imgs/2tbarPrivateChat.gif | Bin 0 -> 718 bytes .../modules/Contacts/imgs/2tbarPublicChat.gif | Bin 0 -> 742 bytes .../trunk/modules/Contacts/imgs/box_BL.gif | Bin 0 -> 608 bytes .../trunk/modules/Contacts/imgs/box_BR.gif | Bin 0 -> 609 bytes .../trunk/modules/Contacts/imgs/box_M.gif | Bin 0 -> 43 bytes .../trunk/modules/Contacts/imgs/box_ML.gif | Bin 0 -> 55 bytes .../trunk/modules/Contacts/imgs/box_MR.gif | Bin 0 -> 63 bytes .../trunk/modules/Contacts/imgs/box_T.gif | Bin 0 -> 96 bytes .../trunk/modules/Contacts/imgs/box_TL.gif | Bin 0 -> 305 bytes .../trunk/modules/Contacts/imgs/box_TR.gif | Bin 0 -> 304 bytes .../trunk/modules/Contacts/imgs/btn_close.gif | Bin 0 -> 244 bytes .../trunk/modules/Contacts/imgs/btn_hide.gif | Bin 0 -> 236 bytes .../trunk/modules/Contacts/imgs/btn_send.gif | Bin 0 -> 305 bytes .../trunk/modules/Contacts/imgs/bx_B.gif | Bin 0 -> 165 bytes .../trunk/modules/Contacts/imgs/close.gif | Bin 0 -> 400 bytes .../trunk/modules/Contacts/imgs/hide.gif | Bin 0 -> 410 bytes .../modules/Contacts/imgs/icone_chat.gif | Bin 0 -> 288 bytes .../modules/Contacts/imgs/icone_keyb.gif | Bin 0 -> 252 bytes .../trunk/modules/Contacts/imgs/site_bg.gif | Bin 0 -> 1213 bytes .../trunk/modules/Contacts/imgs/user_icon.gif | Bin 0 -> 1111 bytes oss/vtiger/trunk/modules/Contacts/index.php | 27 + .../modules/Contacts/language/en_us.lang.php | 249 + .../modules/Contacts/language/zh_cn.lang.php | 249 + .../modules/Contacts/updateRelations.php | 55 + .../trunk/modules/CustomView/ChangeStatus.php | 54 + .../trunk/modules/CustomView/CustomView.js | 393 + .../trunk/modules/CustomView/CustomView.php | 2019 ++ .../modules/CustomView/CustomViewAjax.php | 13 + .../trunk/modules/CustomView/Delete.php | 31 + .../trunk/modules/CustomView/EditView.php | 391 + oss/vtiger/trunk/modules/CustomView/Forms.php | 253 + .../trunk/modules/CustomView/ListViewTop.php | 173 + .../modules/CustomView/PopulateCustomView.php | 644 + oss/vtiger/trunk/modules/CustomView/Save.php | 247 + .../trunk/modules/CustomView/SaveAction.php | 52 + .../modules/CustomView/SendMailAction.php | 172 + oss/vtiger/trunk/modules/CustomView/index.php | 17 + .../CustomView/language/en_us.lang.php | 285 + .../CustomView/language/zh_cn.lang.php | 282 + .../CustomerPortal/AdvancedSettings.php | 57 + .../modules/CustomerPortal/CustomerPortal.js | 40 + .../modules/CustomerPortal/CustomerPortal.php | 66 + .../CustomerPortal/CustomerPortalAjax.php | 12 + .../CustomerPortal/CustomerPortalHandler.php | 17 + .../trunk/modules/CustomerPortal/ListView.php | 76 + .../modules/CustomerPortal/PortalUtils.php | 136 + .../trunk/modules/CustomerPortal/index.php | 36 + .../CustomerPortal/language/en_us.lang.php | 22 + .../CustomerPortal/language/zh_cn.lang.php | 21 + .../trunk/modules/CustomerPortal/schema.xml | 34 + .../Chart_lead_source_by_outcome.php | 160 + .../Chart_my_pipeline_by_sales_stage.php | 184 + .../Dashboard/Chart_outcome_by_month.php | 197 + .../Chart_pipeline_by_lead_source.php | 161 + .../Chart_pipeline_by_sales_stage.php | 235 + .../trunk/modules/Dashboard/DashboardAjax.php | 14 + .../trunk/modules/Dashboard/DashboardHome.php | 170 + .../Dashboard/DashboardHome_matrix.php | 125 + .../trunk/modules/Dashboard/Entity_charts.php | 837 + oss/vtiger/trunk/modules/Dashboard/Forms.php | 166 + .../trunk/modules/Dashboard/HomepageDB.php | 69 + .../trunk/modules/Dashboard/ReportsCharts.php | 194 + .../Dashboard/accumulated_bargraph.php | 88 + .../modules/Dashboard/display_charts.php | 829 + .../trunk/modules/Dashboard/homestuff.php | 90 + .../modules/Dashboard/horizontal_bargraph.php | 248 + oss/vtiger/trunk/modules/Dashboard/index.php | 393 + .../modules/Dashboard/language/en_us.lang.php | 191 + .../modules/Dashboard/language/zh_cn.lang.php | 190 + .../trunk/modules/Dashboard/line_graph.php | 104 + .../trunk/modules/Dashboard/loadDashBoard.php | 13 + .../trunk/modules/Dashboard/pie_graph.php | 191 + .../modules/Dashboard/vertical_bargraph.php | 224 + .../trunk/modules/Documents/CustomView.php | 14 + oss/vtiger/trunk/modules/Documents/Delete.php | 28 + .../trunk/modules/Documents/DeleteFolder.php | 54 + .../trunk/modules/Documents/DetailView.php | 175 + .../modules/Documents/DetailViewAjax.php | 45 + .../trunk/modules/Documents/Documents.js | 322 + .../trunk/modules/Documents/Documents.php | 441 + .../trunk/modules/Documents/DocumentsAjax.php | 13 + .../trunk/modules/Documents/DownloadFile.php | 68 + .../trunk/modules/Documents/EditView.php | 226 + .../trunk/modules/Documents/EmailFile.php | 38 + .../trunk/modules/Documents/ExportRecords.php | 14 + .../trunk/modules/Documents/ListView.php | 311 + .../modules/Documents/ListViewPagging.php | 11 + .../trunk/modules/Documents/MoveFile.php | 46 + oss/vtiger/trunk/modules/Documents/Popup.php | 23 + .../trunk/modules/Documents/QuickCreate.php | 12 + oss/vtiger/trunk/modules/Documents/Save.php | 64 + .../trunk/modules/Documents/SaveFile.php | 74 + .../trunk/modules/Documents/SaveFolder.php | 84 + .../trunk/modules/Documents/Settings.php | 13 + .../trunk/modules/Documents/TagCloud.php | 12 + .../trunk/modules/Documents/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/Documents/index.php | 26 + .../modules/Documents/language/en_us.lang.php | 138 + .../modules/Documents/language/zh_cn.lang.php | 138 + .../trunk/modules/Emails/CallRelatedList.php | 56 + oss/vtiger/trunk/modules/Emails/Choose.php | 82 + .../trunk/modules/Emails/ChooseEmail.php | 106 + .../trunk/modules/Emails/CustomView.php | 14 + oss/vtiger/trunk/modules/Emails/Delete.php | 36 + .../trunk/modules/Emails/DetailView.php | 159 + oss/vtiger/trunk/modules/Emails/EditView.php | 355 + oss/vtiger/trunk/modules/Emails/Emails.js | 196 + oss/vtiger/trunk/modules/Emails/Emails.php | 690 + .../trunk/modules/Emails/EmailsAjax.php | 53 + .../trunk/modules/Emails/GmailBookmarklet.js | 552 + .../modules/Emails/GmailBookmarkletTrigger.js | 99 + oss/vtiger/trunk/modules/Emails/ListView.php | 202 + .../trunk/modules/Emails/ListViewPagging.php | 11 + .../modules/Emails/PHPMailer_LICENSE.txt | 504 + .../trunk/modules/Emails/PrintEmail.php | 89 + oss/vtiger/trunk/modules/Emails/Save.php | 254 + .../trunk/modules/Emails/SaveBookmarklet.php | 71 + .../trunk/modules/Emails/TrackAccess.php | 40 + .../trunk/modules/Emails/UnifiedSearch.php | 11 + .../trunk/modules/Emails/class.phpmailer.php | 1510 ++ .../trunk/modules/Emails/class.smtp.php | 1050 + .../trunk/modules/Emails/gotodownload.php | 82 + oss/vtiger/trunk/modules/Emails/index.php | 31 + .../modules/Emails/language/en_us.lang.php | 183 + .../Emails/language/phpmailer.lang-en_us.php | 31 + .../Emails/language/phpmailer.lang-zh_cn.php | 31 + .../modules/Emails/language/zh_cn.lang.php | 184 + oss/vtiger/trunk/modules/Emails/mail.php | 519 + .../trunk/modules/Emails/mailSelect.php | 109 + oss/vtiger/trunk/modules/Emails/mailsend.php | 239 + .../templates/testemailtemplateusage.php | 0 .../trunk/modules/Emails/templates/todel.txt | 0 .../trunk/modules/Emails/updateRelations.php | 40 + .../trunk/modules/Emails/webmailsend.php | 61 + .../trunk/modules/Faq/CallRelatedList.php | 77 + oss/vtiger/trunk/modules/Faq/CustomView.php | 14 + oss/vtiger/trunk/modules/Faq/Delete.php | 38 + oss/vtiger/trunk/modules/Faq/DetailView.php | 117 + .../trunk/modules/Faq/DetailViewAjax.php | 56 + oss/vtiger/trunk/modules/Faq/EditView.php | 141 + oss/vtiger/trunk/modules/Faq/Faq.js | 21 + oss/vtiger/trunk/modules/Faq/Faq.php | 200 + oss/vtiger/trunk/modules/Faq/FaqAjax.php | 13 + oss/vtiger/trunk/modules/Faq/ListFaq.php | 135 + oss/vtiger/trunk/modules/Faq/ListView.php | 263 + .../trunk/modules/Faq/ListViewPagging.php | 11 + oss/vtiger/trunk/modules/Faq/MassEdit.php | 45 + oss/vtiger/trunk/modules/Faq/MassEditSave.php | 71 + oss/vtiger/trunk/modules/Faq/Save.php | 54 + oss/vtiger/trunk/modules/Faq/Settings.php | 13 + oss/vtiger/trunk/modules/Faq/TagCloud.php | 12 + .../trunk/modules/Faq/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/Faq/index.php | 17 + .../trunk/modules/Faq/language/en_us.lang.php | 144 + .../trunk/modules/Faq/language/zh_cn.lang.php | 143 + .../trunk/modules/Faq/updateRelations.php | 48 + .../modules/FieldFormulas/FieldFormulas.js | 8 + .../modules/FieldFormulas/FieldFormulas.php | 62 + .../FieldFormulas/FieldFormulasAjax.php | 11 + .../VTFieldFormulasEventHandler.inc | 20 + .../VTModuleExpressionsManager.inc | 179 + .../FieldFormulas/deleteexpressionjson.php | 23 + .../modules/FieldFormulas/editexpressions.php | 80 + .../expression_engine/VTExpressionEngine.inc | 174 + .../VTExpressionEvaluater.inc | 117 + .../expression_engine/VTParser.inc | 184 + .../expression_engine/VTTokenizer.inc | 91 + .../expression_engine/include.inc | 14 + .../FieldFormulas/getexpressionlistjson.php | 19 + .../modules/FieldFormulas/getfieldsjson.php | 24 + .../FieldFormulas/getfunctionsjson.php | 19 + .../trunk/modules/FieldFormulas/include.inc | 12 + .../trunk/modules/FieldFormulas/index.php | 15 + .../FieldFormulas/language/en_us.lang.php | 33 + .../FieldFormulas/language/zh_cn.lang.php | 33 + .../FieldFormulas/resources/FieldFormulas.png | Bin 0 -> 3566 bytes .../resources/editexpressionscript.js | 319 + .../FieldFormulas/resources/functional.js | 142 + .../FieldFormulas/resources/jquery-1.2.6.js | 3549 +++ .../modules/FieldFormulas/resources/json2.js | 263 + .../modules/FieldFormulas/resources/style.css | 47 + .../resources/vtigerwebservices.js | 163 + .../FieldFormulas/saveexpressionjson.php | 29 + .../trunk/modules/FieldFormulas/schema.xml | 14 + oss/vtiger/trunk/modules/Help/Forms.php | 189 + oss/vtiger/trunk/modules/Help/index.php | 22 + .../modules/Help/language/en_us.lang.php | 29 + .../modules/Help/language/zh_cn.lang.php | 29 + .../modules/HelpDesk/CallRelatedList.php | 78 + .../trunk/modules/HelpDesk/ConvertAsFAQ.php | 68 + .../modules/HelpDesk/ConvertToEntities.php | 45 + .../trunk/modules/HelpDesk/CustomView.php | 14 + oss/vtiger/trunk/modules/HelpDesk/Delete.php | 41 + .../trunk/modules/HelpDesk/DetailView.php | 146 + .../trunk/modules/HelpDesk/DetailViewAjax.php | 116 + .../trunk/modules/HelpDesk/EditView.php | 147 + .../trunk/modules/HelpDesk/ExportRecords.php | 11 + .../modules/HelpDesk/FindDuplicateRecords.php | 106 + oss/vtiger/trunk/modules/HelpDesk/HelpDesk.js | 80 + .../trunk/modules/HelpDesk/HelpDesk.php | 769 + .../trunk/modules/HelpDesk/HelpDeskAjax.php | 13 + oss/vtiger/trunk/modules/HelpDesk/Import.php | 15 + .../trunk/modules/HelpDesk/ListTickets.php | 129 + .../trunk/modules/HelpDesk/ListView.php | 294 + .../modules/HelpDesk/ListViewPagging.php | 11 + .../trunk/modules/HelpDesk/MassEdit.php | 45 + .../trunk/modules/HelpDesk/MassEditSave.php | 71 + oss/vtiger/trunk/modules/HelpDesk/Merge.php | 316 + oss/vtiger/trunk/modules/HelpDesk/Popup.php | 12 + .../modules/HelpDesk/ProcessDuplicates.php | 134 + .../trunk/modules/HelpDesk/QuickCreate.php | 12 + oss/vtiger/trunk/modules/HelpDesk/Save.php | 189 + .../trunk/modules/HelpDesk/Settings.php | 13 + .../trunk/modules/HelpDesk/TagCloud.php | 12 + .../trunk/modules/HelpDesk/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/HelpDesk/index.php | 17 + .../modules/HelpDesk/language/en_us.lang.php | 221 + .../modules/HelpDesk/language/zh_cn.lang.php | 221 + .../modules/HelpDesk/updateRelations.php | 48 + oss/vtiger/trunk/modules/Home/HomeAjax.php | 14 + oss/vtiger/trunk/modules/Home/HomeBlock.php | 70 + oss/vtiger/trunk/modules/Home/HomeNews.php | 32 + oss/vtiger/trunk/modules/Home/HomeUtils.php | 200 + oss/vtiger/trunk/modules/Home/Homestuff.js | 648 + oss/vtiger/trunk/modules/Home/Homestuff.php | 77 + .../trunk/modules/Home/HomestuffAjax.php | 192 + oss/vtiger/trunk/modules/Home/LastViewed.php | 46 + .../trunk/modules/Home/MainHomeBlock.php | 30 + oss/vtiger/trunk/modules/Home/NewBlock.php | 44 + .../modules/Home/SaveNotebookContents.php | 31 + .../trunk/modules/Home/UnifiedSearch.php | 316 + .../modules/Home/UnifiedSearchModules.php | 43 + oss/vtiger/trunk/modules/Home/chat.css | 232 + oss/vtiger/trunk/modules/Home/chat.php | 382 + oss/vtiger/trunk/modules/Home/home_rss.php | 128 + oss/vtiger/trunk/modules/Home/index.php | 104 + oss/vtiger/trunk/modules/Home/js/ajax.js | 104 + oss/vtiger/trunk/modules/Home/js/chat.js | 477 + .../trunk/modules/Home/js/css-window_p.js | 1 + .../trunk/modules/Home/js/dom-drag_p.js | 1 + .../modules/Home/language/en_us.lang.php | 124 + .../modules/Home/language/zh_cn.lang.php | 121 + oss/vtiger/trunk/modules/Home/vtchat.html | 124 + oss/vtiger/trunk/modules/Home/vtchat.php | 124 + oss/vtiger/trunk/modules/Import/Forms.php | 259 + .../trunk/modules/Import/ImportAccount.php | 217 + .../trunk/modules/Import/ImportAjax.php | 82 + .../trunk/modules/Import/ImportButton.php | 51 + .../trunk/modules/Import/ImportContact.php | 305 + .../trunk/modules/Import/ImportLead.php | 100 + oss/vtiger/trunk/modules/Import/ImportMap.php | 226 + .../modules/Import/ImportOpportunity.php | 125 + .../trunk/modules/Import/ImportProduct.php | 163 + .../trunk/modules/Import/ImportSave.php | 572 + .../trunk/modules/Import/ImportStep1.php | 104 + .../trunk/modules/Import/ImportStep2.php | 459 + .../trunk/modules/Import/ImportStep3.php | 317 + .../trunk/modules/Import/ImportSteplast.php | 305 + .../trunk/modules/Import/ImportStepundo.php | 129 + .../trunk/modules/Import/ImportTicket.php | 136 + .../trunk/modules/Import/ImportVendors.php | 80 + .../trunk/modules/Import/UsersLastImport.php | 453 + oss/vtiger/trunk/modules/Import/error.php | 68 + oss/vtiger/trunk/modules/Import/index.php | 252 + .../modules/Import/language/en_us.lang.php | 432 + .../modules/Import/language/zh_cn.lang.php | 432 + .../trunk/modules/Import/lastImport.php | 207 + .../trunk/modules/Import/parse_utils.php | 148 + .../modules/Import/picklist_addition.php | 104 + .../trunk/modules/Invoice/CallRelatedList.php | 75 + .../trunk/modules/Invoice/CreatePDF.php | 27 + .../trunk/modules/Invoice/CustomView.php | 14 + oss/vtiger/trunk/modules/Invoice/Delete.php | 38 + .../trunk/modules/Invoice/DetailView.php | 126 + .../trunk/modules/Invoice/DetailViewAjax.php | 46 + oss/vtiger/trunk/modules/Invoice/EditView.php | 387 + oss/vtiger/trunk/modules/Invoice/Invoice.js | 55 + oss/vtiger/trunk/modules/Invoice/Invoice.php | 491 + .../trunk/modules/Invoice/InvoiceAjax.php | 12 + .../trunk/modules/Invoice/ListTopInvoice.php | 130 + oss/vtiger/trunk/modules/Invoice/ListView.php | 232 + .../trunk/modules/Invoice/ListViewPagging.php | 11 + oss/vtiger/trunk/modules/Invoice/MassEdit.php | 45 + .../trunk/modules/Invoice/MassEditSave.php | 67 + oss/vtiger/trunk/modules/Invoice/Popup.php | 13 + oss/vtiger/trunk/modules/Invoice/Save.php | 65 + .../trunk/modules/Invoice/SendPDFMail.php | 23 + oss/vtiger/trunk/modules/Invoice/Settings.php | 13 + oss/vtiger/trunk/modules/Invoice/TagCloud.php | 12 + .../trunk/modules/Invoice/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/Invoice/index.php | 52 + .../modules/Invoice/language/en_us.lang.php | 201 + .../modules/Invoice/language/zh_cn.lang.php | 200 + .../modules/Invoice/pdf_templates/footer.php | 35 + .../modules/Invoice/pdf_templates/header.php | 104 + .../Invoice/pdf_templates/lastpage/body.php | 62 + .../Invoice/pdf_templates/lastpage/footer.php | 59 + .../trunk/modules/Invoice/updateRelations.php | 48 + .../trunk/modules/Leads/CallRelatedList.php | 103 + .../trunk/modules/Leads/ConvertLead.php | 272 + .../trunk/modules/Leads/CustomAction.php | 12 + oss/vtiger/trunk/modules/Leads/CustomView.php | 14 + oss/vtiger/trunk/modules/Leads/Delete.php | 39 + oss/vtiger/trunk/modules/Leads/DetailView.php | 179 + .../trunk/modules/Leads/DetailViewAjax.php | 45 + oss/vtiger/trunk/modules/Leads/EditView.php | 141 + .../trunk/modules/Leads/ExportRecords.php | 13 + .../modules/Leads/FindDuplicateRecords.php | 107 + oss/vtiger/trunk/modules/Leads/Import.php | 14 + .../modules/Leads/LeadConvertToEntities.php | 595 + oss/vtiger/trunk/modules/Leads/Leads.js | 152 + oss/vtiger/trunk/modules/Leads/Leads.php | 599 + oss/vtiger/trunk/modules/Leads/LeadsAjax.php | 14 + oss/vtiger/trunk/modules/Leads/ListView.php | 347 + .../trunk/modules/Leads/ListViewPagging.php | 11 + .../trunk/modules/Leads/ListViewTop.php | 172 + oss/vtiger/trunk/modules/Leads/MassEdit.php | 45 + .../trunk/modules/Leads/MassEditSave.php | 67 + oss/vtiger/trunk/modules/Leads/Merge.php | 232 + oss/vtiger/trunk/modules/Leads/Popup.php | 20 + .../trunk/modules/Leads/ProcessDuplicates.php | 134 + .../trunk/modules/Leads/QuickCreate.php | 12 + oss/vtiger/trunk/modules/Leads/Save.php | 175 + oss/vtiger/trunk/modules/Leads/Settings.php | 76 + oss/vtiger/trunk/modules/Leads/TagCloud.php | 12 + .../trunk/modules/Leads/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/Leads/index.php | 21 + .../modules/Leads/language/en_us.lang.php | 244 + .../modules/Leads/language/zh_cn.lang.php | 243 + .../trunk/modules/Leads/updateRelations.php | 52 + .../modules/Meetings/language/zh_cn.lang.php | 43 + .../MessageBoard/language/zh_cn.lang.php | 69 + .../Migration/DBChanges/42P2_to_50.php | 4236 +++ .../Migration/DBChanges/501_to_502.php | 72 + .../Migration/DBChanges/502_to_503rc2.php | 111 + .../Migration/DBChanges/503_to_504rc.php | 787 + .../Migration/DBChanges/503rc2_to_503.php | 853 + .../Migration/DBChanges/504_to_510rc.php | 2031 ++ .../Migration/DBChanges/504rc_to_504.php | 355 + .../Migration/DBChanges/510rc_to_510.php | 72 + .../Migration/HTMLtoUTF8Conversion.php | 156 + .../trunk/modules/Migration/Migration.php | 472 + .../modules/Migration/MigrationCheck.php | 422 + .../trunk/modules/Migration/MigrationInfo.php | 309 + .../modules/Migration/MigrationStep0.php | 70 + .../modules/Migration/MigrationStep1.php | 137 + .../trunk/modules/Migration/PatchApply.php | 197 + .../modules/Migration/deleteCustomFields.php | 57 + oss/vtiger/trunk/modules/Migration/index.php | 134 + .../modules/Migration/language/en_us.lang.php | 100 + .../modules/Migration/language/zh_cn.lang.php | 96 + .../trunk/modules/Migration/rename_tables.php | 71 + .../modules/Migration/updateCurrency.php | 79 + .../trunk/modules/Migration/versions.php | 28 + oss/vtiger/trunk/modules/Mobile/Mobile-README | 12 + .../trunk/modules/Mobile/Mobile.Config.php | 19 + oss/vtiger/trunk/modules/Mobile/Mobile.js | 60 + oss/vtiger/trunk/modules/Mobile/Mobile.php | 82 + .../trunk/modules/Mobile/MobileAjax.php | 14 + .../trunk/modules/Mobile/MobileHandler.php | 24 + .../modules/Mobile/controllers/Detail.php | 24 + .../trunk/modules/Mobile/controllers/Home.php | 22 + .../trunk/modules/Mobile/controllers/List.php | 42 + .../modules/Mobile/controllers/Login.php | 28 + .../modules/Mobile/controllers/Logout.php | 14 + .../modules/Mobile/controllers/Search.php | 15 + .../Mobile/controllers/SearchConfig.php | 42 + .../modules/Mobile/controllers/Settings.php | 19 + .../trunk/modules/Mobile/core/Block.php | 36 + .../trunk/modules/Mobile/core/Cache.php | 30 + .../trunk/modules/Mobile/core/Field.php | 107 + .../modules/Mobile/core/MobileService.php | 42 + .../trunk/modules/Mobile/core/Module.php | 153 + .../trunk/modules/Mobile/core/Paging.php | 69 + .../trunk/modules/Mobile/core/Record.php | 80 + .../trunk/modules/Mobile/core/Search.php | 74 + .../trunk/modules/Mobile/core/Session.php | 29 + oss/vtiger/trunk/modules/Mobile/core/Skin.php | 33 + oss/vtiger/trunk/modules/Mobile/index.php | 40 + .../modules/Mobile/language/en_us.lang.php | 15 + .../Mobile/resources/images/appicon.jpg | Bin 0 -> 51989 bytes .../images/iconza/royalblue/add_16x16.png | Bin 0 -> 746 bytes .../images/iconza/royalblue/add_24x24.png | Bin 0 -> 1140 bytes .../images/iconza/royalblue/add_32x32.png | Bin 0 -> 1428 bytes .../iconza/royalblue/address_book_16x16.png | Bin 0 -> 941 bytes .../iconza/royalblue/address_book_24x24.png | Bin 0 -> 1293 bytes .../iconza/royalblue/address_book_32x32.png | Bin 0 -> 1795 bytes .../images/iconza/royalblue/alert_16x16.png | Bin 0 -> 1155 bytes .../images/iconza/royalblue/alert_24x24.png | Bin 0 -> 2112 bytes .../images/iconza/royalblue/alert_32x32.png | Bin 0 -> 3181 bytes .../iconza/royalblue/briefcase_16x16.png | Bin 0 -> 829 bytes .../iconza/royalblue/briefcase_24x24.png | Bin 0 -> 1070 bytes .../iconza/royalblue/briefcase_32x32.png | Bin 0 -> 1290 bytes .../iconza/royalblue/buildings_16x16.png | Bin 0 -> 918 bytes .../iconza/royalblue/buildings_24x24.png | Bin 0 -> 1697 bytes .../iconza/royalblue/buildings_32x32.png | Bin 0 -> 2493 bytes .../iconza/royalblue/calculator_16x16.png | Bin 0 -> 852 bytes .../iconza/royalblue/calculator_24x24.png | Bin 0 -> 1264 bytes .../iconza/royalblue/calculator_32x32.png | Bin 0 -> 1641 bytes .../images/iconza/royalblue/camera_16x16.png | Bin 0 -> 927 bytes .../images/iconza/royalblue/camera_24x24.png | Bin 0 -> 1598 bytes .../images/iconza/royalblue/camera_32x32.png | Bin 0 -> 2419 bytes .../images/iconza/royalblue/cancel_16x16.png | Bin 0 -> 1202 bytes .../images/iconza/royalblue/cancel_24x24.png | Bin 0 -> 2264 bytes .../images/iconza/royalblue/cancel_32x32.png | Bin 0 -> 3143 bytes .../images/iconza/royalblue/cd_16x16.png | Bin 0 -> 1192 bytes .../images/iconza/royalblue/cd_24x24.png | Bin 0 -> 2320 bytes .../images/iconza/royalblue/cd_32x32.png | Bin 0 -> 3627 bytes .../images/iconza/royalblue/comment_16x16.png | Bin 0 -> 921 bytes .../images/iconza/royalblue/comment_24x24.png | Bin 0 -> 1493 bytes .../images/iconza/royalblue/comment_32x32.png | Bin 0 -> 1946 bytes .../images/iconza/royalblue/delete_16x16.png | Bin 0 -> 1014 bytes .../images/iconza/royalblue/delete_24x24.png | Bin 0 -> 1673 bytes .../images/iconza/royalblue/delete_32x32.png | Bin 0 -> 2900 bytes .../images/iconza/royalblue/door_16x16.png | Bin 0 -> 744 bytes .../images/iconza/royalblue/door_24x24.png | Bin 0 -> 1041 bytes .../images/iconza/royalblue/door_32x32.png | Bin 0 -> 1244 bytes .../iconza/royalblue/down_arrow_16x16.png | Bin 0 -> 802 bytes .../iconza/royalblue/down_arrow_24x24.png | Bin 0 -> 1159 bytes .../iconza/royalblue/down_arrow_32x32.png | Bin 0 -> 1548 bytes .../iconza/royalblue/download_16x16.png | Bin 0 -> 972 bytes .../iconza/royalblue/download_24x24.png | Bin 0 -> 1510 bytes .../iconza/royalblue/download_32x32.png | Bin 0 -> 1946 bytes .../royalblue/downloads_folder_16x16.png | Bin 0 -> 763 bytes .../royalblue/downloads_folder_24x24.png | Bin 0 -> 1323 bytes .../royalblue/downloads_folder_32x32.png | Bin 0 -> 1659 bytes .../images/iconza/royalblue/edit_16x16.png | Bin 0 -> 883 bytes .../images/iconza/royalblue/edit_24x24.png | Bin 0 -> 1444 bytes .../images/iconza/royalblue/edit_32x32.png | Bin 0 -> 1709 bytes .../images/iconza/royalblue/error_16x16.png | Bin 0 -> 1095 bytes .../images/iconza/royalblue/error_24x24.png | Bin 0 -> 1728 bytes .../images/iconza/royalblue/error_32x32.png | Bin 0 -> 2394 bytes .../images/iconza/royalblue/expand_16x16.png | Bin 0 -> 1024 bytes .../images/iconza/royalblue/expand_24x24.png | Bin 0 -> 1673 bytes .../images/iconza/royalblue/expand_32x32.png | Bin 0 -> 2289 bytes .../images/iconza/royalblue/file_16x16.png | Bin 0 -> 757 bytes .../images/iconza/royalblue/file_24x24.png | Bin 0 -> 1175 bytes .../images/iconza/royalblue/file_32x32.png | Bin 0 -> 1468 bytes .../images/iconza/royalblue/film_16x16.png | Bin 0 -> 787 bytes .../images/iconza/royalblue/film_24x24.png | Bin 0 -> 956 bytes .../images/iconza/royalblue/film_32x32.png | Bin 0 -> 1200 bytes .../images/iconza/royalblue/flag_16x16.png | Bin 0 -> 860 bytes .../images/iconza/royalblue/flag_24x24.png | Bin 0 -> 1122 bytes .../images/iconza/royalblue/flag_32x32.png | Bin 0 -> 1455 bytes .../images/iconza/royalblue/folder_16x16.png | Bin 0 -> 617 bytes .../images/iconza/royalblue/folder_24x24.png | Bin 0 -> 1117 bytes .../images/iconza/royalblue/folder_32x32.png | Bin 0 -> 1327 bytes .../iconza/royalblue/gear_wheel_16x16.png | Bin 0 -> 1165 bytes .../iconza/royalblue/gear_wheel_24x24.png | Bin 0 -> 2011 bytes .../iconza/royalblue/gear_wheel_32x32.png | Bin 0 -> 2848 bytes .../images/iconza/royalblue/globe_16x16.png | Bin 0 -> 1137 bytes .../images/iconza/royalblue/globe_24x24.png | Bin 0 -> 2191 bytes .../images/iconza/royalblue/globe_32x32.png | Bin 0 -> 3091 bytes .../iconza/royalblue/hard_disk_16x16.png | Bin 0 -> 724 bytes .../iconza/royalblue/hard_disk_24x24.png | Bin 0 -> 1343 bytes .../iconza/royalblue/hard_disk_32x32.png | Bin 0 -> 1426 bytes .../images/iconza/royalblue/heart_16x16.png | Bin 0 -> 1028 bytes .../images/iconza/royalblue/heart_24x24.png | Bin 0 -> 1648 bytes .../images/iconza/royalblue/heart_32x32.png | Bin 0 -> 2460 bytes .../images/iconza/royalblue/help_16x16.png | Bin 0 -> 1096 bytes .../images/iconza/royalblue/help_24x24.png | Bin 0 -> 2271 bytes .../images/iconza/royalblue/help_32x32.png | Bin 0 -> 3293 bytes .../images/iconza/royalblue/house_16x16.png | Bin 0 -> 1020 bytes .../images/iconza/royalblue/house_24x24.png | Bin 0 -> 1754 bytes .../images/iconza/royalblue/house_32x32.png | Bin 0 -> 2418 bytes .../images/iconza/royalblue/info_16x16.png | Bin 0 -> 955 bytes .../images/iconza/royalblue/info_24x24.png | Bin 0 -> 1632 bytes .../images/iconza/royalblue/info_32x32.png | Bin 0 -> 2259 bytes .../images/iconza/royalblue/iphone_16x16.png | Bin 0 -> 780 bytes .../images/iconza/royalblue/iphone_24x24.png | Bin 0 -> 1070 bytes .../images/iconza/royalblue/iphone_32x32.png | Bin 0 -> 1446 bytes .../iconza/royalblue/left_arrow_16x16.png | Bin 0 -> 636 bytes .../iconza/royalblue/left_arrow_24x24.png | Bin 0 -> 1024 bytes .../iconza/royalblue/left_arrow_32x32.png | Bin 0 -> 1297 bytes .../images/iconza/royalblue/lens_16x16.png | Bin 0 -> 867 bytes .../images/iconza/royalblue/lens_24x24.png | Bin 0 -> 1679 bytes .../images/iconza/royalblue/lens_32x32.png | Bin 0 -> 2444 bytes .../iconza/royalblue/line_graph_16x16.png | Bin 0 -> 805 bytes .../iconza/royalblue/line_graph_24x24.png | Bin 0 -> 1209 bytes .../iconza/royalblue/line_graph_32x32.png | Bin 0 -> 1727 bytes .../images/iconza/royalblue/lock_16x16.png | Bin 0 -> 952 bytes .../images/iconza/royalblue/lock_24x24.png | Bin 0 -> 1408 bytes .../images/iconza/royalblue/lock_32x32.png | Bin 0 -> 1734 bytes .../images/iconza/royalblue/logout_16x16.png | Bin 0 -> 891 bytes .../images/iconza/royalblue/logout_24x24.png | Bin 0 -> 1431 bytes .../images/iconza/royalblue/logout_32x32.png | Bin 0 -> 2059 bytes .../iconza/royalblue/magic_wand_16x16.png | Bin 0 -> 713 bytes .../iconza/royalblue/magic_wand_24x24.png | Bin 0 -> 1133 bytes .../iconza/royalblue/magic_wand_32x32.png | Bin 0 -> 1441 bytes .../images/iconza/royalblue/mail_16x16.png | Bin 0 -> 774 bytes .../images/iconza/royalblue/mail_24x24.png | Bin 0 -> 1283 bytes .../images/iconza/royalblue/mail_32x32.png | Bin 0 -> 1882 bytes .../images/iconza/royalblue/monitor_16x16.png | Bin 0 -> 638 bytes .../images/iconza/royalblue/monitor_24x24.png | Bin 0 -> 845 bytes .../images/iconza/royalblue/monitor_32x32.png | Bin 0 -> 1003 bytes .../images/iconza/royalblue/move_16x16.png | Bin 0 -> 880 bytes .../images/iconza/royalblue/move_24x24.png | Bin 0 -> 1529 bytes .../images/iconza/royalblue/move_32x32.png | Bin 0 -> 2288 bytes .../images/iconza/royalblue/music_16x16.png | Bin 0 -> 789 bytes .../images/iconza/royalblue/music_24x24.png | Bin 0 -> 1499 bytes .../images/iconza/royalblue/music_32x32.png | Bin 0 -> 2111 bytes .../images/iconza/royalblue/network_16x16.png | Bin 0 -> 556 bytes .../images/iconza/royalblue/network_24x24.png | Bin 0 -> 780 bytes .../images/iconza/royalblue/network_32x32.png | Bin 0 -> 979 bytes .../iconza/royalblue/no_sound_16x16.png | Bin 0 -> 983 bytes .../iconza/royalblue/no_sound_24x24.png | Bin 0 -> 1686 bytes .../iconza/royalblue/no_sound_32x32.png | Bin 0 -> 2316 bytes .../images/iconza/royalblue/picture_16x16.png | Bin 0 -> 830 bytes .../images/iconza/royalblue/picture_24x24.png | Bin 0 -> 1350 bytes .../images/iconza/royalblue/picture_32x32.png | Bin 0 -> 1741 bytes .../images/iconza/royalblue/print_16x16.png | Bin 0 -> 840 bytes .../images/iconza/royalblue/print_24x24.png | Bin 0 -> 1330 bytes .../images/iconza/royalblue/print_32x32.png | Bin 0 -> 1509 bytes .../iconza/royalblue/push_pin_16x16.png | Bin 0 -> 830 bytes .../iconza/royalblue/push_pin_24x24.png | Bin 0 -> 1260 bytes .../iconza/royalblue/push_pin_32x32.png | Bin 0 -> 1818 bytes .../images/iconza/royalblue/redo_16x16.png | Bin 0 -> 768 bytes .../images/iconza/royalblue/redo_24x24.png | Bin 0 -> 1313 bytes .../images/iconza/royalblue/redo_32x32.png | Bin 0 -> 1961 bytes .../images/iconza/royalblue/remove_16x16.png | Bin 0 -> 371 bytes .../images/iconza/royalblue/remove_24x24.png | Bin 0 -> 557 bytes .../images/iconza/royalblue/remove_32x32.png | Bin 0 -> 680 bytes .../iconza/royalblue/right_arrow_16x16.png | Bin 0 -> 667 bytes .../iconza/royalblue/right_arrow_24x24.png | Bin 0 -> 1091 bytes .../iconza/royalblue/right_arrow_32x32.png | Bin 0 -> 1304 bytes .../iconza/royalblue/round_add_16x16.png | Bin 0 -> 1003 bytes .../iconza/royalblue/round_add_24x24.png | Bin 0 -> 1618 bytes .../iconza/royalblue/round_add_32x32.png | Bin 0 -> 2271 bytes .../iconza/royalblue/round_remove_16x16.png | Bin 0 -> 907 bytes .../iconza/royalblue/round_remove_24x24.png | Bin 0 -> 1551 bytes .../iconza/royalblue/round_remove_32x32.png | Bin 0 -> 2129 bytes .../images/iconza/royalblue/rss_16x16.png | Bin 0 -> 1022 bytes .../images/iconza/royalblue/rss_24x24.png | Bin 0 -> 1972 bytes .../images/iconza/royalblue/rss_32x32.png | Bin 0 -> 2601 bytes .../images/iconza/royalblue/save_16x16.png | Bin 0 -> 743 bytes .../images/iconza/royalblue/save_24x24.png | Bin 0 -> 1255 bytes .../images/iconza/royalblue/save_32x32.png | Bin 0 -> 1515 bytes .../iconza/royalblue/scissors_16x16.png | Bin 0 -> 974 bytes .../iconza/royalblue/scissors_24x24.png | Bin 0 -> 1690 bytes .../iconza/royalblue/scissors_32x32.png | Bin 0 -> 2259 bytes .../images/iconza/royalblue/script_16x16.png | Bin 0 -> 820 bytes .../images/iconza/royalblue/script_24x24.png | Bin 0 -> 1253 bytes .../images/iconza/royalblue/script_32x32.png | Bin 0 -> 1617 bytes .../images/iconza/royalblue/shield_16x16.png | Bin 0 -> 998 bytes .../images/iconza/royalblue/shield_24x24.png | Bin 0 -> 1704 bytes .../images/iconza/royalblue/shield_32x32.png | Bin 0 -> 2443 bytes .../images/iconza/royalblue/sound_16x16.png | Bin 0 -> 809 bytes .../images/iconza/royalblue/sound_24x24.png | Bin 0 -> 1417 bytes .../images/iconza/royalblue/sound_32x32.png | Bin 0 -> 1746 bytes .../images/iconza/royalblue/star_16x16.png | Bin 0 -> 797 bytes .../images/iconza/royalblue/star_24x24.png | Bin 0 -> 1412 bytes .../images/iconza/royalblue/star_32x32.png | Bin 0 -> 1807 bytes .../images/iconza/royalblue/stop_16x16.png | Bin 0 -> 911 bytes .../images/iconza/royalblue/stop_24x24.png | Bin 0 -> 1599 bytes .../images/iconza/royalblue/stop_32x32.png | Bin 0 -> 2322 bytes .../images/iconza/royalblue/tag_16x16.png | Bin 0 -> 1025 bytes .../images/iconza/royalblue/tag_24x24.png | Bin 0 -> 1695 bytes .../images/iconza/royalblue/tag_32x32.png | Bin 0 -> 2163 bytes .../images/iconza/royalblue/toolbox_16x16.png | Bin 0 -> 682 bytes .../images/iconza/royalblue/toolbox_24x24.png | Bin 0 -> 1039 bytes .../images/iconza/royalblue/toolbox_32x32.png | Bin 0 -> 1243 bytes .../iconza/royalblue/trackback_16x16.png | Bin 0 -> 854 bytes .../iconza/royalblue/trackback_24x24.png | Bin 0 -> 1472 bytes .../iconza/royalblue/trackback_32x32.png | Bin 0 -> 1916 bytes .../images/iconza/royalblue/trash_16x16.png | Bin 0 -> 840 bytes .../images/iconza/royalblue/trash_24x24.png | Bin 0 -> 1264 bytes .../images/iconza/royalblue/trash_32x32.png | Bin 0 -> 1652 bytes .../images/iconza/royalblue/tune_16x16.png | Bin 0 -> 1041 bytes .../images/iconza/royalblue/tune_24x24.png | Bin 0 -> 1600 bytes .../images/iconza/royalblue/tune_32x32.png | Bin 0 -> 2265 bytes .../images/iconza/royalblue/undo_16x16.png | Bin 0 -> 781 bytes .../images/iconza/royalblue/undo_24x24.png | Bin 0 -> 1369 bytes .../images/iconza/royalblue/undo_32x32.png | Bin 0 -> 2101 bytes .../images/iconza/royalblue/unlock_16x16.png | Bin 0 -> 926 bytes .../images/iconza/royalblue/unlock_24x24.png | Bin 0 -> 1382 bytes .../images/iconza/royalblue/unlock_32x32.png | Bin 0 -> 1698 bytes .../iconza/royalblue/up_arrow_16x16.png | Bin 0 -> 751 bytes .../iconza/royalblue/up_arrow_24x24.png | Bin 0 -> 1121 bytes .../iconza/royalblue/up_arrow_32x32.png | Bin 0 -> 1455 bytes .../images/iconza/royalblue/user_16x16.png | Bin 0 -> 959 bytes .../images/iconza/royalblue/user_24x24.png | Bin 0 -> 1726 bytes .../images/iconza/royalblue/user_32x32.png | Bin 0 -> 2225 bytes .../images/iconza/royalblue/warning_16x16.png | Bin 0 -> 871 bytes .../images/iconza/royalblue/warning_24x24.png | Bin 0 -> 1370 bytes .../images/iconza/royalblue/warning_32x32.png | Bin 0 -> 1877 bytes .../images/iconza/royalblue/wrench_16x16.png | Bin 0 -> 817 bytes .../images/iconza/royalblue/wrench_24x24.png | Bin 0 -> 1467 bytes .../images/iconza/royalblue/wrench_32x32.png | Bin 0 -> 2038 bytes .../images/iconza/royalblue/zoom_in_16x16.png | Bin 0 -> 979 bytes .../images/iconza/royalblue/zoom_in_24x24.png | Bin 0 -> 1816 bytes .../images/iconza/royalblue/zoom_in_32x32.png | Bin 0 -> 2662 bytes .../iconza/royalblue/zoom_out_16x16.png | Bin 0 -> 872 bytes .../iconza/royalblue/zoom_out_24x24.png | Bin 0 -> 1735 bytes .../iconza/royalblue/zoom_out_32x32.png | Bin 0 -> 2489 bytes .../images/iconza/white/add_16x16.png | Bin 0 -> 629 bytes .../images/iconza/white/add_24x24.png | Bin 0 -> 815 bytes .../images/iconza/white/add_32x32.png | Bin 0 -> 974 bytes .../iconza/white/address_book_16x16.png | Bin 0 -> 842 bytes .../iconza/white/address_book_24x24.png | Bin 0 -> 1028 bytes .../iconza/white/address_book_32x32.png | Bin 0 -> 1274 bytes .../images/iconza/white/alert_16x16.png | Bin 0 -> 1018 bytes .../images/iconza/white/alert_24x24.png | Bin 0 -> 1978 bytes .../images/iconza/white/alert_32x32.png | Bin 0 -> 2869 bytes .../images/iconza/white/briefcase_16x16.png | Bin 0 -> 767 bytes .../images/iconza/white/briefcase_24x24.png | Bin 0 -> 988 bytes .../images/iconza/white/briefcase_32x32.png | Bin 0 -> 1165 bytes .../images/iconza/white/buildings_16x16.png | Bin 0 -> 714 bytes .../images/iconza/white/buildings_24x24.png | Bin 0 -> 1176 bytes .../images/iconza/white/buildings_32x32.png | Bin 0 -> 1558 bytes .../images/iconza/white/calculator_16x16.png | Bin 0 -> 764 bytes .../images/iconza/white/calculator_24x24.png | Bin 0 -> 969 bytes .../images/iconza/white/calculator_32x32.png | Bin 0 -> 1252 bytes .../images/iconza/white/camera_16x16.png | Bin 0 -> 848 bytes .../images/iconza/white/camera_24x24.png | Bin 0 -> 1469 bytes .../images/iconza/white/camera_32x32.png | Bin 0 -> 2133 bytes .../images/iconza/white/cancel_16x16.png | Bin 0 -> 1114 bytes .../images/iconza/white/cancel_24x24.png | Bin 0 -> 1860 bytes .../images/iconza/white/cancel_32x32.png | Bin 0 -> 2537 bytes .../images/iconza/white/cd_16x16.png | Bin 0 -> 1063 bytes .../images/iconza/white/cd_24x24.png | Bin 0 -> 1840 bytes .../images/iconza/white/cd_32x32.png | Bin 0 -> 2550 bytes .../images/iconza/white/comment_16x16.png | Bin 0 -> 771 bytes .../images/iconza/white/comment_24x24.png | Bin 0 -> 1081 bytes .../images/iconza/white/comment_32x32.png | Bin 0 -> 1309 bytes .../images/iconza/white/delete_16x16.png | Bin 0 -> 772 bytes .../images/iconza/white/delete_24x24.png | Bin 0 -> 1234 bytes .../images/iconza/white/delete_32x32.png | Bin 0 -> 1949 bytes .../images/iconza/white/door_16x16.png | Bin 0 -> 615 bytes .../images/iconza/white/door_24x24.png | Bin 0 -> 783 bytes .../images/iconza/white/door_32x32.png | Bin 0 -> 972 bytes .../images/iconza/white/down_arrow_16x16.png | Bin 0 -> 695 bytes .../images/iconza/white/down_arrow_24x24.png | Bin 0 -> 920 bytes .../images/iconza/white/down_arrow_32x32.png | Bin 0 -> 1190 bytes .../images/iconza/white/download_16x16.png | Bin 0 -> 707 bytes .../images/iconza/white/download_24x24.png | Bin 0 -> 1073 bytes .../images/iconza/white/download_32x32.png | Bin 0 -> 1277 bytes .../iconza/white/downloads_folder_16x16.png | Bin 0 -> 662 bytes .../iconza/white/downloads_folder_24x24.png | Bin 0 -> 934 bytes .../iconza/white/downloads_folder_32x32.png | Bin 0 -> 1046 bytes .../images/iconza/white/edit_16x16.png | Bin 0 -> 864 bytes .../images/iconza/white/edit_24x24.png | Bin 0 -> 1397 bytes .../images/iconza/white/edit_32x32.png | Bin 0 -> 1620 bytes .../images/iconza/white/error_16x16.png | Bin 0 -> 918 bytes .../images/iconza/white/error_24x24.png | Bin 0 -> 1445 bytes .../images/iconza/white/error_32x32.png | Bin 0 -> 1890 bytes .../images/iconza/white/expand_16x16.png | Bin 0 -> 963 bytes .../images/iconza/white/expand_24x24.png | Bin 0 -> 1494 bytes .../images/iconza/white/expand_32x32.png | Bin 0 -> 2043 bytes .../images/iconza/white/file_16x16.png | Bin 0 -> 651 bytes .../images/iconza/white/file_24x24.png | Bin 0 -> 929 bytes .../images/iconza/white/file_32x32.png | Bin 0 -> 1085 bytes .../images/iconza/white/film_16x16.png | Bin 0 -> 566 bytes .../images/iconza/white/film_24x24.png | Bin 0 -> 801 bytes .../images/iconza/white/film_32x32.png | Bin 0 -> 950 bytes .../images/iconza/white/flag_16x16.png | Bin 0 -> 793 bytes .../images/iconza/white/flag_24x24.png | Bin 0 -> 1010 bytes .../images/iconza/white/flag_32x32.png | Bin 0 -> 1249 bytes .../images/iconza/white/folder_16x16.png | Bin 0 -> 529 bytes .../images/iconza/white/folder_24x24.png | Bin 0 -> 725 bytes .../images/iconza/white/folder_32x32.png | Bin 0 -> 791 bytes .../images/iconza/white/gear_wheel_16x16.png | Bin 0 -> 1008 bytes .../images/iconza/white/gear_wheel_24x24.png | Bin 0 -> 1676 bytes .../images/iconza/white/gear_wheel_32x32.png | Bin 0 -> 2256 bytes .../images/iconza/white/globe_16x16.png | Bin 0 -> 933 bytes .../images/iconza/white/globe_24x24.png | Bin 0 -> 1590 bytes .../images/iconza/white/globe_32x32.png | Bin 0 -> 2124 bytes .../images/iconza/white/hard_disk_16x16.png | Bin 0 -> 602 bytes .../images/iconza/white/hard_disk_24x24.png | Bin 0 -> 1046 bytes .../images/iconza/white/hard_disk_32x32.png | Bin 0 -> 1101 bytes .../images/iconza/white/heart_16x16.png | Bin 0 -> 862 bytes .../images/iconza/white/heart_24x24.png | Bin 0 -> 1291 bytes .../images/iconza/white/heart_32x32.png | Bin 0 -> 1772 bytes .../images/iconza/white/help_16x16.png | Bin 0 -> 1077 bytes .../images/iconza/white/help_24x24.png | Bin 0 -> 2215 bytes .../images/iconza/white/help_32x32.png | Bin 0 -> 3067 bytes .../images/iconza/white/house_16x16.png | Bin 0 -> 978 bytes .../images/iconza/white/house_24x24.png | Bin 0 -> 1600 bytes .../images/iconza/white/house_32x32.png | Bin 0 -> 2223 bytes .../images/iconza/white/info_16x16.png | Bin 0 -> 829 bytes .../images/iconza/white/info_24x24.png | Bin 0 -> 1293 bytes .../images/iconza/white/info_32x32.png | Bin 0 -> 1712 bytes .../images/iconza/white/iphone_16x16.png | Bin 0 -> 736 bytes .../images/iconza/white/iphone_24x24.png | Bin 0 -> 945 bytes .../images/iconza/white/iphone_32x32.png | Bin 0 -> 1259 bytes .../images/iconza/white/left_arrow_16x16.png | Bin 0 -> 622 bytes .../images/iconza/white/left_arrow_24x24.png | Bin 0 -> 856 bytes .../images/iconza/white/left_arrow_32x32.png | Bin 0 -> 1031 bytes .../images/iconza/white/lens_16x16.png | Bin 0 -> 873 bytes .../images/iconza/white/lens_24x24.png | Bin 0 -> 1680 bytes .../images/iconza/white/lens_32x32.png | Bin 0 -> 2456 bytes .../images/iconza/white/line_graph_16x16.png | Bin 0 -> 567 bytes .../images/iconza/white/line_graph_24x24.png | Bin 0 -> 800 bytes .../images/iconza/white/line_graph_32x32.png | Bin 0 -> 1028 bytes .../images/iconza/white/lock_16x16.png | Bin 0 -> 862 bytes .../images/iconza/white/lock_24x24.png | Bin 0 -> 1233 bytes .../images/iconza/white/lock_32x32.png | Bin 0 -> 1484 bytes .../images/iconza/white/magic_wand_16x16.png | Bin 0 -> 707 bytes .../images/iconza/white/magic_wand_24x24.png | Bin 0 -> 1131 bytes .../images/iconza/white/magic_wand_32x32.png | Bin 0 -> 1335 bytes .../images/iconza/white/mail_16x16.png | Bin 0 -> 658 bytes .../images/iconza/white/mail_24x24.png | Bin 0 -> 981 bytes .../images/iconza/white/mail_32x32.png | Bin 0 -> 1356 bytes .../images/iconza/white/monitor_16x16.png | Bin 0 -> 526 bytes .../images/iconza/white/monitor_24x24.png | Bin 0 -> 691 bytes .../images/iconza/white/monitor_32x32.png | Bin 0 -> 770 bytes .../images/iconza/white/move_16x16.png | Bin 0 -> 767 bytes .../images/iconza/white/move_24x24.png | Bin 0 -> 1208 bytes .../images/iconza/white/move_32x32.png | Bin 0 -> 1767 bytes .../images/iconza/white/music_16x16.png | Bin 0 -> 761 bytes .../images/iconza/white/music_24x24.png | Bin 0 -> 1339 bytes .../images/iconza/white/music_32x32.png | Bin 0 -> 1615 bytes .../images/iconza/white/network_16x16.png | Bin 0 -> 518 bytes .../images/iconza/white/network_24x24.png | Bin 0 -> 736 bytes .../images/iconza/white/network_32x32.png | Bin 0 -> 880 bytes .../images/iconza/white/no_sound_16x16.png | Bin 0 -> 864 bytes .../images/iconza/white/no_sound_24x24.png | Bin 0 -> 1437 bytes .../images/iconza/white/no_sound_32x32.png | Bin 0 -> 1898 bytes .../images/iconza/white/picture_16x16.png | Bin 0 -> 699 bytes .../images/iconza/white/picture_24x24.png | Bin 0 -> 1046 bytes .../images/iconza/white/picture_32x32.png | Bin 0 -> 1315 bytes .../images/iconza/white/print_16x16.png | Bin 0 -> 783 bytes .../images/iconza/white/print_24x24.png | Bin 0 -> 1222 bytes .../images/iconza/white/print_32x32.png | Bin 0 -> 1398 bytes .../images/iconza/white/push_pin_16x16.png | Bin 0 -> 814 bytes .../images/iconza/white/push_pin_24x24.png | Bin 0 -> 1179 bytes .../images/iconza/white/push_pin_32x32.png | Bin 0 -> 1669 bytes .../images/iconza/white/redo_16x16.png | Bin 0 -> 741 bytes .../images/iconza/white/redo_24x24.png | Bin 0 -> 1113 bytes .../images/iconza/white/redo_32x32.png | Bin 0 -> 1493 bytes .../images/iconza/white/remove_16x16.png | Bin 0 -> 346 bytes .../images/iconza/white/remove_24x24.png | Bin 0 -> 467 bytes .../images/iconza/white/remove_32x32.png | Bin 0 -> 567 bytes .../images/iconza/white/right_arrow_16x16.png | Bin 0 -> 627 bytes .../images/iconza/white/right_arrow_24x24.png | Bin 0 -> 872 bytes .../images/iconza/white/right_arrow_32x32.png | Bin 0 -> 1034 bytes .../images/iconza/white/round_add_16x16.png | Bin 0 -> 869 bytes .../images/iconza/white/round_add_24x24.png | Bin 0 -> 1303 bytes .../images/iconza/white/round_add_32x32.png | Bin 0 -> 1742 bytes .../iconza/white/round_remove_16x16.png | Bin 0 -> 800 bytes .../iconza/white/round_remove_24x24.png | Bin 0 -> 1242 bytes .../iconza/white/round_remove_32x32.png | Bin 0 -> 1650 bytes .../images/iconza/white/rss_16x16.png | Bin 0 -> 842 bytes .../images/iconza/white/rss_24x24.png | Bin 0 -> 1461 bytes .../images/iconza/white/rss_32x32.png | Bin 0 -> 1779 bytes .../images/iconza/white/save_16x16.png | Bin 0 -> 625 bytes .../images/iconza/white/save_24x24.png | Bin 0 -> 901 bytes .../images/iconza/white/save_32x32.png | Bin 0 -> 1134 bytes .../images/iconza/white/scissors_16x16.png | Bin 0 -> 963 bytes .../images/iconza/white/scissors_24x24.png | Bin 0 -> 1682 bytes .../images/iconza/white/scissors_32x32.png | Bin 0 -> 2251 bytes .../images/iconza/white/script_16x16.png | Bin 0 -> 733 bytes .../images/iconza/white/script_24x24.png | Bin 0 -> 973 bytes .../images/iconza/white/script_32x32.png | Bin 0 -> 1173 bytes .../images/iconza/white/shield_16x16.png | Bin 0 -> 883 bytes .../images/iconza/white/shield_24x24.png | Bin 0 -> 1275 bytes .../images/iconza/white/shield_32x32.png | Bin 0 -> 1789 bytes .../images/iconza/white/sound_16x16.png | Bin 0 -> 730 bytes .../images/iconza/white/sound_24x24.png | Bin 0 -> 1172 bytes .../images/iconza/white/sound_32x32.png | Bin 0 -> 1404 bytes .../images/iconza/white/star_16x16.png | Bin 0 -> 742 bytes .../images/iconza/white/star_24x24.png | Bin 0 -> 1265 bytes .../images/iconza/white/star_32x32.png | Bin 0 -> 1702 bytes .../images/iconza/white/stop_16x16.png | Bin 0 -> 622 bytes .../images/iconza/white/stop_24x24.png | Bin 0 -> 1041 bytes .../images/iconza/white/stop_32x32.png | Bin 0 -> 1484 bytes .../images/iconza/white/tag_16x16.png | Bin 0 -> 966 bytes .../images/iconza/white/tag_24x24.png | Bin 0 -> 1443 bytes .../images/iconza/white/tag_32x32.png | Bin 0 -> 1929 bytes .../images/iconza/white/toolbox_16x16.png | Bin 0 -> 628 bytes .../images/iconza/white/toolbox_24x24.png | Bin 0 -> 959 bytes .../images/iconza/white/toolbox_32x32.png | Bin 0 -> 1121 bytes .../images/iconza/white/trackback_16x16.png | Bin 0 -> 689 bytes .../images/iconza/white/trackback_24x24.png | Bin 0 -> 1099 bytes .../images/iconza/white/trackback_32x32.png | Bin 0 -> 1374 bytes .../images/iconza/white/trash_16x16.png | Bin 0 -> 789 bytes .../images/iconza/white/trash_24x24.png | Bin 0 -> 1128 bytes .../images/iconza/white/trash_32x32.png | Bin 0 -> 1467 bytes .../images/iconza/white/tune_16x16.png | Bin 0 -> 834 bytes .../images/iconza/white/tune_24x24.png | Bin 0 -> 1214 bytes .../images/iconza/white/tune_32x32.png | Bin 0 -> 1571 bytes .../images/iconza/white/undo_16x16.png | Bin 0 -> 718 bytes .../images/iconza/white/undo_24x24.png | Bin 0 -> 1134 bytes .../images/iconza/white/undo_32x32.png | Bin 0 -> 1601 bytes .../images/iconza/white/unlock_16x16.png | Bin 0 -> 847 bytes .../images/iconza/white/unlock_24x24.png | Bin 0 -> 1235 bytes .../images/iconza/white/unlock_32x32.png | Bin 0 -> 1483 bytes .../images/iconza/white/up_arrow_16x16.png | Bin 0 -> 599 bytes .../images/iconza/white/up_arrow_24x24.png | Bin 0 -> 859 bytes .../images/iconza/white/up_arrow_32x32.png | Bin 0 -> 1082 bytes .../images/iconza/white/user_16x16.png | Bin 0 -> 904 bytes .../images/iconza/white/user_24x24.png | Bin 0 -> 1521 bytes .../images/iconza/white/user_32x32.png | Bin 0 -> 1967 bytes .../images/iconza/white/warning_16x16.png | Bin 0 -> 774 bytes .../images/iconza/white/warning_24x24.png | Bin 0 -> 1141 bytes .../images/iconza/white/warning_32x32.png | Bin 0 -> 1560 bytes .../images/iconza/white/wrench_16x16.png | Bin 0 -> 801 bytes .../images/iconza/white/wrench_24x24.png | Bin 0 -> 1390 bytes .../images/iconza/white/wrench_32x32.png | Bin 0 -> 1826 bytes .../images/iconza/white/zoom_in_16x16.png | Bin 0 -> 982 bytes .../images/iconza/white/zoom_in_24x24.png | Bin 0 -> 1780 bytes .../images/iconza/white/zoom_in_32x32.png | Bin 0 -> 2556 bytes .../images/iconza/white/zoom_out_16x16.png | Bin 0 -> 878 bytes .../images/iconza/white/zoom_out_24x24.png | Bin 0 -> 1698 bytes .../images/iconza/white/zoom_out_32x32.png | Bin 0 -> 2481 bytes .../images/iconza/yellow/add_24x24.png | Bin 0 -> 1119 bytes .../images/iconza/yellow/add_32x32.png | Bin 0 -> 1393 bytes .../iconza/yellow/address_book_24x24.png | Bin 0 -> 1271 bytes .../iconza/yellow/address_book_32x32.png | Bin 0 -> 1748 bytes .../images/iconza/yellow/alert_24x24.png | Bin 0 -> 2094 bytes .../images/iconza/yellow/alert_32x32.png | Bin 0 -> 3156 bytes .../images/iconza/yellow/briefcase_24x24.png | Bin 0 -> 1073 bytes .../images/iconza/yellow/briefcase_32x32.png | Bin 0 -> 1301 bytes .../images/iconza/yellow/buildings_24x24.png | Bin 0 -> 1649 bytes .../images/iconza/yellow/buildings_32x32.png | Bin 0 -> 2405 bytes .../images/iconza/yellow/calculator_24x24.png | Bin 0 -> 1249 bytes .../images/iconza/yellow/calculator_32x32.png | Bin 0 -> 1579 bytes .../images/iconza/yellow/camera_24x24.png | Bin 0 -> 1599 bytes .../images/iconza/yellow/camera_32x32.png | Bin 0 -> 2359 bytes .../images/iconza/yellow/cancel_24x24.png | Bin 0 -> 2250 bytes .../images/iconza/yellow/cancel_32x32.png | Bin 0 -> 3045 bytes .../images/iconza/yellow/cd_24x24.png | Bin 0 -> 2252 bytes .../images/iconza/yellow/cd_32x32.png | Bin 0 -> 3540 bytes .../images/iconza/yellow/comment_24x24.png | Bin 0 -> 1462 bytes .../images/iconza/yellow/comment_32x32.png | Bin 0 -> 1857 bytes .../images/iconza/yellow/delete_24x24.png | Bin 0 -> 1600 bytes .../images/iconza/yellow/delete_32x32.png | Bin 0 -> 2767 bytes .../images/iconza/yellow/door_24x24.png | Bin 0 -> 1028 bytes .../images/iconza/yellow/door_32x32.png | Bin 0 -> 1261 bytes .../images/iconza/yellow/down_arrow_24x24.png | Bin 0 -> 1135 bytes .../images/iconza/yellow/down_arrow_32x32.png | Bin 0 -> 1513 bytes .../images/iconza/yellow/download_24x24.png | Bin 0 -> 1491 bytes .../images/iconza/yellow/download_32x32.png | Bin 0 -> 1893 bytes .../iconza/yellow/downloads_folder_24x24.png | Bin 0 -> 1288 bytes .../iconza/yellow/downloads_folder_32x32.png | Bin 0 -> 1586 bytes .../images/iconza/yellow/edit_24x24.png | Bin 0 -> 1422 bytes .../images/iconza/yellow/edit_32x32.png | Bin 0 -> 1704 bytes .../images/iconza/yellow/error_24x24.png | Bin 0 -> 1691 bytes .../images/iconza/yellow/error_32x32.png | Bin 0 -> 2329 bytes .../images/iconza/yellow/expand_24x24.png | Bin 0 -> 1672 bytes .../images/iconza/yellow/expand_32x32.png | Bin 0 -> 2266 bytes .../images/iconza/yellow/file_24x24.png | Bin 0 -> 1180 bytes .../images/iconza/yellow/file_32x32.png | Bin 0 -> 1431 bytes .../images/iconza/yellow/film_24x24.png | Bin 0 -> 917 bytes .../images/iconza/yellow/film_32x32.png | Bin 0 -> 1179 bytes .../images/iconza/yellow/flag_24x24.png | Bin 0 -> 1113 bytes .../images/iconza/yellow/flag_32x32.png | Bin 0 -> 1423 bytes .../images/iconza/yellow/folder_24x24.png | Bin 0 -> 1076 bytes .../images/iconza/yellow/folder_32x32.png | Bin 0 -> 1246 bytes .../images/iconza/yellow/gear_wheel_24x24.png | Bin 0 -> 1960 bytes .../images/iconza/yellow/gear_wheel_32x32.png | Bin 0 -> 2779 bytes .../images/iconza/yellow/globe_24x24.png | Bin 0 -> 2077 bytes .../images/iconza/yellow/globe_32x32.png | Bin 0 -> 2919 bytes .../images/iconza/yellow/hard_disk_24x24.png | Bin 0 -> 1326 bytes .../images/iconza/yellow/hard_disk_32x32.png | Bin 0 -> 1371 bytes .../images/iconza/yellow/heart_24x24.png | Bin 0 -> 1616 bytes .../images/iconza/yellow/heart_32x32.png | Bin 0 -> 2350 bytes .../images/iconza/yellow/help_24x24.png | Bin 0 -> 2279 bytes .../images/iconza/yellow/help_32x32.png | Bin 0 -> 3264 bytes .../images/iconza/yellow/house_24x24.png | Bin 0 -> 1759 bytes .../images/iconza/yellow/house_32x32.png | Bin 0 -> 2431 bytes .../images/iconza/yellow/info_24x24.png | Bin 0 -> 1606 bytes .../images/iconza/yellow/info_32x32.png | Bin 0 -> 2192 bytes .../images/iconza/yellow/iphone_24x24.png | Bin 0 -> 1033 bytes .../images/iconza/yellow/iphone_32x32.png | Bin 0 -> 1420 bytes .../images/iconza/yellow/left_arrow_24x24.png | Bin 0 -> 1019 bytes .../images/iconza/yellow/left_arrow_32x32.png | Bin 0 -> 1280 bytes .../images/iconza/yellow/lens_24x24.png | Bin 0 -> 1677 bytes .../images/iconza/yellow/lens_32x32.png | Bin 0 -> 2471 bytes .../images/iconza/yellow/line_graph_24x24.png | Bin 0 -> 1150 bytes .../images/iconza/yellow/line_graph_32x32.png | Bin 0 -> 1648 bytes .../images/iconza/yellow/lock_24x24.png | Bin 0 -> 1383 bytes .../images/iconza/yellow/lock_32x32.png | Bin 0 -> 1695 bytes .../images/iconza/yellow/logout_24x24.png | Bin 0 -> 1365 bytes .../images/iconza/yellow/logout_32x32.png | Bin 0 -> 1986 bytes .../images/iconza/yellow/magic_wand_24x24.png | Bin 0 -> 1131 bytes .../images/iconza/yellow/magic_wand_32x32.png | Bin 0 -> 1434 bytes .../images/iconza/yellow/mail_24x24.png | Bin 0 -> 1238 bytes .../images/iconza/yellow/mail_32x32.png | Bin 0 -> 1794 bytes .../images/iconza/yellow/monitor_24x24.png | Bin 0 -> 838 bytes .../images/iconza/yellow/monitor_32x32.png | Bin 0 -> 979 bytes .../images/iconza/yellow/move_24x24.png | Bin 0 -> 1493 bytes .../images/iconza/yellow/move_32x32.png | Bin 0 -> 2200 bytes .../images/iconza/yellow/music_24x24.png | Bin 0 -> 1492 bytes .../images/iconza/yellow/music_32x32.png | Bin 0 -> 2127 bytes .../images/iconza/yellow/network_24x24.png | Bin 0 -> 773 bytes .../images/iconza/yellow/network_32x32.png | Bin 0 -> 991 bytes .../images/iconza/yellow/no_sound_24x24.png | Bin 0 -> 1661 bytes .../images/iconza/yellow/no_sound_32x32.png | Bin 0 -> 2287 bytes .../images/iconza/yellow/picture_24x24.png | Bin 0 -> 1291 bytes .../images/iconza/yellow/picture_32x32.png | Bin 0 -> 1723 bytes .../images/iconza/yellow/print_24x24.png | Bin 0 -> 1311 bytes .../images/iconza/yellow/print_32x32.png | Bin 0 -> 1539 bytes .../images/iconza/yellow/push_pin_24x24.png | Bin 0 -> 1265 bytes .../images/iconza/yellow/push_pin_32x32.png | Bin 0 -> 1841 bytes .../images/iconza/yellow/redo_24x24.png | Bin 0 -> 1298 bytes .../images/iconza/yellow/redo_32x32.png | Bin 0 -> 1954 bytes .../images/iconza/yellow/remove_24x24.png | Bin 0 -> 545 bytes .../images/iconza/yellow/remove_32x32.png | Bin 0 -> 677 bytes .../iconza/yellow/right_arrow_24x24.png | Bin 0 -> 1053 bytes .../iconza/yellow/right_arrow_32x32.png | Bin 0 -> 1286 bytes .../images/iconza/yellow/round_add_24x24.png | Bin 0 -> 1603 bytes .../images/iconza/yellow/round_add_32x32.png | Bin 0 -> 2191 bytes .../iconza/yellow/round_remove_24x24.png | Bin 0 -> 1511 bytes .../iconza/yellow/round_remove_32x32.png | Bin 0 -> 2064 bytes .../images/iconza/yellow/rss_24x24.png | Bin 0 -> 1915 bytes .../images/iconza/yellow/rss_32x32.png | Bin 0 -> 2540 bytes .../images/iconza/yellow/save_24x24.png | Bin 0 -> 1205 bytes .../images/iconza/yellow/save_32x32.png | Bin 0 -> 1537 bytes .../images/iconza/yellow/scissors_24x24.png | Bin 0 -> 1691 bytes .../images/iconza/yellow/scissors_32x32.png | Bin 0 -> 2259 bytes .../images/iconza/yellow/script_24x24.png | Bin 0 -> 1241 bytes .../images/iconza/yellow/script_32x32.png | Bin 0 -> 1598 bytes .../images/iconza/yellow/shield_24x24.png | Bin 0 -> 1643 bytes .../images/iconza/yellow/shield_32x32.png | Bin 0 -> 2330 bytes .../images/iconza/yellow/sound_24x24.png | Bin 0 -> 1386 bytes .../images/iconza/yellow/sound_32x32.png | Bin 0 -> 1767 bytes .../images/iconza/yellow/star_24x24.png | Bin 0 -> 1411 bytes .../images/iconza/yellow/star_32x32.png | Bin 0 -> 1798 bytes .../images/iconza/yellow/stop_24x24.png | Bin 0 -> 1525 bytes .../images/iconza/yellow/stop_32x32.png | Bin 0 -> 2225 bytes .../images/iconza/yellow/tag_24x24.png | Bin 0 -> 1695 bytes .../images/iconza/yellow/tag_32x32.png | Bin 0 -> 2206 bytes .../images/iconza/yellow/toolbox_24x24.png | Bin 0 -> 1053 bytes .../images/iconza/yellow/toolbox_32x32.png | Bin 0 -> 1239 bytes .../images/iconza/yellow/trackback_24x24.png | Bin 0 -> 1435 bytes .../images/iconza/yellow/trackback_32x32.png | Bin 0 -> 1811 bytes .../images/iconza/yellow/trash_24x24.png | Bin 0 -> 1249 bytes .../images/iconza/yellow/trash_32x32.png | Bin 0 -> 1657 bytes .../images/iconza/yellow/tune_24x24.png | Bin 0 -> 1553 bytes .../images/iconza/yellow/tune_32x32.png | Bin 0 -> 2174 bytes .../images/iconza/yellow/undo_24x24.png | Bin 0 -> 1359 bytes .../images/iconza/yellow/undo_32x32.png | Bin 0 -> 2035 bytes .../images/iconza/yellow/unlock_24x24.png | Bin 0 -> 1371 bytes .../images/iconza/yellow/unlock_32x32.png | Bin 0 -> 1686 bytes .../images/iconza/yellow/up_arrow_24x24.png | Bin 0 -> 1115 bytes .../images/iconza/yellow/up_arrow_32x32.png | Bin 0 -> 1460 bytes .../images/iconza/yellow/user_24x24.png | Bin 0 -> 1689 bytes .../images/iconza/yellow/user_32x32.png | Bin 0 -> 2190 bytes .../images/iconza/yellow/warning_24x24.png | Bin 0 -> 1357 bytes .../images/iconza/yellow/warning_32x32.png | Bin 0 -> 1847 bytes .../images/iconza/yellow/wrench_24x24.png | Bin 0 -> 1480 bytes .../images/iconza/yellow/wrench_32x32.png | Bin 0 -> 2025 bytes .../images/iconza/yellow/zoom_in_24x24.png | Bin 0 -> 1809 bytes .../images/iconza/yellow/zoom_in_32x32.png | Bin 0 -> 2670 bytes .../images/iconza/yellow/zoom_out_24x24.png | Bin 0 -> 1716 bytes .../images/iconza/yellow/zoom_out_32x32.png | Bin 0 -> 2510 bytes .../Mobile/resources/iui/backButton.png | Bin 0 -> 816 bytes .../Mobile/resources/iui/blueButton.png | Bin 0 -> 517 bytes .../Mobile/resources/iui/blue_hd_bg.png | Bin 0 -> 156 bytes .../modules/Mobile/resources/iui/cancel.png | Bin 0 -> 362 bytes .../Mobile/resources/iui/grayButton.png | Bin 0 -> 943 bytes .../resources/iui/iui-logo-touch-icon.png | Bin 0 -> 2887 bytes .../modules/Mobile/resources/iui/iui.css | 406 + .../trunk/modules/Mobile/resources/iui/iui.js | 701 + .../Mobile/resources/iui/iui.original.css | 386 + .../Mobile/resources/iui/iui.original.js | 444 + .../modules/Mobile/resources/iui/iuix.css | 1 + .../modules/Mobile/resources/iui/iuix.js | 1 + .../Mobile/resources/iui/listArrow.png | Bin 0 -> 259 bytes .../Mobile/resources/iui/listArrowSel.png | Bin 0 -> 308 bytes .../Mobile/resources/iui/listGroup.png | Bin 0 -> 2867 bytes .../modules/Mobile/resources/iui/loading.gif | Bin 0 -> 1435 bytes .../Mobile/resources/iui/pinstripes.png | Bin 0 -> 117 bytes .../Mobile/resources/iui/selection.png | Bin 0 -> 159 bytes .../modules/Mobile/resources/iui/thumb.png | Bin 0 -> 2835 bytes .../modules/Mobile/resources/iui/toggle.png | Bin 0 -> 2815 bytes .../modules/Mobile/resources/iui/toggleOn.png | Bin 0 -> 163 bytes .../Mobile/resources/iui/toolButton.png | Bin 0 -> 531 bytes .../modules/Mobile/resources/iui/toolbar.png | Bin 0 -> 171 bytes .../Mobile/resources/iui/whiteButton.png | Bin 0 -> 978 bytes .../Mobile/resources/skins/default.css | 172 + .../modules/Notes/language/zh_cn.lang.php | 41 + .../modules/Orders/language/zh_cn.lang.php | 138 + .../trunk/modules/PickList/AssignValues.php | 53 + .../trunk/modules/PickList/PickList.php | 78 + .../trunk/modules/PickList/PickListAction.php | 139 + .../trunk/modules/PickList/PickListAjax.php | 13 + .../trunk/modules/PickList/PickListUtils.php | 211 + .../modules/PickList/SaveAssignedValues.php | 71 + .../trunk/modules/PickList/ShowActionDivs.php | 61 + .../trunk/modules/PickList/ShowRoleSelect.php | 34 + .../modules/PickList/language/en_us.lang.php | 34 + .../modules/PickList/language/zh_cn.lang.php | 34 + oss/vtiger/trunk/modules/Portal/Delete.php | 22 + oss/vtiger/trunk/modules/Portal/ListView.php | 78 + oss/vtiger/trunk/modules/Portal/Popup.php | 67 + oss/vtiger/trunk/modules/Portal/Portal.js | 146 + oss/vtiger/trunk/modules/Portal/Portal.php | 47 + .../trunk/modules/Portal/PortalAjax.php | 13 + oss/vtiger/trunk/modules/Portal/Save.php | 44 + oss/vtiger/trunk/modules/Portal/index.php | 13 + .../modules/Portal/language/en_us.lang.php | 34 + .../modules/Portal/language/zh_cn.lang.php | 32 + .../modules/Potentials/CallRelatedList.php | 75 + .../trunk/modules/Potentials/Charts.php | 1241 + .../trunk/modules/Potentials/CustomView.php | 14 + .../trunk/modules/Potentials/Delete.php | 35 + .../trunk/modules/Potentials/DetailView.php | 128 + .../modules/Potentials/DetailViewAjax.php | 51 + .../trunk/modules/Potentials/EditView.php | 164 + .../modules/Potentials/ExportRecords.php | 13 + .../Potentials/FindDuplicateRecords.php | 106 + .../trunk/modules/Potentials/Import.php | 45 + .../trunk/modules/Potentials/ListView.php | 261 + .../modules/Potentials/ListViewPagging.php | 11 + .../trunk/modules/Potentials/ListViewTop.php | 98 + .../trunk/modules/Potentials/MassEdit.php | 45 + .../trunk/modules/Potentials/MassEditSave.php | 67 + oss/vtiger/trunk/modules/Potentials/Popup.php | 17 + .../trunk/modules/Potentials/Potentials.js | 89 + .../trunk/modules/Potentials/Potentials.php | 750 + .../modules/Potentials/PotentialsAjax.php | 12 + .../modules/Potentials/ProcessDuplicates.php | 134 + .../trunk/modules/Potentials/QuickCreate.php | 12 + oss/vtiger/trunk/modules/Potentials/Save.php | 74 + .../trunk/modules/Potentials/Settings.php | 13 + .../trunk/modules/Potentials/TagCloud.php | 12 + .../modules/Potentials/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/Potentials/index.php | 30 + .../Potentials/language/en_us.lang.php | 156 + .../Potentials/language/zh_cn.lang.php | 158 + .../modules/Potentials/updateRelations.php | 55 + .../modules/PriceBooks/CallRelatedList.php | 80 + .../trunk/modules/PriceBooks/CustomView.php | 14 + .../trunk/modules/PriceBooks/Delete.php | 51 + .../trunk/modules/PriceBooks/DetailView.php | 107 + .../modules/PriceBooks/DetailViewAjax.php | 46 + .../trunk/modules/PriceBooks/EditView.php | 125 + .../trunk/modules/PriceBooks/ListView.php | 193 + .../modules/PriceBooks/ListViewPagging.php | 11 + .../trunk/modules/PriceBooks/MassEdit.php | 45 + .../trunk/modules/PriceBooks/MassEditSave.php | 67 + oss/vtiger/trunk/modules/PriceBooks/Popup.php | 13 + .../trunk/modules/PriceBooks/PriceBooks.js | 192 + .../trunk/modules/PriceBooks/PriceBooks.php | 315 + .../modules/PriceBooks/PriceBooksAjax.php | 13 + .../trunk/modules/PriceBooks/QuickCreate.php | 12 + oss/vtiger/trunk/modules/PriceBooks/Save.php | 51 + .../trunk/modules/PriceBooks/Settings.php | 13 + .../trunk/modules/PriceBooks/TagCloud.php | 12 + .../modules/PriceBooks/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/PriceBooks/index.php | 20 + .../PriceBooks/language/en_us.lang.php | 42 + .../PriceBooks/language/zh_cn.lang.php | 41 + .../Products/AddProductToPriceBooks.html | 156 + .../Products/AddProductToPriceBooks.php | 170 + .../Products/AddProductsToPriceBook.html | 58 + .../Products/AddProductsToPriceBook.php | 189 + .../modules/Products/CallRelatedList.php | 74 + .../trunk/modules/Products/CustomView.php | 12 + oss/vtiger/trunk/modules/Products/Delete.php | 37 + .../Products/DeletePriceBookProductRel.php | 33 + .../trunk/modules/Products/DetailView.php | 127 + .../trunk/modules/Products/DetailViewAjax.php | 39 + .../trunk/modules/Products/EditListPrice.php | 65 + .../trunk/modules/Products/EditView.php | 262 + .../trunk/modules/Products/ExportRecords.php | 12 + .../modules/Products/FindDuplicateRecords.php | 106 + oss/vtiger/trunk/modules/Products/Import.php | 12 + .../modules/Products/InventoryPriceAjax.php | 38 + .../modules/Products/InventoryTaxAjax.php | 68 + .../trunk/modules/Products/ListView.php | 212 + .../modules/Products/ListViewPagging.php | 11 + .../trunk/modules/Products/MassEdit.php | 43 + .../trunk/modules/Products/MassEditSave.php | 59 + oss/vtiger/trunk/modules/Products/Popup.php | 11 + .../modules/Products/ProcessDuplicates.php | 134 + oss/vtiger/trunk/modules/Products/Products.js | 172 + .../trunk/modules/Products/Products.php | 1280 + .../trunk/modules/Products/ProductsAjax.php | 11 + .../trunk/modules/Products/Productsslide.js | 103 + .../trunk/modules/Products/QuickCreate.php | 11 + oss/vtiger/trunk/modules/Products/Save.php | 135 + .../trunk/modules/Products/Settings.php | 13 + .../trunk/modules/Products/TagCloud.php | 11 + .../trunk/modules/Products/UnifiedSearch.php | 11 + .../modules/Products/UpdateListPrice.php | 24 + .../modules/Products/addPbProductRelToDB.php | 61 + oss/vtiger/trunk/modules/Products/index.php | 15 + .../modules/Products/language/en_us.lang.php | 221 + .../modules/Products/language/zh_cn.lang.php | 218 + .../trunk/modules/Products/multifile.js | 173 + .../trunk/modules/Products/placeholder.gif | Bin 0 -> 80 bytes .../modules/Products/updateRelations.php | 54 + .../modules/PurchaseOrder/CallRelatedList.php | 71 + .../trunk/modules/PurchaseOrder/CreatePDF.php | 16 + .../modules/PurchaseOrder/CustomView.php | 14 + .../trunk/modules/PurchaseOrder/Delete.php | 38 + .../modules/PurchaseOrder/DetailView.php | 128 + .../modules/PurchaseOrder/DetailViewAjax.php | 53 + .../trunk/modules/PurchaseOrder/EditView.php | 254 + .../PurchaseOrder/ListTopPurchaseOrder.php | 133 + .../trunk/modules/PurchaseOrder/ListView.php | 224 + .../modules/PurchaseOrder/ListViewPagging.php | 11 + .../trunk/modules/PurchaseOrder/MassEdit.php | 45 + .../modules/PurchaseOrder/MassEditSave.php | 67 + .../trunk/modules/PurchaseOrder/Popup.php | 13 + .../modules/PurchaseOrder/PurchaseOrder.js | 33 + .../modules/PurchaseOrder/PurchaseOrder.php | 365 + .../PurchaseOrder/PurchaseOrderAjax.php | 12 + .../trunk/modules/PurchaseOrder/Save.php | 81 + .../modules/PurchaseOrder/SendPDFMail.php | 23 + .../trunk/modules/PurchaseOrder/Settings.php | 13 + .../trunk/modules/PurchaseOrder/TagCloud.php | 12 + .../modules/PurchaseOrder/UnifiedSearch.php | 11 + .../trunk/modules/PurchaseOrder/index.php | 53 + .../PurchaseOrder/language/en_us.lang.php | 203 + .../PurchaseOrder/language/zh_cn.lang.php | 188 + .../PurchaseOrder/pdf_templates/footer.php | 35 + .../PurchaseOrder/pdf_templates/header.php | 103 + .../pdf_templates/lastpage/body.php | 62 + .../pdf_templates/lastpage/footer.php | 60 + .../modules/PurchaseOrder/updateRelations.php | 47 + .../trunk/modules/Quotes/CallRelatedList.php | 70 + oss/vtiger/trunk/modules/Quotes/CreatePDF.php | 28 + .../trunk/modules/Quotes/CustomView.php | 14 + oss/vtiger/trunk/modules/Quotes/Delete.php | 39 + .../trunk/modules/Quotes/DetailView.php | 137 + .../trunk/modules/Quotes/DetailViewAjax.php | 45 + oss/vtiger/trunk/modules/Quotes/EditView.php | 276 + .../trunk/modules/Quotes/ListTopQuotes.php | 137 + oss/vtiger/trunk/modules/Quotes/ListView.php | 221 + .../trunk/modules/Quotes/ListViewPagging.php | 11 + oss/vtiger/trunk/modules/Quotes/MassEdit.php | 45 + .../trunk/modules/Quotes/MassEditSave.php | 67 + oss/vtiger/trunk/modules/Quotes/Popup.php | 17 + oss/vtiger/trunk/modules/Quotes/Quotes.js | 52 + oss/vtiger/trunk/modules/Quotes/Quotes.php | 407 + .../trunk/modules/Quotes/QuotesAjax.php | 12 + oss/vtiger/trunk/modules/Quotes/Save.php | 64 + .../trunk/modules/Quotes/SendPDFMail.php | 24 + oss/vtiger/trunk/modules/Quotes/Settings.php | 13 + oss/vtiger/trunk/modules/Quotes/TagCloud.php | 12 + .../trunk/modules/Quotes/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/Quotes/index.php | 54 + .../modules/Quotes/language/en_us.lang.php | 188 + .../modules/Quotes/language/zh_cn.lang.php | 178 + .../modules/Quotes/pdf_templates/footer.php | 32 + .../modules/Quotes/pdf_templates/header.php | 99 + .../Quotes/pdf_templates/lastpage/body.php | 62 + .../Quotes/pdf_templates/lastpage/footer.php | 61 + .../trunk/modules/Quotes/updateRelations.php | 48 + .../modules/RecycleBin/EmptyRecyclebin.php | 24 + .../trunk/modules/RecycleBin/ListView.php | 224 + .../trunk/modules/RecycleBin/RecycleBin.js | 199 + .../trunk/modules/RecycleBin/RecycleBin.php | 40 + .../modules/RecycleBin/RecycleBinAjax.php | 11 + .../modules/RecycleBin/RecycleBinHandler.php | 17 + .../modules/RecycleBin/RecycleBinUtils.php | 156 + .../trunk/modules/RecycleBin/Restoration.php | 30 + oss/vtiger/trunk/modules/RecycleBin/index.php | 15 + .../modules/RecycleBin/language/en_us.lang.js | 13 + .../RecycleBin/language/en_us.lang.php | 22 + .../modules/RecycleBin/language/zh_cn.lang.js | 13 + .../RecycleBin/language/zh_cn.lang.php | 22 + .../trunk/modules/Reports/AdvancedFilter.php | 269 + .../trunk/modules/Reports/ChangeFolder.php | 44 + .../trunk/modules/Reports/CheckReport.php | 42 + .../trunk/modules/Reports/CreatePDF.php | 429 + oss/vtiger/trunk/modules/Reports/CreateXL.php | 83 + oss/vtiger/trunk/modules/Reports/Delete.php | 65 + .../modules/Reports/DeleteReportFolder.php | 50 + oss/vtiger/trunk/modules/Reports/Forms.php | 23 + oss/vtiger/trunk/modules/Reports/ListView.php | 73 + .../trunk/modules/Reports/NewReport0.php | 126 + .../trunk/modules/Reports/NewReport1.php | 126 + .../trunk/modules/Reports/PopulateReports.php | 584 + .../trunk/modules/Reports/PrintReport.php | 37 + .../trunk/modules/Reports/ReportColumns.php | 158 + .../modules/Reports/ReportColumnsTotal.php | 75 + .../trunk/modules/Reports/ReportFilters.php | 42 + .../trunk/modules/Reports/ReportGrouping.php | 221 + .../trunk/modules/Reports/ReportRun.php | 2767 ++ .../trunk/modules/Reports/ReportSharing.php | 175 + .../trunk/modules/Reports/ReportType.php | 47 + oss/vtiger/trunk/modules/Reports/Reports.js | 794 + oss/vtiger/trunk/modules/Reports/Reports.php | 1570 ++ .../trunk/modules/Reports/ReportsAjax.php | 12 + oss/vtiger/trunk/modules/Reports/Save.php | 370 + .../trunk/modules/Reports/SaveAndRun.php | 303 + .../trunk/modules/Reports/SaveReport.php | 43 + .../trunk/modules/Reports/SaveReport0.php | 30 + .../modules/Reports/SaveReportFolder.php | 69 + .../trunk/modules/Reports/StandardFilter.php | 170 + oss/vtiger/trunk/modules/Reports/index.php | 27 + .../modules/Reports/language/en_us.lang.php | 227 + .../modules/Reports/language/zh_cn.lang.php | 229 + oss/vtiger/trunk/modules/Rss/Delete.php | 31 + oss/vtiger/trunk/modules/Rss/Forms.php | 45 + oss/vtiger/trunk/modules/Rss/ListView.html | 45 + oss/vtiger/trunk/modules/Rss/ListView.php | 92 + oss/vtiger/trunk/modules/Rss/Popup.html | 57 + oss/vtiger/trunk/modules/Rss/Popup.php | 50 + oss/vtiger/trunk/modules/Rss/Rss.js | 60 + oss/vtiger/trunk/modules/Rss/Rss.php | 464 + oss/vtiger/trunk/modules/Rss/RssAjax.php | 15 + oss/vtiger/trunk/modules/Rss/Save.php | 24 + oss/vtiger/trunk/modules/Rss/Star.php | 24 + oss/vtiger/trunk/modules/Rss/index.php | 27 + .../trunk/modules/Rss/language/en_us.lang.php | 59 + .../trunk/modules/Rss/language/zh_cn.lang.php | 52 + .../modules/SalesOrder/CallRelatedList.php | 71 + .../trunk/modules/SalesOrder/CreateSOPDF.php | 19 + .../trunk/modules/SalesOrder/CustomView.php | 14 + .../trunk/modules/SalesOrder/Delete.php | 39 + .../trunk/modules/SalesOrder/DetailView.php | 132 + .../modules/SalesOrder/DetailViewAjax.php | 45 + .../trunk/modules/SalesOrder/EditView.php | 363 + .../modules/SalesOrder/ListTopSalesOrder.php | 132 + .../trunk/modules/SalesOrder/ListView.php | 211 + .../modules/SalesOrder/ListViewPagging.php | 11 + .../trunk/modules/SalesOrder/MassEdit.php | 45 + .../trunk/modules/SalesOrder/MassEditSave.php | 67 + oss/vtiger/trunk/modules/SalesOrder/Popup.php | 14 + .../SalesOrder/RecurringInvoiceHandler.php | 50 + .../trunk/modules/SalesOrder/SalesOrder.js | 49 + .../trunk/modules/SalesOrder/SalesOrder.php | 408 + .../modules/SalesOrder/SalesOrderAjax.php | 13 + oss/vtiger/trunk/modules/SalesOrder/Save.php | 63 + .../trunk/modules/SalesOrder/SendPDFMail.php | 24 + .../trunk/modules/SalesOrder/Settings.php | 13 + .../trunk/modules/SalesOrder/TagCloud.php | 12 + .../modules/SalesOrder/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/SalesOrder/index.php | 54 + .../SalesOrder/language/en_us.lang.php | 209 + .../SalesOrder/language/zh_cn.lang.php | 208 + .../SalesOrder/pdf_templates/footer.php | 35 + .../SalesOrder/pdf_templates/header.php | 106 + .../pdf_templates/lastpage/body.php | 62 + .../pdf_templates/lastpage/footer.php | 60 + .../modules/SalesOrder/updateRelations.php | 48 + .../ServiceContracts/CallRelatedList.php | 72 + .../modules/ServiceContracts/CustomView.php | 12 + .../trunk/modules/ServiceContracts/Delete.php | 28 + .../modules/ServiceContracts/DetailView.php | 104 + .../ServiceContracts/DetailViewAjax.php | 39 + .../modules/ServiceContracts/EditView.php | 134 + .../ServiceContracts/ExportRecords.php | 12 + .../ServiceContracts/FindDuplicateRecords.php | 106 + .../trunk/modules/ServiceContracts/Import.php | 12 + .../modules/ServiceContracts/ListView.php | 189 + .../ServiceContracts/ListViewPagging.php | 11 + .../modules/ServiceContracts/MassEdit.php | 44 + .../modules/ServiceContracts/MassEditSave.php | 67 + .../trunk/modules/ServiceContracts/Popup.php | 11 + .../ServiceContracts/ProcessDuplicates.php | 134 + .../modules/ServiceContracts/QuickCreate.php | 11 + .../trunk/modules/ServiceContracts/Save.php | 53 + .../ServiceContracts/ServiceContracts.js | 8 + .../ServiceContracts/ServiceContracts.php | 608 + .../ServiceContracts/ServiceContractsAjax.php | 11 + .../ServiceContractsHandler.php | 101 + .../modules/ServiceContracts/Settings.php | 13 + .../modules/ServiceContracts/TagCloud.php | 11 + .../ServiceContracts/UnifiedSearch.php | 11 + .../trunk/modules/ServiceContracts/index.php | 15 + .../ServiceContracts/language/en_us.lang.php | 59 + .../ServiceContracts/language/zh_cn.lang.php | 59 + .../trunk/modules/ServiceContracts/schema.xml | 33 + .../ServiceContracts/updateRelations.php | 46 + .../Services/AddServiceToPriceBooks.php | 168 + .../Services/AddServicesToPriceBook.php | 185 + .../modules/Services/CallRelatedList.php | 77 + .../trunk/modules/Services/CustomView.php | 12 + oss/vtiger/trunk/modules/Services/Delete.php | 31 + .../Services/DeletePriceBookServiceRel.php | 29 + .../trunk/modules/Services/DetailView.php | 116 + .../trunk/modules/Services/DetailViewAjax.php | 39 + .../trunk/modules/Services/EditListPrice.php | 72 + .../trunk/modules/Services/EditView.php | 182 + .../trunk/modules/Services/ExportRecords.php | 12 + .../modules/Services/FindDuplicateRecords.php | 106 + oss/vtiger/trunk/modules/Services/Import.php | 12 + .../modules/Services/InventoryPriceAjax.php | 36 + .../modules/Services/InventoryTaxAjax.php | 68 + .../trunk/modules/Services/ListView.php | 189 + .../modules/Services/ListViewPagging.php | 11 + .../trunk/modules/Services/MassEdit.php | 44 + .../trunk/modules/Services/MassEditSave.php | 58 + oss/vtiger/trunk/modules/Services/Popup.php | 11 + .../modules/Services/ProcessDuplicates.php | 134 + .../trunk/modules/Services/QuickCreate.php | 11 + oss/vtiger/trunk/modules/Services/Save.php | 59 + oss/vtiger/trunk/modules/Services/Services.js | 341 + .../trunk/modules/Services/Services.php | 1124 + .../trunk/modules/Services/ServicesAjax.php | 11 + .../trunk/modules/Services/Servicesslide.js | 103 + .../trunk/modules/Services/Settings.php | 13 + .../trunk/modules/Services/TagCloud.php | 11 + .../trunk/modules/Services/UnifiedSearch.php | 11 + .../modules/Services/UpdateListPrice.php | 24 + .../modules/Services/addPbServiceRelToDB.php | 63 + oss/vtiger/trunk/modules/Services/index.php | 15 + .../modules/Services/language/en_us.lang.php | 59 + .../modules/Services/language/zh_cn.lang.php | 59 + .../trunk/modules/Services/multifile.js | 173 + .../trunk/modules/Services/placeholder.gif | Bin 0 -> 80 bytes oss/vtiger/trunk/modules/Services/schema.xml | 36 + .../modules/Services/updateRelations.php | 48 + .../trunk/modules/Settings/AddBlock.php | 127 + .../trunk/modules/Settings/AddBlockField.php | 139 + .../modules/Settings/AddBlockFieldToDB.php | 36 + .../trunk/modules/Settings/AddBlockToDB.php | 57 + .../modules/Settings/AddCustomFieldToDB.php | 309 + .../trunk/modules/Settings/Announcements.php | 36 + .../trunk/modules/Settings/AuditTrail.php | 126 + .../trunk/modules/Settings/AuditTrailList.php | 42 + .../modules/Settings/BackupServerConfig.php | 150 + .../modules/Settings/CreateCustomField.php | 218 + .../modules/Settings/CreateSharingRule.php | 350 + .../trunk/modules/Settings/CurrencyDelete.php | 25 + .../modules/Settings/CurrencyDeleteStep1.php | 81 + .../modules/Settings/CurrencyEditView.php | 95 + .../modules/Settings/CurrencyListView.php | 53 + .../modules/Settings/CustomFieldList.php | 187 + .../modules/Settings/CustomModEntityNo.php | 115 + .../trunk/modules/Settings/DefModuleView.php | 42 + .../Settings/DefaultFieldPermissions.php | 93 + .../modules/Settings/DeleteCustomField.php | 93 + .../Settings/DeleteLeadCustomFieldMapping.php | 21 + .../modules/Settings/DeleteMailAccount.php | 28 + .../trunk/modules/Settings/EditComboField.php | 107 + .../modules/Settings/EditCompanyDetails.php | 88 + .../Settings/EditDefOrgFieldLevelAccess.php | 107 + .../Settings/EditInventoryNotification.php | 55 + .../modules/Settings/EditNotification.php | 71 + .../trunk/modules/Settings/EmailConfig.php | 72 + oss/vtiger/trunk/modules/Settings/Forms.php | 268 + .../trunk/modules/Settings/GetFieldInfo.php | 62 + .../modules/Settings/GroupDetailView.php | 158 + .../modules/Settings/LayoutBlockList.php | 1034 + .../Settings/LeadCustomFieldMapping.php | 151 + .../modules/Settings/ListLoginHistory.php | 58 + .../modules/Settings/ListMailAccount.php | 162 + .../modules/Settings/ListModuleOwners.php | 144 + .../trunk/modules/Settings/ListProfiles.php | 73 + .../trunk/modules/Settings/MailScanner.php | 47 + .../Settings/MailScanner/MailScannerEdit.php | 31 + .../MailScanner/MailScannerFolder.php | 31 + .../MailScanner/MailScannerFolderSave.php | 28 + .../MailScanner/MailScannerFolderUpdate.php | 39 + .../Settings/MailScanner/MailScannerInfo.php | 32 + .../Settings/MailScanner/MailScannerRule.php | 32 + .../MailScanner/MailScannerRuleDelete.php | 20 + .../MailScanner/MailScannerRuleEdit.php | 34 + .../MailScanner/MailScannerRuleMove.php | 26 + .../MailScanner/MailScannerRuleSave.php | 40 + .../Settings/MailScanner/MailScannerSave.php | 75 + .../MailScanner/core/MailAttachmentMIME.php | 252 + .../Settings/MailScanner/core/MailBox.php | 222 + .../Settings/MailScanner/core/MailRecord.php | 318 + .../Settings/MailScanner/core/MailScanner.php | 412 + .../MailScanner/core/MailScannerAction.php | 359 + .../MailScanner/core/MailScannerInfo.php | 375 + .../MailScanner/core/MailScannerRule.php | 396 + .../trunk/modules/Settings/ModifyPickList.php | 242 + .../trunk/modules/Settings/ModuleManager.php | 81 + .../modules/Settings/ModuleManager/Export.php | 19 + .../modules/Settings/ModuleManager/Import.php | 89 + .../modules/Settings/ModuleManager/Update.php | 106 + .../modules/Settings/OrgSharingDetailView.php | 163 + .../modules/Settings/OrganizationConfig.php | 95 + .../OrganizationTermsandConditions.php | 46 + .../modules/Settings/ProxyServerConfig.php | 61 + .../modules/Settings/RoleDeleteStep1.php | 36 + .../trunk/modules/Settings/RoleDetailView.php | 91 + oss/vtiger/trunk/modules/Settings/Save.php | 173 + .../trunk/modules/Settings/SaveAuditTrail.php | 44 + .../trunk/modules/Settings/SaveCompany.php | 41 + .../modules/Settings/SaveConvertLead.php | 48 + .../modules/Settings/SaveCurrencyInfo.php | 43 + .../modules/Settings/SaveEnableBackup.php | 109 + .../Settings/SaveInventoryNotification.php | 23 + .../modules/Settings/SaveNotification.php | 36 + .../trunk/modules/Settings/SaveRole.php | 65 + .../modules/Settings/SaveSharingRule.php | 57 + oss/vtiger/trunk/modules/Settings/Settings.js | 8 + .../trunk/modules/Settings/SettingsAjax.php | 36 + .../trunk/modules/Settings/ShowAuditTrail.php | 79 + .../trunk/modules/Settings/TaxConfig.php | 243 + .../modules/Settings/UpdateComboValues.php | 110 + .../UpdateDefaultFieldLevelAccess.php | 53 + oss/vtiger/trunk/modules/Settings/add2db.php | 161 + .../modules/Settings/createemailtemplate.php | 44 + .../trunk/modules/Settings/createnewgroup.php | 161 + .../trunk/modules/Settings/createrole.php | 72 + .../modules/Settings/deleteemailtemplate.php | 21 + .../modules/Settings/deletewordtemplate.php | 21 + .../Settings/detailviewemailtemplate.php | 61 + .../trunk/modules/Settings/downloadfile.php | 32 + .../modules/Settings/editemailtemplate.php | 60 + oss/vtiger/trunk/modules/Settings/index.php | 34 + .../modules/Settings/language/en_us.lang.php | 1204 + .../modules/Settings/language/zh_cn.lang.php | 1043 + .../modules/Settings/listemailtemplates.php | 69 + .../trunk/modules/Settings/listgroups.php | 49 + .../Settings/listinventorynotifications.php | 47 + .../Settings/listnotificationschedulers.php | 52 + .../trunk/modules/Settings/listroles.php | 174 + .../modules/Settings/listwordtemplates.php | 58 + .../Settings/mailmergedownloadfile.php | 43 + .../modules/Settings/profilePrivileges.php | 767 + .../modules/Settings/saveemailtemplate.php | 41 + .../Settings/savetermsandconditions.php | 33 + .../modules/Settings/savewordtemplate.php | 144 + oss/vtiger/trunk/modules/Settings/upload.php | 65 + .../trunk/modules/Settings/vtigerCRM.CAB | Bin 0 -> 1165278 bytes .../trunk/modules/System/SystemAjax.php | 13 + oss/vtiger/trunk/modules/System/config.php | 96 + oss/vtiger/trunk/modules/System/distros.ini | 60 + .../trunk/modules/System/images/Arch.gif | Bin 0 -> 576 bytes .../trunk/modules/System/images/Cobalt.png | Bin 0 -> 2047 bytes .../trunk/modules/System/images/Darwin.png | Bin 0 -> 851 bytes .../trunk/modules/System/images/Debian.png | Bin 0 -> 438 bytes .../trunk/modules/System/images/Fedora.png | Bin 0 -> 451 bytes .../trunk/modules/System/images/FreeBSD.png | Bin 0 -> 554 bytes .../trunk/modules/System/images/Gentoo.png | Bin 0 -> 1891 bytes .../trunk/modules/System/images/Mandrake.png | Bin 0 -> 451 bytes .../trunk/modules/System/images/NetBSD.png | Bin 0 -> 1478 bytes .../trunk/modules/System/images/OpenBSD.png | Bin 0 -> 1876 bytes .../trunk/modules/System/images/Redhat.png | Bin 0 -> 470 bytes .../trunk/modules/System/images/Rubix.png | Bin 0 -> 1830 bytes .../trunk/modules/System/images/Slackware.png | Bin 0 -> 1878 bytes .../trunk/modules/System/images/Suse.png | Bin 0 -> 1733 bytes .../trunk/modules/System/images/Trustix.gif | Bin 0 -> 598 bytes .../trunk/modules/System/images/free-eos.png | Bin 0 -> 1687 bytes .../trunk/modules/System/images/lfs.png | Bin 0 -> 1818 bytes .../trunk/modules/System/images/unknown.png | Bin 0 -> 1300 bytes oss/vtiger/trunk/modules/System/images/xp.gif | Bin 0 -> 1518 bytes .../modules/System/includes/XPath.class.php | 6355 +++++ .../System/includes/class.Template.inc.php | 449 + .../System/includes/class.error.inc.php | 107 + .../System/includes/common_functions.php | 350 + .../modules/System/includes/lang/ar_utf8.php | 110 + .../trunk/modules/System/includes/lang/bg.php | 108 + .../modules/System/includes/lang/big5.php | 107 + .../trunk/modules/System/includes/lang/br.php | 105 + .../trunk/modules/System/includes/lang/ca.php | 107 + .../trunk/modules/System/includes/lang/cn.php | 105 + .../trunk/modules/System/includes/lang/cs.php | 106 + .../trunk/modules/System/includes/lang/ct.php | 103 + .../trunk/modules/System/includes/lang/da.php | 106 + .../trunk/modules/System/includes/lang/de.php | 104 + .../trunk/modules/System/includes/lang/en.php | 106 + .../trunk/modules/System/includes/lang/es.php | 104 + .../trunk/modules/System/includes/lang/et.php | 104 + .../trunk/modules/System/includes/lang/eu.php | 106 + .../trunk/modules/System/includes/lang/fi.php | 106 + .../trunk/modules/System/includes/lang/fr.php | 102 + .../trunk/modules/System/includes/lang/gr.php | 108 + .../trunk/modules/System/includes/lang/he.php | 107 + .../trunk/modules/System/includes/lang/hu.php | 108 + .../trunk/modules/System/includes/lang/id.php | 107 + .../modules/System/includes/lang/index.html | 0 .../trunk/modules/System/includes/lang/is.php | 104 + .../trunk/modules/System/includes/lang/it.php | 104 + .../trunk/modules/System/includes/lang/ja.php | 3 + .../trunk/modules/System/includes/lang/jp.php | 105 + .../trunk/modules/System/includes/lang/ko.php | 107 + .../trunk/modules/System/includes/lang/lt.php | 109 + .../trunk/modules/System/includes/lang/lv.php | 106 + .../trunk/modules/System/includes/lang/nl.php | 110 + .../trunk/modules/System/includes/lang/no.php | 104 + .../trunk/modules/System/includes/lang/pl.php | 107 + .../modules/System/includes/lang/pt-br.php | 110 + .../trunk/modules/System/includes/lang/pt.php | 106 + .../trunk/modules/System/includes/lang/ro.php | 105 + .../trunk/modules/System/includes/lang/ru.php | 108 + .../trunk/modules/System/includes/lang/sk.php | 106 + .../trunk/modules/System/includes/lang/sv.php | 107 + .../trunk/modules/System/includes/lang/tr.php | 106 + .../trunk/modules/System/includes/lang/tw.php | 106 + .../System/includes/mb/class.healthd.inc.php | 119 + .../includes/mb/class.hwsensors.inc.php | 102 + .../includes/mb/class.lmsensors.inc.php | 176 + .../System/includes/mb/class.mbm5.inc.php | 127 + .../System/includes/mb/class.mbmon.inc.php | 100 + .../modules/System/includes/mb/index.html | 0 .../includes/os/class.BSD.common.inc.php | 298 + .../System/includes/os/class.Darwin.inc.php | 237 + .../System/includes/os/class.FreeBSD.inc.php | 108 + .../System/includes/os/class.HP-UX.inc.php | 421 + .../System/includes/os/class.Linux.inc.php | 528 + .../System/includes/os/class.NetBSD.inc.php | 111 + .../System/includes/os/class.OpenBSD.inc.php | 110 + .../System/includes/os/class.SunOS.inc.php | 238 + .../includes/os/class.WINNT.inc.bak.php | 295 + .../System/includes/os/class.WINNT.inc.php | 315 + .../includes/os/class.parseProgs.inc.php | 133 + .../modules/System/includes/os/index.html | 0 .../modules/System/includes/system_footer.php | 107 + .../modules/System/includes/system_header.php | 64 + .../System/includes/xml/filesystems.php | 162 + .../modules/System/includes/xml/hardware.php | 252 + .../modules/System/includes/xml/hddtemp.php | 88 + .../modules/System/includes/xml/index.html | 0 .../modules/System/includes/xml/mbinfo.php | 246 + .../modules/System/includes/xml/memory.php | 200 + .../modules/System/includes/xml/network.php | 93 + .../modules/System/includes/xml/vitals.php | 123 + .../modules/System/language/en_us.lang.php | 27 + .../modules/System/language/zh_cn.lang.php | 27 + .../trunk/modules/System/listsysconfig.php | 28 + .../trunk/modules/System/phpsysinfo.dtd | 87 + .../trunk/modules/System/systemconfig.php | 324 + .../modules/System/templates/classic/box.tpl | 32 + .../System/templates/classic/classic.css | 79 + .../modules/System/templates/classic/form.tpl | 31 + .../templates/classic/images/bar_left.gif | Bin 0 -> 61 bytes .../templates/classic/images/bar_middle.gif | Bin 0 -> 61 bytes .../templates/classic/images/bar_right.gif | Bin 0 -> 61 bytes .../templates/classic/images/redbar_left.gif | Bin 0 -> 61 bytes .../classic/images/redbar_middle.gif | Bin 0 -> 61 bytes .../templates/classic/images/redbar_right.gif | Bin 0 -> 61 bytes .../System/templates/classic/images/trans.gif | Bin 0 -> 43 bytes .../modules/Tasks/language/zh_cn.lang.php | 52 + .../trunk/modules/Tooltip/ComputeTooltip.php | 41 + .../trunk/modules/Tooltip/EditQuickView.php | 55 + .../trunk/modules/Tooltip/QuickView.php | 44 + .../Tooltip/SaveTooltipInformation.php | 103 + oss/vtiger/trunk/modules/Tooltip/Tooltip.js | 9 + oss/vtiger/trunk/modules/Tooltip/Tooltip.php | 57 + .../trunk/modules/Tooltip/TooltipAjax.php | 13 + .../trunk/modules/Tooltip/TooltipHandler.php | 25 + .../modules/Tooltip/TooltipHeaderScript.js | 107 + .../trunk/modules/Tooltip/TooltipSettings.js | 82 + .../trunk/modules/Tooltip/TooltipUtils.php | 258 + oss/vtiger/trunk/modules/Tooltip/index.php | 13 + .../modules/Tooltip/language/en_us.lang.php | 22 + .../modules/Tooltip/language/zh_cn.lang.php | 22 + oss/vtiger/trunk/modules/Tooltip/schema.xml | 16 + .../trunk/modules/Users/AddMailAccount.php | 115 + .../trunk/modules/Users/Announcements.php | 36 + .../trunk/modules/Users/Authenticate.php | 145 + .../trunk/modules/Users/ChangePassword.php | 111 + .../trunk/modules/Users/CreateProfile.php | 68 + .../modules/Users/CreateUserPrivilegeFile.php | 1780 ++ .../modules/Users/DefaultDataPopulator.php | 2541 ++ oss/vtiger/trunk/modules/Users/Delete.php | 18 + .../trunk/modules/Users/DeleteGroup.php | 30 + .../trunk/modules/Users/DeleteProfile.php | 17 + oss/vtiger/trunk/modules/Users/DeleteRole.php | 18 + .../trunk/modules/Users/DeleteSharingRule.php | 16 + oss/vtiger/trunk/modules/Users/DeleteUser.php | 77 + oss/vtiger/trunk/modules/Users/DetailView.php | 234 + .../trunk/modules/Users/DetailViewAjax.php | 49 + oss/vtiger/trunk/modules/Users/EditView.php | 125 + oss/vtiger/trunk/modules/Users/Error.php | 26 + oss/vtiger/trunk/modules/Users/Forms.php | 216 + .../trunk/modules/Users/GroupDeleteStep1.php | 119 + oss/vtiger/trunk/modules/Users/ListView.php | 103 + oss/vtiger/trunk/modules/Users/Login.php | 198 + .../trunk/modules/Users/LoginHistory.php | 211 + oss/vtiger/trunk/modules/Users/Logout.php | 129 + .../modules/Users/OrgSharingEditView.php | 73 + oss/vtiger/trunk/modules/Users/Popup.php | 20 + .../modules/Users/ProfileDeleteStep1.php | 75 + .../modules/Users/RecalculateSharingRules.php | 18 + .../trunk/modules/Users/RenameProfile.php | 25 + .../trunk/modules/Users/RoleDragDrop.php | 64 + oss/vtiger/trunk/modules/Users/RolePopup.php | 160 + oss/vtiger/trunk/modules/Users/Save.php | 221 + .../trunk/modules/Users/SaveDefModuleView.php | 45 + oss/vtiger/trunk/modules/Users/SaveGroup.php | 126 + .../trunk/modules/Users/SaveMailAccount.php | 58 + .../trunk/modules/Users/SaveOrgSharing.php | 38 + .../trunk/modules/Users/SaveProfile.php | 212 + .../trunk/modules/Users/ShowHistory.html | 53 + .../trunk/modules/Users/ShowHistory.php | 74 + .../trunk/modules/Users/TemplateMerge.php | 30 + .../modules/Users/UpdateProfileChanges.php | 204 + .../trunk/modules/Users/UserDeleteStep1.php | 80 + oss/vtiger/trunk/modules/Users/UserGroups.php | 31 + oss/vtiger/trunk/modules/Users/Users.js | 320 + oss/vtiger/trunk/modules/Users/Users.php | 1319 + oss/vtiger/trunk/modules/Users/UsersAjax.php | 19 + oss/vtiger/trunk/modules/Users/about_us.php | 215 + .../trunk/modules/Users/binaryfilelist.php | 98 + .../modules/Users/deletewordtemplate.php | 19 + .../trunk/modules/Users/downloadfile.php | 41 + .../trunk/modules/Users/getListOfRecords.php | 124 + .../modules/Users/language/en_us.lang.php | 682 + .../modules/Users/language/zh_cn.lang.php | 671 + .../modules/Users/lookupemailtemplates.php | 76 + .../trunk/modules/Users/massChangeStatus.php | 139 + oss/vtiger/trunk/modules/Users/massdelete.php | 80 + .../trunk/modules/Users/notify_detail.php | 69 + .../trunk/modules/Users/populatetemplate.php | 100 + .../modules/Users/updateLeadDBStatus.php | 104 + .../Users/updateNotificationSchedulers.php | 47 + .../trunk/modules/Utilities/Calculator.php | 30 + oss/vtiger/trunk/modules/Utilities/Clock.php | 27 + .../trunk/modules/Utilities/Currencies.php | 132 + oss/vtiger/trunk/modules/Utilities/Merge.php | 88 + .../trunk/modules/Utilities/UtilitiesAjax.php | 14 + .../modules/Utilities/language/en_us.lang.php | 13 + .../modules/Utilities/language/zh_cn.lang.php | 13 + .../trunk/modules/Vendors/CallRelatedList.php | 75 + .../trunk/modules/Vendors/CustomView.php | 14 + oss/vtiger/trunk/modules/Vendors/Delete.php | 38 + .../trunk/modules/Vendors/DetailView.php | 105 + .../trunk/modules/Vendors/DetailViewAjax.php | 45 + oss/vtiger/trunk/modules/Vendors/EditView.php | 127 + .../trunk/modules/Vendors/ExportRecords.php | 12 + .../modules/Vendors/FindDuplicateRecords.php | 107 + oss/vtiger/trunk/modules/Vendors/Import.php | 16 + oss/vtiger/trunk/modules/Vendors/ListView.php | 237 + .../trunk/modules/Vendors/ListViewPagging.php | 11 + oss/vtiger/trunk/modules/Vendors/MassEdit.php | 45 + .../trunk/modules/Vendors/MassEditSave.php | 68 + oss/vtiger/trunk/modules/Vendors/Popup.php | 14 + .../modules/Vendors/ProcessDuplicates.php | 134 + .../trunk/modules/Vendors/QuickCreate.php | 12 + oss/vtiger/trunk/modules/Vendors/Save.php | 53 + oss/vtiger/trunk/modules/Vendors/Settings.php | 13 + oss/vtiger/trunk/modules/Vendors/TagCloud.php | 12 + .../trunk/modules/Vendors/UnifiedSearch.php | 11 + oss/vtiger/trunk/modules/Vendors/Vendors.js | 72 + oss/vtiger/trunk/modules/Vendors/Vendors.php | 499 + .../trunk/modules/Vendors/VendorsAjax.php | 13 + oss/vtiger/trunk/modules/Vendors/index.php | 20 + .../modules/Vendors/language/en_us.lang.php | 70 + .../modules/Vendors/language/zh_cn.lang.php | 52 + .../trunk/modules/Vendors/updateRelations.php | 51 + oss/vtiger/trunk/modules/Vtiger/Settings.php | 82 + .../modules/Webforms/Webforms.config.php | 26 + oss/vtiger/trunk/modules/Webforms/Webforms.js | 1 + .../trunk/modules/Webforms/Webforms.php | 40 + .../trunk/modules/Webforms/WebformsAjax.php | 4 + .../modules/Webforms/WebformsHandler.php | 17 + oss/vtiger/trunk/modules/Webforms/index.php | 7 + .../modules/Webforms/language/en_us.lang.php | 11 + .../modules/Webforms/language/zh_cn.lang.php | 11 + oss/vtiger/trunk/modules/Webforms/post.php | 167 + .../VTConditionalExpression.inc | 126 + .../com_vtiger_workflow/VTEntityCache.inc | 89 + .../VTEntityMethodManager.inc | 62 + .../com_vtiger_workflow/VTEventHandler.inc | 111 + .../com_vtiger_workflow/VTJsonCondition.inc | 112 + .../com_vtiger_workflow/VTSimpleTemplate.inc | 50 + .../com_vtiger_workflow/VTTaskManager.inc | 150 + .../com_vtiger_workflow/VTTaskQueue.inc | 65 + .../VTWorkflowApplication.inc | 75 + .../com_vtiger_workflow/VTWorkflowManager.inc | 187 + .../VTWorkflowTemplateManager.inc | 197 + .../com_vtiger_workflow/VTWorkflowUtils.php | 117 + .../com_vtiger_workflowAjax.php | 12 + .../com_vtiger_workflow/deletetask.php | 45 + .../com_vtiger_workflow/deleteworkflow.php | 44 + .../modules/com_vtiger_workflow/edittask.php | 115 + .../com_vtiger_workflow/editworkflow.php | 86 + .../com_vtiger_workflow/entitymethodjson.php | 21 + .../com_vtiger_workflow/errormessage.php | 12 + .../modules/com_vtiger_workflow/errorpage.php | 18 + .../modules/com_vtiger_workflow/include.inc | 15 + .../include_webservices.php | 18 + .../language/en_us.lang.php | 42 + .../language/zh_cn.lang.php | 34 + .../com_vtiger_workflow/loadtemplates.php | 26 + .../com_vtiger_workflow/modulefieldsjson.php | 19 + .../com_vtiger_workflow/resources/add.png | Bin 0 -> 763 bytes .../resources/createeventtaskscript.js | 106 + .../resources/createtodotaskscript.js | 63 + .../resources/edittaskscript.js | 51 + .../resources/editworkflowscript.js | 499 + .../resources/emailtaskscript.js | 240 + .../resources/fieldvalidator.js | 88 + .../resources/functional.js | 162 + .../resources/ico-workflow.png | Bin 0 -> 1266 bytes .../resources/jquery-1.2.6.js | 3549 +++ .../resources/jquery.timepicker.js | 119 + .../com_vtiger_workflow/resources/json2.js | 263 + .../resources/parallelexecuter.js | 18 + .../com_vtiger_workflow/resources/remove.png | Bin 0 -> 198 bytes .../com_vtiger_workflow/resources/style.css | 73 + .../resources/vtigerwebservices.js | 156 + .../resources/workflowlistscript.js | 131 + .../com_vtiger_workflow/runtaskjob.php | 58 + .../modules/com_vtiger_workflow/savetask.php | 71 + .../com_vtiger_workflow/savetemplate.php | 46 + .../com_vtiger_workflow/saveworkflow.php | 68 + .../com_vtiger_workflow/sortfieldsjson.php | 17 + .../modules/com_vtiger_workflow/tasklist.php | 51 + .../tasks/VTCreateEntityTask.inc | 18 + .../tasks/VTCreateEventTask.inc | 116 + .../tasks/VTCreateTodoTask.inc | 99 + .../com_vtiger_workflow/tasks/VTDummyTask.inc | 19 + .../com_vtiger_workflow/tasks/VTEmailTask.inc | 46 + .../tasks/VTEntityMethodTask.inc | 22 + .../templatesformodulejson.php | 23 + .../com_vtiger_workflow/workflowlist.php | 74 + .../language/zh_cn.lang.php | 49 + oss/vtiger/trunk/modules/uploads/add2db.php | 149 + .../modules/uploads/deleteattachments.php | 23 + .../trunk/modules/uploads/downloadfile.php | 57 + .../modules/uploads/language/en_us.lang.php | 35 + .../modules/uploads/language/zh_cn.lang.php | 35 + oss/vtiger/trunk/modules/uploads/upload.php | 139 + .../trunk/modules/uploads/uploadsAjax.php | 14 + .../vtmessages/language/zh_cn.lang.php | 53 + 1830 files changed, 196588 insertions(+) create mode 100644 oss/vtiger/trunk/modules/Accounts/AccountHierarchy.php create mode 100644 oss/vtiger/trunk/modules/Accounts/Accounts.js create mode 100644 oss/vtiger/trunk/modules/Accounts/Accounts.php create mode 100644 oss/vtiger/trunk/modules/Accounts/AccountsAjax.php create mode 100644 oss/vtiger/trunk/modules/Accounts/AddressChange.php create mode 100644 oss/vtiger/trunk/modules/Accounts/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Accounts/CustomAction.php create mode 100644 oss/vtiger/trunk/modules/Accounts/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Accounts/Delete.php create mode 100644 oss/vtiger/trunk/modules/Accounts/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Accounts/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Accounts/EditView.php create mode 100644 oss/vtiger/trunk/modules/Accounts/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/Accounts/FindDuplicateRecords.php create mode 100644 oss/vtiger/trunk/modules/Accounts/Import.php create mode 100644 oss/vtiger/trunk/modules/Accounts/ListView.php create mode 100644 oss/vtiger/trunk/modules/Accounts/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Accounts/ListViewTop.php create mode 100644 oss/vtiger/trunk/modules/Accounts/MailerExport.php create mode 100644 oss/vtiger/trunk/modules/Accounts/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Accounts/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Accounts/Merge.php create mode 100644 oss/vtiger/trunk/modules/Accounts/Popup.php create mode 100644 oss/vtiger/trunk/modules/Accounts/ProcessDuplicates.php create mode 100644 oss/vtiger/trunk/modules/Accounts/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Accounts/Save.php create mode 100644 oss/vtiger/trunk/modules/Accounts/Settings.php create mode 100644 oss/vtiger/trunk/modules/Accounts/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Accounts/Tickerdetail.php create mode 100644 oss/vtiger/trunk/modules/Accounts/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Accounts/index.php create mode 100644 oss/vtiger/trunk/modules/Accounts/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Accounts/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Accounts/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Activities/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Administration/Forms.php create mode 100644 oss/vtiger/trunk/modules/Administration/index.php create mode 100644 oss/vtiger/trunk/modules/Administration/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Administration/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Calendar/Activity.php create mode 100644 oss/vtiger/trunk/modules/Calendar/ActivityAjax.php create mode 100644 oss/vtiger/trunk/modules/Calendar/ActivityReminderCallbackAjax.php create mode 100644 oss/vtiger/trunk/modules/Calendar/ActivityReminderSetupCallbackAjax.php create mode 100644 oss/vtiger/trunk/modules/Calendar/Appointment.php create mode 100644 oss/vtiger/trunk/modules/Calendar/Calendar.js create mode 100644 oss/vtiger/trunk/modules/Calendar/Calendar.php create mode 100644 oss/vtiger/trunk/modules/Calendar/CalendarAjax.php create mode 100644 oss/vtiger/trunk/modules/Calendar/CalendarCommon.php create mode 100644 oss/vtiger/trunk/modules/Calendar/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Calendar/Date.php create mode 100644 oss/vtiger/trunk/modules/Calendar/Delete.php create mode 100644 oss/vtiger/trunk/modules/Calendar/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Calendar/EditView.php create mode 100644 oss/vtiger/trunk/modules/Calendar/ListView.php create mode 100644 oss/vtiger/trunk/modules/Calendar/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Calendar/OpenListView.php create mode 100644 oss/vtiger/trunk/modules/Calendar/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Calendar/RenderRelatedListUI.php create mode 100644 oss/vtiger/trunk/modules/Calendar/RepeatEvents.php create mode 100644 oss/vtiger/trunk/modules/Calendar/Save.php create mode 100644 oss/vtiger/trunk/modules/Calendar/SendReminder.bat create mode 100644 oss/vtiger/trunk/modules/Calendar/Settings.php create mode 100644 oss/vtiger/trunk/modules/Calendar/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Calendar/TodoSave.php create mode 100644 oss/vtiger/trunk/modules/Calendar/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Calendar/addEventUI.php create mode 100644 oss/vtiger/trunk/modules/Calendar/calendarLayout.php create mode 100644 oss/vtiger/trunk/modules/Calendar/calendar_share.php create mode 100644 oss/vtiger/trunk/modules/Calendar/disable_sharing.php create mode 100644 oss/vtiger/trunk/modules/Calendar/header.php create mode 100644 oss/vtiger/trunk/modules/Calendar/index.php create mode 100644 oss/vtiger/trunk/modules/Calendar/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Calendar/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Calendar/new_calendar.php create mode 100644 oss/vtiger/trunk/modules/Calendar/script.js create mode 100644 oss/vtiger/trunk/modules/Calendar/updateCalendarSharing.php create mode 100644 oss/vtiger/trunk/modules/Calendar/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Calls/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/Campaigns.js create mode 100644 oss/vtiger/trunk/modules/Campaigns/Campaigns.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/CampaignsAjax.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/Delete.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/EditView.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/ListView.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/LoadList.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/Popup.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/Save.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/Settings.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/index.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Campaigns/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Cases/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Contacts/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Contacts/Contacts.js create mode 100644 oss/vtiger/trunk/modules/Contacts/Contacts.php create mode 100644 oss/vtiger/trunk/modules/Contacts/ContactsAjax.php create mode 100644 oss/vtiger/trunk/modules/Contacts/CustomAction.php create mode 100644 oss/vtiger/trunk/modules/Contacts/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Contacts/DelImage.php create mode 100644 oss/vtiger/trunk/modules/Contacts/Delete.php create mode 100644 oss/vtiger/trunk/modules/Contacts/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Contacts/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Contacts/EditView.php create mode 100644 oss/vtiger/trunk/modules/Contacts/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/Contacts/FindDuplicateRecords.php create mode 100644 oss/vtiger/trunk/modules/Contacts/Import.php create mode 100644 oss/vtiger/trunk/modules/Contacts/ListView.php create mode 100644 oss/vtiger/trunk/modules/Contacts/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Contacts/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Contacts/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Contacts/Merge.php create mode 100644 oss/vtiger/trunk/modules/Contacts/Popup.php create mode 100644 oss/vtiger/trunk/modules/Contacts/ProcessDuplicates.php create mode 100644 oss/vtiger/trunk/modules/Contacts/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Contacts/Save.php create mode 100644 oss/vtiger/trunk/modules/Contacts/Settings.php create mode 100644 oss/vtiger/trunk/modules/Contacts/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Contacts/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Contacts/contactSeedData.php create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/2tbarPrivateChat.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/2tbarPublicChat.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/box_BL.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/box_BR.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/box_M.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/box_ML.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/box_MR.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/box_T.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/box_TL.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/box_TR.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/btn_close.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/btn_hide.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/btn_send.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/bx_B.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/close.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/hide.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/icone_chat.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/icone_keyb.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/site_bg.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/imgs/user_icon.gif create mode 100644 oss/vtiger/trunk/modules/Contacts/index.php create mode 100644 oss/vtiger/trunk/modules/Contacts/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Contacts/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Contacts/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/CustomView/ChangeStatus.php create mode 100644 oss/vtiger/trunk/modules/CustomView/CustomView.js create mode 100644 oss/vtiger/trunk/modules/CustomView/CustomView.php create mode 100644 oss/vtiger/trunk/modules/CustomView/CustomViewAjax.php create mode 100644 oss/vtiger/trunk/modules/CustomView/Delete.php create mode 100644 oss/vtiger/trunk/modules/CustomView/EditView.php create mode 100644 oss/vtiger/trunk/modules/CustomView/Forms.php create mode 100644 oss/vtiger/trunk/modules/CustomView/ListViewTop.php create mode 100644 oss/vtiger/trunk/modules/CustomView/PopulateCustomView.php create mode 100644 oss/vtiger/trunk/modules/CustomView/Save.php create mode 100644 oss/vtiger/trunk/modules/CustomView/SaveAction.php create mode 100644 oss/vtiger/trunk/modules/CustomView/SendMailAction.php create mode 100644 oss/vtiger/trunk/modules/CustomView/index.php create mode 100644 oss/vtiger/trunk/modules/CustomView/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/CustomView/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/AdvancedSettings.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/CustomerPortal.js create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/CustomerPortal.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/CustomerPortalAjax.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/CustomerPortalHandler.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/ListView.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/PortalUtils.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/index.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/CustomerPortal/schema.xml create mode 100644 oss/vtiger/trunk/modules/Dashboard/Chart_lead_source_by_outcome.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/Chart_my_pipeline_by_sales_stage.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/Chart_outcome_by_month.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/Chart_pipeline_by_lead_source.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/Chart_pipeline_by_sales_stage.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/DashboardAjax.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/DashboardHome.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/DashboardHome_matrix.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/Entity_charts.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/Forms.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/HomepageDB.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/ReportsCharts.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/accumulated_bargraph.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/display_charts.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/homestuff.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/horizontal_bargraph.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/index.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/line_graph.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/loadDashBoard.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/pie_graph.php create mode 100644 oss/vtiger/trunk/modules/Dashboard/vertical_bargraph.php create mode 100644 oss/vtiger/trunk/modules/Documents/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Documents/Delete.php create mode 100644 oss/vtiger/trunk/modules/Documents/DeleteFolder.php create mode 100644 oss/vtiger/trunk/modules/Documents/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Documents/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Documents/Documents.js create mode 100644 oss/vtiger/trunk/modules/Documents/Documents.php create mode 100644 oss/vtiger/trunk/modules/Documents/DocumentsAjax.php create mode 100644 oss/vtiger/trunk/modules/Documents/DownloadFile.php create mode 100644 oss/vtiger/trunk/modules/Documents/EditView.php create mode 100644 oss/vtiger/trunk/modules/Documents/EmailFile.php create mode 100644 oss/vtiger/trunk/modules/Documents/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/Documents/ListView.php create mode 100644 oss/vtiger/trunk/modules/Documents/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Documents/MoveFile.php create mode 100644 oss/vtiger/trunk/modules/Documents/Popup.php create mode 100644 oss/vtiger/trunk/modules/Documents/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Documents/Save.php create mode 100644 oss/vtiger/trunk/modules/Documents/SaveFile.php create mode 100644 oss/vtiger/trunk/modules/Documents/SaveFolder.php create mode 100644 oss/vtiger/trunk/modules/Documents/Settings.php create mode 100644 oss/vtiger/trunk/modules/Documents/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Documents/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Documents/index.php create mode 100644 oss/vtiger/trunk/modules/Documents/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Documents/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Emails/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Emails/Choose.php create mode 100644 oss/vtiger/trunk/modules/Emails/ChooseEmail.php create mode 100644 oss/vtiger/trunk/modules/Emails/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Emails/Delete.php create mode 100644 oss/vtiger/trunk/modules/Emails/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Emails/EditView.php create mode 100644 oss/vtiger/trunk/modules/Emails/Emails.js create mode 100644 oss/vtiger/trunk/modules/Emails/Emails.php create mode 100644 oss/vtiger/trunk/modules/Emails/EmailsAjax.php create mode 100644 oss/vtiger/trunk/modules/Emails/GmailBookmarklet.js create mode 100644 oss/vtiger/trunk/modules/Emails/GmailBookmarkletTrigger.js create mode 100644 oss/vtiger/trunk/modules/Emails/ListView.php create mode 100644 oss/vtiger/trunk/modules/Emails/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Emails/PHPMailer_LICENSE.txt create mode 100644 oss/vtiger/trunk/modules/Emails/PrintEmail.php create mode 100644 oss/vtiger/trunk/modules/Emails/Save.php create mode 100644 oss/vtiger/trunk/modules/Emails/SaveBookmarklet.php create mode 100644 oss/vtiger/trunk/modules/Emails/TrackAccess.php create mode 100644 oss/vtiger/trunk/modules/Emails/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Emails/class.phpmailer.php create mode 100644 oss/vtiger/trunk/modules/Emails/class.smtp.php create mode 100644 oss/vtiger/trunk/modules/Emails/gotodownload.php create mode 100644 oss/vtiger/trunk/modules/Emails/index.php create mode 100644 oss/vtiger/trunk/modules/Emails/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Emails/language/phpmailer.lang-en_us.php create mode 100644 oss/vtiger/trunk/modules/Emails/language/phpmailer.lang-zh_cn.php create mode 100644 oss/vtiger/trunk/modules/Emails/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Emails/mail.php create mode 100644 oss/vtiger/trunk/modules/Emails/mailSelect.php create mode 100644 oss/vtiger/trunk/modules/Emails/mailsend.php create mode 100644 oss/vtiger/trunk/modules/Emails/templates/testemailtemplateusage.php create mode 100644 oss/vtiger/trunk/modules/Emails/templates/todel.txt create mode 100644 oss/vtiger/trunk/modules/Emails/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Emails/webmailsend.php create mode 100644 oss/vtiger/trunk/modules/Faq/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Faq/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Faq/Delete.php create mode 100644 oss/vtiger/trunk/modules/Faq/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Faq/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Faq/EditView.php create mode 100644 oss/vtiger/trunk/modules/Faq/Faq.js create mode 100644 oss/vtiger/trunk/modules/Faq/Faq.php create mode 100644 oss/vtiger/trunk/modules/Faq/FaqAjax.php create mode 100644 oss/vtiger/trunk/modules/Faq/ListFaq.php create mode 100644 oss/vtiger/trunk/modules/Faq/ListView.php create mode 100644 oss/vtiger/trunk/modules/Faq/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Faq/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Faq/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Faq/Save.php create mode 100644 oss/vtiger/trunk/modules/Faq/Settings.php create mode 100644 oss/vtiger/trunk/modules/Faq/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Faq/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Faq/index.php create mode 100644 oss/vtiger/trunk/modules/Faq/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Faq/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Faq/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/FieldFormulas.js create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/FieldFormulas.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/FieldFormulasAjax.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/VTFieldFormulasEventHandler.inc create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/VTModuleExpressionsManager.inc create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/deleteexpressionjson.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/editexpressions.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTExpressionEngine.inc create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTExpressionEvaluater.inc create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTParser.inc create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTTokenizer.inc create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/expression_engine/include.inc create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/getexpressionlistjson.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/getfieldsjson.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/getfunctionsjson.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/include.inc create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/index.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/resources/FieldFormulas.png create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/resources/editexpressionscript.js create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/resources/functional.js create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/resources/jquery-1.2.6.js create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/resources/json2.js create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/resources/style.css create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/resources/vtigerwebservices.js create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/saveexpressionjson.php create mode 100644 oss/vtiger/trunk/modules/FieldFormulas/schema.xml create mode 100644 oss/vtiger/trunk/modules/Help/Forms.php create mode 100644 oss/vtiger/trunk/modules/Help/index.php create mode 100644 oss/vtiger/trunk/modules/Help/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Help/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/ConvertAsFAQ.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/ConvertToEntities.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/CustomView.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/Delete.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/DetailView.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/EditView.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/FindDuplicateRecords.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/HelpDesk.js create mode 100644 oss/vtiger/trunk/modules/HelpDesk/HelpDesk.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/HelpDeskAjax.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/Import.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/ListTickets.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/ListView.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/Merge.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/Popup.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/ProcessDuplicates.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/Save.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/Settings.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/index.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/HelpDesk/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Home/HomeAjax.php create mode 100644 oss/vtiger/trunk/modules/Home/HomeBlock.php create mode 100644 oss/vtiger/trunk/modules/Home/HomeNews.php create mode 100644 oss/vtiger/trunk/modules/Home/HomeUtils.php create mode 100644 oss/vtiger/trunk/modules/Home/Homestuff.js create mode 100644 oss/vtiger/trunk/modules/Home/Homestuff.php create mode 100644 oss/vtiger/trunk/modules/Home/HomestuffAjax.php create mode 100644 oss/vtiger/trunk/modules/Home/LastViewed.php create mode 100644 oss/vtiger/trunk/modules/Home/MainHomeBlock.php create mode 100644 oss/vtiger/trunk/modules/Home/NewBlock.php create mode 100644 oss/vtiger/trunk/modules/Home/SaveNotebookContents.php create mode 100644 oss/vtiger/trunk/modules/Home/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Home/UnifiedSearchModules.php create mode 100644 oss/vtiger/trunk/modules/Home/chat.css create mode 100644 oss/vtiger/trunk/modules/Home/chat.php create mode 100644 oss/vtiger/trunk/modules/Home/home_rss.php create mode 100644 oss/vtiger/trunk/modules/Home/index.php create mode 100644 oss/vtiger/trunk/modules/Home/js/ajax.js create mode 100644 oss/vtiger/trunk/modules/Home/js/chat.js create mode 100644 oss/vtiger/trunk/modules/Home/js/css-window_p.js create mode 100644 oss/vtiger/trunk/modules/Home/js/dom-drag_p.js create mode 100644 oss/vtiger/trunk/modules/Home/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Home/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Home/vtchat.html create mode 100644 oss/vtiger/trunk/modules/Home/vtchat.php create mode 100644 oss/vtiger/trunk/modules/Import/Forms.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportAccount.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportAjax.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportButton.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportContact.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportLead.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportMap.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportOpportunity.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportProduct.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportSave.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportStep1.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportStep2.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportStep3.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportSteplast.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportStepundo.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportTicket.php create mode 100644 oss/vtiger/trunk/modules/Import/ImportVendors.php create mode 100644 oss/vtiger/trunk/modules/Import/UsersLastImport.php create mode 100644 oss/vtiger/trunk/modules/Import/error.php create mode 100644 oss/vtiger/trunk/modules/Import/index.php create mode 100644 oss/vtiger/trunk/modules/Import/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Import/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Import/lastImport.php create mode 100644 oss/vtiger/trunk/modules/Import/parse_utils.php create mode 100644 oss/vtiger/trunk/modules/Import/picklist_addition.php create mode 100644 oss/vtiger/trunk/modules/Invoice/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Invoice/CreatePDF.php create mode 100644 oss/vtiger/trunk/modules/Invoice/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Invoice/Delete.php create mode 100644 oss/vtiger/trunk/modules/Invoice/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Invoice/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Invoice/EditView.php create mode 100644 oss/vtiger/trunk/modules/Invoice/Invoice.js create mode 100644 oss/vtiger/trunk/modules/Invoice/Invoice.php create mode 100644 oss/vtiger/trunk/modules/Invoice/InvoiceAjax.php create mode 100644 oss/vtiger/trunk/modules/Invoice/ListTopInvoice.php create mode 100644 oss/vtiger/trunk/modules/Invoice/ListView.php create mode 100644 oss/vtiger/trunk/modules/Invoice/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Invoice/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Invoice/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Invoice/Popup.php create mode 100644 oss/vtiger/trunk/modules/Invoice/Save.php create mode 100644 oss/vtiger/trunk/modules/Invoice/SendPDFMail.php create mode 100644 oss/vtiger/trunk/modules/Invoice/Settings.php create mode 100644 oss/vtiger/trunk/modules/Invoice/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Invoice/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Invoice/index.php create mode 100644 oss/vtiger/trunk/modules/Invoice/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Invoice/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Invoice/pdf_templates/footer.php create mode 100644 oss/vtiger/trunk/modules/Invoice/pdf_templates/header.php create mode 100644 oss/vtiger/trunk/modules/Invoice/pdf_templates/lastpage/body.php create mode 100644 oss/vtiger/trunk/modules/Invoice/pdf_templates/lastpage/footer.php create mode 100644 oss/vtiger/trunk/modules/Invoice/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Leads/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Leads/ConvertLead.php create mode 100644 oss/vtiger/trunk/modules/Leads/CustomAction.php create mode 100644 oss/vtiger/trunk/modules/Leads/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Leads/Delete.php create mode 100644 oss/vtiger/trunk/modules/Leads/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Leads/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Leads/EditView.php create mode 100644 oss/vtiger/trunk/modules/Leads/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/Leads/FindDuplicateRecords.php create mode 100644 oss/vtiger/trunk/modules/Leads/Import.php create mode 100644 oss/vtiger/trunk/modules/Leads/LeadConvertToEntities.php create mode 100644 oss/vtiger/trunk/modules/Leads/Leads.js create mode 100644 oss/vtiger/trunk/modules/Leads/Leads.php create mode 100644 oss/vtiger/trunk/modules/Leads/LeadsAjax.php create mode 100644 oss/vtiger/trunk/modules/Leads/ListView.php create mode 100644 oss/vtiger/trunk/modules/Leads/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Leads/ListViewTop.php create mode 100644 oss/vtiger/trunk/modules/Leads/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Leads/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Leads/Merge.php create mode 100644 oss/vtiger/trunk/modules/Leads/Popup.php create mode 100644 oss/vtiger/trunk/modules/Leads/ProcessDuplicates.php create mode 100644 oss/vtiger/trunk/modules/Leads/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Leads/Save.php create mode 100644 oss/vtiger/trunk/modules/Leads/Settings.php create mode 100644 oss/vtiger/trunk/modules/Leads/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Leads/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Leads/index.php create mode 100644 oss/vtiger/trunk/modules/Leads/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Leads/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Leads/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Meetings/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/MessageBoard/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Migration/DBChanges/42P2_to_50.php create mode 100644 oss/vtiger/trunk/modules/Migration/DBChanges/501_to_502.php create mode 100644 oss/vtiger/trunk/modules/Migration/DBChanges/502_to_503rc2.php create mode 100644 oss/vtiger/trunk/modules/Migration/DBChanges/503_to_504rc.php create mode 100644 oss/vtiger/trunk/modules/Migration/DBChanges/503rc2_to_503.php create mode 100644 oss/vtiger/trunk/modules/Migration/DBChanges/504_to_510rc.php create mode 100644 oss/vtiger/trunk/modules/Migration/DBChanges/504rc_to_504.php create mode 100644 oss/vtiger/trunk/modules/Migration/DBChanges/510rc_to_510.php create mode 100644 oss/vtiger/trunk/modules/Migration/HTMLtoUTF8Conversion.php create mode 100644 oss/vtiger/trunk/modules/Migration/Migration.php create mode 100644 oss/vtiger/trunk/modules/Migration/MigrationCheck.php create mode 100644 oss/vtiger/trunk/modules/Migration/MigrationInfo.php create mode 100644 oss/vtiger/trunk/modules/Migration/MigrationStep0.php create mode 100644 oss/vtiger/trunk/modules/Migration/MigrationStep1.php create mode 100644 oss/vtiger/trunk/modules/Migration/PatchApply.php create mode 100644 oss/vtiger/trunk/modules/Migration/deleteCustomFields.php create mode 100644 oss/vtiger/trunk/modules/Migration/index.php create mode 100644 oss/vtiger/trunk/modules/Migration/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Migration/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Migration/rename_tables.php create mode 100644 oss/vtiger/trunk/modules/Migration/updateCurrency.php create mode 100644 oss/vtiger/trunk/modules/Migration/versions.php create mode 100644 oss/vtiger/trunk/modules/Mobile/Mobile-README create mode 100644 oss/vtiger/trunk/modules/Mobile/Mobile.Config.php create mode 100644 oss/vtiger/trunk/modules/Mobile/Mobile.js create mode 100644 oss/vtiger/trunk/modules/Mobile/Mobile.php create mode 100644 oss/vtiger/trunk/modules/Mobile/MobileAjax.php create mode 100644 oss/vtiger/trunk/modules/Mobile/MobileHandler.php create mode 100644 oss/vtiger/trunk/modules/Mobile/controllers/Detail.php create mode 100644 oss/vtiger/trunk/modules/Mobile/controllers/Home.php create mode 100644 oss/vtiger/trunk/modules/Mobile/controllers/List.php create mode 100644 oss/vtiger/trunk/modules/Mobile/controllers/Login.php create mode 100644 oss/vtiger/trunk/modules/Mobile/controllers/Logout.php create mode 100644 oss/vtiger/trunk/modules/Mobile/controllers/Search.php create mode 100644 oss/vtiger/trunk/modules/Mobile/controllers/SearchConfig.php create mode 100644 oss/vtiger/trunk/modules/Mobile/controllers/Settings.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/Block.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/Cache.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/Field.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/MobileService.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/Module.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/Paging.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/Record.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/Search.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/Session.php create mode 100644 oss/vtiger/trunk/modules/Mobile/core/Skin.php create mode 100644 oss/vtiger/trunk/modules/Mobile/index.php create mode 100644 oss/vtiger/trunk/modules/Mobile/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/appicon.jpg create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/add_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/add_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/add_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/address_book_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/address_book_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/address_book_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/alert_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/alert_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/alert_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/briefcase_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/briefcase_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/briefcase_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/buildings_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/buildings_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/buildings_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/calculator_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/calculator_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/calculator_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/camera_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/camera_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/camera_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cancel_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cancel_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cancel_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cd_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cd_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cd_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/comment_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/comment_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/comment_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/delete_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/delete_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/delete_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/door_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/door_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/door_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/down_arrow_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/down_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/down_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/download_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/download_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/download_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/downloads_folder_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/downloads_folder_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/downloads_folder_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/edit_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/edit_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/edit_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/error_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/error_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/error_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/expand_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/expand_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/expand_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/file_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/file_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/file_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/film_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/film_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/film_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/flag_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/flag_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/flag_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/folder_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/folder_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/folder_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/gear_wheel_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/gear_wheel_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/gear_wheel_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/globe_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/globe_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/globe_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/hard_disk_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/hard_disk_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/hard_disk_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/heart_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/heart_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/heart_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/help_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/help_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/help_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/house_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/house_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/house_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/info_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/info_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/info_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/iphone_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/iphone_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/iphone_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/left_arrow_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/left_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/left_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lens_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lens_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lens_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/line_graph_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/line_graph_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/line_graph_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lock_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lock_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lock_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/logout_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/logout_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/logout_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/magic_wand_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/magic_wand_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/magic_wand_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/mail_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/mail_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/mail_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/monitor_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/monitor_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/monitor_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/move_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/move_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/move_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/music_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/music_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/music_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/network_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/network_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/network_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/no_sound_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/no_sound_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/no_sound_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/picture_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/picture_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/picture_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/print_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/print_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/print_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/push_pin_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/push_pin_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/push_pin_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/redo_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/redo_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/redo_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/remove_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/remove_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/remove_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/right_arrow_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/right_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/right_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_add_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_add_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_add_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_remove_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_remove_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_remove_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/rss_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/rss_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/rss_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/save_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/save_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/save_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/scissors_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/scissors_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/scissors_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/script_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/script_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/script_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/shield_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/shield_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/shield_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/sound_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/sound_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/sound_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/star_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/star_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/star_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/stop_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/stop_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/stop_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tag_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tag_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tag_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/toolbox_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/toolbox_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/toolbox_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trackback_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trackback_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trackback_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trash_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trash_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trash_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tune_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tune_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tune_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/undo_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/undo_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/undo_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/unlock_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/unlock_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/unlock_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/up_arrow_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/up_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/up_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/user_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/user_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/user_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/warning_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/warning_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/warning_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/wrench_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/wrench_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/wrench_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_in_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_in_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_in_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_out_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_out_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_out_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/add_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/add_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/add_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/address_book_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/address_book_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/address_book_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/alert_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/alert_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/alert_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/briefcase_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/briefcase_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/briefcase_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/buildings_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/buildings_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/buildings_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/calculator_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/calculator_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/calculator_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/camera_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/camera_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/camera_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cancel_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cancel_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cancel_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cd_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cd_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cd_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/comment_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/comment_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/comment_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/delete_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/delete_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/delete_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/door_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/door_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/door_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/down_arrow_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/down_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/down_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/download_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/download_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/download_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/downloads_folder_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/downloads_folder_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/downloads_folder_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/edit_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/edit_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/edit_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/error_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/error_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/error_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/expand_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/expand_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/expand_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/file_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/file_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/file_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/film_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/film_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/film_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/flag_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/flag_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/flag_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/folder_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/folder_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/folder_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/gear_wheel_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/gear_wheel_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/gear_wheel_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/globe_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/globe_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/globe_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/hard_disk_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/hard_disk_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/hard_disk_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/heart_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/heart_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/heart_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/help_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/help_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/help_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/house_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/house_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/house_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/info_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/info_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/info_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/iphone_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/iphone_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/iphone_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/left_arrow_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/left_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/left_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lens_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lens_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lens_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/line_graph_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/line_graph_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/line_graph_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lock_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lock_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lock_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/magic_wand_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/magic_wand_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/magic_wand_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/mail_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/mail_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/mail_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/monitor_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/monitor_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/monitor_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/move_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/move_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/move_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/music_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/music_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/music_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/network_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/network_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/network_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/no_sound_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/no_sound_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/no_sound_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/picture_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/picture_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/picture_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/print_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/print_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/print_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/push_pin_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/push_pin_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/push_pin_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/redo_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/redo_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/redo_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/remove_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/remove_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/remove_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/right_arrow_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/right_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/right_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_add_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_add_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_add_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_remove_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_remove_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_remove_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/rss_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/rss_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/rss_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/save_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/save_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/save_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/scissors_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/scissors_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/scissors_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/script_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/script_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/script_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/shield_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/shield_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/shield_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/sound_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/sound_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/sound_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/star_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/star_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/star_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/stop_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/stop_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/stop_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tag_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tag_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tag_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/toolbox_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/toolbox_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/toolbox_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/trackback_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/trackback_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/trackback_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/trash_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/trash_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/trash_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tune_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tune_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tune_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/undo_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/undo_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/undo_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/unlock_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/unlock_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/unlock_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/up_arrow_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/up_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/up_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/user_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/user_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/user_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/warning_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/warning_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/warning_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/wrench_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/wrench_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/wrench_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_in_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_in_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_in_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_out_16x16.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_out_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_out_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/add_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/add_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/address_book_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/address_book_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/alert_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/alert_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/briefcase_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/briefcase_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/buildings_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/buildings_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/calculator_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/calculator_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/camera_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/camera_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/cancel_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/cancel_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/cd_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/cd_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/comment_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/comment_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/delete_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/delete_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/door_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/door_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/down_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/down_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/download_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/download_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/downloads_folder_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/downloads_folder_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/edit_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/edit_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/error_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/error_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/expand_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/expand_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/file_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/file_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/film_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/film_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/flag_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/flag_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/folder_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/folder_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/gear_wheel_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/gear_wheel_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/globe_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/globe_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/hard_disk_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/hard_disk_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/heart_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/heart_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/help_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/help_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/house_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/house_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/info_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/info_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/iphone_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/iphone_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/left_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/left_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/lens_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/lens_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/line_graph_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/line_graph_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/lock_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/lock_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/logout_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/logout_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/magic_wand_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/magic_wand_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/mail_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/mail_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/monitor_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/monitor_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/move_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/move_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/music_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/music_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/network_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/network_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/no_sound_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/no_sound_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/picture_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/picture_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/print_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/print_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/push_pin_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/push_pin_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/redo_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/redo_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/remove_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/remove_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/right_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/right_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_add_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_add_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_remove_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_remove_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/rss_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/rss_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/save_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/save_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/scissors_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/scissors_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/script_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/script_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/shield_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/shield_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/sound_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/sound_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/star_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/star_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/stop_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/stop_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tag_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tag_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/toolbox_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/toolbox_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trackback_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trackback_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trash_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trash_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tune_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tune_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/undo_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/undo_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/unlock_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/unlock_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/up_arrow_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/up_arrow_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/user_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/user_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/warning_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/warning_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/wrench_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/wrench_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_in_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_in_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_out_24x24.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_out_32x32.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/backButton.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/blueButton.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/blue_hd_bg.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/cancel.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/grayButton.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/iui-logo-touch-icon.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/iui.css create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/iui.js create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/iui.original.css create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/iui.original.js create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/iuix.css create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/iuix.js create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/listArrow.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/listArrowSel.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/listGroup.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/loading.gif create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/pinstripes.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/selection.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/thumb.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/toggle.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/toggleOn.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/toolButton.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/toolbar.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/iui/whiteButton.png create mode 100644 oss/vtiger/trunk/modules/Mobile/resources/skins/default.css create mode 100644 oss/vtiger/trunk/modules/Notes/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Orders/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/PickList/AssignValues.php create mode 100644 oss/vtiger/trunk/modules/PickList/PickList.php create mode 100644 oss/vtiger/trunk/modules/PickList/PickListAction.php create mode 100644 oss/vtiger/trunk/modules/PickList/PickListAjax.php create mode 100644 oss/vtiger/trunk/modules/PickList/PickListUtils.php create mode 100644 oss/vtiger/trunk/modules/PickList/SaveAssignedValues.php create mode 100644 oss/vtiger/trunk/modules/PickList/ShowActionDivs.php create mode 100644 oss/vtiger/trunk/modules/PickList/ShowRoleSelect.php create mode 100644 oss/vtiger/trunk/modules/PickList/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/PickList/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Portal/Delete.php create mode 100644 oss/vtiger/trunk/modules/Portal/ListView.php create mode 100644 oss/vtiger/trunk/modules/Portal/Popup.php create mode 100644 oss/vtiger/trunk/modules/Portal/Portal.js create mode 100644 oss/vtiger/trunk/modules/Portal/Portal.php create mode 100644 oss/vtiger/trunk/modules/Portal/PortalAjax.php create mode 100644 oss/vtiger/trunk/modules/Portal/Save.php create mode 100644 oss/vtiger/trunk/modules/Portal/index.php create mode 100644 oss/vtiger/trunk/modules/Portal/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Portal/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Potentials/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Potentials/Charts.php create mode 100644 oss/vtiger/trunk/modules/Potentials/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Potentials/Delete.php create mode 100644 oss/vtiger/trunk/modules/Potentials/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Potentials/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Potentials/EditView.php create mode 100644 oss/vtiger/trunk/modules/Potentials/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/Potentials/FindDuplicateRecords.php create mode 100644 oss/vtiger/trunk/modules/Potentials/Import.php create mode 100644 oss/vtiger/trunk/modules/Potentials/ListView.php create mode 100644 oss/vtiger/trunk/modules/Potentials/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Potentials/ListViewTop.php create mode 100644 oss/vtiger/trunk/modules/Potentials/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Potentials/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Potentials/Popup.php create mode 100644 oss/vtiger/trunk/modules/Potentials/Potentials.js create mode 100644 oss/vtiger/trunk/modules/Potentials/Potentials.php create mode 100644 oss/vtiger/trunk/modules/Potentials/PotentialsAjax.php create mode 100644 oss/vtiger/trunk/modules/Potentials/ProcessDuplicates.php create mode 100644 oss/vtiger/trunk/modules/Potentials/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Potentials/Save.php create mode 100644 oss/vtiger/trunk/modules/Potentials/Settings.php create mode 100644 oss/vtiger/trunk/modules/Potentials/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Potentials/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Potentials/index.php create mode 100644 oss/vtiger/trunk/modules/Potentials/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Potentials/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Potentials/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/CustomView.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/Delete.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/DetailView.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/EditView.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/ListView.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/Popup.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/PriceBooks.js create mode 100644 oss/vtiger/trunk/modules/PriceBooks/PriceBooks.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/PriceBooksAjax.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/Save.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/Settings.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/index.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/PriceBooks/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Products/AddProductToPriceBooks.html create mode 100644 oss/vtiger/trunk/modules/Products/AddProductToPriceBooks.php create mode 100644 oss/vtiger/trunk/modules/Products/AddProductsToPriceBook.html create mode 100644 oss/vtiger/trunk/modules/Products/AddProductsToPriceBook.php create mode 100644 oss/vtiger/trunk/modules/Products/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Products/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Products/Delete.php create mode 100644 oss/vtiger/trunk/modules/Products/DeletePriceBookProductRel.php create mode 100644 oss/vtiger/trunk/modules/Products/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Products/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Products/EditListPrice.php create mode 100644 oss/vtiger/trunk/modules/Products/EditView.php create mode 100644 oss/vtiger/trunk/modules/Products/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/Products/FindDuplicateRecords.php create mode 100644 oss/vtiger/trunk/modules/Products/Import.php create mode 100644 oss/vtiger/trunk/modules/Products/InventoryPriceAjax.php create mode 100644 oss/vtiger/trunk/modules/Products/InventoryTaxAjax.php create mode 100644 oss/vtiger/trunk/modules/Products/ListView.php create mode 100644 oss/vtiger/trunk/modules/Products/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Products/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Products/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Products/Popup.php create mode 100644 oss/vtiger/trunk/modules/Products/ProcessDuplicates.php create mode 100644 oss/vtiger/trunk/modules/Products/Products.js create mode 100644 oss/vtiger/trunk/modules/Products/Products.php create mode 100644 oss/vtiger/trunk/modules/Products/ProductsAjax.php create mode 100644 oss/vtiger/trunk/modules/Products/Productsslide.js create mode 100644 oss/vtiger/trunk/modules/Products/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Products/Save.php create mode 100644 oss/vtiger/trunk/modules/Products/Settings.php create mode 100644 oss/vtiger/trunk/modules/Products/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Products/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Products/UpdateListPrice.php create mode 100644 oss/vtiger/trunk/modules/Products/addPbProductRelToDB.php create mode 100644 oss/vtiger/trunk/modules/Products/index.php create mode 100644 oss/vtiger/trunk/modules/Products/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Products/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Products/multifile.js create mode 100644 oss/vtiger/trunk/modules/Products/placeholder.gif create mode 100644 oss/vtiger/trunk/modules/Products/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/CreatePDF.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/CustomView.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/Delete.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/DetailView.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/EditView.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/ListTopPurchaseOrder.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/ListView.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/Popup.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/PurchaseOrder.js create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/PurchaseOrder.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/PurchaseOrderAjax.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/Save.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/SendPDFMail.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/Settings.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/index.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/footer.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/header.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/lastpage/body.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/lastpage/footer.php create mode 100644 oss/vtiger/trunk/modules/PurchaseOrder/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Quotes/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Quotes/CreatePDF.php create mode 100644 oss/vtiger/trunk/modules/Quotes/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Quotes/Delete.php create mode 100644 oss/vtiger/trunk/modules/Quotes/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Quotes/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Quotes/EditView.php create mode 100644 oss/vtiger/trunk/modules/Quotes/ListTopQuotes.php create mode 100644 oss/vtiger/trunk/modules/Quotes/ListView.php create mode 100644 oss/vtiger/trunk/modules/Quotes/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Quotes/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Quotes/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Quotes/Popup.php create mode 100644 oss/vtiger/trunk/modules/Quotes/Quotes.js create mode 100644 oss/vtiger/trunk/modules/Quotes/Quotes.php create mode 100644 oss/vtiger/trunk/modules/Quotes/QuotesAjax.php create mode 100644 oss/vtiger/trunk/modules/Quotes/Save.php create mode 100644 oss/vtiger/trunk/modules/Quotes/SendPDFMail.php create mode 100644 oss/vtiger/trunk/modules/Quotes/Settings.php create mode 100644 oss/vtiger/trunk/modules/Quotes/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Quotes/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Quotes/index.php create mode 100644 oss/vtiger/trunk/modules/Quotes/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Quotes/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Quotes/pdf_templates/footer.php create mode 100644 oss/vtiger/trunk/modules/Quotes/pdf_templates/header.php create mode 100644 oss/vtiger/trunk/modules/Quotes/pdf_templates/lastpage/body.php create mode 100644 oss/vtiger/trunk/modules/Quotes/pdf_templates/lastpage/footer.php create mode 100644 oss/vtiger/trunk/modules/Quotes/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/EmptyRecyclebin.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/ListView.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/RecycleBin.js create mode 100644 oss/vtiger/trunk/modules/RecycleBin/RecycleBin.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/RecycleBinAjax.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/RecycleBinHandler.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/RecycleBinUtils.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/Restoration.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/index.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/language/en_us.lang.js create mode 100644 oss/vtiger/trunk/modules/RecycleBin/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/RecycleBin/language/zh_cn.lang.js create mode 100644 oss/vtiger/trunk/modules/RecycleBin/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Reports/AdvancedFilter.php create mode 100644 oss/vtiger/trunk/modules/Reports/ChangeFolder.php create mode 100644 oss/vtiger/trunk/modules/Reports/CheckReport.php create mode 100644 oss/vtiger/trunk/modules/Reports/CreatePDF.php create mode 100644 oss/vtiger/trunk/modules/Reports/CreateXL.php create mode 100644 oss/vtiger/trunk/modules/Reports/Delete.php create mode 100644 oss/vtiger/trunk/modules/Reports/DeleteReportFolder.php create mode 100644 oss/vtiger/trunk/modules/Reports/Forms.php create mode 100644 oss/vtiger/trunk/modules/Reports/ListView.php create mode 100644 oss/vtiger/trunk/modules/Reports/NewReport0.php create mode 100644 oss/vtiger/trunk/modules/Reports/NewReport1.php create mode 100644 oss/vtiger/trunk/modules/Reports/PopulateReports.php create mode 100644 oss/vtiger/trunk/modules/Reports/PrintReport.php create mode 100644 oss/vtiger/trunk/modules/Reports/ReportColumns.php create mode 100644 oss/vtiger/trunk/modules/Reports/ReportColumnsTotal.php create mode 100644 oss/vtiger/trunk/modules/Reports/ReportFilters.php create mode 100644 oss/vtiger/trunk/modules/Reports/ReportGrouping.php create mode 100644 oss/vtiger/trunk/modules/Reports/ReportRun.php create mode 100644 oss/vtiger/trunk/modules/Reports/ReportSharing.php create mode 100644 oss/vtiger/trunk/modules/Reports/ReportType.php create mode 100644 oss/vtiger/trunk/modules/Reports/Reports.js create mode 100644 oss/vtiger/trunk/modules/Reports/Reports.php create mode 100644 oss/vtiger/trunk/modules/Reports/ReportsAjax.php create mode 100644 oss/vtiger/trunk/modules/Reports/Save.php create mode 100644 oss/vtiger/trunk/modules/Reports/SaveAndRun.php create mode 100644 oss/vtiger/trunk/modules/Reports/SaveReport.php create mode 100644 oss/vtiger/trunk/modules/Reports/SaveReport0.php create mode 100644 oss/vtiger/trunk/modules/Reports/SaveReportFolder.php create mode 100644 oss/vtiger/trunk/modules/Reports/StandardFilter.php create mode 100644 oss/vtiger/trunk/modules/Reports/index.php create mode 100644 oss/vtiger/trunk/modules/Reports/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Reports/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Rss/Delete.php create mode 100644 oss/vtiger/trunk/modules/Rss/Forms.php create mode 100644 oss/vtiger/trunk/modules/Rss/ListView.html create mode 100644 oss/vtiger/trunk/modules/Rss/ListView.php create mode 100644 oss/vtiger/trunk/modules/Rss/Popup.html create mode 100644 oss/vtiger/trunk/modules/Rss/Popup.php create mode 100644 oss/vtiger/trunk/modules/Rss/Rss.js create mode 100644 oss/vtiger/trunk/modules/Rss/Rss.php create mode 100644 oss/vtiger/trunk/modules/Rss/RssAjax.php create mode 100644 oss/vtiger/trunk/modules/Rss/Save.php create mode 100644 oss/vtiger/trunk/modules/Rss/Star.php create mode 100644 oss/vtiger/trunk/modules/Rss/index.php create mode 100644 oss/vtiger/trunk/modules/Rss/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Rss/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/CreateSOPDF.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/CustomView.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/Delete.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/DetailView.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/EditView.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/ListTopSalesOrder.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/ListView.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/Popup.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/RecurringInvoiceHandler.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/SalesOrder.js create mode 100644 oss/vtiger/trunk/modules/SalesOrder/SalesOrder.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/SalesOrderAjax.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/Save.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/SendPDFMail.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/Settings.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/index.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/pdf_templates/footer.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/pdf_templates/header.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/pdf_templates/lastpage/body.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/pdf_templates/lastpage/footer.php create mode 100644 oss/vtiger/trunk/modules/SalesOrder/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/CustomView.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/Delete.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/DetailView.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/EditView.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/FindDuplicateRecords.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/Import.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/ListView.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/Popup.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/ProcessDuplicates.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/Save.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/ServiceContracts.js create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/ServiceContracts.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/ServiceContractsAjax.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/ServiceContractsHandler.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/Settings.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/index.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/schema.xml create mode 100644 oss/vtiger/trunk/modules/ServiceContracts/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Services/AddServiceToPriceBooks.php create mode 100644 oss/vtiger/trunk/modules/Services/AddServicesToPriceBook.php create mode 100644 oss/vtiger/trunk/modules/Services/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Services/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Services/Delete.php create mode 100644 oss/vtiger/trunk/modules/Services/DeletePriceBookServiceRel.php create mode 100644 oss/vtiger/trunk/modules/Services/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Services/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Services/EditListPrice.php create mode 100644 oss/vtiger/trunk/modules/Services/EditView.php create mode 100644 oss/vtiger/trunk/modules/Services/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/Services/FindDuplicateRecords.php create mode 100644 oss/vtiger/trunk/modules/Services/Import.php create mode 100644 oss/vtiger/trunk/modules/Services/InventoryPriceAjax.php create mode 100644 oss/vtiger/trunk/modules/Services/InventoryTaxAjax.php create mode 100644 oss/vtiger/trunk/modules/Services/ListView.php create mode 100644 oss/vtiger/trunk/modules/Services/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Services/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Services/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Services/Popup.php create mode 100644 oss/vtiger/trunk/modules/Services/ProcessDuplicates.php create mode 100644 oss/vtiger/trunk/modules/Services/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Services/Save.php create mode 100644 oss/vtiger/trunk/modules/Services/Services.js create mode 100644 oss/vtiger/trunk/modules/Services/Services.php create mode 100644 oss/vtiger/trunk/modules/Services/ServicesAjax.php create mode 100644 oss/vtiger/trunk/modules/Services/Servicesslide.js create mode 100644 oss/vtiger/trunk/modules/Services/Settings.php create mode 100644 oss/vtiger/trunk/modules/Services/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Services/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Services/UpdateListPrice.php create mode 100644 oss/vtiger/trunk/modules/Services/addPbServiceRelToDB.php create mode 100644 oss/vtiger/trunk/modules/Services/index.php create mode 100644 oss/vtiger/trunk/modules/Services/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Services/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Services/multifile.js create mode 100644 oss/vtiger/trunk/modules/Services/placeholder.gif create mode 100644 oss/vtiger/trunk/modules/Services/schema.xml create mode 100644 oss/vtiger/trunk/modules/Services/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Settings/AddBlock.php create mode 100644 oss/vtiger/trunk/modules/Settings/AddBlockField.php create mode 100644 oss/vtiger/trunk/modules/Settings/AddBlockFieldToDB.php create mode 100644 oss/vtiger/trunk/modules/Settings/AddBlockToDB.php create mode 100644 oss/vtiger/trunk/modules/Settings/AddCustomFieldToDB.php create mode 100644 oss/vtiger/trunk/modules/Settings/Announcements.php create mode 100644 oss/vtiger/trunk/modules/Settings/AuditTrail.php create mode 100644 oss/vtiger/trunk/modules/Settings/AuditTrailList.php create mode 100644 oss/vtiger/trunk/modules/Settings/BackupServerConfig.php create mode 100644 oss/vtiger/trunk/modules/Settings/CreateCustomField.php create mode 100644 oss/vtiger/trunk/modules/Settings/CreateSharingRule.php create mode 100644 oss/vtiger/trunk/modules/Settings/CurrencyDelete.php create mode 100644 oss/vtiger/trunk/modules/Settings/CurrencyDeleteStep1.php create mode 100644 oss/vtiger/trunk/modules/Settings/CurrencyEditView.php create mode 100644 oss/vtiger/trunk/modules/Settings/CurrencyListView.php create mode 100644 oss/vtiger/trunk/modules/Settings/CustomFieldList.php create mode 100644 oss/vtiger/trunk/modules/Settings/CustomModEntityNo.php create mode 100644 oss/vtiger/trunk/modules/Settings/DefModuleView.php create mode 100644 oss/vtiger/trunk/modules/Settings/DefaultFieldPermissions.php create mode 100644 oss/vtiger/trunk/modules/Settings/DeleteCustomField.php create mode 100644 oss/vtiger/trunk/modules/Settings/DeleteLeadCustomFieldMapping.php create mode 100644 oss/vtiger/trunk/modules/Settings/DeleteMailAccount.php create mode 100644 oss/vtiger/trunk/modules/Settings/EditComboField.php create mode 100644 oss/vtiger/trunk/modules/Settings/EditCompanyDetails.php create mode 100644 oss/vtiger/trunk/modules/Settings/EditDefOrgFieldLevelAccess.php create mode 100644 oss/vtiger/trunk/modules/Settings/EditInventoryNotification.php create mode 100644 oss/vtiger/trunk/modules/Settings/EditNotification.php create mode 100644 oss/vtiger/trunk/modules/Settings/EmailConfig.php create mode 100644 oss/vtiger/trunk/modules/Settings/Forms.php create mode 100644 oss/vtiger/trunk/modules/Settings/GetFieldInfo.php create mode 100644 oss/vtiger/trunk/modules/Settings/GroupDetailView.php create mode 100644 oss/vtiger/trunk/modules/Settings/LayoutBlockList.php create mode 100644 oss/vtiger/trunk/modules/Settings/LeadCustomFieldMapping.php create mode 100644 oss/vtiger/trunk/modules/Settings/ListLoginHistory.php create mode 100644 oss/vtiger/trunk/modules/Settings/ListMailAccount.php create mode 100644 oss/vtiger/trunk/modules/Settings/ListModuleOwners.php create mode 100644 oss/vtiger/trunk/modules/Settings/ListProfiles.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerEdit.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolder.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolderSave.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolderUpdate.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerInfo.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRule.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleDelete.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleEdit.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleMove.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleSave.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerSave.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/core/MailAttachmentMIME.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/core/MailBox.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/core/MailRecord.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScanner.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerAction.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerInfo.php create mode 100644 oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerRule.php create mode 100644 oss/vtiger/trunk/modules/Settings/ModifyPickList.php create mode 100644 oss/vtiger/trunk/modules/Settings/ModuleManager.php create mode 100644 oss/vtiger/trunk/modules/Settings/ModuleManager/Export.php create mode 100644 oss/vtiger/trunk/modules/Settings/ModuleManager/Import.php create mode 100644 oss/vtiger/trunk/modules/Settings/ModuleManager/Update.php create mode 100644 oss/vtiger/trunk/modules/Settings/OrgSharingDetailView.php create mode 100644 oss/vtiger/trunk/modules/Settings/OrganizationConfig.php create mode 100644 oss/vtiger/trunk/modules/Settings/OrganizationTermsandConditions.php create mode 100644 oss/vtiger/trunk/modules/Settings/ProxyServerConfig.php create mode 100644 oss/vtiger/trunk/modules/Settings/RoleDeleteStep1.php create mode 100644 oss/vtiger/trunk/modules/Settings/RoleDetailView.php create mode 100644 oss/vtiger/trunk/modules/Settings/Save.php create mode 100644 oss/vtiger/trunk/modules/Settings/SaveAuditTrail.php create mode 100644 oss/vtiger/trunk/modules/Settings/SaveCompany.php create mode 100644 oss/vtiger/trunk/modules/Settings/SaveConvertLead.php create mode 100644 oss/vtiger/trunk/modules/Settings/SaveCurrencyInfo.php create mode 100644 oss/vtiger/trunk/modules/Settings/SaveEnableBackup.php create mode 100644 oss/vtiger/trunk/modules/Settings/SaveInventoryNotification.php create mode 100644 oss/vtiger/trunk/modules/Settings/SaveNotification.php create mode 100644 oss/vtiger/trunk/modules/Settings/SaveRole.php create mode 100644 oss/vtiger/trunk/modules/Settings/SaveSharingRule.php create mode 100644 oss/vtiger/trunk/modules/Settings/Settings.js create mode 100644 oss/vtiger/trunk/modules/Settings/SettingsAjax.php create mode 100644 oss/vtiger/trunk/modules/Settings/ShowAuditTrail.php create mode 100644 oss/vtiger/trunk/modules/Settings/TaxConfig.php create mode 100644 oss/vtiger/trunk/modules/Settings/UpdateComboValues.php create mode 100644 oss/vtiger/trunk/modules/Settings/UpdateDefaultFieldLevelAccess.php create mode 100644 oss/vtiger/trunk/modules/Settings/add2db.php create mode 100644 oss/vtiger/trunk/modules/Settings/createemailtemplate.php create mode 100644 oss/vtiger/trunk/modules/Settings/createnewgroup.php create mode 100644 oss/vtiger/trunk/modules/Settings/createrole.php create mode 100644 oss/vtiger/trunk/modules/Settings/deleteemailtemplate.php create mode 100644 oss/vtiger/trunk/modules/Settings/deletewordtemplate.php create mode 100644 oss/vtiger/trunk/modules/Settings/detailviewemailtemplate.php create mode 100644 oss/vtiger/trunk/modules/Settings/downloadfile.php create mode 100644 oss/vtiger/trunk/modules/Settings/editemailtemplate.php create mode 100644 oss/vtiger/trunk/modules/Settings/index.php create mode 100644 oss/vtiger/trunk/modules/Settings/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Settings/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Settings/listemailtemplates.php create mode 100644 oss/vtiger/trunk/modules/Settings/listgroups.php create mode 100644 oss/vtiger/trunk/modules/Settings/listinventorynotifications.php create mode 100644 oss/vtiger/trunk/modules/Settings/listnotificationschedulers.php create mode 100644 oss/vtiger/trunk/modules/Settings/listroles.php create mode 100644 oss/vtiger/trunk/modules/Settings/listwordtemplates.php create mode 100644 oss/vtiger/trunk/modules/Settings/mailmergedownloadfile.php create mode 100644 oss/vtiger/trunk/modules/Settings/profilePrivileges.php create mode 100644 oss/vtiger/trunk/modules/Settings/saveemailtemplate.php create mode 100644 oss/vtiger/trunk/modules/Settings/savetermsandconditions.php create mode 100644 oss/vtiger/trunk/modules/Settings/savewordtemplate.php create mode 100644 oss/vtiger/trunk/modules/Settings/upload.php create mode 100644 oss/vtiger/trunk/modules/Settings/vtigerCRM.CAB create mode 100644 oss/vtiger/trunk/modules/System/SystemAjax.php create mode 100644 oss/vtiger/trunk/modules/System/config.php create mode 100644 oss/vtiger/trunk/modules/System/distros.ini create mode 100644 oss/vtiger/trunk/modules/System/images/Arch.gif create mode 100644 oss/vtiger/trunk/modules/System/images/Cobalt.png create mode 100644 oss/vtiger/trunk/modules/System/images/Darwin.png create mode 100644 oss/vtiger/trunk/modules/System/images/Debian.png create mode 100644 oss/vtiger/trunk/modules/System/images/Fedora.png create mode 100644 oss/vtiger/trunk/modules/System/images/FreeBSD.png create mode 100644 oss/vtiger/trunk/modules/System/images/Gentoo.png create mode 100644 oss/vtiger/trunk/modules/System/images/Mandrake.png create mode 100644 oss/vtiger/trunk/modules/System/images/NetBSD.png create mode 100644 oss/vtiger/trunk/modules/System/images/OpenBSD.png create mode 100644 oss/vtiger/trunk/modules/System/images/Redhat.png create mode 100644 oss/vtiger/trunk/modules/System/images/Rubix.png create mode 100644 oss/vtiger/trunk/modules/System/images/Slackware.png create mode 100644 oss/vtiger/trunk/modules/System/images/Suse.png create mode 100644 oss/vtiger/trunk/modules/System/images/Trustix.gif create mode 100644 oss/vtiger/trunk/modules/System/images/free-eos.png create mode 100644 oss/vtiger/trunk/modules/System/images/lfs.png create mode 100644 oss/vtiger/trunk/modules/System/images/unknown.png create mode 100644 oss/vtiger/trunk/modules/System/images/xp.gif create mode 100644 oss/vtiger/trunk/modules/System/includes/XPath.class.php create mode 100644 oss/vtiger/trunk/modules/System/includes/class.Template.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/class.error.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/common_functions.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/ar_utf8.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/bg.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/big5.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/br.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/ca.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/cn.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/cs.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/ct.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/da.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/de.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/en.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/es.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/et.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/eu.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/fi.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/fr.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/gr.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/he.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/hu.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/id.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/index.html create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/is.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/it.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/ja.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/jp.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/ko.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/lt.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/lv.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/nl.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/no.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/pl.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/pt-br.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/pt.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/ro.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/ru.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/sk.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/sv.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/tr.php create mode 100644 oss/vtiger/trunk/modules/System/includes/lang/tw.php create mode 100644 oss/vtiger/trunk/modules/System/includes/mb/class.healthd.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/mb/class.hwsensors.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/mb/class.lmsensors.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/mb/class.mbm5.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/mb/class.mbmon.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/mb/index.html create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.BSD.common.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.Darwin.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.FreeBSD.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.HP-UX.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.Linux.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.NetBSD.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.OpenBSD.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.SunOS.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.WINNT.inc.bak.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.WINNT.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/class.parseProgs.inc.php create mode 100644 oss/vtiger/trunk/modules/System/includes/os/index.html create mode 100644 oss/vtiger/trunk/modules/System/includes/system_footer.php create mode 100644 oss/vtiger/trunk/modules/System/includes/system_header.php create mode 100644 oss/vtiger/trunk/modules/System/includes/xml/filesystems.php create mode 100644 oss/vtiger/trunk/modules/System/includes/xml/hardware.php create mode 100644 oss/vtiger/trunk/modules/System/includes/xml/hddtemp.php create mode 100644 oss/vtiger/trunk/modules/System/includes/xml/index.html create mode 100644 oss/vtiger/trunk/modules/System/includes/xml/mbinfo.php create mode 100644 oss/vtiger/trunk/modules/System/includes/xml/memory.php create mode 100644 oss/vtiger/trunk/modules/System/includes/xml/network.php create mode 100644 oss/vtiger/trunk/modules/System/includes/xml/vitals.php create mode 100644 oss/vtiger/trunk/modules/System/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/System/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/System/listsysconfig.php create mode 100644 oss/vtiger/trunk/modules/System/phpsysinfo.dtd create mode 100644 oss/vtiger/trunk/modules/System/systemconfig.php create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/box.tpl create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/classic.css create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/form.tpl create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/images/bar_left.gif create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/images/bar_middle.gif create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/images/bar_right.gif create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/images/redbar_left.gif create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/images/redbar_middle.gif create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/images/redbar_right.gif create mode 100644 oss/vtiger/trunk/modules/System/templates/classic/images/trans.gif create mode 100644 oss/vtiger/trunk/modules/Tasks/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/ComputeTooltip.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/EditQuickView.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/QuickView.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/SaveTooltipInformation.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/Tooltip.js create mode 100644 oss/vtiger/trunk/modules/Tooltip/Tooltip.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/TooltipAjax.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/TooltipHandler.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/TooltipHeaderScript.js create mode 100644 oss/vtiger/trunk/modules/Tooltip/TooltipSettings.js create mode 100644 oss/vtiger/trunk/modules/Tooltip/TooltipUtils.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/index.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Tooltip/schema.xml create mode 100644 oss/vtiger/trunk/modules/Users/AddMailAccount.php create mode 100644 oss/vtiger/trunk/modules/Users/Announcements.php create mode 100644 oss/vtiger/trunk/modules/Users/Authenticate.php create mode 100644 oss/vtiger/trunk/modules/Users/ChangePassword.php create mode 100644 oss/vtiger/trunk/modules/Users/CreateProfile.php create mode 100644 oss/vtiger/trunk/modules/Users/CreateUserPrivilegeFile.php create mode 100644 oss/vtiger/trunk/modules/Users/DefaultDataPopulator.php create mode 100644 oss/vtiger/trunk/modules/Users/Delete.php create mode 100644 oss/vtiger/trunk/modules/Users/DeleteGroup.php create mode 100644 oss/vtiger/trunk/modules/Users/DeleteProfile.php create mode 100644 oss/vtiger/trunk/modules/Users/DeleteRole.php create mode 100644 oss/vtiger/trunk/modules/Users/DeleteSharingRule.php create mode 100644 oss/vtiger/trunk/modules/Users/DeleteUser.php create mode 100644 oss/vtiger/trunk/modules/Users/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Users/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Users/EditView.php create mode 100644 oss/vtiger/trunk/modules/Users/Error.php create mode 100644 oss/vtiger/trunk/modules/Users/Forms.php create mode 100644 oss/vtiger/trunk/modules/Users/GroupDeleteStep1.php create mode 100644 oss/vtiger/trunk/modules/Users/ListView.php create mode 100644 oss/vtiger/trunk/modules/Users/Login.php create mode 100644 oss/vtiger/trunk/modules/Users/LoginHistory.php create mode 100644 oss/vtiger/trunk/modules/Users/Logout.php create mode 100644 oss/vtiger/trunk/modules/Users/OrgSharingEditView.php create mode 100644 oss/vtiger/trunk/modules/Users/Popup.php create mode 100644 oss/vtiger/trunk/modules/Users/ProfileDeleteStep1.php create mode 100644 oss/vtiger/trunk/modules/Users/RecalculateSharingRules.php create mode 100644 oss/vtiger/trunk/modules/Users/RenameProfile.php create mode 100644 oss/vtiger/trunk/modules/Users/RoleDragDrop.php create mode 100644 oss/vtiger/trunk/modules/Users/RolePopup.php create mode 100644 oss/vtiger/trunk/modules/Users/Save.php create mode 100644 oss/vtiger/trunk/modules/Users/SaveDefModuleView.php create mode 100644 oss/vtiger/trunk/modules/Users/SaveGroup.php create mode 100644 oss/vtiger/trunk/modules/Users/SaveMailAccount.php create mode 100644 oss/vtiger/trunk/modules/Users/SaveOrgSharing.php create mode 100644 oss/vtiger/trunk/modules/Users/SaveProfile.php create mode 100644 oss/vtiger/trunk/modules/Users/ShowHistory.html create mode 100644 oss/vtiger/trunk/modules/Users/ShowHistory.php create mode 100644 oss/vtiger/trunk/modules/Users/TemplateMerge.php create mode 100644 oss/vtiger/trunk/modules/Users/UpdateProfileChanges.php create mode 100644 oss/vtiger/trunk/modules/Users/UserDeleteStep1.php create mode 100644 oss/vtiger/trunk/modules/Users/UserGroups.php create mode 100644 oss/vtiger/trunk/modules/Users/Users.js create mode 100644 oss/vtiger/trunk/modules/Users/Users.php create mode 100644 oss/vtiger/trunk/modules/Users/UsersAjax.php create mode 100644 oss/vtiger/trunk/modules/Users/about_us.php create mode 100644 oss/vtiger/trunk/modules/Users/binaryfilelist.php create mode 100644 oss/vtiger/trunk/modules/Users/deletewordtemplate.php create mode 100644 oss/vtiger/trunk/modules/Users/downloadfile.php create mode 100644 oss/vtiger/trunk/modules/Users/getListOfRecords.php create mode 100644 oss/vtiger/trunk/modules/Users/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Users/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Users/lookupemailtemplates.php create mode 100644 oss/vtiger/trunk/modules/Users/massChangeStatus.php create mode 100644 oss/vtiger/trunk/modules/Users/massdelete.php create mode 100644 oss/vtiger/trunk/modules/Users/notify_detail.php create mode 100644 oss/vtiger/trunk/modules/Users/populatetemplate.php create mode 100644 oss/vtiger/trunk/modules/Users/updateLeadDBStatus.php create mode 100644 oss/vtiger/trunk/modules/Users/updateNotificationSchedulers.php create mode 100644 oss/vtiger/trunk/modules/Utilities/Calculator.php create mode 100644 oss/vtiger/trunk/modules/Utilities/Clock.php create mode 100644 oss/vtiger/trunk/modules/Utilities/Currencies.php create mode 100644 oss/vtiger/trunk/modules/Utilities/Merge.php create mode 100644 oss/vtiger/trunk/modules/Utilities/UtilitiesAjax.php create mode 100644 oss/vtiger/trunk/modules/Utilities/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Utilities/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Vendors/CallRelatedList.php create mode 100644 oss/vtiger/trunk/modules/Vendors/CustomView.php create mode 100644 oss/vtiger/trunk/modules/Vendors/Delete.php create mode 100644 oss/vtiger/trunk/modules/Vendors/DetailView.php create mode 100644 oss/vtiger/trunk/modules/Vendors/DetailViewAjax.php create mode 100644 oss/vtiger/trunk/modules/Vendors/EditView.php create mode 100644 oss/vtiger/trunk/modules/Vendors/ExportRecords.php create mode 100644 oss/vtiger/trunk/modules/Vendors/FindDuplicateRecords.php create mode 100644 oss/vtiger/trunk/modules/Vendors/Import.php create mode 100644 oss/vtiger/trunk/modules/Vendors/ListView.php create mode 100644 oss/vtiger/trunk/modules/Vendors/ListViewPagging.php create mode 100644 oss/vtiger/trunk/modules/Vendors/MassEdit.php create mode 100644 oss/vtiger/trunk/modules/Vendors/MassEditSave.php create mode 100644 oss/vtiger/trunk/modules/Vendors/Popup.php create mode 100644 oss/vtiger/trunk/modules/Vendors/ProcessDuplicates.php create mode 100644 oss/vtiger/trunk/modules/Vendors/QuickCreate.php create mode 100644 oss/vtiger/trunk/modules/Vendors/Save.php create mode 100644 oss/vtiger/trunk/modules/Vendors/Settings.php create mode 100644 oss/vtiger/trunk/modules/Vendors/TagCloud.php create mode 100644 oss/vtiger/trunk/modules/Vendors/UnifiedSearch.php create mode 100644 oss/vtiger/trunk/modules/Vendors/Vendors.js create mode 100644 oss/vtiger/trunk/modules/Vendors/Vendors.php create mode 100644 oss/vtiger/trunk/modules/Vendors/VendorsAjax.php create mode 100644 oss/vtiger/trunk/modules/Vendors/index.php create mode 100644 oss/vtiger/trunk/modules/Vendors/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Vendors/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Vendors/updateRelations.php create mode 100644 oss/vtiger/trunk/modules/Vtiger/Settings.php create mode 100644 oss/vtiger/trunk/modules/Webforms/Webforms.config.php create mode 100644 oss/vtiger/trunk/modules/Webforms/Webforms.js create mode 100644 oss/vtiger/trunk/modules/Webforms/Webforms.php create mode 100644 oss/vtiger/trunk/modules/Webforms/WebformsAjax.php create mode 100644 oss/vtiger/trunk/modules/Webforms/WebformsHandler.php create mode 100644 oss/vtiger/trunk/modules/Webforms/index.php create mode 100644 oss/vtiger/trunk/modules/Webforms/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/Webforms/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/Webforms/post.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTConditionalExpression.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTEntityCache.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTEntityMethodManager.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTEventHandler.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTJsonCondition.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTSimpleTemplate.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTTaskManager.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTTaskQueue.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTWorkflowApplication.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTWorkflowManager.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTWorkflowTemplateManager.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/VTWorkflowUtils.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/com_vtiger_workflowAjax.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/deletetask.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/deleteworkflow.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/edittask.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/editworkflow.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/entitymethodjson.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/errormessage.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/errorpage.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/include.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/include_webservices.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/loadtemplates.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/modulefieldsjson.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/add.png create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/createeventtaskscript.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/createtodotaskscript.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/edittaskscript.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/editworkflowscript.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/emailtaskscript.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/fieldvalidator.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/functional.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/ico-workflow.png create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/jquery-1.2.6.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/jquery.timepicker.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/json2.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/parallelexecuter.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/remove.png create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/style.css create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/vtigerwebservices.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/resources/workflowlistscript.js create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/runtaskjob.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/savetask.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/savetemplate.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/saveworkflow.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/sortfieldsjson.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/tasklist.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateEntityTask.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateEventTask.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateTodoTask.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTDummyTask.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTEmailTask.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTEntityMethodTask.inc create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/templatesformodulejson.php create mode 100644 oss/vtiger/trunk/modules/com_vtiger_workflow/workflowlist.php create mode 100644 oss/vtiger/trunk/modules/squirrelmail-1.4.4/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/uploads/add2db.php create mode 100644 oss/vtiger/trunk/modules/uploads/deleteattachments.php create mode 100644 oss/vtiger/trunk/modules/uploads/downloadfile.php create mode 100644 oss/vtiger/trunk/modules/uploads/language/en_us.lang.php create mode 100644 oss/vtiger/trunk/modules/uploads/language/zh_cn.lang.php create mode 100644 oss/vtiger/trunk/modules/uploads/upload.php create mode 100644 oss/vtiger/trunk/modules/uploads/uploadsAjax.php create mode 100644 oss/vtiger/trunk/modules/vtmessages/language/zh_cn.lang.php diff --git a/oss/vtiger/trunk/modules/Accounts/AccountHierarchy.php b/oss/vtiger/trunk/modules/Accounts/AccountHierarchy.php new file mode 100644 index 00000000..b36a408f --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/AccountHierarchy.php @@ -0,0 +1,43 @@ +assign("CATEGORY",$parent_tab); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); + +$check_button = Button_Check($currentModule); +$check_button['Import'] = 'no'; +$check_button['Export'] = 'no'; +$check_button['moduleSettings'] = 'no'; +$smarty->assign("CHECK", $check_button); + +$focus = CRMEntity::getInstance($currentModule); +$accountid = vtlib_purify($_REQUEST['accountid']); +if (!empty($accountid)) { + $hierarchy = $focus->getAccountHierarchy($accountid); +} +$smarty->assign("ACCOUNT_HIERARCHY",$hierarchy); +$smarty->display("AccountHierarchy.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Accounts/Accounts.js b/oss/vtiger/trunk/modules/Accounts/Accounts.js new file mode 100644 index 00000000..f2a3d1b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/Accounts.js @@ -0,0 +1,414 @@ +/********************************************************************************* + +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ********************************************************************************/ + + +document.write(""; +// mailer_export +if (isset($other_text['mailer_exp'])) +{ + $view_script .= ""; +} +// end of mailer export +if(isset($order_by) && $order_by != '') +{ + if($order_by == 'smownerid') + { + if( $adb->dbType == "pgsql") + $query .= ' GROUP BY user_name'; + $query .= ' ORDER BY user_name '.$sorder; + } + else + { + $tablename = getTableNameForField('Accounts',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + if( $adb->dbType == "pgsql") + $query .= ' GROUP BY '.$tablename.$order_by; + + $query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; + } +} + + + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $query = fixPostgresQuery( $query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +//mass merge for word templates -- *Raj*17/11 +while($row = $adb->fetch_array($list_result)) +{ + $ids[] = $row["crmid"]; +} +if(isset($ids)) +{ + $smarty->assign("ALLIDS", implode($ids,";")); +} +if(isPermitted("Accounts","Merge") == 'yes') +{ + $wordTemplateResult = fetchWordTemplateList("Accounts"); + $tempCount = $adb->num_rows($wordTemplateResult); + $tempVal = $adb->fetch_array($wordTemplateResult); + for($templateCount=0;$templateCount<$tempCount;$templateCount++) + { + $optionString .=""; + $tempVal = $adb->fetch_array($wordTemplateResult); + } + if($tempCount > 0) + { + $smarty->assign("WORDTEMPLATEOPTIONS","".$app_strings['LBL_SELECT_TEMPLATE_TO_MAIL_MERGE'].""); + + $smarty->assign("MERGEBUTTON",""); + } + else + { + global $current_user; + require("user_privileges/user_privileges_".$current_user->id.".php"); + if($is_admin == true) + { + $smarty->assign("MERGEBUTTON",''. $app_strings["LBL_CREATE_MERGE_TEMPLATE"].''); + } + } +} + +//mass merge for word templates + +//Retreive the List View Table Header +if($viewid !='') +$url_string .= "&viewname=".$viewid; + +$listview_header = getListViewHeader($focus,"Accounts",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_header_search=getSearchListHeaderValues($focus,"Accounts",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER", $listview_header_search); + +$listview_entries = getListViewEntries($focus,"Accounts",$list_result,$navigation_array,"","","EditView","Delete",$oCustomView); + +$smarty->assign("LISTENTITY", $listview_entries); +$smarty->assign("SELECT_SCRIPT", $view_script); +$smarty->assign("CATEGORY",$category); + +$smarty->assign("AVALABLE_FIELDS", getMergeFields($currentModule,"available_fields")); +$smarty->assign("FIELDS_TO_MERGE", getMergeFields($currentModule,"fileds_to_merge")); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string,"Accounts","index",$viewid); +$alphabetical = AlphabeticalSearch($currentModule,'index','accountname','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($currentModule); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NAVIGATION", $navigationOutput); + +$check_button = Button_Check($currentModule); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display("ListView.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Accounts/ListViewPagging.php b/oss/vtiger/trunk/modules/Accounts/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Accounts/ListViewTop.php b/oss/vtiger/trunk/modules/Accounts/ListViewTop.php new file mode 100644 index 00000000..ce37c5de --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/ListViewTop.php @@ -0,0 +1,107 @@ +$title,'Header'=>$listview_header,'Entries'=>$listview_entries) where as listview_header and listview_entries are arrays of header and entity values which are returned from function getListViewHeader and getListViewEntries +*/ +function getTopAccounts($maxval,$calCnt) +{ + $log = LoggerManager::getLogger('top accounts_list'); + $log->debug("Entering getTopAccounts() method ..."); + require_once("data/Tracker.php"); + require_once('modules/Potentials/Potentials.php'); + require_once('include/logging.php'); + require_once('include/ListView/ListView.php'); + global $app_strings; + global $adb; + global $current_language; + global $current_user; + $current_module_strings = return_module_language($current_language, "Accounts"); + + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + + $list_query = "select vtiger_account.accountid, vtiger_account.accountname, vtiger_account.tickersymbol, sum(vtiger_potential.amount) as amount from vtiger_potential inner join vtiger_crmentity on (vtiger_potential.potentialid=vtiger_crmentity.crmid) left join vtiger_account on (vtiger_potential.related_to=vtiger_account.accountid) left join vtiger_groups on (vtiger_groups.groupid = vtiger_crmentity.smownerid) where vtiger_crmentity.deleted=0 AND vtiger_crmentity.smownerid='".$current_user->id."' and vtiger_potential.sales_stage not in ('Closed Won', 'Closed Lost','".$app_strings['LBL_CLOSE_WON']."','".$app_strings['LBL_CLOSE_LOST']."')"; + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[6] == 3) + { + $sec_parameter=getListViewSecurityParameter('Accounts'); + $list_query .= $sec_parameter; + + } + $list_query .= " group by vtiger_account.accountid, vtiger_account.accountname, vtiger_account.tickersymbol order by amount desc"; + + $list_query .= " LIMIT 0," . $adb->sql_escape_string($maxval); + + if($calCnt == 'calculateCnt') { + $list_result_rows = $adb->query(mkCountQuery($list_query)); + return $adb->query_result($list_result_rows, 0, 'count'); + } + + $list_result=$adb->query($list_query); + $open_accounts_list = array(); + $noofrows = $adb->num_rows($list_result); + + if ($noofrows) { + for($i=0;$i<$noofrows;$i++) + { + $open_accounts_list[] = Array('accountid' => $adb->query_result($list_result,$i,'accountid'), + 'accountname' => $adb->query_result($list_result,$i,'accountname'), + 'amount' => $adb->query_result($list_result,$i,'amount'), + 'tickersymbol' => $adb->query_result($list_result,$i,'tickersymbol'), + ); + } + } + + $title=array(); + $title[]='myTopAccounts.gif'; + $title[]=$current_module_strings['LBL_TOP_ACCOUNTS']; + $title[]='home_myaccount'; + + $header=array(); + $header[]=$current_module_strings['LBL_LIST_ACCOUNT_NAME']; + $currencyid=fetchCurrency($current_user->id); + $rate_symbol = getCurrencySymbolandCRate($currencyid); + $rate = $rate_symbol['rate']; + $curr_symbol = $rate_symbol['symbol']; + $header[]=$current_module_strings['LBL_LIST_AMOUNT'].'('.$curr_symbol.')'; + + $entries=array(); + foreach($open_accounts_list as $account) + { + $value=array(); + $account_fields = array( + 'ACCOUNT_ID' => $account['accountid'], + 'ACCOUNT_NAME' => $account['accountname'], + 'AMOUNT' => ($account['amount']), + ); + + $Top_Accounts = (strlen($account['accountname']) > 20) ? (substr($account['accountname'],0,20).'...') : $account['accountname']; + $value[]=''.$Top_Accounts.''; + $value[]=convertFromDollar($account['amount'],$rate); + $entries[$account['accountid']]=$value; + } + $values=Array('ModuleName'=>'Accounts','Title'=>$title,'Header'=>$header,'Entries'=>$entries); + $log->debug("Exiting getTopAccounts method ..."); + if (($display_empty_home_blocks && count($entries) == 0 ) || (count($entries)>0)) + return $values; +} +?> diff --git a/oss/vtiger/trunk/modules/Accounts/MailerExport.php b/oss/vtiger/trunk/modules/Accounts/MailerExport.php new file mode 100644 index 00000000..c44c1e8e --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/MailerExport.php @@ -0,0 +1,325 @@ +query ($query,true,"Error: "."
$query"); + for ($tmp=0; $tmp < $adb->num_rows($result); $tmp++) + { + $myData = $adb->fetchByAssoc ($result); + $queryFields[] = Array('columnname'=>$myData['columnname'] + ,'uitype'=>'56','fieldlabel'=>$mod_strings[$myData['fieldlabel']] + ,'value'=> $valueArray); + } +} + +if ($step == "ask") +{ + require_once('config.php'); + require_once('include/database/PearDatabase.php'); + require_once('Smarty_setup.php'); + $smarty = new vtigerCRM_Smarty; + $valueArray = Array('' => $mod_strings['LBL_MAILER_EXPORT_IGNORE'], + '0' => $mod_strings['LBL_MAILER_EXPORT_NOTCHECKED'], + '1' => $mod_strings['LBL_MAILER_EXPORT_CHECKED']); + + $smarty->assign("MOD", return_module_language($current_language,'Accounts')); + $smarty->assign("CMOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("MODULE",$currentModule); + $smarty->assign("EXPORTWHERE",$exportWhere); + $queryFields = Array(); + // get the Contacts CF fields + $cfquery = "SELECT columnname,fieldlabel,uitype FROM vtiger_field WHERE tablename='vtiger_contactscf' and vtiger_field.presence in (0,2)"; + $result = $adb->query ($cfquery,true,"Error: "."
$cfquery"); + for ($tmp=0; $tmp < $adb->num_rows($result); $tmp++) + { + $cfTmp = $adb->fetchByAssoc ($result); + $cfColName=$cfTmp['columnname']; + if ($cfTmp['uitype'] == 1) + $queryFields[$tmp] = $cfTmp; + elseif ($cfTmp['uitype'] == 15) + { + $queryFields[$tmp] = $cfTmp; + $queryFields[$tmp]['value'][''] = $mod_strings['LBL_MAILER_EXPORT_IGNORE']; + $cfValues = "SELECT ".$cfColName.",".$cfColName."id FROM vtiger_".$cfColName; + $resVal = $adb->query ($cfValues,true,"Error: "."
$cfValues"); + for ($tmp1=0; $tmp1 < $adb->num_rows($resVal); $tmp1++) + { + $cfTmp=$adb->fetchByAssoc ($resVal); + $queryFields[$tmp]['value'][$cfTmp[$cfColName]] = $cfTmp[$cfColName]; + } + } + elseif ($cfTmp['uitype'] == 56) + { + $queryFields[$tmp] = $cfTmp; + $queryFields[$tmp]['value'] = $valueArray; + } + } + // now add the standard fields + getStdContactFlds(&$queryFields, $adb, $valueArray); + // get the list of fields + $fieldList=""; + foreach ($queryFields as $myField) + { + if (strlen($fieldList) > 0) + $fieldList .= ','; + $fieldList .= $myField['columnname']; + } + $smarty->assign("FIELDLIST",$fieldList); + // and their types + $typeList =""; + foreach ($queryFields as $myField) + { + if (strlen($typeList) > 0) + $typeList .= ','; + $typeList .= $myField['uitype']; + } + + $smarty->assign("TYPELIST",$typeList); + $smarty->assign("QUERYFIELDS",$queryFields); + $smarty->assign("CATEGORY",$category); + $smarty->display('MailerExport.tpl'); + + +} +else +{ + require_once('../../config.php'); + chdir ($root_directory); + require_once("include/utils/CommonUtils.php"); + require_once('include/database/PearDatabase.php'); + require_once('include/logging.php'); + $exquery = Array(); + $fields = explode(",",$_POST['fieldlist']); + $types = explode(",",$_POST['typelist']); + $escapxportWhere = $adb->sql_escape_string($exportWhere); + if (($export_type == "email") || ($export_type == "emailplus") ) + { + + $where = ""; + + if(count($fields) > 0) + $where .= getExpWhereClause($fields,$types); + $exquery[0] = "SELECT crmentity.crmid, contactdetails.contactid, + contactdetails.salutation, contactdetails.firstname, + contactdetails.lastname, contactdetails.email FROM vtiger_account + INNER JOIN vtiger_crmentity crmentity on crmentity.crmid=vtiger_account.accountid + INNER JOIN vtiger_accountbillads ON vtiger_account.accountid=vtiger_accountbillads.accountaddressid + INNER JOIN vtiger_accountshipads ON vtiger_account.accountid=vtiger_accountshipads.accountaddressid + INNER JOIN vtiger_accountscf ON vtiger_account.accountid = vtiger_accountscf.accountid + INNER JOIN vtiger_contactdetails contactdetails ON vtiger_account.accountid = contactdetails.accountid + INNER JOIN vtiger_contactscf contactscf ON contactscf.contactid = contactdetails.contactid + WHERE crmentity.deleted=0 AND contactdetails.email != '' ".$where; + + if (strlen ($exportWhere)) + $exquery[0] .= " AND ".$exportWhere; + + if ($export_type == "emailplus") + { + $exquery[1] = "SELECT crmentity.crmid, contactdetails.contactid, + contactdetails.salutation, contactdetails.firstname, + contactdetails.lastname, vtiger_account.email1 FROM vtiger_account + INNER JOIN vtiger_crmentity crmentity ON crmentity.crmid=vtiger_account.accountid + INNER JOIN vtiger_accountbillads ON vtiger_account.accountid=vtiger_accountbillads.accountaddressid + INNER JOIN vtiger_accountshipads ON vtiger_account.accountid=vtiger_accountshipads.accountaddressid + INNER JOIN vtiger_accountscf ON vtiger_account.accountid = vtiger_accountscf.accountid + INNER JOIN vtiger_contactdetails contactdetails ON vtiger_account.accountid = contactdetails.accountid + INNER JOIN vtiger_contactscf contactscf ON contactscf.contactid = contactdetails.contactid + WHERE crmentity.deleted=0 + AND contactdetails.email = '' AND vtiger_account.email1 != '' ".$where; + + if (strlen ($exportWhere)) + $exquery[1] .= " AND ".$exportWhere; + } + } + else if ($export_type == "full") + { + $where = ''; + if(count($fields) > 0) + $where .= getExpWhereClause($fields,$types); + $exquery[0] = "select crmentity.crmid, contactdetails.contactid, + contactdetails.salutation, contactdetails.firstname, + contactdetails.lastname, contactdetails.email, vtiger_account.accountname," + ." vtiger_account.phone, vtiger_account.website, vtiger_accountshipads.ship_street," + ." vtiger_accountshipads.ship_code," + ." vtiger_accountshipads.ship_city, vtiger_accountshipads.ship_state," + ." vtiger_accountshipads.ship_country," + ." vtiger_accountbillads.bill_street, vtiger_accountbillads.bill_code," + ." vtiger_accountbillads.bill_city, vtiger_accountbillads.bill_state," + ." vtiger_accountbillads.bill_country" + ." FROM vtiger_account INNER JOIN vtiger_crmentity crmentity ON crmentity.crmid=vtiger_account.accountid" + ." LEFT JOIN vtiger_accountbillads ON vtiger_account.accountid=vtiger_accountbillads.accountaddressid" + ." LEFT JOIN vtiger_accountshipads ON vtiger_account.accountid=vtiger_accountshipads.accountaddressid" + ." INNER JOIN vtiger_accountscf ON vtiger_account.accountid = vtiger_accountscf.accountid" + ." INNER JOIN vtiger_contactdetails contactdetails ON vtiger_account.accountid = contactdetails.accountid" + ." INNER JOIN vtiger_contactscf contactscf ON contactscf.contactid = contactdetails.contactid" + ." WHERE crmentity.deleted=0 ".$where; + + if (strlen ($exportWhere)) + $exquery[0] .= " AND ".$exportWhere; + } + // Added for getting field labels of the fields selected in the above export queries. If any new fields added in the select clause then the below array need to be updated with the corresponding lablels + $fld_label_arr = Array("salutation"=>getTranslatedString('Salutation','Contacts'), + "lastname"=>getTranslatedString('Last Name','Contacts'), + "firstname"=>getTranslatedString('First Name','Contacts'), + "email"=>getTranslatedString('Email','Contacts'), + "accountname"=>getTranslatedString('Account Name','Accounts'), + "phone"=>getTranslatedString('Phone','Accounts'), + "website"=>getTranslatedString('Website','Accounts'), + "ship_street"=>getTranslatedString('Shipping Address','Accounts'), + "ship_code"=>getTranslatedString('Shipping Code','Accounts'), + "ship_city"=>getTranslatedString('Shipping City','Accounts'), + "ship_state"=>getTranslatedString('Shipping State','Accounts'), + "ship_country"=>getTranslatedString('Shipping Country','Accounts'), + "bill_street"=>getTranslatedString('Billing Address','Accounts'), + "bill_code"=>getTranslatedString('Billing Code','Accounts'), + "bill_city"=>getTranslatedString('Billing City','Accounts'), + "bill_state"=>getTranslatedString('Billing State','Accounts'), + "bill_country"=>getTranslatedString('Billing Country','Accounts') + ); + + for ($temp = 0; $temp < count($exquery); $temp++) + { + $result = $adb->query ($exquery[$temp],true,"Error exporting: "."
$query"); + if ($temp == 0) // We only need the headers for first query + { + $fields_array = $adb->getFieldsArray($result); + // Now walk through the array and replace any cf_* with the content of the + // name array, the index is the cf_ var name + for ($arraywalk = 0; $arraywalk < count($fields_array); $arraywalk++) + { + // echo "Checking: ".$fields_array[$arraywalk]; + if (strstr ($fields_array[$arraywalk], "vtiger_cf_")) + { + $fields_array[$arraywalk] = $name[$fields_array[$arraywalk]]; + // echo "Changing to: ".$fields_array[$arraywalk]; + } + else + $fields_array[$arraywalk] = ($fld_label_arr[$fields_array[$arraywalk]]!='')?$fld_label_arr[$fields_array[$arraywalk]]:$fields_array[$arraywalk]; + } + + + $header = implode("\",\"",array_values($fields_array)); + $header = "\"" .$header; + $header .= "\"\r\n"; + $content .= $header; + + $column_list = implode(",",array_values($fields_array)); + } + + while($val = $adb->fetchByAssoc($result, -1, false)) + { + $new_arr = array(); + + // foreach (array_values($val) as $value) + foreach ($val as $key => $value) + { + $value=br2nl_int($value); + array_push($new_arr, preg_replace("/\"/","\"\"",$value)); + } + + $line = implode("\",\"",$new_arr); + $line = "\"" .$line; + $line .= "\"\r\n"; + + $content .= $line; + } + } + + // echo "
Rows: ".$adb->num_rows($result); + header( "Content-Disposition: inline; filename=MailerExport.csv"); + header( "Content-Type: text/csv; charset=".$app_strings['LBL_CHARSET']); + header( "Expires: Mon, 26 Jul 2007 05:00:00 GMT" ); + header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" ); + header( "Cache-Control: post-check=0, pre-check=0", false ); + header( "Content-Length: ".strlen($content)); + print $content; + exit (); + +} + +function getExpWhereClause($fields,$types) +{ + global $adb; + $where_cond = ""; + + foreach ($fields as $myField) + { + $myType = each($types); + if (strlen($_POST[$myField]) > 0) + { + // type 1 should use a LIKE search + if ($myType['value'] == 1) + { + $equals = " LIKE '"; + $postfix = "%'"; + } + else + { + $equals = " = '"; + $postfix = "'"; + } + // is customer field + if (substr($myField,0,3) == 'cf_') + $where_cond .= " AND contactscf.".$myField.$equals.$adb->sql_escape_string($_POST[$myField]).$postfix; + else + $where_cond .= " AND contactdetails.".$myField.$equals.$adb->sql_escape_string($_POST[$myField]).$postfix; + } + } + return $where_cond; + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Accounts/MassEdit.php b/oss/vtiger/trunk/modules/Accounts/MassEdit.php new file mode 100644 index 00000000..348dab37 --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/MassEdit.php @@ -0,0 +1,45 @@ +mode = ''; +$mode = 'mass_edit'; +$disp_view = getView($focus->mode); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("IDS",$_REQUEST['idstring']); +$smarty->assign("MASS_EDIT","1"); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("APP",$app_strings); +$smarty->assign("CATEGORY",getParentTab()); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Accounts/MassEditSave.php b/oss/vtiger/trunk/modules/Accounts/MassEditSave.php new file mode 100644 index 00000000..0e1f2a6f --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/MassEditSave.php @@ -0,0 +1,67 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if($fieldname == 'assigned_user_id'){ + if($_REQUEST['assigntype'] == 'U') { + $value = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $value = $_REQUEST['assigned_group_id']; + } + } else { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + } + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Accounts/Merge.php b/oss/vtiger/trunk/modules/Accounts/Merge.php new file mode 100644 index 00000000..563b4dbc --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/Merge.php @@ -0,0 +1,298 @@ + + + + +pquery($sql, array($templateid)); +$temparray = $adb->fetch_array($result); + +$fileContent = $temparray['data']; +$filename=html_entity_decode($temparray['filename'], ENT_QUOTES, $default_charset); +// Fix For: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/2107 +$filename= $randomfilename . "_word.doc"; + +$filesize=$temparray['filesize']; +$wordtemplatedownloadpath =$root_directory ."/test/wordtemplatedownload/"; + +$handle = fopen($wordtemplatedownloadpath.$filename,"wb"); +fwrite($handle,base64_decode($fileContent),$filesize); +fclose($handle); + +//<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>> +$mass_merge = $_REQUEST['allselectedboxes']; +$single_record = $_REQUEST['record']; + +if($mass_merge != "") +{ + $mass_merge = explode(";",$mass_merge); + $temp_mass_merge = $mass_merge; + if(array_pop($temp_mass_merge)=="") + array_pop($mass_merge); + //$mass_merge = implode(",",$mass_merge); +}else if($single_record != "") +{ + $mass_merge = $single_record; +}else +{ + die("Record Id is not found, cannot merge the document"); +} + +//echo $mass_merge; +//die; +//for setting vtiger_accountid=0 for the contacts which are deleted +$ct_query = "select crmid from vtiger_crmentity where setype='Contacts' and deleted=1"; +$result = $adb->pquery($ct_query, array()); + +while($row = $adb->fetch_array($result)) +{ + $deleted_id[] = $row['crmid']; +} + +if(count($deleted_id) > 0) +{ + $update_query = "update vtiger_contactdetails set accountid = 0 where contactid in (". generateQuestionMarks($deleted_id) .")"; + $result = $adb->pquery($update_query, array($deleted_id)); +} +//End setting vtiger_accountid=0 for the contacts which are deleted + +//<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>> +global $current_user; +require('user_privileges/user_privileges_'.$current_user->id.'.php'); +if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0 || $module == "Users" || $module == "Emails") +{ + $query1="select vtiger_tab.name,vtiger_field.tablename,vtiger_field.columnname,vtiger_field.fieldlabel from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid where vtiger_field.tabid in (4,6) and vtiger_field.block <> 75 and vtiger_field.presence in (0,2) order by vtiger_field.tablename"; + $params1 = array(); +} +else +{ + $profileList = getCurrentUserProfileList(); + $query1="select vtiger_tab.name,vtiger_field.tablename,vtiger_field.columnname,vtiger_field.fieldlabel from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid INNER JOIN vtiger_profile2field ON vtiger_profile2field.fieldid=vtiger_field.fieldid INNER JOIN vtiger_def_org_field ON vtiger_def_org_field.fieldid=vtiger_field.fieldid where vtiger_field.tabid in (4,6) and vtiger_field.block <> 75 AND vtiger_profile2field.visible=0 AND vtiger_def_org_field.visible=0 AND vtiger_profile2field.profileid IN (". generateQuestionMarks($profileList) .") and vtiger_field.presence in (0,2) GROUP BY vtiger_field.fieldid order by vtiger_field.tablename"; + $params1 = array($profileList); + //Postgres 8 fixes + if( $adb->dbType == "pgsql") + $query1 = fixPostgresQuery( $query1, $log, 0); +} + +$result = $adb->pquery($query1, $params1); +$y=$adb->num_rows($result); + +for ($x=0; $x<$y; $x++) +{ + $tablename = $adb->query_result($result,$x,"tablename"); + $columnname = $adb->query_result($result,$x,"columnname"); + $modulename = $adb->query_result($result,$x,"name"); + + if($tablename == "crmentity") + { + if($modulename == "Contacts") + { + $tablename = "vtiger_crmentityContacts"; + } + } + $querycolumns[$x] = $tablename.".".$columnname; + if($columnname == "smownerid") + { + if($modulename == "Accounts") + { + $querycolumns[$x] = "case when (vtiger_users.user_name not like '') then concat(vtiger_users.last_name,' ',vtiger_users.first_name) else vtiger_groups.groupname end as userjoinname,vtiger_users.first_name,vtiger_users.last_name,vtiger_users.user_name,vtiger_users.yahoo_id,vtiger_users.title,vtiger_users.phone_work,vtiger_users.department,vtiger_users.phone_mobile,vtiger_users.phone_other,vtiger_users.phone_fax,vtiger_users.email1,vtiger_users.phone_home,vtiger_users.email2,vtiger_users.address_street,vtiger_users.address_city,vtiger_users.address_state,vtiger_users.address_postalcode,vtiger_users.address_country"; + } + if($modulename == "Contacts") + { + $querycolumns[$x] = "case when (usersContacts.user_name not like '') then concat(usersContacts.last_name,' ',usersContacts.first_name) else groupsContacts.groupname end as userjoincname"; + } + } + if($columnname == "parentid") + { + $querycolumns[$x] = "vtiger_accountAccount.accountname"; + } + if($columnname == "accountid") + { + $querycolumns[$x] = "vtiger_accountContacts.accountname"; + } + if($columnname == "reportsto") + { + $querycolumns[$x] = "vtiger_contactdetailsContacts.lastname"; + } + + if($modulename == "Accounts") + { + $field_label[$x] = "ACCOUNT_".strtoupper(str_replace(" ","",$adb->query_result($result,$x,"fieldlabel"))); + if($columnname == "smownerid") + { + $field_label[$x] = $field_label[$x].",USER_FIRSTNAME,USER_LASTNAME,USER_USERNAME,USER_YAHOOID,USER_TITLE,USER_OFFICEPHONE,USER_DEPARTMENT,USER_MOBILE,USER_OTHERPHONE,USER_FAX,USER_EMAIL,USER_HOMEPHONE,USER_OTHEREMAIL,USER_PRIMARYADDRESS,USER_CITY,USER_STATE,USER_POSTALCODE,USER_COUNTRY"; + } + } + + if($modulename == "Contacts") + { + $field_label[$x] = "CONTACT_".strtoupper(str_replace(" ","",$adb->query_result($result,$x,"fieldlabel"))); + } + +} + +$csvheader = implode(",",$field_label); +//<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> + +if(count($querycolumns) > 0) +{ + $selectcolumns = implode($querycolumns,","); + + $query = "select $selectcolumns from vtiger_account + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_account.accountid + inner join vtiger_accountbillads on vtiger_account.accountid=vtiger_accountbillads.accountaddressid + inner join vtiger_accountshipads on vtiger_account.accountid=vtiger_accountshipads.accountaddressid + inner join vtiger_accountscf on vtiger_account.accountid = vtiger_accountscf.accountid + left join vtiger_account as vtiger_accountAccount on vtiger_accountAccount.accountid = vtiger_account.parentid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_contactdetails on vtiger_contactdetails.accountid=vtiger_account.accountid + left join vtiger_crmentity as vtiger_crmentityContacts on vtiger_crmentityContacts.crmid = vtiger_contactdetails.contactid + left join vtiger_contactaddress on vtiger_contactdetails.contactid = vtiger_contactaddress.contactaddressid + left join vtiger_contactsubdetails on vtiger_contactdetails.contactid = vtiger_contactsubdetails.contactsubscriptionid + left join vtiger_contactscf on vtiger_contactdetails.contactid = vtiger_contactscf.contactid + left join vtiger_customerdetails on vtiger_contactdetails.contactid = vtiger_customerdetails.customerid + left join vtiger_contactdetails as vtiger_contactdetailsContacts on vtiger_contactdetailsContacts.contactid = vtiger_contactdetails.reportsto + left join vtiger_account as vtiger_accountContacts on vtiger_accountContacts.accountid = vtiger_contactdetails.accountid + left join vtiger_users as usersContacts on usersContacts.id = vtiger_crmentityContacts.smownerid + LEFT JOIN vtiger_groups as groupsContacts + ON groupsContacts.groupid = vtiger_crmentity.smownerid + where vtiger_crmentity.deleted=0 and (vtiger_crmentityContacts.deleted=0 || vtiger_crmentityContacts.deleted is null) and vtiger_account.accountid in(". generateQuestionMarks($mass_merge) .")"; + //echo $query; + //die; + $result = $adb->pquery($query, array($mass_merge)); +$avail_pick_arr = getAccessPickListValues('Accounts'); +while($columnValues = $adb->fetch_array($result)) +{ + $y=$adb->num_fields($result); + for($x=0; $x<$y; $x++) + { + $value = $columnValues[$x]; + foreach($columnValues as $key=>$val) + { + if($val == $value && $value != '') + { + if(array_key_exists($key,$avail_pick_arr)) + { + if(!in_array($val,$avail_pick_arr[$key])) + { + $value = "Not Accessible"; + } + } + } + } + //<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>> + if(trim($value) == "--None--" || trim($value) == "--none--") + { + $value = ""; + } + //<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>> + $actual_values[$x] = $value; + $actual_values[$x] = str_replace('"'," ",$actual_values[$x]); + //if value contains any line feed or carriage return replace the value with ".value." + if (preg_match ("/(\r\n)/", $actual_values[$x])) + { + $actual_values[$x] = '"'.$actual_values[$x].'"'; + } + $actual_values[$x] = decode_html(str_replace(","," ",$actual_values[$x])); + } + $mergevalue[] = implode($actual_values,","); +} +$csvdata = implode($mergevalue,"###"); +}else +{ + die("No fields to do Merge"); +} + +// Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/2107 +$datafilename = $randomfilename . "_data.csv"; + +$handle = fopen($wordtemplatedownloadpath.$datafilename,"wb"); +fwrite($handle,$csvheader."\r\n"); +fwrite($handle,str_replace("###","\r\n",$csvdata)); +fclose($handle); +?> + + + diff --git a/oss/vtiger/trunk/modules/Accounts/Popup.php b/oss/vtiger/trunk/modules/Accounts/Popup.php new file mode 100644 index 00000000..eb0e6e50 --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/Popup.php @@ -0,0 +1,16 @@ + diff --git a/oss/vtiger/trunk/modules/Accounts/ProcessDuplicates.php b/oss/vtiger/trunk/modules/Accounts/ProcessDuplicates.php new file mode 100644 index 00000000..bb5047fa --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/ProcessDuplicates.php @@ -0,0 +1,134 @@ +pquery("SELECT count(*) AS count FROM vtiger_crmentity WHERE crmid=? and deleted=0", array($merge_id)); + $count = $adb->query_result($result,0,'count'); + + if($count > 0) + { + // First, save the primary record + $focus->mode="edit"; + setObjectValuesFromRequest($focus); + $focus->save($module); + $rec_values=$focus->column_fields; + + // Remove the id of primary record from the list of records to be deleted. + $del_value=explode(",",$recordids,-1); + $offset = array_search($merge_id,$del_value); + unset($del_value[$offset]); + + // Transfer the related lists of the records to be deleted, to the primary record's related list + if(method_exists($focus, 'transferRelatedRecords')){ + $focus->transferRelatedRecords($module,$del_value,$merge_id); + } else { + transferRelatedRecords($module,$del_value,$merge_id); + } + + // Delete the records by id specified in the list + foreach($del_value as $value) + { + DeleteEntity($_REQUEST['module'],$_REQUEST['return_module'],$focus,$value,""); + } + } + + ?> + +assign("EDIT_DUPLICATE",""); + if($record_count == 2) { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + else { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[2]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[2]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + + $all_values_array=getRecordValues($exploded_id,$module); + $all_values=$all_values_array[0]; + $js_arr_val=$all_values_array[1]; + $fld_array=$all_values_array[2]; + $js_arr=implode(",",$js_arr_val); + + $imported_records = Array(); + $sql="select bean_id from vtiger_users_last_import where bean_type=? and deleted=0"; + $result = $adb->pquery($sql, array($module)); + $num_rows=$adb->num_rows($result); + $count=0; + for($i=0; $i<$num_rows;$i++) + { + foreach($exploded_id as $value) + if($value == $adb->query_result($result,$i,"bean_id")) + $count++; + array_push($imported_records,$adb->query_result($result,$i,"bean_id")); + } + + if ($record_count == $count) + $no_existing=1; + else + $no_existing=0; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("RECORD_COUNT",$record_count); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULENAME", $module); + $smarty->assign("PARENT_TAB", $parent_tab); + $smarty->assign("JS_ARRAY", $js_arr); + $smarty->assign("ID_ARRAY", $exploded_id); + $smarty->assign("IDSTRING",$idstring); + $smarty->assign("ALLVALUES", $all_values); + $smarty->assign("FIELD_ARRAY", $fld_array); + $smarty->assign("IMPORTED_RECORDS", $imported_records); + $smarty->assign("NO_EXISTING", $no_existing); + $smarty->display("MergeFields.tpl"); +} + +?> diff --git a/oss/vtiger/trunk/modules/Accounts/QuickCreate.php b/oss/vtiger/trunk/modules/Accounts/QuickCreate.php new file mode 100644 index 00000000..8d5998b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/QuickCreate.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Accounts/Save.php b/oss/vtiger/trunk/modules/Accounts/Save.php new file mode 100644 index 00000000..9b03c92c --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/Save.php @@ -0,0 +1,217 @@ +pquery($query, $params); + if($adb->num_rows($result) > 0) + { + echo $mod_strings['LBL_ACCOUNT_EXIST']; + } + else + { + echo 'SUCCESS'; + } + die; +} +//Ended + +$local_log =& LoggerManager::getLogger('index'); +global $log; +$focus = new Accounts(); +global $current_user; +$currencyid=fetchCurrency($current_user->id); +$rate_symbol = getCurrencySymbolandCRate($currencyid); +$rate = $rate_symbol['rate']; +$curr_symbol = $rate_symbol['symbol']; +if(isset($_REQUEST['record'])) +{ + $focus->id = $_REQUEST['record']; +$log->info("id is ".$focus->id); +} +if(isset($_REQUEST['mode'])) +{ + $focus->mode = $_REQUEST['mode']; +} + +foreach($focus->column_fields as $fieldname => $val) +{ + if(isset($_REQUEST[$fieldname])) + { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + $log->DEBUG($fieldname."=Field Name &first& Value =".$value); + $focus->column_fields[$fieldname] = $value; + } +} + +if(isset($_REQUEST['annual_revenue'])) +{ + $value = convertToDollar($_REQUEST['annual_revenue'],$rate); + $focus->column_fields['annual_revenue'] = $value; +} + +if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} + +//When changing the Account Address Information it should also change the related contact address - dina +if($focus->mode == 'edit' && $_REQUEST['address_change'] == 'yes') +{ + $query = "update vtiger_contactaddress set mailingcity=?,mailingstreet=?,mailingcountry=?,mailingzip=?,mailingpobox=?,mailingstate=?,othercountry=?,othercity=?,otherstate=?,otherzip=?,otherstreet=?,otherpobox=? where contactaddressid in (select contactid from vtiger_contactdetails where accountid=?)" ; + $params = array($focus->column_fields['bill_city'], $focus->column_fields['bill_street'], $focus->column_fields['bill_country'], + $focus->column_fields['bill_code'], $focus->column_fields['bill_pobox'], $focus->column_fields['bill_state'], $focus->column_fields['ship_country'], + $focus->column_fields['ship_city'], $focus->column_fields['ship_state'], $focus->column_fields['ship_code'], $focus->column_fields['ship_street'], + $focus->column_fields['ship_pobox'], $focus->id); + $adb->pquery($query, $params); +} +//Changing account address - Ends + +$focus->save("Accounts"); +$return_id = $focus->id; + +$parenttab = getParentTab(); +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "Accounts"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + +$local_log->debug("Saved record with id of ".$return_id); + +//code added for returning back to the current view after edit from list view +if($_REQUEST['return_viewname'] == '') $return_viewname='0'; +if($_REQUEST['return_viewname'] != '')$return_viewname=vtlib_purify($_REQUEST['return_viewname']); + +//Send notification mail to the assigned to owner about the vtiger_account creation +if($focus->column_fields['notify_owner'] == 1 || $focus->column_fields['notify_owner'] == 'on') + $status = sendNotificationToOwner('Accounts',$focus); + +header("Location: index.php?action=$return_action&module=$return_module&parenttab=$parenttab&record=$return_id&viewname=$return_viewname&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +/** Function to save Accounts custom field info into database +* @param integer $entity_id - accountid +*/ +function save_customfields($entity_id) +{ + global $log; + $log->debug("Entering save_customfields(".$entity_id.") method ..."); + $log->info("save customfields invoked"); + global $adb; + $dbquery = "SELECT * FROM customfields WHERE module = 'Accounts'"; + $result = $adb->pquery($dbquery, array()); + + $custquery = "SELECT * FROM vtiger_accountcf WHERE vtiger_accountid = ?"; + $cust_result = $adb->pquery($custquery, array($entity_id)); + if($adb->num_rows($result) != 0) + { + + $columns=''; + $values=''; + $ins_params = array(); + $update=''; + $upd_params = array(); + + $noofrows = $adb->num_rows($result); + for($i=0; $i<$noofrows; $i++) + { + $fldName=$adb->query_result($result,$i,"fieldlabel"); + $colName=$adb->query_result($result,$i,"column_name"); + if(isset($_REQUEST[$colName])) + { + $fldvalue=$_REQUEST[$colName]; + if(get_magic_quotes_gpc() == 1) + { + $fldvalue = stripslashes($fldvalue); + } + } + else + { + $fldvalue = ''; + } + + if(isset($_REQUEST['record']) && $_REQUEST['record'] != '' && $adb->num_rows($cust_result) !=0) + { + //Update Block + if($i == 0) + { + $update = $colName."=?"; + array_push($upd_params, $fldvalue); + } + else + { + $update .= ', '.$colName."=?"; + array_push($upd_params, $fldvalue); + } + } + else + { + //Insert Block + if($i == 0) + { + $columns='accountid, '.$colName; + array_push($ins_params, $entity_id, $fldvalue); + } + else + { + $columns .= ', '.$colName; + array_push($ins_params, $fldvalue); + } + } + } + if(isset($_REQUEST['record']) && $_REQUEST['record'] != '' && $adb->num_rows($cust_result) !=0) + { + //Update Block + $query = "UPDATE vtiger_accountcf SET $update WHERE vtiger_accountid=?"; + array_push($upd_params, $entity_id); + $adb->pquery($query, $upd_params); + } + else + { + //Insert Block + $query = "INSERT INTO vtiger_accountcf ($columns) VALUES(" . generateQuestionMarks($ins_params) .")"; + $adb->pquery($query, $ins_params); + } + + } + $log->debug("Exiting save_customfields method ..."); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Accounts/Settings.php b/oss/vtiger/trunk/modules/Accounts/Settings.php new file mode 100644 index 00000000..48a80c0b --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/Settings.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Accounts/TagCloud.php b/oss/vtiger/trunk/modules/Accounts/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Accounts/Tickerdetail.php b/oss/vtiger/trunk/modules/Accounts/Tickerdetail.php new file mode 100644 index 00000000..2577bdd6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/Tickerdetail.php @@ -0,0 +1,100 @@ + + Company Report + +
+
+ + + + + + + + + '; + $output .=''; + $output .= ' + +
'.$comp.'
'; + $output .='
'; + foreach($first_array as $arr => $val) + { + $output .= ''; + for($j=0;$j + '; + } + $output .= ''; + } + $output .='
'.$val[$j+1].'
'; + array_shift($second_array[0]); + array_shift($second_array[0]); + foreach($second_array as $arr => $val) + { + $output .= ''; + for($j=0;$j + '; + } + $output .= ''; + } + $output .='
'.$val[$j+1].'
[Chart]
 
'; + $output .= ' + + + + + + + + +
BUSINESS SUMMARY
+
+ + +
+
+
+ '; +echo $output; +} +else +{ + $output = ''; + $output .= "
"; + $output .= "".$data.""; + $output .= "
"; + echo $output; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Accounts/UnifiedSearch.php b/oss/vtiger/trunk/modules/Accounts/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Accounts/index.php b/oss/vtiger/trunk/modules/Accounts/index.php new file mode 100644 index 00000000..87ea1151 --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/index.php @@ -0,0 +1,57 @@ + + diff --git a/oss/vtiger/trunk/modules/Accounts/language/en_us.lang.php b/oss/vtiger/trunk/modules/Accounts/language/en_us.lang.php new file mode 100644 index 00000000..1468183c --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/language/en_us.lang.php @@ -0,0 +1,242 @@ +'Accounts', +'LBL_MODULE_TITLE'=>'Accounts: Home', +'LBL_SEARCH_FORM_TITLE'=>'Account Search', +'LBL_LIST_FORM_TITLE'=>'Account List', +'LBL_NEW_FORM_TITLE'=>'New Account', +'LBL_MEMBER_ORG_FORM_TITLE'=>'Member Organizations', +// Label for Top Accounts in Home Page, added for 4.2 GA +'LBL_TOP_ACCOUNTS'=>'My Top Accounts', +'LBL_TOP_AMOUNT'=>'Amount', +'LBL_LIST_ACCOUNT_NAME'=>'Account Name', +'LBL_LIST_CITY'=>'City', +'LBL_LIST_WEBSITE'=>'Website', +'LBL_LIST_STATE'=>'State', +'LBL_LIST_PHONE'=>'Phone', +'LBL_LIST_EMAIL_ADDRESS'=>'Email Address', +'LBL_LIST_CONTACT_NAME'=>'Contact Name', +'LBL_LIST_AMOUNT' => 'Total Amount', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + +'LBL_ACCOUNT'=>'Account:', +'LBL_ACCOUNT_NAME'=>'Account Name:', +'LBL_PHONE'=>'Phone:', +'LBL_WEBSITE'=>'Website:', +'LBL_FAX'=>'Fax:', +'LBL_TICKER_SYMBOL'=>'Ticker Symbol:', +'LBL_OTHER_PHONE'=>'Other Phone:', +'LBL_ANY_PHONE'=>'Any Phone:', +'LBL_MEMBER_OF'=>'Member of:', +'LBL_EMAIL'=>'Email:', +'LBL_EMPLOYEES'=>'Employees:', +'LBL_OTHER_EMAIL_ADDRESS'=>'Other Email:', +'LBL_ANY_EMAIL'=>'Any Email:', +'LBL_OWNERSHIP'=>'Ownership:', +'LBL_RATING'=>'Rating:', +'LBL_INDUSTRY'=>'Industry:', +'LBL_SIC_CODE'=>'SIC Code:', +'LBL_TYPE'=>'Type:', +'LBL_ANNUAL_REVENUE'=>'Annual Revenue:', +'LBL_ADDRESS_INFORMATION'=>'Address Information', +'LBL_ACCOUNT_INFORMATION'=>'Account Information', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', +'LBL_BILLING_ADDRESS'=>'Billing Address:', +'LBL_SHIPPING_ADDRESS'=>'Shipping Address:', +'LBL_ANY_ADDRESS'=>'Any Address:', +'LBL_CITY'=>'City:', +'LBL_STATE'=>'State:', +'LBL_POSTAL_CODE'=>'Postal Code:', +'LBL_COUNTRY'=>'Country:', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', +'LBL_DESCRIPTION'=>'Description:', +'NTC_COPY_BILLING_ADDRESS'=>'Copy billing address to shipping address', +'NTC_COPY_SHIPPING_ADDRESS'=>'Copy shipping address to billing address', +'NTC_REMOVE_MEMBER_ORG_CONFIRMATION'=>'Are you sure you want to remove this record as a member organization?', +'LBL_DUPLICATE'=>'Potential Duplicate Accounts', +'MSG_DUPLICATE' => 'Creating this vtiger_account may vtiger_potentialy create a duplicate vtiger_account. You may either select an vtiger_account from the list below or you may click on Create New Account to continue creating a new vtiger_account with the previously entered data.', + +'LBL_INVITEE'=>'Contacts', +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", + +'LBL_SELECT_ACCOUNT'=>'Select Account', +'LBL_GENERAL_INFORMATION'=>'General Information', + +//for v4 release added +'LBL_NEW_POTENTIAL'=>'New Potential', +'LBL_POTENTIAL_TITLE'=>'Potentials', + +'LBL_NEW_TASK'=>'New Task', +'LBL_TASK_TITLE'=>'Tasks', +'LBL_NEW_CALL'=>'New Call', +'LBL_CALL_TITLE'=>'Calls', +'LBL_NEW_MEETING'=>'New Meeting', +'LBL_MEETING_TITLE'=>'Meetings', +'LBL_NEW_EMAIL'=>'New Email', +'LBL_EMAIL_TITLE'=>'Emails', +'LBL_NEW_CONTACT'=>'New Contact', +'LBL_CONTACT_TITLE'=>'Contacts', + +//Added vtiger_fields after RC1 - Release +'LBL_ALL'=>'All', +'LBL_PROSPECT'=>'Prospect', +'LBL_INVESTOR'=>'Investor', +'LBL_RESELLER'=>'Reseller', +'LBL_PARTNER'=>'Partner', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Account Tools', +//Added for 4GA +'Account Name'=>'Account Name', +'Phone'=>'Phone', +'Website'=>'Website', +'Fax'=>'Fax', +'Ticker Symbol'=>'Ticker Symbol', +'Other Phone'=>'Other Phone', +'Member Of'=>'Member Of', +'Email'=>'Email', +'Employees'=>'Employees', +'Other Email'=>'Other Email', +'Ownership'=>'Ownership', +'Rating'=>'Rating', +'industry'=>'Industry', +'SIC Code'=>'SIC Code', +'Type'=>'Type', +'Annual Revenue'=>'Annual Revenue', +'Assigned To'=>'Assigned To', +'Billing Address'=>'Billing Address', +'Shipping Address'=>'Shipping Address', +'Billing City'=>'Billing City', +'Shipping City'=>'Shipping City', +'Billing State'=>'Billing State', +'Shipping State'=>'Shipping State', +'Billing Code'=>'Billing Postal Code', +'Shipping Code'=>'Shipping Postal Code', +'Billing Country'=>'Billing Country', +'Shipping Country'=>'Shipping Country', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Description'=>'Description', +'Shipping Po Box'=>'Shipping PO Box', +'Billing Po Box'=>'Billing PO Box', + +//Added after 4.2 patch 2 +'Email Opt Out'=>'Email Opt Out', +'LBL_EMAIL_OPT_OUT'=>'Email Opt Out:', + +//Added after 5Alpha5 +'Notify Owner'=>'Notify Owner', + +//Added for existing picklist entries + +'--None--'=>'--None--', + +'Acquired'=>'Acquired', +'Active'=>'Active', +'Market Failed'=>'Market Failed', +'Project Cancelled'=>'Project Cancelled', +'Shutdown'=>'Shutdown', + +'Apparel'=>'Apparel', +'Banking'=>'Banking', +'Biotechnology'=>'Biotechnology', +'Chemicals'=>'Chemicals', +'Communications'=>'Communications', +'Construction'=>'Construction', +'Consulting'=>'Consulting', +'Education'=>'Education', +'Electronics'=>'Electronics', +'Energy'=>'Energy', +'Engineering'=>'Engineering', +'Entertainment'=>'Entertainment', +'Environmental'=>'Environmental', +'Finance'=>'Finance', +'Food & Beverage'=>'Food & Beverage', +'Government'=>'Government', +'Healthcare'=>'Healthcare', +'Hospitality'=>'Hospitality', +'Insurance'=>'Insurance', +'Machinery'=>'Machinery', +'Manufacturing'=>'Manufacturing', +'Media'=>'Media', +'Not For Profit'=>'Not For Profit', +'Recreation'=>'Recreation', +'Retail'=>'Retail', +'Shipping'=>'Shipping', +'Technology'=>'Technology', +'Telecommunications'=>'Telecommunications', +'Transportation'=>'Transportation', +'Utilities'=>'Utilities', +'Other'=>'Other', + +'Analyst'=>'Analyst', +'Competitor'=>'Competitor', +'Customer'=>'Customer', +'Integrator'=>'Integrator', +'Investor'=>'Investor', +'Partner'=>'Partner', +'Press'=>'Press', +'Prospect'=>'Prospect', +'Reseller'=>'Reseller', +'LBL_START_DATE' => 'Start Date', +'LBL_END_DATE' => 'End Date', + +// Added/Updated for vtiger CRM 5.0.4 + +//added to fix the issue #4081 +'LBL_ACCOUNT_EXIST' => 'Account Name Already Exists!', + +// mailer export +'LBL_MAILER_EXPORT' => 'Mailer Export', +'LBL_MAILER_EXPORT_CONTACTS_TYPE'=>'Select Contacts:', +'LBL_MAILER_EXPORT_CONTACTS_DESCR'=>'Contacts can also be selected via "Custom Fields" and some standard fields.', +'LBL_MAILER_EXPORT_RESULTS_TYPE'=>'Select export type:', +'LBL_MAILER_EXPORT_RESULTS_DESCR'=>'The data will gathered from the Accounts and their Contacts, that were returned + from the previous search.', +'LBL_EXPORT_RESULTS_EMAIL' => 'Export E-Mailer data', +'LBL_EXPORT_RESULTS_EMAIL_CORP'=>'Export E-Mail data, using "Company Email" from the Account if the Contacts "Email" is empty', +'LBL_EXPORT_RESULTS_FULL'=>'Export data with the Contacts, E-Mail, Account name, Address, Telephone, etc.', +'LBL_EXPORT_RESULTS_GO'=>'Export', +'LBL_MAILER_EXPORT_IGNORE' => '--ignore--', +'LBL_MAILER_EXPORT_CHECKED' =>'Checked', +'LBL_MAILER_EXPORT_NOTCHECKED' => 'Not Checked', + +// Added after 5.0.4 GA + +//Module Sequence Numbering +'Account No'=>'Account No', +// END + +// Account Hierarchy +'LBL_SHOW_ACCOUNT_HIERARCHY' => 'Show Account Hierarchy', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Accounts/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Accounts/language/zh_cn.lang.php new file mode 100644 index 00000000..df2fa0e8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/language/zh_cn.lang.php @@ -0,0 +1,240 @@ + '客户', + 'LBL_MODULE_TITLE' => '客户: 首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻客户', + 'LBL_LIST_FORM_TITLE' => '客户列表', + 'LBL_NEW_FORM_TITLE' => '新增客户', + 'LBL_MEMBER_ORG_FORM_TITLE' => '成员组织性质', +// Label for Top Accounts in Home Page, added for 4.2 GA + 'LBL_TOP_ACCOUNTS' => '我的重要客户', + 'LBL_TOP_AMOUNT' => '金额', + 'LBL_LIST_ACCOUNT_NAME' => '客户名称', + 'LBL_LIST_CITY' => '乡镇市区', + 'LBL_LIST_WEBSITE' => '网站', + 'LBL_LIST_STATE' => '县市', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_EMAIL_ADDRESS' => '电子邮件地址', + 'LBL_LIST_CONTACT_NAME' => '联系人姓名', + 'LBL_LIST_AMOUNT' => '机会总计', + +//DON'T CONVERT THESE THEY ARE MAPPINGS + 'db_name' => 'LBL_LIST_ACCOUNT_NAME', + 'db_website' => 'LBL_LIST_WEBSITE', + 'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + + 'LBL_ACCOUNT' => '客户:', + 'LBL_ACCOUNT_NAME' => '客户名称:', + 'LBL_PHONE' => '电话:', + 'LBL_WEBSITE' => '网站:', + 'LBL_FAX' => '传真:', + 'LBL_TICKER_SYMBOL' => '传票符号:', + 'LBL_OTHER_PHONE' => '其它电话:', + 'LBL_ANY_PHONE' => '其它电话:', + 'LBL_MEMBER_OF' => '成员:', + 'LBL_EMAIL' => '电子邮件:', + 'LBL_EMPLOYEES' => '员工:', + 'LBL_OTHER_EMAIL_ADDRESS' => '其它电子邮件:', + 'LBL_ANY_EMAIL' => '其它电子邮件:', + 'LBL_OWNERSHIP' => '所有者:', + 'LBL_RATING' => '评价:', + 'LBL_INDUSTRY' => '行业别:', + 'LBL_SIC_CODE' => '统一编号:', + 'LBL_TYPE' => '类型:', + 'LBL_ANNUAL_REVENUE' => '年营业额:', + 'LBL_ADDRESS_INFORMATION' => '地址信息', + 'LBL_ACCOUNT_INFORMATION' => '账号信息', + 'LBL_CUSTOM_INFORMATION' => '客户信息', + 'LBL_BILLING_ADDRESS' => '账单地址:', + 'LBL_SHIPPING_ADDRESS' => '送货地址:', + 'LBL_ANY_ADDRESS' => '其它地址:', + 'LBL_CITY' => '乡镇市区:', +'LBL_STATE' => '县市:', + 'LBL_POSTAL_CODE' => '邮政编码:', + 'LBL_COUNTRY' => '国家:', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息', + 'LBL_DESCRIPTION' => '描述:', + 'NTC_COPY_BILLING_ADDRESS' => '复制账单地址内容到送货地址', + 'NTC_COPY_SHIPPING_ADDRESS' => '复制送货地址内容到账单地址', + 'NTC_REMOVE_MEMBER_ORG_CONFIRMATION' => '您确定要删除这笔成员/组织的记录吗?', + 'LBL_DUPLICATE' => '复制潜在案件客户', + 'MSG_DUPLICATE' => '由潜在案件客户中复制建立新客户,您可以点选客户列表中的客户以复制建立新的客户,并且继承它的相关数据。', + + 'LBL_INVITEE' => '联系人', + 'ERR_DELETE_RECORD' => '要删除账号您必须指定一笔记录编号.', + + 'LBL_SELECT_ACCOUNT' => '选择客户', + 'LBL_GENERAL_INFORMATION' => '主要信息', + +//for v4 release added + 'LBL_NEW_POTENTIAL' => '新增潜在案件', + 'LBL_POTENTIAL_TITLE' => '潜在案件', + +'LBL_NEW_TASK' => '新增任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => '新增电话记录', + 'LBL_CALL_TITLE' => '电话记录', + 'LBL_NEW_MEETING' => '新增会议记录', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '新增电子邮件', + 'LBL_EMAIL_TITLE' => '邮件', + 'LBL_NEW_CONTACT' => '新增联系人', + 'LBL_CONTACT_TITLE' => '联系人', + +//Added vtiger_fields after RC1 - Release + 'LBL_ALL' => '全部', + 'LBL_PROSPECT' => '期望', + 'LBL_INVESTOR' => '投资者', + 'LBL_RESELLER' => '转售人', + 'LBL_PARTNER' => '伙伴', + +// Added for 4GA + 'LBL_TOOL_FORM_TITLE' => '客户工具', +//Added for 4GA + 'Account Name' => '客户名称', + 'Phone' => '电话', + 'Website' => '网址', + 'Fax' => '传真', + 'Ticker Symbol' => '传票符号', + 'Other Phone' => '其它电话', + 'Member Of' => '成员', + 'Email' => '电子邮件', + 'Employees' => '员工', + 'Other Email' => '其它电子邮件', + 'Ownership' => '拥有者', + 'Rating' => '评价', + 'industry' => '行业别', + 'SIC Code' => '统一编号', + 'Type' => '类型', + 'Annual Revenue' => '年营业额', + 'Assigned To' => '负责人', + 'Billing Address' => '账单地址', + 'Shipping Address' => '送货地址', + 'Billing City' => '乡镇市区', + 'Shipping City' => '乡镇市区', + 'Billing State' => '县市', + 'Shipping State' => '县市', + 'Billing Code' => '邮政编码', + 'Shipping Code' => '邮政编码', + 'Billing Country' => '国家', + 'Shipping Country' => '国家', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'Description' => '描述', + 'Shipping Po Box' => '付款地址采购订单信箱', + 'Billing Po Box' => '付款地址采购订单信箱', + +//Added after 4.2 patch 2 + 'Email Opt Out' => '拒绝电子邮件打扰', + 'LBL_EMAIL_OPT_OUT' => '拒绝电子邮件打扰:', + +//Added after 5Alpha5 + 'Notify Owner' => '提醒负责人', + +//Added for existing picklist entries + + '--None--' => '-- 无 --', + + 'Acquired' => '取得', + 'Active' => '启用', + 'Market Failed' => '市场失利', + 'Project Cancelled' => '项目取消', + 'Shutdown' => '关闭', + +'Apparel' => '存在', + 'Banking' => '银行', + 'Biotechnology' => '生物科技', + 'Chemicals' => '化学', + 'Communications' => '交通', + 'Construction' => '建筑', + 'Consulting' => '顾问', + 'Education' => '教育', + 'Electronics' => '电子', + 'Energy' => '能源', + 'Engineering' => '工程', + 'Entertainment' => '娱乐', + 'Environmental' => '环境', + 'Finance' => '财务', + 'Food & Beverage' => '饮食', + 'Government' => '政府', + 'Healthcare' => '健康照护', + 'Hospitality' => '医院', + 'Insurance' => '保险', + 'Machinery' => '机械', + 'Manufacturing' => '工厂', + 'Media' => '媒体', + 'Not For Profit' => '非营利', + 'Recreation' => '娱乐中心', + 'Retail' => '零售', + 'Shipping' => '运输', + 'Technology' => '科技', + 'Telecommunications' => '通讯', + 'Transportation' => '传输', + 'Utilities' => '工具', + 'Other' => '其它', + + 'Analyst' => '分析师', + 'Competitor' => '竞争者', + 'Customer' => '客户', + 'Integrator' => '整合者', + 'Investor' => '投资者', + 'Partner' => '伙伴', + 'Press' => '新闻', + 'Prospect' => '潜在客户', + 'Reseller' => '盘商', + 'LBL_START_DATE' => '开始日期', + 'LBL_END_DATE' => '结束日期', + +//added to fix the issue #4081 +'LBL_ACCOUNT_EXIST' => '帐户名称已存在!', + +// mailer export +'LBL_MAILER_EXPORT' => '邮寄导出', +'LBL_MAILER_EXPORT_CONTACTS_TYPE'=>'选择通讯录:', +'LBL_MAILER_EXPORT_CONTACTS_DESCR'=>'联络可能被选择通过"自定义字段"和一些标准字段。.', +'LBL_MAILER_EXPORT_RESULTS_TYPE'=>'选择导出类型:', +'LBL_MAILER_EXPORT_RESULTS_DESCR'=>'聚集从账户及其联系人的数据, 还给前次搜索.', +'LBL_EXPORT_RESULTS_EMAIL' => '导出邮件联系人数据', +'LBL_EXPORT_RESULTS_EMAIL_CORP'=>'导出邮件数据, 如果联系人"电邮"为空则用"公司电邮"', +'LBL_EXPORT_RESULTS_FULL'=>'导出联系人数据,电子邮件帐户名称,地址,电话等.', + +'LBL_EXPORT_RESULTS_GO'=>'导出', +'LBL_MAILER_EXPORT_IGNORE' => '--忽略--', +'LBL_MAILER_EXPORT_CHECKED' =>'检查', +'LBL_MAILER_EXPORT_NOTCHECKED' => '不进行检查', + +// Added after 5.0.4 GA + +//Module Sequence Numbering +'Account No'=>'帐号', +// END + +// Account Hierarchy +'LBL_SHOW_ACCOUNT_HIERARCHY' => '查看账号级别', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Accounts/updateRelations.php b/oss/vtiger/trunk/modules/Accounts/updateRelations.php new file mode 100644 index 00000000..1d2c0dc4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Accounts/updateRelations.php @@ -0,0 +1,50 @@ +pquery("insert into vtiger_senotesrel values (?,?)", array($forCRMRecord,$id)); + elseif($dest_mod == 'Products') + $adb->pquery("insert into vtiger_seproductsrel values(?,?,?)", array($forCRMRecord, $id, $currentModule)); + else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Activities/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Activities/language/zh_cn.lang.php new file mode 100644 index 00000000..74ecf6c3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Activities/language/zh_cn.lang.php @@ -0,0 +1,89 @@ + '活动', + 'LBL_MODULE_TITLE' => '活动:首页', + 'LBL_SEARCH_FORM_TITLE' => '活动查找', + 'LBL_LIST_FORM_TITLE' => '活动列表', + 'LBL_NEW_FORM_TITLE' => '新增活动', + 'LBL_TASK_INFORMATION' => '任务信息', + 'LBL_EVENT_INFORMATION' => '事件信息', + 'LBL_NAME' => '主题:', + 'LBL_CONTACT_NAME' => '联系人:', + 'LBL_OPEN_ACTIVITIES' => '在做的活动', + 'LBL_ACTIVITY' => '活动:', + 'LBL_HISTORY' => '历史纪录', + 'LBL_UPCOMING' => '最近安排', + 'LBL_TODAY' => '显示到时间', + 'LBL_NEW_TASK_BUTTON_TITLE' => '新增任务 [Alt+N]', + 'LBL_NEW_TASK_BUTTON_KEY' => 'N', + 'LBL_NEW_TASK_BUTTON_LABEL' => '新增任务', + 'LBL_SCHEDULE_MEETING_BUTTON_TITLE' => '安排会议 [Alt+M]', + 'LBL_SCHEDULE_MEETING_BUTTON_KEY' => 'M', + 'LBL_SCHEDULE_MEETING_BUTTON_LABEL' => '安排会议', + 'LBL_SCHEDULE_CALL_BUTTON_TITLE' => '安排电话 [Alt+C]', + 'LBL_SCHEDULE_CALL_BUTTON_KEY' => 'C', + 'LBL_SCHEDULE_CALL_BUTTON_LABEL' => '安排电话', + 'LBL_NEW_NOTE_BUTTON_TITLE' => '新增备忘录 [Alt+T]', + 'LBL_NEW_ATTACH_BUTTON_TITLE' => '附加文件 [Alt+F]', + 'LBL_NEW_NOTE_BUTTON_KEY' => 'T', + 'LBL_NEW_ATTACH_BUTTON_KEY' => 'F', + 'LBL_NEW_NOTE_BUTTON_LABEL' => '新增备忘录', + 'LBL_NEW_ATTACH_BUTTON_LABEL' => '附加文件', + 'LBL_TRACK_EMAIL_BUTTON_TITLE' => '撰写邮件 [Alt+K]', + 'LBL_TRACK_EMAIL_BUTTON_KEY' => 'K', + 'LBL_TRACK_EMAIL_BUTTON_LABEL' => '撰写邮件', + 'LBL_LIST_CLOSE' => '完成', + 'LBL_LIST_STATUS' => '状态', + 'LBL_LIST_CONTACT' => '联系人', + 'LBL_LIST_ACCOUNT'=> '客户', + 'LBL_LIST_RELATED_TO' => '相关对象', + 'LBL_LIST_DUE_DATE' => '到期日期', + 'LBL_LIST_DATE' => '日期', + 'LBL_LIST_SUBJECT' => '主题', + 'LBL_LIST_LAST_MODIFIED' => '最新修改', + 'LBL_LIST_RECURRING_TYPE' => '重复类型', + 'ERR_DELETE_RECORD' => '必须指定纪录编号才能删除客户.', + 'NTC_NONE_SCHEDULED' => '沒有安排.', + 'LBL_ATTACHMENTS' => '附件', + 'LBL_NEW_ATTACHMENT' => '新增附件', + 'LBL_ALL' => '所有', + 'LBL_CALL' => '电话', + 'LBL_MEETING' => '会议:', + 'LBL_TASK' => '任务', + 'Subject' => '主题', + 'Assigned To' => '负责人', + 'Start Date & Time' => '开始日期和时间', + 'Time Start' => '开始时间', + 'New Event' => '新增事件', + 'New Task' => '新增事件', + 'Due Date' => '到期日期', + 'Related To' => '相关对象', + 'Contact Name' => '联系人姓名:', + 'Status' => '状态', + 'Priority' => '优先级', + 'Send Notification' => '发送通知', + 'Created Time' => '创建时间', + 'Modified Time' => '修改时间', + 'Activity Type' => '活动类型', + 'Description' => '描述', + 'Duration' => '持续', + 'Duration Minutes' => '持续分钟', + 'Location' => '地点', + 'Send Reminder' => '发送提醒', + 'LBL_YES' => '是', + 'LBL_NO' => '不是', + 'LBL_DAYS' => '天', + 'LBL_MINUTES' => '分钟', + 'LBL_HOURS' => '小时', + 'LBL_BEFORE_EVENT' => '前', + 'Close' => '完成', + 'Start Date' => '开始日期', + 'Type' => '活动类型', + 'End Date' => '结束日期', + 'Recurrence' => '重复事件', + 'Recurring Type' => '重复类型', + 'LBL_NOTIFICATION_ERROR' => '邮件错误:请在 设置=>发送邮件服务器设置 检查您的发送邮件服务器设置或是目前使用者没有设置邮箱', + 'hours/minutes' => '小时/分钟', + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Administration/Forms.php b/oss/vtiger/trunk/modules/Administration/Forms.php new file mode 100644 index 00000000..88f9afd2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Administration/Forms.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Administration/index.php b/oss/vtiger/trunk/modules/Administration/index.php new file mode 100644 index 00000000..55184609 --- /dev/null +++ b/oss/vtiger/trunk/modules/Administration/index.php @@ -0,0 +1,25 @@ + diff --git a/oss/vtiger/trunk/modules/Administration/language/en_us.lang.php b/oss/vtiger/trunk/modules/Administration/language/en_us.lang.php new file mode 100644 index 00000000..114b65a3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Administration/language/en_us.lang.php @@ -0,0 +1,28 @@ +'Administration', +'LBL_MODULE_TITLE'=>'Administration: Home', + +'LBL_NEW_FORM_TITLE'=>'New Account', +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the account.", +); + +?> diff --git a/oss/vtiger/trunk/modules/Administration/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Administration/language/zh_cn.lang.php new file mode 100644 index 00000000..06651422 --- /dev/null +++ b/oss/vtiger/trunk/modules/Administration/language/zh_cn.lang.php @@ -0,0 +1,27 @@ + '管理', + 'LBL_MODULE_TITLE' => '管理: 首页', + 'LBL_NEW_FORM_TITLE' => '新增账号', + 'ERR_DELETE_RECORD' => '在删除账号前必须输入正确的记录编号.', +); + +?> diff --git a/oss/vtiger/trunk/modules/Calendar/Activity.php b/oss/vtiger/trunk/modules/Calendar/Activity.php new file mode 100644 index 00000000..eb3e2535 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/Activity.php @@ -0,0 +1,952 @@ +'crmid','vtiger_activity'=>'activityid','vtiger_seactivityrel'=>'activityid','vtiger_cntactivityrel'=>'activityid','vtiger_salesmanactivityrel'=>'activityid','vtiger_activity_reminder'=>'activity_id','vtiger_recurringevents'=>'activityid','vtiger_activitycf'=>'activityid'); + + var $column_fields = Array(); + var $sortby_fields = Array('subject','due_date','date_start','smownerid','activitytype','lastname'); //Sorting is added for due date and start date + + // This is used to retrieve related vtiger_fields from form posts. + var $additional_column_fields = Array('assigned_user_name', 'assigned_user_id', 'contactname', 'contact_phone', 'contact_email', 'parent_name'); + + /** + * Mandatory table for supporting custom fields. + */ + var $customFieldTable = Array('vtiger_activitycf', 'activityid'); + + // This is the list of vtiger_fields that are in the lists. + var $list_fields = Array( + 'Close'=>Array('activity'=>'status'), + 'Type'=>Array('activity'=>'activitytype'), + 'Subject'=>Array('activity'=>'subject'), + 'Related to'=>Array('seactivityrel'=>'parent_id'), + 'Start Date'=>Array('activity'=>'date_start'), + 'Start Time'=>Array('activity','time_start'), + 'End Date'=>Array('activity'=>'due_date'), + 'End Time'=>Array('activity','time_end'), + 'Recurring Type'=>Array('recurringevents'=>'recurringtype'), + 'Assigned To'=>Array('crmentity'=>'smownerid'), + 'Contact Name'=>Array('contactdetails'=>'lastname') + ); + + var $range_fields = Array( + 'name', + 'date_modified', + 'start_date', + 'id', + 'status', + 'date_due', + 'time_start', + 'description', + 'contact_name', + 'priority', + 'duehours', + 'dueminutes', + 'location' + ); + + + var $list_fields_name = Array( + 'Close'=>'status', + 'Type'=>'activitytype', + 'Subject'=>'subject', + 'Contact Name'=>'lastname', + 'Related to'=>'parent_id', + 'Start Date & Time'=>'date_start', + 'End Date & Time'=>'due_date', + 'Recurring Type'=>'recurringtype', + 'Assigned To'=>'assigned_user_id'); + + var $list_link_field= 'subject'; + + //Added these variables which are used as default order by and sortorder in ListView + var $default_order_by = 'due_date'; + var $default_sort_order = 'ASC'; + + //var $groupTable = Array('vtiger_activitygrouprelation','activityid'); + + function Activity() { + $this->log = LoggerManager::getLogger('Calendar'); + $this->db = PearDatabase::getInstance(); + $this->column_fields = getColumnFields('Calendar'); + } + + function save_module($module) + { + global $adb; + //Handling module specific save + //Insert into seactivity rel + if(isset($this->column_fields['parent_id']) && $this->column_fields['parent_id'] != '') + { + $this->insertIntoEntityTable("vtiger_seactivityrel", $module); + } + elseif($this->column_fields['parent_id']=='' && $insertion_mode=="edit") + { + $this->deleteRelation("vtiger_seactivityrel"); + } + //Insert into cntactivity rel + if(isset($this->column_fields['contact_id']) && $this->column_fields['contact_id'] != '') + { + $this->insertIntoEntityTable('vtiger_cntactivityrel', $module); + } + elseif($this->column_fields['contact_id'] =='' && $insertion_mode=="edit") + { + $this->deleteRelation('vtiger_cntactivityrel'); + } + + $recur_type=''; + if(($recur_type == "--None--" || $recur_type == '') && $this->mode == "edit") + { + $sql = 'delete from vtiger_recurringevents where activityid=?'; + $adb->pquery($sql, array($this->id)); + } + //Handling for recurring type + //Insert into vtiger_recurring event table + if(isset($this->column_fields['recurringtype']) && $this->column_fields['recurringtype']!='' && $this->column_fields['recurringtype']!='--None--') + { + $recur_type = trim($this->column_fields['recurringtype']); + $recur_data = getrecurringObjValue(); + if(is_object($recur_data)) + $this->insertIntoRecurringTable($recur_data); + } + + //Insert into vtiger_activity_remainder table + + $this->insertIntoReminderTable('vtiger_activity_reminder',$module,""); + + //Handling for invitees + $selected_users_string = $_REQUEST['inviteesid']; + $invitees_array = explode(';',$selected_users_string); + $this->insertIntoInviteeTable($module,$invitees_array); + + //Inserting into sales man activity rel + $this->insertIntoSmActivityRel($module); + + $this->insertIntoActivityReminderPopup($module); + } + + + /** Function to insert values in vtiger_activity_reminder_popup table for the specified module + * @param $cbmodule -- module:: Type varchar + */ + function insertIntoActivityReminderPopup($cbmodule) { + + global $adb; + + $cbrecord = $this->id; + if(isset($cbmodule) && isset($cbrecord)) { + $cbdate = $this->column_fields['date_start']; + $cbtime = $this->column_fields['time_start']; + + $reminder_query = "SELECT reminderid FROM vtiger_activity_reminder_popup WHERE semodule = ? and recordid = ?"; + $reminder_params = array($cbmodule, $cbrecord); + $reminderidres = $adb->pquery($reminder_query, $reminder_params); + + $reminderid = null; + if($adb->num_rows($reminderidres) > 0) { + $reminderid = $adb->query_result($reminderidres, 0, "reminderid"); + } + + if(isset($reminderid)) { + $callback_query = "UPDATE vtiger_activity_reminder_popup set status = 0, date_start = ?, time_start = ? WHERE reminderid = ?"; + $callback_params = array($cbdate, $cbtime, $reminderid); + } else { + $callback_query = "INSERT INTO vtiger_activity_reminder_popup (recordid, semodule, date_start, time_start) VALUES (?,?,?,?)"; + $callback_params = array($cbrecord, $cbmodule, $cbdate, $cbtime); + } + + $adb->pquery($callback_query, $callback_params); + } + } + + + /** Function to insert values in vtiger_activity_remainder table for the specified module, + * @param $table_name -- table name:: Type varchar + * @param $module -- module:: Type varchar + */ + function insertIntoReminderTable($table_name,$module,$recurid) + { + global $log; + $log->info("in insertIntoReminderTable ".$table_name." module is ".$module); + if($_REQUEST['set_reminder'] == 'Yes') + { + $log->debug("set reminder is set"); + $rem_days = $_REQUEST['remdays']; + $log->debug("rem_days is ".$rem_days); + $rem_hrs = $_REQUEST['remhrs']; + $log->debug("rem_hrs is ".$rem_hrs); + $rem_min = $_REQUEST['remmin']; + $log->debug("rem_minutes is ".$rem_min); + $reminder_time = $rem_days * 24 * 60 + $rem_hrs * 60 + $rem_min; + $log->debug("reminder_time is ".$reminder_time); + if ($recurid == "") + { + if($_REQUEST['mode'] == 'edit') + { + $this->activity_reminder($this->id,$reminder_time,0,$recurid,'edit'); + } + else + { + $this->activity_reminder($this->id,$reminder_time,0,$recurid,''); + } + } + else + { + $this->activity_reminder($this->id,$reminder_time,0,$recurid,''); + } + } + elseif($_REQUEST['set_reminder'] == 'No') + { + $this->activity_reminder($this->id,'0',0,$recurid,'delete'); + } + } + + + // Code included by Jaguar - starts + /** Function to insert values in vtiger_recurringevents table for the specified tablename,module + * @param $recurObj -- Recurring Object:: Type varchar + */ +function insertIntoRecurringTable(& $recurObj) +{ + global $log,$adb; + $log->info("in insertIntoRecurringTable "); + $st_date = $recurObj->startdate->get_formatted_date(); + $log->debug("st_date ".$st_date); + $end_date = $recurObj->enddate->get_formatted_date(); + $log->debug("end_date is set ".$end_date); + $type = $recurObj->recur_type; + $log->debug("type is ".$type); + $flag="true"; + + if($_REQUEST['mode'] == 'edit') + { + $activity_id=$this->id; + + $sql='select min(recurringdate) AS min_date,max(recurringdate) AS max_date, recurringtype, activityid from vtiger_recurringevents where activityid=? group by activityid, recurringtype'; + $result = $adb->pquery($sql, array($activity_id)); + $noofrows = $adb->num_rows($result); + for($i=0; $i<$noofrows; $i++) + { + $recur_type_b4_edit = $adb->query_result($result,$i,"recurringtype"); + $date_start_b4edit = $adb->query_result($result,$i,"min_date"); + $end_date_b4edit = $adb->query_result($result,$i,"max_date"); + } + if(($st_date == $date_start_b4edit) && ($end_date==$end_date_b4edit) && ($type == $recur_type_b4_edit)) + { + if($_REQUEST['set_reminder'] == 'Yes') + { + $sql = 'delete from vtiger_activity_reminder where activity_id=?'; + $adb->pquery($sql, array($activity_id)); + $sql = 'delete from vtiger_recurringevents where activityid=?'; + $adb->pquery($sql, array($activity_id)); + $flag="true"; + } + elseif($_REQUEST['set_reminder'] == 'No') + { + $sql = 'delete from vtiger_activity_reminder where activity_id=?'; + $adb->pquery($sql, array($activity_id)); + $flag="false"; + } + else + $flag="false"; + } + else + { + $sql = 'delete from vtiger_activity_reminder where activity_id=?'; + $adb->pquery($sql, array($activity_id)); + $sql = 'delete from vtiger_recurringevents where activityid=?'; + $adb->pquery($sql, array($activity_id)); + } + } + $date_array = $recurObj->recurringdates; + if(isset($recurObj->recur_freq) && $recurObj->recur_freq != null) + $recur_freq = $recurObj->recur_freq; + else + $recur_freq = 1; + if($recurObj->recur_type == 'Daily' || $recurObj->recur_type == 'Yearly') + $recurringinfo = $recurObj->recur_type; + elseif($recurObj->recur_type == 'Weekly') + { + $recurringinfo = $recurObj->recur_type; + if($recurObj->dayofweek_to_rpt != null) + $recurringinfo = $recurringinfo.'::'.implode('::',$recurObj->dayofweek_to_rpt); + } + elseif($recurObj->recur_type == 'Monthly') + { + $recurringinfo = $recurObj->recur_type.'::'.$recurObj->repeat_monthby; + if($recurObj->repeat_monthby == 'date') + $recurringinfo = $recurringinfo.'::'.$recurObj->rptmonth_datevalue; + else + $recurringinfo = $recurringinfo.'::'.$recurObj->rptmonth_daytype.'::'.$recurObj->dayofweek_to_rpt[0]; + } + else + { + $recurringinfo = ''; + } + if($flag=="true") + { + for($k=0; $k< count($date_array); $k++) + { + $tdate=$date_array[$k]; + if($tdate <= $end_date) + { + $max_recurid_qry = 'select max(recurringid) AS recurid from vtiger_recurringevents;'; + $result = $adb->pquery($max_recurid_qry, array()); + $noofrows = $adb->num_rows($result); + for($i=0; $i<$noofrows; $i++) + { + $recur_id = $adb->query_result($result,$i,"recurid"); + } + $current_id =$recur_id+1; + $recurring_insert = "insert into vtiger_recurringevents values (?,?,?,?,?,?)"; + $rec_params = array($current_id, $this->id, $tdate, $type, $recur_freq, $recurringinfo); + $adb->pquery($recurring_insert, $rec_params); + if($_REQUEST['set_reminder'] == 'Yes') + { + $this->insertIntoReminderTable("vtiger_activity_reminder",$module,$current_id,''); + } + } + } + } +} + + + /** Function to insert values in vtiger_invitees table for the specified module,tablename ,invitees_array + * @param $table_name -- table name:: Type varchar + * @param $module -- module:: Type varchar + * @param $invitees_array Array + */ + function insertIntoInviteeTable($module,$invitees_array) + { + global $log,$adb; + $log->debug("Entering insertIntoInviteeTable(".$module.",".$invitees_array.") method ..."); + if($this->mode == 'edit'){ + $sql = "delete from vtiger_invitees where activityid=?"; + $adb->pquery($sql, array($this->id)); + } + foreach($invitees_array as $inviteeid) + { + if($inviteeid != '') + { + $query="insert into vtiger_invitees values(?,?)"; + $adb->pquery($query, array($this->id, $inviteeid)); + } + } + $log->debug("Exiting insertIntoInviteeTable method ..."); + + } + + + /** Function to insert values in vtiger_salesmanactivityrel table for the specified module + * @param $module -- module:: Type varchar + */ + + function insertIntoSmActivityRel($module) + { + global $adb; + global $current_user; + if($this->mode == 'edit'){ + $sql = "delete from vtiger_salesmanactivityrel where activityid=?"; + $adb->pquery($sql, array($this->id)); + } + + $user_sql = $adb->pquery("select count(*) as count from vtiger_users where id=?", array($this->column_fields['assigned_user_id'])); + if($adb->query_result($user_sql, 0, 'count') != 0) { + $sql_qry = "insert into vtiger_salesmanactivityrel (smid,activityid) values(?,?)"; + $adb->pquery($sql_qry, array($this->column_fields['assigned_user_id'], $this->id)); + + if(isset($_REQUEST['inviteesid']) && $_REQUEST['inviteesid']!='') + { + $selected_users_string = $_REQUEST['inviteesid']; + $invitees_array = explode(';',$selected_users_string); + foreach($invitees_array as $inviteeid) + { + if($inviteeid != '') + { + $resultcheck = $adb->pquery("select * from vtiger_salesmanactivityrel where activityid=? and smid=?",array($this->id,$inviteeid)); + if($adb->num_rows($resultcheck) != 1){ + $query="insert into vtiger_salesmanactivityrel values(?,?)"; + $adb->pquery($query, array($inviteeid, $this->id)); + } + } + } + } + } +} + + + // Mike Crowe Mod --------------------------------------------------------Default ordering for us + /** + * Function to get sort order + * return string $sorder - sortorder string either 'ASC' or 'DESC' + */ + function getSortOrder() + { + global $log; + $log->debug("Entering getSortOrder() method ..."); + if(isset($_REQUEST['sorder'])) + $sorder = $this->db->sql_escape_string($_REQUEST['sorder']); + else + $sorder = (($_SESSION['ACTIVITIES_SORT_ORDER'] != '')?($_SESSION['ACTIVITIES_SORT_ORDER']):($this->default_sort_order)); + $log->debug("Exiting getSortOrder method ..."); + return $sorder; + } + + /** + * Function to get order by + * return string $order_by - fieldname(eg: 'subject') + */ + function getOrderBy() + { + global $log; + $log->debug("Entering getOrderBy() method ..."); + + $use_default_order_by = ''; + if(PerformancePrefs::getBoolean('LISTVIEW_DEFAULT_SORTING', true)) { + $use_default_order_by = $this->default_order_by; + } + + if (isset($_REQUEST['order_by'])) + $order_by = $this->db->sql_escape_string($_REQUEST['order_by']); + else + $order_by = (($_SESSION['ACTIVITIES_ORDER_BY'] != '')?($_SESSION['ACTIVITIES_ORDER_BY']):($use_default_order_by)); + $log->debug("Exiting getOrderBy method ..."); + return $order_by; + } + // Mike Crowe Mod -------------------------------------------------------- + + + +//Function Call for Related List -- Start + /** + * Function to get Activity related Contacts + * @param integer $id - activityid + * returns related Contacts record in array format + */ + function get_contacts($id, $cur_tab_id, $rel_tab_id, $actions=false) { + global $log, $singlepane_view,$currentModule,$current_user; + $log->debug("Entering get_contacts(".$id.") method ..."); + $this_module = $currentModule; + + $related_module = vtlib_getModuleNameById($rel_tab_id); + require_once("modules/$related_module/$related_module.php"); + $other = new $related_module(); + vtlib_setup_modulevars($related_module, $other); + $singular_modname = vtlib_toSingular($related_module); + + $parenttab = getParentTab(); + + $returnset = '&return_module='.$this_module.'&return_action=DetailView&activity_mode=Events&return_id='.$id; + + $search_string = ''; + $button = ''; + + if($actions) { + if(is_string($actions)) $actions = explode(',', strtoupper($actions)); + if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { + $button .= " "; + } + } + + $query = 'select vtiger_users.user_name,vtiger_contactdetails.accountid,vtiger_contactdetails.contactid, vtiger_contactdetails.firstname,vtiger_contactdetails.lastname, vtiger_contactdetails.department, vtiger_contactdetails.title, vtiger_contactdetails.email, vtiger_contactdetails.phone, vtiger_crmentity.crmid, vtiger_crmentity.smownerid, vtiger_crmentity.modifiedtime from vtiger_contactdetails inner join vtiger_cntactivityrel on vtiger_cntactivityrel.contactid=vtiger_contactdetails.contactid inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_contactdetails.contactid left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid where vtiger_cntactivityrel.activityid='.$id.' and vtiger_crmentity.deleted=0'; + + $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); + + if($return_value == null) $return_value = Array(); + $return_value['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_contacts method ..."); + return $return_value; + } + + /** + * Function to get Activity related Users + * @param integer $id - activityid + * returns related Users record in array format + */ + + function get_users($id) { + global $log; + $log->debug("Entering get_contacts(".$id.") method ..."); + global $app_strings; + + $focus = new Users(); + + $button = ''; + + $returnset = '&return_module=Calendar&return_action=CallRelatedList&return_id='.$id; + + $query = 'SELECT vtiger_users.id, vtiger_users.first_name,vtiger_users.last_name, vtiger_users.user_name, vtiger_users.email1, vtiger_users.email2, vtiger_users.status, vtiger_users.is_admin, vtiger_user2role.roleid, vtiger_users.yahoo_id, vtiger_users.phone_home, vtiger_users.phone_work, vtiger_users.phone_mobile, vtiger_users.phone_other, vtiger_users.phone_fax,vtiger_activity.date_start,vtiger_activity.due_date,vtiger_activity.time_start,vtiger_activity.duration_hours,vtiger_activity.duration_minutes from vtiger_users inner join vtiger_salesmanactivityrel on vtiger_salesmanactivityrel.smid=vtiger_users.id inner join vtiger_activity on vtiger_activity.activityid=vtiger_salesmanactivityrel.activityid inner join vtiger_user2role on vtiger_user2role.userid=vtiger_users.id where vtiger_activity.activityid='.$id; + + $return_data = GetRelatedList('Calendar','Users',$focus,$query,$button,$returnset); + + if($return_data == null) $return_data = Array(); + $return_data['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_users method ..."); + return $return_data; + } + + /** + * Function to get activities for given criteria + * @param string $criteria - query string + * returns activity records in array format($list) or null value + */ + function get_full_list($criteria) { + global $log; + $log->debug("Entering get_full_list(".$criteria.") method ..."); + $query = "select vtiger_crmentity.crmid,vtiger_crmentity.smownerid,vtiger_crmentity.setype, vtiger_activity.*, + vtiger_contactdetails.lastname, vtiger_contactdetails.firstname, vtiger_contactdetails.contactid + from vtiger_activity + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid + left join vtiger_cntactivityrel on vtiger_cntactivityrel.activityid= vtiger_activity.activityid + left join vtiger_contactdetails on vtiger_contactdetails.contactid= vtiger_cntactivityrel.contactid + left join vtiger_seactivityrel on vtiger_seactivityrel.activityid = vtiger_activity.activityid + WHERE vtiger_crmentity.deleted=0 ".$criteria; + $result =& $this->db->query($query); + + if($this->db->getRowCount($result) > 0){ + + // We have some data. + while ($row = $this->db->fetchByAssoc($result)) { + foreach($this->list_fields_name as $field) + { + if (isset($row[$field])) { + $this->$field = $row[$field]; + } + else { + $this->$field = ''; + } + } + $list[] = $this; + } + } + if (isset($list)) + { + $log->debug("Exiting get_full_list method ..."); + return $list; + } + else + { + $log->debug("Exiting get_full_list method ..."); + return null; + } + + } + + +//calendarsync + /** + * Function to get meeting count + * @param string $user_name - User Name + * return integer $row["count(*)"] - count + */ + function getCount_Meeting($user_name) + { + global $log; + $log->debug("Entering getCount_Meeting(".$user_name.") method ..."); + $query = "select count(*) from vtiger_activity inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid inner join vtiger_salesmanactivityrel on vtiger_salesmanactivityrel.activityid=vtiger_activity.activityid inner join vtiger_users on vtiger_users.id=vtiger_salesmanactivityrel.smid where user_name=? and vtiger_crmentity.deleted=0 and vtiger_activity.activitytype='Meeting'"; + $result = $this->db->pquery($query, array($user_name),true,"Error retrieving contacts count"); + $rows_found = $this->db->getRowCount($result); + $row = $this->db->fetchByAssoc($result, 0); + $log->debug("Exiting getCount_Meeting method ..."); + return $row["count(*)"]; + } + + function get_calendars($user_name,$from_index,$offset) + { + global $log; + $log->debug("Entering get_calendars(".$user_name.",".$from_index.",".$offset.") method ..."); + $query = "select vtiger_activity.location as location,vtiger_activity.duration_hours as duehours, vtiger_activity.duration_minutes as dueminutes,vtiger_activity.time_start as time_start, vtiger_activity.subject as name,vtiger_crmentity.modifiedtime as date_modified, vtiger_activity.date_start start_date,vtiger_activity.activityid as id,vtiger_activity.status as status, vtiger_crmentity.description as description, vtiger_activity.priority as vtiger_priority, vtiger_activity.due_date as date_due ,vtiger_contactdetails.firstname cfn, vtiger_contactdetails.lastname cln from vtiger_activity inner join vtiger_salesmanactivityrel on vtiger_salesmanactivityrel.activityid=vtiger_activity.activityid inner join vtiger_users on vtiger_users.id=vtiger_salesmanactivityrel.smid left join vtiger_cntactivityrel on vtiger_cntactivityrel.activityid=vtiger_activity.activityid left join vtiger_contactdetails on vtiger_contactdetails.contactid=vtiger_cntactivityrel.contactid inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid where user_name='" .$user_name ."' and vtiger_crmentity.deleted=0 and vtiger_activity.activitytype='Meeting' limit " .$from_index ."," .$offset; + $log->debug("Exiting get_calendars method ..."); + return $this->process_list_query1($query); + } +//calendarsync + /** + * Function to get task count + * @param string $user_name - User Name + * return integer $row["count(*)"] - count + */ + function getCount($user_name) + { + global $log; + $log->debug("Entering getCount(".$user_name.") method ..."); + $query = "select count(*) from vtiger_activity inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid inner join vtiger_salesmanactivityrel on vtiger_salesmanactivityrel.activityid=vtiger_activity.activityid inner join vtiger_users on vtiger_users.id=vtiger_salesmanactivityrel.smid where user_name=? and vtiger_crmentity.deleted=0 and vtiger_activity.activitytype='Task'"; + $result = $this->db->pquery($query,array($user_name), true,"Error retrieving contacts count"); + $rows_found = $this->db->getRowCount($result); + $row = $this->db->fetchByAssoc($result, 0); + + $log->debug("Exiting getCount method ..."); + return $row["count(*)"]; + } + + /** + * Function to get list of task for user with given limit + * @param string $user_name - User Name + * @param string $from_index - query string + * @param string $offset - query string + * returns tasks in array format + */ + function get_tasks($user_name,$from_index,$offset) + { + global $log; + $log->debug("Entering get_tasks(".$user_name.",".$from_index.",".$offset.") method ..."); + $query = "select vtiger_activity.subject as name,vtiger_crmentity.modifiedtime as date_modified, vtiger_activity.date_start start_date,vtiger_activity.activityid as id,vtiger_activity.status as status, vtiger_crmentity.description as description, vtiger_activity.priority as priority, vtiger_activity.due_date as date_due ,vtiger_contactdetails.firstname cfn, vtiger_contactdetails.lastname cln from vtiger_activity inner join vtiger_salesmanactivityrel on vtiger_salesmanactivityrel.activityid=vtiger_activity.activityid inner join vtiger_users on vtiger_users.id=vtiger_salesmanactivityrel.smid left join vtiger_cntactivityrel on vtiger_cntactivityrel.activityid=vtiger_activity.activityid left join vtiger_contactdetails on vtiger_contactdetails.contactid=vtiger_cntactivityrel.contactid inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid where user_name='" .$user_name ."' and vtiger_crmentity.deleted=0 and vtiger_activity.activitytype='Task' limit " .$from_index ."," .$offset; + $log->debug("Exiting get_tasks method ..."); + return $this->process_list_query1($query); + + } + + /** + * Function to process the activity list query + * @param string $query - query string + * return array $response - activity lists + */ + function process_list_query1($query) + { + global $log; + $log->debug("Entering process_list_query1(".$query.") method ..."); + $result =& $this->db->query($query,true,"Error retrieving $this->object_name list: "); + $list = Array(); + $rows_found = $this->db->getRowCount($result); + if($rows_found != 0) + { + $task = Array(); + for($index = 0 , $row = $this->db->fetchByAssoc($result, $index); $row && $index <$rows_found;$index++, $row = $this->db->fetchByAssoc($result, $index)) + + { + foreach($this->range_fields as $columnName) + { + if (isset($row[$columnName])) { + + $task[$columnName] = $row[$columnName]; + } + else + { + $task[$columnName] = ""; + } + } + + $task[contact_name] = return_name($row, 'cfn', 'cln'); + + $list[] = $task; + } + } + + $response = Array(); + $response['list'] = $list; + $response['row_count'] = $rows_found; + $response['next_offset'] = $next_offset; + $response['previous_offset'] = $previous_offset; + + + $log->debug("Exiting process_list_query1 method ..."); + return $response; + } + + /** + * Function to get reminder for activity + * @param integer $activity_id - activity id + * @param string $reminder_time - reminder time + * @param integer $reminder_sent - 0 or 1 + * @param integer $recurid - recuring eventid + * @param string $remindermode - string like 'edit' + */ + function activity_reminder($activity_id,$reminder_time,$reminder_sent=0,$recurid,$remindermode='') + { + global $log; + $log->debug("Entering vtiger_activity_reminder(".$activity_id.",".$reminder_time.",".$reminder_sent.",".$recurid.",".$remindermode.") method ..."); + //Check for vtiger_activityid already present in the reminder_table + $query_exist = "SELECT activity_id FROM ".$this->reminder_table." WHERE activity_id = ?"; + $result_exist = $this->db->pquery($query_exist, array($activity_id)); + + if($remindermode == 'edit') + { + if($this->db->num_rows($result_exist) > 0) + { + $query = "UPDATE ".$this->reminder_table." SET"; + $query .=" reminder_sent = ?, reminder_time = ? WHERE activity_id =?"; + $params = array($reminder_sent, $reminder_time, $activity_id); + } + else + { + $query = "INSERT INTO ".$this->reminder_table." VALUES (?,?,?,?)"; + $params = array($activity_id, $reminder_time, 0, $recurid); + } + } + elseif(($remindermode == 'delete') && ($this->db->num_rows($result_exist) > 0)) + { + $query = "DELETE FROM ".$this->reminder_table." WHERE activity_id = ?"; + $params = array($activity_id); + } + else + { + $query = "INSERT INTO ".$this->reminder_table." VALUES (?,?,?,?)"; + $params = array($activity_id, $reminder_time, 0, $recurid); + } + $this->db->pquery($query,$params,true,"Error in processing vtiger_table $this->reminder_table"); + $log->debug("Exiting vtiger_activity_reminder method ..."); + } + + //Used for vtigerCRM Outlook Add-In + /** + * Function to get tasks to display in outlookplugin + * @param string $username - User name + * return string $query - sql query + */ + function get_tasksforol($username) + { + global $log,$adb; + $log->debug("Entering get_tasksforol(".$username.") method ..."); + global $current_user; + require_once("modules/Users/Users.php"); + $seed_user=new Users(); + $user_id=$seed_user->retrieve_user_id($username); + $current_user=$seed_user; + $current_user->retrieve_entity_info($user_id, 'Users'); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + + if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0) + { + $sql1 = "select tablename,columnname from vtiger_field where tabid=9 and tablename <> 'vtiger_recurringevents' and tablename <> 'vtiger_activity_reminder' and vtiger_field.presence in (0,2)"; + $params1 = array(); + }else + { + $profileList = getCurrentUserProfileList(); + $sql1 = "select tablename,columnname from vtiger_field inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid where vtiger_field.tabid=9 and tablename <> 'vtiger_recurringevents' and tablename <> 'vtiger_activity_reminder' and vtiger_field.displaytype in (1,2,4,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_field.presence in (0,2)"; + $params1 = array(); + if (count($profileList) > 0) { + $sql1 .= " and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .")"; + array_push($params1, $profileList); + } + } + $result1 = $adb->pquery($sql1,$params1); + for($i=0;$i < $adb->num_rows($result1);$i++) + { + $permitted_lists[] = $adb->query_result($result1,$i,'tablename'); + $permitted_lists[] = $adb->query_result($result1,$i,'columnname'); + /*if($adb->query_result($result1,$i,'columnname') == "parentid") + { + $permitted_lists[] = 'vtiger_account'; + $permitted_lists[] = 'accountname'; + }*/ + } + $permitted_lists = array_chunk($permitted_lists,2); + $column_table_lists = array(); + for($i=0;$i < count($permitted_lists);$i++) + { + $column_table_lists[] = implode(".",$permitted_lists[$i]); + } + + $query = "select vtiger_activity.activityid as taskid, ".implode(',',$column_table_lists)." from vtiger_activity inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid + inner join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + left join vtiger_cntactivityrel on vtiger_cntactivityrel.activityid=vtiger_activity.activityid + left join vtiger_contactdetails on vtiger_contactdetails.contactid=vtiger_cntactivityrel.contactid + left join vtiger_seactivityrel on vtiger_seactivityrel.activityid = vtiger_activity.activityid + where vtiger_users.user_name='".$username."' and vtiger_crmentity.deleted=0 and vtiger_activity.activitytype='Task'"; + $log->debug("Exiting get_tasksforol method ..."); + return $query; + } + + /** + * Function to get calendar query for outlookplugin + * @param string $username - User name * return string $query - sql query */ + function get_calendarsforol($user_name) + { + global $log,$adb; + $log->debug("Entering get_calendarsforol(".$user_name.") method ..."); + global $current_user; + require_once("modules/Users/Users.php"); + $seed_user=new Users(); + $user_id=$seed_user->retrieve_user_id($user_name); + $current_user=$seed_user; + $current_user->retrieve_entity_info($user_id, 'Users'); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + + if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0) + { + $sql1 = "select tablename,columnname from vtiger_field where tabid=9 and tablename <> 'vtiger_recurringevents' and tablename <> 'vtiger_activity_reminder' and vtiger_field.presence in (0,2)"; + $params1 = array(); + }else + { + $profileList = getCurrentUserProfileList(); + $sql1 = "select tablename,columnname from vtiger_field inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid where vtiger_field.tabid=9 and tablename <> 'vtiger_recurringevents' and tablename <> 'vtiger_activity_reminder' and vtiger_field.displaytype in (1,2,4,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_field.presence in (0,2)"; + $params1 = array(); + if (count($profileList) > 0) { + $sql1 .= " and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .")"; + array_push($params1,$profileList); + } + } + $result1 = $adb->pquery($sql1, $params1); + for($i=0;$i < $adb->num_rows($result1);$i++) + { + $permitted_lists[] = $adb->query_result($result1,$i,'tablename'); + $permitted_lists[] = $adb->query_result($result1,$i,'columnname'); + if($adb->query_result($result1,$i,'columnname') == "date_start") + { + $permitted_lists[] = 'vtiger_activity'; + $permitted_lists[] = 'time_start'; + } + if($adb->query_result($result1,$i,'columnname') == "due_date") + { + $permitted_lists[] = 'vtiger_activity'; + $permitted_lists[] = 'time_end'; + } + } + $permitted_lists = array_chunk($permitted_lists,2); + $column_table_lists = array(); + for($i=0;$i < count($permitted_lists);$i++) + { + $column_table_lists[] = implode(".",$permitted_lists[$i]); + } + + $query = "select vtiger_activity.activityid as clndrid, ".implode(',',$column_table_lists)." from vtiger_activity + inner join vtiger_salesmanactivityrel on vtiger_salesmanactivityrel.activityid=vtiger_activity.activityid + inner join vtiger_users on vtiger_users.id=vtiger_salesmanactivityrel.smid + left join vtiger_cntactivityrel on vtiger_cntactivityrel.activityid=vtiger_activity.activityid + left join vtiger_contactdetails on vtiger_contactdetails.contactid=vtiger_cntactivityrel.contactid + left join vtiger_seactivityrel on vtiger_seactivityrel.activityid = vtiger_activity.activityid + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid + where vtiger_users.user_name='".$user_name."' and vtiger_crmentity.deleted=0 and vtiger_activity.activitytype='Meeting'"; + $log->debug("Exiting get_calendarsforol method ..."); + return $query; + } + + // Function to unlink all the dependent entities of the given Entity by Id + function unlinkDependencies($module, $id) { + global $log; + + $sql = 'DELETE FROM vtiger_activity_reminder WHERE activity_id=?'; + $this->db->pquery($sql, array($id)); + + $sql = 'DELETE FROM vtiger_recurringevents WHERE activityid=?'; + $this->db->pquery($sql, array($id)); + + parent::unlinkDependencies($module, $id); + } + + // Function to unlink an entity with given Id from another entity + function unlinkRelationship($id, $return_module, $return_id) { + global $log; + if(empty($return_module) || empty($return_id)) return; + + if($return_module == 'Contacts') { + $sql = 'DELETE FROM vtiger_cntactivityrel WHERE contactid = ? AND activityid = ?'; + $this->db->pquery($sql, array($return_id, $id)); + } elseif($return_module == 'HelpDesk') { + $sql = 'DELETE FROM vtiger_seticketsrel WHERE ticketid = ? AND crmid = ?'; + $this->db->pquery($sql, array($return_id, $id)); + } else { + $sql='DELETE FROM vtiger_seactivityrel WHERE activityid=?'; + $this->db->pquery($sql, array($id)); + + $sql = 'DELETE FROM vtiger_crmentityrel WHERE (crmid=? AND relmodule=? AND relcrmid=?) OR (relcrmid=? AND module=? AND crmid=?)'; + $params = array($id, $return_module, $return_id, $id, $return_module, $return_id); + $this->db->pquery($sql, $params); + } + } + + /** + * this function sets the status flag of activity to true or false depending on the status passed to it + * @param string $status - the status of the activity flag to set + * @return:: true if successful; false otherwise + */ + function setActivityReminder($status){ + global $adb; + if($status == "on"){ + $flag = 0; + }elseif($status == "off"){ + $flag = 1; + }else{ + return false; + } + $sql = "update vtiger_activity_reminder_popup set status=1 where recordid=?"; + $adb->pquery($sql, array($this->id)); + return true; + } + + /* + * Function to get the relation tables for related modules + * @param - $secmodule secondary module name + * returns the array with table names and fieldnames storing relations between module and this module + */ + function setRelationTables($secmodule){ + $rel_tables = array ( + "Contacts" => array("vtiger_cntactivityrel"=>array("activityid","contactid"),"vtiger_activity"=>"activityid"), + "Leads" => array("vtiger_seactivityrel"=>array("activityid","crmid"),"vtiger_activity"=>"activityid"), + "Accounts" => array("vtiger_seactivityrel"=>array("activityid","crmid"),"vtiger_activity"=>"activityid"), + "Potentials" => array("vtiger_seactivityrel"=>array("activityid","crmid"),"vtiger_activity"=>"activityid"), + ); + return $rel_tables[$secmodule]; + } + + /* + * Function to get the secondary query part of a report + * @param - $module primary module name + * @param - $secmodule secondary module name + * returns the query string formed on fetching the related data for report for secondary module + */ + function generateReportsSecQuery($module,$secmodule){ + $query = $this->getRelationQuery($module,$secmodule,"vtiger_activity","activityid"); + $query .=" left join vtiger_crmentity as vtiger_crmentityCalendar on vtiger_crmentityCalendar.crmid=vtiger_activity.activityid and vtiger_crmentityCalendar.deleted=0 + left join vtiger_cntactivityrel on vtiger_cntactivityrel.activityid= vtiger_activity.activityid + left join vtiger_contactdetails as vtiger_contactdetailsCalendar on vtiger_contactdetailsCalendar.contactid= vtiger_cntactivityrel.contactid + left join vtiger_activitycf on vtiger_activitycf.activityid = vtiger_crmentity.crmid + left join vtiger_seactivityrel on vtiger_seactivityrel.activityid = vtiger_activity.activityid + left join vtiger_activity_reminder on vtiger_activity_reminder.activity_id = vtiger_activity.activityid + left join vtiger_recurringevents on vtiger_recurringevents.activityid = vtiger_activity.activityid + left join vtiger_crmentity as vtiger_crmentityRelCalendar on vtiger_crmentityRelCalendar.crmid = vtiger_seactivityrel.crmid and vtiger_crmentityRelCalendar.deleted=0 + left join vtiger_account as vtiger_accountRelCalendar on vtiger_accountRelCalendar.accountid=vtiger_crmentityRelCalendar.crmid + left join vtiger_leaddetails as vtiger_leaddetailsRelCalendar on vtiger_leaddetailsRelCalendar.leadid = vtiger_crmentityRelCalendar.crmid + left join vtiger_potential as vtiger_potentialRelCalendar on vtiger_potentialRelCalendar.potentialid = vtiger_crmentityRelCalendar.crmid + left join vtiger_quotes as vtiger_quotesRelCalendar on vtiger_quotesRelCalendar.quoteid = vtiger_crmentityRelCalendar.crmid + left join vtiger_purchaseorder as vtiger_purchaseorderRelCalendar on vtiger_purchaseorderRelCalendar.purchaseorderid = vtiger_crmentityRelCalendar.crmid + left join vtiger_invoice as vtiger_invoiceRelCalendar on vtiger_invoiceRelCalendar.invoiceid = vtiger_crmentityRelCalendar.crmid + left join vtiger_salesorder as vtiger_salesorderRelCalendar on vtiger_salesorderRelCalendar.salesorderid = vtiger_crmentityRelCalendar.crmid + left join vtiger_troubletickets as vtiger_troubleticketsRelCalendar on vtiger_troubleticketsRelCalendar.ticketid = vtiger_crmentityRelCalendar.crmid + left join vtiger_campaign as vtiger_campaignRelCalendar on vtiger_campaignRelCalendar.campaignid = vtiger_crmentityRelCalendar.crmid + left join vtiger_groups as vtiger_groupsCalendar on vtiger_groupsCalendar.groupid = vtiger_crmentityCalendar.smownerid + left join vtiger_users as vtiger_usersCalendar on vtiger_usersCalendar.id = vtiger_crmentityCalendar.smownerid"; + return $query; + } + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/ActivityAjax.php b/oss/vtiger/trunk/modules/Calendar/ActivityAjax.php new file mode 100644 index 00000000..650a151e --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/ActivityAjax.php @@ -0,0 +1,239 @@ +debug("In CalendarAjax file"); +$mysel = vtlib_purify($_REQUEST['view']); +if($_REQUEST['file'] == 'OpenListView') +{ + require_once('Smarty_setup.php'); + $smarty = new vtigerCRM_Smarty; + require_once("modules/Calendar/OpenListView.php"); + $smarty->assign("APP",$app_strings); + $smarty->assign("IMAGE_PATH",$image_path); + if($_REQUEST['mode'] == '0') + { + $activities[0] = getPendingActivities(0); + $smarty->assign("ACTIVITIES",$activities); + $smarty->display("upcomingActivities.tpl"); + } + else if($_REQUEST['mode'] == '1') + { + $activities[1] = getPendingActivities(1); + $smarty->assign("ACTIVITIES",$activities); + $smarty->display("pendingActivities.tpl"); + } + die(); +} +$calendar_arr = Array(); +$calendar_arr['IMAGE_PATH'] = $image_path; +$date_data = array(); +if ( isset($_REQUEST['day'])) +{ + $date_data['day'] = $_REQUEST['day']; +} +if ( isset($_REQUEST['month'])) +{ + $date_data['month'] = $_REQUEST['month']; +} +if ( isset($_REQUEST['week'])) +{ + $date_data['week'] = $_REQUEST['week']; +} +if ( isset($_REQUEST['year'])) +{ + if ($_REQUEST['year'] > 2037 || $_REQUEST['year'] < 1970) + { + print("".$app_strings['LBL_CAL_LIMIT_MSG'].""); + exit; + } + $date_data['year'] = $_REQUEST['year']; +} + + +if((isset($_REQUEST['type']) && $_REQUEST['type'] !='') || (isset($_REQUEST['n_type']) && $_REQUEST['n_type'] !='')) +{ + $type = $_REQUEST['type']; + $n_type = $_REQUEST['n_type']; + $cal_log->debug("type value is:".$type); + if($type == 'minical') + { + $cal_log->debug("going to get mini calendar"); + $temp_module = $currentModule; + $mod_strings = return_module_language($current_language,'Calendar'); + $currentModule = 'Calendar'; + $calendar_arr['IMAGE_PATH'] = $image_path; + $calendar_arr['calendar'] = new Calendar('month',$date_data); + $calendar_arr['view'] = 'month'; + $calendar_arr['size'] = 'small'; + if($current_user->hour_format != '') + $calendar_arr['calendar']->hour_format=$current_user->hour_format; + $calendar_arr['calendar']->add_Activities($current_user); + calendar_layout($calendar_arr); + $mod_strings = return_module_language($current_language,$temp_module); + $currentModule = vtlib_purify($_REQUEST['module']); + } + elseif($type == 'settings') + { + $cal_log->debug("going to get calendar Settings"); + require_once('modules/Calendar/calendar_share.php'); + } + else + { + $subtab = vtlib_purify($_REQUEST['subtab']); + if(empty($mysel)) + { + $mysel = 'day'; + } + $calendar_arr['calendar'] = new Calendar($mysel,$date_data); + + $calendar_arr['view'] = $mysel; + if($calendar_arr['calendar']->view == 'day') + $start_date = $end_date = $calendar_arr['calendar']->date_time->get_formatted_date(); + elseif($calendar_arr['calendar']->view == 'week') + { + $start_date = $calendar_arr['calendar']->slices[0]; + $end_date = $calendar_arr['calendar']->slices[6]; + } + elseif($calendar_arr['calendar']->view == 'month') + { + $start_date = $calendar_arr['calendar']->date_time->getThismonthDaysbyIndex(0); + $end_date = $calendar_arr['calendar']->date_time->getThismonthDaysbyIndex($calendar_arr['calendar']->date_time->daysinmonth - 1); + $start_date = $start_date->get_formatted_date(); + $end_date = $end_date->get_formatted_date(); + } + elseif($calendar_arr['calendar']->view == 'year') + { + $start_date = $calendar_arr['calendar']->date_time->getThisyearMonthsbyIndex(0); + $end_date = $calendar_arr['calendar']->date_time->get_first_day_of_changed_year('increment'); + $start_date = $start_date->get_formatted_date(); + $end_date = $end_date->get_formatted_date(); + } + else + { + die("view:".$calendar_arr['calendar']->view." is not defined"); + } + + if($type == 'change_owner' || $type == 'activity_delete' || $type == 'change_status' || $type == 'activity_postpone' || $n_type == 'nav') + { + if($current_user->hour_format != '') + $calendar_arr['calendar']->hour_format=$current_user->hour_format; + + if($type == 'change_status') + { + $return_id = vtlib_purify($_REQUEST['record']); + if(isset($_REQUEST['status'])) + { + $status = $_REQUEST['status']; + $activity_type = "Task"; + } + elseif(isset($_REQUEST['eventstatus'])) + { + $status = $_REQUEST['eventstatus']; + $activity_type = "Events"; + } + ChangeStatus($status,$return_id,$activity_type); + $mail_data = getActivityMailInfo($return_id,$status,$activity_type); + if($mail_data['sendnotification'] == 1) + { + getEventNotification($activity_type,$mail_data['subject'],$mail_data); + } + $invitee_qry = "select * from vtiger_invitees where activityid=?"; + $invitee_res = $adb->pquery($invitee_qry, array($return_id)); + $count = $adb->num_rows($invitee_res); + if($count != 0) + { + for($j = 0; $j < $count; $j++) + { + $invitees_ids[]= $adb->query_result($invitee_res,$j,"inviteeid"); + + } + $invitees_ids_string = implode(';',$invitees_ids); + sendInvitation($invitees_ids_string,$activity_type,$mail_data['subject'],$mail_data); + } + } + if($type == 'activity_postpone') + { + } + if ($_REQUEST['viewOption'] == 'hourview' && ($mysel == 'day' || $mysel == 'week' || $mysel == 'month' || $mysel == 'year')) + { + $calendar_arr['calendar']->add_Activities($current_user); + } + + if(isset($_REQUEST['viewOption']) && $_REQUEST['viewOption'] != null && $subtab == 'event') + { + if($_REQUEST['viewOption'] == 'hourview') + { + $cal_log->debug("going to get calendar Event HourView"); + if($calendar_arr['view'] == 'day') + { + echo getDayViewLayout($calendar_arr)."####".getEventInfo($calendar_arr,'listcnt'); + } + elseif($calendar_arr['view'] == 'week') + { + echo getWeekViewLayout($calendar_arr)."####".getEventInfo($calendar_arr,'listcnt'); + } + elseif($calendar_arr['view'] == 'month') + { + echo getMonthViewLayout($calendar_arr)."####".getEventInfo($calendar_arr,'listcnt'); + } + elseif($calendar_arr['view'] == 'year') + { + echo getYearViewLayout($calendar_arr)."####".getEventInfo($calendar_arr,'listcnt'); + } + else + { + die("view:".$view['view']." is not defined"); + } + } + elseif($_REQUEST['viewOption'] == 'listview') + { + $cal_log->debug("going to get calendar Event ListView"); + //To get Events List + $activity_arr = getEventList($calendar_arr, $start_date, $end_date); + $activity_list = $activity_arr[0]; + $navigation_arr = $activity_arr[1]; + echo constructEventListView($calendar_arr,$activity_list,$navigation_arr)."####".getEventInfo($calendar_arr,'listcnt'); + } + } + elseif($subtab == 'todo') + { + $cal_log->debug("going to get calendar Todo ListView"); + //To get Todos List + $todo_arr = getTodoList($calendar_arr, $start_date, $end_date); + $todo_list = $todo_arr[0]; + $navigation_arr = $todo_arr[1]; + echo constructTodoListView($todo_list,$calendar_arr,$subtab,$navigation_arr)."####".getTodoInfo($calendar_arr,'listcnt'); + } + } + elseif($type == 'view') + { + checkFileAccess('modules/Calendar/'.$_REQUEST['file'].'.php'); + require_once('modules/Calendar/'.$_REQUEST['file'].'.php'); + } + else + { + die("View option is not defined"); + } + } +} +else +{ + require_once('include/Ajax/CommonAjax.php'); + //die("type is not set"); +} + +?> diff --git a/oss/vtiger/trunk/modules/Calendar/ActivityReminderCallbackAjax.php b/oss/vtiger/trunk/modules/Calendar/ActivityReminderCallbackAjax.php new file mode 100644 index 00000000..86457bc0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/ActivityReminderCallbackAjax.php @@ -0,0 +1,128 @@ +pquery("select * from vtiger_users where id=?",array($current_user->id)); +$active_res = $adb->query_result($active,0,'reminder_interval'); +if($active_res!='None'){ + $reminder_next=$adb->query_result($active,0,"reminder_next_time"); + $lastlogin_time =$adb->query_result($active,0,"date_entered"); + if(empty($reminder_next)) { + $reminder_next = date('Y-m-d H:i'); + } + if(strtotime($lastlogin_time) > strtotime($reminder_next)) { + $reminder_next = $lastlogin_time; + } + $reminder_next_time = strtotime($reminder_next); + $cur_time = mktime(date('H'),date('i'),0,date('m'),date('d'),date('Y')); + + if($reminder_next_time <= $cur_time) + { + $cb_time=$adb->query_result($active,0,"reminder_interval"); + $cb_time = ConvertToMinutes($cb_time); + $cb_mktime = strtotime($reminder_next); + $cbdate1 = date('Y-m-d', strtotime("+$cb_time minutes", $cb_mktime)); + $cbtime1 = date('H:i', strtotime("+$cb_time minutes", $cb_mktime)); + $callback_query = + "SELECT * FROM vtiger_activity_reminder_popup inner join vtiger_crmentity where " . + " vtiger_activity_reminder_popup.status = 0 and " . + " vtiger_activity_reminder_popup.recordid = vtiger_crmentity.crmid " . + " and vtiger_crmentity.smownerid = ".$current_user->id." and vtiger_crmentity.deleted = 0 " . + " and ((DATE_FORMAT(vtiger_activity_reminder_popup.date_start,'%Y-%m-%d') < '" . $cbdate1 . "')" . + " OR ((DATE_FORMAT(vtiger_activity_reminder_popup.date_start,'%Y-%m-%d') = '" . $cbdate1 . "')" . + " AND (TIME_FORMAT(vtiger_activity_reminder_popup.time_start,'%H:%i') <= '" . $cbtime1 . "')))"; + + $result = $adb->query($callback_query); + + $cbrows = $adb->num_rows($result); + if($cbrows > 0) { + for($index = 0; $index < $cbrows; ++$index) { + $reminderid = $adb->query_result($result, $index, "reminderid"); + $cbrecord = $adb->query_result($result, $index, "recordid"); + $cbmodule = $adb->query_result($result, $index, "semodule"); + + $focus = CRMEntity::getInstance($cbmodule); + + if($cbmodule == 'Calendar') { + $focus->retrieve_entity_info($cbrecord,$cbmodule); + + $cbsubject = $focus->column_fields['subject']; + $cbactivitytype = $focus->column_fields['activitytype']; + $cbdate = $focus->column_fields["date_start"]; + $cbtime = $focus->column_fields["time_start"]; + } else { + // For non-calendar records. + $cbsubject = array_values(getEntityName($cbmodule, $cbrecord)); + $cbsubject = $cbsubject[0]; + $cbactivitytype = getTranslatedString($cbmodule, $cbmodule); + $cbdate = $adb->query_result($result, $index, 'date_start'); + $cbtime = $adb->query_result($result, $index, 'time_start'); + } + + if($cbactivitytype=='Task') + $cbstatus = $focus->column_fields["taskstatus"]; + else + $cbstatus = $focus->column_fields["eventstatus"]; + // Appending recordid we can get unique callback dom id for that record. + $popupid = "ActivityReminder_$cbrecord"; + if($cbdate <= date('Y-m-d')){ + if($cbdate == date('Y-m-d') && $cbtime > date('H:i')) $cbcolor = ''; + else $cbcolor= '#FF1515'; + } + $smarty->assign("THEME", $theme); + $smarty->assign("popupid", $popupid); + $smarty->assign("APP", $app_strings); + $smarty->assign("cbreminderid", $reminderid); + $smarty->assign("cbdate", $cbdate); + $smarty->assign("cbtime", $cbtime); + $smarty->assign("cbsubject", $cbsubject); + $smarty->assign("cbmodule", $cbmodule); + $smarty->assign("cbrecord", $cbrecord); + $smarty->assign("cbstatus", $cbstatus); + $smarty->assign("cbcolor", $cbcolor); + $smarty->assign("cblinkdtl", $cblinkdtl); + $smarty->assign("activitytype", $cbactivitytype); + $smarty->display("ActivityReminderCallback.tpl"); + + $mark_reminder_as_read = "UPDATE vtiger_activity_reminder_popup set status = 1 where reminderid = ?"; + $adb->pquery($mark_reminder_as_read, array($reminderid)); + } + } + $reminder_next = date('Y-m-d H:i', strtotime("+$cb_time minutes", $cur_time)); + // NOTE date_entered has CURRENT_TIMESTAMP constraint, so we need to reset when updating the table + $adb->pquery("UPDATE vtiger_users set reminder_next_time=?, date_entered=? where id=?",array($reminder_next, $lastlogin_time, $current_user->id)); + $reminder_interval_reset = (strtotime($reminder_next) - $cur_time) * 1000; + + // NOTE (Overcome Browser's issue): If required comment out the following line if condition below. + // To make popup work fine when interval is set to 1 minute, we need decrement the timeout + // if($reminder_interval_reset / 1000 == 60) $reminder_interval_reset = (40 * 1000); + + echo ""; + } +} +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/ActivityReminderSetupCallbackAjax.php b/oss/vtiger/trunk/modules/Calendar/ActivityReminderSetupCallbackAjax.php new file mode 100644 index 00000000..4ec94824 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/ActivityReminderSetupCallbackAjax.php @@ -0,0 +1,45 @@ +pquery($reminder_query, array($reminderid, $cbmodule, $cbrecord)); + echo ":#:SUCCESS"; + } else { + echo ":#:FAILURE"; + } + } +} + +?> diff --git a/oss/vtiger/trunk/modules/Calendar/Appointment.php b/oss/vtiger/trunk/modules/Calendar/Appointment.php new file mode 100644 index 00000000..8cd69651 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/Appointment.php @@ -0,0 +1,297 @@ +participant = Array(); + $this->participant_state = Array(); + $this->description = ""; + } + + /** To get the events of the specified user and shared events + * @param $userid -- The user Id:: Type integer + * @param $from_datetime -- The start date Obj :: Type Array + * @param $to_datetime -- The end date Obj :: Type Array + * @param $view -- The calendar view :: Type String + * @returns $list :: Type Array + */ + + function readAppointment($userid, &$from_datetime, &$to_datetime, $view) + { + global $current_user,$adb; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + $and = "AND ((vtiger_activity.date_start between ? AND ?) + OR (vtiger_activity.date_start < ? AND vtiger_activity.due_date > ?) + OR (vtiger_activity.due_date between ? AND ?))"; + + $q= "select vtiger_activity.*, vtiger_crmentity.*, case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name FROM vtiger_activity inner join vtiger_crmentity on vtiger_activity.activityid = vtiger_crmentity.crmid left join vtiger_recurringevents on vtiger_activity.activityid=vtiger_recurringevents.activityid left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid WHERE vtiger_crmentity.deleted = 0 and vtiger_activity.activitytype not in ('Emails','Task') $and "; + + // User Select Customization: Changes should made also in (calendayLaout getEventList) and one more BELOW + $query_filter_prefix = calendarview_getSelectedUserFilterQuerySuffix(); + $q .= $query_filter_prefix; + // END + $params = array($from_datetime->get_formatted_date(), $to_datetime->get_formatted_date(), $from_datetime->get_formatted_date(), $from_datetime->get_formatted_date(), $from_datetime->get_formatted_date(), $to_datetime->get_formatted_date()); + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[16] == 3) + { + //Added for User Based Custom View for Calendar + $sec_parameter=getCalendarViewSecurityParameter(); + $q .= $sec_parameter; + } + + $q .= " AND vtiger_recurringevents.activityid is NULL "; + $q .= " group by vtiger_activity.activityid ORDER by vtiger_activity.date_start,vtiger_activity.time_start"; + + $r = $adb->pquery($q, $params); + $n = $adb->getRowCount($r); + $a = 0; + $list = Array(); + + while ( $a < $n ) + { + + $result = $adb->fetchByAssoc($r); + $start_timestamp = strtotime($result["date_start"]); + $end_timestamp = strtotime($result["due_date"]); + if($from_datetime->ts <= $start_timestamp) $from = $start_timestamp; + else $from = $from_datetime->ts; + if($to_datetime->ts <= $end_timestamp) $to = $to_datetime->ts; + else $to = $end_timestamp; + for($j = $from; $j <= $to; $j=$j+(60*60*24)) + { + + $obj = &new Appointment(); + $temp_start = date("Y-m-d",$j); + $result["date_start"]= $temp_start ; + list($obj->temphour,$obj->tempmin) = explode(":",$result["time_start"]); + if($start_timestamp != $end_timestamp && $view == 'day'){ + if($j == $start_timestamp){ + $result["duration_hours"] = 24 - $obj->temphour; + }elseif($j > $start_timestamp && $j < $end_timestamp){ + list($obj->temphour,$obj->tempmin)= $current_user->start_hour !=''?explode(":",$current_user->start_hour):explode(":","08:00"); + $result["duration_hours"] = 24 - $obj->temphour; + }elseif($j == $end_timestamp){ + list($obj->temphour,$obj->tempmin)= $current_user->start_hour !=''?explode(":",$current_user->start_hour):explode(":","08:00"); + list($ehr,$emin) = explode(":",$result["time_end"]); + $result["duration_hours"] = $ehr - $obj->temphour; + } + } + $obj->readResult($result, $view); + $list[] = $obj; + unset($obj); + + } + $a++; + + } + //Get Recurring events + $q = "SELECT vtiger_activity.*, vtiger_crmentity.*, case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name , vtiger_recurringevents.recurringid, vtiger_recurringevents.recurringdate as date_start ,vtiger_recurringevents.recurringtype,vtiger_groups.groupname from vtiger_activity inner join vtiger_crmentity on vtiger_activity.activityid = vtiger_crmentity.crmid inner join vtiger_recurringevents on vtiger_activity.activityid=vtiger_recurringevents.activityid left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid "; + $q.=" where vtiger_crmentity.deleted = 0 and vtiger_activity.activitytype not in ('Emails','Task') AND (recurringdate between ? and ?) "; + + // User Select Customization + $q .= $query_filter_prefix; + // END + + $params = array($from_datetime->get_formatted_date(), $to_datetime->get_formatted_date()); + + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[16] == 3) + { + $sec_parameter=getListViewSecurityParameter('Calendar'); + $q .= $sec_parameter; + } + + $q .= " ORDER by vtiger_recurringevents.recurringid"; + $r = $adb->pquery($q, $params); + $n = $adb->getRowCount($r); + $a = 0; + while ( $a < $n ) + { + $obj = &new Appointment(); + $result = $adb->fetchByAssoc($r); + list($obj->temphour,$obj->tempmin) = explode(":",$result["time_start"]); + $obj->readResult($result,$view); + $a++; + $list[] = $obj; + unset($obj); + } + + + usort($list,'compare'); + return $list; + } + + + /** To read and set the events value in Appointment Obj + * @param $act_array -- The vtiger_activity array :: Type Array + * @param $view -- The calendar view :: Type String + */ + function readResult($act_array, $view) + { + global $adb,$current_user,$app_strings; + $format_sthour=''; + $format_stmin=''; + $this->description = $act_array["description"]; + $this->eventstatus = getRoleBasesdPickList('eventstatus',$act_array["eventstatus"]); + $this->priority = getRoleBasesdPickList('taskpriority',$act_array["priority"]); + $this->subject = $act_array["subject"]; + $this->activity_type = $act_array["activitytype"]; + $this->duration_hour = $act_array["duration_hours"]; + $this->duration_minute = $act_array["duration_minutes"]; + $this->creatorid = $act_array["smcreatorid"]; + //$this->creator = getUserName($act_array["smcreatorid"]); + $this->assignedto = $act_array["user_name"]; + $this->owner = $act_array["user_name"]; + if(!is_admin($current_user)) + { + if($act_array["smownerid"]!=0 && $act_array["smownerid"] != $current_user->id && $act_array["visibility"] == "Public"){ + $que = "select * from vtiger_sharedcalendar where sharedid=? and userid=?"; + $row = $adb->pquery($que, array($current_user->id, $act_array["smownerid"])); + $no = $adb->getRowCount($row); + if($no > 0) + $this->shared = true; + } + } + $this->image_name = $act_array["activitytype"].".gif"; + if(!empty($act_array["recurringid"]) && !empty($act_array["recurringtype"])) + $this->recurring="Recurring.gif"; + + $this->record = $act_array["activityid"]; + list($styear,$stmonth,$stday) = explode("-",$act_array["date_start"]); + if($act_array["notime"] != 1){ + $st_hour = twoDigit($this->temphour); + list($sthour,$stmin) = split(":",$act_array["time_start"]); + }else{ + $st_hour = 'notime'; + $stmin = '00'; + $sthour= '00'; + } + list($eyear,$emonth,$eday) = explode("-",$act_array["due_date"]); + list($end_hour,$end_min) = split(":",$act_array["time_end"]); + + $start_date_arr = Array( + 'min' => $stmin, + 'hour' => $sthour, + 'day' => $stday, + 'month' => $stmonth, + 'year' => $styear + ); + $end_date_arr = Array( + 'min' => $end_min, + 'hour' => $end_hour, + 'day' => $eday, + 'month' => $emonth, + 'year' => $eyear + ); + $this->start_time = new vt_DateTime($start_date_arr,true); + $this->end_time = new vt_DateTime($end_date_arr,true); + if($view == 'day' || $view == 'week') + { + $this->formatted_datetime= $act_array["date_start"].":".$st_hour; + } + elseif($view == 'year') + { + list($year,$month,$date) = explode("-",$act_array["date_start"]); + $this->formatted_datetime = $month; + } + else + { + $this->formatted_datetime= $act_array["date_start"]; + } + return; + } + + +} + +/** To two array values + * @param $a -- The vtiger_activity array :: Type Array + * @param $b -- The vtiger_activity array :: Type Array + * @returns value 0 or 1 or -1 depends on comparision result + */ +function compare($a,$b) +{ + if ($a->start_time->ts == $b->start_time->ts) + { + return 0; + } + return ($a->start_time->ts < $b->start_time->ts) ? -1 : 1; +} +function getRoleBasesdPickList($fldname,$exist_val) +{ + global $adb,$app_strings,$current_user; + $is_Admin = $current_user->is_admin; + if($is_Admin == 'off' && $fldname != '') + { + $roleid=$current_user->roleid; + $roleids = Array(); + $subrole = getRoleSubordinates($roleid); + if(count($subrole)> 0) + $roleids = $subrole; + array_push($roleids, $roleid); + + //here we are checking wheather the table contains the sortorder column .If sortorder is present in the main picklist table, then the role2picklist will be applicable for this table... + + $sql="select * from vtiger_$fldname where $fldname=?"; + $res = $adb->pquery($sql,array(decode_html($exist_val))); + $picklistvalueid = $adb->query_result($res,0,'picklist_valueid'); + if ($picklistvalueid != null) { + $pick_query="select * from vtiger_role2picklist where picklistvalueid=$picklistvalueid and roleid in (". generateQuestionMarks($roleids) .")"; + + $res_val=$adb->pquery($pick_query,array($roleids)); + $num_val = $adb->num_rows($res_val); + } + if($num_val > 0) + $pick_val = $exist_val; + else + $pick_val = $app_strings['LBL_NOT_ACCESSIBLE']; + + + }else + $pick_val = $exist_val; + + return $pick_val; + +} +?> diff --git a/oss/vtiger/trunk/modules/Calendar/Calendar.js b/oss/vtiger/trunk/modules/Calendar/Calendar.js new file mode 100644 index 00000000..51bc89b5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/Calendar.js @@ -0,0 +1,99 @@ + +/********************************************************************************* + +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ********************************************************************************/ + +function set_values(form) { + + if (form.duedate_flag.checked) { + + form.duedate_flag.value='on'; + + form.duedate.value=""; + + form.duetime.value=""; + + form.duedate.readOnly=true; + + form.duetime.readOnly=true; + + document.images.jscal_trigger.width = 0; + + document.images.jscal_trigger.height = 0; + + } + + else { + + form.duedate_flag.value='off'; + + form.duedate.readOnly=false; + + form.duetime.readOnly=false; + + if (form.duetime.readonly) alert (alert_arr.READONLY); + + document.images.jscal_trigger.width = 16; + + document.images.jscal_trigger.height = 16; + + } + +} +function toggleTime() +{ + if(getObj("notime").checked) + { + getObj("notime").value = 'on'; + getObj("duration_hours").disabled = true; + getObj("duration_minutes").disabled = true; + } + else + { + getObj("notime").value = 'off'; + getObj("duration_minutes").disabled = false; + getObj("duration_hours").disabled = false; + } +} + +function toggleAssignType(currType) + +{ + + if (currType=="U") + + { + + getObj("assign_user").style.display="block" + + getObj("assign_team").style.display="none" + + } + + else + + { + + getObj("assign_user").style.display="none" + + getObj("assign_team").style.display="block" + + } + +} + +function showActivityView(selectactivity_view) +{ + //script to reload the page with the view type when the combo values are changed + View_name = selectactivity_view.options[selectactivity_view.options.selectedIndex].value; + document.frmOpenLstView.action = "index.php?module=Home&action=index&activity_view="+View_name; + document.frmOpenLstView.submit(); +} + + diff --git a/oss/vtiger/trunk/modules/Calendar/Calendar.php b/oss/vtiger/trunk/modules/Calendar/Calendar.php new file mode 100644 index 00000000..50dfa3ce --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/Calendar.php @@ -0,0 +1,297 @@ +view = $view; + $this->date_time = new vt_DateTime($data,true); + $this->constructLayout(); + } + /** + * Function to get calendarview Label + * @param string $view - calendarview + * return string - calendarview Label + */ + function getCalendarView($view) + { + switch($view) + { + case 'day': + return "DAY"; + case 'week': + return "WEEK"; + case 'month': + return "MON"; + case 'year': + return "YEAR"; + } + } + + /** + * Function to set values for calendar object depends on calendar view + */ + function constructLayout() + { + global $current_user; + switch($this->view) + { + case 'day': + for($i=-1;$i<=23;$i++) + { + if($i == -1) + { + $layout = new Layout('hour',$this->date_time->getTodayDatetimebyIndex(0)); + $this->day_slice[$layout->start_time->get_formatted_date().':notime'] = $layout; + $this->slices['notime'] = $layout->start_time->get_formatted_date().":notime"; + } + else + { + $layout = new Layout('hour',$this->date_time->getTodayDatetimebyIndex($i)); + $this->day_slice[$layout->start_time->get_formatted_date().':'.$layout->start_time->z_hour] = $layout; + array_push($this->slices, $layout->start_time->get_formatted_date().":".$layout->start_time->z_hour); + } + } + break; + case 'week': + $weekview_days = 7; + for($i=0;$i<$weekview_days;$i++) + { + $layout = new Layout('day',$this->date_time->getThisweekDaysbyIndex($i)); + $this->week_array[$layout->start_time->get_formatted_date()] = $layout; + for($h=-1;$h<=23;$h++) + { + if($h == -1) + { + $hour_list = new Layout('hour',$this->date_time->getTodayDatetimebyIndex(0,$layout->start_time->day,$layout->start_time->month,$layout->start_time->year)); + $this->week_slice[$layout->start_time->get_formatted_date().':notime'] = $hour_list; + $this->week_hour_slices['notime'] = $layout->start_time->get_formatted_date().":notime"; + } + else + { + $hour_list = new Layout('hour',$this->date_time->getTodayDatetimebyIndex($h,$layout->start_time->day,$layout->start_time->month,$layout->start_time->year)); + $this->week_slice[$layout->start_time->get_formatted_date().':'.$hour_list->start_time->z_hour] = $hour_list; + array_push($this->week_hour_slices, $layout->start_time->get_formatted_date().":".$hour_list->start_time->z_hour); + } + } + array_push($this->slices, $layout->start_time->get_formatted_date()); + + } + break; + case 'month': + $arr = getCalendarDaysInMonth($this->date_time); + $this->month_array = $arr["month_array"]; + $this->slices = $arr["slices"]; + $this->date_time = $arr["date_time"]; + break; + case 'year': + $this->month_day_slices = Array(); + for($i=0;$i<12;$i++){ + $currMonth = $this->date_time->getThisyearMonthsbyIndex($i); + $layout = new Layout('month',$this->date_time->getThisyearMonthsbyIndex($i)); + $this->year_array[$layout->start_time->z_month] = $layout; + + $arr = getCalendarDaysInMonth($currMonth); + $slices = $arr["slices"]; + + $this->month_day_slices[$i] = $slices; + array_push($this->slices, $layout->start_time->z_month); + } + break; + } + } + + /** + * Function to get date info depends on calendarview + * @param string $type - string 'increment' or 'decrment' + */ + + function get_datechange_info($type) + { + if($type == 'next') + $mode = 'increment'; + if($type == 'prev') + $mode = 'decrment'; + switch($this->view) + { + case 'day': + $day = $this->date_time->get_changed_day($mode); + break; + case 'week': + $day = $this->date_time->get_first_day_of_changed_week($mode); + break; + case 'month': + $day = $this->date_time->get_first_day_of_changed_month($mode); + break; + case 'year': + $day = $this->date_time->get_first_day_of_changed_year($mode); + break; + default: + return "view is not supported"; + } + return $day->get_date_str(); + } + + /** + * Function to get activities + * @param array $current_user - user data + * @param string $free_busy - + */ + function add_Activities($current_user,$free_busy='') + { + if(isset($current_user->start_hour) && $current_user->start_hour !='') + { + list($sthour,$stmin)= explode(":",$current_user->start_hour); + $hr = $sthour+0; + $this->day_start_hour=$hr; + } + else + { + $this->day_start_hour=8; + } + if(isset($current_user->end_hour) && $current_user->end_hour !='') + { + list($endhour,$endmin)=explode(":",$current_user->end_hour); + $endhour = $endhour+0; + $this->day_end_hour=$endhour; + } + else + { + $this->day_end_hour=23; + } + if ( $this->view == 'week') + { + $start_datetime = $this->date_time->getThisweekDaysbyIndex(0); + $end_datetime = $this->date_time->getThisweekDaysbyIndex(6); + } elseif($this->view == 'month') { + $start_datetime = $this->date_time->getThismonthDaysbyIndex(0); + $end_datetime = $this->date_time->getThismonthDaysbyIndex($this->date_time->daysinmonth-1); + } elseif($this->view == 'year'){ + $start_datetime = $this->date_time->getThisyearMonthsbyIndex(0); + $end_datetime = $this->date_time->get_first_day_of_changed_year('increment'); + }else { + $start_datetime = $this->date_time; + $end_datetime = $this->date_time->getTodayDatetimebyIndex(23); + } + + $activities = Array(); + $activities = Appointment::readAppointment($current_user->id,$start_datetime,$end_datetime,$this->view); + if(!empty($activities)) + { + foreach($activities as $key=>$value) + { + if($this->view == 'day') + { + array_push($this->day_slice[$value->formatted_datetime]->activities, $value); + } + elseif($this->view == 'week') + { + array_push($this->week_slice[$value->formatted_datetime]->activities, $value); + } + elseif($this->view == 'month') + { + array_push($this->month_array[$value->formatted_datetime]->activities,$value); + } + elseif($this->view == 'year') + { + array_push($this->year_array[$value->formatted_datetime]->activities,$value); + } + else + die("view:".$this->view." is not defined"); + + } + } + + } +} + +class Layout +{ + var $view = 'day'; + var $start_time; + var $end_time; + var $activities = Array(); + + /** + * Constructor for Layout class + * @param string $view - calendarview + * @param string $time - time string + */ + + function Layout($view,$time) + { + $this->view = $view; + $this->start_time = $time; + if ( $view == 'month') + $this->end_time = $this->start_time->getMonthendtime(); + if ( $view == 'day') + $this->end_time = $this->start_time->getDayendtime(); + if ( $view == 'hour') + $this->end_time = $this->start_time->getHourendtime(); + } + + /** + * Function to get view + * return currentview + */ + + function getView() + { + return $this->view; + } +} + +/** + * this function returns the days in a month in an array format + * @param object $date_time - the date time object for the current month + * @return array $result - the array containing current months days information + */ +function getCalendarDaysInMonth($date_time){ + global $current_user; + $month_array = array(); + $slices = array(); + $monthview_days = $date_time->daysinmonth; + + $firstday_of_month = $date_time->getThisMonthsDayByIndex(0); + $fdom = $firstday_of_month; + + $num_of_prev_days = ($fdom->dayofweek+1)%7-1; + for($i=-$num_of_prev_days;$i<42;$i++){ + $pd = $date_time->getThisMonthsDayByIndex($i); + + $layout = new Layout('day', $pd); + $month_array[$layout->start_time->get_formatted_date()] = $layout; + array_push($slices, $layout->start_time->get_formatted_date()); + } + + $result = array("month_array"=>$month_array, "slices"=>$slices, "date_time"=>$date_time); + return $result; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/CalendarAjax.php b/oss/vtiger/trunk/modules/Calendar/CalendarAjax.php new file mode 100644 index 00000000..ce66087f --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/CalendarAjax.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Calendar/CalendarCommon.php b/oss/vtiger/trunk/modules/Calendar/CalendarCommon.php new file mode 100644 index 00000000..8c1097ef --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/CalendarCommon.php @@ -0,0 +1,617 @@ +pquery($query, array($id)); + $rows = $adb->num_rows($result); + for($j=0;$j<$rows;$j++) + { + + $id = $adb->query_result($result,$j,'sharedid'); + $sharedname = $adb->query_result($result,$j,'user_name'); + $sharedid[$id]=$sharedname; + + } + return $sharedid; +} + +/** + * To get the lists of vtiger_users id who shared their calendar with specified user + * @param $sharedid -- The shared user id :: Type integer + * @returns $shared_ids -- a comma seperated vtiger_users id :: Type string + */ +function getSharedCalendarId($sharedid) +{ + global $adb; + $query = "SELECT * from vtiger_sharedcalendar where sharedid=?"; + $result = $adb->pquery($query, array($sharedid)); + if($adb->num_rows($result)!=0) + { + for($j=0;$j<$adb->num_rows($result);$j++) + $userid[] = $adb->query_result($result,$j,'userid'); + $shared_ids = implode (",",$userid); + } + return $shared_ids; +} + +/** + * To get userid and username of all vtiger_users except the current user + * @param $id -- The user id :: Type integer + * @returns $user_details -- Array in the following format: + * $user_details=Array($userid1=>$username, $userid2=>$username,............,$useridn=>$username); + */ +function getOtherUserName($id) +{ + global $adb; + $user_details=Array(); + $query="select * from vtiger_users where deleted=0 and status='Active' and id!=?"; + $result = $adb->pquery($query, array($id)); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $userid=$adb->query_result($result,$i,'id'); + $username=$adb->query_result($result,$i,'user_name'); + $user_details[$userid]=$username; + } + return $user_details; +} + +/** + * To get userid and username of vtiger_users in hierarchy level + * @param $id -- The user id :: Type integer + * @returns $user_details -- Array in the following format: + * $user_details=Array($userid1=>$username, $userid2=>$username,............,$useridn=>$username); + */ + +function getSharingUserName($id) +{ + global $adb,$current_user; + $user_details=Array(); + $assigned_user_id = $current_user->id; + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + if($is_admin==false && $profileGlobalPermission[2] == 1 && ($defaultOrgSharingPermission[getTabid('Calendar')] == 3 or $defaultOrgSharingPermission[getTabid('Calendar')] == 0)) + { + $role_seq = implode($parent_roles, "::"); + $query = "select id as id,user_name as user_name from vtiger_users where id=? and status='Active' union select vtiger_user2role.userid as id,vtiger_users.user_name as user_name from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like ? and status='Active' union select shareduserid as id,vtiger_users.user_name as user_name from vtiger_tmp_write_user_sharing_per inner join vtiger_users on vtiger_users.id=vtiger_tmp_write_user_sharing_per.shareduserid where status='Active' and vtiger_tmp_write_user_sharing_per.userid=? and vtiger_tmp_write_user_sharing_per.tabid=9"; + $params = array($current_user->id, $role_seq."::%", $current_user->id); + if (!empty($assigned_user_id)) { + $query .= " OR id=?"; + array_push($params, $assigned_user_id); + } + $query .= " order by user_name ASC"; + $result = $adb->pquery($query, $params, true, "Error filling in user array: "); + while($row = $adb->fetchByAssoc($result)) + { + $temp_result[$row['id']] = $row['user_name']; + } + $user_details = &$temp_result; + unset($user_details[$id]); + } + else + { + $user_details = get_user_array(FALSE, "Active", $id); + unset($user_details[$id]); + } + return $user_details; +} + +/** + * To get hour,minute and format + * @param $starttime -- The date&time :: Type string + * @param $endtime -- The date&time :: Type string + * @param $format -- The format :: Type string + * @returns $timearr :: Type Array +*/ +function getaddEventPopupTime($starttime,$endtime,$format) +{ + $timearr = Array(); + list($sthr,$stmin) = explode(":",$starttime); + list($edhr,$edmin) = explode(":",$endtime); + if($format == 'am/pm') + { + $hr = $sthr+0; + $timearr['startfmt'] = ($hr >= 12) ? "pm" : "am"; + if($hr == 0) $hr = 12; + $timearr['starthour'] = twoDigit(($hr>12)?($hr-12):$hr); + $timearr['startmin'] = $stmin; + + $edhr = $edhr+0; + $timearr['endfmt'] = ($edhr >= 12) ? "pm" : "am"; + if($edhr == 0) $edhr = 12; + $timearr['endhour'] = twoDigit(($edhr>12)?($edhr-12):$edhr); + $timearr['endmin'] = $edmin; + return $timearr; + } + if($format == '24') + { + $timearr['starthour'] = twoDigit($sthr); + $timearr['startmin'] = $stmin; + $timearr['startfmt'] = ''; + $timearr['endhour'] = twoDigit($edhr); + $timearr['endmin'] = $edmin; + $timearr['endfmt'] = ''; + return $timearr; + } +} + +/** + *To construct time select combo box + *@param $format -- the format :: Type string + *@param $bimode -- The mode :: Type string + *constructs html select combo box for time selection + *and returns it in string format. + */ +function getTimeCombo($format,$bimode,$hour='',$min='',$fmt='',$todocheck=false) +{ + global $mod_strings; + $combo = ''; + $min = $min - ($min%5); + if($bimode == 'start' && !$todocheck) + $jsfn = 'onChange="changeEndtime_StartTime(document.EditView.activitytype.value);"'; + else + $jsfn = null; + if($format == 'am/pm') + { + $combo .= ' '; + $combo .= ' '; + $combo .= ''; + } + else + { + $combo .= ''.$mod_strings[LBL_HR].' '; + $combo .= ' '.$mod_strings[LBL_MIN].''; + } + return $combo; +} + +/** + *Function to construct HTML select combo box + *@param $fieldname -- the field name :: Type string + *@param $tablename -- The table name :: Type string + *constructs html select combo box for combo field + *and returns it in string format. + */ + +function getActFieldCombo($fieldname,$tablename) +{ + global $adb, $mod_strings,$current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + $combo = ''; + $js_fn = ''; + if($fieldname == 'eventstatus') + $js_fn = 'onChange = "getSelectedStatus();"'; + $combo .= ''; + return $combo; +} + +/*Fuction to get value for Assigned To field + *returns values of Assigned To field in array format +*/ +function getAssignedTo($tabid) +{ + global $current_user,$noof_group_rows,$adb; + $assigned_user_id = $current_user->id; + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + if($is_admin==false && $profileGlobalPermission[2] == 1 && ($defaultOrgSharingPermission[$tabid] == 3 or $defaultOrgSharingPermission[$tabid] == 0)) + { + $result=get_current_user_access_groups('Calendar'); + } + else + { + $result = get_group_options(); + } + if($result) $nameArray = $adb->fetch_array($result); + + if($is_admin==false && $profileGlobalPermission[2] == 1 && ($defaultOrgSharingPermission[$tabid] == 3 or $defaultOrgSharingPermission[$tabid] == 0)) + { + $users_combo = get_select_options_array(get_user_array(FALSE, "Active", $assigned_user_id,'private'), $assigned_user_id); + } + else + { + $users_combo = get_select_options_array(get_user_array(FALSE, "Active", $assigned_user_id), $assigned_user_id); + } + if($noof_group_rows!=0) + { + do + { + $groupname=$nameArray["groupname"]; + $group_option[] = array($groupname=>$selected); + + }while($nameArray = $adb->fetch_array($result)); + } + $fieldvalue[]=$users_combo; + $fieldvalue[] = $group_option; + return $fieldvalue; +} + +//Code Added by Minnie -Ends +/** + * Function to get the vtiger_activity details for mail body + * @param string $description - activity description + * @param string $from - to differenciate from notification to invitation. + * return string $list - HTML in string format + */ +function getActivityDetails($description,$user_id,$from='') +{ + global $log,$current_user; + global $adb,$mod_strings; + $log->debug("Entering getActivityDetails(".$description.") method ..."); + + $updated = $mod_strings['LBL_UPDATED']; + $created = $mod_strings['LBL_CREATED']; + $reply = (($description['mode'] == 'edit')?"$updated":"$created"); + if($description['activity_mode'] == "Events") + { + $end_date_lable=$mod_strings['End date and time']; + } + else + { + $end_date_lable=$mod_strings['Due Date']; + } + + $name = getUserName($user_id); + + if($from == "invite") + $msg = getTranslatedString($mod_strings['LBL_ACTIVITY_INVITATION']); + else + $msg = getTranslatedString($mod_strings['LBL_ACTIVITY_NOTIFICATION']); + + $current_username = getUserName($current_user->id); + $status = getTranslatedString($description['status']); + + $list = $name.','; + $list .= '

'.$msg.' '.$reply.'.
'.$mod_strings['LBL_DETAILS_STRING'].':
'; + $list .= '
      '.$mod_strings["LBL_SUBJECT"].' '.$description['subject']; + $list .= '
      '.$mod_strings["Start date and time"].' : '.$description['st_date_time']; + $list .= '
      '.$end_date_lable.' : '.$description['end_date_time']; + $list .= '
      '.$mod_strings["LBL_STATUS"].': '.$status; + $list .= '
      '.$mod_strings["Priority"].': '.getTranslatedString($description['taskpriority']); + $list .= '
      '.$mod_strings["Related To"].': '.getTranslatedString($description['relatedto']); + if(!empty($description['contact_name'])) + { + $list .= '
      '.$mod_strings["LBL_CONTACT_LIST"].' '.$description['contact_name']; + } + else + $list .= '
      '.$mod_strings["Location"].' : '.$description['location']; + + $list .= '
      '.$mod_strings["LBL_APP_DESCRIPTION"].': '.$description['description']; + $list .= '

'.$mod_strings["LBL_REGARDS_STRING"].' ,'; + $list .= '
'.$current_username.'.'; + + $log->debug("Exiting getActivityDetails method ..."); + return $list; +} + +function twoDigit( $no ){ + if($no < 10 && strlen(trim($no)) < 2) return "0".$no; + else return "".$no; +} + +function timeString($datetime,$fmt){ + + if(is_object($datetime)){ + $hr = $datetime->hour; + $min = $datetime->minute; + } else { + $hr = $datetime['hour']; + $min = $datetime['minute']; + } + $timeStr = ""; + if($fmt != 'am/pm'){ + $timeStr .= twoDigit($hr).":".twoDigit($min); + }else{ + $am = ($hr >= 12) ? "pm" : "am"; + if($hr == 0) $hr = 12; + $timeStr .= ($hr>12)?($hr-12):$hr; + $timeStr .= ":".twoDigit($min); + $timeStr .= $am; + } + return $timeStr; +} +//added to fix Ticket#3068 +function getEventNotification($mode,$subject,$desc) +{ + global $current_user,$adb; + require_once("modules/Emails/mail.php"); + $subject = $mode.' : '.$subject; + $crmentity = new CRMEntity(); + if($desc['assingn_type'] == "U") + { + $to_email = getUserEmailId('id',$desc['user_id']); + $description = getActivityDetails($desc,$desc['user_id']); + send_mail('Calendar',$to_email,$current_user->user_name,'',$subject,$description); + } + if($desc['assingn_type'] == "T") + { + $groupid = ''; + $groupname=$desc['group_name']; + // getGroupName API was changed to return array of two elements! + if(is_array($groupname) && !empty($groupname)) { + $groupid = $groupname[1]; + $groupname = $groupname[0]; + } else { + $resultqry=$adb->pquery("select groupid from vtiger_groups where groupname=?", array($groupname)); + $groupid=$adb->query_result($resultqry,0,"groupid"); + } + require_once('include/utils/GetGroupUsers.php'); + $getGroupObj=new GetGroupUsers(); + $getGroupObj->getAllUsersInGroup($groupid); + $userIds=$getGroupObj->group_users; + if (count($userIds) > 0) { + $groupqry="select email1,id from vtiger_users where id in(".generateQuestionMarks($userIds).")"; + $groupqry_res=$adb->pquery($groupqry, array($userIds)); + $noOfRows = $adb->num_rows($groupqry_res); + for($z=0;$z < $noOfRows;$z++) + { + $emailadd = $adb->query_result($groupqry_res,$z,'email1'); + $curr_userid = $adb->query_result($groupqry_res,$z,'id'); + $description = getActivityDetails($desc,$curr_userid); + $mail_status = send_mail('Calendar',$emailadd,getUserName($curr_userid),'',$subject,$description); + + } + } + } +} + +function sendInvitation($inviteesid,$mode,$subject,$desc) +{ + global $current_user,$mod_strings; + require_once("modules/Emails/mail.php"); + $invites=$mod_strings['INVITATION']; + $invitees_array = explode(';',$inviteesid); + $subject = $invites.' : '.$subject; + $record = $focus->id; + foreach($invitees_array as $inviteeid) + { + if($inviteeid != '') + { + $description=getActivityDetails($desc,$inviteeid,"invite"); + $to_email = getUserEmailId('id',$inviteeid); + send_mail('Calendar',$to_email,$current_user->user_name,'',$subject,$description); + } + } + +} + +function getActivityMailInfo($return_id,$status,$activity_type) +{ + $mail_data = Array(); + global $adb; + $qry = "select * from vtiger_activity where activityid=?"; + $ary_res = $adb->pquery($qry, array($return_id)); + $send_notification = $adb->query_result($ary_res,0,"sendnotification"); + $subject = $adb->query_result($ary_res,0,"subject"); + $priority = $adb->query_result($ary_res,0,"priority"); + $st_date = $adb->query_result($ary_res,0,"date_start"); + $st_time = $adb->query_result($ary_res,0,"time_start"); + $end_date = $adb->query_result($ary_res,0,"due_date"); + $end_time = $adb->query_result($ary_res,0,"time_end"); + $location = $adb->query_result($ary_res,0,"location"); + + $owner_qry = "select smownerid from vtiger_crmentity where crmid=?"; + $res = $adb->pquery($owner_qry, array($return_id)); + $owner_id = $adb->query_result($res,0,"smownerid"); + + $usr_res = $adb->pquery("select count(*) as count from vtiger_users where id=?",array($owner_id)); + if($adb->query_result($usr_res, 0, 'count')>0) { + $assignType = "U"; + $usr_id = $owner_id; + } + else { + $assignType = "T"; + $group_qry = "select groupname from vtiger_groups where groupid=?"; + $grp_res = $adb->pquery($group_qry, array($owner_id)); + $grp_name = $adb->query_result($grp_res,0,"groupname"); + } + + $desc_qry = "select description from vtiger_crmentity where crmid=?"; + $des_res = $adb->pquery($desc_qry, array($return_id)); + $description = $adb->query_result($des_res,0,"description"); + + + $rel_qry = "select case vtiger_crmentity.setype when 'Leads' then vtiger_leaddetails.lastname when 'Accounts' then vtiger_account.accountname when 'Potentials' then vtiger_potential.potentialname when 'Quotes' then vtiger_quotes.subject when 'PurchaseOrder' then vtiger_purchaseorder.subject when 'SalesOrder' then vtiger_salesorder.subject when 'Invoice' then vtiger_invoice.subject when 'Campaigns' then vtiger_campaign.campaignname when 'HelpDesk' then vtiger_troubletickets.title end as relname from vtiger_seactivityrel inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_seactivityrel.crmid left join vtiger_leaddetails on vtiger_leaddetails.leadid = vtiger_seactivityrel.crmid left join vtiger_account on vtiger_account.accountid=vtiger_seactivityrel.crmid left join vtiger_potential on vtiger_potential.potentialid=vtiger_seactivityrel.crmid left join vtiger_quotes on vtiger_quotes.quoteid= vtiger_seactivityrel.crmid left join vtiger_purchaseorder on vtiger_purchaseorder.purchaseorderid = vtiger_seactivityrel.crmid left join vtiger_salesorder on vtiger_salesorder.salesorderid = vtiger_seactivityrel.crmid left join vtiger_invoice on vtiger_invoice.invoiceid = vtiger_seactivityrel.crmid left join vtiger_campaign on vtiger_campaign.campaignid = vtiger_seactivityrel.crmid left join vtiger_troubletickets on vtiger_troubletickets.ticketid = vtiger_seactivityrel.crmid where vtiger_seactivityrel.activityid=?"; + $rel_res = $adb->pquery($rel_qry, array($return_id)); + $rel_name = $adb->query_result($rel_res,0,"relname"); + + + $cont_qry = "select * from vtiger_cntactivityrel where activityid=?"; + $cont_res = $adb->pquery($cont_qry, array($return_id)); + $cont_id = $adb->query_result($cont_res,0,"contactid"); + $cont_name = ''; + if($cont_id != '') + { + $cont_name = getContactName($cont_id); + } + $mail_data['mode'] = "edit"; + $mail_data['activity_mode'] = $activity_type; + $mail_data['sendnotification'] = $send_notification; + $mail_data['user_id'] = $usr_id; + $mail_data['subject'] = $subject; + $mail_data['status'] = $status; + $mail_data['taskpriority'] = $priority; + $mail_data['relatedto'] = $rel_name; + $mail_data['contact_name'] = $cont_name; + $mail_data['description'] = $description; + $mail_data['assingn_type'] = $assignType; + $mail_data['group_name'] = $grp_name; + $value = getaddEventPopupTime($st_time,$end_time,'24'); + $start_hour = $value['starthour'].':'.$value['startmin'].''.$value['startfmt']; + if($activity_type != 'Task' ) + $end_hour = $value['endhour'] .':'.$value['endmin'].''.$value['endfmt']; + $mail_data['st_date_time']=getDisplayDate($st_date)." ".$start_hour; + $mail_data['end_date_time']=getDisplayDate($end_date)." ".$end_hour; + $mail_data['location']=$location; + return $mail_data; + + +} + +// User Select Customization +/** + * Function returns the id of the User selected by current user in the picklist of the ListView or Calendar view of Current User + * return String - Id of the user that the current user has selected + */ +function calendarview_getSelectedUserId() { + global $current_user, $default_charset; + $only_for_user = htmlspecialchars(strip_tags($_REQUEST['onlyforuser']),ENT_QUOTES,$default_charset); + if($only_for_user == '') $only_for_user = $current_user->id; + return $only_for_user; +} + +function calendarview_getSelectedUserFilterQuerySuffix() { + global $current_user, $adb; + $only_for_user = calendarview_getSelectedUserId(); + $qcondition = ''; + if(!empty($only_for_user)) { + if($only_for_user != 'ALL') { + // For logged in user include the group records also. + if($only_for_user == $current_user->id) { + $user_group_ids = fetchUserGroupids($current_user->id); + // User does not belong to any group? Let us reset to non-existent group + if(!empty($user_group_ids)) $user_group_ids .= ','; + else $user_group_ids = ''; + $user_group_ids .= $current_user->id; + $qcondition = " AND vtiger_crmentity.smownerid IN (" . $user_group_ids .")"; + } else { + $qcondition = " AND vtiger_crmentity.smownerid = " . $adb->sql_escape_string($only_for_user); + } + } + } + return $qcondition; +} + +/** + * Function returns the data of the user selected by current user in the picklist of the ListView or Calendar view of Current User + * @param $useridInUse - The Id of the user that the Current User has selected in dropdown picklist in Calendar modules listview or Calendar View + * return string - The array of the events for the user that the current user has selected + */ +function calendarview_getUserSelectOptions($useridInUse) { + global $adb, $app_strings, $current_user, $mod_strings; + $users = $adb->query("SELECT id,user_name FROM vtiger_users WHERE status = 'Active' and deleted = 0"); + $userscount = $adb->num_rows($users); + + $userSelectdata = "" . $app_strings['LBL_LIST_OF'] . " : "; + $userSelectdata .=""; + return $userSelectdata; +} +// END + +?> diff --git a/oss/vtiger/trunk/modules/Calendar/CustomView.php b/oss/vtiger/trunk/modules/Calendar/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Calendar/Date.php b/oss/vtiger/trunk/modules/Calendar/Date.php new file mode 100644 index 00000000..b89bd64f --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/Date.php @@ -0,0 +1,511 @@ +setDateTime(null); + } + else if ( isset( $timearr['ts'])) + { + $this->setDateTime($time['ts']); + } + else + { + if(isset($timearr['hour']) && $timearr['hour'] !== '') + { + $this->hour = $timearr['hour']; + } + if(isset($timearr['min']) && $timearr['min'] !== '') + { + $this->minute = $timearr['min']; + } + if(isset($timearr['sec']) && $timearr['sec'] !== '') + { + $this->second = $timearr['sec']; + } + if(isset($timearr['day']) && $timearr['day'] !== '') + { + $this->day = $timearr['day']; + } + if(isset($timearr['week']) && $timearr['week'] !== '') + { + $this->week = $timearr['week']; + } + if(isset($timearr['month']) && $timearr['month'] !== '') + { + $this->month = $timearr['month']; + } + if(isset($timearr['year']) && $timearr['year'] >= 1970) + { + $this->year = $timearr['year']; + } + else + { + return null; + } + } + if ($check) + { + $this->getDateTime(); + } + } + + /** + * function to get date and time using index + * @param integer $index - number between 0 to 23 + * @param string $day - date + * @param string $month - month + * @param string $year - year + * return vt_DateTime obj $datetimevalue + */ + function getTodayDatetimebyIndex($index,$day='', $month='', $year=''){ + if($day === '') + $day = $this->day; + if($month === '') + $month = $this->month; + if($year === '') + $year = $this->year; + $day_array = array(); + + if($index < 0 || $index > 23){ + die("hour is invalid"); + } + + $day_array['hour'] = $index; + $day_array['min'] = 0; + $day_array['day'] = $day; + $day_array['month'] = $month; + $day_array['year'] = $year; + $datetimevalue = new vt_DateTime($day_array,true); + return $datetimevalue; + } + + /** + * function to get days in week using index + * @param integer $index - number between 0 to 6 + * return vt_DateTime obj $datetimevalue + */ + function getThisweekDaysbyIndex($index){ + $week_array = array(); + if($index < 0 || $index > 6){ + die("day is invalid"); + } + $week_array['day'] = $this->day + ($index - $this->dayofweek); + $week_array['month'] = $this->month; + $week_array['year'] = $this->year; + $datetimevalue = new vt_DateTime($week_array,true); + return $datetimevalue; + } + + /** + * function to get days in month using index + * + * This function will be deprecated. + * The newer version is getThisMonthsDayByIndex() and should be used wherever possible + * + * @param integer $index - number between 0 to 42 + * @param string $day - date + * @param string $month - month + * @param string $year - year + * return vt_DateTime obj $datetimevalue + */ + + function getThismonthDaysbyIndex($index,$day='', $month='', $year='') + { + if($day == '') + $day = $index+1; + if($month == '') + $month = $this->month; + if($year == '') + $year = $this->year; + $month_array = array(); + $month_array['day'] = $day; + $month_array['month'] = $month; + $month_array['year'] = $year; + $datetimevalue = new vt_DateTime($month_array,true); + return $datetimevalue; + } + + /** + * function to get months in year using index + * @param integer $index - number between 0 to 11 + * return vt_DateTime obj $datetimevalue + */ + + function getThisyearMonthsbyIndex($index) + { + $year_array = array(); + $year_array['day'] = 1; + if($index < 0 || $index > 11) + { + die("month is invalid"); + } + $year_array['month'] = $index+1; + $year_array['year'] = $this->year; + $datetimevalue = new vt_DateTime($year_array,true); + return $datetimevalue; + } + + /** + * function to get hour end time + * return vt_DateTime obj $datetimevalue + */ + + function getHourendtime() + { + $date_array = array(); + $date_array['hour'] = $this->hour; + $date_array['min'] = 59; + $date_array['day'] = $this->day; + $date_array['sec'] = 59; + $date_array['month'] = $this->month; + $date_array['year'] = $this->year; + $datetimevalue = new vt_DateTime($date_array,true); + return $datetimevalue; + } + + /** + * function to get day end time + * return vt_DateTime obj $datetimevalue + */ + function getDayendtime() + { + $date_array = array(); + $date_array['hour'] = 23; + $date_array['min'] = 59; + $date_array['sec'] = 59; + $date_array['day'] = $this->day; + $date_array['month'] = $this->month; + $date_array['year'] = $this->year; + $datetimevalue = new vt_DateTime($date_array,true); + return $datetimevalue; + } + + /** + * function to get month end time + * return vt_DateTime obj $datetimevalue + */ + function getMonthendtime() + { + $date_array = array(); + $date_array['hour'] = 23; + $date_array['min'] = 59; + $date_array['sec'] = 59; + $date_array['day'] = $this->daysinmonth; + $date_array['month'] = $this->month; + $date_array['year'] = $this->year; + $datetimevalue = new vt_DateTime($date_array,true); + return $datetimevalue; + } + + /** + * function to get day of week + * return string $this->day - day (eg: Monday) + */ + function get_Date() + { + return $this->day; + } + + /** + * function to get month name in short + * return string $this->month_inshort - month name (eg: Jan) + */ + function getmonthName_inshort(){ + return $this->month_inshort; + } + /** + * function to get month name + * return string $this->month - month name + */ + function getMonth(){ + return $this->month; + } + /** + * function to get month name + * return string $this->month_inlong - month name + */ + function getmonthName(){ + return $this->month_inlong; + } + + /** + * function to get day of week + * return string $this->dayofweek_inlong - day of week + */ + function getdayofWeek(){ + return $this->dayofweek_inlong; + } + /** + * function to get day of week in short + * return string $this->dayofweek_inshort - day of week (eg: Mon) + */ + + function getdayofWeek_inshort(){ + return $this->dayofweek_inshort; + } + + /** + * function to set values for vt_DateTime object + * @param integer $ts - Time stamp + */ + function setDateTime($ts){ + global $mod_strings; + if (empty($ts)){ + $ts = time(); + } + + $this->ts = $ts; + $this->ts_def = $this->ts; + $date_string = date('i::G::H::j::d::t::w::z::L::W::n::m::Y::Z::T::s',$ts); + + list($this->minute,$this->hour,$this->z_hour,$this->day,$this->z_day,$this->daysinmonth,$this->dayofweek,$this->dayofyear,$is_leap,$this->week,$this->month,$this->z_month,$this->year,$this->offset,$this->tz,$this->second) = split('::',$date_string); + + $this->dayofweek_inshort =$mod_strings['cal_weekdays_short'][$this->dayofweek]; + $this->dayofweek_inlong=$mod_strings['cal_weekdays_long'][$this->dayofweek]; + $this->month_inshort=$mod_strings['cal_month_short'][$this->month]; + $this->month_inlong=$mod_strings['cal_month_long'][$this->month]; + + $this->daysinyear = 365; + + if ($is_leap == 1){ + $this->daysinyear += 1; + } + } + + /** + * function to get values from vt_DateTime object + */ + function getDateTime() + { + global $mod_strings; + $hour = 0; + $minute = 0; + $second = 0; + $day = 1; + $month = 1; + $year = 1970; + + if ( isset($this->second) && $this->second !== ''){ + $second = $this->second; + } + if ( isset($this->minute) && $this->minute !== ''){ + $minute = $this->minute; + } + if ( isset($this->hour) && $this->hour !== '') + { + $hour = $this->hour; + } + if ( isset($this->day) && $this->day !== ''){ + $day= $this->day; + } + if ( isset($this->month) && $this->month !== ''){ + $month = $this->month; + } + + if ( isset($this->year) && $this->year !== ''){ + $year = $this->year; + }else{ + die("year was not set"); + } + if(empty($hour) && $hour !== 0) $hour = 0; + $this->ts = mktime($hour,$minute,$second,$month,$day,$year); + $this->setDateTime($this->ts); + } + + /** + * function to get mysql formatted date + * return formatted date in string format + */ + function get_formatted_date(){ + return $this->year."-".$this->z_month."-".$this->z_day; + } + /** + * function to get mysql formatted time + * return formatted time in string format + */ + function get_formatted_time(){ + return $this->z_hour.":".$this->min; + } + + /** + * function to get date depends on mode value + * @param string $mode - 'increment' or 'decrement' + * return vt_DateTime obj + */ + function get_changed_day($mode){ + if($mode == 'increment') + $day = $this->day + 1; + else + $day = $this->day - 1; + $date_data = array('day'=>$day, + 'month'=>$this->month, + 'year'=>$this->year + ); + return new vt_DateTime($date_data,true); + } + + /** + * function to get changed week depends on mode value + * @param string $mode - 'increment' or 'decrement' + * return vt_DateTime obj + */ + function get_first_day_of_changed_week($mode){ + $first_day = $this->getThisweekDaysbyIndex(0); + if($mode == 'increment') + $day = $first_day->day + 7; + else + $day = $first_day->day - 7; + $date_data = array('day'=>$day, + 'month'=>$first_day->month, + 'year'=>$first_day->year + ); + return new vt_DateTime($date_data,true); + } + + /** + * function to get month depends on mode value + * @param string $mode - 'increment' or 'decrement' + * return vt_DateTime obj + */ + function get_first_day_of_changed_month($mode){ + $tmpDate['day'] = $this->day; + $tmpDate['month'] = $this->month; + $tmpDate['year'] = $this->year; + + if(is_array($arr) && !empty($arr)){ + $tmpDate['year'] = $arr[0]; + $tmpDate['month'] = $arr[1]; + $tmpDate['day'] = $arr[2]; + } + + if($mode == 'increment'){ + $month = $tmpDate['month'] + 1; + $year = $tmpDate['year'] ; + }else{ + if($tmpDate['month'] == 1){ + $month = 12; + $year = $tmpDate['year'] - 1; + }else{ + $month = $tmpDate['month'] - 1; + $year = $tmpDate['year'] ; + } + } + $date_data = array( + 'day'=>1, + 'month'=>$month, + 'year'=>$year + ); + + return new vt_DateTime($date_data,true); + } + + /** + * function to get year depends on mode value + * @param string $mode - 'increment' or 'decrement' + * return vt_DateTime obj + */ + function get_first_day_of_changed_year($mode){ + if($mode == 'increment'){ + $year = $this->year + 1; + }else{ + $year = $this->year - 1; + } + $date_data = array('day'=>1, + 'month'=>1, + 'year'=>$year + ); + return new vt_DateTime($date_data,true); + } + + /** + * function to get date string + * return date string + */ + function get_date_str(){ + $array = Array(); + if ( isset( $this->hour) && $this->hour != '') + { + array_push( $array, "hour=".$this->hour); + } + if ( isset( $this->day) && $this->day != '') + { + array_push( $array, "day=".$this->day); + } + if ( isset( $this->month) && $this->month) + { + array_push( $array, "month=".$this->month); + } + if ( isset( $this->year) && $this->year != '') + { + array_push( $array, "year=".$this->year); + } + return ("&".implode('&',$array)); + } + + /** + * function to get days in month using index + * + * This is the newer version of the function getThismonthDaysbyIndex(). + * This should be used whereever possible + * + * @param integer $index - number between 0 to 42 + * @param string $day - date + * @param string $month - month + * @param string $year - year + * return vt_DateTime obj $datetimevalue + */ + + function getThisMonthsDayByIndex($index){ + $day = $index; + $month = $this->month; + $year = $this->year; + $month_array = array(); + $month_array['day'] = $day; + $month_array['month'] = $month; + $month_array['year'] = $year; + $datetimevalue = new vt_DateTime($month_array,true); + return $datetimevalue; + } +} +?> diff --git a/oss/vtiger/trunk/modules/Calendar/Delete.php b/oss/vtiger/trunk/modules/Calendar/Delete.php new file mode 100644 index 00000000..e1017d8d --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/Delete.php @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/DetailView.php b/oss/vtiger/trunk/modules/Calendar/DetailView.php new file mode 100644 index 00000000..74531d09 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/DetailView.php @@ -0,0 +1,358 @@ +'. $mod_strings{"LBL_NOTIFICATION_ERROR"}.'

'; +} +session_unregister('mail_send_error'); + +$focus = CRMEntity::getInstance($currentModule); +$smarty = new vtigerCRM_Smarty(); +$activity_mode = vtlib_purify($_REQUEST['activity_mode']); +//If activity_mode == null + +if($activity_mode =='' || strlen($activity_mode) < 1) +{ + $query = "select activitytype from vtiger_activity where activityid=?"; + $result = $adb->pquery($query, array($_REQUEST['record'])); + $actType = $adb->query_result($result,0,'activitytype'); + if( $actType == 'Task') + { + $activity_mode = $actType; + } + elseif($actType != 'Emails') + { + $activity_mode = 'Events'; + } +} + +if($activity_mode == 'Task') +{ + $tab_type = 'Calendar'; + $smarty->assign("SINGLE_MOD",$mod_strings['LBL_TODO']); +} +elseif($activity_mode == 'Events') +{ + $tab_type = 'Events'; + $smarty->assign("SINGLE_MOD",$mod_strings['LBL_EVENT']); +} +$tab_id=getTabid($tab_type); + + +if(isset($_REQUEST['record']) && isset($_REQUEST['record'])) { + $focus->retrieve_entity_info($_REQUEST['record'],$tab_type); + $focus->id = $_REQUEST['record']; + $focus->name=$focus->column_fields['subject']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; +} + +//needed when creating a new task with default values passed in +if (isset($_REQUEST['contactname']) && is_null($focus->contactname)) { + $focus->contactname = $_REQUEST['contactname']; +} +if (isset($_REQUEST['contact_id']) && is_null($focus->contact_id)) { + $focus->contact_id = $_REQUEST['contact_id']; +} +if (isset($_REQUEST['opportunity_name']) && is_null($focus->parent_name)) { + $focus->parent_name = $_REQUEST['opportunity_name']; +} +if (isset($_REQUEST['opportunity_id']) && is_null($focus->parent_id)) { + $focus->parent_id = $_REQUEST['opportunity_id']; +} +if (isset($_REQUEST['accountname']) && is_null($focus->parent_name)) { + $focus->parent_name = $_REQUEST['accountname']; +} +if (isset($_REQUEST['accountid']) && is_null($focus->parent_id)) { + $focus->parent_id = $_REQUEST['accountid']; +} + +$act_data = getBlocks($tab_type,"detail_view",'',$focus->column_fields); + +foreach($act_data as $block=>$entry) +{ + foreach($entry as $key=>$value) + { + foreach($value as $label=>$field) + { + $fldlabel[$field['fldname']] = $label; + if($field['ui'] == 15 || $field['ui'] == 16) + { + foreach($field['options'] as $index=>$arr_val) + { + if($arr_val[2] == "selected") + $finaldata[$field['fldname']] = $arr_val[0]; + } + } + else + { + $fldvalue = $field['value']; + if($field['fldname'] == 'description') { $fldvalue = nl2br($fldvalue); } + $finaldata[$field['fldname']] = $fldvalue; + } + + $finaldata[$field['fldname'].'link'] = $field['link']; + } + } +} + +//Start +//To set user selected hour format +if($current_user->hour_format == '') + $format = 'am/pm'; +else + $format = $current_user->hour_format; +list($stdate,$sttime) = split(' ',$finaldata['date_start']); +list($enddate,$endtime) = split(' ',$finaldata['due_date']); +$time_arr = getaddEventPopupTime($sttime,$endtime,$format); +$data['starthr'] = $time_arr['starthour']; +$data['startmin'] = $time_arr['startmin']; +$data['startfmt'] = $time_arr['startfmt']; +$data['endhr'] = $time_arr['endhour']; +$data['endmin'] = $time_arr['endmin']; +$data['endfmt'] = $time_arr['endfmt']; +$data['record'] = $focus->id; +if(isset($finaldata['sendnotification']) && $finaldata['sendnotification'] == 'yes') + $data['sendnotification'] = $mod_strings['LBL_YES']; +else + $data['sendnotification'] = $mod_strings['LBL_NO']; +$data['subject'] = $finaldata['subject']; +$data['date_start'] = $stdate; +$data['due_date'] = $enddate; +$data['assigned_user_id'] = $finaldata['assigned_user_id']; +if($mod_strings[$finaldata['taskpriority']] != '') + $data['taskpriority'] = $mod_strings[$finaldata['taskpriority']]; +else + $data['taskpriority'] = $finaldata['taskpriority']; +$data['modifiedtime'] = $finaldata['modifiedtime']; +$data['createdtime'] = $finaldata['createdtime']; +$data['parent_name'] = $finaldata['parent_id']; +$data['description'] = $finaldata['description']; +if($activity_mode == 'Task') +{ + if($mod_strings[$finaldata['taskstatus']] != '') + $data['taskstatus'] = $mod_strings[$finaldata['taskstatus']]; + else + $data['taskstatus'] = $finaldata['taskstatus']; + $data['activitytype'] = $activity_mode; + $data['contact_id'] = $finaldata['contact_id']; + $data['contact_idlink'] = $finaldata['contact_idlink']; +} +elseif($activity_mode == 'Events') +{ + $data['visibility'] = $finaldata['visibility']; + if($mod_strings[$finaldata['eventstatus']] != '') + $data['eventstatus'] = $mod_strings[$finaldata['eventstatus']]; + else + $data['eventstatus'] = $finaldata['eventstatus']; + $data['activitytype'] = $finaldata['activitytype']; + $data['location'] = $finaldata['location']; + //Calculating reminder time + $rem_days = 0; + $rem_hrs = 0; + $rem_min = 0; + if(!empty($focus->column_fields['reminder_time'])) + { + $data['set_reminder'] = $mod_strings['LBL_YES']; + $data['reminder_str'] = $finaldata['reminder_time']; + } + else + $data['set_reminder'] = $mod_strings['LBL_NO']; + //To set recurring details + $query = 'select vtiger_recurringevents.recurringfreq,vtiger_recurringevents.recurringinfo from vtiger_recurringevents where vtiger_recurringevents.activityid = ?'; + $res = $adb->pquery($query, array($focus->id)); + $rows = $adb->num_rows($res); + if($rows != 0) + { + $data['recurringcheck'] = $mod_strings['LBL_YES']; + $data['repeat_frequency'] = $adb->query_result($res,0,'recurringfreq'); + $recurringinfo = explode("::",$adb->query_result($res,0,'recurringinfo')); + $data['recurringtype'] = $recurringinfo[0]; + if($recurringinfo[0] == 'Weekly') + { + $weekrpt_str = ''; + if(count($recurringinfo) > 1) + { + $weekrpt_str .= 'on '; + for($i=1;$ipquery($sql, array($focus->id)); + $num_rows=$adb->num_rows($result); + $invited_users=Array(); + for($i=0;$i<$num_rows;$i++) + { + $userid=$adb->query_result($result,$i,'inviteeid'); + $username=$adb->query_result($result,$i,'user_name'); + $invited_users[$userid]=$username; + } + $smarty->assign("INVITEDUSERS",$invited_users); + $related_array = getRelatedLists("Calendar", $focus); + $smarty->assign("CONTACTS",$related_array['Contacts']['entries']); + + $is_fname_permitted = getFieldVisibilityPermission("Contacts", $current_user->id, 'firstname'); + $smarty->assign("IS_PERMITTED_CNT_FNAME",$is_fname_permitted); + + +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Calendar-Activities detail view"); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("ACTIVITY_MODE", $activity_mode); + +if (isset($focus->name)) +$smarty->assign("NAME", $focus->name); +else +$smarty->assign("NAME", ""); +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); +if (isset($_REQUEST['return_module'])) +$smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if (isset($_REQUEST['return_action'])) +$smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if (isset($_REQUEST['return_id'])) +$smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string'].'&activity_mode='.$activity_mode); +$smarty->assign("ID", $focus->id); +$smarty->assign("NAME", $focus->name); +$smarty->assign("BLOCKS", $act_data); +$smarty->assign("LABEL", $fldlabel); +$smarty->assign("VIEWTYPE", vtlib_purify($_REQUEST['viewtype'])); +$smarty->assign("CUSTOMFIELD", $cust_fld); +$smarty->assign("ACTIVITYDATA", $data); +$smarty->assign("ID", vtlib_purify($_REQUEST['record'])); + +//get Description Information +if(isPermitted("Calendar","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +if(isPermitted("Calendar","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + + $tabid = getTabid($tab_type); + $validationData = getDBValidationData($focus->tab_name,$tabid); + $data2 = split_validationdataArray($validationData); + + $smarty->assign("VALIDATION_DATA_FIELDNAME",$data2['fieldname']); + $smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data2['datatype']); + $smarty->assign("VALIDATION_DATA_FIELDLABEL",$data2['fieldlabel']); + +$smarty->assign("MODULE",$currentModule); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +// Gather the custom link information to display +include_once('vtlib/Vtiger/Link.php'); +$customlink_params = Array('MODULE'=>$currentModule, 'RECORD'=>$focus->id, 'ACTION'=>vtlib_purify($_REQUEST['action'])); +$smarty->assign('CUSTOM_LINKS', Vtiger_Link::getAllByType(getTabid($currentModule), 'DETAILVIEW', $customlink_params)); +// END + +$custom_fields_data = getCalendarCustomFields($tabid,'detail_view',$focus->column_fields); +$smarty->assign("CUSTOM_FIELDS_DATA", $custom_fields_data); + +$smarty->display("ActivityDetailView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/EditView.php b/oss/vtiger/trunk/modules/Calendar/EditView.php new file mode 100644 index 00000000..671ad994 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/EditView.php @@ -0,0 +1,297 @@ +assign("SEARCH", $searchurl); +//4600 ends + +$activity_mode = vtlib_purify($_REQUEST['activity_mode']); +if($activity_mode == 'Task') +{ + $tab_type = 'Calendar'; + $taskcheck = true; + $smarty->assign("SINGLE_MOD",$mod_strings['LBL_TODO']); +} +elseif($activity_mode == 'Events') +{ + $tab_type = 'Events'; + $taskcheck = false; + $smarty->assign("SINGLE_MOD",$mod_strings['LBL_EVENT']); +} + +if(isset($_REQUEST['record']) && $_REQUEST['record']!='') { + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],$tab_type); + $focus->name=$focus->column_fields['subject']; + $sql = 'select vtiger_users.user_name,vtiger_invitees.* from vtiger_invitees left join vtiger_users on vtiger_invitees.inviteeid=vtiger_users.id where activityid=?'; + $result = $adb->pquery($sql, array($focus->id)); + $num_rows=$adb->num_rows($result); + $invited_users=Array(); + for($i=0;$i<$num_rows;$i++) + { + $userid=$adb->query_result($result,$i,'inviteeid'); + $username=$adb->query_result($result,$i,'user_name'); + $invited_users[$userid]=$username; + } + $smarty->assign("INVITEDUSERS",$invited_users); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $related_array = getRelatedLists("Calendar", $focus); + $cntlist = $related_array['Contacts']['entries']; + $is_fname_permitted = getFieldVisibilityPermission("Contacts", $current_user->id, 'firstname'); + $cnt_idlist = ''; + $cnt_namelist = ''; + if($cntlist != '') + { + $i = 0; + foreach($cntlist as $key=>$cntvalue) + { + if($i != 0) + { + $cnt_idlist .= ';'; + $cnt_namelist .= "\n"; + } + $cnt_idlist .= $key; + $contName = eregi_replace("(]*>)(.*)()", "\\2", $cntvalue[0]); + if ($is_fname_permitted == '0') $contName .= ' '.eregi_replace("(]*>)(.*)()", "\\2", $cntvalue[1]); + $cnt_namelist .= ''; + $i++; + } + } + $smarty->assign("CONTACTSID",$cnt_idlist); + $smarty->assign("CONTACTSNAME",$cnt_namelist); + $query = 'select vtiger_recurringevents.recurringfreq,vtiger_recurringevents.recurringinfo from vtiger_recurringevents where vtiger_recurringevents.activityid = ?'; + $res = $adb->pquery($query, array($focus->id)); + $rows = $adb->num_rows($res); + if($rows != 0) + { + $value['recurringcheck'] = 'Yes'; + $value['repeat_frequency'] = $adb->query_result($res,0,'recurringfreq'); + $recurringinfo = explode("::",$adb->query_result($res,0,'recurringinfo')); + $value['eventrecurringtype'] = $recurringinfo[0]; + if($recurringinfo[0] == 'Weekly') + { + for($i=0;$i<6;$i++) + { + $label = 'week'.$recurringinfo[$i+1]; + $value[$label] = 'checked'; + } + } + elseif($recurringinfo[0] == 'Monthly') + { + $value['repeatMonth'] = $recurringinfo[1]; + if($recurringinfo[1] == 'date') + { + $value['repeatMonth_date'] = $recurringinfo[2]; + } + else + { + $value['repeatMonth_daytype'] = $recurringinfo[2]; + $value['repeatMonth_day'] = $recurringinfo[3]; + } + } + } + else + { + $value['recurringcheck'] = 'No'; + } + +}else +{ + if(isset($_REQUEST['contact_id']) && $_REQUEST['contact_id']!=''){ + $smarty->assign("CONTACTSID",$_REQUEST['contact_id']); + $contact_name = ""; + $smarty->assign("CONTACTSNAME",$contact_name); + $account_id = $_REQUEST['account_id']; + $account_name = getAccountName($account_id); + } +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} +$userDetails=getOtherUserName($current_user->id); +$to_email = getUserEmailId('id',$current_user->id); +$smarty->assign("CURRENTUSERID",$current_user->id); + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') +{ + $act_data = getBlocks($tab_type,$disp_view,$mode,$focus->column_fields); +} +else +{ + $act_data = getBlocks($tab_type,$disp_view,$mode,$focus->column_fields,'BAS'); +} +$smarty->assign("BLOCKS",$act_data); +foreach($act_data as $header=>$blockitem) +{ + foreach($blockitem as $row=>$data) + { + foreach($data as $key=>$maindata) + { + $uitype[$maindata[2][0]] = $maindata[0][0]; + $fldlabel[$maindata[2][0]] = $maindata[1][0]; + $fldlabel_sel[$maindata[2][0]] = $maindata[1][1]; + $fldlabel_combo[$maindata[2][0]] = $maindata[1][2]; + $value[$maindata[2][0]] = $maindata[3][0]; + $secondvalue[$maindata[2][0]] = $maindata[3][1]; + $thirdvalue[$maindata[2][0]] = $maindata[3][2]; + } + } +} +// jread.topik. patch account_id for create contact +if (strlen($account_name) > 0) +{ + $fldlabel_sel['parent_id'][1]='selected'; + $secondvalue['parent_id'] = $account_id; + $value['parent_id'] = $account_name; +} + +$format = ($current_user->hour_format == '')?'am/pm':$current_user->hour_format; +$stdate = key($value['date_start']); +$enddate = key($value['due_date']); +$sttime = $value['date_start'][$stdate]; +$endtime = $value['due_date'][$enddate]; +$time_arr = getaddEventPopupTime($sttime,$endtime,$format); +$value['starthr'] = $time_arr['starthour']; +$value['startmin'] = $time_arr['startmin']; +$value['startfmt'] = $time_arr['startfmt']; +$value['endhr'] = $time_arr['endhour']; +$value['endmin'] = $time_arr['endmin']; +$value['endfmt'] = $time_arr['endfmt']; +$smarty->assign("STARTHOUR",getTimeCombo($format,'start',$time_arr['starthour'],$time_arr['startmin'],$time_arr['startfmt'],$taskcheck)); +$smarty->assign("ENDHOUR",getTimeCombo($format,'end',$time_arr['endhour'],$time_arr['endmin'],$time_arr['endfmt'])); +$smarty->assign("FOLLOWUP",getTimeCombo($format,'followup_start',$time_arr['endhour'],$time_arr['endmin'],$time_arr['endfmt'])); +$smarty->assign("ACTIVITYDATA",$value); +$smarty->assign("LABEL",$fldlabel); +$smarty->assign("secondvalue",$secondvalue); +$smarty->assign("thirdvalue",$thirdvalue); +$smarty->assign("fldlabel_combo",$fldlabel_combo); +$smarty->assign("fldlabel_sel",$fldlabel_sel); +$smarty->assign("OP_MODE",$disp_view); +$smarty->assign("ACTIVITY_MODE",$activity_mode); +$smarty->assign("HOURFORMAT",$format); +$smarty->assign("USERSLIST",$userDetails); +$smarty->assign("USEREMAILID",$to_email); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("DATEFORMAT",parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Activity edit view"); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +if (isset($focus->name)) +$smarty->assign("NAME", $focus->name); +else +$smarty->assign("NAME", ""); + +if($focus->mode == 'edit') +{ + $smarty->assign("MODE", $focus->mode); +} + +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +// Unimplemented until jscalendar language vtiger_files are fixed +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +if (isset($_REQUEST['return_module'])) + $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if (isset($_REQUEST['return_action'])) + $smarty->assign("RETURN_ACTION",vtlib_purify( $_REQUEST['return_action'])); +if (isset($_REQUEST['return_id'])) + $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset($_REQUEST['ticket_id'])) + $smarty->assign("TICKETID", $_REQUEST['ticket_id']); +if (isset($_REQUEST['product_id'])) + $smarty->assign("PRODUCTID", $_REQUEST['product_id']); +if (isset($_REQUEST['return_viewname'])) + $smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); +if(isset($_REQUEST['view']) && $_REQUEST['view']!='') + $smarty->assign("view",vtlib_purify($_REQUEST['view'])); +if(isset($_REQUEST['hour']) && $_REQUEST['hour']!='') + $smarty->assign("hour",vtlib_purify($_REQUEST['hour'])); +if(isset($_REQUEST['day']) && $_REQUEST['day']!='') + $smarty->assign("day",vtlib_purify($_REQUEST['day'])); +if(isset($_REQUEST['month']) && $_REQUEST['month']!='') + $smarty->assign("month",vtlib_purify($_REQUEST['month'])); +if(isset($_REQUEST['year']) && $_REQUEST['year']!='') + $smarty->assign("year",vtlib_purify($_REQUEST['year'])); +if(isset($_REQUEST['viewOption']) && $_REQUEST['viewOption']!='') + $smarty->assign("viewOption",vtlib_purify($_REQUEST['viewOption'])); +if(isset($_REQUEST['subtab']) && $_REQUEST['subtab']!='') + $smarty->assign("subtab",vtlib_purify($_REQUEST['subtab'])); +if(isset($_REQUEST['maintab']) && $_REQUEST['maintab']!='') + $smarty->assign("maintab",vtlib_purify($_REQUEST['maintab'])); + + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); + + $tabid = getTabid($tab_type); + $validationData = getDBValidationData($focus->tab_name,$tabid); + $data = split_validationdataArray($validationData); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +if ($activity_mode == 'Task') { + $custom_fields_data = getCalendarCustomFields(getTabid('Calendar'),'edit',$focus->column_fields); +} else { + $custom_fields_data = getCalendarCustomFields(getTabid('Events'),'edit',$focus->column_fields); +} +$smarty->assign("CUSTOM_FIELDS_DATA", $custom_fields_data); + +$smarty->assign("REPEAT_LIMIT_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +$smarty->display("ActivityEditView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/ListView.php b/oss/vtiger/trunk/modules/Calendar/ListView.php new file mode 100644 index 00000000..2ac99415 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/ListView.php @@ -0,0 +1,276 @@ +initSortbyField('Calendar'); +// END +$smarty = new vtigerCRM_Smarty; +$other_text = Array(); + +if(!$_SESSION['lvs'][$currentModule]) +{ + unset($_SESSION['lvs']); + $modObj = new ListViewSession(); + $modObj->sorder = $sorder; + $modObj->sortby = $order_by; + $_SESSION['lvs'][$currentModule] = get_object_vars($modObj); +} + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR",$mod_strings["SHARED_EVENT_DEL_MSG"]); +}else +{ + $smarty->assign("ERROR",""); +} +//<<<<<<< sort ordering >>>>>>>>>>>>> +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION['ACTIVITIES_ORDER_BY'] = $order_by; +$_SESSION['ACTIVITIES_SORT_ORDER'] = $sorder; +//<<<<<<< sort ordering >>>>>>>>>>>>> + + +//<<<>>>>>> +$oCustomView = new CustomView($currentModule); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); + +//Added to handle approving or denying status-public by the admin in CustomView +$statusdetails = $oCustomView->isPermittedChangeStatus($viewnamedesc['status']); +$smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + +//To check if a user is able to edit/delete a customview +$edit_permit = $oCustomView->isPermittedCustomView($viewid,'EditView',$currentModule); +$delete_permit = $oCustomView->isPermittedCustomView($viewid,'Delete',$currentModule); +$smarty->assign("CV_EDIT_PERMIT",$edit_permit); +$smarty->assign("CV_DELETE_PERMIT",$delete_permit); + +//<<<<>>>> +if($viewid == 0 ) +{ + echo "
"; + echo "
+ + + + + + + + + +
'> + $app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; +} + +$changeOwner = getAssignedTo(16); +$userList = $changeOwner[0]; +$groupList = $changeOwner[1]; + +$smarty->assign("CHANGE_USER",$userList); +$smarty->assign("CHANGE_GROUP",$groupList); +$smarty->assign("CHANGE_OWNER",getUserslist()); +$smarty->assign("CHANGE_GROUP_OWNER",getGroupslist()); +$where = ""; + +$url_string = ''; // assigning http url string + +if(isset($_REQUEST['query']) && $_REQUEST['query'] == 'true') +{ + + list($where, $ustring) = split("#@@#",getWhereCondition($currentModule)); + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); +} + + +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} + +if(isPermitted("Calendar","Delete",$_REQUEST['record']) == 'yes') +{ + $other_text['del'] = $app_strings[LBL_MASS_DELETE]; +} +if(isPermitted('Calendar','EditView','') == 'yes') +{ + $other_text['c_owner'] = $app_strings[LBL_CHANGE_OWNER]; +} +global $task_title; +$title_display = $current_module_strings['LBL_LIST_FORM_TITLE']; +if ($task_title) $title_display= $task_title; + +//Retreive the list from Database +//<<<<<<<<>>>>>>>> +if($viewid != "0") +{ + $listquery = getListQuery("Calendar"); + $list_query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"Calendar"); +}else +{ + $list_query = getListQuery("Calendar"); +} +//<<<<<<<>>>>>>>> + +if(isset($where) && $where != '') +{ + if(isset($_REQUEST['from_homepagedb']) && $_REQUEST['from_homepagedb'] == 'true') + $list_query .= " and ((vtiger_activity.status!='Completed' and vtiger_activity.status!='Deferred') or vtiger_activity.status is null) and ((vtiger_activity.eventstatus!='Held' and vtiger_activity.eventstatus!='Not Held') or vtiger_activity.eventstatus is null) AND ".$where; + else + $list_query .= " AND " .$where; +} +if (isset($_REQUEST['from_homepage'])) { + $today = date("Y-m-d", time()); + if ($_REQUEST['from_homepage'] == 'upcoming_activities') + $list_query .= " AND (vtiger_activity.status is NULL OR vtiger_activity.status not in ('Completed','Deferred')) and (vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus not in ('Held','Not Held')) AND (date_start >= '$today' OR vtiger_recurringevents.recurringdate >= '$today')"; + elseif ($_REQUEST['from_homepage'] == 'pending_activities') + $list_query .= " AND (vtiger_activity.status is NULL OR vtiger_activity.status not in ('Completed','Deferred')) and (vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus not in ('Held','Not Held')) AND (due_date <= '$today' OR vtiger_recurringevents.recurringdate <= '$today')"; +} + +if(isset($order_by) && $order_by != '') { + if($order_by == 'smownerid') { + $list_query .= ' ORDER BY user_name '.$sorder; + } else { + $tablename = getTableNameForField('Calendar',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + if($order_by == 'lastname') + $list_query .= ' ORDER BY vtiger_contactdetails.lastname '.$sorder; + else + $list_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; + } +} + +//Constructing the list view +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Activity'); +$smarty->assign("BUTTONS",$other_text); +$smarty->assign("NEW_EVENT",$app_strings['LNK_NEW_EVENT']); +$smarty->assign("NEW_TASK",$app_strings['LNK_NEW_TASK']); + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +//Retreive the List View Table Header +if($viewid !='') +$url_string .="&viewname=".$viewid; + +//Cambiado code to add close button in custom vtiger_field +if (($viewid!=0)&&($viewid!="")){ + if (!isset($oCustomView->list_fields['Close'])) $oCustomView->list_fields['Close']=array ( 'vtiger_activity' => 'eventstatus' ); + if (!isset($oCustomView->list_fields_name['Close'])) $oCustomView->list_fields_name['Close']='eventstatus'; +} +$listview_header = getListViewHeader($focus,"Calendar",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_header_search=getSearchListHeaderValues($focus,"Calendar",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER", $listview_header_search); + +$listview_entries = getListViewEntries($focus,"Calendar",$list_result,$navigation_array,"","","EditView","Delete",$oCustomView); +$smarty->assign("LISTENTITY", $listview_entries); +$smarty->assign("SELECT_SCRIPT", $view_script); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array,$url_string,"Calendar","ListView",$viewid); +$alphabetical = AlphabeticalSearch($currentModule,'ListView','subject','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($module); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NAVIGATION", $navigationOutput); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display("ActivityListView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/ListViewPagging.php b/oss/vtiger/trunk/modules/Calendar/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/OpenListView.php b/oss/vtiger/trunk/modules/Calendar/OpenListView.php new file mode 100644 index 00000000..4910f09d --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/OpenListView.php @@ -0,0 +1,201 @@ +debug("Entering getPendingActivities() method ..."); + require_once('data/Tracker.php'); + require_once('include/utils/utils.php'); + require_once('user_privileges/default_module_view.php'); + + global $currentModule; + global $singlepane_view; + global $theme; + global $focus; + global $action; + global $adb; + global $app_strings; + global $current_language; + global $current_user; + $current_module_strings = return_module_language($current_language, 'Calendar'); + + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + + if($_REQUEST['activity_view']==''){ + $activity_view='today'; + }else{ + $activity_view=vtlib_purify($_REQUEST['activity_view']); + } + + $today = date("Y-m-d", time()); + if($view == 'today'){ + $upcoming_condition = " AND (date_start = '$today' OR vtiger_recurringevents.recurringdate = '$today')"; + $pending_condition = " AND (due_date = '$today' OR vtiger_recurringevents.recurringdate = '$today')"; + }else if($view == 'all'){ + $upcoming_condition = " AND (date_start >= '$today' OR vtiger_recurringevents.recurringdate >= '$today')"; + $pending_condition = " AND (due_date <= '$today' OR vtiger_recurringevents.recurringdate <= '$today')"; + } + + if($mode != 1){ + $list_query = " select vtiger_crmentity.crmid,vtiger_crmentity.smownerid,vtiger_crmentity.setype, vtiger_recurringevents.recurringdate, + vtiger_activity.activityid, vtiger_activity.activitytype, vtiger_activity.date_start, vtiger_activity.due_date, + from vtiger_activity inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid left outer join vtiger_recurringevents on vtiger_recurringevents.activityid=vtiger_activity.activityid WHERE vtiger_crmentity.deleted=0 and vtiger_activity.activitytype not in ('Emails') AND ( vtiger_activity.status is NULL OR vtiger_activity.status not in ('Completed','Deferred')) and ( vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus not in ('Held','Not Held') )".$upcoming_condition; + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[16] == 3){ + $sec_parameter=getListViewSecurityParameter('Calendar'); + $list_query .= $sec_parameter; + } + }else{ + $list_query = "select vtiger_crmentity.crmid,vtiger_crmentity.smownerid,vtiger_crmentity.setype, vtiger_recurringevents.recurringdate, + vtiger_activity.activityid, vtiger_activity.activitytype, vtiger_activity.date_start, vtiger_activity.due_date, + from vtiger_activity inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid left outer join vtiger_recurringevents on vtiger_recurringevents.activityid=vtiger_activity.activityid WHERE vtiger_crmentity.deleted=0 and (vtiger_activity.activitytype not in ('Emails')) AND (vtiger_activity.status is NULL OR vtiger_activity.status not in ('Completed','Deferred')) and (vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus not in ('Held','Not Held')) ".$pending_condition; + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[16] == 3){ + $sec_parameter=getListViewSecurityParameter('Calendar'); + $list_query .= $sec_parameter; + } + + $list_query.= " GROUP BY vtiger_activity.activityid"; + $list_query.= " ORDER BY date_start,time_start ASC"; + $res = $adb->query($list_query); + $noofrecords = $adb->num_rows($res); + $open_activity_list = array(); + $noofrows = $adb->num_rows($res); + if (count($res)>0){ + for($i=0;$i<$noofrows;$i++){ + $open_activity_list[] = Array('name' => $adb->query_result($res,$i,'subject'), + 'id' => $adb->query_result($res,$i,'activityid'), + 'type' => $adb->query_result($res,$i,'activitytype'), + 'module' => $adb->query_result($res,$i,'setype'), + 'date_start' => getDisplayDate($adb->query_result($res,$i,'date_start')), + 'due_date' => getDisplayDate($adb->query_result($res,$i,'due_date')), + 'recurringdate' => getDisplayDate($adb->query_result($res,$i,'recurringdate')), + 'priority' => $adb->query_result($res,$i,'priority'), // Armando L�scher 04.07.2005 -> �priority -> Desc: Get vtiger_priority from db + ); + } + } + + $title=array(); + $title[]=$view; + $title[]='myUpcoPendAct.gif'; + $title[]='home_myact'; + $title[]='showActivityView'; + $title[]='MyUpcumingFrm'; + $title[]='activity_view'; + + $header=array(); + $header[] =$current_module_strings['LBL_LIST_SUBJECT']; + $header[] ='Type'; + + $return_url="&return_module=$currentModule&return_action=DetailView&return_id=" . ((is_object($focus)) ? $focus->id : ""); + $oddRow = true; + $entries=array(); + + foreach($open_activity_list as $event){ + $recur_date=ereg_replace('--','',$event['recurringdate']); + if($recur_date!=""){ + $event['date_start']=$event['recurringdate']; + } + $font_color_high = "color:#00DD00;"; + $font_color_medium = "color:#DD00DD;"; + + switch ($event['priority']){ + case 'High': + $font_color=$font_color_high; + break; + case 'Medium': + $font_color=$font_color_medium; + break; + default: + $font_color=''; + } + + if($event['type'] != 'Task' && $event['type'] != 'Emails' && $event['type'] != ''){ + $activity_type = 'Events'; + }else{ + $activity_type = 'Task'; + } + } + $entries[$event['id']] = array( + '0' => ''.$event["name"].'', + 'IMAGE' => '', + ); + } + $values=Array('noofactivities'=>$noofrecords,'Title'=>$title,'Header'=>$header,'Entries'=>$entries); + $log->debug("Exiting getPendingActivities method ..."); + return $values; +} + +/** + * Function creates HTML to display ActivityView selection box + * @param string $activity_view - activity view + * return string $ACTIVITY_VIEW_SELECT_OPTION - HTML selection box + */ +function getActivityview($activity_view) +{ + global $log; + $log->debug("Entering getActivityview(".$activity_view.") method ..."); + $today = date("Y-m-d", time()); + + if($activity_view == 'Today') + { + $selected1 = 'selected'; + } + else if($activity_view == 'This Week') + { + $selected2 = 'selected'; + } + else if($activity_view == 'This Month') + { + $selected3 = 'selected'; + } + else if($activity_view == 'This Year') + { + $selected4 = 'selected'; + } + + //constructing the combo values for activities + $ACTIVITY_VIEW_SELECT_OPTION = ''; + + $log->debug("Exiting getActivityview method ..."); + return $ACTIVITY_VIEW_SELECT_OPTION; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/QuickCreate.php b/oss/vtiger/trunk/modules/Calendar/QuickCreate.php new file mode 100644 index 00000000..fbe0170b --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/QuickCreate.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/RenderRelatedListUI.php b/oss/vtiger/trunk/modules/Calendar/RenderRelatedListUI.php new file mode 100644 index 00000000..7d2d0ccc --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/RenderRelatedListUI.php @@ -0,0 +1,164 @@ +debug("Entering get_duration(".$time_start.",".$duration_hours.",".$duration_minutes.") method ..."); + $time=explode(":",$time_start); + $time_mins = $time[1]; + $time_hrs = $time[0]; + $mins = ($time_mins + $duration_minutes) % 60; + $hrs_min = floor(($time_mins + $duration_minutes) / 60); + if(!isset($hrs)) + $hrs=0; + $hrs = $duration_hours + $hrs_min + $time_hrs; + if($hrs<10) + $hrs=$hrs; + if($mins<10) + $mins="0".$mins; + + $end_time = $hrs .$mins; + $log->debug("Exiting get_duration method ..."); + return $end_time; + } + + /** + * Function to convert time to number + * @param string $time_start - activity start time + * return integer $start_time - time + */ + function time_to_number($time_start) + { + global $log; + $log->debug("Entering time_to_number(".$time_start.") method ..."); + $start_time_array = explode(":",$time_start); + if(ereg("^[0]",$start_time_array[0])) + { + $time_start_hrs=str_replace('0',"",$start_time_array[0]); + } + else + { + $time_start_hrs=$start_time_array[0]; + } + $start_time= $time_start_hrs .$start_time_array[1]; + $log->debug("Exiting time_to_number method ..."); + return $start_time; + } + + /** + * Function to status availability of user + * @param string $owner - ownername + * @param integer $userid - userid + * @param integer $activity_id - activityid + * @param string $avail_date - date in string format + * @param string $activity_start_time - time string + * @param string $activity_end_time - time string + * return string $availability - html img tag in string + */ + function status_availability($owner,$userid,$activity_id,$avail_date,$activity_start_time,$activity_end_time) + { + global $adb,$image_path,$log,$theme; + $log->debug("Entering status_availability(".$owner,$userid.",".$activity_id.",".$avail_date.",".$activity_start_time.",".$activity_end_time.") method ..."); + $avail_flag="false"; + $avail_date=getDBInsertDateValue($avail_date); + if( $owner != $userid) + { + + $usr_query="select activityid,vtiger_activity.date_start,vtiger_activity.due_date, vtiger_activity.time_start,vtiger_activity.duration_hours,vtiger_activity.duration_minutes,vtiger_crmentity.smownerid from vtiger_activity,vtiger_crmentity where vtiger_crmentity.crmid=vtiger_activity.activityid and ('".$avail_date."' like date_start) and vtiger_crmentity.smownerid=? and vtiger_activity.activityid !=? and vtiger_crmentity.deleted=0"; + } + else + { + $usr_query="select activityid,vtiger_activity.date_start,vtiger_activity.due_date, vtiger_activity.time_start,vtiger_activity.duration_hours,vtiger_activity.duration_minutes,vtiger_crmentity.smownerid from vtiger_activity,vtiger_crmentity where vtiger_crmentity.crmid=vtiger_activity.activityid and ('".$avail_date."' like date_start) and vtiger_crmentity.smownerid=? and vtiger_activity.activityid !=? and vtiger_crmentity.deleted=0"; + } + $result_cal=$adb->pquery($usr_query, array($userid, $activity_id)); + $noofrows_cal = $adb->num_rows($result_cal); + $avail_flag="false"; + + if($noofrows_cal!=0) + { + while($row_cal = $adb->fetch_array($result_cal)) + { + $usr_date_start=$row_cal['date_start']; + $usr_due_date=$row_cal['due_date']; + $usr_time_start=$row_cal['time_start']; + $usr_hour_dur=$row_cal['duration_hours']; + $usr_mins_dur=$row_cal['duration_minutes']; + $user_start_time=time_to_number($usr_time_start); + $user_end_time=get_duration($usr_time_start,$usr_hour_dur,$usr_mins_dur); + + if( ( ($user_start_time > $activity_start_time) && ( $user_start_time < $activity_end_time) ) || ( ( $user_end_time > $activity_start_time) && ( $user_end_time < $activity_end_time) ) || ( ( $activity_start_time == $user_start_time ) || ($activity_end_time == $user_end_time) ) ) + { + $availability= 'busy'; + $avail_flag="true"; + $log->info("user start time-- ".$user_start_time."user end time".$user_end_time); + $log->info("Availability ".$availability); + + } + } + } + if($avail_flag!="true") + { + $recur_query="SELECT vtiger_activity.activityid, vtiger_activity.time_start, vtiger_activity.duration_hours, vtiger_activity.duration_minutes , vtiger_crmentity.smownerid, vtiger_recurringevents.recurringid, vtiger_recurringevents.recurringdate as date_start from vtiger_activity inner join vtiger_crmentity on vtiger_activity.activityid = vtiger_crmentity.crmid inner join vtiger_recurringevents on vtiger_activity.activityid=vtiger_recurringevents.activityid where ('".$avail_date."' like vtiger_recurringevents.recurringdate) and vtiger_crmentity.smownerid=? and vtiger_activity.activityid !=? and vtiger_crmentity.deleted=0"; + $result_cal=$adb->pquery($recur_query, array($userid, $activity_id)); + $noofrows_cal = $adb->num_rows($result_cal); + $avail_flag="false"; + + if($noofrows_cal!=0) + { + while($row_cal = $adb->fetch_array($result_cal)) + { + $usr_date_start=$row_cal['date_start']; + $usr_time_start=$row_cal['time_start']; + $usr_hour_dur=$row_cal['duration_hours']; + $usr_mins_dur=$row_cal['duration_minutes']; + $user_start_time=time_to_number($usr_time_start); + $user_end_time=get_duration($usr_time_start,$usr_hour_dur,$usr_mins_dur); + + if( ( ($user_start_time > $activity_start_time) && ( $user_start_time < $activity_end_time) ) || ( ( $user_end_time > $activity_start_time) && ( $user_end_time < $activity_end_time) ) || ( ( $activity_start_time == $user_start_time ) || ($activity_end_time == $user_end_time) ) ) + { + $availability= 'busy'; + $avail_flag="true"; + $log->info("Recurring Events:: user start time-- ".$user_start_time."user end time".$user_end_time); + $log->info("Recurring Events:: Availability ".$availability); + } + } + } + + + } + if($avail_flag == "true") + { + $availability=' '; + } + else + { + $availability=' '; + } + $log->debug("Exiting status_availability method ..."); + return $availability; + + } + +?> diff --git a/oss/vtiger/trunk/modules/Calendar/RepeatEvents.php b/oss/vtiger/trunk/modules/Calendar/RepeatEvents.php new file mode 100644 index 00000000..d41b1587 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/RepeatEvents.php @@ -0,0 +1,182 @@ +date_format) { + case 'dd-mm-yyyy': $format_string = 'd-m-Y H:i'; break; + case 'mm-dd-yyyy': $format_string = 'm-d-Y H:i'; break; + case 'yyyy-mm-dd': $format_string = 'Y-m-d H:i'; break; + } + return date($format_string, self::mktime($timeInYMDHIS)); + } + /** + * Split full timing into date and time part. + */ + static function splittime($fulltiming) { + return split(' ', $fulltiming); + } + /** + * Calculate the time interval to create repeated event entries. + */ + static function getRepeatInterval($type, $frequency, $recurringInfo, $start_date, $limit_date) { + $repeatInterval = Array(); + $starting = self::mktime($start_date); + $limiting = self::mktime($limit_date); + + if($type == 'Daily') { + $count = 0; + while(true) { + ++$count; + $interval = ($count * $frequency); + if(self::mktime(self::nexttime($starting, "+$interval days")) > $limiting) { + break; + } + $repeatInterval[] = $interval; + } + } else if($type == 'Weekly') { + if($recurringInfo->dayofweek_to_rpt == null) { + $count = 0; + $weekcount = 7; + while(true) { + ++$count; + $interval = $count * $weekcount; + if(self::mktime(self::nexttime($starting, "+$interval days")) > $limiting) { + break; + } + $repeatInterval[] = $interval; + } + } else { + $count = 0; + while(true) { + ++$count; + $interval = $count; + $new_timing = self::mktime(self::nexttime($starting, "+$interval days")); + $new_timing_dayofweek = date('N', $new_timing); + if($new_timing > $limiting) { + break; + } + if(in_array($new_timing_dayofweek-1, $recurringInfo->dayofweek_to_rpt)) { + $repeatInterval[] = $interval; + } + } + } + } else if($type == 'Monthly') { + $count = 0; + $avg_monthcount = 30; // TODO: We need to handle month increments precisely! + while(true) { + ++$count; + $interval = $count * $avg_monthcount; + if(self::mktime(self::nexttime($starting, "+$interval days")) > $limiting) { + break; + } + $repeatInterval[] = $interval; + } + } else if($type == 'Yearly') { + $count = 0; + $avg_monthcount = 30; + while(true) { + ++$count; + $interval = $count * $avg_monthcount; + if(self::mktime(self::nexttime($starting, "+$interval days")) > $limiting) { + break; + } + $repeatInterval[] = $interval; + } + } + return $repeatInterval; + } + + /** + * Repeat Activity instance till given limit. + */ + static function repeat($focus) { + + global $log; + $repeat = getrecurringObjValue(); + $frequency = $repeat->recur_freq; + $repeattype= $repeat->recur_type; + + $base_focus = new Activity(); + $base_focus->retrieve_entity_info($focus->id,'Events'); + $base_focus->id = $_REQUEST['record']; + + $base_focus_start = $base_focus->column_fields['date_start'].' '.$base_focus->column_fields['time_start']; + $base_focus_end = $base_focus->column_fields['due_date'].' '.$base_focus->column_fields['time_end']; + + $repeat_limit = getDBInsertDateValue($_REQUEST['calendar_repeat_limit_date']).' '.$base_focus->column_fields['time_start']; + + $repeatIntervals = self::getRepeatInterval($repeattype, $frequency, $repeat, $base_focus_start, $repeat_limit); + + $base_focus_start = self::mktime($base_focus_start); + $base_focus_end = self::mktime($base_focus_end); + + $skip_focus_fields = Array ('record_id', 'createdtime', 'modifiedtime', 'recurringtype'); + + /** Create instance before and reuse */ + $new_focus = new Activity(); + + foreach($repeatIntervals as $interval) { + $new_focus_start_timing = self::nexttime($base_focus_start, "+$interval days"); + $new_focus_start_timing = self::splittime(self::formattime($new_focus_start_timing)); + + $new_focus_end_timing = self::nexttime($base_focus_end, "+$interval days"); + $new_focus_end_timing = self::splittime(self::formattime($new_focus_end_timing)); + + // Reset the new_focus and prepare for reuse + if(isset($new_focus->id)) unset($new_focus->id); + foreach($new_focus->column_fields as $key=>$value) $new_focus->column_fields[$key] = ''; + + foreach($base_focus->column_fields as $key=>$value) { + if(in_array($key, $skip_focus_fields)) { + // skip copying few fields + } else if($key == 'date_start') { + $new_focus->column_fields['date_start'] = $new_focus_start_timing[0]; + } else if($key == 'time_start') { + $new_focus->column_fields['time_start'] = $new_focus_start_timing[1]; + } else if($key == 'time_end') { + $new_focus->column_fields['time_end'] = $new_focus_end_timing[1]; + } else if($key == 'due_date') { + $new_focus->column_fields['due_date'] = $new_focus_end_timing[0]; + } else { + $new_focus->column_fields[$key] = $value; + } + } + $new_focus->save('Calendar'); + } + } +} + +?> diff --git a/oss/vtiger/trunk/modules/Calendar/Save.php b/oss/vtiger/trunk/modules/Calendar/Save.php new file mode 100644 index 00000000..d9e73830 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/Save.php @@ -0,0 +1,306 @@ +column_fields["activitytype"] = 'Task'; +if(isset($_REQUEST['record'])) +{ + $focus->id = $_REQUEST['record']; + $local_log->debug("id is ".$id); +} +if(isset($_REQUEST['mode'])) +{ + $focus->mode = $_REQUEST['mode']; +} + +if((isset($_REQUEST['change_status']) && $_REQUEST['change_status']) && ($_REQUEST['status']!='' || $_REQUEST['eventstatus']!='')) +{ + $status =''; + $activity_type=''; + $return_id = $focus->id; + if(isset($_REQUEST['status'])) + { + $status = $_REQUEST['status']; + $activity_type = "Task"; + } + elseif(isset($_REQUEST['eventstatus'])) + { + $status = $_REQUEST['eventstatus']; + $activity_type = "Events"; + } + if(isPermitted("Calendar","EditView",$_REQUEST['record']) == 'yes') + { + ChangeStatus($status,$return_id,$activity_type); + } + else + { + echo ""; + echo "
"; + echo "
+ + + + + + + + + +
' >$app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
"; + echo "
";die; + } + $mail_data = getActivityMailInfo($return_id,$status,$activity_type); + if($mail_data['sendnotification'] == 1) + { + getEventNotification($activity_type,$mail_data['subject'],$mail_data); + } + $invitee_qry = "select * from vtiger_invitees where activityid=?"; + $invitee_res = $adb->pquery($invitee_qry, array($return_id)); + $count = $adb->num_rows($invitee_res); + if($count != 0) + { + for($j = 0; $j < $count; $j++) + { + $invitees_ids[]= $adb->query_result($invitee_res,$j,"inviteeid"); + + } + $invitees_ids_string = implode(';',$invitees_ids); + sendInvitation($invitees_ids_string,$activity_type,$mail_data['subject'],$mail_data); + } + + +} +else +{ + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname])) + { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + $focus->column_fields[$fieldname] = $value; + if(($fieldname == 'notime') && ($focus->column_fields[$fieldname])) + { + $focus->column_fields['time_start'] = ''; + $focus->column_fields['duration_hours'] = ''; + $focus->column_fields['duration_minutes'] = ''; + } + if(($fieldname == 'recurringtype') && ! isset($_REQUEST['recurringcheck'])) + $focus->column_fields['recurringtype'] = '--None--'; + } + } + if(isset($_REQUEST['visibility']) && $_REQUEST['visibility']!= '') + $focus->column_fields['visibility'] = $_REQUEST['visibility']; + else + $focus->column_fields['visibility'] = 'Private'; + + if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; + } + $focus->save($tab_type); + /* For Followup START -- by Minnie */ + if(isset($_REQUEST['followup']) && $_REQUEST['followup'] == 'on' && $activity_mode == 'Events' && isset($_REQUEST['followup_time_start']) && $_REQUEST['followup_time_start'] != '') + { + $heldevent_id = $focus->id; + $focus->column_fields['subject'] = '[Followup] '.$focus->column_fields['subject']; + $focus->column_fields['date_start'] = $_REQUEST['followup_date']; + $focus->column_fields['due_date'] = $_REQUEST['followup_due_date']; + $focus->column_fields['time_start'] = $_REQUEST['followup_time_start']; + $focus->column_fields['time_end'] = $_REQUEST['followup_time_end']; + $focus->column_fields['eventstatus'] = 'Planned'; + $focus->mode = 'create'; + $focus->save($tab_type); + } + /* For Followup END -- by Minnie */ + $return_id = $focus->id; +} + +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") + $return_module = vtlib_purify($_REQUEST['return_module']); +else + $return_module = "Calendar"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") + $return_action = vtlib_purify($_REQUEST['return_action']); +else + $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") + $return_id = vtlib_purify($_REQUEST['return_id']); + +$activemode = ""; +if($activity_mode != '') + $activemode = "&activity_mode=".$activity_mode; + +function getRequestData($return_id) +{ + global $adb; + $cont_qry = "select * from vtiger_cntactivityrel where activityid=?"; + $cont_res = $adb->pquery($cont_qry, array($return_id)); + $noofrows = $adb->num_rows($cont_res); + $cont_id = array(); + if($noofrows > 0) { + for($i=0; $i<$noofrows; $i++) { + $cont_id[] = $adb->query_result($cont_res,$i,"contactid"); + } + } + $cont_name = ''; + foreach($cont_id as $key=>$id) { + if($id != '') { + $cont_name .= getContactName($id).', '; + } + } + $cont_name = trim($cont_name,', '); + $mail_data = Array(); + $mail_data['user_id'] = $_REQUEST['assigned_user_id']; + $mail_data['subject'] = $_REQUEST['subject']; + $mail_data['status'] = (($_REQUEST['activity_mode']=='Task')?($_REQUEST['taskstatus']):($_REQUEST['eventstatus'])); + $mail_data['activity_mode'] = $_REQUEST['activity_mode']; + $mail_data['taskpriority'] = $_REQUEST['taskpriority']; + $mail_data['relatedto'] = $_REQUEST['parent_name']; + $mail_data['contact_name'] = $cont_name; + $mail_data['description'] = $_REQUEST['description']; + $mail_data['assingn_type'] = $_REQUEST['assigntype']; + $mail_data['group_name'] = getGroupName($_REQUEST['assigned_group_id']); + $mail_data['mode'] = $_REQUEST['mode']; + $value = getaddEventPopupTime($_REQUEST['time_start'],$_REQUEST['time_end'],'24'); + $start_hour = $value['starthour'].':'.$value['startmin'].''.$value['startfmt']; + if($_REQUEST['activity_mode']!='Task') + $end_hour = $value['endhour'] .':'.$value['endmin'].''.$value['endfmt']; + $mail_data['st_date_time'] = getDisplayDate($_REQUEST['date_start'])." ".$start_hour; + $mail_data['end_date_time']=getDisplayDate($_REQUEST['due_date'])." ".$end_hour; + $mail_data['location']=vtlib_purify($_REQUEST['location']); + return $mail_data; +} + +if(isset($_REQUEST['contactidlist']) && $_REQUEST['contactidlist'] != '') +{ + //split the string and store in an array + $storearray = explode (";",$_REQUEST['contactidlist']); + $del_sql = "delete from vtiger_cntactivityrel where activityid=?"; + $adb->pquery($del_sql, array($record)); + foreach($storearray as $id) + { + if($id != '') + { + $record = $focus->id; + $sql = "insert into vtiger_cntactivityrel values (?,?)"; + $adb->pquery($sql, array($id, $record)); + if(!empty($heldevent_id)) { + $sql = "insert into vtiger_cntactivityrel values (?,?)"; + $adb->pquery($sql, array($id, $heldevent_id)); + } + } + } +} + +//Added code to send mail to the assigned to user about the details of the vtiger_activity if sendnotification = on and assigned to user +if($_REQUEST['sendnotification'] == 'on') +{ + $mail_contents = getRequestData($return_id); + getEventNotification($_REQUEST['activity_mode'],$_REQUEST['subject'],$mail_contents); +} + +//code added to send mail to the vtiger_invitees +if(isset($_REQUEST['inviteesid']) && $_REQUEST['inviteesid']!='') +{ + $mail_contents = getRequestData($return_id); + sendInvitation($_REQUEST['inviteesid'],$_REQUEST['activity_mode'],$_REQUEST['subject'],$mail_contents); +} + +//to delete contact account relation while editing event +if(isset($_REQUEST['deletecntlist']) && $_REQUEST['deletecntlist'] != '' && $_REQUEST['mode'] == 'edit') +{ + //split the string and store it in an array + $storearray = explode (";",$_REQUEST['deletecntlist']); + foreach($storearray as $id) + { + if($id != '') + { + $record = $focus->id; + $sql = "delete from vtiger_cntactivityrel where contactid=? and activityid=?"; + $adb->pquery($sql, array($id, $record)); + } + } + +} + +//to delete activity and its parent table relation +if(isset($_REQUEST['del_actparent_rel']) && $_REQUEST['del_actparent_rel'] != '' && $_REQUEST['mode'] == 'edit') +{ + $parnt_id = $_REQUEST['del_actparent_rel']; + $sql= 'delete from vtiger_seactivityrel where crmid=? and activityid=?'; + $adb->pquery($sql, array($parnt_id, $record)); +} + +if(isset($_REQUEST['view']) && $_REQUEST['view']!='') + $view=vtlib_purify($_REQUEST['view']); +if(isset($_REQUEST['hour']) && $_REQUEST['hour']!='') + $hour=vtlib_purify($_REQUEST['hour']); +if(isset($_REQUEST['day']) && $_REQUEST['day']!='') + $day=vtlib_purify($_REQUEST['day']); +if(isset($_REQUEST['month']) && $_REQUEST['month']!='') + $month=vtlib_purify($_REQUEST['month']); +if(isset($_REQUEST['year']) && $_REQUEST['year']!='') + $year=vtlib_purify($_REQUEST['year']); +if(isset($_REQUEST['viewOption']) && $_REQUEST['viewOption']!='') + $viewOption=vtlib_purify($_REQUEST['viewOption']); +if(isset($_REQUEST['subtab']) && $_REQUEST['subtab']!='') + $subtab=vtlib_purify($_REQUEST['subtab']); + +if($_REQUEST['recurringcheck']) { + include_once dirname(__FILE__) . '/RepeatEvents.php'; + Calendar_RepeatEvents::repeat($focus); +} + +//code added for returning back to the current view after edit from list view +if($_REQUEST['return_viewname'] == '') + $return_viewname='0'; +if($_REQUEST['return_viewname'] != '') + $return_viewname=vtlib_purify($_REQUEST['return_viewname']); + +$parenttab=getParentTab(); + +if($_REQUEST['start'] !='') + $page='&start='.vtlib_purify($_REQUEST['start']); +if($_REQUEST['maintab'] == 'Calendar') + header("Location: index.php?action=".$return_action."&module=".$return_module."&view=".$view."&hour=".$hour."&day=".$day."&month=".$month."&year=".$year."&record=".$return_id."&viewOption=".$viewOption."&subtab=".$subtab."&parenttab=$parenttab"); +else + header("Location: index.php?action=$return_action&module=$return_module$view$hour$day$month$year&record=$return_id$activemode&viewname=$return_viewname$page&parenttab=$parenttab&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/SendReminder.bat b/oss/vtiger/trunk/modules/Calendar/SendReminder.bat new file mode 100644 index 00000000..e148ff49 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/SendReminder.bat @@ -0,0 +1,3 @@ +@echo off +cd ..\..\ +..\..\..\php\php.exe SendReminder.php diff --git a/oss/vtiger/trunk/modules/Calendar/Settings.php b/oss/vtiger/trunk/modules/Calendar/Settings.php new file mode 100644 index 00000000..eaf1e900 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/Settings.php @@ -0,0 +1,42 @@ +0) { + for($i=0;$i<3-$count;$i++) { + $menu_array[] = array(); + } +} + +$smarty->assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("IMAGE_PATH", "themes/$theme/images/"); +$smarty->assign('MODULE',$module); +$smarty->assign('MODULE_LBL',getTranslatedString($module)); +$smarty->assign('MENU_ARRAY', $menu_array); + +$smarty->display(vtlib_getModuleTemplate('Vtiger','Settings.tpl')); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/TagCloud.php b/oss/vtiger/trunk/modules/Calendar/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Calendar/TodoSave.php b/oss/vtiger/trunk/modules/Calendar/TodoSave.php new file mode 100644 index 00000000..03282363 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/TodoSave.php @@ -0,0 +1,88 @@ +column_fields["activitytype"] = 'Task'; +} + +if(isset($_REQUEST['record'])) +{ + $focus->id = $_REQUEST['record']; +} +if(isset($_REQUEST['mode'])) +{ + $focus->mode = $_REQUEST['mode']; +} +foreach($focus->column_fields as $fieldname => $val) +{ + if(isset($_REQUEST[$fieldname])) + { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + $focus->column_fields[$fieldname] = $value; + } +} + $focus->column_fields["subject"] = $_REQUEST["task_subject"]; + $focus->column_fields["time_start"] = $_REQUEST["task_time_start"]; + $focus->column_fields["assigned_user_id"] = $_REQUEST["task_assigned_user_id"]; + $_REQUEST["assigned_group_id"] = $_REQUEST['task_assigned_group_id']; + $_REQUEST['assigntype'] = $_REQUEST['task_assigntype']; + $focus->column_fields["taskstatus"] = $_REQUEST["taskstatus"]; + $focus->column_fields["date_start"] = $_REQUEST["task_date_start"]; + $focus->column_fields["due_date"] = $_REQUEST["task_due_date"]; + $focus->column_fields["taskpriority"] = $_REQUEST["taskpriority"]; + $focus->column_fields["parent_id"] = $_REQUEST["task_parent_id"]; + $focus->column_fields["contact_id"] = $_REQUEST["task_contact_id"]; + $focus->column_fields["description"] = $_REQUEST["task_description"]; + if(isset($_REQUEST['task_sendnotification']) && $_REQUEST['task_sendnotification'] != null) + $focus->column_fields["sendnotification"] = $_REQUEST["task_sendnotification"]; + + $focus->save($tab_type); + if($_REQUEST["task_sendnotification"]=='on') + { + $mail_contents = getRequestedToData(); + getEventNotification($_REQUEST['activity_mode'],$_REQUEST['task_subject'],$mail_contents); + + } +function getRequestedToData() +{ + $mail_data = Array(); + $mail_data['user_id'] = $_REQUEST["task_assigned_user_id"]; + $mail_data['subject'] = $_REQUEST['task_subject']; + $mail_data['status'] = (($_REQUEST['activity_mode']=='Task')?($_REQUEST['taskstatus']):($_REQUEST['eventstatus'])); + $mail_data['activity_mode'] = $_REQUEST['activity_mode']; + $mail_data['taskpriority'] = $_REQUEST['taskpriority']; + $mail_data['relatedto'] = $_REQUEST['task_parent_name']; + $mail_data['contact_name'] = $_REQUEST['task_contact_name']; + $mail_data['description'] = $_REQUEST['task_description']; + $mail_data['assingn_type'] = $_REQUEST['task_assigntype']; + $mail_data['group_name'] = getGroupName($_REQUEST['task_assigned_group_id']); + $mail_data['mode'] = $_REQUEST['task_mode']; + $value = getaddEventPopupTime($_REQUEST['task_time_start'],$_REQUEST['task_time_end'],'24'); + $start_hour = $value['starthour'].':'.$value['startmin'].''.$value['startfmt']; + $mail_data['st_date_time'] = getDisplayDate($_REQUEST['task_date_start'])." ".$start_hour; + $mail_data['end_date_time']=getDisplayDate($_REQUEST['task_due_date']); + return $mail_data; +} + + header("Location: index.php?action=index&module=Calendar&view=".vtlib_purify($_REQUEST['view'])."&hour=".vtlib_purify($_REQUEST['hour'])."&day=".vtlib_purify($_REQUEST['day'])."&month=".vtlib_purify($_REQUEST['month'])."&year=".vtlib_purify($_REQUEST['year'])."&viewOption=".vtlib_purify($_REQUEST['viewOption'])."&subtab=todo&parenttab=".getParentTab()); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/UnifiedSearch.php b/oss/vtiger/trunk/modules/Calendar/UnifiedSearch.php new file mode 100644 index 00000000..14e4cbfa --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/UnifiedSearch.php @@ -0,0 +1,11 @@ + diff --git a/oss/vtiger/trunk/modules/Calendar/addEventUI.php b/oss/vtiger/trunk/modules/Calendar/addEventUI.php new file mode 100644 index 00000000..5d508bb0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/addEventUI.php @@ -0,0 +1,1106 @@ +id,true); + $to_email = getUserEmailId('id',$current_user->id); + $date_format = parse_calendardate($app_strings['NTC_DATE_FORMAT']); + $taskassignedto = getAssignedTo(9); + $eventassignedto = getAssignedTo(16); +$mysel= vtlib_purify($_REQUEST['view']); +$calendar_arr = Array(); +$calendar_arr['IMAGE_PATH'] = $image_path; +if(empty($mysel)){ + if($current_user->activity_view == "This Year"){ + $mysel = 'year'; + }else if($current_user->activity_view == "This Month"){ + $mysel = 'month'; + }else if($current_user->activity_view == "This Week"){ + $mysel = 'week'; + }else{ + $mysel = 'day'; + } +} +$date_data = array(); +if ( isset($_REQUEST['day'])) +{ + + $date_data['day'] = $_REQUEST['day']; +} + +if ( isset($_REQUEST['month'])) +{ + $date_data['month'] = $_REQUEST['month']; +} + +if ( isset($_REQUEST['week'])) +{ + $date_data['week'] = $_REQUEST['week']; +} + +if ( isset($_REQUEST['year'])) +{ + if ($_REQUEST['year'] > 2037 || $_REQUEST['year'] < 1970) + { + print("".$app_strings['LBL_CAL_LIMIT_MSG'].""); + exit; + } + $date_data['year'] = $_REQUEST['year']; +} + + +if(empty($date_data)) +{ + $data_value=date('Y-m-d H:i:s'); + preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$data_value,$value); + $date_data = Array( + 'day'=>$value[3], + 'month'=>$value[2], + 'year'=>$value[1], + 'hour'=>$value[4], + 'min'=>$value[5], + ); + +} +$calendar_arr['calendar'] = new Calendar($mysel,$date_data); +$calendar_arr['view'] = $mysel; +if($current_user->hour_format == '') + $calendar_arr['calendar']->hour_format = 'am/pm'; +else + $calendar_arr['calendar']->hour_format = $current_user->hour_format; + +/** Function to construct HTML code for Assigned To field + * @param $assignedto -- Assigned To values :: Type array + * @param $toggletype -- String to different event and task :: Type string + * return $htmlStr -- HTML code in string forat :: Type string + */ +function getAssignedToHTML($assignedto,$toggletype) +{ + global $app_strings; + $userlist = $assignedto[0]; + if(isset($assignedto[1]) && $assignedto[1] != null) + $grouplist = $assignedto[1]; + $htmlStr = ''; + $check = 1; + foreach($userlist as $key_one=>$arr) + { + foreach($arr as $sel_value=>$value) + { + if($value != '') + $check=$check*0; + else + $check=$check*1; + } + } + if($check == 0) + { + $select_user='checked'; + $style_user='display:block'; + $style_group='display:none'; + } + else + { + $select_group='checked'; + $style_user='display:none'; + $style_group='display:block'; + } + if($toggletype == 'task') + $htmlStr .= ' '.$app_strings['LBL_USER']; + else + $htmlStr .= ' '.$app_strings['LBL_USER']; + if($grouplist != '') + { + if($toggletype == 'task') + $htmlStr .= ' '.$app_strings['LBL_GROUP']; + else + $htmlStr .= ' '.$app_strings['LBL_GROUP']; + } + if($toggletype == 'task') + { + $htmlStr .= ' + '; + } + $htmlStr .= getUserslist(); + $htmlStr .= ' + '; + if($grouplist != '') + { + if($toggletype == 'task') + { + $htmlStr .= ' + '; + } + $htmlStr .= getGroupslist(); + $htmlStr .= ' + '; + } + return $htmlStr; +} + +?> + + + + + + + + + + + +
+ + + + +
+ + id,'eventstatus') == '0') { ?> + - + - + + + - + - + + - + +
+
+ + +
+ +column_fields['is_admin']=='on') + $Res = $adb->pquery("select * from vtiger_activitytype",array()); + else + { + $role_id=$current_user->roleid; + $subrole = getRoleSubordinates($role_id); + if(count($subrole)> 0) + { + $roleids = $subrole; + array_push($roleids, $role_id); + } + else + { + $roleids = $role_id; + } + + if (count($roleids) > 1) { + $Res=$adb->pquery("select distinct activitytype from vtiger_activitytype inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_activitytype.picklist_valueid where roleid in (". generateQuestionMarks($roleids) .") and picklistid in (select picklistid from vtiger_activitytype) order by sortid asc",array($roleids)); + } else { + $Res=$adb->pquery("select distinct activitytype from vtiger_activitytype inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_activitytype.picklist_valueid where roleid = ? and picklistid in (select picklistid from vtiger_activitytype) order by sortid asc",array($role_id)); + } + } + $eventlist=''; + for($i=0; $i<$adb->num_rows($Res);$i++) + { + $eventlist = $adb->query_result($Res,$i,'activitytype'); +?> + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
 
: + + + onclick=checkgroup(); checked>  + +
+ + + +
 
+    + + +
+
+
+ + +
+ + + + +
+ + id,'taskstatus') == '0') { ?> + - + - + + + + - + - + + - + + +
+
+ diff --git a/oss/vtiger/trunk/modules/Calendar/calendarLayout.php b/oss/vtiger/trunk/modules/Calendar/calendarLayout.php new file mode 100644 index 00000000..658df3d5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/calendarLayout.php @@ -0,0 +1,2196 @@ +debug("Entering calendar_layout() method"); + $cal_header = array (); + if (isset($param_arr['size']) && $param_arr['size'] == 'small') + $param_arr['calendar']->show_events = false; + + $cal_header['view'] = $param_arr['view']; + $cal_header['IMAGE_PATH'] = $param_arr['IMAGE_PATH']; + $cal_header['calendar'] = $param_arr['calendar']; + $eventlabel = $mod_strings['LBL_EVENTS']; + $todolabel = $mod_strings['LBL_TODOS']; + //if $param_arr['size'] is set to 'small', get small(mini) calendar + if(isset($param_arr['size']) && $param_arr['size'] == 'small') + { + get_mini_calendar($param_arr); + } + else + { + // User Select Customization + $onlyForUserParam = "onlyforuser=" . calendarview_getSelectedUserId(); + // END + + //To differentiate selected subtab from unselected one - Starts + if($subtab == 'event') + { + $eventtab_class = 'dvtSelectedCell'; + $todotab_class = 'dvtUnSelectedCell'; + $event_anchor = $eventlabel; + // Added for User Based CustomView for Calendar module + $todo_anchor = "date_time->get_date_str()."&viewOption=".$viewBox."&subtab=todo&parenttab=".$category."&$onlyForUserParam'>".$todolabel.""; + + } + elseif($subtab == 'todo') + { + $eventtab_class = 'dvtUnSelectedCell'; + $todotab_class = 'dvtSelectedCell'; + // Added User Based CustomView for Calendar module + $event_anchor = "date_time->get_date_str()."&viewOption=".$viewBox."&subtab=event&parenttab=".$category."&$onlyForUserParam'>".$eventlabel.""; + $todo_anchor = $todolabel; + } + //Ends + //To get calendar header and its links(like Day,Week,Month,Year and etc.) + get_cal_header_tab($cal_header,$viewBox,$subtab); + $subheader = ""; + $subheader .=<< + + + + + + +
+ + + + + + + + + +
 $event_anchor $todo_anchor 
+
+EOQ; + echo $subheader; + if($viewBox == 'hourview' && $subtab == 'event') + { + get_cal_header_data($param_arr,$viewBox,$subtab); + getHourView($param_arr); + } + elseif($viewBox == 'listview' && $subtab == 'event') + { + get_cal_header_data($param_arr,$viewBox,$subtab); + getEventListView($param_arr); + } + elseif($subtab == 'todo') + { + $todo_list = ""; + $todo_list .= getTodosListView($param_arr,'',$subtab); + $todo_list .= '

'; + echo $todo_list; + } + } + + $cal_log->debug("Exiting calendar_layout() method"); + +} + +/** + * Function creates HTML to display small(mini) Calendar + * @param array $cal - collection of objects and strings + */ +function get_mini_calendar(& $cal){ + global $current_user,$adb,$cal_log,$mod_strings,$theme; + $category = getParentTab(); + $cal_log->debug('Entering get_mini_calendar() method...'); + $count = 0; + //To decide number of rows(weeks) in a month + if ($cal['calendar']->month_array[$cal['calendar']->slices[35]]->start_time->month != $cal['calendar']->date_time->month) { + $rows = 5; + } else { + $rows = 6; + } + $minical = ""; + $minical .= " + + + "; + $minical .= ""; + $minical .= ""; + //To display days in week + $minical .= ''; + for ($i = 0; $i < 7; $i ++){ + $weekday = $mod_strings['cal_weekdays_short'][$i]; + $minical .= ''; + } + $minical .= ""; + $event_class = ''; + $class = ''; + for ($i = 0; $i < $rows; $i++){ + $minical .= ""; + + //calculate blank days for first week + for ($j = 0; $j < 7; $j ++){ + $cal['slice'] = $cal['calendar']->month_array[$cal['calendar']->slices[$count]]; + $class = dateCheck($cal['slice']->start_time->get_formatted_date()); + if($j == 0){ + $minical .= ""; + } + + //To differentiate day having events from other days + if(count($cal['slice']->activities) != 0 && ($cal['slice']->start_time->get_formatted_date() == $cal['slice']->activities[0]->start_time->get_formatted_date())){ + $event_class = 'class="eventDay"'; + }else{ + $event_class = ''; + } + //To differentiate current day from other days + if($class != '' ){ + $class = 'class="'.$class.'"'; + }else{ + $class = $event_class; + } + + //To display month dates + if ($cal['slice']->start_time->getMonth() == $cal['calendar']->date_time->getMonth()){ + $minical .= ""; + }else{ + $minical .= ""; + } + $count++; + } + $minical .= ''; + } + $minical .= "
 ".get_previous_cal($cal)." "; + $minical .= "date_time->get_date_str()."&parenttab=".$category."'>".display_date($cal['view'],$cal['calendar']->date_time)." ".get_next_cal($cal)." +
'.$mod_strings['LBL_WEEK'].''.$weekday.'
start_time->get_date_str()."&parenttab=".$category."'>".$cal['slice']->start_time->week.""; + $minical .= "getView()."".$cal['slice']->start_time->get_date_str()."&parenttab=".$category."'>"; + $minical .= $cal['slice']->start_time->get_Date()."
"; + echo $minical; + $cal_log->debug("Exiting get_mini_calendar() method..."); +} + +/** + * Function creates HTML to display Calendar Header and its Links + * @param array $header - collection of objects and strings + * @param string $viewBox - string 'listview' or 'hourview' or may be empty. if 'listview' means Events ListView.if 'hourview' means Events HourView. if empty means get Todos ListView + * @param string $subtab - string 'todo' or 'event'. if 'todo' means Todos View else Events View + */ +function get_cal_header_tab(& $header,$viewBox,$subtab) +{ + global $mod_strings,$cal_log; + $category = getParentTab(); + $cal_log->debug("Entering get_cal_header_tab() method..."); + $tabhtml = ""; + $count = 1; + include_once 'modules/Calendar/addEventUI.php'; + include_once 'modules/Calendar/header.php'; + $eventlabel = $mod_strings['LBL_EVENTS']; + $todolabel = $mod_strings['LBL_TODOS']; + $div = " + +
+ "; + echo $div; + $tabhtml .= ""; + $links = array ('day','week','month','year'); + //To differentiate the selected link from unselected links + foreach ($links as $link) + { + if ($header['view'] == $link) + { + $class = 'calSel'; + $anchor = $mod_strings["LBL_".$header['calendar']->getCalendarView($link)]; + } + else + { + $class = 'calUnSel'; + $anchor = "date_time->get_date_str()."&viewOption=".$viewBox."&subtab=".$subtab."&parenttab=".$category."'>".$mod_strings["LBL_".$header['calendar']->getCalendarView($link)].""; + } + + if($count == 1) + $tabhtml .= ""; + else + $tabhtml .= ""; + $count++; + } + //To get Navigation(next&previous) links and display Date info + $tabhtml .= ""; + $tabhtml .= ""; + $tabhtml .= ""; + $tabhtml .= ""; + $tabhtml .= ""; + echo $tabhtml; + $cal_log->debug("Exiting get_cal_header_tab() method..."); +} + +/** + * Function creates HTML to display number of Events, Todos and pending list in calendar under header(Eg:Total Events : 5, 2 Pending / Total To Dos: 4, 1 Pending) + * @param array $cal_arr - collection of objects and strings + * @param string $viewBox - string 'listview' or 'hourview'. if 'listview' means Events ListView.if 'hourview' means Events HourView. + */ +function get_cal_header_data(& $cal_arr,$viewBox,$subtab) +{ + global $mod_strings,$cal_log,$current_user,$adb,$theme; + $cal_log->debug("Entering get_cal_header_data() method..."); + global $current_user,$app_strings; + $date_format = $current_user->date_format; + $format = $cal_arr['calendar']->hour_format; + $hour_startat = timeString(array('hour'=>date('H:i',(time()+(5*60))),'minute'=>0),'24'); + $hour_endat = timeString(array('hour'=>date('H:i',(time() + (60 * 60))),'minute'=>0),'24'); + $time_arr = getaddEventPopupTime($hour_startat,$hour_endat,$format); + $temp_ts = $cal_arr['calendar']->date_time->ts; + //To get date in user selected format + $temp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$temp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$temp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $temp_ts)):('')))); + + if($current_user->column_fields['is_admin']=='on') + $Res = $adb->pquery("select * from vtiger_activitytype",array()); + else + { + $roleid=$current_user->roleid; + $subrole = getRoleSubordinates($roleid); + if(count($subrole)> 0) + { + $roleids = $subrole; + array_push($roleids, $roleid); + } + else + { + $roleids = $roleid; + } + + if (count($roleids) > 1) { + $Res=$adb->pquery("select distinct activitytype from vtiger_activitytype inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_activitytype.picklist_valueid where roleid in (". generateQuestionMarks($roleids) .") and picklistid in (select picklistid from vtiger_activitytype) order by sortid asc", array($roleids)); + } else { + $Res=$adb->pquery("select distinct activitytype from vtiger_activitytype inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_activitytype.picklist_valueid where roleid = ? and picklistid in (select picklistid from vtiger_activitytype) order by sortid asc", array($roleid)); + } + } + + $eventlist=''; + for($i=0; $i<$adb->num_rows($Res);$i++) + { + $eventlist .= $adb->query_result($Res,$i,'activitytype').";"; + } + + $headerdata = ""; + $headerdata .=" +
+
+ +
".$anchor."".$anchor." + + + "; + $tabhtml .= ""; + $tabhtml .= " +
".get_previous_cal($header,$viewBox,$subtab)." + ".display_date($header['view'],$header['calendar']->date_time)."".get_next_cal($header,$viewBox,$subtab)." +
+
view."".$header['calendar']->date_time->get_date_str()."&viewOption=".$viewBox."&subtab=".$subtab."&parenttab=".$category."\");' src='".$header['IMAGE_PATH']."btnL3Calendar.gif' alt='".$mod_strings['LBL_OPENCAL']."...' title='".$mod_strings['LBL_OPENCAL']."...' align='absmiddle' border='0'>view."".$header['calendar']->date_time->get_date_str()."&viewOption=".$viewBox."&subtab=".$subtab."&parenttab=".$category."\");' src='".$header['IMAGE_PATH']."tbarSettings.gif' alt='".$mod_strings['LBL_SETTINGS']."' title='".$mod_strings['LBL_SETTINGS']."' align='absmiddle' border='0'>".$app_strings['Calendar']."
+ "; + if(isPermitted("Calendar","EditView") == "yes") + { + $headerdata .=" + "; + } + else + { + $headerdata .=""; + } + $headerdata .=" + + +
 
+
+ ".$mod_strings['LBL_ADD']." + +
 ";//USER SELECT CUSTOMIZATION + $headerdata .= getEventInfo($cal_arr,'listcnt'); + $headerdata .= "
".$mod_strings['LBL_VIEW']." : ";//USER SELECT CUSTOMIZATION + $view_options = getEventViewOption($cal_arr,$viewBox); + + // User Select Customization + $view_options .= calendarview_getUserSelectOptions( calendarview_getSelectedUserId() ); + // END + + $headerdata .=$view_options."
+
"; + echo $headerdata; + $cal_log->debug("Exiting get_cal_header_data() method..."); +} + +/** + * Function creates HTML select statement to display View selection box + * @param array $cal - collection of objects and strings + * @param string $viewBox - string 'listview' or 'hourview'. if 'listview' means get Events ListView.if 'hourview' means get Events HourView. + * return string $view - html selection box + */ +function getEventViewOption(& $cal,$viewBox) +{ + global $mod_strings,$cal_log; + $category = getParentTab(); + if($viewBox == 'listview') + { + $list_sel = 'selected'; + $hr_sel = ''; + } + else + { + $list_sel = ''; + $hr_sel = 'selected'; + } + $cal_log->debug("Entering getEventViewOption() method..."); + $view = "view."'> + date_time->hour."'> + date_time->day."'> + date_time->week."'> + date_time->month."'> + date_time->year."'> + + + + + + + "; + $cal_log->debug("Exiting getEventViewOption() method..."); + return $view; +} + +/** + * Function creates HTML anchor tag to get previous-day/week/month/year view + * @param array $cal - collection of objects and strings + * @param string $viewBox - string 'listview' or 'hourview' or may be empty. if 'listview' means previous link in Events ListView.if 'hourview' means previous link in Events HourView. if empty means previous link in Todos ListView + * @param string $subtab - string 'todo' or 'event' or may be empty. if 'todo' means Todos View. if 'event' means Events View. if empty means small calendar view. + * return string $link - html tags in string format + */ +function get_previous_cal(& $cal,$viewBox='',$subtab='') +{ + global $mod_strings,$cal_log,$theme; + $category = getParentTab(); + $cal_log->debug("Entering get_previous_cal() method..."); + if(isset($cal['size']) && $cal['size'] == 'small') + { + $link = "view."".$cal['calendar']->get_datechange_info('prev')."&parenttab=".$category."\")'>"; + } + else + { + $link = "view."".$cal['calendar']->get_datechange_info('prev')."&viewOption=".$viewBox."&subtab=".$subtab."&parenttab=".$category."&onlyforuser=".calendarview_getSelectedUserId()."' onclick='VtigerJS_DialogBox.block();return true;'>"; + } + $cal_log->debug("Exiting get_previous_cal() method..."); + return $link; +} + +/** + * Function creates HTML anchor tag to get next-day/week/month/year view + * @param array $cal - collection of objects and strings + * @param string $viewBox - string 'listview' or 'hourview' or may be empty. if 'listview' means next link in Events ListView.if 'hourview' means next link in Events HourView. if empty means next link in Todos ListView + * @param string $subtab - string 'todo' or 'event' or may be empty. if 'todo' means Todos View. if 'event' means Events View. if empty means small calendar view. + * return string $link - html tags in string format + */ +function get_next_cal(& $cal,$viewBox='',$subtab='') +{ + global $mod_strings,$cal_log,$theme; + $category = getParentTab(); + $cal_log->debug("Entering get_next_cal() method..."); + if(isset($cal['size']) && $cal['size'] == 'small') + { + $link = "view."".$cal['calendar']->get_datechange_info('next')."&parenttab=".$category."\")' >"; + } + else + { + $link = "view."".$cal['calendar']->get_datechange_info('next')."&viewOption=".$viewBox."&subtab=".$subtab."&parenttab=".$category."&onlyforuser=".calendarview_getSelectedUserId()."' onclick='VtigerJS_DialogBox.block();return true;'>"; + } + $cal_log->debug("Exiting get_next_cal() method..."); + return $link; + +} + +/** + * Function to get date info depending upon on the calendar view(Eg: 21 July 2000) + * @param string $view - calendar view(day/week/month/year) + * @param array $date_time - contains DateTime object + * return string $label - date info(Eg for dayview : 13 July 2000) + */ +function display_date($view,$date_time) +{ + global $cal_log; + $cal_log->debug("Entering display_date() method..."); + if ($view == 'day') + { + //$label = $date_time->getdayofWeek()." "; + $label = $date_time->get_Date()." "; + $label .= $date_time->getmonthName()." "; + $label .= $date_time->year; + $cal_log->debug("Exiting display_date() method..."); + return $label; + } + elseif ($view == 'week') + { + $week_start = $date_time->getThisweekDaysbyIndex(0); + $week_end = $date_time->getThisweekDaysbyIndex(6); + $label = $week_start->get_Date()." "; + $label .= $week_start->getmonthName()." "; + $label .= $week_start->year; + $label .= " - "; + $label .= $week_end->get_Date()." "; + $label .= $week_end->getmonthName()." "; + $label .= $week_end->year; + $cal_log->debug("Exiting display_date() method..."); + return $label; + } + + elseif ($view == 'month') + { + $label = $date_time->getmonthName()." "; + $label .= $date_time->year; + $cal_log->debug("Exiting display_date() method..."); + return $label; + } + elseif ($view == 'year') + { + $cal_log->debug("Exiting display_date() method..."); + return $date_time->year; + } + +} +/** + * Function to get css class name for date + * @param string $slice_date - date + * returns string - css class name or empty string + */ +function dateCheck($slice_date) +{ + global $cal_log; + $cal_log->debug("Entering dateCheck() method..."); + $today = date('Y-m-d'); + if($today == $slice_date) + { + $cal_log->debug("Exiting dateCheck() method..."); + //css class for day having event(s) + return 'currDay'; + } + else + { + $cal_log->debug("Exiting dateCheck() method..."); + return ''; + } +} + +/** + * Function to construct respective calendar layout depends on the calendar view + * @param array $view - collection of objects and strings + */ +function getHourView(& $view) +{ + global $cal_log,$theme; + $hourview_layout = ''; + $cal_log->debug("Entering getHourView() method..."); + $hourview_layout .= '
+
'; + + if($view['view'] == 'day') + $hourview_layout .= getDayViewLayout($view); + elseif($view['view'] == 'week') + $hourview_layout .= getWeekViewLayout($view); + elseif($view['view'] == 'month') + $hourview_layout .= getMonthViewLayout($view); + elseif($view['view'] == 'year') + $hourview_layout .= getYearViewLayout($view); + else + die("view:".$view['view']." is not defined"); + + $hourview_layout .= '
+ '; + $hourview_layout .= '
+ + + + + + + + +
'; + echo $hourview_layout; + $cal_log->debug("Exiting getHourView() method..."); +} + +/** + * Fuction constructs Events ListView depends on the view + * @param array $cal - collection of objects and strings + * @param string $mode - string 'listcnt' or empty. if empty means get Events ListView else get total no. of events and no. of pending events Info. + * returns string $activity_list - total no. of events and no. of pending events Info(Eg: Total Events : 2, 1 Pending). + */ +function getEventListView(& $cal,$mode='') +{ + global $cal_log,$theme; + $list_view = ""; + $cal_log->debug("Entering getEventListView() method..."); + if($cal['calendar']->view == 'day') + { + $start_date = $end_date = $cal['calendar']->date_time->get_formatted_date(); + } + elseif($cal['calendar']->view == 'week') + { + $start_date = $cal['calendar']->slices[0]; + $end_date = $cal['calendar']->slices[6]; + } + elseif($cal['calendar']->view == 'month') + { + $start_date = $cal['calendar']->date_time->getThismonthDaysbyIndex(0); + $end_date = $cal['calendar']->date_time->getThismonthDaysbyIndex($cal['calendar']->date_time->daysinmonth - 1); + $start_date = $start_date->get_formatted_date(); + $end_date = $end_date->get_formatted_date(); + } + elseif($cal['calendar']->view == 'year') + { + $start_date = $cal['calendar']->date_time->getThisyearMonthsbyIndex(0); + $end_date = $cal['calendar']->date_time->get_first_day_of_changed_year('increment'); + $start_date = $start_date->get_formatted_date(); + $end_date = $end_date->get_formatted_date(); + } + else + { + die("view:".$cal['calendar']->view." is not defined"); + } + //if $mode value is empty means get Events list in array format else get the count of total events and pending events in array format. + if($mode != '') + { + $activity_list = getEventList($cal, $start_date, $end_date,$mode); + $cal_log->debug("Exiting getEventListView() method..."); + return $activity_list; + } + else + { + $ret_arr = getEventList($cal, $start_date, $end_date,$mode); + $activity_list = $ret_arr[0]; + $navigation_array = $ret_arr[1]; + } + //To get Events listView + $list_view .="
"; + $list_view .=constructEventListView($cal,$activity_list,$navigation_array); + $list_view .="
+ "; + $list_view .="
+ + + + + + + + +
"; + echo $list_view; + $cal_log->debug("Exiting getEventListView() method..."); +} + + +/** + * Fuction constructs Todos ListView depends on the view + * @param array $cal - collection of objects and strings + * @param string $check - string 'listcnt' or empty. if empty means get Todos ListView else get total no. of Todos and no. of pending todos Info. + * returns string $todo_list - total no. of todos and no. of pending todos Info(Eg: Total Todos : 2, 1 Pending). + */ +function getTodosListView($cal, $check='',$subtab='') +{ + global $cal_log,$theme; + $list_view = ""; + $cal_log->debug("Entering getTodosListView() method..."); + if($cal['calendar']->view == 'day') + { + $start_date = $end_date = $cal['calendar']->date_time->get_formatted_date(); + } + elseif($cal['calendar']->view == 'week') + { + $start_date = $cal['calendar']->slices[0]; + $end_date = $cal['calendar']->slices[6]; + } + elseif($cal['calendar']->view == 'month') + { + $start_date = $cal['calendar']->date_time->getThismonthDaysbyIndex(0); + $end_date = $cal['calendar']->date_time->getThismonthDaysbyIndex($cal['calendar']->date_time->daysinmonth - 1); + $start_date = $start_date->get_formatted_date(); + $end_date = $end_date->get_formatted_date(); + } + elseif($cal['calendar']->view == 'year') + { + $start_date = $cal['calendar']->date_time->getThisyearMonthsbyIndex(0); + $end_date = $cal['calendar']->date_time->get_first_day_of_changed_year('increment'); + $start_date = $start_date->get_formatted_date(); + $end_date = $end_date->get_formatted_date(); + } + else + { + die("view:".$cal['calendar']->view." is not defined"); + } + //if $check value is empty means get Todos list in array format else get the count of total todos and pending todos in array format. + if($check != '') + { + $todo_list = getTodoList($cal, $start_date, $end_date,$check); + $cal_log->debug("Exiting getTodosListView() method..."); + return $todo_list; + } + else + { + $ret_arr = getTodoList($cal, $start_date, $end_date,$check); + $todo_list = $ret_arr[0]; + $navigation_arr = $ret_arr[1]; + } + $cal_log->debug("Exiting getTodosListView() method..."); + $list_view .="
"; + //To get Todos listView + $list_view .= constructTodoListView($todo_list,$cal,$subtab,$navigation_arr); + $list_view .="
+ + + + + + + + + + "; + echo $list_view; +} + +/** + * Function creates HTML to display Calendar DayView + * @param array $cal - collections of objects and strings. + * return string $dayview_layout - html tags in string format + */ +function getDayViewLayout(& $cal) +{ + global $current_user,$app_strings,$cal_log,$adb; + $no_of_rows = 1; + $cal_log->debug("Entering getDayViewLayout() method..."); + $date_format = $current_user->date_format; + $day_start_hour = $cal['calendar']->day_start_hour; + $day_end_hour = $cal['calendar']->day_end_hour; + $format = $cal['calendar']->hour_format; + $show_complete_view = false; + if(!empty($_REQUEST['complete_view'])){ + $show_complete_view =true; + } + $dayview_layout = ''; + $dayview_layout .= ' '; + $dayview_layout .= ' +
+ '; + if(!empty($show_complete_view)) { + $dayview_layout .= ''; + $day_start_hour = 0; + $day_end_hour = 23; + } else { + $dayview_layout .= ''; + } + for($j=0;$j<24;$j++) + { + $slice = $cal['calendar']->slices[$j]; + $act = $cal['calendar']->day_slice[$slice]->activities; + if(!empty($act)) + { + $temprows = count($act); + $no_of_rows = ($no_of_rows>$temprows)?$no_of_rows:$temprows; + } + } + for($i=$day_start_hour;$i<=$day_end_hour;$i++) + { + $time = array('hour'=>$i,'minute'=>0); + $sub_str = timeString($time,$format); + $y = $i+1; + $hour_startat = timeString(array('hour'=>$i,'minute'=>0),'24'); + $hour_endat = timeString(array('hour'=>$y,'minute'=>0),'24'); + $time_arr = getaddEventPopupTime($hour_startat,$hour_endat,$format); + $temp_ts = $cal['calendar']->date_time->ts; + $sttemp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$temp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$temp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $temp_ts)):('')))); + if($i != 23) + { + $endtemp_date = $sttemp_date; + } + else + { + $addday = $temp_ts + (1 * 24 * 60 * 60); + $endtemp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$addday)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$addday)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $addday)):('')))); + } + + $js_string = ""; + if(isPermitted("Calendar","EditView") == "yes") + $js_string = 'onClick="fnvshobj(this,\'addEvent\'); gshow(\'addEvent\',\'Call\',\''.$sttemp_date.'\',\''.$endtemp_date.'\',\''.$time_arr['starthour'].'\',\''.$time_arr['startmin'].'\',\''.$time_arr['startfmt'].'\',\''.$time_arr['endhour'].'\',\''.$time_arr['endmin'].'\',\''.$time_arr['endfmt'].'\',\'hourview\',\'event\')"'; + $dayview_layout .= ' + '; + //To display events in Dayview + $dayview_layout .= getdayEventLayer($cal,$cal['calendar']->slices[$i],$no_of_rows); + $dayview_layout .= ''; + } + $dayview_layout .= '
  
  
'.$sub_str.'
+
'; + $cal_log->debug("Exiting getDayViewLayout() method..."); + return $dayview_layout; +} + +/** + * Function creates HTML to display Calendar WeekView + * @param array $cal - collections of objects and strings. + * return string $weekview_layout - html tags in string format + */ +function getWeekViewLayout(& $cal) +{ + global $current_user,$app_strings,$cal_log,$theme; + $category = getParentTab(); + $cal_log->debug("Entering getWeekViewLayout() method..."); + $date_format = $current_user->date_format; + $day_start_hour = $cal['calendar']->day_start_hour; + $day_end_hour = $cal['calendar']->day_end_hour; + $format = $cal['calendar']->hour_format; + $show_complete_view = false; + if(!empty($_REQUEST['complete_view'])){ + $show_complete_view =true; + } + $weekview_layout = ''; + $weekview_layout .= ''; + for ($col=0;$col<=7;$col++) + { + if($col==0) { + $weekview_layout .= ''; + if(!empty($show_complete_view)) { + $weekview_layout .= ''; + $day_start_hour = 0; + $day_end_hour = 23; + } else { + $weekview_layout .= ''; + } + } else { + //To display Days in Week + $cal['slice'] = $cal['calendar']->week_array[$cal['calendar']->slices[$col-1]]; + $date = $cal['calendar']->date_time->getThisweekDaysbyIndex($col-1); + $day = $date->getdayofWeek_inshort(); + $weekview_layout .= ''; + } + } + $weekview_layout .= '
'; + $weekview_layout .= ''; + $weekview_layout .= $date->get_Date().' - '.$day; + $weekview_layout .= ""; + $weekview_layout .= '
'; + $weekview_layout .= ''; + //To display Hours in User selected format + for($i=$day_start_hour;$i<=$day_end_hour;$i++) + { + $count = $i; + $hour_startat = timeString(array('hour'=>$i,'minute'=>0),'24'); + $hour_endat = timeString(array('hour'=>($i+1),'minute'=>0),'24'); + $time_arr = getaddEventPopupTime($hour_startat,$hour_endat,$format); + $weekview_layout .= ''; + for ($column=1;$column<=1;$column++) + { + $time = array('hour'=>$i,'minute'=>0); + $sub_str = timeString($time,$format); + + $weekview_layout .= ''; + } + for ($column=0;$column<=6;$column++) + { + $temp_ts = $cal['calendar']->week_array[$cal['calendar']->slices[$column]]->start_time->ts; + $sttemp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$temp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$temp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $temp_ts)):('')))); + if($i != 23) + $endtemp_date = $sttemp_date; + else + { + $endtemp_ts = $cal['calendar']->week_array[$cal['calendar']->slices[$column+1]]->start_time->ts; + $endtemp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$endtemp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$endtemp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $endtemp_ts)):('')))); + } + + $weekview_layout .= ''; + $count = $count+24; + } + $weekview_layout .= ''; + } + $weekview_layout .= '
'; + $weekview_layout .=$sub_str; + $weekview_layout .= ''; + $weekview_layout .= ''; + //To display events in WeekView + $weekview_layout .=getweekEventLayer($cal,$cal['calendar']->week_hour_slices[$count]); + $weekview_layout .= '
'; + return $weekview_layout; + $cal_log->debug("Exiting getWeekViewLayout() method..."); + +} + +/** + * Function creates HTML to display Calendar MonthView + * @param array $cal - collections of objects and strings. + * return string $monthview_layout - html tags in string format + */ +function getMonthViewLayout(& $cal) +{ + global $current_user,$app_strings,$cal_log,$theme; + $category = getParentTab(); + $cal_log->debug("Entering getMonthViewLayout() method..."); + $date_format = $current_user->date_format; + $count = 0; + //To get no. of rows(weeks) in month + if ($cal['calendar']->month_array[$cal['calendar']->slices[35]]->start_time->month != $cal['calendar']->date_time->month) { + $rows = 5; + } else { + $rows = 6; + } + $format = $cal['calendar']->hour_format; + $hour_startat = timeString(array('hour'=>date('H:i'),'minute'=>0),'24'); + $hour_endat = timeString(array('hour'=>date('H:i',(time() + (60 * 60))),'minute'=>0),'24'); + $time_arr = getaddEventPopupTime($hour_startat,$hour_endat,$format); + $monthview_layout = ''; + $monthview_layout .= ''; + //To display days in week + for ($i = 0; $i < 7; $i ++) + { + $first_row = $cal['calendar']->month_array[$cal['calendar']->slices[$i]]; + $weekday = $first_row->start_time->getdayofWeek(); + $monthview_layout .= ''; + } + $monthview_layout .= '
'.$weekday.'
'; + $monthview_layout .= ' '; + $cnt = 0; + for ($i = 0; $i < $rows; $i ++) + { + $monthview_layout .= ''; + for ($j = 0; $j < 7; $j ++) + { + $temp_ts = $cal['calendar']->month_array[$cal['calendar']->slices[$count]]->start_time->ts; + $temp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$temp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$temp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $temp_ts)):('')))); + if($cal['calendar']->day_start_hour != 23) + $endtemp_date = $temp_date; + else + { + $endtemp_ts = $cal['calendar']->month_array[$cal['calendar']->slices[$count+1]]->start_time->ts; + $endtemp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$endtemp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$endtemp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $endtemp_ts)):('')))); + } + $cal['slice'] = $cal['calendar']->month_array[$cal['calendar']->slices[$count]]; + $monthclass = dateCheck($cal['slice']->start_time->get_formatted_date()); + if($monthclass != '') + $monthclass = 'calSel'; + else + $monthclass = 'dvtCellLabel'; + //to display dates in month + if ($cal['slice']->start_time->getMonth() == $cal['calendar']->date_time->getMonth()) + { + $monthview_layout .= ''; + } + else + { + $monthview_layout .= ''; + } + $count++; + } + $monthview_layout .= ''; + $monthview_layout .= ''; + for ($j = 0; $j < 7; $j ++) + { + $monthview_layout .= ''; + $cnt++; + } + $monthview_layout .= ''; + } + $monthview_layout .= '
'; + $monthview_layout .= ''; + $monthview_layout .= $cal['slice']->start_time->get_Date(); + $monthview_layout .= ''; + $monthview_layout .= ' 
'; + $monthview_layout .= getmonthEventLayer($cal,$cal['calendar']->slices[$cnt]); + $monthview_layout .= '
'; + return $monthview_layout; + $cal_log->debug("Exiting getMonthViewLayout() method..."); + +} + +/** + * Function creates HTML to display Calendar YearView + * @param array $cal - collections of objects and strings. + * return string $yearview_layout - html tags in string format + */ +function getYearViewLayout(& $cal) +{ + global $mod_strings,$cal_log; + $category = getParentTab(); + $cal_log->debug("Entering getYearViewLayout() method..."); + $yearview_layout = ''; + $yearview_layout .= ''; + $count = 0; + //year view divided as 4 rows and 3 columns + for($i=0;$i<4;$i++) + { + $yearview_layout .= ''; + for($j=0;$j<3;$j++) + { + $cal['slice'] = $cal['calendar']->year_array[$cal['calendar']->slices[$count]]; + $yearview_layout .= ''; + } + $yearview_layout .= '
+ + + + '; + for($w=0;$w<7;$w++) + { + $yearview_layout .= ''; + } + $yearview_layout .= ''; + list($_3rdyear,$_3rdmonth,$_3rddate) = explode("-",$cal['calendar']->month_day_slices[$count][35]); + list($_2ndyear,$_2ndmonth,$_2nddate) = explode("-",$cal['calendar']->month_day_slices[$count][6]); + //to get no. of rows(weeks) in month + if ($_3rdmonth != $_2ndmonth) { + $rows = 5; + } else { + $rows = 6; + } + $cnt = 0; + $date_stack = Array(); + for ($k = 0; $k < 5; $k ++) + { + $yearview_layout .= ''; + for ($mr = 0; $mr < 7; $mr ++) + { + list($_1styear,$_1stmonth,$_1stdate) = explode("-",$cal['calendar']->month_day_slices[$count][$cnt]); + if(count($cal['slice']->activities) != 0) + { + for($act_count = 0;$act_countactivities);$act_count++) + { + array_push($date_stack,$cal['slice']->activities[$act_count]->start_time->get_formatted_date()); + } + } + if(in_array($cal['calendar']->month_day_slices[$count][$cnt],$date_stack)) + $event_class = 'class="eventDay"'; + else + $event_class = ''; + if($_1stmonth == $_2ndmonth) + $curclass = dateCheck($cal['calendar']->month_day_slices[$count][$cnt]); + if($curclass != '') + { + $class = 'class="'.$curclass.'"'; + $curclass = ''; + } + else + { + $class = $event_class; + $event_class = ''; + } + $date = $_1stdate + 0; + $month = $_1stmonth + 0; + $yearview_layout .= ''; + $cnt++; + } + $yearview_layout .= ''; + } + $yearview_layout .= ' +
+ + '.$cal['slice']->start_time->month_inlong.' + +
'.$mod_strings['cal_weekdays_short'][$w].'
'; + if($rows == 6 && $k==0) + { + list($tempyear,$tempmonth,$tempdate) = explode("-",$cal['calendar']->month_day_slices[$count][35+$mr]); + if($tempmonth == $_2ndmonth) + $yearview_layout .= ''.$tempdate; + } + if($_1stmonth == $_2ndmonth) + { + $yearview_layout .= ''.$date; + } + $yearview_layout .= '
+ + + '; + $count++; + } + $yearview_layout .= '
'; + return $yearview_layout; + $cal_log->debug("Exiting getYearViewLayout() method..."); + + +} + +/** + * Function creates HTML To display events in day view + * @param array $cal - collection of objects and strings + * @param string $slice - date:time(eg: 2006-07-13:10) + * returns string $eventlayer - hmtl in string format + */ +function getdayEventLayer(& $cal,$slice,$rows) +{ + global $mod_strings,$cal_log,$listview_max_textlength,$adb,$current_user,$theme; + $category = getParentTab(); + $cal_log->debug("Entering getdayEventLayer() method..."); + $eventlayer = ''; + $arrow_img_name = ''; + $rows = $rows + 1; + $last_colwidth = 100 / $rows; + $width = 100 / $rows ; + $act = $cal['calendar']->day_slice[$slice]->activities; + if(!empty($act)) + { + for($i=0;$iday_slice[$slice]->start_time->hour.'_'.$i; + $subject = $act[$i]->subject; + $id = $act[$i]->record; + if($listview_max_textlength && (strlen($subject)>$listview_max_textlength)) + $subject = substr($subject,0,$listview_max_textlength)."..."; + $format = $cal['calendar']->hour_format; + $duration_hour = $act[$i]->duration_hour; + $duration_min =$act[$i]->duration_minute; + $user = $act[$i]->owner; + $priority = $act[$i]->priority; + if($duration_min != '00') + $rowspan = $duration_hour+$rowspan; + elseif($duration_hour != '0') + { + $rowspan = $duration_hour; + } + $row_cnt = $rowspan; + $start_hour = timeString($act[$i]->start_time,$format); + $end_hour = timeString($act[$i]->end_time,$format); + $account_name = $act[$i]->accountname; + $eventstatus = $act[$i]->eventstatus; + $color = $act[$i]->color; + $image = vtiger_imageurl($act[$i]->image_name, $theme); + if($act[$i]->recurring) + $recurring = ''; + else + $recurring = ' '; + $height = $rowspan * 75; + $javacript_str = ''; + $idShared = "normal"; if($act[$i]->shared) $idShared = "shared"; + /*if($eventstatus != 'Held') + {*/ + if($idShared == "normal") + { + if(isPermitted("Calendar","EditView") == "yes" || isPermitted("Calendar","Delete") == "yes") + $javacript_str = 'onMouseOver="cal_show(\''.$arrow_img_name.'\');" onMouseOut="fnHide_Event(\''.$arrow_img_name.'\');"'; + $action_str = ''; + } + else + { + $javacript_str = ''; + $eventlayer .= ' '; + } + $eventlayer .= ''; + + $visibility_query=$adb->pquery('SELECT visibility from vtiger_activity where activityid=?',array($id)); + $visibility = $adb->query_result($visibility_query,0,'visibility'); + $user_query = $adb->pquery("SELECT vtiger_crmentity.smownerid,vtiger_users.user_name from vtiger_crmentity,vtiger_users where crmid=? and vtiger_crmentity.smownerid=vtiger_users.id", array($id)); + $userid = $adb->query_result($user_query,0,"smownerid"); + $assigned_role_query=$adb->pquery("select roleid from vtiger_user2role where userid=?",array($userid)); + $assigned_role_id = $adb->query_result($assigned_role_query,0,"roleid"); + $role_list = $adb->pquery("SELECT * from vtiger_role WHERE parentrole LIKE '". formatForSqlLike($current_user->column_fields['roleid']) . formatForSqlLike($assigned_role_id) ."'",array()); + $is_shared = $adb->pquery("SELECT * from vtiger_sharedcalendar where userid=? and sharedid=?",array($userid,$current_user->id)); + if(($current_user->column_fields['is_admin']!='on' && $adb->num_rows($role_list)==0 && (($adb->num_rows($is_shared)==0 && ($visibility=='Public' || $visibility=='Private')) || $visibility=='Private')) && $current_user->column_fields['user_name']!=$user) + { + $eventlayer .= '
'; + } + else{ + $eventlayer .= '
'; + } + $eventlayer .= ' + + + '; + $eventlayer .= ''; + + if(($current_user->column_fields['is_admin']!='on' && $adb->num_rows($role_list)==0 && (($adb->num_rows($is_shared)==0 && ($visibility=='Public' || $visibility=='Private')) || $visibility=='Private')) && $current_user->column_fields['user_name']!=$user) + { + $eventlayer .= ''; + }else{ + $eventlayer .= ' + + '; + } $eventlayer .= '
'.$start_hour.' - '.$end_hour.'
'.$recurring.''.$user.' - '.$mod_strings['LBL_BUSY'].''.$subject.'
'; + if($act[$i]->shared) + $eventlayer .= ''; + else + $eventlayer .= ' '; + $eventlayer .= '('.$user.' | '.getTranslatedString($eventstatus).' | '.getTranslatedString($priority).')
'.$action_str.' 
'; + } + $eventlayer .= ' '; + } + else + { + $eventlayer .= ' '; + $eventlayer .= ' '; + } + $cal_log->debug("Exiting getdayEventLayer() method..."); + return $eventlayer; +} + +/** + * Function creates HTML To display events in week view + * @param array $cal - collection of objects and strings + * @param string $slice - date:time(eg: 2006-07-13:10) + * returns string $eventlayer - hmtl in string format + */ +function getweekEventLayer(& $cal,$slice) +{ + global $mod_strings,$cal_log,$listview_max_textlength,$adb,$current_user,$theme; + $category = getParentTab(); + $cal_log->debug("Entering getweekEventLayer() method..."); + $eventlayer = ''; + $arrow_img_name = ''; + $act = $cal['calendar']->week_slice[$slice]->activities; + if(!empty($act)) + { + for($i=0;$iweek_slice[$slice]->start_time->get_formatted_date().'_'.$act[$i]->start_time->hour.'_'.$i; + /* fix given by dartagnanlaf END --integrated by Minnie */ + $id = $act[$i]->record; + $subject = $act[$i]->subject; + if($listview_max_textlength && (strlen($subject)>$listview_max_textlength)) + $subject = substr($subject,0,$listview_max_textlength)."..."; + $format = $cal['calendar']->hour_format; + $start_hour = timeString($act[$i]->start_time,$format); + $end_hour = timeString($act[$i]->end_time,$format); + $account_name = $act[$i]->accountname; + $eventstatus = $act[$i]->eventstatus; + $user = $act[$i]->owner; + $priority = $act[$i]->priority; + $image = vtiger_imageurl($act[$i]->image_name, $theme); + $idShared = "normal"; if($act[$i]->shared) $idShared = "shared"; + if($act[$i]->recurring) + $recurring = ''; + else + $recurring = ' '; + $color = $act[$i]->color; + if($idShared == "normal") + { + if(isPermitted("Calendar","EditView") == "yes" || isPermitted("Calendar","Delete") == "yes") + $javacript_str = 'onMouseOver="cal_show(\''.$arrow_img_name.'\');" onMouseOut="fnHide_Event(\''.$arrow_img_name.'\');"'; + $action_str = ''; + } + else + { + $javacript_str = ''; + $eventlayer .= ' '; + } + + $visibility_query=$adb->pquery('SELECT visibility from vtiger_activity where activityid=?',array($id)); + $visibility = $adb->query_result($visibility_query,0,'visibility'); + $user_query = $adb->pquery("SELECT vtiger_crmentity.smownerid,vtiger_users.user_name from vtiger_crmentity,vtiger_users where crmid=? and vtiger_crmentity.smownerid=vtiger_users.id", array($id)); + $userid = $adb->query_result($user_query,0,"smownerid"); + $assigned_role_query=$adb->pquery("select roleid from vtiger_user2role where userid=?",array($userid)); + $assigned_role_id = $adb->query_result($assigned_role_query,0,"roleid"); + $role_list = $adb->pquery("SELECT * from vtiger_role WHERE parentrole LIKE '". formatForSqlLike($current_user->column_fields['roleid']) . formatForSqlLike($assigned_role_id) ."'",array()); + $is_shared = $adb->pquery("SELECT * from vtiger_sharedcalendar where userid=? and sharedid=?",array($userid,$current_user->id)); + if(($current_user->column_fields['is_admin']!='on' && $adb->num_rows($role_list)==0 && (($adb->num_rows($is_shared)==0 && ($visibility=='Public' || $visibility=='Private')) || $visibility=='Private')) && $current_user->column_fields['user_name']!=$user) + { + $eventlayer .= '
'; + } + else{ + $eventlayer .= '
'; + } + + $eventlayer .=' + + + + + + '; + if(($current_user->column_fields['is_admin']!='on' && $adb->num_rows($role_list)==0 && (($adb->num_rows($is_shared)==0 && ($visibility=='Public' || $visibility=='Private')) || $visibility=='Private')) && $current_user->column_fields['user_name']!=$user) + { + $eventlayer .= ''; + }else{//CALUSER CUST END + $eventlayer .= ' + + '; + } + $eventlayer .= '
'.$start_hour.' - '.$end_hour.'
'.$recurring.''.$user.'-'.$mod_strings['LBL_BUSY'].''.$subject.'
'; + if($act[$i]->shared) + $eventlayer .= ''; + else + $eventlayer .= ' '; + $eventlayer .= '('.$user.' | '.getTranslatedString($eventstatus).' | '.getTranslatedString($priority).')
'.$action_str.' 

'; + } + $cal_log->debug("Exiting getweekEventLayer() method..."); + return $eventlayer; + } + +} + +/** + * Function creates HTML To display events in month view + * @param array $cal - collection of objects and strings + * @param string $slice - date(eg: 2006-07-13) + * returns string $eventlayer - hmtl in string format + */ +function getmonthEventLayer(& $cal,$slice) +{ + global $mod_strings,$cal_log,$adb,$current_user,$theme; + $category = getParentTab(); + $cal_log->debug("Entering getmonthEventLayer() method..."); + $eventlayer = ''; + $arrow_img_name = ''; + $act = $cal['calendar']->month_array[$slice]->activities; + if(!empty($act)) + { + $no_of_act = count($act); + if($no_of_act>2) + { + $act_row = 2; + $remin_list = $no_of_act - $act_row; + } + else + { + $act_row = $no_of_act; + $remin_list = null; + } + for($i=0;$i<$act_row;$i++) + { + $arrow_img_name = 'event'.$cal['calendar']->month_array[$slice]->start_time->hour.'_'.$i; + $id = $act[$i]->record; + $subject = $act[$i]->subject; + if(strlen($subject)>10) + $subject = substr($subject,0,10)."..."; + $format = $cal['calendar']->hour_format; + $start_hour = timeString($act[$i]->start_time,$format); + $end_hour = timeString($act[$i]->end_time,$format); + $account_name = $act[$i]->accountname; + $image = vtiger_imageurl($act[$i]->image_name, $theme); + $color = $act[$i]->color; + //Added for User Based Customview for Calendar Module + $visibility_query=$adb->pquery('SELECT visibility from vtiger_activity where activityid=?',array($id)); + $visibility = $adb->query_result($visibility_query,0,'visibility'); + $user_query = $adb->pquery("SELECT vtiger_crmentity.smownerid,vtiger_users.user_name from vtiger_crmentity,vtiger_users where crmid=? and vtiger_crmentity.smownerid=vtiger_users.id", array($id)); + $userid = $adb->query_result($user_query,0,"smownerid"); + $username = $adb->query_result($user_query,0,"user_name"); + $assigned_role_query=$adb->pquery("select roleid from vtiger_user2role where userid=?",array($userid)); + $assinged_role_id = $adb->query_result($assigned_role_query,0,"roleid"); + $role_list = $adb->pquery("SELECT * from vtiger_role WHERE parentrole LIKE '". formatForSqlLike($current_user->column_fields['roleid']) . formatForSqlLike($assinged_role_id) ."'",array()); + $is_shared = $adb->pquery("SELECT * from vtiger_sharedcalendar where userid=? and sharedid=?",array($userid,$current_user->id)); + + if(($current_user->column_fields['is_admin']!='on' && $adb->num_rows($role_list)==0 && (($adb->num_rows($is_shared)==0 && ($visibility=='Public' || $visibility=='Private')) || $visibility=='Private')) && $current_user->id != $userid) + { + $eventlayer .='
+  '.$username.' - '.$mod_strings["LBL_BUSY"].' +

'; + }else{ + $eventlayer .='
'; + } + } + + if($remin_list != null) + { + $eventlayer .=''; + } + $cal_log->debug("Exiting getmonthEventLayer() method..."); + return $eventlayer; + } +} + +/** + * Function to get events list scheduled between specified dates + * @param array $calendar - collection of objects and strings + * @param string $start_date - date string + * @param string $end_date - date string + * @param string $info - string 'listcnt' or empty string. if 'listcnt' means it returns no. of events and no. of pending events in array format else it returns events list in array format + * return array $Entries - eventslists in array format + */ +function getEventList(& $calendar,$start_date,$end_date,$info='') +{ + global $log,$theme; + $Entries = Array(); + $category = getParentTab(); + global $adb,$current_user,$mod_strings,$app_strings,$cal_log,$listview_max_textlength,$list_max_entries_per_page; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + $cal_log->debug("Entering getEventList() method..."); + + //modified query to fix the ticket #5014 & #5180 + $and = "AND ((((vtiger_activity.date_start between ? AND ?) + OR (vtiger_activity.date_start < ? AND vtiger_activity.due_date > ?) + OR (vtiger_activity.due_date between ? AND ?)) + AND (vtiger_recurringevents.activityid is NULL)) + OR (vtiger_recurringevents.recurringdate BETWEEN ? AND ?))"; + + $count_qry = "SELECT count(*) as count FROM vtiger_activity + INNER JOIN vtiger_crmentity + ON vtiger_crmentity.crmid = vtiger_activity.activityid + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users + ON vtiger_users.id = vtiger_crmentity.smownerid + LEFT OUTER JOIN vtiger_recurringevents + ON vtiger_recurringevents.activityid = vtiger_activity.activityid + WHERE vtiger_crmentity.deleted = 0 + AND (vtiger_activity.activitytype not in ('Emails','Task')) $and "; + + $query = "SELECT vtiger_groups.groupname, vtiger_users.user_name,vtiger_crmentity.smownerid, vtiger_crmentity.crmid, + vtiger_activity.* FROM vtiger_activity + INNER JOIN vtiger_crmentity + ON vtiger_crmentity.crmid = vtiger_activity.activityid + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users + ON vtiger_users.id = vtiger_crmentity.smownerid + LEFT OUTER JOIN vtiger_recurringevents + ON vtiger_recurringevents.activityid = vtiger_activity.activityid + WHERE vtiger_crmentity.deleted = 0 + AND (vtiger_activity.activitytype not in ('Emails','Task')) $and "; + $list_query = $query." AND vtiger_crmentity.smownerid = " . $current_user->id; + + // User Select Customization: Changes should made also in (Appointment::readAppointment) + $query_filter_prefix = calendarview_getSelectedUserFilterQuerySuffix(); + $query .= $query_filter_prefix; + $count_query .= $query_filter_prefix; + // END + + $params = $info_params = array($start_date, $end_date, $start_date, $end_date, $start_date, $end_date, $start_date, $end_date); + if($info != '') + { + $groupids = explode(",", fetchUserGroupids($current_user->id)); // Explode can be removed, once implode is removed from fetchUserGroupids + if (count($groupids) > 0) { + + $com_q = " AND (vtiger_crmentity.smownerid = ? + OR vtiger_groups.groupid in (". generateQuestionMarks($groupids) .")) + GROUP BY vtiger_activity.activityid"; + } else { + $com_q = " AND vtiger_crmentity.smownerid = ? + GROUP BY vtiger_activity.activityid"; + } + + $pending_query = $query." AND (vtiger_activity.eventstatus = 'Planned')".$com_q; + $total_q = $query."".$com_q; + array_push($info_params, $current_user->id); + + if (count($groupids) > 0) { + array_push($info_params, $groupids); + } + + $total_res = $adb->pquery($total_q, $info_params); + $total = $adb->num_rows($total_res); + + $res = $adb->pquery($pending_query, $info_params); + $pending_rows = $adb->num_rows($res); + $cal_log->debug("Exiting getEventList() method..."); + return Array('totalevent'=>$total,'pendingevent'=>$pending_rows); + } + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[16] == 3) + { + $sec_parameter=getCalendarViewSecurityParameter(); + $query .= $sec_parameter; + $list_query .= $sec_parameter; + $count_qry .= $sec_parameter; + } + if(isset($_REQUEST['type']) && $_REQUEST['type'] == 'search') + { + $search_where = calendar_search_where($_REQUEST['field_name'],$_REQUEST['search_option'],$_REQUEST['search_text']); + $group_cond .= $search_where; + $count_qry .= $search_where; + } + $group_cond .= " GROUP BY vtiger_activity.activityid ORDER BY vtiger_activity.date_start,vtiger_activity.time_start ASC"; + $count_qry .= ' GROUP BY vtiger_activity.activityid '; + $count_res = $adb->pquery($count_qry, $params); + $total_rec_count = $adb->num_rows($count_res); + if(isset($_REQUEST['start']) && $_REQUEST['start'] != '') + $start = vtlib_purify($_REQUEST['start']); + else + $start = 1; + $navigation_array = getNavigationValues($start, $total_rec_count, $list_max_entries_per_page); + $start_rec = $navigation_array['start']; + $end_rec = $navigation_array['end_val']; + if($start_rec <= 1) + $start_rec = 0; + else + $start_rec = $start_rec-1; + $query .= $group_cond." limit $start_rec,$list_max_entries_per_page"; + $list_query .= $group_cond; + + if( $adb->dbType == "pgsql"){ + $query = fixPostgresQuery( $query, $log, 0); + $list_query = fixPostgresQuery( $list_query, $log, 0); + } + $list_query = $adb->convert2Sql($list_query, $params); + $_SESSION['Calendar_listquery'] = $list_query; + + $result = $adb->pquery($query, $params); + $rows = $adb->num_rows($result); + $c = 0; + if($start > 1) + $c = ($start-1) * $list_max_entries_per_page; + for($i=0;$i<$rows;$i++) + { + $element = Array(); + $element['no'] = $c+1; + $image_tag = ""; + $contact_data = ""; + $more_link = ""; + $start_time = $adb->query_result($result,$i,"time_start"); + $end_time = $adb->query_result($result,$i,"time_end"); + $format = $calendar['calendar']->hour_format; + $value = getaddEventPopupTime($start_time,$end_time,$format); + $start_hour = $value['starthour'].':'.$value['startmin'].''.$value['startfmt']; + $end_hour = $value['endhour'] .':'.$value['endmin'].''.$value['endfmt']; + $date_start = $adb->query_result($result,$i,"date_start"); + $due_date = $adb->query_result($result,$i,"due_date"); + $element['starttime'] = getDisplayDate($date_start).' '.$start_hour; + $element['endtime'] = getDisplayDate($due_date).' '.$end_hour; + $contact_id = $adb->query_result($result,$i,"contactid"); + $id = $adb->query_result($result,$i,"activityid"); + $subject = $adb->query_result($result,$i,"subject"); + $eventstatus = $adb->query_result($result,$i,"eventstatus"); + $assignedto = $adb->query_result($result,$i,"user_name"); + $userid = $adb->query_result($result,$i,"smownerid"); + $idShared = "normal"; + if(!empty($assignedto) && $userid != $current_user->id && $adb->query_result($result,$i,"visibility") == "Public") + { + $que = "select * from vtiger_sharedcalendar where sharedid=? and userid=?"; + $row = $adb->pquery($que, array($current_user->id, $userid)); + $no = $adb->getRowCount($row); + if($no > 0) $idShared = "shared"; + else $idShared = "normal"; + + + } + if($listview_max_textlength && (strlen($subject)>$listview_max_textlength)) + $subject = substr($subject,0,$listview_max_textlength)."..."; + if($contact_id != '') + { + $contactname = getContactName($contact_id); + $contact_data = "".$contactname.","; + } + $more_link = "[".$mod_strings['LBL_MORE']."...]"; + $type = $adb->query_result($result,$i,"activitytype"); + if($type == 'Call') + $image_tag = " ".$app_strings['Call']; + else if($type == 'Meeting') + $image_tag = " ".$app_strings['Meeting']; + else + $image_tag = " ".getTranslatedString($type); + $element['eventtype'] = $image_tag; + $element['eventdetail'] = $contact_data." ".$subject." ".$more_link; + /*if(getFieldVisibilityPermission('Events',$current_user->id,'parent_id') == '0') + { + $element['relatedto']= getRelatedTo('Calendar',$result,$i); + }*/ + if($idShared == "normal") + { + if(isPermitted("Calendar","EditView") == "yes" || isPermitted("Calendar","Delete")=="yes") + $element['action'] ="date_time->hour."\",\"".$calendar['calendar']->date_time->get_formatted_date()."\",\"event\");' src='" . vtiger_imageurl('cal_event.jpg', $theme). "' border='0'>"; + } + else + { + if(isPermitted("Calendar","EditView") == "yes" || isPermitted("Calendar","Delete")=="yes") + $element['action']=""; + } + if(getFieldVisibilityPermission('Events',$current_user->id,'eventstatus') == '0') + { + if(!$is_admin && $eventstatus != '') + { + $roleid=$current_user->roleid; + $roleids = Array(); + $subrole = getRoleSubordinates($roleid); + if(count($subrole)> 0) + $roleids = $subrole; + array_push($roleids, $roleid); + + //here we are checking wheather the table contains the sortorder column .If sortorder is present in the main picklist table, then the role2picklist will be applicable for this table... + + $sql="select * from vtiger_eventstatus where eventstatus=?"; + $res = $adb->pquery($sql,array(decode_html($eventstatus))); + $picklistvalueid = $adb->query_result($res,0,'picklist_valueid'); + if ($picklistvalueid != null) { + $pick_query="select * from vtiger_role2picklist where picklistvalueid=$picklistvalueid and roleid in (". generateQuestionMarks($roleids) .")"; + $res_val=$adb->pquery($pick_query,array($roleids)); + $num_val = $adb->num_rows($res_val); + } + if($num_val > 0) + $element['status'] = getTranslatedString(decode_html($eventstatus)); + else + $element['status'] = "".$app_strings['LBL_NOT_ACCESSIBLE'].""; + + + }else + $element['status'] = getTranslatedString(decode_html($eventstatus)); + } + if(!empty($assignedto)) + $element['assignedto'] = $assignedto; + else + $element['assignedto'] = $adb->query_result($result,$i,"groupname"); + $element['visibility'] = $adb->query_result($result,$i,"visibility"); + $c++; + $Entries[] = $element; + } + $ret_arr[0] = $Entries; + $ret_arr[1] = $navigation_array; + $cal_log->debug("Exiting getEventList() method..."); + return $ret_arr; +} + +/** + * Function to get todos list scheduled between specified dates + * @param array $calendar - collection of objects and strings + * @param string $start_date - date string + * @param string $end_date - date string + * @param string $info - string 'listcnt' or empty string. if 'listcnt' means it returns no. of todos and no. of pending todos in array format else it returns todos list in array format + * return array $Entries - todolists in array format + */ +function getTodoList(& $calendar,$start_date,$end_date,$info='') +{ + global $log,$app_strings,$theme; + $Entries = Array(); + $category = getParentTab(); + global $adb,$current_user,$mod_strings,$cal_log,$list_max_entries_per_page; + $cal_log->debug("Entering getTodoList() method..."); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + $count_qry = "SELECT count(*) as count FROM vtiger_activity + INNER JOIN vtiger_crmentity + ON vtiger_crmentity.crmid = vtiger_activity.activityid + LEFT JOIN vtiger_cntactivityrel + ON vtiger_cntactivityrel.activityid = vtiger_activity.activityid + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users + ON vtiger_users.id = vtiger_crmentity.smownerid + WHERE vtiger_crmentity.deleted = 0 + AND vtiger_activity.activitytype = 'Task' + AND (vtiger_activity.date_start BETWEEN ? AND ?) AND vtiger_crmentity.smownerid = " . $current_user->id; + + $query = "SELECT vtiger_groups.groupname, vtiger_users.user_name, vtiger_crmentity.crmid, vtiger_cntactivityrel.contactid, + vtiger_activity.* FROM vtiger_activity + INNER JOIN vtiger_crmentity + ON vtiger_crmentity.crmid = vtiger_activity.activityid + LEFT JOIN vtiger_cntactivityrel + ON vtiger_cntactivityrel.activityid = vtiger_activity.activityid + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users + ON vtiger_users.id = vtiger_crmentity.smownerid + WHERE vtiger_crmentity.deleted = 0 + AND vtiger_activity.activitytype = 'Task' + AND (vtiger_activity.date_start BETWEEN ? AND ?) AND vtiger_crmentity.smownerid = " . $current_user->id; + + $list_query = $query; + + // User Select Customization + /*$only_for_user = calendarview_getSelectedUserId(); + if($only_for_user != 'ALL') { + $query .= " AND vtiger_crmentity.smownerid = " . $only_for_user; + $count_qry .= " AND vtiger_crmentity.smownerid = " . $only_for_user; + }*/ + // END + $params = $info_params = array($start_date, $end_date); + if($info != '') + { + //added to fix #4816 + $groupids = explode(",", fetchUserGroupids($current_user->id)); + if (count($groupids) > 0) { + $com_q = " AND (vtiger_crmentity.smownerid = ? + OR vtiger_groups.groupid in (". generateQuestionMarks($groupids) ."))"; + } else { + $com_q = " AND vtiger_crmentity.smownerid = ?"; + } + //end + + $pending_query = $query." AND (vtiger_activity.status != 'Completed')".$com_q; + $total_q = $query."".$com_q; + array_push($info_params, $current_user->id); + + if (count($groupids) > 0) { + array_push($info_params, $groupids); + } + + if( $adb->dbType == "pgsql") + { + $pending_query = fixPostgresQuery( $pending_query, $log, 0); + $total_q = fixPostgresQuery( $total_q, $log, 0); + } + $total_res = $adb->pquery($total_q, $info_params); + $total = $adb->num_rows($total_res); + + $res = $adb->pquery($pending_query, $info_params); + $pending_rows = $adb->num_rows($res); + + $cal_log->debug("Exiting getTodoList() method..."); + return Array('totaltodo'=>$total,'pendingtodo'=>$pending_rows); + } + + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[9] == 3) + { + $sec_parameter=getListViewSecurityParameter('Calendar'); + $query .= $sec_parameter; + $list_query .= $sec_parameter; + $count_qry .= $sec_parameter; + } + $group_cond = ''; + $count_res = $adb->pquery($count_qry, $params); + $total_rec_count = $adb->query_result($count_res,0,'count'); + $group_cond .= " ORDER BY vtiger_activity.date_start,vtiger_activity.time_start ASC"; + if(isset($_REQUEST['start']) && $_REQUEST['start'] != '') + $start = vtlib_purify($_REQUEST['start']); + else + $start = 1; + $navigation_array = getNavigationValues($start, $total_rec_count, $list_max_entries_per_page); + + $start_rec = $navigation_array['start']; + $end_rec = $navigation_array['end_val']; + if($start_rec <= 1) + $start_rec = 0; + else + $start_rec = $start_rec-1; + $query .= $group_cond." limit $start_rec,$list_max_entries_per_page"; + $list_query .= $group_cond; + + if( $adb->dbType == "pgsql"){ + $query = fixPostgresQuery( $query, $log, 0); + $list_query = fixPostgresQuery( $list_query, $log, 0); + } + + $list_query = $adb->convert2Sql($list_query, $params); + $_SESSION['Calendar_listquery'] = $list_query; + + $result = $adb->pquery($query, $params); + $rows = $adb->num_rows($result); + $c=0; + if($start > 1) + $c = ($start-1) * $list_max_entries_per_page; + for($i=0;$i<$rows;$i++) + { + + $element = Array(); + $contact_name = ''; + $element['no'] = $c+1; + $more_link = ""; + $start_time = $adb->query_result($result,$i,"time_start"); + $format = $calendar['calendar']->hour_format; + $value = getaddEventPopupTime($start_time,$start_time,$format); + $element['starttime'] = $value['starthour'].':'.$value['startmin'].''.$value['startfmt']; + $date_start = $adb->query_result($result,$i,"date_start"); + $due_date = $adb->query_result($result,$i,"due_date"); + if($calendar['view'] != 'day') + $element['startdate'] = getDisplayDate($date_start); + $element['duedate'] = getDisplayDate($due_date); + + $id = $adb->query_result($result,$i,"activityid"); + $subject = $adb->query_result($result,$i,"subject"); + //CHANGE : TO IMPROVE PERFORMANCE + /*$contact_id = $adb->query_result($result,$i,"contactid"); + if($contact_id!='') + { + $contact_name = getContactName($contact_id); + }*/ + + $more_link = "".$subject.""; + $element['tododetail'] = $more_link; + /*if(getFieldVisibilityPermission('Calendar',$current_user->id,'parent_id') == '0') + { + $element['task_relatedto'] = getRelatedTo('Calendar',$result,$i); + } + if(getFieldVisibilityPermission('Calendar',$current_user->id,'contact_id') == '0') + { + $element['task_contact'] = "".$contact_name.""; + }*/ + if(getFieldVisibilityPermission('Calendar',$current_user->id,'taskstatus') == '0') + { + $taskstatus = $adb->query_result($result,$i,"status"); + + if(!$is_admin && $taskstatus != '') + { + $roleid=$current_user->roleid; + $roleids = Array(); + $subrole = getRoleSubordinates($roleid); + if(count($subrole)> 0) + $roleids = $subrole; + array_push($roleids, $roleid); + + //here we are checking wheather the table contains the sortorder column .If sortorder is present in the main picklist table, then the role2picklist will be applicable for this table... + + $sql="select * from vtiger_taskstatus where taskstatus=?"; + $res = $adb->pquery($sql,array(decode_html($taskstatus))); + $picklistvalueid = $adb->query_result($res,0,'picklist_valueid'); + if ($picklistvalueid != null) { + $pick_query="select * from vtiger_role2picklist where picklistvalueid=$picklistvalueid and roleid in (". generateQuestionMarks($roleids) .")"; + $res_val=$adb->pquery($pick_query,array($roleids)); + $num_val = $adb->num_rows($res_val); + } + if($num_val > 0) + $element['status'] = getTranslatedString(decode_html($taskstatus)); + else + $element['status'] = "".$app_strings['LBL_NOT_ACCESSIBLE'].""; + + + }else + $element['status'] = getTranslatedString(decode_html($taskstatus)); + + + } + if(isPermitted("Calendar","EditView") == "yes" || isPermitted("Calendar","Delete") == "yes") + $element['action'] ="date_time->hour."\",\"".$calendar['calendar']->date_time->get_formatted_date()."\",\"todo\");' src='" . vtiger_imageurl('cal_event.jpg', $theme). "' border='0'>"; + $assignedto = $adb->query_result($result,$i,"user_name"); + if(!empty($assignedto)) + $element['assignedto'] = $assignedto; + else + $element['assignedto'] = $adb->query_result($result,$i,"groupname"); + $c++; + $Entries[] = $element; + } + $ret_arr[0] = $Entries; + $ret_arr[1] = $navigation_array; + $cal_log->debug("Exiting getTodoList() method..."); + return $ret_arr; +} + +/** + * Function to get number of Events and Todos Info + * @param array $cal - collection of objects and strings + * @param string $mode - string 'listcnt' or may be empty. if empty means get Events/Todos ListView else get total events/todos and no. of pending events/todos Info. + * return array $event_todo_info - collection of events/todos info. + */ +function getEventInfo(& $cal, $mode) +{ + global $mod_strings,$cal_log; + $cal_log->debug("Entering getEventInfo() method..."); + $event = Array(); + $event['event']=getEventListView($cal, $mode); + $event_info = ""; + $event_info .= $mod_strings['LBL_TOTALEVENTS']." ".$event['event']['totalevent']; + if($event['event']['pendingevent'] != null) + $event_info .= ", ".$event['event']['pendingevent']." ".$mod_strings['LBL_PENDING']; + $cal_log->debug("Exiting getEventInfo() method..."); + + return $event_info; +} + +function getTodoInfo(& $cal, $mode) +{ + global $mod_strings,$cal_log; + $cal_log->debug("Entering getTodoInfo() method..."); + $todo = Array(); + $todo['todo'] = getTodosListView($cal, $mode); + $todo_info = ""; + $todo_info .=$mod_strings['LBL_TOTALTODOS']." ".$todo['todo']['totaltodo']; + if($todo['todo']['pendingtodo'] != null) + $todo_info .= ", ".$todo['todo']['pendingtodo']." ".$mod_strings['LBL_PENDING']; + $cal_log->debug("Exiting getTodoInfo() method..."); + + return $todo_info; +} + + +/** + * Function creates HTML to display Events ListView + * @param array $entry_list - collection of strings(Event Information) + * return string $list_view - html tags in string format + */ +function constructEventListView(& $cal,$entry_list,$navigation_array='') +{ + global $mod_strings,$app_strings,$adb,$cal_log,$current_user,$theme; + $cal_log->debug("Entering constructEventListView() method..."); + $format = $cal['calendar']->hour_format; + $date_format = $current_user->date_format; + $hour_startat = timeString(array('hour'=>date('H:i'),'minute'=>0),'24'); + $hour_endat = timeString(array('hour'=>date('H:i',(time() + (60 * 60))),'minute'=>0),'24'); + $time_arr = getaddEventPopupTime($hour_startat,$hour_endat,$format); + $temp_ts = $cal['calendar']->date_time->ts; + //to get date in user selected date format + $temp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$temp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$temp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $temp_ts)):('')))); + if($cal['calendar']->day_start_hour != 23) + $endtemp_date = $temp_date; + else + { + $endtemp_ts = $temp_ts + (1 * 24 * 60 * 60); + $endtemp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$endtemp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$endtemp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $endtemp_ts)):('')))); + } + $list_view = ""; + $start_datetime = $app_strings['LBL_START_DATE_TIME']; + $end_datetime = $app_strings['LBL_END_DATE_TIME']; + //Events listview header labels + $header = Array('0'=>'#', + '1'=>$start_datetime, + '2'=>$end_datetime, + '3'=>$mod_strings['LBL_EVENTTYPE'], + '4'=>$mod_strings['LBL_EVENTDETAILS'] + ); + $header_width = Array('0'=>'5%', + '1'=>'15%', + '2'=>'15%', + '3'=>'10%', + '4'=>'33%' + ); + /*if(getFieldVisibilityPermission('Events',$current_user->id,'parent_id') == '0') + { + array_push($header,$mod_strings['LBL_RELATEDTO']); + array_push($header_width,'15%'); + }*/ + if(isPermitted("Calendar","EditView") == "yes" || isPermitted("Calendar","Delete") == "yes") + { + array_push($header,$mod_strings['LBL_ACTION']); + array_push($header_width,'10%'); + } + if(getFieldVisibilityPermission('Events',$current_user->id,'eventstatus') == '0') + { + array_push($header,$mod_strings['LBL_STATUS']); + array_push($header_width,'$10%'); + } + array_push($header,$mod_strings['LBL_ASSINGEDTO']); + array_push($header_width,'15%'); + + $list_view .=" + "; + $header_rows = count($header); + $navigationOutput = getTableHeaderNavigation($navigation_array, $url_string,"Calendar","index"); + if($navigationOutput != '') + { + $list_view .= ""; + } + $list_view .= ""; + for($i=0;$i<$header_rows;$i++) + { + $list_view .=""; + } + $list_view .=""; + $rows = count($entry_list); + if($rows != 0) + { + for($i=0;$i"; + + foreach($entry_list[$i] as $key=>$entry) + { + $assigned_role_query=$adb->pquery("select vtiger_user2role.roleid,vtiger_user2role.userid from vtiger_user2role INNER JOIN vtiger_users where vtiger_users.id=vtiger_user2role.userid and vtiger_users.user_name=?",array($entry_list[$i]['assignedto'])); + $assigned_user_role_id = $adb->query_result($assigned_role_query,0,"roleid"); + $assigned_user_id = $adb->query_result($assigned_role_query,0,"userid"); + $role_list = $adb->pquery("SELECT * from vtiger_role WHERE parentrole LIKE '". formatForSqlLike($current_user->column_fields['roleid']) . formatForSqlLike($assigned_user_role_id) ."'",array()); + $is_shared = $adb->pquery("SELECT * from vtiger_sharedcalendar where userid=? and sharedid=?",array($assigned_user_id,$current_user->id)); + if($key!='visibility'){ + if(($key=='eventdetail'|| $key=='action') && ($current_user->column_fields['is_admin']!='on' && $adb->num_rows($role_list)==0 && (($adb->num_rows($is_shared)==0 && ($entry_list[$i]['visibility']=='Public' || $entry_list[$i]['visibility']=='Private')) || $entry_list[$i]['visibility']=='Private')) && $current_user->column_fields['user_name']!=$entry_list[$i]['assignedto']){ + if($key=='eventdetail') + $list_view .=""; + else + $list_view .=""; + }else + $list_view .=""; + } + } + $list_view .=""; + } + } + else + { + $list_view .=""; + } + $list_view .="
"; + $list_view .= "".$navigationOutput."
".$header[$i]."
".$entry_list[$i]['assignedto']." - ".$mod_strings['LBL_BUSY']."".$app_strings['LBL_NOT_ACCESSIBLE']."$entry
+ "; + $list_view .="
+ + + + + + "; + //checking permission for Create/Edit Operation + if(isPermitted("Calendar","EditView") == "yes") + { + $list_view .=""; + } + else + { + $list_view .=""; + } + $list_view .=" +
+ ".$app_strings['LBL_NO']." ".$app_strings['Events']." ".$app_strings['LBL_FOUND']." !
".$app_strings['LBL_YOU_CAN_CREATE']." ".$app_strings['LBL_AN']." ".$app_strings['Event']." ".$app_strings['LBL_NOW'].".
+   -".$app_strings['LBL_CREATE']." ".$app_strings['LBL_AN']." ".$app_strings['Event']."
+
".$app_strings['LBL_YOU_ARE_NOT_ALLOWED_TO_CREATE']." ".$app_strings['LBL_AN']." ".$app_strings['Event']."
+
"; + $list_view .="
"; + $cal_log->debug("Exiting constructEventListView() method..."); + return $list_view; +} + +/** + * Function creates HTML to display Todos ListView + * @param array $todo_list - collection of strings(Todo Information) + * @param array $cal - collection of objects and strings + * return string $list_view - html tags in string format + */ +function constructTodoListView($todo_list,$cal,$subtab,$navigation_array='') +{ + global $mod_strings,$cal_log,$adb,$theme; + $cal_log->debug("Entering constructTodoListView() method..."); + global $current_user,$app_strings; + $date_format = $current_user->date_format; + $format = $cal['calendar']->hour_format; + $hour_startat = timeString(array('hour'=>date('H:i'),'minute'=>0),'24'); + $hour_endat = timeString(array('hour'=>date('H:i',(time() + (60 * 60))),'minute'=>0),'24'); + $time_arr = getaddEventPopupTime($hour_startat,$hour_endat,$format); + $temp_ts = $cal['calendar']->date_time->ts; + //to get date in user selected date format + $temp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$temp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$temp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $temp_ts)):('')))); + if($cal['calendar']->day_start_hour != 23) + $endtemp_date = $temp_date; + else + { + $endtemp_ts = $temp_ts + (1 * 24 * 60 * 60); + $endtemp_date = (($date_format == 'dd-mm-yyyy')?(date('d-m-Y',$endtemp_ts)):(($date_format== 'mm-dd-yyyy')?(date('m-d-Y',$endtemp_ts)):(($date_format == 'yyyy-mm-dd')?(date('Y-m-d', $endtemp_ts)):('')))); + } + $list_view = ""; + //labels of listview header + if($cal['view'] == 'day') + { + $colspan = 9; + $header = Array('0'=>'#','1'=>$mod_strings['LBL_TIME'],'2'=>$mod_strings['LBL_LIST_DUE_DATE'], + '3'=>$mod_strings['LBL_TODO']); + $header_width = Array('0'=>'5%','1'=>'10%','2'=>'10%','3'=>'38%',); + /*if(getFieldVisibilityPermission('Calendar',$current_user->id,'parent_id') == '0') + { + array_push($header,$mod_strings['LBL_RELATEDTO']); + array_push($header_width,'15%'); + } + if(getFieldVisibilityPermission('Calendar',$current_user->id,'contact_id') == '0') + { + array_push($header,$mod_strings['LBL_CONTACT_NAME']); + array_push($header_width,'15%'); + }*/ + if(getFieldVisibilityPermission('Calendar',$current_user->id,'taskstatus') == '0') + { + array_push($header,$mod_strings['LBL_STATUS']); + array_push($header_width,'10%'); + } + + if(isPermitted("Calendar","EditView") == "yes" || isPermitted("Calendar","Delete") == "yes") + { + array_push($header,$mod_strings['LBL_ACTION']); + array_push($header_width,'10%'); + } + array_push($header,$mod_strings['LBL_ASSINGEDTO']); + array_push($header_width,'15%'); + } + else + { + $colspan = 10; + $header = Array('0'=>'#', + '1'=>$mod_strings['LBL_TIME'], + '2'=>$mod_strings['LBL_START_DATE'], + '3'=>$mod_strings['LBL_DUE_DATE'], + '4'=>$mod_strings['LBL_TODO'] + ); + $header_width = Array('0'=>'5%', + '1'=>'10%', + '2'=>'10%', + '3'=>'10%', + '4'=>'28%' + ); + /*if(getFieldVisibilityPermission('Calendar',$current_user->id,'parent_id') == '0') + { + array_push($header,$mod_strings['LBL_RELATEDTO']); + array_push($header_width,'15%'); + } + if(getFieldVisibilityPermission('Calendar',$current_user->id,'contact_id') == '0') + { + array_push($header,$mod_strings['LBL_CONTACT_NAME']); + array_push($header_width,'15%'); + }*/ + if(getFieldVisibilityPermission('Calendar',$current_user->id,'taskstatus') == '0') + { + array_push($header,$mod_strings['LBL_STATUS']); + array_push($header_width,'10%'); + } + if(isPermitted("Calendar","EditView") == "yes" || isPermitted("Calendar","Delete") == "yes") + { + array_push($header,$mod_strings['LBL_ACTION']); + } + array_push($header,$mod_strings['LBL_ASSINGEDTO']); + array_push($header_width,'15%'); + + } + if($current_user->column_fields['is_admin']=='on') + $Res = $adb->pquery("select * from vtiger_activitytype",array()); + else + { + $roleid=$current_user->roleid; + $subrole = getRoleSubordinates($roleid); + if(count($subrole)> 0) + { + $roleids = $subrole; + array_push($roleids, $roleid); + } + else + { + $roleids = $roleid; + } + + if (count($roleids) > 1) { + $Res=$adb->pquery("select distinct activitytype from vtiger_activitytype inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_activitytype.picklist_valueid where roleid in (". generateQuestionMarks($roleids) .") and picklistid in (select picklistid from vtiger_activitytype) order by sortid asc",array($roleids)); + } else { + $Res=$adb->pquery("select distinct activitytype from vtiger_activitytype inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_activitytype.picklist_valueid where roleid = ? and picklistid in (select picklistid from vtiger_activitytype) order by sortid asc",array($roleid)); + } + } + $eventlist=''; + for($i=0; $i<$adb->num_rows($Res);$i++) + { + $eventlist .= $adb->query_result($Res,$i,'activitytype').";"; + } + + $list_view .=" + "; + //checking permission for Create/Edit Operation + if(isPermitted("Calendar","EditView") == "yes") + { + $list_view .=" + "; + } + else + { + $list_view .=""; + } + $list_view .=" + + +
 
+ ".$mod_strings['LBL_ADD']." +
 ".getTodoInfo($cal,'listcnt')."  
+ +
+ "; + $header_rows = count($header); + $navigationOutput = getTableHeaderNavigation($navigation_array, $url_string,"Calendar","index"); + if($navigationOutput != '') + { + $list_view .= ""; + } + $list_view .= ""; + for($i=0;$i<$header_rows;$i++) + { + $list_view .=""; + } + $list_view .=""; + $rows = count($todo_list); + if($rows != 0) + { + for($i=0;$i$entry) + { + $list_view .=""; + } + $list_view .=""; + } + } + else + { + $list_view .=""; + } + $list_view .="
"; + $list_view .= "".$navigationOutput."
".$header[$i]."
".$entry."
"; + $list_view .="
+ + + + + + "; + //checking permission for Create/Edit Operation + if(isPermitted("Calendar","EditView") == "yes") + { + $list_view .=""; + } + else + { + $list_view .=""; + } + + $list_view .=" +
+ ".$app_strings['LBL_NO']." ".$app_strings['Todos']." ".$app_strings['LBL_FOUND']." !
".$app_strings['LBL_YOU_CAN_CREATE']." ".$app_strings['LBL_A']." ".$app_strings['Todo']." ".$app_strings['LBL_NOW'].". ".$app_strings['LBL_CLICK_THE_LINK']." :
+   -".$app_strings['LBL_CREATE']." ".$app_strings['LBL_A']." ".$app_strings['Todo']." +
".$app_strings['LBL_YOU_ARE_NOT_ALLOWED_TO_CREATE']." ".$app_strings['LBL_A']." ".$app_strings['Todo']."
+
"; + $list_view .="

"; + $cal_log->debug("Exiting constructTodoListView() method..."); + return $list_view; +} + +/** + * Function returns the list of privileges and permissions of the events that the current user can view the details of. + * return string - query that is used as secondary parameter to fetch the events that the user can view and the schedule of the users + */ +function getCalendarViewSecurityParameter() +{ + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + + require_once('modules/Calendar/CalendarCommon.php'); + $shared_ids = getSharedCalendarId($current_user->id); + if(isset($shared_ids) && $shared_ids != '') + $condition = " or (vtiger_crmentity.smownerid in($shared_ids)) or (vtiger_crmentity.smownerid NOT LIKE ($current_user->id))";// and vtiger_activity.visibility = 'Public')"; + else + $condition = "or (vtiger_crmentity.smownerid NOT LIKE ($current_user->id))"; + $sec_query .= " and (vtiger_crmentity.smownerid in($current_user->id) $condition or vtiger_crmentity.smownerid in(select vtiger_user2role.userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '".$current_user_parent_role_seq."::%')"; + + if(sizeof($current_user_groups) > 0) + { + $sec_query .= " or (vtiger_groups.groupid in (". implode(",", $current_user_groups) ."))"; + } + $sec_query .= ")"; + return $sec_query; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/calendar_share.php b/oss/vtiger/trunk/modules/Calendar/calendar_share.php new file mode 100644 index 00000000..f6cc7d37 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/calendar_share.php @@ -0,0 +1,169 @@ +id); + $shareduser_ids = getSharedUserId($current_user->id); +?> + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+ start_hour != ''){?> checked onClick="enableCalstarttime();">  +
+ hour_format == '24'){?> checked value="24">  +
+
+

+ +
+ + + + +
+ + + + + + + + + + + + + +
+
    +
  • +
  • +
+
 
+ + + +
+ +
+ + + + + +
+ + +
+ +
+
+
+ + + + +
+    + +
+
+ diff --git a/oss/vtiger/trunk/modules/Calendar/disable_sharing.php b/oss/vtiger/trunk/modules/Calendar/disable_sharing.php new file mode 100644 index 00000000..6b73acb2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/disable_sharing.php @@ -0,0 +1,22 @@ +pquery($sql, array($id)); +} +header("Location:index.php?module=".$returnmodule."&action=".$returnaction); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/header.php b/oss/vtiger/trunk/modules/Calendar/header.php new file mode 100644 index 00000000..dbe3e5e2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/header.php @@ -0,0 +1,120 @@ + + + + + '.$app_strings[$category].' > '.$app_strings["Calendar"].' + + + + + + + +
+ + + + + +
+
+ +   + + + + + '; + + + if($CALENDAR_DISPLAY == 'true') + $html_string .= ' '; + if($WORLD_CLOCK_DISPLAY == 'true') + $html_string .= ' '; + if($CALCULATOR_DISPLAY == 'true') + $html_string .= ' '; + if($CHAT_DISPLAY == 'true') + $html_string .= ' '; + + $html_string .= ' + + +
'.$app_strings['LBL_CALENDAR_ALT'].''.$app_strings['LBL_CLOCK_ALT'].''.$app_strings['LBL_CALCULATOR_ALT'].''.$app_strings['LBL_CHAT_ALT'].''.$app_strings['LBL_LAST_VIEWED'].'
+ +   + + + + + + + +
+ +   + + + + '; + if((isPermitted('Settings','index') == 'yes')) + $html_string .= ''; + $html_string .= ' +
'.$app_strings['LBL_ALL_MENU_ALT'].''.$app_strings['LBL_SETTINGS'].'
+ + + + + + + + + + + \ + \ + \ + \ + ', fieldName, fieldLabel, expression.replace("\n","
"), editLink, deleteLink); + $('#expressionlist').append(row); + $(format('#expressionlist_deletelink_%s', fieldName)).click(function(){ + if(confirm(strings.LBL_DELETE_EXPRESSION_CONFIRM)) { + $('#status').show(); + + jsonget('deleteexpressionjson', + {modulename:moduleName, fieldname:fieldName}, + function(result){ + $('#status').hide(); + + if(result.status=='success'){ + $(format('#expressionlistrow_%s', fieldName)).remove(); + }else{ + errorDialog(result.message); + } + } + ); + } + }); + $(format('#expressionlist_editlink_%s', fieldName)).click(function(){ + ep.edit(fieldName, expression); + }); + } + + format = fn.format; + var moduleName; + function editpopup(){ + function close(){ + $('#editpopup').css('display', 'none'); + $('#editpopup_expression').text(''); + } + + function show(module){ + $('#editpopup').css('display', 'block'); + center($('#editpopup')); + } + + function center(el){ + el.css({position: 'absolute'}); + el.width("650px"); + el.height("310px"); + placeAtCenter(el.get(0)); + } + + $('#editpopup_close').bind('click', close); + $('#editpopup_save').bind('click', function(){ + var expression = $('#editpopup_expression').attr('value'); + var fieldName = $('#editpopup_field').attr('value'); + var fieldLabel = getfieldlabel(fieldName); + var moduleName = $('#pick_module').attr('value'); + + if(expression == '') return false; + + VtigerJS_DialogBox.block(); + $.get('index.php', { + module:'FieldFormulas', + action:'FieldFormulasAjax', + file:'saveexpressionjson', ajax:'true', + modulename: moduleName, fieldname:fieldName, + expression:expression + }, + function(result){ + VtigerJS_DialogBox.unblock(); + try { + var parsed = JSON.parse(result); + if(parsed.status=='success'){ + $("#expressionlistrow_"+fieldName).remove(); + addFieldExpression(moduleName, fieldName, fieldLabel, expression); + close(); + }else{ + errorDialog('save failed because '+parsed.message); + } + } catch(error) { + alert(error); + } + }); + }); + + $('#editpopup_cancel').bind('click', close); + + $('#editpopup_fieldnames').bind('change', function(){ + var textarea = $('#editpopup_expression').get(0); + var value = $(this).attr('value'); + if(value != '') value += ' '; + //http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript + if (document.selection) { + textarea.focus(); + var sel = document.selection.createRange(); + sel.text = value; + textarea.focus(); + }else if (textarea.selectionStart || textarea.selectionStart == '0') { + var startPos = textarea.selectionStart; + var endPos = textarea.selectionEnd; + var scrollTop = textarea.scrollTop; + textarea.value = textarea.value.substring(0, startPos) + + value + + textarea.value.substring(endPos, + textarea.value.length); + textarea.focus(); + textarea.selectionStart = startPos + value.length; + textarea.selectionEnd = startPos + value.length; + textarea.scrollTop = scrollTop; + } else { + textarea.value += value; + textarea.focus(); + } + // Reset the selected option (to enable next selection) + this.value = ''; + + }); + + + jsonget('getfunctionsjson', + {modulename:moduleName}, + function(result){ + var functions = $('#editpopup_functions'); + $.each(result, function(label, template){ + functions.append(format('', template, label)); + }); + $('#editpopup_functions').bind('change', function(){ + var textarea = $('#editpopup_expression').get(0); + var value = $(this).attr('value'); + //http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript + if (document.selection) { + textarea.focus(); + var sel = document.selection.createRange(); + sel.text = value; + textarea.focus(); + }else if (textarea.selectionStart || textarea.selectionStart == '0') { + var startPos = textarea.selectionStart; + var endPos = textarea.selectionEnd; + var scrollTop = textarea.scrollTop; + textarea.value = textarea.value.substring(0, startPos) + + value + + textarea.value.substring(endPos, + textarea.value.length); + textarea.focus(); + textarea.selectionStart = startPos + value.length; + textarea.selectionEnd = startPos + value.length; + textarea.scrollTop = scrollTop; + }else { + textarea.value += value; + textarea.focus(); + } + // Reset the selected option (to enable next selection) + this.value = ''; + + }); + + } + ); + + + return { + create: show, + edit: function(field, expression){ + $("#editpopup_field").attr('value', field); + $("#editpopup_expression").attr('value', expression); + show(); + }, + close:close, + changeModule: function(moduleName, exprFields, moduleFields){ + var field = $('#editpopup_field'); + field.children().remove(); + $.each(exprFields, function(fieldName, fieldLabel){ + field.append(format('', fieldName, fieldLabel)); + }); + + var fieldNames = $('#editpopup_fieldnames'); + fieldNames.children().remove(); + fieldNames.append(format('', fieldName, fieldLabel)); + }); + } + }; + } + + $(document).ready( + function(){ + Drag.init(document.getElementById('editpopup_draghandle'), document.getElementById('editpopup')); + toExec(); + } + ); + + function toExec(){ + ep = editpopup(); + function setModule(moduleName){ + $.get('index.php', { + module:'FieldFormulas', + action:'FieldFormulasAjax', + file:'getfieldsjson', ajax:'true', + modulename:moduleName}, + function(result){ + var parsed = JSON.parse(result); + ep.changeModule($(this).attr("value"), parsed['exprFields'], parsed['moduleFields']); + + $('#new_field_expression_busyicon').hide(); + $('#new_field_expression').show(); + + if(parsed['exprFields'].length!=0){ + $('#new_field_expression').attr('disabled', false); + $('#new_field_expression').attr('class', 'crmButton create small'); + $('#new_field_expression').bind('click', function(){ + ep.create(); + }); + $('#status_message').html(''); + $('#status_message').hide(); + }else{ + $('#new_field_expression').hide(); + $('#status_message').show(); + $('#status_message').html(strings.NEED_TO_ADD_A + ' ' + strings.CUSTOM_FIELD +''); + } + + jsonget('getexpressionlistjson', + {modulename:moduleName}, + function(result){ + $('#expressionlist_busyicon').hide(); + + var exprFields = parsed['exprFields']; + $('.expressionlistrow').remove(); + $.each(result, function(fieldName, expression){ + var fieldLabel = getfieldlabel(fieldName); + if(exprFields[fieldName]){ + addFieldExpression(moduleName, fieldName, fieldLabel, expression); + }else{ + jsonget('deleteexpressionjson', + {modulename:moduleName, fieldname:fieldName}, + function(){}); + } + + }); + } + ); + }); + ep.close(); + + + } + + $('#pick_module').bind('change', function(){ + var moduleName = $(this).attr("value"); + setModule(moduleName); + }); + setModule($('#pick_module').attr('value')); + + + + }; +} +editexpressionscript(jQuery); diff --git a/oss/vtiger/trunk/modules/FieldFormulas/resources/functional.js b/oss/vtiger/trunk/modules/FieldFormulas/resources/functional.js new file mode 100644 index 00000000..70579941 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/resources/functional.js @@ -0,0 +1,142 @@ +/*+******************************************************************************* + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ******************************************************************************/ +function functional(){} + +functional.prototype = { + + /** + * Test: + * fn.format("Hello %s", "world") == "Hello world" + */ + format: function(){ + var i=1; + var fmtStr = arguments[0]; + var args = arguments; + return fmtStr.replace(/%s/g,function(){return args[i++];}) + }, + + + + + + addStylesheet: function(url){ + /*From: http://www.hunlock.com/blogs/Howto_Dynamically_Insert_Javascript_And_CSS*/ + var headID = document.getElementsByTagName("head")[0]; + var cssNode = document.createElement('link'); + cssNode.type = 'text/css'; + cssNode.rel = 'stylesheet'; + cssNode.href = url; + cssNode.media = 'screen'; + headID.appendChild(cssNode); + }, + + /* + *Convert the last parameter into a list argument + */ + + + /** + * Internal function for handling function arguments + * + * Test: + * fn.args("a","b","*c")(function(args){return args;})(1,2,3,4)=={"a":1,"b":2,"c":[3,4]}; + */ + /* + args: function(){ + if(arguments[arguments.length-1][0]=="*"){ + args = arguments[0,-1]; + larg = arguments[arguments.length-1].slice(1); + }else{ + args = arguments; + larg = null; + } + return function(callable){ + return { + arr=new Object(); + for(var i =1;iarguments.length){ + nparams = arguments.length; + } + + var args = []; + for(var i=0;i)[^>]*$|^#(\w+)$/, + +// Is it a simple selector + isSimple = /^.[^:#\[\.]*$/, + +// Will speed up references to undefined, and allows munging its name. + undefined; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + return this; + } + // Handle HTML strings + if ( typeof selector == "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Make sure an element was located + if ( elem ){ + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + return jQuery( elem ); + } + selector = []; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); + + return this.setArray(jQuery.makeArray(selector)); + }, + + // The current version of jQuery being used + jquery: "1.2.6", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // The number of elements contained in the matched element set + length: 0, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + var ret = -1; + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( name.constructor == String ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text != "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) + // The elements to wrap the target around + jQuery( html, this[0].ownerDocument ) + .clone() + .insertBefore( this[0] ) + .map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }) + .append(this); + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, false, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, true, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + find: function( selector ) { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? + jQuery.unique( elems ) : + elems ); + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var clone = this.cloneNode(true), + container = document.createElement("div"); + container.appendChild(clone); + return jQuery.clean([container.innerHTML])[0]; + } else + return this.cloneNode(true); + }); + + // Need to set the expando to null on the cloned set if it exists + // removeData doesn't work here, IE removes it from the original as well + // this is primarily for IE but the data expando shouldn't be copied over in any browser + var clone = ret.find("*").andSelf().each(function(){ + if ( this[ expando ] != undefined ) + this[ expando ] = null; + }); + + // Copy the events from the original to the clone + if ( events === true ) + this.find("*").andSelf().each(function(i){ + if (this.nodeType == 3) + return; + var events = jQuery.data( this, "events" ); + + for ( var type in events ) + for ( var handler in events[ type ] ) + jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); + }); + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, this ) ); + }, + + not: function( selector ) { + if ( selector.constructor == String ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ) ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector == 'string' ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return this.is( "." + selector ); + }, + + val: function( value ) { + if ( value == undefined ) { + + if ( this.length ) { + var elem = this[0]; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value; + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + + // Everything else, we just grab the value + } else + return (this[0].value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if( value.constructor == Number ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( value.constructor == Array && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value == undefined ? + (this[0] ? + this[0].innerHTML : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + data: function( key, value ){ + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) + data = jQuery.data( this[0], key ); + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ + jQuery.data( this, key, value ); + }); + }, + + removeData: function( key ){ + return this.each(function(){ + jQuery.removeData( this, key ); + }); + }, + + domManip: function( args, table, reverse, callback ) { + var clone = this.length > 1, elems; + + return this.each(function(){ + if ( !elems ) { + elems = jQuery.clean( args, this.ownerDocument ); + + if ( reverse ) + elems.reverse(); + } + + var obj = this; + + if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) + obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); + + var scripts = jQuery( [] ); + + jQuery.each(elems, function(){ + var elem = clone ? + jQuery( this ).clone( true )[0] : + this; + + // execute all scripts after the elements have been injected + if ( jQuery.nodeName( elem, "script" ) ) + scripts = scripts.add( elem ); + else { + // Remove any inner scripts for later evaluation + if ( elem.nodeType == 1 ) + scripts = scripts.add( jQuery( "script", elem ).remove() ); + + // Inject the elements into the document + callback.call( obj, elem ); + } + }); + + scripts.each( evalScript ); + }); + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( target.constructor == Boolean ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target != "object" && typeof target != "function" ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy == "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +var expando = "jQuery" + now(), uuid = 0, windowData = {}, + // exclude the following css properties to add px + exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning this function. + isFunction: function( fn ) { + return !!fn && typeof fn != "string" && !fn.nodeName && + fn.constructor != Array && /^[\s[]?function/.test( fn + "" ); + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + data = jQuery.trim( data ); + + if ( data ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.browser.msie ) + script.text = data; + else + script.appendChild( document.createTextNode( data ) ); + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + cache: {}, + + data: function( elem, name, data ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // Compute a unique ID for the element + if ( !id ) + id = elem[ expando ] = ++uuid; + + // Only generate the data cache if we're + // trying to access or manipulate it + if ( name && !jQuery.cache[ id ] ) + jQuery.cache[ id ] = {}; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) + jQuery.cache[ id ][ name ] = data; + + // Return the named cache data, or the ID for the element + return name ? + jQuery.cache[ id ][ name ] : + id; + }, + + removeData: function( elem, name ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( jQuery.cache[ id ] ) { + // Remove the section of cache data + delete jQuery.cache[ id ][ name ]; + + // If we've removed all the data, remove the element's cache + name = ""; + + for ( name in jQuery.cache[ id ] ) + break; + + if ( !name ) + jQuery.removeData( elem ); + } + + // Otherwise, we want to remove all of the element's data + } else { + // Clean up the element expando + try { + delete elem[ expando ]; + } catch(e){ + // IE has trouble directly removing the expando + // but it's ok with using removeAttribute + if ( elem.removeAttribute ) + elem.removeAttribute( expando ); + } + + // Completely remove the data cache + delete jQuery.cache[ id ]; + } + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length == undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length == undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames != undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + var padding = 0, border = 0; + jQuery.each( which, function() { + padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + val -= Math.round(padding + border); + } + + if ( jQuery(elem).is(":visible") ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, val); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // A helper method for determining if an element's values are broken + function color( elem ) { + if ( !jQuery.browser.safari ) + return false; + + // defaultView is cached + var ret = defaultView.getComputedStyle( elem, null ); + return !ret || ret.getPropertyValue("color") == ""; + } + + // We need to handle opacity special in IE + if ( name == "opacity" && jQuery.browser.msie ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + // Opera sometimes will give the wrong display answer, this fixes it, see #2037 + if ( jQuery.browser.opera && name == "display" ) { + var save = style.outline; + style.outline = "0 solid black"; + style.outline = save; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle && !color( elem ) ) + ret = computedStyle.getPropertyValue( name ); + + // If the element isn't reporting its values properly in Safari + // then some display: none elements are involved + else { + var swap = [], stack = [], a = elem, i = 0; + + // Locate all of the parent display: none elements + for ( ; a && color(a); a = a.parentNode ) + stack.unshift(a); + + // Go through and make them visible, but in reverse + // (It would be better if we knew the exact display type that they had) + for ( ; i < stack.length; i++ ) + if ( color( stack[ i ] ) ) { + swap[ i ] = stack[ i ].style.display; + stack[ i ].style.display = "block"; + } + + // Since we flip the display style, we have to handle that + // one special, otherwise get the value + ret = name == "display" && swap[ stack.length - 1 ] != null ? + "none" : + ( computedStyle && computedStyle.getPropertyValue( name ) ) || ""; + + // Finally, revert the display styles back + for ( i = 0; i < swap.length; i++ ) + if ( swap[ i ] != null ) + stack[ i ].style.display = swap[ i ]; + } + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context ) { + var ret = []; + context = context || document; + // !context.createElement fails in IE with an error but returns typeof 'object' + if (typeof context.createElement == 'undefined') + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + jQuery.each(elems, function(i, elem){ + if ( !elem ) + return; + + if ( elem.constructor == Number ) + elem += ''; + + // Convert html string into DOM nodes + if ( typeof elem == "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div"); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "
+ + +
+ + + + + + + + + +
+ + + + + + + + +
 '.$app_strings["Calendar"].' '.$mod_strings["LBL_ALL_EVENTS_TODOS"].' 
+
+ + + "; +} +$sHTML .= ""; + + +return $sHTML; +} + +/** Returns graph, if the cached image is present it'll display that image, +otherwise it will render the graph with the given details +* Portions created by vtiger are Copyright (C) vtiger. +* All Rights Reserved. +* Contributor(s): ______________________________________.. +*/ + +// Function to get the chached image if exists +function render_graph($cache_file_name,$html_imagename,$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$graph_type) +{ + + //Checks whether the cached image is present or not + if(file_exists($cache_file_name)) + { + @unlink($cache_file_name); + } + if(file_exists($cache_file_name.'.map')) + { + @unlink($cache_file_name.'.map'); + } + if (!file_exists($cache_file_name) || !file_exists($cache_file_name.'.map')) + { + //If the Cached image is not present + if($graph_type=="horizontal") + { + return horizontal_graph($cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$cache_file_name,$html_imagename); + } + else if($graph_type=="vertical") + { + return vertical_graph($cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$cache_file_name,$html_imagename); + } + else if($graph_type=="pie") + { + return pie_chart($cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$cache_file_name,$html_imagename); + + } + } + else + { + //Getting the cached image + $imgMap_fp = fopen($cache_file_name.'.map', "rb"); + $imgMap = fread($imgMap_fp, filesize($cache_file_name.'.map')); + fclose($imgMap_fp); + $base_name_cache_file=basename($cache_file_name); + $ccc="cache/images/".$base_name_cache_file; + $return = "\n$imgMap\n"; + $return .= ""; + return $return; + } +} +function get_graph_homepg($cache_file_name,$html_imagename,$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$graph_date,$urlstring,$test_target_val,$date_start,$end_date) +{ + global $tmp_dir; + global $graph_title, $mod_strings; + global $theme; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $val=explode(":",$title); + $display_title=$val[0]; + $type = $_REQUEST[Chart_Type]; + if($type == 'horizontalbarchart') + $sHTML .= render_graph($tmp_dir."hor_".$cache_file_name,$html_imagename."_hor",$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,"horizontal"); + elseif($type == 'verticalbarchart') + $sHTML .= render_graph($tmp_dir."vert_".$cache_file_name,$html_imagename."_vert",$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,"vertical"); + elseif($type == 'piechart') + $sHTML .= render_graph($tmp_dir."pie_".$cache_file_name,$html_imagename."_pie",$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,"pie"); + return $sHTML; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Dashboard/Forms.php b/oss/vtiger/trunk/modules/Dashboard/Forms.php new file mode 100644 index 00000000..74089889 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/Forms.php @@ -0,0 +1,166 @@ + + + + +EOQ; + +return $the_script; +} + +?> diff --git a/oss/vtiger/trunk/modules/Dashboard/HomepageDB.php b/oss/vtiger/trunk/modules/Dashboard/HomepageDB.php new file mode 100644 index 00000000..97fc4a95 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/HomepageDB.php @@ -0,0 +1,69 @@ +id.'.php'); + +global $current_user,$user_id,$date_start,$end_date,$tmp_dir,$mod_strings,$app_strings; +$type='recordsforuser'; + +// Performance Optimization: Using new API to generate dashboard chart +/* +$module_arr = Array ('Accounts','Contacts','Leads','Potentials','Quotes','Invoice','PurchaseOrder', 'SalesOrder','Calendar','HelpDesk','Campaigns'); +foreach ($module_arr as $key => $mod_name){ + if(isPermitted("$mod_name","index",'') == 'yes'){ + + $permitted_mod_list[$key] = $mod_name; + } +} + +if(is_array($permitted_mod_list)){ + $moduleList = implode("','",$permitted_mod_list); +} + +$homepagedb_query = "select * from vtiger_crmentity se left join vtiger_leaddetails le on le.leadid=se.crmid left join vtiger_troubletickets tt on tt.ticketid=se.crmid left join vtiger_activity act on act.activityid=se.crmid left join vtiger_potential pot on pot.potentialid=se.crmid where se.deleted=0 and (le.converted=0 or le.converted is null) and (pot.sales_stage not in('".$app_strings['LBL_CLOSE_WON']."','".$app_strings['LBL_CLOSE_LOST']."') or pot.sales_stage is null) and (tt.status!='Closed' or tt.status is null) and ((act.status!='Completed' and act.status!='Deferred') or act.status is null) and ((act.eventstatus!='Held' and act.eventstatus!='Not Held') or act.eventstatus is null) and setype in ('".$moduleList."') and se.deleted=0 and se.smownerid=".$current_user->id; +$graph_by="setype"; +$graph_title=$mod_strings['recordsforuser'].' '.$current_user->user_name; +$module="Home"; +$where=""; +$query=$homepagedb_query; + +//Giving the Cached image name +$cache_file_name=abs(crc32($current_user->id))."_".$type."_".crc32($date_start.$end_date).".png"; + $html_imagename=$graph_by; //Html image name for the graph +$graph_details=module_Chart($current_user->id,$date_start,$end_date,$query,$graph_by,$graph_title,$where,$module,$type); +*/ + +// Performance Optimization +$graph_details = module_Chart_HomePageDashboard($current_user); + +if (!empty($graph_details) && $graph_details[1] != 0) { // END + $name_val=$graph_details[0]; + $cnt_val=$graph_details[1]; + $graph_title=$graph_details[2]; + $target_val=$graph_details[3]; + $graph_date=$graph_details[4]; + $urlstring=$graph_details[5]; + $cnt_table=$graph_details[6]; + $test_target_val=$graph_details[7]; + + $width=560; + $height=225; + $top=30; + $left=140; + $bottom=120; + $title=$graph_title; + $sHTML = render_graph($tmp_dir."vert_".$cache_file_name,$html_imagename."_vert",$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,"vertical"); + echo $sHTML; +}else{ + echo $mod_strings['LBL_NO_DATA']; +} + +?> diff --git a/oss/vtiger/trunk/modules/Dashboard/ReportsCharts.php b/oss/vtiger/trunk/modules/Dashboard/ReportsCharts.php new file mode 100644 index 00000000..19de9172 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/ReportsCharts.php @@ -0,0 +1,194 @@ + + + + + + + + + "; + +$sHTML .= " + + + + + + + + "; + +$sHTML .= " + + + + + + + + "; + + return $sHTML; +} + +/** Returns graph, if the cached image is present it'll display that image, +otherwise it will render the graph with the given details +* Portions created by vtiger are Copyright (C) vtiger. +* All Rights Reserved. +* Contributor(s): ______________________________________.. +*/ + +// Function to get the chached image if exists +function render_graph($cache_file_name,$html_imagename,$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$graph_type) +{ + + //Checks whether the cached image is present or not + if(file_exists($cahce_file_name)) + { + unlink($cache_file_name); + } + if(file_exists($cache_file_name.'.map')) + { + unlink($cache_file_name.'.map'); + } + if (!file_exists($cache_file_name) || !file_exists($cache_file_name.'.map')) + { + //If the Cached image is not present + if($graph_type=="horizontal") + { + return horizontal_graph($cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$cache_file_name,$html_imagename); + } + else if($graph_type=="vertical") + { + return vertical_graph($cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$cache_file_name,$html_imagename); + } + else if($graph_type=="pie") + { + return pie_chart($cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$cache_file_name,$html_imagename); + + } + } + else + { + //Getting the cached image + $imgMap_fp = fopen($cache_file_name.'.map', "rb"); + $imgMap = fread($imgMap_fp, vtiger_filesize($cache_file_name.'.map')); + fclose($imgMap_fp); + $base_name_cache_file=basename($cache_file_name); + $ccc="cache/images/".$base_name_cache_file; + $return = "\n$imgMap\n"; + $return .= ""; + return $return; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Dashboard/accumulated_bargraph.php b/oss/vtiger/trunk/modules/Dashboard/accumulated_bargraph.php new file mode 100644 index 00000000..ad567efc --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/accumulated_bargraph.php @@ -0,0 +1,88 @@ +SetScale("textlin"); + +$graph->SetShadow(); + + +// Create the lines of the Graph +for($i=0;$iSetFillColor($color_array[$i]); + $bplot[$i]->SetWidth(10); + + $bplot[$i]->value->Show(); + $bplot[$i]->value->SetFont(FF_FONT1,FS_NORMAL,8); + $bplot[$i]->value->SetColor("black"); + $bplot[$i]->value->SetFormat('%d'); + $bplot[$i]->SetValuePos('max'); + +} + +$gbplot = new AccBarPlot($bplot); +$gbplot->SetWidth(0.7); + +// Add the bar to the graph +$graph->Add($gbplot); + +$graph->xaxis->SetTickLabels($datax); + +$graph->title->Set($title); + +$graph->Set90AndMargin($left,$right,$top,$bottom); +//$graph->SetFrame(false); +$graph->title->SetFont(FF_FONT1,FS_BOLD); +$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD); +$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD); + +$graph->SetColor("#7D9CB8"); +$graph->SetMarginColor("#3D6A93"); + +// Display the graph +$graph->Stroke(); + +?> + diff --git a/oss/vtiger/trunk/modules/Dashboard/display_charts.php b/oss/vtiger/trunk/modules/Dashboard/display_charts.php new file mode 100644 index 00000000..74f94aab --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/display_charts.php @@ -0,0 +1,829 @@ +id.'.php'); +global $current_language; +$mod_strings = return_module_language($current_language, 'Dashboard'); + + +$period=($_REQUEST['period'])?$_REQUEST['period']:"tmon"; // Period >> lmon- Last Month, tmon- This Month, lweek-LastWeek, tweek-ThisWeek; lday- Last Day +$type=($_REQUEST['type'])?$_REQUEST['type']:"leadsource"; +$dates_values=start_end_dates($period); //To get the stating and End dates for a given period +$date_start=$dates_values[0]; //Starting date +$end_date=$dates_values[1]; // Ending Date +$period_type=$dates_values[2]; //Period type as MONTH,WEEK,LDAY +$width=$dates_values[3]; +$height=$dates_values[4]; + +//It gives all the dates in between the starting and ending dates and also gives the number of days,declared in utils.php +$no_days_dates=get_days_n_dates($date_start,$end_date); +$days=$no_days_dates[0]; +$date_array=$no_days_dates[1]; //Array containig all the dates +$user_id=$current_user->id; + +// Query for Leads +$leads_query="select vtiger_crmentity.crmid,vtiger_crmentity.createdtime, vtiger_leaddetails.*, vtiger_crmentity.smownerid, vtiger_leadscf.* from vtiger_leaddetails inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_leaddetails.leadid inner join vtiger_leadsubdetails on vtiger_leadsubdetails.leadsubscriptionid=vtiger_leaddetails.leadid inner join vtiger_leadaddress on vtiger_leadaddress.leadaddressid=vtiger_leadsubdetails.leadsubscriptionid inner join vtiger_leadscf on vtiger_leaddetails.leadid = vtiger_leadscf.leadid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid where vtiger_crmentity.deleted=0 and vtiger_leaddetails.converted=0 "; + + +//Query for Accounts +$account_query="select vtiger_crmentity.*, vtiger_account.*, vtiger_accountscf.* from vtiger_account inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_account.accountid inner join vtiger_accountbillads on vtiger_account.accountid=vtiger_accountbillads.accountaddressid inner join vtiger_accountshipads on vtiger_account.accountid=vtiger_accountshipads.accountaddressid inner join vtiger_accountscf on vtiger_account.accountid = vtiger_accountscf.accountid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_users.id=vtiger_crmentity.smownerid where vtiger_crmentity.deleted=0 "; + +//Query for Products by PO +$probyPO = "select vtiger_purchaseorder.*,vtiger_crmentity.* from vtiger_purchaseorder inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_purchaseorder.purchaseorderid inner join vtiger_inventoryproductrel on vtiger_purchaseorder.purchaseorderid = vtiger_inventoryproductrel.id LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid where vtiger_inventoryproductrel.id=vtiger_purchaseorder.purchaseorderid and vtiger_crmentity.deleted=0"; + +//Query for Products by Quotes +$probyQ = "select vtiger_quotes.*,vtiger_crmentity.* from vtiger_quotes inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_quotes.quoteid inner join vtiger_inventoryproductrel on vtiger_quotes.quoteid = vtiger_inventoryproductrel.id LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid where vtiger_inventoryproductrel.id=vtiger_quotes.quoteid and vtiger_crmentity.deleted=0"; + +//Query for Products by Invoices +$probyInv = "select vtiger_invoice.*,vtiger_crmentity.* from vtiger_invoice inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_invoice.invoiceid inner join vtiger_inventoryproductrel on vtiger_invoice.invoiceid = vtiger_inventoryproductrel.id LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid where vtiger_inventoryproductrel.id=vtiger_invoice.invoiceid and vtiger_crmentity.deleted=0"; + +//Query For Products qty in stock +$products_query="select distinct(vtiger_crmentity.crmid),vtiger_crmentity.createdtime,vtiger_products.* from vtiger_products inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_products.productid left join vtiger_inventoryproductrel on vtiger_products.productid = vtiger_inventoryproductrel.id where vtiger_crmentity.deleted=0 and vtiger_products.qtyinstock > 0"; + +//Query for Potential +$potential_query= "select vtiger_crmentity.*,vtiger_account.accountname, vtiger_potential.*, vtiger_potentialscf.*, vtiger_groups.groupname from vtiger_potential inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_potential.potentialid left join vtiger_account on vtiger_potential.related_to = vtiger_account.accountid inner join vtiger_potentialscf on vtiger_potentialscf.potentialid = vtiger_potential.potentialid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_users.id=vtiger_crmentity.smownerid where vtiger_crmentity.deleted=0 "; + +//Query for Sales Order +$so_query="select vtiger_crmentity.*,vtiger_salesorder.*,vtiger_account.accountid,vtiger_quotes.quoteid from vtiger_salesorder inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_salesorder.salesorderid inner join vtiger_sobillads on vtiger_salesorder.salesorderid=vtiger_sobillads.sobilladdressid inner join vtiger_soshipads on vtiger_salesorder.salesorderid=vtiger_soshipads.soshipaddressid left join vtiger_salesordercf on vtiger_salesordercf.salesorderid = vtiger_salesorder.salesorderid left outer join vtiger_quotes on vtiger_quotes.quoteid=vtiger_salesorder.quoteid left outer join vtiger_account on vtiger_account.accountid=vtiger_salesorder.accountid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_users.id=vtiger_crmentity.smownerid where vtiger_crmentity.deleted=0 "; + + +//Query for Purchase Order + +$po_query="select vtiger_crmentity.*,vtiger_purchaseorder.* from vtiger_purchaseorder inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_purchaseorder.purchaseorderid left outer join vtiger_vendor on vtiger_purchaseorder.vendorid=vtiger_vendor.vendorid inner join vtiger_pobillads on vtiger_purchaseorder.purchaseorderid=vtiger_pobillads.pobilladdressid inner join vtiger_poshipads on vtiger_purchaseorder.purchaseorderid=vtiger_poshipads.poshipaddressid left join vtiger_purchaseordercf on vtiger_purchaseordercf.purchaseorderid = vtiger_purchaseorder.purchaseorderid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_users.id=vtiger_crmentity.smownerid where vtiger_crmentity.deleted=0 "; + +// Query for Quotes +$quotes_query="select vtiger_crmentity.*,vtiger_quotes.* from vtiger_quotes inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_quotes.quoteid inner join vtiger_quotesbillads on vtiger_quotes.quoteid=vtiger_quotesbillads.quotebilladdressid inner join vtiger_quotesshipads on vtiger_quotes.quoteid=vtiger_quotesshipads.quoteshipaddressid left join vtiger_quotescf on vtiger_quotes.quoteid = vtiger_quotescf.quoteid left outer join vtiger_account on vtiger_account.accountid=vtiger_quotes.accountid left outer join vtiger_potential on vtiger_potential.potentialid=vtiger_quotes.potentialid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_users.id=vtiger_crmentity.smownerid where vtiger_crmentity.deleted=0 "; + +//Query for Invoice +$invoice_query="select vtiger_crmentity.*,vtiger_invoice.* from vtiger_invoice inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_invoice.invoiceid inner join vtiger_invoicebillads on vtiger_invoice.invoiceid=vtiger_invoicebillads.invoicebilladdressid inner join vtiger_invoiceshipads on vtiger_invoice.invoiceid=vtiger_invoiceshipads.invoiceshipaddressid left outer join vtiger_salesorder on vtiger_salesorder.salesorderid=vtiger_invoice.salesorderid inner join vtiger_invoicecf on vtiger_invoice.invoiceid = vtiger_invoicecf.invoiceid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_users.id=vtiger_crmentity.smownerid where vtiger_crmentity.deleted=0 "; + +//Query for tickets +$helpdesk_query=" select vtiger_troubletickets.status AS ticketstatus, vtiger_groups.groupname AS ticketgroupname, vtiger_troubletickets.*,vtiger_crmentity.* from vtiger_troubletickets inner join vtiger_ticketcf on vtiger_ticketcf.ticketid = vtiger_troubletickets.ticketid inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_troubletickets.ticketid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_contactdetails on vtiger_troubletickets.parent_id=vtiger_contactdetails.contactid left join vtiger_account on vtiger_account.accountid=vtiger_troubletickets.parent_id left join vtiger_users on vtiger_crmentity.smownerid=vtiger_users.id and vtiger_troubletickets.ticketid = vtiger_ticketcf.ticketid where vtiger_crmentity.deleted=0"; + + +//Query for Contacts by Campaign +$cont_Q = "select crmid from vtiger_contactdetails inner join vtiger_campaigncontrel on vtiger_campaigncontrel.contactid = vtiger_contactdetails.contactid inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_contactdetails.contactid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_crmentity.smownerid=vtiger_users.id where vtiger_crmentity.deleted=0 ".dashboard_check("Contacts"); + +$result = $adb->pquery($cont_Q, array()); +$num_conts = $adb->num_rows($result); +$cont_Array = array(); +for($z=0;$z<$num_conts;$z++) +{ + $cont_ID=$adb->query_result($result,$z,'crmid'); + if(!in_array($cont_ID, $cont_Array)) + array_push($cont_Array, $cont_ID); +} +$cont_checkQ = " and vtiger_crmentityContacts.crmid in(0)"; +if(count($cont_Array) > 0) + $cont_checkQ = " and vtiger_crmentityContacts.crmid in(".implode(", ", $cont_Array).")"; + +$campaign_query="select vtiger_campaign.*,vtiger_crmentity.* from vtiger_campaign inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_campaign.campaignid inner join vtiger_campaigncontrel on vtiger_campaigncontrel.campaignid=vtiger_campaign.campaignid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_crmentity.smownerid=vtiger_users.id left join vtiger_contactdetails on vtiger_contactdetails.contactid = vtiger_campaigncontrel.contactid left join vtiger_crmentity as vtiger_crmentityContacts on vtiger_crmentityContacts.crmid = vtiger_contactdetails.contactid where vtiger_campaigncontrel.campaignid=vtiger_campaign.campaignid and vtiger_crmentity.deleted=0 and vtiger_crmentityContacts.deleted=0".$cont_checkQ; + + +//Query for tickets by account +$tickets_by_account="select vtiger_troubletickets.*, vtiger_groups.groupname AS ticketgroupname, vtiger_crmentity.*, vtiger_account.* from vtiger_troubletickets inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_troubletickets.ticketid inner join vtiger_account on vtiger_account.accountid=vtiger_troubletickets.parent_id left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_crmentity.smownerid=vtiger_users.id where vtiger_crmentity.deleted=0"; + +//Query for tickets by contact +$tickets_by_contact="select vtiger_troubletickets.*, vtiger_groups.groupname AS ticketgroupname, vtiger_crmentity.*, vtiger_contactdetails.* from vtiger_troubletickets inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_troubletickets.ticketid inner join vtiger_contactdetails on vtiger_contactdetails.contactid=vtiger_troubletickets.parent_id left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid left join vtiger_users on vtiger_crmentity.smownerid=vtiger_users.id where vtiger_crmentity.deleted=0"; + +//Query for product by category + +$product_category = "select vtiger_products.*,vtiger_crmentity.deleted from vtiger_products inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_products.productid where vtiger_crmentity.deleted=0"; + +$graph_array = Array( + "DashboardHome" => $mod_strings['DashboardHome'], + "leadsource" => $mod_strings['leadsource'], + "leadstatus" => $mod_strings['leadstatus'], + "leadindustry" => $mod_strings['leadindustry'], + "salesbyleadsource" => $mod_strings['salesbyleadsource'], + "salesbyaccount" => $mod_strings['salesbyaccount'], + "salesbyuser" => $mod_strings['salesbyuser'], + "salesbyteam" => $mod_strings['salesbyteam'], + "accountindustry" => $mod_strings['accountindustry'], + "productcategory" => $mod_strings['productcategory'], + "productbyqtyinstock" => $mod_strings['productbyqtyinstock'], + "productbypo" => $mod_strings['productbypo'], + "productbyquotes" => $mod_strings['productbyquotes'], + "productbyinvoice" => $mod_strings['productbyinvoice'], + "sobyaccounts" => $mod_strings['sobyaccounts'], + "sobystatus" => $mod_strings['sobystatus'], + "pobystatus" => $mod_strings['pobystatus'], + "quotesbyaccounts" => $mod_strings['quotesbyaccounts'], + "quotesbystage" => $mod_strings['quotesbystage'], + "invoicebyacnts" => $mod_strings['invoicebyacnts'], + "invoicebystatus" => $mod_strings['invoicebystatus'], + "ticketsbystatus" => $mod_strings['ticketsbystatus'], + "ticketsbypriority" => $mod_strings['ticketsbypriority'], + "ticketsbycategory" => $mod_strings['ticketsbycategory'], + "ticketsbyuser" => $mod_strings['ticketsbyuser'], + "ticketsbyteam" => $mod_strings['ticketsbyteam'], + "ticketsbyproduct"=> $mod_strings['ticketsbyproduct'], + "contactbycampaign"=> $mod_strings['contactbycampaign'], + "ticketsbyaccount"=> $mod_strings['ticketsbyaccount'], + "ticketsbycontact"=> $mod_strings['ticketsbycontact'], + ); + if(isset($_REQUEST['from_page']) && $_REQUEST['from_page'] == 'HomePage') + { + + //Charts for Lead Source + if($profileTabsPermission[getTabid("Leads")] == 0 && ($type == "leadsource") && (getFieldVisibilityPermission('Leads',$user_id,'leadsource') == "0")) + { + $graph_by="leadsource"; + $graph_title= $mod_strings['leadsource']; + $module="Leads"; + $where=""; + $query=$leads_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + + } + // To display the charts for Lead status + elseif ($profileTabsPermission[getTabid("Leads")] == 0 && ($type == "leadstatus")&& (getFieldVisibilityPermission('Leads',$user_id,'leadstatus') == "0")) + { + $graph_by="leadstatus"; + $graph_title= $mod_strings['leadstatus']; + $module="Leads"; + $where=""; + $query=$leads_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_leaddetails.leadsource '.picklist_check($module,$graph_by); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Charts for Lead Industry + elseif ($profileTabsPermission[getTabid("Leads")] == 0 && ($type == "leadindustry") && (getFieldVisibilityPermission('Leads',$user_id,'industry') == "0")) + { + $graph_by="industry"; + $graph_title=$mod_strings['leadindustry']; + $module="Leads"; + $where=""; + $query=$leads_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Sales by Lead Source + elseif ($profileTabsPermission[getTabid("Potentials")] == 0 && ($type == "salesbyleadsource")&& (getFieldVisibilityPermission('Potentials',$user_id,'leadsource') == "0")) + { + $graph_by="leadsource"; + $graph_title=$mod_strings['salesbyleadsource']; + $module="Potentials"; + $where=" and vtiger_potential.sales_stage like '%Closed Won%' "; + $query=$potential_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Sales by Account + elseif ($profileTabsPermission[getTabid("Potentials")] == 0 && ($type == "salesbyaccount") && (getFieldVisibilityPermission('Potentials',$user_id,'account_id') == "0")) + { + $graph_by="accountid"; + $graph_title=$mod_strings['salesbyaccount']; + $module="Potentials"; + $where=" and vtiger_potential.sales_stage like '%Closed Won%' "; + $query=$potential_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Sales by User + elseif ($profileTabsPermission[getTabid("Potentials")] == 0 && ($type == "salesbyuser")) + { + $graph_by="smownerid"; + $graph_title=$mod_strings['salesbyuser']; + $module="Potentials"; + $where=" and vtiger_potential.sales_stage like '%Closed Won%' and (vtiger_crmentity.smownerid != NULL || vtiger_crmentity.smownerid != ' ')"; + $query=$potential_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Sales by team + elseif ($profileTabsPermission[getTabid("Potentials")] == 0 && ($type == "salesbyteam")) + { + $graph_by="groupname"; + $graph_title=$mod_strings['salesbyteam']; + $module="Potentials"; + $where=" and vtiger_potential.sales_stage like '%Closed Won%' and (vtiger_groups.groupname != NULL || vtiger_groups.groupname != '')"; + $query=$potential_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Charts for Account by Industry + elseif ($profileTabsPermission[getTabid("Accounts")] == 0 && ($type == "accountindustry") && (getFieldVisibilityPermission('Accounts',$user_id,'industry') == "0")) + { + $graph_by="industry"; + $graph_title=$mod_strings['accountindustry']; + $module="Accounts"; + $where=""; + $query=$account_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Charts for Products by Category + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productcategory") && (getFieldVisibilityPermission('Products',$user_id,'productcategory') == "0")) + { + $graph_by="productcategory"; + $graph_title=$mod_strings['productcategory']; + $module="Products"; + $where=""; + $query=$product_category." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Charts for Products by Quantity in stock + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productbyqtyinstock") && (getFieldVisibilityPermission('Products',$user_id,'qtyinstock') == "0")) + { + $graph_by="productname"; + $graph_title=$mod_strings['productbyqtyinstock']; + $module="Products"; + $where=""; + $query=$products_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Charts for Products by PO + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productbypo") && $profileTabsPermission[getTabid("PurchaseOrder")] == 0) + { + $graph_by="purchaseorderid"; + $graph_title=$mod_strings['productbypo']; + $module="Products"; + $where=""; + $query=$probyPO." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Charts for Products by Quotes + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productbyquotes") && $profileTabsPermission[getTabid("Quotes")] == 0) + { + $graph_by="quoteid"; + $graph_title=$mod_strings['productbyquotes']; + $module="Products"; + $where=""; + $query=$probyQ." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Charts for Products by Invoice + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productbyinvoice") && $profileTabsPermission[getTabid("Invoice")] == 0) + { + $graph_by="invoiceid"; + $graph_title=$mod_strings['productbyinvoice']; + $module="Products"; + $where=""; + $query=$probyInv." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + + // Sales Order by Accounts + elseif ($profileTabsPermission[getTabid("SalesOrder")] == 0 && ($type == "sobyaccounts") && (getFieldVisibilityPermission('SalesOrder',$user_id,'account_id') == "0")) + { + $graph_by="accountid"; + $graph_title=$mod_strings['sobyaccounts']; + $module="SalesOrder"; + $where=""; + $query=$so_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Sales Order by Status + elseif ($profileTabsPermission[getTabid("SalesOrder")] == 0 && ($type == "sobystatus") && (getFieldVisibilityPermission('SalesOrder',$user_id,'sostatus') == "0")) + { + $graph_by="sostatus"; + $graph_title=$mod_strings['sobystatus']; + $module="SalesOrder"; + $where=""; + $query=$so_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Purchase Order by Status + elseif ($profileTabsPermission[getTabid("PurchaseOrder")] == 0 && ($type == "pobystatus") && (getFieldVisibilityPermission('PurchaseOrder',$user_id,'postatus') == "0")) + { + $graph_by="postatus"; + $graph_title=$mod_strings['pobystatus']; + $module="PurchaseOrder"; + $where=""; + $query=$po_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Quotes by Accounts + elseif ($profileTabsPermission[getTabid("Quotes")] == 0 && ($type == "quotesbyaccounts") && (getFieldVisibilityPermission('Quotes',$user_id,'account_id') == "0")) + { + $graph_by="accountid"; + $graph_title= $mod_strings['quotesbyaccounts']; + $module="Quotes"; + $where=""; + $query=$quotes_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Quotes by Stage + elseif ($profileTabsPermission[getTabid("Quotes")] == 0 && ($type == "quotesbystage") && (getFieldVisibilityPermission('Quotes',$user_id,'quotestage') == "0")) + { + $graph_by="quotestage"; + $graph_title=$mod_strings['quotesbystage']; + $module="Quotes"; + $where=""; + $query=$quotes_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Invoice by Accounts + elseif ($profileTabsPermission[getTabid("Invoice")] == 0 && ($type == "invoicebyacnts") && (getFieldVisibilityPermission('Invoice',$user_id,'account_id') == "0")) + { + $graph_by="accountid"; + $graph_title=$mod_strings['invoicebyacnts']; + $module="Invoice"; + $where=""; + $query=$invoice_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Invoices by status + elseif ($profileTabsPermission[getTabid("Invoice")] == 0 && ($type == "invoicebystatus") && (getFieldVisibilityPermission('Invoice',$user_id,'invoicestatus') == "0")) + { + $graph_by="invoicestatus"; + $graph_title=$mod_strings['invoicebystatus']; + $module="Invoice"; + $where=""; + $query=$invoice_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Tickets by Status + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbystatus") && (getFieldVisibilityPermission('HelpDesk',$user_id,'ticketstatus') == "0")) + { + $graph_by="ticketstatus"; + $graph_title=$mod_strings['ticketsbystatus']; + $module="HelpDesk"; + $where=""; + $query=$helpdesk_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Tickets by Priority + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbypriority") && (getFieldVisibilityPermission('HelpDesk',$user_id,'ticketpriorities') == "0")) + { + $graph_by="priority"; + $graph_title=$mod_strings['ticketsbypriority']; + $module="HelpDesk"; + $where=""; + $query=$helpdesk_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Tickets by Category + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbycategory") && (getFieldVisibilityPermission('HelpDesk',$user_id,'ticketcategories') == "0")) + { + $graph_by="category"; + $graph_title=$mod_strings['ticketsbycategory']; + $module="HelpDesk"; + $where=""; + $query=$helpdesk_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Tickets by User + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbyuser")) + { + $graph_by="smownerid"; + $graph_title=$mod_strings['ticketsbyuser']; + $module="HelpDesk"; + $where=" and (vtiger_crmentity.smownerid != NULL || vtiger_crmentity.smownerid != ' ')"; + $query=$helpdesk_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Tickets by Team + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbyteam")) + { + $graph_by="ticketgroupname"; + $graph_title=$mod_strings['ticketsbyteam']; + $module="HelpDesk"; + $where=" and (vtiger_groups.groupname != NULL || vtiger_groups.groupname != ' ')"; + $query=$helpdesk_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Tickets by Product + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbyproduct") && (getFieldVisibilityPermission('HelpDesk',$user_id,'product_id') == "0")) + { + $graph_by="product_id"; + $graph_title=$mod_strings['ticketsbyproduct']; + $module="HelpDesk"; + $where=""; + $query=$helpdesk_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Campaigns by Contact + elseif ($profileTabsPermission[getTabid("Contacts")] == 0 && ($type == "contactbycampaign") && $profileTabsPermission[getTabid("Campaigns")] == 0) + { + $graph_by="campaignid"; + $graph_title=$mod_strings['contactbycampaign']; + $module="Contacts"; + $where=""; + $query=$campaign_query." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Tickets by Account + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbyaccount") && (getFieldVisibilityPermission('HelpDesk',$user_id,'parent_id') == "0")) + { + $graph_by="accountid"; + $graph_title=$mod_strings['ticketsbyaccount']; + $module="HelpDesk"; + $where=""; + $query=$tickets_by_account." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + //Tickets by Contact + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbycontact") && (getFieldVisibilityPermission('HelpDesk',$user_id,'parent_id') == "0")) + { + $graph_by="contactid"; + $graph_title=$mod_strings['ticketsbycontact']; + $module="HelpDesk"; + $where=""; + $query=$tickets_by_contact." ".dashboard_check($module); + return get_graph_by_type($graph_by,$graph_title,$module,$where,$query,"210","210","forhomepage"); + } + else + { + //echo $mod_strings['LBL_NO_PERMISSION_FIELD']; + sleep(1); + return '

'.$mod_strings['LBL_NO_PERMISSION_FIELD'].'

'; + } + } + else + { + $html='
+ + + +
+ '; + echo $html_string; +?> diff --git a/oss/vtiger/trunk/modules/Calendar/index.php b/oss/vtiger/trunk/modules/Calendar/index.php new file mode 100644 index 00000000..06bda1f8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/index.php @@ -0,0 +1,32 @@ + diff --git a/oss/vtiger/trunk/modules/Calendar/language/en_us.lang.php b/oss/vtiger/trunk/modules/Calendar/language/en_us.lang.php new file mode 100644 index 00000000..3b5cf4c5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/language/en_us.lang.php @@ -0,0 +1,442 @@ +'Calendar', +'LBL_MODULE_TITLE'=>'Calendar: Home', +'LBL_MODULE_APPOINTMENT'=>'Calendar: Appointment', +'LBL_MODULE_APPOINTMENT_DETAIL'=>'Calendar: Appointment Detail', +'LBL_SAVE'=>'Save', +'LBL_RESET'=>'Cancel', +'LBL_LIST_USER_NAME'=>'User Name', +'LBL_LIST_NAME'=>'Name', +'LBL_CALENDAR_SHARED'=>'Calendar currently shared with', +'LBL_CALENDAR_SHARING'=>'Share calendar with', +'LBL_SHARING_OPTION'=>'Can see my calendar?', +'LBL_LIST_TOOLS'=>'Tools', +'LBL_SETTINGS'=>'Settings', +'LBL_CALSETTINGS'=>'Calendar Settings', +'LBL_USE24'=>'Use 24 hours format', +'LBL_CALSTART'=>'Start my calendar time at', +'LBL_TIMESETTINGS'=>'Time Settings', +'LBL_HOLDFOLLOWUP'=>'Hold followup on', +'LBL_CALL' => 'Call', +'LBL_MEET' => 'Meeting', +'LBL_APPNT' => 'Appointment', +'LBL_NEW_APPNT' => 'New Appointment', +'LBL_NEW_APPNT_INFO' => 'Create a new appointment', +'LBL_VIEW_DAY_APPNT_INFO' => 'View appointment(s) for this day', +'LBL_CHANGE_APPNT' => 'see or change this appointment (%s - %s)', + +'LBL_DAY' => 'Day', +'LBL_DAY_BUTTON_KEY' => 'D', +'LBL_DAY_BUTTON_TITLE' => 'Day [Alt+D]', +'LBL_DAY1' => 'Monday', +'LBL_DAY2' => 'Tuesday', +'LBL_DAY3' => 'Wednesday', +'LBL_DAY4' => 'Thursday', +'LBL_DAY5' => 'Friday', +'LBL_DAY6' => 'Saturday', +'LBL_DAY0' => 'Sunday', + +'LBL_SM_MON' => 'Mon', +'LBL_SM_TUE' => 'Tue', +'LBL_SM_WED' => 'Wed', +'LBL_SM_THU' => 'Thu', +'LBL_SM_FRI' => 'Fri', +'LBL_SM_SAT' => 'Sat', +'LBL_SM_SUN' => 'Sun', + +'LBL_DATE_TITLE' => 'Day %d, %A', + +'LBL_WEEK' => 'Week', +'LBL_WEEK_BUTTON_KEY' => 'W', +'LBL_WEEK_BUTTON_TITLE' => 'Week [Alt+W]', +'LBL_WEEKS' => 'Weeks', +'LBL_NEXT_WEEK' => 'next week', +'LBL_LAST_WEEK' => 'last week', +'LBL_4WEEKS_BACK' => '4 weeks back', +'LBL_4WEEKS_PLUS' => '4 weeks plus', +'LBL_RELOAD' => 'Reload', + + +'LBL_APPCREATED_BY' => 'Created by', +'LBL_AT_DATE_TIME' => 'at', + +'LBL_MON' => 'Month', +'LBL_MON_BUTTON_KEY' => 'M', +'LBL_MON_BUTTON_TITLE' => 'Month [Alt+M]', +'LBL_PREV_MON' => 'Previous Month', +'LBL_NEXT_MON' => 'Next Month', + +'LBL_YEAR_BUTTON_KEY'=>'Y', +'LBL_PREV_YEAR'=>'Previous Year', +'LBL_NEXT_YEAR' => 'Next Year', + +'LBL_APP_LOCATION' => 'Location', +'LBL_APP_IGNORE_TIME' => 'ignore above times', +'LBL_SUBJECT'=>'Subject:', +'LBL_APP_DESCRIPTION' => 'Description', +'LBL_CONTACT'=>'Contact:', +'LBL_CONTACT_LIST'=>'Contact List:', + +'LBL_APP_IGNORE_TIME2' => '(i.e. the appointment takes place
at no particular time on these day(s) )', + +'LBL_APP_ERR001' =>'Invalid Date in field %s!', +'LBL_APP_ERR002' =>'start after end !', +'LBL_APP_ERR003' =>'Missing Contact !', +'LBL_APP_ERR004' =>'Missing Subject !', +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the appointment.", +'DELETE_CONFIRMATION'=>"Are you sure you want to delete this appointment?", + +'AppLoc'=> Array('0' => 'Office' + , '1' => 'Out' + , '2' => 'Vacation' + , '3' => 'sick' + , '4' => 'Postponed' + , '5' => 'Option' + , '6' => 'Private'), + +'cal_month_long'=>array( +"", +"January", +"February", +"March", +"April", +"May", +"June", +"July", +"August", +"September", +"October", +"November", +"December", +), + +'cal_weekdays_short'=>array( +"Sun", +"Mon", +"Tue", +"Wed", +"Thu", +"Fri", +"Sat", +), +'cal_weekdays_long'=>array( +"Sunday", +"Monday", +"Tuesday", +"Wednesday", +"Thursday", +"Friday", +"Saturday", +), +'cal_month_short'=>array( +"", +"Jan", +"Feb", +"Mar", +"Apr", +"May", +"Jun", +"Jul", +"Aug", +"Sep", +"Oct", +"Nov", +"Dec", +), + +'LBL_TIME'=>'Time', +'LBL_START_TIME' => 'Start Time', +'LBL_END_TIME' => 'End Time', +'LBL_START_DATE'=>'Start Date', +'LBL_TIME_START'=>'Time Start', +'LBL_DUE_DATE'=>'Due Date', +'LBL_START_DATE_TIME'=>'Start Date & Time', +'LBL_END_DATE_TIME'=>'End Date & Time', +'LBL_TODO'=>'To Do', +'LBL_TODOS'=>'To Dos', +'LBL_EVENTS'=>'Events', +'LBL_TOTALEVENTS'=>'My Total Events :', +'LBL_TOTALTODOS'=>'My Total To Dos :', +'LBL_VIEW'=>'View', +'LBL_LISTVIEW'=>'List View', +'LBL_HRVIEW'=>'Hour View', +'LBL_WEEKVIEW'=>'Weekly Calendar View', +'LBL_MONTHVIEW'=>'Monthly Calendar View', +'LBL_YEARVIEW'=>'Yearly Calendar View', +'LBL_STATUS'=>'Status', +'LBL_ACTION'=>'Actions', +'LBL_ADD'=>'Add', +'LBL_OPENCAL'=>'Open Calendar', + + +'LBL_ADD_EVENT'=>'Add Event', +'LBL_ADDCALL'=>'Call', +'LBL_ADDMEETING'=>'Meeting', +'LBL_ADDTODO'=>'To Do', +'LBL_BEFOREEVENT'=>'before the event starts', +'LBL_BEFORETASK'=>'before the task starts', +'LBL_EVENTDETAILS'=>'Event Details', +'LBL_CURSTATUS'=>'Current Status', +'LBL_ASSINGEDTO'=>'Assigned To', +'LBL_RELATEDTO'=>'Related To', +'LBL_PENDING'=>'Pending', +'LBL_PUBLIC'=>'Mark Public', +'LBL_MORE'=>'More', +'LBL_EDIT'=>'Edit', +'LBL_EVERYDAY'=>'Every Day', +'LBL_EVERYWEEK'=>'Every Week', +'LBL_EVERYMON'=>'Every Month', +'LBL_WEEKS'=>'Week(s)', +'LBL_MONTHS'=>'Month(s)', +'LBL_YEAR'=>'Year', +'LBL_NONE_SCHEDULED'=>'None Scheduled', + +'LBL_INVITE_INST1'=>'To invite, select the users from the "Available Users" list and click the "Add" button.', +'LBL_INVITE_SHARE'=>'To share, select the users from the "Available Users" list and click the "Add" button.', +'LBL_INVITE_INST2'=>'To remove, select the users from the "Selected Users" list and the click "Remove" button.', +'LBL_SELUSR_INFO'=>' Selected users will receive an email about the Event.', +'LBL_CALSHAREMESSAGE'=>'Share my calendar with the following selected users', +'LBL_CALSHARE'=>'Calendar Sharing', +'LBL_SEL_USERS'=>'Selected Users', +'LBL_AVL_USERS'=>'Available Users', +'LBL_ADD_BUTTON'=>'Add', +'LBL_USERS'=>'Users', +'LBL_RMV_BUTTON'=>'Remove', +'LBL_SDRMD'=>'Send Reminder to', +'LBL_ENABLE_REPEAT'=>'Enable Repeat', +'LBL_REPEAT_ONCE'=>'Repeat once in every', +'LBL_ADD_TODO'=>'Create To Do', +'LBL_TODONAME'=>'To Do', +'LBL_TODODATETIME'=>'Time & Date', + + + + + +//DON'T CONVERT THESE THEY ARE MAPPINGS - STARTS +'db_last_name' => 'LBL_LIST_LAST_NAME', +'db_first_name' => 'LBL_LIST_FIRST_NAME', +'db_title' => 'LBL_LIST_TITLE', +'db_email1' => 'LBL_LIST_EMAIL_ADDRESS', +'db_email2' => 'LBL_LIST_EMAIL_ADDRESS', +//DON'T CONVERT THESE THEY ARE MAPPINGS -ENDS +'LBL_COMPLETED'=>'Mark Completed', +'LBL_DEFERRED'=>'Mark Deferred', +'LBL_HELD'=>'Mark Held', +'LBL_NOTHELD'=>'Mark Not Held', +'LBL_POSTPONE'=>'Postpone', +'LBL_CHANGEOWNER'=>'Change Owner', +'LBL_DEL'=>'Delete', + +//Added for actvity merge with calendar +'LBL_SEARCH_FORM_TITLE'=>'Activity Search', +'LBL_LIST_FORM_TITLE'=>'Activity List', +'LBL_NEW_FORM_TITLE'=>'New Activity', +'LBL_TASK_INFORMATION'=>'Task Information', +'LBL_EVENT_INFORMATION'=>'Event Information', +'LBL_CALENDAR_INFORMATION'=>'Calendar Information', + +'LBL_NAME'=>'Subject:', +'LBL_ACTIVITY_NOTIFICATION'=>'This is a notification that an activity is assigned to you that has been', +'LBL_ACTIVITY_INVITATION'=>'You have been invited for an activity that has been ', +'LBL_DETAILS_STRING'=>'The details are', +'LBL_REGARDS_STRING'=>'Thanks & Regards', +'LBL_CONTACT_NAME'=>'Contact Name', +'LBL_OPEN_ACTIVITIES'=>'Open Activities', +'LBL_ACTIVITY'=>'Activity:', +'LBL_HISTORY'=>'History', +'LBL_UPCOMING'=>"My Upcoming and Pending Activities", +'LBL_TODAY'=>'through ', + +'LBL_NEW_TASK_BUTTON_TITLE'=>'New Task [Alt+N]', +'LBL_NEW_TASK_BUTTON_KEY'=>'N', +'LBL_NEW_TASK_BUTTON_LABEL'=>'New Task', +'LBL_SCHEDULE_MEETING_BUTTON_TITLE'=>'Schedule Meeting [Alt+M]', +'LBL_SCHEDULE_MEETING_BUTTON_KEY'=>'M', +'LBL_SCHEDULE_MEETING_BUTTON_LABEL'=>'Schedule Meeting', +'LBL_SCHEDULE_CALL_BUTTON_TITLE'=>'Schedule Call [Alt+C]', +'LBL_SCHEDULE_CALL_BUTTON_KEY'=>'C', +'LBL_SCHEDULE_CALL_BUTTON_LABEL'=>'Schedule Call', +'LBL_NEW_NOTE_BUTTON_TITLE'=>'New Document [Alt+T]', +'LBL_NEW_ATTACH_BUTTON_TITLE'=>'Attach File [Alt+F]', +'LBL_NEW_NOTE_BUTTON_KEY'=>'T', +'LBL_NEW_ATTACH_BUTTON_KEY'=>'F', +'LBL_NEW_NOTE_BUTTON_LABEL'=>'New Document', +'LBL_NEW_ATTACH_BUTTON_LABEL'=>'Attach File', +'LBL_TRACK_EMAIL_BUTTON_TITLE'=>'Track Email [Alt+K]', +'LBL_TRACK_EMAIL_BUTTON_KEY'=>'K', +'LBL_TRACK_EMAIL_BUTTON_LABEL'=>'Track Email', + +'LBL_LIST_CLOSE'=>'Close', +'LBL_LIST_STATUS'=>'Status', +'LBL_LIST_CONTACT'=>'Contact', +//Added for 4.2 release for Account column support as shown by Fredy +'LBL_LIST_ACCOUNT'=>'Account', +'LBL_LIST_RELATED_TO'=>'Related to', +'LBL_LIST_DUE_DATE'=>'Due Date', +'LBL_LIST_DATE'=>'Date', +'LBL_LIST_SUBJECT'=>'Subject', +'LBL_LIST_LAST_MODIFIED'=>'Last Modified', +'LBL_LIST_RECURRING_TYPE'=>'Recurring Type', + +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", +'NTC_NONE_SCHEDULED'=>'None scheduled.', + +// Added vtiger_fields for Attachments in Activities/SubPanelView.php +'LBL_ATTACHMENTS'=>'Attachments', +'LBL_NEW_ATTACHMENT'=>'New Attachment', + +//Added vtiger_fields after RC1 - Release +'LBL_ALL'=>'All', +'LBL_CALL'=>'Call', +'LBL_MEETING'=>'Meeting', +'LBL_TASK'=>'Task', + +//Added for 4GA Release +'Subject'=>'Subject', +'Assigned To'=>'Assigned To', +'Start Date & Time'=>'Start Date & Time', +'Time Start'=>'Time Start', +'Due Date'=>'Due Date', +'Related To'=>'Related to', +'Contact Name'=>'Contact Name', +'Status'=>'Status', +'Priority'=>'Priority', +'Visibility'=>'Visibility', +'Send Notification'=>'Send Notification', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Activity Type'=>'Activity Type', +'Description'=>'Description', +'Duration'=>'Duration', +'Duration Minutes'=>'Duration Minutes', +'Location'=>'Location', +'No Time'=>'No Time', +//Added for Send Reminder 4.2 release +'Send Reminder'=>'Send Reminder', +'LBL_YES'=>'Yes', +'LBL_NO'=>'No', +'LBL_DAYS'=>'day(s)', +'LBL_MINUTES'=>'minutes', +'LBL_HOURS'=>'hours', +'LBL_BEFORE_EVENT'=>'before event', +//Added for CustomView 4.2 Release +'Close'=>'Close', +'Start Date'=>'Start Date', +'Type'=>'Type', +'End Date'=>'End Date', +'Recurrence'=> 'Recurring Events', +'Recurring Type'=> 'Recurring Type', +//Activities - Notification Error +'LBL_NOTIFICATION_ERROR'=>'Mail Error : Please check your outgoing mail server configuration in Settings->Outgoing Mail Server Configuration OR MailId for the present user is not Configured', +// Mike Crowe Mod --------------------------------------------------------added for generic search +'LBL_GENERAL_INFORMATION'=>'General Information', + +'LBL_EVENTTYPE'=>'Event Type', +'LBL_EVENTNAME'=>'Event Name', +'LBL_EVENTSTAT'=>'Event starts at', +'LBL_EVENTEDAT'=>'Event ends on', +'LBL_INVITE'=>'Invite', +'LBL_REPEAT'=>'Repeat', +'LBL_REMINDER'=>'Reminder', +'LBL_SENDREMINDER'=>'Send Reminder', +'LBL_NOTIFICATION'=>'Notification', +'LBL_SENDNOTIFICATION'=>'Send Notification', +'LBL_RMD_ON'=>'Remind on', +'LBL_REPEATEVENT'=>'Repeat once in every', +'LBL_TIMEDATE'=>'Time & Date', +'LBL_HR'=>'Hr', +'LBL_MIN'=>'min', +'LBL_EVENT'=>'Event', +'Daily'=>'Day(s)', +'Weekly'=>'Week(s)', +'Monthly'=>'Month(s)', +'Yearly'=>'Year', +'createdtime'=>'Created Time', +'modifiedtime'=>'Modified Time', +'first'=>'First', +'last'=>'Last', +'High'=>'High', +'Medium'=>'Medium', +'Low'=>'Low', +'LBL_SELECT'=>'Select', +'LBL_ALL_EVENTS_TODOS'=>'All Events & Todos', +'First'=>'First', +'Last'=>'Last', +'on'=>'on', +'day of the month'=>'day of the month', +'Private'=>'Private', +'Public'=>'Public', + +//Added for existing Picklist entries + +'Planned'=>'Planned', +'Held'=>'Held', +'Not Held'=>'Not Held', +'Completed'=>'Completed', +'Deferred'=>'Deferred', +'Not Started'=>'Not Started', +'In Progress'=>'In Progress', +'Pending Input'=>'Pending Input', +'LBL_REMAINDER_DAY'=>'days', +'LBL_REMAINDER_HRS'=>'hrs', +'Call'=>'Call', +'Meeting'=>'Meeting', + +//added to send dates and time in calendar notification/invitation mail. + +'Start date and time'=>'Start Date & Time', +'End date and time'=>'End Date & Time', +//this is for task +'End date'=>'End date', +'LBL_SET_DATE'=>'Set date..', +'Recurrence'=>'Recurrence', + +//added to send invitation mail Subject. +'INVITATION'=>' Invitation ', + +// Added/Updated for vtiger CRM 5.0.4 +'LBL_YEAR_BUTTON_TITLE'=>'Year [Alt+Y]', +'LBL_SELECT_CONTACT'=>'Select Contacts', +'SHARED_EVENT_DEL_MSG'=>'The User does not have permission to Edit/Delete Shared Event.', +//added to fix ticket#4525 +'LBL_CREATED'=>'created', +'LBL_UPDATED'=>'updated', + +//Added after 5.0.4 GA +'LBL_BUSY' => 'Busy', + +//Custom Fields support for Calendar +'LBL_CUSTOM_INFORMATION'=>'Custom Information', + +// Repeat Event support for Calendar +'LBL_UNTIL' => 'Until', +'LBL_SET_DATE'=>'Set Date', + +'LBL_MINE' =>'Mine', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Calendar/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Calendar/language/zh_cn.lang.php new file mode 100644 index 00000000..db1fb31b --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/language/zh_cn.lang.php @@ -0,0 +1,441 @@ + '计划任务', + 'LBL_MODULE_TITLE' => '计划任务: 首页', + 'LBL_MODULE_APPOINTMENT' => '计划任务: 行程', + 'LBL_MODULE_APPOINTMENT_DETAIL' => '计划任务: 计划细节', +'LBL_SAVE' => '保存', + 'LBL_RESET' => '取消', + 'LBL_LIST_USER_NAME' => '账号', + 'LBL_LIST_NAME' => '名称', +'LBL_CALENDAR_SHARED' => '计划目前分享给', + 'LBL_CALENDAR_SHARING' => '分享计划给', + 'LBL_SHARING_OPTION' => '可以检视我的计划?', + 'LBL_LIST_TOOLS' => '工具', + 'LBL_SETTINGS' => '设定', + 'LBL_CALSETTINGS' => '计划任务设定', + 'LBL_USE24' => '使用 24 小时制', + 'LBL_CALSTART' => '计划任务开始时间', + 'LBL_TIMESETTINGS' => '时间设定', + 'LBL_OPENCAL' => '开放计划任务', + 'LBL_CALL' => '电话记录', + 'LBL_MEET' => '会议', + 'LBL_APPNT' => '行程', + 'LBL_NEW_APPNT' => '新增行程', + 'LBL_NEW_APPNT_INFO' => '建立一笔新的行程', + 'LBL_VIEW_DAY_APPNT_INFO' => '浏览今天的行程', + 'LBL_CHANGE_APPNT' => '察看或变更这个行程 (%s - %s)', + + 'LBL_DAY' => '日', + 'LBL_DAY_BUTTON_KEY' => 'D', + 'LBL_DAY_BUTTON_TITLE' => '日 [Alt+D]', + 'LBL_DAY1' => '周一', + 'LBL_DAY2' => '周二', + 'LBL_DAY3' => '周三', + 'LBL_DAY4' => '周四', + 'LBL_DAY5' => '周五', + 'LBL_DAY6' => '周六', + 'LBL_DAY0' => '周日', + + 'LBL_SM_MON' => '一', + 'LBL_SM_TUE' => '二', + 'LBL_SM_WED' => '三', + 'LBL_SM_THU' => '四', + 'LBL_SM_FRI' => '五', + 'LBL_SM_SAT' => '六', + 'LBL_SM_SUN' => '日', + +'LBL_DATE_TITLE' => 'Day %d, %A', + + 'LBL_WEEK' => '周', + 'LBL_WEEK_BUTTON_KEY' => 'W', + 'LBL_WEEK_BUTTON_TITLE' => '周 [Alt+W]', + 'LBL_WEEKS' => '周', + 'LBL_NEXT_WEEK' => '下周', + 'LBL_LAST_WEEK' => '上周', + 'LBL_4WEEKS_BACK' => '四周前', + 'LBL_4WEEKS_PLUS' => '四周后', + 'LBL_RELOAD' => '重新加载', + + +'LBL_APPCREATED_BY' => '建立者:', +'LBL_AT_DATE_TIME' => '在', + + 'LBL_MON' => '月', + 'LBL_MON_BUTTON_KEY' => 'M', + 'LBL_MON_BUTTON_TITLE' => '月 [Alt+M]', + 'LBL_PREV_MON' => '上个月', + 'LBL_NEXT_MON' => '下个月', + + 'LBL_YEAR_BUTTON_KEY' => 'Y', + 'LBL_PREV_YEAR' => '去年', + 'LBL_NEXT_YEAR' => '明年', + +'LBL_APP_LOCATION' => '所在地', +'LBL_APP_IGNORE_TIME' => '忽略', +'LBL_SUBJECT'=>'主题:', +'LBL_APP_DESCRIPTION' => '描述', +'LBL_CONTACT'=>'联系方式:', +'LBL_CONTACT_LIST'=>'联系人列表:', + +'LBL_APP_IGNORE_TIME2' => '(注:这个行程在该期间没有特定的时间 )', + +'LBL_APP_ERR001' =>'字段 %s产生错误!', + 'LBL_APP_ERR002' => '开始日期在结束日期之后 !', + 'LBL_APP_ERR003' => '漏填联系人 !', + 'LBL_APP_ERR004' => '漏填标题 !', +'ERR_DELETE_RECORD' => '在删除行程前必须输入正确的记录编号.', + 'DELETE_CONFIRMATION' => '您确定要删除这次的行程?', + +'AppLoc'=> Array('0' => '办公室', + '1' => '户外', + '2' => '休假', + '3' => '病假', + '4' => '延期', + '5' => '随意', + '6' => '私人',), + +'cal_month_long'=>array( +"", +"一月", +"二月", +"三月", +"四月", +"五月", +"六月", +"七月", +"八月", +"九月", +"十月", +"十一月", +"十二月", +), + +'cal_weekdays_short'=>array( +"日", +"一", +"二", +"三", +"四", +"五", +"六", +), +'cal_weekdays_long'=>array( +"星期日", +"星期一", +"星期二", +"星期三", +"星期四", +"星期五", +"星期六", +), +'cal_month_short'=>array( +"", +"一月", +"二月", +"三月", +"四月", +"五月", +"六月", +"七月", +"八月", +"九月", +"十月", +"十一月", +"十二月", +), + +'LBL_TIME'=>'时间', +'LBL_START_TIME' => '开始时间', +'LBL_END_TIME' => '结束时间', +'LBL_START_DATE'=>'开始日期', +'LBL_TIME_START'=>'时间开始', +'LBL_DUE_DATE'=>'到期日', +'LBL_START_DATE_TIME'=>'开始日期 & 时间', +'LBL_END_DATE_TIME'=>'结束日期 & 时间', +'LBL_TODO'=>'待办', +'LBL_TODOS'=>'待办事项', +'LBL_EVENTS'=>'事件', +'LBL_TOTALEVENTS'=>'我的全部事件 :', +'LBL_TOTALTODOS'=>'我的待办事项 :', +'LBL_VIEW'=>'查看', +'LBL_LISTVIEW'=>'查看列表', +'LBL_HRVIEW'=>'产看时间', +'LBL_WEEKVIEW'=>'查看周历', +'LBL_MONTHVIEW'=>'查看月历', +'LBL_YEARVIEW'=>'查看年历', +'LBL_STATUS'=>'状态', +'LBL_ACTION'=>'操作', +'LBL_ADD'=>'添加', +'LBL_OPENCAL'=>'打开日历', + + +'LBL_ADD_EVENT'=>'添加事件', +'LBL_ADDCALL'=>'呼叫', +'LBL_ADDMEETING'=>'会议', +'LBL_ADDTODO'=>'待办', +'LBL_BEFOREEVENT'=>'在事件开始之前', +'LBL_BEFORETASK'=>'在任务开始之前', +'LBL_EVENTDETAILS'=>'事件细节', +'LBL_CURSTATUS'=>'当前状态', +'LBL_ASSINGEDTO'=>'分配给', +'LBL_RELATEDTO'=>'关联于', +'LBL_PENDING'=>'即将发生', +'LBL_PUBLIC'=>'标记公共', +'LBL_MORE'=>'更多', +'LBL_EDIT'=>'编辑', + 'LBL_EVERYDAY' => '每天', + 'LBL_EVERYWEEK' => '每周', + 'LBL_EVERYMON' => '每月', +'LBL_WEEKS'=>'周', +'LBL_MONTHS'=>'月', +'LBL_YEAR'=>'年', +'LBL_NONE_SCHEDULED'=>'没有行程', + + 'LBL_INVITE_INST1' => '邀请的方式可以从目前使用者列表选择并且点选新增按钮', +'LBL_INVITE_SHARE'=>'分享的方式可以从目前使用者列表选择并且点选新增按钮.', +'LBL_INVITE_INST2' => '移除邀请的人可以从选择的使用者列表选择并且点选移除按钮', + 'LBL_SELUSR_INFO' => '选择的使用者会收到一封事件的通知。', + 'LBL_CALSHAREMESSAGE'=>'开放我的行事历给下面选择的使用者', +'LBL_CALSHARE' => '开放行事历', + 'LBL_SEL_USERS' => '选择的使用者', + 'LBL_AVL_USERS' => '目前使用者', + 'LBL_ADD_BUTTON' => '新增', + 'LBL_USERS' => '使用者', +'LBL_RMV_BUTTON'=>'移除', +'LBL_SDRMD'=>'发送提醒讯息', +'LBL_ENABLE_REPEAT'=>'启用循环', +'LBL_REPEAT_ONCE'=>'循环频率', +'LBL_ADD_TODO'=>'建立待办事项', +'LBL_TODONAME'=>'待办事项', +'LBL_TODODATETIME'=>'时间与日期', + + + + + +//DON'T CONVERT THESE THEY ARE MAPPINGS - STARTS +'db_last_name' => 'LBL_LIST_LAST_NAME', +'db_first_name' => 'LBL_LIST_FIRST_NAME', +'db_title' => 'LBL_LIST_TITLE', +'db_email1' => 'LBL_LIST_EMAIL_ADDRESS', +'db_email2' => 'LBL_LIST_EMAIL_ADDRESS', +//DON'T CONVERT THESE THEY ARE MAPPINGS -ENDS +'LBL_COMPLETED' => '标示为完成', + 'LBL_DEFERRED' => '标示为延缓', + 'LBL_HELD' => '标示为执行', + 'LBL_NOTHELD' => '标示为不执行', + 'LBL_POSTPONE' => '延期', + 'LBL_CHANGEOWNER' => '修改负责人', + 'LBL_DEL' => '删除', + +//Added for actvity merge with calendar +'LBL_SEARCH_FORM_TITLE'=>'搜索待办事项', +'LBL_LIST_FORM_TITLE'=>'待办事项列表', +'LBL_NEW_FORM_TITLE'=>'新增待办事项', +'LBL_TASK_INFORMATION'=>'任务信息', +'LBL_EVENT_INFORMATION'=>'事件信息', +'LBL_CALENDAR_INFORMATION'=>'日历信息', + +'LBL_NAME' => '主题:', +'LBL_ACTIVITY_NOTIFICATION'=>'这是通知活动分配给你', +'LBL_ACTIVITY_INVITATION'=>'你被邀请参与一个活动 ', +'LBL_DETAILS_STRING'=>'细节是', +'LBL_REGARDS_STRING'=>'感谢和问候', + 'LBL_CONTACT_NAME' => '联系人', + 'LBL_OPEN_ACTIVITIES' => '进行中事项', + 'LBL_ACTIVITY' => '待办事项:', + 'LBL_HISTORY' => '纪录', + 'LBL_UPCOMING' => '即将到来与等待中待办事项', + 'LBL_TODAY' => '到', + + 'LBL_NEW_TASK_BUTTON_TITLE' => '新增任务 [Alt+N]', + 'LBL_NEW_TASK_BUTTON_KEY' => 'N', + 'LBL_NEW_TASK_BUTTON_LABEL' => '新增任务', + 'LBL_SCHEDULE_MEETING_BUTTON_TITLE' => '安排会议 [Alt+M]', + 'LBL_SCHEDULE_MEETING_BUTTON_KEY' => 'M', + 'LBL_SCHEDULE_MEETING_BUTTON_LABEL' => '安排会议', + 'LBL_SCHEDULE_CALL_BUTTON_TITLE' => '安排电话 [Alt+C]', + 'LBL_SCHEDULE_CALL_BUTTON_KEY' => 'C', + 'LBL_SCHEDULE_CALL_BUTTON_LABEL' => '安排电话', + 'LBL_NEW_NOTE_BUTTON_TITLE' => '新增记事 [Alt+T]', + 'LBL_NEW_ATTACH_BUTTON_TITLE' => '附加档案 [Alt+F]', + 'LBL_NEW_NOTE_BUTTON_KEY' => 'T', + 'LBL_NEW_ATTACH_BUTTON_KEY' => 'F', + 'LBL_NEW_NOTE_BUTTON_LABEL' => '新增记事', + 'LBL_NEW_ATTACH_BUTTON_LABEL' => '附加档案', + 'LBL_TRACK_EMAIL_BUTTON_TITLE' => '追踪邮件 [Alt+K]', + 'LBL_TRACK_EMAIL_BUTTON_KEY' => 'K', + 'LBL_TRACK_EMAIL_BUTTON_LABEL' => '追踪邮件', + + 'LBL_LIST_CLOSE' => '关闭', + 'LBL_LIST_STATUS' => '状态', + 'LBL_LIST_CONTACT' => '联系人', +//Added for 4.2 release for Account column support as shown by Fredy +'LBL_LIST_ACCOUNT' => '客户', + 'LBL_LIST_RELATED_TO' => '相关于', + 'LBL_LIST_DUE_DATE' => '结束日期', + 'LBL_LIST_DATE' => '日期', + 'LBL_LIST_SUBJECT' => '主旨1', + 'LBL_LIST_LAST_MODIFIED' => '最后更新', + 'LBL_LIST_RECURRING_TYPE' => '循环类型', + +'ERR_DELETE_RECORD'=>"一个记录编号必须被指定删除vtiger_account.", +'NTC_NONE_SCHEDULED'=>'没有安排.', + +// Added vtiger_fields for Attachments in Activities/SubPanelView.php +'LBL_ATTACHMENTS' => '附加档案', + 'LBL_NEW_ATTACHMENT' => '新增附加档案', + +//Added vtiger_fields after RC1 - Release +'LBL_ALL'=>'全部', +'LBL_CALL'=>'呼叫', +'LBL_MEETING'=>'会议', +'LBL_TASK'=>'任务', + +//Added for 4GA Release + 'Subject' => '主旨2', + 'Assigned To' => '负责人', + 'Start Date & Time' => '开始日期与时间', + 'Time Start' => '开始时间', + 'Due Date' => '到期日', + 'Related To' => '相关于', + 'Contact Name' => '联系人名称', + 'Status' => '状态', + 'Priority' => '优先级', + 'Visibility' => '显示', + 'Send Notification' => '寄送通知', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'Activity Type' => '活动类型', + 'Description' => '描述', + 'Duration' => '期间', + 'Duration Minutes' => '期间分钟', + 'Location' => '位置', + 'No Time' => '没有时间', +//Added for Send Reminder 4.2 release + 'Send Reminder' => '提醒通知', +'LBL_YES'=>'是', +'LBL_NO'=>'否', +'LBL_DAYS'=>'日', +'LBL_MINUTES'=>'分', +'LBL_HOURS'=>'时', +'LBL_BEFORE_EVENT'=>'时间前', +//Added for CustomView 4.2 Release + 'Close' => '关闭', + 'Start Date' => '开始日期', + 'Type' => '类型', + 'End Date' => '结束日期', + 'Recurrence' => '循环事件', + 'Recurring Type' => '循环类型', +//Activities - Notification Error +'LBL_NOTIFICATION_ERROR' => '邮件错误:请检查您的外寄邮件服务器设定,在 设定->外寄邮件服务器设定 或是目前使用者的邮件没有设定好', +// Mike Crowe Mod --------------------------------------------------------added for generic search + 'LBL_GENERAL_INFORMATION' => '一般信息', + +'LBL_EVENTTYPE'=>'事件类型', +'LBL_EVENTNAME'=>'事件名称', +'LBL_EVENTSTAT'=>'事件开始于', +'LBL_EVENTEDAT'=>'事件结束于', +'LBL_INVITE'=>'邀请', +'LBL_REPEAT'=>'重复', +'LBL_REMINDER'=>'提示', +'LBL_SENDREMINDER'=>'发送提示', +'LBL_NOTIFICATION'=>'通知', +'LBL_SENDNOTIFICATION'=>'发送通知', +'LBL_RMD_ON'=>'提醒', +'LBL_REPEATEVENT'=>'每个都重复一次', +'LBL_TIMEDATE'=>'时间和日期', +'LBL_HR'=>'时', +'LBL_MIN'=>'分', +'LBL_EVENT'=>'事件', +'Daily'=>'天', +'Weekly'=>'周', +'Monthly'=>'月', +'Yearly'=>'年', +'createdtime'=>'建立时间', +'modifiedtime'=>'修改时间', +'first'=>'第一个', +'last'=>'最后一个', +'High'=>'高', +'Medium'=>'中', +'Low'=>'低', +'LBL_SELECT'=>'选择', + 'LBL_ALL_EVENTS_TODOS' => '所有事件与工作', + 'First' => '第一笔', + 'Last' => '最后一笔', + 'on' => '于', + 'day of the month' => '日', +'Private'=>'私有', +'Public'=>'公共', + +//Added for existing Picklist entries + +'Planned' => '已规划', + 'Held' => '保留', +'Not Held' => '不保留', + 'Completed' => '完成', + 'Deferred' => '延期', + 'Not Started' => '未开始', + 'In Progress' => '处理中', + 'Pending Input' => '等待输入', + 'LBL_REMAINDER_DAY' => '天', + 'LBL_REMAINDER_HRS' => '小时', + 'Call' => '电话', + 'Meeting' => '会议', + +//added to send dates and time in calendar notification/invitation mail. + +'Start date and time'=>'开始日期和时间', +'End date and time'=>'结束日期和时间', +//this is for task +'End date'=>'结束日期', +'LBL_SET_DATE'=>'设置日期..', +'Recurrence'=>'再现', + + +'INVITATION'=>' 邀请 ', + + +'LBL_YEAR_BUTTON_TITLE'=>'Year [Alt+Y]', + 'LBL_SELECT_CONTACT' => '选择联系人', +'SHARED_EVENT_DEL_MSG'=>'用户没有允许删除这个纪录.', +//added to fix ticket#4525 +'LBL_CREATED'=>'created', +'LBL_UPDATED'=>'updated', +//Added after 5.0.4 GA +'LBL_BUSY' => '忙碌', + +//Custom Fields support for Calendar +'LBL_CUSTOM_INFORMATION'=>'自定义信息', + +// Repeat Event support for Calendar +'LBL_UNTIL' => '至', +'LBL_SET_DATE'=>'设置日期', + +'LBL_MINE' =>'我的', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Calendar/new_calendar.php b/oss/vtiger/trunk/modules/Calendar/new_calendar.php new file mode 100644 index 00000000..afcf5490 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/new_calendar.php @@ -0,0 +1,92 @@ +activity_view == "This Year"){ + $mysel = 'year'; + }else if($current_user->activity_view == "This Month"){ + $mysel = 'month'; + }else if($current_user->activity_view == "This Week"){ + $mysel = 'week'; + }else{ + $mysel = 'day'; + } +} +/* fix given by dartagnanlaf END --integrated by Minnie */ +$date_data = array(); +if ( isset($_REQUEST['day'])) +{ + + $date_data['day'] = $_REQUEST['day']; +} + +if ( isset($_REQUEST['month'])) +{ + $date_data['month'] = $_REQUEST['month']; +} + +if ( isset($_REQUEST['week'])) +{ + $date_data['week'] = $_REQUEST['week']; +} + +if ( isset($_REQUEST['year'])) +{ + if ($_REQUEST['year'] > 2037 || $_REQUEST['year'] < 1970) + { + print("".$app_strings['LBL_CAL_LIMIT_MSG'].""); + exit; + } + $date_data['year'] = $_REQUEST['year']; +} + + +if(empty($date_data)) +{ + $data_value=date('Y-m-d H:i:s'); + preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$data_value,$value); + $date_data = Array( + 'day'=>$value[3], + 'month'=>$value[2], + 'year'=>$value[1], + 'hour'=>$value[4], + 'min'=>$value[5], + ); + +} +$calendar_arr['calendar'] = new Calendar($mysel,$date_data); +if($current_user->hour_format != '') + $calendar_arr['calendar']->hour_format=$current_user->hour_format; +if ($viewBox == 'hourview' && ($mysel == 'day' || $mysel == 'week' || $mysel == 'month' || $mysel == 'year')) +{ + $calendar_arr['calendar']->add_Activities($current_user); +} +$calendar_arr['view'] = $mysel; +calendar_layout($calendar_arr,$viewBox,$subtab); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/script.js b/oss/vtiger/trunk/modules/Calendar/script.js new file mode 100644 index 00000000..c90ceb8f --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/script.js @@ -0,0 +1,1399 @@ +/********************************************************************************* + +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ********************************************************************************/ + +function DisableSharing() +{ + + x = document.SharedList.selected_id.length; + idstring = ""; + xx = 0; + if ( x == undefined) + { + + if (document.SharedList.selected_id.checked) + { + document.SharedList.idlist.value=document.SharedList.selected_id.value; + } + else + { + alert(alert_arr.SELECT_ATLEAST_ONE_USER); + return false; + } + } + else + { + for(i = 0; i < x ; i++) + { + if(document.SharedList.selected_id[i].checked) + { + idstring = document.SharedList.selected_id[i].value +";"+idstring + xx++ + } + } + if (xx != 0) + { + document.SharedList.idlist.value=idstring; + } + else + { + alert(alert_arr.SELECT_ATLEAST_ONE_USER); + return false; + } + } + if(confirm(alert_arr.DISABLE_SHARING_CONFIRMATION+xx+alert_arr.USERS)) + { + document.SharedList.action="index.php?module=Calendar&action=disable_sharing&return_module=Calendar&return_action=calendar_share"; + } + else + { + return false; + } +} + + + +function showhide(argg) +{ + var x=document.getElementById(argg).style; + if (x.display=="none") + { + x.display="block" + + } + else { + x.display="none" + } +} + + +function showhideRepeat(argg1,argg2) +{ + var x=document.getElementById(argg2).style; + var y=document.getElementById(argg1).checked; + + if (y) + { + x.display="block"; + } + else { + x.display="none"; + } + +} + + + +function gshow(argg1,type,startdate,enddate,starthr,startmin,startfmt,endhr,endmin,endfmt,viewOption,subtab) +{ + smin = parseInt(startmin,10); + smin = smin - (smin%5); + var y=document.getElementById(argg1).style; + + if(type != 'todo' && type!='') + { + for(var i=0;;i++){ + if( document.EditView.activitytype[i].value == type){ + document.EditView.activitytype[i].selected='yes'; + break; + } + } + + smin = _2digit(smin); + document.EditView.date_start.value = startdate; + document.EditView.starthr.value = starthr; + document.EditView.startmin.value = smin; + document.EditView.startfmt.value = startfmt; + document.EditView.viewOption.value = viewOption; + document.EditView.subtab.value = subtab; + calDuedatetime(type); + } + if(type == 'todo') + { + smin = _2digit(smin); + document.createTodo.task_date_start.value = startdate; + document.createTodo.task_due_date.value = enddate; + document.createTodo.starthr.value = starthr; + document.createTodo.startmin.value = smin; + document.createTodo.startfmt.value = startfmt; + document.createTodo.viewOption.value = viewOption; + document.createTodo.subtab.value = subtab; + } + if (y.display=="none") + { + y.display="block"; + } +} + +function rptoptDisp(Opt){ + var currOpt = Opt.options[Opt.selectedIndex].value; + if(currOpt == "Daily") + { + ghide('repeatWeekUI'); + ghide('repeatMonthUI'); + } + else if(currOpt == "Weekly") + { + if(document.getElementById('repeatWeekUI').style.display == "none"); + document.getElementById('repeatWeekUI').style.display = "block"; + ghide('repeatMonthUI'); + } + else if(currOpt == "Monthly") + { + ghide('repeatWeekUI'); + if(document.getElementById('repeatMonthUI').style.display == "none"); + document.getElementById('repeatMonthUI').style.display = "block"; + } + else if(currOpt == "Yearly") + { + ghide('repeatWeekUI'); + ghide('repeatMonthUI'); + } +} + +function Taskshow(argg1,type,startdate,starthr,startmin,startfmt) +{ + var y=document.getElementById(argg1).style; + if (y.display=="none") + { + document.EditView.date_start.value = startdate; + document.EditView.starthr.value = starthr; + document.EditView.startmin.value = startmin; + document.EditView.startfmt.value = startfmt; + y.display="block"; + } +} + +function ghide(argg2) +{ + var z=document.getElementById(argg2).style; + if (z.display=="block" ) + { + z.display="none" + + } +} + + function moveMe(arg1) { + var posx = 0; + var posy = 0; + var e=document.getElementById(arg1); + + if (!e) var e = window.event; + + if (e.pageX || e.pageY) + { + posx = e.pageX; + posy = e.pageY; + } + else if (e.clientX || e.clientY) + { + posx = e.clientX + document.body.scrollLeft; + posy = e.clientY + document.body.scrollTop; + } + } + +function switchClass(myModule,toStatus) { + var x=document.getElementById(myModule); + if($(x)) + { + if (toStatus=="on") { + x.className="dvtSelectedCell"; + } + if (toStatus=="off") { + x.className="dvtUnSelectedCell"; + } + } + +} + +function enableCalstarttime() +{ + if(document.SharingForm.sttime_check.checked == true) + document.SharingForm.start_hour.disabled = false; + else + document.SharingForm.start_hour.disabled = true; +} +function check_form() +{ + formSelectColumnString('inviteesid','selectedusers'); + if(trim(document.EditView.subject.value) == "") + { + alert(alert_arr.MISSING_EVENT_NAME); + document.EditView.subject.focus() + return false; + } + else + { + if(document.EditView.record.value != '') + { + document.EditView.mode.value = 'edit'; + } + else + { + document.EditView.mode.value = 'create'; + } + starthour = parseInt(document.EditView.starthr.value,10); + startmin = parseInt(document.EditView.startmin.value,10); + startformat = document.EditView.startfmt.value; + endhour = parseInt(document.EditView.endhr.value,10); + endmin = parseInt(document.EditView.endmin.value,10); + endformat = document.EditView.endfmt.value; + followupformat = document.EditView.followup_startfmt.value; + followuphour = parseInt(document.EditView.followup_starthr.value,10); + followupmin = parseInt(document.EditView.followup_startmin.value,10); + if(startformat != '') + { + if(startformat == 'pm') + { + if(starthour == 12) + starthour = 12; + else + starthour = starthour + 12; + } + else + { + if(starthour == 12) + starthour = 0; + else + starthour = starthour; + } + } + if(endformat != '') + { + if(endformat == 'pm') + { + if(endhour == 12) + endhour = 12; + else + endhour = endhour + 12; + } + else + { + if(endhour == 12) + endhour = 0; + else + endhour = endhour; + } + } + if(!dateValidate('date_start','Start date','OTH')) + { + return false; + } + if(!dateValidate('due_date','End date','OTH')) + { + return false; + } + if(dateComparison('due_date','End date','date_start','Start date','GE')) + { + var dateval1=getObj('date_start').value.replace(/^\s+/g, '').replace(/\s+$/g, ''); + var dateval2=getObj('due_date').value.replace(/^\s+/g, '').replace(/\s+$/g, ''); + var dateval3=getObj('followup_date').value.replace(/^\s+/g, '').replace(/\s+$/g, ''); + + var dateelements1=splitDateVal(dateval1) + var dateelements2=splitDateVal(dateval2) + var dateelements3=splitDateVal(dateval3) + + dd1=dateelements1[0] + mm1=dateelements1[1] + yyyy1=dateelements1[2] + + dd2=dateelements2[0] + mm2=dateelements2[1] + yyyy2=dateelements2[2] + + dd3=dateelements3[0] + mm3=dateelements3[1] + yyyy3=dateelements3[2] + + var date1=new Date() + var date2=new Date() + var date3=new Date() + + date1.setYear(yyyy1) + date1.setMonth(mm1-1) + date1.setDate(dd1) + date1.setHours(starthour) + date1.setMinutes(startmin) + + date2.setYear(yyyy2) + date2.setMonth(mm2-1) + date2.setDate(dd2) + date2.setHours(endhour) + date2.setMinutes(endmin) + + date3.setYear(yyyy3) + date3.setMonth(mm3-1) + date3.setDate(dd3) + + diff_ms = Math.abs(date2.getTime()-date1.getTime())/(1000*60); + hour = Math.floor(diff_ms/(60)); + minute = Math.floor(diff_ms % 60) + document.EditView.duration_hours.value = hour; + document.EditView.duration_minutes.value = minute; + + event_starthour = _2digit(starthour); + event_startmin = _2digit(startmin); + event_endhour = _2digit(endhour); + event_endmin = _2digit(endmin); + document.EditView.time_start.value = event_starthour+':'+event_startmin; + document.EditView.time_end.value = event_endhour+':'+event_endmin; + // Added for Aydin Kurt-Elli requirement START -by Minnie + if (document.EditView.followup.checked == true && document.getElementById('date_table_thirdtd').style.display == 'block') + { + if(!dateValidate('followup_date','Followup Date','OTH')) + { + return false; + } + if(followupformat != '') + { + if(followupformat == 'pm') + { + if(followuphour == 12) + followuphour = 12; + else + followuphour = followuphour + 12; + } + else + { + if(followuphour == 12) + followuphour = 0; + else + followuphour = followuphour; + } + } + + if ( compareDates(date3,'Followup Date',date2,'End Date','GE')) + { + if (date3 <= date2) + { + if((followuphour*60+followupmin) <= (endhour*60+endmin)) + { + alert(alert_arr.FOLLOWUPTIME_GREATER_THAN_STARTTIME); + document.EditView.followup_starthr.focus(); + return false; + } + } + } + else return false; + //modified to set followup end date depends on the event or todo. If it is Event, the difference between followup start date and end date is 1hr. If it is todo then difference is 5mins. + date3.setMinutes(followupmin); + date3.setHours(followuphour); + if(document.EditView.activitytype[0].checked == true) + { + date3.setMinutes(parseInt(date3.getMinutes(),10)+5); + } + if(document.EditView.activitytype[1].checked == true) + { + date3.setMinutes(parseInt(date3.getMinutes(),10)+60); + } + var tempdate = getdispDate(date3); + + followuphour = _2digit(followuphour); + followupmin = _2digit(followupmin); + followupendhour = _2digit(date3.getHours()); + followupendmin = _2digit(date3.getMinutes()); + document.EditView.followup_due_date.value = tempdate; + document.EditView.followup_time_start.value = followuphour+':'+followupmin; + document.EditView.followup_time_end.value = followupendhour+':'+followupendmin; + //end + } + // Added for Aydin Kurt-Elli requirement END -by Minnie --> + + //added to avoid db error while giving characters in the repeat "every n no of day in month" text box + if((getObj("recurringcheck")) && (document.EditView.recurringcheck.checked == true) && (document.EditView.recurringtype.value =="Monthly")) + { + if((document.EditView.repeatMonth[0].checked == true) && ((parseInt(parseFloat(document.EditView.repeatMonth_date.value))!=document.EditView.repeatMonth_date.value) || document.EditView.repeatMonth_date.value=='' || parseInt(document.EditView.repeatMonth_date.value)>'31' || document.EditView.repeatMonth_date.value<='0')) + { + alert(alert_arr.INVALID +' "'+document.EditView.repeatMonth_date.value+'" '); + document.EditView.repeatMonth_date.focus(); + return false; + } + } + //end + + + //added to check Start Date & Time,if Activity Status is Planned.//start + if(document.EditView.eventstatus.value == "Planned") + { + var chkdate=new Date() + chkdate.setMinutes(event_startmin) + chkdate.setHours(event_starthour) + chkdate.setYear(yyyy1) + chkdate.setMonth(mm1-1) + chkdate.setDate(dd1) + if(!comparestartdate(chkdate)) return false; + + } + + } + else + return false; + if(getObj("recurringcheck") && document.EditView.recurringcheck.checked == false) + { + document.EditView.recurringtype.value = '--None--'; + } + return true; + } +} + +function task_check_form() +{ + starthour = parseInt(document.createTodo.starthr.value,10); + startmin = parseInt(document.createTodo.startmin.value,10); + startformat = document.createTodo.startfmt.value; + if(startformat != '') + { + if(startformat == 'pm') + { + if(starthour == 12) + starthour = 12; + else + starthour = starthour + 12; + + } + else + { + if(starthour == 12) + starthour = 0; + else + starthour = starthour; + } + } + starthour = _2digit(starthour); + startmin = _2digit(startmin); + document.createTodo.task_time_start.value = starthour+':'+startmin; + if(document.createTodo.record.value != '') + { + document.createTodo.mode.value = 'edit'; + } + else + { + document.createTodo.mode.value = 'create'; + } + +} + + +function maintask_check_form() +{ + starthour = parseInt(document.EditView.starthr.value,10); + startmin = parseInt(document.EditView.startmin.value,10); + startformat = document.EditView.startfmt.value; + if(startformat != '') + { + if(startformat == 'pm') + { + if(starthour == 12) + starthour = 12; + else + starthour = starthour + 12; + } + else + { + if(starthour == 12) + starthour = 0; + else + starthour = starthour; + } + } + starthour = _2digit(starthour); + startmin = _2digit(startmin); + document.EditView.time_start.value = starthour+':'+startmin; +} + + +var moveupLinkObj,moveupDisabledObj,movedownLinkObj,movedownDisabledObj; + +function userEventSharing(selectedusrid,selcolid) +{ + formSelectColumnString(selectedusrid,selcolid); +} + + +function incUser(avail_users,sel_users) +{ + availListObj=getObj(avail_users) + selectedColumnsObj=getObj(sel_users) + var selectlength=selectedColumnsObj.length + var availlength=availListObj.length + + for (i=0;i= 0) + selectedColumnsObj.remove(selectedColumnsObj.options.selectedIndex) + } + +} + + +// function to delete activity related contact in calendar +var del_ids = new Array(); +function removeActContacts() +{ + var avail_contacts = getObj('parentid'); + // this block is to remove contacts and get deleted contact ids + if(avail_contacts.options.selectedIndex > -1) + { + for(m = 0; m < avail_contacts.options.length; m++) + { + if(avail_contacts.options[m].selected == true) + { + del_ids.push(avail_contacts.options[m].value); + avail_contacts.options[m] = null; + removeActContacts(); + } + } + } + document.EditView.deletecntlist.value = del_ids.join(";"); + + // this block is to get available id list + var avail_ids = new Array(); + for(n=0; n window.innerWidth ){ + leftSide = eval(leftSide) - eval(widthM); + tagName.style.left = leftSide + 'px'; + } + else + tagName.style.left= leftSide + 'px'; + tagName.style.top= topSide + 'px'; + tagName.style.display = 'block'; + tagName.style.visibility = "visible"; + if(type == 'event') + { + var heldstatus = "eventstatus=Held"; + var notheldstatus = "eventstatus=Not Held"; + var activity_mode = "Events"; + var complete = document.getElementById("complete"); + var pending = document.getElementById("pending"); + var postpone = document.getElementById("postpone"); + var actdelete = document.getElementById("actdelete"); + var changeowner = document.getElementById("changeowner"); + var OptionData = document.getElementById('view_Option').options[document.getElementById('view_Option').selectedIndex].value; + + } + if(type == 'todo') + { + var heldstatus = "status=Completed"; + var notheldstatus = "status=Deferred"; + var activity_mode = "Task"; + var complete = document.getElementById("taskcomplete"); + var pending = document.getElementById("taskpending"); + var postpone = document.getElementById("taskpostpone"); + var actdelete = document.getElementById("taskactdelete"); + var changeowner = document.getElementById("taskchangeowner"); + var OptionData = ''; + } + document.getElementById("idlist").value = id; + document.change_owner.hour.value = hour; + document.change_owner.day.value = day; + document.change_owner.view.value = view; + document.change_owner.month.value = month; + document.change_owner.year.value = year; + document.change_owner.subtab.value = type; + if(complete) complete.href="javascript:updateStatus("+id+",'"+heldstatus+"','"+view+"',"+hour+","+day+","+month+","+year+",'"+type+"')"; + if(pending) pending.href="javascript:updateStatus("+id+",'"+notheldstatus+"','"+view+"',"+hour+","+day+","+month+","+year+",'"+type+"')"; + + if(postpone) postpone.href="index.php?module=Calendar&action=EditView&record="+id+"&return_action=index&activity_mode="+activity_mode+"&view="+view+"&hour="+hour+"&day="+day+"&month="+month+"&year="+year+"&viewOption="+OptionData+"&subtab="+type+"&maintab=Calendar"; + + if(actdelete) actdelete.href="javascript:delActivity("+id+",'"+view+"',"+hour+","+day+","+month+","+year+",'"+type+"')"; + + if(changeowner) changeowner.href="javascript:dispLayer('act_changeowner');"; + +} + +function dispLayer(lay) +{ + var tagName = document.getElementById(lay); + tagName.style.visibility = 'visible'; + tagName.style.display = 'block'; +} + +//check whether user form selected or group form selected +function checkgroup() +{ + if($("group_checkbox").checked) + { + document.change_owner.lead_group_owner.style.display = "block"; + document.change_owner.lead_owner.style.display = "none"; + } + else + { + document.change_owner.lead_group_owner.style.display = "none"; + document.change_owner.lead_owner.style.display = "block"; + } +} + +function calendarChangeOwner() +{ + var idlist = document.change_owner.idlist.value; + var view = document.change_owner.view.value; + var day = document.change_owner.day.value; + var month = document.change_owner.month.value; + var year = document.change_owner.year.value; + var hour = document.change_owner.hour.value; + var subtab = document.change_owner.subtab.value; + + //var checked = document.change_owner.user_lead_owner[0].checked; + if($("user_checkbox").checked) + { + var user_id = document.getElementById('lead_owner').options[document.getElementById('lead_owner').options.selectedIndex].value; + var url = 'module=Users&action=updateLeadDBStatus&return_module=Calendar&return_action=ActivityAjax&owner_id='+user_id+'&idlist='+idlist+'&view='+view+'&hour='+hour+'&day='+day+'&month='+month+'&year='+year+'&type=change_owner&owner_type=User'; + } + else + { + var group_id = document.getElementById('lead_group_owner').options[document.getElementById('lead_group_owner').options.selectedIndex].value; + var url = 'module=Users&action=updateLeadDBStatus&return_module=Calendar&return_action=ActivityAjax&owner_id='+group_id+'&idlist='+idlist+'&view='+view+'&hour='+hour+'&day='+day+'&month='+month+'&year='+year+'&type=change_owner&owner_type=Group'; + } + + if(subtab == 'event') + { + var OptionData = $('view_Option').options[$('view_Option').selectedIndex].value; + var eventurl = url+'&viewOption='+OptionData+'&subtab=event&ajax=true'; + + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: eventurl, + onComplete: function(response) { + if(OptionData == 'listview') + { + result = response.responseText.split('####'); + $("total_activities").innerHTML = result[1]; + $("listView").innerHTML=result[0]; + document.EventViewOption.action.value = "index"; + window.document.EventViewOption.submit(); + } + if(OptionData == 'hourview') + { + result = response.responseText.split('####'); + $("total_activities").innerHTML = result[1]; + $("hrView").innerHTML=result[0]; + document.EventViewOption.action.value = "index"; + window.document.EventViewOption.submit(); + } + } + } + ); + } + if(subtab == 'todo') + { + + var todourl = url+'&subtab=todo&ajax=true'; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: todourl, + onComplete: function(response) { + result = response.responseText.split('####'); + $("total_activities").innerHTML = result[1]; + $("mnuTab2").innerHTML=result[0]; + } + } + ); + } +} + +function delActivity(id,view,hour,day,month,year,subtab) +{ + if(subtab == 'event') + { + var OptionData = $('view_Option').options[$('view_Option').selectedIndex].value; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'module=Users&action=massdelete&return_module=Calendar&return_action=ActivityAjax&idlist='+id+'&view='+view+'&hour='+hour+'&day='+day+'&month='+month+'&year='+year+'&type=activity_delete&viewOption='+OptionData+'&subtab=event&ajax=true', + onComplete: function(response) { + if(OptionData == 'listview') + { + result = response.responseText.split('####'); + $("total_activities").innerHTML = result[1]; + $("listView").innerHTML=result[0]; + } + if(OptionData == 'hourview') + { + result = response.responseText.split('####'); + $("total_activities").innerHTML = result[1]; + $("hrView").innerHTML=result[0]; + } + } + } + ); + } + if(subtab == 'todo') + { + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'module=Users&action=massdelete&return_module=Calendar&return_action=ActivityAjax&idlist='+id+'&view='+view+'&hour='+hour+'&day='+day+'&month='+month+'&year='+year+'&type=activity_delete&subtab=todo&ajax=true', + onComplete: function(response) { + result = response.responseText.split('####'); + $("total_activities").innerHTML = result[1]; + $("mnuTab2").innerHTML=result[0]; + } + } + ); + } +} + + +/* +* javascript function to display the div tag +* @param divId :: div tag ID +*/ +function cal_show(divId) + +{ + + var id = document.getElementById(divId); + + id.style.visibility = 'visible'; + +} + +function fnAssignTo(){ + var option_Box = document.getElementById('parent_type'); + var option_select = option_Box.options[option_Box.selectedIndex].value; + if(option_select == "Leads" || option_select == "Leads&action=Popup") + { + document.getElementById('leadLay').style.visibility = 'visible'; + } + else if(option_select == "Accounts" || option_select == "Accounts&action=Popup") + { + document.getElementById('leadLay').style.visibility = 'visible'; + } + else if(option_select == "Potentials" || option_select == "Potentials&action=Popup") + { + document.getElementById('leadLay').style.visibility = 'visible'; + } + else if(option_select == "Quotes&action=Popup" || option_select == "Quotes&action=Popup") + { + document.getElementById('leadLay').style.visibility = 'visible'; + } + else if(option_select == "PurchaseOrder" || option_select == "PurchaseOrder&action=Popup") + { + document.getElementById('leadLay').style.visibility = 'visible'; + } + else if(option_select == "SalesOrder" || option_select == "SalesOrder&action=Popup") + { + document.getElementById('leadLay').style.visibility = 'visible'; + } + else if(option_select == "Invoice" || option_select == "Invoice&action=Popup") + { + document.getElementById('leadLay').style.visibility = 'visible'; + } + else if(option_select == "Campaigns" || option_select == "Campaigns&action=Popup") + { + document.getElementById('leadLay').style.visibility = 'visible'; + } + else{ + document.getElementById('leadLay').style.visibility = 'hidden'; + } + } + +function fnShowPopup(){ + document.getElementById('popupLay').style.display = 'block'; +} + +function fnHidePopup(){ + document.getElementById('popupLay').style.display = 'none'; +} + +function getValidationarr(id,activity_mode,opmode,subtab,viewOption) +{ + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'module=Calendar&action=ActivityAjax&record='+id+'&activity_mode='+activity_mode+'&ajax=true&type=view&file=DetailView', + onComplete: function(response) { + $("dataArray").innerHTML=response.responseText; + setFieldvalues(opmode,subtab,viewOption); + } + } + ); + +} + +function setFieldvalues(opmode,subtab,viewOption) +{ + var st = document.getElementById('activity_cont'); + eval(st.innerHTML); + if(activity_type == 'Events') + { + document.EditView.viewOption.value = viewOption; + document.EditView.subtab.value = subtab; + for(x=0;x is a contact id + ltext ==> is a contact name +**/ +function addOption(lvalue,ltext) +{ + var optObj = document.createElement('OPTION') + if (browser_ie) optObj.innerText = ltext; + else if(browser_nn4 || browser_nn6) optObj.text = ltext; + else optObj.text = ltext; + optObj.value = lvalue; + document.getElementById('parentid').appendChild(optObj); +} + +function getdispDate(tempDate) +{ + var datefmt = document.EditView.dateformat.value; + var dd = _2digit(parseInt(tempDate.getDate(),10)); + var mm = _2digit(parseInt(tempDate.getMonth(),10)+1); + var yy = tempDate.getFullYear(); + if(datefmt == '%d-%m-%Y') return dd+'-'+mm+'-'+yy; + else if(datefmt == '%m-%d-%Y') return mm+'-'+dd+'-'+yy; + else return yy+'-'+mm+'-'+dd; +} diff --git a/oss/vtiger/trunk/modules/Calendar/updateCalendarSharing.php b/oss/vtiger/trunk/modules/Calendar/updateCalendarSharing.php new file mode 100644 index 00000000..a1c09e71 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/updateCalendarSharing.php @@ -0,0 +1,45 @@ +pquery($delquery, array($_REQUEST["current_userid"])); + +$selectedid = $_REQUEST['shar_userid']; +$sharedid = explode (";",$selectedid); +if(isset($sharedid) && $sharedid != null) +{ + foreach($sharedid as $sid) + { + if($sid != '') + { + $sql = "insert into vtiger_sharedcalendar values (?,?)"; + $adb->pquery($sql, array($_REQUEST["current_userid"], $sid)); + } + } +} +if(isset($_REQUEST['start_hour']) && $_REQUEST['start_hour'] != '') +{ + $sql = "update vtiger_users set start_hour=? where id=?"; + $adb->pquery($sql, array($_REQUEST['start_hour'], $current_user->id)); +} + +$sql = "update vtiger_users set hour_format=? where id=?"; +$adb->pquery($sql, array($hour_format, $current_user->id)); +RecalculateSharingRules(); +header("Location: index.php?action=index&module=Calendar&view=".vtlib_purify($_REQUEST['view'])."&hour=".vtlib_purify($_REQUEST['hour'])."&day=".vtlib_purify($_REQUEST['day'])."&month=".vtlib_purify($_REQUEST['month'])."&year=".vtlib_purify($_REQUEST['year'])."&viewOption=".vtlib_purify($_REQUEST['viewOption'])."&subtab=".vtlib_purify($_REQUEST['subtab'])."&parenttab=".getParentTab()); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calendar/updateRelations.php b/oss/vtiger/trunk/modules/Calendar/updateRelations.php new file mode 100644 index 00000000..b6e17de7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calendar/updateRelations.php @@ -0,0 +1,64 @@ +pquery($sql, array($id, $_REQUEST["parentid"])); + } + } + header("Location: index.php?action=CallRelatedList&module=Calendar&activity_mode=Events&record=".$record); + +} +elseif(isset($_REQUEST['entityid']) && $_REQUEST['entityid'] != '' && $_REQUEST['destination_module'] == 'Contacts') +{ + $record = vtlib_purify($_REQUEST["parentid"]); + $sql = "insert into vtiger_cntactivityrel values (?,?)"; + $adb->pquery($sql, array($_REQUEST["entityid"], $_REQUEST["parentid"])); + header("Location: index.php?action=DetailView&module=Calendar&activity_mode=Events&record=".$record); +} + +//This if for adding the vtiger_users +if(isset($_REQUEST['idlist']) && $_REQUEST['idlist'] != '' && $_REQUEST['destination_module'] == 'Users') +{ + //split the string and store in an array + $storearray = explode (";",$idlist); + foreach($storearray as $id) + { + if($id != '') + { + $record = vtlib_purify($_REQUEST['parentid']); + $sql = "insert into vtiger_salesmanactivityrel values (?,?)"; + $adb->pquery($sql, array($id, $_REQUEST["parentid"])); + } + } + header("Location: index.php?action=DetailView&module=Calendar&activity_mode=Events&record=".$record); +} +elseif(isset($_REQUEST['entityid']) && $_REQUEST['entityid'] != '' && $_REQUEST['destination_module'] == 'Users') +{ + $record = vtlib_purify($_REQUEST['parentid']); + $sql = "insert into vtiger_salesmanactivityrel values (?,?)"; + $adb->pquery($sql, array($_REQUEST["entityid"], $_REQUEST["parentid"])); + header("Location: index.php?action=DetailView&module=Calendar&activity_mode=Events&record=".$record); + +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Calls/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Calls/language/zh_cn.lang.php new file mode 100644 index 00000000..4cd0de56 --- /dev/null +++ b/oss/vtiger/trunk/modules/Calls/language/zh_cn.lang.php @@ -0,0 +1,45 @@ + '电话', + 'LBL_MODULE_TITLE' => '电话: 首页', + 'LBL_SEARCH_FORM_TITLE' => '查找电话', + 'LBL_LIST_FORM_TITLE' => '电话列表', + 'LBL_NEW_FORM_TITLE' => '计划客户电话', + 'LBL_LIST_CLOSE' => '完成', + 'LBL_LIST_SUBJECT' => '主题', + 'LBL_LIST_CONTACT' => '联系人', + 'LBL_LIST_RELATED_TO' => '相关对象', + 'LBL_LIST_DATE' => '开始日期', + 'LBL_LIST_TIME' => '开始时间', + 'LBL_LIST_DURATION' => '时间', + 'LBL_SUBJECT' => '主题:', + 'LBL_CONTACT_NAME' => '联系人:', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息:', + 'LBL_DESCRIPTION' => '描述:', + 'LBL_STATUS' => '状态:', + 'LBL_DATE' => '开始日期:', + 'LBL_DURATION' => '时间:', + 'LBL_HOURS_MINUTES' => '(小时/分钟)', + 'LBL_CALL' => '电话:', + 'LBL_DATE_TIME' => '开始日期与时间:', + 'LBL_TIME' => '开始时间:', + 'LBL_HOURS_ABBREV' => '时', + 'LBL_MINSS_ABBREV' => '分', + 'LBL_COLON' => ':', + 'LBL_DEFAULT_STATUS' => '已计划', + 'LNK_NEW_LEAD' => '新增线索', + 'LNK_NEW_CONTACT' => '新增联系人', + 'LNK_NEW_ACCOUNT' => '新增客户', + 'LNK_NEW_OPPORTUNITY' => '新增商机', + 'LNK_NEW_CASE' => '新增拜访', + 'LNK_NEW_NOTE' => '新增备忘录', + 'LNK_NEW_CALL' => '新增电话', + 'LNK_NEW_EMAIL' => '新增Email', + 'LNK_NEW_MEETING' => '新增会议', + 'LNK_NEW_TASK' => '新增任务', + 'ERR_DELETE_RECORD' => '必须指定纪录编号才能删除客户.', + 'NTC_REMOVE_INVITEE' => '您确定要删除这个电话邀请吗?', + 'LBL_INVITEE' => '*受邀者', + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/CallRelatedList.php b/oss/vtiger/trunk/modules/Campaigns/CallRelatedList.php new file mode 100644 index 00000000..b9633ed4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/CallRelatedList.php @@ -0,0 +1,104 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['campaignname']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); + } + + global $mod_strings; + global $app_strings,$adb; + global $theme; + global $currentModule; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + } + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + if (isset($focus->name)) $smarty->assign("NAME", $focus->name); + $related_array=getRelatedLists($currentModule,$focus); + + // vtlib customization: Related module could be disabled, check it + if(isset($related_array)) { + foreach($related_array as $mod_key=>$mod_val) { + if($mod_key == "Contacts" || $mod_key == "Leads") { + $rel_checked=$_REQUEST[$mod_key.'_all']; + $rel_check_split=explode(";",$rel_checked); + if (is_array($mod_val)) { + $mod_val["checked"]=array(); + if (isset($mod_val['entries'])) { + foreach($mod_val['entries'] as $key=>$val) { + if(in_array($key,$rel_check_split)) + $related_array[$mod_key]["checked"][$key] = 'checked'; + else + $related_array[$mod_key]["checked"][$key] = ''; + } + } + } + } + } + } + // END + $smarty->assign("RELATEDLISTS", $related_array); + + require_once('modules/CustomView/CustomView.php'); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $smarty->assign("CATEGORY",$category); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("ID",$focus->id); + $smarty->assign("MODULE",$currentmodule); + $smarty->assign("SINGLE_MOD",$app_strings['Campaign']); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + + if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("RelatedListContents.tpl"); + else + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/Campaigns.js b/oss/vtiger/trunk/modules/Campaigns/Campaigns.js new file mode 100644 index 00000000..d2d4935a --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/Campaigns.js @@ -0,0 +1,42 @@ +/********************************************************************************* + +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ********************************************************************************/ + + + +function set_return_specific_campaign(campaign_id, campaign_name) { + if(document.getElementById('from_link').value != '') { + window.opener.document.QcEditView.campaignname.value = campaign_name; + window.opener.document.QcEditView.campaignid.value = campaign_id; + } else { + window.opener.document.EditView.campaignname.value = campaign_name; + window.opener.document.EditView.campaignid.value = campaign_id; +} +} + +function set_return(product_id, product_name) { + if(document.getElementById('from_link').value != '') { + window.opener.document.QcEditView.parent_name.value = product_name; + window.opener.document.QcEditView.parent_id.value = product_id; + } else { + window.opener.document.EditView.parent_name.value = product_name; + window.opener.document.EditView.parent_id.value = product_id; +} +} + +function set_return_todo(product_id, product_name) { + if(document.getElementById('from_link').value != '') { + window.opener.document.QcEditView.task_parent_name.value = product_name; + window.opener.document.QcEditView.task_parent_id.value = product_id; + } else { + window.opener.document.createTodo.task_parent_name.value = product_name; + window.opener.document.createTodo.task_parent_id.value = product_id; +} +} + diff --git a/oss/vtiger/trunk/modules/Campaigns/Campaigns.php b/oss/vtiger/trunk/modules/Campaigns/Campaigns.php new file mode 100644 index 00000000..26f2367f --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/Campaigns.php @@ -0,0 +1,466 @@ +'crmid','vtiger_campaign'=>'campaignid','vtiger_campaignscf'=>'campaignid'); + /** + * Mandatory table for supporting custom fields. + */ + var $customFieldTable = Array('vtiger_campaignscf', 'campaignid'); + var $column_fields = Array(); + + var $sortby_fields = Array('campaignname','smownerid','campaigntype','productname','expectedrevenue','closingdate','campaignstatus','expectedresponse','targetaudience','expectedcost'); + + var $list_fields = Array( + 'Campaign Name'=>Array('campaign'=>'campaignname'), + 'Campaign Type'=>Array('campaign'=>'campaigntype'), + 'Campaign Status'=>Array('campaign'=>'campaignstatus'), + 'Expected Revenue'=>Array('campaign'=>'expectedrevenue'), + 'Expected Close Date'=>Array('campaign'=>'closingdate'), + 'Assigned To' => Array('crmentity'=>'smownerid') + ); + + var $list_fields_name = Array( + 'Campaign Name'=>'campaignname', + 'Campaign Type'=>'campaigntype', + 'Campaign Status'=>'campaignstatus', + 'Expected Revenue'=>'expectedrevenue', + 'Expected Close Date'=>'closingdate', + 'Assigned To'=>'assigned_user_id' + ); + + var $list_link_field= 'campaignname'; + //Added these variables which are used as default order by and sortorder in ListView + var $default_order_by = 'crmid'; + var $default_sort_order = 'DESC'; + + //var $groupTable = Array('vtiger_campaigngrouprelation','campaignid'); + + var $search_fields = Array( + 'Campaign Name'=>Array('vtiger_campaign'=>'campaignname'), + 'Campaign Type'=>Array('vtiger_campaign'=>'campaigntype'), + ); + + var $search_fields_name = Array( + 'Campaign Name'=>'campaignname', + 'Campaign Type'=>'campaigntype', + ); + // Used when enabling/disabling the mandatory fields for the module. + // Refers to vtiger_field.fieldname values. + var $mandatory_fields = Array('campaignname','createdtime' ,'modifiedtime','assigned_user_id'); + + function Campaigns() + { + $this->log =LoggerManager::getLogger('campaign'); + $this->db = PearDatabase::getInstance(); + $this->column_fields = getColumnFields('Campaigns'); + } + + /** Function to handle module specific operations when saving a entity + */ + function save_module($module) + { + } + + // Mike Crowe Mod --------------------------------------------------------Default ordering for us + /** + * Function to get sort order + * return string $sorder - sortorder string either 'ASC' or 'DESC' + */ + function getSortOrder() + { + global $log; + $log->debug("Entering getSortOrder() method ..."); + if(isset($_REQUEST['sorder'])) + $sorder = $this->db->sql_escape_string($_REQUEST['sorder']); + else + $sorder = (($_SESSION['CAMPAIGN_SORT_ORDER'] != '')?($_SESSION['CAMPAIGN_SORT_ORDER']):($this->default_sort_order)); + + $log->debug("Exiting getSortOrder method ..."); + return $sorder; + } + + /** + * Function to get order by + * return string $order_by - fieldname(eg: 'campaignname') + */ + function getOrderBy() + { + global $log; + $log->debug("Entering getOrderBy() method ..."); + + $use_default_order_by = ''; + if(PerformancePrefs::getBoolean('LISTVIEW_DEFAULT_SORTING', true)) { + $use_default_order_by = $this->default_order_by; + } + + if (isset($_REQUEST['order_by'])) + $order_by = $this->db->sql_escape_string($_REQUEST['order_by']); + else + $order_by = (($_SESSION['CAMPAIGN_ORDER_BY'] != '')?($_SESSION['CAMPAIGN_ORDER_BY']):($use_default_order_by)); + + $log->debug("Exiting getOrderBy method ..."); + return $order_by; + } + // Mike Crowe Mod -------------------------------------------------------- + + /** + * Function to get Campaign related Contacts + * @param integer $id - campaignid + * returns related Contacts record in array format + */ + function get_contacts($id, $cur_tab_id, $rel_tab_id, $actions=false) { + global $log, $singlepane_view,$currentModule; + $log->debug("Entering get_contacts(".$id.") method ..."); + $this_module = $currentModule; + + $related_module = vtlib_getModuleNameById($rel_tab_id); + require_once("modules/$related_module/$related_module.php"); + $other = new $related_module(); + vtlib_setup_modulevars($related_module, $other); + $singular_modname = vtlib_toSingular($related_module); + + $parenttab = getParentTab(); + + if($singlepane_view == 'true') + $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; + else + $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; + + $button = ''; + + // Send mail button for selected Leads + $button .= ""; + $button .= '    '; + + /* To get Leads CustomView -START */ + require_once('modules/CustomView/CustomView.php'); + $lhtml = ""; + /* To get Leads CustomView -END */ + + $button .= $lhtml.""; + $button .= '    '; + + if($actions) { + if(is_string($actions)) $actions = explode(',', strtoupper($actions)); + if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { + $button .= " "; + } + if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') { + $button .= " "; + } + } + + $query = "SELECT vtiger_contactdetails.accountid, vtiger_account.accountname, + CASE when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name , + vtiger_contactdetails.contactid, vtiger_contactdetails.lastname, vtiger_contactdetails.firstname, vtiger_contactdetails.title, + vtiger_contactdetails.department, vtiger_contactdetails.email, vtiger_contactdetails.phone, vtiger_crmentity.crmid, + vtiger_crmentity.smownerid, vtiger_crmentity.modifiedtime + FROM vtiger_contactdetails + INNER JOIN vtiger_campaigncontrel ON vtiger_campaigncontrel.contactid = vtiger_contactdetails.contactid + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_contactdetails.contactid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid=vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid=vtiger_users.id + LEFT JOIN vtiger_account ON vtiger_account.accountid = vtiger_contactdetails.accountid + WHERE vtiger_campaigncontrel.campaignid = ".$id." AND vtiger_crmentity.deleted=0"; + + $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); + + if($return_value == null) $return_value = Array(); + $return_value['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_contacts method ..."); + return $return_value; + } + + /** + * Function to get Campaign related Leads + * @param integer $id - campaignid + * returns related Leads record in array format + */ + function get_leads($id, $cur_tab_id, $rel_tab_id, $actions=false) { + global $log, $singlepane_view, $currentModule; + $log->debug("Entering get_leads(".$id.") method ..."); + $this_module = $currentModule; + + $related_module = vtlib_getModuleNameById($rel_tab_id); + require_once("modules/$related_module/$related_module.php"); + $other = new $related_module(); + vtlib_setup_modulevars($related_module, $other); + $singular_modname = vtlib_toSingular($related_module); + + $parenttab = getParentTab(); + + if($singlepane_view == 'true') + $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; + else + $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; + + $button = ''; + + // Send mail button for selected Leads + $button .= ""; + $button .= '    '; + + /* To get Leads CustomView -START */ + require_once('modules/CustomView/CustomView.php'); + $lhtml = ""; + /* To get Leads CustomView -END */ + + $button .= $lhtml.""; + $button .= '    '; + + if($actions) { + if(is_string($actions)) $actions = explode(',', strtoupper($actions)); + if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { + $button .= " "; + } + if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') { + $button .= " "; + } + } + + $query = "SELECT vtiger_leaddetails.*, vtiger_crmentity.crmid,vtiger_leadaddress.phone,vtiger_leadsubdetails.website, + CASE when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name, + vtiger_crmentity.smownerid FROM vtiger_leaddetails + INNER JOIN vtiger_campaignleadrel ON vtiger_campaignleadrel.leadid=vtiger_leaddetails.leadid + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_leaddetails.leadid + INNER JOIN vtiger_leadsubdetails ON vtiger_leadsubdetails.leadsubscriptionid = vtiger_leaddetails.leadid + INNER JOIN vtiger_leadaddress ON vtiger_leadaddress.leadaddressid = vtiger_leadsubdetails.leadsubscriptionid + LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id + LEFT JOIN vtiger_groups ON vtiger_groups.groupid=vtiger_crmentity.smownerid + WHERE vtiger_crmentity.deleted=0 AND vtiger_campaignleadrel.campaignid = ".$id; + + $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); + + if($return_value == null) $return_value = Array(); + $return_value['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_leads method ..."); + return $return_value; + } + + /** + * Function to get Campaign related Potentials + * @param integer $id - campaignid + * returns related potentials record in array format + */ + function get_opportunities($id, $cur_tab_id, $rel_tab_id, $actions=false) { + global $log, $singlepane_view,$currentModule,$current_user; + $log->debug("Entering get_opportunities(".$id.") method ..."); + $this_module = $currentModule; + + $related_module = vtlib_getModuleNameById($rel_tab_id); + require_once("modules/$related_module/$related_module.php"); + $other = new $related_module(); + vtlib_setup_modulevars($related_module, $other); + $singular_modname = vtlib_toSingular($related_module); + + $parenttab = getParentTab(); + + if($singlepane_view == 'true') + $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; + else + $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; + + $button = ''; + + if($actions && getFieldVisibilityPermission($related_module,$current_user->id,'campaignid') == '0') { + if(is_string($actions)) $actions = explode(',', strtoupper($actions)); + if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { + $button .= " "; + } + if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') { + $button .= " "; + } + } + + $query = "SELECT CASE when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name, + vtiger_potential.related_to, vtiger_account.accountname, vtiger_potential.potentialid, vtiger_potential.potentialname, + vtiger_potential.potentialtype, vtiger_potential.sales_stage, vtiger_potential.amount, vtiger_potential.closingdate, + vtiger_crmentity.crmid, vtiger_crmentity.smownerid FROM vtiger_campaign + INNER JOIN vtiger_potential ON vtiger_campaign.campaignid = vtiger_potential.campaignid + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_potential.potentialid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid=vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_users.id=vtiger_crmentity.smownerid + LEFT JOIN vtiger_account ON vtiger_account.accountid = vtiger_potential.related_to + WHERE vtiger_campaign.campaignid = ".$id." AND vtiger_crmentity.deleted=0"; + + $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); + + if($return_value == null) $return_value = Array(); + $return_value['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_opportunities method ..."); + return $return_value; + } + + /** + * Function to get Campaign related Activities + * @param integer $id - campaignid + * returns related activities record in array format + */ + function get_activities($id, $cur_tab_id, $rel_tab_id, $actions=false) { + global $log, $singlepane_view,$currentModule,$current_user; + $log->debug("Entering get_activities(".$id.") method ..."); + $this_module = $currentModule; + + $related_module = vtlib_getModuleNameById($rel_tab_id); + require_once("modules/$related_module/Activity.php"); + $other = new Activity(); + vtlib_setup_modulevars($related_module, $other); + $singular_modname = vtlib_toSingular($related_module); + + $parenttab = getParentTab(); + + if($singlepane_view == 'true') + $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; + else + $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; + + $button = ''; + + $button .= ''; + + if($actions) { + if(is_string($actions)) $actions = explode(',', strtoupper($actions)); + if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') { + $button .= " "; + } + } + + $query = "SELECT vtiger_contactdetails.lastname, + vtiger_contactdetails.firstname, + vtiger_contactdetails.contactid, + vtiger_activity.*, + vtiger_seactivityrel.*, + vtiger_crmentity.crmid, vtiger_crmentity.smownerid, + vtiger_crmentity.modifiedtime, + CASE when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name, + vtiger_recurringevents.recurringtype + FROM vtiger_activity + INNER JOIN vtiger_seactivityrel + ON vtiger_seactivityrel.activityid = vtiger_activity.activityid + INNER JOIN vtiger_crmentity + ON vtiger_crmentity.crmid=vtiger_activity.activityid + LEFT JOIN vtiger_cntactivityrel + ON vtiger_cntactivityrel.activityid = vtiger_activity.activityid + LEFT JOIN vtiger_contactdetails + ON vtiger_contactdetails.contactid = vtiger_cntactivityrel.contactid + LEFT JOIN vtiger_users + ON vtiger_users.id = vtiger_crmentity.smownerid + LEFT OUTER JOIN vtiger_recurringevents + ON vtiger_recurringevents.activityid = vtiger_activity.activityid + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + WHERE vtiger_seactivityrel.crmid=".$id." + AND vtiger_crmentity.deleted = 0 + AND (activitytype = 'Task' + OR activitytype !='Emails')"; + + $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); + + if($return_value == null) $return_value = Array(); + $return_value['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_activities method ..."); + return $return_value; + + } + + /* + * Function to get the secondary query part of a report + * @param - $module primary module name + * @param - $secmodule secondary module name + * returns the query string formed on fetching the related data for report for secondary module + */ + function generateReportsSecQuery($module,$secmodule){ + $query = $this->getRelationQuery($module,$secmodule,"vtiger_campaign","campaignid"); + $query .=" left join vtiger_crmentity as vtiger_crmentityCampaigns on vtiger_crmentityCampaigns.crmid=vtiger_campaign.campaignid and vtiger_crmentityCampaigns.deleted=0 + left join vtiger_products as vtiger_productsCampaigns on vtiger_campaign.product_id = vtiger_productsCampaigns.productid + left join vtiger_campaignscf on vtiger_campaignscf.campaignid = vtiger_crmentityCampaigns.crmid + left join vtiger_groups as vtiger_groupsCampaigns on vtiger_groupsCampaigns.groupid = vtiger_crmentityCampaigns.smownerid + left join vtiger_users as vtiger_usersCampaigns on vtiger_usersCampaigns.id = vtiger_crmentityCampaigns.smownerid"; + + return $query; + } + + /* + * Function to get the relation tables for related modules + * @param - $secmodule secondary module name + * returns the array with table names and fieldnames storing relations between module and this module + */ + function setRelationTables($secmodule){ + $rel_tables = array ( + "Contacts" => array("vtiger_campaigncontrel"=>array("campaignid","contactid"),"vtiger_campaign"=>"campaignid"), + "Leads" => array("vtiger_campaignleadrel"=>array("campaignid","leadid"),"vtiger_campaign"=>"campaignid"), + "Potentials" => array("vtiger_potential"=>array("campaignid","potentialid"),"vtiger_campaign"=>"campaignid"), + "Calendar" => array("vtiger_seactivityrel"=>array("crmid","activityid"),"vtiger_campaign"=>"campaignid"), + "Products" => array("vtiger_campaign"=>array("campaignid","product_id")), + ); + return $rel_tables[$secmodule]; + } + + // Function to unlink an entity with given Id from another entity + function unlinkRelationship($id, $return_module, $return_id) { + global $log; + if(empty($return_module) || empty($return_id)) return; + + if($return_module == 'Leads') { + $sql = 'DELETE FROM vtiger_campaignleadrel WHERE campaignid=? AND leadid=?'; + $this->db->pquery($sql, array($id, $return_id)); + } elseif($return_module == 'Contacts') { + $sql = 'DELETE FROM vtiger_campaigncontrel WHERE campaignid=? AND contactid=?'; + $this->db->pquery($sql, array($id, $return_id)); + } else { + $sql = 'DELETE FROM vtiger_crmentityrel WHERE (crmid=? AND relmodule=? AND relcrmid=?) OR (relcrmid=? AND module=? AND crmid=?)'; + $params = array($id, $return_module, $return_id, $id, $return_module, $return_id); + $this->db->pquery($sql, $params); + } + } + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/CampaignsAjax.php b/oss/vtiger/trunk/modules/Campaigns/CampaignsAjax.php new file mode 100644 index 00000000..e2d11f6b --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/CampaignsAjax.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Campaigns/CustomView.php b/oss/vtiger/trunk/modules/Campaigns/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Campaigns/Delete.php b/oss/vtiger/trunk/modules/Campaigns/Delete.php new file mode 100644 index 00000000..9dddc075 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/Delete.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/DetailView.php b/oss/vtiger/trunk/modules/Campaigns/DetailView.php new file mode 100644 index 00000000..cd82717d --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/DetailView.php @@ -0,0 +1,107 @@ +retrieve_entity_info($_REQUEST['record'],"Campaigns"); + $focus->name=$focus->column_fields['campaignname']; + $focus->id = $_REQUEST['record']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; +} +global $app_strings,$mod_strings,$theme,$currentModule,$default_module_view,$adb; + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); + +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); +else $smarty->assign("NAME", ""); +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); + +$smarty->assign("CUSTOMFIELD", $cust_fld); +$smarty->assign("SINGLE_MOD",'Campaign'); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +if(isPermitted("Campaigns","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +if(isPermitted("Campaigns","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); +$smarty->assign("ID", vtlib_purify($_REQUEST['record'])); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$tabid = getTabid("Campaigns"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); + +if($singlepane_view == 'true') +{ + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +$smarty->assign("SinglePane_View", $singlepane_view); +$smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); +$smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("DetailView.tpl"); + +$focus->id = $_REQUEST['record']; + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/DetailViewAjax.php b/oss/vtiger/trunk/modules/Campaigns/DetailViewAjax.php new file mode 100644 index 00000000..31f31673 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/DetailViewAjax.php @@ -0,0 +1,45 @@ +retrieve_entity_info($crmid,"Campaigns"); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("Campaigns"); + if($modObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/EditView.php b/oss/vtiger/trunk/modules/Campaigns/EditView.php new file mode 100644 index 00000000..fb88c563 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/EditView.php @@ -0,0 +1,131 @@ +assign("SEARCH", $searchurl); +//4600 ends + + +if(isset($_REQUEST['record']) && $_REQUEST['record'] !='') +{ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"Campaigns"); + $focus->name=$focus->column_fields['campaignname']; +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') + $smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +else +{ + $smarty->assign("BASBLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS')); +} + +$smarty->assign("OP_MODE",$disp_view); + +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Campaign'); + + +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); + +if (isset($focus->name)) +$smarty->assign("NAME", $focus->name); +else +$smarty->assign("NAME", ""); + +if(isset($cust_fld)) +{ + $smarty->assign("CUSTOMFIELD", $cust_fld); +} +$smarty->assign("ID", $focus->id); +if($focus->mode == 'edit') +{ + $smarty->assign("MODE", $focus->mode); + $smarty->assign("OLDSMOWNERID", $focus->column_fields['assigned_user_id']); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); +} + +if(isset($_REQUEST['return_module'])) +$smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if(isset($_REQUEST['return_action'])) +$smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if(isset($_REQUEST['return_id'])) +$smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if(isset($_REQUEST['product_id'])) +$smarty->assign("PRODUCTID", vtlib_purify($_REQUEST['product_id'])); +if (isset($_REQUEST['return_viewname'])) +$smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +$tabid = getTabid("Campaigns"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
'. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +if($focus->mode == 'edit') + $smarty->display("salesEditView.tpl"); +else + $smarty->display("CreateView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/ListView.php b/oss/vtiger/trunk/modules/Campaigns/ListView.php new file mode 100644 index 00000000..c5d65dab --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/ListView.php @@ -0,0 +1,262 @@ +initSortbyField('Campaigns'); +// END +$category = getParentTab(); +$smarty = new vtigerCRM_Smarty; +$other_text = Array(); +$url_string = ''; // assigning http url string + +if(!$_SESSION['lvs'][$currentModule]) +{ + unset($_SESSION['lvs']); + $modObj = new ListViewSession(); + $modObj->sorder = $sorder; + $modObj->sortby = $order_by; + $_SESSION['lvs'][$currentModule] = get_object_vars($modObj); +} + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR","The User does not have permission to Change/Delete ".$errormsg." ".$currentModule); +}else +{ + $smarty->assign("ERROR",""); +} + +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION['CAMPAIGN_ORDER_BY'] = $order_by; +$_SESSION['CAMPAIGN_SORT_ORDER'] = $sorder; +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> + + + +if(isset($_REQUEST['query']) && $_REQUEST['query'] == 'true') +{ + list($where, $ustring) = split("#@@#",getWhereCondition($currentModule)); + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); +} + +//<<<>>>>>> +$oCustomView = new CustomView("Campaigns"); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); + +//Added to handle approving or denying status-public by the admin in CustomView +$statusdetails = $oCustomView->isPermittedChangeStatus($viewnamedesc['status']); +$smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + +//To check if a user is able to edit/delete a customview +$edit_permit = $oCustomView->isPermittedCustomView($viewid,'EditView',$currentModule); +$delete_permit = $oCustomView->isPermittedCustomView($viewid,'Delete',$currentModule); +$smarty->assign("CV_EDIT_PERMIT",$edit_permit); +$smarty->assign("CV_DELETE_PERMIT",$delete_permit); + +$smarty->assign("CHANGE_OWNER",getUserslist()); +$smarty->assign("CHANGE_GROUP_OWNER",getGroupslist()); +//<<<<>>>> + +if($viewid != 0) +{ + $CActionDtls = $oCustomView->getCustomActionDetails($viewid); +} +elseif($viewid ==0) +{ + echo "
"; + echo "
+ + + + + + + + + +
+ $app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; +} +// Buttons and View options +if(isPermitted('Campaigns','Delete','') == 'yes') +{ + $other_text ['del']=$app_strings[LBL_MASS_DELETE]; +} +if(isPermitted('Campaigns','EditView','') == 'yes') +{ + $other_text['mass_edit'] = $app_strings[LBL_MASS_EDIT]; + $other_text['c_owner'] = $app_strings[LBL_CHANGE_OWNER]; +} +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} + +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("BUTTONS",$other_text); +$smarty->assign("CATEGORY",$category); +$smarty->assign("SINGLE_MOD",'Campaign'); + +//Retreive the list from Database +//<<<<<<<<>>>>>>>> +if($viewid != "0") +{ + $listquery = getListQuery("Campaigns"); + $list_query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"Campaigns"); +} +else +{ + $list_query = getListQuery("Campaigns"); +} +//<<<<<<<>>>>>>>> + +if(isset($where) && $where != '') +{ + $list_query .= ' and '.$where; +} + +//sort by "assignedto" and default sort by "ticketid"(DESC) +if(isset($order_by) && $order_by != '') +{ + if($order_by == 'smownerid') + { + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY user_name'; + $list_query .= ' ORDER BY user_name '.$sorder; + } + else + { + $tablename = getTableNameForField('Campaigns',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY '.$tablename.$order_by; + + $list_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; + } +} +else +{ + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY vtiger_campaign.campaignid'; + $list_query .= ' ORDER BY vtiger_campaign.campaignid DESC'; +} + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +//mass merge for word templates -- *Raj*17/11 +while($row = $adb->fetch_array($list_result)) +{ + $ids[] = $row["crmid"]; +} +if(isset($ids)) +{ + $smarty->assign("ALLIDS", implode($ids,";")); +} + +//Retreive the List View Table Header +if($viewid !='') + $url_string .="&viewname=".$viewid; + +$listview_header = getListViewHeader($focus,"Campaigns",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_header_search = getSearchListHeaderValues($focus,"Campaigns",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER",$listview_header_search); + +$listview_entries = getListViewEntries($focus,"Campaigns",$list_result,$navigation_array,"","","EditView","Delete",$oCustomView); + +$smarty->assign("LISTENTITY", $listview_entries); +$smarty->assign("SELECT_SCRIPT", $view_script); +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string,"Campaigns","index",$viewid); +$alphabetical = AlphabeticalSearch($currentModule,'index','campaignname','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($module); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); + +$smarty->assign("NAVIGATION", $navigationOutput); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display("ListView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/ListViewPagging.php b/oss/vtiger/trunk/modules/Campaigns/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/LoadList.php b/oss/vtiger/trunk/modules/Campaigns/LoadList.php new file mode 100644 index 00000000..9a18b28c --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/LoadList.php @@ -0,0 +1,38 @@ +query($cvObj->getModifiedCvListQuery(vtlib_purify($_REQUEST["cvid"]),$listquery,vtlib_purify($_REQUEST["list_type"]))); + +if($_REQUEST["list_type"] == "Leads"){ + $reltable = "vtiger_campaignleadrel"; + $relid = "leadid"; +} +elseif($_REQUEST["list_type"] == "Contacts"){ + $reltable = "vtiger_campaigncontrel"; + $relid = "contactid"; +} + +while($row=$adb->fetch_array($rs)) { + $sql = "delete from $reltable where $relid = ? and campaignid = ?"; + $adb->pquery($sql, array($row["crmid"], $_REQUEST['return_id'])); + $adb->pquery("INSERT INTO ".$reltable." VALUES(?,?)", array($_REQUEST["return_id"], $row["crmid"])); +} + +header("Location: index.php?module=Campaigns&action=CampaignsAjax&file=CallRelatedList&ajax=true&record=".vtlib_purify($_REQUEST['return_id'])); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/MassEdit.php b/oss/vtiger/trunk/modules/Campaigns/MassEdit.php new file mode 100644 index 00000000..348dab37 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/MassEdit.php @@ -0,0 +1,45 @@ +mode = ''; +$mode = 'mass_edit'; +$disp_view = getView($focus->mode); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("IDS",$_REQUEST['idstring']); +$smarty->assign("MASS_EDIT","1"); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("APP",$app_strings); +$smarty->assign("CATEGORY",getParentTab()); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/MassEditSave.php b/oss/vtiger/trunk/modules/Campaigns/MassEditSave.php new file mode 100644 index 00000000..0e1f2a6f --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/MassEditSave.php @@ -0,0 +1,67 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if($fieldname == 'assigned_user_id'){ + if($_REQUEST['assigntype'] == 'U') { + $value = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $value = $_REQUEST['assigned_group_id']; + } + } else { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + } + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/Popup.php b/oss/vtiger/trunk/modules/Campaigns/Popup.php new file mode 100644 index 00000000..98ea8ece --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/Popup.php @@ -0,0 +1,23 @@ + diff --git a/oss/vtiger/trunk/modules/Campaigns/QuickCreate.php b/oss/vtiger/trunk/modules/Campaigns/QuickCreate.php new file mode 100644 index 00000000..8d5998b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/QuickCreate.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Campaigns/Save.php b/oss/vtiger/trunk/modules/Campaigns/Save.php new file mode 100644 index 00000000..b9a717f7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/Save.php @@ -0,0 +1,80 @@ +id); + $rate_symbol = getCurrencySymbolandCRate($currencyid); + $rate = $rate_symbol['rate']; +//added to fix 4600 +$search=vtlib_purify($_REQUEST['search_url']); +setObjectValuesFromRequest($focus); + +if(isset($_REQUEST['expectedrevenue'])) +{ + $value = convertToDollar($_REQUEST['expectedrevenue'],$rate); + $focus->column_fields['expectedrevenue'] = $value; +} +if(isset($_REQUEST['budgetcost'])) +{ + $value = convertToDollar($_REQUEST['budgetcost'],$rate); + $focus->column_fields['budgetcost'] = $value; +} +if(isset($_REQUEST['actualcost'])) +{ + $value = convertToDollar($_REQUEST['actualcost'],$rate); + $focus->column_fields['actualcost'] = $value; +} +if(isset($_REQUEST['actualroi'])) +{ + $value = convertToDollar($_REQUEST['actualroi'],$rate); + $focus->column_fields['actualroi'] = $value; +} +if(isset($_REQUEST['expectedroi'])) +{ + $value = convertToDollar($_REQUEST['expectedroi'],$rate); + $focus->column_fields['expectedroi'] = $value; +} + +if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} + +$focus->save("Campaigns"); +$return_id = $focus->id; + +$parenttab = getParentTab(); +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "Campaigns"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + +header("Location: index.php?action=$return_action&module=$return_module&record=$return_id&parenttab=$parenttab&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/Settings.php b/oss/vtiger/trunk/modules/Campaigns/Settings.php new file mode 100644 index 00000000..48a80c0b --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/Settings.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/TagCloud.php b/oss/vtiger/trunk/modules/Campaigns/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Campaigns/UnifiedSearch.php b/oss/vtiger/trunk/modules/Campaigns/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Campaigns/index.php b/oss/vtiger/trunk/modules/Campaigns/index.php new file mode 100644 index 00000000..da92b36b --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/index.php @@ -0,0 +1,17 @@ + diff --git a/oss/vtiger/trunk/modules/Campaigns/language/en_us.lang.php b/oss/vtiger/trunk/modules/Campaigns/language/en_us.lang.php new file mode 100644 index 00000000..349b78e9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/language/en_us.lang.php @@ -0,0 +1,91 @@ +'Campaign Information', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', +'LBL_EXPECTATIONS_AND_ACTUALS'=>'Expectations & Actuals', + +'Campaign Name'=>'Campaign Name', +'Campaign Type'=>'Campaign Type', +'Campaign Status'=>'Campaign Status', +'Campaign ID'=>'Campaign ID', +'Expected Close Date'=>'Expected Close Date', +'Expected Revenue'=>'Expected Revenue', +'Budget Cost'=>'Budget Cost', +'Actual Cost'=>'Actual Cost', +'Expected Response'=>'Expected Response', +'Assigned To'=>'Assigned To', +'Num Sent'=>'Num Sent', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Description'=>'Description', +'Product'=>'Product', +'Target Audience'=>'Target Audience', +'TargetSize'=>'Target Size', +'Sponsor'=>'Sponsor', + +'Expected Sales Count'=>'Expected Sales Count', +'Expected Response Count'=>'Expected Response Count', +'Expected ROI'=>'Expected ROI', + +'Actual Sales Count'=>'Actual Sales Count', +'Actual Response Count'=>'Actual Response Count', +'Actual ROI'=>'Actual ROI', +'Select One'=>'Select One', +'LBL_LOAD_LIST'=>'Load List', + +//Added for existing Picklist Entries + +'Conference'=>'Conference', +'Webinar'=>'Webinar', +'Trade Show'=>'Trade Show', +'Public Relations'=>'Public Relations', +'Partners'=>'Partners', +'Referral Program'=>'Referral Program', +'Advertisement'=>'Advertisement', +'Banner Ads'=>'Banner Ads', +'Direct Mail'=>'Direct Mail', +'Email'=>'Email', +'Telemarketing'=>'Telemarketing', +'Others'=>'Others', + +'Planning'=>'Planning', +'Active'=>'Active', +'Inactive'=>'Inactive', +'Complete'=>'Complete', +'Cancelled'=>'Cancelled', + +'Excellent'=>'Excellent', +'Good'=>'Good', +'Average'=>'Average', +'Poor'=>'Poor', + +//Module Sequence Numbering +'Campaign No'=>'Campaign No', +// END + +); + +?> diff --git a/oss/vtiger/trunk/modules/Campaigns/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Campaigns/language/zh_cn.lang.php new file mode 100644 index 00000000..90bc7553 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/language/zh_cn.lang.php @@ -0,0 +1,92 @@ + '活动信息', + 'LBL_CUSTOM_INFORMATION' => '自订信息', + 'LBL_DESCRIPTION_INFORMATION' => '说明信息', + 'LBL_EXPECTATIONS_AND_ACTUALS' => '预估与实际', + + 'Campaign Name' => '活动名称', + 'Campaign Type' => '活动类型', + 'Campaign Status' => '活动状态', + 'Campaign ID' => '活动编号', + 'Expected Close Date' => '预期结束日期', + 'Expected Revenue' => '预期收益', + 'Budget Cost' => '估计成本', + 'Actual Cost' => '实际成本', + 'Expected Response' => '预期反应', + 'Assigned To' => '负责人', + 'Num Sent' => '寄送数量', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'Description' => '说明', + 'Product' => '产品', + 'Target Audience' => '目标族群', + 'TargetSize' => '目标规模', + 'Sponsor' => '赞助商', + + + 'Expected Sales Count' => '预期销售数量', +'Expected Response Count' => '预期回应数量', + 'Expected ROI' => '预期收益', + + 'Actual Sales Count' => '实际销售数量', + 'Actual Response Count' => '实际回应数量', + 'Actual ROI' => '实际收益', + 'Select One' => '选择一个', + 'LBL_LOAD_LIST' => '读取清单', + +//Added for existing Picklist Entries + + 'Conference' => '研讨会', + 'Webinar' => '网络发表会', + 'Trade Show' => '贸易展览', + 'Public Relations' => '公众关系', + 'Partners' => '伙伴', + 'Referral Program' => '介绍活动', + 'Advertisement' => '广告', + 'Banner Ads' => '网站广告', + 'Direct Mail' => '邮件营销', + 'Email' => '电子邮件', + 'Telemarketing' => '电话营销', + 'Others' => '其它', + +'Planning' => '规划中', + 'Active' => '启用', + 'Inactive' => '停用', + 'Complete' => '完成', + 'Cancelled' => '取消', + + 'Excellent' => '极佳', + 'Good' => '好', + 'Average' => '平均', + 'Poor' => '差', + +//Module Sequence Numbering +'Campaign No'=>'Campaign No', +// END + +); + +?> diff --git a/oss/vtiger/trunk/modules/Campaigns/updateRelations.php b/oss/vtiger/trunk/modules/Campaigns/updateRelations.php new file mode 100644 index 00000000..1f9f4cf3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Campaigns/updateRelations.php @@ -0,0 +1,57 @@ +pquery($sql, array($forCRMRecord, $id)); + } else { + $focus->save_related_module($currentModule, $forCRMRecord, $update_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Cases/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Cases/language/zh_cn.lang.php new file mode 100644 index 00000000..fbf596e9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Cases/language/zh_cn.lang.php @@ -0,0 +1,39 @@ + '拜访', + 'LBL_MODULE_TITLE' => '拜访:首页', + 'LBL_SEARCH_FORM_TITLE' => '查找拜访', + 'LBL_LIST_FORM_TITLE' => '拜访列表', + 'LBL_NEW_FORM_TITLE' => '新增拜访', + 'LBL_CONTACT_CASE_TITLE' => '拜访联系人:', + 'LBL_SUBJECT' => '主题:', + 'LBL_CASE' => '拜访:', + 'LBL_CASE_NUMBER' => '拜访编号:', + 'LBL_NUMBER' => '编号:', + 'LBL_STATUS' => '状态:', + 'LBL_ACCOUNT_NAME' => '客户名称:', + 'LBL_DESCRIPTION' => '描述:', + 'LBL_CONTACT_NAME' => '联系人姓名:', + 'LBL_CASE_SUBJECT' => '事件主题:', + 'LBL_CONTACT_ROLE' => '角色:', + 'LBL_LIST_NUMBER' => '编号', + 'LBL_LIST_SUBJECT' => '主题', + 'LBL_LIST_ACCOUNT_NAME' => '客户名称', + 'LBL_LIST_STATUS' => '状态', + 'LBL_LIST_LAST_MODIFIED' => '最新修改', + 'LBL_INVITEE' => '*受邀者', + 'LNK_NEW_CONTACT' => '新增联系人', + 'LNK_NEW_LEAD' => '新增线索', + 'LNK_NEW_ACCOUNT' => '新增客户', + 'LNK_NEW_OPPORTUNITY' => '新增商机', + 'LNK_NEW_CASE' => '新增拜访', + 'LNK_NEW_NOTE' => '新增备忘录', + 'LNK_NEW_CALL' => '新增电话', + 'LNK_NEW_EMAIL' => '新增Email', + 'LNK_NEW_MEETING' => '新增会议', + 'LNK_NEW_TASK' => '新增任务', + 'NTC_REMOVE_INVITEE' => '*您确定要从拜访中移除这个联系人?', + 'ERR_DELETE_RECORD' => '必须指定记录编号才能删除客户.', + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Contacts/CallRelatedList.php b/oss/vtiger/trunk/modules/Contacts/CallRelatedList.php new file mode 100644 index 00000000..8c8b9ef6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/CallRelatedList.php @@ -0,0 +1,101 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['firstname'].' '.$focus->column_fields['lastname']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); + } + + global $adb; + $sql = $adb->pquery('select accountid from vtiger_contactdetails where contactid=?', array($focus->id)); + $accountid = $adb->query_result($sql,0,'accountid'); + if($accountid == 0) $accountid=''; + + global $mod_strings; + global $app_strings; + global $theme; + global $currentModule; + global $current_user; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + $smarty->assign("accountid",$accountid); + + + if(isset($_request['isduplicate']) && $_request['isduplicate'] == 'true') { + $focus->id = ""; + } + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + $parent_email = getEmailParentsList('Contacts',$_REQUEST['record'], $focus); + $smarty->assign("HIDDEN_PARENTS_LIST",$parent_email); + + if(isset($_REQUEST['record']) && $_REQUEST['record']!='') { + $userid = $current_user->id; + $sql = "select fieldname from vtiger_field where uitype = '13' and tabid = 4 and vtiger_field.presence in (0,2)"; + $result = $adb->pquery($sql, array()); + $num_fieldnames = $adb->num_rows($result); + for($i = 0; $i < $num_fieldnames; $i++) { + $fieldname = $adb->query_result($result,$i,"fieldname"); + $permit= getFieldVisibilityPermission("Contacts",$userid,$fieldname); + } + } + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("CONTACT_PERMISSION",CheckFieldPermission('contact_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $smarty->assign("CATEGORY",$category); + $smarty->assign("ID",$focus->id); + $smarty->assign("NAME",$focus->name); + $smarty->assign("EMAIL",$focus->column_fields['email']); + $smarty->assign("YAHOO",$focus->column_fields['yahooid']); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("MODULE",$currentmodule); + $smarty->assign("SINGLE_MOD",$app_strings['Contact']); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Contacts/Contacts.js b/oss/vtiger/trunk/modules/Contacts/Contacts.js new file mode 100644 index 00000000..de29b5d9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/Contacts.js @@ -0,0 +1,250 @@ +/********************************************************************************* + +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ********************************************************************************/ + +document.write(" +pquery($sql, array($templateid)); +$temparray = $adb->fetch_array($result); + +$fileContent = $temparray['data']; +$filename=html_entity_decode($temparray['filename'], ENT_QUOTES, $default_charset); +// Fix For: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/2107 +$filename= $randomfilename . "_word.doc"; + +$filesize=$temparray['filesize']; +$wordtemplatedownloadpath =$root_directory ."/test/wordtemplatedownload/"; + +$handle = fopen($wordtemplatedownloadpath .$filename,"wb"); +fwrite($handle,base64_decode($fileContent),$filesize); +fclose($handle); + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> +$mass_merge = $_REQUEST['allselectedboxes']; +$single_record = $_REQUEST['record']; + +if($mass_merge != "") +{ + $mass_merge = explode(";",$mass_merge); + $temp_mass_merge = $mass_merge; + if(array_pop($temp_mass_merge)=="") + array_pop($mass_merge); + //$mass_merge = implode(",",$mass_merge); +}else if($single_record != "") +{ + $mass_merge = $single_record; +}else +{ + die("Record Id is not found, cannot merge the document"); +} + +//<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>> + +global $current_user; +require('user_privileges/user_privileges_'.$current_user->id.'.php'); +if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0 || $module == "Users" || $module == "Emails") +{ + $query1="select vtiger_tab.name,vtiger_field.tablename,vtiger_field.columnname,vtiger_field.fieldlabel from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid where vtiger_field.tabid in (4,6) and vtiger_field.block <> 75 order by vtiger_field.tablename and vtiger_field.presence in (0,2)"; + $params1 = array(); +} +else +{ + $profileList = getCurrentUserProfileList(); + $query1="select vtiger_tab.name,vtiger_field.tablename,vtiger_field.columnname,vtiger_field.fieldlabel from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid INNER JOIN vtiger_profile2field ON vtiger_profile2field.fieldid=vtiger_field.fieldid INNER JOIN vtiger_def_org_field ON vtiger_def_org_field.fieldid=vtiger_field.fieldid where vtiger_field.tabid in (4,6) and vtiger_field.block <> 75 AND vtiger_profile2field.visible=0 AND vtiger_def_org_field.visible=0 AND vtiger_profile2field.profileid IN (". generateQuestionMarks($profileList) .") and vtiger_field.presence in (0,2) GROUP BY vtiger_field.fieldid order by vtiger_field.tablename"; + $params1 = array($profileList); + //Postgres 8 fixes + if( $adb->dbType == "pgsql") + $query1 = fixPostgresQuery( $query1, $log, 0); +} +$result = $adb->pquery($query1, $params1); +$y=$adb->num_rows($result); + +for ($x=0; $x<$y; $x++) +{ + $tablename = $adb->query_result($result,$x,"tablename"); + $columnname = $adb->query_result($result,$x,"columnname"); + $modulename = $adb->query_result($result,$x,"name"); + + if($tablename == "crmentity") + { + if($modulename == "Accounts") + { + $tablename = "crmentityAccounts"; + } + } + $querycolumns[$x] = $tablename.".".$columnname; + if($columnname == "smownerid") + { + if($modulename == "Accounts") + { + $querycolumns[$x]="case when (usersAccounts.user_name not like '') then concat(usersAccounts.last_name,' ',usersAccounts.first_name) else groupsAccounts.groupname end as username"; + } + if($modulename == "Contacts") + { + $querycolumns[$x]="case when (vtiger_users.user_name not like '') then concat(vtiger_users.last_name,' ',vtiger_users.first_name) else vtiger_groups.groupname end as usercname,vtiger_users.first_name,vtiger_users.last_name,vtiger_users.user_name,vtiger_users.yahoo_id,vtiger_users.title,vtiger_users.phone_work,vtiger_users.department,vtiger_users.phone_mobile,vtiger_users.phone_other,vtiger_users.phone_fax,vtiger_users.email1,vtiger_users.phone_home,vtiger_users.email2,vtiger_users.address_street,vtiger_users.address_city,vtiger_users.address_state,vtiger_users.address_postalcode,vtiger_users.address_country"; + } + } + if($columnname == "parentid") + { + $querycolumns[$x] = "accountAccounts.accountname"; + } + if($columnname == "accountid") + { + $querycolumns[$x] = "accountContacts.accountname"; + } + if($columnname == "reportsto") + { + $querycolumns[$x] = "contactdetailsContacts.lastname"; + } + + + if($modulename == "Accounts") + { + $field_label[$x] = "ACCOUNT_".strtoupper(str_replace(" ","",$adb->query_result($result,$x,"fieldlabel"))); + } + + if($modulename == "Contacts") + { + $field_label[$x] = "CONTACT_".strtoupper(str_replace(" ","",$adb->query_result($result,$x,"fieldlabel"))); + if($columnname == "smownerid") + { + $field_label[$x] = $field_label[$x].",USER_FIRSTNAME,USER_LASTNAME,USER_USERNAME,USER_YAHOOID,USER_TITLE,USER_OFFICEPHONE,USER_DEPARTMENT,USER_MOBILE,USER_OTHERPHONE,USER_FAX,USER_EMAIL,USER_HOMEPHONE,USER_OTHEREMAIL,USER_PRIMARYADDRESS,USER_CITY,USER_STATE,USER_POSTALCODE,USER_COUNTRY"; + } + } + + +} +$csvheader = implode(",",$field_label); +//echo $csvheader; +//<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> + +if(count($querycolumns) > 0) +{ + $selectcolumns = implode($querycolumns,","); + + + $query = "select $selectcolumns from vtiger_contactdetails + inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_contactdetails.contactid + inner join vtiger_contactaddress on vtiger_contactdetails.contactid = vtiger_contactaddress.contactaddressid + inner join vtiger_contactsubdetails on vtiger_contactdetails.contactid = vtiger_contactsubdetails.contactsubscriptionid + inner join vtiger_contactscf on vtiger_contactdetails.contactid = vtiger_contactscf.contactid + inner join vtiger_customerdetails on vtiger_contactdetails.contactid = vtiger_customerdetails.customerid + left join vtiger_contactdetails as contactdetailsContacts on contactdetailsContacts.contactid = vtiger_contactdetails.reportsto + left join vtiger_account as accountContacts on accountContacts.accountid = vtiger_contactdetails.accountid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_account on vtiger_account.accountid = vtiger_contactdetails.accountid + left join vtiger_crmentity as crmentityAccounts on crmentityAccounts.crmid=vtiger_account.accountid + left join vtiger_accountbillads on vtiger_account.accountid=vtiger_accountbillads.accountaddressid + left join vtiger_accountshipads on vtiger_account.accountid=vtiger_accountshipads.accountaddressid + left join vtiger_accountscf on vtiger_account.accountid = vtiger_accountscf.accountid + left join vtiger_account as accountAccounts on accountAccounts.accountid = vtiger_account.parentid + left join vtiger_users as usersAccounts on usersAccounts.id = crmentityAccounts.smownerid + LEFT JOIN vtiger_groups as groupsAccounts + ON groupsAccounts.groupid = vtiger_crmentity.smownerid + where vtiger_crmentity.deleted=0 and (crmentityAccounts.deleted is NULL or crmentityAccounts.deleted <> 1) and vtiger_contactdetails.contactid in(". generateQuestionMarks($mass_merge) .")"; + + + $result = $adb->pquery($query, array($mass_merge)); + $avail_pick_arr = getAccessPickListValues('Contacts'); +while($columnValues = $adb->fetch_array($result)) +{ + $y=$adb->num_fields($result); + for($x=0; $x<$y; $x++) + { + $value = $columnValues[$x]; + foreach($columnValues as $key=>$val) + { + if($val == $value && $value != '') + { + if(array_key_exists($key,$avail_pick_arr)) + { + if(!in_array($val,$avail_pick_arr[$key])) + { + $value = "Not Accessible"; + } + } + } + } + //<<<<<<<<<<<<<<< For blank Fields >>>>>>>>>>>>>>>>>>>>>>>>>>>> + if(trim($value) == "--None--" || trim($value) == "--none--") + { + $value = ""; + } + //<<<<<<<<<<<<<<< End >>>>>>>>>>>>>>>>>>>>>>>>>>>> + $actual_values[$x] = $value; + $actual_values[$x] = str_replace('"'," ",$actual_values[$x]); + //if value contains any line feed or carriage return replace the value with ".value." + if (preg_match ("/(\r\n)/", $actual_values[$x])) + { + $actual_values[$x] = '"'.$actual_values[$x].'"'; + } + $actual_values[$x] = decode_html(str_replace(","," ",$actual_values[$x])); + } + $mergevalue[] = implode($actual_values,","); +} +$csvdata = implode($mergevalue,"###"); +}else +{ + die("No fields to do Merge"); +} +// Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/2107 +$datafilename = $randomfilename . "_data.csv"; + +$handle = fopen($wordtemplatedownloadpath.$datafilename,"wb"); +fwrite($handle,$csvheader."\r\n"); +fwrite($handle,str_replace("###","\r\n",$csvdata)); +fclose($handle); + +?> + + + diff --git a/oss/vtiger/trunk/modules/Contacts/Popup.php b/oss/vtiger/trunk/modules/Contacts/Popup.php new file mode 100644 index 00000000..98ea8ece --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/Popup.php @@ -0,0 +1,23 @@ + diff --git a/oss/vtiger/trunk/modules/Contacts/ProcessDuplicates.php b/oss/vtiger/trunk/modules/Contacts/ProcessDuplicates.php new file mode 100644 index 00000000..877dbd84 --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/ProcessDuplicates.php @@ -0,0 +1,133 @@ +pquery("SELECT count(*) AS count FROM vtiger_crmentity WHERE crmid=? and deleted=0", array($merge_id)); + $count = $adb->query_result($result,0,'count'); + + if($count > 0) + { + // First, save the primary record + $focus->mode="edit"; + setObjectValuesFromRequest($focus); + $focus->save($module); + $rec_values=$focus->column_fields; + + // Remove the id of primary record from the list of records to be deleted. + $del_value=explode(",",$recordids,-1); + $offset = array_search($merge_id,$del_value); + unset($del_value[$offset]); + + // Transfer the related lists of the records to be deleted, to the primary record's related list + if(method_exists($focus, 'transferRelatedRecords')){ + $focus->transferRelatedRecords($module,$del_value,$merge_id); + } else { + transferRelatedRecords($module,$del_value,$merge_id); + } + + // Delete the records by id specified in the list + foreach($del_value as $value) + { + DeleteEntity($_REQUEST['module'],$_REQUEST['return_module'],$focus,$value,""); + } + } + + ?> + +assign("EDIT_DUPLICATE",""); + if($record_count == 2) { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + else { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[2]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[2]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + + $all_values_array=getRecordValues($exploded_id,$module); + $all_values=$all_values_array[0]; + $js_arr_val=$all_values_array[1]; + $fld_array=$all_values_array[2]; + $js_arr=implode(",",$js_arr_val); + + $imported_records = Array(); + $sql="select bean_id from vtiger_users_last_import where bean_type=? and deleted=0"; + $result = $adb->pquery($sql, array($module)); + $num_rows=$adb->num_rows($result); + $count=0; + for($i=0; $i<$num_rows;$i++) + { + foreach($exploded_id as $value) + if($value == $adb->query_result($result,$i,"bean_id")) + $count++; + array_push($imported_records,$adb->query_result($result,$i,"bean_id")); + } + + if ($record_count == $count) + $no_existing=1; + else + $no_existing=0; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("RECORD_COUNT",$record_count); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULENAME", $module); + $smarty->assign("PARENT_TAB", $parent_tab); + $smarty->assign("JS_ARRAY", $js_arr); + $smarty->assign("ID_ARRAY", $exploded_id); + $smarty->assign("IDSTRING",$idstring); + $smarty->assign("ALLVALUES", $all_values); + $smarty->assign("FIELD_ARRAY", $fld_array); + $smarty->assign("IMPORTED_RECORDS", $imported_records); + $smarty->assign("NO_EXISTING", $no_existing); + $smarty->display("MergeFields.tpl"); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Contacts/QuickCreate.php b/oss/vtiger/trunk/modules/Contacts/QuickCreate.php new file mode 100644 index 00000000..8d5998b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/QuickCreate.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Contacts/Save.php b/oss/vtiger/trunk/modules/Contacts/Save.php new file mode 100644 index 00000000..d5104a97 --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/Save.php @@ -0,0 +1,223 @@ +email_opt_out = 'off'; +if (!isset($_REQUEST['do_not_call'])) $focus->do_not_call = 'off'; + +//Checking If image is given or not +//$image_upload_array=SaveImage($_FILES,'contact',$focus->id,$focus->mode); +$image_name_val=$image_upload_array['imagename']; +$image_error="false"; +$errormessage=$image_upload_array['errormessage']; +$saveimage=$image_upload_array['saveimage']; + +//code added for returning back to the current view after edit from list view +if($_REQUEST['return_viewname'] == '') $return_viewname='0'; +if($_REQUEST['return_viewname'] != '')$return_viewname=vtlib_purify($_REQUEST['return_viewname']); + +if($image_error=="true") //If there is any error in the file upload then moving all the data to EditView. +{ + //re diverting the page and reassigning the same values as image error occurs + if($_REQUEST['activity_mode'] != '')$activity_mode=vtlib_purify($_REQUEST['activity_mode']); + if($_REQUEST['return_module'] != '')$return_module=vtlib_purify($_REQUEST['return_module']); + if($_REQUEST['return_action'] != '')$return_action=vtlib_purify($_REQUEST['return_action']); + if($_REQUEST['return_id'] != '')$return_id=vtlib_purify($_REQUEST['return_id']); + + $log->debug("There is an error during the upload of contact image."); + $field_values_passed.=""; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname])) + { + $log->debug("Assigning the previous values given for the contact to respective vtiger_fields "); + $field_values_passed.="&"; + $value = $_REQUEST[$fieldname]; + $focus->column_fields[$fieldname] = $value; + $field_values_passed.=$fieldname."=".$value; + + } + } + $values_pass=$field_values_passed; + $encode_field_values=base64_encode($values_pass); + + $error_module = "Contacts"; + $error_action = "EditView"; + + $return_action .= '&activity_mode='.vtlib_purify($_request['activity_mode']); + + if($mode=="edit") { + $return_id=vtlib_purify($_REQUEST['record']); + } + header("location: index.php?action=$error_action&module=$error_module&record=$return_id&return_id=$return_id&return_action=$return_action&return_module=$return_module&activity_mode=$activity_mode&return_viewname=$return_viewname".$search."&saveimage=$saveimage&error_msg=$errormessage&image_error=$image_error&encode_val=$encode_field_values"); +} +if($saveimage=="true") +{ + $focus->column_fields['imagename']=$image_name_val; + $log->debug("Assign the Image name to the vtiger_field name "); +} + +//if image added then we have to set that $_FILES['name'] in imagename field then only the image will be displayed +if($_FILES['imagename']['name'] != '') +{ + if(isset($_REQUEST['imagename_hidden'])) { + $focus->column_fields['imagename'] = vtlib_purify($_REQUEST['imagename_hidden']); + } else { + $focus->column_fields['imagename'] = $_FILES['imagename']['name']; + } +} +elseif($focus->id != '') +{ + $result = $adb->pquery("select imagename from vtiger_contactdetails where contactid = ?", array($focus->id)); + $focus->column_fields['imagename'] = $adb->query_result($result,0,'imagename'); +} + +if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} +//Saving the contact +if($image_error=="false") +{ + $focus->save("Contacts"); + $return_id = $focus->id; + + if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); + else $return_module = "Contacts"; + if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); + else $return_action = "DetailView"; + if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + + if(isset($_REQUEST['activity_mode']) && $_REQUEST['activity_mode'] != '') $activitymode = vtlib_purify($_REQUEST['activity_mode']); + + $local_log->debug("Saved record with id of ".$return_id); + + if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] == "Campaigns") + { + if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") + { + $sql = "delete from vtiger_campaigncontrel where contactid = ?"; + $adb->pquery($sql, array($focus->id)); + $sql = "insert into vtiger_campaigncontrel values (?,?)"; + $adb->pquery($sql, array($_REQUEST['return_id'], $focus->id)); + } + } + + //BEGIN -- Code for Create Customer Portal Users password and Send Mail + if($_REQUEST['portal'] == '' && $_REQUEST['mode'] == 'edit') + { + $sql = "update vtiger_portalinfo set user_name=?,isactive=0 where id=?"; + $adb->pquery($sql, array($_REQUEST['email'], $_REQUEST['record'])); + } + elseif($_REQUEST['portal'] != '' && $_REQUEST['email'] != '')// && $_REQUEST['mode'] != 'edit') + { + $id = $_REQUEST['record']; + $username = $_REQUEST['email']; + + if($_REQUEST['mode'] != 'edit') + $insert = 'true'; + + $sql = "select id,user_name,user_password,isactive from vtiger_portalinfo"; + $result = $adb->pquery($sql, array()); + + for($i=0;$i<$adb->num_rows($result);$i++) + { + if($id == $adb->query_result($result,$i,'id')) + { + $dbusername = $adb->query_result($result,$i,'user_name'); + $isactive = $adb->query_result($result,$i,'isactive'); + + if($username == $dbusername && $isactive == 1) + $flag = 'true'; + else + { + $sql = "update vtiger_portalinfo set user_name=?, isactive=1 where id=?"; + $adb->pquery($sql, array($username, $id)); + $update = 'true'; + $flag = 'true'; + $password = $adb->query_result($result,$i,'user_password'); + } + } + } + if($flag != 'true') + $insert = 'true'; + else + $insert = 'false'; + + if($insert == 'true') + { + $password = makeRandomPassword(); + $sql = "insert into vtiger_portalinfo values(?,?,?,?,?,?,?,?)"; + $params = array($focus->id, $username, $password, 'C', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1); + $adb->pquery($sql, $params); + } + + //changes made to send mail to portal user when we use ajax edit + $data_array = Array(); + $data_array['first_name'] = $_REQUEST['firstname']; + $data_array['last_name'] = $_REQUEST['lastname']; + $data_array['email'] = $_REQUEST['email']; + $data_array['portal_url'] = ''.$mod_strings['Please Login Here'].''; + + $value = getmail_contents_portalUser($data_array,$password,"LoginDetails"); + $contents=$value["body"]; $subject=$value["subject"]; + + $log->info("Customer Portal Information Updated in database and details are going to send => '".$_REQUEST['email']."'"); + if($insert == 'true' || $update == 'true') + { + $mail_status = send_mail('Support',$_REQUEST['email'],$current_user->user_name,'',$subject,$contents); + } + $log->info("After return from the SendMailToCustomer function. Now control will go to the header."); + } + //END -- Code for Create Customer Portal Users password and Send Mail + + $log->info("This Page is redirected to : ".$return_module." / ".$return_action."& return id =".$return_id); + + //code added for returning back to the current view after edit from list view + if($_REQUEST['return_viewname'] == '') $return_viewname='0'; + if($_REQUEST['return_viewname'] != '')$return_viewname=vtlib_purify($_REQUEST['return_viewname']); + + $parenttab = getParentTab(); + + //Send notification mail to the assigned to owner about the contact creation + if($focus->column_fields['notify_owner'] == 1 || $focus->column_fields['notify_owner'] == 'on') + $status = sendNotificationToOwner('Contacts',$focus); + + header("Location: index.php?action=$return_action&module=$return_module&parenttab=$parenttab&record=$return_id&activity_mode=$activitymode&viewname=$return_viewname&start=".vtlib_purify($_REQUEST['pagenumber'])); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Contacts/Settings.php b/oss/vtiger/trunk/modules/Contacts/Settings.php new file mode 100644 index 00000000..48a80c0b --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/Settings.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Contacts/TagCloud.php b/oss/vtiger/trunk/modules/Contacts/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Contacts/UnifiedSearch.php b/oss/vtiger/trunk/modules/Contacts/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Contacts/contactSeedData.php b/oss/vtiger/trunk/modules/Contacts/contactSeedData.php new file mode 100644 index 00000000..ff2881ae --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/contactSeedData.php @@ -0,0 +1,21190 @@ + diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/2tbarPrivateChat.gif b/oss/vtiger/trunk/modules/Contacts/imgs/2tbarPrivateChat.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0d7a1f55e7c93fe98c17a879d35ded75e2b0a3e GIT binary patch literal 718 zcmZ?wbhEHblwgoxc$UfV*oj8uV3G|apSXR&w6@#wr}4a6%}>v+_{-ECver$SXkJDyQ_M88hd*ickP^e=Jc{PYo@PQ-dA2;K4Zp= z*4EZ_YnoRqZ@YA1X<&eDdwcuqR~ueF-_YIN^y0;f{{F6O*RD;RSl`p#v~+R()2B}- zOz7+D&7IKS^YiD={QTJdzK)ujnjb%Y?Ay0*$&w}A-Q5cp^j^QVysx)iLqns#zk9-j z-oD-KJkZ-_t($s0wXC%p_$2F&?Em*i{@j~z9 zc?>HV40Lp*l$4}&bqrQ9L@#ejXWXMEAjm7GtSrVWD4@27(RXKNIuDN=AAiQxYghUC za8g>>|||B&2>Fn9;6QKYbt#d6rZlIi%A)F3UJjd%=__R{TQi}c@f0hkc9n|6quvHz zCbI?)N8!Z`QmprI_5cD$4=BhFzP{j1K&M?jIRrm5B2GL+U;>r zWIo!>ZzFK#gV?gQ6ErNe*KL{WybgInQTjfC7Ux07t=4=l}o! literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/2tbarPublicChat.gif b/oss/vtiger/trunk/modules/Contacts/imgs/2tbarPublicChat.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c8d42d1c07f245edef294b789235c8e505810fc GIT binary patch literal 742 zcmZ?wbhEHblwgoxcvi>|6&3a4`>X5MuYdpg^zG|SPabcPl$3n+eACmXPfwma`RL)+ z=TA3({ruq5r%zwMesy`2w{G3KjT<*^-@bj_nx+%S_RO5o z_xaQ9w{PF}^mNwLRDXDT!O+m~?wuVICr-R~Z`-e5zpAUNe*gYGbLNDep2n`Ori${2 zPam$VUEBZu&FP$+oD;{lFIhbQ@S$DLpWoiOW9`O`YhS#0(cjmxbH{?7?xyzk_Js?2 zTU%S-zkl!L<+Xn8!_Mbar;Ds8&@pvn=xa? zgbBSzjvTpsdF{`iKU0!DlM_A9oL)9}?%e+Vt{*>sl$V$H^|noz(3g5+T)^uBz);q|KxE-o$`);GU@x9Rt< z&zCP>{`hgjub=PB%F6zO0Z=`WK=CIFBLhPrgAPbNC{7sI|2GsiHMg|3wRd#3<@faV z_4l^sn`BR&Hho66Nxn^Ue%^wGixw{o&zZ-#lF`V}Kvqsp*1*tc6{Gj^rhMi-lEUIl zGAb%EOya_ldzjsJ7UuKt7>fxOT)lQxP|Wy3?Ad&2eNn#aPYU=%^`(RFX{!r7eJY@? zZFWyyRqaCoM-WGWnyOvK$7@c9t&2DX8Wu1x9Tex)T~onb=zPaikU@^2fti7q!ALQv zLfUZAi7i>YJSGATjC`z&nzK8;ELos7A>Q;sN5zB#QBCabA~_$!7GyMPSgtsbc!}Ae zIg4Qfk7mQ++fA#vOEwfL9cf^(U^;MUVnPBBS3ditqClsVc7A9YJ%d)tzZHRy*~lGCx! z(!4w?^Joee5H&V3oK8lAxHBFli@9V*=4T`>j)KL!6l2LmEX2_PMEgtga$1aNH4Q42 ziVjb*Vc)3}N4@SlU0v;285J@@nDp=r9*y9UfE#mLV~n37T-?^#I*Q@9I7u#CizKD#W28Ojr9aUtpt`6oI%+6b>L6%XPM z?>TK_0nEc_@O+!B6wN2Gv) znMYiLqd3}+Xd<0Li*phHpi-&)^Z%sjk5U1E1?bnK>ra5{={Vd_r2r0>+c^PuY*E)@ zKEiml{}K#_B2;)P$}%+Kxp+)4Z>_F_lAP`{U7O9#<;~fJ#rdUT;aTbVlWl`F+hKVH zULL$Mu=?uF%hzu|et7@x)7Q`6zI=z9RhyJQ)_%40f<~x0(_9Z54iD^xojuCaaKGW8 z7VaEzog|i5R2qG*ym4PuPe|LL*1vG9b=PQjMF{gx!J(+z<6(_M<>lH#d)w=8@aI;2 Ox;D#AgGr|b$NmDgjp|_l literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/box_BR.gif b/oss/vtiger/trunk/modules/Contacts/imgs/box_BR.gif new file mode 100644 index 0000000000000000000000000000000000000000..44b171d5bab13e2e6ecbe2e1e494e99e2bb6e6fc GIT binary patch literal 609 zcmchU%Tp3@0DylQ3|5e#&eTC1%va6S)RZ<+%`{mO1{pi$8!?nh|MIrKtWMx^F z1>9wSyRZnX3nEXE%9-pr)BA0mtV4f6hdNRI6Mcv8`W?PgXY_}3SLEO*_-O=@FgeQy z?w6zmDS~Ej0a4@EP3Z*d$8AxTEaws#DKal|QRFY@MLtZ%_y9-y5KUA{QaT=L(KIU* z3OYC)4tkCsJM4De?CIH`l~6Gw1W8wf!PyWV@;Nc5nP&*fYfmTW#cX_N@LUXeY4YyQ zt~T6lAw82fu9>X2#>82=zwe|d1S#B(LRdy*NRL&D2N}v04dVh!1PDj>fqh=LB^mYO zQ@3rFaUW*o=xLh5q&S1!F?V&gTg_vap&=fjTD6)~oF%Xc61VY;Z(c;@e6ms$qlgrc zKQqV0IEteQM0?Xov{VoQ0M%;spZ_PVe`GZP7{TuK==u|&Se^hi8*1UC-Dz{wZ{6Go zF%LX%7#<|4pg#}_GxQA0qX-v;YPs@KaxQgos6Ug<=ioxAT)ekfc(AlwfeotBEsvf& z8@Vt#0AIX%^YZoEk00K@`?UJ`>z8k`jfzch?FZC?zD~Hk?Suwy8`;|odu6A)VaqOE z2dwK|-mcCRMiB{Dec3@wQAK4rQ!GY71vbb9_7_lUat3P OjD;p$!|+)xIPw?7>+CN8 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/box_M.gif b/oss/vtiger/trunk/modules/Contacts/imgs/box_M.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1fa15eac3c7730f1a1ceb9644a5e207b187807c GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcKtb>##D1B2pE79h#MpaUX6G7L;iE{qJ;0J&TSaR2}S literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/box_ML.gif b/oss/vtiger/trunk/modules/Contacts/imgs/box_ML.gif new file mode 100644 index 0000000000000000000000000000000000000000..559ccf08f4ae01f2688d7d6365d2b46e94e0098d GIT binary patch literal 55 zcmZ?wbh9u|WMyDvIK;|u|K{0SS5CZtar@u*mkbOH|6xD}$YB7fVPIzQP!`~1um%9m C%@*ze literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/box_MR.gif b/oss/vtiger/trunk/modules/Contacts/imgs/box_MR.gif new file mode 100644 index 0000000000000000000000000000000000000000..dd798fc535213a3e3a99e1442f149411600268da GIT binary patch literal 63 zcmZ?wbhEHbWMyDvSj50^|K{0SS5CZtar@u*mkdZi@h1zIrvoBEY8jYWBov%E8LR<) C4i54F literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/box_T.gif b/oss/vtiger/trunk/modules/Contacts/imgs/box_T.gif new file mode 100644 index 0000000000000000000000000000000000000000..d09eb43cdd9ea25ba318c92754d76dfaf1e06df2 GIT binary patch literal 96 zcmZ?wbhEHbWMoid*v!Dt)ml1bLj9BpExlb$A|iraEv3C36`d_5oh_vd*nr|s7O=1m ahyRz>JaM>?spkx?9USTS_`xO1s<2 zru5bIcU3VkF#P}jA4t*;DE?$&WMEKW&;eNi@)HA_pTmR=0fJFXA{QPu9duz5>S;Rz>JaM>?spkx?9USTS_`xO1s<2 zru5bIcU3VkF#P}jA4t*;DE?$&WMEKW&;eNi@)HA_?*T7HmnAGZE{${ENp0M%x!LKm2dCr P?C$HG&@w64k--`ODMe6` literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/btn_close.gif b/oss/vtiger/trunk/modules/Contacts/imgs/btn_close.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d7b0f84699ae83d424c226f499f629c446004c2 GIT binary patch literal 244 zcmZ?wbhEHblw*)*XyIpYak2>y@iH{f&CQH4Hqy_{jJ3D5Ff%nYGck0qv&hSeH8RxC z%Zlr4Dd}t}{r~^Jfxa$~BpxXKWMO0gTBXAP1Ry&dSPLJh_oZacQ(m$z=k>lvx9z?t zZ~nOU^rDUbSG&A(3l=SPe$ca~jC zS3fvYRYLHYu9GPL&BuR>8?@u26CD!#tXpDgbeody@iH{f&CQH4Hqy_{jJ3D5Ff%nYGck0qv&hSeH8RxC z%Zlr4Dd}t}{r~^Jfxa$DNbx5NBLmPX9R?r(+3CQV`9QrdC3Bwgl65(+_dPmoSE9TA zR2m3I%>+39t}in+G4%3q@$zt`DLs|2NRr1(Ik$@h1x- z1A{z+4g(N?>~vsV_dvZbC39ZJs%4R{_Z8@zFOlsw>rH&i_j#u5h3m}EjCL$8I+@cu z>w?CcnV39<|?pMsI z))!|hadhSjtMT>*@@nx+3gA&snVy)@JtvK$V?p5JCGCaF6PH;vSJ}I@*3_-^iLHvY tvD>uSeU0&+a@*SVN4@s1vOICp^z@m6^GnZN)XThbO8e%m+jkThtN|4yj@AGG literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/bx_B.gif b/oss/vtiger/trunk/modules/Contacts/imgs/bx_B.gif new file mode 100644 index 0000000000000000000000000000000000000000..f6d8e815ec3662673ff1104cea7c8d5b3c08148a GIT binary patch literal 165 zcmZ?wbhEHbWMr^mIKsd%YkF@-OGRHt?WCT@{;s--Jq;7O>yzWdXH4myHMM8%jQ%;( z`^t(kCigW>>2F>zXY#yR6X(yGG;e1A!a0){%$_uF)`a=9CNkg#ia%Mvk~$y~WG4fw q(gPJc{?vIIqOM`D_ldEDmgI&{TB767WYOz*&_RGjqTQQ=!5RQ@4mN`T literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/close.gif b/oss/vtiger/trunk/modules/Contacts/imgs/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e157ce88f0d3da43e59d5e877007aeb7524bb89 GIT binary patch literal 400 zcmV;B0dM|CNk%w1VGjTg0Hr(t000082nZ1o5gZ&GDJdy8H#a&uIz>fARaI4BU|?ls zWp;LUiHV7#qN2LGy2;7O%F4>j%*@Wt&d<-!(9qD)(b3b>)7910*4Eb8*x1?G+1lFL z+uPgR+}z#W-QM2b-{0Th;Naom;o{=ruz*=jZ3>=;-O`>FVn0>+9?6 z?CkCB?e6aG@9*#M@bK~R@$>WZ^z`)g_4W4l_V@Sq`1ttw`T6?#`u+X=|NsC0|NsC0 z|NsC0A^8LW3IIOS918^;7Zy+`PEQyd1qlI{ zn3#}>*u(n( literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/hide.gif b/oss/vtiger/trunk/modules/Contacts/imgs/hide.gif new file mode 100644 index 0000000000000000000000000000000000000000..96ef9a15dd98e71cd11bf946383863cf9dd0e6bc GIT binary patch literal 410 zcmV;L0cHM2Nk%w1VGjTg0Hr+u000082nZ1o5gZ&GDJdy8H#a&uIz>fARaI4BU|?ls zWp;LUiHV7#qN2LGy2;7O%F4>j%*@Wt&d<-!(9qD)(b3b>)7910*4Eb8*x1?G+1lFL z+uPgR+}z#W-QM2b-{0Th;Naom;o{=ruz*=jZ3>=;-O`>FVn0>+9?6 z?CkCB?e6aG@9*#M@bK~R@$&NW^Yioc^z`-h_4fAm_xJbs`1twx`TF|${r&y_|NsC0 z|NsC0A^8LW3IIO0SL3k4h(766u) zmKYob2?3s;pq~aLG&MUnF)mOkCLxk0Gp?V*n`Z&(W-%iU}Y zFp#LSf8c)nvuvD~Xy=!nx(J;WrO9uqc-2nwqxAevT zJrR!#bcFhksZ8Q{{i5iC`tqG2QL9g=sh+wzb;WgqZ7bf+Ds|jg6;rqC{GKKzkN+%B zTKCkQfB*Y4S7TFiOKV$ETW1$nMNeP%gvQ?9i4!}f&ZwC&jnS25`s{Z0#fuj#Y++@S tWnZ?uY31s*>v~qntl8YUVcVv48`#*k?`URa-p|goXC1@o)1870)&Mhvbk+a> literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/site_bg.gif b/oss/vtiger/trunk/modules/Contacts/imgs/site_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..a638838f353eae3c315b58c57631acca368387d0 GIT binary patch literal 1213 zcmV;u1VZ~qNk%w1VF3Wp2j&0(aBgQYFDO}7P-$jhWMNxnV_b`ffip2GU|m*RSyFp= za$QAE^~2eP)$ZmNkdgrOoM=WJv%f=ML#?_GfhfE zK|VN1M?gbCI)Q$8e|&XlWnX-HbAWz#VP05yc5r%kaCdcXIW{nDYGibBYjbdEa&T!= zP)crWWk5YQM?^kmWL<7+WHT@-YiMF)U|DBmU0+;QS5!?~SW-7ME<->%Qcp-wPDeX9 zF+@T;PfSKXJT^W&HAX``OGrU7Fe#FdiI9$mHZ(1bi-e1bf{BNKJ2^6jgng5dih_W7 zgo1lQKsl6=ic3jCe|>h7kcv)BMSXj8cy@1gbZwH4h-zqIUR+gLSW$0nW^r$5k&lRD zVOm#JPLYm?Y-(eVjD?SlhLDYhkBo+ni-nDfgN}@ajEaMbhk=NOe~gKPIX5tdgM5O2 zd4z#_fPHs~hJZ#yJ$7?!etUItZ)tjXag>pZQcy{3X<}htSbKSLA^8LV00000EC2ui z0098d2LK2EfB}MogoTEOh=N6njE#USn3rqezniS;~}x)2C3O_Lxews#U8zvTEJRbt|8*VEMEdOE!YpvuM+*O>3d8 z+qZE4X#wd>cd{m7n8yEg3_xO3~y9j3SM-@OS4A5MIDf#b-N zD_@>GhV$n(qD!AHJ%sh^*sl-R&b_<$@7=eEA5XqKc^c@`_gT-rJ$o|nY?QS zl6olMqc;>069DMfa=bujmD(IkuUSQ~#x5WAndTj7CWpG z$R?}ovdX^U?6c3ZA?>u(s$uQ5*e0Rvw%m5xZ5rT)EAATPmTPVq=%%Y~8ECZY?z?E1 zA@98OnsLUx_~v`Y5&ZV+@4o=^JI25S7d$W+2q&yC!df)!@WT!pA@Rf%S8Q<_#Z_di b@x~iF;qk{Hhb+a&B$sUR9w?{0M<4(@G@np^ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Contacts/imgs/user_icon.gif b/oss/vtiger/trunk/modules/Contacts/imgs/user_icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..724727cccfecd9f5b86fc9fb119c3315c05d3ce9 GIT binary patch literal 1111 zcmeH`{WH@69DqNY!gp!Ljb4aZbh&h?R&mvl=DkGMb=CR7$VI2M$|9*7Wf;5A>P)&U z^VSQyGU?5YA%wDC(5`M)w~IP0Wj3Zy^+)tu&p+_oJ$FxdWLQ8ThYoa@5rIXCw>N>g z0eL*$Y#YvYVzmd<_<&iC^B-~EYPF8y&1F!(7OZb@MvA|t(9(!EoB)UT*B#(qG|aZ+ zTrXNb;M@S--3}&`$$QI1{L(2FiyQo5Vq(HzFyN1O_+HBA^YMAIDpNmN7KEc>9FwPq ztgiEgzKm3Sm8DjzXCL9rWvs9PDH)W7+W84=+5u=D$H{)2xA5X0SS%J{(9-a5S#53Y z+)K1-u%$wqeNKSGLceWgMxD9Z9h9jNsnIcSMK=Zq2XR_26bcQ>Dtwc>?;saH-kzMC z^w?Nb$MigrrR+%AtGSldULzlFu9u$akBBM!Q1`u(fO^G{sTiwVp)q9f)qpKUXQ4a(mdxQRfLGC%LPHX(vfj=mn&8&MiF=&0&`)G@ma^ z6Cl6O&DXD7UaqK?GilCK#R(jnXP!>Jhw2r#dPK|UE7&8kCzIF}D-XK}q{hxcF*UKG z@@3@dJ(WZVRhGgjpgFGC|1j8?^od>QoLK@iLCVf`P;{S9 diff --git a/oss/vtiger/trunk/modules/Contacts/language/en_us.lang.php b/oss/vtiger/trunk/modules/Contacts/language/en_us.lang.php new file mode 100644 index 00000000..ac90dd61 --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/language/en_us.lang.php @@ -0,0 +1,249 @@ +'Contacts', +'LBL_INVITEE'=>'Direct Reports', +'LBL_MODULE_TITLE'=>'Contacts: Home', +'LBL_SEARCH_FORM_TITLE'=>'Contact Search', +'LBL_LIST_FORM_TITLE'=>'Contact List', +'LBL_NEW_FORM_TITLE'=>'New Contact', +'LBL_CONTACT_OPP_FORM_TITLE'=>'Contact-Opportunity:', +'LBL_CONTACT'=>'Contact:', + +'LBL_LIST_NAME'=>'Name', +'LBL_LIST_LAST_NAME'=>'Last Name', +'LBL_LIST_FIRST_NAME'=>'First Name', +'LBL_LIST_CONTACT_NAME'=>'Contact Name', +'LBL_LIST_TITLE'=>'Title', +'LBL_LIST_ACCOUNT_NAME'=>'Account Name', +'LBL_LIST_EMAIL_ADDRESS'=>'Email', +'LBL_LIST_PHONE'=>'Phone', +'LBL_LIST_CONTACT_ROLE'=>'Role', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_last_name' => 'LBL_LIST_LAST_NAME', +'db_first_name' => 'LBL_LIST_FIRST_NAME', +'db_title' => 'LBL_LIST_TITLE', +'db_email1' => 'LBL_LIST_EMAIL_ADDRESS', +'db_email2' => 'LBL_LIST_EMAIL_ADDRESS', +//END DON'T CONVERT + +'LBL_EXISTING_CONTACT' => 'Used an existing contact', +'LBL_CREATED_CONTACT' => 'Created a new contact', +'LBL_EXISTING_ACCOUNT' => 'Used an existing vtiger_account', +'LBL_CREATED_ACCOUNT' => 'Created a new vtiger_account', +'LBL_CREATED_CALL' => 'Created a new call', +'LBL_CREATED_MEETING' => 'Created a new meeting', +'LBL_ADDMORE_BUSINESSCARD' =>'Add another business card', + +'LBL_BUSINESSCARD' => 'Business Card', + +'LBL_NAME'=>'Name:', +'LBL_CONTACT_NAME'=>'Contact Name:', +'LBL_CONTACT_INFORMATION'=>'Contact Information', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', +'LBL_FIRST_NAME'=>'First Name:', +'LBL_OFFICE_PHONE'=>'Office Phone:', +'LBL_ACCOUNT_NAME'=>'Account Name:', +'LBL_ANY_PHONE'=>'Any Phone:', +'LBL_PHONE'=>'Phone:', +'LBL_LAST_NAME'=>'Last Name:', +'LBL_MOBILE_PHONE'=>'Mobile:', +'LBL_HOME_PHONE'=>'Home:', +'LBL_LEAD_SOURCE'=>'Lead Source:', +'LBL_OTHER_PHONE'=>'Other Phone:', +'LBL_FAX_PHONE'=>'Fax:', +'LBL_TITLE'=>'Title:', +'LBL_DEPARTMENT'=>'Department:', +'LBL_BIRTHDATE'=>'Birthdate:', +'LBL_EMAIL_ADDRESS'=>'Email:', +'LBL_OTHER_EMAIL_ADDRESS'=>'Other Email:', +'LBL_ANY_EMAIL'=>'Any Email:', +'LBL_REPORTS_TO'=>'Reports To:', +'LBL_ASSISTANT'=>'Assistant:', +'LBL_YAHOO_ID'=>'Yahoo! ID:', +'LBL_ASSISTANT_PHONE'=>'Assistant Phone:', +'LBL_DO_NOT_CALL'=>'Do Not Call:', +'LBL_EMAIL_OPT_OUT'=>'Email Opt Out:', +'LBL_PRIMARY_ADDRESS'=>'Primary Address:', +'LBL_ALTERNATE_ADDRESS'=>'Other Address:', +'LBL_ANY_ADDRESS'=>'Any Address:', +'LBL_CITY'=>'City:', +'LBL_STATE'=>'State:', +'LBL_POSTAL_CODE'=>'Postal Code:', +'LBL_COUNTRY'=>'Country:', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', +'LBL_IMAGE_INFORMATION'=>'Contact Image Information:', +'LBL_ADDRESS_INFORMATION'=>'Address Information', +'LBL_DESCRIPTION'=>'Description:', +'LBL_CONTACT_ROLE'=>'Role:', +'LBL_OPP_NAME'=>'Opportunity Name:', +'LBL_DUPLICATE'=>'Potential Duplicate Contacts', +'MSG_DUPLICATE' => 'Creating this contact may vtiger_potentialy create a duplicate contact. You may either select a contact from the list below or you may click on Create New Contact to continue creating a new contact with the previously entered data.', + +'LNK_NEW_APPOINTMENT' => 'New Appointment', +'LBL_ADD_BUSINESSCARD' => 'Add Business Card', +'NTC_DELETE_CONFIRMATION'=>'Are you sure you want to delete this record?', +'NTC_REMOVE_CONFIRMATION'=>'Are you sure you want to remove this contact from this case?', +'NTC_REMOVE_DIRECT_REPORT_CONFIRMATION'=>'Are you sure you want to remove this record as a direct vtiger_report?', +'ERR_DELETE_RECORD'=>"en_us A record number must be specified to delete the contact.", +'NTC_COPY_PRIMARY_ADDRESS'=>'Copy primary address to alternate address', +'NTC_COPY_ALTERNATE_ADDRESS'=>'Copy alternate address to primary address', + +'LBL_SELECT_CONTACT'=>'Select Contact', +//Added for search heading +'LBL_GENERAL_INFORMATION'=>'General Information', + + + +//for v4 release added +'LBL_NEW_POTENTIAL'=>'New Potential', +'LBL_POTENTIAL_TITLE'=>'Potentials', + +'LBL_NEW_TASK'=>'New Task', +'LBL_TASK_TITLE'=>'Tasks', +'LBL_NEW_CALL'=>'New Call', +'LBL_CALL_TITLE'=>'Calls', +'LBL_NEW_MEETING'=>'New Meeting', +'LBL_MEETING_TITLE'=>'Meetings', +'LBL_NEW_EMAIL'=>'New Email', +'LBL_EMAIL_TITLE'=>'Emails', +'LBL_NEW_NOTE'=>'New Document', +'LBL_NOTE_TITLE'=>'Documents', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Contact Tools', + +'Salutation'=>'Salutation', +'First Name'=>'First Name', +'Office Phone'=>'Office Phone', +'Last Name'=>'Last Name', +'Mobile'=>'Mobile', +'Account Name'=>'Account Name', +'Home Phone'=>'Home Phone', +'Lead Source'=>'Lead Source', +'Other Phone'=>'Other Phone', +'Title'=>'Title', +'Fax'=>'Fax', +'Department'=>'Department', +'Birthdate'=>'Birthdate', +'Email'=>'Email', +'Reports To'=>'Reports To', +'Assistant'=>'Assistant', +'Yahoo Id'=>'Yahoo Id', +'Assistant Phone'=>'Assistant Phone', +'Do Not Call'=>'Do Not Call', +'Email Opt Out'=>'Email Opt Out', +'Assigned To'=>'Assigned To', +'Campaign Source'=>'Campaign Source', +'Reference' =>'Reference', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Mailing Street'=>'Mailing Street', +'Other Street'=>'Other Street', +'Mailing City'=>'Mailing City', +'Mailing State'=>'Mailing State', +'Mailing Zip'=>'Mailing Postal Code', +'Mailing Country'=>'Mailing Country', +'Mailing Po Box'=>'Mailing PO Box', +'Other Po Box'=>'Other PO Box', +'Other City'=>'Other City', +'Other State'=>'Other State', +'Other Zip'=>'Other Postal Code', +'Other Country'=>'Other Country', +'Contact Image'=>'Contact Image', +'Description'=>'Description', + +// Added vtiger_fields for Add Business Card +'LBL_NEW_CONTACT'=>'New Contact', +'LBL_NEW_ACCOUNT'=>'New Account', +'LBL_NOTE_SUBJECT'=>'Document Subject:', +'LBL_NOTE'=>'Note:', +'LBL_WEBSITE'=>'Website:', +'LBL_NEW_APPOINTMENT'=>'New Appointment', +'LBL_SUBJECT'=>'Subject:', +'LBL_START_DATE'=>'Start Date:', +'LBL_START_TIME'=>'Start Time:', + +//Added vtiger_field after 4_0_1 +'Portal User'=>'Portal User', +'LBL_CUSTOMER_PORTAL_INFORMATION'=>'Customer Portal Information', +'Support Start Date'=>'Support Start Date', +'Support End Date'=>'Support End Date', +//Added for 4.2 Release -- CustomView +'Name'=>'Name', +'LBL_ALL'=>'All', +'LBL_MAXIMUM_LIMIT_ERROR'=>'Sorry, the uploaded file exceeds the maximum vtiger_filesize limit. Please try a file smaller than 800000 bytes', +'LBL_UPLOAD_ERROR'=>'Problems in file upload. Please try again!', +'LBL_IMAGE_ERROR'=>'The given file is not of type image(.gif/.jpg/.png)', +'LBL_INVALID_IMAGE'=>'Invalid file OR File has no data', + +//Added after 5Alpha5 +'Notify Owner'=>'Notify Owner', + +//Added for Picklist Values +'--None--'=>'--None--', + +'Mr.'=>'Mr.', +'Ms.'=>'Ms.', +'Mrs.'=>'Mrs.', +'Dr.'=>'Dr.', +'Prof.'=>'Prof.', + +'Cold Call'=>'Cold Call', +'Existing Customer'=>'Existing Customer', +'Self Generated'=>'Self Generated', +'Employee'=>'Employee', +'Partner'=>'Partner', +'Public Relations'=>'Public Relations', +'Direct Mail'=>'Direct Mail', +'Conference'=>'Conference', +'Trade Show'=>'Trade Show', +'Web Site'=>'Web Site', +'Word of mouth'=>'Word of mouth', +'Other'=>'Other', +'User List'=>'User List', + +//Added for 5.0.3 +'Customer Portal Login Details'=>'Customer Portal Login Details', +'Dear'=>'Dear', +'Your Customer Portal Login details are given below:'=>'Your Customer Portal Login details are given below:', +'User Id :'=>'User Id :', +'Password :'=>'Password :', +'Please Login Here'=>'Please Login Here', +'Note :'=>'Note :', +'We suggest you to change your password after logging in first time'=>'We suggest you to change your password after logging in first time.', +'Support Team'=>'Support Team', + +'TITLE_AJAX_CSS_POPUP_CHAT'=>'Ajax Css-Popup chat', + +// Added after 5.0.4 GA + +// Module Sequence Numbering +'Contact Id' => 'Contact Id', +// END + +); + +?> diff --git a/oss/vtiger/trunk/modules/Contacts/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Contacts/language/zh_cn.lang.php new file mode 100644 index 00000000..6e7507de --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/language/zh_cn.lang.php @@ -0,0 +1,249 @@ + '联系人', + 'LBL_INVITEE' => '针对报告', + 'LBL_MODULE_TITLE' => '联系人: 首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻联系人', + 'LBL_LIST_FORM_TITLE' => '联系人列表', + 'LBL_NEW_FORM_TITLE' => '新增联系人', + 'LBL_CONTACT_OPP_FORM_TITLE' => '联系人-机会:', + 'LBL_CONTACT' => '联系人:', + + 'LBL_LIST_NAME' => '名称', + 'LBL_LIST_LAST_NAME' => '姓名', + 'LBL_LIST_FIRST_NAME' => '英文名', + 'LBL_LIST_CONTACT_NAME' => '联系人名称', + 'LBL_LIST_TITLE' => '在线IM', + 'LBL_LIST_ACCOUNT_NAME' => '客户名称', + 'LBL_LIST_EMAIL_ADDRESS' => '电子邮件', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_CONTACT_ROLE' => '职位', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_last_name' => 'LBL_LIST_LAST_NAME', +'db_first_name' => 'LBL_LIST_FIRST_NAME', +'db_title' => 'LBL_LIST_TITLE', +'db_email1' => 'LBL_LIST_EMAIL_ADDRESS', +'db_email2' => 'LBL_LIST_EMAIL_ADDRESS', +//END DON'T CONVERT + +'LBL_EXISTING_CONTACT' => '使用现有的联系人', + 'LBL_CREATED_CONTACT' => '建立新的联系人', + 'LBL_EXISTING_ACCOUNT' => '使用现有的客户', + 'LBL_CREATED_ACCOUNT' => '建立新的客户', + 'LBL_CREATED_CALL' => '建立新的电话记录l', + 'LBL_CREATED_MEETING' => '建立新的会议', + 'LBL_ADDMORE_BUSINESSCARD' => '增加其它的商业名片', + + 'LBL_BUSINESSCARD' => '商业名片', + +'LBL_NAME' => '名称:', + 'LBL_CONTACT_NAME' => '联系人名称:', + 'LBL_CONTACT_INFORMATION' => '联系人信息', + 'LBL_CUSTOM_INFORMATION' => '客户信息', + 'LBL_FIRST_NAME' => '英文名:', + 'LBL_OFFICE_PHONE' => '办公室电话:', + 'LBL_ACCOUNT_NAME' => '客户名称:', + 'LBL_ANY_PHONE' => '其它电话:', + 'LBL_PHONE' => '电话:', + 'LBL_LAST_NAME' => '姓名:', + 'LBL_MOBILE_PHONE' => '手机:', + 'LBL_HOME_PHONE' => '首页:', + 'LBL_LEAD_SOURCE' => '接触来源:', + 'LBL_OTHER_PHONE' => '其它电话:', + 'LBL_FAX_PHONE' => '传真:', + 'LBL_TITLE' => '在线IM:', + 'LBL_DEPARTMENT' => '部门:', + 'LBL_BIRTHDATE' => '生日:', + 'LBL_EMAIL_ADDRESS' => '电子邮件:', + 'LBL_OTHER_EMAIL_ADDRESS' => '其它电子邮件:', + 'LBL_ANY_EMAIL' => '其它电子邮件:', + 'LBL_REPORTS_TO' => '报告给:', + 'LBL_ASSISTANT' => '助理:', + 'LBL_YAHOO_ID' => 'Yahoo账号:', + 'LBL_ASSISTANT_PHONE' => '助理电话:', + 'LBL_DO_NOT_CALL' => '请勿来电:', + 'LBL_EMAIL_OPT_OUT' => '请勿寄电子邮件:', + 'LBL_PRIMARY_ADDRESS' => '主要地址:', + 'LBL_ALTERNATE_ADDRESS' => '其它地址:', + 'LBL_ANY_ADDRESS' => '其它地址:', + 'LBL_CITY' => '乡镇市区:', + 'LBL_STATE' => '市(县):', + 'LBL_POSTAL_CODE' => '邮政编码:', + 'LBL_COUNTRY' => '省(市/自治区):', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息', + 'LBL_IMAGE_INFORMATION' => '联系人照片:', + 'LBL_ADDRESS_INFORMATION' => '地址信息', + 'LBL_DESCRIPTION' => '描述:', + 'LBL_CONTACT_ROLE' => '职位:', + 'LBL_OPP_NAME' => '机会名称:', + 'LBL_DUPLICATE' => '接触到潜在案件', + 'MSG_DUPLICATE' => '建立这个联系人可能造成重复,您可以点选建立联系人来透过已存在的数据建立新的联系人或是点选取消。', + + 'LNK_NEW_APPOINTMENT' => '新增行程', + 'LBL_ADD_BUSINESSCARD' => '新增商业名片', + 'NTC_DELETE_CONFIRMATION' => '您确定要删除这笔记录?', + 'NTC_REMOVE_CONFIRMATION' => '您确定要从这个案件中移除这位联系人?', + 'NTC_REMOVE_DIRECT_REPORT_CONFIRMATION' => '您确定要将此记录从直接报告人处删除吗?', + 'ERR_DELETE_RECORD' => '在删除联系人前必须输入正确的记录编号.', + 'NTC_COPY_PRIMARY_ADDRESS' => '复制主要地址到替代地址', + 'NTC_COPY_ALTERNATE_ADDRESS' => '复制替代地址到替代地址', + + 'LBL_SELECT_CONTACT' => '选择联系人', +//Added for search heading +'LBL_GENERAL_INFORMATION'=>'一般信息', + + + +//for v4 release added + 'LBL_NEW_POTENTIAL' => '新增潜在', + 'LBL_POTENTIAL_TITLE' => '潜在', + + 'LBL_NEW_TASK' => '新增任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => '新增电话记录', + 'LBL_CALL_TITLE' => '电话记录', + 'LBL_NEW_MEETING' => '新增会议', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '新增电子邮件', + 'LBL_EMAIL_TITLE' => '电子邮件', + 'LBL_NEW_NOTE' => '新增备忘录', + 'LBL_NOTE_TITLE' => '备忘录', + +// Added for 4GA + 'LBL_TOOL_FORM_TITLE' => '联系人编辑区', + + 'Salutation' => '问候', + 'First Name' => '英文名', + 'Office Phone' => '办公室电话', + 'Last Name' => '姓名', + 'Mobile' => '手机', + 'Account Name' => '客户名称', + 'Home Phone' => '家用电话', + 'Lead Source' => '客户来源', + 'Phone' => '电话', + 'Title' => '在线QQ', + 'Fax' => '传真', + 'Department' => '部门', + 'Birthdate' => '生日', + 'Email' => '电子邮件', + 'Reports To' => '报告给', + 'Assistant' => '助理', + 'Yahoo Id' => 'Yahoo账号', + 'Assistant Phone' => '助理电话', + 'Do Not Call' => '拒绝来电', + 'Email Opt Out' => '拒绝电子邮件', + 'Assigned To' => '负责人', + 'Campaign Source' => '活动来源', + 'Reference' => '参考', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'Mailing Street' => '邮寄地址', + 'Other Street' => '其它地址', + 'Mailing City' => '乡镇市区', + 'Mailing State' => '市(县)', + 'Mailing Zip' => '邮政编码', + 'Mailing Country' => '省(市/自治区)', + 'Mailing Po Box' => '采购订单信箱', + 'Other Po Box' => '其它采购订单信箱', + 'Other City' => '乡镇市区', + 'Other State' => '市(县)', + 'Other Zip' => '邮政编码', + 'Other Country' => '省(市/自治区)', + 'Contact Image' => '照片', + 'Description' => '描述', + +// Added vtiger_fields for Add Business Card + 'LBL_NEW_CONTACT' => '新增联系人', + 'LBL_NEW_ACCOUNT' => '新增客户', + 'LBL_NOTE_SUBJECT' => '备忘录标题:', + 'LBL_NOTE' => '备忘录:', + 'LBL_WEBSITE' => '网站:', + 'LBL_NEW_APPOINTMENT' => '新增行程', + 'LBL_SUBJECT' => '在线IM:', + 'LBL_START_DATE' => '开始日期:', + 'LBL_START_TIME' => '开始时间:', + +//Added vtiger_field after 4_0_1 +'Portal User' => '网站账号', + 'LBL_CUSTOMER_PORTAL_INFORMATION' => '网站客户信息', + 'Support Start Date' => '支持开始日期', + 'Support End Date' => '支持结束日期', +//Added for 4.2 Release -- CustomView +'Name' => '名称', + 'LBL_ALL' => '全部', + 'LBL_MAXIMUM_LIMIT_ERROR' => '抱歉,文件超过系统限制,请保持上传文件在 800000 bytes 以下', + 'LBL_UPLOAD_ERROR' => '上传失败,请重试!', + 'LBL_IMAGE_ERROR' => '提供的文件不是图片格式(.gif/.jpg/.png)', + 'LBL_INVALID_IMAGE' => '文件有误或是没有数据', + + +//Added after 5Alpha5 + 'Notify Owner' => '提醒负责人', + +//Added for Picklist Values + '--None--' => '-- 无 --', + +'Mr.' => '先生', + 'Ms.' => '小姐', + 'Mrs.' => '太太', + 'Dr.' => '博士', + 'Prof.' => '专家', + + 'Cold Call' => '陌生拜访', + 'Existing Customer' => '既有客户', + 'Self Generated' => '自动产生', + 'Employee' => '员工', + 'Partner' => '伙伴', + 'Public Relations' => '公众关系', + 'Direct Mail' => '邮件营销', + 'Conference' => '研讨会', + 'Trade Show' => '贸易展览', + 'Web Site' => '网站', + 'Word of mouth' => '口耳相传', + 'Other' => '其它', + 'User List' => '使用者清单', + +//Added for 5.0.3 +'Customer Portal Login Details'=>'顾客注册细节', +'Dear'=>'亲爱的', +'Your Customer Portal Login details are given below:'=>'您的顾客提供了以下注册细节:', +'User Id :'=>'用户号 :', +'Password :'=>'密码 :', +'Please Login Here'=>'请在这里登录', +'Note :'=>'笔记 :', +'We suggest you to change your password after logging in first time'=>'请您在第一次登录时修改密码以保证安全.', +'Support Team'=>'项目团队', + + +'TITLE_AJAX_CSS_POPUP_CHAT'=>'Ajax Css-Popup chat', +// Added after 5.0.4 GA + +// Module Sequence Numbering +'Contact Id' => '编号', +// END +); + +?> diff --git a/oss/vtiger/trunk/modules/Contacts/updateRelations.php b/oss/vtiger/trunk/modules/Contacts/updateRelations.php new file mode 100644 index 00000000..ea8cd200 --- /dev/null +++ b/oss/vtiger/trunk/modules/Contacts/updateRelations.php @@ -0,0 +1,55 @@ +pquery($sql, array($forCRMRecord, $_REQUEST["pot_id"])); +} +$focus = CRMEntity::getInstance($currentModule); +foreach($storearray as $id) +{ + if($id != '') + { + if($dest_mod == 'Products') + $adb->pquery("insert into vtiger_seproductsrel values (?,?,?)", array($forCRMRecord, $id, 'Contacts')); + elseif($dest_mod == 'Campaigns') + $adb->pquery("insert into vtiger_campaigncontrel values(?,?)", array($id, $forCRMRecord)); + elseif($dest_mod == 'Documents') + $adb->pquery("insert into vtiger_senotesrel values(?,?)", array($forCRMRecord,$id)); + else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomView/ChangeStatus.php b/oss/vtiger/trunk/modules/CustomView/ChangeStatus.php new file mode 100644 index 00000000..c4a224df --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/ChangeStatus.php @@ -0,0 +1,54 @@ +isPermittedCustomView($cvid,$now_action,$oCustomView->customviewmodule) == 'yes') + { + $updateStatusSql = "update vtiger_customview set status=? where cvid=? and entitytype=?"; + $updateresult = $adb->pquery($updateStatusSql, array($status, $cvid, $module)); + if(!$updateresult) + echo ':#:FAILURE:#:'; + else + echo ':#:SUCCESS:#:' . $module . ':#:'; + } + else + { + global $theme, $app_strings; + echo "
"; + echo "
+ + + + + + + + + +
+ $app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomView/CustomView.js b/oss/vtiger/trunk/modules/CustomView/CustomView.js new file mode 100644 index 00000000..9e234cef --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/CustomView.js @@ -0,0 +1,393 @@ + /********************************************************************************* + ** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ +function trimfValues(value) +{ + var string_array; + string_array = value.split(":"); + return string_array[4]; +} + +function updatefOptions(sel, opSelName) { + var selObj = document.getElementById(opSelName); + var fieldtype = null ; + + var currOption = selObj.options[selObj.selectedIndex]; + var currField = sel.options[sel.selectedIndex]; + var fld = currField.value.split(":"); + var tod = fld[4]; + if(fld[4] == 'D' || fld[4] == 'DT') + { + $("and"+sel.id).innerHTML = ""; + if(sel.id != "fcol5") + $("and"+sel.id).innerHTML = "("+$("user_dateformat").value+") "+alert_arr.LBL_AND; + else + $("and"+sel.id).innerHTML = "("+$("user_dateformat").value+") "; + } + else if(fld[4] == 'T' && fld[1] != 'time_start' && fld[1] != 'time_end') + { + $("and"+sel.id).innerHTML = ""; + if(sel.id != "fcol5") + $("and"+sel.id).innerHTML = "("+$("user_dateformat").value+" hh:mm:ss) "+alert_arr.LBL_AND; + else + $("and"+sel.id).innerHTML = "("+$("user_dateformat").value+" hh:mm:ss) "; + } + +else if(fld[4] == 'I' && fld[1] == 'time_start' || fld[1] == 'time_end') + { + $("and"+sel.id).innerHTML = ""; + if(sel.id != "fcol5") + $("and"+sel.id).innerHTML = "hh:mm "+alert_arr.LBL_AND; + else + $("and"+sel.id).innerHTML = "hh:mm"; + } + + else if(fld[4] == 'T' && fld[1] == 'time_start' || fld[1] == 'time_end') + { + $("and"+sel.id).innerHTML = ""; + if(sel.id != "fcol5") + $("and"+sel.id).innerHTML = "hh:mm "+alert_arr.LBL_AND; + else + $("and"+sel.id).innerHTML = "hh:mm"; + } + + + else if(fld[4] == 'C') + { + $("and"+sel.id).innerHTML = ""; + if(sel.id != "fcol5") + $("and"+sel.id).innerHTML = "( Yes / No ) "+alert_arr.LBL_AND; + else + $("and"+sel.id).innerHTML = "( Yes / No ) "; + } + else { + $("and"+sel.id).innerHTML = ""; + if(sel.id != "fcol5") + $("and"+sel.id).innerHTML = " "+alert_arr.LBL_AND; + else + $("and"+sel.id).innerHTML = " "; + } + + if(currField.value != null && currField.value.length != 0) + { + fieldtype = trimfValues(currField.value); + ops = typeofdata[fieldtype]; + var off = 0; + if(ops != null) + { + + var nMaxVal = selObj.length; + for(nLoop = 0; nLoop < nMaxVal; nLoop++) + { + selObj.remove(0); + } + selObj.options[0] = new Option ('None', ''); + if (currField.value == '') { + selObj.options[0].selected = true; + } + off = 1; + for (var i = 0; i < ops.length; i++) + { + var label = fLabels[ops[i]]; + if (label == null) continue; + var option = new Option (fLabels[ops[i]], ops[i]); + selObj.options[i + off] = option; + if (currOption != null && currOption.value == option.value) + { + option.selected = true; + } + } + } + }else + { + if (currField.value == '') { + selObj.options[0].selected = true; + } + } + +} +function verify_data() { + var isError = false; + var errorMessage = ""; + if (trim(document.CustomView.viewName.value) == "") { + isError = true; + errorMessage += "\nView Name"; + } + // Here we decide whether to submit the form. + if (isError == true) { + alert(alert_arr.MISSING_REQUIRED_FIELDS + errorMessage); + return false; + } + //return true; +} + + +function CancelForm() +{ +var cvmodule = document.templatecreate.cvmodule.value; +var viewid = document.templatecreate.cvid.value; +document.location.href = "index.php?module="+cvmodule+"&action=index&viewname="+viewid; +} + + +function check4null(form) +{ + var isError = false; + var errorMessage = ""; + // Here we decide whether to submit the form. + if (trim(form.subject.value) =='') { + isError = true; + errorMessage += "\n subject"; + form.subject.focus(); + } + + // Here we decide whether to submit the form. + if (isError == true) { + alert(alert_arr.MISSING_REQUIRED_FIELDS + errorMessage); + return false; + } + return true; +} + +// Added for Custom View Advance Filter validation +function checkval() +{ + var value,option,arr,dttime,sep; + for(var i=1;i<=5;i++) + { + value=trim(getObj("fval"+i).value); + option=getObj("fcol"+i).value; + fopvalue=trim(getObj("fop"+i).value); + if(option !="" && value !="") + { + if(getObj("fop"+i).selectedIndex == 0) + { + alert(alert_arr.LBL_SELECT_CRITERIA); + return false; + } + arr=option.split(":"); + if(arr[4] == "N" || arr[4] == "I" || arr[4] == "NN") + { + sep=value.split(","); + for(var j=0;j 1) + { + if(!cv_patternValidate(dttime[1],"Time","TIMESECONDS")) + { + getObj("fval"+i).select(); + return false; + } + } + } + + } + if(arr[4] == "C") + { + if(value == "1") + { + getObj("fval"+i).value= "yes"; + continue; + } + else if(value == "0") + { + getObj("fval"+i).value= "no"; + continue; + } + if(value.toLowerCase() != "yes") if(value.toLowerCase() != "no") + { + alert(alert_arr.LBL_PROVIDE_YES_NO); + getObj("fval"+i).select(); + return false; + } + } + } + else if (!(option =="" && fopvalue == "" && value == "")) + { + if(option =="") + { + alert(alert_arr.LBL_SELECT_COLUMN); + return false; + } + if(fopvalue == "") + { + alert(alert_arr.LBL_SELECT_CRITERIA); + return false; + } + } + } +return true; +} + +//Added for Custom view validation +//Copied from general.js and altered some lines. becos we cant send vales to function present in general.js. it accept only field names. +function cv_dateValidate(fldval,fldLabel,type) { + if(cv_patternValidate(fldval,fldLabel,"DATE")==false) + return false; + dateval=fldval.replace(/^\s+/g, '').replace(/\s+$/g, '') + + var dateelements=splitDateVal(dateval) + + dd=dateelements[0] + mm=dateelements[1] + yyyy=dateelements[2] + + if (dd<1 || dd>31 || mm<1 || mm>12 || yyyy<1 || yyyy<1000) { + alert(alert_arr.ENTER_VALID+fldLabel) + return false + } + + if ((mm==2) && (dd>29)) {//checking of no. of days in february month + alert(alert_arr.ENTER_VALID+fldLabel) + return false + } + + if ((mm==2) && (dd>28) && ((yyyy%4)!=0)) {//leap year checking + alert(alert_arr.ENTER_VALID+fldLabel) + return false + } + + switch (parseInt(mm)) { + case 2 : + case 4 : + case 6 : + case 9 : + case 11 : if (dd>30) { + alert(alert_arr.ENTER_VALID+fldLabel) + return false + } + } + + var currdate=new Date() + var chkdate=new Date() + + chkdate.setYear(yyyy) + chkdate.setMonth(mm-1) + chkdate.setDate(dd) + + if (type!="OTH") { + if (!compareDates(chkdate,fldLabel,currdate,"current date",type)) { + return false + } else return true; + } else return true; +} + +//Added for Custom view validation +//Copied from general.js and altered some lines. becos we cant send vales to function present in general.js. it accept only field names. +function cv_patternValidate(fldval,fldLabel,type) { + if (type.toUpperCase()=="DATE") {//DATE validation + + switch (userDateFormat) { + case "yyyy-mm-dd" : + var re = /^\d{4}(-)\d{1,2}\1\d{1,2}$/ + break; + case "mm-dd-yyyy" : + case "dd-mm-yyyy" : + var re = /^\d{1,2}(-)\d{1,2}\1\d{4}$/ + } + } + + + if (type.toUpperCase()=="TIMESECONDS") + { + //TIME validation.optional hour, min and seconds + //var re = new RegExp("^([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$"); + var re = new RegExp("^(([0-1]?[0-9])|([2][0-3]))(:([0-5]?[0-9]))?(:([0-5]?[0-9]))?$"); + } + else if (type.toUpperCase()=="TIME") + { + //TIME validation. optional hours and minutes only. dont accept second. added for calendar start and end time field. + var re = new RegExp("^(([0-1]?[0-9])|([2][0-3]))(:([0-5]?[0-9]))$"); + } + if (!re.test(fldval)) { + alert(alert_arr.ENTER_VALID + fldLabel) + return false + } + else return true + + + + +} +//added to hide date selection option, if a user doesn't have permission for not permitter standard filter column +//added to fix the ticket #5117 +function standardFilterDisplay() +{ + if(getObj("stdDateFilterField")) + { + if(document.CustomView.stdDateFilterField.selectedIndex > -1 && document.CustomView.stdDateFilterField.options[document.CustomView.stdDateFilterField.selectedIndex].value == "not_accessible") + { + getObj('stdDateFilter').disabled = true; + getObj('startdate').disabled = true; getObj('enddate').disabled = true; + getObj('jscal_trigger_date_start').style.visibility="hidden"; + getObj('jscal_trigger_date_end').style.visibility="hidden"; + } + else + { + getObj('stdDateFilter').disabled = false; + getObj('startdate').disabled = false; + getObj('enddate').disabled = false; + getObj('jscal_trigger_date_start').style.visibility="visible"; + getObj('jscal_trigger_date_end').style.visibility="visible"; + } + } +} + diff --git a/oss/vtiger/trunk/modules/CustomView/CustomView.php b/oss/vtiger/trunk/modules/CustomView/CustomView.php new file mode 100644 index 00000000..45af420b --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/CustomView.php @@ -0,0 +1,2019 @@ +"".$mod_strings['equals']."", + "n"=>"".$mod_strings['not equal to']."", + "s"=>"".$mod_strings['starts with']."", + "ew"=>"".$mod_strings['ends with']."", + "c"=>"".$mod_strings['contains']."", + "k"=>"".$mod_strings['does not contain']."", + "l"=>"".$mod_strings['less than']."", + "g"=>"".$mod_strings['greater than']."", + "m"=>"".$mod_strings['less or equal']."", + "h"=>"".$mod_strings['greater or equal']."", + ); + +class CustomView extends CRMEntity{ + + + + var $module_list = Array(); + + var $customviewmodule; + + var $list_fields; + + var $list_fields_name; + + var $setdefaultviewid; + + var $escapemodule; + + var $mandatoryvalues; + + var $showvalues; + + var $data_type; + + // Information as defined for this instance in the database table. + protected $_status = false; + protected $_userid = false; + + /** This function sets the currentuser id to the class variable smownerid, + * modulename to the class variable customviewmodule + * @param $module -- The module Name:: Type String(optional) + * @returns nothing + */ + function CustomView($module="") + { + global $current_user,$adb; + $this->customviewmodule = $module; + $this->escapemodule[] = $module."_"; + $this->escapemodule[] = "_"; + $this->smownerid = $current_user->id; + } + + + /** To get the customViewId of the specified module + * @param $module -- The module Name:: Type String + * @returns customViewId :: Type Integer + */ + function getViewId($module) + { + global $adb,$current_user; + $now_action = vtlib_purify($_REQUEST['action']); + if(isset($_REQUEST['viewname']) == false) { + if (isset($_SESSION['lvs'][$module]["viewname"]) && $_SESSION['lvs'][$module]["viewname"]!='') { + $viewid = $_SESSION['lvs'][$module]["viewname"]; + } + elseif($this->setdefaultviewid != "") { + $viewid = $this->setdefaultviewid; + } else { + $defcv_result = $adb->pquery("select default_cvid from vtiger_user_module_preferences where userid = ? and tabid =?", array($current_user->id, getTabid($module))); + if($adb->num_rows($defcv_result) > 0) { + $viewid = $adb->query_result($defcv_result,0,'default_cvid'); + } else { + $query="select cvid from vtiger_customview where setdefault=1 and entitytype=?"; + $cvresult=$adb->pquery($query, array($module)); + if($adb->num_rows($cvresult) > 0) { + $viewid = $adb->query_result($cvresult,0,'cvid'); + } else $viewid = ''; + } + } + + if($viewid == '' || $viewid == 0 || $this->isPermittedCustomView($viewid,$now_action,$module) != 'yes') { + $query="select cvid from vtiger_customview where viewname='All' and entitytype=?"; + $cvresult=$adb->pquery($query, array($module)); + $viewid = $adb->query_result($cvresult,0,'cvid'); + } + } + else { + $viewname = vtlib_purify($_REQUEST['viewname']); + if((is_string($viewname) && strtolower($viewname) == 'all') || $viewname == 0) { + $viewid = $this->getViewIdByName('All', $module); + } else { + $viewid = $viewname; + } + if($this->isPermittedCustomView($viewid,$now_action,$this->customviewmodule) != 'yes') + $viewid = 0; + } + $_SESSION['lvs'][$module]["viewname"] = $viewid; + return $viewid; + + } + //Return id of a view : Added by Pavani + function getViewIdByName($viewname, $module) + { + global $adb; + if(isset($viewname)) { + $query="select cvid from vtiger_customview where viewname=? and entitytype=?"; + $cvresult=$adb->pquery($query, array($viewname,$module)); + $viewid = $adb->query_result($cvresult,0,'cvid');; + return $viewid; + } else { + return 0; + } + } + + // return type array + /** to get the details of a customview + * @param $cvid :: Type Integer + * @returns $customviewlist Array in the following format + * $customviewlist = Array('viewname'=>value, + * 'setdefault'=>defaultchk, + * 'setmetrics'=>setmetricschk) + */ + + function getCustomViewByCvid($cvid) + { + global $adb,$current_user; + $tabid = getTabid($this->customviewmodule); + + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + + $ssql = "select vtiger_customview.* from vtiger_customview inner join vtiger_tab on vtiger_tab.name = vtiger_customview.entitytype"; + $ssql .= " where vtiger_customview.cvid=?"; + $sparams = array($cvid); + + if($is_admin == false) { + $ssql .= " and (vtiger_customview.status=0 or vtiger_customview.userid = ? or vtiger_customview.status = 3 or vtiger_customview.userid in(select vtiger_user2role.userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '".$current_user_parent_role_seq."::%'))"; + array_push($sparams, $current_user->id); + } + $result = $adb->pquery($ssql, $sparams); + + $usercv_result = $adb->pquery("select default_cvid from vtiger_user_module_preferences where userid = ? and tabid = ?", array($current_user->id, $tabid)); + $def_cvid = $adb->query_result($usercv_result, 0, 'default_cvid'); + + while($cvrow=$adb->fetch_array($result)) + { + $customviewlist["viewname"] = $cvrow["viewname"]; + if((isset($def_cvid) || $def_cvid != '') && $def_cvid == $cvid) { + $customviewlist["setdefault"] = 1; + } else { + $customviewlist["setdefault"] = $cvrow["setdefault"]; + } + $customviewlist["setmetrics"] = $cvrow["setmetrics"]; + $customviewlist["userid"] = $cvrow["userid"]; + $customviewlist["status"] = $cvrow["status"]; + } + return $customviewlist; + } + + /** to get the customviewCombo for the class variable customviewmodule + * @param $viewid :: Type Integer + * $viewid will make the corresponding selected + * @returns $customviewCombo :: Type String + */ + + function getCustomViewCombo($viewid='', $markselected=true) + { + global $adb,$current_user; + global $app_strings; + $tabid = getTabid($this->customviewmodule); + + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + + $shtml_user = ''; + $shtml_pending = ''; + $shtml_public = ''; + $shtml_others = ''; + + $selected = 'selected'; + if ($markselected == false) $selected = ''; + + $ssql = "select vtiger_customview.*, vtiger_users.user_name from vtiger_customview inner join vtiger_tab on vtiger_tab.name = vtiger_customview.entitytype + left join vtiger_users on vtiger_customview.userid = vtiger_users.id "; + $ssql .= " where vtiger_tab.tabid=?"; + $sparams = array($tabid); + + if($is_admin == false){ + $ssql .= " and (vtiger_customview.status=0 or vtiger_customview.userid = ? or vtiger_customview.status = 3 or vtiger_customview.userid in(select vtiger_user2role.userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '".$current_user_parent_role_seq."::%'))"; + array_push($sparams, $current_user->id); + } + $result = $adb->pquery($ssql, $sparams); + while($cvrow=$adb->fetch_array($result)) + { + if($cvrow['viewname'] == 'All') + { + $cvrow['viewname'] = $app_strings['COMBO_ALL']; + } + + $option = ''; + $viewname = $cvrow['viewname']; + if ($cvrow['status'] == CV_STATUS_DEFAULT || $cvrow['userid'] == $current_user->id) { + $disp_viewname = $viewname; + } else { + $disp_viewname = $viewname . " [" . $cvrow['user_name'] . "] "; + } + + + if($cvrow['setdefault'] == 1 && $viewid =='') + { + $option = ""; + $this->setdefaultviewid = $cvrow['cvid']; + } + elseif($cvrow['cvid'] == $viewid) + { + $option = ""; + $this->setdefaultviewid = $cvrow['cvid']; + } + else + { + $option = ""; + } + + // Add the option to combo box at appropriate section + if($option != '') { + if ($cvrow['status'] == CV_STATUS_DEFAULT || $cvrow['userid'] == $current_user->id) { + $shtml_user .= $option; + } elseif ($cvrow['status'] == CV_STATUS_PUBLIC) { + if ($shtml_public == '') + $shtml_public = ""; + $shtml_public .= $option; + } elseif ($cvrow['status'] == CV_STATUS_PENDING) { + if ($shtml_pending == '') + $shtml_pending = ""; + $shtml_pending .= $option; + } else { + if ($shtml_others == '') + $shtml_others = ""; + $shtml_others .= $option; + } + } + } + $shtml = $shtml_user; + if ($is_admin == true) $shtml .= $shtml_pending; + $shtml = $shtml . $shtml_public . $shtml_others; + return $shtml; + } + + /** to get the getColumnsListbyBlock for the given module and Block + * @param $module :: Type String + * @param $block :: Type Integer + * @returns $columnlist Array in the format + * $columnlist = Array ($fieldlabel =>'$fieldtablename:$fieldcolname:$fieldname:$module_$fieldlabel1:$fieldtypeofdata', + $fieldlabel1 =>'$fieldtablename1:$fieldcolname1:$fieldname1:$module_$fieldlabel11:$fieldtypeofdata1', + | + $fieldlabeln =>'$fieldtablenamen:$fieldcolnamen:$fieldnamen:$module_$fieldlabel1n:$fieldtypeofdatan') + */ + + function getColumnsListbyBlock($module,$block) + { + global $adb,$mod_strings,$app_strings; + $block_ids = explode(",", $block); + $tabid = getTabid($module); + if($tabid == 9) + $tabid ="9,16"; + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + + $display_type = " vtiger_field.displaytype in (1,2,3)"; + + if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0) + { + $tab_ids = explode(",", $tabid); + $sql = "select * from vtiger_field "; + $sql.= " where vtiger_field.tabid in (". generateQuestionMarks($tab_ids) .") and vtiger_field.block in (". generateQuestionMarks($block_ids) .") and vtiger_field.presence in (0,2) and"; + $sql.= $display_type; + if($tabid == 9 || $tabid==16) + { + $sql.= " and vtiger_field.fieldname not in('notime','duration_minutes','duration_hours')"; + } + $sql.= " order by sequence"; + $params = array($tab_ids, $block_ids); + } + else + { + $tab_ids = explode(",", $tabid); + $profileList = getCurrentUserProfileList(); + $sql = "select * from vtiger_field inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid "; + $sql.= " where vtiger_field.tabid in (". generateQuestionMarks($tab_ids) .") and vtiger_field.block in (". generateQuestionMarks($block_ids) .") and"; + $sql.= "$display_type and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_field.presence in (0,2)"; + + $params = array($tab_ids, $block_ids); + + if (count($profileList) > 0) { + $sql.= " and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .")"; + array_push($params, $profileList); + } + if($tabid == 9 || $tabid==16) + { + $sql.= " and vtiger_field.fieldname not in('notime','duration_minutes','duration_hours')"; + } + + $sql.= " group by columnname order by sequence"; + } + if($tabid == '9,16') + $tabid = "9"; + $result = $adb->pquery($sql, $params); + $noofrows = $adb->num_rows($result); + //Added on 14-10-2005 -- added ticket id in list + if($module == 'HelpDesk' && $block == 25) + { + $module_columnlist['vtiger_crmentity:crmid::HelpDesk_Ticket_ID:I'] = 'Ticket ID'; + } + //Added to include vtiger_activity type in vtiger_activity vtiger_customview list + if($module == 'Calendar' && $block == 19) + { + $module_columnlist['vtiger_activity:activitytype:activitytype:Calendar_Activity_Type:V'] = 'Activity Type'; + } + + if($module == 'SalesOrder' && $block == 63) + $module_columnlist['vtiger_crmentity:crmid::SalesOrder_Order_No:I'] = $app_strings['Order No']; + + if($module == 'PurchaseOrder' && $block == 57) + $module_columnlist['vtiger_crmentity:crmid::PurchaseOrder_Order_No:I'] = $app_strings['Order No']; + + if($module == 'Quotes' && $block == 51) + $module_columnlist['vtiger_crmentity:crmid::Quotes_Quote_No:I'] = $app_strings['Quote No']; + + for($i=0; $i<$noofrows; $i++) + { + $fieldtablename = $adb->query_result($result,$i,"tablename"); + $fieldcolname = $adb->query_result($result,$i,"columnname"); + $fieldname = $adb->query_result($result,$i,"fieldname"); + $fieldtype = $adb->query_result($result,$i,"typeofdata"); + $fieldtype = explode("~",$fieldtype); + $fieldtypeofdata = $fieldtype[0]; + $fieldlabel = $adb->query_result($result,$i,"fieldlabel"); + //Here we Changing the displaytype of the field. So that its criteria will be displayed Correctly in Custom view Advance Filter. + $fieldtypeofdata=ChangeTypeOfData_Filter($fieldtablename,$fieldcolname,$fieldtypeofdata); + if($fieldlabel == "Related To") + { + $fieldlabel = "Related to"; + } + if($fieldlabel == "Start Date & Time") + { + $fieldlabel = "Start Date"; + if($module == 'Calendar' && $block == 19) + $module_columnlist['vtiger_activity:time_start::Calendar_Start_Time:I'] = 'Start Time'; + + } + $fieldlabel1 = str_replace(" ","_",$fieldlabel); + if($fieldname == 'account_id' && $fieldtablename != 'vtiger_account')//Potential,Contacts,Invoice,SalesOrder & Quotes records sort by Account Name . But for account member of we have to avoid this + $optionvalue = "vtiger_account:accountname:accountname:".$module."_".$fieldlabel1.":".$fieldtypeofdata; + else if($fieldname == 'contact_id' && $module != "Contacts")//Calendar,Documents,PurchaseOrder,SalesOrder,Quotes,and Invoice records sort by Contact Name + $optionvalue = "vtiger_contactdetails:lastname:lastname:".$module."_".$fieldlabel1.":".$fieldtypeofdata; + else if($fieldname == 'product_id' && ($module != 'Products' && $module != 'HelpDesk' && $module !="Faq"))//Campaign records sort by Product Name. + $optionvalue = "vtiger_products:productname:productname:".$module."_".$fieldlabel1.":".$fieldtypeofdata; + else + $optionvalue = $fieldtablename.":".$fieldcolname.":".$fieldname.":".$module."_".$fieldlabel1.":".$fieldtypeofdata; + //added to escape attachments fields in customview as we have multiple attachments + $fieldlabel = getTranslatedString($fieldlabel); //added to support i18n issue + if($module != 'HelpDesk' || $fieldname !='filename') + $module_columnlist[$optionvalue] = $fieldlabel; + if($fieldtype[1] == "M") + { + $this->mandatoryvalues[] = "'".$optionvalue."'"; + $this->showvalues[] = $fieldlabel; + $this->data_type[$fieldlabel] = $fieldtype[1]; + } + } + return $module_columnlist; + } + + /** to get the getModuleColumnsList for the given module + * @param $module :: Type String + * @returns $ret_module_list Array in the following format + * $ret_module_list = + Array ('module' => + Array('BlockLabel1' => + Array('$fieldtablename:$fieldcolname:$fieldname:$module_$fieldlabel1:$fieldtypeofdata'=>$fieldlabel, + Array('$fieldtablename1:$fieldcolname1:$fieldname1:$module_$fieldlabel11:$fieldtypeofdata1'=>$fieldlabel1, + Array('BlockLabel2' => + Array('$fieldtablename:$fieldcolname:$fieldname:$module_$fieldlabel1:$fieldtypeofdata'=>$fieldlabel, + Array('$fieldtablename1:$fieldcolname1:$fieldname1:$module_$fieldlabel11:$fieldtypeofdata1'=>$fieldlabel1, + | + Array('BlockLabeln' => + Array('$fieldtablename:$fieldcolname:$fieldname:$module_$fieldlabel1:$fieldtypeofdata'=>$fieldlabel, + Array('$fieldtablename1:$fieldcolname1:$fieldname1:$module_$fieldlabel11:$fieldtypeofdata1'=>$fieldlabel1, + + + */ + + + function getModuleColumnsList($module) + { + + $module_info = $this->getCustomViewModuleInfo($module); + foreach($this->module_list[$module] as $key=>$value) + { + $columnlist = $this->getColumnsListbyBlock($module,$value); + + if(isset($columnlist)) + { + $ret_module_list[$module][$key] = $columnlist; + } + } + return $ret_module_list; + } + + /** to get the getModuleColumnsList for the given customview + * @param $cvid :: Type Integer + * @returns $columnlist Array in the following format + * $columnlist = Array( $columnindex => $columnname, + * $columnindex1 => $columnname1, + * | + * $columnindexn => $columnnamen) + */ + function getColumnsListByCvid($cvid) + { + global $adb; + + $sSQL = "select vtiger_cvcolumnlist.* from vtiger_cvcolumnlist"; + $sSQL .= " inner join vtiger_customview on vtiger_customview.cvid = vtiger_cvcolumnlist.cvid"; + $sSQL .= " where vtiger_customview.cvid =? order by vtiger_cvcolumnlist.columnindex"; + $result = $adb->pquery($sSQL, array($cvid)); + while($columnrow = $adb->fetch_array($result)) + { + $columnlist[$columnrow['columnindex']] = $columnrow['columnname']; + } + return $columnlist; + } + + /** to get the standard filter fields or the given module + * @param $module :: Type String + * @returns $stdcriteria_list Array in the following format + * $stdcriteria_list = Array( $tablename:$columnname:$fieldname:$module_$fieldlabel => $fieldlabel, + * $tablename1:$columnname1:$fieldname1:$module_$fieldlabel1 => $fieldlabel1, + * | + * $tablenamen:$columnnamen:$fieldnamen:$module_$fieldlabeln => $fieldlabeln) + */ + function getStdCriteriaByModule($module) + { + global $adb; + $tabid = getTabid($module); + + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + + $module_info = $this->getCustomViewModuleInfo($module); + foreach($this->module_list[$module] as $key=>$blockid) + { + $blockids[] = $blockid; + } + + if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0) + { + $sql = "select * from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid "; + $sql.= " where vtiger_field.tabid=? and vtiger_field.block in (". generateQuestionMarks($blockids) .") + and (vtiger_field.uitype in (5,6,23) or vtiger_field.displaytype=2) "; + $sql.= " and vtiger_field.presence in (0,2) order by vtiger_field.sequence"; + $params = array($tabid, $blockids); + } + else + { + $profileList = getCurrentUserProfileList(); + $sql = "select * from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid "; + $sql.= " where vtiger_field.tabid=? and vtiger_field.block in (". generateQuestionMarks($blockids) .") and (vtiger_field.uitype in (5,6,23) or vtiger_field.displaytype=2)"; + $sql.= " and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_field.presence in (0,2)"; + + $params = array($tabid, $blockids); + + if (count($profileList) > 0) { + $sql.= " and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .")"; + array_push($params, $profileList); + } + + $sql.= " order by vtiger_field.sequence"; + } + + $result = $adb->pquery($sql, $params); + + while($criteriatyperow = $adb->fetch_array($result)) + { + $fieldtablename = $criteriatyperow["tablename"]; + $fieldcolname = $criteriatyperow["columnname"]; + $fieldlabel = $criteriatyperow["fieldlabel"]; + $fieldname = $criteriatyperow["fieldname"]; + $fieldlabel1 = str_replace(" ","_",$fieldlabel); + $optionvalue = $fieldtablename.":".$fieldcolname.":".$fieldname.":".$module."_".$fieldlabel1; + $stdcriteria_list[$optionvalue] = $fieldlabel; + } + + return $stdcriteria_list; + + } + + /** to get the standard filter criteria + * @param $selcriteria :: Type String (optional) + * @returns $filter Array in the following format + * $filter = Array( 0 => array('value'=>$filterkey,'text'=>$mod_strings[$filterkey],'selected'=>$selected) + * 1 => array('value'=>$filterkey1,'text'=>$mod_strings[$filterkey1],'selected'=>$selected) + * | + * n => array('value'=>$filterkeyn,'text'=>$mod_strings[$filterkeyn],'selected'=>$selected) + */ + function getStdFilterCriteria($selcriteria = "") + { + global $mod_strings; + $filter = array(); + + $stdfilter = Array("custom"=>"".$mod_strings['Custom']."", + "prevfy"=>"".$mod_strings['Previous FY']."", + "thisfy"=>"".$mod_strings['Current FY']."", + "nextfy"=>"".$mod_strings['Next FY']."", + "prevfq"=>"".$mod_strings['Previous FQ']."", + "thisfq"=>"".$mod_strings['Current FQ']."", + "nextfq"=>"".$mod_strings['Next FQ']."", + "yesterday"=>"".$mod_strings['Yesterday']."", + "today"=>"".$mod_strings['Today']."", + "tomorrow"=>"".$mod_strings['Tomorrow']."", + "lastweek"=>"".$mod_strings['Last Week']."", + "thisweek"=>"".$mod_strings['Current Week']."", + "nextweek"=>"".$mod_strings['Next Week']."", + "lastmonth"=>"".$mod_strings['Last Month']."", + "thismonth"=>"".$mod_strings['Current Month']."", + "nextmonth"=>"".$mod_strings['Next Month']."", + "last7days"=>"".$mod_strings['Last 7 Days']."", + "last30days"=>"".$mod_strings['Last 30 Days']."", + "last60days"=>"".$mod_strings['Last 60 Days']."", + "last90days"=>"".$mod_strings['Last 90 Days']."", + "last120days"=>"".$mod_strings['Last 120 Days']."", + "next30days"=>"".$mod_strings['Next 30 Days']."", + "next60days"=>"".$mod_strings['Next 60 Days']."", + "next90days"=>"".$mod_strings['Next 90 Days']."", + "next120days"=>"".$mod_strings['Next 120 Days']."", + ); + + foreach($stdfilter as $FilterKey=>$FilterValue) + { + if($FilterKey == $selcriteria) + { + $shtml['value'] = $FilterKey; + $shtml['text'] = $FilterValue; + $shtml['selected'] = "selected"; + }else + { + $shtml['value'] = $FilterKey; + $shtml['text'] = $FilterValue; + $shtml['selected'] = ""; + } + $filter[] = $shtml; + } + return $filter; + + } + + /** to get the standard filter criteria scripts + * @returns $jsStr : Type String + * This function will return the script to set the start data and end date + * for the standard selection criteria + */ + function getCriteriaJS() + { + + + $today = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d"), date("Y"))); + $tomorrow = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+1, date("Y"))); + $yesterday = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-1, date("Y"))); + + $currentmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m"), "01", date("Y"))); + $currentmonth1 = date("Y-m-t"); + $lastmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")-1, "01", date("Y"))); + $lastmonth1 = date("Y-m-t", strtotime("-1 Month")); + $nextmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")+1, "01", date("Y"))); + $nextmonth1 = date("Y-m-t", strtotime("+1 Month")); + + $lastweek0 = date("Y-m-d",strtotime("-2 week Sunday")); + $lastweek1 = date("Y-m-d",strtotime("-1 week Saturday")); + + $thisweek0 = date("Y-m-d",strtotime("-1 week Sunday")); + $thisweek1 = date("Y-m-d",strtotime("this Saturday")); + + $nextweek0 = date("Y-m-d",strtotime("this Sunday")); + $nextweek1 = date("Y-m-d",strtotime("+1 week Saturday")); + + $next7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+6, date("Y"))); + $next30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+29, date("Y"))); + $next60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+59, date("Y"))); + $next90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+89, date("Y"))); + $next120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+119, date("Y"))); + + $last7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-6, date("Y"))); + $last30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-29, date("Y"))); + $last60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-59, date("Y"))); + $last90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-89, date("Y"))); + $last120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-119, date("Y"))); + + $currentFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y"))); + $currentFY1 = date("Y-m-t",mktime(0, 0, 0, "12", date("d"), date("Y"))); + $lastFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")-1)); + $lastFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")-1)); + + $nextFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")+1)); + $nextFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")+1)); + + if(date("m") <= 3) + { + $cFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y"))); + $nFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y"))); + $pFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y")-1)); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")-1)); + }else if(date("m") > 3 and date("m") <= 6) + { + $pFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y"))); + $nFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y"))); + + }else if(date("m") > 6 and date("m") <= 9) + { + $nFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y"))); + $pFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y"))); + } + else if(date("m") > 9 and date("m") <= 12) + { + $nFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")+1)); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y")+1)); + $pFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y"))); + + } + + $sjsStr = ''; + + return $sjsStr; + } + + /** to get the standard filter for the given customview Id + * @param $cvid :: Type Integer + * @returns $stdfilterlist Array in the following format + * $stdfilterlist = Array( 'columnname' => $tablename:$columnname:$fieldname:$module_$fieldlabel,'stdfilter'=>$stdfilter,'startdate'=>$startdate,'enddate'=>$enddate) + */ + + function getStdFilterByCvid($cvid) + { + global $adb; + + $sSQL = "select vtiger_cvstdfilter.* from vtiger_cvstdfilter inner join vtiger_customview on vtiger_customview.cvid = vtiger_cvstdfilter.cvid"; + $sSQL .= " where vtiger_cvstdfilter.cvid=?"; + + $result = $adb->pquery($sSQL, array($cvid)); + $stdfilterrow = $adb->fetch_array($result); + + $stdfilterlist["columnname"] = $stdfilterrow["columnname"]; + $stdfilterlist["stdfilter"] = $stdfilterrow["stdfilter"]; + + if($stdfilterrow["stdfilter"] == "custom" || $stdfilterrow["stdfilter"] == "") + { + if($stdfilterrow["startdate"] != "0000-00-00" && $stdfilterrow["startdate"] != "") + { + $stdfilterlist["startdate"] = $stdfilterrow["startdate"]; + } + if($stdfilterrow["enddate"] != "0000-00-00" && $stdfilterrow["enddate"] != "") + { + $stdfilterlist["enddate"] = $stdfilterrow["enddate"]; + } + }else //if it is not custom get the date according to the selected duration + { + $datefilter = $this->getDateforStdFilterBytype($stdfilterrow["stdfilter"]); + $stdfilterlist["startdate"] = $datefilter[0]; + $stdfilterlist["enddate"] = $datefilter[1]; + } + return $stdfilterlist; + } + + /** to get the Advanced filter for the given customview Id + * @param $cvid :: Type Integer + * @returns $stdfilterlist Array in the following format + * $stdfilterlist = Array( 0=>Array('columnname' => $tablename:$columnname:$fieldname:$module_$fieldlabel,'comparator'=>$comparator,'value'=>$value), + * 1=>Array('columnname' => $tablename1:$columnname1:$fieldname1:$module_$fieldlabel1,'comparator'=>$comparator1,'value'=>$value1), + * | + * 4=>Array('columnname' => $tablename4:$columnname4:$fieldname4:$module_$fieldlabel4,'comparator'=>$comparatorn,'value'=>$valuen), + */ + function getAdvFilterByCvid($cvid) + { + global $adb; + global $modules; + + $sSQL = "select vtiger_cvadvfilter.* from vtiger_cvadvfilter inner join vtiger_customview on vtiger_cvadvfilter.cvid = vtiger_customview.cvid"; + $sSQL .= " where vtiger_cvadvfilter.cvid=?"; + $result = $adb->pquery($sSQL, array($cvid)); + + while($advfilterrow = $adb->fetch_array($result)) + { + $advft["columnname"] = $advfilterrow["columnname"]; + $advft["comparator"] = $advfilterrow["comparator"]; + $advft["value"] = $advfilterrow["value"]; + $advfilterlist[] = $advft; + } + return $advfilterlist; + } + + + /** + * Cache information to perform re-lookups + * + * @var String + */ + protected $_fieldby_tblcol_cache = array(); + + /** + * Function to check if field is present based on + * + * @param String $columnname + * @param String $tablename + */ + function isFieldPresent_ByColumnTable($columnname, $tablename) { + global $adb; + + if(!isset($this->_fieldby_tblcol_cache[$tablename])) { + $query = 'SELECT columnname FROM vtiger_field WHERE tablename = ? and presence in (0,2)'; + + $result = $adb->pquery($query,array($tablename)); + $numrows = $adb->num_rows($result); + + if($numrows) { + $this->_fieldby_tblcol_cache[$tablename] = array(); + for($index = 0; $index < $numrows; ++$index) { + $this->_fieldby_tblcol_cache[$tablename][] = $adb->query_result($result, $index, 'columnname'); + } + } + } + // If still the field was not found (might be disabled or deleted?) + if(!isset($this->_fieldby_tblcol_cache[$tablename])) { + return false; + } + return in_array($columnname, $this->_fieldby_tblcol_cache[$tablename]); + } + + + /** to get the customview Columnlist Query for the given customview Id + * @param $cvid :: Type Integer + * @returns $getCvColumnList as a string + * This function will return the columns for the given customfield in comma seperated values in the format + * $tablename.$columnname,$tablename1.$columnname1, ------ $tablenamen.$columnnamen + * + */ + function getCvColumnListSQL($cvid) + { + global $adb; + $columnslist = $this->getColumnsListByCvid($cvid); + if(isset($columnslist)) + { + foreach($columnslist as $columnname=>$value) + { + $tablefield = ""; + if($value != "") + { + $list = explode(":",$value); + + //Added For getting status for Activities -Jaguar + $sqllist_column = $list[0].".".$list[1]; + if($this->customviewmodule == "Calendar") + { + if($list[1] == "status" || $list[1] == "eventstatus") + { + $sqllist_column = "case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end as activitystatus"; + } + } + //Added for assigned to sorting + if($list[1] == "smownerid") + { + $sqllist_column = "case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name"; + } + if($list[0] == "vtiger_contactdetails" && $list[1] == "lastname") + $sqllist_column = "vtiger_contactdetails.lastname,vtiger_contactdetails.firstname"; + $sqllist[] = $sqllist_column; + //Ends + + $tablefield[$list[0]] = $list[1]; + + //Changed as the replace of module name may replace the string if the fieldname has module name in it -- Jeri + $fieldinfo = explode('_',$list[3],2); + $fieldlabel = $fieldinfo[1]; + $fieldlabel = str_replace("_"," ",$fieldlabel); + + if($this->isFieldPresent_ByColumnTable($list[1], $list[0])){ + + $this->list_fields[$fieldlabel] = $tablefield; + $this->list_fields_name[$fieldlabel] = $list[2]; + } + } + } + $returnsql = implode(",",$sqllist); + } + return $returnsql; + } + + /** to get the customview stdFilter Query for the given customview Id + * @param $cvid :: Type Integer + * @returns $stdfiltersql as a string + * This function will return the standard filter criteria for the given customfield + * + */ + function getCVStdFilterSQL($cvid) + { + global $adb; + $stdfilterlist = $this->getStdFilterByCvid($cvid); + if(isset($stdfilterlist)) + { + foreach($stdfilterlist as $columnname=>$value) + { + if($columnname == "columnname") + { + $filtercolumn = $value; + }elseif($columnname == "stdfilter") + { + $filtertype = $value; + }elseif($columnname == "startdate") + { + $startdate = $value; + }elseif($columnname == "enddate") + { + $enddate = $value; + } + } + if($filtertype != "custom") + { + $datearray = $this->getDateforStdFilterBytype($filtertype); + $startdate = $datearray[0]; + $enddate = $datearray[1]; + } + if($startdate != "" && $enddate != "") { + $columns = explode(":",$filtercolumn); + // Fix for http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/5423 + if ($columns[1] != 'birthday') { + $stdfiltersql = $columns[0].".".$columns[1]." between '".$startdate." 00:00:00' and '".$enddate." 23:59:00'"; + } else { + $stdfiltersql = "DATE_FORMAT(".$columns[0].".".$columns[1].", '%m%d') between DATE_FORMAT('".$startdate."', '%m%d') and DATE_FORMAT('".$enddate."', '%m%d')"; + } + } + } + return $stdfiltersql; + } + /** to get the customview AdvancedFilter Query for the given customview Id + * @param $cvid :: Type Integer + * @returns $advfiltersql as a string + * This function will return the advanced filter criteria for the given customfield + * + */ + function getCVAdvFilterSQL($cvid) + { + global $current_user; + $advfilter = $this->getAdvFilterByCvid($cvid); + if(isset($advfilter)) + { + foreach($advfilter as $key=>$advfltrow) + { + if(isset($advfltrow)) + { + $columns = explode(":",$advfltrow["columnname"]); + $datatype = (isset($columns[4])) ? $columns[4] : ""; + if($advfltrow["columnname"] != "" && $advfltrow["comparator"] != "") + { + + $valuearray = explode(",",trim($advfltrow["value"])); + if(isset($valuearray) && count($valuearray) > 1) + { + $advorsql = ""; + for($n=0;$ngetRealValues($columns[0],$columns[1],$advfltrow["comparator"],trim($valuearray[$n]),$datatype); + } + //If negative logic filter ('not equal to', 'does not contain') is used, 'and' condition should be applied instead of 'or' + if($advfltrow["comparator"] == 'n' || $advfltrow["comparator"] == 'k') + $advorsqls = implode(" and ",$advorsql); + else + $advorsqls = implode(" or ",$advorsql); + $advfiltersql[] = " (".$advorsqls.") "; + }else + { + //Added for getting vtiger_activity Status -Jaguar + if($this->customviewmodule == "Calendar" && ($columns[1] == "status" || $columns[1] == "eventstatus")) + { + if(getFieldVisibilityPermission("Calendar", $current_user->id,'taskstatus') == '0') + { + $advfiltersql[] = "case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end".$this->getAdvComparator($advfltrow["comparator"],trim($advfltrow["value"]),$datatype); + } + else + $advfiltersql[] = "vtiger_activity.eventstatus".$this->getAdvComparator($advfltrow["comparator"],trim($advfltrow["value"]),$datatype); + } + elseif($this->customviewmodule == "Documents" && $columns[1]=='folderid'){ + $advfiltersql[] = "vtiger_attachmentsfolder.foldername".$this->getAdvComparator($advfltrow["comparator"],trim($advfltrow["value"]),$datatype); + } + else + { + $advfiltersql[] = $this->getRealValues($columns[0],$columns[1],$advfltrow["comparator"],trim($advfltrow["value"]),$datatype); + } + } + } + } + } + } + if(isset($advfiltersql)) + { + $advfsql = implode(" and ",$advfiltersql); + } + return $advfsql; + } + + /** to get the realvalues for the given value + * @param $tablename :: type string + * @param $fieldname :: type string + * @param $comparator :: type string + * @param $value :: type string + * @returns $value as a string in the following format + * $tablename.$fieldname comparator + */ + function getRealValues($tablename,$fieldname,$comparator,$value,$datatype) + { + //we have to add the fieldname/tablename.fieldname and the corresponding value (which we want) we can add here. So that when these LHS field comes then RHS value will be replaced for LHS in the where condition of the query + global $adb, $mod_strings, $currentModule, $current_user; + //Added for proper check of contact name in advance filter + if($tablename == "vtiger_contactdetails" && $fieldname == "lastname") + $fieldname = "contactid"; + + $contactid = "vtiger_contactdetails.lastname"; + if ($currentModule != "Contacts" && $currentModule != "Leads" && getFieldVisibilityPermission("Contacts", $current_user->id, 'firstname') == '0' && $currentModule != 'Campaigns') { + $contactid = "concat(vtiger_contactdetails.lastname,' ',vtiger_contactdetails.firstname)"; + } + $change_table_field = Array( + + "product_id"=>"vtiger_products.productname", + "contactid"=>$contactid, + "contact_id"=>$contactid, + "accountid"=>"",//in cvadvfilter accountname is stored for Contact, Potential, Quotes, SO, Invoice + "account_id"=>"",//Same like accountid. No need to change + "vendorid"=>"vtiger_vendor.vendorname", + "vendor_id"=>"vtiger_vendor.vendorname", + "potentialid"=>"vtiger_potential.potentialname", + + "vtiger_account.parentid"=>"vtiger_account2.accountname", + "quoteid"=>"vtiger_quotes.subject", + "salesorderid"=>"vtiger_salesorder.subject", + "campaignid"=>"vtiger_campaign.campaignname", + "vtiger_contactdetails.reportsto"=>"concat(vtiger_contactdetails2.lastname,' ',vtiger_contactdetails2.firstname)", + "vtiger_pricebook.currency_id"=>"vtiger_currency_info.currency_name", + ); + + if($fieldname == "smownerid") + { + $temp_value = "( vtiger_users.user_name".$this->getAdvComparator($comparator,$value,$datatype); + $temp_value.= " OR vtiger_groups.groupname".$this->getAdvComparator($comparator,$value,$datatype); + $value=$temp_value.")"; + }elseif( $fieldname == "inventorymanager") + { + $value = $tablename.".".$fieldname.$this->getAdvComparator($comparator,getUserId_Ol($value),$datatype); + } + elseif($change_table_field[$fieldname] != '')//Added to handle special cases + { + $value = $change_table_field[$fieldname].$this->getAdvComparator($comparator,$value,$datatype); + } + elseif($change_table_field[$tablename.".".$fieldname] != '')//Added to handle special cases + { + $tmp_value = ''; + if((($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($value) == '') || (($comparator == 'n' || $comparator == 'k') && trim($value) != '')) + { + $tmp_value = $change_table_field[$tablename.".".$fieldname].' IS NULL or '; + } + $value = $tmp_value.$change_table_field[$tablename.".".$fieldname].$this->getAdvComparator($comparator,$value,$datatype); + } + elseif($fieldname == "handler") + { + $value = "vtiger_users.user_name".$this->getAdvComparator($comparator,$value,$datatype); + } + elseif(($fieldname == "crmid" && $tablename != 'vtiger_crmentity') || $fieldname == "parent_id" || $fieldname == 'parentid') + { + //For crmentity.crmid the control should not come here. This is only to get the related to modules + $value = $this->getSalesRelatedName($comparator,$value,$datatype,$tablename,$fieldname); + } + else + { + //For checkbox type values, we have to convert yes/no as 1/0 to get the values + $field_uitype = getUItype($this->customviewmodule, $fieldname); + if($field_uitype == 56) + { + if(strtolower($value) == 'yes') $value = 1; + elseif(strtolower($value) == 'no') $value = 0; + } else if(is_uitype($field_uitype, '_picklist_')) { /* Fix for tickets 4465 and 4629 */ + // Get all the keys for the for the Picklist value + $mod_keys = array_keys($mod_strings, $value); + + // Iterate on the keys, to get the first key which doesn't start with LBL_ (assuming it is not used in PickList) + foreach($mod_keys as $mod_idx=>$mod_key) { + $stridx = strpos($mod_key, 'LBL_'); + // Use strict type comparision, refer strpos for more details + if ($stridx !== 0) { + $value = $mod_key; + break; + } + } + } + //added to fix the ticket + if($this->customviewmodule == "Calendar" && ($fieldname=="status" || $fieldname=="taskstatus" || $fieldname=="eventstatus")) + { + if(getFieldVisibilityPermission("Calendar", $current_user->id,'taskstatus') == '0') + { + $value = " (case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end)".$this->getAdvComparator($comparator,$value,$datatype); + } + else + $value = " vtiger_activity.eventstatus ".$this->getAdvComparator($comparator,$value,$datatype); + } elseif ($comparator == 'e' && (trim($value) == "NULL" || trim($value) == '')) { + $value = '('.$tablename.".".$fieldname.' IS NULL OR '.$tablename.".".$fieldname.' = \'\')'; + } else { + $value = $tablename.".".$fieldname.$this->getAdvComparator($comparator,$value,$datatype); + } + //end + } + return $value; + } + + /** to get the related name for the given module + * @param $comparator :: type string, + * @param $value :: type string, + * @param $datatype :: type string, + * @returns $value :: string + */ + + function getSalesRelatedName($comparator,$value,$datatype,$tablename,$fieldname) + { + global $log; + $log->info("in getSalesRelatedName ".$comparator."==".$value."==".$datatype."==".$tablename."==".$fieldname); + global $adb; + + $adv_chk_value = $value; + $value = '('; + $sql = "select distinct(setype) from vtiger_crmentity c INNER JOIN ".$adb->sql_escape_string($tablename)." t ON t.".$adb->sql_escape_string($fieldname)." = c.crmid"; + $res=$adb->pquery($sql, array()); + for($s=0;$s<$adb->num_rows($res);$s++) + { + $modulename=$adb->query_result($res,$s,"setype"); + if($modulename == 'Vendors') + { + continue; + } + if($s != 0) + $value .= ' or '; + if($modulename == 'Accounts') + { + //By Pavani : Related to problem in calender, Ticket: 4284 and 4675 + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + if($tablename == 'vtiger_seactivityrel' && $fieldname == 'crmid') + { + $value .= 'vtiger_account2.accountname IS NULL or '; + } + else{ + $value .= 'vtiger_account.accountname IS NULL or '; + } + } + if($tablename == 'vtiger_seactivityrel' && $fieldname == 'crmid') + { + $value .= 'vtiger_account2.accountname'; + } + else{ + $value .= 'vtiger_account.accountname'; + } + } + if($modulename == 'Leads') + { + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + $value .= " concat(vtiger_leaddetails.lastname,' ',vtiger_leaddetails.firstname) IS NULL or "; + } + $value .= " concat(vtiger_leaddetails.lastname,' ',vtiger_leaddetails.firstname)"; + } + if($modulename == 'Potentials') + { + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + + $value .= ' vtiger_potential.potentialname IS NULL or '; + } + $value .= ' vtiger_potential.potentialname'; + } + if($modulename == 'Products') + { + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + $value .= ' vtiger_products.productname IS NULL or '; + } + $value .= ' vtiger_products.productname'; + } + if($modulename == 'Invoice') + { + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + $value .= ' vtiger_invoice.subject IS NULL or '; + } + $value .= ' vtiger_invoice.subject'; + } + if($modulename == 'PurchaseOrder') + { + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + $value .= ' vtiger_purchaseorder.subject IS NULL or '; + } + $value .= ' vtiger_purchaseorder.subject'; + } + if($modulename == 'SalesOrder') + { + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + $value .= ' vtiger_salesorder.subject IS NULL or '; + } + $value .= ' vtiger_salesorder.subject'; + } + if($modulename == 'Quotes') + { + + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + $value .= ' vtiger_quotes.subject IS NULL or '; + } + $value .= ' vtiger_quotes.subject'; + } + if($modulename == 'Contacts') + { + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + $value .= " concat(vtiger_contactdetails.lastname,' ',vtiger_contactdetails.firstname) IS NULL or "; + } + $value .= " concat(vtiger_contactdetails.lastname,' ',vtiger_contactdetails.firstname)"; + } + if($modulename == 'HelpDesk') + { + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + $value .= ' vtiger_troubletickets.title IS NULL or '; + } + $value .= ' vtiger_troubletickets.title'; + + } + if($modulename == 'Campaigns') + { + if(($comparator == 'e' || $comparator == 's' || $comparator == 'c') && trim($adv_chk_value) == '') + { + $value .= ' vtiger_campaign.campaignname IS NULL or '; + } + $value .= ' vtiger_campaign.campaignname'; + } + + $value .= $this->getAdvComparator($comparator,$adv_chk_value,$datatype); + } + $value .= ")"; + $log->info("in getSalesRelatedName ".$comparator."==".$value."==".$datatype."==".$tablename."==".$fieldname); + return $value; + } + + /** to get the comparator value for the given comparator and value + * @param $comparator :: type string + * @param $value :: type string + * @returns $rtvalue in the format $comparator $value + */ + + function getAdvComparator($comparator,$value,$datatype = '') + { + + global $adb, $default_charset; + $value=html_entity_decode(trim($value),ENT_QUOTES,$default_charset); + $value = $adb->sql_escape_string($value); + if($comparator == "e") + { + if(trim($value) == "NULL") + { + $rtvalue = " is NULL"; + }elseif(trim($value) != "") + { + $rtvalue = " = ".$adb->quote($value); + }elseif(trim($value) == "" && ($datatype == "V" || $datatype == "E")) + { + $rtvalue = " = ".$adb->quote($value); + }else + { + $rtvalue = " is NULL"; + } + } + if($comparator == "n") + { + if(trim($value) == "NULL") + { + $rtvalue = " is NOT NULL"; + }elseif(trim($value) != "") + { + $rtvalue = " <> ".$adb->quote($value); + }elseif(trim($value) == "" && $datatype == "V") + { + $rtvalue = " <> ".$adb->quote($value); + }elseif(trim($value) == "" && $datatype == "E") + { + $rtvalue = " <> ".$adb->quote($value); + }else + { + $rtvalue = " is NOT NULL"; + } + } + if($comparator == "s") + { + if(trim($value) == "" && ($datatype == "V" || $datatype == "E")) + { + $rtvalue = " like '". formatForSqlLike($value, 3) ."'"; + }else + { + $rtvalue = " like '". formatForSqlLike($value, 2) ."'"; + } + } + if($comparator == "ew") + { + if(trim($value) == "" && ($datatype == "V" || $datatype == "E")) + { + $rtvalue = " like '". formatForSqlLike($value, 3) ."'"; + }else + { + $rtvalue = " like '". formatForSqlLike($value, 1) ."'"; + } + } + if($comparator == "c") + { + if(trim($value) == "" && ($datatype == "V" || $datatype == "E")) + { + $rtvalue = " like '". formatForSqlLike($value, 3) ."'"; + }else + { + $rtvalue = " like '". formatForSqlLike($value) ."'"; + } + } + if($comparator == "k") + { + if(trim($value) == "" && ($datatype == "V" || $datatype == "E")) + { + $rtvalue = " not like ''"; + }else + { + $rtvalue = " not like '". formatForSqlLike($value) ."'"; + } + } + if($comparator == "l") + { + $rtvalue = " < ".$adb->quote($value); + } + if($comparator == "g") + { + $rtvalue = " > ".$adb->quote($value); + } + if($comparator == "m") + { + $rtvalue = " <= ".$adb->quote($value); + } + if($comparator == "h") + { + $rtvalue = " >= ".$adb->quote($value); + } + + return $rtvalue; + } + + /** to get the date value for the given type + * @param $type :: type string + * @returns $datevalue array in the following format + * $datevalue = Array(0=>$startdate,1=>$enddate) + */ + + function getDateforStdFilterBytype($type) + { + $thisyear = date("Y"); + $today = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d"), date("Y"))); + $tomorrow = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+1, date("Y"))); + $yesterday = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-1, date("Y"))); + + $currentmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m"), "01", date("Y"))); + $currentmonth1 = date("Y-m-t"); + $lastmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")-1, "01", date("Y"))); + $lastmonth1 = date("Y-m-t", strtotime("-1 Month")); + $nextmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")+1, "01", date("Y"))); + $nextmonth1 = date("Y-m-t", strtotime("+1 Month")); + + $lastweek0 = date("Y-m-d",strtotime("-2 week Sunday")); + $lastweek1 = date("Y-m-d",strtotime("-1 week Saturday")); + + $thisweek0 = date("Y-m-d",strtotime("-1 week Sunday")); + $thisweek1 = date("Y-m-d",strtotime("this Saturday")); + + $nextweek0 = date("Y-m-d",strtotime("this Sunday")); + $nextweek1 = date("Y-m-d",strtotime("+1 week Saturday")); + + $next7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+6, date("Y"))); + $next30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+29, date("Y"))); + $next60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+59, date("Y"))); + $next90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+89, date("Y"))); + $next120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+119, date("Y"))); + + $last7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-6, date("Y"))); + $last30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-29, date("Y"))); + $last60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-59, date("Y"))); + $last90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-89, date("Y"))); + $last120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-119, date("Y"))); + + $currentFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y"))); + $currentFY1 = date("Y-m-t",mktime(0, 0, 0, "12", date("d"), date("Y"))); + $lastFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")-1)); + $lastFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")-1)); + $nextFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")+1)); + $nextFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")+1)); + + if(date("m") <= 4) + { + $cFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "04","30",date("Y"))); + $nFq = date("Y-m-d",mktime(0, 0, 0, "05","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "08","31",date("Y"))); + $pFq = date("Y-m-d",mktime(0, 0, 0, "09","01",date("Y")-1)); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")-1)); + }else if(date("m") > 4 and date("m") <= 8) + { + $pFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "04","30",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "05","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "08","31",date("Y"))); + $nFq = date("Y-m-d",mktime(0, 0, 0, "09","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y"))); + + }else + { + $nFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")+1)); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "04","30",date("Y")+1)); + $pFq = date("Y-m-d",mktime(0, 0, 0, "05","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "08","31",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "09","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y"))); + } + + if($type == "today" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $today; + } + elseif($type == "yesterday" ) + { + + $datevalue[0] = $yesterday; + $datevalue[1] = $yesterday; + } + elseif($type == "tomorrow" ) + { + + $datevalue[0] = $tomorrow; + $datevalue[1] = $tomorrow; + } + elseif($type == "thisweek" ) + { + + $datevalue[0] = $thisweek0; + $datevalue[1] = $thisweek1; + } + elseif($type == "lastweek" ) + { + + $datevalue[0] = $lastweek0; + $datevalue[1] = $lastweek1; + } + elseif($type == "nextweek" ) + { + + $datevalue[0] = $nextweek0; + $datevalue[1] = $nextweek1; + } + elseif($type == "thismonth" ) + { + + $datevalue[0] =$currentmonth0; + $datevalue[1] = $currentmonth1; + } + + elseif($type == "lastmonth" ) + { + + $datevalue[0] = $lastmonth0; + $datevalue[1] = $lastmonth1; + } + elseif($type == "nextmonth" ) + { + + $datevalue[0] = $nextmonth0; + $datevalue[1] = $nextmonth1; + } + elseif($type == "next7days" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $next7days; + } + elseif($type == "next30days" ) + { + + $datevalue[0] =$today; + $datevalue[1] =$next30days; + } + elseif($type == "next60days" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $next60days; + } + elseif($type == "next90days" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $next90days; + } + elseif($type == "next120days" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $next120days; + } + elseif($type == "last7days" ) + { + + $datevalue[0] = $last7days; + $datevalue[1] = $today; + } + elseif($type == "last30days" ) + { + + $datevalue[0] = $last30days; + $datevalue[1] = $today; + } + elseif($type == "last60days" ) + { + + $datevalue[0] = $last60days; + $datevalue[1] = $today; + } + else if($type == "last90days" ) + { + + $datevalue[0] = $last90days; + $datevalue[1] = $today; + } + elseif($type == "last120days" ) + { + + $datevalue[0] = $last120days; + $datevalue[1] = $today; + } + elseif($type == "thisfy" ) + { + + $datevalue[0] = $currentFY0; + $datevalue[1] = $currentFY1; + } + elseif($type == "prevfy" ) + { + + $datevalue[0] = $lastFY0; + $datevalue[1] = $lastFY1; + } + elseif($type == "nextfy" ) + { + + $datevalue[0] = $nextFY0; + $datevalue[1] = $nextFY1; + } + elseif($type == "nextfq" ) + { + + $datevalue[0] = $nFq; + $datevalue[1] = $nFq1; + } + elseif($type == "prevfq" ) + { + + $datevalue[0] = $pFq; + $datevalue[1] = $pFq1; + } + elseif($type == "thisfq") + { + $datevalue[0] = $cFq; + $datevalue[1] = $cFq1; + } + else + { + $datevalue[0] = ""; + $datevalue[1] = ""; + } + + return $datevalue; + } + + /** to get the customview query for the given customview + * @param $viewid (custom view id):: type Integer + * @param $listquery (List View Query):: type string + * @param $module (Module Name):: type string + * @returns $query + */ + + //CHANGE : TO IMPROVE PERFORMANCE + function getModifiedCvListQuery($viewid,$listquery,$module) + { + if($viewid != "" && $listquery != "") + { + + $listviewquery = substr($listquery, strpos($listquery,'FROM'),strlen($listquery)); + if($module == "Calendar" || $module == "Emails") + { + $query = "select ".$this->getCvColumnListSQL($viewid).", vtiger_activity.activityid, vtiger_activity.activitytype as type, vtiger_activity.priority, case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end as status, vtiger_crmentity.crmid,vtiger_contactdetails.contactid ".$listviewquery; + if($module == "Calendar") + $query = str_replace('vtiger_seactivityrel.crmid,','',$query); + }else if($module == "Documents") + { + $query = "select ".$this->getCvColumnListSQL($viewid)." ,vtiger_crmentity.crmid,vtiger_notes.* ".$listviewquery; + } + else if($module == "Products") + { + $query = "select ".$this->getCvColumnListSQL($viewid)." ,vtiger_crmentity.crmid,vtiger_products.* ".$listviewquery; + } + else if($module == "Vendors") + { + $query = "select ".$this->getCvColumnListSQL($viewid)." ,vtiger_crmentity.crmid ".$listviewquery; + } + else if($module == "PriceBooks") + { + $query = "select ".$this->getCvColumnListSQL($viewid)." ,vtiger_crmentity.crmid ".$listviewquery; + } + else if($module == "Faq") + { + $query = "select ".$this->getCvColumnListSQL($viewid)." ,vtiger_crmentity.crmid ".$listviewquery; + } + else if($module == "Potentials" || $module == "Contacts") + { + $query = "select ".$this->getCvColumnListSQL($viewid)." ,vtiger_crmentity.crmid,vtiger_account.accountid ".$listviewquery; + } + else if($module == "Invoice" || $module == "SalesOrder" || $module == "Quotes") + { + $query = "select ".$this->getCvColumnListSQL($viewid)." ,vtiger_crmentity.crmid,vtiger_contactdetails.contactid,vtiger_account.accountid ".$listviewquery; + } + else if($module == "PurchaseOrder") + { + $query = "select ".$this->getCvColumnListSQL($viewid)." ,vtiger_crmentity.crmid,vtiger_contactdetails.contactid ".$listviewquery; + } + + else + { + $query = "select ".$this->getCvColumnListSQL($viewid)." ,vtiger_crmentity.crmid ".$listviewquery; + } + $stdfiltersql = $this->getCVStdFilterSQL($viewid); + $advfiltersql = $this->getCVAdvFilterSQL($viewid); + if(isset($stdfiltersql) && $stdfiltersql != '') + { + $query .= ' and '.$stdfiltersql; + } + if(isset($advfiltersql) && $advfiltersql != '') + { + $query .= ' and '.$advfiltersql; + } + } + return $query; + } + + /** to get the Key Metrics for the home page query for the given customview to find the no of records + * @param $viewid (custom view id):: type Integer + * @param $listquery (List View Query):: type string + * @param $module (Module Name):: type string + * @returns $query + */ + function getMetricsCvListQuery($viewid,$listquery,$module) + { + if($viewid != "" && $listquery != "") + { + $listviewquery = substr($listquery, strpos($listquery,'FROM'),strlen($listquery)); + + $query = "select count(*) AS count ".$listviewquery; + + $stdfiltersql = $this->getCVStdFilterSQL($viewid); + $advfiltersql = $this->getCVAdvFilterSQL($viewid); + if(isset($stdfiltersql) && $stdfiltersql != '') + { + $query .= ' and '.$stdfiltersql; + } + if(isset($advfiltersql) && $advfiltersql != '') + { + $query .= ' and '.$advfiltersql; + } + + } + + return $query; + } + + /** to get the custom action details for the given customview + * @param $viewid (custom view id):: type Integer + * @returns $calist array in the following format + * $calist = Array ('subject'=>$subject, + 'module'=>$module, + 'content'=>$content, + 'cvid'=>$custom view id) + */ + function getCustomActionDetails($cvid) + { + global $adb; + + $sSQL = "select vtiger_customaction.* from vtiger_customaction inner join vtiger_customview on vtiger_customaction.cvid = vtiger_customview.cvid"; + $sSQL .= " where vtiger_customaction.cvid=?"; + $result = $adb->pquery($sSQL, array($cvid)); + + while($carow = $adb->fetch_array($result)) + { + $calist["subject"] = $carow["subject"]; + $calist["module"] = $carow["module"]; + $calist["content"] = $carow["content"]; + $calist["cvid"] = $carow["cvid"]; + } + return $calist; + } + + + /* This function sets the block information for the given module to the class variable module_list + * and return the array + */ + + function getCustomViewModuleInfo($module) + { + global $adb; + global $current_language; + $current_mod_strings = return_specified_module_language($current_language, $module); + $block_info = Array(); + $modules_list = explode(",", $module); + if($module == "Calendar") { + $module = "Calendar','Events"; + $modules_list = array('Calendar', 'Events'); + } + + // Tabid mapped to the list of block labels to be skipped for that tab. + $skipBlocksList = array( + getTabid('Contacts') => array('LBL_IMAGE_INFORMATION'), + getTabid('HelpDesk') => array('LBL_COMMENTS'), + getTabid('Products') => array('LBL_IMAGE_INFORMATION'), + getTabid('Faq') => array('LBL_COMMENT_INFORMATION'), + getTabid('Quotes') => array('LBL_RELATED_PRODUCTS'), + getTabid('PurchaseOrder') => array('LBL_RELATED_PRODUCTS'), + getTabid('SalesOrder') => array('LBL_RELATED_PRODUCTS'), + getTabid('Invoice') => array('LBL_RELATED_PRODUCTS') + ); + + $Sql = "select distinct block,vtiger_field.tabid,name,blocklabel from vtiger_field inner join vtiger_blocks on vtiger_blocks.blockid=vtiger_field.block inner join vtiger_tab on vtiger_tab.tabid=vtiger_field.tabid where displaytype != 3 and vtiger_tab.name in (". generateQuestionMarks($modules_list) .") and vtiger_field.presence in (0,2) order by block"; + $result = $adb->pquery($Sql, array($modules_list)); + if($module == "Calendar','Events") + $module = "Calendar"; + + $pre_block_label = ''; + while($block_result = $adb->fetch_array($result)) + { + $block_label = $block_result['blocklabel']; + $tabid = $block_result['tabid']; + // Skip certain blocks of certain modules + if(array_key_exists($tabid, $skipBlocksList) && in_array($block_label, $skipBlocksList[$tabid])) continue; + + if (trim($block_label) == '') + { + $block_info[$pre_block_label] = $block_info[$pre_block_label].",".$block_result['block']; + }else + { + $lan_block_label = $current_mod_strings[$block_label]; + if (isset($block_info[$lan_block_label]) && $block_info[$lan_block_label] != '') { + $block_info[$lan_block_label] = $block_info[$lan_block_label].",".$block_result['block']; + } else { + $block_info[$lan_block_label] = $block_result['block']; + } + } + $pre_block_label = $lan_block_label; + } + $this->module_list[$module] = $block_info; + return $this->module_list; + } + + /** + * Get the userid, status information of this custom view. + * + * @param Integer $viewid + * @return Array + */ + + function getStatusAndUserid($viewid) { + global $adb; + + if($this->_status === false || $this->_userid === false) { + $query = "SELECT status, userid FROM vtiger_customview WHERE cvid=?"; + $result = $adb->pquery($query, array($viewid)); + if($result && $adb->num_rows($result)) { + $this->_status = $adb->query_result($result, 0, 'status'); + $this->_userid = $adb->query_result($result, 0, 'userid'); + } else { + return false; + } + } + return array('status' => $this->_status, 'userid' => $this->_userid); + + } + + //Function to check if the current user is able to see the customView + function isPermittedCustomView($record_id, $action, $module) + { + global $log, $adb; + global $current_user; + $log->debug("Entering isPermittedCustomView($record_id,$action,$module) method...."); + + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + $permission = "yes"; + + if($record_id != '') + { + $status_userid_info = $this->getStatusAndUserid($record_id); + + if($status_userid_info) + { + $status = $status_userid_info['status']; + $userid = $status_userid_info['userid']; + + if($status == CV_STATUS_DEFAULT) + { + $log->debug("Entering when status=0"); + if($action == 'ListView' || $action == $module."Ajax" || $action == 'index' || $action == 'DetailView') + { + $permission = "yes"; + } + else + $permission = "no"; + } + elseif($is_admin) + { + $permission = 'yes'; + } + elseif ($action != 'ChangeStatus') + { + if($userid == $current_user->id) + { + $log->debug("Entering when $userid=$current_user->id"); + $permission = "yes"; + } + elseif($status == CV_STATUS_PUBLIC) + { + $log->debug("Entering when status=3"); + if($action == 'ListView' || $action == $module."Ajax" || $action == 'index') + { + $permission = "yes"; + } + else + $permission = "no"; + } + elseif($status == CV_STATUS_PRIVATE || $status == CV_STATUS_PENDING) + { + $log->debug("Entering when status=1 or 2"); + if($userid == $current_user->id) + $permission = "yes"; + else + { + /*if($action == 'ListView' || $action == $module."Ajax" || $action == 'index') + {*/ + $log->debug("Entering when status=1 or status=2 & action = ListView or $module.Ajax or index"); + $sql="select vtiger_users.id from vtiger_customview inner join vtiger_users where vtiger_customview.cvid = ? and vtiger_customview.userid in (select vtiger_user2role.userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '%".$current_user_parent_role_seq."::%')"; + $result = $adb->pquery($sql, array($record_id)); + + while($row = $adb->fetchByAssoc($result)) + { + $temp_result[] = $row['id']; + } + $user_array = $temp_result; + if(sizeof($user_array) > 0) + { + if(!in_array($current_user->id,$user_array)) + $permission = "no"; + else + $permission = "yes"; + } + else + $permission = "no"; + /*} + else + { + $log->debug("Entering when status=1 or 2 & action = Editview or Customview"); + $permission = "no"; + }*/ + } + } + else + $permission = "yes"; + } + else + { + $log->debug("Entering else condition............"); + $permission = "no"; + } + } + else + { + $log->debug("Enters when count =0"); + $permission = 'no'; + } + } + $log->debug("Permission @@@@@@@@@@@@@@@@@@@@@@@@@@@ : $permission"); + $log->debug("Exiting isPermittedCustomView($record_id,$action,$module) method...."); + return $permission; + } + + function isPermittedChangeStatus($status) + { + global $current_user,$log; + global $current_language; + $custom_strings = return_module_language($current_language, "CustomView"); + + $log->debug("Entering isPermittedChangeStatus($status) method.............."); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + $status_details = Array(); + if($is_admin) + { + if($status == CV_STATUS_PENDING) + { + $changed_status = CV_STATUS_PUBLIC; + $status_label = $custom_strings['LBL_STATUS_PUBLIC_APPROVE']; + } + elseif($status == CV_STATUS_PUBLIC) + { + $changed_status = CV_STATUS_PENDING; + $status_label = $custom_strings['LBL_STATUS_PUBLIC_DENY']; + } + $status_details = Array('Status'=>$status,'ChangedStatus'=>$changed_status,'Label'=>$status_label); + } + $log->debug("Exiting isPermittedChangeStatus($status) method.............."); + return $status_details; + } + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomView/CustomViewAjax.php b/oss/vtiger/trunk/modules/CustomView/CustomViewAjax.php new file mode 100644 index 00000000..de74ef2f --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/CustomViewAjax.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/CustomView/Delete.php b/oss/vtiger/trunk/modules/CustomView/Delete.php new file mode 100644 index 00000000..ae42e0f7 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/Delete.php @@ -0,0 +1,31 @@ +pquery($deletesql, array($cvid)); + $_SESSION['lvs'][$module]["viewname"] = ''; +} +if(isset($smodule) && $smodule != '') +{ + $smodule_url = "&smodule=".$smodule; +} + +header("Location: index.php?action=ListView&parenttab=$parenttab&module=$module".$smodule_url); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomView/EditView.php b/oss/vtiger/trunk/modules/CustomView/EditView.php new file mode 100644 index 00000000..2ba836b4 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/EditView.php @@ -0,0 +1,391 @@ +>>>>> +global $oCustomView; +//<<<<<>>>>>> + +$error_msg = ''; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +require_once('modules/CustomView/CustomView.php'); + +$cv_module = vtlib_purify($_REQUEST['module']); + +$recordid = vtlib_purify($_REQUEST['record']); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("CATEGORY", getParentTab()); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("MODULE",$cv_module); +$smarty->assign("MODULELABEL",getTranslatedString($cv_module,$cv_module)); +$smarty->assign("CVMODULE", $cv_module); +$smarty->assign("CUSTOMVIEWID",$recordid); +$smarty->assign("DATEFORMAT",$current_user->date_format); +$smarty->assign("JS_DATEFORMAT",parse_calendardate($app_strings['NTC_DATE_FORMAT'])); +$smarty->assign("DATE_JS", ''); +if($recordid == "") +{ + $oCustomView = new CustomView(); + $modulecollist = $oCustomView->getModuleColumnsList($cv_module); + $log->info('CustomView :: Successfully got ColumnsList for the module'.$cv_module); + if(isset($modulecollist)) + { + $choosecolhtml = getByModule_ColumnsHTML($cv_module,$modulecollist); + } + //step2 + $stdfilterhtml = $oCustomView->getStdFilterCriteria(); + $log->info('CustomView :: Successfully got StandardFilter for the module'.$cv_module); + $stdfiltercolhtml = getStdFilterHTML($cv_module); + $stdfilterjs = $oCustomView->getCriteriaJS(); + + //step4 + $advfilterhtml = getAdvCriteriaHTML(); + for($i=1;$i<10;$i++) + { + $smarty->assign("CHOOSECOLUMN".$i,$choosecolhtml); + } + $log->info('CustomView :: Successfully got AdvancedFilter for the module'.$cv_module); + for($i=1;$i<6;$i++) + { + $smarty->assign("FOPTION".$i,$advfilterhtml); + $smarty->assign("BLOCK".$i,$choosecolhtml); + } + + $smarty->assign("STDFILTERCOLUMNS",$stdfiltercolhtml); + $smarty->assign("STDCOLUMNSCOUNT",count($stdfiltercolhtml)); + $smarty->assign("STDFILTERCRITERIA",$stdfilterhtml); + $smarty->assign("STDFILTER_JAVASCRIPT",$stdfilterjs); + + $smarty->assign("MANDATORYCHECK",implode(",",array_unique($oCustomView->mandatoryvalues))); + $smarty->assign("SHOWVALUES",implode(",",$oCustomView->showvalues)); + $data_type[] = $oCustomView->data_type; + $smarty->assign("DATATYPE",$data_type); + +} +else +{ + $oCustomView = new CustomView($cv_module); + $now_action = vtlib_purify($_REQUEST['action']); + if($oCustomView->isPermittedCustomView($recordid,$now_action,$oCustomView->customviewmodule) == 'yes') + { + $customviewdtls = $oCustomView->getCustomViewByCvid($recordid); + $log->info('CustomView :: Successfully got ViewDetails for the Viewid'.$recordid); + $modulecollist = $oCustomView->getModuleColumnsList($cv_module); + $selectedcolumnslist = $oCustomView->getColumnsListByCvid($recordid); + $log->info('CustomView :: Successfully got ColumnsList for the Viewid'.$recordid); + + $smarty->assign("VIEWNAME",$customviewdtls["viewname"]); + + if($customviewdtls["setdefault"] == 1) + { + $smarty->assign("CHECKED","checked"); + } + if($customviewdtls["setmetrics"] == 1) + { + $smarty->assign("MCHECKED","checked"); + } + $status = $customviewdtls["status"]; + $smarty->assign("STATUS",$status); + + for($i=1;$i<10;$i++) + { + $choosecolhtml = getByModule_ColumnsHTML($cv_module,$modulecollist,$selectedcolumnslist[$i-1]); + $smarty->assign("CHOOSECOLUMN".$i,$choosecolhtml); + } + + $stdfilterlist = $oCustomView->getStdFilterByCvid($recordid); + $log->info('CustomView :: Successfully got Standard Filter for the Viewid'.$recordid); + $stdfilterlist["stdfilter"] = ($stdfilterlist["stdfilter"] != "") ? ($stdfilterlist["stdfilter"]) : ("custom"); + $stdfilterhtml = $oCustomView->getStdFilterCriteria($stdfilterlist["stdfilter"]); + $stdfiltercolhtml = getStdFilterHTML($cv_module,$stdfilterlist["columnname"]); + $stdfilterjs = $oCustomView->getCriteriaJS(); + + if(isset($stdfilterlist["startdate"]) && isset($stdfilterlist["enddate"])) + { + $smarty->assign("STARTDATE",getDisplayDate($stdfilterlist["startdate"])); + $smarty->assign("ENDDATE",getDisplayDate($stdfilterlist["enddate"])); + } + else{ + $smarty->assign("STARTDATE",$stdfilterlist["startdate"]); + $smarty->assign("ENDDATE",$stdfilterlist["enddate"]); + } + + $advfilterlist = $oCustomView->getAdvFilterByCvid($recordid); + $log->info('CustomView :: Successfully got Advanced Filter for the Viewid'.$recordid,'info'); + for($i=1;$i<6;$i++) + { + $advfilterhtml = getAdvCriteriaHTML($advfilterlist[$i-1]["comparator"]); + $advcolumnhtml = getByModule_ColumnsHTML($cv_module,$modulecollist,$advfilterlist[$i-1]["columnname"]); + $smarty->assign("FOPTION".$i,$advfilterhtml); + $smarty->assign("BLOCK".$i,$advcolumnhtml); + $col = explode(":",$advfilterlist[$i-1]["columnname"]); + $temp_val = explode(",",$advfilterlist[$i-1]["value"]); + $and_text = " ".$mod_strings['LBL_AND']; + if($col[4] == 'D' || ($col[4] == 'T' && $col[1] != 'time_start' && $col[1] != 'time_end') || $col[4] == 'DT') + { + $val = Array(); + for($x=0;$xdate_format.") ".$mod_strings['LBL_AND']; + } + $smarty->assign("VALUE".$i,$advfilterlist[$i-1]["value"]); + $smarty->assign("AND_TEXT".$i,$and_text); + } + $smarty->assign("STDFILTERCOLUMNS",$stdfiltercolhtml); + $smarty->assign("STDCOLUMNSCOUNT",count($stdfiltercolhtml)); + $smarty->assign("STDFILTERCRITERIA",$stdfilterhtml); + $smarty->assign("STDFILTER_JAVASCRIPT",$stdfilterjs); + $smarty->assign("MANDATORYCHECK",implode(",",array_unique($oCustomView->mandatoryvalues))); + $smarty->assign("SHOWVALUES",implode(",",$oCustomView->showvalues)); + $smarty->assign("EXIST","true"); + $cactionhtml = ""; + + if($cv_module == "Leads" || $cv_module == "Accounts" || $cv_module == "Contacts") + { + $smarty->assign("CUSTOMACTIONBUTTON",$cactionhtml); + } + $data_type[] = $oCustomView->data_type; + $smarty->assign("DATATYPE",$data_type); + } + else + { + echo "
"; + echo "
+ + + + + + + + +
$app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; + } +} + +$smarty->assign("RETURN_MODULE", $cv_module); +if($cv_module == "Calendar") + $return_action = "ListView"; +else + $return_action = "index"; + +if($recordid == '') + $act = $mod_strings['LBL_NEW']; +else + $act = $mod_strings['LBL_EDIT']; + +$smarty->assign("ACT", $act); +$smarty->assign("RETURN_ACTION", $return_action); + +$smarty->display("CustomView.tpl"); + +function getByModule_ColumnsHTML($module,$columnslist,$selected="") +{ + global $oCustomView, $current_language,$theme; + global $app_list_strings; + $advfilter = array(); + $mod_strings = return_specified_module_language($current_language,$module); + + $check_dup = Array(); + foreach($oCustomView->module_list[$module] as $key=>$value) + { + $advfilter = array(); + $label = $key; + if(isset($columnslist[$module][$key])) + { + foreach($columnslist[$module][$key] as $field=>$fieldlabel) + { + if(!in_array($fieldlabel,$check_dup)) + { + if(isset($mod_strings[$fieldlabel])) + { + if($selected == $field) + { + $advfilter_option['value'] = $field; + $advfilter_option['text'] = $mod_strings[$fieldlabel]; + $advfilter_option['selected'] = "selected"; + }else + { + $advfilter_option['value'] = $field; + $advfilter_option['text'] = $mod_strings[$fieldlabel]; + $advfilter_option['selected'] = ""; + } + }else + { + if($selected == $field) + { + $advfilter_option['value'] = $field; + $advfilter_option['text'] = $fieldlabel; + $advfilter_option['selected'] = "selected"; + }else + { + $advfilter_option['value'] = $field; + $advfilter_option['text'] = $fieldlabel; + $advfilter_option['selected'] = ""; + } + } + $advfilter[] = $advfilter_option; + $check_dup [] = $fieldlabel; + } + } + $advfilter_out[$label]= $advfilter; + } + } + // Special case handling only for Calendar moudle - Not required for other modules. + if($module == 'Calendar') { + $finalfield = Array(); + $finalfield1 = Array(); + $finalfield2 = Array(); + $newLabel = $mod_strings['LBL_CALENDAR_INFORMATION']; + + if(isset($advfilter_out[$mod_strings['LBL_TASK_INFORMATION']])) { + $finalfield1 = $advfilter_out[$mod_strings['LBL_TASK_INFORMATION']]; + } + if(isset($advfilter_out[$mod_strings['LBL_EVENT_INFORMATION']])) { + $finalfield2 = $advfilter_out[$mod_strings['LBL_EVENT_INFORMATION']]; + } + $finalfield[$newLabel] = array_merge($finalfield1,$finalfield2); + if (isset ($advfilter_out[$mod_strings['LBL_CUSTOM_INFORMATION']])) { + $finalfield[$mod_strings['LBL_CUSTOM_INFORMATION']] = $advfilter_out[$mod_strings['LBL_CUSTOM_INFORMATION']]; + } + $advfilter_out=$finalfield; + } + return $advfilter_out; +} + + /** to get the standard filter criteria + * @param $module(module name) :: Type String + * @param $elected (selection status) :: Type String (optional) + * @returns $filter Array in the following format + * $filter = Array( 0 => array('value'=>$tablename:$colname:$fieldname:$fieldlabel,'text'=>$mod_strings[$field label],'selected'=>$selected), + * 1 => array('value'=>$$tablename1:$colname1:$fieldname1:$fieldlabel1,'text'=>$mod_strings[$field label1],'selected'=>$selected), + */ +function getStdFilterHTML($module,$selected="") +{ + global $app_list_strings, $current_language,$app_strings,$current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + global $oCustomView; + $stdfilter = array(); + $result = $oCustomView->getStdCriteriaByModule($module); + $mod_strings = return_module_language($current_language,$module); + + if(isset($result)) + { + foreach($result as $key=>$value) + { + if($value == 'Start Date & Time') + { + $value = 'Start Date'; + } + $use_module_label = getTranslatedString($module, $module); + if(isset($app_list_strings['moduleList'][$module])) { + $use_module_label = $app_list_strings['moduleList'][$module]; + } + if(isset($mod_strings[$value])) + { + if($key == $selected) + { + + $filter['value'] = $key; + $filter['text'] = $use_module_label." - ".getTranslatedString($value); + $filter['selected'] = "selected"; + }else + { + $filter['value'] = $key; + $filter['text'] = $use_module_label." - ".getTranslatedString($value); + $filter['selected'] =""; + } + } + else + { + if($key == $selected) + { + $filter['value'] = $key; + + $filter['text'] = $use_module_label." - ".$value; + $filter['selected'] = 'selected'; + }else + { + $filter['value'] = $key; + $filter['text'] = $use_module_label." - ".$value; + $filter['selected'] =''; + } + } + $stdfilter[]=$filter; + //added to fix ticket #5117. If a user doesn't have permission for a field and it has been used to fileter a custom view, it should be get displayed to him as Not Accessible. + if(!$is_admin && $selected != '' && $filter['selected'] == '') + { + $keys = explode(":",$selected); + if(getFieldVisibilityPermission($module,$current_user->id,$keys[2]) != '0') + { + $filter['value'] = "not_accessible"; + $filter['text'] = $app_strings["LBL_NOT_ACCESSIBLE"]; + $filter['selected'] = "selected"; + $stdfilter[]=$filter; + } + } + + } + + } + return $stdfilter; +} + + /** to get the Advanced filter criteria + * @param $selected :: Type String (optional) + * @returns $AdvCriteria Array in the following format + * $AdvCriteria = Array( 0 => array('value'=>$tablename:$colname:$fieldname:$fieldlabel,'text'=>$mod_strings[$field label],'selected'=>$selected), + * 1 => array('value'=>$$tablename1:$colname1:$fieldname1:$fieldlabel1,'text'=>$mod_strings[$field label1],'selected'=>$selected), + * | + * n => array('value'=>$$tablenamen:$colnamen:$fieldnamen:$fieldlabeln,'text'=>$mod_strings[$field labeln],'selected'=>$selected)) + */ +function getAdvCriteriaHTML($selected="") +{ + global $adv_filter_options; + global $app_list_strings; + $AdvCriteria = array(); + foreach($adv_filter_options as $key=>$value) + { + if($selected == $key) + { + $advfilter_criteria['value'] = $key; + $advfilter_criteria['text'] = $value; + $advfilter_criteria['selected'] = "selected"; + }else + { + $advfilter_criteria['value'] = $key; + $advfilter_criteria['text'] = $value; + $advfilter_criteria['selected'] = ""; + } + $AdvCriteria[] = $advfilter_criteria; + } + + return $AdvCriteria; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomView/Forms.php b/oss/vtiger/trunk/modules/CustomView/Forms.php new file mode 100644 index 00000000..6de4e159 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/Forms.php @@ -0,0 +1,253 @@ +$unused) + { + $print_required_array .= "required['$required'] = '". $all_fields[$required] . "';\n"; + + } + + $the_script = << + + + +EOQ; + + return $the_script; +} + + + + +function get_validate_upload_js () +{ + global $mod_strings; + + $err_missing_required_fields = $mod_strings['ERR_MISSING_REQUIRED_FIELDS']; + $lbl_select_file = $mod_strings['ERR_SELECT_FILE']; + $lbl_custom = $mod_strings['LBL_CUSTOM']; + + $the_script = << + + + +EOQ; + + return $the_script; +} + +function getFieldSelect(&$column_fields,$colnum,&$required_fields,$suggest_field,$translated_fields,$module) +{ + global $mod_strings; + global $app_strings; + global $outlook_contacts_field_map; + require_once('include/database/PearDatabase.php'); + global $adb; + + $output = "\n"; + + return $output; + +} + + +function get_readonly_js () +{ +?> + + + diff --git a/oss/vtiger/trunk/modules/CustomView/ListViewTop.php b/oss/vtiger/trunk/modules/CustomView/ListViewTop.php new file mode 100644 index 00000000..8e739d88 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/ListViewTop.php @@ -0,0 +1,173 @@ +Array(0=>'image name', + * 1=>'Key Metrics', + * 2=>'home_metrics' + * ), + * 'Header'=>Array(0=>'Metrics', + * 1=>'Count' + * ), + * 'Entries'=>Array($cvid=>Array( + * 0=>$customview name, + * 1=>$no of records for the view + * ), + * $cvid=>Array( + * 0=>$customview name, + * 1=>$no of records for the view + * ), + * | + * | + * $cvid=>Array( + * 0=>$customview name, + * 1=>$no of records for the view + * ) + * ) + * + */ +function getKeyMetrics($maxval,$calCnt) +{ + require_once("data/Tracker.php"); + require_once('modules/CustomView/CustomView.php'); + require_once('include/logging.php'); + require_once('include/ListView/ListView.php'); + + global $app_strings; + global $adb; + global $log; + global $current_language; + $metricviewnames = "'Hot Leads'"; + + $current_module_strings = return_module_language($current_language, "CustomView"); + $log = LoggerManager::getLogger('metrics'); + + $metriclists = getMetricList(); + + // Determine if the KeyMetrics widget should appear or not? + if($calCnt == 'calculateCnt') { + return count($metriclists); + } + + $log->info("Metrics :: Successfully got MetricList to be displayed"); + if(isset($metriclists)) + { + foreach ($metriclists as $key => $metriclist) + { + $listquery = getListQuery($metriclist['module']); + if($metriclist['module'] == 'Calendar') + $listquery .= " AND vtiger_activity.activitytype != 'Emails' "; + $oCustomView = new CustomView($metriclist['module']); + $metricsql = $oCustomView->getMetricsCvListQuery($metriclist['id'],$listquery,$metriclist['module']); + if($metriclist['module'] == "Calendar" and !$adb->isPostgres()) + $metricsql.=" group by vtiger_activity.activityid "; + + $metricresult = $adb->query($metricsql); + if($metricresult) + { + if($metriclist['module'] == "Calendar") + $metriclists[$key]['count'] = $adb->num_rows($metricresult); + else + { + $rowcount = $adb->fetch_array($metricresult); + if(isset($rowcount)) + { + $metriclists[$key]['count'] = $rowcount['count']; + } + } + } + } + $log->info("Metrics :: Successfully build the Metrics"); + } + $title=array(); + $title[]='keyMetrics.gif'; + $title[]=$app_strings['LBL_HOME_KEY_METRICS']; + $title[]='home_metrics'; + $header=Array(); + $header[]=$app_strings['LBL_HOME_METRICS']; + $header[]=$app_strings['LBL_MODULE']; + $header[]=$app_strings['LBL_HOME_COUNT']; + $entries=Array(); + if(isset($metriclists)) + { + $oddRow = true; + foreach($metriclists as $metriclist) + { + $value=array(); + $CVname = (strlen($metriclist['name']) > 20) ? (substr($metriclist['name'],0,20).'...') : $metriclist['name']; + $value[]=''.$CVname . ' ('. $metriclist['user'] .')'; + $value[]=''.getTranslatedString($metriclist['module']). ''; + $value[]=''.$metriclist['count'].''; + $entries[$metriclist['id']]=$value; + } + + } + $values=Array('Title'=>$title,'Header'=>$header,'Entries'=>$entries); + if ( ($display_empty_home_blocks ) || (count($value)!= 0) ) + return $values; + +} + + /** to get the details of a customview Entries + * @returns $metriclists Array in the following format + * $customviewlist []= Array('id'=>custom view id, + * 'name'=>custom view name, + * 'module'=>modulename, + 'count'=>'' + ) + */ +function getMetricList() +{ + global $adb, $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + + $ssql = "select vtiger_customview.* from vtiger_customview inner join vtiger_tab on vtiger_tab.name = vtiger_customview.entitytype"; + $ssql .= " where vtiger_customview.setmetrics = 1 "; + $sparams = array(); + + if($is_admin == false){ + $ssql .= " and (vtiger_customview.status=0 or vtiger_customview.userid = ? or vtiger_customview.status =3 or vtiger_customview.userid in(select vtiger_user2role.userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '".$current_user_parent_role_seq."::%'))"; + array_push($sparams, $current_user->id); + } + $ssql .= " order by vtiger_customview.entitytype"; + $result = $adb->pquery($ssql, $sparams); + while($cvrow=$adb->fetch_array($result)) + { + $metricslist = Array(); + + if(vtlib_isModuleActive($cvrow['entitytype'])){ + $metricslist['id'] = $cvrow['cvid']; + $metricslist['name'] = $cvrow['viewname']; + $metricslist['module'] = $cvrow['entitytype']; + $metricslist['user'] = getUserName($cvrow['userid']); + $metricslist['count'] = ''; + if(isPermitted($cvrow['entitytype'],"index") == "yes"){ + $metriclists[] = $metricslist; + } + } + } + + return $metriclists; +} + +?> diff --git a/oss/vtiger/trunk/modules/CustomView/PopulateCustomView.php b/oss/vtiger/trunk/modules/CustomView/PopulateCustomView.php new file mode 100644 index 00000000..0556ff37 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/PopulateCustomView.php @@ -0,0 +1,644 @@ +'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Leads','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'Hot Leads', + 'setdefault'=>'0','setmetrics'=>'1','status'=>'3','userid'=>'1', + 'cvmodule'=>'Leads','stdfilterid'=>'','advfilterid'=>'0'), + + Array('viewname'=>'This Month Leads', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Leads','stdfilterid'=>'0','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Accounts','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'Prospect Accounts', + 'setdefault'=>'0','setmetrics'=>'1','status'=>'3','userid'=>'1', + 'cvmodule'=>'Accounts','stdfilterid'=>'','advfilterid'=>'1'), + + Array('viewname'=>'New This Week', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Accounts','stdfilterid'=>'1','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Contacts','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'Contacts Address', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Contacts','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'Todays Birthday', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Contacts','stdfilterid'=>'2','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Potentials','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'Potentials Won', + 'setdefault'=>'0','setmetrics'=>'1','status'=>'3','userid'=>'1', + 'cvmodule'=>'Potentials','stdfilterid'=>'','advfilterid'=>'2'), + + Array('viewname'=>'Prospecting', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Potentials','stdfilterid'=>'','advfilterid'=>'3'), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'HelpDesk','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'Open Tickets', + 'setdefault'=>'0','setmetrics'=>'1','status'=>'3','userid'=>'1', + 'cvmodule'=>'HelpDesk','stdfilterid'=>'','advfilterid'=>'4'), + + Array('viewname'=>'High Prioriy Tickets', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'HelpDesk','stdfilterid'=>'','advfilterid'=>'5'), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Quotes','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'Open Quotes', + 'setdefault'=>'0','setmetrics'=>'1','status'=>'3','userid'=>'1', + 'cvmodule'=>'Quotes','stdfilterid'=>'','advfilterid'=>'6'), + + Array('viewname'=>'Rejected Quotes', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Quotes','stdfilterid'=>'','advfilterid'=>'7'), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Calendar','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Emails','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Invoice','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Documents','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'PriceBooks','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Products','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'PurchaseOrder','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'SalesOrder','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Vendors','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Faq','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Campaigns','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'All', + 'setdefault'=>'1','setmetrics'=>'0','status'=>'0','userid'=>'1', + 'cvmodule'=>'Webmails','stdfilterid'=>'','advfilterid'=>''), + + Array('viewname'=>'Drafted FAQ', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Faq','stdfilterid'=>'','advfilterid'=>'8'), + + Array('viewname'=>'Published FAQ', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Faq','stdfilterid'=>'','advfilterid'=>'9'), + + Array('viewname'=>'Open Purchase Orders', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'PurchaseOrder','stdfilterid'=>'','advfilterid'=>'10'), + + Array('viewname'=>'Received Purchase Orders', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'PurchaseOrder','stdfilterid'=>'','advfilterid'=>'11'), + + Array('viewname'=>'Open Invoices', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Invoice','stdfilterid'=>'','advfilterid'=>'12'), + + Array('viewname'=>'Paid Invoices', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'Invoice','stdfilterid'=>'','advfilterid'=>'13'), + + Array('viewname'=>'Pending Sales Orders', + 'setdefault'=>'0','setmetrics'=>'0','status'=>'3','userid'=>'1', + 'cvmodule'=>'SalesOrder','stdfilterid'=>'','advfilterid'=>'14'), + ); + + +$cvcolumns = Array(Array('vtiger_leaddetails:lead_no:lead_no:Leads_Lead_No:V', + 'vtiger_leaddetails:lastname:lastname:Leads_Last_Name:V', + 'vtiger_leaddetails:firstname:firstname:Leads_First_Name:V', + 'vtiger_leaddetails:company:company:Leads_Company:V', + 'vtiger_leadaddress:phone:phone:Leads_Phone:V', + 'vtiger_leadsubdetails:website:website:Leads_Website:V', + 'vtiger_leaddetails:email:email:Leads_Email:E', + 'vtiger_crmentity:smownerid:assigned_user_id:Leads_Assigned_To:V'), + + Array('vtiger_leaddetails:firstname:firstname:Leads_First_Name:V', + 'vtiger_leaddetails:lastname:lastname:Leads_Last_Name:V', + 'vtiger_leaddetails:company:company:Leads_Company:V', + 'vtiger_leaddetails:leadsource:leadsource:Leads_Lead_Source:V', + 'vtiger_leadsubdetails:website:website:Leads_Website:V', + 'vtiger_leaddetails:email:email:Leads_Email:E'), + + Array('vtiger_leaddetails:firstname:firstname:Leads_First_Name:V', + 'vtiger_leaddetails:lastname:lastname:Leads_Last_Name:V', + 'vtiger_leaddetails:company:company:Leads_Company:V', + 'vtiger_leaddetails:leadsource:leadsource:Leads_Lead_Source:V', + 'vtiger_leadsubdetails:website:website:Leads_Website:V', + 'vtiger_leaddetails:email:email:Leads_Email:E'), + + Array('vtiger_account:account_no:account_no:Accounts_Account_No:V', + 'vtiger_account:accountname:accountname:Accounts_Account_Name:V', + 'vtiger_accountbillads:bill_city:bill_city:Accounts_City:V', + 'vtiger_account:website:website:Accounts_Website:V', + 'vtiger_account:phone:phone:Accounts_Phone:V', + 'vtiger_crmentity:smownerid:assigned_user_id:Accounts_Assigned_To:V'), + + Array('vtiger_account:accountname:accountname:Accounts_Account_Name:V', + 'vtiger_account:phone:phone:Accounts_Phone:V', + 'vtiger_account:website:website:Accounts_Website:V', + 'vtiger_account:rating:rating:Accounts_Rating:V', + 'vtiger_crmentity:smownerid:assigned_user_id:Accounts_Assigned_To:V'), + + Array('vtiger_account:accountname:accountname:Accounts_Account_Name:V', + 'vtiger_account:phone:phone:Accounts_Phone:V', + 'vtiger_account:website:website:Accounts_Website:V', + 'vtiger_accountbillads:bill_city:bill_city:Accounts_City:V', + 'vtiger_crmentity:smownerid:assigned_user_id:Accounts_Assigned_To:V'), + + Array('vtiger_contactdetails:contact_no:contact_no:Contacts_Contact_Id:V', + 'vtiger_contactdetails:firstname:firstname:Contacts_First_Name:V', + 'vtiger_contactdetails:lastname:lastname:Contacts_Last_Name:V', + 'vtiger_contactdetails:title:title:Contacts_Title:V', + 'vtiger_account:accountname:accountname:Contacts_Account_Name:V', + 'vtiger_contactdetails:email:email:Contacts_Email:E', + 'vtiger_contactdetails:phone:phone:Contacts_Office_Phone:V', + 'vtiger_crmentity:smownerid:assigned_user_id:Contacts_Assigned_To:V'), + + Array('vtiger_contactdetails:firstname:firstname:Contacts_First_Name:V', + 'vtiger_contactdetails:lastname:lastname:Contacts_Last_Name:V', + 'vtiger_contactaddress:mailingstreet:mailingstreet:Contacts_Mailing_Street:V', + 'vtiger_contactaddress:mailingcity:mailingcity:Contacts_Mailing_City:V', + 'vtiger_contactaddress:mailingstate:mailingstate:Contacts_Mailing_State:V', + 'vtiger_contactaddress:mailingzip:mailingzip:Contacts_Mailing_Zip:V', + 'vtiger_contactaddress:mailingcountry:mailingcountry:Contacts_Mailing_Country:V'), + + Array('vtiger_contactdetails:firstname:firstname:Contacts_First_Name:V', + 'vtiger_contactdetails:lastname:lastname:Contacts_Last_Name:V', + 'vtiger_contactdetails:title:title:Contacts_Title:V', + 'vtiger_account:accountname:accountname:Contacts_Account_Name:V', + 'vtiger_contactdetails:email:email:Contacts_Email:E', + 'vtiger_contactsubdetails:otherphone:otherphone:Contacts_Phone:V', + 'vtiger_crmentity:smownerid:assigned_user_id:Contacts_Assigned_To:V'), + + Array('vtiger_potential:potential_no:potential_no:Potentials_Potential_No:V', + 'vtiger_potential:potentialname:potentialname:Potentials_Potential_Name:V', + 'vtiger_potential:related_to:related_to:Potentials_Related_To:V', + 'vtiger_potential:sales_stage:sales_stage:Potentials_Sales_Stage:V', + 'vtiger_potential:leadsource:leadsource:Potentials_Lead_Source:V', + 'vtiger_potential:closingdate:closingdate:Potentials_Expected_Close_Date:D', + 'vtiger_crmentity:smownerid:assigned_user_id:Potentials_Assigned_To:V'), + + Array('vtiger_potential:potentialname:potentialname:Potentials_Potential_Name:V', + 'vtiger_potential:related_to:related_to:Potentials_Related_To:V', + 'vtiger_potential:amount:amount:Potentials_Amount:N', + 'vtiger_potential:closingdate:closingdate:Potentials_Expected_Close_Date:D', + 'vtiger_crmentity:smownerid:assigned_user_id:Potentials_Assigned_To:V'), + + Array('vtiger_potential:potentialname:potentialname:Potentials_Potential_Name:V', + 'vtiger_potential:related_to:related_to:Potentials_Related_To:V', + 'vtiger_potential:amount:amount:Potentials_Amount:N', + 'vtiger_potential:leadsource:leadsource:Potentials_Lead_Source:V', + 'vtiger_potential:closingdate:closingdate:Potentials_Expected_Close_Date:D', + 'vtiger_crmentity:smownerid:assigned_user_id:Potentials_Assigned_To:V'), + + Array(//'vtiger_crmentity:crmid::HelpDesk_Ticket_ID:I', + 'vtiger_troubletickets:ticket_no:ticket_no:HelpDesk_Ticket_No:V', + 'vtiger_troubletickets:title:ticket_title:HelpDesk_Title:V', + 'vtiger_troubletickets:parent_id:parent_id:HelpDesk_Related_To:I', + 'vtiger_troubletickets:status:ticketstatus:HelpDesk_Status:V', + 'vtiger_troubletickets:priority:ticketpriorities:HelpDesk_Priority:V', + 'vtiger_crmentity:smownerid:assigned_user_id:HelpDesk_Assigned_To:V'), + + Array('vtiger_troubletickets:title:ticket_title:HelpDesk_Title:V', + 'vtiger_troubletickets:parent_id:parent_id:HelpDesk_Related_To:I', + 'vtiger_troubletickets:priority:ticketpriorities:HelpDesk_Priority:V', + 'vtiger_troubletickets:product_id:product_id:HelpDesk_Product_Name:I', + 'vtiger_crmentity:smownerid:assigned_user_id:HelpDesk_Assigned_To:V'), + + Array('vtiger_troubletickets:title:ticket_title:HelpDesk_Title:V', + 'vtiger_troubletickets:parent_id:parent_id:HelpDesk_Related_To:I', + 'vtiger_troubletickets:status:ticketstatus:HelpDesk_Status:V', + 'vtiger_troubletickets:product_id:product_id:HelpDesk_Product_Name:I', + 'vtiger_crmentity:smownerid:assigned_user_id:HelpDesk_Assigned_To:V'), + + Array('vtiger_quotes:quote_no:quote_no:Quotes_Quote_No:V', + 'vtiger_quotes:subject:subject:Quotes_Subject:V', + 'vtiger_quotes:quotestage:quotestage:Quotes_Quote_Stage:V', + 'vtiger_quotes:potentialid:potential_id:Quotes_Potential_Name:I', + 'vtiger_account:accountname:accountname:Quotes_Account_Name:V', + 'vtiger_quotes:total:hdnGrandTotal:Quotes_Total:I', + 'vtiger_crmentity:smownerid:assigned_user_id:Quotes_Assigned_To:V'), + + Array('vtiger_quotes:subject:subject:Quotes_Subject:V', + 'vtiger_quotes:quotestage:quotestage:Quotes_Quote_Stage:V', + 'vtiger_quotes:potentialid:potential_id:Quotes_Potential_Name:I', + 'vtiger_account:accountname:accountname:Quotes_Account_Name:V', + 'vtiger_quotes:validtill:validtill:Quotes_Valid_Till:D', + 'vtiger_crmentity:smownerid:assigned_user_id:Quotes_Assigned_To:V'), + + Array('vtiger_quotes:subject:subject:Quotes_Subject:V', + 'vtiger_quotes:potentialid:potential_id:Quotes_Potential_Name:I', + 'vtiger_account:accountname:accountname:Quotes_Account_Name:V', + 'vtiger_quotes:validtill:validtill:Quotes_Valid_Till:D', + 'vtiger_crmentity:smownerid:assigned_user_id:Quotes_Assigned_To:V'), + + Array('vtiger_activity:status:taskstatus:Calendar_Status:V', + 'vtiger_activity:activitytype:activitytype:Calendar_Type:V', + 'vtiger_activity:subject:subject:Calendar_Subject:V', + 'vtiger_seactivityrel:crmid:parent_id:Calendar_Related_to:V', + 'vtiger_activity:date_start:date_start:Calendar_Start_Date:D', + 'vtiger_activity:due_date:due_date:Calendar_End_Date:D', + 'vtiger_crmentity:smownerid:assigned_user_id:Calendar_Assigned_To:V'), + + Array('vtiger_activity:subject:subject:Emails_Subject:V', + 'vtiger_emaildetails:to_email:saved_toid:Emails_To:V', + 'vtiger_activity:date_start:date_start:Emails_Date_Sent:D'), + + Array('vtiger_invoice:invoice_no:invoice_no:Invoice_Invoice_No:V', + 'vtiger_invoice:subject:subject:Invoice_Subject:V', + 'vtiger_invoice:salesorderid:salesorder_id:Invoice_Sales_Order:I', + 'vtiger_invoice:invoicestatus:invoicestatus:Invoice_Status:V', + 'vtiger_invoice:total:hdnGrandTotal:Invoice_Total:I', + 'vtiger_crmentity:smownerid:assigned_user_id:Invoice_Assigned_To:V'), + + Array('vtiger_notes:note_no:note_no:Notes_Note_No:V', + 'vtiger_notes:title:notes_title:Notes_Title:V', + 'vtiger_notes:filename:filename:Notes_File:V', + 'vtiger_crmentity:modifiedtime:modifiedtime:Notes_Modified_Time:V', + 'vtiger_crmentity:smownerid:assigned_user_id:Notes_Assigned_To:V'), + + Array('vtiger_pricebook:pricebook_no:pricebook_no:PriceBooks_PriceBook_No:V', + 'vtiger_pricebook:bookname:bookname:PriceBooks_Price_Book_Name:V', + 'vtiger_pricebook:active:active:PriceBooks_Active:V', + 'vtiger_pricebook:currency_id:currency_id:PriceBooks_Currency:I'), + + Array('vtiger_products:product_no:product_no:Products_Product_No:V', + 'vtiger_products:productname:productname:Products_Product_Name:V', + 'vtiger_products:productcode:productcode:Products_Part_Number:V', + 'vtiger_products:commissionrate:commissionrate:Products_Commission_Rate:V', + 'vtiger_products:qtyinstock:qtyinstock:Products_Quantity_In_Stock:V', + 'vtiger_products:qty_per_unit:qty_per_unit:Products_Qty/Unit:V', + 'vtiger_products:unit_price:unit_price:Products_Unit_Price:V'), + + Array('vtiger_purchaseorder:purchaseorder_no:purchaseorder_no:PurchaseOrder_PurchaseOrder_No:V', + 'vtiger_purchaseorder:subject:subject:PurchaseOrder_Subject:V', + 'vtiger_purchaseorder:vendorid:vendor_id:PurchaseOrder_Vendor_Name:I', + 'vtiger_purchaseorder:tracking_no:tracking_no:PurchaseOrder_Tracking_Number:V', + 'vtiger_purchaseorder:total:hdnGrandTotal:PurchaseOrder_Total:V', + 'vtiger_crmentity:smownerid:assigned_user_id:PurchaseOrder_Assigned_To:V'), + + Array('vtiger_salesorder:salesorder_no:salesorder_no:SalesOrder_SalesOrder_No:V', + 'vtiger_salesorder:subject:subject:SalesOrder_Subject:V', + 'vtiger_account:accountname:accountname:SalesOrder_Account_Name:V', + 'vtiger_quotes:quoteid:quote_id:SalesOrder_Quote_Name:I', + 'vtiger_salesorder:total:hdnGrandTotal:SalesOrder_Total:V', + 'vtiger_crmentity:smownerid:assigned_user_id:SalesOrder_Assigned_To:V'), + + Array('vtiger_vendor:vendor_no:vendor_no:Vendors_Vendor_No:V', + 'vtiger_vendor:vendorname:vendorname:Vendors_Vendor_Name:V', + 'vtiger_vendor:phone:phone:Vendors_Phone:V', + 'vtiger_vendor:email:email:Vendors_Email:E', + 'vtiger_vendor:category:category:Vendors_Category:V'), + + + + + Array(//'vtiger_faq:id::Faq_FAQ_Id:I', + 'vtiger_faq:faq_no:faq_no:Faq_Faq_No:V', + 'vtiger_faq:question:question:Faq_Question:V', + 'vtiger_faq:category:faqcategories:Faq_Category:V', + 'vtiger_faq:product_id:product_id:Faq_Product_Name:I', + 'vtiger_crmentity:createdtime:createdtime:Faq_Created_Time:D', + 'vtiger_crmentity:modifiedtime:modifiedtime:Faq_Modified_Time:D'), + //this sequence has to be maintained + Array('vtiger_campaign:campaign_no:campaign_no:Campaigns_Campaign_No:V', + 'vtiger_campaign:campaignname:campaignname:Campaigns_Campaign_Name:V', + 'vtiger_campaign:campaigntype:campaigntype:Campaigns_Campaign_Type:N', + 'vtiger_campaign:campaignstatus:campaignstatus:Campaigns_Campaign_Status:N', + 'vtiger_campaign:expectedrevenue:expectedrevenue:Campaigns_Expected_Revenue:V', + 'vtiger_campaign:closingdate:closingdate:Campaigns_Expected_Close_Date:D', + 'vtiger_crmentity:smownerid:assigned_user_id:Campaigns_Assigned_To:V'), + + + Array('subject:subject:subject:Subject:V', + 'from:fromname:fromname:From:N', + 'to:tpname:toname:To:N', + 'body:body:body:Body:V'), + + Array ('vtiger_faq:question:question:Faq_Question:V', + 'vtiger_faq:status:faqstatus:Faq_Status:V', + 'vtiger_faq:product_id:product_id:Faq_Product_Name:I', + 'vtiger_faq:category:faqcategories:Faq_Category:V', + 'vtiger_crmentity:createdtime:createdtime:Faq_Created_Time:T'), + + Array( 'vtiger_faq:question:question:Faq_Question:V', + 'vtiger_faq:answer:faq_answer:Faq_Answer:V', + 'vtiger_faq:status:faqstatus:Faq_Status:V', + 'vtiger_faq:product_id:product_id:Faq_Product_Name:I', + 'vtiger_faq:category:faqcategories:Faq_Category:V', + 'vtiger_crmentity:createdtime:createdtime:Faq_Created_Time:T'), + + Array( 'vtiger_purchaseorder:subject:subject:PurchaseOrder_Subject:V', + 'vtiger_purchaseorder:postatus:postatus:PurchaseOrder_Status:V', + 'vtiger_purchaseorder:vendorid:vendor_id:PurchaseOrder_Vendor_Name:I', + 'vtiger_crmentity:smownerid:assigned_user_id:PurchaseOrder_Assigned_To:V', + 'vtiger_purchaseorder:duedate:duedate:PurchaseOrder_Due_Date:V'), + + Array ('vtiger_purchaseorder:subject:subject:PurchaseOrder_Subject:V', + 'vtiger_purchaseorder:vendorid:vendor_id:PurchaseOrder_Vendor_Name:I', + 'vtiger_crmentity:smownerid:assigned_user_id:PurchaseOrder_Assigned_To:V', + 'vtiger_purchaseorder:postatus:postatus:PurchaseOrder_Status:V', + 'vtiger_purchaseorder:carrier:carrier:PurchaseOrder_Carrier:V', + 'vtiger_poshipads:ship_street:ship_street:PurchaseOrder_Shipping_Address:V'), + + Array( 'vtiger_invoice:invoice_no:invoice_no:Invoice_Invoice_No:V', + 'vtiger_invoice:subject:subject:Invoice_Subject:V', + 'vtiger_account:accountname:accountname:Invoice_Account_Name:V', + 'vtiger_invoice:salesorderid:salesorder_id:Invoice_Sales_Order:I', + 'vtiger_invoice:invoicestatus:invoicestatus:Invoice_Status:V', + 'vtiger_crmentity:smownerid:assigned_user_id:Invoice_Assigned_To:V', + 'vtiger_crmentity:createdtime:createdtime:Invoice_Created_Time:T'), + + Array( 'vtiger_invoice:invoice_no:invoice_no:Invoice_Invoice_No:V', + 'vtiger_invoice:subject:subject:Invoice_Subject:V', + 'vtiger_account:accountname:accountname:Invoice_Account_Name:V', + 'vtiger_invoice:salesorderid:salesorder_id:Invoice_Sales_Order:I', + 'vtiger_invoice:invoicestatus:invoicestatus:Invoice_Status:V', + 'vtiger_invoiceshipads:ship_street:ship_street:Invoice_Shipping_Address:V', + 'vtiger_crmentity:smownerid:assigned_user_id:Invoice_Assigned_To:V'), + + Array( 'vtiger_salesorder:subject:subject:SalesOrder_Subject:V', + 'vtiger_account:accountname:accountname:SalesOrder_Account_Name:V', + 'vtiger_salesorder:sostatus:sostatus:SalesOrder_Status:V', + 'vtiger_crmentity:smownerid:assigned_user_id:SalesOrder_Assigned_To:V', + 'vtiger_soshipads:ship_street:ship_street:SalesOrder_Shipping_Address:V', + 'vtiger_salesorder:carrier:carrier:SalesOrder_Carrier:V'), + + ); + + + +$cvstdfilters = Array(Array('columnname'=>'vtiger_crmentity:modifiedtime:modifiedtime:Leads_Modified_Time', + 'datefilter'=>'thismonth', + 'startdate'=>'2005-06-01', + 'enddate'=>'2005-06-30'), + + Array('columnname'=>'vtiger_crmentity:createdtime:createdtime:Accounts_Created_Time', + 'datefilter'=>'thisweek', + 'startdate'=>'2005-06-19', + 'enddate'=>'2005-06-25'), + + Array('columnname'=>'vtiger_contactsubdetails:birthday:birthday:Contacts_Birthdate', + 'datefilter'=>'today', + 'startdate'=>'2005-06-25', + 'enddate'=>'2005-06-25') + ); + +$cvadvfilters = Array( + Array( + Array('columnname'=>'vtiger_leaddetails:leadstatus:leadstatus:Leads_Lead_Status:V', + 'comparator'=>'e', + 'value'=>'Hot' + ) + ), + Array( + Array('columnname'=>'vtiger_account:account_type:accounttype:Accounts_Type:V', + 'comparator'=>'e', + 'value'=>'Prospect' + ) + ), + Array( + Array('columnname'=>'vtiger_potential:sales_stage:sales_stage:Potentials_Sales_Stage:V', + 'comparator'=>'e', + 'value'=>'Closed Won' + ) + ), + Array( + Array('columnname'=>'vtiger_potential:sales_stage:sales_stage:Potentials_Sales_Stage:V', + 'comparator'=>'e', + 'value'=>'Prospecting' + ) + ), + Array( + Array('columnname'=>'vtiger_troubletickets:status:ticketstatus:HelpDesk_Status:V', + 'comparator'=>'n', + 'value'=>'Closed' + ) + ), + Array( + Array('columnname'=>'vtiger_troubletickets:priority:ticketpriorities:HelpDesk_Priority:V', + 'comparator'=>'e', + 'value'=>'High' + ) + ), + Array( + Array('columnname'=>'vtiger_quotes:quotestage:quotestage:Quotes_Quote_Stage:V', + 'comparator'=>'n', + 'value'=>'Accepted' + ), + Array('columnname'=>'vtiger_quotes:quotestage:quotestage:Quotes_Quote_Stage:V', + 'comparator'=>'n', + 'value'=>'Rejected' + ) + ), + Array( + Array('columnname'=>'vtiger_quotes:quotestage:quotestage:Quotes_Quote_Stage:V', + 'comparator'=>'e', + 'value'=>'Rejected' + ) + ), + + Array( + Array('columnname'=>'vtiger_faq:status:faqstatus:Faq_Status:V', + 'comparator'=>'e', + 'value'=>'Draft' + ) + ), + + Array( + Array('columnname'=>'vtiger_faq:status:faqstatus:Faq_Status:V', + 'comparator'=>'e', + 'value'=>'Published' + ) + ), + + Array( + Array('columnname'=>'vtiger_purchaseorder:postatus:postatus:PurchaseOrder_Status:V', + 'comparator'=>'e', + 'value'=>'Created, Approved, Delivered' + ) + ), + + Array( + Array('columnname'=>'vtiger_purchaseorder:postatus:postatus:PurchaseOrder_Status:V', + 'comparator'=>'e', + 'value'=>'Received Shipment' + ) + ), + + Array( + Array('columnname'=>'vtiger_invoice:invoicestatus:invoicestatus:Invoice_Status:V', + 'comparator'=>'e', + 'value'=>'Created, Approved, Sent' + ) + ), + + Array( + Array('columnname'=>'vtiger_invoice:invoicestatus:invoicestatus:Invoice_Status:V', + 'comparator'=>'e', + 'value'=>'Paid' + ) + ), + + Array( + Array('columnname'=>'vtiger_salesorder:sostatus:sostatus:SalesOrder_Status:V', + 'comparator'=>'e', + 'value'=>'Created, Approved' + ) + ) + + ); + +foreach($customviews as $key=>$customview) +{ + $queryid = insertCustomView($customview['viewname'],$customview['setdefault'],$customview['setmetrics'],$customview['cvmodule'],$customview['status'],$customview['userid']); + insertCvColumns($queryid,$cvcolumns[$key]); + + if(isset($cvstdfilters[$customview['stdfilterid']])) + { + $i = $customview['stdfilterid']; + insertCvStdFilter($queryid,$cvstdfilters[$i]['columnname'],$cvstdfilters[$i]['datefilter'],$cvstdfilters[$i]['startdate'],$cvstdfilters[$i]['enddate']); + } + if(isset($cvadvfilters[$customview['advfilterid']])) + { + insertCvAdvFilter($queryid,$cvadvfilters[$customview['advfilterid']]); + } +} + + /** to store the details of the customview in vtiger_customview table + * @param $viewname :: Type String + * @param $setdefault :: Type Integer + * @param $setmetrics :: Type Integer + * @param $cvmodule :: Type String + * @returns $customviewid of the stored custom view :: Type integer + */ +function insertCustomView($viewname,$setdefault,$setmetrics,$cvmodule,$status,$userid) +{ + global $adb; + + $genCVid = $adb->getUniqueID("vtiger_customview"); + + if($genCVid != "") + { + + $customviewsql = "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype,status,userid) values(?,?,?,?,?,?,?)"; + $customviewparams = array($genCVid, $viewname, $setdefault, $setmetrics, $cvmodule, $status, $userid); + $customviewresult = $adb->pquery($customviewsql, $customviewparams); + } + return $genCVid; +} + + /** to store the custom view columns of the customview in vtiger_cvcolumnlist table + * @param $cvid :: Type Integer + * @param $columnlist :: Type Array of columnlists + */ +function insertCvColumns($CVid,$columnslist) +{ + global $adb; + if($CVid != "") + { + for($i=0;$ipquery($columnsql, $columnparams); + } + } +} + + /** to store the custom view stdfilter of the customview in vtiger_cvstdfilter table + * @param $cvid :: Type Integer + * @param $filtercolumn($tablename:$columnname:$fieldname:$fieldlabel) :: Type String + * @param $filtercriteria(filter name) :: Type String + * @param $startdate :: Type String + * @param $enddate :: Type String + * returns nothing + */ +function insertCvStdFilter($CVid,$filtercolumn,$filtercriteria,$startdate,$enddate) +{ + global $adb; + if($CVid != "") + { + $stdfiltersql = "insert into vtiger_cvstdfilter(cvid,columnname,stdfilter,startdate,enddate) values (?,?,?,?,?)"; + $stdfilterparams = array($CVid, $filtercolumn, $filtercriteria, $startdate, $enddate); + $stdfilterresult = $adb->pquery($stdfiltersql, $stdfilterparams); + } +} + + /** to store the custom view advfilter of the customview in vtiger_cvadvfilter table + * @param $cvid :: Type Integer + * @param $filters :: Type Array('columnname'=>$tablename:$columnname:$fieldname:$fieldlabel,'comparator'=>$comparator,'value'=>$value) + * returns nothing + */ + +function insertCvAdvFilter($CVid,$filters) +{ + global $adb; + if($CVid != "") + { + foreach($filters as $i=>$filter) + { + $advfiltersql = "insert into vtiger_cvadvfilter(cvid,columnindex,columnname,comparator,value) values (?,?,?,?,?)"; + $advfilterparams = array($CVid, $i, $filter['columnname'], $filter['comparator'], $filter['value']); + $advfilterresult = $adb->pquery($advfiltersql, $advfilterparams); + } + } +} +?> diff --git a/oss/vtiger/trunk/modules/CustomView/Save.php b/oss/vtiger/trunk/modules/CustomView/Save.php new file mode 100644 index 00000000..d01e8699 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/Save.php @@ -0,0 +1,247 @@ +id; + + if(isset($_REQUEST["setDefault"])) { + $setdefault = 1; + } else { + $setdefault = 0; + } + + if(isset($_REQUEST["setMetrics"])) { + $setmetrics = 1; + } else { + $setmetrics = 0; + } + + //$allKeys = array_keys($HTTP_POST_VARS); + //this is will cause only the chosen fields to be added to the vtiger_cvcolumnlist table + $allKeys = array_keys($_REQUEST); + + //<<<<<<>>>>>>>>> + for ($i=0;$i>>>>>>>> + + //<<<<<<>>>>>>>> + $stdfiltercolumn = $_REQUEST["stdDateFilterField"]; + $std_filter_list["columnname"] = $stdfiltercolumn; + $stdcriteria = $_REQUEST["stdDateFilter"]; + $std_filter_list["stdfilter"] = $stdcriteria; + $startdate = $_REQUEST["startdate"]; + $enddate = $_REQUEST["enddate"]; + if($stdcriteria == "custom") { + $startdate = getDBInsertDateValue($startdate); + $enddate = getDBInsertDateValue($enddate); + } + $std_filter_list["startdate"] = $startdate; + $std_filter_list["enddate"]=$enddate; + if(empty($startdate) && empty($enddate)) + unset($std_filter_list); + //<<<<<<>>>>>>>> + + //<<<<<<>>>>>>>> + for ($i=0;$i>>>>>>> + + if(!$cvid) { + $genCVid = $adb->getUniqueID("vtiger_customview"); + if($genCVid != "") { + $customviewsql = "INSERT INTO vtiger_customview(cvid, viewname, setdefault, setmetrics, entitytype, status, userid) + VALUES (?,?,?,?,?,?,?)"; + $customviewparams = array($genCVid, $viewname, 0, $setmetrics, $cvmodule, $status, $userid); + $customviewresult = $adb->pquery($customviewsql, $customviewparams); + $log->info("CustomView :: Save :: vtiger_customview created successfully"); + + if($setdefault == 1) { + $sql_result = $adb->pquery("SELECT * FROM vtiger_user_module_preferences WHERE userid = ? and tabid = ?",array($current_user->id, $cv_tabid)); + if($adb->num_rows($sql_result) > 0) { + $updatedefaultsql = "UPDATE vtiger_user_module_preferences SET default_cvid = ? WHERE userid = ? and tabid = ?"; + $updatedefaultresult = $adb->pquery($updatedefaultsql, array($genCVid, $current_user->id, $cv_tabid)); + } else { + $insertdefaultsql = "INSERT INTO vtiger_user_module_preferences(userid, tabid, default_cvid) values (?,?,?)"; + $insertdefaultresult = $adb->pquery($insertdefaultsql, array($userid, $cv_tabid, $genCVid)); + } + } else { + $sql_result = $adb->pquery("SELECT * FROM vtiger_user_module_preferences WHERE userid = ? and tabid = ?",array($current_user->id, $cv_tabid)); + if($adb->num_rows($sql_result) > 0) { + $deletedefaultsql = "DELETE FROM vtiger_user_module_preferences WHERE userid = ? and tabid = ?"; + $deletedefaultresult = $adb->pquery($deletedefaultsql, array($current_user->id, $cv_tabid)); + } + } + + $log->info("CustomView :: Save :: setdefault upated successfully"); + + if($customviewresult) { + if(isset($columnslist)) { + for($i=0;$ipquery($columnsql, $columnparams); + } + $log->info("CustomView :: Save :: vtiger_cvcolumnlist created successfully"); + if($std_filter_list["columnname"] !="") { + $stdfiltersql = "INSERT INTO vtiger_cvstdfilter(cvid,columnname,stdfilter,startdate,enddate) VALUES (?,?,?,?,?)"; + $stdfilterparams = array($genCVid, $std_filter_list["columnname"], $std_filter_list["stdfilter"], $adb->formatDate($std_filter_list["startdate"], true), $adb->formatDate($std_filter_list["enddate"], true)); + $stdfilterresult = $adb->pquery($stdfiltersql, $stdfilterparams); + $log->info("CustomView :: Save :: vtiger_cvstdfilter created successfully"); + } + for($i=0;$ipquery($advfiltersql, $advfilterparams); + } + $log->info("CustomView :: Save :: vtiger_cvadvfilter created successfully"); + } + } + $cvid = $genCVid; + } + } else { + if($is_admin == true || $current_user->id) { + $updatecvsql = "UPDATE vtiger_customview + SET viewname = ?, setmetrics = ?, status = ? WHERE cvid = ?"; + $updatecvparams = array($viewname, $setmetrics, $status, $cvid); + $updatecvresult = $adb->pquery($updatecvsql, $updatecvparams); + $log->info("CustomView :: Save :: vtiger_customview upated successfully".$cvid); + + if($setdefault == 1) { + $sql_result = $adb->pquery("SELECT * FROM vtiger_user_module_preferences WHERE userid = ? and tabid = ?",array($current_user->id, $cv_tabid)); + if($adb->num_rows($sql_result) > 0) { + $updatedefaultsql = "UPDATE vtiger_user_module_preferences SET default_cvid = ? WHERE userid = ? and tabid = ?"; + $updatedefaultresult = $adb->pquery($updatedefaultsql, array($cvid, $current_user->id, $cv_tabid)); + } else { + $insertdefaultsql = "INSERT INTO vtiger_user_module_preferences(userid, tabid, default_cvid) values (?,?,?)"; + $insertdefaultresult = $adb->pquery($insertdefaultsql, array($userid, $cv_tabid, $cvid)); + } + } else { + $sql_result = $adb->pquery("SELECT * FROM vtiger_user_module_preferences WHERE userid = ? and tabid = ?",array($current_user->id, $cv_tabid)); + if($adb->num_rows($sql_result) > 0) { + $deletedefaultsql = "DELETE FROM vtiger_user_module_preferences WHERE userid = ? and tabid = ?"; + $deletedefaultresult = $adb->pquery($deletedefaultsql, array($current_user->id, $cv_tabid)); + } + } + $log->info("CustomView :: Save :: setdefault upated successfully".$cvid); + + $deletesql = "DELETE FROM vtiger_cvcolumnlist WHERE cvid = ?"; + $deleteresult = $adb->pquery($deletesql, array($cvid)); + + $deletesql = "DELETE FROM vtiger_cvstdfilter WHERE cvid = ?"; + $deleteresult = $adb->pquery($deletesql, array($cvid)); + + $deletesql = "DELETE FROM vtiger_cvadvfilter WHERE cvid = ?"; + $deleteresult = $adb->pquery($deletesql, array($cvid)); + $log->info("CustomView :: Save :: vtiger_cvcolumnlist,cvstdfilter,cvadvfilter deleted successfully before update".$genCVid); + + $genCVid = $cvid; + if($updatecvresult) { + if(isset($columnslist)) { + for($i=0;$ipquery($columnsql, $columnparams); + } + $log->info("CustomView :: Save :: vtiger_cvcolumnlist update successfully".$genCVid); + if($std_filter_list["columnname"] !="") { + $stdfiltersql = "INSERT INTO vtiger_cvstdfilter (cvid,columnname,stdfilter,startdate,enddate) VALUES (?,?,?,?,?)"; + $stdfilterparams = array($genCVid, $std_filter_list["columnname"], $std_filter_list["stdfilter"], $adb->formatDate($std_filter_list["startdate"], true), $adb->formatDate($std_filter_list["enddate"], true)); + $stdfilterresult = $adb->pquery($stdfiltersql, $stdfilterparams); + $log->info("CustomView :: Save :: vtiger_cvstdfilter update successfully".$genCVid); + } + for($i=0;$ipquery($advfiltersql, $advfilterparams); + } + $log->info("CustomView :: Save :: vtiger_cvadvfilter update successfully".$cvid); + } + } + } + } +} + +header("Location: index.php?action=$return_action&parenttab=$parenttab&module=$cvmodule&viewname=$cvid"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomView/SaveAction.php b/oss/vtiger/trunk/modules/CustomView/SaveAction.php new file mode 100644 index 00000000..221b74c8 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/SaveAction.php @@ -0,0 +1,52 @@ +pquery($customactionsql, $customactionparams); + if($customactionresult == false) + { + include('themes/'.$theme.'/header.php'); + $errormessage = "Error Message
    +
  • Error while inserting the record +

" ; + echo $errormessage; + + } + + }elseif($mode == "edit") + { + $updatecasql = "update vtiger_customaction set subject=?, content=? where cvid=?"; + $updatecaresult = $adb->pquery($updatecasql, array($subject, $body, $cvid)); + if($updatecaresult == false) + { + include('themes/'.$theme.'/header.php'); + $errormessage = "Error Message
    +
  • Error while inserting the record +

" ; + echo $errormessage; + } + } +} +header("Location: index.php?action=index&module=$cvmodule&viewname=$cvid"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomView/SendMailAction.php b/oss/vtiger/trunk/modules/CustomView/SendMailAction.php new file mode 100644 index 00000000..fe613206 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/SendMailAction.php @@ -0,0 +1,172 @@ +getCustomActionDetails($viewid); + if(isset($CustomActionDtls)) + { + $subject = $CustomActionDtls["subject"]; + $contents = $CustomActionDtls["content"]; + } +} + +if(trim($subject) != "") +{ + if(isset($storearray) && $camodule != "") + { + foreach($storearray as $id) + { + if($id == '') continue; + if($camodule == "Contacts") + { + $sql="select * from vtiger_contactdetails inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_contactdetails.contactid where vtiger_crmentity.deleted =0 and vtiger_contactdetails.contactid=?"; + $result = $adb->pquery($sql, array($id)); + $camodulerow = $adb->fetch_array($result); + if(isset($camodulerow)) + { + $emailid = $camodulerow["email"]; + $otheremailid = $camodulerow["otheremail"]; + $yahooid = $camodulerow["yahooid"]; + + if(trim($emailid) != "") + { + SendMailtoCustomView($camodule,$id,$emailid,$current_user->id,$subject,$contents); + }elseif(trim($otheremailid) != "") + { + SendMailtoCustomView($camodule,$id,$otheremailid,$current_user->id,$subject,$contents); + }elseif(trim($yahooid) != "") + { + SendMailtoCustomView($camodule,$id,$yahooid,$current_user->id,$subject,$contents); + } + else + { + $adb->println("There is no email id for this Contact. Please give any email id."); + } + } + + }elseif($camodule == "Leads") + { + $sql="select * from vtiger_leaddetails inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_leaddetails.leadid where vtiger_crmentity.deleted =0 and vtiger_leaddetails.leadid=?"; + $result = $adb->pquery($sql, array($id)); + $camodulerow = $adb->fetch_array($result); + if(isset($camodulerow)) + { + $emailid = $camodulerow["email"]; + $yahooid = $camodulerow["yahooid"]; + + if(trim($emailid) != "") + { + SendMailtoCustomView($camodule,$id,$emailid,$current_user->id,$subject,$contents); + } + elseif($trim($yahooid) != "") + { + SendMailtoCustomView($camodule,$id,$yahooid,$current_user->id,$subject,$contents); + } + else + { + $adb->println("There is no email id for this Lead. Please give any email id."); + } + } + }elseif($camodule == "Accounts") + { + $sql="select * from vtiger_account inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_account.accountid where vtiger_crmentity.deleted =0 and vtiger_account.accountid=?"; + $result = $adb->pquery($sql, array($id)); + $camodulerow = $adb->fetch_array($result); + if(isset($camodulerow)) + { + $emailid = $camodulerow["email1"]; + $otheremailid = $camodulerow["email2"]; + + if(trim($emailid) != "") + { + SendMailtoCustomView($camodule,$id,$emailid,$current_user->id,$subject,$contents); + } + elseif(trim($otheremailid) != "") + { + SendMailtoCustomView($camodule,$id,$otheremailid,$current_user->id,$subject,$contents); + } + else + { + $adb->println("There is no email id for this Account. Please give any email id."); + } + } + } + } + } +} + +function SendMailtoCustomView($module,$id,$to,$current_user_id,$subject,$contents) +{ + + require_once("modules/Emails/class.phpmailer.php"); + + $mail = new PHPMailer(); + + $mail->Subject = $subject; + $mail->Body = nl2br($contents); + $mail->IsSMTP(); + + if($current_user_id != '') + { + global $adb; + $sql = "select * from vtiger_users where id= ?"; + $result = $adb->pquery($sql, array($current_user_id)); + $from = $adb->query_result($result,0,'email1'); + $initialfrom = $adb->query_result($result,0,'user_name'); + } + global $adb; + $mailserverresult=$adb->pquery("select * from vtiger_systems where server_type=?", array('email')); + $mail_server = $adb->query_result($mailserverresult,0,'server'); + $mail_server_username = $adb->query_result($mailserverresult,0,'server_username'); + $mail_server_password = $adb->query_result($mailserverresult,0,'server_password'); + $smtp_auth = $adb->query_result($mailserverresult,0,'smtp_auth'); + + $adb->println("Mail Server Details : '".$mail_server."','".$mail_server_username."','".$mail_server_password."'"); + $_REQUEST['server']=$mail_server; + + $mail->Host = $mail_server; + $mail->SMTPAuth = $smtp_auth; + $mail->Username = $mail_server_username; + $mail->Password = $mail_server_password; + $mail->From = $from; + $mail->FromName = $initialfrom; + + $mail->AddAddress($to); + $mail->AddReplyTo($from); + $mail->WordWrap = 50; + + $mail->IsHTML(true); + $mail->AltBody = "This is the body in plain text for non-HTML mail clients"; + + $adb->println("Mail sending process : To => '".$to."', From => '".$from."'"); + if(!$mail->Send()) + { + $adb->println("(CustomView/SendMailAction.php) Error in Mail Sending : ".$mail->ErrorInfo); + $errormsg = "Mail Could not be sent..."; + } + else + { + $adb->println("(CustomView/SendMailAction.php) Mail has been Sent to => ".$to); + } + +} +header("Location: index.php?action=index&module=$camodule&viewname=$viewid"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomView/index.php b/oss/vtiger/trunk/modules/CustomView/index.php new file mode 100644 index 00000000..1b6d9296 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/index.php @@ -0,0 +1,17 @@ + diff --git a/oss/vtiger/trunk/modules/CustomView/language/en_us.lang.php b/oss/vtiger/trunk/modules/CustomView/language/en_us.lang.php new file mode 100644 index 00000000..48a6ff9b --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/language/en_us.lang.php @@ -0,0 +1,285 @@ +'Custom View', +'LBL_STEP_1_TITLE'=>'View Information', +'LBL_VIEW_NAME'=>'View Name:', +'LBL_SETDEFAULT'=>'Set as Default', +'LBL_LIST_IN_METRICS'=>'List in Metrics', +'LBL_STEP_2_TITLE'=>'Choose Columns', +'LBL_STEP_3_TITLE'=>'Standard Filters', +'LBL_STEP_4_TITLE'=>'Advanced Filters', +'LBL_STEP_5_TITLE'=>'Access Information', +'LBL_SF_COLUMNS'=>'Column', +'LBL_SF_STARTDATE'=>'Start Date', +'LBL_SF_ENDDATE'=>'End Date', +'LBL_AF_HDR1'=>'Set the search conditions to further restrict the list.', +'LBL_AF_HDR2'=>'You can use "or" filters by entering multiple +items in the third column.', +'LBL_AF_HDR3'=>'You can enter up to 10 items, separated by commas. For +example: CA, NY, TX, FL searches for CA or NY or TX or FL.', +'LBL_AF_HDR4'=>'If "Activity Type" is selected, give any one of the +following values "Call","Meeting" or "Task".', + +//strings added for vtiger 5, date format... +'LBL_NONE'=>'None', +'View_Name'=>'View_Name', +'LBL_AND'=>'And', +'LBL_DATE_FORMAT_CUSTOMVIEW'=>'Y-m-d', +//Strings added for filter +'Custom'=>'Custom', +'Previous FY'=>'Previous FY', +'Current FY'=>'Current FY', +'Next FY'=>'Next FY', +'Previous FQ'=>'Previous FQ', +'Current FQ'=>'Current FQ', +'Next FQ'=>'Next FQ', +'Yesterday'=>'Yesterday', +'Today'=>'Today', +'Tomorrow'=>'Tomorrow', +'Last Week'=>'Last Week', +'Current Week'=>'Current Week', +'Next Week'=>'Next Week', +'Last Month'=>'Last Month', +'Current Month'=>'Current Month', +'Next Month'=>'Next Month', +'Last 7 Days'=>'Last 7 Days', +'Last 30 Days'=>'Last 30 Days', +'Last 60 Days'=>'Last 60 Days', +'Last 90 Days'=>'Last 90 Days', +'Last 120 Days'=>'Last 120 Days', +'Next 30 Days'=>'Next 30 Days', +'Next 60 Days'=>'Next 60 Days', +'Next 90 Days'=>'Next 90 Days', +'Next 120 Days'=>'Next 120 Days', + +'equals'=>'equals', +'contains'=>'Contains', +'does not contain'=>'does not contain', +'less than'=>'less than', +'greater than'=>'greater than', +'less or equal'=>'less or equal', +'greater or equal'=>'greater or equal', + +//Strings added to translate field label vtiger_groups +'Address'=>'Address', +'Information'=>'Information', +'Description'=>'Description', +'Custom Information'=>'Custom Information', +'- Event Information'=>'- Event Information', +'- Event Description'=>'- Event Description', +'- Task Information'=>'- Task Information', +'- Task Description'=>'- Task Description', + +//Strings added for helpdesk module fields +'Title'=>'Title', +'Assigned To'=>'Assigned To', +'Related to'=>'Related to', +'Priority'=>'Priority', +'Product Name'=>'Product Name', +'Severity'=>'Severity', +'Status'=>'Status', +'Category'=>'Category', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Attachment'=>'Attachment', + +//Strings added for Leads module fields +'First Name'=>'First Name', +'Phone'=>'Phone', +'Last Name'=>'Last Name', +'Company'=>'Company', +'Lead Source'=>'Lead Source', +'Website'=>'Website', +'Industry'=>'Industry', +'Lead Status'=>'Lead Status', +'Annual Revenue'=>'Annual Revenue', +'Rating'=>'Rating', +'No Of Employees'=>'No of Employees', +'Street'=>'Street', +'Po Box'=>'PO Box', +'Postal Code'=>'Postal Code', +'City'=>'City', +'Country'=>'Country', +'State'=>'State', + +//Strings added for Accounts module fields +'Account Name'=>'Account Name', +'Ticker Symbol'=>'Ticker Symbol', +'Other Phone'=>'Other Phone', +'Member Of'=>'Member Of', +'Employees'=>'Employees', +'Other Email'=>'Other Email', +'Ownership'=>'Ownership', +'industry'=>'industry', +'SIC Code'=>'SIC Code', +'Email Opt Out'=>'Email Opt Out', +'Billing Address'=>'Billing Address', +'Shipping Address'=>'Shipping Address', +'Shipping Po Box'=>'Shipping PO Box', +'Billing Po Box'=>'Billing PO Box', +'Billing City'=>'Billing City', +'Shipping City'=>'Shipping City', +'Billing State'=>'Billing State', +'Shipping State'=>'Shipping State', +'Billing Code'=>'Billing Code', +'Shipping Code'=>'Shipping Code', +'Shipping Country'=>'Shipping Country', +'Billing Country'=>'Billing Country', + + +//Strings added for Contacts module fields + +'Office Phone'=>'Office Phone', +'Home Phone'=>'Home Phone', +'Birthdate'=>'Birthdate', +'Reports To'=>'Reports To', +'Assistant Phone'=>'Assistant Phone', +'Do Not Call'=>'Do Not Call', +'Mailing Street'=>'Mailing Street', +'Other Street'=>'Other Street', +'Mailing Po Box'=>'Mailing PO Box', +'Other Po Box'=>'Other PO Box', +'Mailing City'=>'Mailing City', +'Other City'=>'Other City', +'Mailing State'=>'Mailing State', +'Other State'=>'Other State', +'Mailing Zip'=>'Mailing Zip', +'Other Zip'=>'Other Zip', +'Mailing Country'=>'Mailing Country', +'Other Country'=>'Other Country', + + +//Strings added for Potential module fields + +'Potential Name'=>'Potential Name', +'Amount'=>'Amount', +'Expected Close Date'=>'Expected Close Date', +'Next Step'=>'Next Step', +'Sales Stage'=>'Sales Stage', +'Probability'=>'Probability', + + +//Strings added for Quotes module fields +'Subject'=>'Subject', +'Quote Stage'=>'Quote Stage', +'Valid Till'=>'Valid Till', +'Team'=>'Team', +'Contact Name'=>'Contact Name', +'Carrier'=>'Carrier', +'Shipping'=>'Shipping', +'Inventory Manager'=>'Inventory Manager', + +//Strings added for Sales Orders module fields +'Customer No'=>'Customer No', +'Quote Name'=>'Quote Name', +'Purchase Order'=>'Purchase Order', +'Due Date'=>'Due Date', +'Pending'=>'Pending', +'Sales Commission'=>'Sales Commission', +'Excise Duty'=>'Excise Duty', + +//Strings added for Invoices module fields +'Sales Order'=>'Sales Order', +'Invoice Date'=>'Invoice Date', + +//Strings added for Product module fields +'Product Active'=>'Product Active', +'Product Category'=>'Product Category', +'Sales Start Date'=>'Sales Start Date', +'Sales End Date'=>'Sales End Date', +'Support Start Date'=>'Support Start Date', +'Support Expiry Date'=>'Support Expiry Date', +'Vendor Name'=>'Vendor Name', +'Mfr PartNo'=>'Mfr PartNo', +'Vendor PartNo'=>'Vendor PartNo', + +'Serial No'=>'Serial No', +'Product Sheet'=>'Product Sheet', +'GL Account'=>'GL Account', + +//Strings added for Price book module fields +'Price Book Name'=>'Price Book Name', +'Active'=>'Active', + +//Strings added for tasks & events module fields +'Start Date & Time'=>'Start Date & Time', + +//error message +'Missing required fields'=>'Missing required vtiger_fields', +//Strings added for campaigns +'Campaign Name'=>'Campaign Name', +'Campaign Type'=>'Campaign Type', +'Product'=>'Product', +'Campaign Status'=>'Campaign Status', +'Expected Revenue'=>'Expected Revenue', +'Budget Cost'=>'Budget Cost', +'Actual Cost'=>'Actual Cost', +'Expected Response'=>'Expected Response', +'Num Sent'=>'Num Sent', +'Target Audience'=>'Target Audience', +'TargetSize'=>'TargetSize', +'Sponsor'=>'Sponsor', +'Expected Sales Count'=>'Expected Sales Count', +'Expected Response Count'=>'Expected Response Count', +'Expected ROI'=>'Expected ROI', +'Actual Sales Count'=>'Actual Sales Count', +'Actual Response Count'=>'Actual Response Count', +'Actual ROI'=>'Actual ROI', + + + +//Added for customview.tpl + +'LBL_Select_a_Column'=>'Select a Column', +'Missing_required_fields'=>'Missing required fields', +'Details'=>'Details', +'New_Custom_View'=>'New Custom view', +'Edit_Custom_View'=>'Edit Custom View', +'LBL_AF_HDR5'=>'Simple Time Filter allows you to select date based on +Account Created Time or Account Modified Time', +'Select_Duration'=>'Select Duration', +'Simple_Time_Filter'=>'Simple Time Filter', +'Start_Date'=>'Start Date', +'End_Date'=>'End Date', +'LBL_RULE'=>'RULE', + +// Added/Updated for vtiger CRM 5.0.4 +'not equal to'=>'Not equal to', +'starts with'=>'Starts with', +'ends with'=>'Ends with', +//'Product Code'=>'Product Code', + +// Added after 5.0.4 GA + +//Added for Role based Custom filters +'LBL_SET_AS_PUBLIC'=>'Set as Public ', +'LBL_NEW'=>'New', +'LBL_EDIT'=>'Edit', +'LBL_STATUS_PUBLIC_APPROVE'=>'Approve', +'LBL_STATUS_PUBLIC_DENY'=>'Deny' +); +?> diff --git a/oss/vtiger/trunk/modules/CustomView/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/CustomView/language/zh_cn.lang.php new file mode 100644 index 00000000..eca7e645 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomView/language/zh_cn.lang.php @@ -0,0 +1,282 @@ + '自订检视表', + 'LBL_STEP_1_TITLE' => '检视表信息', + 'LBL_VIEW_NAME' => '检视表名称:', + 'LBL_SETDEFAULT' => '默认值', + 'LBL_LIST_IN_METRICS' => '制式化列表', + 'LBL_STEP_2_TITLE' => '选择字段', + 'LBL_STEP_3_TITLE' => '标准规则', + 'LBL_STEP_4_TITLE' => '进阶规则', + 'LBL_STEP_5_TITLE' => '存取信息', + 'LBL_SF_COLUMNS' => '字段', + 'LBL_SF_STARTDATE' => '开始日期', + 'LBL_SF_ENDDATE' => '结束日期', + 'LBL_AF_HDR1' => '设定搜寻条件来缩小范围', + 'LBL_AF_HDR2' => '您可以在第三个字段输入多个项目,之前用"or"分开 ', + 'LBL_AF_HDR3' => '您最多可以输入10个项目,以逗号分隔。例如CA,NY,TX,FL会尝试搜寻CA或NY或TX或FL。', + 'LBL_AF_HDR4' => '如果选择了"活动类型",请输入 "Call"、"Meeting" 或是 "Task"。', + +//strings added for vtiger 5, date format... + 'LBL_NONE' => '无', + 'View_Name' => '检视名称', + 'LBL_AND' => '且', + 'LBL_DATE_FORMAT_CUSTOMVIEW' => '年-月-日', +//Strings added for filter + 'Custom' => '自订', + 'Previous FY' => '上一个财务年度', + 'Current FY' => '目前财务年度', + 'Next FY' => '下一个财务年度', + 'Previous FQ' => '上一个财务季', + 'Current FQ' => '目前财务季', + 'Next FQ' => '下一个财务季', + 'Yesterday' => '昨天', + 'Today' => '今天', + 'Tomorrow' => '明天', + 'Last Week' => '上周', + 'Current Week' => '这周', + 'Next Week' => '下周', + 'Last Month' => '上个月', + 'Current Month' => '这个月', + 'Next Month' => '下个月', + 'Last 7 Days' => '过去七天', + 'Last 30 Days' => '过去 30 天', + 'Last 60 Days' => '过去 60 天', + 'Last 90 Days' => '过去 90 天', + 'Last 120 Days' => '过去 120 天', + 'Next 30 Days' => '未来 30 天', + 'Next 60 Days' => '未来 60 天', + 'Next 90 Days' => '未来 90 天', + 'Next 120 Days' => '未来 120 天', + + 'equals' => '等于', + 'not_equal_to' => '不等于', + 'starts_with' => '开始于', + 'contains' => '包含', + 'does_not_contain' => '不包含', + 'less_than' => '少于', + 'greater_than' => '大于', + 'less_or_equal' => '少于或等于', + 'greater_or_equal' => '大于或等于', + +//Strings added to translate field label vtiger_groups + 'Address' => '住址', + 'Information' => '信息', + 'Description' => '说明', + 'Custom Information' => '自订信息', + '- Event Information' => '- 事件信息', + '- Event Description' => '- 事件说明', + '- Task Information' => '- 任务信息', + '- Task Description' => '- 任务说明', + +//Strings added for helpdesk module fields + 'Title' => '标题', + 'Assigned To' => '负责人', + 'Related to' => '关联', + 'Priority' => '优先序', + 'Product Name' => '产品名称', + 'Severity' => '严重', + 'Status' => '状态', + 'Category' => '类别', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'Attachment' => '附加档案', + +//Strings added for Leads module fields + 'First Name' => '姓名', + 'Phone' => '电话', + 'Last Name' => '姓氏', + 'Company' => '公司', + 'Lead Source' => '准客户来源', + 'Website' => '网站', + 'Industry' => '行业', + 'Lead Status' => '准客户状态', + 'Annual Revenue' => '年营业额', + 'Rating' => '评比', + 'No Of Employees' => '员工人数', + 'Street' => '街道巷弄', + 'Po Box' => '邮政信箱', + 'Postal Code' => '邮政编码', + 'City' => '乡镇市区', + 'Country' => '国家', + 'State' => '县市', + +//Strings added for Accounts module fields +'Account Name' => '公司名称', + 'Ticker Symbol' => '传票符号', + 'Other Phone' => '其它电话', + 'Member Of' => '群组', + 'Employees' => '员工', + 'Other Email' => '其它信箱', + 'Ownership' => '负责人', + 'industry' => '产业', + 'SIC Code' => '统一编号', + 'Email Opt Out' => '拒绝邮件打扰', + 'Billing Address' => '付款住址', + 'Shipping Address' => '送货住址', + 'Shipping Po Box' => '[送货住址]邮政信箱', + 'Billing Po Box' => '[付款住址]邮政信箱', + 'Billing City' => '[付款住址]乡镇市区', + 'Shipping City' => '[送货住址]乡镇市区', + 'Billing State' => '[付款住址]县市', + 'Shipping State' => '[送货住址]县市', + 'Billing Code' => '[付款住址]邮政编码', + 'Shipping Code' => '[送货住址]邮政编码', + 'Shipping Country' => '[送货住址]国家', + 'Billing Country' => '[付款住址]国家', + + +//Strings added for Contacts module fields + + 'Office Phone' => '办公室电话', + 'Home Phone' => '住家电话', + 'Birthdate' => '生日', + 'Reports To' => '回报给', + 'Assistant Phone' => '助理电话', + 'Do Not Call' => '拒绝电话打扰', + 'Mailing Street' => '街道巷弄', + 'Other Street' => '[其它]街道巷弄', + 'Mailing Po Box' => '邮政信箱', + 'Other Po Box' => '[其它]邮政信箱', + 'Mailing City' => '乡镇市区', + 'Other City' => '[其它]乡镇市区', + 'Mailing State' => '县市', + 'Other State' => '[其它]县市', + 'Mailing Zip' => '邮政编码', + 'Other Zip' => '[其它]邮政编码', + 'Mailing Country' => '国家', + 'Other Country' => '[其它]国家', + + +//Strings added for Potential module fields + + 'Potential Name' => '潜在机会名称', + 'Amount' => '金额', + 'Expected Close Date' => '预期结案日期', + 'Next Step' => '下一步', + 'Sales Stage' => '销售策略', + 'Probability' => '可能性', + + +//Strings added for Quotes module fields + 'Subject' => '主旨', + 'Quote Stage' => '报价策略', + 'Valid Till' => '有效日期', + 'Team' => '团队', + 'Contact Name' => '联系人名称', + 'Carrier' => '货运商', + 'Shipping' => '船运商', + 'Inventory Manager' => '库存管理', + +//Strings added for Sales Orders module fields + 'Customer No' => '客户编号', + 'Quote Name' => '报价单名称', + 'Purchase Order' => '采购订单', + 'Due Date' => '结束日期', + 'Pending' => '暂缓', + 'Sales Commission' => '销售佣金', + 'Excise Duty' => '关税', + +//Strings added for Invoices module fields + 'Sales Order' => '销售订单', + 'Invoice Date' => '发票日期', + +//Strings added for Product module fields +'Product Code' => '产品代号', + 'Product Active' => '产品状态', + 'Product Category' => '产品类别', + 'Sales Start Date' => '开始销售日期', + 'Sales End Date' => '结束销售日期', + 'Support Start Date' => '开始支持日期', + 'Support Expiry Date' => '结束支持日期', + 'Vendor Name' => '厂商名称', + 'Mfr PartNo' => '工厂零件代号', + 'Vendor PartNo' => '厂商零件代号', + +'Serial No' => '序号', + 'Product Sheet' => '产品型录', + 'GL Account' => '会计科目', + +//Strings added for Price book module fields + 'Price Book Name' => '价格表名称', + 'Active' => '启用', + +//Strings added for tasks & events module fields + 'Start Date & Time' => '开始日期与时间', + +//error message + 'Missing required fields' => '缺少必要字段', +//Strings added for campaigns +'Campaign Name' => '活动名称', + 'Campaign Type' => '活动类型', + 'Product' => '产品', + 'Campaign Status' => '活动状态', + 'Expected Revenue' => '预期收益', + 'Budget Cost' => '预算', + 'Actual Cost' => '实际成本', + 'Expected Response' => '预期回应', + 'Num Sent' => '寄发数量', + 'Target Audience' => '目标族群', + 'TargetSize' => '目标数量', + 'Sponsor' => '赞助商', + 'Expected Sales Count' => '预期销售量', + 'Expected Response Count' => '预期回应量', + 'Expected ROI' => '预期收益', + 'Actual Sales Count' => '实际销售量', + 'Actual Response Count' => '实际回应量', + 'Actual ROI' => '实际收益', + + + +//Added for customview.tpl + + 'LBL_Select_a_Column' => '选择字段', + 'Missing_required_fields' => '缺少必要字段', + 'Details' => '细节', + 'New_Custom_View' => '新增自订检视', + 'LBL_AF_HDR5' => '简易时间过滤可以让您选择介于客户建立时间与异动时间之间的日期', + 'Select_Duration' => '选择期间', + 'Simple_Time_Filter' => '简易时间过滤', + 'Start_Date' => '开始日期', + 'End_Date' => '结束日期', + 'LBL_RULE' => '规则', +// Added/Updated for vtiger CRM 5.0.4 +'not equal to'=>'不等于', +'starts with'=>'开始于', +'ends with'=>'结束于', +//'Product Code'=>'产品编号', + +// Added after 5.0.4 GA + +//Added for Role based Custom filters +'LBL_SET_AS_PUBLIC'=>'设为公共 ', +'LBL_NEW'=>'新', +'LBL_EDIT'=>'修改', +'LBL_STATUS_PUBLIC_APPROVE'=>'批准', +'LBL_STATUS_PUBLIC_DENY'=>'拒绝' +); +?> diff --git a/oss/vtiger/trunk/modules/CustomerPortal/AdvancedSettings.php b/oss/vtiger/trunk/modules/CustomerPortal/AdvancedSettings.php new file mode 100644 index 00000000..7a1419e7 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/AdvancedSettings.php @@ -0,0 +1,57 @@ +id.'.php'); + +if(!$is_admin) { + echo "
"; + echo "
+ + + + + + + + + +
+ $app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; +} + +$mode = $_REQUEST['mode']; +if($mode !='' && $mode == 'save') { + cp_saveAdvancedSettings($_REQUEST); +} +$category = getParentTab(); +$smarty = new vtigerCRM_Smarty(); +$smarty->assign("THEME", $theme); +$smarty->assign('MOD', $mod_strings); +$smarty->assign('APP', $app_strings); +$smarty->assign('MODULE', $currentModule); +$smarty->assign('CATEGORY', $category); +$smarty->assign('BUTTONS', $list_buttons); +$smarty->assign('CHECK', $tool_buttons); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('MODULE_VIEWALL',cp_getContactsViewInfo()); + +$smarty->assign('USERS', cp_getUsers()); +$smarty->assign('USERID',cp_getCurrentUser()); +$smarty->display(vtlib_getModuleTemplate($currentModule,'AdvancedSettings.tpl')); +?> diff --git a/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortal.js b/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortal.js new file mode 100644 index 00000000..3b178630 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortal.js @@ -0,0 +1,40 @@ +/********************************************************************************* + ** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + +function move_module(tabid,move){ + + //$('vtbusy_info').style.display = "block"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'module=CustomerPortal&action=CustomerPortalAjax&file=ListView&sub_mode=movemodules&parenttab=Settings&tabid='+tabid+'&move='+move+'&ajax=true', + onComplete: function(response) { + $("portallist").innerHTML=response.responseText; + //$('vtbusy_info').style.display = "none"; + } + } + ); +} + +function toggleModule(tabid, action) { +var data = 'module=CustomerPortal&action=CustomerPortalAjax&file=ListView&tabid='+tabid+'&sub_mode=enable_disable&status='+action; +new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: data, + onComplete: function(response) { + // Reload the page to apply the effect of module setting + window.location.href = "index.php?module=CustomerPortal&action=index&parenttab=Settings"; + } + } + ); +} diff --git a/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortal.php b/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortal.php new file mode 100644 index 00000000..c7ce6254 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortal.php @@ -0,0 +1,66 @@ +query("INSERT INTO vtiger_customerportal_tabs (tabid,visible,sequence) VALUES ($tabid,1,$i)"); + } + for($j = 0; $j< count($portalmodules); $j++) { + $tabid = getTabid($portalmodules[$j]); + $adb->query("INSERT INTO vtiger_customerportal_prefs(tabid,prefkey,prefvalue) VALUES ($tabid,'showrelatedinfo',1)"); + } + + $adb->query("INSERT INTO vtiger_customerportal_prefs(tabid,prefkey,prefvalue) VALUES (0,'userid',1)"); + + // Mark the module as Standard module + $adb->pquery('UPDATE vtiger_tab SET customized=0 WHERE name=?', array($moduleName)); + + $fieldid = $adb->getUniqueID('vtiger_settings_field'); + $blockid = getSettingsBlockId('LBL_OTHER_SETTINGS'); + $seq_res = $adb->pquery("SELECT max(sequence) AS max_seq FROM vtiger_settings_field WHERE blockid = ?", array($blockid)); + if ($adb->num_rows($seq_res) > 0) { + $cur_seq = $adb->query_result($seq_res, 0, 'max_seq'); + if ($cur_seq != null) $seq = $cur_seq + 1; + } + + $adb->pquery('INSERT INTO vtiger_settings_field(fieldid, blockid, name, iconpath, description, linkto, sequence) + VALUES (?,?,?,?,?,?,?)', array($fieldid, $blockid, 'LBL_CUSTOMER_PORTAL', 'portal_icon.png', 'PORTAL_EXTENSION_DESCRIPTION', 'index.php?module=CustomerPortal&action=index&parenttab=Settings', $seq)); + + + } else if($eventType == 'module.disabled') { + // TODO Handle actions when this module is disabled. + } else if($eventType == 'module.enabled') { + // TODO Handle actions when this module is enabled. + } else if($eventType == 'module.preuninstall') { + // TODO Handle actions when this module is about to be deleted. + } else if($eventType == 'module.preupdate') { + // TODO Handle actions before this module is updated. + } else if($eventType == 'module.postupdate') { + // TODO Handle actions after this module is updated. + } + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortalAjax.php b/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortalAjax.php new file mode 100644 index 00000000..4529abde --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortalAjax.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortalHandler.php b/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortalHandler.php new file mode 100644 index 00000000..729d97fa --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/CustomerPortalHandler.php @@ -0,0 +1,17 @@ + diff --git a/oss/vtiger/trunk/modules/CustomerPortal/ListView.php b/oss/vtiger/trunk/modules/CustomerPortal/ListView.php new file mode 100644 index 00000000..eb2c13d7 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/ListView.php @@ -0,0 +1,76 @@ +id.'.php'); + +if(!$is_admin) { + echo "
"; + echo "
+ + + + + + + + + +
+ $app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; +} + +if($_REQUEST['sub_mode'] != '' && isset($_REQUEST['sub_mode'])){ + $sub_mode =$_REQUEST['sub_mode']; +} +if($sub_mode == 'movemodules'){ + $tabid = $_REQUEST['tabid']; + $move = $_REQUEST['move']; + if($tabid != ''){ + cp_changeTabOrder($tabid,$move); + } +}elseif($sub_mode == 'enable_disable') { + $tabid = $_REQUEST['tabid']; + $status =$_REQUEST['status']; + if($status != '' && $tabid != ''){ + cp_changeModuleVisibility($tabid,$status); + } +} +$category = getParentTab(); +$smarty = new vtigerCRM_Smarty(); +$portalmodules = cp_getPortalModuleinfo(); + +$smarty->assign('PORTALMODULES',$portalmodules); +$smarty->assign("THEME", $theme); +$smarty->assign('MOD', $mod_strings); +$smarty->assign('APP', $app_strings); +$smarty->assign('MODULE', $currentModule); +$smarty->assign('CATEGORY', $category); +$smarty->assign('BUTTONS', $list_buttons); +$smarty->assign('CHECK', $tool_buttons); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('MODE',$mode); +if($_REQUEST['ajax'] != true) { + $smarty->display(vtlib_getModuleTemplate($currentModule,'BasicSetttings.tpl')); +} +else { + $smarty->display(vtlib_getModuleTemplate($currentModule,'BasicSetttingsContents.tpl')); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomerPortal/PortalUtils.php b/oss/vtiger/trunk/modules/CustomerPortal/PortalUtils.php new file mode 100644 index 00000000..99008664 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/PortalUtils.php @@ -0,0 +1,136 @@ +query("SELECT vtiger_customerportal_tabs.*,vtiger_tab.name from vtiger_customerportal_tabs + INNER JOIN vtiger_tab ON vtiger_customerportal_tabs.tabid = vtiger_tab.tabid and vtiger_tab.presence = 0 + ORDER BY vtiger_customerportal_tabs.sequence"); + $rows = $adb->num_rows($query); + for($i = 0;$i < $rows; $i++){ + $portalmodules[$i]['tabid'] = $adb->query_result($query,$i,'tabid'); + $portalmodules[$i]['visible'] = $adb->query_result($query,$i,'visible'); + $portalmodules[$i]['sequence'] = $adb->query_result($query,$i,'sequence'); + $portalmodules[$i]['name'] = $adb->query_result($query,$i,'name'); + } + return $portalmodules; +} + +/* Function is used to change the order of modules in Customer portal + * + */ +function cp_changeTabOrder($tabid,$move) { + global $adb,$log; + $log->fatal("$tabid,$move"); + if($move == 'Down'){ + $sequence = $adb->pquery("SELECT sequence FROM vtiger_customerportal_tabs WHERE tabid = ?", array($tabid)); + $oldsequence = $adb->query_result($sequence,0,'sequence'); + + $nexttab = $adb->pquery("SELECT sequence,tabid FROM vtiger_customerportal_tabs WHERE sequence > ? ORDER BY SEQUENCE LIMIT 0,1", array($oldsequence)); + $newsequence = $adb->query_result($nexttab,0,'sequence'); + $righttabid = $adb->query_result($nexttab,0,'tabid'); + + $adb->pquery("UPDATE vtiger_customerportal_tabs set sequence=? WHERE tabid = ?", array($newsequence, $tabid)); + $adb->pquery("UPDATE vtiger_customerportal_tabs set sequence=? WHERE tabid = ?", array($oldsequence, $righttabid)); + }elseif ($move == 'Up') { + $sequence = $adb->pquery("SELECT sequence FROM vtiger_customerportal_tabs WHERE tabid = ?", array($tabid)); + $oldsequence = $adb->query_result($sequence,0,'sequence'); + + $nexttab = $adb->pquery("SELECT sequence,tabid FROM vtiger_customerportal_tabs WHERE sequence < ? ORDER BY SEQUENCE DESC LIMIT 0,1", array($oldsequence)); + $newsequence = $adb->query_result($nexttab,0,'sequence'); + $lefttabid = $adb->query_result($nexttab,0,'tabid'); + + $adb->pquery("UPDATE vtiger_customerportal_tabs SET sequence=? WHERE tabid = ?", array($newsequence, $tabid)); + $adb->pquery("UPDATE vtiger_customerportal_tabs SET sequence=? WHERE tabid = ?", array($oldsequence, $lefttabid)); + + } + +} + +/* Function to obtain related info for Customer Portal(contacts can see other contacts info ar not) + */ + +function cp_getContactsViewInfo() { + global $adb; + $relatedinfo = $adb->query("SELECT vtiger_customerportal_prefs.*,vtiger_tab.name FROM vtiger_customerportal_prefs + INNER JOIN vtiger_tab ON vtiger_tab.tabid = vtiger_customerportal_prefs.tabid + WHERE prefkey = 'showrelatedinfo' AND vtiger_tab.presence = 0"); + $norows = $adb->num_rows($relatedinfo); + for($i = 0;$i < $norows;$i++) { + $module_viewall[$i]['module'] = $adb->query_result($relatedinfo,$i,'name'); + $module_viewall[$i]['value'] = $adb->query_result($relatedinfo,$i,'prefvalue'); + } + return $module_viewall; +} + +/* Function to show/hide the tabs(modules) in Customer Portal + */ +function cp_changeModuleVisibility($tabid,$status) { + global $adb,$log; + if($status == 'module_disable'){ + $updatevisibility = $adb->pquery("UPDATE vtiger_customerportal_tabs SET visible = 0 WHERE tabid = ?", array($tabid)); + }else { + $updatevisibility = $adb->pquery("UPDATE vtiger_customerportal_tabs SET visible = 1 WHERE tabid = ?", array($tabid)); + } +} + +/* Function to save Advanced info fro Customer Portal + */ +function cp_saveAdvancedSettings($input) { + global $adb; + + $portalmodules = array("Accounts","Contacts","HelpDesk","Invoice","Quotes","Documents","Faq","Services","Products"); + foreach($portalmodules as $modules) { + $view = $input['view_'.$modules]; + $tabid = getTabid($modules); + if($view == 'showall'){ + $adb->pquery("UPDATE vtiger_customerportal_prefs SET prefvalue = 1 WHERE prefkey = 'showrelatedinfo' and tabid = ?", array($tabid)); + }else { + $adb->pquery("UPDATE vtiger_customerportal_prefs SET prefvalue = 0 WHERE prefkey = 'showrelatedinfo' and tabid = ?", array($tabid)); + } + } + + //user update + $userid = $input['userid']; + $adb->pquery("UPDATE vtiger_customerportal_prefs SET prefvalue = ? WHERE prefkey = 'userid' and tabid = 0", array($userid)); + +} + +/* It gives you a list of users + * + */ +function cp_getUsers(){ + global $adb; + $res = $adb->query("SELECT id,user_name from vtiger_users"); + $norows = $adb->num_rows($res); + for($i = 0;$i < $norows;$i++) { + $users[$i]['id'] = $adb->query_result($res,$i,'id'); + $users[$i]['name'] = $adb->query_result($res,$i,'user_name'); + } + return $users; +} + +/* Function to get the customer portal user id + */ +function cp_getCurrentUser() { + global $adb; + $res = $adb->query("SELECT prefvalue FROM vtiger_customerportal_prefs WHERE prefkey = 'userid' AND tabid = 0"); + $userid = $adb->query_result($res,0,'prefvalue'); + if($userid != '') { + return $userid; + } + return false; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/CustomerPortal/index.php b/oss/vtiger/trunk/modules/CustomerPortal/index.php new file mode 100644 index 00000000..93f50e26 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/index.php @@ -0,0 +1,36 @@ +id.'.php'); + +if(!$is_admin) { + echo "
"; + echo "
+ + + + + + + + + +
+ $app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; +} +include_once("modules/$currentModule/ListView.php"); + +?> diff --git a/oss/vtiger/trunk/modules/CustomerPortal/language/en_us.lang.php b/oss/vtiger/trunk/modules/CustomerPortal/language/en_us.lang.php new file mode 100644 index 00000000..6fdc959f --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/language/en_us.lang.php @@ -0,0 +1,22 @@ + 'CustomerPortal', +'LBL_BASIC_SETTINGS'=>'Basic Settings', +'LBL_ADVANCED_SETTINGS'=>'Advanced Settings', +'LBL_MODULE'=>'Module', +'LBL_VIEW_ALL_RECORD'=>'View All Related Records ?', +'YES'=>'Yes', +'NO'=>'No', +'LBL_USER_DESCRIPTION'=>'The above selected User\'s profile will be selected to control the fields that appear in the Customer Portal + You can enable/disable the fields that show in the customer Portal.', +'SELECT_USERS'=>'Select the Users', +'LBL_DISABLE'=>'Disable', +'LBL_ENABLE' =>'Enable', +'Module' => 'Module', +'Sequence' =>'Sequence', +'Visible'=>'Visible' + +); + +?> diff --git a/oss/vtiger/trunk/modules/CustomerPortal/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/CustomerPortal/language/zh_cn.lang.php new file mode 100644 index 00000000..d8d8a084 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/language/zh_cn.lang.php @@ -0,0 +1,21 @@ + '客户门户 ', +'LBL_BASIC_SETTINGS'=>'基本设置', +'LBL_ADVANCED_SETTINGS'=>'高级设置', +'LBL_MODULE'=>'模块', +'LBL_VIEW_ALL_RECORD'=>'查看所有相关记录 ?', +'YES'=>'是', +'NO'=>'否', +'LBL_USER_DESCRIPTION'=>'您可以通过设置来决定上述选定的用户的相关权限,比如字段是否可见,模块是否可用等.', +'SELECT_USERS'=>'选择用户', +'LBL_DISABLE'=>'禁用', +'LBL_ENABLE' =>'启用', +'Module' => '模块', +'Sequence' =>'次序', +'Visible'=>'可见' + +); + +?> diff --git a/oss/vtiger/trunk/modules/CustomerPortal/schema.xml b/oss/vtiger/trunk/modules/CustomerPortal/schema.xml new file mode 100644 index 00000000..913b1a17 --- /dev/null +++ b/oss/vtiger/trunk/modules/CustomerPortal/schema.xml @@ -0,0 +1,34 @@ + + + + + vtiger_customerportal_tabs + +
+ + vtiger_customerportal_fields + +
+ + vtiger_customerportal_prefs + +
+ + vtiger_customerportal_prefs + +
+
+
diff --git a/oss/vtiger/trunk/modules/Dashboard/Chart_lead_source_by_outcome.php b/oss/vtiger/trunk/modules/Dashboard/Chart_lead_source_by_outcome.php new file mode 100644 index 00000000..12ffec0f --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/Chart_lead_source_by_outcome.php @@ -0,0 +1,160 @@ +id.'.php'); +require('user_privileges/user_privileges_'.$current_user->id.'.php'); + +// Get _dom arrays from Database +$comboFieldNames = Array('leadsource'=>'lead_source_dom'); +$comboFieldArray = getComboArray($comboFieldNames); + +$log = LoggerManager::getLogger('lead_source_by_outcome'); + +if (isset($_REQUEST['lsbo_refresh'])) { $refresh = $_REQUEST['lsbo_refresh']; } +else { $refresh = false; } + +// added for auto refresh +$refresh = true; +// + +$tempx = array(); +$datax = array(); +//get list of sales stage keys to display +if (isset($_SESSION['lsbo_lead_sources']) && count($_SESSION['lsbo_lead_sources']) > 0 && !isset($_REQUEST['lsbo_lead_sources'])) { + $tempx = $_SESSION['lsbo_lead_sources']; + $log->debug("_SESSION['lsbo_lead_sources'] is:"); + $log->debug($_SESSION['lsbo_lead_sources']); +} +elseif (isset($_REQUEST['lsbo_lead_sources']) && count($_REQUEST['lsbo_lead_sources']) > 0) { + $tempx = $_REQUEST['lsbo_lead_sources']; + $current_user->setPreference('lsbo_lead_sources', $_REQUEST['lsbo_lead_sources']); + $log->debug("_REQUEST['lsbo_lead_sources'] is:"); + $log->debug($_REQUEST['lsbo_lead_sources']); + $log->debug("_SESSION['lsbo_lead_sources'] is:"); + $log->debug($_SESSION['lsbo_lead_sources']); +} + +//set $datax using selected sales stage keys +if (count($tempx) > 0) { + foreach ($tempx as $key) { + $datax[$key] = $comboFieldArray['lead_source_dom'][$key]; + } +} +else { + $datax = $comboFieldArray['lead_source_dom']; +} +$log->debug("datax is:"); +$log->debug($datax); + +$ids = array(); +//get list of user ids for which to display data +if (isset($_SESSION['lsbo_ids']) && count($_SESSION['lsbo_ids']) != 0 && !isset($_REQUEST['lsbo_ids'])) { + $ids = $_SESSION['lsbo_ids']; + $log->debug("_SESSION['lsbo_ids'] is:"); + $log->debug($_SESSION['lsbo_ids']); +} +elseif (isset($_REQUEST['lsbo_ids']) && count($_REQUEST['lsbo_ids']) > 0) { + $ids = $_REQUEST['lsbo_ids']; + $current_user->setPreference('lsbo_ids', $_REQUEST['lsbo_ids']); + $log->debug("_REQUEST['lsbo_ids'] is:"); + $log->debug($_REQUEST['lsbo_ids']); + $log->debug("_SESSION['lsbo_ids'] is:"); + $log->debug($_SESSION['lsbo_ids']); +} +else { + $ids = get_user_array(false); + $ids = array_keys($ids); +} + +//create unique prefix based on selected vtiger_users for image vtiger_files +$id_hash = ''; +if (isset($ids)) { + sort($ids); + $id_hash = crc32(implode('',$ids)); +} +$log->debug("ids is:"); +$log->debug($ids); + +$cache_file_name = $id_hash."_lead_source_by_outcome_".$current_language."_".crc32(implode('',$datax)).".png"; +$log->debug("cache file name is: $cache_file_name"); + +if(isPermitted('Potentials','index')=="yes") +{ +$draw_this = new jpgraph(); +$width = 850; +$height = 500; +if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') +{ + $width = 350; + $height = 250; +} + +echo $draw_this->lead_source_by_outcome($datax, $ids, $tmp_dir.$cache_file_name, $refresh,$width,$height); +echo "

".$current_module_strings['LBL_LEAD_SOURCE_BY_OUTCOME_DESC']."

"; +if (isset($_REQUEST['lsbo_edit']) && $_REQUEST['lsbo_edit'] == 'true') { +?> +
+ + + + + + + + + + + + + + + + + +

+
+ +
+ +[] +[] +
+ \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Dashboard/Chart_my_pipeline_by_sales_stage.php b/oss/vtiger/trunk/modules/Dashboard/Chart_my_pipeline_by_sales_stage.php new file mode 100644 index 00000000..a1fc62ed --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/Chart_my_pipeline_by_sales_stage.php @@ -0,0 +1,184 @@ +'sales_stage_dom'); +$comboFieldArray = getComboArray($comboFieldNames); + +//get the dates to display +if (isset($_SESSION['mypbss_date_start']) && $_SESSION['mypbss_date_start'] != '' && !isset($_REQUEST['mypbss_date_start'])) { + $date_start = $_SESSION['mypbss_date_start']; + $log->debug("_SESSION['mypbss_date_start'] is:"); + $log->debug($_SESSION['mypbss_date_start']); +} +elseif (isset($_REQUEST['mypbss_date_start']) && $_REQUEST['mypbss_date_start'] != '') { + $date_start = $_REQUEST['mypbss_date_start']; + $current_user->setPreference('mypbss_date_start', $_REQUEST['mypbss_date_start']); + $log->debug("_REQUEST['mypbss_date_start'] is:"); + $log->debug($_REQUEST['mypbss_date_start']); + $log->debug("_SESSION['mypbss_date_start'] is:"); + $log->debug($_SESSION['mypbss_date_start']); +} +else { + $date_start = date("Y-m-d", time()); +} + +if (isset($_SESSION['mypbss_date_end']) && $_SESSION['mypbss_date_end'] != '' && !isset($_REQUEST['mypbss_date_end'])) { + $date_end = $_SESSION['mypbss_date_end']; + $log->debug("_SESSION['mypbss_date_end'] is:"); + $log->debug($_SESSION['mypbss_date_end']); +} +elseif (isset($_REQUEST['mypbss_date_end']) && $_REQUEST['mypbss_date_end'] != '') { + $date_end = $_REQUEST['mypbss_date_end']; + $current_user->setPreference('mypbss_date_end', $_REQUEST['mypbss_date_end']); + $log->debug("_REQUEST['mypbss_date_end'] is:"); + $log->debug($_REQUEST['mypbss_date_end']); + $log->debug("_SESSION['mypbss_date_end'] is:"); + $log->debug($_SESSION['mypbss_date_end']); +} +else { + $date_end = '2100-01-01'; +} + +$tempx = array(); +$datax = array(); +//get list of sales stage keys to display +if (isset($_SESSION['mypbss_sales_stages']) && count($_SESSION['mypbss_sales_stages']) > 0 && !isset($_REQUEST['mypbss_sales_stages'])) { + $tempx = $_SESSION['mypbss_sales_stages']; + $log->debug("_SESSION['mypbss_sales_stages'] is:"); + $log->debug($_SESSION['mypbss_sales_stages']); +} +elseif (isset($_REQUEST['mypbss_sales_stages']) && count($_REQUEST['mypbss_sales_stages']) > 0) { + $tempx = $_REQUEST['mypbss_sales_stages']; + $current_user->setPreference('mypbss_sales_stages', $_REQUEST['mypbss_sales_stages']); + $log->debug("_REQUEST['mypbss_sales_stages'] is:"); + $log->debug($_REQUEST['mypbss_sales_stages']); + $log->debug("_SESSION['mypbss_sales_stages'] is:"); + $log->debug($_SESSION['mypbss_sales_stages']); +} + +//set $datax using selected sales stage keys +if (count($tempx) > 0) { + foreach ($tempx as $key) { + $datax[$key] = $comboFieldArray['sales_stage_dom'][$key];//$app_list_strings['sales_stage_dom'][$key]; + } +} +else { + $datax = $comboFieldArray['sales_stage_dom'];//app_list_strings['sales_stage_dom']; +} +$log->debug("datax is:"); +$log->debug($datax); + +$ids = array($current_user->id); +//create unique prefix based on selected vtiger_users for image vtiger_files +$id_hash = ''; +if (isset($ids)) { + sort($ids); + $id_hash = crc32(implode('',$ids)); +} +$log->debug("ids is:"); +$log->debug($ids); + +$cache_file_name = $id_hash."_pipeline_".$current_language."_".crc32(implode('',$datax)).$date_start.$date_end.".png"; +$log->debug("cache file name is: $cache_file_name"); + +if (substr(phpversion(), 0, 1) == "5") { // php5 } + echo "Charts not supported in PHP 5."; +} +else { +$draw_this = new jpgraph(); +echo $draw_this->pipeline_by_sales_stage($datax, $date_start, $date_end, $ids, $tmp_dir.$cache_file_name, $refresh); +echo "

".$current_module_strings['LBL_PIPELINE_FORM_TITLE_DESC']."

"; +if (isset($_REQUEST['mypbss_edit']) && $_REQUEST['mypbss_edit'] == 'true') { + $cal_lang = "en"; + $cal_dateformat = parse_calendardate($app_strings['NTC_DATE_FORMAT']); + $cal_dateformat = '%Y-%m-%d'; // fix providedd by Jlee for date bug in Dashboard + + +?> + + + + +
+ + + + + + + + + + + + + + + + + +

'>

'>

+
+ + + +
+ +[] +[] +
+ diff --git a/oss/vtiger/trunk/modules/Dashboard/Chart_outcome_by_month.php b/oss/vtiger/trunk/modules/Dashboard/Chart_outcome_by_month.php new file mode 100644 index 00000000..fc16aa6d --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/Chart_outcome_by_month.php @@ -0,0 +1,197 @@ +id.'.php'); +require('user_privileges/user_privileges_'.$current_user->id.'.php'); + +$log = LoggerManager::getLogger('outcome_by_month'); + +if (isset($_REQUEST['obm_refresh'])) { $refresh = $_REQUEST['obm_refresh']; } +else { $refresh = false; } + +// added for auto refresh +$refresh = true; +// + +$date_start = array(); +$datax = array(); +//get the dates to display +//added to fix the issue4307 +if(isset($_REQUEST['obm_date_start']) && $_REQUEST['obm_date_start'] == '') +{ + $_SESSION['obm_date_start'] = ""; +} +elseif(isset($_REQUEST['obm_date_start']) && $_REQUEST['obm_date_start'] != '') + $_SESSION['obm_date_start'] = $_REQUEST['obm_date_start']; +if(isset($_REQUEST['obm_date_end']) && $_REQUEST['obm_date_end'] == '') +{ + $_SESSION['obm_date_end'] = ""; +} +elseif(isset($_REQUEST['obm_date_end']) && $_REQUEST['obm_date_end'] != '') + $_SESSION['obm_date_end'] = $_REQUEST['obm_date_end']; +if (isset($_SESSION['obm_date_start']) && $_SESSION['obm_date_start'] != '' && !isset($_REQUEST['obm_date_start'])) { + $date_start = $_SESSION['obm_date_start']; + $log->debug("_SESSION['obm_date_start'] is:"); + $log->debug($_SESSION['obm_date_start']); +} +elseif (isset($_REQUEST['obm_date_start']) && $_REQUEST['obm_date_start'] != '') { + $date_start = $_REQUEST['obm_date_start']; + $current_user->setPreference('obm_date_start', $_REQUEST['obm_date_start']); + $log->debug("_REQUEST['obm_date_start'] is:"); + $log->debug($_REQUEST['obm_date_start']); + $log->debug("_SESSION['obm_date_start'] is:"); + $log->debug($_SESSION['obm_date_start']); +} +else { + $date_start = '2000-01-01'; +} + +if (isset($_SESSION['obm_date_end']) && $_SESSION['obm_date_end'] != '' && !isset($_REQUEST['obm_date_end'])) { + $date_end = $_SESSION['obm_date_end']; + $log->debug("_SESSION['obm_date_end'] is:"); + $log->debug($_SESSION['obm_date_end']); +} +elseif (isset($_REQUEST['obm_date_end']) && $_REQUEST['obm_date_end'] != '') { + $date_end = $_REQUEST['obm_date_end']; + $current_user->setPreference('obm_date_end', $_REQUEST['obm_date_end']); + $log->debug("_REQUEST['obm_date_end'] is:"); + $log->debug($_REQUEST['obm_date_end']); + $log->debug("_SESSION['obm_date_end'] is:"); + $log->debug($_SESSION['obm_date_end']); +} +else { + $date_end = '2100-01-01'; +} + +$ids = array(); +//get list of user ids for which to display data +if (isset($_SESSION['obm_ids']) && count($_SESSION['obm_ids']) != 0 && !isset($_REQUEST['obm_ids'])) { + $ids = $_SESSION['obm_ids']; + $log->debug("_SESSION['obm_ids'] is:"); + $log->debug($_SESSION['obm_ids']); +} +elseif (isset($_REQUEST['obm_ids']) && count($_REQUEST['obm_ids']) > 0) { + $ids = $_REQUEST['obm_ids']; + $current_user->setPreference('obm_ids', $_REQUEST['obm_ids']); + $log->debug("_REQUEST['obm_ids'] is:"); + $log->debug($_REQUEST['obm_ids']); + $log->debug("_SESSION['obm_ids'] is:"); + $log->debug($_SESSION['obm_ids']); +} +else { + $ids = get_user_array(false); + $ids = array_keys($ids); +} + +//create unique prefix based on selected vtiger_users for image vtiger_files +$id_hash = ''; +if (isset($ids)) { + sort($ids); + $id_hash = crc32(implode('',$ids)); +} +$log->debug("ids is:"); +$log->debug($ids); + +$cache_file_name = $id_hash."_outcome_by_month_".$current_language."_".crc32($date_start.$date_end).".png"; +$log->debug("cache file name is: $cache_file_name"); + +if(isPermitted('Potentials','index')=="yes") +{ +$draw_this = new jpgraph(); +$width = 850; +$height = 500; +if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') +{ + $width = 350; + $height = 250; +} + +echo $draw_this->outcome_by_month($date_start, $date_end, $ids, $tmp_dir.$cache_file_name, $refresh,$width,$height); +echo "

".$current_module_strings['LBL_MONTH_BY_OUTCOME_DESC']."

"; +if (isset($_REQUEST['obm_edit']) && $_REQUEST['obm_edit'] == 'true') { + $cal_lang = "en"; + $cal_dateformat = parse_calendardate($app_strings['NTC_DATE_FORMAT']); + $cal_dateformat = '%Y-%m-%d'; // fix providedd by Jlee for date bug in Dashboard + +?> + + + + +
+ + + + + + + + + + + + + + + + + + + + + +

'>

'>

+
+ + + +
+ +[] +[] +
+ \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Dashboard/Chart_pipeline_by_lead_source.php b/oss/vtiger/trunk/modules/Dashboard/Chart_pipeline_by_lead_source.php new file mode 100644 index 00000000..eb38df6b --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/Chart_pipeline_by_lead_source.php @@ -0,0 +1,161 @@ +id.'.php'); +require('user_privileges/user_privileges_'.$current_user->id.'.php'); + +// Get _dom arrays from Database +$comboFieldNames = Array('leadsource'=>'lead_source_dom'); +$comboFieldArray = getComboArray($comboFieldNames); + +$log = LoggerManager::getLogger('CSIM_pipeline_by_lead_source'); + +if (isset($_REQUEST['pbls_refresh'])) { $refresh = $_REQUEST['pbls_refresh']; } +else { $refresh = false; } + +// added for auto refresh +$refresh = true; +// + +$tempx = array(); +$datax = array(); +//get list of sales stage keys to display +if (isset($_SESSION['pbls_lead_sources']) && count($_SESSION['pbls_lead_sources']) > 0 && !isset($_REQUEST['pbls_lead_sources'])) { + $tempx = $_SESSION['pbls_lead_sources']; + $log->debug("_SESSION['pbls_lead_sources'] is:"); + $log->debug($_SESSION['pbls_lead_sources']); +} +elseif (isset($_REQUEST['pbls_lead_sources']) && count($_REQUEST['pbls_lead_sources']) > 0) { + $tempx = $_REQUEST['pbls_lead_sources']; + $current_user->setPreference('pbls_lead_sources', $_REQUEST['pbls_lead_sources']); + $log->debug("_REQUEST['pbls_lead_sources'] is:"); + $log->debug($_REQUEST['pbls_lead_sources']); + $log->debug("_SESSION['pbls_lead_sources'] is:"); + $log->debug($_SESSION['pbls_lead_sources']); +} + +//set $datax using selected sales stage keys +if (count($tempx) > 0) { + foreach ($tempx as $key) { + $datax[$key] = $comboFieldArray['lead_source_dom'][$key]; + } +} +else { + $datax = $comboFieldArray['lead_source_dom']; +} +$log->debug("datax is:"); +$log->debug($datax); + +$ids = array(); +//get list of user ids for which to display data +if (isset($_SESSION['pbls_ids']) && count($_SESSION['pbls_ids']) != 0 && !isset($_REQUEST['pbls_ids'])) { + $ids = $_SESSION['pbls_ids']; + $log->debug("_SESSION['pbls_ids'] is:"); + $log->debug($_SESSION['pbls_ids']); +} +elseif (isset($_REQUEST['pbls_ids']) && count($_REQUEST['pbls_ids']) > 0) { + $ids = $_REQUEST['pbls_ids']; + $current_user->setPreference('pbls_ids', $ids); + $log->debug("_REQUEST['pbls_ids'] is:"); + $log->debug($_REQUEST['pbls_ids']); + $log->debug("_SESSION['pbls_ids'] is:"); + $log->debug($_SESSION['pbls_ids']); +} +else { + $ids = get_user_array(false); + $ids = array_keys($ids); +} + +//create unique prefix based on selected vtiger_users for image vtiger_files +$id_hash = ''; +if (isset($ids)) { + sort($ids); + $id_hash = crc32(implode('',$ids)); +} +$log->debug("ids is:"); +$log->debug($ids); + +$cache_file_name = $id_hash."_pipeline_by_lead_source_".$current_language."_".crc32(implode('',$datax)).".png"; +$log->debug("cache file name is: $cache_file_name"); + +if(isPermitted('Potentials','index')=="yes") +{ +$draw_this = new jpgraph(); +$width = 850; +$height = 500; +if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') +{ + $width = 350; + $height = 250; +} + + +echo $draw_this->pipeline_by_lead_source($datax, $ids, $tmp_dir.$cache_file_name, $refresh,$width,$height); +echo "

".$current_module_strings['LBL_LEAD_SOURCE_FORM_DESC']."

"; +if (isset($_REQUEST['pbls_edit']) && $_REQUEST['pbls_edit'] == 'true') { +?> +
+ + + + + + + + + + + + + + + + + +

+
+ +
+ +[] +[] +
+ \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Dashboard/Chart_pipeline_by_sales_stage.php b/oss/vtiger/trunk/modules/Dashboard/Chart_pipeline_by_sales_stage.php new file mode 100644 index 00000000..6ddb86b7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/Chart_pipeline_by_sales_stage.php @@ -0,0 +1,235 @@ +id.'.php'); +require('user_privileges/user_privileges_'.$current_user->id.'.php'); +$log = LoggerManager::getLogger('pipeline_by_sales_stage'); + +if (isset($_REQUEST['pbss_refresh'])) { $refresh = $_REQUEST['pbss_refresh']; } +else { $refresh = false; } + +// added for auto refresh +$refresh = true; +// + +// Get _dom Arrays from Database +$comboFieldNames = Array('sales_stage'=>'sales_stage_dom'); +$comboFieldArray = getComboArray($comboFieldNames); +//added to fix the issue 4307 +if(isset($_REQUEST['pbss_date_start']) && $_REQUEST['pbss_date_start'] == '') +{ + $_SESSION['pbss_date_start'] = ""; +} +elseif(isset($_REQUEST['pbss_date_start']) && $_REQUEST['pbss_date_start'] != '') + $_SESSION['pbss_date_start']=$_REQUEST['pbss_date_start']; +if(isset($_REQUEST['pbss_date_end']) && $_REQUEST['pbss_date_end'] == '') +{ + $_SESSION['pbss_date_end'] = ""; +} +elseif(isset($_REQUEST['pbss_date_start']) && $_REQUEST['pbss_date_end'] != '') + $_SESSION['pbss_date_end'] = $_REQUEST['pbss_date_end']; +//get the dates to display +if (isset($_SESSION['pbss_date_start']) && $_SESSION['pbss_date_start'] != '' && !isset($_REQUEST['pbss_date_start'])) { + $date_start = $_SESSION['pbss_date_start']; + $log->debug("_SESSION['pbss_date_start'] is:"); + $log->debug($_SESSION['pbss_date_start']); +} +elseif (isset($_REQUEST['pbss_date_start']) && $_REQUEST['pbss_date_start'] != '') { + $date_start = $_REQUEST['pbss_date_start']; + $current_user->setPreference('pbss_date_start', $_REQUEST['pbss_date_start']); + $log->debug("_REQUEST['pbss_date_start'] is:"); + $log->debug($_REQUEST['pbss_date_start']); + $log->debug("_SESSION['pbss_date_start'] is:"); + $log->debug($_SESSION['pbss_date_start']); +} +else { + $date_start = "2001-01-01"; +} + +if (isset($_SESSION['pbss_date_end']) && $_SESSION['pbss_date_end'] != '' && !isset($_REQUEST['pbss_date_end'])) { + $date_end = $_SESSION['pbss_date_end']; + $log->debug("_SESSION['pbss_date_end'] is:"); + $log->debug($_SESSION['pbss_date_end']); +} +elseif (isset($_REQUEST['pbss_date_end']) && $_REQUEST['pbss_date_end'] != '') { + $date_end = $_REQUEST['pbss_date_end']; + $current_user->setPreference('pbss_date_end', $_REQUEST['pbss_date_end']); + $log->debug("_REQUEST['pbss_date_end'] is:"); + $log->debug($_REQUEST['pbss_date_end']); + $log->debug("_SESSION['pbss_date_end'] is:"); + $log->debug($_SESSION['pbss_date_end']); +} +else { + $date_end = '2100-01-01'; +} + +$tempx = array(); +$datax = array(); +//get list of sales stage keys to display +if (isset($_SESSION['pbss_sales_stages']) && count($_SESSION['pbss_sales_stages']) > 0 && !isset($_REQUEST['pbss_sales_stages'])) { + $tempx = $_SESSION['pbss_sales_stages']; + $log->debug("_SESSION['pbss_sales_stages'] is:"); + $log->debug($_SESSION['pbss_sales_stages']); +} +elseif (isset($_REQUEST['pbss_sales_stages']) && count($_REQUEST['pbss_sales_stages']) > 0) { + $tempx = $_REQUEST['pbss_sales_stages']; + $current_user->setPreference('pbss_sales_stages', $_REQUEST['pbss_sales_stages']); + $log->debug("_REQUEST['pbss_sales_stages'] is:"); + $log->debug($_REQUEST['pbss_sales_stages']); + $log->debug("_SESSION['pbss_sales_stages'] is:"); + $log->debug($_SESSION['pbss_sales_stages']); +} + +//set $datax using selected sales stage keys +if (count($tempx) > 0) { + foreach ($tempx as $key) { + $datax[$key] = $comboFieldArray['sales_stage_dom'][$key]; + } +} +else { + $datax = $comboFieldArray['sales_stage_dom']; +} +$log->debug("datax is:"); +$log->debug($datax); + +$ids = array(); +//get list of user ids for which to display data +if (isset($_SESSION['pbss_ids']) && count($_SESSION['pbss_ids']) != 0 && !isset($_REQUEST['pbss_ids'])) { + $ids = $_SESSION['pbss_ids']; + $log->debug("_SESSION['pbss_ids'] is:"); + $log->debug($_SESSION['pbss_ids']); +} +elseif (isset($_REQUEST['pbss_ids']) && count($_REQUEST['pbss_ids']) > 0) { + $ids = $_REQUEST['pbss_ids']; + $current_user->setPreference('pbss_ids', $_REQUEST['pbss_ids']); + $log->debug("_REQUEST['pbss_ids'] is:"); + $log->debug($_REQUEST['pbss_ids']); + $log->debug("_SESSION['pbss_ids'] is:"); + $log->debug($_SESSION['pbss_ids']); +} +else { + $ids = get_user_array(false); + $ids = array_keys($ids); +} + +//create unique prefix based on selected users for image files +$id_hash = ''; +if (isset($ids)) { + sort($ids); + $id_hash = crc32(implode('',$ids)); +} +$log->debug("ids is:"); +$log->debug($ids); + +$cache_file_name = $id_hash."_pipeline_".$current_language."_".crc32(implode('',$datax)).$date_start.$date_end.".png"; +$log->debug("cache file name is: $cache_file_name"); + +if(isPermitted('Potentials','index')=="yes") +{ +$draw_this = new jpgraph(); +$width = 850; +$height = 500; +if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') +{ + $width = 350; + $height = 250; +} + + +echo $draw_this->pipeline_by_sales_stage($datax, $date_start, $date_end, $ids, $tmp_dir.$cache_file_name, $refresh,$width,$height); +echo "

".$current_module_strings['LBL_SALES_STAGE_FORM_DESC']."

"; +if (isset($_REQUEST['pbss_edit']) && $_REQUEST['pbss_edit'] == 'true') { + $cal_lang = "en"; + $cal_dateformat = parse_calendardate($app_strings['NTC_DATE_FORMAT']); + $cal_dateformat = '%Y-%m-%d'; // fix providedd by Jlee for date bug in Dashboard + +?> + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

'>

'>

+
+ + + +
+ +[] +[] +
+ diff --git a/oss/vtiger/trunk/modules/Dashboard/DashboardAjax.php b/oss/vtiger/trunk/modules/Dashboard/DashboardAjax.php new file mode 100644 index 00000000..3dfc7b7a --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/DashboardAjax.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Dashboard/DashboardHome.php b/oss/vtiger/trunk/modules/Dashboard/DashboardHome.php new file mode 100644 index 00000000..ca8984e9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/DashboardHome.php @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
1  
+ +
+ + + + + + + + + +
1234
+
 
+ + + + + + + + +
2  
+
+ + + + + + + + + +
1234
+
 
+ + + + + + + + +
3  
+
+ + + + + + + + + +
1234
+
 
+ + + + + + + + +
4  
+
+ + + + + + + + + +
1234
+
 
+ diff --git a/oss/vtiger/trunk/modules/Dashboard/DashboardHome_matrix.php b/oss/vtiger/trunk/modules/Dashboard/DashboardHome_matrix.php new file mode 100644 index 00000000..c1786a8e --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/DashboardHome_matrix.php @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + +
1  
+
+
+ + + + + + + +
+ + + + + + + + +
2  
+
+

+ + + + + + + + +
+ + + + + + + + +
3  
+
+
+ + + + + + + +
+ + + + + + + + +
4  
+
+

+ diff --git a/oss/vtiger/trunk/modules/Dashboard/Entity_charts.php b/oss/vtiger/trunk/modules/Dashboard/Entity_charts.php new file mode 100644 index 00000000..b8f47c51 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/Entity_charts.php @@ -0,0 +1,837 @@ +pquery($acc_qry, array($acc_id)); + $no_acc_rows=$adb->num_rows($acc_result); + + if($no_acc_rows!=0) + { + while($acc_row = $adb->fetch_array($acc_result)) + { + $name_val=$acc_row['accountname']; + } + $name=$name_val; + } + else + $name=""; + return $name; +} + + +/** + * Performance Optimization: Module Chart for Home Page Dashboard + */ +function module_Chart_HomePageDashboard($userinfo) { + + global $adb, $app_strings; + + $user_id = $userinfo->id; + + $graph_details = Array(); + $modrecords = Array(); + + // List of modules which needs to be considered for chart + $module_list = Array('Accounts','Potentials','Contacts','Leads','Quotes','SalesOrder','PurchaseOrder','Invoice','HelpDesk','Calendar','Campaigns'); + // List of special module to handle + $spl_modules = Array('Leads', 'HelpDesk', 'Potentials', 'Calendar'); + + // Leads module + $leadcountres = $adb->query("SELECT count(*) as count FROM vtiger_crmentity se INNER JOIN vtiger_leaddetails le on le.leadid = se.crmid + WHERE se.deleted = 0 AND se.smownerid = $user_id AND (le.converted = 0 OR le.converted IS NULL)"); + $modrecords['Leads'] = $adb->query_result($leadcountres, 0, 'count'); + + // HelpDesk module + $helpdeskcountres = $adb->query("SELECT count(*) as count FROM vtiger_crmentity se INNER JOIN vtiger_troubletickets tt ON tt.ticketid = se.crmid + WHERE se.deleted = 0 AND se.smownerid = $user_id AND (tt.status != 'Closed' OR tt.status IS NULL)"); + $modrecords['HelpDesk']=$adb->query_result($helpdeskcountres,0,'count'); + + // Potentials module + $potcountres = $adb->query("SELECT count(*) as count FROM vtiger_crmentity se INNER JOIN vtiger_potential pot ON pot.potentialid = se.crmid + WHERE se.deleted = 0 AND se.smownerid = $user_id AND (pot.sales_stage NOT IN ('".$app_strings['LBL_CLOSE_WON']."','". + $app_strings['LBL_CLOSE_LOST']."') OR pot.sales_stage IS NULL)"); + $modrecords['Potentials']= $adb->query_result($potcountres,0,'count'); + + // Calendar moudule + $calcountres = $adb->query("SELECT count(*) as count FROM vtiger_crmentity se INNER JOIN vtiger_activity act ON act.activityid = se.crmid + WHERE se.deleted = 0 AND se.smownerid = $user_id AND ((act.status!='Completed' AND act.status!='Deferred') OR act.status IS NULL) + AND ((act.eventstatus!='Held' AND act.eventstatus!='Not Held') OR act.eventstatus IS NULL)"); + $modrecords['Calendar']= $adb->query_result($calcountres,0,'count'); + + // Ignore the special module + $nor_modules = array_diff($module_list, $spl_modules); + // Prepare module string to use in SQL (check permission) + $inmodulestr = ''; + foreach($nor_modules as $modulename) { + if(isPermitted("$modulename","index",'') == 'yes') { + if($inmodulestr != '') $inmodulestr .= ",'$modulename'"; + else $inmodulestr = "'$modulename'"; + } + } + + // Get count for module that needs special conditions + $query = "SELECT setype, count(setype) setype_count FROM vtiger_crmentity se WHERE + se.deleted = 0 AND se.smownerid=$user_id AND se.setype in ($inmodulestr) GROUP BY se.setype"; + $queryres = $adb->query($query); + while($resrow = $adb->fetch_array($queryres)) { + $modrecords[$resrow['setype']] = $resrow['setype_count']; + } + + // Get module custom filter info + $cvidres = $adb->query("SELECT cvid,entitytype FROM vtiger_customview WHERE viewname='All' AND entitytype in ('". + implode("','", array_keys($modrecords)). "')"); + + $cvidinfo = Array(); + while($cvidrow = $adb->fetch_array($cvidres)) { + $cvidinfo[$cvidrow['entitytype']] = $cvidrow['cvid']; + } + + $name_val = ''; + $cnt_val = ''; + $target_val = ''; + $urlstring = ''; + $cnt_table = ''; + $test_target_val=''; + + $total_records= 0; + foreach($module_list as $modulename) { + if(isset($modrecords[$modulename])) { + $modrec_count = $modrecords[$modulename]; + if($modrec_count > 0) { + if($name_val != '') $name_val .= '::'; + $name_val .= $modulename; + + if($cnt_val != '') $cnt_val .= '::'; + $cnt_val .= $modrec_count; + + $modviewid = $cvidinfo[$modulename]; + if($target_val!= '') $target_val.= '::'; + $target_val.= urlencode("index.php?module=$modulename&action=ListView&from_homepagedb=true&type=dbrd&query=true&owner=$userinfo->user_name&viewname=$modviewid"); + if($test_target_val!='') $test_target_val.= 'K'; + $test_target_val.=urlencode("index.php?module=$modulename&action=ListView&from_homepagedb=true&type=dbrd&query=true&owner=$userinfo->user_name&viewname=$modviewid"); + + $urlstring .= 'K'; + $cnt_table .= ""; + + $total_records += $modrec_count; + } + } + } + $cnt_table .= '
StatusTotal
$modulename$modrec_count
'; + + $graph_details[] = $name_val; + $graph_details[] = $cnt_val; + $graph_details[] = " $userinfo->user_name : $total_records "; + $graph_details[] = $target_val; + $graph_details[] = ''; + $graph_details[] = $urlstring; + $graph_details[] = $cnt_table; + $graph_details[] = $test_target_val; + + return $graph_details; +} +/** END **/ + +/* Function returns the values to render the graph for a particular type + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * Contributor(s): ______________________________________.. +*/ + +// TO get the Values for a particular graph type +function module_Chart($user_id,$date_start="2000-01-01",$end_date="2017-01-01",$query,$graph_for,$title,$added_qry="",$module="",$graph_type) +{ + + global $adb,$current_user,$mod_strings, $default_charset; + global $days,$date_array,$period_type; + + if($added_qry!="") + $query.=$added_qry; + + $result=$adb->query($query); + + $no_of_rows=$adb->num_rows($result); + $mod_count_array=array(); + $search_str_array=array(); + $mod_name_array=array(); + $count_by_date[]=array(); + $mod_tot_cnt_array=array(); + + $mod_name_val=""; + $mod_cnt_crtd_date=""; + $target_val=""; + $bar_target_val=""; + $test_target_val=""; + + if($no_of_rows!=0) + { + while($row = $adb->fetch_array($result)) + { + if($graph_for == 'sostatus'||$graph_for == 'leadsource'||$graph_for == 'leadstatus'||$graph_for == 'industry'||$graph_for == 'productcategory'||$graph_for =='postatus'||$graph_for == 'invoicestatus'||$graph_for == 'ticketstatus'||$graph_for == 'priority'||$graph_for == 'category'||$graph_for == 'quotestage'||$graph_for == 'salesstage') + { + $mod_name= getTranslatedString($row[$graph_for]); + $search_str = $row[$graph_for]; + } + else + { + $mod_name= $row[$graph_for]; + $search_str = $row[$graph_for]; + } + if($mod_name=="") + { + $mod_name=$mod_strings["Un Assigned"]; + $search_str = " "; + } + $crtd_time=$row['createdtime']; + $crtd_time_array=explode(" ",$crtd_time); + $crtd_date=$crtd_time_array[0]; + if(!isset($mod_tot_cnt_array[$crtd_date])) + $mod_tot_cnt_array[$crtd_date]=0; + + $mod_tot_cnt_array[$crtd_date]+=1; + + if (in_array($mod_name,$mod_name_array) == false) + { $uniqueid[$mod_name]='0'; + array_push($mod_name_array,$mod_name); // getting all the unique Names into the array + if($graph_for == "productname") + { + if($row['qtyinstock'] =='') + $mod_count_array[$mod_name] = 1; + else + $mod_count_array[$mod_name]=$row['qtyinstock']; + } + } + else + { + if($graph_for == "productname") + { + $uniqueid[$mod_name]=$uniqueid[$mod_name]+1; $mod_name=$mod_name.'['.$uniqueid[$mod_name].']'; array_push($mod_name_array,$mod_name); // getting all the unique Names into the array + + if($row['qtyinstock'] =='') + $mod_count_array[$mod_name] = 1; + else + $mod_count_array[$mod_name]=$row['qtyinstock']; + } + } + if (in_array($search_str,$search_str_array) == false) + { + array_push($search_str_array,$search_str); + } + + //Counting the number of values for a type of graph + if($graph_for == "productname") + { + if($row['qtyinstock'] =='') + $mod_count_array[$mod_name] = 1; + else + $mod_count_array[$mod_name]=$row['qtyinstock']; + + } + else + { + if(!isset($mod_count_array[$mod_name])) + $mod_count_array[$mod_name]=0; + $mod_count_array[$mod_name]++; + } + + //Counting the number of values for a type of graph for a particular date + if(!isset($count_by_date[$mod_name][$crtd_date])) + $count_by_date[$mod_name][$crtd_date]=0; + + $count_by_date[$mod_name][$crtd_date]+=1; + } + $mod_by_mod_cnt=count($mod_name_array); + + if($mod_by_mod_cnt!=0) + { + $url_string=""; + + $mod_cnt_table=" + "; + + //Assigning the Header values to the vtiger_table and giving the dates as graphformat + for($i=0; $i<$days; $i++) + { + $tdate=$date_array[$i]; + $values=Graph_n_table_format($period_type,$tdate); + $graph_format=$values[0]; + $table_format=$values[1]; + $mod_cnt_table.= ""; + } + $mod_cnt_table .= "" ; + + //For all type of the array + for ($i=0;$ipquery($query, array($mod_name)); + $name_val = $adb->query_result($result,0,"productname"); + if($name_val!="") + { + $mod_name=$name_val; + $search_str=$name_val; + } + } + if($graph_for =="purchaseorderid") + { + $query = "SELECT subject FROM vtiger_purchaseorder WHERE purchaseorderid=?"; + $result = $adb->pquery($query, array($mod_name)); + $name_val = $adb->query_result($result,0,"subject"); + $id_name = $mod_name; + if($name_val!="") + { + $mod_name=$name_val; + $search_str=$name_val; + } + } + if($graph_for =="quoteid") + { + $query = "SELECT subject FROM vtiger_quotes WHERE quoteid=?"; + $result = $adb->pquery($query, array($mod_name)); + $name_val = $adb->query_result($result,0,"subject"); + $id_name = $mod_name; + if($name_val!="") + { + $mod_name=$name_val; + $search_str=$name_val; + } + } + if($graph_for =="invoiceid") + { + $query = "SELECT subject FROM vtiger_invoice WHERE invoiceid=?"; + $result = $adb->pquery($query, array($mod_name)); + $name_val = $adb->query_result($result,0,"subject"); + $id_name = $mod_name; + if($name_val!="") + { + $mod_name=$name_val; + $search_str=$name_val; + } + } + if($graph_for =="campaignid") + { + //this will return the list of the names of the campaign``:w for the y-axis + $query = "SELECT campaignname FROM vtiger_campaign WHERE campaignid=?"; + $result = $adb->pquery($query, array($mod_name)); + $name_val = $adb->query_result($result,0,"campaignname"); + $id_name = $mod_name; + if($name_val!="") + { + $mod_name=$name_val; + $search_str=$name_val; + } + } + if($graph_for =="contactid") + { + $query = "SELECT contact_no, lastname, firstname FROM vtiger_contactdetails WHERE contactid=?"; + $result = $adb->pquery($query, array($mod_name)); + $name_val = $adb->query_result($result,0,"lastname"); + if($name_val!="") + { + if(getFieldVisibilityPermission('Contacts', $current_user->id,'firstname') == '0') + { + $first_name = ''; + $first_name = $adb->query_result($result,0,"firstname"); + if($first_name != '') + $name_val .= " ".$first_name; + } + + $mod_name=$name_val; + $search_str=$adb->query_result($result, 0, "contact_no"); + } + } + //Passing name to graph + $mod_name = str_replace(":", ":", $mod_name); + if($mod_name_val!="") $mod_name_val.="::$mod_name"; + else $mod_name_val="$mod_name"; + + + //Passing count to graph + if($mod_cnt_val!="") $mod_cnt_val.="::$mod_count_val"; + else $mod_cnt_val="$mod_count_val"; + if($module!="") + { + //Check for Ticket Priority + if(($graph_type=="ticketsbypriority")) + { + $graph_for="ticketpriorities"; + } + + //added to get valid url in dashbord for tickets by team + if($graph_for == "ticketgroupname" || $graph_for == "groupname") $graph_for = "smownerid"; + + if($graph_for == "accountid") $graph_for = "account_id"; + $cvid = getCvIdOfAll($module); + if($module == "Home") + { + $cvid = getCvIdOfAll($mod_name); + $link_val="index.php?module=".$mod_name."&action=ListView&from_homepagedb=true&type=dbrd&query=true&owner=".$current_user->user_name."&viewname=".$cvid; + } + else if($module == "Contacts" || ($module=="Products" && ($graph_for == "quoteid" || $graph_for == "invoiceid" || $graph_for == "purchaseorderid"))) + $link_val="index.php?module=".$module."&action=ListView&from_dashboard=true&type=dbrd&query=true&".$graph_for."=".$id_name."&viewname=".$cvid; + else { + $esc_search_str = urlencode($search_str); + //$esc_search_str = htmlentities($search_str, ENT_QUOTES, $default_charset); + $link_val="index.php?module=".$module."&action=index&from_dashboard=true&search_text=".$esc_search_str."&search_field=".$graph_for."&searchtype=BasicSearch&query=true&type=entchar&viewname=".$cvid; + } + + if($graph_for == "account_id") $graph_for = "accountid"; + + //Adding the links to the graph + $link_val = str_replace(':', ':', $link_val); + if($i==0) + $bar_target_val .=$link_val; + else + $bar_target_val .="::".$link_val; + } + //The data as per given date + if($i==0) + $urlstring .=$mod_cnt_crtd_date; + else + $urlstring .="K".$mod_cnt_crtd_date; + + if($i==0) + $test_target_val.=$link_val; + else + $test_target_val.="K".$link_val; + } + $mod_cnt_table .=""; + //For all Days getting the vtiger_table + for($k=0; $k<$days;$k++) + { + $tdate=$date_array[$k]; + if(!isset($mod_tot_cnt_array[$tdate])) + $mod_tot_cnt_array[$tdate]="0"; + $tot= $mod_tot_cnt_array[$tdate]; + if($period_type!="yday") + $mod_cnt_table.=""; + } + if($graph_for == "productname") + { + $cnt_total=array_sum($mod_count_array); + } + else + { + $cnt_total=array_sum($mod_tot_cnt_array); + } + + $mod_cnt_table.="
Status $table_formatTotal
Total$tot$cnt_total
"; + $mod_cnt_table.="
"; + $title_of_graph="$title : $cnt_total"; + $bar_target_val=urlencode($bar_target_val); + $test_target_val=urlencode($test_target_val); + + + $Prod_mod_val=array($mod_name_val,$mod_cnt_val,$title_of_graph,$bar_target_val,$mod_graph_date,$urlstring,$mod_cnt_table,$test_target_val); + return $Prod_mod_val; + } + else + { + $data=0; + + } + + } + else + { + $data=0; + return "

The data is not available with the specified time period

"; + } + return $data; +} + + +/** Saving the images of the graph in the /cache/images + * otherwise it will render the graph with the given details + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * Contributor(s): ______________________________________.. +*/ + + +function save_image_map($filename,$image_map) +{ + + + global $log; + + if (!$handle = fopen($filename, 'w')) { + $log->debug(" Cannot open file ($filename)"); + return; + } + + // Write $somecontent to our opened file. + if (fwrite($handle, $image_map) === FALSE) { + $log->debug(" Cannot write to file ($filename)"); + return false; + } + + fclose($handle); + return true; +} + +function get_graph_by_type($graph_by,$graph_title,$module,$where,$query,$width=900,$height=900,$frompage='') +{ + global $user_id,$date_start,$end_date,$type,$mod_strings; + $time = time(); + //Giving the Cached image name + $cache_file_name=abs(crc32($user_id))."_".$type."_".crc32($date_start.$end_date).$time.".png"; + $html_imagename=$graph_by; //Html image name for the graph + + $graph_details=module_Chart($user_id,$date_start,$end_date,$query,$graph_by,$graph_title,$where,$module,$type); + if($graph_details!=0) + { + $name_val=$graph_details[0]; + $cnt_val=$graph_details[1]; + $graph_title=$graph_details[2]; + $target_val=$graph_details[3]; + $graph_date=$graph_details[4]; + $urlstring=$graph_details[5]; + $cnt_table=$graph_details[6]; + $test_target_val=$graph_details[7]; + + if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') + { + $width = 250; + $height = 250; + }else + { + $width = 850; + $height = 500; + } + + $top=20; + $left=140; + $bottom=120; + $title=$graph_title; + if($frompage != '') + { + //echo $width.'------'.$height.'------'.$left.'------'.$right.'------'.$top.'------'.$bottom.'------'.$title.'------'.$test_target_val.'------'.$date_start.'------'.$end_date; + //die; + return get_graph_homepg($cache_file_name,$html_imagename,$cnt_val,$name_val,280,285,$left,$right,$top,$bottom,$title,$target_val,$graph_date,$urlstring,$test_target_val,$date_start,$end_date); + + }else + { + return get_graph($cache_file_name,$html_imagename,$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$graph_date,$urlstring,$test_target_val,$date_start,$end_date); + } + } + else + { + sleep(1); + echo '

'.$mod_strings['LBL_NO_DATA'].'

'; + } + +} + +/** Returns the Horizontal,vertical, pie graphs and Accumulated Graphs +for the details +* Portions created by vtiger are Copyright (C) vtiger. +* All Rights Reserved. +* Contributor(s): ______________________________________.. +*/ + + +// Function for get graphs +function get_graph($cache_file_name,$html_imagename,$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,$graph_date,$urlstring,$test_target_val,$date_start,$end_date) +{ + + global $tmp_dir; + global $graph_title, $mod_strings; + global $theme; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $val=explode(":",$title); + $display_title=$val[0]; + + if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') + { + $sHTML .="
"; + } + +$sHTML .= " + + + + + + + + + "; + +$sHTML .= " + + + + + "; + + if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') + { + $sHTML .="
+ + + + + + + +
1".$display_title."
".$mod_strings['LBL_HORZ_BAR_CHART']."
+
"; + if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') + { + $sHTML .= " "; + + }else + { + $sHTML .= " + + + + + + +
".$mod_strings['VIEWCHART']." : 12
"; + } + $sHTML .="
"; + + + $sHTML .= render_graph($tmp_dir."hor_".$cache_file_name,$html_imagename."_hor",$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,"horizontal"); +//Commented by Minnie -- same content displayed in two graphs +/*$sHTML .= "

+ + + + + + + +
2".$graph_title."
Vertical Bar Chart
+
"; + + $sHTML .= render_graph($tmp_dir."vert_".$cache_file_name,$html_imagename."_vert",$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,"vertical");*/ + +$sHTML .= "
"; + }else + { + $sHTML .= ""; + } + +$sHTML .= " + + + + + + "; + +if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') +{ + $sHTML .="
 
+ + + + + + + +
2".$graph_title."
".$mod_strings['LBL_PIE_CHART']."
+
"; + if(isset($_REQUEST['display_view']) && $_REQUEST['display_view'] == 'MATRIX') + { + $sHTML .= " "; + + }else + { + $sHTML .= " + + + + + + +
".$mod_strings['VIEWCHART']." : 12
"; + } + $sHTML .="
"; + + $sHTML .= render_graph($tmp_dir."pie_".$cache_file_name,$html_imagename."_pie",$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,"pie"); + +$sHTML .= "
 
+ + + + + + + +
1".$graph_title."
Horizontal Bar Chart
+
"; + + $sHTML .= render_graph($tmp_dir."hor_".$cache_file_name,$html_imagename."_hor",$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,"horizontal"); +//Commented by Minnie -- same content displayed in to graphs +/*$sHTML .= "

+ + + + + + + +
2".$graph_title."
Vertical Bar Chart
+
"; + + $sHTML .= render_graph($tmp_dir."vert_".$cache_file_name,$html_imagename."_vert",$cnt_val,$name_val,$width,$height,$left,$right,$top,$bottom,$title,$target_val,"vertical");*/ + +$sHTML .= "

+ + + + + + + +
2".$graph_title."
Pie Chart
+
"; + + $sHTML .= render_graph($tmp_dir."pie_".$cache_file_name,$html_imagename."_pie",$cnt_val,$name_val,$width,$height,40,$right,$top,$bottom,$title,$target_val,"pie"); + +$sHTML .= "

'; + //Charts for Lead Source + if($profileTabsPermission[getTabid("Leads")] == 0 && ($type == "leadsource") && (getFieldVisibilityPermission('Leads',$user_id,'leadsource') == "0")) + { + $graph_by="leadsource"; + $graph_title= $mod_strings['leadsource']; + $module="Leads"; + $where=""; + $query=$leads_query." ".dashboard_check($module); + //$html .= get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + // To display the charts for Lead status + elseif ($profileTabsPermission[getTabid("Leads")] == 0 && ($type == "leadstatus")&& (getFieldVisibilityPermission('Leads',$user_id,'leadstatus') == "0")) + { + $graph_by="leadstatus"; + $graph_title= $mod_strings['leadstatus']; + $module="Leads"; + $where=""; + $query=$leads_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_leaddetails.leadstatus '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Charts for Lead Industry + elseif ($profileTabsPermission[getTabid("Leads")] == 0 && ($type == "leadindustry") && (getFieldVisibilityPermission('Leads',$user_id,'industry') == "0")) + { + $graph_by="industry"; + $graph_title=$mod_strings['leadindustry']; + $module="Leads"; + $where=""; + $query=$leads_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_leaddetails.industry '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Sales by Lead Source + elseif ($profileTabsPermission[getTabid("Potentials")] == 0 && ($type == "salesbyleadsource")&& (getFieldVisibilityPermission('Potentials',$user_id,'leadsource') == "0")) + { + $graph_by="leadsource"; + $graph_title=$mod_strings['salesbyleadsource']; + $module="Potentials"; + $where=" and vtiger_potential.sales_stage like 'Closed Won' "; + $query=$potential_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_potential.leadsource '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Sales by Account + elseif ($profileTabsPermission[getTabid("Potentials")] == 0 && ($type == "salesbyaccount") && (getFieldVisibilityPermission('Potentials',$user_id,'account_id') == "0")) + { + $graph_by="accountid"; + $graph_title=$mod_strings['salesbyaccount']; + $module="Potentials"; + $where=" and vtiger_potential.sales_stage like 'Closed Won' "; + $query=$potential_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Sales by User + elseif ($profileTabsPermission[getTabid("Potentials")] == 0 && ($type == "salesbyuser")) + { + $graph_by="smownerid"; + $graph_title=$mod_strings['salesbyuser']; + $module="Potentials"; + $where=" and vtiger_potential.sales_stage like 'Closed Won' and (vtiger_crmentity.smownerid != NULL || vtiger_crmentity.smownerid != ' ')"; + $query=$potential_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Sales by team + elseif ($profileTabsPermission[getTabid("Potentials")] == 0 && ($type == "salesbyteam")) + { + $graph_by="groupname"; + $graph_title=$mod_strings['salesbyteam']; + $module="Potentials"; + $where=" and vtiger_potential.sales_stage like 'Closed Won' and (vtiger_groups.groupname != NULL || vtiger_groups.groupname != '')"; + $query=$potential_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Charts for Account by Industry + elseif ($profileTabsPermission[getTabid("Accounts")] == 0 && ($type == "accountindustry") && (getFieldVisibilityPermission('Accounts',$user_id,'industry') == "0")) + { + $graph_by="industry"; + $graph_title=$mod_strings['accountindustry']; + $module="Accounts"; + $where=""; + $query=$account_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_account.industry '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Charts for Products by Category + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productcategory") && (getFieldVisibilityPermission('Products',$user_id,'productcategory') == "0")) + { + $graph_by="productcategory"; + $graph_title=$mod_strings['productcategory']; + $module="Products"; + $where=""; + $query=$product_category." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_products.productcategory '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Charts for Products by Quantity in stock + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productbyqtyinstock") && (getFieldVisibilityPermission('Products',$user_id,'qtyinstock') == "0")) + { + $graph_by="productname"; + $graph_title=$mod_strings['productbyqtyinstock']; + $module="Products"; + $where=""; + $query=$products_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Charts for Products by PO + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productbypo") && $profileTabsPermission[getTabid("PurchaseOrder")] == 0) + { + $graph_by="purchaseorderid"; + $graph_title=$mod_strings['productbypo']; + $module="Products"; + $where=""; + $query=$probyPO." ".dashboard_check("PurchaseOrder"); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Charts for Products by Quotes + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productbyquotes") && $profileTabsPermission[getTabid("Quotes")] == 0) + { + $graph_by="quoteid"; + $graph_title=$mod_strings['productbyquotes']; + $module="Products"; + $where=""; + $query=$probyQ." ".dashboard_check("Quotes"); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Charts for Products by Invoice + elseif ($profileTabsPermission[getTabid("Products")] == 0 && ($type == "productbyinvoice") && $profileTabsPermission[getTabid("Invoice")] == 0) + { + $graph_by="invoiceid"; + $graph_title=$mod_strings['productbyinvoice']; + $module="Products"; + $where=""; + $query=$probyInv." ".dashboard_check("Invoice"); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + + // Sales Order by Accounts + elseif ($profileTabsPermission[getTabid("SalesOrder")] == 0 && ($type == "sobyaccounts") && (getFieldVisibilityPermission('SalesOrder',$user_id,'account_id') == "0")) + { + $graph_by="accountid"; + $graph_title=$mod_strings['sobyaccounts']; + $module="SalesOrder"; + $where=""; + $query=$so_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Sales Order by Status + elseif ($profileTabsPermission[getTabid("SalesOrder")] == 0 && ($type == "sobystatus") && (getFieldVisibilityPermission('SalesOrder',$user_id,'sostatus') == "0")) + { + $graph_by="sostatus"; + $graph_title=$mod_strings['sobystatus']; + $module="SalesOrder"; + $where=""; + $query=$so_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_salesorder.sostatus '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Purchase Order by Status + elseif ($profileTabsPermission[getTabid("PurchaseOrder")] == 0 && ($type == "pobystatus") && (getFieldVisibilityPermission('PurchaseOrder',$user_id,'postatus') == "0")) + { + $graph_by="postatus"; + $graph_title=$mod_strings['pobystatus']; + $module="PurchaseOrder"; + $where=""; + $query=$po_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_purchaseorder.postatus '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Quotes by Accounts + elseif ($profileTabsPermission[getTabid("Quotes")] == 0 && ($type == "quotesbyaccounts") && (getFieldVisibilityPermission('Quotes',$user_id,'account_id') == "0")) + { + $graph_by="accountid"; + $graph_title= $mod_strings['quotesbyaccounts']; + $module="Quotes"; + $where=""; + $query=$quotes_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Quotes by Stage + elseif ($profileTabsPermission[getTabid("Quotes")] == 0 && ($type == "quotesbystage") && (getFieldVisibilityPermission('Quotes',$user_id,'quotestage') == "0")) + { + $graph_by="quotestage"; + $graph_title=$mod_strings['quotesbystage']; + $module="Quotes"; + $where=""; + $query=$quotes_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_quotes.quotestage '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Invoice by Accounts + elseif ($profileTabsPermission[getTabid("Invoice")] == 0 && ($type == "invoicebyacnts") && (getFieldVisibilityPermission('Invoice',$user_id,'account_id') == "0")) + { + $graph_by="accountid"; + $graph_title=$mod_strings['invoicebyacnts']; + $module="Invoice"; + $where=""; + $query=$invoice_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Invoices by status + elseif ($profileTabsPermission[getTabid("Invoice")] == 0 && ($type == "invoicebystatus") && (getFieldVisibilityPermission('Invoice',$user_id,'invoicestatus') == "0")) + { + $graph_by="invoicestatus"; + $graph_title=$mod_strings['invoicebystatus']; + $module="Invoice"; + $where=""; + $query=$invoice_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_invoice.invoicestatus '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Tickets by Status + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbystatus") && (getFieldVisibilityPermission('HelpDesk',$user_id,'ticketstatus') == "0")) + { + $graph_by="ticketstatus"; + $graph_title=$mod_strings['ticketsbystatus']; + $module="HelpDesk"; + $where=""; + $query=$helpdesk_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_troubletickets.status '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Tickets by Priority + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbypriority") && (getFieldVisibilityPermission('HelpDesk',$user_id,'ticketpriorities') == "0")) + { + $graph_by="priority"; + $graph_title=$mod_strings['ticketsbypriority']; + $module="HelpDesk"; + $where=""; + $query=$helpdesk_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_troubletickets.priority '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Tickets by Category + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbycategory") && (getFieldVisibilityPermission('HelpDesk',$user_id,'ticketcategories') == "0")) + { + $graph_by="category"; + $graph_title=$mod_strings['ticketsbycategory']; + $module="HelpDesk"; + $where=""; + $query=$helpdesk_query." ".dashboard_check($module); + if(!$is_admin) + $query .= ' and vtiger_troubletickets.category '.picklist_check($module,$graph_by); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Tickets by User + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbyuser")) + { + $graph_by="smownerid"; + $graph_title=$mod_strings['ticketsbyuser']; + $module="HelpDesk"; + $where=" and (vtiger_crmentity.smownerid != NULL || vtiger_crmentity.smownerid != ' ')"; + $query=$helpdesk_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Tickets by Team + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbyteam")) + { + $graph_by="ticketgroupname"; + $graph_title=$mod_strings['ticketsbyteam']; + $module="HelpDesk"; + $where=" and (vtiger_groups.groupname != NULL || vtiger_groups.groupname != ' ')"; + $query=$helpdesk_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Tickets by Product + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbyproduct") && (getFieldVisibilityPermission('HelpDesk',$user_id,'product_id') == "0")) + { + $graph_by="product_id"; + $graph_title=$mod_strings['ticketsbyproduct']; + $module="HelpDesk"; + $where=""; + $query=$helpdesk_query." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Campaigns by Contact + elseif ($profileTabsPermission[getTabid("Contacts")] == 0 && ($type == "contactbycampaign") && $profileTabsPermission[getTabid("Campaigns")] == 0) + { + $graph_by="campaignid"; + $graph_title=$mod_strings['contactbycampaign']; + $module="Contacts"; + $where=""; + $query=$campaign_query." ".dashboard_check("Campaigns"); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Tickets by Account + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbyaccount") && (getFieldVisibilityPermission('HelpDesk',$user_id,'parent_id') == "0")) + { + $graph_by="accountid"; + $graph_title=$mod_strings['ticketsbyaccount']; + $module="HelpDesk"; + $where=""; + $query=$tickets_by_account." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + //Tickets by Contact + elseif ($profileTabsPermission[getTabid("HelpDesk")] == 0 && ($type == "ticketsbycontact") && (getFieldVisibilityPermission('HelpDesk',$user_id,'parent_id') == "0")) + { + $graph_by="contactid"; + $graph_title=$mod_strings['ticketsbycontact']; + $module="HelpDesk"; + $where=""; + $query=$tickets_by_contact." ".dashboard_check($module); + echo get_graph_by_type($graph_by,$graph_title,$module,$where,$query); + } + else + { + //echo $mod_strings['LBL_NO_PERMISSION_FIELD']; + sleep(1); + echo '

'.$mod_strings['LBL_NO_PERMISSION_FIELD'].'

'; + } + } +} + +/**This function generates the security parameters for a given module based on the assigned profile +*Param $module - module name +*Returns an string value +*/ + +function dashboard_check($module) +{ + global $current_user; + $sec_parameter = ''; + $tab_id = getTabid($module); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[$tab_id] == 3) + { + $sec_parameter=getListViewSecurityParameter($module); + } + return $sec_parameter; +} + +/**This function generates the security parameters for a given user base picklist values +*Param $graph - name of the graph +*Returns an string value +*/ + +function picklist_check($module,$graph_by) +{ + global $current_user,$adb; + $pick_query = ''; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + $roleid=$current_user->roleid; + $subrole = getRoleSubordinates($roleid); + if(count($subrole)> 0) + { + $roleids = $subrole; + array_push($roleids, $roleid); + } + else + { + $roleids = $roleid; + } + if($graph_by == 'sostatus' || $graph_by == 'leadsource' || $graph_by == 'leadstatus' ||$graph_by == 'industry' || $graph_by == 'productcategory' || $graph_by == 'postatus' || $graph_by == 'invoicestatus' || $graph_by == 'ticketstatus' || $graph_by == 'priority' || $graph_by == 'category' || $graph_by == 'quotestage') + { + $temp_fieldname = $graph_by; + if($graph_by == 'priority') + $temp_fieldname = 'ticketpriorities'; + if($graph_by == 'category') + $temp_fieldname = 'ticketcategories'; + + if(count($roleids) > 1) + $pick_query = " in (select distinct $temp_fieldname from vtiger_".$temp_fieldname." inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_".$temp_fieldname.".picklist_valueid where roleid in (\"". implode($roleids,"\",\"") ."\")) "; + else + $pick_query = " in (select distinct $temp_fieldname from vtiger_".$temp_fieldname." inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_".$temp_fieldname.".picklist_valueid where roleid in ('$roleids')) "; + } + return $pick_query; +} +?> + diff --git a/oss/vtiger/trunk/modules/Dashboard/homestuff.php b/oss/vtiger/trunk/modules/Dashboard/homestuff.php new file mode 100644 index 00000000..a48637d4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/homestuff.php @@ -0,0 +1,90 @@ + $mod_strings['leadsource'], + "leadstatus" => $mod_strings['leadstatus'], + "leadindustry" => $mod_strings['leadindustry'], + "salesbyleadsource" => $mod_strings['salesbyleadsource'], + "salesbyaccount" => $mod_strings['salesbyaccount'], + "salesbyuser" => $mod_strings['salesbyuser'], + "salesbyteam" => $mod_strings['salesbyteam'], + "accountindustry" => $mod_strings['accountindustry'], + "productcategory" => $mod_strings['productcategory'], + "productbyqtyinstock" => $mod_strings['productbyqtyinstock'], + "productbypo" => $mod_strings['productbypo'], + "productbyquotes" => $mod_strings['productbyquotes'], + "productbyinvoice" => $mod_strings['productbyinvoice'], + "sobyaccounts" => $mod_strings['sobyaccounts'], + "sobystatus" => $mod_strings['sobystatus'], + "pobystatus" => $mod_strings['pobystatus'], + "quotesbyaccounts" => $mod_strings['quotesbyaccounts'], + "quotesbystage" => $mod_strings['quotesbystage'], + "invoicebyacnts" => $mod_strings['invoicebyacnts'], + "invoicebystatus" => $mod_strings['invoicebystatus'], + "ticketsbystatus" => $mod_strings['ticketsbystatus'], + "ticketsbypriority" => $mod_strings['ticketsbypriority'], + "ticketsbycategory" => $mod_strings['ticketsbycategory'], + "ticketsbyuser" => $mod_strings['ticketsbyuser'], + "ticketsbyteam" => $mod_strings['ticketsbyteam'], + "ticketsbyproduct"=> $mod_strings['ticketsbyproduct'], + "contactbycampaign"=> $mod_strings['contactbycampaign'], + "ticketsbyaccount"=> $mod_strings['ticketsbyaccount'], + "ticketsbycontact"=> $mod_strings['ticketsbycontact'], + ); + + $log = LoggerManager::getLogger('dashboard'); + if(isset($type) && $type != '') + { + $dashboard_type = $type; + }else + { + $dashboard_type = 'DashboardHome'; + } + + if(!isset($type)) + { + }else + { + require_once('modules/Dashboard/display_charts.php'); + $_REQUEST['type'] = $type; + $_REQUEST['Chart_Type'] = $Chart_Type; + $_REQUEST['from_page'] = 'HomePage'; + $dashval=dashBoardDisplayChart(); + return $dashval; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/Dashboard/horizontal_bargraph.php b/oss/vtiger/trunk/modules/Dashboard/horizontal_bargraph.php new file mode 100644 index 00000000..2fd4ded0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/horizontal_bargraph.php @@ -0,0 +1,248 @@ +=14) + $name=substr($name, 0, 44); + if($pos>=2) + { + $val=explode(" ",$name); + $n=count($val)-1; + + $x=""; + for($j=0;$j $width, 'height' => $height, 'usemap' => true)); + $imagemap = $canvas->getImageMap(); + $graph =& Image_Graph::factory('graph', $canvas); + $font =& $graph->addNew('font', calculate_font_name($lang_crm)); + // set the font size to 12 + $font->setSize(8); + + if($theme == "blue") + { + $font_color = "#212473"; + } + else + { + $font_color = "#000000"; + } + $font->setColor($font_color); + + $graph->setFont($font); + $titlestr =& Image_Graph::factory('title', array($title,8)); + $plotarea =& Image_Graph::factory('plotarea',array( + 'axis', + 'axis', + 'horizontal' + )); + $graph->add( + Image_Graph::vertical($titlestr, + $plotarea, + 5 + ) + ); + + + // Now create a bar plot + $max=0; + // To create unique lables we need to keep track of lable name and its count + $uniquex = array(); + + $xlabels = array(); + $dataset = & Image_Graph::factory('dataset'); + if($theme == 'woodspice') + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_VERTICAL_MIRRORED, '#804000', 'white')); + elseif($theme == 'bluelagoon') + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_VERTICAL_MIRRORED, 'blue', 'white')); + elseif($theme == 'softed') + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_VERTICAL_MIRRORED, 'blue', 'white')); + elseif($theme == 'hawebs') + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_VERTICAL_MIRRORED, 'blue', 'white')); + else + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_VERTICAL_MIRRORED, 'black', 'white')); + + for($i=0;$i=$max) $max=$datay[$i]; + $dataset->addPoint( + $x, + $datay[$i], + array( + 'url' => $target[$i], + 'alt' => $alts[$i] + ) + ); + // build the xaxis label array to allow intermediate ticks + + $xlabels[$x] = $datax[$i]; + $xlabels[$x+1] = ''; + + // To have unique names even in case of duplicates let us add the id + $datax_appearance = $uniquex[$datax[$i]]; + if($datax_appearance == null) { + $uniquex[$datax[$i]] = 1; + } else { + $xlabels[$x] = $datax[$i] .' ['. $datax_appearance.']'; + $uniquex[$datax[$i]] = $datax_appearance + 1; + } + } + + $bplot = & $plotarea->addNew('bar', $dataset); + $bplot->setFillStyle($fill); + + //You can change the width of the bars if you like + $bplot->setBarWidth(50/count($datax),"%"); + $bplot->setPadding(array('top'=>10)); + + // We want to display the value of each bar at the top + //$bplot->value->Show(); + //$bplot->value->SetFont(FF_FONT2,FS_BOLD,12); + //$bplot->value->SetAlign('left','center'); + //$bplot->value->SetColor("black","gray4"); + //$bplot->value->SetFormat('%d'); + + //$graph->SetBackgroundGradient('#E5E5E5','white',GRAD_VER,BGRAD_PLOT); + $bplot->setBackground(Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_HORIZONTAL, 'white', 'white'))); + //$bplot->setBackground(Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_HORIZONTAL, 'white', '#E5E5E5'))); + //$bplot->SetFillGradient("navy","lightsteelblue",GRAD_MIDVER); + + //$graph->SetFrame(false); + //$graph->SetMarginColor('cadetblue2'); + //$graph->ygrid->SetFill(true,'azure1','azure2'); + //$graph->xgrid->Show(); + + // Add the bar to the graph + //$graph->Add($bplot); + + // Setup title + //$titlestr->setText($title); + + // Setup X-axis + $xaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_X); + $yaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); + $yaxis->setFontSize(10); + + // Invert X-axis and put Y-axis at bottom + $xaxis->setInverted(true); + $yaxis->setAxisIntersection('max'); + + // set grid + $gridY =& $plotarea->addNew('line_grid', IMAGE_GRAPH_AXIS_Y); + $gridY->setLineColor('#FFFFFF@0.5'); + $gridY2 =& $plotarea->addNew('bar_grid', null, IMAGE_GRAPH_AXIS_Y); + $gridY2->setFillColor('#FFFFFF@0.2'); + + + // Add some grace to y-axis so the bars doesn't go + // all the way to the end of the plot area + $yaxis->forceMaximum(round(($max * 1.1) + 0.5)); + $ticks = get_tickspacing(round(($max * 1.1) + 0.5)); + + // First make the labels look right + $yaxis->setLabelInterval($ticks[0]); + $yaxis->setTickOptions(-5,0); + $yaxis->setLabelInterval($ticks[1],2); + $yaxis->setTickOptions(-2,0,2); + + // Create the xaxis labels + $array_data =& Image_Graph::factory('Image_Graph_DataPreprocessor_Array', + array($xlabels) + ); + + // The fix the tick marks + $xaxis->setDataPreprocessor($array_data); + $xaxis->forceMinimum(0); + $xaxis->forceMaximum(2*count($datay)); + $xaxis->setLabelInterval(1); + $xaxis->setTickOptions(0,0); + $xaxis->setLabelInterval(2,2); + $xaxis->setTickOptions(5,0,2); + + // set markers + $marker =& $graph->addNew('value_marker', IMAGE_GRAPH_VALUE_Y); + $marker->setFillColor('000000@0.0'); + $marker->setBorderColor('000000@0.0'); + $marker->setFontSize(10); + // shift markers 10 pix right + $marker_pointing =& $graph->addNew('Image_Graph_Marker_Pointing', array(40,0,& $marker)); + $marker_pointing->setLineColor('000000@0.0'); + $bplot->setMarker($marker_pointing); + + + //Getting the graph in the form of html page + $img = $graph->done( + array( + 'tohtml' => true, + 'border' => 0, + 'filename' => $cache_file_name, + 'filepath' => '', + 'urlpath' => '' + )); + save_image_map($cache_file_name.'.map', $img); + + return $img; +} + +?> diff --git a/oss/vtiger/trunk/modules/Dashboard/index.php b/oss/vtiger/trunk/modules/Dashboard/index.php new file mode 100644 index 00000000..79fb3ee2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/index.php @@ -0,0 +1,393 @@ + $mod_strings['DashboardHome'], + "leadsource" => $mod_strings['leadsource'], + "leadstatus" => $mod_strings['leadstatus'], + "leadindustry" => $mod_strings['leadindustry'], + "salesbyleadsource" => $mod_strings['salesbyleadsource'], + "salesbyaccount" => $mod_strings['salesbyaccount'], + "salesbyuser" => $mod_strings['salesbyuser'], + "salesbyteam" => $mod_strings['salesbyteam'], + "accountindustry" => $mod_strings['accountindustry'], + "productcategory" => $mod_strings['productcategory'], + "productbyqtyinstock" => $mod_strings['productbyqtyinstock'], + "productbypo" => $mod_strings['productbypo'], + "productbyquotes" => $mod_strings['productbyquotes'], + "productbyinvoice" => $mod_strings['productbyinvoice'], + "sobyaccounts" => $mod_strings['sobyaccounts'], + "sobystatus" => $mod_strings['sobystatus'], + "pobystatus" => $mod_strings['pobystatus'], + "quotesbyaccounts" => $mod_strings['quotesbyaccounts'], + "quotesbystage" => $mod_strings['quotesbystage'], + "invoicebyacnts" => $mod_strings['invoicebyacnts'], + "invoicebystatus" => $mod_strings['invoicebystatus'], + "ticketsbystatus" => $mod_strings['ticketsbystatus'], + "ticketsbypriority" => $mod_strings['ticketsbypriority'], + "ticketsbycategory" => $mod_strings['ticketsbycategory'], + "ticketsbyuser" => $mod_strings['ticketsbyuser'], + "ticketsbyteam" => $mod_strings['ticketsbyteam'], + "ticketsbyproduct"=> $mod_strings['ticketsbyproduct'], + "contactbycampaign"=> $mod_strings['contactbycampaign'], + "ticketsbyaccount"=> $mod_strings['ticketsbyaccount'], + "ticketsbycontact"=> $mod_strings['ticketsbycontact'], + ); + +$log = LoggerManager::getLogger('dashboard'); +if(isset($_REQUEST['type']) && $_REQUEST['type'] != '') +{ + $dashboard_type = $_REQUEST['type']; +}else +{ + $dashboard_type = 'DashboardHome'; +} +?> + +
+ + + + + + + + + + + + +
> + + + + + +
+ + + + + +
+
+
  + + + + + + + + + + + + + +
<?php echo $app_strings['LBL_CALENDAR_ALT']; ?><?php echo $app_strings['LBL_CLOCK_ALT']; ?><?php echo $app_strings['LBL_CALCULATOR_ALT']; ?><?php echo $app_strings['LBL_CHAT_ALT']; ?> + + <?php echo $app_strings['LBL_LAST_VIEWED']; ?>
+
  + + + + + +
+
  + + + + +
<?php echo $app_strings['LBL_ALL_MENU_ALT']; ?>
+
+
+
+ + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
  + + + + +
+ +
+ +
 
+ +
 
  + + + + + +
+ > > + <?php echo $mod_strings['NORMALVIEW'];?> | <?php echo $mod_strings['GRIDVIEW'];?>
+
 
 
+ + + + + + + +
  +
+ + + + + + +
+ + +  
+ + +
 
 
+ + + + + + + + + +
  + + + +
+
  
+ +
+ + + + + + +
 
+
+ +
+
+ + + + + + + + diff --git a/oss/vtiger/trunk/modules/Dashboard/language/en_us.lang.php b/oss/vtiger/trunk/modules/Dashboard/language/en_us.lang.php new file mode 100644 index 00000000..b96b89e5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/language/en_us.lang.php @@ -0,0 +1,191 @@ +'Pipeline By Sales Stage', +'LBL_SALES_STAGE_FORM_DESC'=>'Shows cumulative opportunity amounts by selected sales stages for selected users where the expected closed date is within the specificed date range.', +'LBL_MONTH_BY_OUTCOME'=>'Pipeline By Month By Outcome', +'LBL_MONTH_BY_OUTCOME_DESC'=>'Shows cumulative opportunity amounts by month by outcome for selected users where the expected closed date is within the specificed date range. Outcome is based on whether the sales stage is Closed Won, Closed Lost or any other value.', +'LBL_LEAD_SOURCE_FORM_TITLE'=>'All Opportunities By Lead Source', +'LBL_LEAD_SOURCE_FORM_DESC'=>'Shows cumulative opportunity amounts by selected lead source for selected users.', +'LBL_LEAD_SOURCE_BY_OUTCOME'=>'All Opportunities By Lead Source By Outcome', +'LBL_LEAD_SOURCE_BY_OUTCOME_DESC'=>'Shows cumulative opportunity amounts by selected lead source by outcome for selected users where the expected closed date is within the specificed date range. Outcome is based on whether the sales stage is Closed Won, Closed Lost or any other value.', +'LBL_PIPELINE_FORM_TITLE_DESC'=>'Shows cumulative amounts by selected sales stages for your opportunities where the expected closed date is within the specificed date range.', +'LBL_DATE_RANGE'=>'Date range is', +'LBL_DATE_RANGE_TO'=>'to', +'ERR_NO_OPPS'=>'Please create some Opportunities to see Opportunity graphs.', +'LBL_TOTAL_PIPELINE'=>'Pipeline total is ', +'LBL_ALL_OPPORTUNITIES'=>'Total amount of all opportunities is ', +'LBL_OPP_SIZE'=>'Opportunity size in ', +'LBL_OPP_SIZE_VALUE'=>'1K', +'NTC_NO_LEGENDS'=>'None', +'LBL_LEAD_SOURCE_OTHER'=>'Other', +'LBL_EDIT'=>'Edit', +'LBL_REFRESH'=>'Refresh', +'LBL_CREATED_ON'=>'Last run on ', +'LBL_OPPS_IN_STAGE'=>'opportunities where sales stage is', +'LBL_OPPS_IN_LEAD_SOURCE'=>'opportunities where lead source is', +'LBL_OPPS_OUTCOME'=>'opportunities where outcome is', +'LBL_USERS'=>'Users:', +'LBL_SALES_STAGES'=>'Sales Stages:', +'LBL_LEAD_SOURCES'=>'Lead Sources:', +'LBL_DATE_START'=>'Begin Date:', +'LBL_DATE_END'=>'End Date:', +//Added for 5.0 +'LBL_NO_PERMISSION'=>'Sorry, you don\'t have access to view the Graph for this module', +'LBL_NO_PERMISSION_FIELD'=>'Sorry, you don\'t have access to view the Graph for this module or for the Field', + +"leadsource" => "Leads By Source", +"leadstatus" => "Leads By Status", +"leadindustry" => "Leads By Industry", +"salesbyleadsource" => "Sales by LeadSource", +"salesbyaccount" => "Sales by Accounts", +"salesbyuser" => "Sales by User", +"salesbyteam"=>"Sales by Team", +"accountindustry" => "Account By Industry", +"productcategory" => "Products by Category", +"productbyqtyinstock" => "Products by Quantity in stock", +"productbypo" => "Products by PurchaseOrder", +"productbyquotes" => "Products by Quotes", +"productbyinvoice" => "Products by Invoice", +"sobyaccounts" => "Sales Order by Accounts", +"sobystatus" => "Sales Order by Status", +"pobystatus" => "Purchase Order by Status", +"quotesbyaccounts" => "Quotes by Accounts", +"quotesbystage" => "Quotes by Stage", +"invoicebyacnts" => "Invoices by Accounts", +"invoicebystatus" => "Invoices by Status", +"ticketsbystatus" => "Tickets by Status", +"ticketsbypriority" => "Tickets by Priority", +"ticketsbycategory" => "Tickets by Category", +"ticketsbyuser"=>"Tickets by User", +"ticketsbyteam"=>"Tickets by Team", +"ticketsbyproduct"=>"Tickets by Product", +"contactbycampaign"=>"Contacts by Campaign", +"ticketsbyaccount"=>"Tickets by Account", +"ticketsbycontact"=>"Tickets by Contact", + +'LBL_DASHBRD_HOME'=>'Dashboard Home', +'LBL_HORZ_BAR_CHART'=>'Horizontal Bar Chart', +'LBL_VERT_BAR_CHART'=>'Vertical Bar Chart', +'LBL_PIE_CHART'=>'Pie Chart', +'LBL_NO_DATA'=>'No data available', +'DashboardHome'=>'Dashboard Home', +'GRIDVIEW'=>'Grid view', +'NORMALVIEW'=>'Normal view', +'VIEWCHART'=>'View Chart', +'LBL_DASHBOARD'=>'Dashboard', + +// Added/Updated for vtiger CRM 5.0.4 +"Approved"=>"Approved", +"Created"=>"Created", +"Cancelled"=>"Cancelled", +"Delivered"=>"Delivered", +"Received Shipment"=>"Received Shipments", +"Sent"=>"Sent", +"Credit Invoice"=>"Credit Invoice", +"Paid"=>"Paid", +"Un Assigned"=>"Un Assigned", +"Cold Call"=>"Cold Call", +"Existing Customer"=>"Existing Customer", +"Self Generated"=>"Self Generated", +"Employee"=>"Employee", +"Partner"=>"Partner", +"Public Relations"=>"Public Relations", +"Direct Mail"=>"Direct Mail", +"Conference"=>"Conference", +"Trade Show"=>"Trade Show", +"Web Site"=>"Web Site", +"Word of mouth"=>"Word of mouth", +"Other"=>"Other", +"--None--"=>"None", +"Attempted to Contact"=>"Attempted to Contact", +"Cold"=>"Cold", +"Contact in Future"=>"Contact in Future", +"Contacted"=>"Contacted", +"Hot"=>"Hot", +"Junk Lead"=>"Junk Lead", +"Lost Lead"=>"Lost Lead", +"Not Contacted"=>"Not Contacted", +"Pre Qualified"=>"Pre Qualified", +"Qualified"=>"Qualified", +"Warm"=>"Warm", +"Apparel"=>"Apparel", +"Banking"=>"Banking", +"Biotechnology"=>"Biotechnology", +"Chemicals"=>"Chemicals", +"Communications"=>"Communications", +"Construction"=>"Constructions", +"Consulting"=>"Consulting", +"Education"=>"Education", +"Electronics"=>"Electronics", +"Energy"=>"Energy", +"Engineering"=>"Engineering", +"Entertainment"=>"Entertainment", +"Environmental"=>"Environmental", +"Finance"=>"Finance", +"Food & Beverage"=>"Food & Beverage", +"Government"=>"Government", +"Healthcare"=>"Healthcare", +"Hospitality"=>"Hospitality", +"Insurance"=>"Insurance", +"Machinery"=>"Machinery", +"Manufacturing"=>"Manufacturing", +"Media"=>"Media", +"Not For Profit"=>"Not For Profit", +"Recreation"=>"Recreation", +"Retail"=>"Retail", +"Shipping"=>"Shipping", +"Technology"=>"Technology", +"Telecommunications"=>"Telecommunications", +"Transportation"=>"Transportation", +"Utilities"=>"Utilities", +"Hardware"=>"Hardware", +"Software"=>"Software", +"CRM Applications"=>"CRM Applications", +"Open"=>"Open", +"In Progress"=>"In Progress", +"Wait For Response"=>"Wait For Response", +"Closed"=>"Closed", +"Low"=>"Low", +"Normal"=>"Normal", +"High"=>"High", +"Urgent"=>"Urgent", +"Big Problem"=>"Big Problem", +"Small Problem"=>"Small Problem", +"Other Problem"=>"Other Problem", +"Accepted"=>"Accepted", +"Rejected"=>"Rejected", +"Prospecting"=>"Prospecting", +"Qualification"=>"Qualifications", +"Needs Analysis"=>"Needs Analysis", +"Value Proposition"=>"Value Propositions", +"Id. Decision Makers"=>"Id. Decision Makers", +"Perception Analysis"=>"Perception Analysis", +"Proposal/Price Quote"=>"Proposal/Price Quotes", +"Negotiation/Review"=>"Negotiation/Review", +"Closed Won"=>"Closed Won", +"Closed Lost"=>"Closed Lost", + +); + +?> diff --git a/oss/vtiger/trunk/modules/Dashboard/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Dashboard/language/zh_cn.lang.php new file mode 100644 index 00000000..cf2460d7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/language/zh_cn.lang.php @@ -0,0 +1,190 @@ + '销售策略统计', + 'LBL_SALES_STAGE_FORM_DESC' => '显示选择的客服策略、使用者累计客服数量在指定期间内预期要结案.', + 'LBL_MONTH_BY_OUTCOME' => '月客服统计', + 'LBL_MONTH_BY_OUTCOME_DESC' => '显示选取使用者于指定期间的对外按月累计潜在案件,对外指的是根据客服策略判断优劣.', + 'LBL_LEAD_SOURCE_FORM_TITLE' => '经由接触来源的潜在案件', + 'LBL_LEAD_SOURCE_FORM_DESC' => '显示选取使用者潜在客户来源的累计潜在案件数量.', + 'LBL_LEAD_SOURCE_BY_OUTCOME' => '由潜在客户来源显示所有对外潜在案件', + 'LBL_LEAD_SOURCE_BY_OUTCOME_DESC' => '显示选取潜在客户来源于指定期间的对外按月累计潜在案件,对外指的是根据销售策略判断优劣.', + 'LBL_PIPELINE_FORM_TITLE_DESC' => '显示预期在指定期间结案的销售策略潜在案件数量.', + 'LBL_DATE_RANGE' => '日期范围从', + 'LBL_DATE_RANGE_TO' => '到', + 'ERR_NO_OPPS' => '请新增潜在案件,然后才能看见潜在案件图.', + 'LBL_TOTAL_PIPELINE' => '总处理数 ', + 'LBL_ALL_OPPORTUNITIES' => '潜在案件总数', + 'LBL_OPP_SIZE' => '预算在1万元以下的潜在案件', + 'LBL_OPP_SIZE_VALUE' => '1K', + 'NTC_NO_LEGENDS' => '无', + 'LBL_LEAD_SOURCE_OTHER' => '其它', + 'LBL_EDIT' => '编辑', + 'LBL_REFRESH' => '更新画面', + 'LBL_CREATED_ON' => '最后执行 ', + 'LBL_OPPS_IN_STAGE' => '潜在案件的客服场地', + 'LBL_OPPS_IN_LEAD_SOURCE' => '潜在案件的接触来源', + 'LBL_OPPS_OUTCOME' => '该潜在案件的处理结果', + 'LBL_USERS' => '使用者:', + 'LBL_SALES_STAGES' => '客服场地:', + 'LBL_LEAD_SOURCES' => '接触来源:', + 'LBL_DATE_START' => '开始日期:', + 'LBL_DATE_END' => '结束日期:', +//Added for 5.0 + 'LBL_NO_PERMISSION' => '您没有检视这个模块图形的权限', + 'LBL_NO_PERMISSION_FIELD' => '您没有检视这个模块或字段图形的权限', + + 'leadsource' => '依照来源显示潜在客户', + 'leadstatus' => '依照状态显示潜在客户', + 'leadindustry' => '依照行业显示潜在客户', + 'salesbyleadsource' => '依照潜在客户来源显示业绩', + 'salesbyaccount' => '依照客户显示业绩', + 'salesbyuser' => '依照业务显示业绩', + 'salesbyteam' => '依照团队显示业绩', + 'accountindustry' => '依照产业显示客户', + 'productcategory' => '依照类别显示产品', + 'productbyqtyinstock' => '依照库存数量显示产品', + 'productbypo' => '依照采购订单显示产品', + 'productbyquotes' => '依照报价单显示产品', + 'productbyinvoice' => '依照发票显示产品', +'sobyaccounts' => '依照客户显示销售订单', + 'sobystatus' => '依照状态显示销售订单', + 'pobystatus' => '依照状态显示采购订单', + 'quotesbyaccounts' => '依照客户显示报价单', + 'quotesbystage' => '依照销售策略显示报价单', + 'invoicebyacnts' => '依照公司显示发票', + 'invoicebystatus' => '依照状态显示发票', + 'ticketsbystatus' => '依照状态显示传票', + 'ticketsbypriority' => '依照优先级显示传票', + 'ticketsbycategory' => '依照类别显示传票', +'ticketsbyuser' => '依照业务显示传票', + 'ticketsbyteam' => '依照团队显示传票', + 'ticketsbyproduct' => '依照产品显示传票', + 'contactbycampaign' => '依照活动显示联络人', + 'ticketsbyaccount' => '依照客户显示传票', + 'ticketsbycontact' => '依照联络人显示传票', +'LBL_DASHBRD_HOME' => '统计图表首页', + 'LBL_HORZ_BAR_CHART' => '水平长条图', + 'LBL_VERT_BAR_CHART' => '垂直长条图', + 'LBL_PIE_CHART' => '圆饼图', + 'LBL_NO_DATA' => '没有资料', + 'DashboardHome' => '统计图表首页', + 'GRIDVIEW' => '格状检视', + 'NORMALVIEW' => '一般检视', + 'VIEWCHART' => '检视图表', + +'LBL_DASHBOARD' => '统计图表', +"Approved"=>"批准", +"Created"=>"创造", +"Cancelled"=>"取消", +"Delivered"=>"交付", +"Received Shipment"=>"被接受的发货", +"Sent"=>"发送", +"Credit Invoice"=>"信用发货票", +"Paid"=>"有偿", +"Un Assigned"=>"没有被分配", +"Cold Call"=>"备用电话", +"Existing Customer"=>"现有的客户", +"Self Generated"=>"自己引起的", +"Employee"=>"员工", +"Partner"=>"合作者", +"Public Relations"=>"公共关系", +"Direct Mail"=>"直接邮件", +"Conference"=>"会议", +"Trade Show"=>"商业展览", +"Web Site"=>"网站", +"Word of mouth"=>"口述", +"Other"=>"其他", +"--None--"=>"无", +"Attempted to Contact"=>"试图接触", +"Cold"=>"冷淡", +"Contact in Future"=>"以后联系", +"Contacted"=>"联系中", +"Hot"=>"关系火热", +"Junk Lead"=>"不好的潜在客户", +"Lost Lead"=>"丢失的潜在客户", +"Not Contacted"=>"没有联系", +"Pre Qualified"=>"基本合格", +"Qualified"=>"合格", +"Warm"=>"很好", +"Apparel"=>"服装", +"Banking"=>"银行业务", +"Biotechnology"=>"生物工艺", +"Chemicals"=>"化学制品", +"Communications"=>"通信", +"Construction"=>"建筑", +"Consulting"=>"咨询", +"Education"=>"教育", +"Electronics"=>"电子", +"Energy"=>"能源", +"Engineering"=>"工程", +"Entertainment"=>"娱乐", +"Environmental"=>"环保", +"Finance"=>"财务", +"Food & Beverage"=>"食品、饮料", +"Government"=>"政府", +"Healthcare"=>"医疗保健", +"Hospitality"=>"好客", +"Insurance"=>"保险", +"Machinery"=>"机械", +"Manufacturing"=>"制造业", +"Media"=>"媒介", +"Not For Profit"=>"非盈利", +"Recreation"=>"休闲", +"Retail"=>"零售业", +"Shipping"=>"航运", +"Technology"=>"技术", +"Telecommunications"=>"电信", +"Transportation"=>"交通运输", +"Utilities"=>"公共事业", +"Hardware"=>"硬件", +"Software"=>"软件", +"CRM Applications"=>"CRM 应用", +"Open"=>"开放", +"In Progress"=>"进展中", +"Wait For Response"=>"等待中", +"Closed"=>"未完成", +"Low"=>"低", +"Normal"=>"正常", +"High"=>"高", +"Urgent"=>"紧急", +"Big Problem"=>"大问题", +"Small Problem"=>"小问题", +"Other Problem"=>"其他问题", +"Accepted"=>"接受", +"Rejected"=>"拒绝", +"Prospecting"=>"勘察", +"Qualification"=>"资格", +"Needs Analysis"=>"需要分析", +"Value Proposition"=>"已提价", +"Id. Decision Makers"=>"Id. 决策者", +"Perception Analysis"=>"感性分析", +"Proposal/Price Quote"=>"建议/价格行情", +"Negotiation/Review"=>"交涉/回顾", +"Closed Won"=>"成功结单", +"Closed Lost"=>"丢失", + + +); + +?> diff --git a/oss/vtiger/trunk/modules/Dashboard/line_graph.php b/oss/vtiger/trunk/modules/Dashboard/line_graph.php new file mode 100644 index 00000000..88dfd67d --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/line_graph.php @@ -0,0 +1,104 @@ +SetMarginColor('white'); +$graph->SetScale("textlin"); +$graph->SetMargin($left,$right,$top,$bottom); +$graph->tabtitle->Set($title ); +$graph->tabtitle->SetFont(FF_FONT2,FS_BOLD,13); +$graph->yaxis->HideZeroLabel(); +$graph->xgrid->Show(); + +$thick=6; +// Create the lines of the Graph +for($i=0;$iSetColor($color_val); + $$temp->SetLegend($name); + + $x_thick=$thick-$i; + if($x_thick<=1) + $x_thick=1; + + $$temp->SetWeight($x_thick); + $graph->Add($$temp); + + $max=0; + for($j=0;$j=$max) + $max=$x; + else + $max=$max; + } +} + + +if($max>=5) +{ + $graph->yaxis->SetLabelFormat('%d'); +} +$graph->legend->Pos(0,0.4,"right","center"); + +// Set some other color then the boring default +$graph->SetColor("#6F96FF"); +//$graph->SetColor("#CCDFCC"); +$graph->SetMarginColor("#2447A7"); +//$graph->SetMarginColor("#98C098"); +$graph->xaxis->SetTickLabels($datax); +$graph->xaxis->SetLabelAngle(90); + +// Output line +$graph->Stroke(); + + + +?> diff --git a/oss/vtiger/trunk/modules/Dashboard/loadDashBoard.php b/oss/vtiger/trunk/modules/Dashboard/loadDashBoard.php new file mode 100644 index 00000000..96b535cb --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/loadDashBoard.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Dashboard/pie_graph.php b/oss/vtiger/trunk/modules/Dashboard/pie_graph.php new file mode 100644 index 00000000..60a36662 --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/pie_graph.php @@ -0,0 +1,191 @@ +=14) + $name=substr($name, 0, 34); + if($pos>=2) + { + $val=explode(" ",$name); + $n=count($val)-1; + + $x=""; + for($j=0;$j $width, 'height' => $height, 'usemap' => true)); + $imagemap = $canvas->getImageMap(); + $graph =& Image_Graph::factory('graph', $canvas); + $font =& $graph->addNew('font', calculate_font_name($lang_crm)); + // set the font size to 11 pixels + $font->setSize(8); + $font->setColor($font_color); + + $graph->setFont($font); + // create the plotarea layout + $title =& Image_Graph::factory('title', array($title,10)); + $plotarea =& Image_Graph::factory('plotarea',array( + 'category', + 'axis' + )); + $footer =& Image_Graph::factory('title', array('Footer',8)); + $legend_box =& Image_Graph::factory('legend'); + $graph->add( + Image_Graph::vertical($title, + $plotarea, + 5 + ) + ); + + // To create unique lables we need to keep track of lable name and its count + $uniquex = array(); + + + // Generate colours + $colors = color_generator(count($datay),'#33DDFF','#3322FF'); + $dataset = & Image_Graph::factory('dataset'); + $fills =& Image_Graph::factory('Image_Graph_Fill_Array'); + $sum = 0; + for($i=0;$iaddPoint( + $datalabel, + $datay[$i], + array( + 'url' => $target[$i], + 'alt' => $alts[$i] + ) + ); + $sum += $datay[$i]; + $fills->addColor($colors[$i]); + } + + // create an array with % values + $pcvalues = array(); + for($i=0;$iaddNew('pie', $dataset); + $plotarea->setPadding(array('top'=>20,'bottom'=>0,'left'=>0,'right'=>50)); + $plotarea->hideAxis(); + $gbplot->setFillStyle($fills); + + // format the data values + $marker_array =& Image_Graph::factory('Image_Graph_DataPreprocessor_Array', array($pcvalues)); + + // set markers + $marker =& $graph->addNew('value_marker', IMAGE_GRAPH_VALUE_Y); + $marker->setDataPreprocessor($marker_array); + $marker->setFillColor('#FFFFFF'); + $marker->setBorderColor($font_color); + $marker->setFontColor($font_color); + $marker->setFontSize(8); + $pointingMarker =& $graph->addNew('Image_Graph_Marker_Pointing_Angular', array(20, &$marker)); + $gbplot->setMarker($pointingMarker); + + // set legend + $legend_box =& $plotarea->addNew('legend'); + $legend_box->setPadding(array('top'=>20,'bottom'=>0,'left'=>0,'right'=>0)); + $legend_box->setFillColor('#F5F5F5'); + $legend_box->showShadow(); + + $img = $graph->done( + array( + 'tohtml' => true, + 'border' => 0, + 'filename' => $cache_file_name, + 'filepath' => '', + 'urlpath' => '' + )); + save_image_map($cache_file_name.'.map', $img); + + return $img; + +} +?> + diff --git a/oss/vtiger/trunk/modules/Dashboard/vertical_bargraph.php b/oss/vtiger/trunk/modules/Dashboard/vertical_bargraph.php new file mode 100644 index 00000000..0b809f2c --- /dev/null +++ b/oss/vtiger/trunk/modules/Dashboard/vertical_bargraph.php @@ -0,0 +1,224 @@ +=15) + $name=substr($name, 0, 15); + if($pos>=2) + { + $val=explode(" ",$name); + $n=count($val)-1; + + $x=""; + for($j=0;$j $width, 'height' => $height, 'usemap' => true)); + $imagemap = $canvas->getImageMap(); + $graph =& Image_Graph::factory('graph', $canvas); + $font =& $graph->addNew('font', calculate_font_name($lang_crm)); + // set the font size to 12 + $font->setSize(8); + + if($theme == "blue") + { + $font_color = "#212473"; + } + else + { + $font_color = "#000000"; + } + $font->setColor($font_color); + + $graph->setFont($font); + $titlestr =& Image_Graph::factory('title', array($title,10)); + $plotarea =& Image_Graph::factory('plotarea',array( + 'axis', + 'axis', + 'vertical' + )); + $graph->add( + Image_Graph::vertical($titlestr, + $plotarea, + 5 + ) + ); + + + // Now create a bar plot + $max=0; + $xlabels = array(); + $dataset = & Image_Graph::factory('dataset'); + if($theme == 'woodspice') + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_HORIZONTAL_MIRRORED, '#804000', 'white')); + elseif($theme == 'bluelagoon') + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_HORIZONTAL_MIRRORED, 'blue', 'white')); + elseif($theme == 'softed') + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_HORIZONTAL_MIRRORED, 'blue', 'white')); + elseif($theme == 'hawebs') + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_VERTICAL_MIRRORED, 'blue', 'white')); + else + $fill =& Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_HORIZONTAL_MIRRORED, 'black', 'white')); + + + for($i=0;$i=$max) $max=$datay[$i]; + $dataset->addPoint( + $x, + $datay[$i], + array( + 'url' => $target[$i], + 'alt' => $alts[$i] + ) + ); + // build the xaxis label array to allow intermediate ticks + $xlabels[$x] = $datax[$i]; + $xlabels[$x+1] = ''; + } + + + //$bplot = new BarPlot($datay); + $bplot = & $plotarea->addNew('bar', $dataset); + $bplot->setFillStyle($fill); + + //You can change the width of the bars if you like + $bplot->setBarWidth(50/count($datax),"%"); + $bplot->setPadding(array('top'=>20)); + + $bplot->setBackground(Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_VERTICAL, 'white', 'white'))); + + // Setup X-axis + $xaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_X); + $yaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); + $yaxis->setFontSize(10); + + // set grid + $gridY =& $plotarea->addNew('line_grid', IMAGE_GRAPH_AXIS_Y); + $gridY->setLineColor('#FFFFFF@0.5'); + $gridY2 =& $plotarea->addNew('bar_grid', null, IMAGE_GRAPH_AXIS_Y); + $gridY2->setFillColor('#FFFFFF@0.2'); + + + // Add some grace to y-axis so the bars doesn't go + // all the way to the end of the plot area + if($max<=10) + $yaxis->forceMaximum(round(($max * 1.1) + 1.5)); + elseif($max>10 && $max<=100) + $yaxis->forceMaximum(round(($max * 1.1) + 1.5)); + elseif($max>100 && $max<=1000) + $yaxis->forceMaximum(round(($max * 1.1) + 10.5)); + else + $yaxis->forceMaximum(round(($max * 1.1) + 100.5)); + $ticks = get_tickspacing(round(($max * 1.1) + 2.0)); + + // First make the labels look right + $yaxis->setLabelInterval($ticks[0]); + $yaxis->setTickOptions(5,0); + $yaxis->setLabelInterval($ticks[1],2); + $yaxis->setTickOptions(2,0,2); + + // Create the xaxis labels + $array_data =& Image_Graph::factory('Image_Graph_DataPreprocessor_Array', + array($xlabels) + ); + + // Then fix the tick marks + $xaxis->setDataPreprocessor($array_data); + $xaxis->forceMinimum(0); + $xaxis->forceMaximum(2*count($datay)); + $xaxis->setFontAngle('vertical'); + $xaxis->setLabelInterval(1); + $xaxis->setTickOptions(0,0); + $xaxis->setLabelInterval(2,2); + $xaxis->setTickOptions(5,0,2); + + // set markers + $marker =& $graph->addNew('value_marker', IMAGE_GRAPH_VALUE_Y); + $marker->setFillColor('000000@0.0'); + $marker->setBorderColor('000000@0.0'); + $marker->setFontSize(10); + // shift markers 10 pix right + $marker_pointing =& $graph->addNew('Image_Graph_Marker_Pointing', array(0,-10,& $marker)); + $marker_pointing->setLineColor('000000@0.0'); + $bplot->setMarker($marker_pointing); + + + //Getting the graph in the form of html page + $img = $graph->done( + array( + 'tohtml' => true, + 'border' => 0, + 'filename' => $cache_file_name, + 'filepath' => '', + 'urlpath' => '' + )); + save_image_map($cache_file_name.'.map', $img); + + return $img; +} + +?> diff --git a/oss/vtiger/trunk/modules/Documents/CustomView.php b/oss/vtiger/trunk/modules/Documents/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Documents/Delete.php b/oss/vtiger/trunk/modules/Documents/Delete.php new file mode 100644 index 00000000..85401813 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/Delete.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/DeleteFolder.php b/oss/vtiger/trunk/modules/Documents/DeleteFolder.php new file mode 100644 index 00000000..fa147ef1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/DeleteFolder.php @@ -0,0 +1,54 @@ +is_admin != 'on') +{ + echo 'NOT_PERMITTED'; + die; +} +else +{ + $local_log =& LoggerManager::getLogger('index'); + if(isset($_REQUEST['folderid']) && $_REQUEST['folderid'] != '') + $folderId = $_REQUEST['folderid']; + else + { + echo 'FAILURE'; + die; + } + if(isset($_REQUEST['deletechk']) && $_REQUEST['deletechk'] == 'true') + { + $query = "select notesid from vtiger_notes INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_notes.notesid WHERE vtiger_notes.folderid = ? and vtiger_crmentity.deleted = 0"; + $result = $adb->pquery($query,array($folderId)); + if($adb->num_rows($result) > 0) + { + echo 'FAILURE'; + } + else + { + header("Location: index.php?action=DocumentsAjax&file=ListView&mode=ajax&module=Documents"); + exit; + } + } + else + { + $sql="delete from vtiger_attachmentsfolder where (folderid=? and folderid != 1)"; + $adb->pquery($sql,array($folderId)); + header("Location: index.php?action=DocumentsAjax&file=ListView&mode=ajax&module=Documents"); + exit; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/DetailView.php b/oss/vtiger/trunk/modules/Documents/DetailView.php new file mode 100644 index 00000000..33814eac --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/DetailView.php @@ -0,0 +1,175 @@ +retrieve_entity_info($_REQUEST['record'],"Documents"); + $focus->id = $_REQUEST['record']; + $focus->name=$focus->column_fields['notes_title']; +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; +} + +//needed when creating a new note with default values passed in +if (isset($_REQUEST['contact_name']) && is_null($focus->contact_name)) { + $focus->contact_name = $_REQUEST['contact_name']; +} +if (isset($_REQUEST['contact_id']) && is_null($focus->contact_id)) { + $focus->contact_id = $_REQUEST['contact_id']; +} +if (isset($_REQUEST['opportunity_name']) && is_null($focus->parent_name)) { + $focus->parent_name = $_REQUEST['opportunity_name']; +} +if (isset($_REQUEST['opportunity_id']) && is_null($focus->parent_id)) { + $focus->parent_id = $_REQUEST['opportunity_id']; +} +if (isset($_REQUEST['account_name']) && is_null($focus->parent_name)) { + $focus->parent_name = $_REQUEST['account_name']; +} +if (isset($_REQUEST['account_id']) && is_null($focus->parent_id)) { + $focus->parent_id = $_REQUEST['account_id']; +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Document detail view"); + +$smarty = new vtigerCRM_Smarty; +$dbQuery="select filename,folderid,filelocationtype,filestatus from vtiger_notes where notesid = ?"; +$result=$adb->pquery($dbQuery,array($focus->id)); +$filename=$adb->query_result($result,0,'filename'); +$folderid=$adb->query_result($result,0,'folderid'); +$filestatus=$adb->query_result($result,0,'filestatus'); +$filelocationtype=$adb->query_result($result,0,'filelocationtype'); + +$fileattach = "select attachmentsid from vtiger_seattachmentsrel where crmid = ?"; +$res = $adb->pquery($fileattach,array($focus->id)); +$fileid = $adb->query_result($res,0,'attachmentsid'); + +if($filelocationtype == 'I'){ + $pathQuery = $adb->pquery("select path from vtiger_attachments where attachmentsid = ?",array($fileid)); + $filepath = $adb->query_result($pathQuery,0,'path'); +} +else{ + $filepath = $filename; +} + + +$smarty->assign("FILEID",$fileid); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$allblocks = getBlocks($currentModule,"detail_view",'',$focus->column_fields); +$smarty->assign("BLOCKS", $allblocks); +$flag = 0; +foreach($allblocks as $blocks) +{ + foreach($blocks as $block_entries) + { + if($block_entries['File Name']['value'] != '' || isset($block_entries['File Name']['value'])) + $flag = 1; + } +} +if($flag == 1) + $smarty->assign("FILE_EXIST","yes"); +elseif($flag == 0) + $smarty->assign("FILE_EXIST","no"); + +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); + +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); +else $smarty->assign("NAME", ""); + +$smarty->assign("FILENAME", $filename); + +if (isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if (isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if (isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + + +$smarty->assign("SINGLE_MOD", 'Document'); + +if(isPermitted("Documents","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +if(isPermitted("Documents","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); + + +$tabid = getTabid("Documents"); + $validationData = getDBValidationData($focus->tab_name,$tabid); + $data = split_validationdataArray($validationData); + + $smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); + $smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); + $smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + if($current_user->id == 1) +{ + $smarty->assign("CHECK_INTEGRITY_PERMISSION","yes"); + $smarty->assign("ADMIN","yes"); +} +$smarty->assign("FILE_STATUS",$filestatus); + $smarty->assign("DLD_TYPE",$filelocationtype); + $smarty->assign("NOTESID",$focus->id); + $smarty->assign("FOLDERID",$folderid); + $smarty->assign("DLD_PATH",$filepath); + +$smarty->assign("MODULE",$currentModule); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("DetailView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/DetailViewAjax.php b/oss/vtiger/trunk/modules/Documents/DetailViewAjax.php new file mode 100644 index 00000000..d9e93b58 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/DetailViewAjax.php @@ -0,0 +1,45 @@ +retrieve_entity_info($crmid,"Documents"); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("Documents"); + if($modObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/Documents.js b/oss/vtiger/trunk/modules/Documents/Documents.js new file mode 100644 index 00000000..2ceb8e73 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/Documents.js @@ -0,0 +1,322 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + +//Added after 504 for renaming a folder +function UpdateAjaxSave(label,fid,fldname,fileOrFolder) +{ + fldVal=$('txtbox_'+label).value; + if(fldVal.replace(/^\s+/g, '').replace(/\s+$/g, '').length==0) + { + alert(alert_arr.FOLDERNAME_EMPTY); + return false; + } + if(fldVal.replace(/^\s+/g, '').replace(/\s+$/g, '').length>=21) + { + alert(alert_arr.FOLDER_NAME_TOO_LONG); + return false; + } + if(fldVal.match(/['"\\%+?]/)) + { + alert(alert_arr.NO_SPECIAL_CHARS_DOCS); + return false; + } + if(fileOrFolder == 'file') + var url='action=DocumentsAjax&mode=ajax&file=Save&module=Documents&fileid='+fid+'&fldVal='+fldVal+'&fldname='+fldname+'&act=ajaxEdit'; + else + { + var foldername = encodeURIComponent(fldVal); + foldername = foldername.replace(/^\s+/g, '').replace(/\s+$/g, ''); + foldername = foldername.replace(/&/gi,'*amp*'); + var url='action=DocumentsAjax&mode=ajax&file=SaveFolder&module=Documents&record='+fid+'&foldername='+fldVal+'&savemode=Save'; + } + if(fldname == 'status') + { + fldVal = $('txtbox_'+label).options[$('txtbox_'+label).options.selectedIndex].text; + gtempselectedIndex = $('txtbox_'+label).options.selectedIndex; + } + $('status').style.display="block"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: url, + onComplete: function(response) { + var item = response.responseText; + $('status').style.display="none"; + if(item.indexOf("Failure") > -1 ) + { + $("lblError").innerHTML="
"+alert_arr.LBL_UNABLE_TO_UPDATE+"
"; + setTimeout(hidelblError,3000); + } + else if(item.indexOf('DUPLICATE_FOLDERNAME') > -1) + { + alert(alert_arr.DUPLICATE_FOLDER_NAME); + } + else + { + $('dtlview_'+label).innerHTML = fldVal; + eval("hndCancel('dtlview_"+label+"','editarea_"+label+"','"+label+"')"); + if(fldname == 'status') + $('txtbox_'+label).selectedIndex = gtempselectedIndex; + else + $('txtbox_'+label).value = fldVal; + eval(item); + + } + + } + } + ); + +} + +function closeFolderCreate() +{ + $('folder_id').value = ''; + $('folder_name').value = ''; + $('folder_desc').value=''; + fninvsh('orgLay') +} + +function AddFolder() +{ + var fldrname=getObj('folder_name').value; + var fldrdesc=getObj('folder_desc').value; + if(fldrname.replace(/^\s+/g, '').replace(/\s+$/g, '').length==0) + { + alert(alert_arr.FOLDERNAME_EMPTY); + return false; + } + if(fldrname.replace(/^\s+/g, '').replace(/\s+$/g, '').length>=21) + { + alert(alert_arr.FOLDER_NAME_TOO_LONG); + return false; + } + if(fldrdesc.replace(/^\s+/g, '').replace(/\s+$/g, '').length>=51) + { + alert(alert_arr.FOLDER_DESCRIPTION_TOO_LONG); + return false; + } + if(fldrname.match(/['"\\%+]/) || fldrdesc.match(/['"\\%+]/)) + { + alert(alert_arr.NO_SPECIAL_CHARS_DOCS+alert_arr.NAME_DESC); + return false; + } + if(fldrname.match(/[?]+$/) || fldrname.match(/[?]+/)) + { + alert(alert_arr.NO_SPECIAL_CHARS_DOCS); + return false; + } + fninvsh('orgLay'); + var foldername = encodeURIComponent(getObj('folder_name').value); + var folderdesc = encodeURIComponent(getObj('folder_desc').value); + foldername = foldername.replace(/^\s+/g, '').replace(/\s+$/g, ''); + foldername = foldername.replace(/&/gi,'*amp*'); + folderdesc = folderdesc.replace(/^\s+/g, '').replace(/\s+$/g, ''); + folderdesc = folderdesc.replace(/&/gi,'*amp*'); + getObj('folder_name').value = ''; + getObj('folder_desc').value = ''; + var mode = getObj('fldrsave_mode').value; + if(mode == 'save') + { + url ='&savemode=Save&foldername='+foldername+'&folderdesc='+folderdesc; + } + getObj('fldrsave_mode').value = 'save'; + $('status').style.display = 'block'; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'action=DocumentsAjax&mode=ajax&file=SaveFolder&module=Documents'+url, + onComplete: function(response) { + var item = response.responseText; + $('status').style.display = 'none'; + if(item.indexOf('Failure') > -1) + { + $('lblError').innerHTML = "
"+alert_arr.LBL_UNABLE_TO_ADD_FOLDER+"
"; + setTimeOutFn(); + } + else if(item.indexOf('DUPLICATE_FOLDERNAME') > -1) + { + alert(alert_arr.DUPLICATE_FOLDER_NAME); + } + else + { + getObj("ListViewContents").innerHTML = item; + } + } + } + ); +} + + +function DeleteFolderCheck(folderId) +{ + gtempfolderId = folderId; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: "module=Documents&action=DocumentsAjax&mode=ajax&file=DeleteFolder&deletechk=true&folderid="+folderId, + onComplete: function(response) { + var item = response.responseText; + if(item.indexOf("NOT_PERMITTED") > -1) { + alert(alert_arr.NOT_PERMITTED); + return false; + } + else if(item.indexOf("FAILURE") > -1) + { + alert(alert_arr.LBL_FOLDER_SHOULD_BE_EMPTY); + } + else { + if(confirm(alert_arr.LBL_ARE_YOU_SURE_YOU_WANT_TO_DELETE_FOLDER)) + { + DeleteFolder(gtempfolderId); + } + } + } + } + ); +} + +function DeleteFolder(folderId) +{ + $('status').style.display = "block"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: "module=Documents&action=DocumentsAjax&mode=ajax&file=DeleteFolder&folderid="+folderId, + onComplete: function(response) { + var item = response.responseText; + $('status').style.display = "none"; + if(item.indexOf("FAILURE") > -1) + alert(alert_arr.LBL_ERROR_WHILE_DELETING_FOLDER); + else + $('ListViewContents').innerHTML = item; + } + } + ); +} + +function MoveFile(id,foldername) +{ + fninvsh('movefolderlist'); + var select_options = document.getElementById('allselectedboxes').value; + var x = select_options.split(";"); + var searchurl= document.getElementById('search_url').value; + var count=x.length + var viewid =getviewId(); + var idstring = ""; + if (count > 1) + { + document.getElementById('idlist').value=select_options; + idstring = select_options; + } + else + { + alert(alert_arr.SELECT); + return false; + } + + if(idstring != '') + { + if(confirm(alert_arr.LBL_ARE_YOU_SURE_TO_MOVE_TO + foldername + alert_arr.LBL_FOLDER)) + { + $('status').style.display = "block"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'action=DocumentsAjax&file=MoveFile&from_folderid=0&module=Documents&folderid='+id+'&idlist='+idstring, + onComplete: function(response) { + var item = response.responseText; + $('status').style.display = "none"; + if(item.indexOf("NOT_PERMITTED") > -1 ) { + $("lblError").innerHTML="
"+alert_arr.NOT_PERMITTED+"
"; + setTimeout(hidelblError,3000); + } + else + getObj('ListViewContents').innerHTML = item; + } + + } + ); + }else{ + return false; + } + + }else + { + alert(alert_arr.LBL_SELECT_ONE_FILE); + return false; + } +} + +function dldCntIncrease(fileid) +{ + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'action=DocumentsAjax&mode=ajax&file=SaveFile&module=Documents&file_id='+fileid+"&act=updateDldCnt", + onComplete: function(response) { + } + } + ); +} + + +function checkFileIntegrityDetailView(noteid) +{ + $('vtbusy_integrity_info').style.display=''; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'module=Documents&action=DocumentsAjax&mode=ajax&file=SaveFile&act=checkFileIntegrityDetailView¬eid='+noteid, + onComplete: function(response) { + var item = response.responseText; + if(item.indexOf('file_available') > -1) + { + $('vtbusy_integrity_info').style.display='none'; + $('integrity_result').innerHTML='

   '+alert_arr.LBL_FILE_CAN_BE_DOWNLOAD+''; + $('integrity_result').style.display=''; + setTimeout(hideresult,4000); + } + else if(item.indexOf('file_not_available') > -1) + { + $('vtbusy_integrity_info').style.display='none'; + $('integrity_result').innerHTML='

   '+alert_arr.LBL_DOCUMENT_NOT_AVAILABLE+''; + $('integrity_result').style.display=''; + setTimeout(hideresult,6000); + } + else if(item.indexOf('lost_integrity') > -1) + { + $('vtbusy_integrity_info').style.display='none'; + $('integrity_result').innerHTML='

   '+alert_arr.LBL_DOCUMENT_LOST_INTEGRITY+''; + $('integrity_result').style.display=''; + setTimeout(hideresult,6000); + } + } + } + ); +} + +function hideresult() +{ + $('integrity_result').style.display = 'none'; +} + +function add_data_to_relatedlist(entity_id,recordid) { + + opener.document.location.href="index.php?module={RETURN_MODULE}&action=updateRelations&smodule={SMODULE}&destination_module=Products&entityid="+entity_id+"&parentid="+recordid; +} + diff --git a/oss/vtiger/trunk/modules/Documents/Documents.php b/oss/vtiger/trunk/modules/Documents/Documents.php new file mode 100644 index 00000000..024e294a --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/Documents.php @@ -0,0 +1,441 @@ +'crmid','vtiger_notes'=>'notesid','vtiger_senotesrel'=>'notesid'); + + var $column_fields = Array(); + + var $sortby_fields = Array('title','modifiedtime','filename','createdtime','lastname','filedownloadcount','smownerid'); + + // This is used to retrieve related vtiger_fields from form posts. + var $additional_column_fields = Array('', '', '', ''); + + // This is the list of vtiger_fields that are in the lists. + var $list_fields = Array( + 'Title'=>Array('notes'=>'title'), + 'File Name'=>Array('notes'=>'filename'), + 'Assigned To' => Array('crmentity'=>'smownerid'), + 'Folder Name' => Array('attachmentsfolder'=>'foldername') + ); + var $list_fields_name = Array( + 'Title'=>'notes_title', + 'File Name'=>'filename', + 'Assigned To'=>'assigned_user_id', + 'Folder Name' => 'folderid' + ); + + var $search_fields = Array( + 'Title' => Array('notes'=>'notes_title'), + 'File Name' => Array('notes'=>'filename'), + 'Assigned To' => Array('crmentity'=>'smownerid'), + 'Folder Name' => Array('attachmentsfolder'=>'foldername') + ); + + var $search_fields_name = Array( + 'Title' => 'notes_title', + 'File Name' => 'filename', + 'Assigned To' => 'assigned_user_id', + 'Folder Name' => 'folderid' + ); + var $list_link_field= 'notes_title'; + var $old_filename = ''; + //var $groupTable = Array('vtiger_notegrouprelation','notesid'); + + var $mandatory_fields = Array('notes_title','createdtime' ,'modifiedtime','filename','filesize','filetype','filedownloadcount','assigned_user_id'); + + //Added these variables which are used as default order by and sortorder in ListView + var $default_order_by = 'title'; + var $default_sort_order = 'ASC'; + function Documents() { + $this->log = LoggerManager::getLogger('notes'); + $this->log->debug("Entering Documents() method ..."); + $this->db = PearDatabase::getInstance(); + $this->column_fields = getColumnFields('Documents'); + $this->log->debug("Exiting Documents method ..."); + } + + function save_module($module) + { + global $log,$adb,$upload_badext; + $insertion_mode = $this->mode; + if(isset($this->parentid) && $this->parentid != '') + $relid = $this->parentid; + //inserting into vtiger_senotesrel + if(isset($relid) && $relid != '') + { + $this->insertintonotesrel($relid,$this->id); + } + $filetype_fieldname = $this->getFileTypeFieldName(); + $filename_fieldname = $this->getFile_FieldName(); + if($this->column_fields[$filetype_fieldname] == 'I' ){ + if($_FILES[$filename_fieldname]['name'] != ''){ + $errCode=$_FILES[$filename_fieldname]['error']; + if($errCode == 0){ + foreach($_FILES as $fileindex => $files) + { + if($files['name'] != '' && $files['size'] > 0){ + $filename = $_FILES[$filename_fieldname]['name']; + $filename = from_html(preg_replace('/\s+/', '_', $filename)); + $filetype = $_FILES[$filename_fieldname]['type']; + $filesize = $_FILES[$filename_fieldname]['size']; + $filelocationtype = 'I'; + $binFile = sanitizeUploadFileName($filename, $upload_badext); + $filename = ltrim(basename(" ".$binFile)); //allowed filename like UTF-8 characters + } + } + + } + }elseif($this->mode == 'edit') { + $fileres = $adb->pquery("select filetype, filesize,filename,filedownloadcount,filelocationtype from vtiger_notes where notesid=?", array($this->id)); + if ($adb->num_rows($fileres) > 0) { + $filename = $adb->query_result($fileres, 0, 'filename'); + $filetype = $adb->query_result($fileres, 0, 'filetype'); + $filesize = $adb->query_result($fileres, 0, 'filesize'); + $filedownloadcount = $adb->query_result($fileres, 0, 'filedownloadcount'); + $filelocationtype = $adb->query_result($fileres, 0, 'filelocationtype'); + } + }elseif($this->column_fields[$filename_fieldname]) { + $filename = $this->column_fields[$filename_fieldname]; + $filesize = $this->column_fields['filesize']; + $filetype = $this->column_fields['filetype']; + $filelocationtype = $this->column_fields[$filetype_fieldname]; + $filedownloadcount = 0; + } + } else{ + $filelocationtype = 'E'; + $filename = $this->column_fields[$filename_fieldname]; + // If filename does not has the protocol prefix, default it to http:// + // Protocol prefix could be like (https://, smb://, file://, \\, smb:\\,...) + if(!empty($filename) && !preg_match('/^\w{1,5}:\/\/|^\w{0,3}:?\\\\\\\\/', trim($filename), $match)) { + $filename = "http://$filename"; + } + $filetype = ''; + $filesize = 0; + $filedownloadcount = null; + } + $query = "UPDATE vtiger_notes SET filename = ? ,filesize = ?, filetype = ? , filelocationtype = ? , filedownloadcount = ? WHERE notesid = ?"; + $re=$adb->pquery($query,array($filename,$filesize,$filetype,$filelocationtype,$filedownloadcount,$this->id)); + //Inserting into attachments table + if($filelocationtype == 'I') { + $this->insertIntoAttachment($this->id,'Documents'); + }else{ + $query = "delete from vtiger_seattachmentsrel where crmid = ?"; + $qparams = array($this->id); + $adb->pquery($query, $qparams); + } + } + + + /** + * This function is used to add the vtiger_attachments. This will call the function uploadAndSaveFile which will upload the attachment into the server and save that attachment information in the database. + * @param int $id - entity id to which the vtiger_files to be uploaded + * @param string $module - the current module name + */ + function insertIntoAttachment($id,$module) + { + global $log, $adb; + $log->debug("Entering into insertIntoAttachment($id,$module) method."); + + $file_saved = false; + + foreach($_FILES as $fileindex => $files) + { + if($files['name'] != '' && $files['size'] > 0) + { + $files['original_name'] = vtlib_purify($_REQUEST[$fileindex.'_hidden']); + $file_saved = $this->uploadAndSaveFile($id,$module,$files); + } + } + + $log->debug("Exiting from insertIntoAttachment($id,$module) method."); + } + + /** Function used to get the sort order for Documents listview + * @return string $sorder - first check the $_REQUEST['sorder'] if request value is empty then check in the $_SESSION['NOTES_SORT_ORDER'] if this session value is empty then default sort order will be returned. + */ + function getSortOrder() + { + global $log; + $log->debug("Entering getSortOrder() method ..."); + if(isset($_REQUEST['sorder'])) + $sorder = $this->db->sql_escape_string($_REQUEST['sorder']); + else + $sorder = (($_SESSION['NOTES_SORT_ORDER'] != '')?($_SESSION['NOTES_SORT_ORDER']):($this->default_sort_order)); + $log->debug("Exiting getSortOrder() method ..."); + return $sorder; + } + + /** Function used to get the order by value for Documents listview + * @return string $order_by - first check the $_REQUEST['order_by'] if request value is empty then check in the $_SESSION['NOTES_ORDER_BY'] if this session value is empty then default order by will be returned. + */ + function getOrderBy() + { + global $log; + $log->debug("Entering getOrderBy() method ..."); + + $use_default_order_by = ''; + if(PerformancePrefs::getBoolean('LISTVIEW_DEFAULT_SORTING', true)) { + $use_default_order_by = $this->default_order_by; + } + + if (isset($_REQUEST['order_by'])) + $order_by = $this->db->sql_escape_string($_REQUEST['order_by']); + else + $order_by = (($_SESSION['NOTES_ORDER_BY'] != '')?($_SESSION['NOTES_ORDER_BY']):($use_default_order_by)); + $log->debug("Exiting getOrderBy method ..."); + return $order_by; + } + + + /** Function to export the notes in CSV Format + * @param reference variable - where condition is passed when the query is executed + * Returns Export Documents Query. + */ + function create_export_query($where) + { + global $log,$current_user; + $log->debug("Entering create_export_query(". $where.") method ..."); + + include("include/utils/ExportUtils.php"); + //To get the Permitted fields query and the permitted fields list + $sql = getPermittedFieldsQuery("Documents", "detail_view"); + $fields_list = getFieldsListFromQuery($sql); + + $query = "SELECT $fields_list, case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name" . + " FROM vtiger_notes + inner join vtiger_crmentity + on vtiger_crmentity.crmid=vtiger_notes.notesid + LEFT JOIN vtiger_attachmentsfolder on vtiger_notes.folderid=vtiger_attachmentsfolder.folderid + LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid=vtiger_users.id " . + " LEFT JOIN vtiger_groups ON vtiger_crmentity.smownerid=vtiger_groups.groupid " + ; + + $where_auto=" vtiger_crmentity.deleted=0"; + if($where != "") + $query .= " WHERE ($where) AND ".$where_auto; + else + $query .= " WHERE ".$where_auto; + + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + //we should add security check when the user has Private Access + $tabid = getTabid("Documents"); + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[$tabid] == 3) + { + //Added security check to get the permitted records only + $query = $query." ".getListViewSecurityParameter("Documents"); + } + + + $log->debug("Exiting create_export_query method ..."); + return $query; + } + + function del_create_def_folder($query) + { + global $adb; + $dbQuery = $query." and vtiger_attachmentsfolder.folderid = 0"; + $dbresult = $adb->pquery($dbQuery,array()); + $noofnotes = $adb->num_rows($dbresult); + if($noofnotes > 0) + { + $folderQuery = "select folderid from vtiger_attachmentsfolder"; + $folderresult = $adb->pquery($folderQuery,array()); + $noofdeffolders = $adb->num_rows($folderresult); + if($noofdeffolders == 0) + { + $insertQuery = "insert into vtiger_attachmentsfolder values (0,'Default','Contains all attachments for which a folder is not set',1,0)"; + $insertresult = $adb->pquery($insertQuery,array()); + } + } + + } + + function insertintonotesrel($relid,$id) + { + global $adb; + $dbQuery = "insert into vtiger_senotesrel values ( ?, ? )"; + $dbresult = $adb->pquery($dbQuery,array($relid,$id)); + } + + /*function save_related_module($module, $crmid, $with_module, $with_crmid){ + global $log; + $log->debug("indocument".$module.$crmid.$with_module.$with_crmid); + if(isset($this->parentid) && $this->parentid != '') + $relid = $this->parentid; + //inserting into vtiger_senotesrel + if(isset($relid) && $relid != '') + { + $this->insertintonotesrel($relid,$this->id); + } + }*/ + + + /* + * Function to get the primary query part of a report + * @param - $module Primary module name + * returns the query string formed on fetching the related data for report for primary module + */ + function generateReportsQuery($module){ + $moduletable = $this->table_name; + $moduleindex = $this->tab_name_index[$moduletable]; + $query = "from $moduletable + inner join vtiger_crmentity on vtiger_crmentity.crmid=$moduletable.$moduleindex + inner join vtiger_attachmentsfolder on vtiger_attachmentsfolder.folderid=$moduletable.folderid + left join vtiger_groups as vtiger_groups".$module." on vtiger_groups".$module.".groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_users".$module." on vtiger_users".$module.".id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid"; + return $query; + + } + + /* + * Function to get the secondary query part of a report + * @param - $module primary module name + * @param - $secmodule secondary module name + * returns the query string formed on fetching the related data for report for secondary module + */ + function generateReportsSecQuery($module,$secmodule){ + $query = $this->getRelationQuery($module,$secmodule,"vtiger_notes","notesid"); + $query .=" left join vtiger_crmentity as vtiger_crmentityDocuments on vtiger_crmentityDocuments.crmid=vtiger_notes.notesid and vtiger_crmentityDocuments.deleted=0 + left join vtiger_attachmentsfolder on vtiger_attachmentsfolder.folderid=vtiger_notes.folderid + left join vtiger_groups as vtiger_groupsDocuments on vtiger_groupsDocuments.groupid = vtiger_crmentityDocuments.smownerid + left join vtiger_users as vtiger_usersDocuments on vtiger_usersDocuments.id = vtiger_crmentityDocuments.smownerid"; + + return $query; + } + + /* + * Function to get the relation tables for related modules + * @param - $secmodule secondary module name + * returns the array with table names and fieldnames storing relations between module and this module + */ + function setRelationTables($secmodule){ + $rel_tables = array(); + return $rel_tables[$secmodule]; + } + + // Function to unlink all the dependent entities of the given Entity by Id + function unlinkDependencies($module, $id) { + global $log; + /*//Backup Documents Related Records + $se_q = 'SELECT crmid FROM vtiger_senotesrel WHERE notesid = ?'; + $se_res = $this->db->pquery($se_q, array($id)); + if ($this->db->num_rows($se_res) > 0) { + for($k=0;$k < $this->db->num_rows($se_res);$k++) + { + $se_id = $this->db->query_result($se_res,$k,"crmid"); + $params = array($id, RB_RECORD_DELETED, 'vtiger_senotesrel', 'notesid', 'crmid', $se_id); + $this->db->pquery('INSERT INTO vtiger_relatedlists_rb VALUES (?,?,?,?,?,?)', $params); + } + } + $sql = 'DELETE FROM vtiger_senotesrel WHERE notesid = ?'; + $this->db->pquery($sql, array($id));*/ + + parent::unlinkDependencies($module, $id); + } + + // Function to unlink an entity with given Id from another entity + function unlinkRelationship($id, $return_module, $return_id) { + global $log; + if(empty($return_module) || empty($return_id)) return; + + $sql = 'DELETE FROM vtiger_senotesrel WHERE notesid = ? AND crmid = ?'; + $this->db->pquery($sql, array($id, $return_id)); + + $sql = 'DELETE FROM vtiger_crmentityrel WHERE (crmid=? AND relmodule=? AND relcrmid=?) OR (relcrmid=? AND module=? AND crmid=?)'; + $params = array($id, $return_module, $return_id, $id, $return_module, $return_id); + $this->db->pquery($sql, $params); + } + + +// Function to get fieldname for uitype 27 assuming that documents have only one file type field + + function getFileTypeFieldName(){ + global $adb,$log; + $query = 'SELECT fieldname from vtiger_field where tabid = ? and uitype = ?'; + $tabid = getTabid('Documents'); + $filetype_uitype = 27; + $res = $adb->pquery($query,array($tabid,$filetype_uitype)); + $fieldname = null; + if(isset($res)){ + $rowCount = $adb->num_rows($res); + if($rowCount > 0){ + $fieldname = $adb->query_result($res,0,'fieldname'); + } + } + return $fieldname; + + } + +// Function to get fieldname for uitype 28 assuming that doc has only one file upload type + + function getFile_FieldName(){ + global $adb,$log; + $query = 'SELECT fieldname from vtiger_field where tabid = ? and uitype = ?'; + $tabid = getTabid('Documents'); + $filename_uitype = 28; + $res = $adb->pquery($query,array($tabid,$filename_uitype)); + $fieldname = null; + if(isset($res)){ + $rowCount = $adb->num_rows($res); + if($rowCount > 0){ + $fieldname = $adb->query_result($res,0,'fieldname'); + } + } + return $fieldname; + } + + /** + * Check the existence of folder by folderid + */ + function isFolderPresent($folderid) { + global $adb; + $result = $adb->pquery("SELECT folderid FROM vtiger_attachmentsfolder WHERE folderid = ?", array($folderid)); + if(!empty($result) && $adb->num_rows($result) > 0) return true; + return false; + } + + /** + * Customizing the restore procedure. + */ + function restore($modulename, $id) { + parent::restore($modulename, $id); + + global $adb; + $fresult = $adb->pquery("SELECT folderid FROM vtiger_notes WHERE notesid = ?", array($id)); + if(!empty($fresult) && $adb->num_rows($fresult)) { + $folderid = $adb->query_result($fresult, 0, 'folderid'); + if(!$this->isFolderPresent($folderid)) { + // Re-link to default folder + $adb->pquery("UPDATE vtiger_notes set folderid = 1 WHERE notesid = ?", array($id)); + } + } + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/DocumentsAjax.php b/oss/vtiger/trunk/modules/Documents/DocumentsAjax.php new file mode 100644 index 00000000..ce66087f --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/DocumentsAjax.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Documents/DownloadFile.php b/oss/vtiger/trunk/modules/Documents/DownloadFile.php new file mode 100644 index 00000000..4122becc --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/DownloadFile.php @@ -0,0 +1,68 @@ +pquery("select crmid from vtiger_seattachmentsrel where attachmentsid = ?",array($fileid)); +$noteid = $adb->query_result($noteQuery,0,'crmid'); +$dbQuery = "SELECT * FROM vtiger_notes WHERE notesid = ? and folderid= ?"; +$result = $adb->pquery($dbQuery,array($noteid,$folderid)) or die("Couldn't get file list"); +if($adb->num_rows($result) == 1) +{ + $fileType = @$adb->query_result($result, 0, "filetype"); + $name = @$adb->query_result($result, 0, "filename"); + $name = html_entity_decode($name, ENT_QUOTES, $default_charset); + $pathQuery = $adb->pquery("select path from vtiger_attachments where attachmentsid = ?",array($fileid)); + $filepath = $adb->query_result($pathQuery,0,'path'); + + $saved_filename = $fileid."_".$name; + if(!$filepath.$saved_filename) + $saved_filename = $fileid."_".$name; + + $filesize = filesize($filepath.$saved_filename); + if(!fopen($filepath.$saved_filename, "r")) + { + echo 'unable to open file'; + $log->debug('Unable to open file'); + } + else + { + $fileContent = fread(fopen($filepath.$saved_filename, "r"), $filesize); + } + if($fileContent != '') + { + $log->debug('About to update download count'); + $sql = "select filedownloadcount from vtiger_notes where notesid= ?"; + $download_count = $adb->query_result($adb->pquery($sql,array($fileid)),0,'filedownloadcount') + 1; + $sql="update vtiger_notes set filedownloadcount= ? where notesid= ?"; + $res=$adb->pquery($sql,array($download_count,$fileid)); + } + + header("Content-type: $fileType"); + header("Content-length: $filesize"); + header("Cache-Control: private"); + header("Content-Disposition: attachment; filename=$name"); + header("Content-Description: PHP Generated Data"); + echo $fileContent; +} +else +{ + echo "Record doesn't exist."; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/EditView.php b/oss/vtiger/trunk/modules/Documents/EditView.php new file mode 100644 index 00000000..b483e3ef --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/EditView.php @@ -0,0 +1,226 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if($_REQUEST['upload_error'] == true) +{ + echo '
'.$mod_strings['FILE_HAS_NO_DATA'].'.
'; +} + +if(isset($_REQUEST['record']) && $_REQUEST['record'] !='') +{ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"Documents"); + $focus->name=$focus->column_fields['notes_title']; +} + +if($focus->mode != 'edit') +{ + if(isset($_REQUEST['parent_id']) && isset($_REQUEST['return_module'])) + { + $owner = getRecordOwnerId($_REQUEST['parent_id']); + if(isset($owner['Users']) && $owner['Users'] != '') { + $permitted_users = get_user_array('true', 'Active',$current_user->id); + if(!in_array($owner['Users'],$permitted_users)){ + $owner['Users'] = $current_user->id; + } + $focus->column_fields['assigntype'] = 'U'; + $focus->column_fields['assigned_user_id'] = $owner['Users']; + } elseif(isset($owner['Groups']) && $owner['Groups'] != '') { + $focus->column_fields['assigntype'] = 'T'; + $focus->column_fields['assigned_user_id'] = $owner['Groups']; + } + } +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +if(isset($_REQUEST['parent_id']) && $focus->mode != 'edit') { + $smarty->assign("PARENTID",vtlib_purify($_REQUEST['parent_id'])); +} + +$dbQuery="select filename from vtiger_notes where notesid = ?"; +$result=$adb->pquery($dbQuery,array($focus->id)); +$filename=$adb->query_result($result,0,'filename'); +if(is_null($filename) || $filename == '') +{ + $smarty->assign("FILE_EXIST","no"); +} +else +{ + $smarty->assign("FILE_NAME",$filename); + $smarty->assign("FILE_EXIST","yes"); +} + +//setting default flag value so due date and time not required +if (!isset($focus->id)) $focus->date_due_flag = 'on'; + +//needed when creating a new case with default values passed in +if (isset($_REQUEST['contact_name']) && is_null($focus->contact_name)) { + $focus->contact_name = $_REQUEST['contact_name']; +} +if (isset($_REQUEST['contact_id']) /* && is_null($focus->contact_id) */ ) { + $focus->contact_id = $_REQUEST['contact_id']; +} +if (isset($_REQUEST['parent_name']) && is_null($focus->parent_name)) { + $focus->parent_name = $_REQUEST['parent_name']; +} +if (isset($_REQUEST['parent_id']) /* && is_null($focus->parent_id) */ ) { + $focus->parent_id = $_REQUEST['parent_id']; +} +if (isset($_REQUEST['parent_type'])) { + $focus->parent_type = $_REQUEST['parent_type']; +} +elseif (!isset($focus->parent_type)) { + $focus->parent_type = $app_list_strings['record_type_default_key']; +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') + $smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +else +{ + $smarty->assign("BASBLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS')); +} +$smarty->assign("OP_MODE",$disp_view); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + + +$log->info("Document detail view"); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Document'); +//Display the FCKEditor or not? -- configure $FCKEDITOR_DISPLAY in config.php +if(getFieldVisibilityPermission('Documents',$current_user->id,'notecontent') != '0') + $FCKEDITOR_DISPLAY = false; +$smarty->assign("FCKEDITOR_DISPLAY",$FCKEDITOR_DISPLAY); + +if (isset($focus->name)) +$smarty->assign("NAME", $focus->name); +else +$smarty->assign("NAME", ""); + +if($focus->mode == 'edit') +{ + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MODE", $focus->mode); +} +else +{ + $smarty->assign("MODE",'create'); +} + +if (isset($_REQUEST['return_module'])) +$smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +else +$smarty->assign("RETURN_MODULE","Documents"); +if (isset($_REQUEST['return_action'])) +$smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +else +$smarty->assign("RETURN_ACTION","index"); +if (isset($_REQUEST['return_id'])) +$smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset($_REQUEST['email_id'])) +$smarty->assign("EMAILID", vtlib_purify($_REQUEST['email_id'])); +if (isset($_REQUEST['ticket_id'])) $smarty->assign("TICKETID", vtlib_purify($_REQUEST['ticket_id'])); +if (isset($_REQUEST['fileid'])) +$smarty->assign("FILEID", vtlib_purify($_REQUEST['fileid'])); +if (isset($_REQUEST['record'])) +{ + $smarty->assign("CANCELACTION", "DetailView"); +} +else +{ + $smarty->assign("CANCELACTION", "index"); +} +if (isset($_REQUEST['return_viewname'])) +$smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); +$smarty->assign("OLD_ID", $old_id ); + +if ( empty($focus->filename)) +{ + $smarty->assign("FILENAME_TEXT", ""); + $smarty->assign("FILENAME", ""); +} +else +{ + $smarty->assign("FILENAME_TEXT", "(".$focus->filename.")"); + $smarty->assign("FILENAME", $focus->filename); +} + +if (isset($focus->parent_type) && $focus->parent_type != "") { + $change_parent_button = ""; + $smarty->assign("CHANGE_PARENT_BUTTON", $change_parent_button); +} +if ($focus->parent_type == "Account") $smarty->assign("DEFAULT_SEARCH", "&query=true&account_id=$focus->parent_id&account_name=".urlencode($focus->parent_name)); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); + +$tabid = getTabid("Documents"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
'. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +if($focus->mode == 'edit') + $smarty->display("salesEditView.tpl"); +else + $smarty->display("CreateView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/EmailFile.php b/oss/vtiger/trunk/modules/Documents/EmailFile.php new file mode 100644 index 00000000..a56952be --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/EmailFile.php @@ -0,0 +1,38 @@ +pquery($dbQuery,array($notesid)); +$folderid = $adb->query_result($result,0,'folderid'); +$filename = $adb->query_result($result,0,'filename'); + +$fileidQuery = "select attachmentsid from vtiger_seattachmentsrel where crmid = ?"; +$fileidRes = $adb->pquery($fileidQuery,array($notesid)); +$fileid = $adb->query_result($fileidRes,0,'attachmentsid'); + +$pathQuery = $adb->pquery("select path from vtiger_attachments where attachmentsid = ?",array($fileid)); +$filepath = $adb->query_result($pathQuery,0,'path'); + +$fileinattachments = $root_directory.$filepath.$fileid.'_'.$filename; +if(!file($fileinattachments))$fileinattachments = $root_directory.$filepath.$fileid."_".$filename; + +$newfileinstorage = $root_directory."/storage/$fileid-".$filename; + +copy($fileinattachments,$newfileinstorage); + +echo ""; +exit(); +?> diff --git a/oss/vtiger/trunk/modules/Documents/ExportRecords.php b/oss/vtiger/trunk/modules/Documents/ExportRecords.php new file mode 100644 index 00000000..bc9a872a --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/ExportRecords.php @@ -0,0 +1,14 @@ + + diff --git a/oss/vtiger/trunk/modules/Documents/ListView.php b/oss/vtiger/trunk/modules/Documents/ListView.php new file mode 100644 index 00000000..82c6a708 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/ListView.php @@ -0,0 +1,311 @@ +sorder = $sorder; + $modObj->sortby = $order_by; + $_SESSION['lvs'][$currentModule] = get_object_vars($modObj); +} + +//<<<>>>>>> +$oCustomView = new CustomView("Documents"); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); +//<<<<>>>> +if (!isset($where)) $where = ""; +$url_string = ''; // assigning http url string + +$focus = new Documents(); +// Initialize sort by fields +$focus->initSortbyField('Documents'); +// END +$smarty = new vtigerCRM_Smarty; +$other_text = Array(); + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR","The User does not have permission to delete ".$errormsg." ".$currentModule); +}else +{ + $smarty->assign("ERROR",""); +} +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION['NOTES_ORDER_BY'] = $order_by; +$_SESSION['NOTES_SORT_ORDER'] = $sorder; +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> + + +if(isset($_REQUEST['query']) && $_REQUEST['query'] == 'true') +{ + list($where, $ustring) = split("#@@#",getWhereCondition($currentModule)); + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); + +} +if(isPermitted('Documents','Delete','') == 'yes') +{ + $smarty->assign("MASS_DELETE","yes"); + $other_text['del'] = $app_strings['LBL_MASS_DELETE']; +} + +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} + +//Added to handle approving or denying status-public by the admin in CustomView +$statusdetails = $oCustomView->isPermittedChangeStatus($viewnamedesc['status']); +$smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + +//To check if a user is able to edit/delete a customview +$edit_permit = $oCustomView->isPermittedCustomView($viewid,'EditView',$currentModule); +$delete_permit = $oCustomView->isPermittedCustomView($viewid,'Delete',$currentModule); +$smarty->assign("CV_EDIT_PERMIT",$edit_permit); +$smarty->assign("CV_DELETE_PERMIT",$delete_permit); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Document'); +$smarty->assign("BUTTONS",$other_text); +$smarty->assign("CATEGORY",$category); + +//Retreive the list from Database +//<<<<<<<<>>>>>>>> +if($viewid != 0) +{ + $listquery = getListQuery("Documents"); + $query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"Documents"); +}else +{ + $query = getListQuery("Documents"); +} +//<<<<<<<>>>>>>>> + +$hide_empty_folders = 'no'; + +if(isset($where) && $where != '') +{ + $query .= ' and '.$where; + $_SESSION['export_where'] = $where; +} +else + unset($_SESSION['export_where']); + +$focus->query = $query; + +if($viewid ==0) +{ + echo "
"; + echo "
+ + + + + + + + + +
$app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; +} + +//Retreive the List View Table Header +if($viewid !='') +$url_string .="&viewname=".$viewid; + +$listview_header = getListViewHeader($focus,"Documents",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); +$listview_header_search = getSearchListHeaderValues($focus,"Documents",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER",$listview_header_search); + +$smarty->assign("SELECT_SCRIPT", $view_script); + +$start = Array(); +$request_folderid = ''; + +if($_REQUEST['action'] == 'DocumentsAjax' && isset($_REQUEST['folderid'])) +{ + $request_folderid = vtlib_purify($_REQUEST['folderid']); + $start[$request_folderid] = vtlib_purify($_REQUEST['start']); +} +$focus->del_create_def_folder($focus->query); + +$dbQuery = "select * from vtiger_attachmentsfolder"; +$result = $adb->pquery($dbQuery,array()); +$foldercount = $adb->num_rows($result); +$folders = Array(); +$emptyfolders = Array(); +if($foldercount > 0 ) +{ + for($i=0;$i<$foldercount;$i++) + { + $query = ''; + $displayFolder=''; + $query = $focus->query; + $list_query = ''; + $list_query = $focus->query; + $folder_id = $adb->query_result($result,$i,"folderid"); + $query .= " and vtiger_notes.folderid = $folder_id"; + if($folder_id != $request_folderid) + { + $start[$folder_id] = 1; + } + + + if(isset($order_by) && $order_by != '') + { + $tablename = getTableNameForField('Documents',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + + if( $adb->dbType == "pgsql") + { + $query .= ' GROUP BY '.$tablename.$order_by; + $list_query .= ' GROUP BY '.$tablename.$order_by; + $focus->additional_query .= ' GROUP BY '.$tablename.$order_by; + } + + $query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; + $list_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; + $focus->additional_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; + } + //Retreiving the no of rows + $count_result = $adb->query( mkCountQuery( $query)); + $num_records = $adb->query_result($count_result,0,"count"); + if($num_records > 0){ + $displayFolder=true; + } + //navigation start + $max_entries_per_page = $list_max_entries_per_page; + //Postgres 8 fixes + if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $query, $log, 0); + + if($folder_id == $request_folderid){ + $start[$folder_id] = 1; + if(!empty($_REQUEST['start'])){ + $start[$folder_id] = ListViewSession::getRequestStartPage(); + if($start[$folder_id] == 'last'){ + if($num_records > 0){ + $start[$folder_id] = ceil($num_records/$max_entries_per_page); + } + } + if(!is_numeric($start[$folder_id])){ + $start[$folder_id] = 1; + } + } + } + + $navigation_array = VT_getSimpleNavigationValues($start[$folder_id],$max_entries_per_page,$num_records); + if($folder_id == $request_folderid){ + if(!is_array($_SESSION['lvs'][$currentModule]['start'])){ + $_SESSION['lvs'][$currentModule]['start'] = array(); + } + $_SESSION['lvs'][$currentModule]['start'][$folder_id] = $start[$folder_id]; + } + $limit_start_rec = ($start[$folder_id]-1) * $max_entries_per_page; + + if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($query. " OFFSET $limit_start_rec LIMIT $max_entries_per_page", array()); + else + $list_result = $adb->pquery($query. " LIMIT $limit_start_rec, $max_entries_per_page", array()); + //navigation end + + $folder_details=Array(); + $folderid = $adb->query_result($result,$i,"folderid"); + $folder_details['folderid']=$folderid; + $folder_details['foldername']=$adb->query_result($result,$i,"foldername"); + $foldername = $folder_details['foldername']; + $folder_details['description']=$adb->query_result($result,$i,"description"); + $folder_files = getListViewEntries($focus,"Documents",$list_result,$navigation_array,"","","EditView","Delete",$oCustomView); + $folder_details['entries']= $folder_files; + $folder_details['navigation'] = getTableHeaderSimpleNavigation($navigation_array, $url_string,"Documents",$folder_id,$viewid); + $folder_details['recordListRange'] = getRecordRangeMessage($list_result, $limit_start_rec); + if ($displayFolder == true) { + $folders[$foldername] = $folder_details; + } else{ + $emptyfolders[$foldername] = $folder_details; + } + if ($folderid == 1) $default_folder_details = $folder_details; + } + if (count($folders) == 0) $folders[$default_folder_details['foldername']] = $default_folder_details; +} +else +{ + $smarty->assign("NO_FOLDERS","yes"); +} + +$smarty->assign("NO_OF_FOLDERS",$foldercount); +$smarty->assign("FOLDERS", $folders); +$smarty->assign("EMPTY_FOLDERS", $emptyfolders); +$smarty->assign("ALL_FOLDERS", array_merge($folders, $emptyfolders)); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); + +$alphabetical = AlphabeticalSearch($currentModule,'index','notes_title','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($module); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("RECORD_COUNTS", $record_string); +if($current_user->id == 1) + $smarty->assign("IS_ADMIN","on"); +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '' || $_REQUEST['mode'] == 'ajax') + $smarty->display("DocumentsListViewEntries.tpl"); +else + $smarty->display("DocumentsListView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/ListViewPagging.php b/oss/vtiger/trunk/modules/Documents/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/MoveFile.php b/oss/vtiger/trunk/modules/Documents/MoveFile.php new file mode 100644 index 00000000..a3cc7838 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/MoveFile.php @@ -0,0 +1,46 @@ +is_admin != 'on') +{ + echo 'NOT_PERMITTED'; + die; +} +else +{ + $new_folderid = $_REQUEST['folderid']; + + if(isset($_REQUEST['idlist']) && $_REQUEST['idlist']!= '') + { + $id_array = Array(); + $id_array = explode(';',$_REQUEST['idlist']); + for($i = 0;$i < count($id_array)-1;$i++) + { + ChangeFolder($id_array[$i],$new_folderid); + } + header("Location: index.php?action=DocumentsAjax&file=ListView&mode=ajax&module=Documents"); + } +} + +/** To Change the Documents to another folder + * @param $recordid -- The file id + * @param $new_folderid -- The folderid to which the file to be moved + * @returns nothing + */ +function ChangeFolder($recordid,$new_folderid) +{ + global $adb; + $sql="update vtiger_notes set folderid=".$new_folderid." where notesid in (".$recordid.")"; + $res=$adb->pquery($sql,array()); +} +?> diff --git a/oss/vtiger/trunk/modules/Documents/Popup.php b/oss/vtiger/trunk/modules/Documents/Popup.php new file mode 100644 index 00000000..98ea8ece --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/Popup.php @@ -0,0 +1,23 @@ + diff --git a/oss/vtiger/trunk/modules/Documents/QuickCreate.php b/oss/vtiger/trunk/modules/Documents/QuickCreate.php new file mode 100644 index 00000000..8d5998b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/QuickCreate.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Documents/Save.php b/oss/vtiger/trunk/modules/Documents/Save.php new file mode 100644 index 00000000..3f81c581 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/Save.php @@ -0,0 +1,64 @@ +date_due_flag = 'off'; + +if(isset($_REQUEST['parentid']) && $_REQUEST['parentid'] != '') + $focus->parentid = $_REQUEST['parentid']; +if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} +//Save the Document + +$focus->save($currentModule); + +$return_id = $focus->id; +$note_id = $return_id; + +$parenttab = getParentTab(); +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "Documents"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + + +$local_log->debug("Saved record with id of ".$return_id); + +//Redirect to EditView if the given file is not valid. +if($file_upload_error) +{ + $return_module = 'Documents'; + $return_action = 'EditView'; + $return_id = $note_id.'&upload_error=true&return_module='.$return_module.'&return_action='.$return_action.'&return_id='.$return_id; +} + +//code added for returning back to the current view after edit from list view +if($_REQUEST['return_viewname'] == '') $return_viewname='0'; +if($_REQUEST['return_viewname'] != '')$return_viewname=vtlib_purify($_REQUEST['return_viewname']); +header("Location: index.php?action=$return_action&module=$return_module&parenttab=$parenttab&record=$return_id&viewname=$return_viewname&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/SaveFile.php b/oss/vtiger/trunk/modules/Documents/SaveFile.php new file mode 100644 index 00000000..ae22aa84 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/SaveFile.php @@ -0,0 +1,74 @@ +query_result($adb->pquery($sql,array($file_id)),0,'filedownloadcount') + 1; + $sql="update vtiger_notes set filedownloadcount= ? where notesid= ?"; + $res=$adb->pquery($sql,array($download_count,$file_id)); +} + +if(isset($_REQUEST['act']) && $_REQUEST['act'] == 'checkFileIntegrityDetailView') +{ + global $adb,$root_directory; + $dbQuery = "SELECT * FROM vtiger_notes where notesid= ?"; + $fileidQuery = "select attachmentsid from vtiger_seattachmentsrel where crmid = ? "; + $result = $adb->pquery($dbQuery,array($_REQUEST['noteid'])); + $fileidResult = $adb->pquery($fileidQuery,array($_REQUEST['noteid'])); + //$activeToinactive_count = 0; + + $file_status = $adb->query_result($result,0,"filestatus"); + $download_type = $adb->query_result($result,0,"filelocationtype"); + $notesid = $adb->query_result($result,0,'notesid'); + $fileid = $adb->query_result($fileidResult,0,"attachmentsid"); + $folderid = $adb->query_result($result,0,"folderid"); + $name = $adb->query_result($result,0,"filename"); + + if($download_type == 'I'){ + $saved_filename = $fileid."_".$name; + $pathQuery = $adb->pquery("select path from vtiger_attachments where attachmentsid = ?",array($fileid)); + $filepath = $adb->query_result($pathQuery,0,'path'); + + } + elseif($download_type == 'E'){ + $saved_filename = $name; + } + else + $saved_filename = ''; + + + if(!fopen($filepath.$saved_filename, "r")) + { + if($file_status == 1) + { + $dbQuery1 = "update vtiger_notes set filestatus = 0 where notesid= ?"; + $result1 = $adb->pquery($dbQuery1,array($notesid)); + echo "lost_integrity"; + } + else + echo "file_not_available"; + }else { + echo "file_available"; + } + +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/SaveFolder.php b/oss/vtiger/trunk/modules/Documents/SaveFolder.php new file mode 100644 index 00000000..916b2ba4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/SaveFolder.php @@ -0,0 +1,84 @@ +query_result($adb->pquery($sqlfid,$params),0,'max(folderid)')+1; + $params=array(); + $sqlseq="select max(sequence) from vtiger_attachmentsfolder"; + $sequence=$adb->query_result($adb->pquery($sqlseq,$params),0,'max(sequence)')+1; + $params=array(); + $dbQuery="select * from vtiger_attachmentsfolder"; + $result1=$adb->pquery($dbQuery,array()); + $flag=0; + for($i=0;$i<$adb->num_rows($result1);$i++) + { + $dbfldrname=$adb->query_result($result1,$i,'foldername'); + if($dbfldrname == $foldername) + $flag = 1; + } + if($flag == 0) + { + $sql="insert into vtiger_attachmentsfolder (folderid,foldername,description,createdby,sequence)values ($fid,'".$foldername."','".$folderdesc."',".$current_user->id.",$sequence)"; + $result=$adb->pquery($sql,$params); + if(!$result) + { + echo "Failure"; + } + else + header("Location: index.php?action=DocumentsAjax&file=ListView&mode=ajax&module=Documents"); + } + elseif($flag == 1) + echo "DUPLICATE_FOLDERNAME"; + } + elseif($folderid != "") + { + $dbQuery="select * from vtiger_attachmentsfolder"; + $result1=$adb->pquery($dbQuery,array()); + $flag=0; + for($i=0;$i<$adb->num_rows($result1);$i++) + { + $dbfldrname=$adb->query_result($result1,$i,'foldername'); + if($dbfldrname == $foldername) + $flag = 1; + } + if($flag == 0) + { + $sql="update vtiger_attachmentsfolder set foldername= ? where folderid= ? "; + $result=$adb->pquery($sql,array($foldername,$folderid)); + if(!$result) + { + echo "Failure"; + } + else + echo 'Success'; + } + elseif($flag == 1) + echo "DUPLICATE_FOLDERNAME"; + } + } + +?> diff --git a/oss/vtiger/trunk/modules/Documents/Settings.php b/oss/vtiger/trunk/modules/Documents/Settings.php new file mode 100644 index 00000000..48a80c0b --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/Settings.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/TagCloud.php b/oss/vtiger/trunk/modules/Documents/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Documents/UnifiedSearch.php b/oss/vtiger/trunk/modules/Documents/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Documents/index.php b/oss/vtiger/trunk/modules/Documents/index.php new file mode 100644 index 00000000..3ff42ab5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/index.php @@ -0,0 +1,26 @@ + diff --git a/oss/vtiger/trunk/modules/Documents/language/en_us.lang.php b/oss/vtiger/trunk/modules/Documents/language/en_us.lang.php new file mode 100644 index 00000000..be697932 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/language/en_us.lang.php @@ -0,0 +1,138 @@ +'Documents', +'LBL_MODULE_TITLE'=>'Documents: Home', +'LBL_SEARCH_FORM_TITLE'=>'Document Search', +'LBL_LIST_FORM_TITLE'=>'Document List', +'LBL_NEW_FORM_TITLE'=>'New Document', + +'LBL_LIST_SUBJECT'=>'Subject', +'LBL_LIST_CONTACT_NAME'=>'Contact Name', +'LBL_LIST_RELATED_TO'=>'Related To', +'LBL_LIST_DATE_MODIFIED'=>'Last Modified', + +'LBL_NOTE'=>'Document:', +'LBL_NOTE_SUBJECT'=>'Document Subject:', +'LBL_CONTACT_NAME'=>'Contact Name:', +'LBL_PHONE'=>'Phone:', +'LBL_SUBJECT'=>'Subject:', +'LBL_CLOSE'=>'Close:', +'LBL_RELATED_TO'=>'Related To:', +'LBL_EMAIL_ADDRESS'=>'Email Address:', +'LBL_COLON'=>':', + +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", +'LBL_LIST_FILENAME'=>"File Name", + +// Added for Note(3.2-patch 3) + +'LBL_FILENAME'=>'Attachment:', +'LBL_NOTE_INFORMATION'=>'Basic Information', +'File Information'=>'File Information', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Documents Tools', +// Added for 4GA +'Contact Name'=>'Contact Name', +'Related To'=>'Related to', +'Subject'=>'Subject', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Document'=>'Document', +'Note'=>'Notes', +//Added for 4.2 Release -- CustomView +'Related to'=>'Related to', +'Last Modified'=>'Last Modified', +'File'=>'File', +'LBL_ALL'=>'All', +'Title'=>'Title', + +//Added after 504 for Downloads Module +'LBL_FILE_INFORMATION'=>'File Information', +'LBL_FILE_NAME'=>'File Name', +'LBL_FILE_TYPE'=>'File Type', +'LBL_FILE_SIZE'=>'Size', +'filelocationtype'=>'Download Type', +'fileversion'=>'Version', +'filestatus'=>'Active', +'filedownloadcount'=>'Download Count', +'os'=>'Platform', +'LBL_FOLDER_NAME'=>'Folder Name', +'LBL_DOWNLOAD_TYPE'=>'Download Type', +'LBL_INTERNAL'=>'Internal', +'LBL_EXTERNAL'=>'External', +'LBL_EXTERNAL_FILE_NAME'=>'File Name', +'LBL_FILE_LOCATION'=>'File Location', +'LBL_PD'=>'Platform Dependent', +'LBL_PIND'=>'Platform Independent', +'ChoosePlatform'=>'Choose Platform', +'LBL_ACTIVE'=>'Active', +'LBL_INACTIVE'=>'Inactive', +'LBL_UPLOAD_BUTTON'=>'Upload', +'architecture'=>'Architecture', +'LBL_DOWNLOAD_FILE'=>'Download file', +'LBL_CHECK_INTEGRITY'=>'Check file integrity', +'LBL_EMAIL_FILE'=>'Email file as attachment', +'LBL_CLICK_HERE'=>'Click here', +'LBL_TO_ADD_FOLDER'=>'to add a new folder.', +'LBL_DELETE_FOLDER'=>'Delete Folder', +'LBL_FOLDER_DESC'=>'Description', +'LBL_ADD_NEW_FOLDER'=>'Add Folder', +'LBL_DELETE_DOCUMENTS'=>'Delete Document(s)', +'LBL_MOVE_TO'=>'Move to', +'File Name'=>'File Name', +'File Type'=>'File Type', +'File Size'=>'Size', +'LBL_INTERNAL'=>'Internal', +'LBL_URL'=>'URL', +'LBL_EXTERNAL'=>'External', +'LBL_EXTERNAL_LNK'=>'External Link', +'LBL_ACTIVE'=>'Active', +'LBL_INACTIVE'=>'Inactive', +'LBL_PLATFORM_INDEPENDENT'=>'Platform Independent', +'LNK_DOWNLOAD'=>'download', +'LBL_MOVE_DOCUMENTS'=>'Move Document(s)', +'LBL_MOVE'=>'Move', +'Download Type'=>'Download Type', +'Version'=>'Version', +'Active'=>'Active', +'Download Count'=>'Download Count', +'Platform'=>'Platform', +'Assigned To'=>'Assigned To', +// Module Sequence Numbering +'Note No' => 'Document No', +// END + +// Documents module +'LBL_EMPTY_FOLDERS' => 'Empty Folders', +'LBL_VIEW_EMPTY_FOLDERS' => 'View Empty Folders', +'LBL_NO_DOCUMENTS' => 'No Documents', +'LBL_DESCRIPTION' => 'Description', +'FILE_HAS_NO_DATA'=>'The selected file has no data or a invalid file', + +'LBL_MAXIMUM_20'=>'Maximum 20', +'LBL_MAXIMUM_50'=>'Maximum 50', +); + +?> diff --git a/oss/vtiger/trunk/modules/Documents/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Documents/language/zh_cn.lang.php new file mode 100644 index 00000000..be697932 --- /dev/null +++ b/oss/vtiger/trunk/modules/Documents/language/zh_cn.lang.php @@ -0,0 +1,138 @@ +'Documents', +'LBL_MODULE_TITLE'=>'Documents: Home', +'LBL_SEARCH_FORM_TITLE'=>'Document Search', +'LBL_LIST_FORM_TITLE'=>'Document List', +'LBL_NEW_FORM_TITLE'=>'New Document', + +'LBL_LIST_SUBJECT'=>'Subject', +'LBL_LIST_CONTACT_NAME'=>'Contact Name', +'LBL_LIST_RELATED_TO'=>'Related To', +'LBL_LIST_DATE_MODIFIED'=>'Last Modified', + +'LBL_NOTE'=>'Document:', +'LBL_NOTE_SUBJECT'=>'Document Subject:', +'LBL_CONTACT_NAME'=>'Contact Name:', +'LBL_PHONE'=>'Phone:', +'LBL_SUBJECT'=>'Subject:', +'LBL_CLOSE'=>'Close:', +'LBL_RELATED_TO'=>'Related To:', +'LBL_EMAIL_ADDRESS'=>'Email Address:', +'LBL_COLON'=>':', + +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", +'LBL_LIST_FILENAME'=>"File Name", + +// Added for Note(3.2-patch 3) + +'LBL_FILENAME'=>'Attachment:', +'LBL_NOTE_INFORMATION'=>'Basic Information', +'File Information'=>'File Information', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Documents Tools', +// Added for 4GA +'Contact Name'=>'Contact Name', +'Related To'=>'Related to', +'Subject'=>'Subject', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Document'=>'Document', +'Note'=>'Notes', +//Added for 4.2 Release -- CustomView +'Related to'=>'Related to', +'Last Modified'=>'Last Modified', +'File'=>'File', +'LBL_ALL'=>'All', +'Title'=>'Title', + +//Added after 504 for Downloads Module +'LBL_FILE_INFORMATION'=>'File Information', +'LBL_FILE_NAME'=>'File Name', +'LBL_FILE_TYPE'=>'File Type', +'LBL_FILE_SIZE'=>'Size', +'filelocationtype'=>'Download Type', +'fileversion'=>'Version', +'filestatus'=>'Active', +'filedownloadcount'=>'Download Count', +'os'=>'Platform', +'LBL_FOLDER_NAME'=>'Folder Name', +'LBL_DOWNLOAD_TYPE'=>'Download Type', +'LBL_INTERNAL'=>'Internal', +'LBL_EXTERNAL'=>'External', +'LBL_EXTERNAL_FILE_NAME'=>'File Name', +'LBL_FILE_LOCATION'=>'File Location', +'LBL_PD'=>'Platform Dependent', +'LBL_PIND'=>'Platform Independent', +'ChoosePlatform'=>'Choose Platform', +'LBL_ACTIVE'=>'Active', +'LBL_INACTIVE'=>'Inactive', +'LBL_UPLOAD_BUTTON'=>'Upload', +'architecture'=>'Architecture', +'LBL_DOWNLOAD_FILE'=>'Download file', +'LBL_CHECK_INTEGRITY'=>'Check file integrity', +'LBL_EMAIL_FILE'=>'Email file as attachment', +'LBL_CLICK_HERE'=>'Click here', +'LBL_TO_ADD_FOLDER'=>'to add a new folder.', +'LBL_DELETE_FOLDER'=>'Delete Folder', +'LBL_FOLDER_DESC'=>'Description', +'LBL_ADD_NEW_FOLDER'=>'Add Folder', +'LBL_DELETE_DOCUMENTS'=>'Delete Document(s)', +'LBL_MOVE_TO'=>'Move to', +'File Name'=>'File Name', +'File Type'=>'File Type', +'File Size'=>'Size', +'LBL_INTERNAL'=>'Internal', +'LBL_URL'=>'URL', +'LBL_EXTERNAL'=>'External', +'LBL_EXTERNAL_LNK'=>'External Link', +'LBL_ACTIVE'=>'Active', +'LBL_INACTIVE'=>'Inactive', +'LBL_PLATFORM_INDEPENDENT'=>'Platform Independent', +'LNK_DOWNLOAD'=>'download', +'LBL_MOVE_DOCUMENTS'=>'Move Document(s)', +'LBL_MOVE'=>'Move', +'Download Type'=>'Download Type', +'Version'=>'Version', +'Active'=>'Active', +'Download Count'=>'Download Count', +'Platform'=>'Platform', +'Assigned To'=>'Assigned To', +// Module Sequence Numbering +'Note No' => 'Document No', +// END + +// Documents module +'LBL_EMPTY_FOLDERS' => 'Empty Folders', +'LBL_VIEW_EMPTY_FOLDERS' => 'View Empty Folders', +'LBL_NO_DOCUMENTS' => 'No Documents', +'LBL_DESCRIPTION' => 'Description', +'FILE_HAS_NO_DATA'=>'The selected file has no data or a invalid file', + +'LBL_MAXIMUM_20'=>'Maximum 20', +'LBL_MAXIMUM_50'=>'Maximum 50', +); + +?> diff --git a/oss/vtiger/trunk/modules/Emails/CallRelatedList.php b/oss/vtiger/trunk/modules/Emails/CallRelatedList.php new file mode 100644 index 00000000..dfe47baa --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/CallRelatedList.php @@ -0,0 +1,56 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['subject']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); +} + +global $mod_strings; +global $app_strings; +global $currentModule; +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty = new vtigerCRM_Smarty; + +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); +$related_array=getRelatedLists($currentModule,$focus); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); +if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); +} +$smarty->assign("id",$focus->id); +$smarty->assign("RELATEDLISTS", $related_array); +$smarty->assign("ID",$RECORD ); +$smarty->assign("MODULE",$currentmodule); +$smarty->assign("SINGLE_MOD",$app_strings['Email']); +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); +$smarty->assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$smarty->display("RelatedLists.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/Choose.php b/oss/vtiger/trunk/modules/Emails/Choose.php new file mode 100644 index 00000000..98605f85 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/Choose.php @@ -0,0 +1,82 @@ +pquery($querystr, array()); +$numrows = $adb->num_rows($result); + +?> +
+ +

The following emails are available for the selected record. Please choose the ones you would like to use.

+
+ + query_result($result,$i,'columnname'); + $temp1=br2nl($myfocus->column_fields[$temp]); + echo ''; + } + ?> + + + +
'.$adb->query_result($result,$i,'fieldlabel').'    '.$temp1.'
+ +
+
diff --git a/oss/vtiger/trunk/modules/Emails/ChooseEmail.php b/oss/vtiger/trunk/modules/Emails/ChooseEmail.php new file mode 100644 index 00000000..5ef825c2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/ChooseEmail.php @@ -0,0 +1,106 @@ +pquery($querystr, array()); +$numrows = $adb->num_rows($result); + +if ($pmodule=='Accounts') +{ + require_once('modules/Accounts/Accounts.php'); + $myfocus = new Accounts(); + $myfocus->retrieve_entity_info($entityid,"Accounts"); +} +elseif ($pmodule=='Contacts') +{ + require_once('modules/Contacts/Contacts.php'); + $myfocus = new Contacts(); + $myfocus->retrieve_entity_info($entityid,"Contacts"); +} +elseif ($pmodule=='Leads') +{ + require_once('modules/Leads/Leads.php'); + $myfocus = new Leads(); + $myfocus->retrieve_entity_info($entityid,"Leads"); +} +?> + + +
+

The following emails are available for the selected record. Please choose the ones you would like to use.

+
+ + query_result($result,$i,'columnname'); + $temp1=br2nl($myfocus->column_fields[$temp]); + echo ''; + } + ?> +
'.$adb->query_result($result,$i,'fieldlabel').'    '.$temp1.'
+ + +
+
diff --git a/oss/vtiger/trunk/modules/Emails/CustomView.php b/oss/vtiger/trunk/modules/Emails/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Emails/Delete.php b/oss/vtiger/trunk/modules/Emails/Delete.php new file mode 100644 index 00000000..b8e17de0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/Delete.php @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/DetailView.php b/oss/vtiger/trunk/modules/Emails/DetailView.php new file mode 100644 index 00000000..f159ffd5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/DetailView.php @@ -0,0 +1,159 @@ +retrieve_entity_info($_REQUEST['record'],"Emails"); + $log->info("Entity info successfully retrieved for DetailView."); + $focus->id = $_REQUEST['record']; + $query = 'select email_flag,from_email,to_email,cc_email,bcc_email from vtiger_emaildetails where emailid = ?'; + $result = $adb->pquery($query, array($focus->id)); + $smarty->assign('FROM_MAIL',$adb->query_result($result,0,'from_email')); + $to_email = $json->decode($adb->query_result($result,0,'to_email')); + $cc_email = $json->decode($adb->query_result($result,0,'cc_email')); + $smarty->assign('TO_MAIL',vt_suppressHTMLTags(@implode(',',$to_email))); + $smarty->assign('CC_MAIL',vt_suppressHTMLTags(@implode(',',$cc_email))); + $bcc_email = $json->decode($adb->query_result($result,0,'bcc_email')); + $smarty->assign('BCC_MAIL',vt_suppressHTMLTags(@implode(',',$bcc_email))); + $smarty->assign('EMAIL_FLAG',$adb->query_result($result,0,'email_flag')); + if($focus->column_fields['name'] != '') + $focus->name = $focus->column_fields['name']; + else + $focus->name = $focus->column_fields['subject']; +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; +} + +//needed when creating a new email with default values passed in +if (isset($_REQUEST['contact_name']) && is_null($focus->contact_name)) +{ + $focus->contact_name = $_REQUEST['contact_name']; +} +if (isset($_REQUEST['contact_id']) && is_null($focus->contact_id)) +{ + $focus->contact_id = $_REQUEST['contact_id']; +} +if (isset($_REQUEST['opportunity_name']) && is_null($focus->parent_name)) +{ + $focus->parent_name = $_REQUEST['opportunity_name']; +} +if (isset($_REQUEST['opportunity_id']) && is_null($focus->parent_id)) +{ + $focus->parent_id = $_REQUEST['opportunity_id']; +} +if (isset($_REQUEST['account_name']) && is_null($focus->parent_name)) +{ + $focus->parent_name = $_REQUEST['account_name']; +} +if (isset($_REQUEST['account_id']) && is_null($focus->parent_id)) +{ + $focus->parent_id = $_REQUEST['account_id']; +} +if (isset($_REQUEST['parent_name'])) +{ + $focus->parent_name = $_REQUEST['parent_name']; +} +if (isset($_REQUEST['parent_id'])) +{ + $focus->parent_id = $_REQUEST['parent_id']; +} +if (isset($_REQUEST['parent_type'])) +{ + $focus->parent_type = $_REQUEST['parent_type']; +} +if (isset($_REQUEST['filename']) && is_null($focus->filename)) +{ + $focus->filename = $_REQUEST['filename']; +} +elseif (is_null($focus->parent_type)) +{ + $focus->parent_type = $app_list_strings['record_type_default_key']; +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Email detail view"); + +$submenu = array('LBL_EMAILS_TITLE'=>'index.php?module=Emails&action=index','LBL_WEBMAILS_TITLE'=>'index.php?module=squirrelmail-1.4.4&action=redirect'); +$sec_arr = array('index.php?module=Emails&action=index'=>'Emails','index.php?module=squirrelmail-1.4.4&action=redirect'=>'Emails'); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); +if (isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if (isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if (isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); + else $smarty->assign("NAME", ""); + +$entries = getBlocks($currentModule,"detail_view",'',$focus->column_fields); +$entries[$mod_strings['LBL_EMAIL_INFORMATION']]['5'][$mod_strings['Description']]['value'] = from_html($entries[$mod_strings['LBL_EMAIL_INFORMATION']]['5'][$mod_strings['Description']]['value']); +//changed this to view description in all langauge - bharath +$smarty->assign("BLOCKS",$entries[$mod_strings['LBL_EMAIL_INFORMATION']]); +$smarty->assign("SINGLE_MOD", 'Email'); + +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +if(isPermitted("Emails","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +if(isPermitted("Emails","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); +$smarty->assign("ID",$focus->id); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +//Constructing the Related Lists from here +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SENDER",$email_id); +if($_REQUEST['mode'] != 'ajax') + $smarty->display("EmailDetailView.tpl"); +else + $smarty->display("EmailDetails.tpl") +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/EditView.php b/oss/vtiger/trunk/modules/Emails/EditView.php new file mode 100644 index 00000000..58714f31 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/EditView.php @@ -0,0 +1,355 @@ + The selected file has no data or a invalid file.
'; +} + +//Email Error handling +if($_REQUEST['mail_error'] != '') +{ + require_once("modules/Emails/mail.php"); + echo parseEmailErrorString($_REQUEST['mail_error']); +} +//added to select the module in combobox of compose-popup +if(isset($_REQUEST['par_module']) && $_REQUEST['par_module']!=''){ + $smarty->assign('select_module',vtlib_purify($_REQUEST['par_module'])); +} +elseif(isset($_REQUEST['pmodule']) && $_REQUEST['pmodule']!='') { + $smarty->assign('select_module',vtlib_purify($_REQUEST['pmodule'])); +} + +if(isset($_REQUEST['record']) && $_REQUEST['record'] !='') +{ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"Emails"); + $query = 'select idlists,from_email,to_email,cc_email,bcc_email from vtiger_emaildetails where emailid =?'; + $result = $adb->pquery($query, array($focus->id)); + $from_email = $adb->query_result($result,0,'from_email'); + $smarty->assign('FROM_MAIL',$from_email); + $to_email = implode(',',$json->decode($adb->query_result($result,0,'to_email'))); + $smarty->assign('TO_MAIL',$to_email); + $cc_add = implode(',',$json->decode($adb->query_result($result,0,'cc_email'))); + $smarty->assign('CC_MAIL',$cc_add); + $bcc_add = implode(',',$json->decode($adb->query_result($result,0,'bcc_email'))); + $smarty->assign('BCC_MAIL',$bcc_add); + $idlist = $adb->query_result($result,0,'idlists'); + $smarty->assign('IDLISTS',$idlist); + $log->info("Entity info successfully retrieved for EditView."); + $focus->name=$focus->column_fields['name']; +} +elseif(isset($_REQUEST['sendmail']) && $_REQUEST['sendmail'] !='') +{ + + $mailids = get_to_emailids($_REQUEST['pmodule']); + if($mailids['mailds'] != '') + $to_add = trim($mailids['mailds'],",").","; + $smarty->assign('TO_MAIL',$to_add); + $smarty->assign('IDLISTS',$mailids['idlists']); + $focus->mode = ''; +} + +// INTERNAL MAILER +if($_REQUEST["internal_mailer"] == "true") { + $smarty->assign('INT_MAILER',"true"); + $rec_type = $_REQUEST["type"]; + $rec_id = $_REQUEST["rec_id"]; + $fieldname = $_REQUEST["fieldname"]; + + //added for getting list-ids to compose email popup from list view(Accounts,Contacts,Leads) + if(isset($_REQUEST['field_id']) && strlen($_REQUEST['field_id']) != 0) { + if($_REQUEST['par_module'] == "Users") + $id_list = $_REQUEST['rec_id'].'@'.'-1|'; + else + $id_list = $_REQUEST['rec_id'].'@'.$_REQUEST['field_id'].'|'; + $smarty->assign("IDLISTS", $id_list); + } + if($rec_type == "record_id") { + $type = $_REQUEST['par_module']; + //check added for email link in user detail view + $normal_tabs = Array('Users'=>'vtiger_users', 'Leads'=>'vtiger_leaddetails', 'Contacts'=>'vtiger_contactdetails', 'Accounts'=>'vtiger_account', 'Vendors'=>'vtiger_vendor'); + $cf_tabs = Array('Accounts'=>'vtiger_accountscf', 'Campaigns'=>'vtiger_campaignscf', 'Contacts'=>'vtiger_contactscf', 'Invoice'=>'vtiger_invoicecf', 'Leads'=>'vtiger_leadscf', 'Potentials'=>'vtiger_potentialscf', 'Products'=>'vtiger_productcf', 'PurchaseOrder'=>'vtiger_purchaseordercf', 'Quotes'=>'vtiger_quotescf', 'SalesOrder'=>'vtiger_salesordercf', 'HelpDesk'=>'vtiger_ticketcf', 'Vendors'=>'vtiger_vendorcf'); + if(substr($fieldname,0,2)=="cf") + $tablename = $cf_tabs[$type]; + else + $tablename = $normal_tabs[$type]; + if($type == "Users") + $q = "select $fieldname from $tablename where id=?"; + elseif($type == "Leads") + $q = "select $fieldname from $tablename where leadid=?"; + elseif ($type == "Contacts") + $q = "select $fieldname from $tablename where contactid=?"; + elseif ($type == "Accounts") + $q = "select $fieldname from $tablename where accountid=?"; + elseif ($type == "Vendors") + $q = "select $fieldname from $tablename where vendorid=?"; + else { + // vtlib customization: Support for email-type custom field for other modules. + $module_focus = CRMEntity::getInstance($type); + vtlib_setup_modulevars($type, $module_focus); + if(!empty($module_focus->customFieldTable)) { + $q = "select $fieldname from " . $module_focus->customFieldTable[0] . " where " . $module_focus->customFieldTable[1]. "= ?"; + } + // END + } + $email1 = $adb->query_result($adb->pquery($q, array($rec_id)),0,$fieldname); + } elseif ($rec_type == "email_addy") { + $email1 = $_REQUEST["email_addy"]; + } + + $smarty->assign('TO_MAIL',trim($email1,",").","); +} + +//handled for replying emails +if($_REQUEST['reply'] == "true") +{ + $fromadd = $_REQUEST['record']; + $query = "select from_email,idlists,cc_email,bcc_email from vtiger_emaildetails where emailid =?"; + $result = $adb->pquery($query, array($fromadd)); + $from_mail = $adb->query_result($result,0,'from_email'); + $smarty->assign('TO_MAIL',trim($from_mail,",").','); + $cc_add = implode(',',$json->decode($adb->query_result($result,0,'cc_email'))); + $smarty->assign('CC_MAIL',$cc_add); + $bcc_add = implode(',',$json->decode($adb->query_result($result,0,'bcc_email'))); + $smarty->assign('BCC_MAIL',$bcc_add); + $smarty->assign('IDLISTS',ereg_replace('###',',',$adb->query_result($result,0,'idlists'))); +} + +// Webmails +if(isset($_REQUEST["mailid"]) && $_REQUEST["mailid"] != "") { + $mailid = $_REQUEST["mailid"]; + $mailbox = $_REQUEST["mailbox"]; + require_once('include/utils/UserInfoUtil.php'); + require_once("modules/Webmails/Webmails.php"); + require_once("modules/Webmails/MailParse.php"); + require_once('modules/Webmails/MailBox.php'); + + $mailInfo = getMailServerInfo($current_user); + $temprow = $adb->fetch_array($mailInfo); + + $MailBox = new MailBox($mailbox); + $mbox = $MailBox->mbox; + + $webmail = new Webmails($mbox,$mailid); + $array_tab = Array(); + $webmail->loadMail($array_tab); + $hdr = @imap_headerinfo($mbox, $mailid); + $smarty->assign('WEBMAIL',"true"); + $smarty->assign('mailid',$mailid); + $smarty->assign('mailbox',$mailbox); + $temp_id = $MailBox->boxinfo['mail_id']; + $smarty->assign('from_add',$temp_id); + $webmail->subject = utf8_decode(utf8_encode(imap_utf8($webmail->subject))); + if($_REQUEST["reply"] == "all") { + $smarty->assign('TO_MAIL',$webmail->from.","); + //added to remove the emailid of webmail client from cc list....to fix the issue #3818 + $cc_address = ''; + + $use_to_header = htmlentities($webmail->to_header, ENT_QUOTES, $default_charset); + $use_cc_address= htmlentities($hdr->ccaddress, ENT_QUOTES, $default_charset); + + $cc_array = explode(',',$use_to_header.','.$use_cc_address); + for($i=0;$iassign('CC_MAIL',$cc_address); + // fix #3818 ends + /*if(is_array($webmail->cc_list)) + { + $smarty->assign('CC_MAIL',implode(",",$webmail->cc_list).",".implode(",",$webmail->to)); + } + else + { + //Commenting this to fix #3231 + // $smarty->assign('CC_MAIL',implode(",",$webmail->to)); + }*/ + if(preg_match("/RE:/i", $webmail->subject)) + $smarty->assign('SUBJECT',$webmail->subject); + else + $smarty->assign('SUBJECT',"RE: ".$webmail->subject); + + } elseif($_REQUEST["reply"] == "single"){ + $smarty->assign('TO_MAIL',$webmail->reply_to[0].","); + //$smarty->assign('BCC_MAIL',$webmail->to[0]); + if(preg_match("/RE:/i", $webmail->subject)) + $smarty->assign('SUBJECT',$webmail->subject); + else + $smarty->assign('SUBJECT',"RE: ".$webmail->subject); + + } elseif($_REQUEST["forward"] == "true" ) { + //added for attachment handling + $attachment_links = Array(); + for($i=0;$iattname);$i++){ + $attachment_links[$i] = $webmail->anchor_arr[$i].decode_header($webmail->attname[$i])."
"; + } + $smarty->assign('webmail_attachments',$attachment_links); + if(preg_match("/FW:/i", $webmail->subject)) + $smarty->assign('SUBJECT',$webmail->subject); + else + $smarty->assign('SUBJECT',"FW: ".$webmail->subject); + } + $smarty->assign('DESCRIPTION',$webmail->replyBody()); + $focus->mode=''; +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$disp_view = getView($focus->mode); +$details = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields); +//changed this below line to view description in all language - bharath +$smarty->assign("BLOCKS",$details[$mod_strings['LBL_EMAIL_INFORMATION']]); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",$app_strings['Email']); +//id list of attachments while forwarding +$smarty->assign("ATT_ID_LIST",$att_id_list); + +//needed when creating a new email with default values passed in +if (isset($_REQUEST['contact_name']) && is_null($focus->contact_name)) +{ + $focus->contact_name = $_REQUEST['contact_name']; +} +if (isset($_REQUEST['contact_id']) && is_null($focus->contact_id)) +{ + $focus->contact_id = $_REQUEST['contact_id']; +} +if (isset($_REQUEST['parent_name']) && is_null($focus->parent_name)) +{ + $focus->parent_name = $_REQUEST['parent_name']; +} +if (isset($_REQUEST['parent_id']) && is_null($focus->parent_id)) +{ + $focus->parent_id = $_REQUEST['parent_id']; +} +if (isset($_REQUEST['parent_type'])) +{ + $focus->parent_type = $_REQUEST['parent_type']; +} +if (isset($_REQUEST['filename']) && $_REQUEST['isDuplicate'] != 'true') +{ + $focus->filename = $_REQUEST['filename']; +} +elseif (is_null($focus->parent_type)) +{ + $focus->parent_type = $app_list_strings['record_type_default_key']; +} + +$log->info("Email detail view"); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); +else $smarty->assign("NAME", ""); + + +if($focus->mode == 'edit') +{ + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MODE", $focus->mode); +} + +// Unimplemented until jscalendar language vtiger_files are fixed + +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +else $smarty->assign("RETURN_MODULE",'Emails'); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +else $smarty->assign("RETURN_ACTION",'index'); +if(isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset($_REQUEST['return_viewname'])) $smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); +$smarty->assign("ENTITY_ID", vtlib_purify($_REQUEST["record"])); +$smarty->assign("ENTITY_TYPE",vtlib_purify($_REQUEST["email_directing_module"])); +$smarty->assign("OLD_ID", $old_id ); +//Display the FCKEditor or not? -- configure $FCKEDITOR_DISPLAY in config.php +$smarty->assign("FCKEDITOR_DISPLAY",$FCKEDITOR_DISPLAY); + +if(empty($focus->filename)) +{ + $smarty->assign("FILENAME_TEXT", ""); + $smarty->assign("FILENAME", ""); +} +else +{ + $smarty->assign("FILENAME_TEXT", "(".$focus->filename.")"); + $smarty->assign("FILENAME", $focus->filename); +} +if($ret_error == 1) { + require_once('modules/Webmails/MailBox.php'); + $smarty->assign("RET_ERROR",$ret_error); + if($ret_parentid != ''){ + $smarty->assign("IDLISTS",$ret_parentid); + } + if($ret_toadd != '') + $smarty->assign("TO_MAIL",$ret_toadd); + $ret_toadd = ''; + if($ret_subject != '') + $smarty->assign("SUBJECT",$ret_subject); + if($ret_ccaddress != '') + $smarty->assign("CC_MAIL",$ret_ccaddress); + if($ret_bccaddress != '') + $smarty->assign("BCC_MAIL",$ret_bccaddress); + if($ret_description != '') + $smarty->assign("DESCRIPTION", $ret_description); + $temp_obj = new MailBox($mailbox); + $temp_id = $temp_obj->boxinfo['mail_id']; + if($temp_id != '') + $smarty->assign('from_add',$temp_id); +} +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$smarty->display("ComposeEmail.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/Emails.js b/oss/vtiger/trunk/modules/Emails/Emails.js new file mode 100644 index 00000000..3401a48e --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/Emails.js @@ -0,0 +1,196 @@ +/********************************************************************************* + +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ********************************************************************************/ + +var gFolderid = 1; +var gselectedrowid = 0; +function gotoWebmail() +{ + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: "module=Webmails&action=WebmailsAjax&config_chk=true", + onComplete: function(response) { + if(response.responseText.indexOf('SUCCESS') > -1) + window.location.href = "index.php?module=Webmails&action=index&parenttab=My Home Page"; + else + $('mailconfchk').style.display = 'block'; + + } + } + ); + +} + +function getEmailContents(id) +{ + $("status").style.display="inline"; + var rowid = 'row_'+id; + getObj(rowid).className = 'emailSelected'; + if(gselectedrowid != 0 && gselectedrowid != id) + { + var prev_selected_rowid = 'row_'+gselectedrowid; + getObj(prev_selected_rowid).className = 'prvPrfHoverOff'; + } + gselectedrowid = id; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'module=Emails&action=EmailsAjax&file=DetailView&mode=ajax&record='+id, + onComplete: function(response) { + $("status").style.display="none"; + $("EmailDetails").innerHTML = response.responseText; + } + } + ); +} + +function getListViewEntries_js(module,url) +{ + $("status").style.display="inline"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: "module="+module+"&action="+module+"Ajax&file=ListView&ajax=true&"+url, + onComplete: function(response) { + $("status").style.display="none"; + $("email_con").innerHTML=response.responseText; + execJS(document.getElementById('email_con')); + } + } + ); + +} + +function massDelete() +{ + var delete_selected_row = false; + //added to fix the issue 4295 + var select_options = document.getElementsByName('selected_id'); + var x = select_options.length; + + idstring = ""; + xx = 0; + for(i = 0; i < x ; i++) + { + if(select_options[i].checked) + { + idstring = select_options[i].value +";"+idstring + if(select_options[i].value == gselectedrowid) + { + gselectedrowid = 0; + delete_selected_row = true; + } + xx++ + } + } + if (xx > 0) + { + document.massdelete.idlist.value=idstring; + } + else + { + alert(alert_arr.SELECT); + return false; + } + if(confirm(alert_arr.DELETE + xx + alert_arr.RECORDS)) + { + getObj('search_text').value = ''; + show("status"); + if(!delete_selected_row) + { + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: "module=Users&action=massdelete&folderid="+gFolderid+"&return_module=Emails&idlist="+idstring, + onComplete: function(response) { + $("status").style.display="none"; + $("email_con").innerHTML=response.responseText; + execJS(document.getElementById('email_con')); + } + } + ); + } + else + { + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: "module=Users&action=massdelete&folderid="+gFolderid+"&return_module=Emails&idlist="+idstring, + onComplete: function(response) { + $("status").style.display="none"; + $("email_con").innerHTML=response.responseText; + execJS($('email_con')); + $('EmailDetails').innerHTML = '
 
'; + $("subjectsetter").innerHTML=''; + } + } + ); + } + } + else + { + return false; + } +} + +function DeleteEmail(id) +{ + if(confirm(alert_arr.SURE_TO_DELETE)) + { + getObj('search_text').value = ''; + gselectedrowid = 0; + $("status").style.display="inline"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: "module=Users&action=massdelete&return_module=Emails&folderid="+gFolderid+"&idlist="+id, + onComplete: function(response) { + $("status").style.display="none"; + $("email_con").innerHTML=response.responseText; + execJS($('email_con')); + $('EmailDetails').innerHTML = '
 
'; + $("subjectsetter").innerHTML=''; + } + } + ); + } + else + { + return false; + } +} +function Searchfn() +{ + gselectedrowid = 0; + var osearch_field = document.getElementById('search_field'); + var search_field = osearch_field.options[osearch_field.options.selectedIndex].value; + var search_text = document.getElementById('search_text').value; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: "module=Emails&action=EmailsAjax&ajax=true&file=ListView&folderid="+gFolderid+"&search=true&search_field="+search_field+"&search_text="+search_text, + onComplete: function(response) { + $("email_con").innerHTML=response.responseText; + $("status").style.display="none"; + $('EmailDetails').innerHTML = '
 
'; + $("subjectsetter").innerHTML=''; + execJS($('email_con')); + } + } + ); +} + diff --git a/oss/vtiger/trunk/modules/Emails/Emails.php b/oss/vtiger/trunk/modules/Emails/Emails.php new file mode 100644 index 00000000..3d7c079e --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/Emails.php @@ -0,0 +1,690 @@ +'crmid','vtiger_activity'=>'activityid', + 'vtiger_seactivityrel'=>'activityid','vtiger_cntactivityrel'=>'activityid','vtiger_email_track'=>'mailid','vtiger_emaildetails'=>'emailid'); + + // This is the list of vtiger_fields that are in the lists. + var $list_fields = Array( + 'Subject'=>Array('activity'=>'subject'), + 'Related to'=>Array('seactivityrel'=>'parent_id'), + 'Date Sent'=>Array('activity'=>'date_start'), + 'Assigned To'=>Array('crmentity','smownerid'), + 'Access Count'=>Array('email_track','access_count') + ); + + var $list_fields_name = Array( + 'Subject'=>'subject', + 'Related to'=>'parent_id', + 'Date Sent'=>'date_start', + 'Assigned To'=>'assigned_user_id', + 'Access Count'=>'access_count' + ); + + var $list_link_field= 'subject'; + + var $column_fields = Array(); + + var $sortby_fields = Array('subject','date_start','saved_toid'); + + //Added these variables which are used as default order by and sortorder in ListView + var $default_order_by = 'date_start'; + var $default_sort_order = 'ASC'; + + // Used when enabling/disabling the mandatory fields for the module. + // Refers to vtiger_field.fieldname values. + var $mandatory_fields = Array('subject','assigned_user_id'); + + /** This function will set the columnfields for Email module + */ + + function Emails() { + $this->log = LoggerManager::getLogger('email'); + $this->log->debug("Entering Emails() method ..."); + $this->log = LoggerManager::getLogger('email'); + $this->db = PearDatabase::getInstance(); + $this->column_fields = getColumnFields('Emails'); + $this->log->debug("Exiting Email method ..."); + } + + + function save_module($module) + { + global $adb; + //Inserting into seactivityrel + + //modified by Richie as raju's implementation broke the feature for addition of webmail to vtiger_crmentity.need to be more careful in future while integrating code + if($_REQUEST['module']=="Emails" && $_REQUEST['smodule']!='webmails' && (!$this->plugin_save)) + { + if($_REQUEST['currentid']!='') + { + $actid=$_REQUEST['currentid']; + } + else + { + $actid=$_REQUEST['record']; + } + $parentid=$_REQUEST['parent_id']; + if($_REQUEST['module'] != 'Emails' && $_REQUEST['module'] != 'Webmails') + { + if(!$parentid) { + $parentid = $adb->getUniqueID('vtiger_seactivityrel'); + } + $mysql='insert into vtiger_seactivityrel values(?,?)'; + $adb->pquery($mysql, array($parentid, $actid)); + } + else + { + $myids=explode("|",$parentid); //2@71| + for ($i=0;$i<(count($myids)-1);$i++) + { + $realid=explode("@",$myids[$i]); + $mycrmid=$realid[0]; + //added to handle the relationship of emails with vtiger_users + if($realid[1] == -1) + { + $del_q = 'delete from vtiger_salesmanactivityrel where smid=? and activityid=?'; + $adb->pquery($del_q,array($mycrmid, $actid)); + $mysql='insert into vtiger_salesmanactivityrel values(?,?)'; + } + else + { + $del_q = 'delete from vtiger_seactivityrel where crmid=? and activityid=?'; + $adb->pquery($del_q,array($mycrmid, $actid)); + $mysql='insert into vtiger_seactivityrel values(?,?)'; + } + $params = array($mycrmid, $actid); + $adb->pquery($mysql, $params); + } + } + } + else + { + if(isset($this->column_fields['parent_id']) && $this->column_fields['parent_id'] != '') + { + $this->insertIntoEntityTable('vtiger_seactivityrel', $module); + } + elseif($this->column_fields['parent_id']=='' && $insertion_mode=="edit") + { + $this->deleteRelation('vtiger_seactivityrel'); + } + } + + + //Insert into cntactivity rel + + if(isset($this->column_fields['contact_id']) && $this->column_fields['contact_id'] != '') + { + $this->insertIntoEntityTable('vtiger_cntactivityrel', $module); + } + elseif($this->column_fields['contact_id'] =='' && $insertion_mode=="edit") + { + $this->deleteRelation('vtiger_cntactivityrel'); + } + + //Inserting into attachment + + $this->insertIntoAttachment($this->id,$module); + + } + + + function insertIntoAttachment($id,$module) + { + global $log, $adb; + $log->debug("Entering into insertIntoAttachment($id,$module) method."); + + $file_saved = false; + + //Added to send generated Invoice PDF with mail + $pdfAttached = $_REQUEST['pdf_attachment']; + //created Invoice pdf is attached with the mail + if(isset($_REQUEST['pdf_attachment']) && $_REQUEST['pdf_attachment'] !='') + { + $file_saved = pdfAttach($this,$module,$pdfAttached,$id); + } + + //This is to added to store the existing attachment id of the contact where we should delete this when we give new image + foreach($_FILES as $fileindex => $files) + { + if($files['name'] != '' && $files['size'] > 0) + { + $files['original_name'] = vtlib_purify($_REQUEST[$fileindex.'_hidden']); + $file_saved = $this->uploadAndSaveFile($id,$module,$files); + } + } + if($module == 'Emails' && isset($_REQUEST['att_id_list']) && $_REQUEST['att_id_list'] != '') + { + $att_lists = explode(";",$_REQUEST['att_id_list'],-1); + $id_cnt = count($att_lists); + if($id_cnt != 0) + { + for($i=0;$i<$id_cnt;$i++) + { + $sql_rel='insert into vtiger_seattachmentsrel values(?,?)'; + $adb->pquery($sql_rel, array($id, $att_lists[$i])); + } + } + } + if($_REQUEST['att_module'] == 'Webmails') + { + require_once("modules/Webmails/Webmails.php"); + require_once("modules/Webmails/MailParse.php"); + require_once('modules/Webmails/MailBox.php'); + //$mailInfo = getMailServerInfo($current_user); + //$temprow = $adb->fetch_array($mailInfo); + + $MailBox = new MailBox($_REQUEST["mailbox"]); + $mbox = $MailBox->mbox; + $webmail = new Webmails($mbox,$_REQUEST['mailid']); + $array_tab = Array(); + $webmail->loadMail($array_tab); + if(isset($webmail->att_details)){ + foreach($webmail->att_details as $fileindex => $files) + { + if($files['name'] != '' && $files['size'] > 0) + { + //print_r($files); + $file_saved = $this->saveForwardAttachments($id,$module,$files); + } + } + } + } + $log->debug("Exiting from insertIntoAttachment($id,$module) method."); + } + + function saveForwardAttachments($id,$module,$file_details) + { + global $log; + $log->debug("Entering into saveForwardAttachments($id,$module,$file_details) method."); + global $adb, $current_user; + global $upload_badext; + require_once('modules/Webmails/MailBox.php'); + $mailbox=$_REQUEST["mailbox"]; + $MailBox = new MailBox($mailbox); + $mail = $MailBox->mbox; + $binFile = sanitizeUploadFileName($file_details['name'], $upload_badext); + $filename = ltrim(basename(" ".$binFile)); //allowed filename like UTF-8 characters + $filetype= $file_details['type']; + $filesize = $file_details['size']; + $filepart = $file_details['part']; + $transfer = $file_details['transfer']; + $file = imap_fetchbody($mail,$_REQUEST['mailid'],$filepart); + if ($transfer == 'BASE64') + $file = imap_base64($file); + elseif($transfer == 'QUOTED-PRINTABLE') + $file = imap_qprint($file); + $current_id = $adb->getUniqueID("vtiger_crmentity"); + $date_var = date('Y-m-d H:i:s'); + //to get the owner id + $ownerid = $this->column_fields['assigned_user_id']; + if(!isset($ownerid) || $ownerid=='') + $ownerid = $current_user->id; + $upload_file_path = decideFilePath(); + file_put_contents ($upload_file_path.$current_id."_".$filename,$file); + + $sql1 = "insert into vtiger_crmentity (crmid,smcreatorid,smownerid,setype,description,createdtime,modifiedtime) values(?,?,?,?,?,?,?)"; + $params1 = array($current_id, $current_user->id, $ownerid, $module." Attachment", $this->column_fields['description'], $adb->formatDate($date_var, true), $adb->formatDate($date_var, true)); + $adb->pquery($sql1, $params1); + + $sql2="insert into vtiger_attachments(attachmentsid, name, description, type, path) values(?,?,?,?,?)"; + $params2 = array($current_id, $filename, $this->column_fields['description'], $filetype, $upload_file_path); + $result=$adb->pquery($sql2, $params2); + + if($_REQUEST['mode'] == 'edit') + { + if($id != '' && $_REQUEST['fileid'] != '') + { + $delquery = 'delete from vtiger_seattachmentsrel where crmid = ? and attachmentsid = ?'; + $adb->pquery($delquery, array($id, $_REQUEST['fileid'])); + } + } + $sql3='insert into vtiger_seattachmentsrel values(?,?)'; + $adb->pquery($sql3, array($id, $current_id)); + return true; + $log->debug("exiting from saveforwardattachment function."); + } + /** Returns a list of the associated contacts + * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.. + * All Rights Reserved.. + * Contributor(s): ______________________________________.. + */ + function get_contacts($id, $cur_tab_id, $rel_tab_id, $actions=false) { + global $log, $singlepane_view,$currentModule,$current_user; + $log->debug("Entering get_contacts(".$id.") method ..."); + $this_module = $currentModule; + + $related_module = vtlib_getModuleNameById($rel_tab_id); + require_once("modules/$related_module/$related_module.php"); + $other = new $related_module(); + vtlib_setup_modulevars($related_module, $other); + $singular_modname = vtlib_toSingular($related_module); + + $parenttab = getParentTab(); + + $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; + + $button = ''; + + if($actions) { + if(is_string($actions)) $actions = explode(',', strtoupper($actions)); + if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { + $button .= " "; + } + if(in_array('BULKMAIL', $actions) && isPermitted($related_module,1, '') == 'yes') { + $button .= ""; + } + } + + $query = 'select vtiger_contactdetails.accountid, vtiger_contactdetails.contactid, vtiger_contactdetails.firstname,vtiger_contactdetails.lastname, vtiger_contactdetails.department, vtiger_contactdetails.title, vtiger_contactdetails.email, vtiger_contactdetails.phone, vtiger_contactdetails.emailoptout, vtiger_crmentity.crmid, vtiger_crmentity.smownerid, vtiger_crmentity.modifiedtime from vtiger_contactdetails inner join vtiger_cntactivityrel on vtiger_cntactivityrel.contactid=vtiger_contactdetails.contactid inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_contactdetails.contactid left join vtiger_groups on vtiger_groups.groupid=vtiger_crmentity.smownerid where vtiger_cntactivityrel.activityid='.$adb->quote($id).' and vtiger_crmentity.deleted=0'; + + $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); + + if($return_value == null) $return_value = Array(); + $return_value['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_contacts method ..."); + return $return_value; + } + + /** Returns the column name that needs to be sorted + * Portions created by vtigerCRM are Copyright (C) vtigerCRM. + * All Rights Reserved.. + * Contributor(s): Mike Crowe + */ + + function getSortOrder() + { + global $log; + $log->debug("Entering getSortOrder() method ..."); + if(isset($_REQUEST['sorder'])) + $sorder = $this->db->sql_escape_string($_REQUEST['sorder']); + else + $sorder = (($_SESSION['EMAILS_SORT_ORDER'] != '')?($_SESSION['EMAILS_SORT_ORDER']):($this->default_sort_order)); + + $log->debug("Exiting getSortOrder method ..."); + return $sorder; + } + + /** Returns the order in which the records need to be sorted + * Portions created by vtigerCRM are Copyright (C) vtigerCRM. + * All Rights Reserved.. + * Contributor(s): Mike Crowe + */ + + function getOrderBy() + { + global $log; + $log->debug("Entering getOrderBy() method ..."); + + $use_default_order_by = ''; + if(PerformancePrefs::getBoolean('LISTVIEW_DEFAULT_SORTING', true)) { + $use_default_order_by = $this->default_order_by; + } + + if (isset($_REQUEST['order_by'])) + $order_by = $this->db->sql_escape_string($_REQUEST['order_by']); + else + $order_by = (($_SESSION['EMAILS_ORDER_BY'] != '')?($_SESSION['EMAILS_ORDER_BY']):($use_default_order_by)); + + $log->debug("Exiting getOrderBy method ..."); + return $order_by; + } + // Mike Crowe Mod -------------------------------------------------------- + + /** Returns a list of the associated vtiger_users + * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.. + * All Rights Reserved.. + * Contributor(s): ______________________________________.. + */ + function get_users($id) + { + global $log; + $log->debug("Entering get_users(".$id.") method ..."); + global $adb; + global $mod_strings; + global $app_strings; + + $id = $_REQUEST['record']; + + $button = '  + '; + + $query = 'SELECT vtiger_users.id, vtiger_users.first_name,vtiger_users.last_name, vtiger_users.user_name, vtiger_users.email1, vtiger_users.email2, vtiger_users.yahoo_id, vtiger_users.phone_home, vtiger_users.phone_work, vtiger_users.phone_mobile, vtiger_users.phone_other, vtiger_users.phone_fax from vtiger_users inner join vtiger_salesmanactivityrel on vtiger_salesmanactivityrel.smid=vtiger_users.id and vtiger_salesmanactivityrel.activityid=?'; + $result=$adb->pquery($query, array($id)); + + $noofrows = $adb->num_rows($result); + $header [] = $app_strings['LBL_LIST_NAME']; + + $header []= $app_strings['LBL_LIST_USER_NAME']; + + $header []= $app_strings['LBL_EMAIL']; + + $header []= $app_strings['LBL_PHONE']; + while($row = $adb->fetch_array($result)) + { + + global $current_user; + + $entries = Array(); + + if(is_admin($current_user)) + { + $entries[] = $row['last_name'].' '.$row['first_name']; + } + else + { + $entries[] = $row['last_name'].' '.$row['first_name']; + } + + $entries[] = $row['user_name']; + $entries[] = $row['email1']; + if($email == '') $email = $row['email2']; + if($email == '') $email = $row['yahoo_id']; + + $entries[] = $row['phone_home']; + if($phone == '') $phone = $row['phone_work']; + if($phone == '') $phone = $row['phone_mobile']; + if($phone == '') $phone = $row['phone_other']; + if($phone == '') $phone = $row['phone_fax']; + + //Adding Security Check for User + + $entries_list[] = $entries; + } + + if($entries_list != '') + $return_data = array("header"=>$header, "entries"=>$entries); + + if($return_data == null) $return_data = Array(); + $return_data['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_users method ..."); + return $return_data; + } + + + /** + * Returns a list of the Emails to be exported + */ + function create_export_query(&$order_by, &$where) + { + global $log; + global $current_user; + $log->debug("Entering create_export_query(".$order_by.",".$where.") method ..."); + + include("include/utils/ExportUtils.php"); + + //To get the Permitted fields query and the permitted fields list + $sql = getPermittedFieldsQuery("Emails", "detail_view"); + $fields_list = getFieldsListFromQuery($sql); + + $query = "SELECT $fields_list FROM vtiger_activity + INNER JOIN vtiger_crmentity + ON vtiger_crmentity.crmid=vtiger_activity.activityid + LEFT JOIN vtiger_users + ON vtiger_users.id = vtiger_crmentity.smownerid + LEFT JOIN vtiger_seactivityrel + ON vtiger_seactivityrel.activityid = vtiger_activity.activityid + LEFT JOIN vtiger_contactdetails + ON vtiger_contactdetails.contactid = vtiger_seactivityrel.crmid + LEFT JOIN vtiger_cntactivityrel + ON vtiger_cntactivityrel.activityid = vtiger_activity.activityid + AND vtiger_cntactivityrel.contactid = vtiger_cntactivityrel.contactid + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_salesmanactivityrel + ON vtiger_salesmanactivityrel.activityid = vtiger_activity.activityid + LEFT JOIN vtiger_emaildetails + ON vtiger_emaildetails.emailid = vtiger_activity.activityid + LEFT JOIN vtiger_seattachmentsrel + ON vtiger_activity.activityid=vtiger_seattachmentsrel.crmid + LEFT JOIN vtiger_attachments + ON vtiger_seattachmentsrel.attachmentsid = vtiger_attachments.attachmentsid + WHERE vtiger_activity.activitytype='Emails' AND vtiger_crmentity.deleted=0 "; + + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + //we should add security check when the user has Private Access + + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1) + { + $sec_parameter=getListViewSecurityParameter("Emails"); + $query .= $sec_parameter; + } + + $log->debug("Exiting create_export_query method ..."); + return $query; + } + + /** + * Used to releate email and contacts -- Outlook Plugin + */ + function set_emails_contact_invitee_relationship($email_id, $contact_id) + { + global $log; + $log->debug("Entering set_emails_contact_invitee_relationship(".$email_id.",". $contact_id.") method ..."); + $query = "insert into $this->rel_contacts_table (contactid,activityid) values(?,?)"; + $this->db->pquery($query, array($contact_id, $email_id), true,"Error setting email to contact relationship: "."
$query"); + $log->debug("Exiting set_emails_contact_invitee_relationship method ..."); + } + + /** + * Used to releate email and salesentity -- Outlook Plugin + */ + function set_emails_se_invitee_relationship($email_id, $contact_id) + { + global $log; + $log->debug("Entering set_emails_se_invitee_relationship(".$email_id.",". $contact_id.") method ..."); + $query = "insert into $this->rel_serel_table (crmid,activityid) values(?,?)"; + $this->db->pquery($query, array($contact_id, $email_id), true,"Error setting email to contact relationship: "."
$query"); + $log->debug("Exiting set_emails_se_invitee_relationship method ..."); + } + + /** + * Used to releate email and Users -- Outlook Plugin + */ + function set_emails_user_invitee_relationship($email_id, $user_id) + { + global $log; + $log->debug("Entering set_emails_user_invitee_relationship(".$email_id.",". $user_id.") method ..."); + $query = "insert into $this->rel_users_table (smid,activityid) values (?,?)"; + $this->db->pquery($query, array($user_id, $email_id), true,"Error setting email to user relationship: "."
$query"); + $log->debug("Exiting set_emails_user_invitee_relationship method ..."); + } + + // Function to unlink an entity with given Id from another entity + function unlinkRelationship($id, $return_module, $return_id) { + global $log; + + $sql='DELETE FROM vtiger_seactivityrel WHERE activityid=?'; + $this->db->pquery($sql, array($id)); + + $sql = 'DELETE FROM vtiger_crmentityrel WHERE (crmid=? AND relmodule=? AND relcrmid=?) OR (relcrmid=? AND module=? AND crmid=?)'; + $params = array($id, $return_module, $return_id, $id, $return_module, $return_id); + $this->db->pquery($sql, $params); + } +} +/** Function to get the emailids for the given ids form the request parameters + * It returns an array which contains the mailids and the parentidlists +*/ + +function get_to_emailids($module) +{ + global $adb; + if(isset($_REQUEST["field_lists"]) && $_REQUEST["field_lists"] != "") + { + $field_lists = $_REQUEST["field_lists"]; + if (is_string($field_lists)) $field_lists = explode(":", $field_lists); + $query = 'select columnname,fieldid from vtiger_field where fieldid in ('. generateQuestionMarks($field_lists) .') and vtiger_field.presence in (0,2)'; + $result = $adb->pquery($query, array($field_lists)); + $columns = Array(); + $idlists = ''; + $mailids = ''; + while($row = $adb->fetch_array($result)) + { + $columns[]=$row['columnname']; + $fieldid[]=$row['fieldid']; + } + $columnlists = implode(',',$columns); + $idstring = $_REQUEST["idlist"]; + $single_record = false; + if(!strpos($idstring,':')) + { + $single_record = true; + } + $crmids = ereg_replace(':',',',$idstring); + $crmids = explode(",", $crmids); + switch($module) + { + case 'Leads': + $query = 'select crmid,concat(lastname," ",firstname) as entityname,'.$columnlists.' from vtiger_leaddetails inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_leaddetails.leadid left join vtiger_leadscf on vtiger_leadscf.leadid = vtiger_leaddetails.leadid where vtiger_crmentity.deleted=0 and ((ltrim(vtiger_leaddetails.email) != \'\') or (ltrim(vtiger_leaddetails.yahooid) != \'\')) and vtiger_crmentity.crmid in ('. generateQuestionMarks($crmids) .')'; + break; + case 'Contacts': + //email opt out funtionality works only when we do mass mailing. + if(!$single_record) + $concat_qry = '(((ltrim(vtiger_contactdetails.email) != \'\') or (ltrim(vtiger_contactdetails.yahooid) != \'\')) and (vtiger_contactdetails.emailoptout != 1)) and '; + else + $concat_qry = '((ltrim(vtiger_contactdetails.email) != \'\') or (ltrim(vtiger_contactdetails.yahooid) != \'\')) and '; + $query = 'select crmid,concat(lastname," ",firstname) as entityname,'.$columnlists.' from vtiger_contactdetails inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_contactdetails.contactid left join vtiger_contactscf on vtiger_contactscf.contactid = vtiger_contactdetails.contactid where vtiger_crmentity.deleted=0 and '.$concat_qry.' vtiger_crmentity.crmid in ('. generateQuestionMarks($crmids) .')'; + break; + case 'Accounts': + //added to work out email opt out functionality. + if(!$single_record) + $concat_qry = '(((ltrim(vtiger_account.email1) != \'\') or (ltrim(vtiger_account.email2) != \'\')) and (vtiger_account.emailoptout != 1)) and '; + else + $concat_qry = '((ltrim(vtiger_account.email1) != \'\') or (ltrim(vtiger_account.email2) != \'\')) and '; + + $query = 'select crmid,accountname as entityname,'.$columnlists.' from vtiger_account inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_account.accountid left join vtiger_accountscf on vtiger_accountscf.accountid = vtiger_account.accountid where vtiger_crmentity.deleted=0 and '.$concat_qry.' vtiger_crmentity.crmid in ('. generateQuestionMarks($crmids) .')'; + break; + } + $result = $adb->pquery($query, array($crmids)); + while($row = $adb->fetch_array($result)) + { + $name = $row['entityname']; + for($i=0;$i,'; + } + } + } + + $return_data = Array('idlists'=>$idlists,'mailds'=>$mailids); + }else + { + $return_data = Array('idlists'=>"",'mailds'=>""); + } + return $return_data; + +} + +//added for attach the generated pdf with email +function pdfAttach($obj,$module,$file_name,$id) +{ + global $log; + $log->debug("Entering into pdfAttach() method."); + + global $adb, $current_user; + global $upload_badext; + $date_var = date('Y-m-d H:i:s'); + + $ownerid = $obj->column_fields['assigned_user_id']; + if(!isset($ownerid) || $ownerid=='') + $ownerid = $current_user->id; + + $current_id = $adb->getUniqueID("vtiger_crmentity"); + + $upload_file_path = decideFilePath(); + + //Copy the file from temporary directory into storage directory for upload + $source_file_path = "storage/".$file_name; + $status = copy($source_file_path, $upload_file_path.$current_id."_".$file_name); + //Check wheather the copy process is completed successfully or not. if failed no need to put entry in attachment table + if($status) + { + $query1 = "insert into vtiger_crmentity (crmid,smcreatorid,smownerid,setype,description,createdtime,modifiedtime) values(?,?,?,?,?,?,?)"; + $params1 = array($current_id, $current_user->id, $ownerid, $module." Attachment", $obj->column_fields['description'], $adb->formatDate($date_var, true), $adb->formatDate($date_var, true)); + $adb->pquery($query1, $params1); + + $query2="insert into vtiger_attachments(attachmentsid, name, description, type, path) values(?,?,?,?,?)"; + $params2 = array($current_id, $file_name, $obj->column_fields['description'], 'pdf', $upload_file_path); + $result=$adb->pquery($query2, $params2); + + $query3='insert into vtiger_seattachmentsrel values(?,?)'; + $adb->pquery($query3, array($id, $current_id)); + + // Delete the file that was copied + unlink($source_file_path); + + return true; + } + else + { + $log->debug("pdf not attached"); + return false; + } +} +//this function check email fields profile permission as well as field access permission +function emails_checkFieldVisiblityPermission($fieldname) { + global $current_user; + $ret = getFieldVisibilityPermission('Emails',$current_user->id,$fieldname); + return $ret; +} + +?> diff --git a/oss/vtiger/trunk/modules/Emails/EmailsAjax.php b/oss/vtiger/trunk/modules/Emails/EmailsAjax.php new file mode 100644 index 00000000..63446040 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/EmailsAjax.php @@ -0,0 +1,53 @@ +retrieve_entity_info($crmid,"Emails"); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("Emails"); + if($modObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +elseif($_REQUEST['ajaxmode'] == 'qcreate') +{ + require_once('quickcreate.php'); +} +else +{ + require_once('include/Ajax/CommonAjax.php'); +} +?> diff --git a/oss/vtiger/trunk/modules/Emails/GmailBookmarklet.js b/oss/vtiger/trunk/modules/Emails/GmailBookmarklet.js new file mode 100644 index 00000000..0f95c0ea --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/GmailBookmarklet.js @@ -0,0 +1,552 @@ +function init(){ + function XHR(type,url,params){ + this.xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); + this.url = url; + this.params = params; + this.type = type; + }; + XHR.prototype.load=function(async,callback){ + this.onload=callback; + this.async=async; + + if(this.type.toLowerCase()=="get"){ + this.url = this.url+"?"+this.params; + } + + this.xhr.open(this.type,this.url,this.async); + try{ + if(async){ + var request = this; + this.xhr.onreadystatechange=function(){ + request.readyStateChange(); + } + } + if(this.type.toLowerCase()=="post"){ + this.xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); + this.xhr.setRequestHeader("Content-length", this.params.length); + } + this.xhr.send(this.params); + }catch(e){ + alert("error: "+e); + } + }; + XHR.prototype.readyStateChange=function(){ + var ready=this.xhr.readyState; + if(ready==4){ + var httpStatus=null; + httpStatus=this.xhr.status; + if(httpStatus==200 || httpStatus==0){ + if(this.async){ + this.onload.call(this,this.xhr); + } + } + } + }; + + function VtigerWebservice(vtigerurl,username,accesskey){ + var vtigerURL=vtigerurl; + var username=username; + var accessKey=accesskey; + var userId=null; + var sessionId=null; + + function getResult(response){ + return response.result; + } + + function getError(response){ + return response.error; + } + + function extendsession(){ + var req = new XHR("post",vtigerURL,"operation=extendsession"); + req.load(false); + var res = JSON.parse(req.xhr.responseText); + if(res.success){ + var result = getResult(res); + this.userId=result.userId; + this.sessionId=result.sessionName; + } + } + + function create(object, objectType, callback){ + var objectJson = JSON.stringify(object); + var req = new XHR("post",doc.vtigerURL,("operation=create&elementType="+objectType+"&sessionName="+this.sessionId+ + "&element="+encodeURIComponent(objectJson))); + req.load(true,callback); + } + + function query(query, callback){ + var req = new XHR("get",doc.vtigerURL,"operation=query&query="+encodeURIComponent(query)+"&sessionName="+this.sessionId); + req.load(true,callback); + } + return {extendSession:extendsession,query:query,getResult:getResult,userId:userId,create:create,getError:getError}; + }; + if (!this.JSON) { + JSON = function () { + function f(n) { + return n < 10 ? "0" + n : n; + } + Date.prototype.toJSON = function () { + return this.getUTCFullYear() + "-" + + f(this.getUTCMonth() + 1) + "-" + + f(this.getUTCDate()) + "T" + + f(this.getUTCHours()) + ":" + + f(this.getUTCMinutes()) + ":" + + f(this.getUTCSeconds()) + "Z"; + }; + var m = { + "\b": "\\b", + "\t": "\\t", + "\n": "\\n", + "\f": "\\f", + "\r": "\\r", + "\"" : "\\\"", + "\\": "\\\\" + }; + function stringify(value, whitelist) { + var a, // The array holding the partial texts. + i, // The loop counter. + k, // The member key. + l, // Length. + r = /["\\\x00-\x1f\x7f-\x9f]/g, + v; // The member value. + switch (typeof value) { + case "string": + return r.test(value) ? + "\"" + value.replace(r, function (a) { + var c = m[a]; + if (c) { + return c; + } + c = a.charCodeAt(); + return "\\u00" + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }) + "\"" : + "\"" + value + "\""; + case "number": + return isFinite(value) ? String(value) : "null"; + case "boolean": + case "null": + return String(value); + case "object": + if (!value) { + return "null"; + } + if (typeof value.toJSON === "function") { + return stringify(value.toJSON()); + } + a = []; + if (typeof value.length === "number" && + !(value.propertyIsEnumerable("length"))) { + l = value.length; + for (i = 0; i < l; i += 1) { + a.push(stringify(value[i], whitelist) || "null"); + } + return "[" + a.join(",") + "]"; + } + if (whitelist) { + l = whitelist.length; + for (i = 0; i < l; i += 1) { + k = whitelist[i]; + if (typeof k === "string") { + v = stringify(value[k], whitelist); + if (v) { + a.push(stringify(k) + ":" + v); + } + } + } + } else { + for (k in value) { + if (typeof k === "string") { + v = stringify(value[k], whitelist); + if (v) { + a.push(stringify(k) + ":" + v); + } + } + } + } + return "{" + a.join(",") + "}"; + } + return undefined; + } + return { + stringify: stringify, + parse: function (text, filter) { + var j; + function walk(k, v) { + var i, n; + if (v && typeof v === "object") { + for (i in v) { + if (Object.prototype.hasOwnProperty.apply(v, [i])) { + n = walk(i, v[i]); + if (n !== undefined) { + v[i] = n; + } + } + } + } + return filter(k, v); + } + if (/^[\],:{}\s]*$/.test(text.replace(/\\./g, "@"). + replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, "]"). + replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) { + j = eval("(" + text + ")"); + return typeof filter === "function" ? walk("", j) : j; + } + throw new SyntaxError("parseJSON"); + } + }; + }(); + } + + var doc = document; + + function trim(str) { + var s = str.replace(/\s+$/, ""); + s = s.replace(/^\s+/, ""); + return s; + } + + function getGmailSubject() { + var subject = top.document.title; + var firstIndexOf = subject.indexOf("-"); + var lastIndexOf = subject.lastIndexOf("-"); + subject = subject.substring(firstIndexOf+1, lastIndexOf-1); + return trim(subject); + } + + function getVtigerBaseURL(){ + var url = document.location.href.substring(0,document.location.href.lastIndexOf('/')+1); + if(url.length > 0){ + if(url.charAt(url.length-1) !="/"){ + url += "/"; + } + return url; + } + return null; + } + + function getVtigerURL(){ + if(doc.vtigerBaseURL.length > 0){ + var url =doc.vtigerBaseURL; + url +="webservice.php"; + return url; + } + return null; + } + + function getGmailURL() { + var locationhref = location.href; + if(locationhref.indexOf("?")) { + var lsplits = locationhref.split("?"); + locationhref = lsplits[0]; + } else if(locationhref.indexOf("#")) { + var lsplits = locationhref.split("#"); + locationhref = lsplits[0]; + } + return locationhref; + } + + var elementId = "__vtigerBookMarkletDiv__"; + var busyElementId = "__vtigerBookMarkletDivBusy__" + function showBookMarkletUI(){ + var bookMarkletDiv = doc.getElementById(elementId); + if(bookMarkletDiv == null){ + bookMarkletDiv.style.display="block"; + } + } + + function hideBookMarkletUI(){ + var bookMarkletDiv = doc.getElementById(elementId); + if(bookMarkletDiv != null){ + bookMarkletDiv.style.display="none"; + } + } + + function destroyBookMarkletUI(){ + var closeElementId = '__vtigetGmailCloseElement'; + var parentLocation = location.href.split("location="); + if(parentLocation.length>1){ + var closeElement = doc.getElementById(closeElementId); + if(closeElement==null){ + closeElement = doc.createElement("iframe"); + closeElement.style.width="0px"; + closeElement.frameBorder="0px"; + closeElement.style.height="0px"; + closeElement.style.display="none"; + closeElement.id = closeElementId; + closeElement.src = decodeURIComponent(parentLocation[1])+"#"; + doc.body.appendChild(closeElement); + } + closeElement.onload=function(){ + eval('window.parent.parent.removeMe()'); + } + } + } + + function showBusy(){ + var bookMarkletDiv = doc.getElementById(elementId); + var busyElem = doc.getElementById(busyElementId); + if(busyElem==null){ + busyElem = doc.createElement('div'); + busyElem.id = busyElementId; + busyElem.innerHTML="Working..."; + busyElem.style.position="absolute"; + busyElem.style.top="5px"; + busyElem.style.right="5px"; + busyElem.style.color="white"; + busyElem.style.backgroundColor="#D75235"; + busyElem.style.padding="2px"; + bookMarkletDiv.appendChild(busyElem); + }else{ + busyElem.style.display="block"; + } + + } + + function hideBusy(){ + var busyElem = doc.getElementById(busyElementId); + if(busyElem!=null){ + busyElem.style.display="none"; + } + } + + if(typeof doc.vtigerURL =="undefined" || doc.vtigerURL == null || doc.vtigerURL == ""){ + doc.vtigerBaseURL = getVtigerBaseURL(); + if(doc.vtigerBaseURL ==null){ + alert("Please Provide a Valid URL"); + return; + } + doc.vtigerURL = getVtigerURL(); + } + var client = new VtigerWebservice(doc.vtigerURL,null,null); + + showBusy(); + client.extendSession(); + hideBusy(); + showBookMarkletUI(); + + function onReady(id,callback){ + var interval = window.setInterval(function(){ + var elem = doc.getElementById(id); + if(elem != null && typeof elem != "undefined"){ + callback(); + window.clearInterval(interval); + } + },10); + } + + function createBookMarkletUI(){ + + onReady("__saveVtigerEmail__",function(){ + doc.getElementById("__saveVtigerEmail__").onclick=function(){ + createEmail(); + } + }); + onReady("parentType",function(){ + doc.getElementById("parentName").innerHTML = "No "+doc.getElementById("parentType").value+" Selected."; + doc.getElementById("parentType").onchange=function(){ + doc.getElementById("parentName").innerHTML = "No "+this.value+" Selected."; + } + }); + + function getQuery(searchValue){ + + var moduleName = doc.getElementById("parentType").value; + var moduleDetails = JSON.parse(moduleNameFields); + var entityNameFields = moduleDetails[moduleName]; + var selectFields = ''; + var whereFields = ''; + each(entityNameFields,function(k,v){ + if(selectFields.length > 0){ + selectFields +=','; + } + selectFields += v; + if(whereFields.length > 0){ + whereFields +=" or "; + } + whereFields += v+" like '%"+searchValue+"%'"; + }); + return "select "+selectFields+" from "+moduleName+" where "+whereFields+";"; + } + + onReady("__searchVtigerAccount__",function(){ + doc.getElementById("__searchVtigerAccount__").onclick=function(e){ + var elem = doc.getElementById("__vtigerAccountSearchList___"); + elem.style.display=""; + + var accountName = doc.getElementById("__searchaccount__").value; + if(accountName.length < 1){ + alert("Please enter the search critiria"); + return; + } + showBusy(); + var q = getQuery(accountName); + var moduleName = doc.getElementById("parentType").value; + var responseElem = doc.getElementById("__vtigerAccountSearchResponse___"); + if(responseElem != null){ + responseElem.innerHTML = ''; + } + client.query(q,function(response){ + var responseElem = doc.getElementById("__vtigerAccountSearchResponse___"); + if(responseElem == null){ + var sibling = doc.createElement("tr"); + var td = doc.createElement("td"); + td.colSpan = "3"; + str = "
"; + td.innerHTML = str; + sibling.appendChild(td); + elem.parentNode.appendChild(sibling); + } + onReady("__vtigerAccountSearchResponse___",function(){ + displaySearchResult(moduleName,response,accountName); + }); + }); + } + }); + } + + function getSiblingByTagName(elem,tagName){ + var sibling = elem.nextSibling; + while(sibling.nodeName.toLowerCase()!=tagName.toLowerCase()){ + sibling = sibling.nextSibling; + } + return sibling; + } + + function each(object,callback){ + var name, i = 0, length = object.length; + if ( length == undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + return object; + } + + function findObject(array,needle){ + var name, i = 0, length = array.length; + var propect = null; + for (; i < length; ++i ){ + var object = array[i]; + for ( name in object ){ + if(object[name] === needle){ + prospect=object; + break; + } + } + } + return prospect; + } + + function getEntityName(moduleName,row){ + var moduleDetails = JSON.parse(moduleNameFields); + var entityNameFields = moduleDetails[moduleName]; + var entityName = ''; + var entityNameField = ''; + each(entityNameFields,function(k,v){ + if(entityName.length>0){ + entityName += " "; + } + entityName +=row[v]; + }); + return entityName; + } + + function displaySearchResult(moduleName,response,accountName){ + hideBusy(); + var queryResponse = JSON.parse(response.responseText); + if(queryResponse.success == true){ + var queryResult = client.getResult(queryResponse); + var str ="
    "; + if(queryResult.length > 0){ + each(queryResult, function(i, row){ + var entityName = getEntityName(moduleName,row); + str+="
  • "+ + entityName+"
  • "; + }); + }else{ + str +="
  • No Record Match \""+accountName+"\"
  • "; + } + str += "
"; + var elem = doc.getElementById("__vtigerAccountSearchResponse___"); + elem.style.height="120px"; + elem.innerHTML = str; + each(elem.getElementsByTagName("a"),function(i,v){ + v.onclick=function(){ + var elem = findObject(queryResult,this.id); + var entityName = getEntityName(moduleName,elem); + setAccountId(elem.id,entityName); + var wrap = doc.getElementById("__vtigerAccountSearchList___"); + wrap.style.display="none"; + doc.getElementById('__searchaccount__').value=''; + } + }); + }else{ + var error = client.getError(queryResponse); + alert("Vtiger returned Error: \nerrorCode: "+error.code+"\nerror Message: "+error.message); + } + } + + function waitForObject(obj,callback){ + var interval = window.setInterval(function(){ + if(typeof obj != "undefined"){ + callback(); + window.clearInterval(interval); + } + },10); + } + + function setAccountId(id,entityName){ + var elem = doc.getElementById("parent_id"); + var elemName = doc.getElementById("parentName"); + elem.value = id; + elemName.innerHTML = entityName; + } + + function closeOnSuccess(response){ + var createResponse = JSON.parse(response.responseText); + if(createResponse.success == true){ + alert("Email added to vtigerCRM."); + }else{ + doc.getElementById("__saveVtigerEmail__").disabled=false; + var error = client.getError(createResponse); + alert("Error while creating: \nerrorCode: "+error.code+"\nerror Message: "+error.message); + } + } + + function getTodayDate(format){ + var date = new Date(); + return date.getDay()+"-"+date.getMonth()+"-"+date.getFullYear(); + } + + function createEmail(){ + var parent_id = doc.getElementById("parent_id").value; + var type = doc.getElementById("parentType").value; + if(parent_id.length < 1){ + alert("No "+type+" selected."); + return ; + } + var subject = doc.getElementById("subject").value; + if(subject.length < 1){ + alert("Please provide a value for Subject"); + return; + } + + var description = doc.getElementById("description").value; + if(description.length < 1){ + alert("Please provide a value for Body of the email."); + return; + } + doc.getElementById("__saveVtigerEmail__").disabled=true; + var email ={"description":description,"subject":subject, + "description":description,"assigned_user_id":client.userId, + "date_start":getTodayDate(),"activitytype":"Emails","parent_id": parent_id}; + client.create(email,"Emails",closeOnSuccess) + } + createBookMarkletUI(); +} diff --git a/oss/vtiger/trunk/modules/Emails/GmailBookmarkletTrigger.js b/oss/vtiger/trunk/modules/Emails/GmailBookmarkletTrigger.js new file mode 100644 index 00000000..9ec19ad4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/GmailBookmarkletTrigger.js @@ -0,0 +1,99 @@ +javascript:(function(){var doc = top.document; +var elementId="__vtigerBookMarkletDivWrap__"; +if(navigator.userAgent.toLowerCase().indexOf("msie") == -1){ + var bookMarkletDiv = doc.getElementById(elementId); + if(bookMarkletDiv == null){ + bookMarkletDiv = doc.createElement("div"); + bookMarkletDiv.style.border = "2px solid #73ABFA"; + bookMarkletDiv.style.backgroundColor = "white"; + bookMarkletDiv.innerHTML = ""; + bookMarkletDiv.id = elementId; + bookMarkletDiv.style.position="absolute"; + bookMarkletDiv.style.top="5px"; + bookMarkletDiv.style.right="35px"; + bookMarkletDiv.style.width="562px"; + bookMarkletDiv.style.height="450px"; + bookMarkletDiv.style.zIndex="100000"; + bookMarkletDiv.innerHTML=" "; + bookMarkletDiv.style.overflow = 'hidden'; + bookMarkletDiv.style.fontSize = '11px'; + bookMarkletDiv.style.fontFamily = 'Arial, sans-serif'; + + var closeMe = doc.createElement("span"); + closeMe.style.position="absolute"; + closeMe.style.top="5px"; + closeMe.style.right="5px"; + closeMe.style.color="#0070BA"; + closeMe.style.textDecoration="underline"; + closeMe.style.width="100%"; + closeMe.style.textAlign="right"; + closeMe.style.cursor="pointer"; + closeMe.innerHTML = ""; + closeMe.onclick = function(){ + window.removeMe(); + } + bookMarkletDiv.appendChild(closeMe); + + var popUp = doc.createElement("iframe"); + popUp.id="__vtigerBookmarkletFrame__"; + popUp.name="__vtigerBookmarkletFrame__"; + popUp.style.border="0px"; + popUp.frameBorder="0px"; + popUp.marginHeight="0px"; + popUp.marginWidth="0px"; + popUp.style.width="100%"; + popUp.style.height="100%"; + popUp.src = getTargetURL(); + bookMarkletDiv.appendChild(popUp); + doc.body.appendChild(bookMarkletDiv); + }else{ + bookMarkletDiv.style.display="block"; + } +}else{ + var vtigerGmailBookmarkletWindow = window.open(getTargetURL(),elementId, + "scrollbars=1,top=40,left=40,resizable=1,height=450,width=562"); +} + +function getTargetURL(){ + var threadid = top.location.hash.split("/"); + var mailId = threadid[threadid.length-1]; + var description = encodeURIComponent(getGmailURL()+"?fs=1&tf=1&source=atom&view=cv&search=all&shva=1&th="+mailId); + return doc.vtigerURL+"index.php?module=Emails&action=SaveBookmarklet&subject="+ + encodeURIComponent(getGmailSubject())+"&description="+description+ + "&location="+encodeURIComponent(getGmailURL()); +} + +function trim(str) { + var s = str.replace(/\s+$/, ""); + s = s.replace(/^\s+/, ""); + return s; +} + +function getGmailSubject() { + var subject = top.document.title; + var firstIndexOf = subject.indexOf("-"); + var lastIndexOf = subject.lastIndexOf("-"); + subject = subject.substring(firstIndexOf+1, lastIndexOf-1); + return trim(subject); +} + +function getGmailURL() { + var locationhref = location.href; + if(locationhref.indexOf("?")!==-1) { + var lsplits = locationhref.split("?"); + locationhref = lsplits[0]; + } else if(locationhref.indexOf("#")!==-1) { + var lsplits = locationhref.split("#"); + locationhref = lsplits[0]; + } + return locationhref; +} +window.top.removeMe = function(){ + if(navigator.userAgent.toLowerCase().indexOf("msie") == -1){ + doc.body.removeChild(bookMarkletDiv); + }else{ + vtigerGmailBookmarkletWindow.close(); + } +} +})(); \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/ListView.php b/oss/vtiger/trunk/modules/Emails/ListView.php new file mode 100644 index 00000000..f72af282 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/ListView.php @@ -0,0 +1,202 @@ +initSortbyField('Emails'); +// END +$smarty = new vtigerCRM_Smarty; +$other_text = Array(); + +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> +if($_REQUEST['order_by'] != '') + $order_by = $adb->sql_escape_string($_REQUEST['order_by']); +else + $order_by = (($_SESSION['EMAILS_ORDER_BY'] != '')?($_SESSION['EMAILS_ORDER_BY']):($focus->default_order_by)); + +if($_REQUEST['sorder'] != '') + $sorder = $adb->sql_escape_string($_REQUEST['sorder']); +else + $sorder = (($_SESSION['EMAILS_SORT_ORDER'] != '')?($_SESSION['EMAILS_SORT_ORDER']):($focus->default_sort_order)); + +$_SESSION['EMAILS_ORDER_BY'] = $order_by; +$_SESSION['EMAILS_SORT_ORDER'] = $sorder; +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> + + +// focus_list is the means of passing data to a ListView. +global $focus_list; + +//<<<>>>>>> +$oCustomView = new CustomView("Emails"); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); + +//<<<<>>>> + +// Buttons and View options +if(isPermitted('Emails','Delete','') == 'yes') +{ + $other_text['del'] = $app_strings[LBL_MASS_DELETE]; +} + +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} + +global $email_title; +$display_title = $mod_strings['LBL_LIST_FORM_TITLE']; +if($email_title)$display_title = $email_title; + +//to get the search vtiger_field if exists +if(isset($_REQUEST['search']) && $_REQUEST['search'] != '' && $_REQUEST['search_text'] != '') +{ + $url_string .= "&search=".vtlib_purify($_REQUEST['search'])."&search_field=".vtlib_purify($_REQUEST['search_field'])."&search_text=".vtlib_purify($_REQUEST['search_text']); + if($_REQUEST['search_field'] != 'join') + $where = $adb->sql_escape_string($_REQUEST['search_field'])." like '". formatForSqlLike($_REQUEST['search_text']) ."'"; + else + $where = "(subject like '". formatForSqlLike($_REQUEST['search_text']) ."' OR vtiger_users.user_name like '". formatForSqlLike($_REQUEST['search_text']) ."')"; +} + + +//Retreive the list from Database +//<<<<<<<<>>>>>>>> +if($viewid != "0") +{ + $listquery = getListQuery("Emails"); + $list_query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"Emails"); +} +else +{ + $list_query = getListQuery("Emails"); +} +//<<<<<<<>>>>>>>> + +if(isset($where) && $where != '') +{ + $list_query .= " AND " .$where; +} +if($_REQUEST['folderid'] =='2') +{ + $list_query .= " AND vtiger_seactivityrel.crmid in (select contactid from vtiger_contactdetails) AND vtiger_emaildetails.email_flag !='WEBMAIL'"; +} +if($_REQUEST['folderid'] =='3') +{ + $list_query .= " AND vtiger_seactivityrel.crmid in (select accountid from vtiger_account)"; +} +if($_REQUEST['folderid'] =='4') +{ + $list_query .= " AND vtiger_seactivityrel.crmid in (select leadid from vtiger_leaddetails)"; +} +if($_REQUEST['folderid'] =='5') +{ + $list_query .= " AND vtiger_salesmanactivityrel.smid in (select id from vtiger_users)"; +} +if($_REQUEST['folderid'] =='6') +{ + $list_query .= " AND vtiger_emaildetails.email_flag ='WEBMAIL'"; +} +if(isset($order_by) && $order_by != '') +{ + $tablename = getTableNameForField('Emails',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + $list_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; +} + +$list_result = $adb->query($list_query); + +//Constructing the list view +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Email'); +$smarty->assign("BUTTONS",$other_text); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +//Retreiving the no of rows +$noofrows = $adb->num_rows($list_result); + +//Retreive the Navigation array +$_REQUEST['allflag'] = 'All'; +$navigation_array = getNavigationValues(1, $noofrows, $noofrows); + +//Retreive the List View Table Header +if($viewid !='') + $url_string .="&viewname=".$viewid; +if(isset($_REQUEST['folderid']) && $_REQUEST['folderid'] != '') + $url_string .= "&folderid=".vtlib_purify($_REQUEST['folderid']); +$listview_header = getListViewHeader($focus,"Emails",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_entries = getListViewEntries($focus,"Emails",$list_result,$navigation_array,"","","EditView","Delete",$oCustomView); +//--------------------------added to fix the ticket(4386)------------------------START +foreach($listview_entries as $key=>$value) +{ + $sql="select email_flag from vtiger_emaildetails where emailid=?"; + $result=$adb->pquery($sql, array($key)); + $email_flag=$adb->query_result($result,0,"email_flag"); + $emailid[$key] = $email_flag; +} +$smarty->assign("EMAILFALG",$emailid); +//--------------------------added to fix the ticket(4386)------------------------END + +$smarty->assign("LISTENTITY", $listview_entries); +$smarty->assign("SELECT_SCRIPT", $view_script); + +$smarty->assign("USERID", $current_user->id); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("theme", $theme); +if($_REQUEST['ajax'] != '') + $smarty->display("EmailContents.tpl"); +else + $smarty->display("Emails.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/ListViewPagging.php b/oss/vtiger/trunk/modules/Emails/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/PHPMailer_LICENSE.txt b/oss/vtiger/trunk/modules/Emails/PHPMailer_LICENSE.txt new file mode 100644 index 00000000..f3f1b3b6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/PHPMailer_LICENSE.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/oss/vtiger/trunk/modules/Emails/PrintEmail.php b/oss/vtiger/trunk/modules/Emails/PrintEmail.php new file mode 100644 index 00000000..dfc3b106 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/PrintEmail.php @@ -0,0 +1,89 @@ +assign('MOD',$mod_strings); +$smarty->assign('THEME',$theme); + +if(isset($_REQUEST['record']) && $_REQUEST['record'] !='' && $_REQUEST['mailbox'] == '') +{ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"Emails"); + + $focus->name=$focus->column_fields['name']; + if(isset($_REQUEST['print']) && $_REQUEST['print'] !='') + { + $query = 'select idlists,from_email,to_email,cc_email,bcc_email from vtiger_emaildetails where emailid =?'; + $result = $adb->pquery($query, array($focus->id)); + $smarty->assign('FROM_MAIL',$adb->query_result($result,0,'from_email')); + $to_email = vt_suppressHTMLTags(implode(',',$json->decode($adb->query_result($result,0,'to_email')))); + $smarty->assign('TO_MAIL',$to_email); + $cc_add = vt_suppressHTMLTags(implode(',',$json->decode($adb->query_result($result,0,'cc_email')))); + $smarty->assign('CC_MAIL',$cc_add); + $bcc_add = vt_suppressHTMLTags(implode(',',$json->decode($adb->query_result($result,0,'bcc_email')))); + $smarty->assign('BCC_MAIL',$bcc_add); + $smarty->assign('SUBJECT',$focus->column_fields['subject']); + $smarty->assign('DESCRIPTION',$focus->column_fields['description']); + } + $smarty->display('PrintEmail.tpl'); +} + +if(isset($_REQUEST['record']) && isset($_REQUEST['mailbox']) && $_REQUEST['print']) +{ + if(isset($_REQUEST["mailbox"]) && $_REQUEST["mailbox"] != "") +{ + $mailbox=$_REQUEST["mailbox"]; +} +else +{ + $mailbox="INBOX"; +} +$mailid = $_REQUEST['record']; +$MailBox = new MailBox($mailbox); +$mail = $MailBox->mbox; +$email = new Webmails($MailBox->mbox,$mailid); +$status=imap_setflag_full($MailBox->mbox,$mailid,"\\Seen"); +$attach_tab=array(); +$email->loadMail($attach_tab); +echo "\n"; +$subject = utf8_decode(utf8_encode(imap_utf8($email->subject))); +$from = decode_header($email->from); +$to = decode_header($email->to[0]); +$cc = decode_header($email->cc_header); +$date = decode_header($email->date); +for($i=0;$iattname);$i++){ + $attachment_links .= $email->anchor_arr[$i].decode_header($email->attname[$i])."
                     "; +} +$content['body'] = $email->body; +$content['attachtab'] = $email->attachtab; + +$smarty->assign('FROM_MAIL',$from); +$smarty->assign('TO_MAIL',trim($to,",").","); +$smarty->assign('SUBJECT',$subject); +$smarty->assign('DESCRIPTION',$content['body']); +$smarty->display('PrintEmail.tpl'); +} + +?> diff --git a/oss/vtiger/trunk/modules/Emails/Save.php b/oss/vtiger/trunk/modules/Emails/Save.php new file mode 100644 index 00000000..7fda806b --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/Save.php @@ -0,0 +1,254 @@ +num_rows($adb->pquery($sql, array('email')),0,"id"); + if($records != '') + echo 'SUCCESS'; + else + echo 'FAILURE'; + die; +} + +//Added on 09-11-2005 to avoid loading the webmail vtiger_files in Email process +if($_REQUEST['smodule'] != '') +{ + define('SM_PATH','modules/squirrelmail-1.4.4/'); + /* SquirrelMail required vtiger_files. */ + require_once(SM_PATH . 'functions/strings.php'); + require_once(SM_PATH . 'functions/imap_general.php'); + require_once(SM_PATH . 'functions/imap_messages.php'); + require_once(SM_PATH . 'functions/i18n.php'); + require_once(SM_PATH . 'functions/mime.php'); + require_once(SM_PATH .'include/load_prefs.php'); + //require_once(SM_PATH . 'class/mime/Message.class.php'); + require_once(SM_PATH . 'class/mime.class.php'); + sqgetGlobalVar('key', $key, SQ_COOKIE); + sqgetGlobalVar('username', $username, SQ_SESSION); + sqgetGlobalVar('onetimepad',$onetimepad, SQ_SESSION); + $mailbox = 'INBOX'; +} + +require_once('modules/Emails/Emails.php'); +require_once('include/logging.php'); +require_once('include/database/PearDatabase.php'); + +$local_log =& LoggerManager::getLogger('index'); + +$focus = new Emails(); + +global $current_user,$mod_strings,$app_strings; +if(isset($_REQUEST['description']) && $_REQUEST['description'] !='') + $_REQUEST['description'] = fck_from_html($_REQUEST['description']); + +$all_to_ids = $_REQUEST["hidden_toid"]; +$all_to_ids .= $_REQUEST["saved_toid"]; +$_REQUEST["saved_toid"] = $all_to_ids; +//we always save the email with "save" status and when it is sent it is marked as SENT +$_REQUEST['email_flag'] = 'SAVED'; +setObjectValuesFromRequest($focus); +//Check if the file is exist or not. +//$file_name = ''; +if(isset($_REQUEST['filename_hidden'])) { + $file_name = $_REQUEST['filename_hidden']; +} else { + $file_name = $_FILES['filename']['name']; +} +$errorCode = $_FILES['filename']['error']; +$errormessage = ""; +if($file_name != '' && $_FILES['filename']['size'] == 0) +{ + if($errorCode == 4 || $errorCode == 0) + { + if($_FILES['filename']['size'] == 0) + $errormessage = "".$mod_strings['LBL_PLEASE_ATTACH']."
"; + } + else if($errorCode == 2) + { + $errormessage = "".$mod_strings['LBL_EXCEED_MAX'].$upload_maxsize.$mod_strings['LBL_BYTES']."
"; + } + else if($errorCode == 6) + { + $errormessage = "".$mod_strings['LBL_KINDLY_UPLOAD']."
" ; + } + else if($errorCode == 3 ) + { + if($_FILES['filename']['size'] == 0) + $errormessage = "".$mod_strings['LBL_PLEASE_ATTACH']."
"; + } + else{} + if($errormessage != ""){ + $ret_error = 1; + $ret_parentid = $_REQUEST['parent_id']; + $ret_toadd = $_REQUEST['parent_name']; + $ret_subject = $_REQUEST['subject']; + $ret_ccaddress = $_REQUEST['ccmail']; + $ret_bccaddress = $_REQUEST['bccmail']; + $ret_description = $_REQUEST['description']; + echo $errormessage; + include("EditView.php"); + exit(); + } +} + + +if($_FILES["filename"]["size"] == 0 && $_FILES["filename"]["name"] != '') +{ + $file_upload_error = true; + $_FILES = ''; +} + +if((isset($_REQUEST['deletebox']) && $_REQUEST['deletebox'] != null) && $_REQUEST['addbox'] == null) +{ + imap_delete($mbox,$_REQUEST['deletebox']); + imap_expunge($mbox); + header("Location: index.php?module=Emails&action=index"); + exit(); +} + +function checkIfContactExists($mailid) +{ + global $log; + $log->debug("Entering checkIfContactExists(".$mailid.") method ..."); + global $adb; + $sql = "select contactid from vtiger_contactdetails inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_contactdetails.contactid where vtiger_crmentity.deleted=0 and email= ?"; + $result = $adb->pquery($sql, array($mailid)); + $numRows = $adb->num_rows($result); + if($numRows > 0) + { + $log->debug("Exiting checkIfContactExists method ..."); + return $adb->query_result($result,0,"contactid"); + } + else + { + $log->debug("Exiting checkIfContactExists method ..."); + return -1; + } +} +//assign the focus values +$focus->filename = $_REQUEST['file_name']; +$focus->parent_id = $_REQUEST['parent_id']; +$focus->parent_type = $_REQUEST['parent_type']; +$focus->column_fields["assigned_user_id"]=$current_user->id; +$focus->column_fields["activitytype"]="Emails"; +$focus->column_fields["date_start"]= date(getNewDisplayDate());//This will be converted to db date format in save +$focus->save("Emails"); +$return_id = $focus->id; + +require_once("modules/Emails/mail.php"); +if(isset($_REQUEST['send_mail']) && $_REQUEST['send_mail'] && $_REQUEST['parent_id'] != '') +{ + $user_mail_status = send_mail('Emails',$current_user->column_fields['email1'],$current_user->user_name,'',$_REQUEST['subject'],$_REQUEST['description'],$_REQUEST['ccmail'],$_REQUEST['bccmail'],'all',$focus->id); + + //if block added to fix the issue #3759 + if($user_mail_status != 1){ + $query = "select crmid,attachmentsid from vtiger_seattachmentsrel where crmid=?"; + $result = $adb->pquery($query, array($email_id)); + $numOfRows = $adb->num_rows($result); + for($i=0; $i<$numOfRows; $i++) + { + $attachmentsid = $adb->query_result($result,0,"attachmentsid"); + if($attachmentsid > 0) + { + $query1="delete from vtiger_crmentity where crmid=?"; + $adb->pquery($query1, array($attachmentsid)); + } + + $crmid=$adb->query_result($result,0,"crmid"); + $query2="delete from vtiger_crmentity where crmid=?"; + $adb->pquery($query2, array($crmid)); + } + + $query = "delete from vtiger_emaildetails where emailid=?"; + $adb->pquery($query, array($focus->id)); + + $error_msg = "".$mod_strings['LBL_CHECK_USER_MAILID'].""; + $ret_error = 1; + $ret_parentid = $_REQUEST['parent_id']; + $ret_toadd = $_REQUEST['parent_name']; + $ret_subject = $_REQUEST['subject']; + $ret_ccaddress = $_REQUEST['ccmail']; + $ret_bccaddress = $_REQUEST['bccmail']; + $ret_description = $_REQUEST['description']; + echo $error_msg; + include("EditView.php"); + exit(); + } + +} + +$focus->retrieve_entity_info($return_id,"Emails"); + +//this is to receive the data from the Select Users button +if($_REQUEST['source_module'] == null) +{ + $module = 'users'; +} +//this will be the case if the Select Contact button is chosen +else +{ + $module = $_REQUEST['source_module']; +} + +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") + $return_module = vtlib_purify($_REQUEST['return_module']); +else + $return_module = "Emails"; + +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") + $return_action = vtlib_purify($_REQUEST['return_action']); +else + $return_action = "DetailView"; + +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") + $return_id = vtlib_purify($_REQUEST['return_id']); + +if(isset($_REQUEST['filename']) && $_REQUEST['filename'] != "") + $filename = vtlib_purify($_REQUEST['filename']); + +$local_log->debug("Saved record with id of ".$return_id); + +if(isset($_REQUEST['send_mail']) && $_REQUEST['send_mail'] && $_REQUEST['parent_id'] == ''){ + if($_REQUEST["parent_name"] != '' && isset($_REQUEST["parent_name"])) { + include("modules/Emails/webmailsend.php"); + } + +} elseif( isset($_REQUEST['send_mail']) && $_REQUEST['send_mail']) + include("modules/Emails/mailsend.php"); + + + +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] == 'mailbox') + header("Location: index.php?module=$return_module&action=index"); +else { + if($_REQUEST['return_viewname'] == '') $return_viewname='0'; + if($_REQUEST['return_viewname'] != '')$return_viewname=vtlib_purify($_REQUEST['return_viewname']); + //Added for 4600 + $inputs=""; + echo $inputs; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/SaveBookmarklet.php b/oss/vtiger/trunk/modules/Emails/SaveBookmarklet.php new file mode 100644 index 00000000..f5982634 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/SaveBookmarklet.php @@ -0,0 +1,71 @@ +assign("subject",$_REQUEST['subject']); +$smarty->assign("description",$_REQUEST['description']); + +Zend_Json::$useBuiltinEncoderDecoder = true; +$json = new Zend_Json(); + +$elementType = $_REQUEST['module']; + +global $log,$adb; +$webserviceObject = VtigerWebserviceObject::fromName($adb,$elementType); +$handlerPath = $webserviceObject->getHandlerPath(); +$handlerClass = $webserviceObject->getHandlerClass(); + +require_once $handlerPath; + +$handler = new $handlerClass($webserviceObject,$current_user,$adb,$log); +$meta = $handler->getMeta(); +$meta->retrieveMeta(); + +$types = vtws_listtypes($current_user); +if(!in_array($elementType,$types['types'])){ + throw new WebServiceException(WebServiceErrorCode::$ACCESSDENIED,"Permission to perform the operation is denied"); +} + +$wsFieldDetails = $handler->getField('parent_id'); + +$moduleEntityNameDetails = array(); +foreach ($wsFieldDetails['type']['refersTo'] as $type) { + $moduleEntityNameDetails[$type] = vtws_getEntityNameFields($type); +} + +$smarty->assign("types",$wsFieldDetails['type']['refersTo']); +$smarty->assign("entityNameFields",$json->encode($moduleEntityNameDetails)); + +$smarty->display("modules/Bookmarklet/Bookmarklet.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/TrackAccess.php b/oss/vtiger/trunk/modules/Emails/TrackAccess.php new file mode 100644 index 00000000..95de9f48 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/TrackAccess.php @@ -0,0 +1,40 @@ +pquery("INSERT INTO vtiger_email_access(crmid, mailid, accessdate, accesstime) VALUES(?,?,?,?)", array($crmid, $mailid, date('Y-m-d'), date('H:i:s'))); + +$result = $adb->pquery("select count(*) as count from vtiger_email_access where crmid=? and mailid=?",array($crmid, $mailid)); +$count = $adb->query_result($result,0,'count'); + +$result = $adb->pquery("select * from vtiger_email_track where crmid=? and mailid=?", array($crmid, $mailid)); +if($adb->num_rows($result)>0){ + $adb->pquery("update vtiger_email_track set access_count=? where crmid=? and mailid=?", array($count, $crmid, $mailid)); +} else { + $adb->pquery("insert into vtiger_email_track(crmid,mailid,access_count) values(?,?,?)", array($crmid, $mailid, 1)); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/UnifiedSearch.php b/oss/vtiger/trunk/modules/Emails/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/class.phpmailer.php b/oss/vtiger/trunk/modules/Emails/class.phpmailer.php new file mode 100644 index 00000000..4381935f --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/class.phpmailer.php @@ -0,0 +1,1510 @@ +ContentType = "text/html"; + else + $this->ContentType = "text/plain"; + } + + /** + * Sets Mailer to send message using SMTP. + * @return void + */ + function IsSMTP() { + $this->Mailer = "smtp"; + } + + /** + * Sets Mailer to send message using PHP mail() function. + * @return void + */ + function IsMail() { + $this->Mailer = "mail"; + } + + /** + * Sets Mailer to send message using the $Sendmail program. + * @return void + */ + function IsSendmail() { + $this->Mailer = "sendmail"; + } + + /** + * Sets Mailer to send message using the qmail MTA. + * @return void + */ + function IsQmail() { + $this->Sendmail = "/var/qmail/bin/sendmail"; + $this->Mailer = "sendmail"; + } + + + ///////////////////////////////////////////////// + // RECIPIENT METHODS + ///////////////////////////////////////////////// + + /** + * Adds a "To" address. + * @param string $address + * @param string $name + * @return void + */ + function AddAddress($address, $name = "") { + $cur = count($this->to); + $this->to[$cur][0] = trim($address); + $this->to[$cur][1] = $name; + } + + /** + * Adds a "Cc" address. Note: this function works + * with the SMTP mailer on win32, not with the "mail" + * mailer. + * @param string $address + * @param string $name + * @return void + */ + function AddCC($address, $name = "") { + $cur = count($this->cc); + $this->cc[$cur][0] = trim($address); + $this->cc[$cur][1] = $name; + } + + /** + * Adds a "Bcc" address. Note: this function works + * with the SMTP mailer on win32, not with the "mail" + * mailer. + * @param string $address + * @param string $name + * @return void + */ + function AddBCC($address, $name = "") { + $cur = count($this->bcc); + $this->bcc[$cur][0] = trim($address); + $this->bcc[$cur][1] = $name; + } + + /** + * Adds a "Reply-to" address. + * @param string $address + * @param string $name + * @return void + */ + function AddReplyTo($address, $name = "") { + $cur = count($this->ReplyTo); + $this->ReplyTo[$cur][0] = trim($address); + $this->ReplyTo[$cur][1] = $name; + } + + + ///////////////////////////////////////////////// + // MAIL SENDING METHODS + ///////////////////////////////////////////////// + + /** + * Creates message and assigns Mailer. If the message is + * not sent successfully then it returns false. Use the ErrorInfo + * variable to view description of the error. + * @return bool + */ + function Send() { + $header = ""; + $body = ""; + $result = true; + + if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) + { + $this->SetError($this->Lang("provide_address")); + return false; + } + + // Set whether the message is multipart/alternative + if(!empty($this->AltBody)) + $this->ContentType = "multipart/alternative"; + + $this->error_count = 0; // reset errors + $this->SetMessageType(); + $header .= $this->CreateHeader(); + $body = $this->CreateBody(); + + if($body == "") { return false; } + + // Choose the mailer + switch($this->Mailer) + { + case "sendmail": + $result = $this->SendmailSend($header, html_entity_decode($body,ENT_COMPAT,$this->CharSet)); + break; + case "mail": + $result = $this->MailSend($header, html_entity_decode($body,ENT_COMPAT,$this->CharSet)); + break; + case "smtp": + $result = $this->SmtpSend($header, html_entity_decode($body,ENT_COMPAT,$this->CharSet)); + break; + default: + $this->SetError($this->Mailer . $this->Lang("mailer_not_supported")); + $result = false; + break; + } + + return $result; + } + + /** + * Sends mail using the $Sendmail program. + * @access private + * @return bool + */ + function SendmailSend($header, $body) { + if ($this->Sender != "") + $sendmail = sprintf("%s -oi -f %s -t", $this->Sendmail, $this->Sender); + else + $sendmail = sprintf("%s -oi -t", $this->Sendmail); + + if(!@$mail = popen($sendmail, "w")) + { + $this->SetError($this->Lang("execute") . $this->Sendmail); + return false; + } + + fputs($mail, $header); + fputs($mail, $body); + + $result = pclose($mail) >> 8 & 0xFF; + if($result != 0) + { + $this->SetError($this->Lang("execute") . $this->Sendmail); + return false; + } + + return true; + } + + /** + * Sends mail using the PHP mail() function. + * @access private + * @return bool + */ + function MailSend($header, $body) { + $to = ""; + for($i = 0; $i < count($this->to); $i++) + { + if($i != 0) { $to .= ", "; } + $to .= $this->to[$i][0]; + } + + if ($this->Sender != "" && strlen(ini_get("safe_mode"))< 1) + { + $old_from = ini_get("sendmail_from"); + ini_set("sendmail_from", $this->Sender); + $params = sprintf("-oi -f %s", $this->Sender); + $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, + $header, $params); + } + else + $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, $header); + + if (isset($old_from)) + ini_set("sendmail_from", $old_from); + + if(!$rt) + { + $this->SetError($this->Lang("instantiate")); + return false; + } + + return true; + } + + /** + * Sends mail via SMTP using PhpSMTP (Author: + * Chris Ryan). Returns bool. Returns false if there is a + * bad MAIL FROM, RCPT, or DATA input. + * @access private + * @return bool + */ + function SmtpSend($header, $body) { + include_once($this->PluginDir . "class.smtp.php"); + $error = ""; + $bad_rcpt = array(); + + if(!$this->SmtpConnect()) + return false; + + $smtp_from = ($this->Sender == "") ? $this->From : $this->Sender; + if(!$this->smtp->Mail($smtp_from)) + { + $error = $this->Lang("from_failed") . $smtp_from; + $this->SetError($error); + $this->smtp->Reset(); + return false; + } + + // Attempt to send attach all recipients + for($i = 0; $i < count($this->to); $i++) + { + if(!$this->smtp->Recipient($this->to[$i][0])) + $bad_rcpt[] = $this->to[$i][0]; + } + for($i = 0; $i < count($this->cc); $i++) + { + if(!$this->smtp->Recipient($this->cc[$i][0])) + $bad_rcpt[] = $this->cc[$i][0]; + } + for($i = 0; $i < count($this->bcc); $i++) + { + if(!$this->smtp->Recipient($this->bcc[$i][0])) + $bad_rcpt[] = $this->bcc[$i][0]; + } + + if(count($bad_rcpt) > 0) // Create error message + { + for($i = 0; $i < count($bad_rcpt); $i++) + { + if($i != 0) { $error .= ", "; } + $error .= $bad_rcpt[$i]; + } + $error = $this->Lang("recipients_failed") . $error; + $this->SetError($error); + $this->smtp->Reset(); + return false; + } + + if(!$this->smtp->Data($header . $body)) + { + $this->SetError($this->Lang("data_not_accepted")); + $this->smtp->Reset(); + return false; + } + if($this->SMTPKeepAlive == true) + $this->smtp->Reset(); + else + $this->SmtpClose(); + + return true; + } + + /** + * Initiates a connection to an SMTP server. Returns false if the + * operation failed. + * @access private + * @return bool + */ + function SmtpConnect() { + if($this->smtp == NULL) { $this->smtp = new SMTP(); } + + $this->smtp->do_debug = $this->SMTPDebug; + $hosts = explode(";", $this->Host); + $index = 0; + $connection = ($this->smtp->Connected()); + + // Retry while there is no connection + while($index < count($hosts) && $connection == false) + { + if(strstr($hosts[$index], ":")) + { + #list($host, $port) = explode(":", $hosts[$index]); + $hostA = explode(':', $hosts[$index]); + if (is_numeric(end($hostA))) + $port = array_pop($hostA); + else + $port = $this->Port; + $host = implode(':', $hostA); + } + else + { + $host = $hosts[$index]; + $port = $this->Port; + } + + if($this->smtp->Connect($host, $port, $this->Timeout)) + { + if ($this->Helo != '') + $this->smtp->Hello($this->Helo); + else + $this->smtp->Hello($this->ServerHostname()); + + if($this->SMTPAuth) + { + if(!$this->smtp->Authenticate($this->Username, + $this->Password)) + { + $this->SetError($this->Lang("authenticate")); + $this->smtp->Reset(); + $connection = false; + } + } + $connection = true; + } + $index++; + } + if(!$connection) + $this->SetError($this->Lang("connect_host")); + + return $connection; + } + + /** + * Closes the active SMTP session if one exists. + * @return void + */ + function SmtpClose() { + if($this->smtp != NULL) + { + if($this->smtp->Connected()) + { + $this->smtp->Quit(); + $this->smtp->Close(); + } + } + } + + /** + * Sets the language for all class error messages. Returns false + * if it cannot load the language file. The default language type + * is English. + * @param string $lang_type Type of language (e.g. Portuguese: "br") + * @param string $lang_path Path to the language file directory + * @access public + * @return bool + */ + function SetLanguage($lang_type, $lang_path = "language/") { + global $root_directory; + if(file_exists($root_directory.'/modules/Emails/'.$lang_path.'phpmailer.lang-'.$lang_type.'.php')) + include($root_directory.'/modules/Emails/'.$lang_path.'phpmailer.lang-'.$lang_type.'.php'); + else if(file_exists($root_directory.'/modules/Emails/'.$lang_path.'phpmailer.lang-en.php')) + include($root_directory.'/modules/Emails/'.$lang_path.'phpmailer.lang-en.php'); + else + { + $this->SetError("Could not load language file"); + return false; + } + $this->language = $PHPMAILER_LANG; + + return true; + } + + ///////////////////////////////////////////////// + // MESSAGE CREATION METHODS + ///////////////////////////////////////////////// + + /** + * Creates recipient vtiger_headers. + * @access private + * @return string + */ + function AddrAppend($type, $addr) { + $addr_str = $type . ": "; + $addr_str .= $this->AddrFormat($addr[0]); + if(count($addr) > 1) + { + for($i = 1; $i < count($addr); $i++) + $addr_str .= ", " . $this->AddrFormat($addr[$i]); + } + $addr_str .= $this->LE; + + return $addr_str; + } + + /** + * Formats an address correctly. + * @access private + * @return string + */ + function AddrFormat($addr) { + if(empty($addr[1])) + $formatted = $addr[0]; + else + { + $formatted = $this->EncodeHeader($addr[1], 'phrase') . " <" . + $addr[0] . ">"; + } + + return $formatted; + } + + /** + * Wraps message for use with mailers that do not + * automatically perform wrapping and for quoted-printable. + * Original written by philippe. + * @access private + * @return string + */ + function WrapText($message, $length, $qp_mode = false) { + $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE; + + $message = $this->FixEOL($message); + if (substr($message, -1) == $this->LE) + $message = substr($message, 0, -1); + + $line = explode($this->LE, $message); + $message = ""; + for ($i=0 ;$i < count($line); $i++) + { + $line_part = explode(" ", $line[$i]); + $buf = ""; + for ($e = 0; $e $length)) + { + $space_left = $length - strlen($buf) - 1; + if ($e != 0) + { + if ($space_left > 20) + { + $len = $space_left; + if (substr($word, $len - 1, 1) == "=") + $len--; + elseif (substr($word, $len - 2, 1) == "=") + $len -= 2; + $part = substr($word, 0, $len); + $word = substr($word, $len); + $buf .= " " . $part; + $message .= $buf . sprintf("=%s", $this->LE); + } + else + { + $message .= $buf . $soft_break; + } + $buf = ""; + } + while (strlen($word) > 0) + { + $len = $length; + if (substr($word, $len - 1, 1) == "=") + $len--; + elseif (substr($word, $len - 2, 1) == "=") + $len -= 2; + $part = substr($word, 0, $len); + $word = substr($word, $len); + + if (strlen($word) > 0) + $message .= $part . sprintf("=%s", $this->LE); + else + $buf = $part; + } + } + else + { + $buf_o = $buf; + $buf .= ($e == 0) ? $word : (" " . $word); + + if (strlen($buf) > $length and $buf_o != "") + { + $message .= $buf_o . $soft_break; + $buf = $word; + } + } + } + $message .= $buf . $this->LE; + } + + return $message; + } + + /** + * Set the body wrapping. + * @access private + * @return void + */ + function SetWordWrap() { + if($this->WordWrap < 1) + return; + + switch($this->message_type) + { + case "alt": + // fall through + case "alt_attachments": + $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap); + break; + default: + $this->Body = $this->WrapText($this->Body, $this->WordWrap); + break; + } + } + + /** + * Assembles message header. + * @access private + * @return string + */ + function CreateHeader() { + $result = ""; + + // Set the boundaries + $uniq_id = md5(uniqid(time())); + $this->boundary[1] = "b1_" . $uniq_id; + $this->boundary[2] = "b2_" . $uniq_id; + + $result .= $this->HeaderLine("Date", $this->RFCDate()); + if($this->Sender == "") + $result .= $this->HeaderLine("Return-Path", trim($this->From)); + else + $result .= $this->HeaderLine("Return-Path", trim($this->Sender)); + + // To be created automatically by mail() + if($this->Mailer != "mail") + { + if(count($this->to) > 0) + $result .= $this->AddrAppend("To", $this->to); + else if (count($this->cc) == 0) + $result .= $this->HeaderLine("To", "undisclosed-recipients:;"); + if(count($this->cc) > 0) + $result .= $this->AddrAppend("Cc", $this->cc); + } + + $from = array(); + $from[0][0] = trim($this->From); + $from[0][1] = $this->FromName; + $result .= $this->AddrAppend("From", $from); + + // sendmail and mail() extract Bcc from the header before sending + if((($this->Mailer == "sendmail") || ($this->Mailer == "mail")) && (count($this->bcc) > 0)) + $result .= $this->AddrAppend("Bcc", $this->bcc); + + if(count($this->ReplyTo) > 0) + $result .= $this->AddrAppend("Reply-to", $this->ReplyTo); + + // mail() sets the subject itself + if($this->Mailer != "mail") + $result .= $this->HeaderLine("Subject", $this->EncodeHeader(trim($this->Subject))); + + $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); + $result .= $this->HeaderLine("X-Priority", $this->Priority); + $result .= $this->HeaderLine("X-Mailer", "PHPMailer [version " . $this->Version . "]"); + + if($this->ConfirmReadingTo != "") + { + $result .= $this->HeaderLine("Disposition-Notification-To", + "<" . trim($this->ConfirmReadingTo) . ">"); + } + + // Add custom vtiger_headers + for($index = 0; $index < count($this->CustomHeader); $index++) + { + $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), + $this->EncodeHeader(trim($this->CustomHeader[$index][1]))); + } + $result .= $this->HeaderLine("MIME-Version", "1.0"); + + switch($this->message_type) + { + case "plain": + $result .= $this->HeaderLine("Content-Transfer-Encoding", $this->Encoding); + $result .= sprintf("Content-Type: %s; charset=\"%s\"", + $this->ContentType, $this->CharSet); + break; + case "attachments": + // fall through + case "alt_attachments": + if($this->InlineImageExists()) + { + $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", + "multipart/related", $this->LE, $this->LE, + $this->boundary[1], $this->LE); + } + else + { + $result .= $this->HeaderLine("Content-Type", "multipart/mixed;"); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + } + break; + case "alt": + $result .= $this->HeaderLine("Content-Type", "multipart/alternative;"); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + } + + if($this->Mailer != "mail") + $result .= $this->LE.$this->LE; + + return $result; + } + + /** + * Assembles the message body. Returns an empty string on failure. + * @access private + * @return string + */ + function CreateBody() { + $result = ""; + + $this->SetWordWrap(); + + switch($this->message_type) + { + case "alt": + $result .= $this->GetBoundary($this->boundary[1], "", + "text/plain", ""); + $result .= $this->EncodeString($this->AltBody, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->GetBoundary($this->boundary[1], "", + "text/html", ""); + + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE.$this->LE; + + $result .= $this->EndBoundary($this->boundary[1]); + break; + case "plain": + $result .= $this->EncodeString($this->Body, $this->Encoding); + break; + case "attachments": + $result .= $this->GetBoundary($this->boundary[1], "", "", ""); + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE; + + $result .= $this->AttachAll(); + break; + case "alt_attachments": + $result .= sprintf("--%s%s", $this->boundary[1], $this->LE); + $result .= sprintf("Content-Type: %s;%s" . + "\tboundary=\"%s\"%s", + "multipart/alternative", $this->LE, + $this->boundary[2], $this->LE.$this->LE); + + // Create text body + $result .= $this->GetBoundary($this->boundary[2], "", + "text/plain", "") . $this->LE; + + $result .= $this->EncodeString($this->AltBody, $this->Encoding); + $result .= $this->LE.$this->LE; + + // Create the HTML body + $result .= $this->GetBoundary($this->boundary[2], "", + "text/html", "") . $this->LE; + + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE.$this->LE; + + $result .= $this->EndBoundary($this->boundary[2]); + + $result .= $this->AttachAll(); + break; + } + if($this->IsError()) + $result = ""; + + return $result; + } + + /** + * Returns the start of a message boundary. + * @access private + */ + function GetBoundary($boundary, $charSet, $contentType, $encoding) { + $result = ""; + if($charSet == "") { $charSet = $this->CharSet; } + if($contentType == "") { $contentType = $this->ContentType; } + if($encoding == "") { $encoding = $this->Encoding; } + + $result .= $this->TextLine("--" . $boundary); + $result .= sprintf("Content-Type: %s; charset = \"%s\"", + $contentType, $charSet); + $result .= $this->LE; + $result .= $this->HeaderLine("Content-Transfer-Encoding", $encoding); + $result .= $this->LE; + + return $result; + } + + /** + * Returns the end of a message boundary. + * @access private + */ + function EndBoundary($boundary) { + return $this->LE . "--" . $boundary . "--" . $this->LE; + } + + /** + * Sets the message type. + * @access private + * @return void + */ + function SetMessageType() { + if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) + $this->message_type = "plain"; + else + { + if(count($this->attachment) > 0) + $this->message_type = "attachments"; + if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) + $this->message_type = "alt"; + if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) + $this->message_type = "alt_attachments"; + } + } + + /** + * Returns a formatted header line. + * @access private + * @return string + */ + function HeaderLine($name, $value) { + return $name . ": " . $value . $this->LE; + } + + /** + * Returns a formatted mail line. + * @access private + * @return string + */ + function TextLine($value) { + return $value . $this->LE; + } + + ///////////////////////////////////////////////// + // ATTACHMENT METHODS + ///////////////////////////////////////////////// + + /** + * Adds an attachment from a path on the vtiger_filesystem. + * Returns false if the file could not be found + * or accessed. + * @param string $path Path to the attachment. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return bool + */ + function AddAttachment($path, $name = "", $encoding = "base64", + $type = "application/octet-stream") { + if(!@is_file($path)) + { + $this->SetError($this->Lang("file_access") . $path); + return false; + } + + $filename = basename($path); + if($name == "") + $name = $filename; + + $cur = count($this->attachment); + $this->attachment[$cur][0] = $path; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $name; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = false; // isStringAttachment + $this->attachment[$cur][6] = "attachment"; + $this->attachment[$cur][7] = 0; + + return true; + } + + /** + * Attaches all fs, string, and binary vtiger_attachments to the message. + * Returns an empty string on failure. + * @access private + * @return string + */ + function AttachAll() { + // Return text of body + $mime = array(); + + // Add all vtiger_attachments + for($i = 0; $i < count($this->attachment); $i++) + { + // Check for string attachment + $bString = $this->attachment[$i][5]; + if ($bString) + $string = $this->attachment[$i][0]; + else + $path = $this->attachment[$i][0]; + + $filename = $this->attachment[$i][1]; + $name = $this->attachment[$i][2]; + $encoding = $this->attachment[$i][3]; + $type = $this->attachment[$i][4]; + $disposition = $this->attachment[$i][6]; + $cid = $this->attachment[$i][7]; + + $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE); + $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $name, $this->LE); + $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE); + + if($disposition == "inline") + $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE); + + $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", + $disposition, $name, $this->LE.$this->LE); + + // Encode as string attachment + if($bString) + { + $mime[] = $this->EncodeString($string, $encoding); + if($this->IsError()) { return ""; } + $mime[] = $this->LE.$this->LE; + } + else + { + $mime[] = $this->EncodeFile($path, $encoding); + if($this->IsError()) { return ""; } + $mime[] = $this->LE.$this->LE; + } + } + + $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE); + + return join("", $mime); + } + + /** + * Encodes attachment in requested format. Returns an + * empty string on failure. + * @access private + * @return string + */ + function EncodeFile ($path, $encoding = "base64") { + if(!@$fd = fopen($path, "rb")) + { + $this->SetError($this->Lang("file_open") . $path); + return ""; + } + $magic_quotes = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $file_buffer = fread($fd, filesize($path)); + $file_buffer = $this->EncodeString($file_buffer, $encoding); + fclose($fd); + set_magic_quotes_runtime($magic_quotes); + + return $file_buffer; + } + + /** + * Encodes string to requested format. Returns an + * empty string on failure. + * @access private + * @return string + */ + function EncodeString ($str, $encoding = "base64") { + $encoded = ""; + switch(strtolower($encoding)) { + case "base64": + // chunk_split is found in PHP >= 3.0.6 + $encoded = chunk_split(base64_encode($str), 76, $this->LE); + break; + case "7bit": + case "8bit": + $encoded = $this->FixEOL($str); + if (substr($encoded, -(strlen($this->LE))) != $this->LE) + $encoded .= $this->LE; + break; + case "binary": + $encoded = $str; + break; + case "quoted-printable": + $encoded = $this->EncodeQP($str); + break; + default: + $this->SetError($this->Lang("encoding") . $encoding); + break; + } + return $encoded; + } + + /** + * Encode a header string to best of Q, B, quoted or none. + * @access private + * @return string + */ + function EncodeHeader ($str, $position = 'text') { + $x = 0; + + switch (strtolower($position)) { + case 'phrase': + if (!preg_match('/[\200-\377]/', $str)) { + // Can't use addslashes as we don't know what value has magic_quotes_sybase. + $encoded = addcslashes($str, "\0..\37\177\\\""); + + if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) + return ($encoded); + else + return ("\"$encoded\""); + } + $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); + break; + case 'comment': + $x = preg_match_all('/[()"]/', $str, $matches); + // Fall-through + case 'text': + default: + $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); + break; + } + + if ($x == 0) + return ($str); + + $maxlen = 75 - 7 - strlen($this->CharSet); + // Try to select the encoding which should produce the shortest output + if (strlen($str)/3 < $x) { + $encoding = 'B'; + $encoded = base64_encode($str); + $maxlen -= $maxlen % 4; + $encoded = trim(chunk_split($encoded, $maxlen, "\n")); + } else { + $encoding = 'Q'; + $encoded = $this->EncodeQ($str, $position); + $encoded = $this->WrapText($encoded, $maxlen, true); + $encoded = str_replace("=".$this->LE, "\n", trim($encoded)); + } + + $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded); + $encoded = trim(str_replace("\n", $this->LE, $encoded)); + + return $encoded; + } + + /** + * Encode string to quoted-printable. + * @access private + * @return string + */ + function EncodeQP ($str) { + $encoded = $this->FixEOL($str); + if (substr($encoded, -(strlen($this->LE))) != $this->LE) + $encoded .= $this->LE; + + // Replace every high ascii, control and = characters + $encoded = preg_replace('/([\000-\010\013\014\016-\037\075\177-\377])/e', + "'='.sprintf('%02X', ord('\\1'))", $encoded); + // Replace every spaces and vtiger_tabs when it's the last character on a line + $encoded = preg_replace("/([\011\040])".$this->LE."/e", + "'='.sprintf('%02X', ord('\\1')).'".$this->LE."'", $encoded); + + // Maximum line length of 76 characters before CRLF (74 + space + '=') + $encoded = $this->WrapText($encoded, 74, true); + + return $encoded; + } + + /** + * Encode string to q encoding. + * @access private + * @return string + */ + function EncodeQ ($str, $position = "text") { + // There should not be any EOL in the string + $encoded = preg_replace("[\r\n]", "", $str); + + switch (strtolower($position)) { + case "phrase": + $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + case "comment": + $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + case "text": + default: + // Replace every high ascii, control =, ? and _ characters + $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e', + "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + } + + // Replace every spaces to _ (more readable than =20) + $encoded = str_replace(" ", "_", $encoded); + + return $encoded; + } + + /** + * Adds a string or binary attachment (non-filesystem) to the list. + * This method can be used to attach ascii or binary data, + * such as a BLOB record from a database. + * @param string $string String attachment data. + * @param string $filename Name of the attachment. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return void + */ + function AddStringAttachment($string, $filename, $encoding = "base64", + $type = "application/octet-stream") { + // Append to $attachment array + $cur = count($this->attachment); + $this->attachment[$cur][0] = $string; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $filename; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = true; // isString + $this->attachment[$cur][6] = "attachment"; + $this->attachment[$cur][7] = 0; + } + + /** + * Adds an embedded attachment. This can include images, sounds, and + * just about any other document. Make sure to set the $type to an + * image type. For JPEG images use "image/jpeg" and for GIF images + * use "image/gif". + * @param string $path Path to the attachment. + * @param string $cid Content ID of the attachment. Use this to identify + * the Id for accessing the image in an HTML form. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return bool + */ + function AddEmbeddedImage($path, $cid, $name = "", $encoding = "base64", + $type = "application/octet-stream") { + + if(!@is_file($path)) + { + $this->SetError($this->Lang("file_access") . $path); + return false; + } + + $filename = basename($path); + if($name == "") + $name = $filename; + + // Append to $attachment array + $cur = count($this->attachment); + $this->attachment[$cur][0] = $path; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $name; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = false; // isStringAttachment + $this->attachment[$cur][6] = "inline"; + $this->attachment[$cur][7] = $cid; + + return true; + } + + /** + * Returns true if an inline attachment is present. + * @access private + * @return bool + */ + function InlineImageExists() { + $result = false; + for($i = 0; $i < count($this->attachment); $i++) + { + if($this->attachment[$i][6] == "inline") + { + $result = true; + break; + } + } + + return $result; + } + + ///////////////////////////////////////////////// + // MESSAGE RESET METHODS + ///////////////////////////////////////////////// + + /** + * Clears all recipients assigned in the TO array. Returns void. + * @return void + */ + function ClearAddresses() { + $this->to = array(); + } + + /** + * Clears all recipients assigned in the CC array. Returns void. + * @return void + */ + function ClearCCs() { + $this->cc = array(); + } + + /** + * Clears all recipients assigned in the BCC array. Returns void. + * @return void + */ + function ClearBCCs() { + $this->bcc = array(); + } + + /** + * Clears all recipients assigned in the ReplyTo array. Returns void. + * @return void + */ + function ClearReplyTos() { + $this->ReplyTo = array(); + } + + /** + * Clears all recipients assigned in the TO, CC and BCC + * array. Returns void. + * @return void + */ + function ClearAllRecipients() { + $this->to = array(); + $this->cc = array(); + $this->bcc = array(); + } + + /** + * Clears all previously set vtiger_filesystem, string, and binary + * vtiger_attachments. Returns void. + * @return void + */ + function ClearAttachments() { + $this->attachment = array(); + } + + /** + * Clears all custom vtiger_headers. Returns void. + * @return void + */ + function ClearCustomHeaders() { + $this->CustomHeader = array(); + } + + + ///////////////////////////////////////////////// + // MISCELLANEOUS METHODS + ///////////////////////////////////////////////// + + /** + * Adds the error message to the error container. + * Returns void. + * @access private + * @return void + */ + function SetError($msg) { + $this->error_count++; + $this->ErrorInfo = $msg; + } + + /** + * Returns the proper RFC 822 formatted date. + * @access private + * @return string + */ + function RFCDate() { + $tz = date("Z"); + $tzs = ($tz < 0) ? "-" : "+"; + $tz = abs($tz); + $tz = ($tz/3600)*100 + ($tz%3600)/60; + $result = sprintf("%s %s%04d", date("D, j M Y H:i:s"), $tzs, $tz); + + return $result; + } + + /** + * Returns the appropriate server variable. Should work with both + * PHP 4.1.0+ as well as older versions. Returns an empty string + * if nothing is found. + * @access private + * @return mixed + */ + function ServerVar($varName) { + global $HTTP_SERVER_VARS; + global $HTTP_ENV_VARS; + + if(!isset($_SERVER)) + { + $_SERVER = $HTTP_SERVER_VARS; + if(!isset($_SERVER["REMOTE_ADDR"])) + $_SERVER = $HTTP_ENV_VARS; // must be Apache + } + + if(isset($_SERVER[$varName])) + return $_SERVER[$varName]; + else + return ""; + } + + /** + * Returns the server hostname or 'localhost.localdomain' if unknown. + * @access private + * @return string + */ + function ServerHostname() { + if ($this->Hostname != "") + $result = $this->Hostname; + elseif ($this->ServerVar('SERVER_NAME') != "") + $result = $this->ServerVar('SERVER_NAME'); + else + $result = "localhost.localdomain"; + + return $result; + } + + /** + * Returns a message in the appropriate language. + * @access private + * @return string + */ + function Lang($key) { + require_once('config.inc.php'); + global $default_language; + if(count($this->language) < 1) + $this->SetLanguage($default_language); + + if(isset($this->language[$key])) + return $this->language[$key]; + else + return "Language string failed to load: " . $key; + } + + /** + * Returns true if an error occurred. + * @return bool + */ + function IsError() { + return ($this->error_count > 0); + } + + /** + * Changes every end of line from CR or LF to CRLF. + * @access private + * @return string + */ + function FixEOL($str) { + $str = str_replace("\r\n", "\n", $str); + $str = str_replace("\r", "\n", $str); + $str = str_replace("\n", $this->LE, $str); + return $str; + } + + /** + * Adds a custom header. + * @return void + */ + function AddCustomHeader($custom_header) { + $this->CustomHeader[] = explode(":", $custom_header, 2); + } +} + +?> diff --git a/oss/vtiger/trunk/modules/Emails/class.smtp.php b/oss/vtiger/trunk/modules/Emails/class.smtp.php new file mode 100644 index 00000000..abba3404 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/class.smtp.php @@ -0,0 +1,1050 @@ +smtp_conn = 0; + $this->error = null; + $this->helo_rply = null; + + $this->do_debug = 0; + } + + /************************************************************* + * CONNECTION FUNCTIONS * + ***********************************************************/ + + /** + * Connect to the server specified on the port specified. + * If the port is not specified use the default SMTP_PORT. + * If tval is specified then a connection will try and be + * established with the server for that number of seconds. + * If tval is not specified the default is 30 seconds to + * try on the connection. + * + * SMTP CODE SUCCESS: 220 + * SMTP CODE FAILURE: 421 + * @access public + * @return bool + */ + function Connect($host,$port=0,$tval=30) { + # set the error val to null so there is no confusion + $this->error = null; + + # make sure we are __not__ connected + if($this->connected()) { + # ok we are connected! what should we do? + # for now we will just give an error saying we + # are already connected + $this->error = + array("error" => "Already connected to a server"); + return false; + } + + if(empty($port)) { + $port = $this->SMTP_PORT; + } + + #connect to the smtp server + if(!@$this->smtp_conn = fsockopen($host, # the host of the server + $port, # the port to use + $errno, # error number if any + $errstr, # error message if any + $tval)) # give up after ? secs + { + //echo '
Could Not connect to Mail Server

'; + return false; + } + + # verify we connected properly + if(empty($this->smtp_conn)) { + $this->error = array("error" => "Failed to connect to server", + "errno" => $errno, + "errstr" => $errstr); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": $errstr ($errno)" . $this->CRLF; + } + return false; + } + + # sometimes the SMTP server takes a little longer to respond + # so we will give it a longer timeout for the first read + // Windows still does not have support for this timeout function + if(substr(PHP_OS, 0, 3) != "WIN") + socket_set_timeout($this->smtp_conn, $tval, 0); + + # get any vtiger_announcement stuff + $announce = $this->get_lines(); + + # set the timeout of any socket functions at 1/10 of a second + //if(function_exists("socket_set_timeout")) + // socket_set_timeout($this->smtp_conn, 0, 100000); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce; + } + + return true; + } + + /** + * Performs SMTP authentication. Must be run after running the + * Hello() method. Returns true if successfully authenticated. + * @access public + * @return bool + */ + function Authenticate($username, $password) { + // Start authentication + fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "AUTH not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + // Send encoded username + fputs($this->smtp_conn, base64_encode($username) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "Username not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + // Send encoded password + fputs($this->smtp_conn, base64_encode($password) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 235) { + $this->error = + array("error" => "Password not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return true; + } + + /** + * Returns true if connected to a server otherwise false + * @access private + * @return bool + */ + function Connected() { + if(!empty($this->smtp_conn)) { + $sock_status = socket_get_status($this->smtp_conn); + if($sock_status["eof"]) { + # hmm this is an odd situation... the socket is + # valid but we aren't connected anymore + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE:" . $this->CRLF . + "EOF caught while checking if connected"; + } + $this->Close(); + return false; + } + return true; # everything looks good + } + return false; + } + + /** + * Closes the socket and cleans up the state of the class. + * It is not considered good to use this function without + * first trying to use QUIT. + * @access public + * @return void + */ + function Close() { + $this->error = null; # so there is no confusion + $this->helo_rply = null; + if(!empty($this->smtp_conn)) { + # close the connection and cleanup + fclose($this->smtp_conn); + $this->smtp_conn = 0; + } + } + + + /*************************************************************** + * SMTP COMMANDS * + *************************************************************/ + + /** + * Issues a data command and sends the msg_data to the server + * finializing the mail transaction. $msg_data is the message + * that is to be send with the vtiger_headers. Each header needs to be + * on a single line followed by a with the message vtiger_headers + * and the message body being seperated by and additional . + * + * Implements rfc 821: DATA + * + * SMTP CODE INTERMEDIATE: 354 + * [data] + * . + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 552,554,451,452 + * SMTP CODE FAILURE: 451,554 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + function Data($msg_data) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Data() without being connected"); + return false; + } + + fputs($this->smtp_conn,"DATA" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 354) { + $this->error = + array("error" => "DATA command not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + # the server is ready to accept data! + # according to rfc 821 we should not send more than 1000 + # including the CRLF + # characters on a single line so we will break the data up + # into lines by \r and/or \n then if needed we will break + # each of those into smaller lines to fit within the limit. + # in addition we will be looking for lines that start with + # a period '.' and append and additional period '.' to that + # line. NOTE: this does not count towards are limit. + + # normalize the line breaks so we know the explode works + $msg_data = str_replace("\r\n","\n",$msg_data); + $msg_data = str_replace("\r","\n",$msg_data); + $lines = explode("\n",$msg_data); + + # we need to find a good way to determine is vtiger_headers are + # in the msg_data or if it is a straight msg body + # currently I'm assuming rfc 822 definitions of msg vtiger_headers + # and if the first vtiger_field of the first line (':' sperated) + # does not contain a space then it _should_ be a header + # and we can process all lines before a blank "" line as + # vtiger_headers. + $field = substr($lines[0],0,strpos($lines[0],":")); + $in_headers = false; + if(!empty($field) && !strstr($field," ")) { + $in_headers = true; + } + + $max_line_length = 998; # used below; set here for ease in change + + while(list(,$line) = @each($lines)) { + $lines_out = null; + if($line == "" && $in_headers) { + $in_headers = false; + } + # ok we need to break this line up into several + # smaller lines + while(strlen($line) > $max_line_length) { + $pos = strrpos(substr($line,0,$max_line_length)," "); + + # Patch to fix DOS attack + if(!$pos) { + $pos = $max_line_length - 1; + } + + $lines_out[] = substr($line,0,$pos); + $line = substr($line,$pos + 1); + # if we are processing vtiger_headers we need to + # add a LWSP-char to the front of the new line + # rfc 822 on long msg vtiger_headers + if($in_headers) { + $line = "\t" . $line; + } + } + $lines_out[] = $line; + + # now send the lines to the server + while(list(,$line_out) = @each($lines_out)) { + if(strlen($line_out) > 0) + { + if(substr($line_out, 0, 1) == ".") { + $line_out = "." . $line_out; + } + } + fputs($this->smtp_conn,$line_out . $this->CRLF); + } + } + + # ok all the message data has been sent so lets get this + # over with aleady + fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "DATA not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Expand takes the name and asks the server to list all the + * people who are members of the _list_. Expand will return + * back and array of the result or false if an error occurs. + * Each value in the array returned has the format of: + * [ ] + * The definition of is defined in rfc 821 + * + * Implements rfc 821: EXPN + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 550 + * SMTP CODE ERROR : 500,501,502,504,421 + * @access public + * @return string array + */ + function Expand($name) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Expand() without being connected"); + return false; + } + + fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "EXPN not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + # parse the reply and place in our array to return to user + $entries = explode($this->CRLF,$rply); + while(list(,$l) = @each($entries)) { + $list[] = substr($l,4); + } + + return $list; + } + + /** + * Sends the HELO command to the smtp server. + * This makes sure that we and the server are in + * the same known state. + * + * Implements from rfc 821: HELO + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500, 501, 504, 421 + * @access public + * @return bool + */ + function Hello($host="") { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Hello() without being connected"); + return false; + } + + # if a hostname for the HELO wasn't specified determine + # a suitable one to send + if(empty($host)) { + # we need to determine some sort of appopiate default + # to send to the server + $host = "localhost"; + } + + // Send extended hello first (RFC 2821) + if(!$this->SendHello("EHLO", $host)) + { + if(!$this->SendHello("HELO", $host)) + return false; + } + + return true; + } + + /** + * Sends a HELO/EHLO command. + * @access private + * @return bool + */ + function SendHello($hello, $host) { + fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => $hello . " not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + $this->helo_rply = $rply; + + return true; + } + + /** + * Gets help information on the keyword specified. If the keyword + * is not specified then returns generic help, ussually contianing + * A list of keywords that help is available on. This function + * returns the results back to the user. It is up to the user to + * handle the returned data. If an error occurs then false is + * returned with $this->error set appropiately. + * + * Implements rfc 821: HELP [ ] + * + * SMTP CODE SUCCESS: 211,214 + * SMTP CODE ERROR : 500,501,502,504,421 + * @access public + * @return string + */ + function Help($keyword="") { + $this->error = null; # to avoid confusion + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Help() without being connected"); + return false; + } + + $extra = ""; + if(!empty($keyword)) { + $extra = " " . $keyword; + } + + fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 211 && $code != 214) { + $this->error = + array("error" => "HELP not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return $rply; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. + * + * Implements rfc 821: MAIL FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,421 + * @access public + * @return bool + */ + function Mail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Mail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "MAIL not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the command NOOP to the SMTP server. + * + * Implements from rfc 821: NOOP + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500, 421 + * @access public + * @return bool + */ + function Noop() { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Noop() without being connected"); + return false; + } + + fputs($this->smtp_conn,"NOOP" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "NOOP not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the quit command to the server and then closes the socket + * if there is no error or the $close_on_error argument is true. + * + * Implements from rfc 821: QUIT + * + * SMTP CODE SUCCESS: 221 + * SMTP CODE ERROR : 500 + * @access public + * @return bool + */ + function Quit($close_on_error=true) { + $this->error = null; # so there is no confusion + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Quit() without being connected"); + return false; + } + + # send the quit command to the server + fputs($this->smtp_conn,"quit" . $this->CRLF); + + # get any good-bye messages + $byemsg = $this->get_lines(); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg; + } + + $rval = true; + $e = null; + + $code = substr($byemsg,0,3); + if($code != 221) { + # use e as a tmp var cause Close will overwrite $this->error + $e = array("error" => "SMTP server rejected quit command", + "smtp_code" => $code, + "smtp_rply" => substr($byemsg,4)); + $rval = false; + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $e["error"] . ": " . + $byemsg . $this->CRLF; + } + } + + if(empty($e) || $close_on_error) { + $this->Close(); + } + + return $rval; + } + + /** + * Sends the command RCPT to the SMTP server with the TO: argument of $to. + * Returns true if the recipient was accepted false if it was rejected. + * + * Implements from rfc 821: RCPT TO: + * + * SMTP CODE SUCCESS: 250,251 + * SMTP CODE FAILURE: 550,551,552,553,450,451,452 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + function Recipient($to) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Recipient() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250 && $code != 251) { + $this->error = + array("error" => "RCPT not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the RSET command to abort and transaction that is + * currently in progress. Returns true if successful false + * otherwise. + * + * Implements rfc 821: RSET + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500,501,504,421 + * @access public + * @return bool + */ + function Reset() { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Reset() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RSET" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "RSET failed", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the vtiger_users terminal if they are logged + * in. + * + * Implements rfc 821: SEND FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function Send($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Send() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SEND not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the vtiger_users terminal if they are logged + * in and send them an email. + * + * Implements rfc 821: SAML FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function SendAndMail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called SendAndMail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SAML not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the vtiger_users terminal if they are logged + * in or mail it to them if they are not. + * + * Implements rfc 821: SOML FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function SendOrMail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called SendOrMail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SOML not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * This is an optional command for SMTP that this class does not + * support. This method is here to make the RFC821 Definition + * complete for this class and __may__ be implimented in the future + * + * Implements from rfc 821: TURN + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 502 + * SMTP CODE ERROR : 500, 503 + * @access public + * @return bool + */ + function Turn() { + $this->error = array("error" => "This method, TURN, of the SMTP ". + "is not implemented"); + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF; + } + return false; + } + + /** + * Verifies that the name is recognized by the server. + * Returns false if the name could not be verified otherwise + * the response from the server is returned. + * + * Implements rfc 821: VRFY + * + * SMTP CODE SUCCESS: 250,251 + * SMTP CODE FAILURE: 550,551,553 + * SMTP CODE ERROR : 500,501,502,421 + * @access public + * @return int + */ + function Verify($name) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Verify() without being connected"); + return false; + } + + fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250 && $code != 251) { + $this->error = + array("error" => "VRFY failed on name '$name'", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return $rply; + } + + /******************************************************************* + * INTERNAL FUNCTIONS * + ******************************************************************/ + + /** + * Read in as many lines as possible + * either before eof or socket timeout occurs on the operation. + * With SMTP we can tell if we have more lines to read if the + * 4th character is '-' symbol. If it is a space then we don't + * need to read anything else. + * @access private + * @return string + */ + function get_lines() { + $data = ""; + while($str = fgets($this->smtp_conn,515)) { + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data was \"$data\"" . + $this->CRLF; + echo "SMTP -> get_lines(): \$str is \"$str\"" . + $this->CRLF; + } + $data .= $str; + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF; + } + # if the 4th character is a space then we are done reading + # so just break the loop + if(substr($str,3,1) == " ") { break; } + } + return $data; + } + +} + + + ?> diff --git a/oss/vtiger/trunk/modules/Emails/gotodownload.php b/oss/vtiger/trunk/modules/Emails/gotodownload.php new file mode 100644 index 00000000..e6340089 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/gotodownload.php @@ -0,0 +1,82 @@ +parameters[0]->value; + $strFileType = strrev(substr(strrev($strFileName),0,4)); + $fileContent = imap_fetchbody($mbox,$msgno,$file+2); +} + +/** Function to download the File + * @param string $strFileType - File Type + * @param string $strFileName - File Name + * @param string $fileContents- File contents +**/ +function downloadFile($strFileType,$strFileName,$fileContent) +{ + $ContentType = "application/octet-stream"; + + if ($strFileType == ".asf") + $ContentType = "video/x-ms-asf"; + if ($strFileType == ".avi") + $ContentType = "video/avi"; + if ($strFileType == ".doc") + $ContentType = "application/msword"; + if ($strFileType == ".zip") + $ContentType = "application/zip"; + if ($strFileType == ".xls") + $ContentType = "application/vnd.ms-excel"; + if ($strFileType == ".gif") + $ContentType = "image/gif"; + if ($strFileType == ".jpg" || $strFileType == "jpeg") + $ContentType = "image/jpeg"; + if ($strFileType == ".wav") + $ContentType = "audio/wav"; + if ($strFileType == ".mp3") + $ContentType = "audio/mpeg3"; + if ($strFileType == ".mpg" || $strFileType == "mpeg") + $ContentType = "video/mpeg"; + if ($strFileType == ".rtf") + $ContentType = "application/rtf"; + if ($strFileType == ".htm" || $strFileType == "html") + $ContentType = "text/html"; + if ($strFileType == ".xml") + $ContentType = "text/xml"; + if ($strFileType == ".xsl") + $ContentType = "text/xsl"; + if ($strFileType == ".css") + $ContentType = "text/css"; + if ($strFileType == ".php") + $ContentType = "text/php"; + if ($strFileType == ".asp") + $ContentType = "text/asp"; + if ($strFileType == ".pdf") + $ContentType = "application/pdf"; + + header ("Content-Type: $ContentType"); + header("Cache-Control: private"); + header("Content-Description: PHP Generated Data"); + header ("Content-Disposition: attachment; filename=$strFileName"); + echo imap_base64($fileContent); + #echo base64_decode($fileContent); +} +?> diff --git a/oss/vtiger/trunk/modules/Emails/index.php b/oss/vtiger/trunk/modules/Emails/index.php new file mode 100644 index 00000000..0c3a5ef8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/index.php @@ -0,0 +1,31 @@ +'.$mod_strings['LBL_MAIL_CONNECT_ERROR_INFO'].'

'; +} + +include ('modules/Emails/ListView.php'); + +?> diff --git a/oss/vtiger/trunk/modules/Emails/language/en_us.lang.php b/oss/vtiger/trunk/modules/Emails/language/en_us.lang.php new file mode 100644 index 00000000..4b84eafb --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/language/en_us.lang.php @@ -0,0 +1,183 @@ +'General Information', + +'LBL_MODULE_NAME'=>'Email', +'LBL_MODULE_TITLE'=>'Email: Home', +'LBL_SEARCH_FORM_TITLE'=>'Email Search', +'LBL_LIST_FORM_TITLE'=>'Email List', +'LBL_NEW_FORM_TITLE'=>'Track Email', + +'LBL_LIST_SUBJECT'=>'Subject', +'LBL_LIST_CONTACT'=>'Contact', +'LBL_LIST_RELATED_TO'=>'Related to', +'LBL_LIST_DATE'=>'Date Sent', +'LBL_LIST_TIME'=>'Time Sent', + +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", +'LBL_DATE_SENT'=>'Date Sent:', +'LBL_DATE_AND_TIME'=>'Date & Time Sent:', +'LBL_DATE'=>'Date Sent:', +'LBL_TIME'=>'Time Sent:', +'LBL_SUBJECT'=>'Subject:', +'LBL_BODY'=>'Body:', +'LBL_CONTACT_NAME'=>' Contact Name: ', +'LBL_EMAIL'=>'Email:', +'LBL_DETAILVIEW_EMAIL'=>'E-Mail', +'LBL_COLON'=>':', +'LBL_CHK_MAIL'=>'Check Mail', +'LBL_COMPOSE'=>'Compose', +//Single change for 5.0.3 +'LBL_SETTINGS'=>'Incoming Mail Server Settings', +'LBL_EMAIL_FOLDERS'=>'Email Folders', +'LBL_INBOX'=>'Inbox', +'LBL_SENT_MAILS'=>'Sent Mails', +'LBL_TRASH'=>'Trash', +'LBL_JUNK_MAILS'=>'Junk Mails', +'LBL_TO_LEADS'=>'To Leads', +'LBL_TO_CONTACTS'=>'To Contacts', +'LBL_TO_ACCOUNTS'=>'To Accounts', +'LBL_MY_MAILS'=>'My Mails', +'LBL_QUAL_CONTACT'=>'Qualified Mails (As Contacts)', +'LBL_MAILS'=>'Mails', +'LBL_QUALIFY_BUTTON'=>'Qualify', +'LBL_REPLY_BUTTON'=>'Reply', +'LBL_FORWARD_BUTTON'=>'Forward', +'LBL_DOWNLOAD_ATTCH_BUTTON'=>'Download Attachments', +'LBL_FROM'=>'From :', +'LBL_CC'=>'Cc :', +'LBL_BCC'=>'Bcc :', + +'NTC_REMOVE_INVITEE'=>'Are you sure you want to remove this recipient from the email?', +'LBL_INVITEE'=>'Recipients', + +// Added Fields +// Contacts-SubPanelViewContactsAndUsers.php +'LBL_BULK_MAILS'=>'Bulk Mails', +'LBL_ATTACHMENT'=>'Attachment', +'LBL_UPLOAD'=>'Upload', +'LBL_FILE_NAME'=>'File Name', +'LBL_SEND'=>'Send', + +'LBL_EMAIL_TEMPLATES'=>'Email Templates', +'LBL_TEMPLATE_NAME'=>'Template Name', +'LBL_DESCRIPTION'=>'Description', +'LBL_EMAIL_TEMPLATES_LIST'=>'Email Templates List', +'LBL_EMAIL_INFORMATION'=>'Email Information', + + + + +//for v4 release added +'LBL_NEW_LEAD'=>'New Lead', +'LBL_LEAD_TITLE'=>'Leads', + +'LBL_NEW_PRODUCT'=>'New Product', +'LBL_PRODUCT_TITLE'=>'Products', +'LBL_NEW_CONTACT'=>'New Contact', +'LBL_CONTACT_TITLE'=>'Contacts', +'LBL_NEW_ACCOUNT'=>'New Account', +'LBL_ACCOUNT_TITLE'=>'Accounts', + +// Added vtiger_fields after vtiger4 - Beta +'LBL_USER_TITLE'=>'Users', +'LBL_NEW_USER'=>'New User', + +// Added for 4 GA +'LBL_TOOL_FORM_TITLE'=>'Email Tools', +//Added for 4GA +'Date & Time Sent'=>'Date & Time Sent', +'Sales Enity Module'=>'Sales Enity Module', +'Related To'=>'Related To', +'Assigned To'=>'Assigned To', +'Subject'=>'Subject', +'Attachment'=>'Attachment', +'Description'=>'Description', +'Time Start'=>'Time Start', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', + +'MESSAGE_CHECK_MAIL_SERVER_NAME'=>'Please Check the Mail Server Name...', +'MESSAGE_CHECK_MAIL_ID'=>'Please Check the Email Id of "Assigned To" User...', +'MESSAGE_MAIL_HAS_SENT_TO_USERS'=>'Mail has been sent to the following User(s) :', +'MESSAGE_MAIL_HAS_SENT_TO_CONTACTS'=>'Mail has been sent to the following Contact(s) :', +'MESSAGE_MAIL_ID_IS_INCORRECT'=>'Mail Id is incorrect. Please Check this Mail Id...', +'MESSAGE_ADD_USER_OR_CONTACT'=>'Please Add any User(s) or Contact(s)...', +'MESSAGE_MAIL_SENT_SUCCESSFULLY'=>' Mail(s) sent successfully!', + +// Added for web mail post 4.0.1 release +'LBL_FETCH_WEBMAIL'=>'Fetch Web Mail', +//Added for 4.2 Release -- CustomView +'LBL_ALL'=>'All', +'MESSAGE_CONTACT_NOT_WANT_MAIL'=>'This Contact does not want to receive mails.', +'LBL_WEBMAILS_TITLE'=>'WebMails', +'LBL_EMAILS_TITLE'=>'Email', +'LBL_MAIL_CONNECT_ERROR_INFO'=>'Error connecting mail server!
Check in My Accounts->List Mail Server -> List Mail Account', +'LBL_ALLMAILS'=>'All Mails', +'LBL_TO_USERS'=>'To Users', +'LBL_TO'=>'To:', +'LBL_IN_SUBJECT'=>'in Subject', +'LBL_IN_SENDER'=>'in Sender', +'LBL_IN_SUBJECT_OR_SENDER'=>'in Subject or Sender', +'SELECT_EMAIL'=>'Select Email IDs', +'Sender'=>'Sender', +'LBL_CONFIGURE_MAIL_SETTINGS'=>'Your Incoming Mail Server is not configured', +'LBL_MAILSELECT_INFO1'=>'The following Email ID types are associated to the selected', +'LBL_MAILSELECT_INFO2'=>'Select the Email ID types to which,the email should be sent', +'LBL_MULTIPLE'=>'Multiple', +'LBL_COMPOSE_EMAIL'=>'Compose E-Mail', +'LBL_VTIGER_EMAIL_CLIENT'=>'vtiger Webmail Client', + +//Added for 5.0.3 +'TITLE_VTIGERCRM_MAIL'=>'vtigerCRM Mail', +'TITLE_COMPOSE_MAIL'=>'Compose Mail', + +'MESSAGE_MAIL_COULD_NOT_BE_SEND'=>'Mail could not be sent to the assigned to user.', +'MESSAGE_PLEASE_CHECK_ASSIGNED_USER_EMAILID'=>'Please check the assigned to user email id...', +'MESSAGE_PLEASE_CHECK_THE_FROM_MAILID'=>'Please check the from email id', +'MESSAGE_MAIL_COULD_NOT_BE_SEND_TO_THIS_EMAILID'=>'Mail could not be sent to this email id', +'PLEASE_CHECK_THIS_EMAILID'=>'Please check this mail id...', +'LBL_CC_EMAIL_ERROR'=>'Your cc mailid is not proper', +'LBL_BCC_EMAIL_ERROR'=>'Your bcc mailid is not proper', +'LBL_NO_RCPTS_EMAIL_ERROR'=>'No recepients specified', +'LBL_CONF_MAILSERVER_ERROR'=>'Please configure your outgoing mailserver under Settings ---> Outgoing Server link', +'LBL_VTIGER_EMAIL_CLIENT'=>'vtiger Webmail Client', +'LBL_MAILSELECT_INFO3'=>'You don\'t have permission to view email id(s) of the selected Record(s).', +//Added for script alerts +'FEATURE_AVAILABLE_INFO' => 'This feature is currently only available for Microsoft Internet Explorer 5.5+ users\n\nWait f +or an update!', +'DOWNLOAD_CONFIRAMATION' => 'Do you want to download the file ?', +'LBL_PLEASE_ATTACH' => 'Please give a valid file to attach and try again!', +'LBL_KINDLY_UPLOAD' => 'Please configure upload_tmp_dir variable in php.ini file.', +'LBL_EXCEED_MAX' => 'Sorry, the uploaded file exceeds the maximum filesize limit. Please try a file smaller than ', +'LBL_BYTES' => ' bytes', +'LBL_CHECK_USER_MAILID' => 'Please check the current user mailid.It should be a valid mailid to send Emails', + +// Added/Updated for vtiger CRM 5.0.4 +'Activity Type'=>'Activity Type', +'LBL_MAILSELECT_INFO'=>'has the following Email IDs associated.Please Select the Email IDs to which,the mail should be sent', +'LBL_NO_RECORDS' => 'No Records Found', +'LBL_PRINT_EMAIL'=> 'Print', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Emails/language/phpmailer.lang-en_us.php b/oss/vtiger/trunk/modules/Emails/language/phpmailer.lang-en_us.php new file mode 100644 index 00000000..7b09c424 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/language/phpmailer.lang-en_us.php @@ -0,0 +1,31 @@ +.'; +$PHPMAILER_LANG["file_access"] = 'Could not access file: '; +$PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: '; +$PHPMAILER_LANG["encoding"] = 'Unknown encoding: '; +?> diff --git a/oss/vtiger/trunk/modules/Emails/language/phpmailer.lang-zh_cn.php b/oss/vtiger/trunk/modules/Emails/language/phpmailer.lang-zh_cn.php new file mode 100644 index 00000000..7b09c424 --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/language/phpmailer.lang-zh_cn.php @@ -0,0 +1,31 @@ +.'; +$PHPMAILER_LANG["file_access"] = 'Could not access file: '; +$PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: '; +$PHPMAILER_LANG["encoding"] = 'Unknown encoding: '; +?> diff --git a/oss/vtiger/trunk/modules/Emails/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Emails/language/zh_cn.lang.php new file mode 100644 index 00000000..6fa50c4b --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/language/zh_cn.lang.php @@ -0,0 +1,184 @@ + '一般信息', + + 'LBL_MODULE_NAME' => '邮件', + 'LBL_MODULE_TITLE' => '邮件: 首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻邮件', + 'LBL_LIST_FORM_TITLE' => '邮件列表', + 'LBL_NEW_FORM_TITLE' => '追踪邮件', + + 'LBL_LIST_SUBJECT' => '标题', + 'LBL_LIST_CONTACT' => '联系人', + 'LBL_LIST_RELATED_TO' => '相关人事', + 'LBL_LIST_DATE' => '寄出日期', + 'LBL_LIST_TIME' => '寄出时间', + + 'ERR_DELETE_RECORD' => '必须有记录编号才能删除该笔账号.', + 'LBL_DATE_SENT' => '寄出日期:', + 'LBL_DATE_AND_TIME' => '寄出日期 & 时间:', + 'LBL_DATE' => '寄出日期:', + 'LBL_TIME' => '寄出时间:', + 'LBL_SUBJECT' => '标题:', + 'LBL_BODY' => '邮件内容:', + 'LBL_CONTACT_NAME' => '联系人名称: ', +'LBL_EMAIL' => '邮件:', +'LBL_DETAILVIEW_EMAIL'=>'邮件', +'LBL_COLON'=>':', +'LBL_CHK_MAIL'=>'检查邮件', +'LBL_COMPOSE'=>'新邮件', +//Single change for 5.0.3 +'LBL_SETTINGS'=>'邮件服务器设置', +'LBL_EMAIL_FOLDERS'=>'邮件数据夹', +'LBL_INBOX' => '收件夹', +'LBL_SENT_MAILS'=>'邮件备份', +'LBL_TRASH' => '垃圾桶', + 'LBL_JUNK_MAILS' => '广告邮件', + 'LBL_TO_LEADS' => '转为准客户', + 'LBL_TO_CONTACTS' => '转为联系人', + 'LBL_TO_ACCOUNTS' => '转为客户', + 'LBL_MY_MAILS' => '我的邮件', + 'LBL_QUAL_CONTACT' => '已转换邮件(转为联系人)', + 'LBL_MAILS' => '邮件', + 'LBL_QUALIFY_BUTTON' => '转换', + 'LBL_REPLY_BUTTON' => '回应', + 'LBL_FORWARD_BUTTON' => '转寄', + 'LBL_DOWNLOAD_ATTCH_BUTTON' => '下载附加档案', + 'LBL_FROM' => '寄件人:', + 'LBL_CC' => '副本:', + 'LBL_BCC' => '密件副本:', + + 'NTC_REMOVE_INVITEE' => '您确定要移除这封来信?', +'LBL_INVITEE'=>'接收者', + +// Added Fields +// Contacts-SubPanelViewContactsAndUsers.php + 'LBL_BULK_MAILS' => '大量寄信', + 'LBL_ATTACHMENT' => '附件', +'LBL_UPLOAD' => '上传', + 'LBL_FILE_NAME' => '文件名称', + 'LBL_SEND' => '寄出', + +'LBL_EMAIL_TEMPLATES' => '邮件样版', + 'LBL_TEMPLATE_NAME' => '样版名称', + 'LBL_DESCRIPTION' => '描述', + 'LBL_EMAIL_TEMPLATES_LIST' => '邮件样版列表', + 'LBL_EMAIL_INFORMATION' => '邮件信息', + + + + +//for v4 release added + 'LBL_NEW_LEAD' => '新增潜在客户', + 'LBL_LEAD_TITLE' => '潜在客户', + + 'LBL_NEW_PRODUCT' => '新增商品', + 'LBL_PRODUCT_TITLE' => '商品', + 'LBL_NEW_CONTACT' => '新增联系人', + 'LBL_CONTACT_TITLE' => '联系人', + 'LBL_NEW_ACCOUNT' => '新增公司', + 'LBL_ACCOUNT_TITLE' => '公司', + +// Added vtiger_fields after vtiger4 - Beta +'LBL_USER_TITLE' => '使用者', + 'LBL_NEW_USER' => '新增使用者', + +// Added for 4 GA + 'LBL_TOOL_FORM_TITLE' => '邮件编辑器', +//Added for 4GA +'Date & Time Sent' => '寄出日期 & 时间', + 'Sales Enity Module' => '客服模块', + + 'Related To' => '相关人事', + 'Assigned To' => '负责人', + 'Subject' => '标题', + 'Attachment' => '附件', + 'Description' => '描述', + 'Time Start' => '开始时间', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + + 'MESSAGE_CHECK_MAIL_SERVER_NAME' => '请检查电子邮件服务器名称...', + 'MESSAGE_CHECK_MAIL_ID' => '请检查负责人的信箱编号...', + 'MESSAGE_MAIL_HAS_SENT_TO_USERS' => '邮件将会寄出给指定的使用者:', + 'MESSAGE_MAIL_HAS_SENT_TO_CONTACTS' => '邮件将会寄出给指定的联系人:', + 'MESSAGE_MAIL_ID_IS_INCORRECT' => '邮件格式不正确. 请检查这封邮件的Id...', + 'MESSAGE_ADD_USER_OR_CONTACT' => '请新增其它位使用者或联系人...', + 'MESSAGE_MAIL_SENT_SUCCESSFULLY' => ' 邮件已顺利寄出!', + +// Added for web mail post 4.0.1 release + 'LBL_FETCH_WEBMAIL' => '取得网页邮件', +//Added for 4.2 Release -- CustomView + 'LBL_ALL' => '全部', + 'MESSAGE_CONTACT_NOT_WANT_MAIL' => '这个联系人不想要收到电子邮件', + 'LBL_WEBMAILS_TITLE' => '网页邮件', + 'LBL_EMAILS_TITLE' => '电子邮件', + 'LBL_MAIL_CONNECT_ERROR_INFO' => '联机到邮件服务器时发生错误,检查我的账号=>邮件服务器列表=>邮件账号', + 'LBL_ALLMAILS' => '所有邮件', + 'LBL_TO_USERS' => '给使用者', + 'LBL_TO' => '收件人:', +'LBL_IN_SUBJECT' => '主旨', + 'LBL_IN_SENDER' => '寄件人', + 'LBL_IN_SUBJECT_OR_SENDER' => '主旨或寄件人', + 'SELECT_EMAIL' => '选择邮件编号', + 'Sender' => '寄件人', + 'LBL_CONFIGURE_MAIL_SETTINGS' => '您的收件邮件服务器还没设定', + 'LBL_MAILSELECT_INFO' => '有下面相关邮件编号,请选择要寄送的邮件编号', + 'LBL_MAILSELECT_INFO1' => '下面的邮件编号与选择的项目有关', + 'LBL_MAILSELECT_INFO2' => '选择要寄送的邮件编号类型', + 'LBL_MULTIPLE' => '多选', + 'LBL_COMPOSE_EMAIL' => '发送邮件', + 'LBL_VTIGER_EMAIL_CLIENT'=>'vtiger Webmail 客户', + +//Added for 5.0.3 +'TITLE_VTIGERCRM_MAIL'=>'vtigerCRM 邮件', +'TITLE_COMPOSE_MAIL'=>'组成邮件', + +'MESSAGE_MAIL_COULD_NOT_BE_SEND'=>'邮件不能寄发到被分配的用户.', +'MESSAGE_PLEASE_CHECK_ASSIGNED_USER_EMAILID'=>'请检查被分配的用户电子邮件id...', +'MESSAGE_PLEASE_CHECK_THE_FROM_MAILID'=>'请检查电子邮件id', +'MESSAGE_MAIL_COULD_NOT_BE_SEND_TO_THIS_EMAILID'=>'邮件不能寄发到这电子邮件id', +'PLEASE_CHECK_THIS_EMAILID'=>'请检查这邮件id...', +'LBL_CC_EMAIL_ERROR'=>'您的CC邮件ID不是适当的', +'LBL_BCC_EMAIL_ERROR'=>'您的BCC邮件ID不是适当的', +'LBL_NO_RCPTS_EMAIL_ERROR'=>'没有指定移植对象', +'LBL_CONF_MAILSERVER_ERROR'=>'请设置您外部的邮件服务器 ---> 外出的服务器链接', +'LBL_VTIGER_EMAIL_CLIENT'=>'vtiger Webmail 客户', +'LBL_MAILSELECT_INFO3'=>'您不能查看选择记录的邮件ID.', +'LBL_NO_RECORDS' => '这个文件夹没有记录', +//Added for script alerts +'FEATURE_AVAILABLE_INFO' => '这个特点只支持Microsoft Internet Explorer 5.5+或更高!', +'DOWNLOAD_CONFIRAMATION' => '您想要下载文件 ?', +'LBL_PLEASE_ATTACH' => '请再尝试附上一个合法的文件', +'LBL_KINDLY_UPLOAD' => '请配置 upload_tmp_dir variable in php.ini file.', +'LBL_EXCEED_MAX' => '抱歉, 上传的文件超出最大值极限。请尝试一个小文件 ', +'LBL_BYTES' => ' 字节', +'LBL_CHECK_USER_MAILID' => '请检查当前用户的电邮ID是否正确', + +// Added/Updated for vtiger CRM 5.0.4 +'Activity Type'=>'任务类型', +'LBL_MAILSELECT_INFO'=>'has the following Email IDs associated.Please Select the Email IDs to which,the mail should be sent', +'LBL_NO_RECORDS' => 'No Records Found', +'LBL_PRINT_EMAIL'=> 'Print', +); + +?> diff --git a/oss/vtiger/trunk/modules/Emails/mail.php b/oss/vtiger/trunk/modules/Emails/mail.php new file mode 100644 index 00000000..e8bbcf2e --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/mail.php @@ -0,0 +1,519 @@ +println("To id => '".$to_email."'\nSubject ==>'".$subject."'\nContents ==> '".$contents."'"); + + //Get the email id of assigned_to user -- pass the value and name, name must be "user_name" or "id"(field names of vtiger_users vtiger_table) + //$to_email = getUserEmailId('id',$assigned_user_id); + + //if module is HelpDesk then from_email will come based on support email id + if($from_email == '')//$module != 'HelpDesk') + $from_email = getUserEmailId('user_name',$from_name); + if($module != "Calendar") + $contents = addSignature($contents,$from_name); + + $mail = new PHPMailer(); + + setMailerProperties($mail,$subject,$contents,$from_email,$from_name,trim($to_email,","),$attachment,$emailid,$module,$logo); + setCCAddress($mail,'cc',$cc); + setCCAddress($mail,'bcc',$bcc); + + // vtmailscanner customization: If Support Reply to is defined use it. + global $HELPDESK_SUPPORT_EMAIL_REPLY_ID; + if($HELPDESK_SUPPORT_EMAIL_REPLY_ID && $HELPDESK_SUPPORT_EMAIL_ID != $HELPDESK_SUPPORT_EMAIL_REPLY_ID) { + $mail->AddReplyTo($HELPDESK_SUPPORT_EMAIL_REPLY_ID); + } + // END + + // Fix: Return immediately if Outgoing server not configured + if(empty($mail->Host)) { + return 0; + } + // END + + $mail_status = MailSend($mail); + + if($mail_status != 1) + { + $mail_error = getMailError($mail,$mail_status,$mailto); + } + else + { + $mail_error = $mail_status; + } + + return $mail_error; +} + +/** Function to get the user Email id based on column name and column value + * $name -- column name of the vtiger_users vtiger_table + * $val -- column value + */ +function getUserEmailId($name,$val) +{ + global $adb; + $adb->println("Inside the function getUserEmailId. --- ".$name." = '".$val."'"); + if($val != '') + { + //$sql = "select email1, email2, yahoo_id from vtiger_users where ".$name." = '".$val."'"; + //done to resolve the PHP5 specific behaviour + $sql = "SELECT email1, email2, yahoo_id from vtiger_users WHERE status='Active' AND ". $adb->sql_escape_string($name)." = ?"; + $res = $adb->pquery($sql, array($val)); + $email = $adb->query_result($res,0,'email1'); + if($email == '') + { + $email = $adb->query_result($res,0,'email2'); + if($email == '') + { + $email = $adb->query_result($res,0,'yahoo_id'); + } + } + $adb->println("Email id is selected => '".$email."'"); + return $email; + } + else + { + $adb->println("User id is empty. so return value is ''"); + return ''; + } +} + +/** Funtion to add the user's signature with the content passed + * $contents -- where we want to add the signature + * $fromname -- which user's signature will be added to the contents + */ +function addSignature($contents, $fromname) +{ + global $adb; + $adb->println("Inside the function addSignature"); + + $sign = nl2br($adb->query_result($adb->pquery("select signature from vtiger_users where user_name=?", array($fromname)),0,"signature")); + if($sign != '') + { + $contents .= '

'.$sign; + $adb->println("Signature is added with the body => '.".$sign."'"); + } + else + { + $adb->println("Signature is empty for the user => '".$fromname."'"); + } + return $contents; +} + +/** Function to set all the Mailer properties + * $mail -- reference of the mail object + * $subject -- subject of the email you want to send + * $contents -- body of the email you want to send + * $from_email -- from email id which will be displayed in the mail + * $from_name -- from name which will be displayed in the mail + * $to_email -- to email address -- This can be an email in a single string, a comma separated + * list of emails or an array of email addresses + * $attachment -- whether we want to attach the currently selected file or all vtiger_files. + [values = current,all] - optional + * $emailid -- id of the email object which will be used to get the vtiger_attachments - optional + */ +function setMailerProperties($mail,$subject,$contents,$from_email,$from_name,$to_email,$attachment='',$emailid='',$module='',$logo='') +{ + global $adb; + $adb->println("Inside the function setMailerProperties"); + if($module == "Support" || $logo ==1) + $mail->AddEmbeddedImage('themes/images/logo_mail.jpg', 'logo', 'logo.jpg',"base64","image/jpg"); + + $mail->Subject = $subject; + $mail->Body = $contents; + //$mail->Body = html_entity_decode(nl2br($contents)); //if we get html tags in mail then we will use this line + $mail->AltBody = strip_tags(preg_replace(array("/

/i","/
/i","/
/i"),array("\n","\n","\n"),$contents)); + + $mail->IsSMTP(); //set mailer to use SMTP + //$mail->Host = "smtp1.example.com;smtp2.example.com"; // specify main and backup server + + setMailServerProperties($mail); + + //Handle the from name and email for HelpDesk + $mail->From = $from_email; + $rs = $adb->pquery("select first_name,last_name from vtiger_users where user_name=?", array($from_name)); + if($adb->num_rows($rs) > 0) + $from_name = $adb->query_result($rs,0,"first_name")." ".$adb->query_result($rs,0,"last_name"); + + $mail->FromName = decode_html($from_name); + + if($to_email != '') + { + if(is_array($to_email)) { + for($j=0,$num=count($to_email);$j<$num;$j++) { + $mail->addAddress($to_email[$j]); + } + } else { + $_tmp = explode(",",$to_email); + for($j=0,$num=count($_tmp);$j<$num;$j++) { + $mail->addAddress($_tmp[$j]); + } + } + } + + $mail->AddReplyTo($from_email); + $mail->WordWrap = 50; + + //If we want to add the currently selected file only then we will use the following function + if($attachment == 'current' && $emailid != '') + { + if (isset($_REQUEST['filename_hidden'])) { + $file_name = $_REQUEST['filename_hidden']; + } else { + $file_name = $_FILES['filename']['name']; + } + addAttachment($mail,$file_name,$emailid); + } + + //This will add all the vtiger_files which are related to this record or email + if($attachment == 'all' && $emailid != '') + { + addAllAttachments($mail,$emailid); + } + + $mail->IsHTML(true); // set email format to HTML + + return; +} + +/** Function to set the Mail Server Properties in the object passed + * $mail -- reference of the mailobject + */ +function setMailServerProperties($mail) +{ + global $adb; + $adb->println("Inside the function setMailServerProperties"); + + $res = $adb->pquery("select * from vtiger_systems where server_type=?", array('email')); + if(isset($_REQUEST['server'])) + $server = $_REQUEST['server']; + else + $server = $adb->query_result($res,0,'server'); + if(isset($_REQUEST['server_username'])) + $username = $_REQUEST['server_username']; + else + $username = $adb->query_result($res,0,'server_username'); + if(isset($_REQUEST['server_password'])) + $password = $_REQUEST['server_password']; + else + $password = $adb->query_result($res,0,'server_password'); + // Prasad: First time read smtp_auth from the request + if(isset($_REQUEST['smtp_auth'])) + { + $smtp_auth = $_REQUEST['smtp_auth']; + if($smtp_auth == 'on') + $smtp_auth = 'true'; + } + else if (isset($_REQUEST['module']) && $_REQUEST['module'] == 'Settings' && (!isset($_REQUEST['smtp_auth']))) + { + //added to avoid issue while editing the values in the outgoing mail server. + $smtp_auth = 'false'; + } + else + $smtp_auth = $adb->query_result($res,0,'smtp_auth'); + + $adb->println("Mail server name,username & password => '".$server."','".$username."','".$password."'"); + if($smtp_auth == "true"){ + $mail->SMTPAuth = true; // turn on SMTP authentication + } + $mail->Host = $server; // specify main and backup server + $mail->Username = $username ; // SMTP username + $mail->Password = $password ; // SMTP password + + return; +} + +/** Function to add the file as attachment with the mail object + * $mail -- reference of the mail object + * $filename -- filename which is going to added with the mail + * $record -- id of the record - optional + */ +function addAttachment($mail,$filename,$record) +{ + global $adb, $root_directory; + $adb->println("Inside the function addAttachment"); + $adb->println("The file name is => '".$filename."'"); + + //This is the file which has been selected in Email EditView + if(is_file($filename) && $filename != '') + { + $mail->AddAttachment($root_directory."test/upload/".$filename); + } +} + +/** Function to add all the vtiger_files as attachment with the mail object + * $mail -- reference of the mail object + * $record -- email id ie., record id which is used to get the all vtiger_attachments from database + */ +function addAllAttachments($mail,$record) +{ + global $adb,$log, $root_directory; + $adb->println("Inside the function addAllAttachments"); + + //Retrieve the vtiger_files from database where avoid the file which has been currently selected + $sql = "select vtiger_attachments.* from vtiger_attachments inner join vtiger_seattachmentsrel on vtiger_attachments.attachmentsid = vtiger_seattachmentsrel.attachmentsid inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_attachments.attachmentsid where vtiger_crmentity.deleted=0 and vtiger_seattachmentsrel.crmid=?"; + $res = $adb->pquery($sql, array($record)); + $count = $adb->num_rows($res); + + for($i=0;$i<$count;$i++) + { + $fileid = $adb->query_result($res,$i,'attachmentsid'); + $filename = decode_html($adb->query_result($res,$i,'name')); + $filepath = $adb->query_result($res,$i,'path'); + $filewithpath = $root_directory.$filepath.$fileid."_".$filename; + + //if the file is exist in test/upload directory then we will add directly + //else get the contents of the file and write it as a file and then attach (this will occur when we unlink the file) + if(is_file($filewithpath)) + { + $mail->AddAttachment($filewithpath,$filename); + } + } +} + +/** Function to set the CC or BCC addresses in the mail + * $mail -- reference of the mail object + * $cc_mod -- mode to set the address ie., cc or bcc + * $cc_val -- addresss with comma seperated to set as CC or BCC in the mail + */ +function setCCAddress($mail,$cc_mod,$cc_val) +{ + global $adb; + $adb->println("Inside the functin setCCAddress"); + + if($cc_mod == 'cc') + $method = 'AddCC'; + if($cc_mod == 'bcc') + $method = 'AddBCC'; + if($cc_val != '') + { + $ccmail = explode(",",trim($cc_val,",")); + for($i=0;$i"); + } + if($ccmail[$i] != '') + $mail->$method($addr,$cc_name); + } + } +} + +/** Function to send the mail which will be called after set all the mail object values + * $mail -- reference of the mail object + */ +function MailSend($mail) +{ + global $log; + $log->info("Inside of Send Mail function."); + if(!$mail->Send()) + { + $log->debug("Error in Mail Sending : Error log = '".$mail->ErrorInfo."'"); + return $mail->ErrorInfo; + } + else + { + $log->info("Mail has been sent from the vtigerCRM system : Status : '".$mail->ErrorInfo."'"); + return 1; + } +} + +/** Function to get the Parent email id from HelpDesk to send the details about the ticket via email + * $returnmodule -- Parent module value. Contact or Account for send email about the ticket details + * $parentid -- id of the parent ie., contact or vtiger_account + */ +function getParentMailId($parentmodule,$parentid) +{ + global $adb; + $adb->println("Inside the function getParentMailId. \n parent module and id => ".$parentmodule."&".$parentid); + + if($parentmodule == 'Contacts') + { + $tablename = 'vtiger_contactdetails'; + $idname = 'contactid'; + $first_email = 'email'; + $second_email = 'yahooid'; + } + if($parentmodule == 'Accounts') + { + $tablename = 'vtiger_account'; + $idname = 'accountid'; + $first_email = 'email1'; + $second_email = 'email2'; + } + if($parentid != '') + { + //$query = 'select * from '.$tablename.' where '.$idname.' = '.$parentid; + $query = 'select * from '.$tablename.' where '. $idname.' = ?'; + $res = $adb->pquery($query, array($parentid)); + $mailid = $adb->query_result($res,0,$first_email); + $mailid2 = $adb->query_result($res,0,$second_email); + } + if($mailid == '' && $mailid2 != '') + $mailid = $mailid2; + + return $mailid; +} + +/** Function to parse and get the mail error + * $mail -- reference of the mail object + * $mail_status -- status of the mail which is sent or not + * $to -- the email address to whom we sent the mail and failes + * return -- Mail error occured during the mail sending process + */ +function getMailError($mail,$mail_status,$to) +{ + //Error types in class.phpmailer.php + /* + provide_address, mailer_not_supported, execute, instantiate, file_access, file_open, encoding, data_not_accepted, authenticate, + connect_host, recipients_failed, from_failed + */ + + global $adb; + $adb->println("Inside the function getMailError"); + + $msg = array_search($mail_status,$mail->language); + $adb->println("Error message ==> ".$msg); + + if($msg == 'connect_host') + { + $error_msg = $msg; + } + elseif(strstr($msg,'from_failed')) + { + $error_msg = $msg; + } + elseif(strstr($msg,'recipients_failed')) + { + $error_msg = $msg; + } + else + { + $adb->println("Mail error is not as connect_host or from_failed or recipients_failed"); + //$error_msg = $msg; + } + + $adb->println("return error => ".$error_msg); + return $error_msg; +} + +/** Function to get the mail status string (string of sent mail status) + * $mail_status_str -- concatenated string with all the error messages with &&& seperation + * return - the error status as a encoded string + */ +function getMailErrorString($mail_status_str) +{ + global $adb; + $adb->println("Inside getMailErrorString function.\nMail status string ==> ".$mail_status_str); + + $mail_status_str = trim($mail_status_str,"&&&"); + $mail_status_array = explode("&&&",$mail_status_str); + $adb->println("All Mail status ==>\n".$mail_status_str."\n"); + + foreach($mail_status_array as $key => $val) + { + $list = explode("=",$val); + $adb->println("Mail id & status ==> ".$list[0]." = ".$list[1]); + if($list[1] == 0) + { + $mail_error_str .= $list[0]."=".$list[1]."&&&"; + } + } + $adb->println("Mail error string => '".$mail_error_str."'"); + if($mail_error_str != '') + { + $mail_error_str = 'mail_error='.base64_encode($mail_error_str); + } + return $mail_error_str; +} + +/** Function to parse the error string + * $mail_error_str -- base64 encoded string which contains the mail sending errors as concatenated with &&& + * return - Error message to display + */ +function parseEmailErrorString($mail_error_str) +{ + //TODO -- we can modify this function for better email error handling in future + global $adb, $mod_strings; + $adb->println("Inside the parseEmailErrorString function.\n encoded mail error string ==> ".$mail_error_str); + + $mail_error = base64_decode($mail_error_str); + $adb->println("Original error string => ".$mail_error); + $mail_status = explode("&&&",trim($mail_error,"&&&")); + foreach($mail_status as $key => $val) + { + $status_str = explode("=",$val); + $adb->println('Mail id => "'.$status_str[0].'".........status => "'.$status_str[1].'"'); + if($status_str[1] != 1 && $status_str[1] != '') + { + $adb->println("Error in mail sending"); + if($status_str[1] == 'connect_host') + { + $adb->println("if part - Mail sever is not configured"); + $errorstr .= '
'.$mod_strings['MESSAGE_CHECK_MAIL_SERVER_NAME'].''; + break; + } + elseif($status_str[1] == '0') + { + $adb->println("first elseif part - status will be 0 which is the case of assigned to vtiger_users's email is empty."); + $errorstr .= '
'.$mod_strings['MESSAGE_MAIL_COULD_NOT_BE_SEND'].' '.$mod_strings['MESSAGE_PLEASE_CHECK_FROM_THE_MAILID'].''; + //Added to display the message about the CC && BCC mail sending status + if($status_str[0] == 'cc_success') + { + $cc_msg = 'But the mail has been sent to CC & BCC addresses.'; + $errorstr .= '
'.$cc_msg.''; + } + } + elseif(strstr($status_str[1],'from_failed')) + { + $adb->println("second elseif part - from email id is failed."); + $from = explode('from_failed',$status_str[1]); + $errorstr .= "
".$mod_strings['MESSAGE_PLEASE_CHECK_THE_FROM_MAILID']." '".$from[1]."'"; + } + else + { + $adb->println("else part - mail send process failed due to the following reason."); + $errorstr .= "
".$mod_strings['MESSAGE_MAIL_COULD_NOT_BE_SEND_TO_THIS_EMAILID']." '".$status_str[0]."'. ".$mod_strings['PLEASE_CHECK_THIS_EMAILID'].""; + } + } + } + $adb->println("Return Error string => ".$errorstr); + return $errorstr; +} +?> diff --git a/oss/vtiger/trunk/modules/Emails/mailSelect.php b/oss/vtiger/trunk/modules/Emails/mailSelect.php new file mode 100644 index 00000000..5bb49f3a --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/mailSelect.php @@ -0,0 +1,109 @@ +id; + +$querystr = "select fieldid, fieldname, fieldlabel, columnname from vtiger_field where tabid=? and uitype=13 and vtiger_field.presence in (0,2)"; +$res=$adb->pquery($querystr, array(getTabid($pmodule))); +$numrows = $adb->num_rows($res); +$returnvalue = Array(); +for($i = 0; $i < $numrows; $i++) +{ + $value = Array(); + $fieldname = $adb->query_result($res,$i,"fieldname"); + $permit = getFieldVisibilityPermission($pmodule, $userid, $fieldname); + if($permit == '0') + { + $temp=$adb->query_result($res,$i,'columnname'); + $columnlists [] = $temp; + $fieldid=$adb->query_result($res,$i,'fieldid'); + $fieldlabel =$adb->query_result($res,$i,'fieldlabel'); + $value[] = getTranslatedString($fieldlabel); + $returnvalue [$fieldid]= $value; + } +} + +if($single_record && count($columnlists) > 0) +{ + $count = 0; + $val_cnt = 0; + switch($pmodule) + { + case 'Accounts': + $query = 'select accountname,'.implode(",",$columnlists).' from vtiger_account left join vtiger_accountscf on vtiger_accountscf.accountid = vtiger_account.accountid where vtiger_account.accountid = ?'; + $result=$adb->pquery($query, array($idlist)); + foreach($columnlists as $columnname) + { + $acc_eval = $adb->query_result($result,0,$columnname); + $field_value[$count++] = $acc_eval; + if($acc_eval != "") $val_cnt++; + + } + $entity_name = $adb->query_result($result,0,'accountname'); + break; + case 'Leads': + $query = 'select concat(firstname," ",lastname) as leadname,'.implode(",",$columnlists).' from vtiger_leaddetails left join vtiger_leadscf on vtiger_leadscf.leadid = vtiger_leaddetails.leadid where vtiger_leaddetails.leadid = ?'; + $result=$adb->pquery($query, array($idlist)); + foreach($columnlists as $columnname) + { + $lead_eval = $adb->query_result($result,0,$columnname); + $field_value[$count++] = $lead_eval; + if($lead_eval != "") $val_cnt++; + } + $entity_name = $adb->query_result($result,0,'leadname'); + break; + case 'Contacts': + $query = 'select concat(firstname," ",lastname) as contactname,'.implode(",",$columnlists).' from vtiger_contactdetails left join vtiger_contactscf on vtiger_contactscf.contactid = vtiger_contactdetails.contactid where vtiger_contactdetails.contactid = ?'; + $result=$adb->pquery($query, array($idlist)); + foreach($columnlists as $columnname) + { + $con_eval = $adb->query_result($result,0,$columnname); + $field_value[$count++] = $con_eval; + if($con_eval != "") $val_cnt++; + } + $entity_name = $adb->query_result($result,0,'contactname'); + break; + } +} +$smarty->assign('PERMIT',$permit); +$smarty->assign('ENTITY_NAME',$entity_name); +$smarty->assign('ONE_RECORD',$single_record); +$smarty->assign('MAILDATA',$field_value); +$smarty->assign('MAILINFO',$returnvalue); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("IDLIST", $idlist); +$smarty->assign("APP", $app_strings); +$smarty->assign("FROM_MODULE", $pmodule); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +if($single_record && count($columnlists) > 0 && $val_cnt > 0) + $smarty->display("SelectEmail.tpl"); +else if(!$single_record && count($columnlists) > 0) + $smarty->display("SelectEmail.tpl"); +else if($single_record && $val_cnt == 0) + echo "No Mail Ids"; +else + echo "Mail Ids not permitted"; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/mailsend.php b/oss/vtiger/trunk/modules/Emails/mailsend.php new file mode 100644 index 00000000..bcc14e7f --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/mailsend.php @@ -0,0 +1,239 @@ +id;//$_REQUEST['record']; +} + + +$adb->println("\n\nMail Sending Process has been started."); +//This function call is used to send mail to the assigned to user. In this mail CC and BCC addresses will be added. +if($_REQUEST['assigntype' == 'T'] && $_REQUEST['assigned_group_id']!='') +{ + $grp_obj = new GetGroupUsers(); + $grp_obj->getAllUsersInGroup($_REQUEST['assigned_group_id']); + $users_list = constructList($grp_obj->group_users,'INTEGER'); + if (count($users_list) > 0) { + $sql = "select first_name, last_name, email1, email2, yahoo_id from vtiger_users where id in (". generateQuestionMarks($users_list) .")"; + $params = array($users_list); + } else { + $sql = "select first_name, last_name, email1, email2, yahoo_id from vtiger_users"; + $params = array(); + } + $res = $adb->pquery($sql, $params); + $user_email = ''; + while ($user_info = $adb->fetch_array($res)) + { + $email = $user_info['email1']; + if($email == '' || $email == 'NULL') + { + $email = $user_info['email2']; + if($email == '' || $email == 'NULL') + { + $email = $user_info['yahoo_id']; + } + } + if($user_email=='') + $user_email .= $user_info['first_name']." ".$user_info['last_name']."<".$email.">"; + else + $user_email .= ",".$user_info['first_name']." ".$user_info['last_name']."<".$email.">"; + $email=''; + } + $to_email = $user_email; +} +else +{ + $to_email = getUserEmailId('id',$focus->column_fields["assigned_user_id"]); +} +$cc = $_REQUEST['ccmail']; +$bcc = $_REQUEST['bccmail']; +if($to_email == '' && $cc == '' && $bcc == '') +{ + $adb->println("Mail Error : send_mail function not called because To email id of assigned to user, CC and BCC are empty"); + $mail_status_str = "'".$to_email."'=0&&&"; + $errorheader1 = 1; +} +else +{ + $query1 = "select email1 from vtiger_users where id =?"; + $res1 = $adb->pquery($query1, array($current_user->id)); + $val = $adb->query_result($res1,0,"email1"); +// $mail_status = send_mail('Emails',$to_email,$current_user->user_name,'',$_REQUEST['subject'],$_REQUEST['description'],$cc,$bcc,'all',$focus->id); + + $query = 'update vtiger_emaildetails set email_flag ="SENT",from_email =? where emailid=?'; + $adb->pquery($query, array($val, $focus->id)); + //set the errorheader1 to 1 if the mail has not been sent to the assigned to user + if($mail_status != 1)//when mail send fails + { + $errorheader1 = 1; + $mail_status_str = $to_email."=".$mail_status."&&&"; + } + elseif($mail_status == 1 && $to_email == '')//Mail send success only for CC and BCC but the 'to' email is empty + { + $adb->pquery($query, array($val, $focus->id)); + $errorheader1 = 1; + $mail_status_str = "cc_success=0&&&"; + } + else + { + $mail_status_str = $to_email."=".$mail_status."&&&"; + } +} + + +//Added code from mysendmail.php which is contributed by Raju(rdhital) +$parentid= $_REQUEST['parent_id']; +$myids=explode("|",$parentid); +$all_to_emailids = Array(); +$from_name = $current_user->user_name; +$from_address = $current_user->column_fields['email1']; + +for ($i=0;$i<(count($myids)-1);$i++) +{ + $realid=explode("@",$myids[$i]); + $nemail=count($realid); + $mycrmid=$realid[0]; + if($realid[1] == -1) + { + //handle the mail send to vtiger_users + $emailadd = $adb->query_result($adb->pquery("select email1 from vtiger_users where id=?", array($mycrmid)),0,'email1'); + $pmodule = 'Users'; + $description = getMergedDescription($_REQUEST['description'],$mycrmid,$pmodule); + $mail_status = send_mail('Emails',$emailadd,$from_name,$from_address,$_REQUEST['subject'],$description,'','','all',$focus->id); + $all_to_emailids []= $emailadd; + $mail_status_str .= $emailadd."=".$mail_status."&&&"; + } + else + { + //Send mail to vtiger_account or lead or contact based on their ids + $pmodule=getSalesEntityType($mycrmid); + for ($j=1;$j<$nemail;$j++) + { + $temp=$realid[$j]; + $myquery='Select columnname from vtiger_field where fieldid = ? and vtiger_field.presence in (0,2)'; + $fresult=$adb->pquery($myquery, array($temp)); + if ($pmodule=='Contacts') + { + require_once('modules/Contacts/Contacts.php'); + $myfocus = new Contacts(); + $myfocus->retrieve_entity_info($mycrmid,"Contacts"); + } + elseif ($pmodule=='Accounts') + { + require_once('modules/Accounts/Accounts.php'); + $myfocus = new Accounts(); + $myfocus->retrieve_entity_info($mycrmid,"Accounts"); + } + elseif ($pmodule=='Leads') + { + require_once('modules/Leads/Leads.php'); + $myfocus = new Leads(); + $myfocus->retrieve_entity_info($mycrmid,"Leads"); + } + elseif ($pmodule=='Vendors') + { + require_once('modules/Vendors/Vendors.php'); + $myfocus = new Vendors(); + $myfocus->retrieve_entity_info($mycrmid,"Vendors"); + } + else { + // vtlib customization: Enabling mail send from other modules + $myfocus = CRMEntity::getInstance($pmodule); + $myfocus->retrieve_entity_info($mycrmid, $pmodule); + // END + } + $fldname=$adb->query_result($fresult,0,"columnname"); + $emailadd=br2nl($myfocus->column_fields[$fldname]); + +//This is to convert the html encoded string to original html entities so that in mail description contents will be displayed correctly + //$focus->column_fields['description'] = from_html($focus->column_fields['description']); + + if($emailadd != '') + { + $description = getMergedDescription($_REQUEST['description'],$mycrmid,$pmodule); + //Email Open Tracking + global $site_URL, $application_unique_key; + $emailid = $focus->id; + $track_URL = "$site_URL/modules/Emails/TrackAccess.php?record=$mycrmid&mailid=$emailid&app_key=$application_unique_key"; + $description = "$description"; + // END + + $pos = strpos($description, '$logo$'); + if ($pos !== false) + { + + $description =str_replace('$logo$','',$description); + $logo=1; + } + if(isPermitted($pmodule,'DetailView',$mycrmid) == 'yes') + { + $mail_status = send_mail('Emails',$emailadd,$from_name,$from_address,$_REQUEST['subject'],$description,'','','all',$focus->id,$logo); + } + + $all_to_emailids []= $emailadd; + $mail_status_str .= $emailadd."=".$mail_status."&&&"; + //added to get remain the EditView page if an error occurs in mail sending + if($mail_status != 1) + { + $errorheader2 = 1; + } + } + } + } + +} +//Added to redirect the page to Emails/EditView if there is an error in mail sending +if($errorheader1 == 1 || $errorheader2 == 1) +{ + $returnset = 'return_module='.$returnmodule.'&return_action='.$returnaction.'&return_id='.vtlib_purify($_REQUEST['return_id']); + $returnmodule = 'Emails'; + $returnaction = 'EditView'; + //This condition is added to set the record(email) id when we click on send mail button after returning mail error + if($_REQUEST['mode'] == 'edit') + { + $returnid = $_REQUEST['record']; + } + else + { + $returnid = $_REQUEST['currentid']; + } +} +else +{ + global $adb; + $date_var = date('Ymd'); + $query = 'update vtiger_activity set date_start =? where activityid = ?'; + $adb->pquery($query, array($date_var, $returnid)); +} +//The following function call is used to parse and form a encoded error message and then pass to result page +$mail_error_str = getMailErrorString($mail_status_str); +$adb->println("Mail Sending Process has been finished.\n\n"); +if(isset($_REQUEST['popupaction']) && $_REQUEST['popupaction'] != '') +{ + /*this will fix #1211*/ + $inputs=""; + //$inputs=""; + echo $inputs; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/templates/testemailtemplateusage.php b/oss/vtiger/trunk/modules/Emails/templates/testemailtemplateusage.php new file mode 100644 index 00000000..e69de29b diff --git a/oss/vtiger/trunk/modules/Emails/templates/todel.txt b/oss/vtiger/trunk/modules/Emails/templates/todel.txt new file mode 100644 index 00000000..e69de29b diff --git a/oss/vtiger/trunk/modules/Emails/updateRelations.php b/oss/vtiger/trunk/modules/Emails/updateRelations.php new file mode 100644 index 00000000..14be6cbe --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/updateRelations.php @@ -0,0 +1,40 @@ +pquery($sql, array($id, $record)); + } +} +if(isset($_REQUEST['user_id']) && $_REQUEST['user_id'] != '') +{ + $record = $_REQUEST['record']; + $sql = "insert into vtiger_salesmanactivityrel values (?,?)"; + $adb->pquery($sql, array($_REQUEST["user_id"], $record)); +} + +header("Location: index.php?action=CallRelatedList&module=Emails&record=".vtlib_purify($record)); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Emails/webmailsend.php b/oss/vtiger/trunk/modules/Emails/webmailsend.php new file mode 100644 index 00000000..1c54392d --- /dev/null +++ b/oss/vtiger/trunk/modules/Emails/webmailsend.php @@ -0,0 +1,61 @@ +user_name; + $from_add = $current_user->column_fields['email1']; + } + else{ + $from_arr = explode('@',$_REQUEST['from_add']); + $from_name = $from_arr[0]; + $from_add = $_REQUEST['from_add']; + } +$mail_status = send_mail('Emails',$_REQUEST["parent_name"],$from_name,$from_add,$_REQUEST['subject'],$_REQUEST['description'],$_REQUEST["ccmail"],$_REQUEST["bccmail"],'all',$focus->id); + +$query = "update vtiger_emaildetails set email_flag ='SENT' where emailid=?"; +$adb->pquery($query, array($focus->id)); + +//set the errorheader1 to 1 if the mail has not been sent to the assigned to user +if($mail_status != 1) { //when mail send fails + $errorheader1 = 1; + $mail_status_str = $to_email."=".$mail_status."&&&"; + +} elseif($mail_status == 1 && $to_email == '') { //Mail send success only for CC and BCC but the 'to' email is empty + $adb->pquery($query, array($focus->id)); + $errorheader1 = 1; + $mail_status_str = "cc_success=0&&&"; +} else + $mail_status_str = $to_email."=".$mail_status."&&&"; + + + +//Added to redirect the page to Emails/EditView if there is an error in mail sending +if($errorheader1 == 1 || $errorheader2 == 1) +{ + $returnset = 'return_module='.$returnmodule.'&return_action='.$returnaction.'&return_id='.vtlib_purify($_REQUEST['return_id']); + $returnmodule = 'Emails'; + $returnaction = 'EditView'; + if($_REQUEST['mode'] == 'edit') + $returnid = $_REQUEST['record']; + else + $returnid = $_REQUEST['currentid']; +} + +//The following function call is used to parse and form a encoded error message and then pass to result page +$mail_error_str = getMailErrorString($mail_status_str); +$adb->println("Mail Sending Process has been finished.\n\n"); + +if(isset($_REQUEST['popupaction']) && $_REQUEST['popupaction'] != '') +{ + $inputs=""; + echo $inputs; +} +?> diff --git a/oss/vtiger/trunk/modules/Faq/CallRelatedList.php b/oss/vtiger/trunk/modules/Faq/CallRelatedList.php new file mode 100644 index 00000000..9303738c --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/CallRelatedList.php @@ -0,0 +1,77 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['question']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); + } + + global $mod_strings; + global $app_strings; + global $currentModule; + global $theme; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + } + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + if (isset($focus->name)) $smarty->assign("NAME", $focus->name); + $related_array=getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("CATEGORY",$category); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $smarty->assign("ID",$focus->id); + $smarty->assign("MODULE",$currentmodule); + $smarty->assign("SINGLE_MOD",$app_strings['Faq']); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/CustomView.php b/oss/vtiger/trunk/modules/Faq/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Faq/Delete.php b/oss/vtiger/trunk/modules/Faq/Delete.php new file mode 100644 index 00000000..cc085145 --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/Delete.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/DetailView.php b/oss/vtiger/trunk/modules/Faq/DetailView.php new file mode 100644 index 00000000..162ec74a --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/DetailView.php @@ -0,0 +1,117 @@ +retrieve_entity_info($_REQUEST['record'],"Faq"); + $focus->id = $_REQUEST['record']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Faq detail view"); +$smarty = new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); + +if(isset($focus->column_fields[question])) + $smarty->assign("NAME", $focus->column_fields[question]); + +$category = getParenttab(); +$smarty->assign("CATEGORY",$category); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); +$smarty->assign("SINGLE_MOD",$currentModule); +$smarty->assign("MODULE",$currentModule); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign("ID", vtlib_purify($_REQUEST['record'])); +if(isPermitted("Faq","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +if(isPermitted("Faq","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); + +$tabid = getTabid("Faq"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +//Added to display the Faq comments information +$smarty->assign("COMMENT_BLOCK",$focus->getFAQComments($_REQUEST['record'])); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} +if($singlepane_view == 'true') { + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +$smarty->assign("SinglePane_View", $singlepane_view); + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); +$smarty->display("DetailView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/DetailViewAjax.php b/oss/vtiger/trunk/modules/Faq/DetailViewAjax.php new file mode 100644 index 00000000..011acc4f --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/DetailViewAjax.php @@ -0,0 +1,56 @@ +retrieve_entity_info($crmid,"Faq"); + + //Added to avoid the comment save, when we edit other fields through ajax edit + if($fieldname != 'comments') + $modObj->column_fields['comments'] = ''; + + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("Faq"); + if($modObj->id != "") + { + if($fieldname == "comments") + { + $comments = $modObj->getFAQComments($modObj->id); + echo ":#:SUCCESS".$comments; + } + else + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/EditView.php b/oss/vtiger/trunk/modules/Faq/EditView.php new file mode 100644 index 00000000..5fbd2e6c --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/EditView.php @@ -0,0 +1,141 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if(isset($_REQUEST['record'])) +{ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"Faq"); +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') + $smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +else +{ + $smarty->assign("BASBLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS')); +} + +$smarty->assign("OP_MODE",$disp_view); + +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",$currentModule); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$smarty->assign("ID", $focus->id); +if(isset($focus->column_fields[question])) + $smarty->assign("NAME", $focus->column_fields[question]); + +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +if($focus->mode == 'edit') +{ + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MODE", $focus->mode); +} + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +else $smarty->assign("RETURN_MODULE","Faq"); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +else $smarty->assign("RETURN_ACTION","index"); +if(isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + + +$tabid = getTabid("Faq"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); + + $smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); + $smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); + $smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +if($_REQUEST['record'] != '') +{ + //Added to display the Faq comments information + $smarty->assign("COMMENT_BLOCK",$focus->getFAQComments($_REQUEST['record'])); +} +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
'. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +if($focus->mode == 'edit') + $smarty->display("salesEditView.tpl"); +else + $smarty->display("CreateView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/Faq.js b/oss/vtiger/trunk/modules/Faq/Faq.js new file mode 100644 index 00000000..7fa41f4a --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/Faq.js @@ -0,0 +1,21 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + +function clear_form(form) +{ + for (j = 0; j < form.elements.length; j++) + { + if (form.elements[j].type == 'text' || form.elements[j].type == 'select-one') + { + form.elements[j].value = ''; + } + } +} + diff --git a/oss/vtiger/trunk/modules/Faq/Faq.php b/oss/vtiger/trunk/modules/Faq/Faq.php new file mode 100644 index 00000000..936eba25 --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/Faq.php @@ -0,0 +1,200 @@ +'crmid','vtiger_faq'=>'id','vtiger_faqcomments'=>'faqid'); + + var $entity_table = "vtiger_crmentity"; + + var $column_fields = Array(); + + var $sortby_fields = Array('question','category','id'); + + // This is the list of vtiger_fields that are in the lists. + var $list_fields = Array( + 'FAQ Id'=>Array('faq'=>'id'), + 'Question'=>Array('faq'=>'question'), + 'Category'=>Array('faq'=>'category'), + 'Product Name'=>Array('faq'=>'product_id'), + 'Created Time'=>Array('crmentity'=>'createdtime'), + 'Modified Time'=>Array('crmentity'=>'modifiedtime') + ); + + var $list_fields_name = Array( + 'FAQ Id'=>'', + 'Question'=>'question', + 'Category'=>'faqcategories', + 'Product Name'=>'product_id', + 'Created Time'=>'createdtime', + 'Modified Time'=>'modifiedtime' + ); + var $list_link_field= 'question'; + + var $search_fields = Array( + 'Account Name'=>Array('account'=>'accountname'), + 'City'=>Array('accountbillads'=>'bill_city'), + ); + + var $search_fields_name = Array( + 'Account Name'=>'accountname', + 'City'=>'bill_city', + ); + + //Added these variables which are used as default order by and sortorder in ListView + var $default_order_by = 'id'; + var $default_sort_order = 'DESC'; + + var $mandatory_fields = Array('question','faq_answer','createdtime' ,'modifiedtime'); + + /** Constructor which will set the column_fields in this object + */ + function Faq() { + $this->log =LoggerManager::getLogger('faq'); + $this->log->debug("Entering Faq() method ..."); + $this->db = PearDatabase::getInstance(); + $this->column_fields = getColumnFields('Faq'); + $this->log->debug("Exiting Faq method ..."); + } + + function save_module($module) + { + //Inserting into Faq comment table + $this->insertIntoFAQCommentTable('vtiger_faqcomments', $module); + + } + + + /** Function to insert values in vtiger_faqcomments table for the specified module, + * @param $table_name -- table name:: Type varchar + * @param $module -- module:: Type varchar + */ + function insertIntoFAQCommentTable($table_name, $module) + { + global $log; + $log->info("in insertIntoFAQCommentTable ".$table_name." module is ".$module); + global $adb; + + $current_time = $adb->formatDate(date('Y-m-d H:i:s'), true); + + if($this->column_fields['comments'] != '') + $comment = $this->column_fields['comments']; + else + $comment = $_REQUEST['comments']; + + if($comment != '') + { + $params = array('', $this->id, from_html($comment), $current_time); + $sql = "insert into vtiger_faqcomments values(?, ?, ?, ?)"; + $adb->pquery($sql, $params); + } + } + + + /** Function to get the list of comments for the given FAQ id + * @param int $faqid - FAQ id + * @return list $list - return the list of comments and comment informations as a html output where as these comments and comments informations will be formed in div tag. + **/ + function getFAQComments($faqid) + { + global $log, $default_charset; + $log->debug("Entering getFAQComments(".$faqid.") method ..."); + global $mod_strings; + $sql = "select * from vtiger_faqcomments where faqid=?"; + $result = $this->db->pquery($sql, array($faqid)); + $noofrows = $this->db->num_rows($result); + + //In ajax save we should not add this div + if($_REQUEST['action'] != 'FaqAjax') + { + $list .= '

'; + $enddiv = '
'; + } + + for($i=0;$i<$noofrows;$i++) + { + $comment = $this->db->query_result($result,$i,'comments'); + $createdtime = $this->db->query_result($result,$i,'createdtime'); + if($comment != '') + { + //this div is to display the comment + if($_REQUEST['action'] == 'FaqAjax') { + $comment = htmlentities($comment, ENT_QUOTES, $default_charset); + } + $list .= '
'.make_clickable(nl2br($comment)).'
'; + + //this div is to display the created time + $list .= '
'.$mod_strings['Created Time']; + $list .= ' : '.$createdtime.'
'; + } + } + + $list .= $enddiv; + + $log->debug("Exiting getFAQComments method ..."); + return $list; + } + + /* + * Function to get the primary query part of a report + * @param - $module Primary module name + * returns the query string formed on fetching the related data for report for primary module + */ + function generateReportsQuery($module){ + $moduletable = $this->table_name; + $moduleindex = $this->table_index; + + $query = "from $moduletable + inner join vtiger_crmentity on vtiger_crmentity.crmid=$moduletable.$moduleindex + left join vtiger_products as vtiger_products$module on vtiger_products$module.productid = vtiger_faq.product_id + left join vtiger_groups as vtiger_groups$module on vtiger_groups$module.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_users$module on vtiger_users$module.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid"; + return $query; + } + + /* + * Function to get the relation tables for related modules + * @param - $secmodule secondary module name + * returns the array with table names and fieldnames storing relations between module and this module + */ + function setRelationTables($secmodule){ + $rel_tables = array ( + "Documents" => array("vtiger_senotesrel"=>array("crmid","notesid"),"vtiger_faq"=>"id"), + ); + return $rel_tables[$secmodule]; + } +} +?> diff --git a/oss/vtiger/trunk/modules/Faq/FaqAjax.php b/oss/vtiger/trunk/modules/Faq/FaqAjax.php new file mode 100644 index 00000000..ce66087f --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/FaqAjax.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Faq/ListFaq.php b/oss/vtiger/trunk/modules/Faq/ListFaq.php new file mode 100644 index 00000000..25ad43f2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/ListFaq.php @@ -0,0 +1,135 @@ +$title,'Header'=>$listview_header,'Entries'=>$listview_entries) where as listview_header and listview_entries are arrays of header and entity values which are returned from function getListViewHeader and getListViewEntries + */ +function getMyFaq($maxval,$calCnt) +{ + require_once("data/Tracker.php"); + require_once('modules/Faq/Faq.php'); + require_once('include/logging.php'); + require_once('include/ListView/ListView.php'); + require_once('include/utils/utils.php'); + require_once('modules/CustomView/CustomView.php'); + + global $current_language,$current_user,$list_max_entries_per_page,$theme,$adb; + $current_module_strings = return_module_language($current_language, 'Faq'); + + $log = LoggerManager::getLogger('faq_list'); + + $url_string = ''; + $sorder = ''; + $oCustomView = new CustomView("Faq"); + $customviewcombo_html = $oCustomView->getCustomViewCombo(); + if(isset($_REQUEST['viewname']) == false || $_REQUEST['viewname']=='') + { + if($oCustomView->setdefaultviewid != "") + { + $viewid = $oCustomView->setdefaultviewid; + }else + { + $viewid = "0"; + } + } + $focus = new Faq(); + + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + //Retreive the list from Database + //<<<<<<<<>>>>>>>> + $date_var = date('Y-m-d'); + + $where = ' and vtiger_crmentity.smownerid='.$current_user->id.' and vtiger_faq.status <> \'Obsolete\' ORDER BY vtiger_crmentity.createdtime DESC'; + $query = getListQuery("Faq",$where); + + //<<<<<<<>>>>>>>> + + $query .= " LIMIT 0," . $adb->sql_escape_string($maxval); + + if($calCnt == 'calculateCnt') { + $list_result_rows = $adb->query(mkCountQuery($query)); + return $adb->query_result($list_result_rows, 0, 'count'); + } + + $list_result = $adb->query($query); + + //Retreiving the no of rows + $noofrows = $adb->num_rows($list_result); + + //Retreiving the start value from request + if(isset($_REQUEST['start']) && $_REQUEST['start'] != '') + { + $start = vtlib_purify($_REQUEST['start']); + } + else + { + + $start = 1; + } + + //Retreive the Navigation array + $navigation_array = getNavigationValues($start, $noofrows, $list_max_entries_per_page); + + if ($navigation_array['start'] == 1) + { + if($noofrows != 0) + $start_rec = $navigation_array['start']; + else + $start_rec = 0; + if($noofrows > $list_max_entries_per_page) + { + $end_rec = $navigation_array['start'] + $list_max_entries_per_page - 1; + } + else + { + $end_rec = $noofrows; + } + + } + else + { + if($navigation_array['next'] > $list_max_entries_per_page) + { + $start_rec = $navigation_array['next'] - $list_max_entries_per_page; + $end_rec = $navigation_array['next'] - 1; + } + else + { + $start_rec = $navigation_array['prev'] + $list_max_entries_per_page; + $end_rec = $noofrows; + } + } + + + //Retreive the List View Table Header + $title=array('myFaqs.gif',$current_module_strings['LBL_MY_FAQ'],'home_myfaq'); + $listview_header = getListViewHeader($focus,"Faq",$url_string,$sorder,$order_by,"HomePage",$oCustomView); + $header = Array($listview_header[1],$listview_header[3]); + + $listview_entries = getListViewEntries($focus,"Faq",$list_result,$navigation_array,"HomePage","","EditView","Delete",$oCustomView); + foreach($listview_entries as $crmid=>$valuearray) + { + $entries[$crmid] = Array($valuearray[1],$valuearray[3]); + } + + $search_qry = "&query=true&Fields0=vtiger_faq.status&Condition0=isn&Srch_value0=Obsolete&searchtype=advance&search_cnt=1&matchtype=any"; + + $values=Array('ModuleName'=>'Faq','Title'=>$title,'Header'=>$header,'Entries'=>$entries,'search_qry'=>$search_qry); + if ( ($display_empty_home_blocks && $noofrows == 0 ) || ($noofrows>0) ) + return $values; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/ListView.php b/oss/vtiger/trunk/modules/Faq/ListView.php new file mode 100644 index 00000000..c599c3bf --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/ListView.php @@ -0,0 +1,263 @@ +initSortbyField('Faq'); +// END +$smarty = new vtigerCRM_Smarty; + +$other_text = Array(); + +if(!$_SESSION['lvs'][$currentModule]) +{ + unset($_SESSION['lvs']); + $modObj = new ListViewSession(); + $modObj->sorder = $sorder; + $modObj->sortby = $order_by; + $_SESSION['lvs'][$currentModule] = get_object_vars($modObj); +} + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR","The User does not have permission to delete ".$errormsg." ".$currentModule); +}else +{ + $smarty->assign("ERROR",""); +} +$url_string = ''; +//<<<>>>>>> +$oCustomView = new CustomView("Faq"); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); + +//Added to handle approving or denying status-public by the admin in CustomView +$statusdetails = $oCustomView->isPermittedChangeStatus($viewnamedesc['status']); +$smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + +//To check if a user is able to edit/delete a customview +$edit_permit = $oCustomView->isPermittedCustomView($viewid,'EditView',$currentModule); +$delete_permit = $oCustomView->isPermittedCustomView($viewid,'Delete',$currentModule); +$smarty->assign("CV_EDIT_PERMIT",$edit_permit); +$smarty->assign("CV_DELETE_PERMIT",$delete_permit); + +//<<<<>>>> + +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> +if($_REQUEST['order_by'] != '') + $order_by = $adb->sql_escape_string($_REQUEST['order_by']); +else + $order_by = (($_SESSION['FAQ_ORDER_BY'] != '')?($_SESSION['FAQ_ORDER_BY']):($focus->default_order_by)); + +if($_REQUEST['sorder'] != '') + $sorder = $adb->sql_escape_string($_REQUEST['sorder']); +else + $sorder = (($_SESSION['FAQ_SORT_ORDER'] != '')?($_SESSION['FAQ_SORT_ORDER']):($focus->default_sort_order)); + +$_SESSION['FAQ_ORDER_BY'] = $order_by; +$_SESSION['FAQ_SORT_ORDER'] = $sorder; +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> + +if($viewid != 0) +{ + $CActionDtls = $oCustomView->getCustomActionDetails($viewid); +} +elseif($viewid ==0) +{ + echo "
"; + echo "
+ + + + + + + + + +
$app_strings[LBL_PERMISSION]
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; +} + +if(isPermitted('Faq','Delete','') == 'yes') +$other_text ['del'] = $app_strings[LBL_MASS_DELETE]; + + +//Retreive the list from Database +//Retreive the list from Database +//<<<<<<<<>>>>>>>> +if($viewid != "0") +{ + $listquery = getListQuery("Faq"); + $list_query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"Faq"); +}else +{ + $list_query = getListQuery("Faq"); +} + +if(isset($_REQUEST['query']) && $_REQUEST['query'] == 'true') +{ + list($where, $ustring) = split("#@@#",getWhereCondition($currentModule)); + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); +} +if(isset($where) && $where != '') +{ + $list_query .= ' and '.$where; +} + + +$view_script = ""; +if(isset($order_by) && $order_by != '') +{ + $tablename = getTableNameForField('Faq',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY '.$tablename.$order_by; + + $list_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; +} +//Constructing the list view + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("BUTTONS",$other_text); +$smarty->assign("CATEGORY",$category); +$smarty->assign("SINGLE_MOD",'Document'); + +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +if($viewid !='') +$url_string .= "&viewname=".$viewid; + +//Retreive the List View Table Header +$listview_header = getListViewHeader($focus,"Faq",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_header_search = getSearchListHeaderValues($focus,"Faq",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER",$listview_header_search); + +$listview_entries = getListViewEntries($focus,"Faq",$list_result,$navigation_array,"","","EditView","Delete",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); +$smarty->assign("LISTENTITY", $listview_entries); +$smarty->assign("SELECT_SCRIPT", $view_script); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string,"Faq","index",$viewid); +$alphabetical = AlphabeticalSearch($currentModule,'index','question','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($module); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("SINGLE_MOD" ,'Faq'); + +if(isPermitted('Faq','EditView','') == 'yes') { + $other_text['mass_edit'] = $app_strings[LBL_MASS_EDIT]; +} +$smarty->assign("BUTTONS",$other_text); +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display("ListView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/ListViewPagging.php b/oss/vtiger/trunk/modules/Faq/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/MassEdit.php b/oss/vtiger/trunk/modules/Faq/MassEdit.php new file mode 100644 index 00000000..348dab37 --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/MassEdit.php @@ -0,0 +1,45 @@ +mode = ''; +$mode = 'mass_edit'; +$disp_view = getView($focus->mode); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("IDS",$_REQUEST['idstring']); +$smarty->assign("MASS_EDIT","1"); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("APP",$app_strings); +$smarty->assign("CATEGORY",getParentTab()); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/MassEditSave.php b/oss/vtiger/trunk/modules/Faq/MassEditSave.php new file mode 100644 index 00000000..2c3d6e86 --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/MassEditSave.php @@ -0,0 +1,71 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if($fieldname == 'assigned_user_id'){ + if($_REQUEST['assigntype'] == 'U') { + $value = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $value = $_REQUEST['assigned_group_id']; + } + } else { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + } + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + // Avoiding comment update on ticket + $focus->column_fields['comments'] = ''; + $_REQUEST['comments'] = ''; + // END + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/Save.php b/oss/vtiger/trunk/modules/Faq/Save.php new file mode 100644 index 00000000..320f42f9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/Save.php @@ -0,0 +1,54 @@ +column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} +$focus->save("Faq"); +$return_id = $focus->id; + +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "Faq"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + +$local_log->debug("Saved record with id of ".$return_id); + +header("Location: index.php?action=$return_action&module=$return_module&record=$return_id&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/Settings.php b/oss/vtiger/trunk/modules/Faq/Settings.php new file mode 100644 index 00000000..48a80c0b --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/Settings.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/TagCloud.php b/oss/vtiger/trunk/modules/Faq/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Faq/UnifiedSearch.php b/oss/vtiger/trunk/modules/Faq/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/index.php b/oss/vtiger/trunk/modules/Faq/index.php new file mode 100644 index 00000000..6bb2260c --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/index.php @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Faq/language/en_us.lang.php b/oss/vtiger/trunk/modules/Faq/language/en_us.lang.php new file mode 100644 index 00000000..31615a1d --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/language/en_us.lang.php @@ -0,0 +1,144 @@ +'FAQ', +'LBL_MODULE_TITLE'=>'FAQ: Home', +'LBL_SEARCH_FORM_TITLE'=>'FAQ Search', +'LBL_LIST_FORM_TITLE'=>'FAQ List', +'LBL_NEW_FORM_TITLE'=>'New Faq', +'LBL_MEMBER_ORG_FORM_TITLE'=>'Member Organizations', + +'LBL_LIST_ACCOUNT_NAME'=>'Faq Name', +'LBL_LIST_CITY'=>'City', +'LBL_LIST_WEBSITE'=>'Website', +'LBL_LIST_STATE'=>'State', +'LBL_LIST_PHONE'=>'Phone', +'LBL_LIST_EMAIL_ADDRESS'=>'Email Address', +'LBL_LIST_CONTACT_NAME'=>'Contact Name', +'LBL_FAQ_INFORMATION'=>'Faq Information', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + +'LBL_ACCOUNT'=>'Faq:', +'LBL_ACCOUNT_NAME'=>'Faq Name:', +'LBL_PHONE'=>'Phone:', +'LBL_WEBSITE'=>'Website:', +'LBL_FAX'=>'Fax:', +'LBL_TICKER_SYMBOL'=>'Ticker Symbol:', +'LBL_OTHER_PHONE'=>'Other Phone:', +'LBL_ANY_PHONE'=>'Any Phone:', +'LBL_MEMBER_OF'=>'Member of:', +'LBL_EMAIL'=>'Email:', +'LBL_EMPLOYEES'=>'Employees:', +'LBL_OTHER_EMAIL_ADDRESS'=>'Other Email:', +'LBL_ANY_EMAIL'=>'Any Email:', +'LBL_OWNERSHIP'=>'Ownership:', +'LBL_RATING'=>'Rating:', +'LBL_INDUSTRY'=>'Industry:', +'LBL_SIC_CODE'=>'SIC Code:', +'LBL_TYPE'=>'Type:', +'LBL_ANNUAL_REVENUE'=>'Annual Revenue:', +'LBL_ADDRESS_INFORMATION'=>'Address Information', +'LBL_ACCOUNT_INFORMATION'=>'Faq Information', +'LBL_BILLING_ADDRESS'=>'Billing Address:', +'LBL_SHIPPING_ADDRESS'=>'Shipping Address:', +'LBL_ANY_ADDRESS'=>'Any Address:', +'LBL_CITY'=>'City:', +'LBL_STATE'=>'State:', +'LBL_POSTAL_CODE'=>'Postal Code:', +'LBL_COUNTRY'=>'Country:', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', +'LBL_DESCRIPTION'=>'Description:', +'NTC_COPY_BILLING_ADDRESS'=>'Copy billing address to shipping address', +'NTC_COPY_SHIPPING_ADDRESS'=>'Copy shipping address to billing address', +'NTC_REMOVE_MEMBER_ORG_CONFIRMATION'=>'Are you sure you want to remove this record as a member organization?', +'LBL_DUPLICATE'=>'Potential Duplicate Faq', +'MSG_DUPLICATE' => 'Creating this vtiger_account may vtiger_potentialy create a duplicate vtiger_account. You may either select an vtiger_account from the list below or you may click on Create New Faq to continue creating a new vtiger_account with the previously entered data.', + +'LBL_INVITEE'=>'Contacts', +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", + +'LBL_SELECT_ACCOUNT'=>'Select Faq', +'LBL_GENERAL_INFORMATION'=>'General Information', + +//for v4 release added +'LBL_NEW_POTENTIAL'=>'New Potential', +'LBL_POTENTIAL_TITLE'=>'Potentials', + +'LBL_NEW_TASK'=>'New Task', +'LBL_TASK_TITLE'=>'Tasks', +'LBL_NEW_CALL'=>'New Call', +'LBL_CALL_TITLE'=>'Calls', +'LBL_NEW_MEETING'=>'New Meeting', +'LBL_MEETING_TITLE'=>'Meetings', +'LBL_NEW_EMAIL'=>'New Email', +'LBL_EMAIL_TITLE'=>'Emails', +'LBL_NEW_CONTACT'=>'New Contact', +'LBL_CONTACT_TITLE'=>'Contacts', + +//Added for 4GA Release +'Category'=>'Category', +'Related To'=>'Related To', +'Question'=>'Question', +'Answer'=>'Answer', +'Comments'=>'Comments', +'LBL_COMMENTS'=>'Comments',//give the same value given to the above string 'Comments' +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', + +//Added vtiger_fields after 4.2 alpha +'LBL_TICKETS'=>'Tickets', +'LBL_FAQ'=>'FAQ', +'Product Name'=>'Product Name', +'FAQ Id'=>'FAQ Id', +'Add Comment'=>'Add Comment', +'LBL_ADD_COMMENT'=>'Add Comment',//give the same value given to the above string 'Add Comment' +'LBL_COMMENT_INFORMATION'=>'Comment Information', +'Status'=>'Status', + +//Added on 10-12-2005 +'LBL_QUESTION'=>'Question', +'LBL_CATEGORY'=>'Category', +'LBL_MY_FAQ'=>'My Recent FAQs', + +//Added for existing Picklist Entries + +'General'=>'General', + +'Draft'=>'Draft', +'Reviewed'=>'Reviewed', +'Published'=>'Published', +'Obsolete'=>'Obsolete', + +// Module Sequence Numbering +'Faq No' => 'Faq No', +// END + +); + +?> diff --git a/oss/vtiger/trunk/modules/Faq/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Faq/language/zh_cn.lang.php new file mode 100644 index 00000000..b288c92c --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/language/zh_cn.lang.php @@ -0,0 +1,143 @@ + '常见问答', + 'LBL_MODULE_TITLE' => '常见问答: 首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻问答', + 'LBL_LIST_FORM_TITLE' => '问答列表', + 'LBL_NEW_FORM_TITLE' => '新增问答', + 'LBL_MEMBER_ORG_FORM_TITLE' => '会员所属组织单位', + + 'LBL_LIST_ACCOUNT_NAME' => '问答名称', + 'LBL_LIST_CITY' => '乡镇市区', + 'LBL_LIST_WEBSITE' => '网站', + 'LBL_LIST_STATE' => '县市', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_EMAIL_ADDRESS' => '电子邮件地址', + 'LBL_LIST_CONTACT_NAME' => '联系人名称', + 'LBL_FAQ_INFORMATION' => '常见问答信息', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + + 'LBL_ACCOUNT' => '常见问答:', + 'LBL_ACCOUNT_NAME' => '问答名称:', + 'LBL_PHONE' => '电话:', + 'LBL_WEBSITE' => '网站:', + 'LBL_FAX' => '传真:', + 'LBL_TICKER_SYMBOL' => '传票符号:', + 'LBL_OTHER_PHONE' => '其它电话:', + 'LBL_ANY_PHONE' => '其它电话:', + 'LBL_MEMBER_OF' => '会员:', + 'LBL_EMAIL' => '电子邮件:', + 'LBL_EMPLOYEES' => '员工:', + 'LBL_OTHER_EMAIL_ADDRESS' => '其它电子邮件:', + 'LBL_ANY_EMAIL' => '其它电子邮件:', + 'LBL_OWNERSHIP' => '所有人:', + 'LBL_RATING' => '评价:', + 'LBL_INDUSTRY' => '企业:', + 'LBL_SIC_CODE' => '统一编号:', + 'LBL_TYPE' => '类型:', + 'LBL_ANNUAL_REVENUE' => '年营业额:', + 'LBL_ADDRESS_INFORMATION' => '地址信息', + 'LBL_ACCOUNT_INFORMATION' => '问答信息', + 'LBL_BILLING_ADDRESS' => '发票地址:', + 'LBL_SHIPPING_ADDRESS' => '送货地址:', + 'LBL_ANY_ADDRESS' => '其它地址:', + 'LBL_CITY' => '乡镇市区:', + 'LBL_STATE' => '县市:', + 'LBL_POSTAL_CODE' => '邮政编码:', + 'LBL_COUNTRY' => '国家:', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息', + 'LBL_DESCRIPTION' => '描述:', + 'NTC_COPY_BILLING_ADDRESS' => '复制发票地址到送货地址', + 'NTC_COPY_SHIPPING_ADDRESS' => '复制送货地址至发票地址', + 'NTC_REMOVE_MEMBER_ORG_CONFIRMATION' => '您确定要移除关于这笔会员组织单位的记录?', + 'LBL_DUPLICATE' => '复制具有潜力的问答', + 'MSG_DUPLICATE' => '建立这个客户数据可能造成数据重复,您可以从下面选择一个客户的资料来更新或是点选建立新问答来透过刚刚输入的数据建立新项目。', + + 'LBL_INVITEE' => '联系人', + 'ERR_DELETE_RECORD' => '在删除公司前必须输入正确的记录编号.', + + 'LBL_SELECT_ACCOUNT' => '选择问答', + 'LBL_GENERAL_INFORMATION' => '一般信息', + +//for v4 release added +'LBL_NEW_POTENTIAL' => '新增潜在案件', + 'LBL_POTENTIAL_TITLE' => '潜在案件', + +'LBL_NEW_TASK' => '新增任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => '新增电话记录', + 'LBL_CALL_TITLE' => '电话记录', + 'LBL_NEW_MEETING' => '新增会议', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '新增电子邮件', + 'LBL_EMAIL_TITLE' => '电子邮件', + 'LBL_NEW_CONTACT' => '新增联系人', + 'LBL_CONTACT_TITLE' => '联系人', + +//Added for 4GA Release +'Category' => '类别', + 'Related To' => '相关人事', + 'Question' => '问题', + 'Answer' => '回答', + 'Comments' => '意见', +'LBL_COMMENTS'=>'意见',//give the same value given to the above string 'Comments' + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + +//Added vtiger_fields after 4.2 alpha +'LBL_TICKETS' => '传票', + 'LBL_FAQ' => '常见问答', + 'Product Name' => '产品名称', + 'FAQ Id' => '常见问答编号', + 'Add Comment' => '新增意见', +'LBL_ADD_COMMENT'=>'新增意见',//give the same value given to the above string 'Add Comment' +'LBL_COMMENT_INFORMATION'=>'意见信息', +'Status'=>'状态', + +//Added on 10-12-2005 +'LBL_QUESTION'=>'问题', +'LBL_CATEGORY'=>'类别', +'LBL_MY_FAQ'=>'我的最近常见问题', + +//Added for existing Picklist Entries + + 'General' => '一般', + +'Draft' => '草稿', + 'Reviewed' => '已审阅', + 'Published' => '已发布', + 'Obsolete' => '过期', + +// Module Sequence Numbering +'Faq No' => 'Faq No', +// END +); + +?> diff --git a/oss/vtiger/trunk/modules/Faq/updateRelations.php b/oss/vtiger/trunk/modules/Faq/updateRelations.php new file mode 100644 index 00000000..e333a98f --- /dev/null +++ b/oss/vtiger/trunk/modules/Faq/updateRelations.php @@ -0,0 +1,48 @@ +pquery("insert into vtiger_senotesrel values (?,?)", array($forCRMRecord,$id)); + else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=$forCRMRecord&parenttab=$parenttab"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/FieldFormulas.js b/oss/vtiger/trunk/modules/FieldFormulas/FieldFormulas.js new file mode 100644 index 00000000..fa3b1af1 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/FieldFormulas.js @@ -0,0 +1,8 @@ +/*+******************************************************************************* + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ******************************************************************************/ \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/FieldFormulas.php b/oss/vtiger/trunk/modules/FieldFormulas/FieldFormulas.php new file mode 100644 index 00000000..921b17b9 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/FieldFormulas.php @@ -0,0 +1,62 @@ +getUniqueID('vtiger_settings_field'); + $blockid = getSettingsBlockId('LBL_MODULE_MANAGER'); + + $seq_res = $adb->query("SELECT max(sequence) AS max_seq FROM vtiger_settings_field"); + $seq = 1; + if ($adb->num_rows($seq_res) > 0) { + $cur_seq = $adb->query_result($seq_res, 0, 'max_seq'); + if ($cur_seq != null) $seq = $cur_seq + 1; + } + + $adb->pquery('INSERT INTO vtiger_settings_field(fieldid, blockid, name, iconpath, description, linkto, sequence) + VALUES (?,?,?,?,?,?,?)', array($fieldid, $blockid, 'LBL_FIELDFORMULAS', 'modules/FieldFormulas/resources/FieldFormulas.png', 'LBL_FIELDFORMULAS_DESCRIPTION', 'index.php?module=FieldFormulas&action=index&parenttab=Settings', $seq)); + + $tabid = getTabid('FieldFormulas'); + if(isset($tabid) && $tabid!='') { + $adb->pquery('DELETE FROM vtiger_profile2tab WHERE tabid = ?', array($tabid)); + } + + // Mark the module as Standard module + $adb->pquery('UPDATE vtiger_tab SET customized=0 WHERE name=?', array($moduleName)); + + } else if($eventType == 'module.disabled') { + $em = new VTEventsManager($adb); + $em->setHandlerInActive('VTFieldFormulasEventHandler'); + + } else if($eventType == 'module.enabled') { + $em = new VTEventsManager($adb); + $em->setHandlerActive('VTFieldFormulasEventHandler'); + + } else if($eventType == 'module.preuninstall') { + // TODO Handle actions when this module is about to be deleted. + } else if($eventType == 'module.preupdate') { + // TODO Handle actions before this module is updated. + } else if($eventType == 'module.postupdate') { + // TODO Handle actions after this module is updated. + } + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/FieldFormulasAjax.php b/oss/vtiger/trunk/modules/FieldFormulas/FieldFormulasAjax.php new file mode 100644 index 00000000..8cd39c44 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/FieldFormulasAjax.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/VTFieldFormulasEventHandler.inc b/oss/vtiger/trunk/modules/FieldFormulas/VTFieldFormulasEventHandler.inc new file mode 100644 index 00000000..00276257 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/VTFieldFormulasEventHandler.inc @@ -0,0 +1,20 @@ +getModuleName(); + $mem = new VTModuleExpressionsManager($adb); + $me = $mem->retrieve($moduleName); + $me->update($data); + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/VTModuleExpressionsManager.inc b/oss/vtiger/trunk/modules/FieldFormulas/VTModuleExpressionsManager.inc new file mode 100644 index 00000000..8b68e864 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/VTModuleExpressionsManager.inc @@ -0,0 +1,179 @@ +adb = $adb; + } + + /** Caching logic **/ + private static $cache = array(); + static function addToCache($key, $value) { + self::$cache[$key] = $value; + } + static function fromCache($key) { + if(isset(self::$cache[$key])) return self::$cache[$key]; + return false; + } + static function clearCache() { + self::$cache = array(); + } + /** END **/ + + function retrieve($moduleName){ + $adb = $this->adb; + + // Look at cache if we have the information + $cachedinfo = self::fromCache($moduleName); + if($cachedinfo === false) { + + $result = $adb->pquery('select * from vtiger_fieldformulas where modulename=?', array($moduleName)); + if($adb->num_rows($result)==0){ + self::addToCache($moduleName, array() ); + }else{ + $ee = unserialize(decode_html($adb->query_result($result, 0, "expression_engine"))); + $id = $adb->query_result($result, 0, "expressionid"); + self::addToCache($moduleName, array('expressionid'=>$id, 'expression_engine'=>$ee)); + } + // Retrieve information from cache for consistency + $cachedinfo = self::fromCache($moduleName); + } + + $me = new VTModuleExpressions($moduleName, new VTExpressionEngine()); + if(!empty($cachedinfo)) { + $me = new VTModuleExpressions($moduleName, $cachedinfo['expression_engine']); + $me->id = $cachedinfo['expressionid']; + } + return $me; + + } + + function save($moduleExpressions){ + $adb = $this->adb; + if(isset($moduleExpressions->id)){ + $adb->pquery('update vtiger_fieldformulas set expression_engine=? where expressionid=?', + array(serialize($moduleExpressions->expressionEngine), $moduleExpressions->id)); + }else{ + $id = $adb->getUniqueId('vtiger_fieldformulas'); + $adb->pquery('insert into vtiger_fieldformulas + (expressionid, modulename, expression_engine) values(?,?,?)', + array($id, $moduleExpressions->moduleName, + serialize($moduleExpressions->expressionEngine))); + $moduleExpressions->id = $id; + } + // Invalidate cache information + self::clearCache(); + } + + + function expressionFields($moduleName){ + global $current_user; + $result = vtws_describe($moduleName, $current_user); + $fields = $result['fields']; + $arr = array(); + foreach($fields as $field){ + //Use the field name to figure out the custom field + if(preg_match('/cf_\d+/', $field['name']) && + in_array($field['type']['name'], array('text', 'string','integer', 'double'))){ + $arr[$field['name']] = getTranslatedString($field['label'], $moduleName); + } + } + return $arr; + } + + function fields($moduleName){ + global $current_user; + $result = vtws_describe($moduleName, $current_user); + $fields = $result['fields']; + $arr = array(); + foreach($fields as $field){ + $arr[$field['name']] = $field['label']; + } + return $arr; + } + + function expressionFunctions(){ + return array('concat' => 'concat(a,b)'); + } + + private function fieldNames($query, $moduleName){ + $adb = $this->adb; + $result = $adb->pquery($query, array($moduleName)); + $it = new SqlResultIterator($adb, $result); + $arr = array(); + foreach($it as $row){ + $arr[$row->fieldname]=$row->fieldlabel; + } + return $arr; + } + + function expressionsForModule($moduleName){ + return $this->retrieve($moduleName)->asArray(); + } +} + +class VTModuleExpressions{ + function __construct($moduleName, $expressionEngine){ + $this->moduleName=$moduleName; + $this->expressionEngine=$expressionEngine; + } + + function add($fieldName, $expression){ + try{ + $this->expressionEngine->loadExpressions(array($fieldName=>$expression)); + $this->state='savable'; + }catch(VTExpressionException $e){ + $this->state='error'; + $this->message=$e->getMessage(); + } + } + + function remove($fieldName){ + $this->expressionEngine->removeExpression($fieldName); + } + + function asArray(){ + return $this->expressionEngine->unparsedExpressions; + } + + function parseExpression($expr){ + $parser = new VTParser(new SpaceFilter(new VTTokenizer($expr))); + return $parser->expression(); + } + + function update($entity){ + $bound = $this->expressionEngine->evaluate($entity->getData()); + foreach($bound as $field => $value){ + $entity->set($field, $value); + } + } + + function getFieldsFromExpr($expr){ + function __getFieldsFromExpr($expr, &$arr){ + switch(get_class($expr)){ + case 'VTTreeNode': + $params = $expr->getParams(); + foreach($params as $param){ + __vtGetFieldsFromExpr($param, $arr); + } + return; + case 'Symbol': + $arr[$expr->value] = $expr; + return; + default: + return; + } + } + __vtGetFieldsFromExpr($expr, $arr); + return array_keys($arr); + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/deleteexpressionjson.php b/oss/vtiger/trunk/modules/FieldFormulas/deleteexpressionjson.php new file mode 100644 index 00000000..96ca3663 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/deleteexpressionjson.php @@ -0,0 +1,23 @@ +retrieve($moduleName); + $me->remove($fieldName); + $mem->save($me); + echo Zend_Json::encode(array('status'=>'success')); +} + +vtDeleteExpressionJson($adb, $_GET); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/editexpressions.php b/oss/vtiger/trunk/modules/FieldFormulas/editexpressions.php new file mode 100644 index 00000000..4c7783e1 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/editexpressions.php @@ -0,0 +1,80 @@ +assign('APP', $appStrings); + + $mod = array_merge( + return_module_language($current_language,'FieldFormulas'), + return_module_language($current_language,'Settings')); + + $jsStrings = array( + 'NEED_TO_ADD_A'=>$mod['NEED_TO_ADD_A'], + 'CUSTOM_FIELD' =>$mod['LBL_CUSTOM_FIELD'], + 'LBL_USE_FUNCTION_DASHDASH'=>$mod['LBL_USE_FUNCTION_DASHDASH'], + 'LBL_USE_FIELD_VALUE_DASHDASH'=>$mod['LBL_USE_FIELD_VALUE_DASHDASH'], + 'LBL_DELETE_EXPRESSION_CONFIRM'=>$mod['LBL_DELETE_EXPRESSION_CONFIRM'] + ); + $smarty->assign("JS_STRINGS", Zend_Json::encode($jsStrings)); + + $smarty->assign("MOD", $mod); + $smarty->assign("THEME",$theme); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("MODULE_NAME", 'FieldFormulas'); + $smarty->assign("PAGE_NAME", 'LBL_FIELDFORMULAS'); + $smarty->assign("PAGE_TITLE", 'LBL_FIELDFORMULAS'); + $smarty->assign("PAGE_DESC", 'LBL_FIELDFORMULAS_DESCRIPTION'); + $smarty->assign("FORMODULE", $formodule); + + if(file_exists("modules/$formodule/$formodule.php")) { + $focus = CRMEntity::getInstance($formodule); + $validationArray = split_validationdataArray(getDBValidationData($focus->tab_name, getTabid($formodule))); + $smarty->assign('VALIDATION_DATA_FIELDNAME',$validationArray['fieldname']); + $smarty->assign('VALIDATION_DATA_FIELDDATATYPE',$validationArray['datatype']); + $smarty->assign('VALIDATION_DATA_FIELDLABEL',$validationArray['fieldlabel']); + } + + $smarty->display(vtlib_getModuleTemplate('FieldFormulas', 'EditExpressions.tpl')); +} + +$modules = vtGetModules($adb); +if(vtlib_isModuleActive('FieldFormulas') && in_array(getTranslatedString($_REQUEST['formodule']),$modules)) { + vtEditExpressions($adb, $app_strings, $current_language, $theme, $_REQUEST['formodule']); +} else { + echo "
"; + echo "
+ + + + + + + + + +
".$app_strings['LBL_PERMISSION']."
+ $app_strings[LBL_BACK]
+
"; + echo "
";die; +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTExpressionEngine.inc b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTExpressionEngine.inc new file mode 100644 index 00000000..28cd8696 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTExpressionEngine.inc @@ -0,0 +1,174 @@ +expr = new VTExpressionEvaluater($expr); + $this->env = $env; + } + + function get(){ + if(!isset($this->val)){ + $this->val = $this->expr->evaluate($this->env); + } + return $this->val; + } +} + +class VTExpressionEngineEnv implements VTEnv{ + function __construct($data){ + $this->data = $data; + $this->vars = array(); + } + + function bind($name, $expr){ + $this->vars[$name] = new VTThunk($this, $expr); + } + + function get($var){ + if(array_key_exists($var, $this->vars)){ + return $this->vars[$var]->get(); + }else{ + return $this->data[$var]; + } + } +} + +class VTExpressionEngine{ + function __construct(){ + $this->data = array(); + $this->expressions = array(); + $this->unparsedExpressions = array(); + $this->vars = array(); + } + + + /** + * Load dynamic fields and their expressions + * + */ + function loadExpressions($arr){ + $this->unparsedExpressions = array_merge($this->unparsedExpressions, $arr); + $this->expressions = array_merge($this->expressions, array_map(array($this, 'expression'), $arr)); + $this->regenerate(); + } + + function removeExpression($fieldName){ + unset($this->unparsedExpressions[$fieldName]); + unset($this->expressions[$fieldName]); + $this->regenerate(); + } + + private function regenerate(){ + $this->vars = array_keys($this->expressions); + + $dyn_vars = array(); + foreach($this->expressions as $var => $expr){ + $syms = array_keys($this->getSyms($expr)); + $dyn_vars[$var] = $syms; + } + + $independents = array_keys(array_filter($dyn_vars, array($this, 'isEmpty'))); + $arr = array(); + foreach($dyn_vars as $var => $parents){ + foreach($parents as $parent){ + $arr[$parent][$var] = $var; + } + } + $dependents = array_map('array_keys', $arr); + $this->independents = $independents; + $this->dependents = $dependents; + $this->checkForCycles(); + } + + + /** + * Evaluate the expressions using the data in the array + * provided. + * + * @param $data An array of bound variables containing the + * the variable name as the key and the value as data. + * @return An array containing the variables bound to the expressions + * and their values. + */ + function evaluate($data){ + $env = new VTExpressionEngineEnv($data); + foreach($this->expressions as $var=>$expr){ + $env->bind($var, $expr); + } + + $out = array(); + foreach($this->vars as $var){ + $out[$var] = $env->get($var); + } + return $out; + } + + private function checkForCycles(){ + foreach($this->independents as $independent){ + $this->testCall($independent, array(), sizeof($this->dependents)); + } + } + + private function testCall($cur, $stack, $n){ + if($n<0){ + throw new VTExpressionException('There appears to be a loop in ('.implode(", ", $stack).')'); + } + $dependents = $this->dependents; + if(array_key_exists($cur, $dependents)){ + foreach($dependents[$cur] as $var){ + $this->testCall($var, array_merge($stack, array($cur)), $n-1); + } + } + } + + private function getSyms($expr){ + if($expr instanceof VTTreeNode){ + $params = $expr->getParams(); + if(sizeof($params)!=0){ + $sym_arr = array_map(array($this, "getSyms"), $params); + if(sizeof($sym_arr)>1){ + $syms = call_user_func_array('array_merge', $sym_arr); + + }else{ + $syms = $sym_arr[0]; + } + }else{ + $syms = array(); + } + return $syms; + }else if($expr instanceof Symbol && in_array($expr->value, $this->vars)){ + return array($expr->value=>$expr); + }else{ + return array(); + } + } + + private function loadExpression($var, $expr){ + $this->expressions[$var] = $value; + } + + private private function parse($str){ + $parser = new VTParser(new SpaceFilter(new VTTokenizer($str))); + return $parser->expression(); + } + + private function isEmpty($arr){ + return sizeof($arr)!=0; + } + + private function expression($str){ + $parser = new VTParser(new SpaceFilter(new VTTokenizer($str))); + return $parser->expression(); + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTExpressionEvaluater.inc b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTExpressionEvaluater.inc new file mode 100644 index 00000000..5cc3e4f4 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTExpressionEvaluater.inc @@ -0,0 +1,117 @@ += $arr[1]; +} + +function _vt_lt($arr) { + return $arr[0] < $arr[1]; +} + +function _vt_gt($arr) { + return $arr[0] > $arr[1]; +} + +function _vt_concat($arr){ + return implode($arr); +} + +class VTExpressionEvaluater{ + function __construct($expr){ + + $this->operators = array( + '+' => '_vt_add', + '-' => '_vt_sub', + '*' => '_vt_mul', + '/' => '_vt_div', + '==' => '_vt_equals', + '<=' => '_vt_ltequals', + '>=' => '_vt_gtequals', + '<' => '_vt_lt', + '>' => '_vt_gt', + ); + $this->functions = array( + 'concat'=>'_vt_concat' + ); + + $this->operations = array_merge($this->functions, $this->operators); + $this->expr = $expr; + + } + + function evaluate($env){ + $this->env = $env; + return $this->exec($this->expr); + } + + function exec($expr){ + if($expr instanceof Symbol){ + return $this->env($expr); + }else if($expr instanceof VTTreeNode){ + $op = $expr->getName(); + if($op->value=='if'){ + $params = $expr->getParams(); + $cond = $this->exec($params[0]); + if($cond){ + return $this->exec($params[1]); + }else{ + return $this->exec($params[2]); + } + }else{ + $params = array_map(array($this, 'exec'), $expr->getParams()); + $func = $this->operations[$op->value]; + return $func($params); + } + }else{ + return $expr; + } + } + + function env($sym){ + return $this->env->get($sym->value); + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTParser.inc b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTParser.inc new file mode 100644 index 00000000..061e0585 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTParser.inc @@ -0,0 +1,184 @@ +arr = $arr; + } + + function getParams(){ + $arr = $this->arr; + return array_slice($arr, 1, sizeof($arr)-1); + } + + function getName(){ + return $this->arr[0]; + } +} + + +class Symbol{ + function __construct($value){ + $this->value = $value; + } + + function __toString(){ + return "Symbol({$this->value})"; + } +} + +class VTParser{ + function __construct($tokens){ + $this->tokens = $tokens; + $this->tokenQueue = array(); + } + + function nextToken(){ + if(sizeof($this->tokenQueue)==0){ + return $this->tokens->nextToken(); + }else{ + return array_shift($this->tokenQueue); + } + } + + function la($n = 1){ + for($i=sizeof($this->tokenQueue); $i<$n; $i++){ + $token = $this->tokens->nextToken(); + $this->tokenQueue[] = $token; + } + return $this->tokenQueue[$n-1]; + } + + function consume($label, $value){ + $token=$this->nextToken(); + if($token->label!=$label || $token->value!=$value){ + echo "Was expecting a $label of value $value got a {$token->label} of {$token->value} instead."; + throw new Exception("Was expecting a $label of value $value got a {$token->label} of {$token->value} instead."); + } + } + + function consumeSymbol($sym){ + $this->consume('SYMBOL', new Symbol($sym)); + } + + + function check($token, $label, $value){ + return $token->label == $label && $token->value==$value; + } + + function checkSymbol($token, $sym){ + return $this->check($token, 'SYMBOL', new Symbol($sym)); + } + + function atom(){ + $token = $this->nextToken(); + switch($token->label){ + case "STRING": + return $token->value; + case "INTEGER": + return $token->value; + case "FLOAT": + return $token->value; + case "SYMBOL": + return $token->value; + case "OPEN_BRACKET": + $val = $this->expression(); + $close = $this->nextToken(); + if($close->label != 'CLOSE_BRACKET'){ + throw new Exception("Was expecting a close bracket"); + } + return $val; + default: + print_r($token); + throw new Exception(); + } + } + + function ifCondition(){ + $this->consumeSymbol('if'); + $cond = $this->expression(); + $this->consumeSymbol('then'); + $ifTrue = $this->expression(); + $this->consumeSymbol('else'); + if($this->checkSymbol($this->la(), 'if')){ + $ifFalse = $this->ifCondition(); + }else{ + $ifFalse = $this->expression(); + $this->consumeSymbol('end'); + } + return new VTTreeNode(array(new Symbol('if'), $cond, $ifTrue, $ifFalse)); + } + + function expression(){ + $la1 = $this->la(1); + $la2 = $this->la(2); + if($this->checkSymbol($la1, 'if')){ + return $this->ifCondition(); + }else if($la1->label=='SYMBOL' && $la2->label=='OPEN_BRACKET'){ + $arr = array($this->nextToken()->value); + $this->nextToken(); + if($this->la()->label != 'CLOSE_BRACKET'){ + $arr[] = $this->expression(); + $comma = $this->nextToken(); + while($comma->label == 'COMMA'){ + $arr[] = $this->expression(); + $comma = $this->nextToken(); + } + if($comma->label != 'CLOSE_BRACKET'){ + throw new Exception("Was expecting a closing bracket"); + } + }else{ + $this->consume('CLOSE_BRACKET', new Symbol(')')); + } + return new VTTreeNode($arr); + }else{ + return $this->binOp(); + } + } + + var $precedence = array( + array('*', '/'), + array('+', '-'), + array('and', 'or'), + array('==', '>=', '<=', '>', '<') + ); + + function binOp(){ + return $this->binOpPrec(sizeof($this->precedence)-1); + } + + private function binOpPrec($prec){ + if($prec>=0){ + $lhs = $this->binOpPrec($prec-1); + $la = $this->la(); + if($la->label == 'OPERATOR' && in_array($la->value->value, $this->precedence[$prec])){ + $operator = $this->nextToken()->value; + $rhs = $this->binOpPrec($prec); + return new VTTreeNode(array($operator, $lhs, $rhs)); + }else{ + return $lhs; + } + }else{ + return $this->unaryOp(); + } + } + + function unaryOp(){ + $la = $this->la(); + if($la->label=="OPERATOR" && in_array($la->value->value, array('+', '-'))){ + $token = $this->nextToken(); + $operator = $la->value; + $operand = $this->unaryOp(); + return new VTTreeNode(array($operator, $operand)); + }else{ + return $this->atom(); + } + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTTokenizer.inc b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTTokenizer.inc new file mode 100644 index 00000000..d9c46c80 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/VTTokenizer.inc @@ -0,0 +1,91 @@ +label = $label; + } +} + +function _processtoken_id($token){ + return $token; +} + +function _processtoken_symbol($token){ + return new Symbol($token); +} + +class VTTokenizer{ + function __construct($expr){ + $tokenTypes = array( + "SPACE" => array('\s+', '_processtoken_id'), + "SYMBOL" => array('[a-zA-Z][\w]*', '_processtoken_symbol'), + "ESCAPED_SYMBOL" => array('?:`([^`]+)`', '_processtoken_symbol'), + "STRING" => array('?:"((?:\\\\"|[^"])+)"', 'stripcslashes'), + "FLOAT" => array('\d+[.]\d+', 'floatval'), + "INTEGER" => array('\d+', 'intval'), + 'OPERATOR' => array('[+]|[-]|[*]|>=|<=|[<]|[>]|==|\/', '_processtoken_symbol'), + // NOTE: Any new Operator added should be updated in VTParser.inc::$precedence and operation at VTExpressionEvaluater + 'OPEN_BRACKET' => array('[(]', '_processtoken_symbol'), + 'CLOSE_BRACKET' => array('[)]', '_processtoken_symbol'), + 'COMMA' => array('[,]', '_processtoken_symbol') + ); + $tokenReArr = array(); + $tokenNames = array(); + $this->tokenTypes = $tokenTypes; + + foreach($tokenTypes as $tokenName => $code){ + list($re, $processtoken) = $code; + $tokenReArr[] = '('.$re.')'; + $tokenNames[] = $tokenName; + } + $this->tokenNames = $tokenNames; + $tokenRe = '/'.implode('|', $tokenReArr).'/'; + $this->EOF = new VTToken("EOF"); + + $matches = array(); + preg_match_all($tokenRe, $expr, $matches, PREG_SET_ORDER); + $this->matches = $matches; + $this->idx = 0; + } + function nextToken(){ + $matches = $this->matches; + $idx = $this->idx; + if($idx == sizeof($matches)){ + return $this->EOF; + }else{ + $match = $matches[$idx]; + $this->idx = $idx + 1; + $i=1; + while($match[$i]==null){ + $i+=1; + } + $tokenName = $this->tokenNames[$i-1]; + $token = new VTToken($tokenName); + $token->value = $this->tokenTypes[$tokenName][1]($match[$i]); + return $token; + } + } +} + +class SpaceFilter{ + function __construct($tokens){ + $this->tokens = $tokens; + } + + function nextToken(){ + do{ + $token = $this->tokens->nextToken(); + }while($token->label == "SPACE"); + return $token; + } +} + + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/include.inc b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/include.inc new file mode 100644 index 00000000..ba288b64 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/expression_engine/include.inc @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/getexpressionlistjson.php b/oss/vtiger/trunk/modules/FieldFormulas/getexpressionlistjson.php new file mode 100644 index 00000000..031e37d6 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/getexpressionlistjson.php @@ -0,0 +1,19 @@ +expressionsForModule($moduleName); + echo Zend_Json::encode($arr); +} +vtGetExpressionListJson($adb, $_GET); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/getfieldsjson.php b/oss/vtiger/trunk/modules/FieldFormulas/getfieldsjson.php new file mode 100644 index 00000000..4444f31c --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/getfieldsjson.php @@ -0,0 +1,24 @@ +expressionFields($moduleName); + $fields = $mem->fields($moduleName); + echo Zend_Json::encode(array('exprFields'=>$expressionFields, 'moduleFields'=>$fields)); +} +vtJsonFields($adb, $_REQUEST); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/getfunctionsjson.php b/oss/vtiger/trunk/modules/FieldFormulas/getfunctionsjson.php new file mode 100644 index 00000000..a60dffb2 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/getfunctionsjson.php @@ -0,0 +1,19 @@ +expressionFunctions(); + echo Zend_Json::encode($functions); +} +vtJsonFields($adb, $_REQUEST); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/include.inc b/oss/vtiger/trunk/modules/FieldFormulas/include.inc new file mode 100644 index 00000000..131c99c4 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/include.inc @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/index.php b/oss/vtiger/trunk/modules/FieldFormulas/index.php new file mode 100644 index 00000000..42f4cabf --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/index.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/language/en_us.lang.php b/oss/vtiger/trunk/modules/FieldFormulas/language/en_us.lang.php new file mode 100644 index 00000000..55efd168 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/language/en_us.lang.php @@ -0,0 +1,33 @@ + 'Field Formulas', +'LBL_FIELDFORMULAS' => 'Field Formulas', +'LBL_FIELDFORMULAS_DESCRIPTION' => 'Add custom equations to custom fields', +'LBL_FIELDS' => 'Fields', +'LBL_FUNCTIONS' => 'Functions', +'LBL_FIELD' => 'Field', +'LBL_EXPRESSION' => 'Expression', +'LBL_SETTINGS' => 'Settings', +'LBL_NEW_FIELD_EXPRESSION_BUTTON' => 'New Field Expression', +'LBL_EDIT_EXPRESSION' => 'Edit Expression', +'LBL_MODULE_INFO' => 'Forumlas defined for ', +'NEED_TO_ADD_A' =>'You need to add a string or integer type ', +'LBL_CUSTOM_FIELD' =>'Custom field', +'LBL_CHECKING'=>'Checking...', +'LBL_SELECT_ONE_DOTDOTDOT'=>'Select One...', +'LBL_TARGET_FIELD'=>'Target Field', +'LBL_DELETE_EXPRESSION_CONFIRM'=>'Are you sure to delete the expression?', +'LBL_EXAMPLES'=>'Examples', +'LBL_USE_FIELD_VALUE_DASHDASH'=>'-- Use Field Value --', +'LBL_USE_FUNCTION_DASHDASH'=>'-- Use Function --', +); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/FieldFormulas/language/zh_cn.lang.php new file mode 100644 index 00000000..7c48f9d1 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/language/zh_cn.lang.php @@ -0,0 +1,33 @@ + '字段公式', +'LBL_FIELDFORMULAS' => '字段公式', +'LBL_FIELDFORMULAS_DESCRIPTION' => '为自定义字段添加公式', +'LBL_FIELDS' => '字段', +'LBL_FUNCTIONS' => '函数', +'LBL_FIELD' => '字段', +'LBL_EXPRESSION' => '表达式', +'LBL_SETTINGS' => '设置', +'LBL_NEW_FIELD_EXPRESSION_BUTTON' => '新字段表达式', +'LBL_EDIT_EXPRESSION' => '编辑表达式', +'LBL_MODULE_INFO' => '定义公式- ', +'NEED_TO_ADD_A' =>'要求添加字符型或数字型 ', +'LBL_CUSTOM_FIELD' =>'自定义字段', +'LBL_CHECKING'=>'检查...', +'LBL_SELECT_ONE_DOTDOTDOT'=>'选择...', +'LBL_TARGET_FIELD'=>'目标字段', +'LBL_DELETE_EXPRESSION_CONFIRM'=>'你确定要删除这个表达式?', +'LBL_EXAMPLES'=>'示例', +'LBL_USE_FIELD_VALUE_DASHDASH'=>'-- 使用字段 --', +'LBL_USE_FUNCTION_DASHDASH'=>'-- 使用函数 --', +); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/FieldFormulas/resources/FieldFormulas.png b/oss/vtiger/trunk/modules/FieldFormulas/resources/FieldFormulas.png new file mode 100644 index 0000000000000000000000000000000000000000..d1ebb5a59d1fb717b24d1dd82049e9178fda94e2 GIT binary patch literal 3566 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/FieldFormulas/resources/editexpressionscript.js b/oss/vtiger/trunk/modules/FieldFormulas/resources/editexpressionscript.js new file mode 100644 index 00000000..33de7842 --- /dev/null +++ b/oss/vtiger/trunk/modules/FieldFormulas/resources/editexpressionscript.js @@ -0,0 +1,319 @@ +/*+******************************************************************************* + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ******************************************************************************/ +jQuery.noConflict(); +function editexpressionscript($){ + function errorDialog(message){ + alert(message); + } + + function handleError(fn){ + return function(status, result){ + if(status){ + fn(result); + }else{ + errorDialog('Failure:'+result); + } + }; + } + + + var ep;//ep is defined in the document.ready block. + + function errorDialog(message){ + alert(message); + } + + + function jsonget(operation, params, callback){ + var obj = { + module:'FieldFormulas', + action:'FieldFormulasAjax', + file:operation, ajax:'true'}; + $.each(params,function(key, value){ + obj[key] = value; + }); + $.get('index.php', obj, + function(result){ + var parsed = JSON.parse(result); + callback(parsed); + }); + } + + function getfieldlabel(fieldname) { + var fieldlabel = false; + if(typeof(meta_fieldnames) != 'undefined' && typeof(meta_fieldlabels) != 'undefined') { + fieldlabel = meta_fieldlabels[meta_fieldnames.indexOf(fieldname)]; + } + if(!fieldlabel) fieldlabel = fieldname; + return fieldlabel; + } + + function addFieldExpression(moduleName, fieldName, fieldLabel, expression){ + editLink = format('Edit', fieldName); + deleteLink = format('Delete', fieldName); + row = format('
%s%s%s | %s
", "
" ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and + +EOQ; + +return $the_script; +} + +/** + * Create HTML form to enter a new record with the minimum necessary fields. + * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc. + * All Rights Reserved. + * Contributor(s): ______________________________________.. + */ +function get_new_record_form () { + //TODO: To be implemented +} + +?> diff --git a/oss/vtiger/trunk/modules/Help/index.php b/oss/vtiger/trunk/modules/Help/index.php new file mode 100644 index 00000000..2d9e8bbd --- /dev/null +++ b/oss/vtiger/trunk/modules/Help/index.php @@ -0,0 +1,22 @@ + +Sorry! The module has not yet been implemented. +

+Stay tuned for an upcoming release of vtigerCRM! diff --git a/oss/vtiger/trunk/modules/Help/language/en_us.lang.php b/oss/vtiger/trunk/modules/Help/language/en_us.lang.php new file mode 100644 index 00000000..07614bed --- /dev/null +++ b/oss/vtiger/trunk/modules/Help/language/en_us.lang.php @@ -0,0 +1,29 @@ +'Accounts', +'LBL_MODULE_TITLE'=>'Accounts: Home', +'LBL_SEARCH_FORM_TITLE'=>'Account Search', +'LBL_LIST_FORM_TITLE'=>'Account List', +'LBL_NEW_FORM_TITLE'=>'New Account', +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the account.", +); + +?> diff --git a/oss/vtiger/trunk/modules/Help/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Help/language/zh_cn.lang.php new file mode 100644 index 00000000..890d4690 --- /dev/null +++ b/oss/vtiger/trunk/modules/Help/language/zh_cn.lang.php @@ -0,0 +1,29 @@ + '客户', + 'LBL_MODULE_TITLE' => '客户: 首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻客户', + 'LBL_LIST_FORM_TITLE' => '客户列表', + 'LBL_NEW_FORM_TITLE' => '新增客户', + 'ERR_DELETE_RECORD' => '必须指定其记录编号才能删除客户数据。', +); + +?> diff --git a/oss/vtiger/trunk/modules/HelpDesk/CallRelatedList.php b/oss/vtiger/trunk/modules/HelpDesk/CallRelatedList.php new file mode 100644 index 00000000..98ea390e --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/CallRelatedList.php @@ -0,0 +1,78 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['ticket_title']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); + } + + global $mod_strings; + global $app_strings; + global $currentModule; + global $theme; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + } + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + if (isset($focus->name)) $smarty->assign("NAME", $focus->name); + $related_array=getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("CATEGORY",$category); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $smarty->assign("ID",$focus->id); + $smarty->assign("MODULE",$currentmodule); + $smarty->assign("SINGLE_MOD",$app_strings['Ticket']); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/HelpDesk/ConvertAsFAQ.php b/oss/vtiger/trunk/modules/HelpDesk/ConvertAsFAQ.php new file mode 100644 index 00000000..4333ec40 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/ConvertAsFAQ.php @@ -0,0 +1,68 @@ + vtiger_faq column where ticket column is the troubletikcets vtiger_field name & vtiger_faq - column_fields +$ticket_faq_mapping_fields = Array( + 'title'=>'question', + 'product_id'=>'product_id', + 'description'=>'faq_answer', + //'ticketstatus'=>'faqstatus', + //'ticketcategories'=>'faqcategories' + ); +$sql = " select ticketid, title, product_id,vtiger_crmentity.description, solution,vtiger_troubletickets.status, category from vtiger_troubletickets inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_troubletickets.ticketid where ticketid=?"; +$res = $adb->pquery($sql, array($_REQUEST['record'])); + +//set all the ticket values to FAQ +foreach($ticket_faq_mapping_fields as $ticket_column => $faq_column) +{ + $focus->column_fields[$faq_column] = $adb->query_result($res,0,$ticket_column); +} + +$focus->save("Faq"); + +if($focus->id != '') +{ + $description = $adb->query_result($res,0,'description'); + $solution = $adb->query_result($res,0,'solution'); + + //Add the solution of the ticket with the FAQ answer + $answer = $description; + if($solution != '') + { + $answer .= "\r\n\r\n".$app_strings['LBL_SOLUTION'].":\r\n".$solution; + } + + //Retrive the ticket comments from the vtiger_ticketcomments vtiger_table and added into the vtiger_faq answer + $sql = "select ticketid, comments, createdtime from vtiger_ticketcomments where ticketid=?"; + $res = $adb->pquery($sql, array($_REQUEST['record'])); + $noofrows = $adb->num_rows($res); + + if($noofrows > 0) + $answer .= "\r\n\r\n".$app_strings['LBL_COMMENTS'].":"; + for($i=0; $i < $noofrows; $i++) + { + $comments = $adb->query_result($res,$i,'comments'); + if($comments != '') + { + $answer .= "\r\n".$comments; + } + } + + $sql1 = "update vtiger_faq set answer=? where id=?"; + $adb->pquery($sql1, array($answer, $focus->id)); +} + +header("Location:index.php?module=Faq&action=DetailView&record=$focus->id&return_module=Faq&return_action=DetailView&return_id=$focus->id"); + +?> diff --git a/oss/vtiger/trunk/modules/HelpDesk/ConvertToEntities.php b/oss/vtiger/trunk/modules/HelpDesk/ConvertToEntities.php new file mode 100644 index 00000000..804da174 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/ConvertToEntities.php @@ -0,0 +1,45 @@ +pquery($query, array()); +for($i=0;$ipquery('select * from vtiger_users where user_name=?', array($_REQUEST['assigned_user_id'])); + $changevalue=$adb->query_result($resultset,0,"id"); + $changekey='assigned_user_id'; + } + $sql="update vtiger_troubletickets set $changekey = ? where id = ?"; + $adb->pquery($sql, array($changevalue, $id)); +} +header("Location: index.php?action=index&module=HelpDesk"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/HelpDesk/CustomView.php b/oss/vtiger/trunk/modules/HelpDesk/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/HelpDesk/Delete.php b/oss/vtiger/trunk/modules/HelpDesk/Delete.php new file mode 100644 index 00000000..a177c2c8 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/Delete.php @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/HelpDesk/DetailView.php b/oss/vtiger/trunk/modules/HelpDesk/DetailView.php new file mode 100644 index 00000000..7792d33c --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/DetailView.php @@ -0,0 +1,146 @@ +retrieve_entity_info($_REQUEST['record'],"HelpDesk"); + $focus->name=$focus->column_fields['ticket_title']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; +} + +//Added code for Error display in sending mail to assigned to user when ticket is created or updated. +if($_REQUEST['mail_error'] != '') +{ + require_once("modules/Emails/mail.php"); + $ticket_owner = getUserName($focus->column_fields['assigned_user_id']); + $error_msg = strip_tags(parseEmailErrorString($_REQUEST['mail_error'])); + $error_msg = $app_strings['LBL_MAIL_NOT_SENT_TO_USER']. ' ' . $ticket_owner. '. ' .$app_strings['LBL_PLS_CHECK_EMAIL_N_SERVER']; + echo $mod_strings['LBL_MAIL_SEND_STATUS'].' '.$error_msg.''; +} + +global $app_strings; +global $mod_strings; +global $currentModule, $singlepane_view; + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$focus->id = $_REQUEST['record']; +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); +else $smarty->assign("NAME", ""); +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); +$smarty->assign("TICKETID", vtlib_purify($_REQUEST['record'])); + +$smarty->assign("CUSTOMFIELD", $cust_fld); +$smarty->assign("SINGLE_MOD", 'HelpDesk'); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); +$smarty->assign("UPDATEINFO",updateInfo($_REQUEST['record'])); + +if(isPermitted("HelpDesk","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +if(isPermitted("HelpDesk","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +//Added button for Convert the ticket to FAQ +if(isPermitted("Faq","EditView",'') == 'yes') + $smarty->assign("CONVERTASFAQ","permitted"); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign("ID", vtlib_purify($_REQUEST['record'])); +if(isPermitted("HelpDesk","Merge",'') == 'yes') +{ + global $current_user; + require("user_privileges/user_privileges_".$current_user->id.".php"); + require_once('include/utils/UserInfoUtil.php'); + $wordTemplateResult = fetchWordTemplateList("HelpDesk"); + $tempCount = $adb->num_rows($wordTemplateResult); + $tempVal = $adb->fetch_array($wordTemplateResult); + for($templateCount=0;$templateCount<$tempCount;$templateCount++) + { + $optionString[$tempVal["templateid"]]=$tempVal["filename"]; + $tempVal = $adb->fetch_array($wordTemplateResult); + } + if($is_admin) + $smarty->assign("MERGEBUTTON","permitted"); + elseif($tempCount >0) + $smarty->assign("MERGEBUTTON","permitted"); + $smarty->assign("TEMPLATECOUNT",$tempCount); + $smarty->assign("WORDTEMPLATEOPTIONS",$app_strings['LBL_SELECT_TEMPLATE_TO_MAIL_MERGE']); + $smarty->assign("TOPTIONS",$optionString); +} + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$tabid = getTabid("HelpDesk"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +//Added to display the ticket comments information +$smarty->assign("COMMENT_BLOCK",$focus->getCommentInformation($_REQUEST['record'])); + +$smarty->assign("MODULE",$currentModule); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); +$smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); +$smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); +if($singlepane_view == 'true') +{ + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} +$smarty->assign("SinglePane_View", $singlepane_view); + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("DetailView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/HelpDesk/DetailViewAjax.php b/oss/vtiger/trunk/modules/HelpDesk/DetailViewAjax.php new file mode 100644 index 00000000..9bd3d229 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/DetailViewAjax.php @@ -0,0 +1,116 @@ +retrieve_entity_info($crmid,"HelpDesk"); + + //Added to avoid the comment save, when we edit other fields through ajax edit + if($fieldname != 'comments') + $modObj->column_fields['comments'] = ''; + + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + + //Added to construct the update log for Ticket history + $assigned_group_name = getGroupName($_REQUEST['assigned_group_id']); + $assigntype = $_REQUEST['assigntype']; + + $fldvalue = $modObj->constructUpdateLog($modObj, $modObj->mode, $assigned_group_name, $assigntype); + $fldvalue = from_html($fldvalue,($modObj->mode == 'edit')?true:false); + + $modObj->save("HelpDesk"); + global $mod_strings; + if($fieldname == "solution" || $fieldname == "comments" || $fieldname =="assigned_user_id" ||($fieldname == "ticketstatus" && $fieldvalue == $mod_strings['Closed'])){ + require_once('modules/Emails/mail.php'); + $user_emailid = getUserEmailId('id',$modObj->column_fields['assigned_user_id']); + + $subject = $modObj->column_fields['ticket_no'] . ' [ '.$mod_strings['LBL_TICKET_ID'].' : '.$modObj->id.' ] Re : '.$modObj->column_fields['ticket_title']; + $parent_id = $modObj->column_fields['parent_id']; + if(!empty($parent_id) && $parent_id!=0){ + $parent_module = getSalesEntityType($parent_id); + if($parent_module == 'Contacts'){ + $result = $adb->pquery("select * from vtiger_contactdetails where contactid=?", array($parent_id)); + $emailoptout = $adb->query_result($result,0,'emailoptout'); + $contactname = $adb->query_result($result,0,'firstname').' '.$adb->query_result($result,0,'lastname'); + $parentname = $contactname; + $contact_mailid = $adb->query_result($result,0,'email'); + } + if($parent_module == 'Accounts'){ + $result = $adb->pquery("select * from vtiger_account where accountid=?", array($parent_id)); + $emailoptout = $adb->query_result($result,0,'emailoptout'); + $parentname = $adb->query_result($result,0,'accountname'); + } + if($contact_mailid != ''){ + $sql = "select * from vtiger_portalinfo where user_name=?"; + $isactive = $adb->query_result($adb->pquery($sql, array($contact_mailid)),0,'isactive'); + } + + if($isactive == 1){ + $url = "Ticket Details"; + $email_body = $subject.'

'.getPortalInfo_Ticket($modObj->id,$sub,$contactname,$url,"edit"); + }else{ + $data['sub']=$modObj->column_fields['ticket_title']; + $data['parent_name']=$parentname; + $data['status']=$modObj->column_fields['ticketstatus']; + $data['category']=$modObj->column_fields['ticketcategories']; + $data['severity'] = $modObj->column_fields['ticketseverities']; + $data['priority']=$modObj->column_fields['ticketpriorities']; + $data['description']=$modObj->column_fields['description']; + $data['solution'] = $modObj->column_fields['solution']; + $data['mode']= 'edit'; + $email_body = getTicketDetails($modObj->id,$data); + } + } + if($user_emailid != ''){ + $mail_status = send_mail('HelpDesk',$user_emailid,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body); + } + if($emailoptout == 0){ + //send mail to parent + if(!empty($parent_id)){ + $parent_email = getParentMailId($parent_module,$parent_id); + $mail_status = send_mail('HelpDesk',$parent_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body); + } + } + } + //update the log information for ticket history + $adb->pquery("update vtiger_troubletickets set update_log=? where ticketid=?", array($fldvalue, $modObj->id)); + + if($modObj->id != ""){ + if($fieldname == "comments"){ + $comments = $modObj->getCommentInformation($modObj->id); + echo ":#:SUCCESS".$comments; + }else{ + echo ":#:SUCCESS"; + } + }else{ + echo ":#:FAILURE"; + } + }else{ + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/HelpDesk/EditView.php b/oss/vtiger/trunk/modules/HelpDesk/EditView.php new file mode 100644 index 00000000..d7f211ab --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/EditView.php @@ -0,0 +1,147 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if(isset($_REQUEST['record']) && $_REQUEST['record'] !='') +{ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"HelpDesk"); + $focus->name=$focus->column_fields['ticket_title']; +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $old_id = $_REQUEST['record']; + if (! empty($focus->filename) ) + { + $old_id = $focus->id; + } + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') + $smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +else +{ + $smarty->assign("BASBLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS')); +} + +$smarty->assign("OP_MODE",$disp_view); + +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Ticket'); + + +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); + +if (isset($focus->name)) +$smarty->assign("NAME", $focus->name); +else +$smarty->assign("NAME", ""); + +if(isset($cust_fld)) +{ + $smarty->assign("CUSTOMFIELD", $cust_fld); +} +$smarty->assign("ID", $focus->id); +$smarty->assign("OLD_ID", $old_id ); +if($focus->mode == 'edit') +{ + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MODE", $focus->mode); + $smarty->assign("OLDSMOWNERID", $focus->column_fields['assigned_user_id']); +} + +if(isset($_REQUEST['return_module'])) +$smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if(isset($_REQUEST['return_action'])) +$smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if(isset($_REQUEST['return_id'])) +$smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if(isset($_REQUEST['product_id'])) +$smarty->assign("PRODUCTID", vtlib_purify($_REQUEST['product_id'])); +if (isset($_REQUEST['return_viewname'])) +$smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +$tabid = getTabid("HelpDesk"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +if($_REQUEST['record'] != '') +{ + //Added to display the ticket comments information + $smarty->assign("COMMENT_BLOCK",$focus->getCommentInformation($_REQUEST['record'])); +} +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
'. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + + +// Gather the help information associated with fields +$smarty->assign('FIELDHELPINFO', vtlib_getFieldHelpInfo($currentModule)); +// END + +if($focus->mode == 'edit') + $smarty->display("salesEditView.tpl"); +else + $smarty->display("CreateView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/HelpDesk/ExportRecords.php b/oss/vtiger/trunk/modules/HelpDesk/ExportRecords.php new file mode 100644 index 00000000..19858676 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/ExportRecords.php @@ -0,0 +1,11 @@ + diff --git a/oss/vtiger/trunk/modules/HelpDesk/FindDuplicateRecords.php b/oss/vtiger/trunk/modules/HelpDesk/FindDuplicateRecords.php new file mode 100644 index 00000000..a1ff9757 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/FindDuplicateRecords.php @@ -0,0 +1,106 @@ +pquery($sql, array($id)); + DeleteEntity($req_module,$return_module,$focus,$id,""); + } + else { + $ids_list[] = $id; + } +} + if(count($ids_list) > 0) { + $ret = getEntityName($req_module,$ids_list); + if(count($ret) > 0) + { + $errormsg = implode(',',$ret); + } + echo "
"; + echo "
+ + + + + + + + + +
+ $app_strings[LBL_DUP_PERMISSION] $req_module $errormsg
+ $app_strings[LBL_GO_BACK]
+
+
"; + echo "
"; + exit; + } +} + +include("include/saveMergeCriteria.php"); +$ret_arr=getDuplicateRecordsArr($req_module); + +$fld_values=$ret_arr[0]; +$total_num_group=count($fld_values); +$fld_name=$ret_arr[1]; +$ui_type=$ret_arr[2]; + +$smarty->assign("NAVIGATION",$ret_arr["navigation"]);//Added for page navigation +$smarty->assign("MODULE",$req_module); +$smarty->assign("NUM_GROUP",$total_num_group); +$smarty->assign("FIELD_NAMES",$fld_name); +$smarty->assign("CATEGORY",$parenttab); +$smarty->assign("ALL_VALUES",$fld_values); +if(isPermitted($req_module,'Delete','') == 'yes') + $button_del = $app_strings['LBL_MASS_DELETE']; +$smarty->assign("DELETE",$button_del); + +$smarty->assign("MOD", return_module_language($current_language,$req_module)); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MODE",'view'); +if(isset($_REQUEST['button_view'])) +{ + $smarty->assign("VIEW",'true'); +} +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("FindDuplicateAjax.tpl"); +else + $smarty->display('FindDuplicateDisplay.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/HelpDesk/HelpDesk.js b/oss/vtiger/trunk/modules/HelpDesk/HelpDesk.js new file mode 100644 index 00000000..c757a9dd --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/HelpDesk.js @@ -0,0 +1,80 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + +document.write(" +pquery($sql, array($templateid)); +$temparray = $adb->fetch_array($result); + +$fileContent = $temparray['data']; +$filename=html_entity_decode($temparray['filename'], ENT_QUOTES, $default_charset); +// Fix For: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/2107 +$filename= $randomfilename . "_word.doc"; + +$filesize=$temparray['filesize']; +$wordtemplatedownloadpath =$root_directory ."/test/wordtemplatedownload/"; + +$handle = fopen($wordtemplatedownloadpath .$filename,"wb"); +fwrite($handle,base64_decode($fileContent),$filesize); +fclose($handle); + +//<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>> +$mass_merge = $_REQUEST['allselectedboxes']; +$single_record = $_REQUEST['record']; + +if($mass_merge != "") +{ + $mass_merge = explode(";",$mass_merge); + $temp_mass_merge = $mass_merge; + if(array_pop($temp_mass_merge)=="") + array_pop($mass_merge); + //$mass_merge = implode(",",$mass_merge); +} +else if($single_record != "") +{ + $mass_merge = $single_record; +} +else +{ + die("Record Id is not found, cannot merge the document"); +} + +//<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>> + +global $current_user; +require('user_privileges/user_privileges_'.$current_user->id.'.php'); +if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0 || $module == "Users" || $module == "Emails") +{ + $query1="select vtiger_tab.name,vtiger_field.tablename,vtiger_field.columnname,vtiger_field.fieldlabel from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid where vtiger_field.tabid in (13,4,6) and vtiger_field.uitype <> 61 and block <> 75 and block <> 30 and vtiger_field.presence in (0,2) order by vtiger_field.tablename"; + $params1 = array(); +} +else +{ + $profileList = getCurrentUserProfileList(); + $query1="select vtiger_tab.name,vtiger_field.tablename,vtiger_field.columnname,vtiger_field.fieldlabel from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid INNER JOIN vtiger_profile2field ON vtiger_profile2field.fieldid=vtiger_field.fieldid INNER JOIN vtiger_def_org_field ON vtiger_def_org_field.fieldid=vtiger_field.fieldid where vtiger_field.tabid in (13,4,6) and vtiger_field.uitype <> 61 and block <> 75 and block <> 30 AND vtiger_profile2field.visible=0 AND vtiger_def_org_field.visible=0 AND vtiger_profile2field.profileid IN (". generateQuestionMarks($profileList) .") and vtiger_field.presence in (0,2) GROUP BY vtiger_field.fieldid order by vtiger_field.tablename"; + $params1 = array($profileList); + //Postgres 8 fixes + if( $adb->dbType == "pgsql") + $query1 = fixPostgresQuery( $query1, $log, 0); +} +$result = $adb->pquery($query1, $params1); +$y=$adb->num_rows($result); + +for ($x=0; $x<$y; $x++) +{ + $tablename = $adb->query_result($result,$x,"tablename"); + $columnname = $adb->query_result($result,$x,"columnname"); + $modulename = $adb->query_result($result,$x,"name"); + + $column_name = $tablename.".".$columnname; + + if($columnname == "parent_id") + { + $column_name = "case crmentityRelHelpDesk.setype when 'Accounts' then accountRelHelpDesk.accountname when 'Contacts' then concat(contactdetailsRelHelpDesk.firstname,' ',contactdetailsRelHelpDesk.lastname) End"; + } + if($columnname == "product_id") + { + $column_name = "productsRel.productname"; + } + if($tablename == "vtiger_crmentity") + { + if($modulename == "Contacts") + { + $tablename = "crmentityContacts"; + $column_name = $tablename.".".$columnname; + } + if($modulename == "Accounts") + { + $tablename = "crmentityAccounts"; + $column_name = $tablename.".".$columnname; + } + + } + + if($columnname == "smownerid") + { + if($modulename == "Accounts") + { + $column_name = "case when (usersAccounts.user_name not like '') then concat(usersAccounts.last_name,' ',usersAccounts.first_name) else groupsAccounts.groupname end as username"; + } + if($modulename == "Contacts") + { + $column_name = "case when (usersContacts.user_name not like '') then concat(usersContacts.last_name,' ',usersContacts.first_name) else groupsContacts.groupname end as username"; + } + if($modulename == "HelpDesk") + { + $column_name = "case when (vtiger_users.user_name not like '') then concat(vtiger_users.last_name,' ',vtiger_users.first_name) else vtiger_groups.groupname end as userhelpname,vtiger_users.first_name,vtiger_users.last_name,vtiger_users.user_name,vtiger_users.yahoo_id,vtiger_users.title,vtiger_users.phone_work,vtiger_users.department,vtiger_users.phone_mobile,vtiger_users.phone_other,vtiger_users.phone_fax,vtiger_users.email1,vtiger_users.phone_home,vtiger_users.email2,vtiger_users.address_street,vtiger_users.address_city,vtiger_users.address_state,vtiger_users.address_postalcode,vtiger_users.address_country"; + } + } + if($columnname == "parentid") + { + $column_name = "accountAccount.accountname"; + } + if($columnname == "accountid") + { + $column_name = "accountContacts.accountname"; + } + if($columnname == "reportsto") + { + $column_name = "contactdetailsContacts.lastname"; + } + + $querycolumns[$x] = $column_name; + + if($modulename == "Accounts") + { + $field_label[$x] = "ACCOUNT_".strtoupper(str_replace(" ","",$adb->query_result($result,$x,"fieldlabel"))); + } + if($modulename == "Contacts") + { + $field_label[$x] = "CONTACT_".strtoupper(str_replace(" ","",$adb->query_result($result,$x,"fieldlabel"))); + } + if($modulename == "HelpDesk") + { + $field_label[$x] = "TICKET_".strtoupper(str_replace(" ","",$adb->query_result($result,$x,"fieldlabel"))); + if($columnname == "smownerid") + { + $field_label[$x] = $field_label[$x].",USER_FIRSTNAME,USER_LASTNAME,USER_USERNAME,USER_YAHOOID,USER_TITLE,USER_OFFICEPHONE,USER_DEPARTMENT,USER_MOBILE,USER_OTHERPHONE,USER_FAX,USER_EMAIL,USER_HOMEPHONE,USER_OTHEREMAIL,USER_PRIMARYADDRESS,USER_CITY,USER_STATE,USER_POSTALCODE,USER_COUNTRY"; + } + } + +} +$csvheader = implode(",",$field_label); +//<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> + +if(count($querycolumns) > 0) +{ + $selectcolumns = implode($querycolumns,","); + + $query ="select ".$selectcolumns." from vtiger_troubletickets + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_troubletickets.ticketid + inner join vtiger_ticketcf on vtiger_ticketcf.ticketid = vtiger_troubletickets.ticketid + left join vtiger_crmentity as crmentityRelHelpDesk on crmentityRelHelpDesk.crmid = vtiger_troubletickets.parent_id + left join vtiger_account as accountRelHelpDesk on accountRelHelpDesk.accountid=crmentityRelHelpDesk.crmid + left join vtiger_contactdetails as contactdetailsRelHelpDesk on contactdetailsRelHelpDesk.contactid= crmentityRelHelpDesk.crmid + left join vtiger_products as productsRel on productsRel.productid = vtiger_troubletickets.product_id + left join vtiger_users on vtiger_crmentity.smownerid=vtiger_users.id + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_account on vtiger_account.accountid = vtiger_troubletickets.parent_id + left join vtiger_crmentity as crmentityAccounts on crmentityAccounts.crmid = vtiger_account.accountid + left join vtiger_accountbillads on vtiger_accountbillads.accountaddressid = vtiger_account.accountid + left join vtiger_accountshipads on vtiger_accountshipads.accountaddressid = vtiger_account.accountid + left join vtiger_accountscf on vtiger_accountbillads.accountaddressid = vtiger_accountscf.accountid + left join vtiger_account as accountAccount on accountAccount.accountid = vtiger_troubletickets.parent_id + left join vtiger_users as usersAccounts on usersAccounts.id = crmentityAccounts.smownerid + LEFT JOIN vtiger_groups as groupsAccounts + ON groupsAccounts.groupid = vtiger_crmentity.smownerid + left join vtiger_contactdetails on vtiger_contactdetails.contactid = vtiger_troubletickets.parent_id + left join vtiger_crmentity as crmentityContacts on crmentityContacts.crmid = vtiger_contactdetails.contactid + left join vtiger_contactaddress on vtiger_contactdetails.contactid = vtiger_contactaddress.contactaddressid + left join vtiger_contactsubdetails on vtiger_contactdetails.contactid = vtiger_contactsubdetails.contactsubscriptionid + left join vtiger_contactscf on vtiger_contactdetails.contactid = vtiger_contactscf.contactid + left join vtiger_customerdetails on vtiger_contactdetails.contactid = vtiger_customerdetails.customerid + left join vtiger_contactdetails as contactdetailsContacts on contactdetailsContacts.contactid = vtiger_contactdetails.reportsto + left join vtiger_account as accountContacts on accountContacts.accountid = vtiger_contactdetails.accountid + left join vtiger_users as usersContacts on usersContacts.id = crmentityContacts.smownerid + LEFT JOIN vtiger_groups as groupsContacts + ON groupsContacts.groupid = vtiger_crmentity.smownerid + where vtiger_crmentity.deleted=0 and ((crmentityContacts.deleted=0 || crmentityContacts.deleted is null)||(crmentityAccounts.deleted=0 || crmentityAccounts.deleted is null)) + and vtiger_troubletickets.ticketid in (". generateQuestionMarks($mass_merge) .")"; + + $result = $adb->pquery($query, array($mass_merge)); + $avail_pick_arr = getAccessPickListValues('HelpDesk'); + while($columnValues = $adb->fetch_array($result)) + { + $y=$adb->num_fields($result); + for($x=0; $x<$y; $x++) + { + $value = $columnValues[$x]; + foreach($columnValues as $key=>$val) + { + if($val == $value && $value != '') + { + if(array_key_exists($key,$avail_pick_arr)) + { + if(!in_array($val,$avail_pick_arr[$key])) + { + $value = "Not Accessible"; + } + } + } + } + //<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>> + if(trim($value) == "--None--" || trim($value) == "--none--") + { + $value = ""; + } + //<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>> + $actual_values[$x] = $value; + $actual_values[$x] = str_replace('"'," ",$actual_values[$x]); + //if value contains any line feed or carriage return replace the value with ".value." + if (preg_match ("/(\r\n)/", $actual_values[$x])) + { + $actual_values[$x] = '"'.$actual_values[$x].'"'; + } + $actual_values[$x] = decode_html(str_replace(","," ",$actual_values[$x])); + } + $mergevalue[] = implode($actual_values,","); + } + $csvdata = implode($mergevalue,"###"); +} +else +{ + die("No fields to do Merge"); +} +// Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/2107 +$datafilename = $randomfilename . "_data.csv"; + +$handle = fopen($wordtemplatedownloadpath.$datafilename,"wb"); +fwrite($handle,$csvheader."\r\n"); +fwrite($handle,str_replace("###","\r\n",$csvdata)); +fclose($handle); + +?> + + + diff --git a/oss/vtiger/trunk/modules/HelpDesk/Popup.php b/oss/vtiger/trunk/modules/HelpDesk/Popup.php new file mode 100644 index 00000000..e2aaa7de --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/Popup.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/HelpDesk/ProcessDuplicates.php b/oss/vtiger/trunk/modules/HelpDesk/ProcessDuplicates.php new file mode 100644 index 00000000..bb5047fa --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/ProcessDuplicates.php @@ -0,0 +1,134 @@ +pquery("SELECT count(*) AS count FROM vtiger_crmentity WHERE crmid=? and deleted=0", array($merge_id)); + $count = $adb->query_result($result,0,'count'); + + if($count > 0) + { + // First, save the primary record + $focus->mode="edit"; + setObjectValuesFromRequest($focus); + $focus->save($module); + $rec_values=$focus->column_fields; + + // Remove the id of primary record from the list of records to be deleted. + $del_value=explode(",",$recordids,-1); + $offset = array_search($merge_id,$del_value); + unset($del_value[$offset]); + + // Transfer the related lists of the records to be deleted, to the primary record's related list + if(method_exists($focus, 'transferRelatedRecords')){ + $focus->transferRelatedRecords($module,$del_value,$merge_id); + } else { + transferRelatedRecords($module,$del_value,$merge_id); + } + + // Delete the records by id specified in the list + foreach($del_value as $value) + { + DeleteEntity($_REQUEST['module'],$_REQUEST['return_module'],$focus,$value,""); + } + } + + ?> + +assign("EDIT_DUPLICATE",""); + if($record_count == 2) { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + else { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[2]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[2]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + + $all_values_array=getRecordValues($exploded_id,$module); + $all_values=$all_values_array[0]; + $js_arr_val=$all_values_array[1]; + $fld_array=$all_values_array[2]; + $js_arr=implode(",",$js_arr_val); + + $imported_records = Array(); + $sql="select bean_id from vtiger_users_last_import where bean_type=? and deleted=0"; + $result = $adb->pquery($sql, array($module)); + $num_rows=$adb->num_rows($result); + $count=0; + for($i=0; $i<$num_rows;$i++) + { + foreach($exploded_id as $value) + if($value == $adb->query_result($result,$i,"bean_id")) + $count++; + array_push($imported_records,$adb->query_result($result,$i,"bean_id")); + } + + if ($record_count == $count) + $no_existing=1; + else + $no_existing=0; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("RECORD_COUNT",$record_count); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULENAME", $module); + $smarty->assign("PARENT_TAB", $parent_tab); + $smarty->assign("JS_ARRAY", $js_arr); + $smarty->assign("ID_ARRAY", $exploded_id); + $smarty->assign("IDSTRING",$idstring); + $smarty->assign("ALLVALUES", $all_values); + $smarty->assign("FIELD_ARRAY", $fld_array); + $smarty->assign("IMPORTED_RECORDS", $imported_records); + $smarty->assign("NO_EXISTING", $no_existing); + $smarty->display("MergeFields.tpl"); +} + +?> diff --git a/oss/vtiger/trunk/modules/HelpDesk/QuickCreate.php b/oss/vtiger/trunk/modules/HelpDesk/QuickCreate.php new file mode 100644 index 00000000..8d5998b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/QuickCreate.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/HelpDesk/Save.php b/oss/vtiger/trunk/modules/HelpDesk/Save.php new file mode 100644 index 00000000..a6761f81 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/Save.php @@ -0,0 +1,189 @@ +pquery("select * from vtiger_crmentity where crmid=?", array($focus->id)); + $old_user_id = $adb->query_result($usr_qry,0,"smownerid"); +} +$grp_name = getGroupName($_REQUEST['assigned_group_id']); + +if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T'){ + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} + +$fldvalue = $focus->constructUpdateLog($focus, $mode, $grp_name, $_REQUEST['assigntype']); +$fldvalue = from_html($fldvalue,($mode == 'edit')?true:false); + +$focus->save("HelpDesk"); + +//After save the record, we should update the log +$adb->pquery("update vtiger_troubletickets set update_log=? where ticketid=?", array($fldvalue,$focus->id)); + +$return_id = $focus->id; + +$parenttab = getParentTab(); +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "HelpDesk"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + +if($_REQUEST['mode'] == 'edit') + $reply = 'Re : '; +else + $reply = ''; + +$subject = $focus->column_fields['ticket_no'] . ' [ '.$mod_strings['LBL_TICKET_ID'].' : '.$focus->id.' ] '.$reply.$_REQUEST['ticket_title']; +$bodysubject = $mod_strings['Ticket No'] .":
" . $focus->column_fields['ticket_no'] . "
" . $mod_strings['LBL_TICKET_ID'].' : '.$focus->id.'
'.$mod_strings['LBL_SUBJECT'].$_REQUEST['ticket_title']; + +$emailoptout = 0; + +//To get the emailoptout vtiger_field value and then decide whether send mail about the tickets or not +if($focus->column_fields['parent_id'] != '') +{ + $parent_module = getSalesEntityType($focus->column_fields['parent_id']); + if($parent_module == 'Contacts') + { + $result = $adb->pquery("select * from vtiger_contactdetails where contactid=?", array($focus->column_fields['parent_id'])); + $emailoptout = $adb->query_result($result,0,'emailoptout'); + $contactname = $adb->query_result($result,0,'firstname').' '.$adb->query_result($result,0,'lastname'); + $parentname = $contactname; + $contact_mailid = $adb->query_result($result,0,'email'); + } + if($parent_module == 'Accounts') + { + $result = $adb->pquery("select * from vtiger_account where accountid=?", array($focus->column_fields['parent_id'])); + $emailoptout = $adb->query_result($result,0,'emailoptout'); + $parentname = $adb->query_result($result,0,'accountname'); + } +} + +//Get the status of the vtiger_portal user. if the customer is active then send the vtiger_portal link in the mail +if($contact_mailid != '') +{ + $sql = "select * from vtiger_portalinfo where user_name=?"; + $isactive = $adb->query_result($adb->pquery($sql, array($contact_mailid)),0,'isactive'); +} +if($isactive == 1) +{ + $url = "".$mod_strings['LBL_TICKET_DETAILS'].""; + $email_body = $bodysubject.'

'.getPortalInfo_Ticket($focus->id,$_REQUEST['ticket_title'],$contactname,$url,$_REQUEST['mode']); +} +else +{ + $data['sub']=$_REQUEST['ticket_title']; + $data['parent_name']=$parentname; + $data['status']=$focus->column_fields['ticketstatus']; + $data['category']=$focus->column_fields['ticketcategories']; + $data['severity'] = $focus->column_fields['ticketseverities']; + $data['priority']=$focus->column_fields['ticketpriorities']; + $data['description']=$focus->column_fields['description']; + $data['solution'] = $focus->column_fields['solution']; + $data['mode']= $_REQUEST['mode']; + $email_body = getTicketDetails($focus->id,$data); +} +$_REQUEST['return_id'] = $return_id; + +if($_REQUEST['return_module'] == 'Products' & $_REQUEST['product_id'] != '' && $focus->id != '') + $return_id = vtlib_purify($_REQUEST['product_id']); + +//send mail to the assigned to user and the parent to whom this ticket is assigned +require_once('modules/Emails/mail.php'); +$user_emailid = getUserEmailId('id',$focus->column_fields['assigned_user_id']); + +if($user_emailid != '') +{ + if($_REQUEST['mode'] != 'edit') + { + $mail_status = send_mail('HelpDesk',$user_emailid,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body); + } + else + { + if(($focus->column_fields['ticketstatus'] == $mod_strings["Closed"]) || ($focus->column_fields['comments'] != '') || ($_REQUEST['helpdesk_solution'] != $_REQUEST['solution']) || ($focus->column_fields['assigned_user_id'] != $old_user_id)) + { + $mail_status = send_mail('HelpDesk',$user_emailid,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body); + } + + } + + $mail_status_str = $user_emailid."=".$mail_status."&&&"; +} +else +{ + $mail_status_str = "'".$to_email."'=0&&&"; +} +//added condition to check the emailoptout(this is for contacts and vtiger_accounts.) +if($emailoptout == 0) +{ + //send mail to parent + if($_REQUEST['parent_id'] != '' && $_REQUEST['parent_type'] != '') + { + $parentmodule = $_REQUEST['parent_type']; + $parentid = $_REQUEST['parent_id']; + + $parent_email = getParentMailId($parentmodule,$parentid); + if($_REQUEST['mode'] != 'edit') + { + $mail_status = send_mail('HelpDesk',$parent_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body); + } + else + { + if(( $focus->column_fields['ticketstatus']== $mod_strings["Closed"]) || ($focus->column_fields['comments'] != '' ) || ($_REQUEST['helpdesk_solution'] != $_REQUEST['solution'])) + { + $mail_status = send_mail('HelpDesk',$parent_email,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body); + } + } + $mail_status_str .= $parent_email."=".$mail_status."&&&"; + } +} +else +{ + $adb->println("'".$parentname."' is not want to get the email about the ticket details as emailoptout is selected"); +} + +if ($mail_status != '') { + $mail_error_status = getMailErrorString($mail_status_str); +} + +//code added for returning back to the current view after edit from list view +if($_REQUEST['return_viewname'] == '') $return_viewname='0'; +if($_REQUEST['return_viewname'] != '')$return_viewname=vtlib_purify($_REQUEST['return_viewname']); +header("Location: index.php?action=$return_action&module=$return_module&parenttab=$parenttab&record=$return_id&$mail_error_status&viewname=$return_viewname&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/HelpDesk/Settings.php b/oss/vtiger/trunk/modules/HelpDesk/Settings.php new file mode 100644 index 00000000..980dd078 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/Settings.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/HelpDesk/TagCloud.php b/oss/vtiger/trunk/modules/HelpDesk/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/HelpDesk/UnifiedSearch.php b/oss/vtiger/trunk/modules/HelpDesk/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/HelpDesk/index.php b/oss/vtiger/trunk/modules/HelpDesk/index.php new file mode 100644 index 00000000..72094552 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/index.php @@ -0,0 +1,17 @@ + diff --git a/oss/vtiger/trunk/modules/HelpDesk/language/en_us.lang.php b/oss/vtiger/trunk/modules/HelpDesk/language/en_us.lang.php new file mode 100644 index 00000000..2d32d06f --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/language/en_us.lang.php @@ -0,0 +1,221 @@ +'Trouble Tickets', +'LBL_GROUP'=>'Group', +'LBL_ACCOUNT_NAME'=>'Account Name', +'LBL_CONTACT_NAME'=>'Contact Name', +'LBL_SUBJECT'=>'Subject', +'LBL_NEW_FORM_TITLE' => 'New Ticket', +'LBL_DESCRIPTION'=>'Description', +'NTC_DELETE_CONFIRMATION'=>'Are you sure you want to delete this record?', +'LBL_CUSTOM_FIELD_SETTINGS'=>'Custom Field Settings:', +'LBL_PICKLIST_FIELD_SETTINGS'=>'Picklist Field Settings:', +'Leads'=>'Lead', +'Accounts'=>'Account', +'Contacts'=>'Contact', +'Opportunities'=>'Opportunity', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', + +'LBL_ACCOUNT'=>'Account', +'LBL_OPPURTUNITY'=>'Oppurtunity', +'LBL_PRODUCT'=>'Product', + +'LBL_COLON'=>':', +'LBL_TICKET'=>'Ticket', +'LBL_CONTACT'=>'Contact', +'LBL_STATUS'=>'Status', +'LBL_ASSIGNED_TO'=>'Assigned To', +'LBL_FAQ'=>'FAQ', +'LBL_VIEW_FAQS'=>'View FAQs', +'LBL_ADD_FAQS'=>'Add FAQs', +'LBL_FAQ_CATEGORIES'=>'FAQ Categories', + +'LBL_PRIORITY'=>'Priority', +'LBL_CATEGORY'=>'Category', + +'LBL_ANSWER'=>'Answer', +'LBL_COMMENTS'=>'COMMENTS', + +'LBL_AUTHOR'=>'Author', +'LBL_QUESTION'=>'Question', + +//Added vtiger_fields for File Attachment and Mail send in Tickets +'LBL_ATTACHMENTS'=>'Attachments', +'LBL_NEW_ATTACHMENT'=>'New Attachment', +'LBL_SEND_MAIL'=>'Send Mail', + +//Added vtiger_fields for search option in TicketsList -- 4Beta +'LBL_CREATED_DATE'=>'Created Date', +'LBL_IS'=>'is', +'LBL_IS_NOT'=>'is not', +'LBL_IS_BEFORE'=>'is before', +'LBL_IS_AFTER'=>'is after', +'LBL_STATISTICS'=>'Statistics', +'LBL_TICKET_ID'=>'Ticket Id', +'LBL_MY_TICKETS'=>'My Tickets', +"LBL_MY_FAQ"=>"My Faq's", +'LBL_ESTIMATED_FINISHING_TIME'=>'Estimated Finishing Time', +'LBL_SELECT_TICKET'=>'Select Ticket', +'LBL_CHANGE_OWNER'=>'Change Owner', +'LBL_CHANGE_STATUS'=>'Change Status', +'LBL_TICKET_TITLE'=>'Title', +'LBL_TICKET_DESCRIPTION'=>'Description', +'LBL_TICKET_CATEGORY'=>'Category', +'LBL_TICKET_PRIORITY'=>'Priority', + +//Added vtiger_fields after 4 -- Beta +'LBL_NEW_TICKET'=>'New Ticket', +'LBL_TICKET_INFORMATION'=>'Ticket Information', + +'LBL_LIST_FORM_TITLE'=>'Tickets List', +'LBL_SEARCH_FORM_TITLE'=>'Ticket Search', + +//Added vtiger_fields after RC1 - Release +'LBL_CHOOSE_A_VIEW'=>'Choose a View...', +'LBL_ALL'=>'All', +'LBL_LOW'=>'Low', +'LBL_MEDIUM'=>'Medium', +'LBL_HIGH'=>'High', +'LBL_CRITICAL'=>'Critical', +//Added vtiger_fields for 4GA +'Assigned To'=>'Assigned To', +'Contact Name'=>'Contact Name', +'Priority'=>'Priority', +'Status'=>'Status', +'Category'=>'Category', +'Update History'=>'Update History', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Title'=>'Title', +'Description'=>'Description', + +'LBL_TICKET_CUMULATIVE_STATISTICS'=>'Ticket Cumulative Statistics:', +'LBL_CASE_TOPIC'=>'Case Topic', +'LBL_OPEN'=>'Open', +'LBL_CLOSED'=>'Closed', +'LBL_TOTAL'=>'Total', +'LBL_TICKET_HISTORY'=>'Ticket History', +'LBL_CATEGORIES'=>'Categories', +'LBL_PRIORITIES'=>'Priorities', +'LBL_SUPPORTERS'=>'Supporters', + +//Added vtiger_fields after 4_0_1 +'LBL_TICKET_RESOLUTION'=>'Solution Information', +'Solution'=>'Solution', +'Add Comment'=>'Add Comment', +'LBL_ADD_COMMENT'=>'Add Comment',//give the same value given to the above string 'Add Comment' + +//Added for 4.2 Release -- CustomView +'Ticket ID'=>'Ticket ID', +'Subject'=>'Subject', + +//Added after 4.2 alpha +'Severity'=>'Severity', +'Product Name'=>'Product Name', +'Related To'=>'Related To', +'LBL_MORE'=>'More', + +'LBL_TICKETS'=>'Tickets', + +//Added on 09-12-2005 +'LBL_CUMULATIVE_STATISTICS'=>'Cumulative Statistics', + +//Added on 12-12-2005 +'LBL_CONVERT_AS_FAQ_BUTTON_TITLE'=>'Convert As FAQ', +'LBL_CONVERT_AS_FAQ_BUTTON_KEY'=>'C', +'LBL_CONVERT_AS_FAQ_BUTTON_LABEL'=>'Convert As FAQ', +'Attachment'=>'Attachment', +'LBL_COMMENT_INFORMATION'=>'Comment Information', + +//Added for existing picklist entries + +'Big Problem'=>'Big Problem', +'Small Problem'=>'Small Problem', +'Other Problem'=>'Other Problem', + +'Low'=>'Low', +'Normal'=>'Normal', +'High'=>'High', +'Urgent'=>'Urgent', + +'Minor'=>'Minor', +'Major'=>'Major', +'Feature'=>'Feature', +'Critical'=>'Critical', + +'Open'=>'Open', +'In Progress'=>'In Progress', +'Wait For Response'=>'Wait For Response', +'Closed'=>'Closed', + +//added to support i18n in ticket mails +'Hi' => 'Hi', +'Dear'=> 'Dear', +'LBL_PORTAL_BODY_MAILINFO'=> 'The Ticket is', +'LBL_DETAIL' => 'the details are :', +'LBL_REGARDS'=> 'Regards', +'LBL_TEAM'=> 'HelpDesk Team', +'LBL_TICKET_DETAILS' => 'Ticket Details', +'LBL_SUBJECT' => 'Subject : ', +'created' => 'created', +'replied' => 'replied', +'reply'=>'There is a reply to', +'customer_portal' => 'in the "Customer Portal" at VTiger.', +'link' => 'You can use the following link to view the replies made:', +'Thanks' => 'Thanks', +'Support_team' => 'Vtiger Support Team', + +// Added/Updated for vtiger CRM 5.0.4 + +//this label for customerportal. +'LBL_STATUS_CLOSED' =>'Closed',//Do not convert this label. This is used to check the status. If the status 'Closed' is changed in vtigerCRM server side then you have to change in customerportal language file also. +'LBL_STATUS_UPDATE' => 'Ticket status is updated as', +'LBL_COULDNOT_CLOSED' => 'Ticket could not be', +'LBL_CUSTOMER_COMMENTS' => 'Customer has provided the following additional information to your reply:', +'LBL_RESPOND'=> 'Kindly respond to above ticket at the earliest.', +'LBL_REGARDS' =>'Regards', +'LBL_SUPPORT_ADMIN' => 'Support Administrator', +'LBL_RESPONDTO_TICKETID' =>'Respond to Ticket ID', +'LBL_CUSTOMER_PORTAL' => 'in Customer Portal - URGENT', +'LBL_LOGIN_DETAILS' => 'Following are your Customer Portal login details :', +'LBL_MAIL_COULDNOT_SENT' =>'Mail could not be sent', +'LBL_USERNAME' => 'User Name :', +'LBL_PASSWORD' => 'Password :', +'LBL_SUBJECT_PORTAL_LOGIN_DETAILS' => 'Regarding your Customer Portal login details', +'LBL_GIVE_MAILID' => 'Please give your email id', +'LBL_CHECK_MAILID' => 'Please check your email id for Customer Portal', +'LBL_LOGIN_REVOKED' => 'Your login is revoked. Please contact your admin.', +'LBL_MAIL_SENT' => 'Mail has been sent to your mail id with the customer portal login details', +'LBL_ALTBODY' => 'This is the body in plain text for non-HTML mail clients', + +// Added after 5.0.4 GA + +// Module Sequence Numbering +'Ticket No' => 'Ticket No', +// END +); + +?> diff --git a/oss/vtiger/trunk/modules/HelpDesk/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/HelpDesk/language/zh_cn.lang.php new file mode 100644 index 00000000..eea95264 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/language/zh_cn.lang.php @@ -0,0 +1,221 @@ + '服务台', + 'LBL_GROUP' => '用户组', + 'LBL_ACCOUNT_NAME' => '客户名称', + 'LBL_CONTACT_NAME' => '联系人名称', + 'LBL_SUBJECT' => '标题', + 'LBL_NEW_FORM_TITLE' => '新增事件', + 'LBL_DESCRIPTION' => '描述', + 'NTC_DELETE_CONFIRMATION' => '您确定要删除这笔记录?', + 'LBL_CUSTOM_FIELD_SETTINGS' => '自订字段设定:', + 'LBL_PICKLIST_FIELD_SETTINGS' => '列表字段设定:', + 'Leads' => '潜在客户', + 'Accounts' => '客户', + 'Contacts' => '联系人', + 'Opportunities' => '潜在案件', + 'LBL_TICKET_INFORMATION' => '事件信息', + 'LBL_CUSTOM_INFORMATION' => '自订信息', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息', + 'LBL_ACCOUNT' => '客户', + 'LBL_OPPURTUNITY' => '潜在案件', + 'LBL_PRODUCT' => '商品', + 'LBL_COLON' => ':', + + 'LBL_TICKET' => '事件', + 'LBL_CONTACT' => '联系人', + 'LBL_STATUS' => '职位', + 'LBL_ASSIGNED_TO' => '负责人', + 'LBL_FAQ' => '常见问答', + 'LBL_VIEW_FAQS' => '观看问答', + 'LBL_ADD_FAQS' => '新增问答', + 'LBL_FAQ_CATEGORIES' => '问答类别', + + 'LBL_PRIORITY' => '前置', + 'LBL_CATEGORY' => '类别', + +'LBL_ANSWER'=>'回答', +'LBL_COMMENTS'=>'注释', + +'LBL_AUTHOR'=>'作者', +'LBL_QUESTION'=>'问题', + +//Added vtiger_fields for File Attachment and Mail send in Tickets + 'LBL_ATTACHMENTS' => '附件', + 'LBL_NEW_ATTACHMENT' => '新增附件', + 'LBL_SEND_MAIL' => '寄出邮件', + +//Added vtiger_fields for search option in TicketsList -- 4Beta + 'LBL_CREATED_DATE' => '建立日期', + 'LBL_IS' => '是', + 'LBL_IS_NOT' => '不是', + 'LBL_IS_BEFORE' => '在之前', + 'LBL_IS_AFTER' => '在之后', + 'LBL_STATISTICS' => '统计资料', + 'LBL_TICKET_ID' => '事件编号', + 'LBL_MY_TICKETS' => '我的事件', + 'LBL_MY_FAQ' => '我的问答集', + 'LBL_ESTIMATED_FINISHING_TIME' => '预估完成时间', + 'LBL_SELECT_TICKET' => '选择事件', + 'LBL_CHANGE_OWNER' => '改变拥有人', + 'LBL_CHANGE_STATUS' => '改变职位', + 'LBL_TICKET_TITLE' => '标题', + 'LBL_TICKET_DESCRIPTION' => '描述', + 'LBL_TICKET_CATEGORY' => '类别', + 'LBL_TICKET_PRIORITY' => '前置', + +//Added vtiger_fields after 4 -- Beta +'LBL_NEW_TICKET'=>'新增事件', +'LBL_TICKET_INFORMATION'=>'事件信息', + +'LBL_LIST_FORM_TITLE'=>'事件列表', +'LBL_SEARCH_FORM_TITLE'=>'事件搜索', + +//Added vtiger_fields after RC1 - Release +'LBL_CHOOSE_A_VIEW'=>'选择观看...', +'LBL_ALL' => '全部', + 'LBL_LOW' => '低', + 'LBL_MEDIUM' => '中', + 'LBL_HIGH' => '高', + 'LBL_CRITICAL' => '特急', +//Added vtiger_fields for 4GA +'Assigned To' => '负责人', + 'Contact Name' => '联系人名称', + 'Priority' => '前置', + 'Status' => '状态', + 'Category' => '类别', + 'Update History' => '更新记录', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'Title' => '标题', + 'Description' => '描述', + +'LBL_TICKET_CUMULATIVE_STATISTICS' => '事件累计统计信息:', + 'LBL_CASE_TOPIC' => '案件标题', + 'LBL_OPEN' => '开启', + 'LBL_CLOSED' => '关闭', + 'LBL_TOTAL' => '合计', + 'LBL_TICKET_HISTORY' => '事件记录:', + 'LBL_CATEGORIES' => '类别', + 'LBL_PRIORITIES' => '前置', + 'LBL_SUPPORTERS' => '支持者', + +//Added vtiger_fields after 4_0_1 +'LBL_TICKET_RESOLUTION'=>'解决方案详情', +'Solution'=>'解决方案', +'Add Comment'=>'添加注释', +'LBL_ADD_COMMENT'=>'添加注释',//give the same value given to the above string 'Add Comment' + +//Added for 4.2 Release -- CustomView + 'Ticket ID' => '事件编号', + 'Subject' => '主旨', + +//Added after 4.2 alpha + 'Severity' => '俭朴', + 'Product Name' => '产品名称', + 'Related To' => '相关信息', + 'LBL_MORE' => '更多', + + 'LBL_TICKETS' => '事件', + +//Added on 09-12-2005 + 'LBL_CUMULATIVE_STATISTICS' => '累积统计', + +//Added on 12-12-2005 + 'LBL_CONVERT_AS_FAQ_BUTTON_TITLE' => '转换为常见问答', + 'LBL_CONVERT_AS_FAQ_BUTTON_KEY' => 'C', + 'LBL_CONVERT_AS_FAQ_BUTTON_LABEL' => '转换为常见问答', + 'Attachment' => '附加档案', + 'LBL_COMMENT_INFORMATION' => '意见信息', + +//Added for existing picklist entries + +'Big Problem' => '大问题', + 'Small Problem' => '小问题', + 'Other Problem' => '其它问题', + +'Low' => '低', + 'Normal' => '一般', + 'High' => '高', + 'Urgent' => '紧急', + +'Minor' => '较小的', + 'Major' => '主要的', + 'Feature' => '功能', + 'Critical' => '重要', + + 'Open' => '开启', + 'In Progress' => '处理中', + 'Wait For Response' => '等待回应', + 'Closed' => '关闭', + +//added to support i18n in ticket mails +'Hi' => 'Hi', +'Dear'=> 'Dear', +'LBL_PORTAL_BODY_MAILINFO'=> '传票是', +'LBL_DETAIL' => '细节 :', +'LBL_REGARDS'=> '致意', +'LBL_TEAM'=> 'HelpDesk Team', +'LBL_TICKET_DETAILS' => '传票内容', +'LBL_SUBJECT' => '目标 : ', +'created' => '创建', +'replied' => '回复', +'reply'=>'有一个回复关于', +'customer_portal' => '客户门户.', +'link' => '您可以使用下面的链接来查看回复:', +'Thanks' => '谢谢', +'Support_team' => 'Vtiger支持团队', + +// Added/Updated for vtiger CRM 5.0.4 + +//this label for customerportal. +'LBL_STATUS_CLOSED' =>'关闭',//Do not convert this label. This is used to check the status. If the status 'Closed' is changed in vtigerCRM server side then you have to change in customerportal language file also. +'LBL_STATUS_UPDATE' => '事件状态被更新', +'LBL_COULDNOT_CLOSED' => '事件不能是', +'LBL_CUSTOMER_COMMENTS' => '顾客对您的回复提供了以下其它信息:', +'LBL_RESPOND'=> '很荣幸地说上述事件最早.', +'LBL_REGARDS' =>'祝福', +'LBL_SUPPORT_ADMIN' => '管理员支持', +'LBL_RESPONDTO_TICKETID' =>'响应传票ID', +'LBL_CUSTOMER_PORTAL' => '在客户门户中 - 快迅', +'LBL_LOGIN_DETAILS' => '以下是您的客户门户登录信息 :', +'LBL_MAIL_COULDNOT_SENT' =>'邮件发送失败', +'LBL_USERNAME' => '使用名称 :', +'LBL_PASSWORD' => '密码 :', +'LBL_SUBJECT_PORTAL_LOGIN_DETAILS' => '关于你的客户门户登录信息', +'LBL_GIVE_MAILID' => '请留下您的电子邮箱', +'LBL_CHECK_MAILID' => '请检查您的电子邮箱', +'LBL_LOGIN_REVOKED' => '登录被撤销。请与管理员联系。', +'LBL_MAIL_SENT' => '您的登录信息已发送到您的邮箱', +'LBL_ALTBODY' => '这是纯文本正文(非HTML电子邮件客户端)', + +// Added after 5.0.4 GA + +// Module Sequence Numbering +'Ticket No' => '传票号码', +// END +); + +?> diff --git a/oss/vtiger/trunk/modules/HelpDesk/updateRelations.php b/oss/vtiger/trunk/modules/HelpDesk/updateRelations.php new file mode 100644 index 00000000..85798501 --- /dev/null +++ b/oss/vtiger/trunk/modules/HelpDesk/updateRelations.php @@ -0,0 +1,48 @@ +pquery("insert into vtiger_senotesrel values (?,?)", array($forCRMRecord,$id)); + else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Home/HomeAjax.php b/oss/vtiger/trunk/modules/Home/HomeAjax.php new file mode 100644 index 00000000..27b1041d --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/HomeAjax.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Home/HomeBlock.php b/oss/vtiger/trunk/modules/Home/HomeBlock.php new file mode 100644 index 00000000..10d171a2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/HomeBlock.php @@ -0,0 +1,70 @@ +assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); + +if(!empty($_REQUEST['homestuffid'])){ + $stuffid = $_REQUEST['homestuffid']; +} +if(!empty($_REQUEST['blockstufftype'])){ + $stufftype = $_REQUEST['blockstufftype']; +} + +if($stufftype=='Tag Cloud'){ + $freetag = new freetag(); + $smarty->assign("ALL_TAG",$freetag->get_tag_cloud_html("",$current_user->id)); + $smarty->display("Home/TagCloud.tpl"); +}elseif($stufftype == 'Notebook'){ + $contents = $homeObj->getNoteBookContents($stuffid); + $smarty->assign("NOTEBOOK_CONTENTS",$contents); + $smarty->assign("NOTEBOOKID", $stuffid); + $smarty->display("Home/notebook.tpl"); +}elseif($stufftype == 'URL'){ + $url = $homeObj->getWidgetURL($stuffid); + if(strpos($url, "://") === false){ + $url = "http://".trim($url); + } + $smarty->assign("URL",$url); + $smarty->assign("WIDGETID", $stuffid); + $smarty->display("Home/HomeWidgetURL.tpl"); +}else{ + $homestuff_values=$homeObj->getHomePageStuff($stuffid,$stufftype); + if($stufftype=="DashBoard"){ + $homeObj->getDashDetails($stuffid,'type'); + $dashdet=$homeObj->dashdetails; + } +} + +$smarty->assign("DASHDETAILS",$dashdet); +$smarty->assign("HOME_STUFFTYPE",$stufftype); +$smarty->assign("HOME_STUFFID",$stuffid); +$smarty->assign("HOME_STUFF",$homestuff_values); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +$smarty->display("Home/HomeBlock.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Home/HomeNews.php b/oss/vtiger/trunk/modules/Home/HomeNews.php new file mode 100644 index 00000000..7226aa2b --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/HomeNews.php @@ -0,0 +1,32 @@ +vt_dofetch('http://feeds.feedburner.com/hawebs/fbDz', $ftimeout); +$items = $fparser->get_items(); +$NEWSLIST = Array(); +foreach($items as $item) { + $NEWSLIST[] = $item; +} + +require_once('Smarty_setup.php'); +$smarty = new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", "themes/$theme/images/"); +$smarty->assign('NEWSLIST', $NEWSLIST); +$smarty->display("HomeNews.tpl"); +?> + diff --git a/oss/vtiger/trunk/modules/Home/HomeUtils.php b/oss/vtiger/trunk/modules/Home/HomeUtils.php new file mode 100644 index 00000000..16840cf3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/HomeUtils.php @@ -0,0 +1,200 @@ +id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + + $today = date("Y-m-d", time()); + $upcoming_condition = " AND (date_start = '$today' OR vtiger_recurringevents.recurringdate = '$today')"; + + $list_query = " select vtiger_crmentity.crmid,vtiger_crmentity.smownerid,vtiger_crmentity.setype, vtiger_recurringevents.recurringdate, vtiger_activity.* from vtiger_activity inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid left outer join vtiger_recurringevents on vtiger_recurringevents.activityid=vtiger_activity.activityid WHERE vtiger_crmentity.deleted=0 and vtiger_activity.activitytype not in ('Emails') AND ( vtiger_activity.status is NULL OR vtiger_activity.status not in ('Completed','Deferred')) and ( vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus not in ('Held','Not Held') )".$upcoming_condition; + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[16] == 3){ + $sec_parameter=getListViewSecurityParameter('Calendar'); + $list_query .= $sec_parameter; + } + + $list_query.= " GROUP BY vtiger_activity.activityid"; + $list_query.= " ORDER BY date_start,time_start ASC"; + $list_query.= " limit $maxval"; + + $res = $adb->query($list_query); + $noofrecords = $adb->num_rows($res); + if($calCnt == 'calculateCnt'){ + return $noofrecords; + } + + $open_activity_list = array(); + if ($noofrecords>0){ + for($i=0;$i<$noofrecords;$i++){ + $open_activity_list[] = array('name' => $adb->query_result($res,$i,'subject'), + 'id' => $adb->query_result($res,$i,'activityid'), + 'type' => $adb->query_result($res,$i,'activitytype'), + 'module' => $adb->query_result($res,$i,'setype'), + 'date_start' => getDisplayDate($adb->query_result($res,$i,'date_start')), + 'due_date' => getDisplayDate($adb->query_result($res,$i,'due_date')), + 'recurringdate' => getDisplayDate($adb->query_result($res,$i,'recurringdate')), + 'priority' => $adb->query_result($res,$i,'priority'), + ); + } + } + $values = getActivityEntries($open_activity_list); + $values['ModuleName'] = 'Calendar'; + $values['search_qry'] = "&action=ListView&from_homepage=upcoming_activities"; + + return $values; +} + +/** + * this function returns the activity entries in array format + * it takes in an array containing activity details as a parameter + * @param array $open_activity_list - the array containing activity details + * return array $values - activities record in array format + */ +function getActivityEntries($open_activity_list){ + global $current_language, $app_strings; + $current_module_strings = return_module_language($current_language, 'Calendar'); + if(!empty($open_activity_list)){ + $header=array(); + $header[] =$current_module_strings['LBL_LIST_SUBJECT']; + $header[] =$current_module_strings['Type']; + + $entries = array(); + foreach($open_activity_list as $event){ + $recur_date=ereg_replace('--','',$event['recurringdate']); + if($recur_date!=""){ + $event['date_start']=$event['recurringdate']; + } + $font_color_high = "color:#00DD00;"; + $font_color_medium = "color:#DD00DD;"; + + switch ($event['priority']){ + case 'High': + $font_color=$font_color_high; + break; + case 'Medium': + $font_color=$font_color_medium; + break; + default: + $font_color=''; + } + + if($event['type'] != 'Task' && $event['type'] != 'Emails' && $event['type'] != ''){ + $activity_type = 'Events'; + }else{ + $activity_type = 'Task'; + } + + $entries[$event['id']] = array( + '0' => ''.$event["name"].'', + '1' => $event["type"], + ); + } + $values = array('noofactivities'=>count($open_activity_list),'Header'=>$header,'Entries'=>$entries); + }else{ + $values = array('Entries'=>$app_strings['LBL_NO_DATA']); + } + return $values; +} + + +/** + * function to get pending activities for today + * @param integer $maxval - the maximum number of records to display + * @param integer $calCnt - returns the count query if this is set + * return array $values - activities record in array format + */ +function homepage_getPendingActivities($maxval,$calCnt){ + require_once("data/Tracker.php"); + require_once("include/utils/utils.php"); + require_once('include/utils/CommonUtils.php'); + + global $adb; + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + + $today = date("Y-m-d", time()); + $pending_condition = " AND (due_date = '$today' OR vtiger_recurringevents.recurringdate = '$today')"; + + $list_query = "select vtiger_crmentity.crmid,vtiger_crmentity.smownerid,vtiger_crmentity.setype, vtiger_recurringevents.recurringdate, vtiger_activity.* from vtiger_activity inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid left outer join vtiger_recurringevents on vtiger_recurringevents.activityid=vtiger_activity.activityid WHERE vtiger_crmentity.deleted=0 and (vtiger_activity.activitytype not in ('Emails')) AND (vtiger_activity.status is NULL OR vtiger_activity.status not in ('Completed','Deferred')) and (vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus not in ('Held','Not Held')) ".$pending_condition; + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[16] == 3){ + $sec_parameter=getListViewSecurityParameter('Calendar'); + $list_query .= $sec_parameter; + } + + $list_query.= " GROUP BY vtiger_activity.activityid"; + $list_query.= " ORDER BY date_start,time_start ASC"; + $list_query.= " limit $maxval"; + + $res = $adb->query($list_query); + $noofrecords = $adb->num_rows($res); + if($calCnt == 'calculateCnt'){ + return $noofrecords; + } + + $open_activity_list = array(); + $noofrows = $adb->num_rows($res); + if (count($res)>0){ + for($i=0;$i<$noofrows;$i++){ + $open_activity_list[] = array('name' => $adb->query_result($res,$i,'subject'), + 'id' => $adb->query_result($res,$i,'activityid'), + 'type' => $adb->query_result($res,$i,'activitytype'), + 'module' => $adb->query_result($res,$i,'setype'), + 'date_start' => getDisplayDate($adb->query_result($res,$i,'date_start')), + 'due_date' => getDisplayDate($adb->query_result($res,$i,'due_date')), + 'recurringdate' => getDisplayDate($adb->query_result($res,$i,'recurringdate')), + 'priority' => $adb->query_result($res,$i,'priority'), + ); + } + } + + $values = getActivityEntries($open_activity_list); + $values['ModuleName'] = 'Calendar'; + $values['search_qry'] = "&action=ListView&from_homepage=pending_activities"; + + return $values; +} + + +/** + * this function returns the number of columns in the home page for the current user. + * if nothing is found in the database it returns 4 by default + * return integer $data - the number of columns + */ +function getNumberOfColumns(){ + global $current_user, $adb; + + $sql = "select * from vtiger_home_layout where userid=?"; + $result = $adb->pquery($sql, array($current_user->id)); + + if($adb->num_rows($result)>0){ + $data = $adb->query_result($result,0,"layout"); + }else{ + $data = 4; //default is 4 column layout for now + } + return $data; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Home/Homestuff.js b/oss/vtiger/trunk/modules/Home/Homestuff.js new file mode 100644 index 00000000..e80aaac9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/Homestuff.js @@ -0,0 +1,648 @@ +/*+******************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + *******************************************************************************/ + +/** + * this function is used to show hide the columns in the add widget div based on the option selected + * @param string typeName - the selected option + */ +function chooseType(typeName){ + $('vtbusy_info').style.display="inline"; + $('stufftype_id').value=typeName; + + var typeLabel = typeName; + if(alert_arr[typeName] != null && alert_arr[typeName] != "" && alert_arr[typeName] != 'undefined'){ + typeLabel = alert_arr[typeName]; + } + $('divHeader').innerHTML=""+alert_arr.LBL_ADD+typeLabel+""; + if(typeName=='Module'){ + $('moduleNameRow').style.display="block"; + $('moduleFilterRow').style.display="block"; + $('modulePrimeRow').style.display="block"; + $('showrow').style.display="block"; + $('rssRow').style.display="none"; + $('dashNameRow').style.display="none"; + $('dashTypeRow').style.display="none"; + $('StuffTitleId').style.display="block"; + //$('homeURLField').style.display = "none"; + }else if(typeName=='DashBoard'){ + $('moduleNameRow').style.display="none"; + $('moduleFilterRow').style.display="none"; + $('modulePrimeRow').style.display="none"; + $('rssRow').style.display="none"; + $('showrow').style.display="none"; + $('dashNameRow').style.display="block"; + $('dashTypeRow').style.display="block"; + $('StuffTitleId').style.display="block"; + //$('homeURLField').style.display = "none"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=HomestuffAjax&dash=dashboard', + onComplete: function(response){ + var responseVal=response.responseText; + $('selDashName').innerHTML=response.responseText; + show('addWidgetsDiv'); + placeAtCenter($('addWidgetsDiv')); + $('vtbusy_info').style.display="none"; + } + } + ); + }else if(typeName=='RSS'){ + $('moduleNameRow').style.display="none"; + $('moduleFilterRow').style.display="none"; + $('modulePrimeRow').style.display="none"; + $('showrow').style.display="block"; + $('rssRow').style.display="block"; + $('dashNameRow').style.display="none"; + $('dashTypeRow').style.display="none"; + $('StuffTitleId').style.display="block"; + $('vtbusy_info').style.display="none"; + //$('homeURLField').style.display = "none"; + }else if(typeName=='Default'){ + $('moduleNameRow').style.display="none"; + $('moduleFilterRow').style.display="none"; + $('modulePrimeRow').style.display="none"; + $('showrow').style.display="none"; + $('rssRow').style.display="none"; + $('dashNameRow').style.display="none"; + $('dashTypeRow').style.display="none"; + $('StuffTitleId').style.display="none"; + $('url_id').style.display = "none"; + }else if(typeName == 'Notebook'){ + $('moduleNameRow').style.display="none"; + $('moduleFilterRow').style.display="none"; + $('modulePrimeRow').style.display="none"; + $('showrow').style.display="none"; + $('rssRow').style.display="none"; + $('dashNameRow').style.display="none"; + $('dashTypeRow').style.display="none"; + $('StuffTitleId').style.display="block"; + $('vtbusy_info').style.display="none"; + //$('homeURLField').style.display = "none"; + } + /*else if(typeName == 'URL'){ + $('moduleNameRow').style.display="none"; + $('moduleFilterRow').style.display="none"; + $('modulePrimeRow').style.display="none"; + $('showrow').style.display="none"; + $('rssRow').style.display="none"; + $('dashNameRow').style.display="none"; + $('dashTypeRow').style.display="none"; + $('StuffTitleId').style.display="block"; + $('vtbusy_info').style.display="none"; + //$('homeURLField').style.display = "block"; + }*/ +} + +/** + * this function is used to set the filter list when the module name is changed + * @param string modName - the modula name for which you want the filter list + */ +function setFilter(modName){ + var modval=modName.value; + document.getElementById('savebtn').disabled = true; + if(modval!=""){ + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=HomestuffAjax&modname='+modval, + onComplete: function(response){ + var responseVal=response.responseText; + $('selModFilter_id').innerHTML=response.responseText; + setPrimaryFld(document.getElementById('selFilterid')); + show('addWidgetsDiv'); + placeAtCenter($('addWidgetsDiv')); + } + } + ); + } +} + +/** + * this function is used to set the field list when the module name is changed + * @param string modName - the modula name for which you want the field list + */ +function setPrimaryFld(Primeval){ + primecvid=Primeval.value; + var fldmodule = $('selmodule_id').options[$('selmodule_id').selectedIndex].value; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=HomestuffAjax&primecvid='+primecvid+'&fieldmodname='+fldmodule, + onComplete: function(response){ + var responseVal=response.responseText; + $('selModPrime_id').innerHTML=response.responseText; + $('selPrimeFldid').selectedIndex = 0; + $('vtbusy_info').style.display="none"; + document.getElementById('savebtn').disabled = false; + } + } + ); +} + +/** + * this function displays the div for selecting the number of rows in a widget + * @param string sid - the id of the widget for which the div is being displayed + */ +function showEditrow(sid){ + $('editRowmodrss_'+sid).className="show_tab"; +} + +/** + * this function is used to hide the div for selecting the number of rows in a widget + * @param string editRow - the id of the div + */ +function cancelEntries(editRow){ + $(editRow).className="hide_tab"; +} + +/** + * this function is used to save the maximum entries that a widget can display + * @param string selMaxName - the widget name + */ +function saveEntries(selMaxName){ + sidarr=selMaxName.split("_"); + sid=sidarr[1]; + $('refresh_'+sid).innerHTML=$('vtbusy_homeinfo').innerHTML; + cancelEntries('editRowmodrss_'+sid) + showmax=$(selMaxName).value; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=HomestuffAjax&showmaxval='+showmax+'&sid='+sid, + onComplete: function(response){ + var responseVal=response.responseText; + eval(response.responseText); + $('refresh_'+sid).innerHTML=''; + } + } + ); +} + +/** + * this function is used to save the dashboard values + */ +function saveEditDash(dashRowId){ + $('refresh_'+dashRowId).innerHTML=$('vtbusy_homeinfo').innerHTML; + cancelEntries('editRowmodrss_'+dashRowId); + var dashVal=''; + var iter=0; + for(iter=0;iter<3;iter++){ + if($('dashradio_'+[iter]).checked) + dashVal=$('dashradio_'+[iter]).value; + } + did=dashRowId; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=HomestuffAjax&dashVal='+dashVal+'&did='+did, + onComplete: function(response){ + var responseVal=response.responseText; + eval(response.responseText); + $('refresh_'+did).innerHTML=''; + } + } + ); +} + +/** + * this function is used to delete widgets form the home page + * @param string sid - the stuffid of the widget + */ +function DelStuff(sid){ + if(confirm("Are you sure you want to delete?")){ + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=HomestuffAjax&homestuffid='+sid, + onComplete: function(response){ + var responseVal=response.responseText; + if(response.responseText.indexOf('SUCCESS') > -1){ + var delchild = $('stuff_'+sid); + odeletedChild = $('MainMatrix').removeChild(delchild); + $('seqSettings').innerHTML= '
Widget deleted sucessfully.
'; + $('seqSettings').style.display = 'block'; + $('seqSettings').style.display = 'none'; + placeAtCenter($('seqSettings')); + Effect.Appear('seqSettings'); + setTimeout(hideSeqSettings,3000); + }else{ + alert("Error while deleting.Please try again.") + } + } + } + ); + } +} + +/** + * this function loads the newly added div to the home page + * @param string stuffid - the id of the newly created div + * @param string stufftype - the stuff type for the new div (for e.g. rss) + */ +function loadAddedDiv(stuffid,stufftype){ + gstuffId = stuffid; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=NewBlock&stuffid='+stuffid+'&stufftype='+stufftype, + onComplete: function(response){ + var responseVal=response.responseText; + $('MainMatrix').style.display= 'none'; + $('MainMatrix').innerHTML = response.responseText + $('MainMatrix').innerHTML; + positionDivInAccord('stuff_'+gstuffId,'',stufftype); + initHomePage(); + loadStuff(stuffid,stufftype); + $('MainMatrix').style.display='block'; + } + } + ); +} + +/** + * this function is used to reload a widgets' content based on its id and type + * @param string stuffid - the widget id + * @param string stufftype - the type of the widget + */ +function loadStuff(stuffid,stufftype){ + $('refresh_'+stuffid).innerHTML=$('vtbusy_homeinfo').innerHTML; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=HomeBlock&homestuffid='+stuffid+'&blockstufftype='+stufftype, + onComplete: function(response){ + var responseVal=response.responseText; + $('stuffcont_'+stuffid).innerHTML=response.responseText; + if(stufftype=="Module"){ + if($('more_'+stuffid).value != null && $('more_'+stuffid).value != '') + $('a_'+stuffid).href = "index.php?module="+$('more_'+stuffid).value+"&action=ListView&viewname="+$('cvid_'+stuffid).value; + } + if(stufftype=="Default" && typeof($('a_'+stuffid)) != 'undefined'){ + if($('more_'+stuffid).value != ''){ + $('a_'+stuffid).style.display = 'block'; + var url = "index.php?module="+$('more_'+stuffid).value+"&action=index"; + if($('search_qry_'+stuffid)!=''){ + url += $('search_qry_'+stuffid).value; + } + $('a_'+stuffid).href = url; + }else{ + $('a_'+stuffid).style.display = 'none'; + } + } + if(stufftype=="RSS"){ + $('a_'+stuffid).href = $('more_'+stuffid).value; + } + if(stufftype=="DashBoard"){ + $('a_'+stuffid).href = "index.php?module=Dashboard&action=index&type="+$('more_'+stuffid).value; + } + $('refresh_'+stuffid).innerHTML=''; + } + } + ); +} + +/** + * this function validates the form for creating a new widget + */ +function frmValidate(){ + if(trim($('stufftitle_id').value)==""){ + alert("Please enter Window Title"); + $('stufftitle_id').focus(); + return false; + } + if($('stufftype_id').value=="RSS"){ + if($('txtRss_id').value==""){ + alert("Please enter RSS URL"); + $('txtRss_id').focus(); + return false; + } + } + /*if($('stufftype_id').value=="URL"){ + if($('url_id').value==""){ + alert("Please enter URL"); + $('url_id').focus(); + return false; + } + }*/ + if($('stufftype_id').value=="Module"){ + var selLen; + var fieldval=new Array(); + var cnt=0; + selVal=document.Homestuff.PrimeFld; + for(k=0;k2){ + alert("Please select only two fields"); + selVal.focus(); + return false; + }else{ + document.Homestuff.fldname.value=fieldval; + } + } + var stufftype=$('stufftype_id').value; + var stufftitle=$('stufftitle_id').value; + $('stufftitle_id').value = ''; + var selFiltername=''; + var fldname=''; + var selmodule=''; + var maxentries=''; + var txtRss=''; + var seldashbd=''; + var seldashtype=''; + var seldeftype=''; + //var txtURL = ''; + + if(stufftype=="Module"){ + selFiltername =document.Homestuff.selFiltername[document.Homestuff.selFiltername.selectedIndex].value; + fldname = fieldval; + selmodule =$('selmodule_id').value; + maxentries =$('maxentryid').value; + }else if(stufftype=="RSS"){ + txtRss=$('txtRss_id').value; + maxentries =$('maxentryid').value; + }/*else if(stufftype=="URL"){ + txtURL=$('url_id').value; + }*/else if(stufftype=="DashBoard"){ + seldashbd=$('seldashbd_id').value; + seldashtype=$('seldashtype_id').value; + }else if(stufftype=="Default"){ + seldeftype=document.Homestuff.seldeftype[document.Homestuff.seldeftype.selectedIndex].value; + } + + var url="stufftype="+stufftype+"&stufftitle="+stufftitle+"&selmodule="+selmodule+"&maxentries="+maxentries+"&selFiltername="+selFiltername+"&fldname="+encodeURIComponent(fldname)+"&txtRss="+txtRss+"&seldashbd="+seldashbd+"&seldashtype="+seldashtype+"&seldeftype="+seldeftype;//+'&txtURL='+txtURL; + var stuffarr=new Array(); + $('vtbusy_info').style.display="inline"; + + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=Homestuff&'+url, + onComplete: function(response){ + var responseVal=response.responseText; + if(!response.responseText){ + alert("Unable to add homestuff! Please try again"); + $('vtbusy_info').style.display="none"; + $('stufftitle_id').value=''; + $('txtRss_id').value=''; + return false; + }else{ + hide('addWidgetsDiv'); + $('vtbusy_info').style.display="none"; + $('stufftitle_id').value=''; + $('txtRss_id').value=''; + eval(response.responseText); + } + } + } + ); +} + +/** + * this function is used to hide the default widgets + * @param string sid - the id of the widget + */ +function HideDefault(sid){ + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Home&action=HomeAjax&file=HomestuffAjax&stuffid='+sid+"&act=hide", + onComplete: function(response){ + var responseVal=response.responseText; + if(response.responseText.indexOf('SUCCESS') > -1){ + var delchild = $('stuff_'+sid); + odeletedChild = $('MainMatrix').removeChild(delchild); + $('seqSettings').innerHTML= '
'+alert_arr.LBL_WIDGET_HIDDEN+'.'+alert_arr.LBL_RESTORE_FROM_PREFERENCES+'.
'; + $('seqSettings').style.display = 'block'; + $('seqSettings').style.display = 'none'; + placeAtCenter($('seqSettings')); + Effect.Appear('seqSettings'); + setTimeout(hideSeqSettings,3000); + }else{ + alert(alert_arr.ERR_HIDING + '.'+ alert_arr.MSG_TRY_AGAIN + '.'); + } + } + } + ); +} + + +/** + * this function removes the widget dropdown window + */ +function fnRemoveWindow(){ + var tagName = document.getElementById('addWidgetDropDown').style.display= 'none'; +} + +/** + * this function displays the widget dropdown window + */ +function fnShowWindow(){ + var tagName = document.getElementById('addWidgetDropDown').style.display= 'block'; +} + +/** + * this function is used to postion the widgets on home on page resize + * @param string targetDiv - the id of the target widget + * @param string stufftitle - the title of the target widget + * @param string stufftype - the type of the target widget + */ +function positionDivInAccord(targetDiv,stufftitle,stufftype){ + var layout=$('homeLayout').value; + var widgetWidth; + var dashWidth; + + switch(layout){ + case '2': + widgetWidth = 49; + dashWidth = 98.6; + break; + case '3': + widgetWidth = 31; + dashWidth = 64; + break; + case '4': + widgetWidth = 24; + dashWidth = 48.6; + break; + default: + widgetWidth = 24; + dashWidth = 48.6; + break; + } + var mainX = parseInt(document.getElementById("MainMatrix").style.width); + if(stufftitle != vtdashboard_defaultDashbaordWidgetTitle && stufftype != "DashBoard"){ + var dx = mainX * widgetWidth/ 100; + }else{ + var dx = mainX * dashWidth / 100; + } + document.getElementById(targetDiv).style.width=dx + "%"; +} + +/** + * this function hides the seqSettings div + */ +function hideSeqSettings(){ + Effect.Fade('seqSettings'); +} + +/** + * this function fetches the homepage dashboard + * @param string stuffid - the id of the dashboard widget + */ +function fetch_homeDB(stuffid){ + $('refresh_'+stuffid).innerHTML=$('vtbusy_homeinfo').innerHTML; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'module=Dashboard&action=DashboardAjax&file=HomepageDB', + onComplete: function(response){ + $('stuffcont_'+stuffid).style.display = 'none'; + $('stuffcont_'+stuffid).innerHTML=response.responseText; + $('refresh_'+stuffid).innerHTML=''; + Effect.Appear('stuffcont_'+stuffid); + } + } + ); +} + +/** + * this function initializes the homepage + */ +initHomePage = function(){ + Sortable.create( + "MainMatrix", + { + constraint:false,tag:'div',overlap:'Horizontal',handle:'headerrow', + onUpdate:function(){ + matrixarr = Sortable.serialize('MainMatrix').split("&"); + matrixseqarr=new Array(); + seqarr=new Array(); + for(x=0;xstufftype=$_REQUEST['stufftype']; +} + +if(!empty($_REQUEST['stufftitle'])){ + if(strlen($_REQUEST['stufftitle'])>100){ + $temp_str = substr($_REQUEST['stufftitle'],0,97)."..."; + $oHomestuff->stufftitle= $temp_str; + }else{ + $oHomestuff->stufftitle=$_REQUEST['stufftitle']; + } + // Remove HTML/PHP tags from the input + if(isset($oHomestuff->stufftitle)) { + $oHomestuff->stufftitle = strip_tags($oHomestuff->stufftitle); + } +} + +if(!empty($_REQUEST['selmodule'])){ + $oHomestuff->selmodule=$_REQUEST['selmodule']; +} + +if(!empty($_REQUEST['maxentries'])){ + $oHomestuff->maxentries=$_REQUEST['maxentries']; +} + +if(!empty($_REQUEST['selFiltername'])){ + $oHomestuff->selFiltername=$_REQUEST['selFiltername']; +} + +if(!empty($_REQUEST['fldname'])){ + $oHomestuff->fieldvalue=$_REQUEST['fldname']; +} + +if(!empty($_REQUEST['txtRss'])){ + $ooRss=new vtigerRSS(); + if($ooRss->setRSSUrl($_REQUEST['txtRss'])){ + $oHomestuff->txtRss=$_REQUEST['txtRss']; + }else{ + return false; + } +} + +if(!empty($_REQUEST['txtURL'])){ + $oHomestuff->txtURL = $_REQUEST['txtURL']; +} +if(isset($_REQUEST['seldashbd']) && $_REQUEST['seldashbd']!=""){ + $oHomestuff->seldashbd=$_REQUEST['seldashbd']; +} + +if(isset($_REQUEST['seldashtype']) && $_REQUEST['seldashtype']!=""){ + $oHomestuff->seldashtype=$_REQUEST['seldashtype']; +} + +if(isset($_REQUEST['seldeftype']) && $_REQUEST['seldeftype']!=""){ + $seldeftype=$_REQUEST['seldeftype']; + $defarr=explode(",",$seldeftype); + $oHomestuff->defaultvalue=$defarr[0]; + $deftitlehash=$defarr[1]; + $oHomestuff->defaulttitle=str_replace("#"," ",$deftitlehash); +} + +$loaddetail=$oHomestuff->addStuff(); +echo $loaddetail; +?> diff --git a/oss/vtiger/trunk/modules/Home/HomestuffAjax.php b/oss/vtiger/trunk/modules/Home/HomestuffAjax.php new file mode 100644 index 00000000..7f207988 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/HomestuffAjax.php @@ -0,0 +1,192 @@ +id.'.php'); + +$modval=trim($_REQUEST['modname']); +$dash=trim($_REQUEST['dash']); +if(!empty($modval)){ + $tabid = getTabId($modval); + $ssql = "select vtiger_customview.*, vtiger_users.user_name from vtiger_customview inner join vtiger_tab on vtiger_tab.name = vtiger_customview.entitytype + left join vtiger_users on vtiger_customview.userid = vtiger_users.id "; + $ssql .= " where vtiger_tab.tabid=?"; + $sparams = array($tabid); + + if($is_admin == false){ + $ssql .= " and (vtiger_customview.status=0 or vtiger_customview.userid = ? or vtiger_customview.status = 3 or vtiger_customview.userid in(select vtiger_user2role.userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '".$current_user_parent_role_seq."::%'))"; + array_push($sparams, $current_user->id); + } + $result = $adb->pquery($ssql, $sparams); + + if($adb->num_rows($result)==0){ + echo $mod_strings['MSG_NO_FILTERS']; + die; + }else{ + $html = ''; + } + echo $html; +} + +if(!empty($dash)){ + global $current_language; + $dashbd_strings = return_module_language($current_language, "Dashboard"); + $graph_array = array("leadsource" => $dashbd_strings['leadsource'], + "leadstatus" => $dashbd_strings['leadstatus'], + "leadindustry" => $dashbd_strings['leadindustry'], + "salesbyleadsource" => $dashbd_strings['salesbyleadsource'], + "salesbyaccount" => $dashbd_strings['salesbyaccount'], + "salesbyuser" => $dashbd_strings['salesbyuser'], + "salesbyteam" => $dashbd_strings['salesbyteam'], + "accountindustry" => $dashbd_strings['accountindustry'], + "productcategory" => $dashbd_strings['productcategory'], + "productbyqtyinstock" => $dashbd_strings['productbyqtyinstock'], + "productbypo" => $dashbd_strings['productbypo'], + "productbyquotes" => $dashbd_strings['productbyquotes'], + "productbyinvoice" => $dashbd_strings['productbyinvoice'], + "sobyaccounts" => $dashbd_strings['sobyaccounts'], + "sobystatus" => $dashbd_strings['sobystatus'], + "pobystatus" => $dashbd_strings['pobystatus'], + "quotesbyaccounts" => $dashbd_strings['quotesbyaccounts'], + "quotesbystage" => $dashbd_strings['quotesbystage'], + "invoicebyacnts" => $dashbd_strings['invoicebyacnts'], + "invoicebystatus" => $dashbd_strings['invoicebystatus'], + "ticketsbystatus" => $dashbd_strings['ticketsbystatus'], + "ticketsbypriority" => $dashbd_strings['ticketsbypriority'], + "ticketsbycategory" => $dashbd_strings['ticketsbycategory'], + "ticketsbyuser" => $dashbd_strings['ticketsbyuser'], + "ticketsbyteam" => $dashbd_strings['ticketsbyteam'], + "ticketsbyproduct"=> $dashbd_strings['ticketsbyproduct'], + "contactbycampaign"=> $dashbd_strings['contactbycampaign'], + "ticketsbyaccount"=> $dashbd_strings['ticketsbyaccount'], + "ticketsbycontact"=> $dashbd_strings['ticketsbycontact'],); + + $html=''; + echo $html; +} + +if(!empty($_REQUEST['primecvid'])){ + $cvid=$_REQUEST['primecvid']; + $fieldmodule = vtlib_purify($_REQUEST['fieldmodname']); + $queryprime="select cvid,columnname from vtiger_cvcolumnlist where columnname not like '%::%' and cvid=?"; + $result=$adb->pquery($queryprime,array($cvid)); + global $current_language,$app_strings; + $fieldmod_strings = return_module_language($current_language, $fieldmodule); + if($adb->num_rows($result)==0){ + echo $mod_strings['MSG_NO_FIELDS']; + die; + }else{ + $html = ''; + } + echo $html; +} + +if(!empty($_REQUEST['showmaxval']) && !empty($_REQUEST['sid'])){ + $sid=$_REQUEST['sid']; + $maxval=$_REQUEST['showmaxval']; + global $adb; + $query="select stufftype from vtiger_homestuff where stuffid=?"; + $res=$adb->pquery($query, array($sid)); + $stufftypename=$adb->query_result($res,0,"stufftype"); + if($stufftypename=="Module"){ + $qry="update vtiger_homemodule set maxentries=? where stuffid=?"; + $result=$adb->pquery($qry, array($maxval, $sid)); + }else if($stufftypename=="RSS"){ + $qry="update vtiger_homerss set maxentries=? where stuffid=?"; + $result=$adb->pquery($qry, array($maxval, $sid)); + }else if($stufftypename=="Default"){ + $qry="update vtiger_homedefault set maxentries=? where stuffid=?"; + $result=$adb->pquery($qry, array($maxval, $sid)); + } + echo "loadStuff(".$sid.",'".$stufftypename."')"; +} + +if(!empty($_REQUEST['dashVal'])){ + $did=$_REQUEST['did']; + global $adb; + $qry="update vtiger_homedashbd set dashbdtype=? where stuffid=?"; + $res=$adb->pquery($qry, array($_REQUEST['dashVal'], $did)); + echo "loadStuff(".$did.",'DashBoard')"; +} + +if(!empty($_REQUEST['homestuffid'])){ + $sid=$_REQUEST['homestuffid']; + global $adb; + $query="delete from vtiger_homestuff where stuffid=?"; + $result=$adb->pquery($query, array($sid)); + echo "SUCCESS"; +} + +//Sequencing of blocks starts +if(!empty($_REQUEST['matrixsequence'])){ + global $adb; + $sequence = explode('_',$_REQUEST['matrixsequence']); + for($i=count($sequence)-1, $seq=0;$i>=0;$i--, $seq++){ + $query = 'update vtiger_homestuff set stuffsequence=? where stuffid=?'; + $result = $adb->pquery($query, array($seq, $sequence[$i])); + } + echo "
Layout Saved
"; +} +//Sequencing of blocks ends + +if(isset($_REQUEST['act']) && $_REQUEST['act'] =="hide"){ + $stuffid=$_REQUEST['stuffid']; + global $adb,$current_user; + $qry="update vtiger_homestuff set visible=1 where stuffid=?"; + $res=$adb->pquery($qry, array($stuffid)); + echo "SUCCESS"; +} + +//saving layout here +if(!empty($_REQUEST['layout'])){ + global $adb, $current_user; + + $sql = "delete from vtiger_home_layout where userid=?"; + $result = $adb->pquery($sql, array($current_user->id)); + + $sql = "insert into vtiger_home_layout values (?, ?)"; + $result = $adb->pquery($sql, array($current_user->id, $_REQUEST['layout'])); + if(!$result){ + echo "SUCCESS"; + } +} +//layout save ends here +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Home/LastViewed.php b/oss/vtiger/trunk/modules/Home/LastViewed.php new file mode 100644 index 00000000..cd2f9a0e --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/LastViewed.php @@ -0,0 +1,46 @@ + + + +get_recently_viewed($current_user->id); + +foreach($history as $row) +{ + echo <<< EOQ + + + + +EOQ; +} +?> +
{$row['module_name']}$row[item_summary]
diff --git a/oss/vtiger/trunk/modules/Home/MainHomeBlock.php b/oss/vtiger/trunk/modules/Home/MainHomeBlock.php new file mode 100644 index 00000000..6b541f22 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/MainHomeBlock.php @@ -0,0 +1,30 @@ +assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); + +//$smarty->assign("HOME_STUFF",$homestuff_values); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->display("Home/MainHomeBlock.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Home/NewBlock.php b/oss/vtiger/trunk/modules/Home/NewBlock.php new file mode 100644 index 00000000..3d70d290 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/NewBlock.php @@ -0,0 +1,44 @@ +assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$homeselectedframe = $homeObj->getSelectedStuff($stuffid,$stufftype); + +$smarty->assign("tablestuff",$homeselectedframe); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->display("Home/MainHomeBlock.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Home/SaveNotebookContents.php b/oss/vtiger/trunk/modules/Home/SaveNotebookContents.php new file mode 100644 index 00000000..bd53ec48 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/SaveNotebookContents.php @@ -0,0 +1,31 @@ +pquery($sql, array($contents, $current_user->id, $notebookid)); + return true; +} +?> diff --git a/oss/vtiger/trunk/modules/Home/UnifiedSearch.php b/oss/vtiger/trunk/modules/Home/UnifiedSearch.php new file mode 100644 index 00000000..30113183 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/UnifiedSearch.php @@ -0,0 +1,316 @@ + $object_name){ + if ($curModule == 'Home' || ($curModule == $module && !empty($_REQUEST['ajax']))) { + $focus = CRMEntity::getInstance($module); + if(isPermitted($module,"index") == "yes"){ + $smarty = new vtigerCRM_Smarty; + + require_once("modules/$module/language/".$current_language.".lang.php"); + global $mod_strings; + global $app_strings; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("MODULE",$module); + $smarty->assign("SEARCH_MODULE",vtlib_purify($_REQUEST['search_module'])); + $smarty->assign("SINGLE_MOD",$module); + $smarty->assign("SEARCH_STRING",vtlib_purify($search_val)); + + $listquery = getListQuery($module); + $oCustomView = ''; + + $oCustomView = new CustomView($module); + //Instead of getting current customview id, use cvid of All so that all entities will be found + //$viewid = $oCustomView->getViewId($module); + $cv_res = $adb->pquery("select cvid from vtiger_customview where viewname='All' and entitytype=?", array($module)); + $viewid = $adb->query_result($cv_res,0,'cvid'); + $customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); + + $listquery = $oCustomView->getModifiedCvListQuery($viewid,$listquery,$module); + if ($module == "Calendar"){ + if (!isset($oCustomView->list_fields['Close'])){ + $oCustomView->list_fields['Close']=array ( 'activity' => 'status' ); + } + if (!isset($oCustomView->list_fields_name['Close'])){ + $oCustomView->list_fields_name['Close']='status'; + } + } + + if($search_module != ''){//This is for Tag search + $where = getTagWhere($search_val,$current_user->id); + $search_msg = $app_strings['LBL_TAG_SEARCH']; + $search_msg .= "".to_html($search_val).""; + }else{ //This is for Global search + $where = getUnifiedWhere($listquery,$module,$search_val); + $search_msg = $app_strings['LBL_SEARCH_RESULTS_FOR']; + $search_msg .= "".to_html($search_val).""; + } + + if($where != ''){ + $listquery .= ' and ('.$where.')'; + } + + if(!(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '')) { + $count_result = $adb->query($listquery); + $noofrows = $adb->num_rows($count_result); + } else { + $noofrows = vtlib_purify($_REQUEST['recordCount']); + } + $moduleRecordCount[$module]['count'] = $noofrows; + + global $list_max_entries_per_page; + if(!empty($_REQUEST['start'])){ + $start = $_REQUEST['start']; + if($start == 'last'){ + $count_result = $adb->query( mkCountQuery($listquery)); + $noofrows = $adb->query_result($count_result,0,"count"); + if($noofrows > 0){ + $start = ceil($noofrows/$list_max_entries_per_page); + } + } + if(!is_numeric($start)){ + $start = 1; + } elseif($start < 0){ + $start = 1; + } + $start = ceil($start); + }else{ + $start = 1; + } + + $navigation_array = VT_getSimpleNavigationValues($start, $list_max_entries_per_page, $noofrows); + $limitStartRecord = ($navigation_array['start'] - 1) * $list_max_entries_per_page; + + if( $adb->dbType == "pgsql"){ + $listquery = $listquery. " OFFSET $limitStartRecord LIMIT $list_max_entries_per_page"; + }else{ + $listquery = $listquery. " LIMIT $limitStartRecord, $list_max_entries_per_page"; + } + $list_result = $adb->query($listquery); + + $moduleRecordCount[$module]['recordListRangeMessage'] = getRecordRangeMessage($list_result, $limitStartRecord); + + $info_message='&recordcount='.$_REQUEST['recordcount'].'&noofrows='.$_REQUEST['noofrows'].'&message='.$_REQUEST['message'].'&skipped_record_count='.$_REQUEST['skipped_record_count']; + $url_string = '&modulename='.$_REQUEST['modulename'].'&nav_module='.$module_name.$info_message; + $viewid = ''; + + $navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string,$module,"UnifiedSearch",$viewid); + $listview_header = getListViewHeader($focus,$module,"","","","global",$oCustomView); + $listview_entries = getListViewEntries($focus,$module,$list_result,$navigation_array,"","","","",$oCustomView); + + //Do not display the Header if there are no entires in listview_entries + if(count($listview_entries) > 0){ + $display_header = 1; + }else{ + $display_header = 0; + } + $smarty->assign("NAVIGATION", $navigationOutput); + $smarty->assign("LISTHEADER", $listview_header); + $smarty->assign("LISTENTITY", $listview_entries); + $smarty->assign("DISPLAYHEADER", $display_header); + $smarty->assign("HEADERCOUNT", count($listview_header)); + $smarty->assign("ModuleRecordCount", $moduleRecordCount); + + $total_record_count = $total_record_count + $noofrows; + + $smarty->assign("SEARCH_CRITERIA","( $noofrows )".$search_msg); + $smarty->assign("MODULES_LIST", $object_array); + $smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); + + if(($i != 0 && empty($_REQUEST['ajax'])) || !(empty($_REQUEST['ajax']))) + $smarty->display("UnifiedSearchAjax.tpl"); + else + $smarty->display('UnifiedSearchDisplay.tpl'); + unset($_SESSION['lvs'][$module]); + $i++; + } + } + } + //Added to display the Total record count + if(empty($_REQUEST['ajax'])) { +?> + +
        ".$mod_strings['ERR_ONE_CHAR'].""; +} + +/** + * Function to get the Tags where condition + * @param string $search_val -- entered search string value + * @param string $current_user_id -- current user id + * @return string $where -- where condition with the list of crmids, will like vtiger_crmentity.crmid in (1,3,4,etc.,) + */ +function getTagWhere($search_val,$current_user_id){ + require_once('include/freetag/freetag.class.php'); + + $freetag_obj = new freetag(); + $crmid_array = $freetag_obj->get_objects_with_tag_all($search_val,$current_user_id); + + $where = " vtiger_crmentity.crmid IN ("; + if(count($crmid_array) > 0){ + foreach($crmid_array as $index => $crmid){ + $where .= $crmid.','; + } + $where = trim($where,',').')'; + } + //If there are no records has the search tag we need to add the condition like crmid is none. If dont add condition at all search will return all the values. + // Fix for #5571 + else { + $where .= '0)'; + } + return $where; +} + + +/** + * Function to get the the List of Searchable Modules as a combo list which will be displayed in right corner under the Header + * @param string $search_module -- search module, this module result will be shown defaultly + */ +function getSearchModulesComboList($search_module){ + global $object_array; + global $app_strings; + global $mod_strings; + + ?> + + + + + + +
   + +
+ $object_name1,$module_name2=>$object_name2,$module_name3=>$object_name3,$module_name4=>$object_name4,-----); + */ +function getSearchModules($filter = array()){ + global $adb; + // vtlib customization: Ignore disabled modules. + //$sql = 'select distinct vtiger_field.tabid,name from vtiger_field inner join vtiger_tab on vtiger_tab.tabid=vtiger_field.tabid where vtiger_tab.tabid not in (16,29)'; + $sql = 'select distinct vtiger_field.tabid,name from vtiger_field inner join vtiger_tab on vtiger_tab.tabid=vtiger_field.tabid where vtiger_tab.tabid not in (16,29) and vtiger_tab.presence != 1 and vtiger_field.presence in (0,2)'; + // END + $result = $adb->pquery($sql, array()); + while($module_result = $adb->fetch_array($result)){ + $modulename = $module_result['name']; + // Do we need to filter the module selection? + if(!empty($filter) && is_array($filter) && !in_array($modulename, $filter)) { + continue; + } + // END + if($modulename != 'Calendar'){ + $return_arr[$modulename] = $modulename; + }else{ + $return_arr[$modulename] = 'Activity'; + } + } + return $return_arr; +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Home/UnifiedSearchModules.php b/oss/vtiger/trunk/modules/Home/UnifiedSearchModules.php new file mode 100644 index 00000000..277ed321 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/UnifiedSearchModules.php @@ -0,0 +1,43 @@ +query($sql); +while($modulerow = $adb->fetch_array($moduleres)) { + if(is_admin($current_user) || isPermitted($modulerow['name'], 'DetailView')) { + $modulename = $modulerow['name']; + $allowed_modules[$modulename] = array( + 'label' => getTranslatedString($modulename, $modulename), + 'selected' => in_array($modulename, $selected_modules) + ); + } +} +ksort($allowed_modules); + +require_once('Smarty_setup.php'); + +$smarty = new vtigerCRM_Smarty(); +$smarty->assign('MOD', $mod_strings); +$smarty->assign('APP', $app_strings); +$smarty->assign('THEME', $theme); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('ALLOWED_MODULES', $allowed_modules); + +$smarty->display('UnifiedSearchModules.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Home/chat.css b/oss/vtiger/trunk/modules/Home/chat.css new file mode 100644 index 00000000..3c0017ca --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/chat.css @@ -0,0 +1,232 @@ +/* + Copyright 2005 Rolando Gonzalez (rolosworld@gmail.com) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + table.chat // don't set width or height + thead.chat + tfoot.chat + tbody.chat + tr.chathea + tr.chatfoot + tr.chatbody + td.chathead + td.chathead1 + td.chathead2 + td.chatfoot + td.chatfoot1 + td.chatfoot2 + td.chatbody + td.chatbody1 // don't set width or height + td.chatbody2 + + td.chatbox // don't set width or height or overflow + td.chaticon + td.chattopic + td.chathide + td.chatclose + + div.cumsg + div.csmsg + span.cunick +*/ +*{ + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 8pt; +} + +table.chat,table.pchat{ + empty-cells:show; +} +table.chat{ + position:absolute; +} +thead.chat{ + cursor:move; +} +td.chathead,td.chathead2,td.pchathead,td.pchathead2{ + width:5px; + height:38px; + padding:0px 5px 0px 0px; +} +td.chathead1,td.pchathead1{ + background-image:url(imgs/box_T.gif); + width:100%; +} +td.chathead,td.pchathead{ + background-image:url(imgs/box_TL.gif); +} +td.chathead2,td.pchathead2{ + background-image:url(imgs/box_TR.gif); +} + +td.chaticon{ + background-image:url(imgs/2tbarPrivateChat.gif); +} +td.chattopic{ + background-image:url(imgs/2tbarPublicChat.gif); + background-repeat:no-repeat; + background-position:center left; + padding:0px 10px 0px 30px; + width:100%; +} + +td.chattopic1{ + padding:0px 10px 0px 5px; + width:100%; + text-align:left; +} +span.chatTopicNick{ font-weight:900; } +td.chathide,td.chatclose{ + cursor:pointer; +} +td.chathide{ + background-image:url(imgs/btn_hide.gif); +} +td.chatclose{ + background-image:url(imgs/btn_close.gif); +} +td.chaticon,td.chathide,td.chatclose{ + height:36px; + width:36px; + padding:31px 31px 5px 0px; + background-repeat:no-repeat; + background-position:center center; +} + +td.chatbody,td.chatbody2,td.pchatbody,td.pchatbody2{ + width:5px; + padding:0px 5px 0px 0px; +} +td.chatbody,td.pchatbody{ + background-image:url(imgs/box_ML.gif); +} +td.chatbody1,td.pchatbody1{ + background-image:url(imgs/box_M.gif); + padding:5px 5px 5px 5px; + vertical-align:top; +} +td.chatbody2,td.pchatbody2{ + background-image:url(imgs/box_MR.gif); +} + +td.chatfoot,td.chatfoot2,td.pchatfoot,td.pchatfoot2{ + width:5px; + height:60px; + padding:60px 5px 0px 0px; +} +td.chatfoot1,td.pchatfoot1{ + background-image:url(imgs/bx_B.gif); +} +td.chatfoot,td.pchatfoot{ + background-image:url(imgs/box_BL.gif); +} +td.chatfoot2,td.pchatfoot2{ + background-image:url(imgs/box_BR.gif); +} + + + +div.chatbox{ + background-color: #FFFFFF; + border: 1px solid #938F86; + color:#000000; + vertical-align:top; +} + +/* UList */ +span.cunick{ + color:green; +} +div.cumsg,div.csmsg{ + color:#0000ff; + margin:2px 2px 4px 2px; +} +div.csmsg{ + color:#FF0000; +} + +a.chat{ + background-image:url(themes/images/user_icon.gif); + background-position:center left; + background-repeat:no-repeat; + color:#000000; + text-decoration:none; + display:block; + width:100px; + height:20px; + background-color:#FFFFFF; + padding:10px 5px 5px 30px; + vertical-align:middle; +} +a.chat:hover{ + background-color:#DFD9CD; +} + +span{ + padding:0px; + margin:0px; +} + +/* input */ +form.cinput{ + display:inline; +} +input.cinput{ + background-color: #FFFFFF; + border: 1px solid #938F86; + width: 100%; + height:20px; + font-size:12px; + padding:2px 2px 2px 2px; + font-weight:bold; + color:#333333; +} +table.cinput{ + width:100%; +} +tr.cinput{ + +} +td.cinput{ + width:100%; +} +td.ckeyb{ + width:32px; + height:29px; + padding:29px 32px 5px 5px; + background-repeat:no-repeat; + background-position:center center; +} +td.csubmit{ + cursor:pointer; + background-image:url(imgs/btn_send.gif); + width:63px; + height:32px; + padding:32px 63px 5px 5px; + background-repeat:no-repeat; + background-position:center center; +} + + +span.sysb{font-weight:900;} +.chatuserlist{ + font-size:14px; + text-align:left; + color:white; + background-color:#898475; +} diff --git a/oss/vtiger/trunk/modules/Home/chat.php b/oss/vtiger/trunk/modules/Home/chat.php new file mode 100644 index 00000000..45331220 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/chat.php @@ -0,0 +1,382 @@ +\n".mysql_error()."
\n".$query); + } + return $result; +} + +/**** handler *****/ +/** + * Chat object + */ +class Chat +{ + // stores the string to be returned + var $json; + + function Chat() + { + global $adb; + $this->json = ''; + + // las message id received by user + if(!isset($_SESSION["mlid"])) + { + $res = $adb->pquery("show table status like 'vtiger_chat_msg'", array()); + $line = $adb->fetch_array($res); + if(intval($line['Auto_increment']) == 0) + $_SESSION["mlid"] = 0; + else + $_SESSION["mlid"] = intval($line['Auto_increment']) - 1; + } + + // when the las user list was sended. + if(!isset($_SESSION["lul"])) + { + $_SESSION["lul"] = 0; + } + + // check if user is active. + if(!isset($_SESSION['chat_user'])) + { + $this->setUserNick(); + } + else + { + $res = $adb->pquery("update vtiger_chat_users set ping=now() where session=?", array(session_id())); + if($adb->getAffectedRowCount($res) == 0) + { + $this->setUserNick(); + } + } + + switch($_POST['submode']) + { + // request all the json data at once. + case 'get_all': + global $chat_conf; + $this->lastMsgId(); + + $this->json = '[%s]'; + $this->getAllPVChat(); + $pvchat = $this->json; + + $this->json = '[%s]'; + $this->getPubChat(); + $pchat = $this->json; + + $this->json = ''; + if(time() - $_SESSION["lul"] > $chat_conf['alive_time']) + { + $_SESSION["lul"] = time(); + $this->json = '[%s]'; + $this->getUserList(); + } + $ulist = $this->json; + + $tmp = array(); + $this->json = '{%s}'; + if(strlen($ulist) > 0) + $tmp[] = '"ulist":'.$ulist; + + if(strlen($pvchat) > 0) + $tmp[] = '"pvchat":'.$pvchat; + + if(strlen($pchat) > 0) + $tmp[] = '"pchat":'.$pchat; + + $this->json = sprintf($this->json, implode(',',$tmp)); + break; + + // user is submiting a msg + case 'submit': + $this->submit($_POST['msg'],intval($_POST['to'])); + break; + + // user closed a private chat + case 'pvclose': + $this->pvClose(intval($_POST['to'])); + break; + + default: + break; + } + } + + /** + * returns the JSON created + */ + function getAJAX() + { + return $this->json; + } + + /** + * Sets the user initial nickname. + */ + function setUserNick() + { + global $current_user, $adb; + $res = $adb->pquery("select id from vtiger_chat_users where session=?", array(session_id())); + if($adb->num_rows($res) > 0) + { + $line = $adb->fetch_array($res); + $_SESSION['chat_user'] = $line['id']; + return; + } + + $res = $adb->pquery("show table status like 'vtiger_chat_users'", array()); + $line = $adb->fetch_array($res); + if(intval($line['Auto_increment']) == 0) + $line['Auto_increment'] = 1; + + $_SESSION['chat_user'] = $line['Auto_increment']; + + + $sql = "insert into vtiger_chat_users(nick,session,ping,ip) values (?,?, now(), ?)"; + $params = array($current_user->user_name, session_id(), $_SERVER['REMOTE_ADDR']); + $res = $adb->pquery($sql, $params); + } + + /** + * generate the available users list + */ + function getUserList() + { + global $chat_conf, $adb; + $tmp = ''; + $sql = "delete from vtiger_chat_users where ((unix_timestamp(now())-unix_timestamp(ping))>?)"; + $params = array($chat_conf['alive_time']); + $res = $adb->pquery($sql, $params); + + $res = $adb->pquery("select id,nick from vtiger_chat_users", array()); + if($adb->num_rows($res)==0) + { + $this->json = ''; + return; + } + + while($line = $adb->fetch_array($res)) + { + if($line['id'] != $_SESSION['chat_user']) + $tmp .= '{"uid":'.$line['id'].',"nick":"'.$line['nick'].'"},'; + } + $tmp = trim($tmp,','); + $this->json = sprintf($this->json,$tmp); + } + + /** + * Sets user last post received. + */ + function lastMsgId() + { + if(isset($_POST['mlid']) && intval($_POST['mlid']) > $_SESSION["mlid"]) + $_SESSION["mlid"] = intval($_POST['mlid']); + } + + /** + * generates the private chat data + */ + function getAllPVChat() + { + global $chat_conf, $adb; + $format = '{"mlid":%s,"chat":%s,"from":"%s","msg":"%s"},'; + $sql ="select ms.id mid,ms.chat_from mfrom,ms.chat_to mto,pv.id id,us.nick `chat_from`,ms.msg msg from vtiger_chat_users us,vtiger_chat_pvchat pv,vtiger_chat_msg ms where pv.msg=ms.id and us.id=ms.chat_from and ms.id>? and ((ms.chat_from=? and ms.chat_to>0) or (ms.chat_to=? and ms.chat_from>0)) order by ms.born limit 0, " . $chat_conf['msg_limit']; + $params = array($_SESSION['mlid'], $_SESSION['chat_user'], $_SESSION['chat_user']); + $res = $adb->pquery($sql, $params); + + if($adb->num_rows($res)==0) + { + $this->json = ''; + return; + } + + $tmp = ''; + while($line = $adb->fetch_array($res)) + { + if($line['mfrom'] == $_SESSION['chat_user']) + $cid = $line['mto']; + else + $cid = $line['mfrom']; + + $tmp .= sprintf($format,$line['mid'],$cid,$line['chat_from'],addslashes($line['msg'])); + } + $tmp = trim($tmp,','); + $this->json = sprintf($this->json,$tmp); + } + + + /** + * generates the public chat data + * NOTE: this is alpha + */ + function getPubChat() + { + global $chat_conf, $adb; + $format = '{"mlid":%s,"from":"%s","msg":"%s"},'; + $sql = "select ms.id mid,ms.chat_from mfrom,ms.chat_to mto,p.id id,us.nick `chat_from`,ms.msg msg from vtiger_chat_users us,vtiger_chat_pchat p,vtiger_chat_msg ms where p.msg=ms.id and us.id=ms.chat_from and ms.id>? and ms.chat_to=0 order by ms.born limit 0," . $chat_conf['msg_limit']; + $params = array($_SESSION['mlid']); + $res = $adb->pquery($sql, $params); + + if($adb->num_rows($res)==0) + { + $this->json = ''; + return; + } + + $tmp = ''; + while($line = $adb->fetch_array($res)) + { + $tmp .= sprintf($format,$line['mid'],$line['chat_from'],addslashes($line['msg'])); + } + $tmp = trim($tmp,','); + $this->json = sprintf($this->json,$tmp); + } + + /** + * Check for special commands on message. + */ + function msgParse($msg) + { + global $adb; + if(strlen($msg) == 0) return ''; + $msg = stripslashes($msg); + + + if($msg[0] == '\\') + { + $today_date = getdate(); + + $words = explode(" ",$msg); + switch($words[0]) + { + case '\nick': + if(isset($words[1]) && strlen($words[1]) > 3) + { + $res = $adb->pquery("select nick from vtiger_chat_users where id=?", array($_SESSION['chat_user'])); + $line = $adb->fetch_array($res); + $res = $adb->pquery("update vtiger_chat_users set nick=? where id=?", array($words[1], $_SESSION['chat_user'])); + $msg = '\sys '.$line['nick'].' changed nick to '.$words[1].''; + } + break; + + case '\help': + $msg = '\sys
\\\\nick "nickname" - change nick
\\\\date - date
\\\\time - time
\\\\month - month
\\\\day - weekday'; + break; + case '\date': + $msg = '\sys Today is '.date('d-m-Y').''; + break; + case '\time': + $msg = '\sys The Current time is '.$today_date["hours"].':'.$today_date["minutes"].':'.$today_date["hours"].''; break; + case '\month': + $msg = '\sys '.$today_date["month"].''; + break; + case '\day': + $msg = '\sys '.$today_date["weekday"].''; + break; + default: + + $msg = '\sys Bad command: '.$words[0]; + break; + } + } + return $msg; + } + + /** + * process a submited msg + */ + function submit($msg, $to=0) + { + global $adb; + //UTF-8 support added - ding + $msg = utf8RawUrlDecode($msg); + $msg = $this->msgParse($msg); +// $msg = htmlentities($msg); + $msg = htmlentities($msg,ENT_QUOTES, 'UTF-8'); + if(strlen($msg) == 0) return; + + //$sql = "insert into vtiger_chat_msg set chat_from=?, chat_to=?, born=now(), msg=?"; + $sql = "insert into vtiger_chat_msg(chat_from, chat_to, born, msg) values (?,?, now(), ?)"; + $params = array($_SESSION['chat_user'], $to, $msg); + $res = $adb->pquery($sql, $params); + + $chat = "p"; + if($to != 0) + $chat .= "v"; + + $res = $adb->pquery("insert into vtiger_chat_".$chat."chat set msg=LAST_INSERT_ID()", array()); + } + + /** + * removes the private conversation msg's because someone closed it + */ + function pvClose($to) + { + global $adb; + $sql = "delete from vtiger_chat_msg where (`chat_from`=? and `chat_to`=?) or (`chat_from`=? and `chat_to`=?)"; + $params = array($to, $_SESSION['chat_user'], $_SESSION['chat_user'], $to); + $res = $adb->pquery($sql, $params); + } +} + +/**** caller ****/ +$chat = new Chat(); +echo $chat->getAJAX(); +?> diff --git a/oss/vtiger/trunk/modules/Home/home_rss.php b/oss/vtiger/trunk/modules/Home/home_rss.php new file mode 100644 index 00000000..9690e16d --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/home_rss.php @@ -0,0 +1,128 @@ +\n"); +echo (" \n"); +echo (" \n"); +echo (" vtigerCRM Tickets\n"); +echo (" ".$site_URL."/index.php?module=Home&action=home_rss\n"); +echo (" test\n"); +echo (" \n"); +echo (" ".$current_user->user_name."\n"); +echo (" " . gmdate('D, d M Y H:i:s', time()) . " GMT\n"); +echo (" vtigerCRM\n"); + +//retrieving notifications****************************** +//<<<<<<<<<<<<<<<< start of owner notify>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +$query = "select vtiger_crmentity.setype,vtiger_crmentity.crmid,vtiger_crmentity.smcreatorid,vtiger_crmentity.modifiedtime from vtiger_crmentity inner join vtiger_ownernotify on vtiger_crmentity.crmid=vtiger_ownernotify.crmid"; + +$result = $adb->pquery($query, array()); +for($i=0;$i<$adb->num_rows($result);$i++){ + $mod_notify[$i] = $adb->fetch_array($result); + if($mod_notify[$i]['setype']=='Accounts'){ + $tempquery='select vtiger_accountname from vtiger_account where vtiger_accountid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $account_name=$adb->fetch_array($tempresult); + $notify_values[$i]=$account_name['accountname']; + }else if($mod_notify[$i]['setype']=='Potentials'){ + $tempquery='select vtiger_potentialname from vtiger_potential where vtiger_potentialid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $potential_name=$adb->fetch_array($tempresult); + $notify_values[$i]=$potential_name['potentialname']; + }else if($mod_notify[$i]['setype']=='Contacts'){ + $tempquery='select lastname from vtiger_contactdetails where contactid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $contact_name=$adb->fetch_array($tempresult); + $notify_values[$i]=$contact_name['lastname']; + }else if($mod_notify[$i]['setype']=='Leads'){ + $tempquery='select lastname from vtiger_leaddetails where leadid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $lead_name=$adb->fetch_array($tempresult); + $notify_values[$i]=$lead_name['lastname']; + }else if($mod_notify[$i]['setype']=='SalesOrder'){ + $tempquery='select subject from vtiger_salesorder where vtiger_salesorderid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $sales_subject=$adb->fetch_array($tempresult); + $notify_values[$i]=$sales_subject['subject']; + }else if($mod_notify[$i]['setype']=='Orders'){ + $tempquery='select subject from vtiger_purchaseorder where vtiger_purchaseorderid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $purchase_subject=$adb->fetch_array($tempresult); + $notify_values[$i]=$purchase_subject['subject']; + }else if($mod_notify[$i]['setype']=='Products'){ + $tempquery='select productname from vtiger_products where productid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $product_name=$adb->fetch_array($tempresult); + $notify_values[$i]=$product_name['productname']; + }else if($mod_notify[$i]['setype']=='Emails'){ + $tempquery='select subject from vtiger_activity where vtiger_activityid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $email_subject=$adb->fetch_array($tempresult); + $notify_values[$i]=$email_subject['subject']; + }else if($mod_notify[$i]['setype']=='HelpDesk'){ + $tempquery='select title from vtiger_troubletickets where ticketid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $HelpDesk_title=$adb->fetch_array($tempresult); + $notify_values[$i]=$HelpDesk_title['title']; + }else if($mod_notify[$i]['setype']=='Calendar'){ + $tempquery='select subject from vtiger_activity where vtiger_activityid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $Activity_subject=$adb->fetch_array($tempresult); + $notify_values[$i]=$Activity_subject['subject']; + }else if($mod_notify[$i]['setype']=='Quotes'){ + $tempquery='select subject from vtiger_quotes where quoteid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $quote_subject=$adb->fetch_array($tempresult); + $notify_values[$i]=$quote_subject['subject']; + }else if($mod_notify[$i]['setype']=='Invoice'){ + $tempquery='select subject from vtiger_invoice where vtiger_invoiceid=?'; + $tempresult=$adb->pquery($tempquery, array($mod_notify[$i]['crmid'])); + $invoice_subject=$adb->fetch_array($tempresult); + $notify_values[$i]=$invoice_subject['subject']; + } + //<<<<<<<<<<<<<<<< end of owner notify>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + // Variable reassignment and reformatting for author + $author_id = $db->query_result($result,$i,'smcreatorid'); + $entry_author = getUserName($author_id); + $entry_author = htmlspecialchars ($entry_author); + + $entry_link = $site_URL."/index.php?modules=".$mod_notify[$i]['setype']."&action=DetailView&record=".$mod_notify[$i]['crmid']; + $entry_link = htmlspecialchars($entry_link); + $entry_time = $db->query_result($result,$i,'modifiedtime'); + + echo (" \n"); + echo (" ".$mod_notify[$i]['setype']."\n"); + echo (" ".$entry_link."\n"); + echo (" ".$notify_values[$i]."\n"); + echo (" ".$entry_author."\n"); + echo (" ".$entry_time."\n"); + echo (" \n"); +} +echo (" \n"); +echo (" \n"); +?> diff --git a/oss/vtiger/trunk/modules/Home/index.php b/oss/vtiger/trunk/modules/Home/index.php new file mode 100644 index 00000000..89e747bc --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/index.php @@ -0,0 +1,104 @@ + 29 and tabid <> 16 and tabid <>10) order by name"; + +// Performance Optimization: Re-written to ignore extension and inactive modules +$modulenamearr = Array(); +foreach($tabrows as $resultrow) { + if($resultrow['isentitytype'] != '0') { + // Eliminate: Events, Emails + if($resultrow['tabid'] == '16' || $resultrow['tabid'] == '10') { + continue; + } + $modName=$resultrow['name']; + if(isPermitted($modName,'DetailView') == 'yes' && vtlib_isModuleActive($modName)){ + $modulenamearr[$modName]=array($resultrow['tabid'],$modName); + } + } +} +ksort($modulenamearr); // We avoided ORDER BY in Query (vtlib_prefetchModuleActiveInfo)! +// END + + +//Security Check done for RSS and Dashboards +$allow_rss='no'; +$allow_dashbd='no'; +if(isPermitted('Rss','DetailView') == 'yes' && vtlib_isModuleActive('Rss')){ + $allow_rss='yes'; +} +if(isPermitted('Dashboard','DetailView') == 'yes' && vtlib_isModuleActive('Dashboard')){ + $allow_dashbd='yes'; +} + +$homedetails = $homeObj->getHomePageFrame(); +$maxdiv = sizeof($homedetails)-1; +$user_name = $current_user->column_fields['user_name']; +$buttoncheck['Calendar'] = isPermitted('Calendar','index'); +$freetag = new freetag(); +$numberofcols = getNumberOfColumns(); + +$smarty->assign("CHECK",$buttoncheck); +if(vtlib_isModuleActive('Calendar')){ + $smarty->assign("CALENDAR_ACTIVE","yes"); +} +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",'Home'); +$smarty->assign("CATEGORY",getParenttab('Home')); +$smarty->assign("CURRENTUSER",$user_name); +$smarty->assign("ALL_TAG",$freetag->get_tag_cloud_html("",$current_user->id)); +$smarty->assign("MAXLEN",$maxdiv); +$smarty->assign("ALLOW_RSS",$allow_rss); +$smarty->assign("ALLOW_DASH",$allow_dashbd); +$smarty->assign("HOMEFRAME",$homedetails); +$smarty->assign("MODULE_NAME",$modulenamearr); +$smarty->assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("LAYOUT", $numberofcols); + +$smarty->display("Home/Homestuff.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Home/js/ajax.js b/oss/vtiger/trunk/modules/Home/js/ajax.js new file mode 100644 index 00000000..10e2220c --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/js/ajax.js @@ -0,0 +1,104 @@ +/* + Copyright 2005 Rolando Gonzalez (rolosworld@gmail.com) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +function debug(dib,msg) +{ + if(document.getElementById(dib)) + document.getElementById(dib).innerHTML = msg; + else + alert(msg); +}; + + +function getRequester() +{ + try + { + if(window.XMLHttpRequest) + { + return new XMLHttpRequest(); + } + else if(window.ActiveXObject) + { + return new ActiveXObject("Microsoft.XMLHTTP"); + } + } + catch (e) + { + alert("You need a browser which supports an XMLHttpRequest Object.\nMozilla build 0.9.5 has this Object and IE5 and above."); + } +}; + +/* +onreadystatechange Event handler for an event that fires at every state change +readyState Object status integer: +0 = uninitialized +1 = loading +2 = loaded +3 = interactive +4 = complete +responseText String version of data returned from server process +responseXML DOM-compatible document object of data returned from server process +status Numeric code returned by server, such as 404 for "Not Found" or 200 for "OK" +statusText String message accompanying the status code +*/ +function Ajax(cb) +{ + var me = this; + this.requester = getRequester(); + + if(cb) + this.callback = cb; + else + this.callback = function(req) + { + return eval(req.responseText); + }; + + this.requester.onreadystatechange = function(){ + switch(me.requester.readyState) + { + case 1: + case 2: + case 3: + break; + case 4: + var response = me.callback(me.requester); + break; + default: + alert("Error"); + break; + } + }; + + this.state = function() + { + return me.requester.readyState; + }; + + this.process = function(url, parameters){ + + me.requester.open("POST", url, true); + me.requester.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); + me.requester.setRequestHeader("Content-length", parameters.length); + //me.requester.setRequestHeader("Connection", "close"); + debug("debug",parameters); + me.requester.send(parameters); + + }; +}; diff --git a/oss/vtiger/trunk/modules/Home/js/chat.js b/oss/vtiger/trunk/modules/Home/js/chat.js new file mode 100644 index 00000000..ffa5bb66 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/js/chat.js @@ -0,0 +1,477 @@ +/* + Copyright 2005 Rolando Gonzalez (rolosworld@gmail.com) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +var chats = new Array(); // private chats opened +var users = new Array(); // users list +var chat_data = null; +var mlid = 0; //msg last id +var DEBUG = false; +var PRIVATES = true; +var PUBLIC = true; + +function getNick(uid) +{ + for(var i in users) + { + if(users[i].uid == uid) + return users[i].nick; + } + return null; +}; + +function resetChatsZ() +{ + for(var i = 0; i < chats.length; i++) + if(chats[i]) + chats[i].win.table.style.zIndex = chats[i].win.z; +}; + +function debug(dib,msg) +{ + if(!DEBUG) return; + if(document.getElementById(dib)) + document.getElementById(dib).innerHTML = msg; + else + alert(msg); +}; + +// initialize chat connection. +function Chat(conf) +{ + var me = this; + this.pcid = conf["pchatid"]?conf["pchatid"]:null; + this.dt = conf["dt"]?conf["dt"]:1000; + this.ulid = conf["ulid"]?conf["ulid"]:null; + this.w = conf["width"]?conf["width"]:"400px"; + this.h = conf["height"]?conf["height"]:"300px"; + this.ulist = null; + + if(this.pcid) + { + chats[0] = new PubChat(this.dt,this.w,this.h); + document.getElementById(this.pcid).appendChild(chats[0].get()); + } + + // evaluate the returned json + this.callback = function(response) + { + me.ajax = null; + try{ + me.doRefresh(decodeURI(response.responseText)); + + }catch(e){ + debug("debug","Chat Error: "+response.responseText); + clearInterval(me.interv); + debug("debug",e.toString()); + debug("debug",e.filename+":"+e.lineNumber); + return; + } + me.ajax = new Ajax(me.callback); + debug("debug",decodeURI(response.responseText)); + window.status=Date(); + }; + + this.doRefresh = function(response) + { + if(!me.ulist) + me.ulist = new UList(me.dt,me.ulid,me.w,me.h); + chat_data = eval("("+response+")"); + me.ulist.refresh(); + me.refreshChats(); + }; + + this.ajax = new Ajax(me.callback); + + // start the ajax request for the chat data + this.refresh = function() + { + if(me.ajax.state() == 0) + me.ajax.process("index.php?mode=chat&module=Home&action=chat","submode=get_all&mlid="+mlid); + }; + this.interv = setInterval(me.refresh,me.dt); + + this.refreshChats = function() + { + if(chat_data.pvchat) + { + cnum = 0; + for(var i in chat_data.pvchat) + { + cnum = chat_data.pvchat[i].chat; + if(!chats[cnum]) + chats[cnum] = new PrivChat(me.dt,cnum,me.w,me.h); + + if(mlid < chat_data.pvchat[i].mlid) + mlid = chat_data.pvchat[i].mlid; + + if(chat_data.pvchat[i].msg.substr(0,5) == "\\sys ") + { + chats[cnum].appendSysMsg(chat_data.pvchat[i].msg.substr(5)); + } + else + chats[cnum].appendMsg(chat_data.pvchat[i].from,chat_data.pvchat[i].msg); + } + chat_data.pvchat = null; + } + + if(PUBLIC && chat_data.pchat) + { + for(var i in chat_data.pchat) + { + if(mlid < chat_data.pchat[i].mlid) + mlid = chat_data.pchat[i].mlid; + + if(!chats[0]) + continue; + + if(chat_data.pchat[i].msg.substr(0,5) == "\\sys ") + { + chats[0].appendSysMsg(chat_data.pchat[i].msg.substr(5)); + } + else + chats[0].appendMsg(chat_data.pchat[i].from,chat_data.pchat[i].msg); + } + chat_data.pchat = null; + } + }; +}; + +// User list handler +function UList(dt,ulid,w,h) +{ + var me = this; + this.w = w; + this.h = h; + this.dt = dt; // delta time to sleep the requests. + this.ulid = ulid; // user list ul tag id. + this.interv = null; + + // updates the users list on the html + this.refreshList = function() + { + if(!document.getElementById(me.ulid)) + { + clearInterval(me.interv); + return; + } + + while(document.getElementById(me.ulid).firstChild) + document.getElementById(me.ulid).removeChild(document.getElementById(me.ulid).firstChild); + + if(users) + { + var li; + var a; + var user; + for(var i in users) + { + user = users[i]; + li = document.createElement("span"); + a = document.createElement("a"); + a.appendChild(document.createTextNode(user.nick)); + a.setAttribute("href","#"); + a.className = "chat"; + if(PRIVATES) + a.onclick = me.newPriv(me.dt,user.uid); + + li.appendChild(a); + document.getElementById(me.ulid).appendChild(li); + } + //var date = new Date(); + //window.status=date.toString(); + } + }; + + // higher order stuff + this.newPriv = function(dt,uid) + { + return function() + { + if(!chats[uid]) + { + resetChatsZ(); + chats[uid] = new PrivChat(dt,uid,me.w,me.h); + } + return false; + }; + }; + + // check if theres a new user list + this.refresh = function() + { + //users = null; + if(chat_data.ulist) + { + users = chat_data.ulist; + me.refreshList(); + } + chat_data.ulist = null; + }; +}; + +////////////////////////////////////////////////////////// +// Input handler +function chatInput(to) +{ + var me = this; + this.to = to?to:null; + this.input = document.createElement("input"); + this.input.className = "cinput"; + this.input.setAttribute("type","text"); + this.input.setAttribute("name","input"); + + var table = document.createElement("table"); + //table.border = "1"; + var tbody = table.appendChild(document.createElement("tbody")); + var tr = tbody.appendChild(document.createElement("tr")); + var td = tr.appendChild(document.createElement("td")); + var td1 = tr.appendChild(document.createElement("td")); + var td2 = tr.appendChild(document.createElement("td")); + + table.className = "cinput"; + tbody.className = "cinput"; + tr.className = "cinput"; + td.className = "ckeyb"; + td1.className = "cinput"; + td2.className = "csubmit"; + + this.input = td1.appendChild(this.input); + td2.onclick = function() + { + var ajax = new Ajax(me.callback); + ajax.process("index.php?mode=chat&module=Home&action=chat","submode=submit&msg="+escapeAll(me.input.value)+(me.to?"&to="+me.to:"")); + + me.input.value = ""; + me.input.focus(); + return false; + }; + + this.form = document.createElement("form"); + this.form.className = "cinput"; + + this.form.appendChild(table); + this.form.onsubmit = function() + { + var ajax = new Ajax(me.callback); + ajax.process("index.php?mode=chat&module=Home&action=chat","submode=submit&msg="+escapeAll(me.input.value)+(me.to?"&to="+me.to:"")); + me.input.value = ""; + me.input.focus(); + return false; + }; + + this.setFocus = function() + { + me.input.focus(); + }; + + // evaluate the returned json + this.callback = function(response) + { + response = response.responseText; + try{ + if(response) + debug("debug",response); + }catch(e){ + debug("debug","chatInput Error: "+response); + } + }; + + this.get = function() + { + return me.form; + }; +}; + +////////////////////////////////////////////////////////// +// Private chat handler / abre ventana de usurio + usuario +function PrivChat(dt,to,w,h) +{ + var me = this; + this.dt = dt; // delta time to sleep the requests. + this.to = to; // private chat the other user id + this.input = new chatInput(to); + this.toNick = getNick(to); + + var conf = new Array(); + conf["topic"] = "Private chat with "+me.toNick+""; + conf["class"] = "chat"; + conf["width"] = w; + conf["height"] = h; + conf["drag"] = true; + + this.win = new cssWindow(conf); + + // move z+1..crappy way to send above others + this.win.table.onDragStart = function() + { + resetChatsZ(); + chats[me.to].win.table.style.zIndex++; + }; + + this.win.cb = function() + { + me.ajax = new Ajax(me.callback); + me.ajax.process("index.php?mode=chat&module=Home&action=chat","submode=pvclose&to="+me.to); + chats[me.to]=null; + }; + + this.cbox = this.win.setBody(document.createElement("div")); + this.cbox.style.width = "100%"; + this.cbox.style.height = "100%"; + this.cbox.style.overflow = "auto"; + this.cbox.className = "chatbox"; + + // Draws the top of the window + this.getHead = function() + { + var t = document.createElement("table"); + t.style.width="100%";t.cellSpacing="0";t.cellPadding="0"; + var tb = t.appendChild(document.createElement("tbody")); + var tr = tb.appendChild(document.createElement("tr")); + var td = tr.appendChild(document.createElement("td")); + td.className = "chaticon"; + td = tr.appendChild(document.createElement("td")); + td.className = "chattopic1"; + td.innerHTML = me.win.topic; + var hide = tr.appendChild(document.createElement("td")); + hide.className = "chathide"; + hide.onclick = me.win.doHide; + var close = tr.appendChild(document.createElement("td")); + close.className = "chatclose"; + close.onclick = me.win.doClose; + return t; + }; + + this.win.setHead(this.getHead()); + this.win.setFoot(this.input.get()); + + + // updates the chat on the html + this.appendMsg = function(from,msg) + { + var div; + var span; + + span = document.createElement("span"); + span.appendChild(document.createTextNode(from+": ")); + span.className = "cunick"; + + div = document.createElement("div"); + div.className = "cumsg"; + + div.appendChild(span); + div.innerHTML+=msg; + me.cbox.appendChild(div); + me.cbox.scrollTop=me.cbox.scrollHeight; + }; + + // updates the chat on the html + this.appendSysMsg = function(msg) + { + var div; + div = document.createElement("div"); + div.className = "csmsg"; + div.innerHTML+=msg; + me.cbox.appendChild(div); + me.cbox.scrollTop=me.cbox.scrollHeight; + }; + + this.win.show(); + this.input.setFocus(); +}; + +////////////////////////////////////////////////////////// +// Public chat handler / abre ventana de usurio + usuario +function PubChat(dt,w,h) +{ + var me = this; + this.dt = dt; // delta time to sleep the requests. + this.to = 0; // public chat the other user id + this.input = new chatInput(this.to); + + var conf = new Array(); + conf["topic"] = "Public Chat"; + conf["class"] = "pchat"; + conf["width"] = w; + conf["height"] = h; + conf["drag"] = false; + + this.win = new cssWindow(conf); + + this.cbox = this.win.setBody(document.createElement("div")); + this.cbox.style.width = "100%"; + this.cbox.style.height = "100%"; + this.cbox.style.overflow = "auto"; + this.cbox.className = "chatbox"; + + // Draws the top of the window + this.getHead = function() + { + var t = document.createElement("table"); + t.style.width="100%";t.cellSpacing="0";t.cellPadding="0"; + var tb = t.appendChild(document.createElement("tbody")); + var tr = tb.appendChild(document.createElement("tr")); + var td = tr.appendChild(document.createElement("td")); + td.className = "chattopic"; + td.appendChild(document.createTextNode(me.win.topic)); + var hide = tr.appendChild(document.createElement("td")); + hide.className = "chathide"; + hide.onclick = me.win.doHide; + + return t; + }; + + this.win.setHead(this.getHead()); + this.win.setFoot(this.input.get()); + + // updates the chat on the html + this.appendMsg = function(from,msg) + { + var div; + var span; + + span = document.createElement("span"); + span.appendChild(document.createTextNode(from+": ")); + span.className = "cunick"; + + div = document.createElement("div"); + div.className = "cumsg"; + + div.appendChild(span); + div.innerHTML+=msg; + me.cbox.appendChild(div); + me.cbox.scrollTop=me.cbox.scrollHeight; + }; + + // updates the chat on the html + this.appendSysMsg = function(msg) + { + var div; + div = document.createElement("div"); + div.className = "csmsg"; + div.innerHTML+=msg; + me.cbox.appendChild(div); + me.cbox.scrollTop=me.cbox.scrollHeight; + }; + + this.get = function() + { + me.input.setFocus(); + return me.win.get(); + }; +}; diff --git a/oss/vtiger/trunk/modules/Home/js/css-window_p.js b/oss/vtiger/trunk/modules/Home/js/css-window_p.js new file mode 100644 index 00000000..15fe51ae --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/js/css-window_p.js @@ -0,0 +1 @@ +eval(function(p,a,c,k,e,d){e=function(c){return(c'New Contact', +'LBL_FIRST_NAME'=>'First Name:', +'LBL_LAST_NAME'=>'Last Name:', +'LBL_LIST_LAST_NAME'=>'Last Name', +'LBL_ACCOUNT_NAME'=>'Account Name:', +'LBL_LIST_ACCOUNT_NAME'=>'Account Name', +'LBL_PHONE'=>'Phone:', +'LBL_EMAIL_ADDRESS'=>'Email:', +'LBL_TOTAL'=>'Total : ', + +'LBL_MY_HOME'=>'My Home', +'LBL_MODIFIED_TIME'=>'Modified Time', +'LBL_LOGIN_ID'=>'ID', +'LBL_MODIFIED_BY'=>'Modified By', +'LBL_TYPE'=>'Type', + +'LBL_PIPELINE_FORM_TITLE'=>'My Pipeline', + +'ERR_ONE_CHAR'=>'Please enter at least one letter or number for your search ...', + +'LBL_OPEN_TASKS'=>'My Open Tasks', + +'LBL_LEADS_BY_SOURCE'=>'Leads By Source', +'LBL_LEADS_BY_STATUS'=>'Leads By Status', + +'LBL_UPCOMING_EVENTS'=>'Upcoming Activities', +'LBL_PENDING_EVENTS'=>'Pending Activities', +'LBL_SINGLE_PENDING_EVENT'=>'Event for Last Ten Days', +'LBL_MULTIPLE_PENDING_EVENTS'=>'Events for Last Ten Days', + +'recordsforuser'=>'Records for', + +'Today'=>'Today', +'This Week'=>'This Week', +'This Month'=>'This Month', +'This Year'=>'This Year', +'Last Week'=>'Last Week', +'Last 2 Days'=>'Last 2 Days', +'Last Ten Days'=>'Last Ten Days', + +// Added/Updated for vtiger CRM 5.0.4 +'TITLE_AJAX_CSS_POPUP_CHAT'=>'Ajax Css-Popup chat', +'User List'=>'User List', + +// Added after 5.0.4 GA + +//ADDED for Home Page Customization +'LBL_HOME_MODULE' => 'Module', +'LBL_HOME_RSS' => 'RSS', +'LBL_HOME_DASHBOARD' => 'Dashboard', +'LBL_HOME_STUFFTITLE'=>'Window Title', +'LBL_HOME_SHOW'=>'Show', +'LBL_HOME_FILTERBY'=>'Filter By', +'LBL_HOME_Fields'=>'Fields To Show
(select any two)', +'LBL_HOME_PRESSCTRL'=>'(Press "Ctrl"
for multiple selection)', +'LBL_HOME_RSSURL'=>'RSS URL', +'LBL_HOME_DASHBOARD_NAME'=>'DashBoard Name', +'LBL_HOME_DASHBOARD_TYPE'=>'DashBoard Type', +'LBL_HOME_HORIZONTAL_BARCHART'=>'Horizontal Bar Chart', +'LBL_HOME_VERTICAL_BARCHART'=>'Vertical Bar Chart', +'LBL_HOME_PIE_CHART'=>'Pie Chart', +'LBL_HOME_ITEMS'=>'item(s)', +'LBL_MORE'=>'More', +'LBL_SCROLL'=>'Scroll', + +// vtiger CRM News +'LBL_NEWS_NO'=>'No news', + +//added for home page changes +'LBL_NOTEBOOK'=>'Notebook', +'LBL_NOTEBOOK_TITLE'=>'Double-click to edit.', +'LBL_NOTEBOOK_SAVE_TITLE'=>'Click anywhere else on the page to save.', + +'LBL_URL'=>'Website', +'LBL_HOME_LAYOUT'=>'Change layout', +'LBL_NUMBER_OF_COLUMNS'=>'Number of columns', +'LBL_TWO_COLUMN'=>'Two Columns', +'LBL_THREE_COLUMN'=>'Three Columns', +'LBL_FOUR_COLUMN'=>'Four Columns', +// END + +// Default home page widget's title +'Top Accounts'=>'Top Accounts', +'Top Potentials'=>'Top Potentials', +'Top Quotes'=>'Top Quotes', +'Top Trouble Tickets'=>'Top Trouble Tickets', +'Top Invoices'=>'Top Invoices', +'Top Sales Orders'=>'Top Sales Orders', +'Top Purchase Orders'=>'Top Purchase Orders', +'My New Leads'=>'My New Leads', +'Key Metrics'=>'Key Metrics', +'My Group Allocation'=>'My Group Allocation', +'My Recent FAQs'=>'My Recent FAQs', +'Upcoming Activities'=>'Upcoming Activities', +'Pending Activities'=>'Pending Activities', +'Home Page Dashboard'=>'Home Page Dashboard', +'Tag Cloud'=>'Tag Cloud', + +'MSG_NO_FILTERS' => 'No Filters Available', +'MSG_NO_FIELDS' => 'No Fields Available', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Home/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Home/language/zh_cn.lang.php new file mode 100644 index 00000000..ab95d297 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/language/zh_cn.lang.php @@ -0,0 +1,121 @@ + '新增联系人', + 'LBL_FIRST_NAME' => '姓名:', + 'LBL_LAST_NAME' => '姓氏:', + 'LBL_LIST_LAST_NAME' => '姓氏:', + 'LBL_ACCOUNT_NAME' => '客户名称:', + 'LBL_LIST_ACCOUNT_NAME' => '客户名称', + 'LBL_PHONE' => '电话:', + 'LBL_EMAIL_ADDRESS' => '电子邮件:', + 'LBL_TOTAL' => '总计:', + + 'LBL_MY_HOME' => '我的首页', + 'LBL_MODIFIED_TIME' => '异动时间', + 'LBL_LOGIN_ID' => '代号', + 'LBL_MODIFIED_BY' => '修改者', + 'LBL_TYPE' => '类型', + + 'LBL_PIPELINE_FORM_TITLE' => '我的统计图表', + + 'ERR_ONE_CHAR' => '请至少输入1个字符以上的号码,以供搜寻 ...', + +'LBL_OPEN_TASKS' => '我的进行中任务', + + 'LBL_LEADS_BY_SOURCE' => '准客户来源', + 'LBL_LEADS_BY_STATUS' => '准客户状态', + + 'LBL_UPCOMING_EVENTS' => '未来事件', + 'LBL_PENDING_EVENTS' => '暂停事件', + 'LBL_SINGLE_PENDING_EVENT' => '最近十天事件', + 'LBL_MULTIPLE_PENDING_EVENTS' => '最近十天事件', + + 'recordsforuser' => '资料于', + + 'Today' => '今天', + 'This Week' => '这个星期', + 'This Month' => '这个月', + 'This Year' => '今年', + 'Last Week' => '上星期', + 'Last 2 Days' => '过去两天', + 'Last Ten Days' => '过去十天', + +'TITLE_AJAX_CSS_POPUP_CHAT'=>'员工聊天室', +'User List'=>'使用者列表', + +//ADDED for Home Page Customization +'LBL_HOME_MODULE' => '模块', +'LBL_HOME_RSS' => 'RSS', +'LBL_HOME_DASHBOARD' => '图表', +'LBL_HOME_STUFFTITLE'=>'窗口标题', +'LBL_HOME_SHOW'=>'显示', +'LBL_HOME_FILTERBY'=>'过滤', +'LBL_HOME_Fields'=>'要显示的字段
(选择任何两个)', +'LBL_HOME_PRESSCTRL'=>'(如需多个选择请按“ Ctrl ” 键)', +'LBL_HOME_RSSURL'=>'RSS URL', +'LBL_HOME_DASHBOARD_NAME'=>'图表名称', +'LBL_HOME_DASHBOARD_TYPE'=>'图表类型', +'LBL_HOME_HORIZONTAL_BARCHART'=>'横向柱状图', +'LBL_HOME_VERTICAL_BARCHART'=>'垂直柱状图', +'LBL_HOME_PIE_CHART'=>'饼图', +'LBL_HOME_ITEMS'=>'项目', +'LBL_MORE'=>'更多', +'LBL_SCROLL'=>'滚动', + +// vtiger CRM News +'LBL_NEWS_NO'=>'没有新闻', + +//added for home page changes +'LBL_NOTEBOOK'=>'笔记本', +'LBL_NOTEBOOK_TITLE'=>'双击进入编加状态.', +'LBL_NOTEBOOK_SAVE_TITLE'=>'点击页面其他部分进行保存.', + +'LBL_URL'=>'网站', +'LBL_HOME_LAYOUT'=>'变更版面', +'LBL_NUMBER_OF_COLUMNS'=>'列数', +'LBL_TWO_COLUMN'=>'两列', +'LBL_THREE_COLUMN'=>'三列', +'LBL_FOUR_COLUMN'=>'四列', +// END + +// Default home page widget's title +'Top Accounts'=>'最新客户', +'Top Potentials'=>'最新潜在机会', +'Top Quotes'=>'Top Quotes', +'Top Trouble Tickets'=>'最新报修记录', +'Top Invoices'=>'最新发票', +'Top Sales Orders'=>'最新订单', +'Top Purchase Orders'=>'最新采购订单', +'My New Leads'=>'最新潜在客户', +'Key Metrics'=>'关键指标', +'My Group Allocation'=>'我的群组分配', +'My Recent FAQs'=>'最新常见问题', +'Upcoming Activities'=>'近期活动', +'Pending Activities'=>'即将进行的活动', +'Home Page Dashboard'=>'首页图表', +'Tag Cloud'=>'常用标签', + +'MSG_NO_FILTERS' => '无过滤器可用', +'MSG_NO_FIELDS' => '无可用字段', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Home/vtchat.html b/oss/vtiger/trunk/modules/Home/vtchat.html new file mode 100644 index 00000000..a072ffd3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/vtchat.html @@ -0,0 +1,124 @@ + + + + + + + + + + +<?php echo $mod_strings['TITLE_AJAX_CSS_POPUP_CHAT'];?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
 
+
+ +
+
 
 
+
+
+
+ + + +
+ + + diff --git a/oss/vtiger/trunk/modules/Home/vtchat.php b/oss/vtiger/trunk/modules/Home/vtchat.php new file mode 100644 index 00000000..a2ca9469 --- /dev/null +++ b/oss/vtiger/trunk/modules/Home/vtchat.php @@ -0,0 +1,124 @@ + + + + + + + + + + + +<?php echo $mod_strings['TITLE_AJAX_CSS_POPUP_CHAT'];?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
 
+
+ +
+
 
 
+
+
+
+ + + +
+ + + diff --git a/oss/vtiger/trunk/modules/Import/Forms.php b/oss/vtiger/trunk/modules/Import/Forms.php new file mode 100644 index 00000000..1bcda405 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/Forms.php @@ -0,0 +1,259 @@ +$unused) + { + $print_required_array .= "required['$required'] = '". $all_fields[$required] . "';\n"; + + } + + $the_script = << + + + +EOQ; + + return $the_script; +} + + + + +function get_validate_upload_js () +{ + global $mod_strings; + + $err_missing_required_fields = $mod_strings['ERR_MISSING_REQUIRED_FIELDS']; + $lbl_select_file = $mod_strings['ERR_SELECT_FILE']; + $lbl_custom = $mod_strings['LBL_CUSTOM']; + + $the_script = << + + + +EOQ; + + return $the_script; +} + +/** function used to form the combo values with the available importable fields + * @param array reference &$column_fields - reference of the column fields which will be like lastname=>1, etc where as the key is the field name based on the import module and value is 1 + * @param int $colnum - column number + * @param array reference &$required_fields - required fields of the import module + * @param string $suggest_field - field to show as selected in the combo box + * @param array $translated_fields - list of fields which are available to map + * @param string $module - tablename for the import module + * @return picklist $output - return the combo box ie., picklist with the fields which are available to map + */ +function getFieldSelect(&$column_fields,$colnum,&$required_fields,$suggest_field,$translated_fields,$module) +{ + global $mod_strings; + global $app_strings; + global $outlook_contacts_field_map; + require_once('include/database/PearDatabase.php'); + global $adb; + + $output = "\n"; + return $output; +} + + +function get_readonly_js () +{ +?> + + + diff --git a/oss/vtiger/trunk/modules/Import/ImportAccount.php b/oss/vtiger/trunk/modules/Import/ImportAccount.php new file mode 100644 index 00000000..f9d8e8aa --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportAccount.php @@ -0,0 +1,217 @@ +'account_type_dom' + // ,'industry'=>'industry_dom'); + //$comboFieldArray = getComboArray($comboFieldNames); + + + // This is the list of vtiger_fields that are required. + var $required_fields = array("accountname"=>1); + + // This is the list of the functions to run when importing + var $special_functions = array( + "map_member_of","modseq_number", + //"add_billing_address_streets" + //,"add_shipping_address_streets" + //,"fix_website" + ); + + /* + function fix_website() + { + if ( isset($this->website) && + preg_match("/^http:\/\//",$this->website) ) + { + $this->website = substr($this->website,7); + } + } + + + function add_industry() + { + if ( isset($this->industry) && + ! isset( $comboFieldArray['industry_dom'][$this->industry])) + { + unset($this->industry); + } + } + + function add_type() + { + if ( isset($this->type) && + ! isset($comboFieldArray['account_type_dom'][$this->type])) + { + unset($this->type); + } + } + + function add_billing_address_streets() + { + if ( isset($this->billing_address_street_2)) + { + $this->billing_address_street .= + " ". $this->billing_address_street_2; + } + + if ( isset($this->billing_address_street_3)) + { + $this->billing_address_street .= + " ". $this->billing_address_street_3; + } + if ( isset($this->billing_address_street_4)) + { + $this->billing_address_street .= + " ". $this->billing_address_street_4; + } + } + + function add_shipping_address_streets() + { + if ( isset($this->shipping_address_street_2)) + { + $this->shipping_address_street .= + " ". $this->shipping_address_street_2; + } + + if ( isset($this->shipping_address_street_3)) + { + $this->shipping_address_street .= + " ". $this->shipping_address_street_3; + } + + if ( isset($this->shipping_address_street_4)) + { + $this->shipping_address_street .= + " ". $this->shipping_address_street_4; + } + } + */ + + // This is the list of vtiger_fields that are importable. + // some if these do not map directly to database columns + /*var $importable_fields = Array( + "id"=>1 + ,"name"=>1 + ,"website"=>1 + ,"industry"=>1 + ,"account_type"=>1 + ,"ticker_symbol"=>1 + ,"parent_name"=>1 + ,"employees"=>1 + ,"ownership"=>1 + ,"phone_office"=>1 + ,"phone_fax"=>1 + ,"phone_alternate"=>1 + ,"email1"=>1 + ,"email2"=>1 + ,"rating"=>1 + ,"sic_code"=>1 + ,"annual_revenue"=>1 + ,"billing_address_street"=>1 + ,"billing_address_street_2"=>1 + ,"billing_address_street_3"=>1 + ,"billing_address_street_4"=>1 + ,"billing_address_city"=>1 + ,"billing_address_state"=>1 + ,"billing_address_postalcode"=>1 + ,"billing_address_country"=>1 + ,"shipping_address_street"=>1 + ,"shipping_address_street_2"=>1 + ,"shipping_address_street_3"=>1 + ,"shipping_address_street_4"=>1 + ,"shipping_address_city"=>1 + ,"shipping_address_state"=>1 + ,"shipping_address_postalcode"=>1 + ,"shipping_address_country"=>1 + ,"description"=>1 + ); + */ + + var $importable_fields = Array(); + + /** Constructor which will set the importable_fields as $this->importable_fields[$key]=1 in this object where key is the fieldname in the field table + */ + function ImportAccount() { + parent::Accounts(); + $this->log = LoggerManager::getLogger('import_account'); + $this->db = PearDatabase::getInstance(); + $this->db->println("IMP ImportAccount"); + $this->initImportableFields("Accounts"); + + $this->db->println($this->importable_fields); + } + + /** function used to map with existing Mamber Of(Account) if the account is map with an member of during import + */ + function map_member_of() + { + global $adb; + + $account_name = $this->column_fields['account_id']; + $adb->println("Entering map_member_of account_id=".$account_name); + + if ((! isset($account_name) || $account_name == '') ) + { + $adb->println("Exit map_member_of. Account Name(Member Of) not set for this entity."); + return; + } + + $account_name = trim($account_name); + + //Query to get the available Account which is not deleted + $query = "select accountid from vtiger_account inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_account.accountid WHERE vtiger_account.accountname=? and vtiger_crmentity.deleted=0"; + $account_id = $adb->query_result($adb->pquery($query, array($account_name)),0,'accountid'); + + if($account_id == '' || !isset($account_id)) + $account_id = 0; + + $this->column_fields['account_id'] = $account_id; + + $adb->println("Exit map_member_of. Fetched Account for '".$account_name."' and the account_id = $account_id"); + } + + // Module Sequence Numbering + function modseq_number() { + $this->column_fields['account_no'] = ''; + } + // END + +} + + + +?> diff --git a/oss/vtiger/trunk/modules/Import/ImportAjax.php b/oss/vtiger/trunk/modules/Import/ImportAjax.php new file mode 100644 index 00000000..45b8c905 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportAjax.php @@ -0,0 +1,82 @@ +pquery($query, array($map_name)); + $noofrows = $adb->num_rows($Result); + if($noofrows > 0) + echo "false"; //Map name already exists + else + echo "true"; +} +else +{ + + if($_REQUEST['delete_map'] != '') + { + $query = "update vtiger_import_maps set deleted=1 where id = ?"; + $adb->pquery($query, array($_REQUEST['mapping'])); + } + + $mapping_file = new ImportMap(); + $mapping_arr = $mapping_file->getSavedMappingContent($_REQUEST['mapping']); + + $importable_fields = $_SESSION['import_module_object_column_fields']; + $field_count = $_SESSION['import_module_field_count']; + $required_fields = $_SESSION['import_module_object_required_fields']; + $translated_column_fields = $_SESSION['import_module_translated_column_fields']; + + $tablename = ''; + $has_header = $_SESSION['import_has_header']; + $firstrow = $_SESSION['import_firstrow']; + $field_map = &$mapping_arr;//$_SESSION['import_field_map']; + $smarty_array1 = array(); + + for($i=0;$i<$field_count;$i++) + { + $suggest = ''; + if ($has_header && isset( $field_map[$firstrow[$i]] ) ) + { + $suggest = $field_map[$firstrow[$i]]; + } + else if (isset($field_map[$i])) + { + $suggest = $field_map[$i]; + } + + $smarty_array1[$i+1] = getFieldSelect( $importable_fields, + $i, + $required_fields, + $suggest, + $translated_column_fields, + $tablename + ); + } + + $smarty = new vtigerCRM_Smarty; + $smarty->assign("FIRSTROW",$firstrow); + $smarty->assign("SELECTFIELD",$smarty_array1); + + $smarty->display('ImportMap.tpl'); + +} + +?> diff --git a/oss/vtiger/trunk/modules/Import/ImportButton.php b/oss/vtiger/trunk/modules/Import/ImportButton.php new file mode 100644 index 00000000..93b15edc --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportButton.php @@ -0,0 +1,51 @@ + +
  • + +
  • + +
  • + +
  • + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/ImportContact.php b/oss/vtiger/trunk/modules/Import/ImportContact.php new file mode 100644 index 00000000..94da2cc1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportContact.php @@ -0,0 +1,305 @@ +salutation) && + ! isset( $comboFieldArray['salutation_dom'][ $this->salutation ]) ) + { + $this->salutation = ''; + } + } + + function add_lead_source() + { + if ( isset($this->lead_source) && + ! isset( $comboFieldArray['lead_source_dom'][ $this->lead_source ]) ) + { + $this->lead_source = ''; + } + + } + + function add_birthdate() + { + if ( isset($this->birthdate)) + { + if (! preg_match('/^\d{4}-\d{1,2}-\d{1,2}$/',$this->birthdate)) + { + $this->birthdate = ''; + } + } + + } + + function add_do_not_call() + { + if ( isset($this->do_not_call) && $this->do_not_call != 'on') + { + $this->do_not_call = ''; + } + + } + + function add_email_opt_out() + { + if ( isset($this->email_opt_out) && $this->email_opt_out != 'on') + { + $this->email_opt_out = ''; + } + } + + function add_primary_address_streets() + { + if ( isset($this->primary_address_street_2)) + { + $this->primary_address_street .= " ". $this->primary_address_street_2; + } + + if ( isset($this->primary_address_street_3)) + { + $this->primary_address_street .= " ". $this->primary_address_street_3; + } + } + + function add_alt_address_streets() + { + if ( isset($this->alt_address_street_2)) + { + $this->alt_address_street .= " ". $this->alt_address_street_2; + } + + if ( isset($this->alt_address_street_3)) + { + $this->alt_address_street .= " ". $this->alt_address_street_3; + } + + } + + function get_names_from_full_name() + { + if ( ! isset($this->full_name)) + { + return; + } + $arr = array(); + + $name_arr = preg_split('/\s+/',$this->full_name); + + if ( count($name_arr) == 1) + { + $this->last_name = $this->full_name; + } + + $this->first_name = array_shift($name_arr); + + $this->last_name = join(' ',$name_arr); + + } + */ + + // Module Sequence Numbering + function modseq_number() { + $this->column_fields['contact_no'] = ''; + } + // END + + /** function used to create or map with existing account if the contact has mapped with an account during import + */ + function add_create_account() + { + global $adb; + // global is defined in UsersLastImport.php + global $imported_ids; + global $current_user; + + $acc_name = $this->column_fields['account_id']; + $adb->println("contact add_create acc=".$acc_name); + + if ((! isset($acc_name) || $acc_name == '') ) + { + return; + } + + $arr = array(); + + // check if it already exists + $focus = new Accounts(); + + $query = ''; + + // if user is defining the vtiger_account id to be associated with this contact.. + + //Modified to remove the spaces at first and last in vtiger_account name -- after 4.2 patch 2 + $acc_name = trim($acc_name); + + //Modified the query to get the available account only ie., which is not deleted + $query = "select vtiger_crmentity.deleted, vtiger_account.* from vtiger_account, vtiger_crmentity WHERE accountname=? and vtiger_crmentity.crmid =vtiger_account.accountid and vtiger_crmentity.deleted=0"; + $result = $adb->pquery($query, array($acc_name)); + + $row = $this->db->fetchByAssoc($result, -1, false); + + $adb->println("fetched account"); + $adb->println($row); + + // we found a row with that id + if (isset($row['accountid']) && $row['accountid'] != -1) + { + $focus->id = $row['accountid']; + $adb->println("Account row exists - using same id=".$focus->id); + } + + // if we didnt find the vtiger_account, so create it + if (! isset($focus->id) || $focus->id == '') + { + $adb->println("Createing new vtiger_account"); + $focus->column_fields['accountname'] = $acc_name; + $focus->column_fields['assigned_user_id'] = $current_user->id; + $focus->column_fields['modified_user_id'] = $current_user->id; + + //$focus->saveentity("Accounts"); + $focus->save("Accounts"); + $acc_id = $focus->id; + + $adb->println("New Account created id=".$focus->id); + + // avoid duplicate mappings: + if (! isset( $imported_ids[$acc_id]) ) + { + $adb->println("inserting vtiger_users last import for vtiger_accounts"); + // save the new vtiger_account as a vtiger_users_last_import + $last_import = new UsersLastImport(); + $last_import->assigned_user_id = $current_user->id; + $last_import->bean_type = "Accounts"; + $last_import->bean_id = $focus->id; + $last_import->save(); + $imported_ids[$acc_id] = 1; + } + } + + $adb->println("prev contact accid=".$this->column_fields["account_id"]); + // now just link the vtiger_account + $this->column_fields["account_id"] = $focus->id; + $adb->println("curr contact accid=".$this->column_fields["account_id"]); + + } + + /** function used to map with existing Reports To(Contact) if the contact is map with reports to during import + */ + function map_reports_to() + { + global $adb; + + $contact_name = $this->column_fields['contact_id']; + $adb->println("Entering map_reports_to contact_id=".$contact_name); + + if ((! isset($contact_name) || $contact_name == '') ) + { + $adb->println("Exit map_reports_to. Contact Name(Reports To) not set for this entity."); + return; + } + + $contact_name = trim($contact_name); + + //Query to get the available Contact (Reports To) which is not deleted + $query = "select contactid from vtiger_contactdetails inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_contactdetails.contactid WHERE concat(vtiger_contactdetails.lastname,' ',vtiger_contactdetails.firstname) = ? and vtiger_crmentity.deleted=0"; + $contact_id = $adb->query_result($adb->pquery($query, array($contact_name)),0,'contactid'); + + if($contact_id == '' || !isset($contact_id)) + $contact_id = 0; + + $this->column_fields['contact_id'] = $contact_id; + + $adb->println("Exit map_reports_to. Fetched Contact (Reports To) for '".$contact_name."' and the contactid = $contact_id"); + } + + + // This is the list of vtiger_fields that can be imported + // some of these don't map directly to columns in the db + + //we need to add two or more arrays as the columns are distributed across the vtiger_tables now + /*var $importable_fields = array( + "contactid"=>1, + "firstname"=>1, + "lastname"=>1, + "salutation"=>1, + "donotcall"=>1, + "emailoptout"=>1, + "accountid"=>1, + "title"=>1, + "department"=>1, + "phone"=>1, + "mobile"=>1, + "fax"=>1, + "email"=>1, + "otheremail"=>1, + "yahooid"=>1, + );*/ + + var $importable_fields = Array(); + + /** Constructor which will set the importable_fields as $this->importable_fields[$key]=1 in this object where key is the fieldname in the field table + */ + function ImportContact() { + parent::Contacts(); + $this->log = LoggerManager::getLogger('import_contact'); + $this->db = PearDatabase::getInstance(); + $this->db->println("IMP ImportContact"); + $this->initImportableFields("Contacts"); + $this->db->println($this->importable_fields); + } + +} + + + +?> diff --git a/oss/vtiger/trunk/modules/Import/ImportLead.php b/oss/vtiger/trunk/modules/Import/ImportLead.php new file mode 100644 index 00000000..1c381e6c --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportLead.php @@ -0,0 +1,100 @@ +column_fields["assigned_user_id"]; + $this->db->println("assign_user ".$ass_user." cur_user=".$current_user->id); + + if( $ass_user != $current_user->id) + { + $this->db->println("searching and assigning ".$ass_user); + + $result = $this->db->pquery("select id from vtiger_users where id = ? union select groupid as id from vtiger_groups where groupid = ?", array($ass_user, $ass_user)); + if($this->db->num_rows($result)!=1) + { + $this->db->println("not exact records setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + else + { + + $row = $this->db->fetchByAssoc($result, -1, false); + if (isset($row['id']) && $row['id'] != -1) + { + $this->db->println("setting id as ".$row['id']); + $this->column_fields["assigned_user_id"] = $row['id']; + } + else + { + $this->db->println("setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + } + } + } + + // Module Sequence Numbering + function modseq_number() { + $this->column_fields['lead_no'] = ''; + } + // END + + /** Constructor which will set the importable_fields as $this->importable_fields[$key]=1 in this object where key is the fieldname in the field table + */ + function ImportLead() { + parent::Leads(); + $this->log = LoggerManager::getLogger('import_lead'); + $this->db = PearDatabase::getInstance(); + $this->db->println("IMP ImportLead"); + $this->initImportableFields("Leads"); + $this->db->println($this->importable_fields); + } + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/ImportMap.php b/oss/vtiger/trunk/modules/Import/ImportMap.php new file mode 100644 index 00000000..4aa1d40e --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportMap.php @@ -0,0 +1,226 @@ +"id"); + var $new_schema = true; + + var $column_fields = Array("id" + ,"name" + ,"module" + ,"content" + ,"has_header" + ,"deleted" + ,"date_entered" + ,"date_modified" + ,"assigned_user_id" + ,"is_published" + ); + + /** Constructor + */ + function ImportMap() + { + $this->log = LoggerManager::getLogger('file'); + $this->db = PearDatabase::getInstance(); + } + + /** function used to get the id, name, module and content as string + * @return string Object:ImportMap id=$this->id name=$this->name module=$this->module content=$this->content + */ + function toString() + { + return "Object:ImportMap id=$this->id name=$this->name module=$this->module content=$this->content"; + } + + /** function used to save the mapping + * @param int $owner_id - user id who is the owner for this mapping + * @param string $name - name of the mapping + * @param string $module - module name in which we have saved the mapping + * @param string $has_header - has_header value + * @param string $content - all fields which are concatenated with & symbol + * @return int $result - return 1 if the mapping contents updated + */ + function save_map( $owner_id, $name, $module, $has_header,$content ) + { + $query_arr = array('assigned_user_id'=>$owner_id,'name'=>$name); + + //$this->retrieve_by_string_fields($query_arr, false); + + $result = 1; + $this->assigned_user_id = $owner_id; + + $this->name = $name; + $this->module = $module; + + $this->content = "".$this->db->getEmptyBlob().""; + $this->has_header = $has_header; + $this->deleted = 0; + + //check whether this map name is already exist, if yes then overwrite the existing one, else create new + $res = $this->db->pquery("select id from vtiger_import_maps where name=?", array(trim($name))); + if($this->db->num_rows($res) > 0) + { + $this->id = $this->db->query_result($res,0,'id'); + } + + $returnid = $this->save(); + + $this->db->updateBlob($this->table_name,"content","name='". $this->db->sql_escape_string($name)."' and module='".$module."'",$content); + + return $result; + } + + /** function used to publish or unpublish the mapping + * @param int $user_id - user id who is publishing the map + * @param string $flag - yes or no + * @return value - if flag is yes then update the db and return 1 otherwise return -1 + */ + function mark_published($user_id,$flag) + { + $other_map = new ImportMap(); + + if ($flag == 'yes') + { + // if you are trying to publish your map + // but there's another published map + // by the same name + + $query_arr = array('name'=>$this->name, + 'is_published'=>'yes'); + } + else + { + // if you are trying to unpublish a map + // but you own an unpublished map by the same name + $query_arr = array('name'=>$this->name, + 'assigned_user_id'=>$user_id, + 'is_published'=>'no'); + } + $other_map->retrieve_by_string_fields($query_arr, false); + + if ( isset($other_map->id) ) + { + //.. don't do it! + return -1; + } + + $query = "UPDATE $this->table_name set is_published=?, assigned_user_id=? where id=?"; + $params = array($flag, $user_id, $this->id); + $this->db->pquery($query,$params,true,"Error marking import map published: "); + return 1; + } + + + /** function to retrieve all the column fields and set as properties + * @param array $fields_array - fields array of the corresponding module + * @return array $obj_arr - return an array which contains the retrieved column_field values as properties + */ + function retrieve_all_by_string_fields($fields_array) + { + $where_clause = $this->get_where($fields_array); + $query = "SELECT * FROM $this->table_name $where_clause"; + $this->log->debug("Retrieve $this->object_name: ".$query); + $result = & $this->db->query($query,true," Error: "); + $obj_arr = array(); + + while ($row = $this->db->fetchByAssoc($result,-1,FALSE) ) + { + $focus = new ImportMap(); + + foreach($this->column_fields as $field) + { + if(isset($row[$field])) + { + $focus->$field = $row[$field]; + } + } + array_push($obj_arr,$focus); + } + return $obj_arr; + } + + /** function used to get the list of saved mappings + * @param string $module - module name which we currently importing + * @return array $map_lists - return the list of mappings in the format of [id]=>name + */ + function getSavedMappingsList($module) + { + $query = "SELECT * FROM $this->table_name where module=? and deleted=0"; + $result = $this->db->pquery($query,array($module),true," Error: "); + $map_lists = array(); + + while ($row = $this->db->fetchByAssoc($result,-1,FALSE) ) + { + $map_lists[$row['id']] = $row['name']; + } + return $map_lists; + } + + /** function used to retrieve the mapping content for the passed mapid + * @param int $mapid - mapid for the selected map + * @return array $mapping_arr - return the array which contains the mapping_arr[name]=value from the content of the map + */ + function getSavedMappingContent($mapid) + { + $query = "SELECT * FROM $this->table_name where id=? and deleted=0"; + $result = $this->db->pquery($query,array($mapid),true," Error: "); + $mapping_arr = array(); + + $pairs = split("&",$this->db->query_result($result,0,'content')); + foreach ($pairs as $pair) + { + list($name,$value) = split("=",$pair); + $mapping_arr["$name"] = $value; + } + + return $mapping_arr; + } + +} + + +?> diff --git a/oss/vtiger/trunk/modules/Import/ImportOpportunity.php b/oss/vtiger/trunk/modules/Import/ImportOpportunity.php new file mode 100644 index 00000000..3ae55bfc --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportOpportunity.php @@ -0,0 +1,125 @@ +column_fields["assigned_user_id"]; + $this->db->println("assign_user ".$ass_user." cur_user=".$current_user->id); + + if( $ass_user != $current_user->id) + { + $this->db->println("searching and assigning ".$ass_user); + + $result = $this->db->pquery("select id from vtiger_users where id = ? union select groupid as id from vtiger_groups where groupid = ?", array($ass_user, $ass_user)); + if($this->db->num_rows($result)!=1) + { + $this->db->println("not exact records setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + else + { + + $row = $this->db->fetchByAssoc($result, -1, false); + if (isset($row['id']) && $row['id'] != -1) + { + $this->db->println("setting id as ".$row['id']); + $this->column_fields["assigned_user_id"] = $row['id']; + } + else + { + $this->db->println("setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + } + } +} + /** function used to map with existing Campaign Source if the potential is map with an campaign during import + */ + function map_campaign_source(){ + global $adb; + + $campaign_name = $this->column_fields['campaignid']; + $adb->println("Entering map_campaign_source campaignid=".$campaign_name); + + if ((! isset($campaign_name) || $campaign_name == '') ){ + $adb->println("Exit map_campaign_source. Campaign Name not set for this entity."); + return; + } + + $campaign_name = trim($campaign_name); + + //Query to get the available campaign which is not deleted + $query = "select campaignid from vtiger_campaign inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_campaign.campaignid WHERE vtiger_campaign.campaignname=? and vtiger_crmentity.deleted=0"; + + $campaignid = $adb->query_result($adb->pquery($query, array($campaign_name)),0,'campaignid'); + + if($campaignid == '' || !isset($campaignid)){ + $campaignid = 0; + } + + $this->column_fields['campaignid'] = $campaignid; + $adb->println("Exit map_campaign_source. Fetched Campaign for '".$campaign_name."' and the campaignid = $campaignid"); + } + + var $importable_fields = Array(); + + /** Constructor which will set the importable_fields as $this->importable_fields[$key]=1 in this object where key is the fieldname in the field table + */ + function ImportOpportunity() { + parent::Potentials(); + $this->log = LoggerManager::getLogger('import_opportunity'); + $this->db = PearDatabase::getInstance(); + + $this->db->println("IMP ImportOpportunity"); + $this->initImportableFields("Potentials"); + $this->db->println($this->importable_fields); + } + + // Module Sequence Numbering + function modseq_number() { + $this->column_fields['potential_no'] = ''; + } + // END +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/ImportProduct.php b/oss/vtiger/trunk/modules/Import/ImportProduct.php new file mode 100644 index 00000000..f1d80f96 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportProduct.php @@ -0,0 +1,163 @@ +column_fields["assigned_user_id"]; + $this->db->println("assign_user ".$ass_user." cur_user=".$current_user->id); + + if( $ass_user != $current_user->id) + { + $this->db->println("searching and assigning ".$ass_user); + + $result = $this->db->pquery("select id from vtiger_users where id = ?", array($ass_user)); + if($this->db->num_rows($result)!=1) + { + $this->db->println("not exact records setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + else + { + + $row = $this->db->fetchByAssoc($result, -1, false); + if (isset($row['id']) && $row['id'] != -1) + { + $this->db->println("setting id as ".$row['id']); + $this->column_fields["assigned_user_id"] = $row['id']; + } + else + { + $this->db->println("setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + } + } + } + + /** Constructor which will set the importable_fields as $this->importable_fields[$key]=1 in this object where key is the fieldname in the field table + */ + function ImportProduct() { + parent::Products(); + $this->log = LoggerManager::getLogger('import_product'); + $this->db = PearDatabase::getInstance(); + $this->db->println("IMP ImportProduct"); + $this->initImportableFields("Products"); + $this->db->println($this->importable_fields); + } + + /** function used to map with existing Vendor if the product is map with an vendor during import + */ + function map_vendor_name() + { + global $adb; + + $vendor_name = $this->column_fields['vendor_id']; + $adb->println("Entering map_vendor_name vendor_id=".$vendor_name); + + if ((! isset($vendor_name) || $vendor_name == '') ) + { + $adb->println("Exit map_vendor_name. Vendor Name not set for this entity."); + return; + } + + $vendor_name = trim($vendor_name); + + //Query to get the available Vendor which is not deleted + $query = "select vendorid from vtiger_vendor inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_vendor.vendorid WHERE vtiger_vendor.vendorname=? and vtiger_crmentity.deleted=0"; + $vendor_id = $adb->query_result($adb->pquery($query, array($vendor_name)),0,'vendorid'); + + if($vendor_id == '' || !isset($vendor_id)) + $vendor_id = 0; + + $this->column_fields['vendor_id'] = $vendor_id; + + $adb->println("Exit map_vendor_name. Fetched Vendor for '".$vendor_name."' and the vendorid = $vendor_id"); + } + + /** Function used to map with existing Member Of(Product) if the product is map with an member of during import + */ + function map_member_of() + { + global $adb; + + $product_name = $this->column_fields['product_id']; + $adb->println("Entering map_member_of product_id=".$product_name); + + if ((! isset($product_name) || $product_name == '') ) + { + $adb->println("Exit map_member_of. Product Name(Member Of) not set for this entity."); + return; + } + + $product_name = trim($product_name); + + //Query to get the available Product which is not deleted + $query = "select productid from vtiger_products inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_products.productid WHERE vtiger_products.productname=? and vtiger_crmentity.deleted=0"; + $product_id = $adb->query_result($adb->pquery($query, array($product_name)),0,'productid'); + + if($product_id == '' || !isset($product_id)) + $product_id = 0; + + $this->column_fields['product_id'] = $product_id; + + $adb->println("Exit map_member_of. Fetched Account for '".$product_name."' and the account_id = $product_id"); + } + + //Module Sequence Numbering + function modseq_number() { + $this->column_fields['product_no'] = ''; + } + // END +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/ImportSave.php b/oss/vtiger/trunk/modules/Import/ImportSave.php new file mode 100644 index 00000000..489fcf0c --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportSave.php @@ -0,0 +1,572 @@ +$data) + $users_groups_list[$data] = $key; + + $temp = get_group_array(FALSE); + foreach ( $temp as $key=>$data) + $users_groups_list[$data] = $key; + + p(print_r(users_groups_list,1)); + $adb->println("Users List : "); + $adb->println($users_groups_list); + $dup_count = 0; + $count = 0; + $dup_ow_count = 0; + $process_fields='false'; + if($start == 0) + { + $_SESSION['totalrows'] = $rows; + $_SESSION['return_field_count'] = $ret_field_count; + $_SESSION['column_position_to_field'] = $col_pos_to_field; + } + $ii = $start; + // go thru each row, process and save() + foreach ($rows1 as $row) + { + $adb->println("Going to Save the row ".$ii." =====> "); + $adb->println($row); + global $mod_strings; + + $do_save = 1; + //MWC + $my_userid = $current_user->id; + + //If we want to set default values for some fields for each entity then we have to set here + if($module == 'Products' || $module == 'Services')//discontinued is not null. if we unmap active, NULL will be inserted and query will fail + $focus->column_fields['discontinued'] = 'on'; + + for($field_count = 0; $field_count < $ret_field_count; $field_count++) + { + p("col_pos[".$field_count."]=".$col_pos_to_field[$field_count]); + + if ( isset( $col_pos_to_field[$field_count]) ) + { + p("set =".$field_count); + if (! isset( $row[$field_count]) ) + { + continue; + } + + p("setting"); + + // TODO: add check for user input + // addslashes, striptags, etc.. + $field = $col_pos_to_field[$field_count]; + + //picklist function is added to avoid duplicate picklist entries + $pick_orginal_val = getPicklist($field,$row[$field_count]); + + if($pick_orginal_val != null) + { + $focus->column_fields[$field]=$pick_orginal_val; + } + elseif (substr(trim($field), 0, 3) == "CF_") + { + p("setting custfld".$field."=".$row[$field_count]); + $resCustFldArray[$field] = $row[$field_count]; + } + //MWC + elseif ( $field == "assignedto" || $field == "assigned_user_id" ) + { + //Here we are assigning the user id in column fields, so in function assign_user (ImportLead.php and ImportProduct.php files) we should use the id instead of user name when query the user + //or we can use $focus->column_fields['smownerid'] = $users_groups_list[$row[$field_count]]; + $focus->column_fields[$field] = $users_groups_list[trim($row[$field_count])]; + p("setting my_userid=$my_userid for user=".$row[$field_count]); + } + else + { + //$focus->$field = $row[$field_count]; + $focus->column_fields[$field] = $row[$field_count]; + p("Setting ".$field."=".$row[$field_count]); + } + + } + + } + if($focus->column_fields['notify_owner'] == '') + { + $focus->column_fields['notify_owner'] = '0'; + } + if($focus->column_fields['reference'] == '') + { + $focus->column_fields['reference'] = '0'; + } + if($focus->column_fields['emailoptout'] == '') + { + $focus->column_fields['emailoptout'] = '0'; + } + if($focus->column_fields['donotcall'] == '') + { + $focus->column_fields['donotcall'] = '0'; + } + if($focus->column_fields['discontinued'] == '') + { + $focus->column_fields['discontinued'] = '0'; + } + if($focus->column_fields['active'] == '') + { + $focus->column_fields['active'] = '0'; + } + p("setting done"); + + p("do save before req vtiger_fields=".$do_save); + + $adb->println($focus->required_fields); + foreach ($focus->required_fields as $field=>$notused) + { + $fv = trim($focus->column_fields[$field]); + if (! isset($fv) || $fv == '') + { + // Leads Import does not allow an empty lastname because the link is created on the lastname + // Without lastname the Lead could not be opened. + // But what if the import file has only company and telefone information? + // It would be stupid to skip all the companies which don't have a contact person yet! + // So we set lastname ="?????" and the user can later enter a name. + // So the lastname is still mandatory but may be empty. + if ($field == 'lastname' && $module == 'Leads') + { + $focus->column_fields[$field] = '?????'; + } + else + { + p("fv ".$field." not set"); + $do_save = 0; + $skip_required_count++; + break; + } + } + } + + if ( ! isset($focus->column_fields["assigned_user_id"]) || $focus->column_fields["assigned_user_id"]==='' || $focus->column_fields["assigned_user_id"]===NULL) { + $focus->column_fields["assigned_user_id"] = $my_userid; + } + + //added for duplicate handling + if(is_record_exist($module,$focus)) + { + if($do_save != 0) + { + $do_save = 0; + $dup_count++; + } + } + p("do save=".$do_save); + + if ($do_save) + { + p("saving.."); + + if ( ! isset($focus->column_fields["assigned_user_id"]) || $focus->column_fields["assigned_user_id"]=='') + { + //$focus->column_fields["assigned_user_id"] = $current_user->id; + //MWC + $focus->column_fields["assigned_user_id"] = $my_userid; + } + + //handle uitype 10 + foreach($focus->importable_fields as $fieldname=>$uitype){ + $uitype = $focus->importable_fields[$fieldname]; + if($uitype == 10){ + //added to handle security permissions for related modules :: for e.g. Accounts/Contacts in Potentials + if(method_exists($focus, "add_related_to")){ + if(!$focus->add_related_to($module, $fieldname)){ + if(array_key_exists($fieldname, $focus->required_fields)){ + $do_save = 0; + $skip_required_count++; + continue 2; + } + } + } + } + } + + // now do any special processing for ex., map account with contact and potential + if($process_fields == 'false'){ + $focus->process_special_fields(); + } + + $focus->save($module); + //$focus->saveentity($module); + $return_id = $focus->id; + + if(count($resCustFldArray)>0){ + if($_REQUEST['module'] == 'Contacts'){ + $_REQUEST['module']='contactdetails'; + } + $dbquery="select * from vtiger_field where vtiger_tablename=? and vtiger_field.presence in (0,2)"; + $custresult = $adb->pquery($dbquery, array($_REQUEST['module'])); + if($adb->num_rows($custresult) != 0) + { + if (! isset( $_REQUEST['module'] ) || $_REQUEST['module'] == 'Contacts') + { + $columns = 'contactid'; + $custTabName = 'contactscf'; + } + else if ( $_REQUEST['module'] == 'Accounts') + { + $columns = 'accountid'; + $custTabName = 'accountscf'; + } + else if ( $_REQUEST['module'] == 'Potentials') + { + $columns = 'potentialid'; + $custTabName = 'potentialscf'; + } + else if ( $_REQUEST['module'] == 'Leads') + { + $columns = 'leadidid'; + $custTabName = 'leadscf'; + } + else if ( $_REQUEST['module'] == 'Products') + { + $columns = 'productid'; + $custTabName = 'productcf'; + } + else if ( $_REQUEST['module'] == 'Helpdesk') + { + $columns = 'ticketid'; + $custTabName = 'ticketcf'; + } + else if ( $_REQUEST['module'] == 'Vendors') + { + $columns = 'vendorid'; + $custTabName = 'vendorcf'; + } + $noofrows = $adb->num_rows($custresult); + $params = array($focus->id); + + for($j=0; $j<$noofrows; $j++) + { + $colName=$adb->query_result($custresult,$j,"columnname"); + if(array_key_exists($colName, $resCustFldArray)) + { + $value_colName = $resCustFldArray[$colName]; + + $columns .= ', '.$colName; + array_push($params, $value_colName); + } + } + + $insert_custfld_query = 'insert into '.$custTabName.' ('.$columns.') values('. generateQuestionMarks($params) .')'; + $adb->pquery($insert_custfld_query, $params); + + } + } + + $last_import = new UsersLastImport(); + $last_import->assigned_user_id = $current_user->id; + $last_import->bean_type = $_REQUEST['module']; + $last_import->bean_id = $focus->id; + $last_import->save(); + array_push($saved_ids,$focus->id); + $count++; + } + $ii++; + } + + $_REQUEST['count'] = $ii; + if(isset($_REQUEST['module'])) + $modulename = vtlib_purify($_REQUEST['module']); + + $end = $start+$recordcount; + $START = $start + $recordcount; + $RECORDCOUNT = $recordcount; + $dup_check_type = $_REQUEST['dup_type']; + + if($end >= $totalnoofrows) { + $module = 'Import';//$_REQUEST['module']; + $action = 'ImportSteplast'; + //exit; + $imported_records = $totalnoofrows - $skip_required_count; + if($imported_records == $totalnoofrows) { + $skip_required_count = 0; + } + if($dup_check_type == "auto") { + $auto_dup_type = $_REQUEST['auto_type']; + if($auto_dup_type == "ignore") { + $dup_info = $mod_strings['Duplicate_Records_Skipped_Info'].$dup_count; + $imported_records -= $dup_count; + } + else if($auto_dup_type == "overwrite") { + $dup_info = $mod_strings['Duplicate_Records_Overwrite_Info'].$dup_ow_count; + $imported_records -= $dup_ow_count; + } + } + else + $dup_info = ""; + + if($imported_records < 0) $imported_records = 0; + + $message= urlencode("".$mod_strings['LBL_SUCCESS'].""."

    " .$mod_strings['LBL_SUCCESS_1']." $imported_records" ."

    " .$mod_strings['LBL_SKIPPED_1']." $skip_required_count

    ".$dup_info ); + } else { + $module = 'Import'; + $action = 'ImportStep3'; + } +?> + + + +'.$start.' '.$mod_strings['to'].' '.$end.' '.$mod_strings['of'].' '.$totalnoofrows.' '.$mod_strings['are_imported_succesfully']; + //return $_SESSION['import_display_message']; +} + +function is_record_exist($module,$focus) +{ + global $adb; + global $dup_ow_count; + $dup_check_type = $_REQUEST['dup_type']; + $auto_dup_type = ""; + $sec_parameter = ""; + if($dup_check_type == 'auto') + { + $auto_dup_type = $_REQUEST['auto_type']; + } + if($auto_dup_type == "ignore") + { + $sec_parameter = getSecParameterforMerge($module); + if($module == "Leads") + { + $sel_qry = "select count(*) as count from vtiger_leaddetails + inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_leaddetails.leadid + inner join vtiger_leadsubdetails on vtiger_leaddetails.leadid = vtiger_leadsubdetails.leadsubscriptionid + inner join vtiger_leadaddress on vtiger_leadaddress.leadaddressid = vtiger_leaddetails.leadid + left join vtiger_leadscf on vtiger_leadscf.leadid = vtiger_leaddetails.leadid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid + where vtiger_crmentity.deleted = 0 AND vtiger_leaddetails.converted = 0 $sec_parameter"; + } + else if($module == "Accounts") + { + $sel_qry = "SELECT count(*) as count FROM vtiger_account + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_account.accountid + INNER JOIN vtiger_accountbillads ON vtiger_account.accountid = vtiger_accountbillads.accountaddressid + INNER JOIN vtiger_accountshipads ON vtiger_account.accountid = vtiger_accountshipads.accountaddressid + LEFT JOIN vtiger_accountscf ON vtiger_account.accountid = vtiger_accountscf.accountid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid + WHERE vtiger_crmentity.deleted = 0 $sec_parameter"; + } + else if($module == "Contacts") + { + $sel_qry = "SELECT count(*) as count FROM vtiger_contactdetails + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_contactdetails.contactid + INNER JOIN vtiger_contactaddress ON vtiger_contactaddress.contactaddressid = vtiger_contactdetails.contactid + INNER JOIN vtiger_contactsubdetails ON vtiger_contactsubdetails.contactsubscriptionid = vtiger_contactdetails.contactid + LEFT JOIN vtiger_contactscf ON vtiger_contactscf.contactid = vtiger_contactdetails.contactid + LEFT JOIN vtiger_customerdetails ON vtiger_customerdetails.customerid=vtiger_contactdetails.contactid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid + WHERE vtiger_crmentity.deleted = 0 $sec_parameter"; + } + else if($module == "Products") + { + $sel_qry = "SELECT count(*) as count FROM vtiger_products + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_products.productid + LEFT JOIN vtiger_productcf ON vtiger_productcf.productid = vtiger_products.productid + WHERE vtiger_crmentity.deleted = 0 "; + } + else if($module == "Vendors") + { + $sel_qry = "select count(*) as count from vtiger_vendor + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_vendor.vendorid + LEFT JOIN vtiger_vendorcf ON vtiger_vendorcf.vendorid = vtiger_vendor.vendorid + WHERE vtiger_crmentity.deleted = 0"; + } else { + $sel_qry = "select count(*) as count from $focus->table_name + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = $focus->table_name.$focus->table_index"; + // Consider custom table join as well. + if(isset($focus->customFieldTable)) { + $sel_qry .= " INNER JOIN ".$focus->customFieldTable[0]." ON ".$focus->customFieldTable[0].'.'.$focus->customFieldTable[1] . + " = $focus->table_name.$focus->table_index"; + } + $sel_qry .= " LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id + WHERE vtiger_crmentity.deleted = 0 $sec_parameter"; + } + $sel_qry .= get_where_clause($module,$focus->column_fields); + $result = $adb->query($sel_qry); + $cnt = $adb->query_result($result,0,"count"); + if($cnt > 0) + return true; + else + return false; + } + else if($auto_dup_type == "overwrite") + { + return overwrite_duplicate_records($module,$focus); + } + else + return false; +} +//function to get the where clause for the duplicate - select query +function get_where_clause($module,$column_fields) { + global $current_user, $dup_ow_count, $adb; + $where_clause = ""; + $field_values_array=getFieldValues($module); + $field_values=$field_values_array['fieldnames_list']; + $tblname_field_arr = explode(",",$field_values); + $uitype_arr = $field_values_array['fieldname_uitype']; + + $focus = CRMEntity::getInstance($module); + + foreach($tblname_field_arr as $val) { + list($tbl,$col,$fld) = explode(".",$val); + $col_name = $tbl ."." . $col; + $field_value=$column_fields[$fld]; + + if($fld == $focus->table_index && $column_fields[$focus->table_index] !='' && !is_integer($column_fields[$focus->table_index])) { + $field_value = getEntityId($module, $column_fields[$focus->table_index]); + } + + if(is_uitype($uitype_arr[$fld],'_users_list_') && $field_value == '') { + $field_value = $current_user->id; + } + $where_clause .= " AND ifnull(". $adb->sql_escape_string($col_name) .",'') = ifnull('". $adb->sql_escape_string($field_value) ."','') "; + } + return $where_clause; +} +//function to overwrite the existing duplicate records with the importing record's values +function overwrite_duplicate_records($module,$focus) +{ + global $adb; + global $dup_ow_count; + global $process_fields; + + $where_clause = ""; + $where = get_where_clause($module,$focus->column_fields); + $sec_parameter = getSecParameterforMerge($module); + if($module == "Leads") + { + $sel_qry = "select vtiger_leaddetails.leadid from vtiger_leaddetails + inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_leaddetails.leadid + inner join vtiger_leadsubdetails on vtiger_leaddetails.leadid = vtiger_leadsubdetails.leadsubscriptionid + inner join vtiger_leadaddress on vtiger_leadaddress.leadaddressid = vtiger_leaddetails.leadid + left join vtiger_leadscf on vtiger_leadscf.leadid = vtiger_leaddetails.leadid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid + where vtiger_crmentity.deleted = 0 AND vtiger_leaddetails.converted = 0 $where $sec_parameter order by vtiger_leaddetails.leadid ASC"; + } + else if($module == "Accounts") + { + $sel_qry = "SELECT vtiger_account.accountid FROM vtiger_account + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_account.accountid + INNER JOIN vtiger_accountbillads ON vtiger_account.accountid = vtiger_accountbillads.accountaddressid + INNER JOIN vtiger_accountshipads ON vtiger_account.accountid = vtiger_accountshipads.accountaddressid + LEFT JOIN vtiger_accountscf ON vtiger_account.accountid = vtiger_accountscf.accountid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid + WHERE vtiger_crmentity.deleted = 0 $where $sec_parameter order by vtiger_account.accountid ASC"; + } + else if($module == "Contacts") + { + $sel_qry = "SELECT vtiger_contactdetails.contactid FROM vtiger_contactdetails + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_contactdetails.contactid + INNER JOIN vtiger_contactaddress ON vtiger_contactaddress.contactaddressid = vtiger_contactdetails.contactid + INNER JOIN vtiger_contactsubdetails ON vtiger_contactsubdetails.contactsubscriptionid = vtiger_contactdetails.contactid + LEFT JOIN vtiger_contactscf ON vtiger_contactscf.contactid = vtiger_contactdetails.contactid + LEFT JOIN vtiger_customerdetails ON vtiger_customerdetails.customerid=vtiger_contactdetails.contactid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid + WHERE vtiger_crmentity.deleted = 0 $where $sec_parameter order by vtiger_contactdetails.contactid ASC"; + } + else if($module == "Products") + { + $sel_qry = "SELECT vtiger_products.productid FROM vtiger_products + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_products.productid + LEFT JOIN vtiger_productcf ON vtiger_productcf.productid = vtiger_products.productid + WHERE vtiger_crmentity.deleted = 0 $where order by vtiger_products.productid ASC"; + } + else if($module == "Vendors") + { + $sel_qry = "SELECT vtiger_vendor.vendorid FROM vtiger_vendor + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_vendor.vendorid + LEFT JOIN vtiger_vendorcf ON vtiger_vendorcf.vendorid = vtiger_vendor.vendorid + WHERE vtiger_crmentity.deleted = 0 $where order by vtiger_vendor.vendorid ASC"; + } + else { + $sel_qry = "SELECT $focus->table_name.$focus->table_index FROM $focus->table_name + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = $focus->table_name.$focus->table_index"; + // Consider custom table join as well. + if(isset($focus->customFieldTable)) { + $sel_qry .= " INNER JOIN ".$focus->customFieldTable[0]." ON ".$focus->customFieldTable[0].'.'.$focus->customFieldTable[1] . + " = $focus->table_name.$focus->table_index"; + } + $sel_qry .= " LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id + WHERE vtiger_crmentity.deleted = 0 $where $sec_parameter order by $focus->table_name.$focus->table_index ASC"; + } + $result = $adb->query($sel_qry); + $no_rows = $adb->num_rows($result); + // now do any special processing for ex., map account with contact and potential + $focus->process_special_fields(); + $process_fields='true'; + $moduleObj = new $module(); + if($no_rows > 0) + { + for($i=0;$i<$no_rows;$i++) + { + $id_field = $moduleObj->table_index; + $id_value = $adb->query_result($result,$i,$id_field); + if($i == 0) + { + $moduleObj->mode = "edit"; + $moduleObj->id = $id_value; + $moduleObj->column_fields = $focus->column_fields; + $moduleObj->save($module); + } + else{ + DeleteEntity($module,$module,$moduleObj,$id_value,""); + } + } + $dup_ow_count = $dup_ow_count+$no_rows; + return true; + } + else + return false; +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/ImportStep1.php b/oss/vtiger/trunk/modules/Import/ImportStep1.php new file mode 100644 index 00000000..f88ea776 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportStep1.php @@ -0,0 +1,104 @@ +info($mod_strings['LBL_MODULE_NAME'] . " Upload Step 1"); + +$smarty = new vtigerCRM_Smarty; + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("IMP", $import_mod_strings); + +$smarty->assign("CATEGORY", htmlspecialchars($_REQUEST['parenttab'],ENT_QUOTES,$default_charset)); + +$import_object_array = Array( + "Leads"=>"ImportLead", + "Accounts"=>"ImportAccount", + "Contacts"=>"ImportContact", + "Potentials"=>"ImportOpportunity", + "Products"=>"ImportProduct", + "HelpDesk"=>"ImportTicket", + "Vendors"=>"ImportVendors" + ); + +if(isset($_REQUEST['module']) && $_REQUEST['module'] != '') +{ + $object_name = $import_object_array[$_REQUEST['module']]; + // vtlib customization: Hook added to enable import for un-mapped modules + $module = $_REQUEST['module']; + if($object_name == null) { + checkFileAccess("modules/$module/$module.php"); + require_once("modules/$module/$module.php"); + $object_name = $module; + $callInitImport = true; + } + // END + $focus = new $object_name(); + // vtlib customization: Call the import initializer + if($callInitImport) $focus->initImport($module); + // END +} +else +{ + echo "Sorry! Import Option is not provided for this module."; + exit; +} + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +$smarty->assign("HEADER", $app_strings['LBL_IMPORT']." ". $mod_strings['LBL_MODULE_NAME']); +$smarty->assign("HAS_HEADER_CHECKED"," CHECKED"); + +$smarty->assign("MODULE", $_REQUEST['module']); +$smarty->assign("MODULELABEL", getTranslatedString($_REQUEST['module'],$_REQUEST['module'])); +$smarty->assign("SOURCE", $_REQUEST['source']); + +//we have set this as default. upto 4.2.3 we have Outlook, Act, SF formats. but now CUSTOM is enough to import +$lang_key = "CUSTOM"; +$smarty->assign("INSTRUCTIONS_TITLE",$mod_strings["LBL_IMPORT_{$lang_key}_TITLE"]); + +for($i = 1; isset($mod_strings["LBL_{$lang_key}_NUM_$i"]);$i++) +{ + $smarty->assign("STEP_NUM",$mod_strings["LBL_NUM_$i"]); + $smarty->assign("INSTRUCTION_STEP",$mod_strings["LBL_{$lang_key}_NUM_$i"]); +} + +$smarty->display("ImportStep1.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/ImportStep2.php b/oss/vtiger/trunk/modules/Import/ImportStep2.php new file mode 100644 index 00000000..60f71dbf --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportStep2.php @@ -0,0 +1,459 @@ + $upload_maxsize) +{ + show_error_import( $mod_strings['LBL_IMPORT_MODULE_ERROR_LARGE_FILE'] . " ". $upload_maxsize. " ". $mod_strings['LBL_IMPORT_MODULE_ERROR_LARGE_FILE_END']); + exit; +} +if( !is_writable( $import_dir )) +{ + show_error_import($mod_strings['LBL_IMPORT_MODULE_NO_DIRECTORY'].$import_dir.$mod_strings['LBL_IMPORT_MODULE_NO_DIRECTORY_END']); + exit; +} + +$tmp_file_name = $import_dir. "IMPORT_".$current_user->id; + +move_uploaded_file($_FILES['userfile']['tmp_name'], $tmp_file_name); + +// Convert ISO-8859 file (as saved by MS Excel) into UTF-8 to preserve umlauts and accents +if ($_REQUEST["format"] != "UTF-8") +{ + $fh = fopen($tmp_file_name,"r"); + $content = fread($fh, filesize($tmp_file_name)); + fclose($fh); + + if (function_exists("mb_convert_encoding")) + { + $content = mb_convert_encoding($content, 'UTF-8', $_REQUEST["format"]); + } else { + $content = iconv('UTF-8', $_REQUEST["format"], $content); + } + + $fh = fopen($tmp_file_name,"w"); + fwrite($fh, $content); + fclose($fh); +} + +// Now parse the file and look for errors +$ret_value = 0; + +if ($_REQUEST['source'] == 'act') +{ + $ret_value = parse_import_act($tmp_file_name,$delimiter,$max_lines,$has_header); +} +else +{ + $ret_value = parse_import($tmp_file_name,$delimiter,$max_lines,$has_header); +} + +if ($ret_value == -1) +{ + show_error_import( $mod_strings['LBL_CANNOT_OPEN'] ); + exit; +} +else if ($ret_value == -2) +{ + show_error_import( $mod_strings['LBL_NOT_SAME_NUMBER'] ); + exit; +} +else if ( $ret_value == -3 ) +{ + show_error_import( $mod_strings['LBL_NO_LINES'] ); + exit; +} + +$rows = $ret_value['rows']; +$ret_field_count = $ret_value['field_count']; + +$smarty = new vtigerCRM_Smarty; + +$smarty->assign("TMP_FILE", $tmp_file_name ); +$smarty->assign("SOURCE", vtlib_purify($_REQUEST['source'])); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +$smarty->assign("HEADER", $app_strings['LBL_IMPORT']." ". $mod_strings['LBL_MODULE_NAME']); +$smarty->assign("HASHEADER", $has_header); + +$import_object_array = Array( + "Leads"=>"ImportLead", + "Accounts"=>"ImportAccount", + "Contacts"=>"ImportContact", + "Potentials"=>"ImportOpportunity", + "Products"=>"ImportProduct", + "HelpDesk"=>"ImportTicket", + "Vendors"=>"ImportVendors" + ); + +if(isset($_REQUEST['module']) && $_REQUEST['module'] != '') +{ + $object_name = $import_object_array[$_REQUEST['module']]; + // vtlib customization: Hook added to enable import for un-mapped modules + $module = $_REQUEST['module']; + if($object_name == null) { + checkFileAccess("modules/$module/$module.php"); + require_once("modules/$module/$module.php"); + $object_name = $module; + $callInitImport = true; + } + // END + $focus = new $object_name(); + // vtlib customization: Call the import initializer + if($callInitImport) $focus->initImport($module); + //initialized the required fields,used to check for mandatory fields while importing + $focus->initRequiredFields($module); + // END +} +else +{ + $focus = new ImportContact(); +} + + +$total_num_rows=sizeof($rows); +$firstrow = $rows[0]; +if($total_num_rows >1 ) +{ + $secondrow = $rows[1]; +} +if($total_num_rows >2) +{ + $thirdrow = $rows[2]; +} + +//If the cell value is very large then UI mapping will be collpased. So we will display partial text +foreach($firstrow as $ind => $val) +{ + if(strlen($val) > 30) + $firstrow[$ind] = substr(to_html($val),0,30)." .........."; + else + $firstrow[$ind] = to_html($val); +} +if (isset($secondrow)) { //Asha: Fix for ticket #4432 + foreach($secondrow as $ind => $val) + { + if(strlen($val) > 30) + $secondrow[$ind] = substr(to_html($val),0,30)." .........."; + else + $secondrow[$ind] = to_html($val); + + } + if (isset($thirdrow)) { //Asha: Fix for ticket #4432 + foreach($thirdrow as $ind => $val) + { + if(strlen($val) > 30) + $thirdrow[$ind] = substr(to_html($val),0,30)." .........."; + else + $thirdrow[$ind] = to_html($val); + } + } +} + +$field_map = $outlook_contacts_field_map; + +$mapping_file = new ImportMap(); +$saved_map_lists = $mapping_file->getSavedMappingsList($_REQUEST['return_module']); +$map_list_combo = ''; +//This link is Delete link for the selected mapping +$map_list_combo .= "   "; +$smarty->assign("SAVED_MAP_LISTS",$map_list_combo); + + +if ( count($mapping_arr) > 0){ + $field_map = &$mapping_arr; +}else if ($_REQUEST['source'] == 'other'){ + if ($_REQUEST['module'] == 'Contacts'){ + $field_map = $outlook_contacts_field_map; + }else if ($_REQUEST['module'] == 'Accounts'){ + $field_map = $outlook_accounts_field_map; + }else if ($_REQUEST['module'] == 'Potentials'){ + $field_map = $salesforce_opportunities_field_map; + } +} + +$add_one = 1; +$start_at = 0; + +if($has_header){ + $add_one = 0; + $start_at = 1; +} + +for($row_count = $start_at; $row_count < count($rows); $row_count++){ + $smarty->assign("ROWCOUNT", $row_count + $add_one); +} + +$list_string_key = strtolower($_REQUEST['module']); +$list_string_key .= "_import_fields"; + +//Now we are getting the import fields from DB instead of hard coded array $mod_list_strings +$translated_column_fields = getImportFieldsList($_REQUEST['module']);//$mod_list_strings[$list_string_key]; + +$cnt=1; +for($field_count = 0; $field_count < $ret_field_count; $field_count++){ + + $smarty->assign("COLCOUNT", $field_count + 1); + $suggest = ""; + + if($_REQUEST['module']=='Accounts'){ + $tablename='account'; + $focus1=new Accounts(); + } + if($_REQUEST['module']=='Contacts'){ + $tablename='contactdetails'; + $focus1=new Contacts(); + } + if($_REQUEST['module']=='Leads'){ + $tablename='leaddetails'; + $focus1=new Leads(); + } + if($_REQUEST['module']=='Potentials'){ + $tablename='potential'; + $focus1=new Potentials(); + } + if($_REQUEST['module']=='Products'){ + $tablename='products'; + $focus1=new Products(); + } + if($_REQUEST['module']=='HelpDesk'){ + $tablename='troubletickets'; + $focus1=new HelpDesk(); + } + if($_REQUEST['module']=='Vendors'){ + $tablename='Vendors'; + $focus1=new Vendors(); + } + + // vtlib customization: Hook to provide generic import for other modules + if($_REQUEST['module']) { + $focus1 = CRMEntity::getInstance($_REQUEST['module']); + $tablename = $focus->table_name; + } + // END + + $smarty->assign("FIRSTROW",$firstrow); + $smarty->assign("SECONDROW",$secondrow); + $smarty->assign("THIRDROW",$thirdrow); + $smarty_array[$field_count + 1] = getFieldSelect( $focus->importable_fields, + $field_count, + $focus->required_fields, + $suggest, + $translated_column_fields, + $tablename + ); + + $pos = 0; + foreach($rows as $row ){ + if( isset($row[$field_count]) && $row[$field_count] != ''){ + $smarty->assign("CELL",htmlspecialchars($row[$field_count])); + } + $cnt++; + } +} +@session_unregister('import_delimiter'); +@session_unregister('import_has_header'); +@session_unregister('import_firstrow'); +@session_unregister('import_field_map'); +@session_unregister('import_module_object_column_fields'); +@session_unregister('import_module_field_count'); +@session_unregister('import_module_object_required_fields'); +@session_unregister('import_module_translated_column_fields'); +$_SESSION['import_delimiter'] = $delimiter; +$_SESSION['import_has_header'] = $has_header; +$_SESSION['import_firstrow'] = $firstrow; +$_SESSION['import_field_map'] = $field_map; +$_SESSION['import_module_object_column_fields'] = $focus->importable_fields; +$_SESSION['import_module_field_count'] = $field_count; +$_SESSION['import_module_object_required_fields'] = $focus1->required_fields; +$_SESSION['import_module_translated_column_fields'] = $translated_column_fields; + +$smarty->assign("SELECTFIELD",$smarty_array); +$smarty->assign("ROW", $row); + +$module_key = "LBL_".strtoupper($_REQUEST['module'])."_NOTE_"; + +for ($i = 1;isset($mod_strings[$module_key.$i]);$i++){ + $smarty->assign("NOTETEXT", $mod_strings[$module_key.$i]); +} + +if($has_header){ + $smarty->assign("HAS_HEADER", 'on'); +}else{ + $smarty->assign("HAS_HEADER", 'off'); +} + +$smarty->assign("AVALABLE_FIELDS", getMergeFields($module,"available_fields")); +$smarty->assign("FIELDS_TO_MERGE", getMergeFields($module,"fileds_to_merge")); +if(isPermitted($module,'DuplicatesHandling','') == 'yes'){ + $smarty->assign("DUPLICATESHANDLING", 'DuplicatesHandling'); +} + +$smarty->assign("MODULE", vtlib_purify($_REQUEST['module'])); +$smarty->assign("MODULELABEL", getTranslatedString($_REQUEST['module'],$_REQUEST['module'])); +$parenttab = getParentTab(); +$smarty->assign('CATEGORY' , $parenttab); +$_SESSION['import_parenttab'] = $parenttab; +$smarty->assign("JAVASCRIPT2", get_readonly_js() ); + +$smarty->display('ImportStep2.tpl'); + +?> + diff --git a/oss/vtiger/trunk/modules/Import/ImportStep3.php b/oss/vtiger/trunk/modules/Import/ImportStep3.php new file mode 100644 index 00000000..702d4ba1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportStep3.php @@ -0,0 +1,317 @@ +println("IMP :".$str); +} + +function implode_assoc($inner_delim, $outer_delim, $array){ + $output = array(); + foreach( $array as $key => $item ){ + $output[] = $key . $inner_delim . $item; + } + return implode($outer_delim, $output); +} + +global $mod_strings; +global $app_list_strings; +global $app_strings; +global $current_user; +global $import_file_name; +global $theme; +global $upload_maxsize; +global $site_URL; + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Upload Step 3"); + +include("include/saveMergeCriteria.php"); + +$delimiter = ','; +// file handle +$count = 0; +$error = ""; +$col_pos_to_field = array(); +$header_to_field = array(); +$field_to_pos = array(); +$focus = 0; +$current_bean_type = ""; +$id_exists_count = 0; +$broken_ids = 0; + +$delimiter = $_SESSION['import_delimiter']; + +$has_header = 0; + +if(isset( $_REQUEST['has_header']) && $_REQUEST['has_header'] == 'on'){ + $has_header = 1; +} + +if($_REQUEST['modulename'] != ''){ + $_REQUEST['module'] = vtlib_purify($_REQUEST['modulename']); +} + +$import_object_array = Array( + "Leads"=>"ImportLead", + "Accounts"=>"ImportAccount", + "Contacts"=>"ImportContact", + "Potentials"=>"ImportOpportunity", + "Products"=>"ImportProduct", + "HelpDesk"=>"ImportTicket", + "Vendors"=>"ImportVendors" + ); + +if(isset($_REQUEST['module']) && $_REQUEST['module'] != ''){ + $current_bean_type = $import_object_array[$_REQUEST['module']]; + // vtlib customization: Hook added to enable import for un-mapped modules + $module = $_REQUEST['module']; + if($current_bean_type == null) { + checkFileAccess("modules/$module/$module.php"); + require_once("modules/$module/$module.php"); + $current_bean_type = $module; + $callInitImport = true; + } + // END +}else{ + $current_bean_type = "ImportContact"; +} + +$focus = new $current_bean_type(); +// vtlib customization: Call the import initializer +if($callInitImport) $focus->initImport($module); +// END + +//Constructing the custom vtiger_field Array +require_once('include/CustomFieldUtil.php'); +$custFldArray = getCustomFieldArray($_REQUEST['module']); +p("IMP 3: custFldArray"); +p($custFldArray); + +//Initializing an empty Array to store the custom vtiger_field Column Name and Value +$resCustFldArray = Array(); + +p("Getting from request"); +// loop through all request variables +foreach ($_REQUEST as $name=>$value){ + p("name=".$name." value=".$value); + // only look for var names that start with "colnum" + if ( strncasecmp( $name, "colnum", 6) != 0 ){ + continue; + } + if ($value == "-1"){ + continue; + } + + $user_field = $value; + $pos = substr($name,6); + + if ( isset( $field_to_pos[$user_field]) ){ + show_error_import($mod_strings['LBL_ERROR_MULTIPLE']); + exit; + } + + p("user_field=".$user_field." if=".$focus->importable_fields[$user_field]); + + if ( isset( $focus->importable_fields[$user_field] ) || isset( $custFldArray[$user_field] )){ + p("user_field SET=".$user_field); + $field_to_pos[$user_field] = $pos; + $col_pos_to_field[$pos] = $user_field; + } +} + +p("field_to_pos"); +$adb->println($field_to_pos); +p("col_pos_to_field"); +$adb->println($col_pos_to_field); + +$max_lines = -1; +$ret_value = 0; + +if(isset($_REQUEST['tmp_file'])) { + $_SESSION['tmp_file'] = vtlib_purify($_REQUEST['tmp_file']); +} else { + $_REQUEST['tmp_file'] = vtlib_purify($_SESSION['tmp_file']); +} +// End + +if ($_REQUEST['source'] == 'act'){ + $ret_value = parse_import_act($_REQUEST['tmp_file'],$delimiter,$max_lines,$has_header); +}else{ + $ret_value = parse_import($_REQUEST['tmp_file'],$delimiter,$max_lines,$has_header); +} + +$datarows = $ret_value['rows']; + +$ret_field_count = $ret_value['field_count']; + +//we have to get all picklist entries and add with the corresponding picklist table +if(isset($datarows) && is_array($datarows)){ + //This file will be included only once at the first time. Will not be included when we redirect from ImportSave + include("modules/Import/picklist_addition.php"); +} + +$saved_ids = array(); + +$firstrow = 0; + +if (! isset($datarows)){ + $error = $mod_strings['LBL_FILE_ALREADY_BEEN_OR']; + $datarows = array(); +} + +if ($has_header == 1){ + $firstrow = array_shift($datarows); +} + +//Mark the last imported records as deleted which are imported by the current user in vtiger_users_last_import vtiger_table +if(!isset($_REQUEST['startval'])){ + $seedUsersLastImport = new UsersLastImport(); + $seedUsersLastImport->mark_deleted_by_user_id($current_user->id); +} +$skip_required_count = 0; + +p("processing started ret_field_count=".$ret_field_count); +$adb->println($datarows); + +$error = ''; +$focus = new $current_bean_type(); +$focus->initRequiredFields($module); + +// SAVE MAPPING IF REQUESTED +if(isset($_REQUEST['save_map']) && $_REQUEST['save_map'] == 'on' && isset($_REQUEST['save_map_as']) && $_REQUEST['save_map_as'] != ''){ + p("save map"); + $serialized_mapping = ''; + + if( $has_header){ + foreach($col_pos_to_field as $pos=>$field_name){ + if ( isset($firstrow[$pos]) && isset( $field_name)){ + $header_to_field[ $firstrow[$pos] ] = $field_name; + } + } + $serialized_mapping = implode_assoc("=","&",$header_to_field); + }else{ + $serialized_mapping = implode_assoc("=","&",$col_pos_to_field); + } + + $mapping_file_name = $_REQUEST['save_map_as']; + $mapping_file = new ImportMap(); + + $result = $mapping_file->save_map( $current_user->id, + $mapping_file_name, + $_REQUEST['module'], + $has_header, + $serialized_mapping ); + + $adb->println("Save map done"); + $adb->println($result); +} +//save map - ends + +if(isset($_SESSION['totalrows']) && $_SESSION['totalrows'] != ''){ + $xrows = $_SESSION['totalrows']; +}else{ + $xrows = $datarows; +} +if(isset($_SESSION['return_field_count'])){ + $ret_field_count = $_SESSION['return_field_count']; +} +if(isset($_SESSION['column_position_to_field'])){ + $col_pos_to_field = $_SESSION['column_position_to_field']; +} +if($xrows != ''){ + $datarows = $xrows; +} +if($_REQUEST['skipped_record_count'] != ''){ + $skipped_record_count = vtlib_purify($_REQUEST['skipped_record_count']); +}else{ + $_REQUEST['skipped_record_count'] = 0; +} + +if($_REQUEST['noofrows'] != ''){ + $totalnoofrows = vtlib_purify($_REQUEST['noofrows']); +}else{ + $totalnoofrows = count($datarows); +} + +$loopcount = ($totalnoofrows/$RECORDCOUNT)+1; + +if($_REQUEST['startval'] != ''){ + $START = vtlib_purify($_REQUEST['startval']); +}else{ + $START = vtlib_purify($_SESSION['startval']); +} + +if($_REQUEST['recordcount'] != ''){ + $RECORDCOUNT = vtlib_purify($_REQUEST['recordcount']); +}else{ + $RECORDCOUNT = vtlib_purify($_SESSION['recordcount']); +} + +if(($START+$RECORDCOUNT) > $totalnoofrows){ + $RECORDCOUNT = $totalnoofrows - $START; +} + +$focus->initImportableFields($module); +if($totalnoofrows > $RECORDCOUNT && $START < $totalnoofrows){ + $rows1 = Array(); + for($j=$START;$j<$START+$RECORDCOUNT;$j++){ + $rows1[] = $datarows[$j]; + } + + $res = InsertImportRecords($datarows,$rows1,$focus,$ret_field_count,$col_pos_to_field,$START,$RECORDCOUNT,vtlib_purify($_REQUEST['module']),$totalnoofrows,$skipped_record_count); + if($START != 0){ + echo ''.$res.''; + } + + $count = vtlib_purify($_REQUEST['count']); +}else{ + if($START == 0){ + $res = InsertImportRecords($datarows,$datarows,$focus,$ret_field_count,$col_pos_to_field,$START,$totalnoofrows,vtlib_purify($_REQUEST['module']),$totalnoofrows,$skipped_record_count); + } +} + +//Display the imported records message +echo "
    ".$_SESSION['import_display_message']."
    "; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/ImportSteplast.php b/oss/vtiger/trunk/modules/Import/ImportSteplast.php new file mode 100644 index 00000000..578e8032 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportSteplast.php @@ -0,0 +1,305 @@ +info("Import Step last"); + +$parenttab = getParenttab(); +//This Buttons_List1.tpl is is called to display the add, search, import and export buttons ie., second level tabs +$smarty = new vtigerCRM_Smarty; + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("IMP", $import_mod_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +$smarty->assign("MODULE", vtlib_purify($_REQUEST['modulename'])); +$smarty->assign("SINGLE_MOD", vtlib_purify($_REQUEST['modulename'])); +$smarty->assign("CATEGORY", vtlib_purify($_SESSION['import_parenttab'])); +//@session_unregister("import_parenttab"); +if($req_module != 'Accounts' || $req_module != 'Contacts' || $req_module != 'Products' || $req_module != 'Leads' || $req_module != 'HelpDesk' || $req_module != 'Potentials' || $req_module != 'Vendors' ) +{ + $smarty->display("Buttons_List1.tpl"); +} + +if ( isset($_REQUEST['message'])) +{ + ?> +
    + + + + + + + + + + + + + + + +
    + +
     
    + +   + +   + + +
    + +


    + + + + +
    + + + + + + + + + + + + +
    + + + + +
    +
    + + + + + + + + +
    + "; + $return_module=vtlib_purify($_REQUEST['modulename']); + + $ret_arr=getDuplicateRecordsArr($req_module); + $fld_values=$ret_arr[0]; + $total_num_group=count($fld_values); + $fld_name=$ret_arr[1]; + + $smarty->assign("MODULE",$req_module); + $smarty->assign("MODULELABEL",getTranslatedString($req_module,$req_module)); + $smarty->assign("NUM_GROUP",$total_num_group); + $smarty->assign("FIELD_NAMES",$fld_name); + $smarty->assign("CATEGORY",$parenttab); + $smarty->assign("ALL_VALUES",$fld_values); + $smarty->assign("MOD", return_module_language($current_language,'Contacts')); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("APP", $app_strings); + $smarty->assign("CMOD", $mod_strings); + $smarty->assign("MODE",'view'); + $smarty->assign("NAVIGATION",$ret_arr["navigation"]);//Added for page navigation + if(isPermitted($req_module,'Delete','') == 'yes') + $button_del = $app_strings[LBL_MASS_DELETE]; + $smarty->assign("DELETE",$button_del); + if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("FindDuplicateAjax.tpl"); + else + $smarty->display('FindDuplicateDisplay.tpl'); +} +else +{ + echo "

    "; + $currentModule = "Import"; + global $limit; + global $list_max_entries_per_page; + $implict_account = false; + $import_modules_array = Array( + "Leads"=>"Leads", + "Accounts"=>"Accounts", + "Contacts"=>"Contacts", + "Potentials"=>"Potentials", + "Products"=>"Products", + "HelpDesk"=>"ImportTicket", + "Vendors"=>"ImportVendors" + ); + + // vtlib customization: Hook provide to include custom modules + $module = $_REQUEST['modulename']; + checkFileAccess("modules/$module/$module.php"); + require_once("modules/$module/$module.php"); + $import_modules_array[$module] = $module; + // END + + foreach($import_modules_array as $module_name => $object_name) + { + $seedUsersLastImport = new UsersLastImport(); + $seedUsersLastImport->bean_type = $module_name; + $list_query = $seedUsersLastImport->create_list_query($o,$w); + $current_module_strings = return_module_language($current_language, $module_name); + + $object = new $object_name(); + $seedUsersLastImport->list_fields = $object->list_fields; + + $list_result = $adb->query($list_query); + //Retreiving the no of rows + $noofrows = $adb->num_rows($list_result); + + if($noofrows>=1) + { + if($module_name != 'Accounts') + { + $implict_account=true; + } + + if($module_name == 'Accounts' && $implict_account==true) + $display_header_msg = "Newly created Accounts"; + else + $display_header_msg = "".$mod_strings['LBL_LAST_IMPORTED']." ".$app_strings[$module_name].""; + + //Display the Header Message + echo " + + + + +
    + ".$mod_strings['LBL_LAST_IMPORTED']." ".$app_strings[$module_name]." +
    + "; + + $smarty = new vtigerCRM_Smarty; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("MODULE",$module_name); + $smarty->assign("MODULELABEL",getTranslatedString($module_name,$module_name)); + $smarty->assign("SINGLE_MOD",$module_name); + $smarty->assign("SHOW_MASS_SELECT",'false'); + + //Retreiving the start value from request + if($module_name == $_REQUEST['nav_module'] && isset($_REQUEST['start']) && $_REQUEST['start'] != '') { + $start = vtlib_purify($_REQUEST['start']); + } else { + $start = 1; + } + + $info_message='&recordcount='.vtlib_purify($_REQUEST['recordcount']).'&noofrows='.vtlib_purify($_REQUEST['noofrows']).'&message='.vtlib_purify($_REQUEST['message']).'&skipped_record_count='.vtlib_purify($_REQUEST['skipped_record_count']); + $url_string = '&modulename='.vtlib_purify($_REQUEST['modulename']).'&nav_module='.$module_name.$info_message; + $viewid = ''; + + //Retreive the Navigation array + $navigation_array = getNavigationValues($start, $noofrows, $list_max_entries_per_page); + $navigationOutput = getTableHeaderNavigation($navigation_array, $url_string,"Import","ImportSteplast",$viewid); + + //Retreive the List View Header and Entries + $listview_header = getListViewHeader($object,$module_name); + $listview_entries = getListViewEntries($object,$module_name,$list_result,$navigation_array,"","","EditView","Delete",""); + //commented to remove navigation buttons from import list view + //$smarty->assign("NAVIGATION", $navigationOutput); + $smarty->assign("HIDE_CUSTOM_LINKS", 1);//Added to hide the CustomView links in imported records ListView + + // Remove all the links for the list view header as they do not work in this page. + for($i=0;$iassign("LISTHEADER", $listview_header); + $smarty->assign("LISTENTITY", $listview_entries); + + $smarty->display("ListViewEntries.tpl"); + echo "
    "; + } + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/ImportStepundo.php b/oss/vtiger/trunk/modules/Import/ImportStepundo.php new file mode 100644 index 00000000..fce7afe8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportStepundo.php @@ -0,0 +1,129 @@ +info("Import Undo"); +$last_import = new UsersLastImport(); +$ret_value = $last_import->undo($current_user->id); + +// vtlib customization: Invoke undo import function of the module. +$module = $_REQUEST['module']; +$undo_focus = CRMEntity::getInstance($module); +if(method_exists($undo_focus, 'undo_import')) { + $ret_value += $undo_focus->undo_import($module, $current_user->id); +} +// END + +?> + +
    + + + + + + + + + + + + + + + + +
     
    + +   + +   + + +
    +
    + + " . $mod_strings['LBL_SUCCESS']."" ?>

    + + +
    + + +
    +
    +
    +
    + + + + + + + + +
    +
    + diff --git a/oss/vtiger/trunk/modules/Import/ImportTicket.php b/oss/vtiger/trunk/modules/Import/ImportTicket.php new file mode 100644 index 00000000..dfc0353c --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportTicket.php @@ -0,0 +1,136 @@ +column_fields["assigned_user_id"]; + $this->db->println("assign_user ".$ass_user." cur_user=".$current_user->id); + + if( $ass_user != $current_user->id) + { + $this->db->println("searching and assigning ".$ass_user); + + $result = $this->db->pquery("select id from vtiger_users where id = ? union select groupid as id from vtiger_groups where groupid = ?",array($ass_user, $ass_user)); + if($this->db->num_rows($result)!=1) + { + $this->db->println("not exact records setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + else + { + + $row = $this->db->fetchByAssoc($result, -1, false); + if (isset($row['id']) && $row['id'] != -1) + { + $this->db->println("setting id as ".$row['id']); + $this->column_fields["assigned_user_id"] = $row['id']; + } + else + { + $this->db->println("setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + } + } + } + function add_product() + { + global $adb,$imported_ids,$current_user; + + $pro_name = $this->column_fields['product_id']; + if((! isset($pro_name) || $pro_name == '') ) + return; + + //check if it already exists + $focus = new Products(); + $query = ''; + + //Modified to remove the spaces at first and last in vtiger_product name + $pro_name = trim($pro_name); + + //Modified the query to get the available product only ie., which is not deleted + $query = "select vtiger_products.* ,vtiger_crmentity.deleted from vtiger_products,vtiger_crmentity WHERE productname=? and vtiger_crmentity.crmid = vtiger_products.productid and vtiger_crmentity.deleted=0"; + $result = $adb->pquery($query, array($pro_name)); + $row = $this->db->fetchByAssoc($result, -1, false); + $adb->println($row); + + // we found a row with that id + if (isset($row['productid']) && $row['productid'] != -1) + $focus->id = $row['productid']; + + $this->column_fields["product_id"] = $focus->id; + } + function empty_relatedto() + { + global $adb; + $parent_name = $this->column_fields["parent_id"]; + if($parent_name == '' || $parent_name == NULL) + $parent_id = 0; + else + { //get the account + $relatedTo = explode(':',$parent_name); + $parent_module = $relatedTo[0]; $parent_module = trim($parent_module," "); + $parent_name = $relatedTo[3]; $parent_name = trim($parent_name," "); + $num_rows = 0; + if($parent_module == 'Contacts') + { + $query ="select crmid from vtiger_contactdetails, vtiger_crmentity WHERE concat(lastname,' ',firstname)=? and vtiger_crmentity.crmid =vtiger_contactdetails.contactid and vtiger_crmentity.deleted=0"; + $result = $adb->pquery($query, array($parent_name)); + $num_rows=$adb->num_rows($result); + } + else if($parent_module == 'Accounts') + { + $query = "select crmid from vtiger_account, vtiger_crmentity WHERE accountname=? and vtiger_crmentity.crmid =vtiger_account.accountid and vtiger_crmentity.deleted=0"; + $result = $adb->pquery($query, array($parent_name)); + $num_rows = $adb->num_rows($result); + } + else $num_rows=0; + if($num_rows == 0) $parent_id = 0; + else $parent_id = $adb->query_result($result,0,"crmid"); + } + $this->column_fields['parent_id'] = $parent_id; + } + /** Constructor which will set the importable_fields as $this->importable_fields[$key]=1 in this object where key is the fieldname in the field table + */ + function ImportTicket() { + parent::HelpDesk(); + $this->log = LoggerManager::getLogger('import_ticket'); + $this->db = PearDatabase::getInstance(); + $this->db->println("IMP ImportTicket"); + $this->initImportableFields("HelpDesk"); + $this->db->println($this->importable_fields); + } + + // Module Sequence Numbering + function modseq_number() { + $this->column_fields['ticket_no'] = ''; + } + // END + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/ImportVendors.php b/oss/vtiger/trunk/modules/Import/ImportVendors.php new file mode 100644 index 00000000..b3f9d1a8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/ImportVendors.php @@ -0,0 +1,80 @@ +column_fields["assigned_user_id"]; + $this->db->println("assign_user ".$ass_user." cur_user=".$current_user->id); + + if( $ass_user != $current_user->id) + { + $this->db->println("searching and assigning ".$ass_user); + + $result = $this->db->query("select id from vtiger_users where id = '".$ass_user."'"); + if($this->db->num_rows($result)!=1) + { + $this->db->println("not exact records setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + else + { + + $row = $this->db->fetchByAssoc($result, -1, false); + if (isset($row['id']) && $row['id'] != -1) + { + $this->db->println("setting id as ".$row['id']); + $this->column_fields["assigned_user_id"] = $row['id']; + } + else + { + $this->db->println("setting current userid"); + $this->column_fields["assigned_user_id"] = $current_user->id; + } + } + } + } + + /** Constructor which will set the importable_fields as $this->importable_fields[$key]=1 in this object where key is the fieldname in the field table + */ + function ImportVendors() { + parent::Vendors(); + $this->log = LoggerManager::getLogger('import_vendors'); + $this->db = PearDatabase::getInstance(); + $this->db->println("IMP ImportVendors"); + $this->initImportableFields("Vendors"); + $this->db->println($this->importable_fields); + } + + //Module Sequence Numbering + function modseq_number() { + $this->column_fields['vendor_no'] = ''; + } + // END + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/UsersLastImport.php b/oss/vtiger/trunk/modules/Import/UsersLastImport.php new file mode 100644 index 00000000..d2cc33b4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/UsersLastImport.php @@ -0,0 +1,453 @@ +log = LoggerManager::getLogger('UsersLastImport'); + $this->db = PearDatabase::getInstance(); + } + + /** function used to delete the old entries for this user + * @param int $user_id - user id to whom's last imported records to delete + * @return void + */ + function mark_deleted_by_user_id($user_id) + { + $query = "DELETE FROM $this->table_name where assigned_user_id=?"; + $this->db->pquery($query,array($user_id),true,"Error deleting last imported records: "); + } + + /** function used to get the list query of the imported records + * @param reference &$order_by - reference of the variable order_by to add with the query + * @param reference &$where - where condition to add with the query + * @return string $query - return the list query to get the imported records list + */ + function create_list_query(&$order_by, &$where) + { + global $current_user; + $query = ''; + + $this->db->println("create list bean_type = ".$this->bean_type." where = ".$where); + + if ($this->bean_type == 'Contacts') + { + $query = "SELECT distinct crmid, + vtiger_account.accountname as accountname, + vtiger_contactdetails.contactid, + vtiger_contactdetails.accountid, + vtiger_contactdetails.yahooid, + vtiger_contactdetails.firstname, + vtiger_contactdetails.lastname, + vtiger_contactdetails.phone, + vtiger_contactdetails.title, + vtiger_contactdetails.email, + vtiger_users.id as assigned_user_id, + smownerid, + case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name + FROM vtiger_contactdetails + left join vtiger_users_last_import on vtiger_users_last_import.bean_id=vtiger_contactdetails.contactid + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_contactdetails.contactid + LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid=vtiger_users.id + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + LEFT JOIN vtiger_account ON vtiger_account.accountid=vtiger_contactdetails.accountid + WHERE vtiger_users_last_import.assigned_user_id= '{$current_user->id}' + AND vtiger_users_last_import.bean_type='Contacts' + AND vtiger_users_last_import.deleted=0 AND vtiger_crmentity.deleted=0"; + + } + else if ($this->bean_type == 'Accounts') + { + $query = "SELECT distinct vtiger_account.*, vtiger_accountbillads.bill_city, + case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name, + crmid, smownerid + FROM vtiger_account + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_account.accountid + inner join vtiger_accountbillads on vtiger_crmentity.crmid=vtiger_accountbillads.accountaddressid + left join vtiger_users_last_import on vtiger_users_last_import.bean_id=vtiger_crmentity.crmid + left join vtiger_users ON vtiger_crmentity.smownerid=vtiger_users.id + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + WHERE + vtiger_users_last_import.assigned_user_id= + '{$current_user->id}' + AND vtiger_users_last_import.bean_type='Accounts' + AND vtiger_users_last_import.deleted=0 + AND vtiger_crmentity.deleted=0"; + }else if ($this->bean_type == 'Potentials'){ + $query = "SELECT distinct vtiger_account.accountid accountid, vtiger_account.accountname accountname, + case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name, vtiger_crmentity.crmid, smownerid, + vtiger_potential.* + FROM vtiger_potential + inner join vtiger_crmentity + on vtiger_crmentity.crmid=vtiger_potential.potentialid + left join vtiger_account + on vtiger_account.accountid=vtiger_potential.related_to + left join vtiger_users + ON vtiger_crmentity.smownerid=vtiger_users.id + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users_last_import + on vtiger_users_last_import.bean_id=vtiger_crmentity.crmid + where vtiger_users_last_import.assigned_user_id='{$current_user->id}' + AND vtiger_users_last_import.bean_type='Potentials' + AND vtiger_users_last_import.bean_id=vtiger_crmentity.crmid + AND vtiger_users_last_import.deleted=0 + AND vtiger_crmentity.deleted=0"; + }else if($this->bean_type == 'Leads'){ + $query = "SELECT distinct vtiger_leaddetails.*, vtiger_crmentity.crmid, vtiger_leadaddress.phone,vtiger_leadsubdetails.website, + case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name, + smownerid + FROM vtiger_leaddetails + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_leaddetails.leadid + inner join vtiger_leadaddress on vtiger_crmentity.crmid=vtiger_leadaddress.leadaddressid + inner join vtiger_leadsubdetails on vtiger_crmentity.crmid=vtiger_leadsubdetails.leadsubscriptionid + left join vtiger_users_last_import on vtiger_users_last_import.bean_id=vtiger_crmentity.crmid + left join vtiger_users ON vtiger_crmentity.smownerid=vtiger_users.id + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + WHERE + vtiger_users_last_import.assigned_user_id= + '{$current_user->id}' + AND vtiger_users_last_import.bean_type='Leads' + AND vtiger_users_last_import.deleted=0 + AND vtiger_crmentity.deleted=0"; + } + + //Pavani: Query to retrieve trouble tickets, vendors data from database + else if($this->bean_type == 'HelpDesk') + { + $query = "SELECT distinct vtiger_troubletickets.*, vtiger_crmentity.crmid, + case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name, + smownerid + FROM vtiger_troubletickets + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_troubletickets.ticketid + left join vtiger_users_last_import on vtiger_users_last_import.bean_id=vtiger_crmentity.crmid + left join vtiger_users ON vtiger_crmentity.smownerid=vtiger_users.id + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + WHERE + vtiger_users_last_import.assigned_user_id= + '{$current_user->id}' + AND vtiger_users_last_import.bean_type='HelpDesk' + AND vtiger_users_last_import.deleted=0 + AND vtiger_crmentity.deleted=0"; + } + + else if($this->bean_type == 'Vendors') + { + $query = "SELECT distinct vtiger_vendor.*, vtiger_crmentity.crmid, + case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name, + smownerid + FROM vtiger_vendor + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_vendor.vendorid + left join vtiger_users_last_import on vtiger_users_last_import.bean_id=vtiger_crmentity.crmid + left join vtiger_users ON vtiger_crmentity.smownerid=vtiger_users.id + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + WHERE + vtiger_users_last_import.assigned_user_id= + '{$current_user->id}' + AND vtiger_users_last_import.bean_type='Vendors' + AND vtiger_users_last_import.deleted=0 + AND vtiger_crmentity.deleted=0"; + } + //pavani...end + + else if($this->bean_type == 'Products') + { + $query = "SELECT vtiger_crmentity.crmid, vtiger_products.*, vtiger_productcf.* + FROM vtiger_products + INNER JOIN vtiger_crmentity + ON vtiger_crmentity.crmid = vtiger_products.productid + INNER JOIN vtiger_productcf + ON vtiger_products.productid = vtiger_productcf.productid + LEFT JOIN vtiger_vendor + ON vtiger_vendor.vendorid = vtiger_products.vendor_id + LEFT JOIN vtiger_users_last_import + ON vtiger_users_last_import.bean_id=vtiger_crmentity.crmid + LEFT JOIN vtiger_users + ON vtiger_users.id = vtiger_products.handler + WHERE + vtiger_users_last_import.assigned_user_id= '{$current_user->id}' + AND vtiger_users_last_import.bean_type='Products' + AND vtiger_users_last_import.deleted=0 + AND vtiger_crmentity.deleted = 0"; + + } + // vtlib customization: Hook for getting the query from the module class itself. + else { + require_once("modules/$this->bean_type/$this->bean_type.php"); + $bean_focus = new $this->bean_type(); + $query = $bean_focus->create_import_query($this->bean_type); + } + // END + + return $query; + + } + + /* + function list_view_parse_additional_sections(&$list_form) + { + if ($this->bean_type == "Contacts") + { + if( isset($this->yahoo_id) && $this->yahoo_id != '') + { + $list_form->parse("main.row.yahoo_id"); + } + else + { + $list_form->parse("main.row.no_yahoo_id"); + } + } + return $list_form; + + } + */ + + /** function used to delete (update deleted=1 in crmentity table) the last imported records of the current user + * @param int $user_id - user id, whose last imported records want to be deleted + * @return int $count - return the number of total deleted records (contacts, accounts, opportunities, leads and products) + */ + function undo($user_id) + { + $count = 0; + + $count += $this->undo_contacts($user_id); + $count += $this->undo_accounts($user_id); + $count += $this->undo_opportunities($user_id); + $count += $this->undo_leads($user_id); + $count += $this->undo_products($user_id); + $count += $this->undo_HelpDesk($user_id); + $count += $this->undo_Vendors($user_id); + return $count; + } + + /** function used to delete (update deleted=1 in crmentity table) the last imported contacts of the current user + * @param int $user_id - user id, whose last imported contacts want to be deleted + * @return int $count - return the number of deleted contacts + */ + function undo_contacts($user_id) + { + $count = 0; + $query1 = "select bean_id from vtiger_users_last_import where assigned_user_id=? AND bean_type='Contacts' AND deleted=0"; + $this->log->info($query1); + $result1 = $this->db->pquery($query1, array($user_id)) or die("Error getting last import for undo: ".mysql_error()); + + while ( $row1 = $this->db->fetchByAssoc($result1)) + { + $query2 = "update vtiger_crmentity set deleted=1 where crmid=?"; + $this->log->info($query2); + $result2 = $this->db->pquery($query2, array($row1['bean_id'])) or die("Error undoing last import: ".mysql_error()); + + $count++; + + } + return $count; + } + + /** function used to delete (update deleted=1 in crmentity table) the last imported leads of the current user + * @param int $user_id - user id, whose last imported leads want to be deleted + * @return int $count - return the number of deleted leads + */ + function undo_leads($user_id) + { + $count = 0; + $query1 = "select bean_id from vtiger_users_last_import where assigned_user_id=? AND bean_type='Leads' AND deleted=0"; + $this->log->info($query1); + $result1 = $this->db->pquery($query1, array($user_id)) or die("Error getting last import for undo: ".mysql_error()); + + while ( $row1 = $this->db->fetchByAssoc($result1)) + { + $query2 = "update vtiger_crmentity set deleted=1 where crmid=?"; + $this->log->info($query2); + $result2 = $this->db->pquery($query2, array($row1['bean_id'])) or die("Error undoing last import: ".mysql_error()); + + $count++; + + } + return $count; + } + //Pavani: Function to cancel latest import of trouble tickets and vendors of the particular user + /** function used to delete (update deleted=1 in crmentity table) the last imported tickets of the current user + * @param int $user_id - user id, whose last imported tickets want to be deleted + * @return int $count - return the number of deleted tickets + */ + function undo_HelpDesk($user_id) + { + $count = 0; + $query1 = "select bean_id from vtiger_users_last_import where assigned_user_id='$user_id' AND bean_type='HelpDesk' AND deleted=0"; + + $this->log->info($query1); + + $result1 = $this->db->query($query1) or die("Error getting last import for undo: ".mysql_error()); + + while ( $row1 = $this->db->fetchByAssoc($result1)) + { + $query2 = "update vtiger_crmentity set deleted=1 where crmid='{$row1['bean_id']}'"; + + $this->log->info($query2); + + $result2 = $this->db->query($query2) or die("Error undoing last import: ".mysql_error()); + + $count++; + + } + return $count; + } + + /** function used to delete (update deleted=1 in crmentity table) the last imported vendors of the current user + * @param int $user_id - user id, whose last imported vendors want to be deleted + * @return int $count - return the number of deleted vendors + */ + function undo_Vendors($user_id) + { + $count = 0; + $query1 = "select bean_id from vtiger_users_last_import where assigned_user_id='$user_id' AND bean_type='Vendors' AND deleted=0"; + + $this->log->info($query1); + + $result1 = $this->db->query($query1) or die("Error getting last import for undo: ".mysql_error()); + + while ( $row1 = $this->db->fetchByAssoc($result1)) + { + $query2 = "update vtiger_crmentity set deleted=1 where crmid='{$row1['bean_id']}'"; + + $this->log->info($query2); + + $result2 = $this->db->query($query2) or die("Error undoing last import: ".mysql_error()); + + $count++; + + } + return $count; + } + + /** function used to delete (update deleted=1 in crmentity table) the last imported accounts of the current user + * @param int $user_id - user id, whose last imported accounts want to be deleted + * @return int $count - return the number of deleted accounts + */ + function undo_accounts($user_id) + { + // this should just be a loop foreach module type + $count = 0; + $query1 = "select bean_id from vtiger_users_last_import where assigned_user_id=? AND bean_type='Accounts' AND deleted=0"; + $this->log->info($query1); + $result1 = $this->db->pquery($query1, array($user_id)) or die("Error getting last import for undo: ".mysql_error()); + + while ( $row1 = $this->db->fetchByAssoc($result1)) + { + $query2 = "update vtiger_crmentity set deleted=1 where crmid=?"; + $this->log->info($query2); + $result2 = $this->db->pquery($query2, array($row1['bean_id'])) or die("Error undoing last import: ".mysql_error()); + + $count++; + + } + return $count; + } + + /** function used to delete (update deleted=1 in crmentity table) the last imported potentials of the current user + * @param int $user_id - user id, whose last imported potentials want to be deleted + * @return int $count - return the number of deleted potentials + */ + function undo_opportunities($user_id) + { + // this should just be a loop foreach module type + $count = 0; + $query1 = "select bean_id from vtiger_users_last_import where assigned_user_id=? AND bean_type='Potentials' AND deleted=0"; + + $this->log->info($query1); + + $result1 = $this->db->pquery($query1, array($user_id)) or die("Error getting last import for undo: ".mysql_error()); + + while ( $row1 = $this->db->fetchByAssoc($result1)) + { + $query2 = "update vtiger_crmentity set deleted=1 where crmid=?"; + $this->log->info($query2); + $result2 = $this->db->pquery($query2, array($row1['bean_id'])) or die("Error undoing last import: ".mysql_error()); + + $count++; + + } + return $count; + } + + /** function used to delete (update deleted=1 in crmentity table) the last imported products of the current user + * @param int $user_id - user id, whose last imported products want to be deleted + * @return int $count - return the number of deleted products + */ + function undo_products($user_id) + { + $count = 0; + $query1 = "select bean_id from vtiger_users_last_import where assigned_user_id=? AND bean_type='Products' AND deleted=0"; + $this->log->info($query1); + $result1 = $this->db->pquery($query1, array($user_id)) or die("Error getting last import for undo: ".mysql_error()); + + while ( $row1 = $this->db->fetchByAssoc($result1)) + { + $query2 = "update vtiger_crmentity set deleted=1 where crmid=?"; + $this->log->info($query2); + $result2 = $this->db->pquery($query2, array($row1['bean_id'])) or die("Error undoing last import: ".mysql_error()); + + $count++; + } + return $count; + } + +} + + +?> diff --git a/oss/vtiger/trunk/modules/Import/error.php b/oss/vtiger/trunk/modules/Import/error.php new file mode 100644 index 00000000..e480fabb --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/error.php @@ -0,0 +1,68 @@ +info("Upload Error"); + + $smarty = new vtigerCRM_Smarty; + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + + + if (isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); + + if (isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); + + $smarty->assign("THEME", $theme); + + $category = getParenttab(); + $smarty->assign("CATEGORY", $category); + + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + + $smarty->assign("MODULE", vtlib_purify($_REQUEST['module'])); + $smarty->assign("MESSAGE", $message); + + $smarty->display('Importerror.tpl'); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/index.php b/oss/vtiger/trunk/modules/Import/index.php new file mode 100644 index 00000000..42faee04 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/index.php @@ -0,0 +1,252 @@ +"salutation", +// SPECIAL FIELD: +"Full Name"=>"full_name", +"Company"=>"company", +// END +"First Name"=>"first_name", +"Last Name"=>"last_name", +"Job Title"=>"title", +"Department"=>"department", +"Birthday"=>"birthdate", +"Home Phone"=>"phone_home", +"Mobile Phone"=>"phone_mobile", +"Business Phone"=>"phone_work", +"Other Phone"=>"phone_other", +"Business Fax"=>"phone_fax", +"E-mail Address"=>"email1", +"E-mail 2"=>"email2", +"Assistant's Name"=>"assistant", +"Assistant's Phone"=>"assistant_phone", +"Business Street"=>"primary_address_street", +"Business City"=>"primary_address_city", +"Business State"=>"primary_address_state", +"Business Postal Code"=>"primary_address_postalcode", +"Business Country/Region"=>"primary_address_country", +"Home Street"=>"alt_address_street", +"Home City"=>"alt_address_city", +"Home State"=>"alt_address_state", +"Home Postal Code"=>"alt_address_postalcode", +"Home Country/Region"=>"alt_address_country", +); + + +$outlook_accounts_field_map = array( +"Company"=>"name", +"Business Street"=>"billing_address_street", +"Business City"=>"billing_address_city", +"Business State"=>"billing_address_state", +"Business Country"=>"billing_address_country", +"Business Postal Code"=>"billing_address_postalcode", +"Business Fax"=>"phone_fax", +"Company Main Phone"=>"phone_office", +"Web Page"=>"website", +//Government ID Number, +//Organizational ID Number, +); + +$act_contacts_field_map = array( +"Web Site"=>"website", +"Company"=>"account_name", +"Name Suffix"=>"salutation", +"Title"=>"title", +"First Name"=>"first_name", +"Last Name"=>"last_name", +"Address 1"=>"primary_address_street", +"Address 2"=>"primary_address_street_2", +"Address 3"=>"primary_address_street_3", +"City"=>"primary_address_city", +"State"=>"primary_address_state", +"Zip"=>"primary_address_postalcode", +"Country"=>"primary_address_country", +"Phone"=>"phone_work", +"Phone Ext-"=>"phone_work_ext", +"Mobile Phone"=>"phone_mobile", +"Alt Phone"=>"phone_other", +"Fax"=>"phone_fax", +"E-mail Login"=>"email1", +"E-mail"=>"email1", +"E-Mail 2"=>"email2", +"Assistant"=>"assistant", +"Asst. Phone"=>"assistant_phone", +"Home Address 1"=>"alt_address_street", +"Home Address 2"=>"alt_address_street_2", +"Home Address 3"=>"alt_address_street_3", +"Home City"=>"alt_address_city", +"Home State"=>"alt_address_state", +"Home Zip"=>"alt_address_postalcode", +"Home Country"=>"alt_address_country", +"Home Phone"=>"phone_home", +); + + +$act_accounts_field_map = array( +"Revenue"=>"annual_revenue", +"Number of Employees"=>"employees", +"Company"=>"name", +"Address 1"=>"billing_address_street", +"City"=>"billing_address_city", +"State"=>"billing_address_state", +"Zip Code"=>"billing_address_postalcode", +"Country"=>"billing_address_country", +"Phone"=>"phone_office", +"Fax Phone"=>"phone_fax", +"Ticker Symbol"=>"ticker_symbol", +"Web Site"=>"website", +); + +/* +"Last Activity"=>"", +"Last Modified Date"=>"", +"Created Date"=>"", +"Reports To"=>"", +"Last Stay-in-Touch Request Date"=>"", +"Last Stay-in-Touch Save Date"=>"", +*/ +$salesforce_contacts_field_map = array( +"Salutation"=>"salutation", +"Description"=>"description", +"First Name"=>"first_name", +"Last Name"=>"last_name", +"Title"=>"title", +"Department"=>"department", +"Birthdate"=>"birthdate", +"Lead Source"=>"lead_source", +"Assistant"=>"assistant", +"Asst. Phone"=>"assistant_phone", +"Contact ID"=>"id", +"Mailing Street"=>"primary_address_street", +"Mailing Address Line1"=>"primary_address_street_2", +"Mailing Address Line2"=>"primary_address_street_3", +"Mailing Address Line3"=>"primary_address_street_4", +"Mailing City"=>"primary_address_city", +"Mailing State"=>"primary_address_state", +"Mailing Zip/Postal Code"=>"primary_address_postalcod3", +"Mailing Country"=>"primary_address_country", +"Other Street"=>"alt_address_street", +"Other Address Line 1"=>"alt_address_street_2", +"Other Address Line 2"=>"alt_address_street_3", +"Other Address Line 3"=>"alt_address_street_4", +"Other City"=>"alt_address_city", +"Other State"=>"alt_address_state", +"Other Zip/Postal Code"=>"alt_address_postalcode", +"Other Country"=>"alt_address_country", +"Phone"=>"phone_work", +"Mobile"=>"phone_mobile", +"Home Phone"=>"phone_home", +"Other Phone"=>"phone_other", +"Fax"=>"phone_fax", +"Email"=>"email1", +"Email Opt Out"=>"email_opt_out", +"Do Not Call"=>"do_not_call", +"Account Name"=>"account_name", +"Account ID"=>"account_id", +); + + + + +/* +ommited vtiger_fields to map: +"Account Number"=>"", +"Account Site"=>"", +"Last Activity"=>"", +"Parent Account"=>"", +"Parent Account ID"=>"", +"Parent Account Site"=>"", +"Created Date"=>"", +"Last Modified Date"=>"", +"Billing Address Line3"=>"", +"Shipping Address Line3"=>"", +*/ +$salesforce_accounts_field_map = array( +"Account Name"=>"name", +"Annual Revenue"=>"annual_revenue", +"Type"=>"type", +"Ticker Symbol"=>"ticker_symbol", +"Rating"=>"rating", +"Industry"=>"industry", +"SIC Code"=>"sic_code", +"Ownership"=>"ownership", +"Employees"=>"employees", +"Description"=>"description", +"Account ID"=>"id", +"Billing Street"=>"billing_address_street", +"Billing Address Line1"=>"billing_address_street_2", +"Billing Address Line2"=>"billing_address_street_3", +"Billing City"=>"billing_address_city", +"Billing State"=>"billing_address_state", +"Billing Zip/Postal Code"=>"billing_address_postalcode", +"Billing Country"=>"billing_address_country", +"Shipping Street"=>"shipping_address_street", +"Shipping Address Line1"=>"shipping_address_street_2", +"Shipping Address Line2"=>"shipping_address_street_3", +"Shipping City"=>"shipping_address_city", +"Shipping State"=>"shipping_address_state", +"Shipping Zip/Postal Code"=>"shipping_address_postalcode", +"Shipping Country"=>"shipping_address_country", +"Phone"=>"phone_office", +"Fax"=>"phone_fax", +"Website"=>"website" +); + +/* +"Fiscal Quarter"=>"", +"Age"=>"", +"Expected Revenue"=>"", +*/ +$salesforce_opportunities_field_map = array( + +"Opportunity Name"=>"name" , +"Type"=>"opportunity_type", +"Lead Source"=>"lead_source", +"Amount"=>"amount", +"Created Date"=>"date_entered", +"Close Date"=>"date_closed", +"Next Step"=>"next_step", +"Stage"=>"sales_stage", +"Probability (%)"=>"probability", +"Account Name"=>"account_name" +); + +if (! isset($_REQUEST['step'] ) ) +{ + $_REQUEST['step'] = 1; +} + +$mod_list_strings = return_mod_list_strings_language($current_language,"Import"); + +checkFileAccess('modules/Import/ImportStep'. $_REQUEST['step']. '.php'); +include_once('modules/Import/ImportStep'. $_REQUEST['step']. '.php'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/language/en_us.lang.php b/oss/vtiger/trunk/modules/Import/language/en_us.lang.php new file mode 100644 index 00000000..27e45c31 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/language/en_us.lang.php @@ -0,0 +1,432 @@ +'The directory ', +'LBL_IMPORT_MODULE_NO_DIRECTORY_END'=>' does not exist or is not writable', +'LBL_IMPORT_MODULE_ERROR_NO_UPLOAD'=>'File was not uploaded successfully, try again', +'LBL_IMPORT_MODULE_ERROR_LARGE_FILE'=>'File is too large. Max:', +'LBL_IMPORT_MODULE_ERROR_LARGE_FILE_END'=>'Bytes. Change $upload_maxsize in config.php', +'LBL_MODULE_NAME'=>'Import', +'LBL_TRY_AGAIN'=>'Try Again', +'LBL_ERROR'=>'Error:', +'ERR_MULTIPLE'=>'Multiple columns have been defined with the same field name.', +'ERR_MISSING_REQUIRED_FIELDS'=>'Missing required fields:', +'ERR_SELECT_FULL_NAME'=>'You cannot select Full Name when First Name and Last Name are selected.', +'ERR_SELECT_FILE'=>'Select a file to upload.', +'LBL_SELECT_FILE'=>'Select file:', +'LBL_CUSTOM'=>'Custom', +'LBL_DONT_MAP'=>'-- Do not map this field --', +'LBL_STEP_1_TITLE'=>'Step 1 of 4: Select Data Source', +'LBL_WHAT_IS'=>'Please select a data source from the following:', +'LBL_MICROSOFT_OUTLOOK'=>'Microsoft Outlook', +'LBL_ACT'=>'Act!', +'LBL_SALESFORCE'=>'Salesforce.com', +'LBL_MY_SAVED'=>'My Saved Sources:', +'LBL_PUBLISH'=>'publish', +'LBL_DELETE'=>'delete', +'LBL_PUBLISHED_SOURCES'=>'Published Sources:', +'LBL_UNPUBLISH'=>'un-publish', +'LBL_NEXT'=>'Next', +'LBL_BACK'=>'Back', +'LBL_STEP_2_TITLE'=>'Step 2 of 4: Upload Export File', +'LBL_HAS_HEADER'=>'Has Header', + +'LBL_NUM_1'=>'1.', +'LBL_NUM_2'=>'2.', +'LBL_NUM_3'=>'3.', +'LBL_NUM_4'=>'4.', +'LBL_NUM_5'=>'5.', +'LBL_NUM_6'=>'6.', +'LBL_NUM_7'=>'7.', +'LBL_NUM_8'=>'8.', +'LBL_NUM_9'=>'9.', +'LBL_NUM_10'=>'10.', +'LBL_NUM_11'=>'11.', +'LBL_NUM_12'=>'12.', +'LBL_NOW_CHOOSE'=>'Now choose that file to import:', +'LBL_IMPORT_OUTLOOK_TITLE'=>'Microsoft Outlook 98 and 2000 can export data in the Comma Separated Values format which can be used to import data into the system. To export your data from Outlook, follow the steps below:', +'LBL_OUTLOOK_NUM_1'=>'Start Outlook', +'LBL_OUTLOOK_NUM_2'=>'Select the File menu, then the Import and Export ... menu option', +'LBL_OUTLOOK_NUM_3'=>'Choose Export to a file and click Next', +'LBL_OUTLOOK_NUM_4'=>'Choose Comma Separated Values (Windows) and click Next.
    Note: You may be prompted to install the export component', +'LBL_OUTLOOK_NUM_5'=>'Select the Contacts folder and click Next. You can select different contacts folders if your contacts are stored in multiple folders', +'LBL_OUTLOOK_NUM_6'=>'Choose a filename and click Next', +'LBL_OUTLOOK_NUM_7'=>'Click Finish', +'LBL_IMPORT_ACT_TITLE'=>'Act! can export data in the Comma Separated Values format which can be used to import data into the system. To export your data from Act!, follow the steps below:', +'LBL_ACT_NUM_1'=>'Launch ACT!', +'LBL_ACT_NUM_2'=>'Select the File menu, the Data Exchange menu option, then the Export... menu option', +'LBL_ACT_NUM_3'=>'Select the file type Text-Delimited', +'LBL_ACT_NUM_4'=>'Choose a filename and location for the exported data and click Next', +'LBL_ACT_NUM_5'=>'Select Contacts records only', +'LBL_ACT_NUM_6'=>'Click the Options... button', +'LBL_ACT_NUM_7'=>'Select Comma as the field separator character', +'LBL_ACT_NUM_8'=>'Check the Yes, export field names checkbox and click OK', +'LBL_ACT_NUM_9'=>'Click Next', +'LBL_ACT_NUM_10'=>'Select All Records and then Click Finish', + +'LBL_IMPORT_SF_TITLE'=>'Salesforce.com can export data in the Comma Separated Values format which can be used to import data into the system. To export your data from Salesforce.com, follow the steps below:', +'LBL_SF_NUM_1'=>'Open your browser, go to http://www.salesforce.com, and login with your email address and password', +'LBL_SF_NUM_2'=>'Click on the Reports tab on the top menu', +'LBL_SF_NUM_3'=>'To export Accounts: Click on the Active Accounts link
    To export Contacts: Click on the Mailing List link', +'LBL_SF_NUM_4'=>'On Step 1: Select your report type, select Tabular Reportclick Next', +'LBL_SF_NUM_5'=>'On Step 2: Select the report columns, choose the columns you want to export and click Next', +'LBL_SF_NUM_6'=>'On Step 3: Select the information to summarize, just click Next', +'LBL_SF_NUM_7'=>'On Step 4: Order the report columns, just click Next', +'LBL_SF_NUM_8'=>'On Step 5: Select your report criteria, under Start Date, choose a date far enough in the past to include all your Accounts. You can also export a subset of Accounts using more advanced criteria. When you are done, click Run Report', +'LBL_SF_NUM_9'=>'A report will be generated, and the page should display Report Generation Status: Complete. Now click Export to Excel', +'LBL_SF_NUM_10'=>'On Export Report:, for Export File Format:, choose Comma Delimited .csv. Click Export.', +'LBL_SF_NUM_11'=>'A dialog will pop up for you to save the export file to your computer.', +'LBL_IMPORT_CUSTOM_TITLE'=>'Many applications will allow you to export data into a Comma Delimited text file (.csv). Generally most applications follow these general steps:', +'LBL_CUSTOM_NUM_1'=>'Launch the application and Open the data file', +'LBL_CUSTOM_NUM_2'=>'Select the Save As... or Export... menu option', +'LBL_CUSTOM_NUM_3'=>'Save the file in a CSV or Comma Separated Values format', + +'LBL_STEP_3_TITLE'=>'Step 3 of 4: Confirm Fields and Import', +'LBL_STEP_1'=>'Step 1 of 3 : ', +'LBL_STEP_1_TITLE'=>'Select the .CSV File', +'LBL_STEP_1_TEXT'=> ' vtiger CRM supports importing records from .csv ( Comma Separated Values ) files. To start import, browse to locate the .CSV file and click on the Next button to Continue.', + +'LBL_SELECT_FIELDS_TO_MAP'=>'In the list below, select the fields in your import file that should be imported into each field in the system. When you are finished, click Import Now', + +'LBL_DATABASE_FIELD'=>'Database Field', +'LBL_HEADER_ROW'=>'Header Row', +'LBL_ROW'=>'Row', +'LBL_SAVE_AS_CUSTOM'=>'Save as Custom Mapping :', +'LBL_CONTACTS_NOTE_1'=>'Either Last Name or Full Name must be mapped.', +'LBL_CONTACTS_NOTE_2'=>'If Full Name is mapped, then First Name and Last Name are ignored.', +'LBL_CONTACTS_NOTE_3'=>'If Full Name is mapped, then the data in Full Name will be split into First Name and Last Name when inserted into the database.', +'LBL_CONTACTS_NOTE_4'=>'Fields ending in Address Street 2 and Address Street 3 are concatenated together with the main Address Street Field when inserted into the database.', +'LBL_ACCOUNTS_NOTE_1'=>'Account Name must be mapped.', +'LBL_ACCOUNTS_NOTE_2'=>'Fields ending in Address Street 2 and Address Street 3 are concatenated together with the main Address Street Field when inserted into the database.', +'LBL_POTENTIALS_NOTE_1'=>'Potential Name, Account Name, Date Closed, and Sales Stage are required fields.', +'LBL_OPPORTUNITIES_NOTE_1'=>'Opportunity Name, Account Name, Date Closed, and Sales Stage are required fields.', +'LBL_LEADS_NOTE_1'=>'Last Name must be mapped.', +'LBL_LEADS_NOTE_2'=>'Company Name must be mapped.', +'LBL_IMPORT_NOW'=>'Import Now', +'LBL_'=>'', +'LBL_CANNOT_OPEN'=>'Cannot open the imported file for reading', +'LBL_NOT_SAME_NUMBER'=>'There were not the same number of fields per line in your file', +'LBL_NO_LINES'=>'There were no lines in your import file', +'LBL_FILE_ALREADY_BEEN_OR'=>'The import file has already been processed or does not exist', +'LBL_SUCCESS'=>'Success! ', +'LBL_SUCCESSFULLY'=>'Succesfully Imported', +'LBL_LAST_IMPORT_UNDONE'=>'Your Last Import Was Undone', +'LBL_NO_IMPORT_TO_UNDO'=>'There was no import to undo.', +'LBL_FAIL'=>'Fail:', +'LBL_RECORDS_SKIPPED'=>'records skipped because they were missing one or more required fields', +'LBL_IDS_EXISTED_OR_LONGER'=>'records skipped because the id\'s either existed or where longer than 36 characters', +'LBL_RESULTS'=>'Results', +'LBL_IMPORT_MORE'=>'Import More', +'LBL_FINISHED'=>'Finished', +'LBL_UNDO_LAST_IMPORT'=>'Undo Last Import', + +'LBL_SUCCESS_1' => 'No. of Records Successfully Imported : ', +'LBL_SKIPPED_1' => 'No. of Records Skipped as they were missing one or more required fields : ', + +//Added for patch2 - Products Import Notes +'LBL_PRODUCTS_NOTE_1'=>'Product Name must be mapped', +'LBL_PRODUCTS_NOTE_2'=>'Before import please check whether a single column has been mapped twice', + +//Added for version 5 +'LBL_FILE_LOCATION'=>'File Location :', +'LBL_STEP_2_3'=>'Step 2 of 3 :', +'LBL_LIST_MAPPING'=>'List & Mapping', +'LBL_STEP_2_MSG'=>'The following tables shows the imported', +'LBL_STEP_2_MSG1'=>'and other details.', +'LBL_STEP_2_TXT'=>'To map the fields, select the corresponding in combo boxes for each', +'LBL_USE_SAVED_MAPPING'=>'Use Saved Mapping :', +'LBL_MAPPING'=>'Mapping', +'LBL_HEADERS'=>'Headers :', +'LBL_ERROR_MULTIPLE'=>'Same fields may be mapped twice. Please check the mapped fields.', +'LBL_STEP_3_3'=>'Step 3 of 3 : ', +'LBL_MAPPING_RESULTS'=>'Mapping Results ', +'LBL_LAST_IMPORTED'=>'Last Imported', +//Added for sript alerts +'PLEASE_CHECK_MAPPING' => "' is mapped more than once. Please check the mapping.", +'MAP_MANDATORY_FIELD' => 'Please map the mandatory field "', +'ENTER_SAVEMAP_NAME' => 'Please Enter Save Map Name', + +//Added for 5.0.3 +'to'=>'to', +'of'=>'of', +'are_imported_succesfully'=>'are imported successfully', + +// Added after 5.0.4 GA + +//added for duplicate handling +'LBL_LAST_IMPORT'=>'Last Imported', +'Select_Criteria_For_Duplicate' => 'Select Criteria For Duplicate Records Handling', +'Manual_Merging' => 'Manual Merging', +'Auto_Merging' => 'Auto Merging', +'Ignore_Duplicate' => 'Ignore the duplicate import records', +'Overwrite_Duplicate' => 'Overwrite the duplicate records', +'Duplicate_Records_Skipped_Info' => 'No. of Records Skipped as they were duplicates : ', +'Duplicate_Records_Overwrite_Info' => 'No. of Records Overwritten as they were duplicates : ', +'LBL_STEP_4_4' => 'Step 4 of 4 : ', +'LBL_STEP_3_4'=>'Step 3 of 4 :', +'LBL_STEP_2_4'=>'Step 2 of 4 :', +'LBL_STEP_1_4'=>'Step 1 of 4 : ', + +'LBL_DELIMITER' => 'Delimiter:', +'LBL_FORMAT' => 'Format:', +); + +/*$mod_list_strings = Array( + "id"=>"Contact ID" + ,"first_name"=>"First Name" + ,"last_name"=>"Last Name" + ,"salutation"=>"Salutation" + ,"lead_source"=>"Lead Source" + ,"birthdate"=>"Lead Source" + ,"do_not_call"=>"Do Not Call" + ,"email_opt_out"=>"Email Opt Out" + ,"primary_address_street_2"=>"Primary Address Street 2" + ,"primary_address_street_3"=>"Primary Address Street 3" + ,"alt_address_street_2"=>"Other Address Street 2" + ,"alt_address_street_3"=>"Other Address Street 3" + ,"full_name"=>"Full Name" + ,"account_name"=>"Account Name" + ,"account_id"=>"Account ID" + ,"title"=>"Title" + ,"department"=>"Department" + ,"birthdate"=>"Birthdate" + ,"do_not_call"=>"Do Not Call" + ,"phone_home"=>"Phone (Home)" + ,"phone_mobile"=>"Phone (Mobile)" + ,"phone_work"=>"Phone (Work)" + ,"phone_other"=>"Phone (Other)" + ,"phone_fax"=>"Fax" + ,"email1"=>"Email" + ,"email2"=>"Email (Other)" + ,"yahoo_id"=>"Yahoo! ID" + ,"assistant"=>"Assistant" + ,"assistant_phone"=>"Assistant Phone" + ,"primary_address_street"=>"Primary Address Street" + ,"primary_address_city"=>"Primary Address City" + ,"primary_address_state"=>"Primary Address State" + ,"primary_address_postalcode"=>"Primary Address Postalcode" + ,"primary_address_country"=>"Primary Address Country" + ,"alt_address_street"=>"Other Address Street" + ,"alt_address_city"=>"Other Address City" + ,"alt_address_state"=>"Other Address State" + ,"alt_address_postalcode"=>"Other Address Postalcode" + ,"alt_address_country"=>"Other Address Country" + ,"description"=>"Description" + + ),*/ +$mod_list_strings = Array( +'contacts_import_fields' => Array( + //"id"=>"Contact ID" + "firstname"=>"First Name" + ,"lastname"=>"Last Name" + ,"salutationtype"=>"Salutation" + ,"leadsource"=>"Lead Source" + ,"birthday"=>"Birthdate" + ,"donotcall"=>"Do Not Call" + ,"emailoptout"=>"Email Opt Out" + //,"primary_address_street_2"=>"Primary Address Street 2" + //,"primary_address_street_3"=>"Primary Address Street 3" + //,"alt_address_street_2"=>"Other Address Street 2" + //,"alt_address_street_3"=>"Other Address Street 3" + //,"full_name"=>"Full Name" + //,"account_name"=>"Account Name" + ,"account_id"=>"Account Name" + ,"title"=>"Title" + ,"department"=>"Department" + //,"birthdate"=>"Birthdate" + //,"do_not_call"=>"Do Not Call" + ,"homephone"=>"Phone (Home)" + ,"mobile"=>"Phone (Mobile)" + ,"phone"=>"Phone (Work)" + ,"otherphone"=>"Phone (Other)" + ,"fax"=>"Fax" + ,"email"=>"Email" + ,"otheremail"=>"Email (Other)" + ,"yahooid"=>"Yahoo! ID" + ,"assistant"=>"Assistant" + ,"assistantphone"=>"Assistant Phone" + ,"mailingstreet"=>"Mailing Address Street" + ,"mailingpobox"=>"Mailing Address PO Box" + ,"mailingcity"=>"Mailing Address City" + ,"mailingstate"=>"Mailing Address State" + ,"mailingzip"=>"Mailing Address Postalcode" + ,"mailingcountry"=>"Mailing Address Country" + ,"otherstreet"=>"Other Address Street" + ,"otherpobox"=>"Other Address PO Box" + ,"othercity"=>"Other Address City" + ,"otherstate"=>"Other Address State" + ,"otherzip"=>"Other Address Postalcode" + ,"othercountry"=>"Other Address Country" + ,"description"=>"Description" + ,"assigned_user_id"=>"Assigned To" + ), + +'accounts_import_fields' => Array( + //"id"=>"Account ID", + "accountname"=>"Account Name", + "website"=>"Website", + "industry"=>"Industry", + "accounttype"=>"Type", + "tickersymbol"=>"Ticker Symbol", + "parent_name"=>"Member of", + "employees"=>"Employees", + "ownership"=>"Ownership", + "phone"=>"Phone", + "fax"=>"Fax", + "otherphone"=>"Other Phone", + "email1"=>"Email", + "email2"=>"Other Email", + "rating"=>"Rating", + "siccode"=>"SIC Code", + "annual_revenue"=>"Annual Revenue", + "bill_street"=>"Billing Address Street", + //"billing_address_street_2"=>"Billing Address Street 2", + //"billing_address_street_3"=>"Billing Address Street 3", + //"billing_address_street_4"=>"Billing Address Street 4", + "bill_pobox"=>"Billing Address PO Box", + "bill_city"=>"Billing Address City", + "bill_state"=>"Billing Address State", + "bill_code"=>"Billing Address Postalcode", + "bill_country"=>"Billing Address Country", + "ship_street"=>"Shipping Address Street", + //"shipping_address_street_2"=>"Shipping Address Street 2", + //"shipping_address_street_3"=>"Shipping Address Street 3", + //"shipping_address_street_4"=>"Shipping Address Street 4", + "ship_pobox"=>"Shipping Address PO Box", + "ship_city"=>"Shipping Address City", + "ship_state"=>"Shipping Address State", + "ship_code"=>"Shipping Address Postalcode", + "ship_country"=>"Shipping Address Country", + "description"=>"Description", + "assigned_user_id"=>"Assigned To" + ), + +'potentials_import_fields' => Array( + //"id"=>"Account ID" + "potentialname"=>"Potential Name" + , "account_id"=>"Account Name" + , "opportunity_type"=>"Potential Type" + , "leadsource"=>"Lead Source" + , "amount"=>"Amount" + , "closingdate"=>"Closing Date" + , "nextstep"=>"Next Step" + , "sales_stage"=>"Sales Stage" + , "probability"=>"Probability" + , "description"=>"Description" + ,"assigned_user_id"=>"Assigned To" + ), + + +'leads_import_fields' => Array( + "salutationtype"=>"Salutation", + "firstname"=>"First Name", + "phone"=>"Phone", + "lastname"=>"Last Name", + "mobile"=>"Mobile", + "company"=>"Company", + "fax"=>"Fax", + "designation"=>"Designation", + "email"=>"Email", + "leadsource"=>"Lead Source", + "website"=>"Website", + "industry"=>"Industry", + "leadstatus"=>"Lead Status", + "annualrevenue"=>"Annual Revenue", + "rating"=>"Rating", + "noofemployees"=>"No Of Employees", + "assigned_user_id"=>"Assigned To", + "yahooid"=>"Yahoo Id", + "lane"=>"Street", + "pobox"=>"PO Box", + "code"=>"Postal Code", + "city"=>"City", + "country"=>"Country", + "state"=>"State", + "description"=>"Description" + ,"assigned_user_id"=>"Assigned To" + ), + + 'products_import_fields' => Array( + 'productname'=>'Product Name', + 'productcode'=>'Product Code', + 'productcategory'=>'Product Category', + 'manufacturer'=>'Manufacturer', + 'product_description'=>'Product Description', + 'qty_per_unit'=>'Quantity Per/Unit', + 'unit_price'=>'Unit Price', + 'weight'=>'Weight', + 'pack_size'=>'Pack Size', + 'start_date'=>'Start Date', + 'expiry_date'=>'Expiration Date', + 'cost_factor'=>'Cost Factor', + 'commissionmethod'=>'Commission Method', + 'discontinued'=>'Discontinued', + 'commissionrate'=>'Commission Rate', + 'sales_start_date'=>'Sales Start Date', + 'sales_end_date'=>'Sales End Date', + 'usageunit'=>'Usage Unit', + 'serialno'=>'Serial No', + 'currency'=>'currency', + 'reorderlevel'=>'Reorder Level', + 'website'=>'Web Site', + 'taxclass'=>'Tax Class', + 'mfr_part_no'=>'Manufacture Part No', + 'vendor_part_no'=>'Vendor Part No', + 'qtyinstock'=>'Quantity in Stock', + 'productsheet'=>'Product Sheet', + 'qtyindemand'=>'Quantity in Demand', + 'glacct'=>'GL Account', + 'assigned_user_id'=>'Assigned To' + ), +//Pavani...adding list of import fields for helpdesk and vendors +'helpdesk_import_fields' => Array( + "ticketid"=>"Ticket Id", + "priority"=>"Priority", + "severity"=>"Severity", + "status"=>"Status", + "category"=>"Category", + "title"=>"Title", + "description"=>"Description", + "solution"=>"Solution" + ), + +'vendors_import_fields' => Array( + "vendorid"=>"Vender Id", + "vendorname"=>"Vendor Name", + "phone"=>"Phone", + "email"=>"Email", + "website"=>"Website", + "category"=>"Category", + "street"=>"Street", + "city"=>"City", + "state"=>"State", + "pobox"=>"Post Box", + "postalcode"=>"Postal Code", + "country"=>"Country", + "description"=>"Description" + ) +//Pavani...end list +); + +?> diff --git a/oss/vtiger/trunk/modules/Import/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Import/language/zh_cn.lang.php new file mode 100644 index 00000000..72d381de --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/language/zh_cn.lang.php @@ -0,0 +1,432 @@ + '目录 ', + 'LBL_IMPORT_MODULE_NO_DIRECTORY_END' => ' 不存在或没有记录', + 'LBL_IMPORT_MODULE_ERROR_NO_UPLOAD' => '文件无法顺利上传,请再重试', + 'LBL_IMPORT_MODULE_ERROR_LARGE_FILE' => '文件太大,大小上限:', + 'LBL_IMPORT_MODULE_ERROR_LARGE_FILE_END' => '字节,在 config.php 中调整 $upload_maxsize 设定', + 'LBL_MODULE_NAME' => '导入', + 'LBL_TRY_AGAIN' => '重试', + 'LBL_ERROR' => '错误:', + 'ERR_MULTIPLE' => '定义字段可多行输入.', + 'ERR_MISSING_REQUIRED_FIELDS' => '漏填必须字段:', + 'ERR_SELECT_FULL_NAME' => '当姓或名被选择时,您就不能再选全名.', + 'ERR_SELECT_FILE' => '选择文件以供上传.', + 'LBL_SELECT_FILE' => '选择文件:', + 'LBL_CUSTOM' => '自订', + 'LBL_DONT_MAP' => '-- 没有标记这个字段 --', + 'LBL_STEP_1_TITLE' => '步骤 1 到 4: 选择数据来源', + 'LBL_WHAT_IS' => '请选择数据来源:', + 'LBL_MICROSOFT_OUTLOOK' => 'Microsoft Outlook', + 'LBL_ACT' => 'Act!', + 'LBL_SALESFORCE' => 'Salesforce.com', + 'LBL_MY_SAVED' => '我所储存的来源:', + 'LBL_PUBLISH' => '发布', + 'LBL_DELETE' => '删除', + 'LBL_PUBLISHED_SOURCES' => '发布来源:', + 'LBL_UNPUBLISH' => '不发布', + 'LBL_NEXT' => '下一步', + 'LBL_BACK' => '上一步', + 'LBL_STEP_2_TITLE' => '步骤 2 of 4: 上传导入文件', + 'LBL_HAS_HEADER' => '标题行:', + +'LBL_NUM_1'=>'1.', +'LBL_NUM_2'=>'2.', +'LBL_NUM_3'=>'3.', +'LBL_NUM_4'=>'4.', +'LBL_NUM_5'=>'5.', +'LBL_NUM_6'=>'6.', +'LBL_NUM_7'=>'7.', +'LBL_NUM_8'=>'8.', +'LBL_NUM_9'=>'9.', +'LBL_NUM_10'=>'10.', +'LBL_NUM_11'=>'11.', +'LBL_NUM_12'=>'12.', +'LBL_NOW_CHOOSE' => '选择读入文件:', + 'LBL_IMPORT_OUTLOOK_TITLE' => 'Microsoft Outlook 98 and 2000 能依据标点符号区分各字段数据以读入或导出数据,请随后续的指示操作:', + 'LBL_OUTLOOK_NUM_1' => '开始 Outlook', + 'LBL_OUTLOOK_NUM_2' => '选择指定的 文件 清单, 以利 读入及导出 ... 清单选项', + 'LBL_OUTLOOK_NUM_3' => '选择 导出文件 和点选下一步', + 'LBL_OUTLOOK_NUM_4' => '选择 区分逗号值 (Windows) 并点选 下一步.
    备注: 您在安装导出组件时所必须作的相关提示', + 'LBL_OUTLOOK_NUM_5' => '选择 联络人 数据夹和点选 下一步. 如果您选择重了复选数据夹,您就能够选择不同的联络人数据夹', + 'LBL_OUTLOOK_NUM_6' => '选择文件名称并点选 下一步', + 'LBL_OUTLOOK_NUM_7' => '选择 完成', + 'LBL_IMPORT_ACT_TITLE' => '动作提示! 您所读入导出的数据会依据 区分标点符号 格式来执行!, 请随后续的指示操作:', + 'LBL_ACT_NUM_1' => '开始 执行!', + 'LBL_ACT_NUM_2' => '选择 文件 清单, 数据交换 清单选项, 以利 导出... 清单选项', + 'LBL_ACT_NUM_3' => '选择文件类型 Text-Delimited', + 'LBL_ACT_NUM_4' => '选择文件及其位置以利输出数据,并点选 下一步', + 'LBL_ACT_NUM_5' => '选择 仅限联络人记录', + 'LBL_ACT_NUM_6' => '点选 选项... 按钮', + 'LBL_ACT_NUM_7' => '选择 标点符号 区分字段字符', + 'LBL_ACT_NUM_8' => '检查 确定, 导出字段名称 核取并点选选 OK', + 'LBL_ACT_NUM_9' => '点选 下一步', + 'LBL_ACT_NUM_10' => '选择 全部记录 和点选 完成', + +'LBL_IMPORT_SF_TITLE' => 'Salesforce.com 能输出数据以导入数据到系统中,利用 区分标点符号 格式来执行,请随后续的指示操作:', + 'LBL_SF_NUM_1' => '开启您的浏览器, 到 http://www.salesforce.com, 和登入您的电子邮件地址及密码', + 'LBL_SF_NUM_2' => '在顶层清单中,点选 导出 ', + 'LBL_SF_NUM_3' => '输出公司: 点选 经常往来公司 连结
    输出联络人: 选择 电子邮件列表 连结', + 'LBL_SF_NUM_4' => '步骤 1: 选择您的报告类型, 选择 表格报告点选 下一步', + 'LBL_SF_NUM_5' => '步骤 2: 选择报告栏, 点选您要输出的字段 下一步', + 'LBL_SF_NUM_6' => '步骤 3: 选择总结讯息, 点选 下一步', + 'LBL_SF_NUM_7' => '步骤 4: 命令输出字段, 点选 下一步', + 'LBL_SF_NUM_8' => '步骤 5: 选择您的输出标准, 在 开始日期下方, 选择足够的日期范围值到您的公司. 您您可以输出公司相关的信息利用更多的进阶选项. 当您完成, 点选 报告', + 'LBL_SF_NUM_9' => '报告将产生, 并且该页面会显示 报告执行身份: 编译. 立即点选 输出到Excel电子电子表格', + 'LBL_SF_NUM_10' => '在 输出报告:, 从 输出文件格式:, 选择 标点符号区分.csv. 点选 输出.', + 'LBL_SF_NUM_11' => '将会弹出对话窗口让您可以储存输出文件.', + 'LBL_IMPORT_CUSTOM_TITLE' => '许多应用将会依您的输出数据所设定的 标点符号区分 (.csv). 通常将会依一般设定值来执行:', + 'LBL_CUSTOM_NUM_1' => '开始应用执行并打开数据文件', + 'LBL_CUSTOM_NUM_2' => '选择 另存...输出... 清单选项', + 'LBL_CUSTOM_NUM_3' => '储存文件的格式依据 CSV标点符号设定值', + + 'LBL_STEP_3_TITLE' => '步骤 3 / 4: 确认导入字段', + 'LBL_STEP_1' => '步骤 1 / 3:', + 'LBL_STEP_1_TITLE'=>'选择 .CSV 文件', + 'LBL_STEP_1_TEXT' => ' vtiger CRM 支持从 .csv ( 逗点分隔数据 ) 文件导入数据,请选择指定的文件后点选继续按钮。
    注意:请在执行导入前,首先修改导入文件的编码为:UTF-8或ISO-8859-1', + + 'LBL_SELECT_FIELDS_TO_MAP' => '在列表下方, 从您读入的文件中选择输入的字段. 当您完成时,点选 立即读入', + + 'LBL_DATABASE_FIELD' => '数据库字段', + 'LBL_HEADER_ROW' => '字段标题', + 'LBL_ROW' => '列', + 'LBL_SAVE_AS_CUSTOM' => '储存自订标记:', + 'LBL_CONTACTS_NOTE_1' => '不管是名或全名都必须被标记选择.', + 'LBL_CONTACTS_NOTE_2' => '如果全名被标记选择, 那姓与名字段就会取消.', + 'LBL_CONTACTS_NOTE_3' => '如果全名被标记选择,当要写入数据库时它们会被自动分割成姓与名.', + 'LBL_CONTACTS_NOTE_4' => '数据新增到数据库时,在地址2与地址3的信息会与主要地址字段合并', + 'LBL_ACCOUNTS_NOTE_1' => '公司名称必须被选择标记.', + 'LBL_ACCOUNTS_NOTE_2' => '当要写入数据库时,将地址街道巷号2和街道巷号3的数据合并在主要地址字段.', + 'LBL_POTENTIALS_NOTE_1' => '潜在机会名称,公司名称,结束日期与销售策略都是必填字段', + 'LBL_OPPORTUNITIES_NOTE_1' => '潜在案件名称, 公司名称, 结束日期, 和客服场地所需的字段.', + 'LBL_LEADS_NOTE_1' => '必须指定姓氏', + 'LBL_LEADS_NOTE_2' => '必须指定公司名称', + 'LBL_IMPORT_NOW' => '立即读入', + 'LBL_' => '', + 'LBL_CANNOT_OPEN' => '无法读取导入的文件', + 'LBL_NOT_SAME_NUMBER' => '在您指定的文件中每列的各字段的号码不一致', + 'LBL_NO_LINES' => '在您读入的文件中没有行号', + 'LBL_FILE_ALREADY_BEEN_OR' => '您所指定导入的文件已经处理过或不存在', + 'LBL_SUCCESS' => '服务系统操作:', + 'LBL_SUCCESSFULLY' => '读入系统操作', + 'LBL_LAST_IMPORT_UNDONE' => '您最后一笔读入的信息已取消', + 'LBL_NO_IMPORT_TO_UNDO' => '没有读入的信息供取消.', + 'LBL_FAIL' => '失败:', + 'LBL_RECORDS_SKIPPED' => '该笔记录略过,因为缺漏必要字段值', + 'LBL_IDS_EXISTED_OR_LONGER' => '该笔记录略过,因为记录编号已存在或长度超过36字符', + 'LBL_RESULTS' => '结果', + 'LBL_IMPORT_MORE' => '读入更多...', + 'LBL_FINISHED' => '已完成', + 'LBL_UNDO_LAST_IMPORT' => '取消最后一笔的读入', + + 'LBL_SUCCESS_1' => '成功导入数据笔数:', + 'LBL_SKIPPED_1' => '略过的数据笔数(可能缺少一或多个字段):', + + //Added for patch2 - Products Import Notes + 'LBL_PRODUCTS_NOTE_1' => '必须对应产品名称', + 'LBL_PRODUCTS_NOTE_2' => '在导入前请先确认单一字段是否被指定两次', + + //Added for version 5 + 'LBL_FILE_LOCATION' => '文件位置:', + 'LBL_STEP_2_3' => '步骤 2 / 3:', + 'LBL_LIST_MAPPING' => '列表与对应', + 'LBL_STEP_2_MSG' => '下面数据表显示导入的数据', + 'LBL_STEP_2_MSG1' => '与其它细节。', + 'LBL_STEP_2_TXT' => '对应字段的方式是在下面相对方块中调整个别项目', + 'LBL_USE_SAVED_MAPPING' => '使用预存对应:', + 'LBL_MAPPING' => '对应', + 'LBL_HEADERS' => '页首:', + 'LBL_ERROR_MULTIPLE' => '同样的字段对应两次,请检查对应字段。', + 'LBL_STEP_3_3' => '步骤 3 / 3 :', + 'LBL_MAPPING_RESULTS' => '对应结果', + 'LBL_LAST_IMPORTED' => '最新导入的', +//Added for sript alerts +'PLEASE_CHECK_MAPPING' => "' 映射一次以上。请检查映射.", +'MAP_MANDATORY_FIELD' => 'Please map the mandatory field "', +'ENTER_SAVEMAP_NAME' => '请输入要保存的地图名', + +//Added for 5.0.3 +'to'=>'to', +'of'=>'of', +'are_imported_succesfully'=>'导入成功', + +// Added after 5.0.4 GA + +//added for duplicate handling +'LBL_LAST_IMPORT'=>'Last Imported', +'Select_Criteria_For_Duplicate' => 'Select Criteria For Duplicate Records Handling', +'Manual_Merging' => 'Manual Merging', +'Auto_Merging' => 'Auto Merging', +'Ignore_Duplicate' => 'Ignore the duplicate import records', +'Overwrite_Duplicate' => 'Overwrite the duplicate records', +'Duplicate_Records_Skipped_Info' => 'No. of Records Skipped as they were duplicates : ', +'Duplicate_Records_Overwrite_Info' => 'No. of Records Overwritten as they were duplicates : ', +'LBL_STEP_4_4' => 'Step 4 of 4 : ', +'LBL_STEP_3_4'=>'Step 3 of 4 :', +'LBL_STEP_2_4'=>'Step 2 of 4 :', +'LBL_STEP_1_4'=>'Step 1 of 4 : ', + +'LBL_DELIMITER' => '定界符:', +'LBL_FORMAT' => '编码:', +); + +/*$mod_list_strings = Array( + "id"=>"Contact ID" + ,"first_name"=>"First Name" + ,"last_name"=>"Last Name" + ,"salutation"=>"Salutation" + ,"lead_source"=>"Lead Source" + ,"birthdate"=>"Lead Source" + ,"do_not_call"=>"Do Not Call" + ,"email_opt_out"=>"Email Opt Out" + ,"primary_address_street_2"=>"Primary Address Street 2" + ,"primary_address_street_3"=>"Primary Address Street 3" + ,"alt_address_street_2"=>"Other Address Street 2" + ,"alt_address_street_3"=>"Other Address Street 3" + ,"full_name"=>"Full Name" + ,"account_name"=>"Account Name" + ,"account_id"=>"Account ID" + ,"title"=>"Title" + ,"department"=>"Department" + ,"birthdate"=>"Birthdate" + ,"do_not_call"=>"Do Not Call" + ,"phone_home"=>"Phone (Home)" + ,"phone_mobile"=>"Phone (Mobile)" + ,"phone_work"=>"Phone (Work)" + ,"phone_other"=>"Phone (Other)" + ,"phone_fax"=>"Fax" + ,"email1"=>"Email" + ,"email2"=>"Email (Other)" + ,"yahoo_id"=>"Yahoo! ID" + ,"assistant"=>"Assistant" + ,"assistant_phone"=>"Assistant Phone" + ,"primary_address_street"=>"Primary Address Street" + ,"primary_address_city"=>"Primary Address City" + ,"primary_address_state"=>"Primary Address State" + ,"primary_address_postalcode"=>"Primary Address Postalcode" + ,"primary_address_country"=>"Primary Address Country" + ,"alt_address_street"=>"Other Address Street" + ,"alt_address_city"=>"Other Address City" + ,"alt_address_state"=>"Other Address State" + ,"alt_address_postalcode"=>"Other Address Postalcode" + ,"alt_address_country"=>"Other Address Country" + ,"description"=>"Description" + + ),*/ +$mod_list_strings = Array( +'contacts_import_fields' => Array( + //"id"=>"Contact ID" + "firstname"=>"名字" + ,"lastname"=>"姓氏" + ,"salutationtype"=>"称号" + ,"leadsource"=>"资料来源" + ,"birthday"=>"出生日期" + ,"donotcall"=>"请勿来电" + ,"emailoptout"=>"请勿来信" + //,"primary_address_street_2"=>"Primary Address Street 2" + //,"primary_address_street_3"=>"Primary Address Street 3" + //,"alt_address_street_2"=>"Other Address Street 2" + //,"alt_address_street_3"=>"Other Address Street 3" + //,"full_name"=>"Full Name" + //,"account_name"=>"Account Name" + ,'account_id' => '公司名称' + ,'title' => '标题' + ,'department' => '部门' + //,"birthdate"=>"Birthdate" + //,"do_not_call"=>"Do Not Call" + ,"homephone"=>"电话(家庭)" + ,"mobile"=>"电话 (手机)" + ,"phone"=>"电话 (工作)" + ,"otherphone"=>"电话 (其他)" + ,"fax"=>"传真" + ,"email"=>"Email" + ,"otheremail"=>"Email (其他)" + ,"yahooid"=>"Yahoo! ID" + ,"assistant"=>"助理" + ,"assistantphone"=>"助理电话" + ,"mailingstreet"=>"信件地址(街道巷号)" + ,"mailingpobox"=>"信件地址(邮政信箱)" + ,"mailingcity"=>"信件地址(乡镇市区)" + ,"mailingstate"=>"信件地址(县市)" + ,"mailingzip"=>"信件地址(邮政编码)" + ,"mailingcountry"=>"信件地址(国家)" + ,"otherstreet"=>"其它地址(街道巷号)" + ,"otherpobox"=>"其它地址(邮政信箱)" + ,"othercity"=>"其它地址(乡镇市区)" + ,"otherstate"=>"其它地址(县市)" + ,"otherzip"=>"其它地址(邮政编码)" + ,"othercountry"=>"其它地址(国家)" + ,"description"=>"描述" + ,"assigned_user_id"=>"担当者" + ), + +'accounts_import_fields' => Array( + //"id"=>"Account ID", + "accountname"=>"公司名称", + "website"=>"网站", + "industry"=>"企业", + "accounttype"=>"类型", + "tickersymbol"=>"传票符号", + "parent_name"=>"成员", + "employees"=>"员工", + "ownership"=>"潜在客户", + "phone"=>"电话", + "fax"=>"传真", + "otherphone"=>"其他电话", + "email1"=>"Email", + "email2"=>"其他电邮", + "rating"=>"评价", + "siccode"=>"统一编号", + "annual_revenue"=>"年营业额", + "bill_street"=>"账单地址(街道巷号)", + //"billing_address_street_2"=>"Billing Address Street 2", + //"billing_address_street_3"=>"Billing Address Street 3", + //"billing_address_street_4"=>"Billing Address Street 4", + "bill_pobox"=>"账单地址(邮政信箱)", + "bill_city"=>"账单地址(乡镇市区)", + "bill_state"=>"账单地址(县市)", + "bill_code"=>"账单地址(邮政编码)", + "bill_country"=>"账单地址(国家)", + "ship_street"=>"送货地址(街道巷号)", + //"shipping_address_street_2"=>"Shipping Address Street 2", + //"shipping_address_street_3"=>"Shipping Address Street 3", + //"shipping_address_street_4"=>"Shipping Address Street 4", + "ship_pobox"=>"收货住址(邮政信箱)", + "ship_city"=>"送货地址(乡镇市区)", + "ship_state"=>"送货地址(县市)", + "ship_code"=>"送货地址(邮政编码)", + "ship_country"=>"送货地址(国家)", + "description"=>"描述", + "assigned_user_id"=>"负责人" + ), + +'potentials_import_fields' => Array( + //"id"=>"Account ID" + "potentialname"=>"潜在案件名称" + , "account_id"=>"公司名称" + , "opportunity_type"=>"潜在案件类型" + , "leadsource"=>"资料来源" + , "amount"=>"合计" + , "closingdate"=>"关闭日期" + , "nextstep"=>"下一步设定" + , "sales_stage"=>"客服位置" + , "probability"=>"可能性" + , "description"=>"描述" + ,"assigned_user_id"=>"负责人" + ), + + +'leads_import_fields' => Array( + "salutationtype"=>"称号", + "firstname"=>"姓", + "phone"=>"电话", + "lastname"=>"名", + "mobile"=>"手机", + "company"=>"公司", + "fax"=>"传真", + "designation"=>"任命", + "email"=>"Email", + "leadsource"=>"资料来源", + "website"=>"网站", + "industry"=>"企业", + "leadstatus"=>"潜在客户职位", + "annualrevenue"=>"年营业额", + "rating"=>"评价", + "noofemployees"=>"没有雇员", + "assigned_user_id"=>"负责人", + "yahooid"=>"Yahoo Id", + "lane"=>"街道巷号", + "pobox"=>"邮政信箱", + "code"=>"邮政编码", + "city"=>"乡镇市区", + "country"=>"国家", + "state"=>"县市", + "description"=>"描述", + "assigned_user_id"=>"负责人" + ), + + 'products_import_fields' => Array( + 'productname' => '产品名称', + 'productcode' => '产品代码', + 'productcategory' => '产品类别', + 'manufacturer' => '制造商', + 'product_description' => '产品介绍', + 'qty_per_unit' => '单位数量', + 'unit_price' => '单位价格', + 'weight' => '重量', + 'pack_size' => '包装大小', + 'start_date' => '开始日期', + 'expiry_date' => '到期日', + 'cost_factor' => '成本要素', + 'commissionmethod' => '佣金计算方式', + 'discontinued' => '停售', + 'commissionrate' => '佣金率', + 'sales_start_date' => '开始销售日期', + 'sales_end_date' => '停止销售日期', + 'usageunit' => '使用单位', + 'serialno' => '序号', + 'currency' => '货币', + 'reorderlevel' => '安全库存', + 'website' => '网站', + 'taxclass' => '税别', + 'mfr_part_no' => '制造零件编号', + 'vendor_part_no' => '厂商零件编号', + 'qtyinstock' => '库存数量', + 'productsheet' => '产品表', + 'qtyindemand' => '需求数量', + 'glacct' => '会计科目', + 'assigned_user_id' => '负责人' + ), +//Pavani...adding list of import fields for helpdesk and vendors +'helpdesk_import_fields' => Array( + "ticketid"=>"Ticket Id", + "priority"=>"Priority", + "severity"=>"Severity", + "status"=>"Status", + "category"=>"Category", + "title"=>"Title", + "description"=>"Description", + "solution"=>"Solution" + ), + +'vendors_import_fields' => Array( + "vendorid"=>"Vender Id", + "vendorname"=>"Vendor Name", + "phone"=>"Phone", + "email"=>"Email", + "website"=>"Website", + "category"=>"Category", + "street"=>"Street", + "city"=>"City", + "state"=>"State", + "pobox"=>"Post Box", + "postalcode"=>"Postal Code", + "country"=>"Country", + "description"=>"Description" + ) +//Pavani...end list +); + +?> diff --git a/oss/vtiger/trunk/modules/Import/lastImport.php b/oss/vtiger/trunk/modules/Import/lastImport.php new file mode 100644 index 00000000..70e0d050 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/lastImport.php @@ -0,0 +1,207 @@ +info("Import Step last"); + +$parenttab = getParenttab(); +//This Buttons_List1.tpl is is called to display the add, search, import and export buttons ie., second level tabs +$smarty = new vtigerCRM_Smarty; + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("IMP", $import_mod_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +$smarty->assign("MODULE", vtlib_purify($_REQUEST['req_mod'])); +$smarty->assign("SINGLE_MOD", vtlib_purify($_REQUEST['modulename'])); +$smarty->assign("CATEGORY", vtlib_purify($_SESSION['import_parenttab'])); + +global $limit; +global $list_max_entries_per_page; + +$implict_account = false; + +$import_modules_array = Array( + "Leads"=>"Leads", + "Accounts"=>"Accounts", + "Contacts"=>"Contacts", + "Potentials"=>"Potentials", + "Products"=>"Products", + "HelpDesk"=>"ImportTicket", + "Vendors"=>"ImportVendors" + ); + +if(!empty($_REQUEST['req_mod'])) { + $req_mod = $_REQUEST['req_mod']; + checkFileAccess("modules/$req_mod/$req_mod.php"); + require_once("modules/$req_mod/$req_mod.php"); + if(!isset($import_modules_array[$req_mod])) { + $import_modules_array[$req_mod] = $req_mod; + } +} + +foreach($import_modules_array as $module_name => $object_name) +{ + + $seedUsersLastImport = new UsersLastImport(); + $seedUsersLastImport->bean_type = $module_name; + $list_query = $seedUsersLastImport->create_list_query($o,$w); + $current_module_strings = return_module_language($current_language, $module_name); + + $object = new $object_name(); + $seedUsersLastImport->list_fields = $object->list_fields; + + $list_result = $adb->query($list_query); + //Retreiving the no of rows + $noofrows = $adb->num_rows($list_result); + + if($noofrows < 1) { + if($module_name == $_REQUEST['req_mod']) { + echo ""; + echo "
    "; + echo "
    + + + + + + +
    + $app_strings[LBL_NO] $mod_strings[LBL_LAST_IMPORTED] $app_strings[$module_name]
    +
    "; + echo "
    "; + } + } else { + if($module_name != 'Accounts') + { + $implict_account=true; + } + + if($module_name == 'Accounts' && $implict_account==true) + $display_header_msg = "Newly created Accounts"; + else + $display_header_msg = "".$mod_strings['LBL_LAST_IMPORTED']." ".$app_strings[$module_name].""; + + //Display the Header Message + echo " + + + + +
    + ".$mod_strings['LBL_LAST_IMPORTED']." ".$app_strings[$module_name]." +
    + "; + + $smarty = new vtigerCRM_Smarty; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("MODULE",$module_name); + $smarty->assign("SINGLE_MOD",$module_name); + $smarty->assign("SHOW_MASS_SELECT",'false'); + + //Retreiving the start value from request + if($module_name == $_REQUEST['nav_module'] && isset($_REQUEST['start']) && $_REQUEST['start'] != '') { + $start = vtlib_purify($_REQUEST['start']); + } else { + $start = 1; + } + + $info_message='&recordcount='.vtlib_purify($_REQUEST['recordcount']).'&noofrows='.vtlib_purify($_REQUEST['noofrows']).'&message='.vtlib_purify($_REQUEST['message']).'&skipped_record_count='.vtlib_purify($_REQUEST['skipped_record_count']); + $url_string = '&modulename='.vtlib_purify($_REQUEST['modulename']).'&nav_module='.$module_name.$info_message; + $viewid = ''; + + //Retreive the Navigation array + $navigation_array = getNavigationValues($start, $noofrows, $list_max_entries_per_page); + $navigationOutput = getTableHeaderNavigation($navigation_array, $url_string,"Import","ImportSteplast",$viewid); + + //Retreive the List View Header and Entries + $listview_header = getListViewHeader($object,$module_name); + $listview_entries = getListViewEntries($object,$module_name,$list_result,$navigation_array,"","","EditView","Delete",""); + //commented to remove navigation buttons from import list view + //$smarty->assign("NAVIGATION", $navigationOutput); + $smarty->assign("HIDE_CUSTOM_LINKS", 1);//Added to hide the CustomView links in imported records ListView + + // Remove all the links for the list view header as they do not work in this page. + for($i=0;$iassign("LISTHEADER", $listview_header); + $smarty->assign("LISTENTITY", $listview_entries); + + // Include required scripts + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + $smarty->display("ListViewEntries.tpl"); + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Import/parse_utils.php b/oss/vtiger/trunk/modules/Import/parse_utils.php new file mode 100644 index 00000000..ac0af155 --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/parse_utils.php @@ -0,0 +1,148 @@ +&$rows, "field_count"=>$field_count where as &rows is the reference of rows which contains all the parsed rows and $field_count is the number of fields available per row + */ +function parse_import($file_name,$delimiter,$max_lines,$has_header) +{ + $line_count = 0; + + $field_count = 0; + + $rows = array(); + + if (! file_exists($file_name)) + { + return -1; + } + + $fh = fopen($file_name,"r"); + + if (! $fh) + { + return -1; + } + + while ( (( $fields = fgetcsv($fh, 4096, $delimiter) ) !== FALSE) + && ( $max_lines == -1 || $line_count < $max_lines)) + { + + if ( count($fields) == 1 && isset($fields[0]) && $fields[0] == '') + { + break; + } + $this_field_count = count($fields); + + if ( $this_field_count > $field_count) + { + $field_count = $this_field_count; + } + + array_push($rows,$fields); + + $line_count++; + + } + + // got no rows + if ( count($rows) == 0) + { + return -3; + } + + $ret_array = array( + "rows"=>&$rows, + "field_count"=>$field_count + ); + + return $ret_array; + +} + +/** function used to parse the act file + * @param string $file_name - file name + * @param character $delimiter - delimiter of the csv file + * @param int $max_lines - maximum number of lines to parse + * @param int $has_header - if the file has header then 1 otherwise 0 + * @return array $ret_array - return an array which will be "rows"=>&$rows, "field_count"=>$field_count where as &rows is the reference of rows which contains all the parsed rows and $field_count is the number of fields available per row + */ +function parse_import_act($file_name,$delimiter,$max_lines,$has_header) +{ + $line_count = 0; + + $field_count = 0; + + $rows = array(); + + if (! file_exists($file_name)) + { + return -1; + } + + $fh = fopen($file_name,"r"); + + if (! $fh) + { + return -1; + } + + while ( ($line = fgets($fh, 4096)) + && ( $max_lines == -1 || $line_count < $max_lines) ) + + { + + $line = trim($line); + $line = substr_replace($line,"",0,1); + $line = substr_replace($line,"",-1); + $fields = explode("\",\"",$line); + + $this_field_count = count($fields); + + if ( $this_field_count > $field_count) + { + $field_count = $this_field_count; + } + + array_push($rows,$fields); + + $line_count++; + + } + + // got no rows + if ( count($rows) == 0) + { + return -3; + } + + $ret_array = array( + "rows"=>&$rows, + "field_count"=>$field_count + ); + + return $ret_array; + +} +?> diff --git a/oss/vtiger/trunk/modules/Import/picklist_addition.php b/oss/vtiger/trunk/modules/Import/picklist_addition.php new file mode 100644 index 00000000..2f73f15e --- /dev/null +++ b/oss/vtiger/trunk/modules/Import/picklist_addition.php @@ -0,0 +1,104 @@ +pquery("select fieldname from vtiger_field where uitype in ('15') and tabid=? and vtiger_field.presence in (0,2)", array($tabid)); +$no_of_picklists = $adb->num_rows($picklist_result); +for($i=0;$i<$no_of_picklists;$i++) +{ + $fieldname = $adb->query_result($picklist_result, $i, 'fieldname'); + $tablename = "vtiger_".$fieldname; + $picklist_result2 = $adb->query("select * from $tablename"); + $available_picklists[] = $fieldname; + //Now get all picklist values + for($j=0;$j<$adb->num_rows($picklist_result2);$j++) + { + $table_picklist[$fieldname][$j]=$adb->query_result($picklist_result2, $j, $fieldname); + $converted_table_picklist_values[$fieldname][$j] = strtolower($adb->query_result($picklist_result2, $j, $fieldname)); + } +} + +//Collect all picklist values from csv file +foreach($field_to_pos as $fieldname => $ind) +{ + if(in_array($fieldname,$available_picklists)) + { + $adb->println("Picklist - $fieldname is mapped."); + $picklist_pos[$fieldname] = $ind; + for($i=1;$i $temp_array) +{ + $tablename = "vtiger_$fieldname"; + + foreach($temp_array as $ind => $picklist_value) + { + $pick_val = strtolower($picklist_value); + //Check whether $picklist_value is exist in the array of available picklist entries + if(!in_array($pick_val, $converted_table_picklist_values[$fieldname])) + { + + //Not exist, so we have to add this $picklist_value in $fieldname(picklist name) table + $picklist_value = addslashes($picklist_value); + + $adb->println("$picklist_value has to be added in the table $tablename"); + + $cfId=$adb->getUniqueID($tablename); + $unique_picklist_value = getUniquePicklistID(); + $qry="insert into $tablename values(?,?,?,?)"; + $adb->pquery($qry, array($cfId,$picklist_value,1,$unique_picklist_value)); + //added to fix ticket#4492 + $picklistId_qry = "select picklistid from vtiger_picklist where name=?"; + $picklistId_res = $adb->pquery($picklistId_qry,array($fieldname)); + $picklist_Id = $adb->query_result($picklistId_res,0,'picklistid'); + + $role_id = $current_user->roleid; + $sort_qry = "select max(sortid)+1 as sortid from vtiger_role2picklist where picklistid=? and roleid=?"; + $sort_qry_res = $adb->pquery($sort_qry,array($picklist_Id,$role_id)); + $sort_id = $adb->query_result($sort_qry_res,0,'sortid'); + $role_picklist = "insert into vtiger_role2picklist values (?,?,?,?)"; + $adb->pquery($role_picklist,array($role_id,$unique_picklist_value,$picklist_Id,$sort_id)); + } + + + } + +} +function getPicklist($field,$value) +{ + global $table_picklist,$converted_table_picklist_values; + $orginal_val = $table_picklist[$field]; + $converted_val = $converted_table_picklist_values[$field]; + $temp_val = strtolower($value); + + if(in_array($temp_val,$converted_val)) + { + $existkey = array_search($temp_val,$converted_val); + $correct_val=$orginal_val[$existkey]; + return $correct_val; + }else + return null; + +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Invoice/CallRelatedList.php b/oss/vtiger/trunk/modules/Invoice/CallRelatedList.php new file mode 100644 index 00000000..b238a8d0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/CallRelatedList.php @@ -0,0 +1,75 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['subject']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); + } + + global $mod_strings; + global $app_strings; + global $currentModule; + global $theme; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + if (isset($focus->name)) $smarty->assign("NAME", $focus->name); + $related_array=getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("CATEGORY",$category); + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $smarty->assign("ID",$focus->id); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $smarty->assign("MODULE",$currentmodule); + $smarty->assign("SINGLE_MOD",$mod_strings['Invoice']); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Invoice/CreatePDF.php b/oss/vtiger/trunk/modules/Invoice/CreatePDF.php new file mode 100644 index 00000000..ad50e7d0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/CreatePDF.php @@ -0,0 +1,27 @@ +Output($filepath,'F'); //added file name to make it work in IE, also forces the download giving the user the option to save + +}else { + $pdf->Output('Invoice.pdf','D'); //added file name to make it work in IE, also forces the download giving the user the option to save + exit(); +} + +?> diff --git a/oss/vtiger/trunk/modules/Invoice/CustomView.php b/oss/vtiger/trunk/modules/Invoice/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Invoice/Delete.php b/oss/vtiger/trunk/modules/Invoice/Delete.php new file mode 100644 index 00000000..fdc8a921 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/Delete.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Invoice/DetailView.php b/oss/vtiger/trunk/modules/Invoice/DetailView.php new file mode 100644 index 00000000..6676a71d --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/DetailView.php @@ -0,0 +1,126 @@ +retrieve_entity_info($_REQUEST['record'],"Invoice"); + $focus->id = $_REQUEST['record']; + $focus->name=$focus->column_fields['subject']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Order detail view"); + + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("MODULE",$currentModule); + +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); +else $smarty->assign("NAME", ""); +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); + +$smarty->assign("CUSTOMFIELD", $cust_fld); +$smarty->assign("ID", vtlib_purify($_REQUEST['record'])); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign("SINGLE_MOD", 'Invoice'); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +if(isPermitted("Invoice","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +$smarty->assign("CREATEPDF","permitted"); + +if(isPermitted("Invoice","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +//Get the associated Products and then display above Terms and Conditions +$smarty->assign("ASSOCIATED_PRODUCTS",getDetailAssociatedProducts('Invoice',$focus)); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$tabid = getTabid("Invoice"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); +$smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); +$smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); +if($singlepane_view == 'true') +{ + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +$smarty->assign("SinglePane_View", $singlepane_view); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("Inventory/InventoryDetailView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Invoice/DetailViewAjax.php b/oss/vtiger/trunk/modules/Invoice/DetailViewAjax.php new file mode 100644 index 00000000..97801f10 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/DetailViewAjax.php @@ -0,0 +1,46 @@ +retrieve_entity_info($crmid,"Invoice"); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("Invoice"); + if($modObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Invoice/EditView.php b/oss/vtiger/trunk/modules/Invoice/EditView.php new file mode 100644 index 00000000..6a7195ac --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/EditView.php @@ -0,0 +1,387 @@ +assign("SEARCH", $searchurl); +//4600 ends + +$currencyid = fetchCurrency($current_user->id); +$rate_symbol = getCurrencySymbolandCRate($currencyid); +$rate = $rate_symbol['rate']; +if (isset ($_REQUEST['record']) && $_REQUEST['record'] != '') { + if (isset ($_REQUEST['convertmode']) && $_REQUEST['convertmode'] == 'quotetoinvoice') { + $quoteid = $_REQUEST['record']; + $quote_focus = new Quotes(); + $quote_focus->id = $quoteid; + $quote_focus->retrieve_entity_info($quoteid, "Quotes"); + $focus = getConvertQuoteToInvoice($focus, $quote_focus, $quoteid); + + // Reset the value w.r.t Quote Selected + $currencyid = $quote_focus->column_fields['currency_id']; + $rate = $quote_focus->column_fields['conversion_rate']; + + //Added to display the Quote's associated vtiger_products -- when we create vtiger_invoice from Quotes DetailView + $associated_prod = getAssociatedProducts("Quotes", $quote_focus); + $txtTax = (($quote_focus->column_fields['txtTax'] != '') ? $quote_focus->column_fields['txtTax'] : '0.000'); + $txtAdj = (($quote_focus->column_fields['txtAdjustment'] != '') ? $quote_focus->column_fields['txtAdjustment'] : '0.000'); + + $smarty->assign("CONVERT_MODE", vtlib_purify($_REQUEST['convertmode'])); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $quote_focus->mode); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + } + elseif (isset ($_REQUEST['convertmode']) && $_REQUEST['convertmode'] == 'sotoinvoice') { + $soid = $_REQUEST['record']; + $so_focus = new SalesOrder(); + $so_focus->id = $soid; + $so_focus->retrieve_entity_info($soid, "SalesOrder"); + $focus = getConvertSoToInvoice($focus, $so_focus, $soid); + + // Reset the value w.r.t SalesOrder Selected + $currencyid = $so_focus->column_fields['currency_id']; + $rate = $so_focus->column_fields['conversion_rate']; + + //added to set the PO number and terms and conditions + $focus->column_fields['vtiger_purchaseorder'] = $so_focus->column_fields['vtiger_purchaseorder']; + $focus->column_fields['terms_conditions'] = $so_focus->column_fields['terms_conditions']; + + //Added to display the SalesOrder's associated vtiger_products -- when we create vtiger_invoice from SO DetailView + $associated_prod = getAssociatedProducts("SalesOrder", $so_focus); + $txtTax = (($so_focus->column_fields['txtTax'] != '') ? $so_focus->column_fields['txtTax'] : '0.000'); + $txtAdj = (($so_focus->column_fields['txtAdjustment'] != '') ? $so_focus->column_fields['txtAdjustment'] : '0.000'); + + $smarty->assign("CONVERT_MODE", vtlib_purify($_REQUEST['convertmode'])); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $so_focus->mode); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + + } + elseif (isset ($_REQUEST['convertmode']) && $_REQUEST['convertmode'] == 'potentoinvoice') { + $focus->mode = ''; + } + elseif (isset ($_REQUEST['convertmode']) && $_REQUEST['convertmode'] == 'update_so_val') { + //Updating the Selected SO Value in Edit Mode + foreach ($focus->column_fields as $fieldname => $val) { + if (isset ($_REQUEST[$fieldname])) { + $value = $_REQUEST[$fieldname]; + $focus->column_fields[$fieldname] = $value; + } + + } + //Handling for dateformat in vtiger_invoicedate vtiger_field + if ($focus->column_fields['invoicedate'] != '') { + $curr_due_date = $focus->column_fields['invoicedate']; + $focus->column_fields['invoicedate'] = getDBInsertDateValue($curr_due_date); + } + + $soid = $focus->column_fields['salesorder_id']; + $so_focus = new SalesOrder(); + $so_focus->id = $soid; + $so_focus->retrieve_entity_info($soid, "SalesOrder"); + $focus = getConvertSoToInvoice($focus, $so_focus, $soid); + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->name = $focus->column_fields['subject']; + + // Reset the value w.r.t SalesOrder Selected + $currencyid = $so_focus->column_fields['currency_id']; + $rate = $so_focus->column_fields['conversion_rate']; + } else { + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'], "Invoice"); + $focus->name = $focus->column_fields['subject']; + } +} else { + if (isset ($_REQUEST['convertmode']) && $_REQUEST['convertmode'] == 'update_so_val') { + //Updating the Selected SO Value in Create Mode + foreach ($focus->column_fields as $fieldname => $val) { + if (isset ($_REQUEST[$fieldname])) { + $value = $_REQUEST[$fieldname]; + $focus->column_fields[$fieldname] = $value; + } + + } + //Handling for dateformat in vtiger_invoicedate vtiger_field + if ($focus->column_fields['invoicedate'] != '') { + $curr_due_date = $focus->column_fields['invoicedate']; + $focus->column_fields['invoicedate'] = getDBInsertDateValue($curr_due_date); + } + + $soid = $focus->column_fields['salesorder_id']; + $so_focus = new SalesOrder(); + $so_focus->id = $soid; + $so_focus->retrieve_entity_info($soid, "SalesOrder"); + $focus = getConvertSoToInvoice($focus, $so_focus, $soid); + + // Reset the value w.r.t SalesOrder Selected + $currencyid = $so_focus->column_fields['currency_id']; + $rate = $so_focus->column_fields['conversion_rate']; + + //Added to display the SO's associated products -- when we select SO in New Invoice page + if (isset ($_REQUEST['salesorder_id']) && $_REQUEST['salesorder_id'] != '') { + $associated_prod = getAssociatedProducts("SalesOrder", $so_focus, $focus->column_fields['salesorder_id']); + } + + $smarty->assign("SALESORDER_ID", $focus->column_fields['salesorder_id']); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $so_focus->mode); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + + } +} +if (isset ($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $smarty->assign("DUPLICATE_FROM", $focus->id); + $INVOICE_associated_prod = getAssociatedProducts("Invoice", $focus); + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} +if (isset ($_REQUEST['opportunity_id']) && $_REQUEST['opportunity_id'] != '') { + $potfocus = new Potentials(); + $potfocus->column_fields['potential_id'] = $_REQUEST['opportunity_id']; + $associated_prod = getAssociatedProducts("Potentials", $potfocus, $potfocus->column_fields['potential_id']); + +} +if (isset ($_REQUEST['product_id']) && $_REQUEST['product_id'] != '') { + $focus->column_fields['product_id'] = $_REQUEST['product_id']; + $log->debug("Invoice EditView: Product Id from the request is " . $_REQUEST['product_id']); + $associated_prod = getAssociatedProducts("Products", $focus, $focus->column_fields['product_id']); + for ($i=1; $i<=count($associated_prod);$i++) { + $associated_prod_id = $associated_prod[$i]['hdnProductId'.$i]; + $associated_prod_prices = getPricesForProducts($currencyid,array($associated_prod_id),'Products'); + $associated_prod[$i]['listPrice'.$i] = $associated_prod_prices[$associated_prod_id]; + } + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); +} +if (!empty ($_REQUEST['parent_id']) && !empty ($_REQUEST['return_module'])) { + if ($_REQUEST['return_module'] == 'Services') { + $focus->column_fields['product_id'] = $_REQUEST['parent_id']; + $log->debug("Service Id from the request is " . $_REQUEST['parent_id']); + $associated_prod = getAssociatedProducts("Services", $focus, $focus->column_fields['product_id']); + for ($i=1; $i<=count($associated_prod);$i++) { + $associated_prod_id = $associated_prod[$i]['hdnProductId'.$i]; + $associated_prod_prices = getPricesForProducts($currencyid,array($associated_prod_id),'Services'); + $associated_prod[$i]['listPrice'.$i] = $associated_prod_prices[$associated_prod_id]; + } + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + } +} + +if (isset ($_REQUEST['account_id']) && $_REQUEST['account_id'] != '' && ($_REQUEST['record'] == '' || $_REQUEST['convertmode'] == "potentoinvoice") && ($_REQUEST['convertmode'] != 'update_so_val')) { + require_once ('modules/Accounts/Accounts.php'); + $acct_focus = new Accounts(); + $acct_focus->retrieve_entity_info($_REQUEST['account_id'], "Accounts"); + $focus->column_fields['bill_city'] = $acct_focus->column_fields['bill_city']; + $focus->column_fields['ship_city'] = $acct_focus->column_fields['ship_city']; + $focus->column_fields['bill_street'] = $acct_focus->column_fields['bill_street']; + $focus->column_fields['ship_street'] = $acct_focus->column_fields['ship_street']; + $focus->column_fields['bill_state'] = $acct_focus->column_fields['bill_state']; + $focus->column_fields['ship_state'] = $acct_focus->column_fields['ship_state']; + $focus->column_fields['bill_code'] = $acct_focus->column_fields['bill_code']; + $focus->column_fields['ship_code'] = $acct_focus->column_fields['ship_code']; + $focus->column_fields['bill_country'] = $acct_focus->column_fields['bill_country']; + $focus->column_fields['ship_country'] = $acct_focus->column_fields['ship_country']; + $focus->column_fields['bill_pobox'] = $acct_focus->column_fields['bill_pobox']; + $focus->column_fields['ship_pobox'] = $acct_focus->column_fields['ship_pobox']; + +} + +global $theme; +$theme_path = "themes/" . $theme . "/"; +$image_path = $theme_path . "images/"; + +$disp_view = getView($focus->mode); +$mode = $focus->mode; +if ($disp_view == 'edit_view') + $smarty->assign("BLOCKS", getBlocks($currentModule, $disp_view, $mode, $focus->column_fields)); +else { + $bas_block = getBlocks($currentModule, $disp_view, $mode, $focus->column_fields, 'BAS'); + $adv_block = getBlocks($currentModule, $disp_view, $mode, $focus->column_fields, 'ADV'); + + $blocks['basicTab'] = $bas_block; + if (is_array($adv_block)) + $blocks['moreTab'] = $adv_block; + + $smarty->assign("BLOCKS", $blocks); + $smarty->assign("BLOCKS_COUNT", count($blocks)); +} + +$smarty->assign("OP_MODE", $disp_view); + +$smarty->assign("MODULE", $currentModule); +$smarty->assign("SINGLE_MOD", 'Invoice'); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$log->info("Invoice view"); + +if (isset ($focus->name)) + $smarty->assign("NAME", $focus->name); +else + $smarty->assign("NAME", ""); + +if (isset ($_REQUEST['convertmode']) && $_REQUEST['convertmode'] == 'quotetoinvoice') { + $smarty->assign("MODE", $quote_focus->mode); + $se_array = getProductDetailsBlockInfo($quote_focus->mode, "Quotes", $quote_focus); +} +elseif (isset ($_REQUEST['convertmode']) && ($_REQUEST['convertmode'] == 'sotoinvoice' || $_REQUEST['convertmode'] == 'update_so_val')) { + $smarty->assign("MODE", $focus->mode); + $se_array = getProductDetailsBlockInfo($focus->mode, "SalesOrder", $so_focus); + + $txtTax = (($so_focus->column_fields['txtTax'] != '') ? $so_focus->column_fields['txtTax'] : '0.000'); + $txtAdj = (($so_focus->column_fields['txtAdjustment'] != '') ? $so_focus->column_fields['txtAdjustment'] : '0.000'); + + $associated_prod = getAssociatedProducts("SalesOrder", $so_focus); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $focus->mode); +} +elseif ($focus->mode == 'edit') { + $smarty->assign("UPDATEINFO", updateInfo($focus->id)); + $associated_prod = getAssociatedProducts("Invoice", $focus); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $focus->mode); +} +elseif (isset ($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $associated_prod = $INVOICE_associated_prod; + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + $smarty->assign("MODE", $focus->mode); +} +elseif ((isset ($_REQUEST['product_id']) && $_REQUEST['product_id'] != '') || (isset ($_REQUEST['opportunity_id']) && $_REQUEST['opportunity_id'] != '')) { + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $InvTotal = getInventoryTotal($_REQUEST['return_module'], $_REQUEST['return_id']); + $smarty->assign("MODE", $focus->mode); + + //this is to display the Product Details in first row when we create new PO from Product relatedlist + if ($_REQUEST['return_module'] == 'Products') { + $smarty->assign("PRODUCT_ID", vtlib_purify($_REQUEST['product_id'])); + $smarty->assign("PRODUCT_NAME", getProductName($_REQUEST['product_id'])); + $smarty->assign("UNIT_PRICE", vtlib_purify($_REQUEST['product_id'])); + $smarty->assign("QTY_IN_STOCK", getPrdQtyInStck($_REQUEST['product_id'])); + $smarty->assign("VAT_TAX", getProductTaxPercentage("VAT", $_REQUEST['product_id'])); + $smarty->assign("SALES_TAX", getProductTaxPercentage("Sales", $_REQUEST['product_id'])); + $smarty->assign("SERVICE_TAX", getProductTaxPercentage("Service", $_REQUEST['product_id'])); + } +} + +if (isset ($cust_fld)) { + $smarty->assign("CUSTOMFIELD", $cust_fld); +} + +$smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + +if (isset ($_REQUEST['return_module'])) + $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +else + $smarty->assign("RETURN_MODULE", "Invoice"); +if (isset ($_REQUEST['return_action'])) + $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +else + $smarty->assign("RETURN_ACTION", "index"); +if (isset ($_REQUEST['return_id'])) + $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset ($_REQUEST['return_viewname'])) + $smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=" . session_id() . $GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); + +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +//in create new Invoice, get all available product taxes and shipping & Handling taxes + +if ($focus->mode != 'edit') { + $tax_details = getAllTaxes('available'); + $sh_tax_details = getAllTaxes('available', 'sh'); +} else { + $tax_details = getAllTaxes('available', '', $focus->mode, $focus->id); + $sh_tax_details = getAllTaxes('available', 'sh', 'edit', $focus->id); +} +$smarty->assign("GROUP_TAXES", $tax_details); +$smarty->assign("SH_TAXES", $sh_tax_details); + +$tabid = getTabid("Invoice"); +$validationData = getDBValidationData($focus->tab_name, $tabid); +$data = split_validationdataArray($validationData); +$category = getParentTab(); +$smarty->assign("CATEGORY", $category); + +$smarty->assign("VALIDATION_DATA_FIELDNAME", $data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE", $data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL", $data['fieldlabel']); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1", array ( + $currentModule + )); + $mod_seq_prefix = $adb->query_result($mod_seq_string, 0, 'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string, 0, 'cur_id'); + if ($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix . $mod_seq_no)) + echo '
    ' . getTranslatedString('LBL_DUPLICATE') . ' ' . getTranslatedString($mod_seq_field['label']) . + ' - ' . getTranslatedString('LBL_CLICK') . ' ' . getTranslatedString('LBL_HERE') . ' ' . getTranslatedString('LBL_TO_CONFIGURE') . ' ' . getTranslatedString($mod_seq_field['label']) . ''; + else + $smarty->assign("MOD_SEQ_ID", $autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +$smarty->assign("CURRENCIES_LIST", getAllCurrencies()); +if ($focus->mode == 'edit' || $_REQUEST['isDuplicate'] == 'true') { + $inventory_cur_info = getInventoryCurrencyInfo('Invoice', $focus->id); + $smarty->assign("INV_CURRENCY_ID", $inventory_cur_info['currency_id']); +} else { + $smarty->assign("INV_CURRENCY_ID", $currencyid); +} + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); +if ($focus->mode == 'edit') + $smarty->display("Inventory/InventoryEditView.tpl"); +else + $smarty->display('Inventory/InventoryCreateView.tpl'); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Invoice/Invoice.js b/oss/vtiger/trunk/modules/Invoice/Invoice.js new file mode 100644 index 00000000..d1c18bda --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/Invoice.js @@ -0,0 +1,55 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + +document.write(""; +exit(); +?> diff --git a/oss/vtiger/trunk/modules/Invoice/Settings.php b/oss/vtiger/trunk/modules/Invoice/Settings.php new file mode 100644 index 00000000..980dd078 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/Settings.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Invoice/TagCloud.php b/oss/vtiger/trunk/modules/Invoice/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Invoice/UnifiedSearch.php b/oss/vtiger/trunk/modules/Invoice/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Invoice/index.php b/oss/vtiger/trunk/modules/Invoice/index.php new file mode 100644 index 00000000..986c4aa8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/index.php @@ -0,0 +1,52 @@ + diff --git a/oss/vtiger/trunk/modules/Invoice/language/en_us.lang.php b/oss/vtiger/trunk/modules/Invoice/language/en_us.lang.php new file mode 100644 index 00000000..e180996c --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/language/en_us.lang.php @@ -0,0 +1,201 @@ +'Invoice', +'LBL_SO_MODULE_NAME'=>'Invoice', +'LBL_RELATED_PRODUCTS'=>'Product Details', +'LBL_MODULE_TITLE'=>'Invoice: Home', +'LBL_SEARCH_FORM_TITLE'=>'Invoice Search', +'LBL_LIST_FORM_TITLE'=>'Invoice List', +'LBL_LIST_SO_FORM_TITLE'=>'Sales Order List', +'LBL_NEW_FORM_TITLE'=>'New Invoice', +'LBL_NEW_FORM_SO_TITLE'=>'New Sales Order', +'LBL_MEMBER_ORG_FORM_TITLE'=>'Member Organizations', + +'LBL_LIST_ACCOUNT_NAME'=>'Account Name', +'LBL_LIST_CITY'=>'City', +'LBL_LIST_WEBSITE'=>'Website', +'LBL_LIST_STATE'=>'State', +'LBL_LIST_PHONE'=>'Phone', +'LBL_LIST_EMAIL_ADDRESS'=>'Email Address', +'LBL_LIST_CONTACT_NAME'=>'Contact Name', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + +'LBL_ACCOUNT'=>'Account:', +'LBL_ACCOUNT_NAME'=>'Account Name:', +'LBL_PHONE'=>'Phone:', +'LBL_WEBSITE'=>'Website:', +'LBL_FAX'=>'Fax:', +'LBL_TICKER_SYMBOL'=>'Ticker Symbol:', +'LBL_OTHER_PHONE'=>'Other Phone:', +'LBL_ANY_PHONE'=>'Any Phone:', +'LBL_MEMBER_OF'=>'Member of:', +'LBL_EMAIL'=>'Email:', +'LBL_EMPLOYEES'=>'Employees:', +'LBL_OTHER_EMAIL_ADDRESS'=>'Other Email:', +'LBL_ANY_EMAIL'=>'Any Email:', +'LBL_OWNERSHIP'=>'Ownership:', +'LBL_RATING'=>'Rating:', +'LBL_INDUSTRY'=>'Industry:', +'LBL_SIC_CODE'=>'SIC Code:', +'LBL_TYPE'=>'Type:', +'LBL_ANNUAL_REVENUE'=>'Annual Revenue:', +'LBL_ADDRESS_INFORMATION'=>'Address Information', +'LBL_Quote_INFORMATION'=>'Account Information', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', +'LBL_BILLING_ADDRESS'=>'Billing Address:', +'LBL_SHIPPING_ADDRESS'=>'Shipping Address:', +'LBL_ANY_ADDRESS'=>'Any Address:', +'LBL_CITY'=>'City:', +'LBL_STATE'=>'State:', +'LBL_POSTAL_CODE'=>'Postal Code:', +'LBL_COUNTRY'=>'Country:', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', +'LBL_DESCRIPTION'=>'Description:', +'LBL_TERMS_INFORMATION'=>'Terms & Conditions', +'NTC_COPY_BILLING_ADDRESS'=>'Copy billing address to shipping address', +'NTC_COPY_SHIPPING_ADDRESS'=>'Copy shipping address to billing address', +'NTC_REMOVE_MEMBER_ORG_CONFIRMATION'=>'Are you sure you want to remove this record as a member organization?', +'LBL_DUPLICATE'=>'Potential Duplicate Accounts', +'MSG_DUPLICATE' => 'Creating this vtiger_account may vtiger_potentialy create a duplicate vtiger_account. You may either select an vtiger_account from the list below or you may click on Create New Account to continue creating a new vtiger_account with the previously entered data.', + +'LBL_INVITEE'=>'Contacts', +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", + +'LBL_SELECT_ACCOUNT'=>'Select Account', +'LBL_GENERAL_INFORMATION'=>'General Information', + +//for v4 release added +'LBL_NEW_POTENTIAL'=>'New Potential', +'LBL_POTENTIAL_TITLE'=>'Potentials', + +'LBL_NEW_TASK'=>'New Task', +'LBL_TASK_TITLE'=>'Tasks', +'LBL_NEW_CALL'=>'New Call', +'LBL_CALL_TITLE'=>'Calls', +'LBL_NEW_MEETING'=>'New Meeting', +'LBL_MEETING_TITLE'=>'Meetings', +'LBL_NEW_EMAIL'=>'New Email', +'LBL_EMAIL_TITLE'=>'Emails', +'LBL_NEW_CONTACT'=>'New Contact', +'LBL_CONTACT_TITLE'=>'Contacts', + +//Added vtiger_fields after RC1 - Release +'LBL_ALL'=>'All', +'LBL_PROSPECT'=>'Prospect', +'LBL_INVESTOR'=>'Investor', +'LBL_RESELLER'=>'Reseller', +'LBL_PARTNER'=>'Partner', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Account Tools', +//Added for 4GA +'Subject'=>'Subject', +'Quote Name'=>'Quote Name', +'Vendor Name'=>'Vendor Name', +'Invoice Terms'=>'Invoice Terms', +'Contact Name'=>'Contact Name',//to include contact name vtiger_field in Invoice +'Invoice Date'=>'Invoice Date', +'Sub Total'=>'Sub Total', +'Due Date'=>'Due Date', +'Carrier'=>'Carrier', +'Type'=>'Type', +'Sales Tax'=>'Sales Tax', +'Sales Commission'=>'Sales Commission', +'Excise Duty'=>'Excise Duty', +'Total'=>'Total', +'Product Name'=>'Product Name', +'Assigned To'=>'Assigned To', +'Billing Address'=>'Billing Address', +'Shipping Address'=>'Shipping Address', +'Billing City'=>'Billing City', +'Billing State'=>'Billing State', +'Billing Code'=>'Billing Postal Code', +'Billing Country'=>'Billing Country', +'Billing Po Box'=>'Billing PO Box', +'Shipping Po Box'=>'Shipping PO Box', +'Shipping City'=>'Shipping City', +'Shipping State'=>'Shipping State', +'Shipping Code'=>'Shipping Postal Code', +'Shipping Country'=>'Shipping Country', +'City'=>'City', +'State'=>'State', +'Code'=>'Code', +'Country'=>'Country', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Description'=>'Description', +'Potential Name'=>'Potential Name', +'Customer No'=>'Customer No', +'Sales Order'=>'Sales Order', +'Pending'=>'Pending', +'Account Name'=>'Account Name', +'Terms & Conditions'=>'Terms & Conditions', +//Quote Info +'LBL_INVOICE_INFORMATION'=>'Invoice Information', +'LBL_INVOICE'=>'Invoice:', +'LBL_SO_INFORMATION'=>'Sales Order Information', +'LBL_SO'=>'Sales Order:', + +//Added in release 4.2 +'LBL_SUBJECT'=>'Subject:', +'LBL_SALES_ORDER'=>'Sales order:', +'Invoice Id'=>'Invoice Id', +'LBL_MY_TOP_INVOICE'=>'My Top Open Invoice', +'LBL_INVOICE_NAME'=>'Invoice Name:', +'Purchase Order'=>'Purchase Order', +'Status'=>'Status', +'Id'=>'Invoice Id', +'Invoice'=>'Invoice', + +//Added for existing Picklist Entries + +'Created'=>'Created', +'Approved'=>'Approved', +'Sent'=>'Sent', +'Credit Invoice'=>'Credit Invoice', +'Paid'=>'Paid', +//Added to Custom Invoice Number +'Invoice No'=>'Invoice No', +'Adjustment'=>'Adjustment', + +//Added for Reports (5.0.4) +'Tax Type'=>'Tax Type', +'Discount Percent'=>'Discount Percent', +'Discount Amount'=>'Discount Amount', +'Terms & Conditions'=>'Terms & Conditions', +'No'=>'No', +'Date'=>'Date', + +// Added affter 5.0.4 GA +//Added for Documents module +'Documents'=>'Documents', +); + +?> diff --git a/oss/vtiger/trunk/modules/Invoice/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Invoice/language/zh_cn.lang.php new file mode 100644 index 00000000..32fa6db2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/language/zh_cn.lang.php @@ -0,0 +1,200 @@ + '发票', + 'LBL_SO_MODULE_NAME' => '发票', + 'LBL_RELATED_PRODUCTS' => '在线清单', + 'LBL_MODULE_TITLE' => '发票:首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻发票', + 'LBL_LIST_FORM_TITLE' => '发票列表', + 'LBL_LIST_SO_FORM_TITLE' => '销售列表', + 'LBL_NEW_FORM_TITLE' => '新增发票', + 'LBL_NEW_FORM_SO_TITLE' => '新增销售', + 'LBL_MEMBER_ORG_FORM_TITLE' => '会员所属单位', + +'LBL_LIST_ACCOUNT_NAME' => '客户名称', + 'LBL_LIST_CITY' => '乡镇市区', + 'LBL_LIST_WEBSITE' => '网站', + 'LBL_LIST_STATE' => '市(县)', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_EMAIL_ADDRESS' => '电子邮件', + 'LBL_LIST_CONTACT_NAME' => '联络人名称', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + + 'LBL_ACCOUNT' => '客户:', + 'LBL_ACCOUNT_NAME' => '客户名称:', + 'LBL_PHONE' => '电话:', + 'LBL_WEBSITE' => '网站:', + 'LBL_FAX' => '传真:', + 'LBL_TICKER_SYMBOL' => '传票符号:', + 'LBL_OTHER_PHONE' => '其它电话:', + 'LBL_ANY_PHONE' => '其它电话:', + 'LBL_MEMBER_OF' => '会员:', + 'LBL_EMAIL' => '电子信箱:', + 'LBL_EMPLOYEES' => '员工数:', + 'LBL_OTHER_EMAIL_ADDRESS' => '其它电子信箱:', + 'LBL_ANY_EMAIL' => '其它电子信箱:', + 'LBL_OWNERSHIP' => '负责人:', + 'LBL_RATING' => '评分:', +'LBL_INDUSTRY' => '产业别:', + 'LBL_SIC_CODE' => '统一编号:', + 'LBL_TYPE' => '类型:', + 'LBL_ANNUAL_REVENUE' => '年收入:', + 'LBL_ADDRESS_INFORMATION' => '地址信息', + 'LBL_Quote_INFORMATION' => '客户信息', + 'LBL_CUSTOM_INFORMATION' => '自订信息', + 'LBL_BILLING_ADDRESS' => '发票地址:', + 'LBL_SHIPPING_ADDRESS' => '送货地址:', + 'LBL_ANY_ADDRESS' => '任一地址:', + 'LBL_CITY' => '乡镇市区:', + 'LBL_STATE' => '市(县):', + 'LBL_POSTAL_CODE' => '邮政编码:', + 'LBL_COUNTRY' => '省(市/自治区):', + 'LBL_DESCRIPTION_INFORMATION' => '细节内容', + 'LBL_DESCRIPTION' => '描述:', + 'LBL_TERMS_INFORMATION' => '限制与条件', + 'NTC_COPY_BILLING_ADDRESS' => '复制发票地址到送货地址', + 'NTC_COPY_SHIPPING_ADDRESS' => '复制送货地址到发票地址', + 'NTC_REMOVE_MEMBER_ORG_CONFIRMATION' => '您确定要移除这笔会员所属单位记录?', + 'LBL_DUPLICATE' => '潜在案件内容复制到客户', + 'MSG_DUPLICATE' => '建立这笔客户数据来自于潜在案件内容,您可以点选客户列表中的客户以复制建立新的客户,并且继承它的相关数据。', + + 'LBL_INVITEE' => '联络人', + 'ERR_DELETE_RECORD' => '必须指定一笔记录编号才能够删除客户。', + 'LBL_SELECT_ACCOUNT' => '选择客户', + 'LBL_GENERAL_INFORMATION' => '一般信息', + +//for v4 release added + 'LBL_NEW_POTENTIAL' => '新增潜在案件', + 'LBL_POTENTIAL_TITLE' => '潜在案件', + + 'LBL_NEW_TASK' => '新增任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => '新增电话记录', + 'LBL_CALL_TITLE' => '电话记录', + 'LBL_NEW_MEETING' => '新增会议记录', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '新增电子邮件', + 'LBL_EMAIL_TITLE' => '邮件', + 'LBL_NEW_CONTACT' => '新增联络人', + 'LBL_CONTACT_TITLE' => '联络人', + +//Added vtiger_fields after RC1 - Release + 'LBL_ALL' => '全部', + 'LBL_PROSPECT' => '期望', + 'LBL_INVESTOR' => '投资者', + 'LBL_RESELLER' => '转售人', + 'LBL_PARTNER' => '伙伴', + +// Added for 4GA + 'LBL_TOOL_FORM_TITLE' => '客户工具', +//Added for 4GA + 'Subject' => '标题', + 'Quote Name' => '报价名称', + 'Vendor Name' => '卖方名称', + 'Invoice Terms' => '发票期限', + 'Contact Name' => '联络人名称',//to include contact name vtiger_field in Invoice + 'Invoice Date' => '发票日期', + 'Sub Total' => '小计', + 'Due Date' => '应付日期', + 'Carrier' => '货运商', + 'Type' => '类型', + 'Sales Tax' => '销售税金', + 'Sales Commission' => '销售佣金', + 'Excise Duty' => '营业税', + 'Total' => '总计 ', + 'Product Name' => '商品名称', + 'Assigned To' => '负责人', + 'Billing Address' => '发票地址', + 'Shipping Address' => '送货地址', + 'Billing City' => '[发票地址]乡镇市区', + 'Billing State' => '[发票地址]市(县)', + 'Billing Code' => '[发票地址]邮政编码', + 'Billing Country' => '[发票地址]省(市/自治区)', + 'Billing Po Box' => '[发票地址]邮政信箱', + 'Shipping Po Box' => '[送货地址]邮政信箱', + 'Shipping City' => '[送货地址]乡镇市区', + 'Shipping State' => '[送货地址]市(县)', + 'Shipping Code' => '[送货地址]邮政编码', + 'Shipping Country' => '[送货地址]省(市/自治区)', +'City' => '乡镇市区', + 'State' => '市(县)', + 'Code' => '邮政编码', + 'Country' => '省(市/自治区)', + 'Created Time' => '建档时间', + 'Modified Time' => '修改时间', + 'Description' => '细节内容', + 'Potential Name' => '潜在案件名称', + 'Customer No' => '客户编号', + 'Sales Order' => '销售', + 'Notes' => '备忘录', + 'Pending' => '期间', + 'Account Name' => '客户名称', + 'Terms & Conditions' => '限制与条件', +//Quote Info + 'LBL_INVOICE_INFORMATION' => '发票信息', + 'LBL_INVOICE' => '发票:', + 'LBL_SO_INFORMATION' => '销售订单信息', + 'LBL_SO' => '销售订单:', + +//Added in release 4.2 + 'LBL_SUBJECT' => '主旨:', + 'LBL_SALES_ORDER' => '销售订单:', + 'Invoice Id' => '发票号码', + 'LBL_MY_TOP_INVOICE' => '自己未处理的发票', + 'LBL_INVOICE_NAME' => '发票名称:', + 'Purchase Order' => '采购订单', + 'Status' => '状态', + 'Id' => '发票编号', + 'Invoice' => '发票', + +//Added for existing Picklist Entries + + 'Created' => '已建立', + 'Approved' => '已审核', + 'Sent' => '已寄送', + 'Credit Invoice' => '贷方发票', + 'Paid' => '已付款', +//Added to Custom Invoice Number +'Invoice No'=>'发票号码', +'Adjustment'=>'调整', +//Added for Reports (5.0.4) +'Tax Type'=>'Tax Type', +'Discount Percent'=>'Discount Percent', +'Discount Amount'=>'Discount Amount', +'Terms & Conditions'=>'Terms & Conditions', +'No'=>'No', +'Date'=>'Date', + +// Added affter 5.0.4 GA +//Added for Documents module +'Documents'=>'Documents', +); + +?> diff --git a/oss/vtiger/trunk/modules/Invoice/pdf_templates/footer.php b/oss/vtiger/trunk/modules/Invoice/pdf_templates/footer.php new file mode 100644 index 00000000..e5b2b016 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/pdf_templates/footer.php @@ -0,0 +1,35 @@ +addDescBlock($description, $app_strings["Description"], $descBlock); + +/* ************** End Description *********************** */ + + + +/* **************** Begin Terms ****************** */ +$termBlock=array("107",$top,"53", $num); +$pdf->addDescBlock($conditions, $app_strings["Terms & Conditions"], $termBlock); + +/* ************** End Terms *********************** */ + + +?> diff --git a/oss/vtiger/trunk/modules/Invoice/pdf_templates/header.php b/oss/vtiger/trunk/modules/Invoice/pdf_templates/header.php new file mode 100644 index 00000000..5965594a --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/pdf_templates/header.php @@ -0,0 +1,104 @@ +addImage( $logo_name, $imageBlock); + +// x,y,width +if($org_phone != '') + $phone ="\n".$app_strings["Phone"].":".$org_phone; + +$companyBlockPositions=array( "10","23","62" ); +$companyText=$org_address."\n".$org_city.", ".$org_state." ".$org_code." ".$org_country." ".$phone."\n".$org_website; +$pdf->addTextBlock( $org_name, $companyText ,$companyBlockPositions ); + +// ************** End company information ******************* + + + +// ************* Begin Top-Right Header *************** +// title +$titleBlock=array("147","7"); +$pdf->title( $app_strings["Invoice"],"", $titleBlock ); + +$soBubble=array("168","17","12"); +$pdf->addBubbleBlock($so_name, $app_strings["SalesOrder"], $soBubble); + +$poBubble=array("114","17","12"); +$pdf->addBubbleBlock($po_name, $app_strings["PurchaseOrder"], $poBubble); + +// page number +$pageBubble=array("147","17",0); +$pdf->addBubbleBlock($page_num, $app_strings["Page"], $pageBubble); +// ************** End Top-Right Header ***************** + + + +// ************** Begin Addresses ************** +// shipping Address +$shipLocation = array("147","40","61"); +if(trim($ship_street)!='') + $shipText = $ship_street."\n"; +if(trim($ship_city) !='') + $shipText .= $ship_city.", "; +if(trim($ship_state)!='' || trim($ship_code)!= '') + $shipText .= $ship_state." ".$ship_code."\n"; + + $shipText .=$ship_country; + +$pdf->addTextBlock( $app_strings["Shipping Address"].":", $shipText, $shipLocation ); + +// billing Address +$billPositions = array("10","51","61"); +if(trim($bill_street)!='') + $billText = $bill_street."\n"; +if(trim($bill_city) !='') + $billText .= $bill_city.", "; +if(trim($bill_state)!='' || trim($bill_code)!= '') + $billText .= $bill_state." ".$bill_code."\n"; + + $billText .=$bill_country; +$pdf->addTextBlock($app_strings["Billing Address"].":",$billText, $billPositions); +// ********** End Addresses ****************** + + + +/* ******** Begin Invoice Data ************************ */ +// terms block +$termBlock=array("10","67"); +$pdf->addRecBlock($account_name, $app_strings["Customer Name"], $termBlock); + +// issue date block +$issueBlock=array("80","37"); +$pdf->addRecBlock(getDisplayDate(date("Y-m-d")), $app_strings["Issue Date"],$issueBlock); + +// due date block +$dueBlock=array("81","52"); +$pdf->addRecBlock($valid_till, $app_strings["Due Date"],$dueBlock); + +// Contact Name block +$conBlock=array("79","67"); +$pdf->addRecBlock($contact_name, $app_strings["Contact Name"],$conBlock); + +// vtiger_invoice number block +$invBlock=array("145","67"); +$pdf->addRecBlock($invoice_no, $app_strings["Invoice Number"],$invBlock); + +/* ************ End Invoice Data ************************ */ + + + +?> diff --git a/oss/vtiger/trunk/modules/Invoice/pdf_templates/lastpage/body.php b/oss/vtiger/trunk/modules/Invoice/pdf_templates/lastpage/body.php new file mode 100644 index 00000000..fc4720c1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/pdf_templates/lastpage/body.php @@ -0,0 +1,62 @@ +watermark( $app_strings["Thank You"], $waterMarkPositions, $waterMarkRotate ); +$waterMarkPositions=array("30","130"); +$pdf->watermark( $app_strings["For Your Business"], $waterMarkPositions, $waterMarkRotate ); + +// blowing bubbles +$Bubble=array("10","80","170","4"); +$pdf->addBubble("", "", $Bubble); + +$Bubble=array("168","131","12"); +//$pdf->addBubbleBlock("Neat Look", "For A", $Bubble); +$Bubble=array("10","131","12"); +//$pdf->addBubbleBlock("The Corners", "Line Up", $Bubble); + + +/* ************* Begin Totals ************************** */ +$totalBlock=array("59","135"); +$names=array($app_strings["Subtotal"],$app_strings["Tax"],$app_strings["Adjustment"],$app_strings["Total"]); +$totals=array($price_subtotal,$price_salestax,$price_adjustment,$price_total); +$pdf->addTotalsRec($names,$totals,$totalBlock); +/* ************* End Totals *************************** */ + +// lets add an image :) +$imageBlock=array("15","95","8","8"); +$pdf->addImage( "sale.jpeg", $imageBlock); +$imageBlock=array("185","95","8","8"); +$pdf->addImage( "sale.jpeg", $imageBlock); + +// descriptions that change sizes! +$descc=count(explode("\n",$description)); +$condc=count(explode("\n",$conditions)); +if( (strlen($description) > 256) || (strlen($conditions) > 256) || $condc >6 || $descc > 6 ) + $num=255; +else + $num=150; + +/* **************** Begin Description ****************** */ +$descBlock=array("10","160","53", $num); +$pdf->addDescBlock($description, $app_strings["Description"], $descBlock); + + +$termBlock=array("107","160","53", $num); +$pdf->addDescBlock($conditions, $app_strings["Terms & Conditions"], $termBlock); + +/* ************** End Terms *********************** */ + + +?> diff --git a/oss/vtiger/trunk/modules/Invoice/pdf_templates/lastpage/footer.php b/oss/vtiger/trunk/modules/Invoice/pdf_templates/lastpage/footer.php new file mode 100644 index 00000000..67de6bfb --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/pdf_templates/lastpage/footer.php @@ -0,0 +1,59 @@ +drawLine($linePos); + $i = (($i+$width)+$pad)-1; +} + +// company addy +if($org_phone != '') +$phone="\n".$app_strings["Phone"].": ".$org_phone; +if($org_fax != '') + $fax ="\nFax: ".$org_fax; +$companyBlockPositions=array( "10","220","60" ); +$companyText=$org_address."\n".$org_city.", ".$org_state." ".$org_code." ".$org_country." ".$phone." ".$fax."\n".$org_website ; +$pdf->addTextBlock( $org_name, $companyText ,$companyBlockPositions ); + + +// billing Address +$billPositions = array("85","235","60"); +if(trim($bill_street)!='') + $billText = $bill_street."\n"; +if(trim($bill_city) !='') + $billText .= $bill_city.", "; +if(trim($bill_state)!='' || trim($bill_code)!= '') + $billText .= $bill_state." ".$bill_code."\n"; + + $billText .=$bill_country; +$pdf->addTextBlock($app_strings["Billing Address"].":",$billText, $billPositions); + +// totals +$totalBlock=array("145","235","10", "110"); +$totalText=$app_strings["Subtotal"].": ".$price_subtotal."\n". + $app_strings["Tax"].": ".$price_salestax."\n". + $app_strings["Adjustment"].": ".$price_adjustment."\n". + $app_strings["Total"].": ".$price_total; +$pdf->addDescBlock($totalText, $app_strings["Total Due"], $totalBlock); + +$blurbBlock=array("10","265","150", "60"); +$blockText=$app_strings["Detach_Info"]; +$pdf->addDescBlock($blockText, $app_strings["Instructions"], $blurbBlock); + +?> diff --git a/oss/vtiger/trunk/modules/Invoice/updateRelations.php b/oss/vtiger/trunk/modules/Invoice/updateRelations.php new file mode 100644 index 00000000..85798501 --- /dev/null +++ b/oss/vtiger/trunk/modules/Invoice/updateRelations.php @@ -0,0 +1,48 @@ +pquery("insert into vtiger_senotesrel values (?,?)", array($forCRMRecord,$id)); + else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/CallRelatedList.php b/oss/vtiger/trunk/modules/Leads/CallRelatedList.php new file mode 100644 index 00000000..f2945827 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/CallRelatedList.php @@ -0,0 +1,103 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->firstname=$focus->column_fields['firstname']; + $focus->lastname=$focus->column_fields['lastname']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); + } + + global $mod_strings; + global $app_strings; + global $theme; + global $currentModule; + global $current_user; + + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + + if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + } + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + + if(!$_SESSION['rlvs'][$module]) + { + unset($_SESSION['rlvs']); + } + + if(isset($_REQUEST['record']) && $_REQUEST['record']!='') + { + $userid = $current_user->id; + $sql = "select fieldname from vtiger_field where uitype = '13' and tabid = 7 and vtiger_field.presence in (0,2)"; + $result = $adb->pquery($sql, array()); + $num_fieldnames = $adb->num_rows($result); + for($i = 0; $i < $num_fieldnames; $i++) + { + $fieldname = $adb->query_result($result,$i,"fieldname"); + $permit= getFieldVisibilityPermission("Leads",$userid,$fieldname); + } + } + + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $smarty->assign("CATEGORY",$category); + $parent_email = getEmailParentsList('Leads',$focus->id, $focus); + $smarty->assign("HIDDEN_PARENTS_LIST",$parent_email); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $smarty->assign("ID",$focus->id); + $smarty->assign("NAME",$focus->lastname.' '.$focus->firstname); + $smarty->assign("EMAIL",$focus->column_fields['email']); + $smarty->assign("YAHOO",$focus->column_fields['yahooid']); + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("SINGLE_MOD",$app_strings['Lead']); + $smarty->assign("MODULE", $currentmodule); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/ConvertLead.php b/oss/vtiger/trunk/modules/Leads/ConvertLead.php new file mode 100644 index 00000000..462b6470 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/ConvertLead.php @@ -0,0 +1,272 @@ +debug(" the id is ".$id); +} +$category = getParentTab(); +//Retreive lead details from database +$sql = "SELECT firstname, lastname, company, smownerid from vtiger_leaddetails inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_leaddetails.leadid where vtiger_leaddetails.leadid =?"; +$result = $adb->pquery($sql, array($id)); +$row = $adb->fetch_array($result); + +//if company field is not present +if(getFieldVisibilityPermission('Leads',$current_user->id,'company') == '1'){ + $row["company"] = ''; +} + +$firstname = $row["firstname"]; +$lastname = $row["lastname"]; +$company = $row["company"]; +$potentialname = $row["company"] ."-"; +$userid = $row["smownerid"]; + +//Retreiving the current user id +$modified_user_id = $current_user->id; +$log->info("Convert Lead view"); + +$date_format = parse_calendardate($app_strings['NTC_DATE_FORMAT']); + +$roleid=$current_user->roleid; +$subrole = getRoleSubordinates($roleid); +if(count($subrole)> 0) +{ + $roleids = $subrole; + array_push($roleids, $roleid); +} +else +{ + $roleids = $roleid; +} +if($sortid != '') { + $sales_stage_query="select sales_stage from vtiger_sales_stage"; + $params = array(); +} +elseif($is_admin) +{ + $sales_stage_query="select sales_stage from vtiger_sales_stage inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_sales_stage.picklist_valueid where roleid != 'H1' order by sortid"; + $params = array(); +}else +{ + if (count($roleids) > 0) { + $sales_stage_query="select sales_stage from vtiger_sales_stage inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_sales_stage.picklist_valueid where roleid in (". generateQuestionMarks($roleids) .") and picklistid in (select picklistid from vtiger_sales_stage) order by sortid"; + $params = array($roleids); + } else { + $sales_stage_query="select sales_stage from vtiger_sales_stage inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_sales_stage.picklist_valueid where picklistid in (select picklistid from vtiger_sales_stage) order by sortid"; + $params = array(); + } +} +$sales_stage_result = $adb->pquery($sales_stage_query, $params); +$noofsalesRows = $adb->num_rows($sales_stage_result); +$sales_stage_fld = ''; +$sales_stage_list[] = array(); +for($j = 0; $j < $noofsalesRows; $j++) +{ + + $sales_stageValue=$adb->query_result($sales_stage_result,$j,strtolower(sales_stage)); + if(in_array($sales_stageValue,$sales_stage_list)) continue; + $sales_stage_list[] = $sales_stageValue; + if($value == $sales_stageValue) + { + $chk_val = "selected"; + } + else + { + $chk_val = ''; + } + + $sales_stage_fld.= ''; +} +function isActive($field,$mod){ + global $adb,$theme; + $tabid = getTabid($mod); + $query = 'select * from vtiger_field where fieldname = ? and tabid = ? and presence in (0,2)'; + $res = $adb->pquery($query,array($field,$tabid)); + $rows = $adb->num_rows($res); + if($rows > 0){ + return true; + }else + return false; +} +$userselected = ''; +$groupselected = ''; +$userdisplay = 'none'; +$groupdisplay = 'none'; +$private = ''; +if($userid != ''){ + global $adb; + $query = "SELECT * from vtiger_users WHERE id = ?"; + $res = $adb->pquery($query,array($userid)); + $rows = $adb->num_rows($res); + if($rows > 0){ + $userselected = 'checked'; + $userdisplay= 'block'; + }else{ + $groupselected = 'checked'; + $groupdisplay= 'block'; + } +} + +if($current_user->id != 1){ + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + $Acc_tabid= getTabid('Accounts'); + $con_tabid = getTabid('Contacts'); + if($defaultOrgSharingPermission[$Acc_tabid] === 0 || $defaultOrgSharingPermission[$Acc_tabid] == 3){ + $private = 'private'; + }elseif($defaultOrgSharingPermission[$con_tabid] === 0 || $defaultOrgSharingPermission[$con_tabid] == 3){ + $private = 'private'; + } +} + +$convertlead = '
    + + + + + + +
    + + + + + +
    '.$mod_strings['LBL_CONVERT_LEAD'].' '.$firstname.' '.$lastname.'
    + + + + + +
    + + + + + + + + '; + + if(vtlib_isModuleActive('Accounts') && (isPermitted('Accounts','EditView')== 'yes')){ + $convertlead .= ' + + + '; + } +if(vtlib_isModuleActive('Potentials') && (isPermitted('Potentials','EditView')== 'yes')){ +// An array which as module => fields mapping, to check for field permissions +$fields_list = array( 'Potentials'=> array('potentialname', 'closingdate', 'amount', 'sales_stage')); +$fields_permission = array(); +foreach($fields_list as $mod=>$fields){ + foreach($fields as $key=>$field) { + if(getFieldVisibilityPermission($mod, $current_user->id, $field)=='0' && (isActive($field,$mod) == true)){ + $fields_permission[$field] = '0'; + $potTabid = getTabid('Potentials'); + global $adb; + $query = 'select typeofdata from vtiger_field where fieldname = ? and tabid = ?'; + $res = $adb->pquery($query,array($field,$potTabid)); + $type = $adb->query_result($res,0,'typeofdata'); + if(strpos($type,'M')){ + $mandatory[$field] = '*'; + } + } + else + $fields_permission[$field] = '1'; + } +} + +$convertlead .=' + + + + + + '; + +} +$convertlead .='
    '.$mod_strings['LBL_CONVERT_LEAD_INFORMATION'].'
    '.$app_strings['LBL_ASSIGNED_TO'].' +  '.$app_strings['LBL_USER'].' +  '.$app_strings['LBL_GROUP'].' + + + + + + +
    '.$mod_strings['LBL_ACCOUNT_NAME'].'
    '.$mod_strings['LBL_DO_NOT_CREATE_NEW_POTENTIAL'].'
    +
    + '; + if($fields_permission['potentialname']=='0') { + + $convertlead .= ' + + + '; + } + if($fields_permission['closingdate']=='0') { + $convertlead .= ' + + + '; + } + if($fields_permission['amount']=='0') { + $convertlead .= ' + + + '; + } + if($fields_permission['sales_stage']=='0') { + $convertlead .=' + + + '; + } + $convertlead .='
    '.$mandatory['potentialname'].''.$mod_strings['LBL_POTENTIAL_NAME'].' + + +
    '.$mandatory['closingdate'].''.$mod_strings['LBL_POTENTIAL_CLOSE_DATE'].' + + + + ('.$current_user->date_format.') + +
    '.$mandatory['amount'].''.$mod_strings['LBL_POTENTIAL_AMOUNT'].' + + '.$potential_amount.'
    '.$mandatory['sales_stage'].''.$mod_strings['LBL_POTENTIAL_SALES_STAGE'].' + +
    +
    +
    +
    + + + + +
    +    + +
    +
    '; +echo $convertlead; + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/CustomAction.php b/oss/vtiger/trunk/modules/Leads/CustomAction.php new file mode 100644 index 00000000..f72082d0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/CustomAction.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Leads/CustomView.php b/oss/vtiger/trunk/modules/Leads/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Leads/Delete.php b/oss/vtiger/trunk/modules/Leads/Delete.php new file mode 100644 index 00000000..2f7b16bf --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/Delete.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/DetailView.php b/oss/vtiger/trunk/modules/Leads/DetailView.php new file mode 100644 index 00000000..ee12e74f --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/DetailView.php @@ -0,0 +1,179 @@ +id = $_REQUEST['record']; + + $focus->retrieve_entity_info($_REQUEST['record'],"Leads"); + $focus->id = $_REQUEST['record']; + $log->debug("id is ".$focus->id); + $focus->firstname=$focus->column_fields['firstname']; + $focus->lastname=$focus->column_fields['lastname']; + +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; +} + +global $theme,$current_user; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Lead detail view"); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign("SINGLE_MOD", 'Lead'); + +$lead_name = $focus->lastname; +if (getFieldVisibilityPermission($currentModule, $current_user->id,'firstname') == '0') { + $lead_name .= ' '.$focus->firstname; +} +$smarty->assign("NAME",$lead_name ); + +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); +$smarty->assign("CUSTOMFIELD", $cust_fld); + +if(useInternalMailer() == 1) + $smarty->assign("INT_MAILER","true"); + + +$val = isPermitted("Leads","EditView",$_REQUEST['record']); + +if(isPermitted("Leads","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +if(isPermitted("Leads","EditView",$_REQUEST['record']) == 'yes' && isPermitted("Leads","ConvertLead") =='yes' && (isPermitted("Accounts","EditView") =='yes' || isPermitted("Contacts","EditView") == 'yes') && (vtlib_isModuleActive('Contacts') || vtlib_isModuleActive('Accounts'))) +{ + $smarty->assign("CONVERTLEAD","permitted"); +} + +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + + +if(isPermitted("Leads","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +if(isPermitted("Emails","EditView",'') == 'yes') +{ + //Added to pass the parents list as hidden for Emails -- 09-11-2005 + $parent_email = getEmailParentsList('Leads',$_REQUEST['record'], $focus); + $smarty->assign("HIDDEN_PARENTS_LIST",$parent_email); + $smarty->assign("SENDMAILBUTTON","permitted"); + $smarty->assign("EMAIL1",$focus->column_fields['email']); + $smarty->assign("EMAIL2",$focus->column_fields['yahooid']); + +} + +if(isPermitted("Leads","Merge",'') == 'yes') +{ + global $current_user; + require("user_privileges/user_privileges_".$current_user->id.".php"); + + $wordTemplateResult = fetchWordTemplateList("Leads"); + $tempCount = $adb->num_rows($wordTemplateResult); + $tempVal = $adb->fetch_array($wordTemplateResult); + for($templateCount=0;$templateCount<$tempCount;$templateCount++) + { + $optionString[$tempVal["templateid"]] =$tempVal["filename"]; + $tempVal = $adb->fetch_array($wordTemplateResult); + } + if($is_admin) + $smarty->assign("MERGEBUTTON","permitted"); + elseif($tempCount >0) + $smarty->assign("MERGEBUTTON","permitted"); + + $smarty->assign("TEMPLATECOUNT",$tempCount); + $smarty->assign("WORDTEMPLATEOPTIONS",$app_strings['LBL_SELECT_TEMPLATE_TO_MAIL_MERGE']); + $smarty->assign("TOPTIONS",$optionString); +} + +$tabid = getTabid("Leads"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$smarty->assign("MODULE", $currentModule); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); +$smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); +$smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); +$smarty->assign("USE_ASTERISK", get_use_asterisk($current_user->id)); + +if($singlepane_view == 'true') +{ + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} +$smarty->assign("SinglePane_View", $singlepane_view); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +include_once('vtlib/Vtiger/Link.php'); +$customlink_params = Array('MODULE'=>$currentModule, 'RECORD'=>$focus->id, 'ACTION'=>vtlib_purify($_REQUEST['action'])); +$smarty->assign('CUSTOM_LINKS', Vtiger_Link::getAllByType(getTabid($currentModule), Array('DETAILVIEWBASIC','DETAILVIEW'), $customlink_params)); + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("DetailView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/DetailViewAjax.php b/oss/vtiger/trunk/modules/Leads/DetailViewAjax.php new file mode 100644 index 00000000..d3de34ce --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/DetailViewAjax.php @@ -0,0 +1,45 @@ +retrieve_entity_info($crmid,"Leads"); + $leadObj->column_fields[$fieldname] = $fieldvalue; + $leadObj->id = $crmid; + $leadObj->mode = "edit"; + $leadObj->save("Leads"); + if($leadObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/EditView.php b/oss/vtiger/trunk/modules/Leads/EditView.php new file mode 100644 index 00000000..11a1886c --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/EditView.php @@ -0,0 +1,141 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if(isset($_REQUEST['record']) && isset($_REQUEST['record'])) { + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"Leads"); + $focus->firstname=$focus->column_fields['firstname']; + $focus->lastname=$focus->column_fields['lastname']; +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') + $smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +else +{ + $smarty->assign("BASBLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS')); + $smarty->assign("ADVBLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'ADV')); +} +$smarty->assign("OP_MODE",$disp_view); + + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +//retreiving the combo values array + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$lead_name = $focus->lastname; +if (getFieldVisibilityPermission($currentModule, $current_user->id,'firstname') == '0') { + $lead_name .= ' '.$focus->firstname; +} +$smarty->assign("NAME",$lead_name); + +if(isset($cust_fld)) +{ + $smarty->assign("CUSTOMFIELD", $cust_fld); +} +if($focus->mode == 'edit') +{ + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MODE", $focus->mode); +} + +if(isset($_REQUEST['campaignid'])) +$smarty->assign("campaignid",vtlib_purify($_REQUEST['campaignid'])); +if (isset($_REQUEST['return_module'])) +$smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +else +$smarty->assign("RETURN_MODULE","Leads"); +if (isset($_REQUEST['return_action'])) +$smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +else +$smarty->assign("RETURN_ACTION","index"); +if (isset($_REQUEST['return_id'])) +$smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset($_REQUEST['return_viewname'])) +$smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path);$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id()); +$smarty->assign("ID", $focus->id); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Lead'); + +//create the html select code here and assign it +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + + + $tabid = getTabid("Leads"); + $validationData = getDBValidationData($focus->tab_name,$tabid); + $data = split_validationdataArray($validationData); + + $smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); + $smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); + $smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
    '. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +if($focus->mode == 'edit') +$smarty->display("salesEditView.tpl"); +else +$smarty->display("CreateView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/ExportRecords.php b/oss/vtiger/trunk/modules/Leads/ExportRecords.php new file mode 100644 index 00000000..dcbf10eb --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/ExportRecords.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Leads/FindDuplicateRecords.php b/oss/vtiger/trunk/modules/Leads/FindDuplicateRecords.php new file mode 100644 index 00000000..02efee01 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/FindDuplicateRecords.php @@ -0,0 +1,107 @@ +pquery($sql, array($id)); + DeleteEntity($req_module,$return_module,$focus,$id,""); + } + else { + $ids_list[] = $id; + } + } + if(count($ids_list) > 0) { + $ret = getEntityName($req_module,$ids_list); + if(count($ret) > 0) + { + $errormsg = implode(',',$ret); + } + echo "
    "; + echo "
    + + + + + + + + + +
    + $app_strings[LBL_DUP_PERMISSION] $req_module $errormsg
    + $app_strings[LBL_GO_BACK]
    +
    +
    "; + echo "
    "; + exit; + } +} + + +include("include/saveMergeCriteria.php"); +$ret_arr=getDuplicateRecordsArr($req_module); + +$fld_values=$ret_arr[0]; +$total_num_group=count($fld_values); +$fld_name=$ret_arr[1]; +$ui_type=$ret_arr[2]; + +$smarty->assign("NAVIGATION",$ret_arr["navigation"]);//Added for page navigation +$smarty->assign("MODULE",$req_module); +$smarty->assign("NUM_GROUP",$total_num_group); +$smarty->assign("FIELD_NAMES",$fld_name); +$smarty->assign("CATEGORY",$parenttab); +$smarty->assign("ALL_VALUES",$fld_values); +if(isPermitted($req_module,'Delete','') == 'yes') + $button_del = $app_strings['LBL_MASS_DELETE']; +$smarty->assign("DELETE",$button_del); + +$smarty->assign("MOD", return_module_language($current_language,$req_module)); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MODE",'view'); +if(isset($_REQUEST['button_view'])) +{ + $smarty->assign("VIEW",'true'); +} +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("FindDuplicateAjax.tpl"); +else + $smarty->display('FindDuplicateDisplay.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/Import.php b/oss/vtiger/trunk/modules/Leads/Import.php new file mode 100644 index 00000000..ae570f61 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/Import.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Leads/LeadConvertToEntities.php b/oss/vtiger/trunk/modules/Leads/LeadConvertToEntities.php new file mode 100644 index 00000000..780307a9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/LeadConvertToEntities.php @@ -0,0 +1,595 @@ +id.'.php'); +if($assigned_to == "U") + $log->debug("id = $id \n assigned_user_id = $assigned_user_id \n createpotential = $createpotential \n close date = $close_date \n current user id = $current_user_id \n accountname = $accountname \n module = $module"); +else + $log->debug("id = $id \n assigned_user_id = $assigned_group_id \n createpotential = $createpotential \n close date = $close_date \n current user id = $current_user_id \n accountname = $accountname \n module = $module"); + +$rate_symbol=getCurrencySymbolandCRate($user_info['currency_id']); +$rate = $rate_symbol['rate']; +if($potential_amount != '') + $potential_amount = convertToDollar($potential_amount,$rate); + +//Retrieve info from all the vtiger_tables related to leads +$focus = new Leads(); +$focus->retrieve_entity_info($id,"Leads"); + +//get all the lead related columns +$row = $focus->column_fields; + +$date_entered = $adb->formatDate(date('Y-m-d H:i:s'), true); +$date_modified = $adb->formatDate(date('Y-m-d H:i:s'), true); + +/** Function for getting the custom values from leads and saving to vtiger_account/contact/potential custom vtiger_fields. + * @param string $type - Field Type (eg: text, list) + * @param integer $type_id - Field Type ID +*/ +function getInsertValues($type,$type_id) +{ + global $id,$adb,$log; + $log->debug("Entering getInsertValues(".$type.",".$type_id.") method ..."); + $sql_convert_lead="select * from vtiger_convertleadmapping "; + $convert_result = $adb->pquery($sql_convert_lead, array()); + $noofrows = $adb->num_rows($convert_result); + + $value_cf_array = Array(); + for($i=0;$i<$noofrows;$i++) + { + $flag="false"; + $log->info("In vtiger_convertleadmapping function"); + $lead_id=$adb->query_result($convert_result,$i,"leadfid"); + //Getting the relatd customfields for Accounts/Contact/potential from vtiger_convertleadmapping vtiger_table + $account_id_val=$adb->query_result($convert_result,$i,"accountfid"); + $contact_id_val=$adb->query_result($convert_result,$i,"contactfid"); + $potential_id_val=$adb->query_result($convert_result,$i,"potentialfid"); + + $sql_leads_column="select vtiger_field.uitype,vtiger_field.fieldid,vtiger_field.columnname from vtiger_field,vtiger_tab where vtiger_field.tabid=vtiger_tab.tabid and generatedtype=2 and vtiger_tab.name='Leads' and fieldid=? and vtiger_field.presence in (0,2)"; //getting the columnname for the customfield of the lead + $log->debug("Lead's custom vtiger_field coumn name is ".$sql_leads_column); + + $lead_column_result = $adb->pquery($sql_leads_column, array($lead_id)); + $leads_no_rows = $adb->num_rows($lead_column_result); + if($leads_no_rows>0) + { + $lead_column_name=$adb->query_result($lead_column_result,0,"columnname"); + $lead_uitype=$adb->query_result($lead_column_result,0,"uitype"); + $sql_leads_val="select $lead_column_name from vtiger_leadscf where leadid=?"; //custom vtiger_field value for lead + $lead_val_result = $adb->pquery($sql_leads_val,array($id)); + $lead_value=$adb->query_result($lead_val_result,0,$lead_column_name); + $log->debug("Lead's custom vtiger_field value is ".$lead_value); + } + //Query for getting the column name for Accounts/Contacts/Potentials if custom vtiger_field for lead is mappped + $sql_type="select vtiger_field.fieldid,vtiger_field.uitype,vtiger_field.columnname from vtiger_field,vtiger_tab where vtiger_field.tabid=vtiger_tab.tabid and generatedtype=2 and vtiger_field.presence in (0,2) and vtiger_tab.name="; + $params = array(); + if($type=="Accounts") + { + if($account_id_val!="" && $account_id_val!=0) + { + $flag="true"; + $log->info("Getting the Accounts custom vtiger_field column name "); + $sql_type.="'Accounts' and fieldid=?"; + array_push($params, $account_id_val); + } + } + else if($type == "Contacts") + { + if($contact_id_val!="" && $contact_id_val!=0) + { + $flag="true"; + $log->info("Getting the Contacts custom vtiger_field column name "); + $sql_type.="'Contacts' and fieldid=?"; + array_push($params, $contact_id_val); + } + } + else if($type == "Potentials") + { + if($potential_id_val!="" && $potential_id_val!=0) + { + $flag="true"; + $log->info("Getting the Potentials custom vtiger_field column name "); + $sql_type.="'Potentials' and fieldid=?"; + array_push($params, $potential_id_val); + } + } + if($flag=="true") + { + $type_result=$adb->pquery($sql_type, $params); + //To construct the cf array + $colname = $adb->query_result($type_result,0,"columnname"); + $type_insert_column[] = $colname; + $type_uitype =$adb->query_result($type_result,0,"uitype") ; + + //To construct the cf array + $ins_val = $adb->query_result($lead_val_result,0,$lead_column_name); + + //This array is used to store the tablename as the key and the value for that table in the custom field of the uitype only for 15 and 33(Multiselect cf)... + if($lead_uitype == 33 || $lead_uitype == 15) { + $lead_val_arr[$colname] = $lead_column_name; + $value_cf_array[$colname]=$ins_val; + } + + $insert_value[] = $ins_val; + } + } + if(count($value_cf_array) > 0) + { + if(count($type_insert_column) > 0) + { + foreach($value_cf_array as $key => $value) + { + $tableName = $key; + $tableVal = $value; + if($tableVal != '') + { + $tab_val = explode ("|##|",$value); + if(count($tab_val)>0) + { + for($k=0;$knum_rows($adb->query($sql)); + $count=0; + for($n=0;$n < $numRow;$n++) + { + $exist_val = $adb->query_result($adb->query($sql),$n,$tableName); + if(trim($exist_val) == trim($val)) + { + $count++; + } + } + if($count == 0) + { + $cfId=$adb->getUniqueID("vtiger_$tableName"); + $unique_picklist_value = getUniquePicklistID(); + + $qry="insert into vtiger_$tableName values(?,?,?,?)"; + $adb->pquery($qry, array($cfId,trim($val),1,$unique_picklist_value)); + //added to fix ticket#4492 + $picklistId_qry = "select picklistid from vtiger_picklist where name=?"; + $picklistId_res = $adb->pquery($picklistId_qry,array($tableName)); + $picklist_Id = $adb->query_result($picklistId_res,0,'picklistid'); + //While adding a new value into the picklist table, the roleid's which has permission for the lead cf will only given permission for contacts,potentials and account module while converting. -- refer ticket #4885 --- + $role_qry = "select roleid from vtiger_role2picklist where picklistvalueid in (select picklist_valueid from vtiger_".$lead_val_arr[$tableName]." where ".$lead_val_arr[$tableName]."='".trim($val)."')"; + $numOFRole=$adb->num_rows($adb->query($role_qry)); + for($l=0;$l<$numOFRole;$l++) + { + $role_id = $adb->query_result($adb->query($role_qry),$l,'roleid'); + $sort_qry = "select max(sortid)+1 as sortid from vtiger_role2picklist where picklistid=? and roleid=?"; + $sort_qry_res = $adb->pquery($sort_qry,array($picklist_Id,$role_id)); + $sort_id = $adb->query_result($sort_qry_res,0,'sortid'); + $role_picklist = "insert into vtiger_role2picklist values (?,?,?,?)"; + $adb->pquery($role_picklist,array($role_id,$unique_picklist_value,$picklist_Id,$sort_id)); + } + //end + } + } + } + + } + } + } + } + $log->debug("columns to be inserted are ".$type_insert_column); + $log->debug("columns to be inserted are ".$insert_value); + $values = array ('columns'=>$type_insert_column,'values'=>$insert_value); + $log->debug("Exiting getInsertValues method ..."); + return $values; +} +//function Ends + +/** Function used to get the lead related Notes and Attachments with other entities Account, Contact and Potential + * @param integer $id - leadid + * @param integer $accountid - related entity id (accountid) + */ +function getRelatedNotesAttachments($id,$related_id) +{ + global $adb,$log,$id; + $log->debug("Entering getRelatedNotesAttachments(".$id.",".$related_id.") method ..."); + + $sql_lead_notes ="select * from vtiger_senotesrel where crmid=?"; + $lead_notes_result = $adb->pquery($sql_lead_notes, array($id)); + $noofrows = $adb->num_rows($lead_notes_result); + + for($i=0; $i<$noofrows;$i++ ) + { + + $lead_related_note_id=$adb->query_result($lead_notes_result,$i,"notesid"); + $log->debug("Lead related note id ".$lead_related_note_id); + + $sql_insert_notes="insert into vtiger_senotesrel(crmid,notesid) values (?,?)"; + $adb->pquery($sql_insert_notes, array($related_id, $lead_related_note_id)); + } + + $sql_lead_attachment="select * from vtiger_seattachmentsrel where crmid=?"; + $lead_attachment_result = $adb->pquery($sql_lead_attachment, array($id)); + $noofrows = $adb->num_rows($lead_attachment_result); + + for($i=0;$i<$noofrows;$i++) + { + $lead_related_attachment_id=$adb->query_result($lead_attachment_result,$i,"attachmentsid"); + $log->debug("Lead related attachment id ".$lead_related_attachment_id); + + $sql_insert_attachment="insert into vtiger_seattachmentsrel(crmid,attachmentsid) values (?,?)"; + $adb->pquery($sql_insert_attachment, array($related_id, $lead_related_attachment_id)); + } + $log->debug("Exiting getRelatedNotesAttachments method ..."); + +} + +/** Function used to get the lead related activities with other entities Account and Contact + * @param integer $accountid - related entity id + * @param integer $contact_id - related entity id + */ +function getRelatedActivities($accountid,$contact_id) +{ + global $adb,$log,$id; + $log->debug("Entering getRelatedActivities(".$accountid.",".$contact_id.") method ..."); + $sql_lead_activity="select * from vtiger_seactivityrel where crmid=?"; + $lead_activity_result = $adb->pquery($sql_lead_activity, array($id)); + $noofrows = $adb->num_rows($lead_activity_result); + for($i=0;$i<$noofrows;$i++) + { + $lead_related_activity_id=$adb->query_result($lead_activity_result,$i,"activityid"); + $log->debug("Lead related vtiger_activity id ".$lead_related_activity_id); + + $sql_type_email="select setype from vtiger_crmentity where crmid=?"; + $type_email_result = $adb->pquery($sql_type_email, array($lead_related_activity_id)); + $type=$adb->query_result($type_email_result,0,"setype"); + $log->debug("type of vtiger_activity id ".$type); + + $sql_delete_lead_activity="delete from vtiger_seactivityrel where crmid=?"; + $adb->pquery($sql_delete_lead_activity, array($id)); + + if($type != "Emails") + { + $sql_insert_account_activity="insert into vtiger_seactivityrel(crmid,activityid) values (?,?)"; + $adb->pquery($sql_insert_account_activity, array($accountid, $lead_related_activity_id)); + + $sql_insert_contact_activity="insert into vtiger_cntactivityrel(contactid,activityid) values (?,?)"; + $adb->pquery($sql_insert_contact_activity, array($contact_id, $lead_related_activity_id)); + } + else + { + $sql_insert_contact_activity="insert into vtiger_seactivityrel(crmid,activityid) values (?,?)"; + $adb->pquery($sql_insert_contact_activity, array($contact_id, $lead_related_activity_id)); + } + } + $log->debug("Exiting getRelatedActivities method ..."); + +} + +/** Function used to save the lead related products with other entities Account, Contact and Potential + * $leadid - leadid + * $relatedid - related entity id (accountid/contactid/potentialid) + * $setype - related module(Accounts/Contacts/Potentials) + */ +function saveLeadRelatedProducts($leadid, $relatedid, $setype) +{ + global $adb, $log; + $log->debug("Entering into function saveLeadRelatedProducts($leadid, $relatedid)"); + + $product_result = $adb->pquery("select * from vtiger_seproductsrel where crmid=?", array($leadid)); + $noofproducts = $adb->num_rows($product_result); + for($i = 0; $i < $noofproducts; $i++) + { + $productid = $adb->query_result($product_result,$i,'productid'); + $adb->pquery("insert into vtiger_seproductsrel values(?,?,?)", array($relatedid, $productid, $setype)); + } + + $log->debug("Exit from function saveLeadRelatedProducts."); +} + +/** Function used to save the lead related Campaigns with Contact + * $leadid - leadid + * $relatedid - related entity id (contactid) + */ +function saveLeadRelatedCampaigns($leadid, $relatedid) +{ + global $adb, $log; + $log->debug("Entering into function saveLeadRelatedCampaigns($leadid, $relatedid)"); + + $campaign_result = $adb->pquery("select * from vtiger_campaignleadrel where leadid=?", array($leadid)); + $noofcampaigns = $adb->num_rows($campaign_result); + for($i = 0; $i < $noofcampaigns; $i++) + { + $campaignid = $adb->query_result($campaign_result,$i,'campaignid'); + + $adb->pquery("insert into vtiger_campaigncontrel (campaignid, contactid) values(?,?)", array($campaignid, $relatedid)); + } + $log->debug("Exit from function saveLeadRelatedCampaigns."); +} +$crmid =''; +if(vtlib_isModuleActive('Accounts') && isPermitted("Accounts","EditView") =='yes'){ + /*Code integrated to avoid duplicate Account creation during ConvertLead Operation START-- by Bharathi*/ + $acc_query = "select vtiger_account.accountid from vtiger_account left join vtiger_crmentity on vtiger_account.accountid = vtiger_crmentity.crmid where vtiger_crmentity.deleted=0 and vtiger_account.accountname = ?"; + $acc_res = $adb->pquery($acc_query, array($accountname)); + $acc_rows = $adb->num_rows($acc_res); + if($acc_rows != 0){ + $crmid = $adb->query_result($acc_res,0,"accountid"); + + //Retrieve the lead related products and relate them with this new account + getRelatedNotesAttachments($id,$crmid); + saveLeadRelatedProducts($id, $crmid, "Accounts"); + saveLeadRelations($id, $crmid, "Accounts"); + } else if($accountname==''){ + $crmid=''; + } else + { + $crmid = $adb->getUniqueID("vtiger_crmentity"); + + //Saving Account - starts + + $sql_crmentity = "insert into vtiger_crmentity(crmid,smcreatorid,smownerid,setype,presence,createdtime,modifiedtime,deleted,description) values(?,?,?,?,?,?,?,?,?)"; + $sql_params = array($crmid, $current_user_id, $assigned_user_id, 'Accounts', 1, $date_entered, $date_modified, 0, $row['description']); + $adb->pquery($sql_crmentity, $sql_params); + + //Module Sequence Numbering + require_once('modules/Accounts/Accounts.php'); + $acc_no_focus = new Accounts(); + $account_no = $acc_no_focus->setModuleSeqNumber("increment",'Accounts'); + // END + + /* Modified by Minnie to fix the convertlead issue -- START*/ + if(isset($row["annualrevenue"]) && !empty($row["annualrevenue"])) $annualrevenue = $row["annualrevenue"]; + else $annualrevenue = 'null'; + + if(isset($row["noofemployees"]) && !empty($row["noofemployees"])) $employees = $row["noofemployees"]; + else $employees = 'null'; + + $sql_insert_account = "INSERT INTO vtiger_account (account_no,accountid,accountname,industry,annualrevenue,phone,fax,rating,email1,website,employees) VALUES (?,?,?,?,?,?,?,?,?,?,?)"; + /* Modified by Minnie -- END*/ + $account_params = array($account_no,$crmid, $accountname, $row["industry"], $annualrevenue, $row["phone"], $row["fax"], $row["rating"], $row["email"], $row["website"], $employees); + $adb->pquery($sql_insert_account, $account_params); + + /*if($assigned_to !="U"){ + $sql_crmentity = "insert into vtiger_accountgrouprelation(accountid,groupname) values(?,?)"; + $sql_params = array($crmid,$assigned_group_name); + $adb->pquery($sql_crmentity, $sql_params); + }*/ + + $sql_insert_accountbillads = "INSERT INTO vtiger_accountbillads (accountaddressid,bill_city,bill_code,bill_country,bill_state,bill_street,bill_pobox) VALUES (?,?,?,?,?,?,?)"; + $billads_params = array($crmid, $row["city"], $row["code"], $row["country"], $row["state"], $row["lane"], $row["pobox"]); + $adb->pquery($sql_insert_accountbillads, $billads_params); + + $sql_insert_accountshipads = "INSERT INTO vtiger_accountshipads (accountaddressid,ship_city,ship_code,ship_country,ship_pobox,ship_state,ship_street) VALUES (?,?,?,?,?,?,?)"; + $shipads_params = array($crmid, $row["city"], $row["code"], $row["country"], $row["pobox"], $row["state"], $row["lane"]); + $adb->pquery($sql_insert_accountshipads, $shipads_params); + + //Getting the custom vtiger_field values from leads and inserting into Accounts if the vtiger_field is mapped - Jaguar + $col_val= getInsertValues("Accounts",$crmid); + $insert_columns = $col_val['columns']; + $insert_columns[] = "accountid"; + $insert_values = $col_val['values']; + $insert_values[] = $crmid; + $insert_val_str = generateQuestionMarks($insert_values); + $sql_insert_accountcustomfield = "INSERT INTO vtiger_accountscf (". implode(",",$insert_columns) .") VALUES (".$insert_val_str.")"; + $adb->pquery($sql_insert_accountcustomfield, $insert_values); + //Saving Account - ends + + getRelatedNotesAttachments($id,$crmid); + //Retrieve the lead related products and relate them with this new account + saveLeadRelatedProducts($id, $crmid, "Accounts"); + saveLeadRelations($id, $crmid, "Accounts"); + } +} +//Up to this, Account related data save finshed + +if(vtlib_isModuleActive('Contacts') && isPermitted("Contacts","EditView") =='yes'){ + $date_entered = $adb->formatDate(date('Y-m-d H:i:s'), true); + $date_modified = $adb->formatDate(date('Y-m-d H:i:s'), true); + + //Saving Contact - starts + $crmcontactid = $adb->getUniqueID("vtiger_crmentity"); + + $sql_crmentity1 = "insert into vtiger_crmentity(crmid,smcreatorid,smownerid,setype,presence,deleted,description,createdtime,modifiedtime) values(?,?,?,?,?,?,?,?,?)"; + $sql_params = array($crmcontactid, $current_user_id, $assigned_user_id, 'Contacts', 0, 0, $row['description'], $date_entered, $date_modified); + $adb->pquery($sql_crmentity1, $sql_params); + + $contact_id = $crmcontactid; + $log->debug("contact id is ".$contact_id); + + // Module Sequence Numbering + require_once('modules/Contacts/Contacts.php'); + $cont_no_focus = new Contacts(); + $contact_no = $cont_no_focus->setModuleSeqNumber("increment",'Contacts'); + // END + + $sql_insert_contact = "INSERT INTO vtiger_contactdetails (contact_no,contactid,accountid,salutation,firstname,lastname,email,phone,mobile,title,fax,yahooid) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"; + $contact_params = array($contact_no, $contact_id, $crmid, $row["salutationtype"], $row["firstname"], $row["lastname"], $row["email"], $row["phone"], $row["mobile"], $row["designation"], $row["fax"], $row['yahooid']); + $adb->pquery($sql_insert_contact, $contact_params); + + /*if($assigned_to !="U"){ + $sql_crmentity = "insert into vtiger_contactgrouprelation(contactid,groupname) values(?,?)"; + $sql_params = array($contact_id,$assigned_group_name); + $adb->pquery($sql_crmentity, $sql_params); + }*/ + $sql_insert_contactsubdetails = "INSERT INTO vtiger_contactsubdetails (contactsubscriptionid,homephone,otherphone,leadsource) VALUES (?,?,?,?)"; + $c_subd_params = array($contact_id, '', '', $row['leadsource']); + $adb->pquery($sql_insert_contactsubdetails, $c_subd_params); + + $sql_insert_contactaddress = "INSERT INTO vtiger_contactaddress (contactaddressid,mailingcity,mailingstreet,mailingstate,mailingcountry,mailingpobox,mailingzip) VALUES (?,?,?,?,?,?,?)"; + $c_addr_params = array($contact_id, $row["city"], $row["lane"], $row['state'], $row["country"], $row["pobox"], $row['code']); + $adb->pquery($sql_insert_contactaddress, $c_addr_params); + + $sql_insert_customerdetails = "INSERT INTO vtiger_customerdetails (customerid) VALUES (?)"; + $adb->pquery($sql_insert_customerdetails, array($contact_id)); + + //Getting the customfield values from leads and inserting into the respected ContactCustomfield to which it is mapped - Jaguar + $col_val= getInsertValues("Contacts",$contact_id); + $insert_columns = $col_val['columns']; + $insert_columns[] = "contactid"; + $insert_values = $col_val['values']; + $insert_values[] = $contact_id; + $insert_val_str = generateQuestionMarks($insert_values); + $sql_insert_contactcustomfield = "INSERT INTO vtiger_contactscf (". implode(",",$insert_columns) .") VALUES (".$insert_val_str.")"; + $adb->pquery($sql_insert_contactcustomfield, $insert_values); + //Saving Contact - ends + + getRelatedActivities($crmid,$contact_id); //To convert relates Activites and Email -Jaguar + getRelatedNotesAttachments($id,$contact_id); + + //Retrieve the lead related products and relate them with this new contact + saveLeadRelatedProducts($id, $contact_id, "Contacts"); + saveLeadRelations($id, $contact_id, "Contacts"); + + //Retrieve the lead related Campaigns and relate them with this new contact --Minnie + saveLeadRelatedCampaigns($id, $contact_id); +} + +//Up to this, Contact related data save finshed + +//Saving Potential - starts +if((! isset($createpotential) || ! $createpotential == "on") && (!empty($potential_name)) && isPermitted("Potentials","EditView") =='yes' && ($crmid != '' || $crmcontactid != '') && vtlib_isModuleActive('Potentials')) +{ + $log->info("createpotential is not set"); + + $date_entered = $adb->formatDate(date('Y-m-d H:i:s'), true); + $date_modified = $adb->formatDate(date('Y-m-d H:i:s'), true); + + $oppid = $adb->getUniqueID("vtiger_crmentity"); + + $sql_crmentity = "insert into vtiger_crmentity(crmid,smcreatorid,smownerid,setype,presence,deleted,createdtime,modifiedtime,description) values(?,?,?,?,?,?,?,?,?)"; + $sql_params = array($oppid, $current_user_id, $assigned_user_id, 'Potentials', 0, 0, $date_entered, $date_modified, $row['description']); + $adb->pquery($sql_crmentity, $sql_params); + + // Module Sequence Numbering + require_once('modules/Potentials/Potentials.php'); + $pot_no_focus = new Potentials(); + $potential_no = $pot_no_focus->setModuleSeqNumber("increment",'Potentials'); + // END + + if(!isset($potential_amount) || $potential_amount == null) + { + $potential_amount=0; + } + + if($crmid!=''){ + $related_to = $crmid; + } else { + $related_to = $crmcontactid; + } + + $sql_insert_opp = "INSERT INTO vtiger_potential (potential_no,potentialid,related_to,potentialname,leadsource,closingdate,sales_stage,amount) VALUES (?,?,?,?,?,?,?,?)"; + $opp_params = array($potential_no, $oppid, $related_to, $potential_name, $row['leadsource'], $close_date, $potential_sales_stage, $potential_amount); + $adb->pquery($sql_insert_opp, $opp_params); + + //Getting the customfield values from leads and inserting into the respected PotentialCustomfield to which it is mapped - Jaguar + $col_val= getInsertValues("Potentials",$oppid); + $insert_columns = $col_val['columns']; + $insert_columns[] = "potentialid"; + $insert_values = $col_val['values']; + $insert_values[] = $oppid; + $insert_val_str = generateQuestionMarks($insert_values); + $sql_insert_potentialcustomfield = "INSERT INTO vtiger_potentialscf (". implode(",",$insert_columns) .") VALUES (".$insert_val_str.")"; + $adb->pquery($sql_insert_potentialcustomfield, $insert_values); + + if($crmid != '' && $contact_id != ''){ + $sql_insert2contpotentialrel ="insert into vtiger_contpotentialrel values(?,?)"; + $adb->pquery($sql_insert2contpotentialrel, array($contact_id, $oppid)); + } + //Retrieve the lead related products and relate them with this new potential + saveLeadRelatedProducts($id, $oppid, "Potentials"); + saveLeadRelations($id, $oppid, "Potentials"); +} +//Saving Potential - ends +//Up to this, Potential related data save finshed + + +//Deleting from the vtiger_tracker +$sql_delete_tracker= "DELETE from vtiger_tracker where item_id=?"; +$adb->pquery($sql_delete_tracker, array($id)); +$category = getParentTab(); +//Updating the deleted status +if($crmid != '' || $crmcontactid != ''){ + $sql_update_converted = "UPDATE vtiger_leaddetails SET converted = 1 where leadid=?"; + $adb->pquery($sql_update_converted, array($id)); + //updating the campaign-lead relation --Minnie + $sql_update_campleadrel = "delete from vtiger_campaignleadrel where leadid=?"; + $adb->pquery($sql_update_campleadrel, array($id)); +} +if($crmid!=''){ + header("Location: index.php?action=DetailView&module=Accounts&record=$crmid&parenttab=$category"); +} elseif($crmcontactid != '') { + header("Location: index.php?action=DetailView&module=Contacts&record=$crmcontactid&parenttab=$category"); +}else{ + echo ""; + echo "
    "; + echo "
    + + + + + + + + + +
    $currentModule $app_strings[CANNOT_CONVERT]
    + $app_strings[LBL_GO_BACK]
    +
    "; + echo "
    "; +} + +/** Function used to save the lead related services with other entities Account, Contact and Potential + * $leadid - leadid + * $relatedid - related entity id (accountid/contactid/potentialid) + * $setype - related module(Accounts/Contacts/Potentials) + */ +function saveLeadRelations($leadid, $relatedid, $setype) +{ + global $adb, $log; + $log->debug("Entering into function saveLeadRelatedProducts($leadid, $relatedid)"); + + $result = $adb->pquery("select * from vtiger_crmentityrel where crmid=?", array($leadid)); + $noofproducts = $adb->num_rows($result); + for($i = 0; $i < $noofproducts; $i++) + { + $recordid = $adb->query_result($result,$i,'relcrmid'); + $recordmodule = $adb->query_result($result,$i,'relmodule'); + $adb->pquery("insert into vtiger_crmentityrel values(?,?,?,?)", array($relatedid, $setype, $recordid, $recordmodule)); + } + $result = $adb->pquery("select * from vtiger_crmentityrel where relcrmid=?", array($leadid)); + $noofproducts = $adb->num_rows($result); + for($i = 0; $i < $noofproducts; $i++) + { + $recordid = $adb->query_result($result,$i,'crmid'); + $recordmodule = $adb->query_result($result,$i,'module'); + $adb->pquery("insert into vtiger_crmentityrel values(?,?,?,?)", array($relatedid, $setype, $recordid, $recordmodule)); + } + + $log->debug("Exit from function saveLeadRelatedProducts."); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/Leads.js b/oss/vtiger/trunk/modules/Leads/Leads.js new file mode 100644 index 00000000..a2ef6330 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/Leads.js @@ -0,0 +1,152 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + + +document.write(" +pquery($sql, array($templateid)); +$temparray = $adb->fetch_array($result); + +$fileContent = $temparray['data']; +$filename=html_entity_decode($temparray['filename'], ENT_QUOTES, $default_charset); + +// Fix For: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/2107 +$filename= $randomfilename . "_word.doc"; + +$filesize=$temparray['filesize']; +$wordtemplatedownloadpath =$root_directory ."/test/wordtemplatedownload/"; + + +$handle = fopen($wordtemplatedownloadpath .$filename,"wb"); +fwrite($handle,base64_decode($fileContent),$filesize); +fclose($handle); + +//for mass merge +$mass_merge = $_REQUEST['allselectedboxes']; +$single_record = $_REQUEST['record']; + +if($mass_merge != "") +{ + $mass_merge = explode(";",$mass_merge); + //array_pop($mass_merge); + $temp_mass_merge = $mass_merge; + if(array_pop($temp_mass_merge)=="") + array_pop($mass_merge); + //$mass_merge = implode(",",$mass_merge); +}else if($single_record != "") +{ + $mass_merge = $single_record; +}else +{ + die("Record Id is not found"); +} + +//<<<<<<<<<<<<<<<
    >>>>>>>>>>>>>>>>>>>>>>> + +global $current_user; +require('user_privileges/user_privileges_'.$current_user->id.'.php'); +if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0 || $module == "Users" || $module == "Emails") +{ + $query1="select tablename,columnname,fieldlabel from vtiger_field where tabid=7 and vtiger_field.presence in (0,2) order by tablename"; + $params1 = array(); +} +else +{ + $profileList = getCurrentUserProfileList(); + $query1="select vtiger_field.tablename,vtiger_field.columnname,vtiger_field.fieldlabel from vtiger_field INNER JOIN vtiger_profile2field ON vtiger_profile2field.fieldid=vtiger_field.fieldid INNER JOIN vtiger_def_org_field ON vtiger_def_org_field.fieldid=vtiger_field.fieldid where vtiger_field.tabid in (7) AND vtiger_profile2field.visible=0 AND vtiger_def_org_field.visible=0 AND vtiger_profile2field.profileid IN (". generateQuestionMarks($profileList) .") and vtiger_field.presence in (0,2) GROUP BY vtiger_field.fieldid order by vtiger_field.tablename"; + $params1 = array($profileList); + //Postgres 8 fixes + if( $adb->dbType == "pgsql") + $query1 = fixPostgresQuery( $query1, $log, 0); +} + +$result = $adb->pquery($query1, $params1); +$y=$adb->num_rows($result); + +for ($x=0; $x<$y; $x++) +{ + $tablename = $adb->query_result($result,$x,"tablename"); + $columnname = $adb->query_result($result,$x,"columnname"); + $querycolumns[$x] = $tablename.".".$columnname; + if($columnname == "smownerid") + { + $querycolumns[$x] = "case when (vtiger_users.user_name not like '') then concat(vtiger_users.last_name,' ',vtiger_users.first_name) else vtiger_groups.groupname end as username,vtiger_users.first_name,vtiger_users.last_name,vtiger_users.user_name,vtiger_users.yahoo_id,vtiger_users.title,vtiger_users.phone_work,vtiger_users.department,vtiger_users.phone_mobile,vtiger_users.phone_other,vtiger_users.phone_fax,vtiger_users.email1,vtiger_users.phone_home,vtiger_users.email2,vtiger_users.address_street,vtiger_users.address_city,vtiger_users.address_state,vtiger_users.address_postalcode,vtiger_users.address_country"; + } + $field_label[$x] = "LEAD_".strtoupper(str_replace(" ","",$adb->query_result($result,$x,"fieldlabel"))); + if($columnname == "smownerid") + { + $field_label[$x] = $field_label[$x].",USER_FIRSTNAME,USER_LASTNAME,USER_USERNAME,USER_YAHOOID,USER_TITLE,USER_OFFICEPHONE,USER_DEPARTMENT,USER_MOBILE,USER_OTHERPHONE,USER_FAX,USER_EMAIL,USER_HOMEPHONE,USER_OTHEREMAIL,USER_PRIMARYADDRESS,USER_CITY,USER_STATE,USER_POSTALCODE,USER_COUNTRY"; + } +} +$csvheader = implode(",",$field_label); +//<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> + +if(count($querycolumns) > 0) +{ + $selectcolumns = implode($querycolumns,","); + +$query = "select ".$selectcolumns." from vtiger_leaddetails + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_leaddetails.leadid + inner join vtiger_leadsubdetails on vtiger_leadsubdetails.leadsubscriptionid=vtiger_leaddetails.leadid + inner join vtiger_leadaddress on vtiger_leadaddress.leadaddressid=vtiger_leadsubdetails.leadsubscriptionid + inner join vtiger_leadscf on vtiger_leaddetails.leadid = vtiger_leadscf.leadid + LEFT JOIN vtiger_groups + ON vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + where vtiger_crmentity.deleted=0 and vtiger_leaddetails.leadid in (". generateQuestionMarks($mass_merge) .")"; + +$result = $adb->pquery($query, array($mass_merge)); +$avail_pick_arr = getAccessPickListValues('Leads'); +while($columnValues = $adb->fetch_array($result)) +{ + $y=$adb->num_fields($result); + for($x=0; $x<$y; $x++) + { + $value = $columnValues[$x]; + foreach($columnValues as $key=>$val) + { + if($val == $value && $value != '') + { + if(array_key_exists($key,$avail_pick_arr)) + { + if(!in_array($val,$avail_pick_arr[$key])) + { + $value = "Not Accessible"; + } + } + } + } + //<<<<<<<<<<<<<<< For Blank Fields >>>>>>>>>>>>>>>>>>>>>>>>>>>> + if(trim($value) == "--None--" || trim($value) == "--none--") + { + $value = ""; + } + //<<<<<<<<<<<<<<< End >>>>>>>>>>>>>>>>>>>>>>>>>>>> + $actual_values[$x] = $value; + $actual_values[$x] = str_replace('"'," ",$actual_values[$x]); + //if value contains any line feed or carriage return replace the value with ".value." + if (preg_match ("/(\r\n)/", $actual_values[$x])) + { + $actual_values[$x] = '"'.$actual_values[$x].'"'; + } + $actual_values[$x] = decode_html(str_replace(","," ",$actual_values[$x])); + } + $mergevalue[] = implode($actual_values,","); +} +$csvdata = implode($mergevalue,"###"); +}else +{ + die("No vtiger_fields to do Merge"); +} +// Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/2107 +$datafilename = $randomfilename . "_data.csv"; + +$handle = fopen($wordtemplatedownloadpath.$datafilename,"wb"); +fwrite($handle,$csvheader."\r\n"); +fwrite($handle,str_replace("###","\r\n",$csvdata)); +fclose($handle); + +?> + + + + diff --git a/oss/vtiger/trunk/modules/Leads/Popup.php b/oss/vtiger/trunk/modules/Leads/Popup.php new file mode 100644 index 00000000..88877b45 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/Popup.php @@ -0,0 +1,20 @@ + diff --git a/oss/vtiger/trunk/modules/Leads/ProcessDuplicates.php b/oss/vtiger/trunk/modules/Leads/ProcessDuplicates.php new file mode 100644 index 00000000..bb5047fa --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/ProcessDuplicates.php @@ -0,0 +1,134 @@ +pquery("SELECT count(*) AS count FROM vtiger_crmentity WHERE crmid=? and deleted=0", array($merge_id)); + $count = $adb->query_result($result,0,'count'); + + if($count > 0) + { + // First, save the primary record + $focus->mode="edit"; + setObjectValuesFromRequest($focus); + $focus->save($module); + $rec_values=$focus->column_fields; + + // Remove the id of primary record from the list of records to be deleted. + $del_value=explode(",",$recordids,-1); + $offset = array_search($merge_id,$del_value); + unset($del_value[$offset]); + + // Transfer the related lists of the records to be deleted, to the primary record's related list + if(method_exists($focus, 'transferRelatedRecords')){ + $focus->transferRelatedRecords($module,$del_value,$merge_id); + } else { + transferRelatedRecords($module,$del_value,$merge_id); + } + + // Delete the records by id specified in the list + foreach($del_value as $value) + { + DeleteEntity($_REQUEST['module'],$_REQUEST['return_module'],$focus,$value,""); + } + } + + ?> + +assign("EDIT_DUPLICATE",""); + if($record_count == 2) { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + else { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[2]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[2]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + + $all_values_array=getRecordValues($exploded_id,$module); + $all_values=$all_values_array[0]; + $js_arr_val=$all_values_array[1]; + $fld_array=$all_values_array[2]; + $js_arr=implode(",",$js_arr_val); + + $imported_records = Array(); + $sql="select bean_id from vtiger_users_last_import where bean_type=? and deleted=0"; + $result = $adb->pquery($sql, array($module)); + $num_rows=$adb->num_rows($result); + $count=0; + for($i=0; $i<$num_rows;$i++) + { + foreach($exploded_id as $value) + if($value == $adb->query_result($result,$i,"bean_id")) + $count++; + array_push($imported_records,$adb->query_result($result,$i,"bean_id")); + } + + if ($record_count == $count) + $no_existing=1; + else + $no_existing=0; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("RECORD_COUNT",$record_count); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULENAME", $module); + $smarty->assign("PARENT_TAB", $parent_tab); + $smarty->assign("JS_ARRAY", $js_arr); + $smarty->assign("ID_ARRAY", $exploded_id); + $smarty->assign("IDSTRING",$idstring); + $smarty->assign("ALLVALUES", $all_values); + $smarty->assign("FIELD_ARRAY", $fld_array); + $smarty->assign("IMPORTED_RECORDS", $imported_records); + $smarty->assign("NO_EXISTING", $no_existing); + $smarty->display("MergeFields.tpl"); +} + +?> diff --git a/oss/vtiger/trunk/modules/Leads/QuickCreate.php b/oss/vtiger/trunk/modules/Leads/QuickCreate.php new file mode 100644 index 00000000..8d5998b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/QuickCreate.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Leads/Save.php b/oss/vtiger/trunk/modules/Leads/Save.php new file mode 100644 index 00000000..709666d1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/Save.php @@ -0,0 +1,175 @@ +id); +$rate_symbol = getCurrencySymbolandCRate($currencyid); +$rate = $rate_symbol['rate']; +$curr_symbol=$rate_symbol['symbol']; +//added to fix 4600 +$search=vtlib_purify($_REQUEST['search_url']); + +if(isset($_REQUEST['record'])) +{ + $focus->id = $_REQUEST['record']; +} +if(isset($_REQUEST['mode'])) +{ + $focus->mode = $_REQUEST['mode']; +} + +//$focus->retrieve($_REQUEST['record']); + +foreach($focus->column_fields as $fieldname => $val) +{ + if(isset($_REQUEST[$fieldname])) { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + $log->info("the value is ".$value); + $focus->column_fields[$fieldname] = $value; + } +} +if(isset($_REQUEST['annualrevenue'])) { + $value = convertToDollar($_REQUEST['annualrevenue'],$rate); + $focus->column_fields['annualrevenue'] = $value; +} + +if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} + +$focus->save("Leads"); + +$return_id = $focus->id; + $log->info("the return id is ".$return_id); +$parenttab = getParentTab(); +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "Leads"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + +$local_log->debug("Saved record with id of ".$return_id); +//code added for returning back to the current view after edit from list view +if($_REQUEST['return_viewname'] == '') $return_viewname='0'; +if($_REQUEST['return_viewname'] != '')$return_viewname=vtlib_purify($_REQUEST['return_viewname']); + +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] == "Campaigns") +{ + if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") + { + $sql = "delete from vtiger_campaignleadrel where leadid = ?"; + $adb->pquery($sql, array($focus->id)); + $sql = "insert into vtiger_campaignleadrel values (?,?)"; + $adb->pquery($sql, array($_REQUEST['return_id'], $focus->id)); + } +} +header("Location: index.php?action=$return_action&module=$return_module&record=$return_id&parenttab=$parenttab&viewname=$return_viewname&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +/** Function to save the Lead custom fields info into database + * @param integer $entity_id - leadid +*/ +function save_customfields($entity_id) +{ + $log->debug("Entering save_customfields(".$entity_id.") method ..."); + $log->debug("save custom vtiger_field invoked ".$entity_id); + global $adb; + $dbquery="select * from customfields where module='Leads'"; + $result = $adb->pquery($dbquery, array()); + $custquery = "select * from leadcf where leadid=?"; + $cust_result = $adb->pquery($custquery, array($entity_id)); + if($adb->num_rows($result) != 0) + { + + $columns=''; + $params = array(); + $update=''; + $noofrows = $adb->num_rows($result); + for($i=0; $i<$noofrows; $i++) + { + $fldName=$adb->query_result($result,$i,"fieldlabel"); + $colName=$adb->query_result($result,$i,"column_name"); + if(isset($_REQUEST[$colName])) + { + $fldvalue=$_REQUEST[$colName]; + $log->info("the columnName is ".$fldvalue); + if(get_magic_quotes_gpc() == 1) + { + $fldvalue = stripslashes($fldvalue); + } + } + else + { + $fldvalue = ''; + } + if(isset($_REQUEST['record']) && $_REQUEST['record'] != '' && $adb->num_rows($cust_result) !=0) + { + //Update Block + if($i == 0) + { + $update = $colName.'=?'; + } + else + { + $update .= ', '.$colName.'=?'; + } + array_push($params, $fldvalue); + } + else + { + //Insert Block + if($i == 0) + { + $columns='leadid, '.$colName; + array_push($params, $entity_id); + } + else + { + $columns .= ', '.$colName; + } + array_push($params, $fldvalue); + } + + + } + if(isset($_REQUEST['record']) && $_REQUEST['record'] != '' && $adb->num_rows($cust_result) !=0) + { + //Update Block + $query = 'update leadcf SET '.$update.' where leadid=?'; + array_push($params, $entity_id); + $adb->pquery($query, $params); + } + else + { + //Insert Block + $query = 'insert into leadcf ('.$columns.') values('. generateQuestionMarks($params) .')'; + $adb->pquery($query, $params); + } + + } + $log->debug("Exiting save_customfields method ..."); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/Settings.php b/oss/vtiger/trunk/modules/Leads/Settings.php new file mode 100644 index 00000000..1fb34223 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/Settings.php @@ -0,0 +1,76 @@ +pquery("select * from vtiger_settings_field where name = ? and active=0",array('LBL_FIELDFORMULAS')); + if($adb->num_rows($sql_result) > 0) { + $menu_array['FieldFormulas']['location'] = $adb->query_result($sql_result, 0, 'linkto').'&formodule='.$module; + $menu_array['FieldFormulas']['image_src'] = $adb->query_result($sql_result, 0, 'iconpath'); + $menu_array['FieldFormulas']['desc'] = getTranslatedString($adb->query_result($sql_result, 0, 'description'), 'FieldFormulas'); + $menu_array['FieldFormulas']['label'] = getTranslatedString($adb->query_result($sql_result, 0, 'name'), 'FieldFormulas'); + } +} + +if(vtlib_isModuleActive('Tooltip')){ + $sql_result = $adb->pquery("select * from vtiger_settings_field where name = ? and active=0",array('LBL_TOOLTIP_MANAGEMENT')); + if($adb->num_rows($sql_result) > 0) { + $menu_array['Tooltip']['location'] = $adb->query_result($sql_result, 0, 'linkto').'&formodule='.$module; + $menu_array['Tooltip']['image_src'] = vtiger_imageurl($adb->query_result($sql_result, 0, 'iconpath'), $theme); + $menu_array['Tooltip']['desc'] = getTranslatedString($adb->query_result($sql_result, 0, 'description'),'Tooltip'); + $menu_array['Tooltip']['label'] = getTranslatedString($adb->query_result($sql_result, 0, 'name'),'Tooltip'); + } +} + +$menu_array['LeadsMapping']['location'] = 'index.php?module=Settings&action=CustomFieldList&parenttab=Settings&formodule='.$module; +$menu_array['LeadsMapping']['image_src'] = vtiger_imageurl('custom.gif', $theme); +$menu_array['LeadsMapping']['desc'] = getTranslatedString('LEADS_CUSTOM_FIELD_MAPPING_DESCRIPTION'); +$menu_array['LeadsMapping']['label'] = getTranslatedString('LEADS_CUSTOM_FIELD_MAPPING'); + + +$sql_result = $adb->pquery("SELECT * FROM vtiger_settings_field WHERE name = ? AND active=0",array('LBL_WORKFLOW_LIST')); +if($adb->num_rows($sql_result) > 0) { + $menu_array['Workflow']['location'] = $adb->query_result($sql_result, 0, 'linkto').'&list_module='.$module; + $menu_array['Workflow']['image_src'] = vtiger_imageurl($adb->query_result($sql_result, 0, 'iconpath'), $theme); + $menu_array['Workflow']['desc'] = getTranslatedString($adb->query_result($sql_result, 0, 'description'),'com_vtiger_workflow'); + $menu_array['Workflow']['label'] = getTranslatedString($adb->query_result($sql_result, 0, 'name'),'com_vtiger_workflow'); +} + +//add blanks for 3-column layout +$count = count($menu_array)%3; +if($count>0) { + for($i=0;$i<3-$count;$i++) { + $menu_array[] = array(); + } +} + +$smarty->assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("IMAGE_PATH", "themes/$theme/images/"); +$smarty->assign('MODULE',$module); +$smarty->assign('MODULE_LBL',getTranslatedString($module, $module)); +$smarty->assign('MENU_ARRAY', $menu_array); + +$smarty->display(vtlib_getModuleTemplate('Vtiger','Settings.tpl')); + +?> diff --git a/oss/vtiger/trunk/modules/Leads/TagCloud.php b/oss/vtiger/trunk/modules/Leads/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Leads/UnifiedSearch.php b/oss/vtiger/trunk/modules/Leads/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Leads/index.php b/oss/vtiger/trunk/modules/Leads/index.php new file mode 100644 index 00000000..acccb64c --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/index.php @@ -0,0 +1,21 @@ + diff --git a/oss/vtiger/trunk/modules/Leads/language/en_us.lang.php b/oss/vtiger/trunk/modules/Leads/language/en_us.lang.php new file mode 100644 index 00000000..8dcdec4e --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/language/en_us.lang.php @@ -0,0 +1,244 @@ +'Leads', +'LBL_DIRECT_REPORTS_FORM_NAME'=>'Direct Reports', +'LBL_MODULE_TITLE'=>'Leads: Home', +'LBL_SEARCH_FORM_TITLE'=>'Lead Search', +'LBL_LIST_FORM_TITLE'=>'Lead List', +'LBL_NEW_FORM_TITLE'=>'New Lead', +'LBL_LEAD_OPP_FORM_TITLE'=>'Contact-Opportunity:', +'LBL_LEAD'=>'Lead:', +'LBL_ADDRESS_INFORMATION'=>'Address Information', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', + +'LBL_LIST_NAME'=>'Name', +'LBL_LIST_LAST_NAME'=>'Last Name', +'LBL_LIST_COMPANY'=>'Company', +'LBL_LIST_WEBSITE'=>'Website', +'LBL_LIST_LEAD_NAME'=>'Lead Name', +'LBL_LIST_EMAIL'=>'Email', +'LBL_LIST_PHONE'=>'Phone', +'LBL_LIST_LEAD_ROLE'=>'Role', + +'LBL_NAME'=>'Name:', +'LBL_LEAD_NAME'=>'Lead Name:', +'LBL_LEAD_INFORMATION'=>'Lead Information', +'LBL_FIRST_NAME'=>'First Name:', +'LBL_PHONE'=>'Phone:', +'LBL_COMPANY'=>'Company:', +'LBL_DESIGNATION'=>'Designation:', +'LBL_PHONE'=>'Phone:', +'LBL_LAST_NAME'=>'Last Name:', +'LBL_MOBILE'=>'Mobile:', +'LBL_EMAIL'=>'Email:', +'LBL_LEAD_SOURCE'=>'Lead Source:', +'LBL_LEAD_STATUS'=>'Lead Status:', +'LBL_WEBSITE'=>'Website:', +'LBL_FAX'=>'Fax:', +'LBL_INDUSTRY'=>'Industry:', +'LBL_ANNUAL_REVENUE'=>'Annual Revenue:', +'LBL_RATING'=>'Rating:', +'LBL_LICENSE_KEY'=>'License Key:', +'LBL_NO_OF_EMPLOYEES'=>'No. of Employees:', +'LBL_YAHOO_ID'=>'Yahoo! ID:', + +'LBL_ADDRESS_STREET'=>'Street:', +'LBL_ADDRESS_POSTAL_CODE'=>'Postal Code:', +'LBL_ADDRESS_CITY'=>'City:', +'LBL_ADDRESS_COUNTRY'=>'Country:', +'LBL_ADDRESS_STATE'=>'State:', +'LBL_ADDRESS'=>'Address:', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', +'LBL_DESCRIPTION'=>'Description:', + +'LBL_CONVERT_LEAD'=>'Convert Lead:', +'LBL_CONVERT_LEAD_INFORMATION'=>'Convert Lead Information', +'LBL_ACCOUNT_NAME'=>'Account Name', +'LBL_POTENTIAL_NAME'=>'Potential Name', +'LBL_POTENTIAL_CLOSE_DATE'=>'Potential Close Date', +'LBL_POTENTIAL_AMOUNT'=>'Potential Amount', +'LBL_POTENTIAL_SALES_STAGE'=>'Potential Sales Stage', + + +'NTC_DELETE_CONFIRMATION'=>'Are you sure you want to delete this record?', +'NTC_REMOVE_CONFIRMATION'=>'Are you sure you want to remove this contact from this case?', +'NTC_REMOVE_DIRECT_REPORT_CONFIRMATION'=>'Are you sure you want to remove this record as a direct vtiger_report?', +'NTC_REMOVE_OPP_CONFIRMATION'=>'Are you sure you want to remove this contact from this opportunity?', +'ERR_DELETE_RECORD'=>"en_us A record number must be specified to delete the contact.", +'NTC_COPY_PRIMARY_ADDRESS'=>'Copy primary address to alternate address', +'NTC_COPY_ALTERNATE_ADDRESS'=>'Copy alternate address to primary address', + +// Added vtiger_fields in fetchfile.php, import.php -- crm4-Beta +'LBL_COLON'=>' : ', +'LBL_IMPORT_LEADS'=>'Import Leads', +'LBL_LEADS_FILE_LIST'=>'Leads File List', +'LBL_INSTRUCTIONS'=>'Instructions', +'LBL_KINDLY_PROVIDE_AN_XLS_FILE'=>'Kindly provide an .xls file alone as input', +'LBL_PROVIDE_ATLEAST_ONE_FILE'=>'Please provide at least one file as input', + +'LBL_NONE'=>'None', +'LBL_ASSIGNED_TO'=>'Assigned To:', +'LBL_SELECT_LEAD'=>'Select Lead', +'LBL_GENERAL_INFORMATION'=>'General Information', +'LBL_DO_NOT_CREATE_NEW_POTENTIAL'=>'Do not create a New Potential upon Conversion', + +//for v4 release added +'LBL_NEW_POTENTIAL'=>'New Potential', +'LBL_POTENTIAL_TITLE'=>'Potentials', + +'LBL_NEW_TASK'=>'New Task', +'LBL_TASK_TITLE'=>'Tasks', +'LBL_NEW_CALL'=>'New Call', +'LBL_CALL_TITLE'=>'Calls', +'LBL_NEW_MEETING'=>'New Meeting', +'LBL_MEETING_TITLE'=>'Meetings', +'LBL_NEW_EMAIL'=>'New Email', +'LBL_EMAIL_TITLE'=>'Emails', +'LBL_NEW_NOTE'=>'New Document', +'LBL_NOTE_TITLE'=>'Documents', +'LBL_NEW_ATTACHMENT'=>'New Attachment', +'LBL_ATTACHMENT_TITLE'=>'Attachments', + + +//Added vtiger_fields after RC1 - Release +'LBL_ALL'=>'All', +'LBL_CONTACTED'=>'Contacted', +'LBL_LOST'=>'Lost', +'LBL_HOT'=>'Hot', +'LBL_COLD'=>'Cold', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Lead Tools', + +'LBL_SELECT_TEMPLATE_TO_MAIL_MERGE'=>'Select template to Mail Merge:', + +//Added for 4GA +'Salutation'=>'Salutation', +'First Name'=>'First Name', +'Phone'=>'Phone', +'Last Name'=>'Last Name', +'Mobile'=>'Mobile', +'Company'=>'Company', +'Fax'=>'Fax', +'Email'=>'Email', +'Lead Source'=>'Lead Source', +'Website'=>'Website', +'Annual Revenue'=>'Annual Revenue', +'Lead Status'=>'Lead Status', +'Industry'=>'Industry', +'Rating'=>'Rating', +'No Of Employees'=>'No Of Employees', +'Assigned To'=>'Assigned To', +'Yahoo Id'=>'Yahoo Id', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Street'=>'Street', +'Postal Code'=>'Postal Code', +'City'=>'City', +'Country'=>'Country', +'State'=>'State', +'Description'=>'Description', +'Po Box'=>'PO Box', +'Campaign Source'=>'Campaign Source', +//Added for CustomView 4.2 Release +'Name'=>'Name', +'LBL_NEW_LEADS'=>'My New Leads', + +//Added for Existing Picklist Entries + +'--None--'=>'--None--', +'Mr.'=>'Mr.', +'Ms.'=>'Ms.', +'Mrs.'=>'Mrs.', +'Dr.'=>'Dr.', +'Prof.'=>'Prof.', + +'Acquired'=>'Acquired', +'Active'=>'Active', +'Market Failed'=>'Market Failed', +'Project Cancelled'=>'Project Cancelled', +'Shutdown'=>'Shutdown', + +'Apparel'=>'Apparel', +'Banking'=>'Banking', +'Biotechnology'=>'Biotechnology', +'Chemicals'=>'Chemicals', +'Communications'=>'Communications', +'Construction'=>'Construction', +'Consulting'=>'Consulting', +'Education'=>'Education', +'Electronics'=>'Electronics', +'Energy'=>'Energy', +'Engineering'=>'Engineering', +'Entertainment'=>'Entertainment', +'Environmental'=>'Environmental', +'Finance'=>'Finance', +'Food & Beverage'=>'Food & Beverage', +'Government'=>'Government', +'Healthcare'=>'Healthcare', +'Hospitality'=>'Hospitality', +'Insurance'=>'Insurance', +'Machinery'=>'Machinery', +'Manufacturing'=>'Manufacturing', +'Media'=>'Media', +'Not For Profit'=>'Not For Profit', +'Recreation'=>'Recreation', +'Retail'=>'Retail', +'Shipping'=>'Shipping', +'Technology'=>'Technology', +'Telecommunications'=>'Telecommunications', +'Transportation'=>'Transportation', +'Utilities'=>'Utilities', +'Other'=>'Other', + +'Cold Call'=>'Cold Call', +'Existing Customer'=>'Existing Customer', +'Self Generated'=>'Self Generated', +'Employee'=>'Employee', +'Partner'=>'Partner', +'Public Relations'=>'Public Relations', +'Direct Mail'=>'Direct Mail', +'Conference'=>'Conference', +'Trade Show'=>'Trade Show', +'Web Site'=>'Web Site', +'Word of mouth'=>'Word of mouth', + +'Attempted to Contact'=>'Attempted to Contact', +'Cold'=>'Cold', +'Contact in Future'=>'Contact in Future', +'Contacted'=>'Contacted', +'Hot'=>'Hot', +'Junk Lead'=>'Junk Lead', +'Lost Lead'=>'Lost Lead', +'Not Contacted'=>'Not Contacted', +'Pre Qualified'=>'Pre Qualified', +'Qualified'=>'Qualified', +'Warm'=>'Warm', + +// Added/Updated for vtiger CRM 5.0.4 + +'Designation'=>'Title', + +// Added after 5.0.4 GA + +//Module Sequence Numbering +'Lead No'=>'Lead No', +// END + +); + +?> diff --git a/oss/vtiger/trunk/modules/Leads/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Leads/language/zh_cn.lang.php new file mode 100644 index 00000000..f101b9a4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/language/zh_cn.lang.php @@ -0,0 +1,243 @@ + '准客户', + 'LBL_DIRECT_REPORTS_FORM_NAME' => '直接输出', + 'LBL_MODULE_TITLE' => '准客户: 首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻准客户', + 'LBL_LIST_FORM_TITLE' => '准客户列表', + 'LBL_NEW_FORM_TITLE' => '新增准客户', + 'LBL_LEAD_OPP_FORM_TITLE' => '联络人-机会:', + 'LBL_LEAD' => '准客户:', + 'LBL_ADDRESS_INFORMATION' => '地址信息', + 'LBL_CUSTOM_INFORMATION' => '自订信息', + + 'LBL_LIST_NAME' => '姓名', + 'LBL_LIST_LAST_NAME' => '姓氏', + 'LBL_LIST_COMPANY' => '公司', + 'LBL_LIST_WEBSITE' => '网站', + 'LBL_LIST_LEAD_NAME' => '准客户名称', + 'LBL_LIST_EMAIL' => '电子邮件', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_LEAD_ROLE' => '职位', + + 'LBL_NAME' => '姓氏:', + 'LBL_LEAD_NAME' => '准客户名称:', + 'LBL_LEAD_INFORMATION' => '准客户信息', + 'LBL_FIRST_NAME' => '姓名:', + 'LBL_PHONE' => '电话:', + 'LBL_COMPANY' => '公司:', +'LBL_DESIGNATION'=>'称号:', +'LBL_PHONE'=>'电话:', +'LBL_LAST_NAME'=>'姓氏:', + 'LBL_MOBILE' => '手机:', + 'LBL_EMAIL' => '电子邮件:', + 'LBL_LEAD_SOURCE' => '准客户来源:', + 'LBL_LEAD_STATUS' => '准客户状态:', + 'LBL_WEBSITE' => '网站:', + 'LBL_FAX' => '传真:', + 'LBL_INDUSTRY' => '企业:', + 'LBL_ANNUAL_REVENUE' => '年营业额:', + 'LBL_RATING' => '评价:', + 'LBL_LICENSE_KEY' => '许可证 Key:', + 'LBL_NO_OF_EMPLOYEES' => '员工数:', + 'LBL_YAHOO_ID' => 'Yahoo账号:', + + 'LBL_ADDRESS_STREET' => '街道巷号:', + 'LBL_ADDRESS_POSTAL_CODE' => '邮政编码:', + 'LBL_ADDRESS_CITY' => '乡镇市区:', + 'LBL_ADDRESS_COUNTRY' => '国家:', + 'LBL_ADDRESS_STATE' => '县市:', + 'LBL_ADDRESS' => '地址:', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息', + 'LBL_DESCRIPTION' => '描述:', + +'LBL_CONVERT_LEAD' => '转换准客户:', + 'LBL_CONVERT_LEAD_INFORMATION' => '转换准客户信息', + 'LBL_ACCOUNT_NAME' => '客户名称', + 'LBL_POTENTIAL_NAME' => '潜在案件名称', + 'LBL_POTENTIAL_CLOSE_DATE' => '潜在案件结束日期', + 'LBL_POTENTIAL_AMOUNT' => '潜在机会金额', + 'LBL_POTENTIAL_SALES_STAGE' => '潜在机会销售策略', + + + 'NTC_DELETE_CONFIRMATION' => '您确定要删除这笔记录?', + 'NTC_REMOVE_CONFIRMATION' => '您确定要从此案件中删除这位联络人?', + 'NTC_REMOVE_DIRECT_REPORT_CONFIRMATION' => '您确里要在直接输出时移除这笔记录?', + 'NTC_REMOVE_OPP_CONFIRMATION' => '您确定要从这笔潜在案件中移除这笔联络人记录?', + 'ERR_DELETE_RECORD' => '删除这笔联络人记录必须指定记录编号.', + 'NTC_COPY_PRIMARY_ADDRESS' => '复制主要地址到替代地址', + 'NTC_COPY_ALTERNATE_ADDRESS' => '复制替代地址到主要地址', + +// Added vtiger_fields in fetchfile.php, import.php -- crm4-Beta +'LBL_COLON' => ' : ', + 'LBL_IMPORT_LEADS' => '导入准客户', + 'LBL_LEADS_FILE_LIST' => '准客户档案列表', + 'LBL_INSTRUCTIONS' => '讲解', + 'LBL_KINDLY_PROVIDE_AN_XLS_FILE' => '友善的提供输入 .xls 档案', + 'LBL_PROVIDE_ATLEAST_ONE_FILE' => '请至少提供一个档案以利于导入作业', + +'LBL_NONE' => '无', + 'LBL_ASSIGNED_TO' => '负责人:', + 'LBL_SELECT_LEAD' => '选择准客户', + 'LBL_GENERAL_INFORMATION' => '一般信息', + 'LBL_DO_NOT_CREATE_NEW_POTENTIAL' => '在转换时不要改变潜在案件', + +//for v4 release added + 'LBL_NEW_POTENTIAL' => '新增潜在案件', + 'LBL_POTENTIAL_TITLE' => '潜在案件', + + 'LBL_NEW_TASK' => '新增任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => '新增电话记录', + 'LBL_CALL_TITLE' => '电话记录', + 'LBL_NEW_MEETING' => '新增会议', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '新增电子邮件', + 'LBL_EMAIL_TITLE' => '电子邮件', + 'LBL_NEW_NOTE' => '新增备忘录', + 'LBL_NOTE_TITLE' => '备忘录', + 'LBL_NEW_ATTACHMENT' => '新增附件', + 'LBL_ATTACHMENT_TITLE' => '附件', + + +//Added vtiger_fields after RC1 - Release +'LBL_ALL' => '全部', + 'LBL_CONTACTED' => '已联络', + 'LBL_LOST' => '失去', + 'LBL_HOT' => '热门', + 'LBL_COLD' => '冷淡', + +// Added for 4GA + 'LBL_TOOL_FORM_TITLE' => '准客户工具', + + 'LBL_SELECT_TEMPLATE_TO_MAIL_MERGE' => '选择要合并的邮件样版:', + +//Added for 4GA + 'Salutation' => '问候', + 'First Name' => '姓名', + 'Phone' => '电话', + 'Last Name' => '姓氏', + 'Mobile' => '手机', + 'Company' => '公司', + 'Fax' => '传真', + 'Designation' => '任命', + 'Email' => '电子邮件', + 'Lead Source' => '准客户来源', + 'Website' => '网站', + 'Annual Revenue' => '年营业额', + 'Lead Status' => '准客户状态', + 'Industry' => '企业', + 'Rating' => '评价', + 'No Of Employees' => '员工数', + 'Assigned To' => '负责人', + 'Yahoo Id' => 'Yahoo账号', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'Street' => '街道巷号', + 'Postal Code' => '邮政编码', + 'City' => '乡镇市区', + 'Country' => '国家', + 'State' => '县市', + 'Description' => '描述', + 'Po Box' => '邮政信箱', + 'Campaign Source' => '活动来源', +//Added for CustomView 4.2 Release +'Name' => '名称', + 'LBL_NEW_LEADS' => '我的新准客户', + +//Added for Existing Picklist Entries + + '--None--' => '-- 无 --', + 'Mr.' => '先生', + 'Ms.' => '小姐', + 'Mrs.' => '太太', + 'Dr.' => '博士', + 'Prof.' => '专家', + + 'Acquired' => '取得', + 'Active' => '启用', + 'Market Failed' => '市场失利', + 'Project Cancelled' => '项目取消', + 'Shutdown' => '关闭', + +'Apparel' => '存在', + 'Banking' => '银行', + 'Biotechnology' => '生物科技', + 'Chemicals' => '化学', + 'Communications' => '交通', + 'Construction' => '建筑', + 'Consulting' => '顾问', + 'Education' => '教育', + 'Electronics' => '电子', + 'Energy' => '能源', + 'Engineering' => '工程', + 'Entertainment' => '娱乐', + 'Environmental' => '环境', + 'Finance' => '财务', + 'Food & Beverage' => '饮食', + 'Government' => '政府', + 'Healthcare' => '健康照护', + 'Hospitality' => '医院', + 'Insurance' => '保险', + 'Machinery' => '机械', + 'Manufacturing' => '工厂', + 'Media' => '媒体', + 'Not For Profit' => '非营利', + 'Recreation' => '娱乐中心', + 'Retail' => '零售', + 'Shipping' => '运输', + 'Technology' => '科技', + 'Telecommunications' => '通讯', + 'Transportation' => '传输', + 'Utilities' => '工具', + 'Other' => '其它', + +'Cold Call' => '陌生拜访', + 'Existing Customer' => '既有客户', + 'Self Generated' => '自动产生', + 'Employee' => '员工', + 'Partner' => '伙伴', + 'Public Relations' => '公开关系', + 'Direct Mail' => '直接发信', + 'Conference' => '研讨会', + 'Trade Show' => '贸易展览', + 'Web Site' => '网站', + 'Word of mouth' => '口耳相传', + +'Attempted to Contact' => '尝试联系', + 'Cold' => '陌生', + 'Contact in Future' => '即将联系', + 'Contacted' => '已联系', + 'Hot' => '热络', + 'Junk Lead' => '没有潜在价值', + 'Lost Lead' => '失去准客户', + 'Not Contacted' => '尚未联系', + 'Pre Qualified' => '已事前确认', + 'Qualified' => '已确认', + 'Warm' => '一般', +// Added/Updated for vtiger CRM 5.0.4 + +'Designation'=>'Title', + +// Added after 5.0.4 GA + +//Module Sequence Numbering +'Lead No'=>'Lead No', +// END +); + +?> diff --git a/oss/vtiger/trunk/modules/Leads/updateRelations.php b/oss/vtiger/trunk/modules/Leads/updateRelations.php new file mode 100644 index 00000000..e7268851 --- /dev/null +++ b/oss/vtiger/trunk/modules/Leads/updateRelations.php @@ -0,0 +1,52 @@ +pquery("insert into vtiger_seproductsrel values (?,?,?)", array($forCRMRecord,$id,$currentModule)); + elseif($dest_mod == 'Campaigns') + $adb->pquery("insert into vtiger_campaignleadrel values(?,?)", array($id,$forCRMRecord)); + elseif($dest_mod == 'Documents') + $adb->pquery("insert into vtiger_senotesrel values (?,?)", array($forCRMRecord,$id)); + else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Meetings/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Meetings/language/zh_cn.lang.php new file mode 100644 index 00000000..d3ab4cb6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Meetings/language/zh_cn.lang.php @@ -0,0 +1,43 @@ + '会议', + 'LBL_MODULE_TITLE' => '会议: 首页', + 'LBL_SEARCH_FORM_TITLE' => '查找会议', + 'LBL_LIST_FORM_TITLE' => '会议列表', + 'LBL_NEW_FORM_TITLE' => '安排会议', + 'LBL_LIST_SUBJECT' => '主题', + 'LBL_LIST_CONTACT' => '联系人', + 'LBL_LIST_RELATED_TO' => '相关对象', + 'LBL_LIST_DATE' => '开始日期', + 'LBL_LIST_TIME' => '开始时间', + 'LBL_LIST_CLOSE' => '完成', + 'LBL_SUBJECT' => '主题: ', + 'LBL_STATUS' => '状态:', + 'LBL_LOCATION' => '位置:', + 'LBL_DATE_TIME' => '开始时间和日期:', + 'LBL_DATE' => '开始日期:', + 'LBL_TIME' => '开始时间:', + 'LBL_DURATION' => '持续时间:', + 'LBL_HOURS_MINS' => '(小时/分钟)', + 'LBL_CONTACT_NAME' => '联系人姓名: ', + 'LBL_MEETING' => '会议:', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息', + 'LBL_DESCRIPTION' => '描述:', + 'LBL_COLON' => ':', + 'LBL_DEFAULT_STATUS' => '已计划', + 'LNK_NEW_LEAD' => '新增线索', + 'LNK_NEW_CONTACT' => '新增联系人', + 'LNK_NEW_ACCOUNT' => '新增客户', + 'LNK_NEW_OPPORTUNITY' => '新增商机', + 'LNK_NEW_CASE' => '新增拜访', + 'LNK_NEW_NOTE' => '新增备忘录', + 'LNK_NEW_CALL' => '新增电话', + 'LNK_NEW_EMAIL' => '新增Email', + 'LNK_NEW_MEETING' => '新增会议', + 'LNK_NEW_TASK' => '新增任务', + 'ERR_DELETE_RECORD' => '必须指定记录编号才能删除会议.', + 'NTC_REMOVE_INVITEE' => '你确定要删除这个会议邀请嗎?', + 'LBL_INVITEE' => '受邀者', + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/MessageBoard/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/MessageBoard/language/zh_cn.lang.php new file mode 100644 index 00000000..0d956cb3 --- /dev/null +++ b/oss/vtiger/trunk/modules/MessageBoard/language/zh_cn.lang.php @@ -0,0 +1,69 @@ + 'Message Board', + 'LBL_MODULE_TITLE' => 'Message Board: Home', + 'LBL_SEARCH_FORM_TITLE' => '查找主题', + 'LBL_LIST_FORM_TITLE' => '主题列表', + 'LBL_NEW_FORM_TITLE' => '发表新主题', + 'LBL_LEAD' => 'Message Boardx:', + 'LBL_LIST_TOPIC' => '主题', + 'LBL_LIST_LAST_NAME' => '名', + 'LBL_LIST_CATEGORY' => '分类', + 'LBL_LIST_REPLIES' => '回复', + 'LBL_LIST_LEAD_NAME' => '线索名称', + 'LBL_LIST_LAST_POST' => '最新主题', + 'LBL_LIST_AUTHOR' => '作者', + 'LBL_LIST_LEAD_ROLE' => '角色', + 'LBL_NAME' => '名字:', + 'LBL_LEAD_NAME' => '线索名称:', + 'LBL_LEAD_INFORMATION' => '线索信息:', + 'LBL_FIRST_NAME' => '姓:', + 'LBL_PHONE' => '电话:', + 'LBL_COMPANY' => '公司:', + 'LBL_DESIGNATION' => '目的地:', + 'LBL_LAST_NAME' => '名:', + 'LBL_MOBILE' => '手机:', + 'LBL_EMAIL' => 'Email:', + 'LBL_LEAD_SOURCE' => '线索来源:', + 'LBL_LEAD_STATUS' => '线索状态:', + 'LBL_WEBSITE' => '网站:', + 'LBL_FAX' => '传真:', + 'LBL_INDUSTRY' => '行业:', + 'LBL_ANNUAL_REVENUE' => '年收入:', + 'LBL_RATING' => '评价:', + 'LBL_LICENSE_KEY' => '许可证Key:', + 'LBL_NO_OF_EMPLOYEES' => '员工数量:', + 'LBL_YAHOO_ID' => 'Yahoo! ID:', + 'LBL_ADDRESS_STREET' => '街道:', + 'LBL_ADDRESS_POSTAL_CODE' => '邮编:', + 'LBL_ADDRESS_CITY' => '城市:', + 'LBL_ADDRESS_COUNTRY' => '国家:', + 'LBL_ADDRESS_STATE' => '省份:', + 'LBL_ADDRESS' => '地址:', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息:', + 'LBL_DESCRIPTION' => '描述:', + 'LBL_CONVERT_LEAD' => '转变线索:', + 'LBL_CONVERT_LEAD_INFORMATION' => '转变线索信息', + 'LBL_ACCOUNT_NAME' => '客户姓名', + 'LBL_POTENTIAL_NAME' => '商机名称', + 'LBL_POTENTIAL_CLOSE_DATE' => '商机完成日期', + 'LNK_NEW_LEAD' => '新增线索', + 'LNK_NEW_CONTACT' => '新增联系人', + 'LNK_NEW_ACCOUNT' => '新增客户', + 'LNK_NEW_OPPORTUNITY' => '新增商机', + 'LNK_NEW_CASE' => '新增拜访', + 'LNK_NEW_NOTE' => '新增备忘录', + 'LNK_NEW_CALL' => '新增电话', + 'LNK_NEW_EMAIL' => '撰写新邮件', + 'LNK_NEW_MEETING' => '新增会议', + 'LNK_NEW_TASK' => '新增任务', + 'NTC_DELETE_CONFIRMATION' => '你确认删除这条记录?', + 'NTC_REMOVE_CONFIRMATION' => 'Are you sure you want to remove this contact from this case?', + 'NTC_REMOVE_DIRECT_REPORT_CONFIRMATION' => 'Are you sure you want to remove this record as a direct report?', + 'NTC_REMOVE_OPP_CONFIRMATION' => 'Are you sure you want to remove this contact from this opportunity?', + 'ERR_DELETE_RECORD' => 'en_us A record number must be specified to delete the contact.', + 'NTC_COPY_PRIMARY_ADDRESS' => '将主地址內容复制到备用地址', + 'NTC_COPY_ALTERNATE_ADDRESS' => '将备用地址內容复制到主地址', + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Migration/DBChanges/42P2_to_50.php b/oss/vtiger/trunk/modules/Migration/DBChanges/42P2_to_50.php new file mode 100644 index 00000000..814cb6b3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/DBChanges/42P2_to_50.php @@ -0,0 +1,4236 @@ +debug("\n\nDB Changes from 4.2.x to 5.0 GA -------- Starts \n\n"); + +//Added to put prefix vtiger_ in some of the columns in tables which are used for CV and Reports and field -- 23-06-06 +$migrationlog->debug("Going to rename the table names with prefix vtiger_"); +include("modules/Migration/rename_tables.php"); +$migrationlog->debug("Renaming the table names with prefix vtiger_ has been finished"); + + +$migrationlog->debug("Database Modifications for 4.2 Patch2 ==> 5.0(Alpha) Dev 3 Starts here."); + + +//These changes have been made in 4.2.3. The following queries have been included who has run the migration from 4.2 Patch2 +$wordtemp = $conn->getColumnNames("vtiger_wordtemplates"); +if(is_array($wordtemp) && !in_array("templateid",$wordtemp)) +{ + $wordtemplate_query1 = "alter table vtiger_wordtemplates DROP PRIMARY KEY"; + Execute($wordtemplate_query1); + + $wordtemplate_query3 = "alter table vtiger_wordtemplates add column templateid integer(19) unsigned auto_increment primary key FIRST"; + Execute($wordtemplate_query3); +} +//upto this added to modify the wordtemplates table which will be in the case of migrate from 4.2 Path2. + + + +/****************** 5.0(Alpha) dev version 1 Database changes -- Starts*********************/ + + +//Added the vtiger_announcement table creation to avoid the error +$ann_query = "CREATE TABLE vtiger_announcement ( + `creatorid` int(19) NOT NULL, + `announcement` text, + `title` varchar(255) default NULL, + `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, + PRIMARY KEY (`creatorid`), + KEY `announcement_UK01` (`creatorid`) + ) ENGINE=InnoDB"; +Execute($ann_query); + +//Added Primay Keys for the left out tables +$alter_array1 = Array( + "alter table vtiger_activity_reminder ADD PRIMARY KEY (activity_id,recurringid)", + "alter table vtiger_activitygrouprelation ADD PRIMARY KEY (activityid)", + "alter table vtiger_cvadvfilter ADD PRIMARY KEY (cvid,columnindex)", + "alter table vtiger_cvcolumnlist ADD PRIMARY KEY (cvid,columnindex)", + "alter table vtiger_cvstdfilter ADD PRIMARY KEY (cvid)", + "alter table vtiger_def_org_field ADD PRIMARY KEY (fieldid)", + "alter table vtiger_leadgrouprelation ADD PRIMARY KEY (leadid)", + "alter table vtiger_leadgrouprelation drop key leadgrouprelation_IDX0", + "alter table vtiger_profile2field ADD PRIMARY KEY (profileid,fieldid)", + "alter table vtiger_profile2standardpermissions ADD PRIMARY KEY (profileid,tabid,Operation)", + "alter table vtiger_profile2standardpermissions drop index idx_prof2stad", + "alter table vtiger_profile2utility ADD PRIMARY KEY (profileid,tabid,activityid)", + "alter table vtiger_profile2utility drop index idx_prof2utility", + "alter table vtiger_relcriteria ADD PRIMARY KEY (queryid,columnindex)", + "alter table vtiger_reportdatefilter ADD PRIMARY KEY (datefilterid)", + "alter table vtiger_reportdatefilter DROP INDEX reportdatefilter_IDX0", + "alter table vtiger_reportsortcol ADD PRIMARY KEY (sortcolid,reportid)", + "alter table vtiger_reportsummary ADD PRIMARY KEY (reportsummaryid,summarytype,columnname)", + "drop table vtiger_role2action", + "drop table vtiger_role2tab", + "alter table vtiger_selectcolumn ADD PRIMARY KEY (queryid,columnindex)", + "alter table vtiger_ticketgrouprelation ADD PRIMARY KEY (ticketid)", + "alter table vtiger_ticketstracktime ADD PRIMARY KEY (ticket_id)", + "alter table vtiger_users2group ADD PRIMARY KEY (groupname,userid)", + "alter table vtiger_users2group DROP INDEX idx_users2group", + ); +foreach($alter_array1 as $query) +{ + Execute($query); +} + +//Tables vtiger_profile2globalpermissions, vtiger_actionmapping creation + +$create_sql1 ="CREATE TABLE vtiger_profile2globalpermissions (`profileid` int(19) NOT NULL, `globalactionid` int(19) NOT NULL, `globalactionpermission` int(19) default NULL, PRIMARY KEY (`profileid`,`globalactionid`), KEY `idx_profile2globalpermissions` (`profileid`,`globalactionid`)) ENGINE=InnoDB"; + +Execute($create_sql1); + +$create_sql2 = "CREATE TABLE vtiger_actionmapping (`actionid` int(19) NOT NULL, `actionname` varchar(200) NOT NULL, `securitycheck` int(19) default NULL, PRIMARY KEY (`actionid`,`actionname`)) TYPE=InnoDB"; +Execute($create_sql2); + +//For all Profiles, insert the following entries into vtiger_profile2global permissions table: +$sql = 'select * from vtiger_profile'; +$res = $conn->query($sql); +$noofprofiles = $conn->num_rows($res); + +for($i=0;$i<$noofprofiles;$i++) +{ + $profile_id = $conn->query_result($res,$i,'profileid'); + + $sql1 = "insert into vtiger_profile2globalpermissions values ($profile_id,1,1)"; + $sql2 = "insert into vtiger_profile2globalpermissions values ($profile_id,2,1)"; + + Execute($sql1); + Execute($sql2); +} + + +//Removing entries for Dashboard and Home module from vtiger_profile2standardpermissions table +$del_query1 = "delete from vtiger_profile2standardpermissions where tabid in(1,3)"; +Execute($del_query1); + +//For all Profile do the following insert into vtiger_profile2utility table: +$sql = 'select * from vtiger_profile'; +$res = $conn->query($sql); +$noofprofiles = $conn->num_rows($res); + +/* Commented by Don. Handled below +for($i=0;$i<$noofprofiles;$i++) +{ + $profile_id = $conn->query_result($res,$i,'profileid'); + + $sql1 = "insert into vtiger_profile2utility values ($profile_id,4,7,0)"; + $sql2 = "insert into vtiger_profile2utility values ($profile_id,7,9,0)"; + + Execute($sql1); + Execute($sql2); +} +*/ + +//Insert Values into action mapping table: +$actionmapping_array = Array( + "insert into vtiger_actionmapping values(0,'Save',0)", + "insert into vtiger_actionmapping values(1,'EditView',0)", + "insert into vtiger_actionmapping values(2,'Delete',0)", + "insert into vtiger_actionmapping values(3,'index',0)", + "insert into vtiger_actionmapping values(4,'DetailView',0)", + "insert into vtiger_actionmapping values(5,'Import',0)", + "insert into vtiger_actionmapping values(6,'Export',0)", + "insert into vtiger_actionmapping values(8,'Merge',0)", + "insert into vtiger_actionmapping values(1,'VendorEditView',1)", + "insert into vtiger_actionmapping values(4,'VendorDetailView',1)", + "insert into vtiger_actionmapping values(0,'SaveVendor',1)", + "insert into vtiger_actionmapping values(2,'DeleteVendor',1)", + "insert into vtiger_actionmapping values(1,'PriceBookEditView',1)", + "insert into vtiger_actionmapping values(4,'PriceBookDetailView',1)", + "insert into vtiger_actionmapping values(0,'SavePriceBook',1)", + "insert into vtiger_actionmapping values(2,'DeletePriceBook',1)", + "insert into vtiger_actionmapping values(1,'SalesOrderEditView',1)", + "insert into vtiger_actionmapping values(4,'SalesOrderDetailView',1)", + "insert into vtiger_actionmapping values(0,'SaveSalesOrder',1)", + "insert into vtiger_actionmapping values(2,'DeleteSalesOrder',1)", + "insert into vtiger_actionmapping values(9,'ConvertLead',0)", + "insert into vtiger_actionmapping values(1,'DetailViewAjax',1)", + "insert into vtiger_actionmapping values(1,'QuickCreate',1)", + "insert into vtiger_actionmapping values(4,'TagCloud',1)" + ); +foreach($actionmapping_array as $query) +{ + Execute($query); +} + + +//Added two columns in vtiger_field table to construct the quickcreate form dynamically +$alter_array2 = Array( + "ALTER TABLE vtiger_field ADD column quickcreate int(10) after typeofdata", + "ALTER TABLE vtiger_field ADD column quickcreatesequence int(19) after quickcreate", + ); +foreach($alter_array2 as $query) +{ + Execute($query); +} + +$update_array1 = Array( + "UPDATE vtiger_field SET quickcreate = 1,quickcreatesequence = 0", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 2 and fieldlabel = 'Potential Name'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 2 and fieldlabel = 'Account Name'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 3 WHERE tabid = 2 and fieldlabel = 'Expected Close Date'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 4 WHERE tabid = 2 and fieldlabel = 'Sales Stage'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 5 WHERE tabid = 2 and fieldlabel = 'Amount'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 4 and fieldlabel = 'First Name'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 4 and fieldlabel = 'Last Name'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 3 WHERE tabid = 4 and fieldlabel = 'Account Name'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 4 WHERE tabid = 4 and fieldlabel = 'Office Phone'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 5 WHERE tabid = 4 and fieldlabel = 'Email'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 6 and fieldlabel = 'Account Name'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 6 and fieldlabel = 'Phone'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 3 WHERE tabid = 6 and fieldlabel = 'Website'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 7 and fieldlabel = 'First Name'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 7 and fieldlabel = 'Last Name'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 3 WHERE tabid = 7 and fieldlabel = 'Company'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 4 WHERE tabid = 7 and fieldlabel = 'Phone'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 5 WHERE tabid = 7 and fieldlabel = 'Email'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 8 and fieldlabel = 'Subject'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 9 and fieldlabel = 'Subject'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 9 and fieldlabel = 'Start Date & Time'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 10 and fieldlabel = 'Subject'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 10 and fieldlabel = 'Date & Time Sent'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 13 and fieldlabel = 'Title'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 13 and fieldlabel = 'Description'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 3 WHERE tabid = 13 and fieldlabel = 'Priority'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 14 and fieldlabel = 'Product Name'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 14 and fieldlabel = 'Product Code'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 3 WHERE tabid = 14 and fieldlabel = 'Product Category'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 16 and fieldlabel = 'Subject'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 16 and fieldlabel = 'Start Date & Time'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 3 WHERE tabid = 16 and fieldlabel = 'Activity Type'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 4 WHERE tabid = 16 and fieldlabel = 'Duration'", + ); +foreach($update_array1 as $query) +{ + Execute($query); +} + +//Added for the "Color By User in Calendar " which has been contributed by Cesar +$alter_query1 = "ALTER TABLE vtiger_users ADD cal_color VARCHAR(25) DEFAULT '#E6FAD8' AFTER user_hash"; +Execute($alter_query1); + +//code contributed by Fredy for color vtiger_priority +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query1 = "insert into vtiger_field values (16,".$newfieldid.",'priority','activity',1,15,'taskpriority','Priority',1,0,0,100,17,1,1,'V~O',1,'')"; +Execute($insert_query1); + +//Added on 23-12-2005 which is missed from Fredy's contribution for Color vtiger_priority +populateFieldForSecurity('16',$newfieldid); +$activity_cols = $conn->getColumnNames("vtiger_activity"); +if(is_array($activity_cols) && !in_array("priority",$activity_cols)) +{ + $activity_alter_query = "alter table vtiger_activity add column priority varchar(150) default NULL"; + Execute($activity_alter_query); +} +//Code contributed by Raju for better emailing +/* +$insert_array1 = Array( + "insert into vtiger_field values (10,".$conn->getUniqueID("vtiger_field").",'crmid','seactivityrel',1,'357','parent_id','Related To',1,0,0,100,1,2,1,'I~O',1,'')", + "insert into vtiger_field values (10,".$conn->getUniqueID("vtiger_field").",'subject','activity',1,'2','subject','Subject',1,0,0,100,1,3,1,'V~M',0,1)", + "insert into vtiger_field values (10,".$conn->getUniqueID("vtiger_field").",'filename','emails',1,'61','filename','Attachment',1,0,0,100,1,4,1,'V~O',1,'')", + "insert into vtiger_field values (10,".$conn->getUniqueID("vtiger_field").",'description','emails',1,'19','description','Description',1,0,0,100,1,5,1,'V~O',1,'')", + ); +*/ +//commented the above array as that queries are wrong queries -- changed on 23-12-2005 +$insert_array1 = array( + "update vtiger_field set uitype='357' where tabid=10 and fieldname='parent_id' and tablename='vtiger_seactivityrel'", + "update vtiger_field set sequence=1 where tabid=10 and fieldname in ('parent_id','subject','filename','description')", + "update vtiger_field set block=2 where tabid=10 and fieldname='parent_id'", + "update vtiger_field set block=3 where tabid=10 and fieldname='subject'", + "update vtiger_field set block=4 where tabid=10 and fieldname='filename'", + "update vtiger_field set block=5 where tabid=10 and fieldname='description'", + ); +foreach($insert_array1 as $query) +{ + Execute($query); +} + +//code contributed by mike to rearrange the home page +$alter_query2 = "alter table vtiger_users add column homeorder varchar(255) default 'ALVT,PLVT,QLTQ,CVLVT,HLT,OLV,GRT,OLTSO,ILTI' after date_format"; +Execute($alter_query2); + +//Added one column in vtiger_invoice table to include 'Contact Name' vtiger_field in Invoice module +$alter_query3 = "ALTER TABLE vtiger_invoice ADD column contactid int(19) after customerno"; +Execute($alter_query3); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query2 = "insert into vtiger_field values (23,".$newfieldid.",'contactid','invoice',1,'57','contact_id','Contact Name',1,0,0,100,4,1,1,'I~O',1,'')"; +Execute($insert_query2); +//Added on 23-12-2005 because we must populate vtiger_field entries in vtiger_profile2field and vtiger_def_org_field if we add a vtiger_field in vtiger_field table +populateFieldForSecurity('23',$newfieldid); + +//changes made to fix the bug in Address Information block of Accounts and Contacs module +$update_array2 = Array( + "UPDATE vtiger_field SET fieldlabel='Billing City', sequence=5 WHERE tabid=6 and fieldname='bill_city'", + "UPDATE vtiger_field SET fieldlabel='Billing State', sequence=7 WHERE tabid=6 and fieldname='bill_state'", + "UPDATE vtiger_field SET fieldlabel='Billing Code', sequence=9 WHERE tabid=6 and fieldname='bill_code'", + "UPDATE vtiger_field SET fieldlabel='Billing Country', sequence=11 WHERE tabid=6 and fieldname='bill_country'", + + "UPDATE vtiger_field SET fieldlabel='Shipping City', sequence=6 WHERE tabid=6 and fieldname='ship_city'", + "UPDATE vtiger_field SET fieldlabel='Shipping State', sequence=8 WHERE tabid=6 and fieldname='ship_state'", + "UPDATE vtiger_field SET fieldlabel='Shipping Code', sequence=10 WHERE tabid=6 and fieldname='ship_code'", + "UPDATE vtiger_field SET fieldlabel='Shipping Country', sequence=12 WHERE tabid=6 and fieldname='ship_country'", + + "UPDATE vtiger_field SET fieldlabel='Mailing City', sequence=5 WHERE tabid=4 and fieldname='mailingcity'", + "UPDATE vtiger_field SET fieldlabel='Mailing State', sequence=7 WHERE tabid=4 and fieldname='mailingstate'", + "UPDATE vtiger_field SET fieldlabel='Mailing Zip', sequence=9 WHERE tabid=4 and fieldname='mailingzip'", + "UPDATE vtiger_field SET fieldlabel='Mailing Country', sequence=11 WHERE tabid=4 and fieldname='mailingcountry'", + + "UPDATE vtiger_field SET fieldlabel='Other City', sequence=6 WHERE tabid=4 and fieldname='othercity'", + "UPDATE vtiger_field SET fieldlabel='Other State', sequence=8 WHERE tabid=4 and fieldname='otherstate'", + "UPDATE vtiger_field SET fieldlabel='Other Zip', sequence=10 WHERE tabid=4 and fieldname='otherzip'", + "UPDATE vtiger_field SET fieldlabel='Other Country', sequence=12 WHERE tabid=4 and fieldname='othercountry'", + ); +foreach($update_array2 as $query) +{ + Execute($query); +} + + +//Added vtiger_field emailoptout in vtiger_account table +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query3 = "insert into vtiger_field values (6,".$newfieldid.",'emailoptout','account',1,'56','emailoptout','Email Opt Out',1,0,0,100,17,1,1,'C~O',1,'')"; +Execute($insert_query3); + +//Added on 23-12-2005 because we must populate vtiger_field entries in vtiger_profile2field and vtiger_def_org_field if we add a vtiger_field in vtiger_field table +populateFieldForSecurity('6',$newfieldid); + +//Added on 22-12-2005 +$alter_query4 = "alter table vtiger_account add column emailoptout varchar(3) default 0"; +Execute($alter_query4); + +$update_array3 = Array( + "update vtiger_field set sequence=18 where tabid=6 and fieldname ='assigned_user_id'", + "update vtiger_field set sequence=19 where tabid=6 and fieldname ='createdtime'", + "update vtiger_field set sequence=19 where tabid=6 and fieldname ='modifiedtime'", + ); +foreach($update_array3 as $query) +{ + Execute($query); +} + + +//create table vtiger_moduleowners to assign the module and corresponding owners +$create_query2 = "CREATE TABLE vtiger_moduleowners ( + `tabid` int(19) NOT NULL default '0', + `user_id` varchar(11) NOT NULL, + PRIMARY KEY (`tabid`), + KEY `moduleowners_tabid_user_id_idx` (`tabid`,`user_id`) + ) ENGINE=InnoDB"; + +/* +$create_query2 = "CREATE TABLE vtiger_moduleowners +( + `tabid` int(19) NOT NULL default '0', + `user_id` varchar(11) NOT NULL default '', + PRIMARY KEY (`tabid`), + CONSTRAINT `fk_ModuleOwners` FOREIGN KEY (`tabid`) REFERENCES `vtiger_tab` (`tabid`) ON DELETE CASCADE +) TYPE=InnoDB"; +*/ +Execute($create_query2); + +//Populated the default entries for vtiger_moduleowners which is created newly +$module_array = Array( + 'Potentials', + 'Contacts', + 'Accounts', + 'Leads', + 'Notes', + 'Activities', + 'Emails', + 'HelpDesk', + 'Products', + 'Faq', + 'Vendor', + 'PriceBook', + 'Quotes', + 'Orders', + 'SalesOrder', + 'Invoice', + 'Reports' + ); +foreach($module_array as $mod) +{ + $query = "insert into vtiger_moduleowners values(".$this->localGetTabID($mod).",1)"; + Execute($query); +} + + +//Changes made to include status vtiger_field in Activity Quickcreate Form +$update_array4 = Array( + "UPDATE vtiger_field SET quickcreate=0,quickcreatesequence=3 WHERE tabid=16 and fieldname='eventstatus'", + "UPDATE vtiger_field SET quickcreate=0,quickcreatesequence=4 WHERE tabid=16 and fieldname='activitytype'", + "UPDATE vtiger_field SET quickcreate=0,quickcreatesequence=5 WHERE tabid=16 and fieldname='duration_hours'", + + "UPDATE vtiger_field SET quickcreate=0,quickcreatesequence=3 WHERE tabid=9 and fieldname='taskstatus'", + ); +foreach($update_array4 as $query) +{ + Execute($query); +} + + + +//Table 'inventory_tandc' added newly to include Inventory Terms &Conditions +$create_query1 = "CREATE TABLE vtiger_inventory_tandc(id INT(19),type VARCHAR(30) NOT NULL,tandc LONGTEXT default NULL,PRIMARY KEY(id))"; +Execute($create_query1); + +$insert_query4 = "insert into vtiger_inventory_tandc values('".$conn->getUniqueID('vtiger_inventory_tandc')."','Inventory',' ')"; +Execute($insert_query4); + +/****************** 5.0(Alpha) dev version 1 Database changes -- Ends*********************/ + + + + + + + + + + +/****************** 5.0(Alpha) dev version 2 Database changes -- Starts*********************/ + +$query1 = "ALTER TABLE vtiger_leadaddress change lane lane varchar(250)"; +Execute($query1); + +$rename_table_array1 = Array( + "update vtiger_field set tablename='vtiger_customerdetails' where tabid=4 and fieldname in ('portal','support_start_date','support_end_date')", + "alter table vtiger_PortalInfo drop foreign key fk_PortalInfo", + "rename table vtiger_PortalInfo to vtiger_portalinfo", + "alter table vtiger_portalinfo add CONSTRAINT `fk_portalinfo` FOREIGN KEY (`id`) REFERENCES `vtiger_contactdetails` (`contactid`) ON DELETE CASCADE", + "alter table vtiger_CustomerDetails drop foreign key fk_CustomerDetails", + "rename table vtiger_CustomerDetails to vtiger_customerdetails", + "alter table vtiger_customerdetails add CONSTRAINT `fk_customerdetails` FOREIGN KEY (`customerid`) REFERENCES `vtiger_contactdetails` (`contactid`) ON DELETE CASCADE" + ); +foreach($rename_table_array1 as $query) +{ + Execute($query); +} + + +$query2 = "create table vtiger_ownernotify(crmid int(19),smownerid int(19),flag int(3))"; +Execute($query2); + + +//Form the vtiger_role_map_array as vtiger_roleid=>name mapping array +$sql = "select * from vtiger_role"; +$res = $conn->query($sql); +$role_map_array = Array(); +for($i=0;$i<$conn->num_rows($res);$i++) +{ + $roleid = $conn->query_result($res,$i,'roleid'); + $name = $conn->query_result($res,$i,'name'); + $role_map_array[$roleid] = $name; +} +$conn->println("List of Roles (roleid => name) ==> ");$conn->println($role_map_array); +//echo '
     List of vtiger_roles :';print_r($role_map_array);echo '
    '; + +//Before delete the vtiger_role take a backup array for the table vtiger_user2role +$sql = "select * from vtiger_user2role"; +$res = $conn->query($sql); +$user2role_array = array(); +for($i=0;$i<$conn->num_rows($res);$i++) +{ + $userid = $conn->query_result($res,$i,'userid'); + $roleid = $conn->query_result($res,$i,'roleid'); + $user2role_array[$userid] = $roleid; +} +$conn->println("Users 2 Roles (userid => roleid) ==> ");$conn->println($user2role_array); +//echo '
     List of vtiger_user2role : (userid => vtiger_roleid)';print_r($user2role_array);echo '
    '; + +//Delete the vtiger_role entries +$sql = "truncate vtiger_role"; +Execute($sql); + + +$query3 = "alter table vtiger_user2role drop FOREIGN KEY fk_user2role2"; +Execute($query3); + +//4,5 th are the Extra added queries +$alter_query_array1 = Array( + "alter table vtiger_user2role change roleid roleid varchar(255)", + "alter table vtiger_role2profile change roleid roleid varchar(255)", + "alter table vtiger_role CHANGE roleid roleid varchar(255)", + "alter table vtiger_role2profile drop PRIMARY KEY", + "alter table vtiger_role2profile ADD PRIMARY KEY (roleid,profileid)" + ); +foreach($alter_query_array1 as $query) +{ + Execute($query); +} + + +$query4 = "ALTER TABLE vtiger_user2role ADD CONSTRAINT fk_user2role2 FOREIGN KEY (roleid) REFERENCES vtiger_role(roleid) ON DELETE CASCADE"; +Execute($query4); + +$alter_query_array2 = Array( + "alter table vtiger_role CHANGE name rolename varchar(200)", + "alter table vtiger_role DROP description", + "alter table vtiger_role add parentrole varchar(255)", + "alter table vtiger_role add depth int(19)" + ); +foreach($alter_query_array2 as $query) +{ + Execute($query); +} + + + +$query5 = "insert into vtiger_role values('H1','Organisation','H1',0)"; +Execute($query5); + +//include("include/utils/UserInfoUtil.php"); +//Create vtiger_role based on vtiger_role_map_array values and form the new_role_map_array with old vtiger_roleid and new vtiger_roleid +foreach($role_map_array as $roleid => $rolename) +{ + $parentRole = 'H1'; + if($rolename == 'standard_user') + { + $rs = $conn->query("select * from vtiger_role where rolename='administrator'"); + $parentRole = $conn->query_result($rs,0,'roleid'); + } + $empty_array = array(""=>""); + $new_role_id = localcreateRole($rolename,$parentRole,$empty_array); + $new_role_map_array[$roleid] = $new_role_id; +} +$conn->println("Roles (oldroleid => newroleid) ==> ");$conn->println($new_role_map_array); + +//Before insert the new entry we should remove the old entries -- added on 06-06-06 +$user2role_del = "truncate vtiger_user2role"; +Execute($user2role_del); + +//First we will insert the old values from vtiger_user2role_array to vtiger_user2role table and then update the new vtiger_role id +foreach($user2role_array as $userid => $roleid) +{ + $sql = "insert into vtiger_user2role (userid, roleid) values(".$userid.",'".$new_role_map_array[$roleid]."')"; + Execute($sql); +} +//Commented the following loop as we have backup the vtiger_user2role and insert the entries with the new rold id using new_role_map_array above +//Update the vtiger_user2role table with new vtiger_roleid +/* + foreach($new_role_map_array as $old_roleid => $new_roleid) + { + $update_user2role = "update vtiger_user2role set vtiger_roleid='".$new_roleid."' where vtiger_roleid=".$old_roleid; + Execute($update_user2role); + } + */ +//Update the vtiger_role2profile table with new vtiger_roleid +foreach($new_role_map_array as $old_roleid => $new_roleid) +{ + $update_role2profile = "update vtiger_role2profile set roleid='".$new_roleid."' where roleid=".$old_roleid; + Execute($update_role2profile); +} + + + +//Group Migration: +//Step 1 : form and group_map_array as groupname => description from vtiger_groups table +//Step 2 : form an vtiger_users2group_map_array array as userid => groupname from vtiger_users2group table +//Step 3 : delete all entries from vtiger_groups table and enter new values from group_map_array +//Step 4 : drop the table vtiger_users2group and create new table +//Step 5 : put entries to vtiger_users2group table based on vtiger_users2group_map_array. Here get the groupid from vtiger_groups table based on groupname + +//Step 1 : Form the group_map_array as groupname => description +$sql = "select * from vtiger_groups"; +$res = $conn->query($sql); +$group_map_array = Array(); +for($i=0;$i<$conn->num_rows($res);$i++) +{ + $name = $conn->query_result($res,$i,'name'); + $desc = $conn->query_result($res,$i,'description'); + $group_map_array[$name] = $desc; +} +$conn->println("List of Groups (name => description) ==> ");$conn->println($group_map_array); +//echo '
    List of Groups : ';print_r($group_map_array);echo '
    '; + + +//Step 2 : form an vtiger_users2group_map_array array as userid => groupname from vtiger_users2group table +$sql = "select * from vtiger_users2group"; +$res = $conn->query($sql); +$users2group_map_array = Array(); +for($i=0;$i<$conn->num_rows($res);$i++) +{ + $groupname = $conn->query_result($res,$i,'groupname'); + $userid = $conn->query_result($res,$i,'userid'); + $users2group_map_array[$userid] = $groupname; +} +$conn->println("Users 2 Groups (userid => groupname) ==> ");$conn->println($users2group_map_array); +//echo '
    List of vtiger_users2group : ';print_r($users2group_map_array);echo '
    '; + +//Step 3 : delete all entries from vtiger_groups table +$sql = "truncate vtiger_groups"; +Execute($sql); + +$alter_query_array3 = Array( + "alter table vtiger_users2group drop FOREIGN KEY fk_users2group", + "alter table vtiger_leadgrouprelation drop FOREIGN KEY fk_leadgrouprelation2", + "alter table vtiger_activitygrouprelation drop FOREIGN KEY fk_activitygrouprelation2", + "alter table vtiger_ticketgrouprelation drop FOREIGN KEY fk_ticketgrouprelation2", + "alter table vtiger_groups drop PRIMARY KEY" + ); +foreach($alter_query_array3 as $query) +{ + Execute($query); +} + +//2 nd query is the Extra added query +//Adding columns in group table: +$alter_query_array4 = Array( + "alter table vtiger_groups add column groupid int(19) FIRST", + "alter table vtiger_groups change name groupname varchar(100)", + "alter table vtiger_groups ADD PRIMARY KEY (groupid)", + "alter table vtiger_groups add index (groupname)" + ); +foreach($alter_query_array4 as $query) +{ + Execute($query); +} + + +//Moved the create table queries for vtiger_group2grouprel, vtiger_group2role, vtiger_group2rs from the end of this block +//Added on 06-06-06 +$query8 = "CREATE TABLE vtiger_group2grouprel ( + `groupid` int(19) NOT NULL, + `containsgroupid` int(19) NOT NULL, + PRIMARY KEY (`groupid`,`containsgroupid`) + ) ENGINE=InnoDB"; + /* +$query8 = "CREATE TABLE vtiger_group2grouprel +( + `groupid` int(19) NOT NULL default '0', + `containsgroupid` int(19) NOT NULL default '0', + PRIMARY KEY (`groupid`,`containsgroupid`), + CONSTRAINT `fk_group2grouprel1` FOREIGN KEY (`groupid`) REFERENCES `vtiger_groups` (`groupid`) ON DELETE CASCADE +) TYPE=InnoDB"; +*/ +Execute($query8); + +//Added on 06-06-06 +$query9 = "CREATE TABLE vtiger_group2role ( + `groupid` int(19) NOT NULL, + `roleid` varchar(255) NOT NULL, + PRIMARY KEY (`groupid`,`roleid`) + ) ENGINE=InnoDB"; +/* +$query9 = "CREATE TABLE vtiger_group2role +( + `groupid` int(19) NOT NULL default '0', + `roleid` varchar(255) NOT NULL default '', + PRIMARY KEY (`groupid`,`roleid`), + CONSTRAINT `fk_group2role1` FOREIGN KEY (`groupid`) REFERENCES `vtiger_groups` (`groupid`) ON DELETE CASCADE +) TYPE=InnoDB"; +*/ +Execute($query9); + +//Added on 06-06-06 +$query10 = "CREATE TABLE vtiger_group2rs ( + `groupid` int(19) NOT NULL, + `roleandsubid` varchar(255) NOT NULL, + PRIMARY KEY (`groupid`,`roleandsubid`) + ) ENGINE=InnoDB"; +/* +$query10 = "CREATE TABLE vtiger_group2rs +( + `groupid` int(19) NOT NULL default '0', + `roleandsubid` varchar(255) NOT NULL default '', + PRIMARY KEY (`groupid`,`roleandsubid`), + CONSTRAINT `fk_group2rs1` FOREIGN KEY (`groupid`) REFERENCES `vtiger_groups` (`groupid`) ON DELETE CASCADE +) TYPE=InnoDB"; +*/ +Execute($query10); + +//Insert all the retrieved old values to the new vtiger_groups table ie., create new vtiger_groups +foreach($group_map_array as $groupname => $description) +{ + $empty_array = array( + "groups" => array(""=>""), + "roles" => array(""=>""), + "rs" => array(""=>""), + "users" => array(""=>"") + ); + $groupid = createGroup($groupname,$empty_array,$description); + $group_name_id_mapping[$groupname] = $groupid; +} +$conn->println("List of Groups Created (groupname => groupid) ==> ");$conn->println($group_name_id_mapping); + + +//Copy all mappings in a user2grop table in a array; + +//Step 4 : Drop and again create users2group +$query6 = "drop table vtiger_users2group"; +Execute($query6); + +//Added on 06-06-06 +$query7 = "CREATE TABLE vtiger_users2group ( + `groupid` int(19) NOT NULL, + `userid` int(19) NOT NULL, + PRIMARY KEY (`groupid`,`userid`), + KEY `users2group_groupname_uerid_idx` (`groupid`,`userid`) + ) ENGINE=InnoDB"; +/* +$query7 = "CREATE TABLE vtiger_users2group +( + `groupid` int(19) NOT NULL default '0', + `userid` int(19) NOT NULL default '0', + PRIMARY KEY (`groupid`,`userid`), + CONSTRAINT `fk_users2group1` FOREIGN KEY (`groupid`) REFERENCES `groups` (`groupid`) ON DELETE CASCADE +) TYPE=InnoDB"; +*/ +Execute($query7); + +//Step 5 : put entries to vtiger_users2group table based on vtiger_users2group_map_array. Here get the groupid from vtiger_groups table based on groupname +foreach($users2group_map_array as $userid => $groupname) +{ + //$groupid = $conn->query_result($conn->query("select * from vtiger_groups where groupname='".$groupname."'"),0,'groupid'); + $sql = "insert into vtiger_users2group (groupid,userid) values(".$group_name_id_mapping[$groupname].",".$userid.")"; + Execute($sql); +} + + +$alter_query_array5 = Array( + "alter table vtiger_leadgrouprelation ADD CONSTRAINT fk_leadgrouprelation2 FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE", + "ALTER TABLE vtiger_activitygrouprelation ADD CONSTRAINT fk_activitygrouprelation2 FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE", + "ALTER TABLE vtiger_ticketgrouprelation ADD CONSTRAINT fk_ticketgrouprelation2 FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE" + ); +foreach($alter_query_array5 as $query) +{ + Execute($query); +} +//Moved the create table queries for vtiger_group2grouprel, vtiger_group2role, vtiger_group2rs to before creatinf the Group ie., before call the createGroup + + +/***Added to include decimal places for amount vtiger_field in vtiger_potential table --by Mangai 15-Nov-2005***/ + +$query11 = "ALTER TABLE vtiger_potential change amount amount decimal(10,2)"; +Execute($query11); + +/****************** 5.0(Alpha) dev version 2 Database changes -- Ends*********************/ + + + + + + + + + + + + +/****************** 5.0(Alpha) dev version 3 Database changes -- Starts*********************/ + +//Drop the column company_name from vtiger_vendor table ---- modified by Mickie on 18-11-2005 +$altersql1 = "alter table vtiger_vendor drop column company_name"; +Execute($altersql1); +$altersql2 = "alter table vtiger_vendor change column name vendorname varchar(100) default NULL"; +$conn->query($altersql2); +Execute("update vtiger_field set fieldname='vendorname', columnname='vendorname' where tabid=18 and fieldname='name'"); +//TODO (check): Remove this company_name entry from the vtiger_field table if it already exists + +//Migration for Default Organisation Share -- Added by Don on 20-11-2005 + +$query1 = "CREATE TABLE vtiger_org_share_action_mapping ( +`share_action_id` int(19) NOT NULL default '0', + `share_action_name` varchar(200) NOT NULL default '', +PRIMARY KEY (`share_action_id`,`share_action_name`) + ) TYPE=InnoDB "; +Execute($query1); + +$query2 = "CREATE TABLE vtiger_org_share_action2tab ( + `share_action_id` int(19) NOT NULL default '0', + `tabid` int(19) NOT NULL default '0', + PRIMARY KEY (`share_action_id`,`tabid`), + CONSTRAINT `fk_org_share_action2tab` FOREIGN KEY (`share_action_id`) REFERENCES `vtiger_org_share_action_mapping` (`share_action_id`) ON DELETE CASCADE + ) TYPE=InnoDB"; +Execute($query2); + + +$query3 = "alter table vtiger_def_org_share add column editstatus int(19)"; +Execute($query3); + +$query4 = "delete from vtiger_def_org_share where tabid in(8,14,15,18,19)"; +Execute($query4); + + + +//Inserting values into org share action mapping +$insert_query_array1 = Array( + "insert into vtiger_org_share_action_mapping values(0,'Public: Read Only')", + "insert into vtiger_org_share_action_mapping values(1,'Public:Read,Create/Edit')", + "insert into vtiger_org_share_action_mapping values(2,'Public: Read, Create/Edit, Delete')", + "insert into vtiger_org_share_action_mapping values(3,'Private')", + "insert into vtiger_org_share_action_mapping values(4,'Hide Details')", + "insert into vtiger_org_share_action_mapping values(5,'Hide Details and Add Events')", + "insert into vtiger_org_share_action_mapping values(6,'Show Details')", + "insert into vtiger_org_share_action_mapping values(7,'Show Details and Add Events')" + ); +foreach($insert_query_array1 as $query) +{ + Execute($query); +} + + +//Inserting for all vtiger_tabs +$def_org_tabid=Array(2,4,6,7,9,10,13,16,20,21,22,23,26); +foreach($def_org_tabid as $def_tabid) +{ + $insert_query_array2 = Array( + "insert into vtiger_org_share_action2tab values(0,".$def_tabid.")", + "insert into vtiger_org_share_action2tab values(1,".$def_tabid.")", + "insert into vtiger_org_share_action2tab values(2,".$def_tabid.")", + "insert into vtiger_org_share_action2tab values(3,".$def_tabid.")" + ); + foreach($insert_query_array2 as $query) + { + Execute($query); + } +} + +$insert_query_array3 = Array( + "insert into vtiger_org_share_action2tab values(4,17)", + "insert into vtiger_org_share_action2tab values(5,17)", + "insert into vtiger_org_share_action2tab values(6,17)", + "insert into vtiger_org_share_action2tab values(7,17)" + ); +foreach($insert_query_array3 as $query) +{ + Execute($query); +} + +$query_array1 = Array( + "insert into vtiger_def_org_share values(9,17,7,0)", + "update vtiger_def_org_share set editstatus=0", + "update vtiger_def_org_share set editstatus=2 where tabid=4", + "update vtiger_def_org_share set editstatus=1 where tabid=9", + "update vtiger_def_org_share set editstatus=2 where tabid=16" + ); +foreach($query_array1 as $query) +{ + Execute($query); +} + +/****************** 5.0(Alpha) dev version 3 Database changes -- Ends*********************/ + + + +$migrationlog->debug("Database Modifications for 5.0(Alpha) Dev 3 ==> 5.0 Alpha starts here."); +//echo "

    Database Modifications for 5.0(Alpha) Dev3 ==> 5.0 Alpha starts here.....
    "; +$alter_query_array6 = Array( + "ALTER TABLE vtiger_users ADD column activity_view VARCHAR(25) DEFAULT 'Today' AFTER homeorder", + "ALTER TABLE vtiger_activity ADD column notime VARCHAR(3) NOT NULL DEFAULT '0' AFTER location" + ); +foreach($alter_query_array6 as $query) +{ + Execute($query); +} + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (9,".$newfieldid.",'notime','activity',1,56,'notime','No Time',1,0,0,100,20,1,3,'C~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('9',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (16,".$newfieldid.",'notime','activity',1,56,'notime','No Time',1,0,0,100,18,1,1,'C~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('16',$newfieldid); + +$alter_query_array7 = Array( + "alter table vtiger_vendor add column pobox varchar(30) after state", + "alter table vtiger_leadaddress add column pobox varchar(30) after state", + "alter table vtiger_accountbillads add column pobox varchar(30) after state", + "alter table vtiger_accountshipads add column pobox varchar(30) after state", + "alter table vtiger_contactaddress add column mailingpobox varchar(30) after mailingstate", + "alter table vtiger_contactaddress add column otherpobox varchar(30) after otherstate", + "alter table vtiger_quotesbillads add column bill_pobox varchar(30) after bill_street", + "alter table vtiger_quotesshipads add column ship_pobox varchar(30) after ship_street", + "alter table vtiger_pobillads add column bill_pobox varchar(30) after bill_street", + "alter table vtiger_poshipads add column ship_pobox varchar(30) after ship_street", + "alter table vtiger_sobillads add column bill_pobox varchar(30) after bill_street", + "alter table vtiger_soshipads add column ship_pobox varchar(30) after ship_street", + "alter table vtiger_invoicebillads add column bill_pobox varchar(30) after bill_street", + "alter table vtiger_invoiceshipads add column ship_pobox varchar(30) after ship_street" + ); +foreach($alter_query_array7 as $query) +{ + Execute($query); +} + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (23,".$newfieldid.",'bill_pobox','invoicebillads',1,'1','bill_pobox','Billing Po Box',1,0,0,100,3,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('23',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (23,".$newfieldid.",'ship_pobox','invoiceshipads',1,'1','ship_pobox','Shipping Po Box',1,0,0,100,4,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('23',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (6,".$newfieldid.",'pobox','accountbillads',1,'1','bill_pobox','Billing Po Box',1,0,0,100,3,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('6',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (6,".$newfieldid.",'pobox','accountshipads',1,'1','ship_pobox','Shipping Po Box',1,0,0,100,4,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('6',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (7,".$newfieldid.",'pobox','leadaddress',1,'1','pobox','Po Box',1,0,0,100,2,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('7',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (4,".$newfieldid.",'mailingpobox','contactaddress',1,'1','mailingpobox','Mailing Po Box',1,0,0,100,3,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('4',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (4,".$newfieldid.",'otherpobox','contactaddress',1,'1','otherpobox','Other Po Box',1,0,0,100,4,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('4',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (18,".$newfieldid.",'pobox','vendor',1,'1','pobox','Po Box',1,0,0,100,2,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('18',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (20,".$newfieldid.",'bill_pobox','quotesbillads',1,'1','bill_pobox','Billing Po Box',1,0,0,100,3,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('20',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (20,".$newfieldid.",'ship_pobox','quotesshipads',1,'1','ship_pobox','Shipping Po Box',1,0,0,100,4,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('20',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (21,".$newfieldid.",'bill_pobox','pobillads',1,'1','bill_pobox','Billing Po Box',1,0,0,100,3,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('21',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (21,".$newfieldid.",'ship_pobox','poshipads',1,'1','ship_pobox','Shipping Po Box',1,0,0,100,4,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('21',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (22,".$newfieldid.",'bill_pobox','sobillads',1,'1','bill_pobox','Billing Po Box',1,0,0,100,3,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('22',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (22,".$newfieldid.",'ship_pobox','soshipads',1,'1','ship_pobox','Shipping Po Box',1,0,0,100,4,2,1,'V~O',1,'')"; +Execute($insert_query); +populateFieldForSecurity('22',$newfieldid); + + +$fieldname =array('bill_city','bill_state','bill_code','bill_country','ship_city','ship_state','ship_code','ship_country'); +$tablename = array('accountbillads','quotesbillads','pobillads','sobillads','invoicebillads','accountshipads','quotesshipads','poshipads','soshipads','invoiceshipads'); +$sequence = array(5,7,9,11,6,8,10,12); +$k = 0; +$n = 0; +for($j = 0;$j < 8;$j++) +{ + if($j == 4) + $n = $n+5; + for($i = 0;$i < 5;$i++) + { + $query1 = "update vtiger_field set sequence=".$sequence[$j]." where tablename='".$tablename[$n+$i]."' && fieldname='".$fieldname[$j]."'"; + Execute($query1); + } +} + +$fieldname = array('code','city','country','state'); +$tablename = 'leadaddress'; +$sequence = array(3,4,5,6); +for($i = 0;$i < 4;$i++) +{ + $query2 = "update vtiger_field set sequence=".$sequence[$i]." where tablename='".$tablename."' && fieldname='".$fieldname[$i]."'"; + Execute($query2); +} + +$fieldname = array('city','state','postalcode','country'); +$tablename = 'vendor'; +$sequence = array(3,4,5,6); + +for($i = 0;$i < 4;$i++) +{ + $query3 = "update vtiger_field set sequence=".$sequence[$i]." where tablename='".$tablename."' && fieldname='".$fieldname[$i]."'"; + Execute($query3); +} + +$fieldname = array('mailingcity','othercity','mailingstate','otherstate','mailingzip','otherzip','mailingcountry','othercountry'); +$tablename = 'contactaddress'; +$sequence = array(5,6,7,8,9,10,11,12); + +for($i = 0;$i < 8;$i++) +{ + $query = "update vtiger_field set sequence=".$sequence[$i]." where tablename='".$tablename."' && fieldname='".$fieldname[$i]."'"; + Execute($query); +} + +$query_array1 = Array( + "update vtiger_field set tablename='vtiger_crmentity' where tabid=10 and fieldname='description'", + "update vtiger_field set tablename='vtiger_attachments' where tabid=10 and fieldname='filename'", + "drop table vtiger_emails", + + "alter table vtiger_activity drop column description", + "update vtiger_field set tablename='vtiger_crmentity' where tabid in (9,16) and fieldname='description'", + + "update vtiger_tab set name='PurchaseOrder',tablabel='PurchaseOrder' where tabid=21", + "update vtiger_tab set presence=0 where tabid=22 and name='SalesOrder'", + + "delete from vtiger_actionmapping where actionname='SalesOrderDetailView'", + "delete from vtiger_actionmapping where actionname='SalesOrderEditView'", + "delete from vtiger_actionmapping where actionname='SaveSalesOrder'", + "delete from vtiger_actionmapping where actionname='DeleteSalesOrder'", + + //"insert into vtiger_field values (13,".$conn->getUniqueID("vtiger_field").",'filename','vtiger_attachments',1,'61','filename','Attachment',1,0,0,100,12,2,1,'V~O',0,1)", + + "alter table vtiger_troubletickets add column filename varchar(50) default NULL after title" + ); +foreach($query_array1 as $query) +{ + Execute($query); +} + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (13,".$newfieldid.",'filename','vtiger_attachments',1,'61','filename','Attachment',1,0,0,100,12,2,1,'V~O',0,1)"; +Execute($insert_query); +populateFieldForSecurity('13',$newfieldid); + + +$create_query3 = "create table vtiger_parenttab(parenttabid int(19) not null, parenttab_label varchar(100) not null, sequence int(10) not null, visible int(2) not null default '0', Primary Key(parenttabid))"; +Execute($create_query3); +$create_query4 = "create table vtiger_parenttabrel(parenttabid int(3) not null, tabid int(3) not null,sequence int(3) not null)"; +Execute($create_query4); + +$insert_query_array4 = Array( + "insert into vtiger_parenttab values(1,'My Home Page',1,0),(2,'Marketing',2,0),(3,'Sales',3,0),(4,'Support',4,0),(5,'Analytics',5,0),(6,'Inventory',6,0), (7,'Tools',7,0),(8,'Settings',8,0)", + "insert into vtiger_parenttabrel values(1,9,2),(1,17,3),(1,10,4),(1,3,1),(3,7,1),(3,6,2),(3,4,3),(3,2,4),(3,20,5),(3,22,6),(3,23,7),(3,14,8),(3,19,9),(3,8,10),(4,13,1),(4,15,2),(4,6,3),(4,4,4),(4,14,5),(4,8,6),(5,1,1),(5,25,2),(6,14,1), (6,18,2), (6,19,3), (6,21,4), (6,22,5), (6,20,6), (6,23,7), (7,24,1), (7,27,2), (7,8,3), (2,6,2), (2,4,3) " + ); +foreach($insert_query_array4 as $query) +{ + Execute($query); +} + + +$create_query5 = "CREATE TABLE vtiger_blocks ( blockid int(19) NOT NULL, tabid int(19) NOT NULL, blocklabel varchar(100) NOT NULL, sequence int(19) NOT NULL, show_title int(2) NOT NULL, visible int(2) NOT NULL DEFAULT 0, create_view int(2) NOT NULL DEFAULT 0, edit_view int(2) NOT NULL DEFAULT 0, detail_view int(2) NOT NULL DEFAULT 0, PRIMARY KEY (blockid))"; +Execute($create_query5); + +$update_query_array1 = Array( + "update vtiger_field set block=2 where tabid=2 and block=5", + "update vtiger_field set block=3 where tabid=2 and block=2", + + //"update vtiger_field set block=4 where tabid=4 and block=1", + "update vtiger_field set block=5 where tabid=4 and block=5", + "update vtiger_field set block=6 where tabid=4 and block=4",//Modified on 24-04-06 + "update vtiger_field set block=4 where tabid=4 and block=1", + "update vtiger_field set block=7 where tabid=4 and block=2", + "update vtiger_field set block=8 where tabid=4 and block=3", + + "update vtiger_field set block=9 where tabid=6 and block=1", + "update vtiger_field set block=10 where tabid=6 and block=5", + "update vtiger_field set block=11 where tabid=6 and block=2", + "update vtiger_field set block=12 where tabid=6 and block=3", + + "update vtiger_field set block=13 where tabid=7 and block=1", + "update vtiger_field set block=14 where tabid=7 and block=5", + "update vtiger_field set block=15 where tabid=7 and block=2", + "update vtiger_field set block=16 where tabid=7 and block=3", + + "update vtiger_field set block=17 where tabid=8 and block=1", + "update vtiger_field set block=17 where tabid=8 and block=2", + "update vtiger_field set block=18 where tabid=8 and block=3", + + "update vtiger_field set block=19 where tabid=9 and block=1", + "update vtiger_field set block=19 where tabid=9 and block=7", + "update vtiger_field set block=20 where tabid=9 and block=2", + + "update vtiger_field set block=21 where tabid=10 and block=1", + "update vtiger_field set block=22 where tabid=10 and block=2", + "update vtiger_field set block=23 where tabid=10 and block=3", + "update vtiger_field set block=23 where tabid=10 and block=4", + "update vtiger_field set block=24 where tabid=10 and block=5", + + "update vtiger_field set block=25 where tabid=13 and block=1", + "update vtiger_field set block=26 where tabid=13 and block=2", + "update vtiger_field set block=27 where tabid=13 and block=5", + "update vtiger_field set block=28 where tabid=13 and block=3", + "update vtiger_field set block=29 where tabid=13 and block=4", + "update vtiger_field set block=30 where tabid=13 and block=6", + + "update vtiger_field set block=31 where tabid=14 and block=1", + "update vtiger_field set block=32 where tabid=14 and block=2", + "update vtiger_field set block=33 where tabid=14 and block=3", + "update vtiger_field set block=34 where tabid=14 and block=5", + "update vtiger_field set block=35 where tabid=14 and block=6", + "update vtiger_field set block=36 where tabid=14 and block=4", + + "update vtiger_field set block=37 where tabid=15 and block=1", + "update vtiger_field set block=38 where tabid=15 and block=2", + "update vtiger_field set block=39 where tabid=15 and block=3", + "update vtiger_field set block=40 where tabid=15 and block=4", + + "update vtiger_field set block=41 where tabid=16 and block=1", + "update vtiger_field set block=42 where tabid=16 and block=7", + "update vtiger_field set block=43 where tabid=16 and block=2", + + "update vtiger_field set block=44 where tabid=18 and block=1", + "update vtiger_field set block=45 where tabid=18 and block=5", + "update vtiger_field set block=36 where tabid=18 and block=2", + "update vtiger_field set block=47 where tabid=18 and block=3", + + "update vtiger_field set block=48 where tabid=19 and block=1", + "update vtiger_field set block=49 where tabid=19 and block=5", + "update vtiger_field set block=50 where tabid=19 and block=2", + + "update vtiger_field set block=51 where tabid=20 and block=1", + "update vtiger_field set block=52 where tabid=20 and block=5", + "update vtiger_field set block=53 where tabid=20 and block=2", + "update vtiger_field set block=55 where tabid=20 and block=6", + "update vtiger_field set block=56 where tabid=20 and block=3", + + "update vtiger_field set block=57 where tabid=21 and block=1", + "update vtiger_field set block=58 where tabid=21 and block=5", + "update vtiger_field set block=59 where tabid=21 and block=2", + "update vtiger_field set block=61 where tabid=21 and block=6", + "update vtiger_field set block=62 where tabid=21 and block=3", + + "update vtiger_field set block=63 where tabid=22 and block=1", + "update vtiger_field set block=64 where tabid=22 and block=5", + "update vtiger_field set block=65 where tabid=22 and block=2", + "update vtiger_field set block=67 where tabid=22 and block=6", + "update vtiger_field set block=68 where tabid=22 and block=3", + + + "update vtiger_field set block=69 where tabid=23 and block=1", + "update vtiger_field set block=70 where tabid=23 and block=5", + "update vtiger_field set block=71 where tabid=23 and block=2", + "update vtiger_field set block=73 where tabid=23 and block=6", + "update vtiger_field set block=74 where tabid=23 and block=3", + ); +foreach($update_query_array1 as $query) +{ + Execute($query); +} + +$insert_query_array5 = Array( + "insert into vtiger_blocks values (1,2,'LBL_OPPORTUNITY_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (2,2,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (3,2,'LBL_DESCRIPTION_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (4,4,'LBL_CONTACT_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (5,4,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (6,4,'LBL_CUSTOMER_PORTAL_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (7,4,'LBL_ADDRESS_INFORMATION',4,0,0,0,0,0)", + "insert into vtiger_blocks values (8,4,'LBL_DESCRIPTION_INFORMATION',5,0,0,0,0,0)", + "insert into vtiger_blocks values (9,6,'LBL_ACCOUNT_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (10,6,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (11,6,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (12,6,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0)", + "insert into vtiger_blocks values (13,7,'LBL_LEAD_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (14,7,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (15,7,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (16,7,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0)", + "insert into vtiger_blocks values (17,8,'LBL_NOTE_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (18,8,'',2,1,0,0,0,0)", + "insert into vtiger_blocks values (19,9,'LBL_TASK_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (20,9,'',2,1,0,0,0,0)", + "insert into vtiger_blocks values (21,10,'LBL_EMAIL_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (22,10,'',2,1,0,0,0,0)", + "insert into vtiger_blocks values (23,10,'',3,1,0,0,0,0)", + "insert into vtiger_blocks values (24,10,'',4,1,0,0,0,0)", + "insert into vtiger_blocks values (25,13,'LBL_TICKET_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (26,13,'',2,1,0,0,0,0)", + "insert into vtiger_blocks values (27,13,'LBL_CUSTOM_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (28,13,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0)", + "insert into vtiger_blocks values (29,13,'LBL_TICKET_RESOLUTION',5,0,0,1,0,0)", + "insert into vtiger_blocks values (30,13,'LBL_COMMENTS',6,0,0,1,0,0)", + "insert into vtiger_blocks values (31,14,'LBL_PRODUCT_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (32,14,'LBL_PRICING_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (33,14,'LBL_STOCK_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (34,14,'LBL_CUSTOM_INFORMATION',4,0,0,0,0,0)", + "insert into vtiger_blocks values (35,14,'LBL_IMAGE_INFORMATION',5,0,0,0,0,0)", + "insert into vtiger_blocks values (36,14,'LBL_DESCRIPTION_INFORMATION',6,0,0,0,0,0)", + "insert into vtiger_blocks values (37,15,'LBL_FAQ_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (38,15,'',2,1,0,0,0,0)", + "insert into vtiger_blocks values (39,15,'',3,1,0,0,0,0)", + "insert into vtiger_blocks values (40,15,'LBL_COMMENT_INFORMATION',4,0,0,1,0,0)", + "insert into vtiger_blocks values (41,16,'LBL_EVENT_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (42,16,'',2,1,0,0,0,0)", + "insert into vtiger_blocks values (43,16,'',3,1,0,0,0,0)", + "insert into vtiger_blocks values (44,18,'LBL_VENDOR_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (45,18,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (46,18,'LBL_VENDOR_ADDRESS_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (47,18,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0)", + "insert into vtiger_blocks values (48,19,'LBL_PRICEBOOK_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (49,19,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (50,19,'LBL_DESCRIPTION_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (51,20,'LBL_QUOTE_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (52,20,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (53,20,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (54,20,'LBL_RELATED_PRODUCTS',4,0,0,0,0,0)", + "insert into vtiger_blocks values (55,20,'LBL_TERMS_INFORMATION',5,0,0,0,0,0)", + "insert into vtiger_blocks values (56,20,'LBL_DESCRIPTION_INFORMATION',6,0,0,0,0,0)", + "insert into vtiger_blocks values (57,21,'LBL_PO_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (58,21,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (59,21,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (60,21,'LBL_RELATED_PRODUCTS',4,0,0,0,0,0)", + "insert into vtiger_blocks values (61,21,'LBL_TERMS_INFORMATION',5,0,0,0,0,0)", + "insert into vtiger_blocks values (62,21,'LBL_DESCRIPTION_INFORMATION',6,0,0,0,0,0)", + "insert into vtiger_blocks values (63,22,'LBL_SO_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (64,22,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (65,22,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (66,22,'LBL_RELATED_PRODUCTS',4,0,0,0,0,0)", + "insert into vtiger_blocks values (67,22,'LBL_TERMS_INFORMATION',5,0,0,0,0,0)", + "insert into vtiger_blocks values (68,22,'LBL_DESCRIPTION_INFORMATION',6,0,0,0,0,0)", + "insert into vtiger_blocks values (69,23,'LBL_INVOICE_INFORMATION',1,0,0,0,0,0)", + "insert into vtiger_blocks values (70,23,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)", + "insert into vtiger_blocks values (71,23,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0)", + "insert into vtiger_blocks values (72,23,'LBL_RELATED_PRODUCTS',4,0,0,0,0,0)", + "insert into vtiger_blocks values (73,23,'LBL_TERMS_INFORMATION',5,0,0,0,0,0)", + "insert into vtiger_blocks values (74,23,'LBL_DESCRIPTION_INFORMATION',6,0,0,0,0,0)" + ); +foreach($insert_query_array5 as $query) +{ + Execute($query); +} + +$update_query_array2 = Array( + "update vtiger_tab set name='Vendors', tablabel='Vendors' where tabid=18", + "update vtiger_tab set name='PriceBooks', tablabel='PriceBooks' where tabid=19", + "update vtiger_tab set presence=0 where tabid in(18,19)", + "update vtiger_relatedlists set label='PriceBooks' where tabid=14 and related_tabid=19" + ); +foreach($update_query_array2 as $query) +{ + Execute($query); +} + +$delete_query1 = "delete from vtiger_actionmapping where actionname in ('SavePriceBook','SaveVendor','PriceBookEditView','VendorEditView','DeletePriceBook','DeleteVendor','PriceBookDetailView','VendorDetailView')"; +Execute($delete_query1); + +$insert_query_array6 = Array( + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Leads')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Accounts')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Contacts')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Potentials')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'HelpDesk')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Quotes')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Activities')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Emails')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Invoice')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Notes')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'PriceBooks')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Products')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'PurchaseOrder')", + + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'SalesOrder')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Vendors')", + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$conn->getUniqueID('vtiger_customview').",'All',1,0,'Faq')" + ); +foreach($insert_query_array6 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Leads'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array7 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_leaddetails:lastname:lastname:Leads_Last_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_leaddetails:firstname:firstname:Leads_First_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_leaddetails:company:company:Leads_Company:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_leadaddress:phone:phone:Leads_Phone:V')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_leadsubdetails:website:website:Leads_Website:V')", + "insert into vtiger_cvcolumnlist values ($cvid,5,'vtiger_leaddetails:email:email:Leads_Email:V')", + "insert into vtiger_cvcolumnlist values ($cvid,6,'vtiger_crmentity:smownerid:assigned_user_id:Leads_Assigned_To:V')" + ); +foreach($insert_query_array7 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Accounts'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array8 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_account:accountname:accountname:Accounts_Account_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_accountbillads:city:bill_city:Accounts_City:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_account:website:website:Accounts_Website:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_account:phone:phone:Accounts_Phone:V')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_crmentity:smownerid:assigned_user_id:Accounts_Assigned_To:V')" + ); +foreach($insert_query_array8 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Contacts'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array9 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_contactdetails:firstname:firstname:Contacts_First_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_contactdetails:lastname:lastname:Contacts_Last_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_contactdetails:title:title:Contacts_Title:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_account:accountname:accountname:Contacts_Account_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_contactdetails:email:email:Contacts_Email:V')", + "insert into vtiger_cvcolumnlist values ($cvid,5,'vtiger_contactdetails:phone:phone:Contacts_Office_Phone:V')", + "insert into vtiger_cvcolumnlist values ($cvid,6,'vtiger_crmentity:smownerid:assigned_user_id:Contacts_Assigned_To:V')" + ); +foreach($insert_query_array9 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Potentials'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array10 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_potential:potentialname:potentialname:Potentials_Potential_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_account:accountname:accountname:Potentials_Account_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_potential:amount:amount:Potentials_Amount:N')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_potential:closingdate:closingdate:Potentials_Expected_Close_Date:D')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_crmentity:smownerid:assigned_user_id:Potentials_Assigned_To:V')" + ); +foreach($insert_query_array10 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='HelpDesk'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array11 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_crmentity:crmid::HelpDesk_Ticket_ID:I')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_troubletickets:title:ticket_title:HelpDesk_Title:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_troubletickets:parent_id:parent_id:HelpDesk_Related_to:I')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_troubletickets:status:ticketstatus:HelpDesk_Status:V')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_troubletickets:priority:ticketpriorities:HelpDesk_Priority:V')", + "insert into vtiger_cvcolumnlist values ($cvid,5,'vtiger_crmentity:smownerid:assigned_user_id:HelpDesk_Assigned_To:V')" + ); +foreach($insert_query_array11 as $query) +{ + Execute($query); +} + + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Quotes'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array12 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_crmentity:crmid::Quotes_Quote_ID:I')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_quotes:subject:subject:Quotes_Subject:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_quotes:quotestage:quotestage:Quotes_Quote_Stage:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_quotes:potentialid:potential_id:Quotes_Potential_Name:I')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_account:accountname:accountname:Quotes_Account_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,5,'vtiger_quotes:total:hdnGrandTotal:Quotes_Total:I')", + "insert into vtiger_cvcolumnlist values ($cvid,6,'vtiger_crmentity:smownerid:assigned_user_id:Quotes_Assigned_To:V')" + ); +foreach($insert_query_array12 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Activities'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array13 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_activity:status:taskstatus:Activities_Status:V')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_activity:activitytype:activitytype:Activities_Type:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_activity:subject:subject:Activities_Subject:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_contactdetails:lastname:lastname:Activities_Contact_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_seactivityrel:crmid:parent_id:Activities_Related_To:V')", + "insert into vtiger_cvcolumnlist values ($cvid,5,'vtiger_activity:date_start:date_start:Activities_Start_Date:D')", + "insert into vtiger_cvcolumnlist values ($cvid,6,'vtiger_activity:due_date:due_date:Activities_End_Date:D')", + "insert into vtiger_cvcolumnlist values ($cvid,7,'vtiger_crmentity:smownerid:assigned_user_id:Activities_Assigned_To:V')" + ); +foreach($insert_query_array13 as $query) +{ + Execute($query); +} + + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Emails'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array14 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_activity:subject:subject:Emails_Subject:V')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_seactivityrel:crmid:parent_id:Emails_Related_To:I')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_activity:date_start:date_start:Emails_Date_Sent:D')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_crmentity:smownerid:assigned_user_id:Emails_Assigned_To:V')" + ); +foreach($insert_query_array14 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Invoice'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array15 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_crmentity:crmid::Invoice_Invoice_Id:I')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_invoice:subject:subject:Invoice_Subject:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_invoice:salesorderid:salesorder_id:Invoice_Sales_Order:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_invoice:invoicestatus:invoicestatus:Invoice_Status:V')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_invoice:total:hdnGrandTotal:Invoice_Total:I')", + "insert into vtiger_cvcolumnlist values ($cvid,5,'vtiger_crmentity:smownerid:assigned_user_id:Invoice_Assigned_To:V')" + ); +foreach($insert_query_array15 as $query) +{ + Execute($query); +} + + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Notes'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array16 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_notes:title:title:Notes_Title:V')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_notes:contact_id:contact_id:Notes_Contact_Name:I')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_senotesrel:crmid:parent_id:Notes_Related_to:I')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_notes:filename:filename:Notes_File:V')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_crmentity:modifiedtime:modifiedtime:Notes_Modified_Time:V')" + ); +foreach($insert_query_array16 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='PriceBooks'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array17 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_pricebook:bookname:bookname:PriceBooks_Price_Book_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_pricebook:active:active:PriceBooks_Active:V')" + ); +foreach($insert_query_array17 as $query) +{ + Execute($query); +} + + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Products'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array18 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_products:productname:productname:Products_Product_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_products:productcode:productcode:Products_Product_Code:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_products:commissionrate:commissionrate:Products_Commission_Rate:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_products:qty_per_unit:qty_per_unit:Products_Qty/Unit:V')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_products:unit_price:unit_price:Products_Unit_Price:V')" + ); +foreach($insert_query_array18 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='PurchaseOrder'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array19 = Array( + "insert into vtiger_cvcolumnlist values($cvid,0,'vtiger_crmentity:crmid::PurchaseOrder_Order_Id:I')", + "insert into vtiger_cvcolumnlist values($cvid,1,'vtiger_purchaseorder:subject:subject:PurchaseOrder_Subject:V')", + "insert into vtiger_cvcolumnlist values($cvid,2,'vtiger_purchaseorder:vendorid:vendor_id:PurchaseOrder_Vendor_Name:I')", + "insert into vtiger_cvcolumnlist values($cvid,3,'vtiger_purchaseorder:tracking_no:tracking_no:PurchaseOrder_Tracking_Number:V')", + "insert into vtiger_cvcolumnlist values($cvid,4,'vtiger_crmentity:smownerid:assigned_user_id:PurchaseOrder_Assigned_To:V')" + ); +foreach($insert_query_array19 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='SalesOrder'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array20 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_crmentity:crmid::SalesOrder_Order_Id:I')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_salesorder:subject:subject:SalesOrder_Subject:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_account:accountname:accountname:SalesOrder_Account_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_quotes:quoteid:quote_id:SalesOrder_Quote_Name:I')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_salesorder:total:hdnGrandTotal:SalesOrder_Total:V')", + "insert into vtiger_cvcolumnlist values ($cvid,5,'vtiger_crmentity:smownerid:assigned_user_id:SalesOrder_Assigned_To:V')" + ); +foreach($insert_query_array20 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Vendors'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array21 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_vendor:vendorname:vendorname:Vendors_Vendor_Name:V')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_vendor:phone:phone:Vendors_Phone:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_vendor:email:email:Vendors_Email:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_vendor:category:category:Vendors_Category:V')" + ); +foreach($insert_query_array21 as $query) +{ + Execute($query); +} + +$res=$conn->query("select cvid from vtiger_customview where viewname='All' and entitytype='Faq'"); +$cvid = $conn->query_result($res,0,"cvid"); + +$insert_query_array22 = Array( + "insert into vtiger_cvcolumnlist values ($cvid,0,'vtiger_faq:id::Faq_FAQ_Id:I')", + "insert into vtiger_cvcolumnlist values ($cvid,1,'vtiger_faq:question:question:Faq_Question:V')", + "insert into vtiger_cvcolumnlist values ($cvid,2,'vtiger_faq:category:faqcategories:Faq_Category:V')", + "insert into vtiger_cvcolumnlist values ($cvid,3,'vtiger_faq:product_id:product_id:Faq_Product_Name:I')", + "insert into vtiger_cvcolumnlist values ($cvid,4,'vtiger_crmentity:createdtime:createdtime:Faq_Created_Time:D')", + "insert into vtiger_cvcolumnlist values ($cvid,5,'vtiger_crmentity:modifiedtime:modifiedtime:Faq_Modified_Time:D')" + ); +foreach($insert_query_array22 as $query) +{ + Execute($query); +} + + +$update_query_array3 = Array( + "update vtiger_field set uitype=53 where tabid=2 and columnname='smownerid'", + "update vtiger_field set uitype=53 where tabid=4 and columnname='smownerid'", + "update vtiger_field set uitype=53 where tabid=20 and columnname='smownerid'", + "update vtiger_field set uitype=53 where tabid=22 and columnname='smownerid'", + "update vtiger_field set uitype=53 where tabid=23 and columnname='smownerid'" + ); +foreach($update_query_array3 as $query) +{ + Execute($query); +} + +//Added on 26-06-06 - we cannot add foreign key in type MyISAM, so we have to change the type to InnoDB +$alter_tables_array = Array("vtiger_groups","vtiger_potential","vtiger_quotes","vtiger_salesorder","vtiger_invoice","vtiger_purchaseorder","vtiger_products","vtiger_account","vtiger_contactdetails","vtiger_vendor","vtiger_users","vtiger_attachments","vtiger_profile"); +foreach($alter_tables_array as $tablename) +{ + Execute("alter table $tablename type=InnoDB"); +} + + +$create_query6 = "CREATE TABLE vtiger_accountgrouprelation ( accountid int(19) NOT NULL, groupname varchar(100) default NULL, PRIMARY KEY (`accountid`)) ENGINE=InnoDB"; +Execute($create_query6); + +$alter_query_array8 = Array( + "alter table vtiger_accountgrouprelation ADD CONSTRAINT fk_1_vtiger_accountgrouprelation FOREIGN KEY (accountid) REFERENCES vtiger_account(accountid) ON DELETE CASCADE", + "alter table vtiger_accountgrouprelation ADD CONSTRAINT fk_2_vtiger_accountgrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE", + "ALTER TABLE `vtiger_accountgrouprelation` ADD KEY accountgrouprelation_groupname_idx (groupname)", + ); +foreach($alter_query_array8 as $query) +{ + Execute($query); +} + +$create_query7 = "CREATE TABLE vtiger_contactgrouprelation ( contactid int(19) NOT NULL default '0', groupname varchar(100) default NULL, PRIMARY KEY (`contactid`))"; +Execute($create_query7); + +$alter_query_array9 = Array( + "alter table vtiger_contactgrouprelation ADD CONSTRAINT fk_contactgrouprelation FOREIGN KEY (contactid) REFERENCES vtiger_contactdetails(contactid) ON DELETE CASCADE", + "alter table vtiger_contactgrouprelation ADD CONSTRAINT fk_contactgrouprelation2 FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE" + ); +foreach($alter_query_array9 as $query) +{ + Execute($query); +} + + +$create_query10 = "CREATE TABLE vtiger_potentialgrouprelation ( potentialid int(19) NOT NULL default '0', groupname varchar(100) default NULL, PRIMARY KEY (`potentialid`))"; +Execute($create_query10); + +$alter_query_array10 = Array( + "alter table vtiger_potentialgrouprelation ADD CONSTRAINT fk_potentialgrouprelation FOREIGN KEY (potentialid) REFERENCES vtiger_potential(potentialid) ON DELETE CASCADE", + "alter table vtiger_potentialgrouprelation ADD CONSTRAINT fk_potentialgrouprelation2 FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE" + ); +foreach($alter_query_array10 as $query) +{ + Execute($query); +} + +$create_query11 = "CREATE TABLE vtiger_quotegrouprelation ( quoteid int(19) NOT NULL default '0', groupname varchar(100) default NULL, PRIMARY KEY (`quoteid`) )"; +Execute($create_query11); + +$alter_query_array11 = Array( + "alter table vtiger_quotegrouprelation ADD CONSTRAINT fk_quotegrouprelation FOREIGN KEY (quoteid) REFERENCES vtiger_quotes(quoteid) ON DELETE CASCADE", + "alter table vtiger_quotegrouprelation ADD CONSTRAINT fk_quotegrouprelation2 FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE" + ); +foreach($alter_query_array11 as $query) +{ + Execute($query); +} + +$create_query12 = "CREATE TABLE vtiger_sogrouprelation ( salesorderid int(19) NOT NULL default '0', groupname varchar(100) default NULL, PRIMARY KEY (`salesorderid`) )"; +Execute($create_query12); + +$alter_query_array12 = Array( + "alter table vtiger_sogrouprelation ADD CONSTRAINT fk_sogrouprelation FOREIGN KEY (salesorderid) REFERENCES vtiger_salesorder(salesorderid) ON DELETE CASCADE", + "alter table vtiger_sogrouprelation ADD CONSTRAINT fk_sogrouprelation2 FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE" + ); +foreach($alter_query_array12 as $query) +{ + Execute($query); +} + +$create_query13 = "CREATE TABLE vtiger_invoicegrouprelation ( invoiceid int(19) NOT NULL default '0', groupname varchar(100) default NULL, PRIMARY KEY (`invoiceid`))"; +Execute($create_query13); + +$alter_query_array13 = Array( + "alter table vtiger_invoicegrouprelation ADD CONSTRAINT fk_invoicegrouprelation FOREIGN KEY (invoiceid) REFERENCES vtiger_invoice(invoiceid) ON DELETE CASCADE", + "alter table vtiger_invoicegrouprelation ADD CONSTRAINT fk_invoicegrouprelation2 FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE" + ); +foreach($alter_query_array13 as $query) +{ + Execute($query); +} + +$create_query14 = "CREATE TABLE vtiger_pogrouprelation ( purchaseorderid int(19) NOT NULL default '0', groupname varchar(100) default NULL, PRIMARY KEY (`purchaseorderid`))"; +Execute($create_query14); + +$alter_query_array14 = Array( + "alter table vtiger_pogrouprelation ADD CONSTRAINT fk_pogrouprelation FOREIGN KEY (purchaseorderid) REFERENCES vtiger_purchaseorder(purchaseorderid) ON DELETE CASCADE", + "alter table vtiger_pogrouprelation ADD CONSTRAINT fk_productgrouprelation2 FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON DELETE CASCADE" + ); +foreach($alter_query_array14 as $query) +{ + Execute($query); +} + +$alter_query1 = "ALTER TABLE vtiger_users ADD column lead_view VARCHAR(25) DEFAULT 'Today' AFTER homeorder"; +Execute($alter_query1); + +$update_query1 = "update vtiger_users set homeorder = 'ALVT,PLVT,QLTQ,CVLVT,HLT,OLV,GRT,OLTSO,ILTI,MNL'"; +Execute($update_query1); + +$alter_query2 = "ALTER TABLE vtiger_products change column imagename imagename text"; +Execute($alter_query2); + +$alter_query3 = "alter table vtiger_systems modify server varchar(50), modify server_username varchar(50), modify server_password varchar(50), add column smtp_auth char(5)"; +Execute($alter_query3); + +$alter_query_array15 = Array( + "alter table vtiger_users add column imagename varchar(250)", + "alter table vtiger_users add column tagcloud varchar(250)" + ); +foreach($alter_query_array15 as $query) +{ + Execute($query); +} + +$alter_query_array16 = Array( + "alter table vtiger_systems change column server server varchar(80) default NULL", + "alter table vtiger_systems change column server_username server_username varchar(80) default NULL" + ); +foreach($alter_query_array16 as $query) +{ + Execute($query); +} + + +$create_query15 = "create table vtiger_portal(portalid int(19), portalname varchar(255) NOT NULL, portalurl varchar(255) NOT NULL,sequence int(3) NOT NULL, PRIMARY KEY (portalid))"; +Execute($create_query15); + +$alter_query = "ALTER TABLE vtiger_field ADD column info_type varchar(20) default NULL after quickcreatesequence"; +Execute($alter_query); + +//$update_query2 = "UPDATE vtiger_field SET fieldlabel = 'Reference' WHERE tabid = 4 and tablename = 'contactdetails' and fieldname='reference'"; +//changed in 24-04-06 because the reference has not been entered into the vtiger_field table. +$newfieldid = $conn->getUniqueID("vtiger_field"); +$update_query2 = "insert into vtiger_field values (4,".$newfieldid.",'reference','contactdetails',1,'56','reference','Reference',1,0,0,10,23,4,1,'C~O',1,null,'ADV')"; +Execute($update_query2); +populateFieldForSecurity('4',$newfieldid); + +$update_query_array4 = Array( + "UPDATE vtiger_field SET info_type = 'BAS'", + + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 7 and fieldlabel = 'Website'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 7 and fieldlabel = 'Industry'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 7 and fieldlabel = 'Annual Revenue'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 7 and fieldlabel = 'No Of Employees'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 7 and fieldlabel = 'Yahoo Id'", + + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Ticker Symbol'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Other Phone'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Member Of'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Employees'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Other Email'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Ownership'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Rating'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'industry'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'SIC Code'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Type'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Annual Revenue'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 6 and fieldlabel = 'Email Opt Out'", + + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Home Phone'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Department'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Birthdate'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Email'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Reports To'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Assistant'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Yahoo Id'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Assistant Phone'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Do Not Call'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Email Opt Out'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Reference'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Portal User'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Support Start Date'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Support End Date'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 4 and fieldlabel = 'Contact Image'", + + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 14 and fieldlabel = 'Usage Unit'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 14 and fieldlabel = 'Qty/Unit'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 14 and fieldlabel = 'Qty In Stock'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 14 and fieldlabel = 'Reorder Level'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 14 and fieldlabel = 'Handler'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 14 and fieldlabel = 'Qty In Demand'", + "UPDATE vtiger_field SET info_type = 'ADV' WHERE tabid = 14 and fieldlabel = 'Product Image'" + ); +foreach($update_query_array4 as $query) +{ + Execute($query); +} + + +$create_query16 = "CREATE TABLE vtiger_chat_msg ( `id` bigint(20) NOT NULL auto_increment, `chat_from` bigint(20) NOT NULL default '0', `chat_to` bigint(20) NOT NULL default '0', `born` timestamp NULL default '0000-00-00 00:00:00', `msg` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `chat_to` (`chat_to`), KEY `chat_from` (`chat_from`), KEY `born` (`born`)) ENGINE=InnoDB"; +Execute($create_query16); +$create_query17 = "CREATE TABLE vtiger_chat_pchat ( `id` bigint(20) NOT NULL auto_increment, `msg` bigint(20) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `msg` (`msg`)) ENGINE=InnoDB"; +Execute($create_query17); + +$create_query18 = "CREATE TABLE vtiger_chat_pvchat ( `id` bigint(20) NOT NULL auto_increment, `msg` bigint(20) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `msg` (`msg`)) ENGINE=InnoDB"; +Execute($create_query18); + +$create_query19 = "CREATE TABLE vtiger_chat_users ( `id` bigint(20) NOT NULL auto_increment, `nick` varchar(50) NOT NULL, `session` varchar(50) NOT NULL, `ip` varchar(20) NOT NULL default '000.000.000.000', `ping` timestamp NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`), UNIQUE KEY `session` (`session`), UNIQUE KEY `nick` (`nick`), KEY `ping` (`ping`)) ENGINE=InnoDB"; +Execute($create_query19); + +$alter_query_array17 = Array( + "ALTER TABLE `vtiger_chat_msg` ADD CONSTRAINT `chat_msg_ibfk_1` FOREIGN KEY (`chat_from`) REFERENCES `vtiger_chat_users` (`id`) ON DELETE CASCADE", + + "ALTER TABLE `vtiger_chat_pchat` ADD CONSTRAINT `chat_pchat_ibfk_1` FOREIGN KEY (`msg`) REFERENCES `vtiger_chat_msg` (`id`) ON DELETE CASCADE", + + "ALTER TABLE `vtiger_chat_pvchat` ADD CONSTRAINT `chat_pvchat_ibfk_1` FOREIGN KEY (`msg`) REFERENCES `vtiger_chat_msg` (`id`) ON DELETE CASCADE" + ); +foreach($alter_query_array17 as $query) +{ + Execute($query); +} + +$create_query20 = "CREATE TABLE vtiger_freetags ( id int(19) NOT NULL, tag varchar(50) NOT NULL default '', raw_tag varchar(50) NOT NULL default '', PRIMARY KEY (id)) TYPE=InnoDB"; +Execute($create_query20); + +$create_query21 = "CREATE TABLE vtiger_freetagged_objects ( tag_id int(20) NOT NULL default '0', tagger_id int(20) NOT NULL default '0', object_id int(20) NOT NULL default '0', tagged_on timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, module varchar(50) NOT NULL default '', PRIMARY KEY (`tag_id`,`tagger_id`,`object_id`), KEY `freetagged_objects_tag_id_tagger_id_object_id_idx` (`tag_id`,`tagger_id`,`object_id`)) TYPE=InnoDB"; +Execute($create_query21); + +$alter_query4 = "alter table vtiger_profile add column description text"; +Execute($alter_query4); + +$alter_query5 = "alter table vtiger_contactdetails add column imagename varchar(250) after currency"; +Execute($alter_query5); + +$alter_query = "ALTER TABLE vtiger_contactdetails ADD column reference varchar(3) default NULL after imagename"; +Execute($alter_query); + +Execute("insert into vtiger_blocks values(75,4,'LBL_IMAGE_INFORMATION',5,0,0,0,0,0)"); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (4,".$newfieldid.",'imagename','contactdetails',1,'69','imagename','Contact Image',1,0,0,100,1,75,1,'V~O',1,null,'ADV')"; +Execute($insert_query); +populateFieldForSecurity('4',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (9,".$newfieldid.",'visibility','activity',1,15,'visibility','Visibility',1,0,0,100,17,19,3,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('9',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (16,".$newfieldid.",'visibility','activity',1,15,'visibility','Visibility',1,0,0,100,19,41,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('16',$newfieldid); + + +$alter_query6 = "ALTER TABLE vtiger_activity ADD COLUMN visibility varchar(50) NOT NULL DEFAULT 'all' after notime"; +Execute($alter_query6); + +$create_query22 = "CREATE TABLE vtiger_visibility ( `visibilityid` int(19) NOT NULL auto_increment, `visibility` varchar(200) NOT NULL default '', `sortorderid` int(19) NOT NULL default '0', `presence` int(1) NOT NULL default '1', PRIMARY KEY (`visibilityid`), UNIQUE KEY `Visibility_VLY` (`visibility`)) ENGINE=InnoDB"; +Execute($create_query22); + + +$create_query23 = "CREATE TABLE vtiger_sharedcalendar ( `userid` int(19) NOT NULL default '0', `sharedid` int(19) NOT NULL default '0', PRIMARY KEY (`userid`,`sharedid`)) ENGINE=InnoDB"; +Execute($create_query23); + +$insert_query6 = "INSERT INTO vtiger_tab VALUES(26,'Campaigns',0,23,'Campaigns',null,null,1)"; +Execute($insert_query6); +$insert_query7 = "INSERT INTO vtiger_parenttabrel VALUES(2,26,1)"; +Execute($insert_query7); + +$insert_query8 = "insert into vtiger_blocks values(76,26,'LBL_CAMPAIGN_INFORMATION',1,0,0,0,0,0)"; +Execute($insert_query8); +$insert_query8 = "insert into vtiger_blocks values (77,26,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0)"; +Execute($insert_query8); +$insert_query9 = "insert into vtiger_blocks values(78,26,'LBL_DESCRIPTION_INFORMATION',3,0,0,0,0,0)"; +Execute($insert_query9); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'campaignname','campaign',1,'2','campaignname','Campaign Name',1,0,0,100,1,76,1,'V~M',0,1,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'campaigntype','campaign',1,15,'campaigntype','Campaign Type',1,0,0,100,2,76,1,'V~O',0,5,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid,'product_id','campaign',1,59,'product_id','Product',1,0,0,100,3,76,1,'I~O',0,5,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid,'campaignstatus','campaign',1,15,'campaignstatus','Campaign Status',1,0,0,100,4,76,1,'V~O',0,5,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'closingdate','campaign',1,'23','closingdate','Expected Close Date',1,0,0,100,5,76,1,'D~M',0,3,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'expectedrevenue','campaign',1,'1','expectedrevenue','Expected Revenue',1,0,0,100,6,76,1,'I~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'budgetcost','campaign',1,'1','budgetcost','Budget Cost',1,0,0,100,7,76,1,'I~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'actualcost','campaign',1,'1','actualcost','Actual Cost',1,0,0,100,8,76,1,'I~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'expectedresponse','campaign',1,'15','expectedresponse','Expected Response',1,0,0,100,9,76,1,'V~O',0,4,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'smownerid','crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,10,76,1,'V~M',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'numsent','campaign',1,'9','numsent','Num Sent',1,0,0,100,11,76,1,'N~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'sponsor','campaign',1,'1','sponsor','Sponsor',1,0,0,100,12,76,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'targetaudience','campaign',1,'1','targetaudience','Target Audience',1,0,0,100,13,76,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'targetsize','campaign',1,'1','targetsize','TargetSize',1,0,0,100,14,76,1,'N~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'expectedresponsecount','campaign',1,'1','expectedresponsecount','Expected Response Count',1,0,0,100,17,76,1,'N~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'expectedsalescount','campaign',1,'1','expectedsalescount','Expected Sales Count',1,0,0,100,15,76,1,'N~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'expectedroi','campaign',1,'1','expectedroi','Expected ROI',1,0,0,100,19,76,1,'N~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'actualresponsecount','campaign',1,'1','actualresponsecount','Actual Response Count',1,0,0,100,18,76,1,'N~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'actualsalescount','campaign',1,'1','actualsalescount','Actual Sales Count',1,0,0,100,16,76,1,'N~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'actualroi','campaign',1,'1','actualroi','Actual ROI',1,0,0,100,20,76,1,'N~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'createdtime','crmentity',1,'70','createdtime','Created Time',1,0,0,100,15,76,2,'T~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'modifiedtime','crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,16,76,2,'T~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (26, $newfieldid, 'description','crmentity',1,'19','description','Description',1,0,0,100,1,82,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('26',$newfieldid); + +/* +//add all field entries to def_org_field and profile2field tables for Campaigns +$field_res = $conn->query("select fieldid from vtiger_field where tabid=26"); +for($i=0;$i<$conn->num_rows($field_res);$i++) +{ + $fieldid = $conn->query_result($field_res,$i,'fieldid'); + + populateFieldForSecurity('26',$fieldid); +} +*/ + +$insert_query_array25 = Array( + "insert into vtiger_relatedlists values (".$conn->getUniqueID('vtiger_relatedlists').",".getTabid("Campaigns").",".getTabid("Contacts").",'get_contacts',1,'Contacts',0)", + "insert into vtiger_relatedlists values (".$conn->getUniqueID('vtiger_relatedlists').",".getTabid("Campaigns").",".getTabid("Leads").",'get_leads',2,'Leads',0)" + ); +foreach($insert_query_array25 as $query) +{ + Execute($query); +} + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (7, $newfieldid, 'campaignid','leaddetails',1,'51','campaignid','Campaign Name',1,0,0,100,6,13,3,'I~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('7',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (4, $newfieldid, 'campaignid','contactdetails',1,'51','campaignid','Campaign Name',1,0,0,100,6,4,3,'I~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('4',$newfieldid); + + +$create_query24 = " +CREATE TABLE vtiger_campaign ( + `campaignname` varchar(255) default NULL, + `campaigntype` varchar(255) default NULL, + `campaignstatus` varchar(255) default NULL, + `expectedrevenue` int(19) default NULL, + `budgetcost` int(19) default NULL, + `actualcost` int(19) default NULL, + `expectedresponse` varchar(255) default NULL, + `numsent` decimal(11,0) default NULL, + `product_id` int(19) default NULL, + `sponsor` varchar(255) default NULL, + `targetaudience` varchar(255) default NULL, + `targetsize` int(19) default NULL, + `expectedresponsecount` int(19) default NULL, + `expectedsalescount` int(19) default NULL, + `expectedroi` int(19) default NULL, + `actualresponsecount` int(19) default NULL, + `actualsalescount` int(19) default NULL, + `actualroi` int(19) default NULL, + `campaignid` int(19) NOT NULL, + `closingdate` date default NULL, + PRIMARY KEY (`campaignid`), + KEY `idx_campaignstatus` (`campaignstatus`), + KEY `idx_campaignname` (`campaignname`), + KEY `idx_campaignid` (`campaignid`) +) ENGINE=InnoDB + "; +Execute($create_query24); + + +//Added on 06-06-06 +$create_query25 = "CREATE TABLE vtiger_campaigncontrel ( + `campaignid` int(19) NOT NULL default '0', + `contactid` int(19) NOT NULL default '0', + PRIMARY KEY (`campaignid`), + KEY `campaigncontrel_contractid_idx` (`contactid`) + ) ENGINE=InnoDB"; +/* +$create_query25 = "CREATE TABLE vtiger_campaigncontrel ( + `campaignid` int(19) NOT NULL default '0', + `contactid` int(19) NOT NULL default '0', + PRIMARY KEY (`campaignid`), + KEY `CampaignContRel_IDX1` (`contactid`), + CONSTRAINT `fk_CampaignContRel2` FOREIGN KEY (`contactid`) REFERENCES `vtiger_contactdetails` (`contactid`) ON DELETE CASCADE, + CONSTRAINT `fk_CampaignContRel1` FOREIGN KEY (`campaignid`) REFERENCES `vtiger_campaign` (`campaignid`) ON DELETE CASCADE +) ENGINE=InnoDB"; +*/ +Execute($create_query25); + +//Added on 06-06-06 +$create_table_query = "CREATE TABLE vtiger_campaigngrouprelation ( + `campaignid` int(19) NOT NULL, + `groupname` varchar(100) default NULL, + PRIMARY KEY (`campaignid`), + KEY `campaigngrouprelation_IDX1` (`groupname`) + ) ENGINE=InnoDB"; +/* +$create_table_query = " +CREATE TABLE vtiger_campaigngrouprelation ( + `campaignid` int(19) NOT NULL, + `groupname` varchar(100) default NULL, + PRIMARY KEY (`campaignid`), + KEY `campaigngrouprelation_IDX1` (`groupname`), + CONSTRAINT `fk_campaigngrouprelation2` FOREIGN KEY (`groupname`) REFERENCES `vtiger_groups` (`groupname`) ON DELETE CASCADE, + CONSTRAINT `fk_campaigngrouprelation1` FOREIGN KEY (`campaignid`) REFERENCES `vtiger_campaign` (`campaignid`) ON DELETE CASCADE +) ENGINE=InnoDB"; +*/ +Execute($create_table_query); + + +//Added on 06-06-06 +$create_query26 = "CREATE TABLE vtiger_campaignleadrel ( + `campaignid` int(19) NOT NULL default '0', + `leadid` int(19) NOT NULL default '0', + PRIMARY KEY (`campaignid`), + KEY `campaignleadrel_leadid_campaignid_idx` (`leadid`,`campaignid`) + ) ENGINE=InnoDB"; +/* +$create_query26 = "CREATE TABLE vtiger_campaignleadrel ( + `campaignid` int(19) NOT NULL default '0', + `leadid` int(19) NOT NULL default '0', + PRIMARY KEY (`campaignid`), + KEY `CampaignLeadRel_IDX1` (`leadid`,`campaignid`), + CONSTRAINT `fk_CampaignLeadRel1234` FOREIGN KEY (`campaignid`) REFERENCES `vtiger_campaign` (`campaignid`) ON DELETE CASCADE, + CONSTRAINT `fk_CampaignLeadRel2423` FOREIGN KEY (`leadid`) REFERENCES `vtiger_leaddetails` (`leadid`) ON DELETE CASCADE +) ENGINE=InnoDB"; +*/ +Execute($create_query26); + +$create_table_query1 = "CREATE TABLE vtiger_campaignscf ( + `campaignid` int(19) NOT NULL default '0', + PRIMARY KEY (`campaignid`), + CONSTRAINT `fk_CampaignsCF` FOREIGN KEY (`campaignid`) REFERENCES `vtiger_campaign` (`campaignid`) ON DELETE CASCADE +) ENGINE=InnoDB"; +Execute($create_table_query1); + +$alter_query_array18 = Array( + "alter table vtiger_potential add column campaignid int(19) default NULL after probability", + "alter table vtiger_potential drop column campaignsource", + //"alter table vtiger_notes drop PRIMARY KEY contact_id", + "alter table vtiger_notes drop PRIMARY KEY , add primary key(notesid)", + "update vtiger_field set uitype=99 where fieldname='update_log' and tabid=13" + ); +foreach($alter_query_array18 as $query) +{ + Execute($query); +} + + +//Added on 09-08-2006 +//In the next array we have add constraint for tables purchaseorder, salesorder, quotes and invoice where as the corresponding entity ids should not be 0 they should be NULL. so that this change has been done +Execute("update vtiger_purchaseorder set contactid=NULL where contactid=0"); +Execute("update vtiger_salesorder set contactid=NULL where contactid=0"); +Execute("update vtiger_quotes set contactid=NULL where contactid=0"); +Execute("update vtiger_quotes set potentialid=NULL where potentialid=0"); +Execute("update vtiger_invoice set salesorderid=NULL where salesorderid=0"); + + +//echo "

    Database Modifications for Indexing and some missded tables starts here.....
    "; +//Added queries which are for indexing and the missing tables - Mickie - on 06-04-2006 + +$create_table_query_array = Array( + + +"CREATE TABLE vtiger_actualcost ( + `actualcostid` int(19) NOT NULL auto_increment, + `actualcost` varchar(200) NOT NULL, + `sortorderid` int(19) NOT NULL default '0', + `presence` int(1) NOT NULL default '1', + PRIMARY KEY (`actualcostid`), + UNIQUE KEY `CampaignActCst_UK01` (`actualcost`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_campaignstatus ( + `campaignstatusid` int(19) NOT NULL auto_increment, + `campaignstatus` varchar(200) NOT NULL, + `sortorderid` int(19) NOT NULL default '0', + `presence` int(1) NOT NULL default '1', + PRIMARY KEY (`campaignstatusid`), + KEY `Campaignstatus_UK01` (`campaignstatus`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_campaigntype ( + `campaigntypeid` int(19) NOT NULL auto_increment, + `campaigntype` varchar(200) NOT NULL, + `sortorderid` int(19) NOT NULL default '0', + `presence` int(1) NOT NULL default '1', + PRIMARY KEY (`campaigntypeid`), + UNIQUE KEY `Campaigntype_UK01` (`campaigntype`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_module_rel ( + `shareid` int(19) NOT NULL, + `tabid` int(19) NOT NULL, + `relationtype` varchar(200) default NULL, + PRIMARY KEY (`shareid`), + KEY `idx_datashare_module_rel_tabid` (`tabid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_grp2grp ( + `shareid` int(19) NOT NULL, + `share_groupid` int(19) default NULL, + `to_groupid` int(19) default NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`), + KEY `datashare_grp2grp_share_groupid_idx` (`share_groupid`), + KEY `datashare_grp2grp_to_groupid_idx` (`to_groupid`) + ) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_grp2role ( + `shareid` int(19) NOT NULL, + `share_groupid` int(19) default NULL, + `to_roleid` varchar(255) default NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`), + KEY `idx_datashare_grp2role_share_groupid` (`share_groupid`), + KEY `idx_datashare_grp2role_to_roleid` (`to_roleid`) + ) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_grp2rs ( + `shareid` int(19) NOT NULL, + `share_groupid` int(19) default NULL, + `to_roleandsubid` varchar(255) default NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`), + KEY `datashare_grp2rs_share_groupid_idx` (`share_groupid`), + KEY `datashare_grp2rs_to_roleandsubid_idx` (`to_roleandsubid`) + ) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_relatedmodule_permission ( + `shareid` int(19) NOT NULL, + `datashare_relatedmodule_id` int(19) NOT NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`,`datashare_relatedmodule_id`), + KEY `datashare_relatedmodule_permission_UK1` (`shareid`,`permission`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_relatedmodules ( + `datashare_relatedmodule_id` int(19) NOT NULL, + `tabid` int(19) default NULL, + `relatedto_tabid` int(19) default NULL, + PRIMARY KEY (`datashare_relatedmodule_id`), + KEY `datashare_relatedmodules_tabid_idx` (`tabid`), + KEY `datashare_relatedmodules_relatedto_tabid_idx` (`relatedto_tabid`) + ) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_relatedmodules_seq ( + `id` int(11) NOT NULL +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_role2group ( + `shareid` int(19) NOT NULL, + `share_roleid` varchar(255) default NULL, + `to_groupid` int(19) default NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`), + KEY `idx_datashare_role2group_share_roleid` (`share_roleid`), + KEY `idx_datashare_role2group_to_groupid` (`to_groupid`) + ) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_role2role ( + `shareid` int(19) NOT NULL, + `share_roleid` varchar(255) default NULL, + `to_roleid` varchar(255) default NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`), + KEY `datashare_role2role_share_roleid_idx` (`share_roleid`), + KEY `datashare_role2role_to_roleid_idx` (`to_roleid`) + ) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_role2rs ( + `shareid` int(19) NOT NULL, + `share_roleid` varchar(255) default NULL, + `to_roleandsubid` varchar(255) default NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`), + KEY `datashare_role2s_share_roleid_idx` (`share_roleid`), + KEY `datashare_role2s_to_roleandsubid_idx` (`to_roleandsubid`) + ) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_rs2grp ( + `shareid` int(19) NOT NULL, + `share_roleandsubid` varchar(255) default NULL, + `to_groupid` int(19) default NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`), + KEY `datashare_rs2grp_share_roleandsubid_idx` (`share_roleandsubid`), + KEY `datashare_rs2grp_to_groupid_idx` (`to_groupid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_rs2role ( + `shareid` int(19) NOT NULL, + `share_roleandsubid` varchar(255) default NULL, + `to_roleid` varchar(255) default NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`), + KEY `datashare_rs2role_share_roleandsubid_idx` (`share_roleandsubid`), + KEY `datashare_rs2role_to_roleid_idx` (`to_roleid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_datashare_rs2rs ( + `shareid` int(19) NOT NULL, + `share_roleandsubid` varchar(255) default NULL, + `to_roleandsubid` varchar(255) default NULL, + `permission` int(19) default NULL, + PRIMARY KEY (`shareid`), + KEY `datashare_rs2rs_share_roleandsubid_idx` (`share_roleandsubid`), + KEY `idx_datashare_rs2rs_to_roleandsubid_idx` (`to_roleandsubid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_expectedresponse ( + `expectedresponseid` int(19) NOT NULL auto_increment, + `expectedresponse` varchar(200) NOT NULL, + `sortorderid` int(19) NOT NULL default '0', + `presence` int(1) NOT NULL default '1', + PRIMARY KEY (`expectedresponseid`), + UNIQUE KEY `CampaignExpRes_UK01` (`expectedresponse`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_expectedrevenue ( + `expectedrevenueid` int(19) NOT NULL auto_increment, + `expectedrevenue` varchar(200) NOT NULL, + `sortorderid` int(19) NOT NULL default '0', + `presence` int(1) NOT NULL default '1', + PRIMARY KEY (`expectedrevenueid`), + UNIQUE KEY `CampaignExpRev_UK01` (`expectedrevenue`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_tmp_read_group_rel_sharing_per ( + `userid` int(11) NOT NULL, + `tabid` int(11) NOT NULL, + `relatedtabid` int(11) NOT NULL, + `sharedgroupid` int(11) NOT NULL, + PRIMARY KEY (`userid`,`tabid`,`relatedtabid`,`sharedgroupid`), + KEY `tmp_read_group_rel_sharing_per_userid_sharedgroupid_tabid` (`userid`,`sharedgroupid`,`tabid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_tmp_read_group_sharing_per ( + `userid` int(11) NOT NULL, + `tabid` int(11) NOT NULL, + `sharedgroupid` int(11) NOT NULL, + PRIMARY KEY (`userid`,`tabid`,`sharedgroupid`), + KEY `tmp_read_group_sharing_per_userid_sharedgroupid_idx` (`userid`,`sharedgroupid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_tmp_read_user_rel_sharing_per ( + `userid` int(11) NOT NULL, + `tabid` int(11) NOT NULL, + `relatedtabid` int(11) NOT NULL, + `shareduserid` int(11) NOT NULL, + PRIMARY KEY (`userid`,`tabid`,`relatedtabid`,`shareduserid`), + KEY `tmp_read_user_rel_sharing_per_userid_shared_reltabid_idx` (`userid`,`shareduserid`,`relatedtabid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_tmp_read_user_sharing_per ( + `userid` int(11) NOT NULL, + `tabid` int(11) NOT NULL, + `shareduserid` int(11) NOT NULL, + PRIMARY KEY (`userid`,`tabid`,`shareduserid`), + KEY `tmp_read_user_sharing_per_userid_shareduserid_idx` (`userid`,`shareduserid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_tmp_write_group_rel_sharing_per ( + `userid` int(11) NOT NULL, + `tabid` int(11) NOT NULL, + `relatedtabid` int(11) NOT NULL, + `sharedgroupid` int(11) NOT NULL, + PRIMARY KEY (`userid`,`tabid`,`relatedtabid`,`sharedgroupid`), + KEY `tmp_write_group_rel_sharing_per_userid_sharedgroupid_tabid_idx` (`userid`,`sharedgroupid`,`tabid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_tmp_write_group_sharing_per ( + `userid` int(11) NOT NULL, + `tabid` int(11) NOT NULL, + `sharedgroupid` int(11) NOT NULL, + PRIMARY KEY (`userid`,`tabid`,`sharedgroupid`), + KEY `tmp_write_group_sharing_per_UK1` (`userid`,`sharedgroupid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_tmp_write_user_rel_sharing_per ( + `userid` int(11) NOT NULL, + `tabid` int(11) NOT NULL, + `relatedtabid` int(11) NOT NULL, + `shareduserid` int(11) NOT NULL, + PRIMARY KEY (`userid`,`tabid`,`relatedtabid`,`shareduserid`), + KEY `tmp_write_user_rel_sharing_per_userid_sharduserid_tabid_idx` (`userid`,`shareduserid`,`tabid`) +) ENGINE=InnoDB", + +"CREATE TABLE vtiger_tmp_write_user_sharing_per ( + `userid` int(11) NOT NULL, + `tabid` int(11) NOT NULL, + `shareduserid` int(11) NOT NULL, + PRIMARY KEY (`userid`,`tabid`,`shareduserid`), + KEY `tmp_write_user_sharing_per_userid_shareduserid_idx` (`userid`,`shareduserid`) +) ENGINE=InnoDB", + + + ); + +foreach($create_table_query_array as $query) +{ + Execute($query); +} + +$query_array = Array( + +//"ALTER TABLE `vtiger_activity` DROP INDEX `status`", +//"ALTER TABLE `vtiger_contactgrouprelation` DROP INDEX `fk_contactgrouprelation2`", +//"ALTER TABLE `vtiger_customview` DROP INDEX `customview`", +//"ALTER TABLE `vtiger_def_org_field` DROP INDEX `tabid`", +//"ALTER TABLE `vtiger_field` DROP INDEX `tabid`", +//"ALTER TABLE `vtiger_groups` DROP INDEX `groupname`", +//"ALTER TABLE `vtiger_invoicegrouprelation` DROP INDEX `fk_invoicegrouprelation2`", +//"ALTER TABLE `vtiger_pogrouprelation` DROP INDEX `fk_productgrouprelation2`", +//"ALTER TABLE `vtiger_potential` DROP INDEX `potentialid`", +//"ALTER TABLE `vtiger_potentialgrouprelation` DROP INDEX `fk_potentialgrouprelation2`", +//"ALTER TABLE `vtiger_profile2field` DROP INDEX `tabid`", +"ALTER TABLE `vtiger_profile2tab` DROP INDEX `idx_profile2tab`", +"ALTER TABLE `vtiger_profile2tab` ADD KEY `profile2tab_profileid_tabid_idx` (`profileid`, `tabid`)", +//"ALTER TABLE `vtiger_quotegrouprelation` DROP INDEX `fk_quotegrouprelation2`", +"ALTER TABLE `vtiger_reportmodules` DROP INDEX `reportmodules_IDX0`", +"ALTER TABLE `vtiger_reportmodules` MODIFY COLUMN `reportmodulesid` INTEGER(19) NOT NULL", + +"ALTER TABLE `vtiger_reportsortcol` DROP INDEX `reportsortcol_IDX0`", +"ALTER TABLE `vtiger_reportsortcol` ADD KEY `fk_1_vtiger_reportsortcol` (`reportid`)", +"ALTER TABLE `vtiger_reportsortcol` MODIFY COLUMN `sortcolid` INTEGER(19) NOT NULL", +"ALTER TABLE `vtiger_reportsortcol` MODIFY COLUMN `reportid` INTEGER(19) NOT NULL", + +"ALTER TABLE `vtiger_reportsummary` DROP INDEX `reportsummary_IDX0`", +"ALTER TABLE `vtiger_reportsummary` ADD KEY `reportsummary_reportsummaryid_idx` (`reportsummaryid`)", +"ALTER TABLE `vtiger_reportsummary` MODIFY COLUMN `reportsummaryid` INTEGER(19) NOT NULL", +"ALTER TABLE `vtiger_reportsummary` MODIFY COLUMN `summarytype` INTEGER(19) NOT NULL", + +//"ALTER TABLE `vtiger_seattachmentsrel` DROP INDEX `attachmentsid`", +//"ALTER TABLE `vtiger_sogrouprelation` DROP INDEX `fk_sogrouprelation2`", +//"ALTER TABLE `vtiger_tab` DROP INDEX `tabid`", +//"ALTER TABLE `vtiger_troubletickets` DROP INDEX `status`", +"ALTER TABLE `vtiger_activity_reminder` TYPE=InnoDB", +"ALTER TABLE `vtiger_activsubtype` TYPE=InnoDB", +"ALTER TABLE `vtiger_contactgrouprelation` TYPE=InnoDB", +//"ALTER TABLE `vtiger_customerdetails` TYPE=InnoDB", +"ALTER TABLE `vtiger_customview_seq` TYPE=InnoDB", +"ALTER TABLE `vtiger_def_org_field` TYPE=InnoDB", +"ALTER TABLE `vtiger_def_org_share` TYPE=InnoDB", +"ALTER TABLE `vtiger_def_org_share_seq` TYPE=InnoDB", +//"ALTER TABLE `vtiger_defaultcv` TYPE=InnoDB", +"ALTER TABLE `vtiger_durationhrs` TYPE=InnoDB", +"ALTER TABLE `vtiger_durationmins` TYPE=InnoDB", +"ALTER TABLE `vtiger_emailtemplates` TYPE=InnoDB", +//"ALTER TABLE `vtiger_emailtemplates_seq` TYPE=InnoDB", +"ALTER TABLE `vtiger_faqcategories` TYPE=InnoDB", +"ALTER TABLE `vtiger_faqstatus` TYPE=InnoDB", +"ALTER TABLE `vtiger_field_seq` TYPE=InnoDB", +"ALTER TABLE `vtiger_files` TYPE=InnoDB", +"ALTER TABLE `vtiger_group2grouprel` TYPE=InnoDB", +"ALTER TABLE `vtiger_group2role` TYPE=InnoDB", +"ALTER TABLE `vtiger_group2rs` TYPE=InnoDB", +//"DROP TABLE `groups_seq`", +"ALTER TABLE `vtiger_headers` TYPE=InnoDB", +"ALTER TABLE `vtiger_import_maps` TYPE=InnoDB", +"ALTER TABLE `vtiger_inventorynotification_seq` TYPE=InnoDB", +"ALTER TABLE `vtiger_invoicegrouprelation` TYPE=InnoDB", +"ALTER TABLE `vtiger_loginhistory` TYPE=InnoDB", +"ALTER TABLE `vtiger_mail_accounts` TYPE=InnoDB", +"ALTER TABLE `vtiger_notificationscheduler_seq` TYPE=InnoDB", +"ALTER TABLE `vtiger_ownernotify` TYPE=InnoDB", +"ALTER TABLE `vtiger_parenttabrel` TYPE=InnoDB", +"ALTER TABLE `vtiger_pogrouprelation` TYPE=InnoDB", +"ALTER TABLE `vtiger_portal` TYPE=InnoDB", +"ALTER TABLE `vtiger_portalinfo` TYPE=InnoDB", +"ALTER TABLE `vtiger_potentialgrouprelation` TYPE=InnoDB", +"ALTER TABLE `vtiger_profile2field` TYPE=InnoDB", +"ALTER TABLE `vtiger_reportmodules` TYPE=InnoDB", +"ALTER TABLE `vtiger_profile2globalpermissions` TYPE=InnoDB", +"ALTER TABLE `vtiger_profile2standardpermissions` TYPE=InnoDB", +"ALTER TABLE `vtiger_profile2tab` TYPE=InnoDB", +"ALTER TABLE `vtiger_profile2utility` TYPE=InnoDB", +"ALTER TABLE `vtiger_profile_seq` TYPE=InnoDB", +"ALTER TABLE `vtiger_quotegrouprelation` TYPE=InnoDB", +"ALTER TABLE `vtiger_rating` TYPE=InnoDB", +"ALTER TABLE `vtiger_relatedlists` TYPE=InnoDB", +"ALTER TABLE `vtiger_relatedlists_seq` TYPE=InnoDB", +"ALTER TABLE `vtiger_role2profile` TYPE=InnoDB", +"ALTER TABLE `vtiger_role_seq` TYPE=InnoDB", +"ALTER TABLE `vtiger_rss` TYPE=InnoDB", +"ALTER TABLE `vtiger_sales_stage` TYPE=InnoDB", +"ALTER TABLE `vtiger_salutationtype` TYPE=InnoDB", +"ALTER TABLE `vtiger_selectquery_seq` TYPE=InnoDB", +"ALTER TABLE `vtiger_sogrouprelation` TYPE=InnoDB", +"ALTER TABLE `vtiger_systems` TYPE=InnoDB", +"ALTER TABLE `vtiger_taskpriority` TYPE=InnoDB", +"ALTER TABLE `vtiger_taskstatus` TYPE=InnoDB", +"ALTER TABLE `vtiger_ticketcategories` TYPE=InnoDB", +"ALTER TABLE `vtiger_ticketpriorities` TYPE=InnoDB", +"ALTER TABLE `vtiger_ticketseverities` TYPE=InnoDB", +"ALTER TABLE `vtiger_ticketstatus` TYPE=InnoDB", +"ALTER TABLE `vtiger_ticketstracktime` TYPE=InnoDB", +"ALTER TABLE `vtiger_tracker` TYPE=InnoDB", +"ALTER TABLE `vtiger_users2group` TYPE=InnoDB", +"ALTER TABLE `vtiger_users_last_import` TYPE=InnoDB", +"ALTER TABLE `vtiger_users_seq` TYPE=InnoDB", +//"ALTER TABLE `vtiger_wordtemplates` TYPE=InnoDB", + +//Create table queries are moved from here to above this array + +"ALTER TABLE `vtiger_account` MODIFY COLUMN `website` VARCHAR(100) DEFAULT NULL", +//"ALTER TABLE `vtiger_activity` MODIFY COLUMN `date_start` DATE NOT NULL UNIQUE", +"ALTER TABLE `vtiger_activity` MODIFY COLUMN `sendnotification` VARCHAR(3) NOT NULL DEFAULT '0'", +"ALTER TABLE `vtiger_activity` MODIFY COLUMN `duration_hours` VARCHAR(2) DEFAULT NULL", +"ALTER TABLE `vtiger_activity` MODIFY COLUMN `duration_minutes` VARCHAR(2) DEFAULT NULL", +"ALTER TABLE `vtiger_activity_reminder` MODIFY COLUMN `reminder_time` INTEGER(11) NOT NULL", +"ALTER TABLE `vtiger_activity_reminder` MODIFY COLUMN `reminder_sent` INTEGER(2) NOT NULL", +//"ALTER TABLE `vtiger_blocks` MODIFY COLUMN `tabid` INTEGER(19) NOT NULL UNIQUE", +"ALTER TABLE `vtiger_blocks` MODIFY COLUMN `sequence` INTEGER(10) DEFAULT NULL", +"ALTER TABLE `vtiger_blocks` MODIFY COLUMN `show_title` INTEGER(2) DEFAULT NULL", + +//HANDLE HERE - MICKIE - Check the following queries + +"ALTER TABLE `vtiger_contactdetails` MODIFY COLUMN `donotcall` VARCHAR(3) DEFAULT NULL", +"ALTER TABLE `vtiger_contactdetails` MODIFY COLUMN `emailoptout` VARCHAR(3) DEFAULT '0'", +"ALTER TABLE `vtiger_contactdetails` MODIFY COLUMN `imagename` VARCHAR(150) DEFAULT NULL", +"ALTER TABLE `vtiger_contactdetails` MODIFY COLUMN `reference` VARCHAR(3) DEFAULT NULL", +//"ALTER TABLE `vtiger_contactgrouprelation` MODIFY COLUMN `contactid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_convertleadmapping` MODIFY COLUMN `leadfid` INTEGER(19) NOT NULL", +//"ALTER TABLE `vtiger_crmentity` MODIFY COLUMN `crmid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_crmentity` MODIFY COLUMN `description` TEXT", +"ALTER TABLE `vtiger_crmentity` MODIFY COLUMN `createdtime` DATETIME NOT NULL", +"ALTER TABLE `vtiger_crmentity` MODIFY COLUMN `modifiedtime` DATETIME NOT NULL", +"ALTER TABLE `vtiger_customaction` MODIFY COLUMN `cvid` INTEGER(19) NOT NULL UNIQUE", +"ALTER TABLE `vtiger_customaction` MODIFY COLUMN `content` TEXT", +//"ALTER TABLE `vtiger_customerdetails` MODIFY COLUMN `customerid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_customerdetails` MODIFY COLUMN `portal` VARCHAR(3) DEFAULT NULL", +//"ALTER TABLE `vtiger_customview` MODIFY COLUMN `cvid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_customview_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +//"ALTER TABLE `vtiger_cvadvfilter` MODIFY COLUMN `cvid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_cvadvfilter` MODIFY COLUMN `columnindex` INTEGER(11) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_cvcolumnlist` MODIFY COLUMN `cvid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_cvcolumnlist` MODIFY COLUMN `columnindex` INTEGER(11) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_cvstdfilter` MODIFY COLUMN `cvid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_dealintimation` MODIFY COLUMN `dealprobability` DECIMAL(3,2) NOT NULL DEFAULT '0.00'", +//"ALTER TABLE `vtiger_def_org_field` MODIFY COLUMN `fieldid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_def_org_share` MODIFY COLUMN `tabid` INTEGER(11) NOT NULL", +//"ALTER TABLE `vtiger_def_org_share` MODIFY COLUMN `permission` INTEGER(19) DEFAULT NULL UNIQUE", +"ALTER TABLE `vtiger_def_org_share_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +//"ALTER TABLE `vtiger_defaultcv` MODIFY COLUMN `tabid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_defaultcv` MODIFY COLUMN `query` TEXT", +"ALTER TABLE `vtiger_emailtemplates` MODIFY COLUMN `description` TEXT", +"ALTER TABLE `vtiger_emailtemplates` MODIFY COLUMN `body` TEXT", +//"ALTER TABLE `vtiger_emailtemplates_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +"ALTER TABLE `vtiger_faq` MODIFY COLUMN `question` TEXT", +"ALTER TABLE `vtiger_faq` MODIFY COLUMN `answer` TEXT", +"ALTER TABLE `vtiger_faqcomments` MODIFY COLUMN `comments` TEXT", +"ALTER TABLE `vtiger_faqcomments` MODIFY COLUMN `createdtime` DATETIME NOT NULL", +//"ALTER TABLE `vtiger_field` MODIFY COLUMN `tabid` INTEGER(19) NOT NULL UNIQUE", +"ALTER TABLE `vtiger_field` MODIFY COLUMN `readonly` INTEGER(1) NOT NULL", +"ALTER TABLE `vtiger_field` MODIFY COLUMN `selected` INTEGER(1) NOT NULL", +//"ALTER TABLE `vtiger_field` MODIFY COLUMN `block` INTEGER(19) DEFAULT NULL UNIQUE", +//"ALTER TABLE `vtiger_field` MODIFY COLUMN `displaytype` INTEGER(19) DEFAULT NULL UNIQUE", +"ALTER TABLE `vtiger_field` MODIFY COLUMN `quickcreate` INTEGER(10) NOT NULL DEFAULT '1'", +"ALTER TABLE `vtiger_field_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +//"ALTER TABLE `vtiger_group2grouprel` MODIFY COLUMN `groupid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_group2grouprel` MODIFY COLUMN `containsgroupid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_group2role` MODIFY COLUMN `groupid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_group2rs` MODIFY COLUMN `groupid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_groups` MODIFY COLUMN `groupid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_groups` MODIFY COLUMN `description` TEXT", +"ALTER TABLE `vtiger_import_maps` MODIFY COLUMN `is_published` VARCHAR(3) NOT NULL DEFAULT 'no'", +//"ALTER TABLE `vtiger_inventory_tandc` MODIFY COLUMN `id` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_inventory_tandc` MODIFY COLUMN `tandc` TEXT", +"ALTER TABLE `vtiger_inventory_tandc_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +"ALTER TABLE `vtiger_inventorynotification` MODIFY COLUMN `notificationbody` TEXT", +"ALTER TABLE `vtiger_inventorynotification_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +//"ALTER TABLE `vtiger_invoice` MODIFY COLUMN `salesorderid` INTEGER(19) DEFAULT NULL UNIQUE", +"ALTER TABLE `vtiger_invoice` MODIFY COLUMN `terms_conditions` TEXT", +//"ALTER TABLE `vtiger_invoicegrouprelation` MODIFY COLUMN `invoiceid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_lar` MODIFY COLUMN `createdon` DATE NOT NULL", +//"ALTER TABLE `vtiger_leaddetails` MODIFY COLUMN `leadid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_leaddetails` MODIFY COLUMN `comments` TEXT", +//"ALTER TABLE `vtiger_leadgrouprelation` MODIFY COLUMN `leadid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_mail_accounts` MODIFY COLUMN `account_id` INTEGER(11) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_mail_accounts` MODIFY COLUMN `user_id` INTEGER(11) NOT NULL", +"ALTER TABLE `vtiger_mail_accounts` ADD COLUMN `box_refresh` INTEGER(10) DEFAULT NULL", +"ALTER TABLE `vtiger_mail_accounts` ADD COLUMN `mails_per_page` INTEGER(10) DEFAULT NULL", +"ALTER TABLE `vtiger_mail_accounts` ADD COLUMN `ssltype` VARCHAR(50) DEFAULT NULL", +"ALTER TABLE `vtiger_mail_accounts` ADD COLUMN `sslmeth` VARCHAR(50) DEFAULT NULL", +"ALTER TABLE `vtiger_mail_accounts` ADD COLUMN `showbody` VARCHAR(10) DEFAULT NULL", +"ALTER TABLE `vtiger_notes` MODIFY COLUMN `contact_id` INTEGER(19) DEFAULT '0'", +"ALTER TABLE `vtiger_notes` MODIFY COLUMN `notecontent` TEXT", +"ALTER TABLE `vtiger_notificationscheduler` MODIFY COLUMN `notificationbody` TEXT", +"ALTER TABLE `vtiger_notificationscheduler_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +"ALTER TABLE `vtiger_opportunitystage` MODIFY COLUMN `probability` DECIMAL(3,2) DEFAULT '0.00'", +//"ALTER TABLE `vtiger_org_share_action2tab` MODIFY COLUMN `share_action_id` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_org_share_action2tab` MODIFY COLUMN `tabid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_org_share_action_mapping` MODIFY COLUMN `share_action_id` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_organizationdetails` MODIFY COLUMN `website` VARCHAR(100) DEFAULT NULL", +"ALTER TABLE `vtiger_organizationdetails` MODIFY COLUMN `logo` TEXT", +"ALTER TABLE `vtiger_ownernotify` MODIFY COLUMN `crmid` INTEGER(19) DEFAULT NULL UNIQUE", +//"ALTER TABLE `vtiger_parenttab` MODIFY COLUMN `parenttabid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_parenttab` MODIFY COLUMN `sequence` INTEGER(10) NOT NULL", +"ALTER TABLE `vtiger_parenttabrel` MODIFY COLUMN `parenttabid` INTEGER(3) NOT NULL", +//"ALTER TABLE `vtiger_parenttabrel` MODIFY COLUMN `tabid` INTEGER(3) NOT NULL UNIQUE", +"ALTER TABLE `vtiger_parenttabrel` MODIFY COLUMN `sequence` INTEGER(3) NOT NULL", +//"ALTER TABLE `vtiger_pogrouprelation` MODIFY COLUMN `purchaseorderid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_portal` MODIFY COLUMN `portalid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_portal` MODIFY COLUMN `portalname` VARCHAR(200) NOT NULL UNIQUE", +"ALTER TABLE `vtiger_portal` MODIFY COLUMN `sequence` INTEGER(3) NOT NULL", +//"ALTER TABLE `vtiger_portalinfo` MODIFY COLUMN `id` INTEGER(11) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_portalinfo` MODIFY COLUMN `last_login_time` DATETIME NOT NULL", +"ALTER TABLE `vtiger_portalinfo` MODIFY COLUMN `login_time` DATETIME NOT NULL", +"ALTER TABLE `vtiger_portalinfo` MODIFY COLUMN `logout_time` DATETIME NOT NULL", +//"ALTER TABLE `vtiger_potcompetitorrel` MODIFY COLUMN `potentialid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_potcompetitorrel` MODIFY COLUMN `competitorid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_potential` MODIFY COLUMN `amount` DECIMAL(10,2) DEFAULT '0.00'", +"ALTER TABLE `vtiger_potential` MODIFY COLUMN `description` TEXT", +//"ALTER TABLE `vtiger_potentialgrouprelation` MODIFY COLUMN `potentialid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_potstagehistory` MODIFY COLUMN `potentialid` INTEGER(19) NOT NULL", +"ALTER TABLE `vtiger_potstagehistory` MODIFY COLUMN `probability` DECIMAL(7,3) DEFAULT NULL", +"ALTER TABLE `vtiger_potstagehistory` MODIFY COLUMN `lastmodified` DATETIME default NULL", +"ALTER TABLE `vtiger_pricebook` MODIFY COLUMN `description` TEXT", +//"ALTER TABLE `vtiger_pricebookproductrel` MODIFY COLUMN `pricebookid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_pricebookproductrel` MODIFY COLUMN `productid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_productcollaterals` MODIFY COLUMN `productid` INTEGER(11) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_productcollaterals` MODIFY COLUMN `description` TEXT", +//"ALTER TABLE `vtiger_products` MODIFY COLUMN `productid` INTEGER(11) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_products` MODIFY COLUMN `product_description` TEXT", +"ALTER TABLE `vtiger_products` MODIFY COLUMN `commissionrate` DECIMAL(3,3) DEFAULT NULL", +//"ALTER TABLE `vtiger_profile2field` MODIFY COLUMN `profileid` INTEGER(11) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_profile2field` MODIFY COLUMN `fieldid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_profile2globalpermissions` MODIFY COLUMN `profileid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_profile2globalpermissions` MODIFY COLUMN `globalactionid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_profile2standardpermissions` MODIFY COLUMN `profileid` INTEGER(11) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_profile2standardpermissions` MODIFY COLUMN `tabid` INTEGER(10) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_profile2standardpermissions` MODIFY COLUMN `Operation` INTEGER(10) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_profile2utility` MODIFY COLUMN `profileid` INTEGER(11) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_profile2utility` MODIFY COLUMN `tabid` INTEGER(11) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_profile2utility` MODIFY COLUMN `activityid` INTEGER(11) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_profile_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +//"ALTER TABLE `vtiger_purchaseorder` MODIFY COLUMN `quoteid` INTEGER(19) DEFAULT NULL UNIQUE", +//"ALTER TABLE `vtiger_purchaseorder` MODIFY COLUMN `vendorid` INTEGER(19) DEFAULT NULL UNIQUE", +//"ALTER TABLE `vtiger_purchaseorder` MODIFY COLUMN `contactid` INTEGER(19) DEFAULT NULL UNIQUE", +"ALTER TABLE `vtiger_purchaseorder` MODIFY COLUMN `terms_conditions` TEXT", +//"ALTER TABLE `vtiger_quotegrouprelation` MODIFY COLUMN `quoteid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_quotes` MODIFY COLUMN `potentialid` INTEGER(19) DEFAULT NULL UNIQUE", +"ALTER TABLE `vtiger_quotes` MODIFY COLUMN `quotestage` VARCHAR(200) DEFAULT NULL", +//"ALTER TABLE `vtiger_quotes` MODIFY COLUMN `contactid` INTEGER(19) DEFAULT NULL UNIQUE", +"ALTER TABLE `vtiger_quotes` MODIFY COLUMN `terms_conditions` TEXT", +"ALTER TABLE `vtiger_recurringevents` MODIFY COLUMN `activityid` INTEGER(19) NOT NULL", +//"ALTER TABLE `vtiger_relatedlists` MODIFY COLUMN `relation_id` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_relatedlists_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +//"ALTER TABLE `vtiger_relcriteria` MODIFY COLUMN `queryid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_relcriteria` MODIFY COLUMN `columnindex` INTEGER(11) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_report` MODIFY COLUMN `reportid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_report` MODIFY COLUMN `folderid` INTEGER(19) NOT NULL UNIQUE", +//"ALTER TABLE `vtiger_reportdatefilter` MODIFY COLUMN `datefilterid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_role2profile` MODIFY COLUMN `profileid` INTEGER(11) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_role_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +//"ALTER TABLE `vtiger_rss` MODIFY COLUMN `rssid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_salesorder` MODIFY COLUMN `contactid` INTEGER(19) DEFAULT NULL UNIQUE", +"ALTER TABLE `vtiger_salesorder` MODIFY COLUMN `vendorid` INTEGER(19) DEFAULT NULL UNIQUE", +"ALTER TABLE `vtiger_salesorder` MODIFY COLUMN `terms_conditions` TEXT", +//"ALTER TABLE `vtiger_seactivityrel` MODIFY COLUMN `crmid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_seactivityrel` MODIFY COLUMN `activityid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_selectcolumn` MODIFY COLUMN `queryid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_selectquery` MODIFY COLUMN `queryid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_selectquery_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +//"ALTER TABLE `vtiger_sharedcalendar` MODIFY COLUMN `userid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_sharedcalendar` MODIFY COLUMN `sharedid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_sogrouprelation` MODIFY COLUMN `salesorderid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_systems` MODIFY COLUMN `id` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_systems` MODIFY COLUMN `server` VARCHAR(30) DEFAULT NULL", +"ALTER TABLE `vtiger_systems` MODIFY COLUMN `server_username` VARCHAR(30) DEFAULT NULL", +"ALTER TABLE `vtiger_systems` MODIFY COLUMN `server_password` VARCHAR(30) DEFAULT NULL", +"ALTER TABLE `vtiger_ticketcomments` MODIFY COLUMN `comments` TEXT", +"ALTER TABLE `vtiger_ticketcomments` MODIFY COLUMN `createdtime` DATETIME NOT NULL", +//"ALTER TABLE `vtiger_ticketgrouprelation` MODIFY COLUMN `ticketid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_troubletickets` MODIFY COLUMN `ticketid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_troubletickets` MODIFY COLUMN `description` TEXT", +"ALTER TABLE `vtiger_troubletickets` MODIFY COLUMN `solution` TEXT", +"ALTER TABLE `vtiger_troubletickets` MODIFY COLUMN `update_log` TEXT", +//"ALTER TABLE `vtiger_user2role` MODIFY COLUMN `userid` INTEGER(11) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_user2role` MODIFY COLUMN `roleid` VARCHAR(255) NOT NULL UNIQUE", +"ALTER TABLE `vtiger_users` MODIFY COLUMN `is_admin` VARCHAR(3) DEFAULT '0'", +"ALTER TABLE `vtiger_users` MODIFY COLUMN `description` TEXT", +"ALTER TABLE `vtiger_users` MODIFY COLUMN `user_preferences` TEXT", +"ALTER TABLE `vtiger_users` MODIFY COLUMN `homeorder` VARCHAR(255) DEFAULT 'ALVT,PLVT,QLTQ,CVLVT,HLT,OLV,GRT,OLTSO,ILTI,MNL'", +"ALTER TABLE `vtiger_users` ADD COLUMN `currency_id` INTEGER(19) NOT NULL DEFAULT '1'", +"ALTER TABLE `vtiger_users` ADD COLUMN `defhomeview` VARCHAR(100) DEFAULT 'home_metrics'", +//"ALTER TABLE `vtiger_users2group` MODIFY COLUMN `groupid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_users2group` MODIFY COLUMN `userid` INTEGER(19) NOT NULL PRIMARY KEY", +"ALTER TABLE `vtiger_users_seq` MODIFY COLUMN `id` INTEGER(11) NOT NULL", +"ALTER TABLE `vtiger_vendor` MODIFY COLUMN `street` TEXT", +"ALTER TABLE `vtiger_vendor` MODIFY COLUMN `description` TEXT", +//"ALTER TABLE `vtiger_wordtemplates` MODIFY COLUMN `templateid` INTEGER(19) NOT NULL PRIMARY KEY", +//"ALTER TABLE `vtiger_wordtemplates` MODIFY COLUMN `description` TEXT", +"ALTER TABLE `vtiger_activity` ADD KEY `status1` (`status`, `eventstatus`)", +"ALTER TABLE `vtiger_attachments` ADD KEY `attachmentsid1` (`attachmentsid`)", +"ALTER TABLE `vtiger_blocks` ADD KEY `block_tabid` (`tabid`)", +"ALTER TABLE `vtiger_carrier` DROP INDEX `carrier_UK0`", +"ALTER TABLE `vtiger_carrier` ADD UNIQUE KEY `carrier_carrier_idx` (`carrier`)", +"ALTER TABLE `vtiger_contactgrouprelation` ADD KEY `contactgrouprelation_IDX1` (`groupname`)", +"ALTER TABLE `vtiger_def_org_field` ADD KEY `tabid4` (`tabid`)", +"ALTER TABLE `vtiger_def_org_share` ADD KEY `fk_def_org_share23` (`permission`)", +"ALTER TABLE `vtiger_field` ADD KEY `tabid2` (`tabid`)", +"ALTER TABLE `vtiger_field` ADD KEY `blockid` (`block`)", +"ALTER TABLE `vtiger_field` ADD KEY `displaytypeid` (`displaytype`)", +"ALTER TABLE `vtiger_group2grouprel` ADD KEY `fk_group2grouprel2` (`containsgroupid`)", +"ALTER TABLE `vtiger_group2role` ADD KEY `fk_group2role2` (`roleid`)", +"ALTER TABLE `vtiger_group2rs` ADD KEY `fk_group2rs2` (`roleandsubid`)", +"ALTER TABLE `vtiger_groups` ADD KEY `idx_groups_123group` (`groupname`)", +"ALTER TABLE `vtiger_invoice` ADD KEY `SoPo_IDX` (`invoiceid`)", +"ALTER TABLE `vtiger_invoice` ADD KEY `fk_Invoice2` (`salesorderid`)", +"ALTER TABLE `vtiger_invoicegrouprelation` ADD KEY `invoicegrouprelation_IDX1` (`groupname`, `invoiceid`)", +"ALTER TABLE `vtiger_leadgrouprelation` ADD KEY `leadgrouprelation_IDX0` (`leadid`)", +"ALTER TABLE `vtiger_moduleowners` ADD KEY `moduleowners_UK11` (`tabid`, `user_id`)", +//"ALTER TABLE `vtiger_org_share_action2tab` ADD KEY `fk_org_share_action2tab12345` (`tabid`)", +"ALTER TABLE `vtiger_ownernotify` ADD KEY `ownernotify_UK1` (`crmid`, `flag`)", +"ALTER TABLE `vtiger_parenttab` ADD KEY `parenttab_UK1` (`parenttabid`, `parenttab_label`, `visible`)", +"ALTER TABLE `vtiger_parenttabrel` ADD KEY `parenttabrelUK01` (`tabid`, `parenttabid`)", +"ALTER TABLE `vtiger_pogrouprelation` ADD KEY `pogrouprelation_IDX1` (`groupname`, `purchaseorderid`)", +"ALTER TABLE `vtiger_portal` ADD KEY `portal_UK01` (`portalname`)", +"ALTER TABLE `vtiger_potential` ADD KEY `potentialid1` (`potentialid`)", +"ALTER TABLE `vtiger_potentialgrouprelation` ADD KEY `potentialgrouprelation_IDX1` (`groupname`)", +"ALTER TABLE `vtiger_potstagehistory` DROP INDEX PotStageHistory_IDX1", +"ALTER TABLE `vtiger_potstagehistory` ADD INDEX `PotStageHistory_IDX1` (`historyid`)", +"ALTER TABLE `vtiger_potstagehistory` ADD KEY `fk_PotStageHistory` (`potentialid`)", +"ALTER TABLE `vtiger_profile2field` ADD KEY `tabid3` (`tabid`, `profileid`)", +//"ALTER TABLE `vtiger_profile2globalpermissions` ADD KEY `idx_profile2globalpermissions` (`profileid`, `globalactionid`)", +"ALTER TABLE `vtiger_profile2standardpermissions` ADD KEY `idx_prof2stad` (`profileid`, `tabid`, `Operation`)", +"ALTER TABLE `vtiger_profile2utility` ADD KEY `idx_prof2utility` (`profileid`, `tabid`, `activityid`)", +"ALTER TABLE `vtiger_purchaseorder` ADD KEY `PO_Vend_IDX` (`vendorid`)", +"ALTER TABLE `vtiger_purchaseorder` ADD KEY `PO_Quote_IDX` (`quoteid`)", +"ALTER TABLE `vtiger_purchaseorder` ADD KEY `PO_Contact_IDX` (`contactid`)", +"ALTER TABLE `vtiger_quotegrouprelation` ADD KEY `quotegrouprelation_IDX1` (`groupname`)", +//"ALTER TABLE `vtiger_quotes` DROP INDEX vtiger_quotestage", +"ALTER TABLE `vtiger_quotes` ADD INDEX `quotestage` (`quoteid`)", +"ALTER TABLE `vtiger_quotes` ADD KEY `potentialid2` (`potentialid`)", +"ALTER TABLE `vtiger_quotes` ADD KEY `contactid` (`contactid`)", +"ALTER TABLE `vtiger_recurringtype` ADD UNIQUE KEY `RecurringEvent_UK0` (`recurringtype`)", +"ALTER TABLE `vtiger_role2profile` ADD KEY `idx_role2profileid1` (`roleid`, `profileid`)", +"ALTER TABLE `vtiger_salesorder` ADD KEY `SoVend_IDX` (`vendorid`)", +"ALTER TABLE `vtiger_salesorder` ADD KEY `SoContact_IDX` (`contactid`)", +"ALTER TABLE `vtiger_seattachmentsrel` ADD KEY `attachmentsid2` (`attachmentsid`, `crmid`)", +"ALTER TABLE `vtiger_selectquery` ADD KEY `selectquery_IDX0` (`queryid`)", +"ALTER TABLE `vtiger_sogrouprelation` ADD KEY `sogrouprelation_IDX1` (`groupname`)", +"ALTER TABLE `vtiger_tab` ADD KEY `tabid1` (`tabid`)", +"ALTER TABLE `vtiger_taxclass` ADD UNIQUE KEY `taxclass_carrier_idx` (`taxclass`)", +"ALTER TABLE `vtiger_troubletickets` ADD KEY `status2` (`status`)", +"ALTER TABLE `vtiger_users2group` ADD KEY `idx_users2group` (`groupid`, `userid`)", +"ALTER TABLE `vtiger_users2group` ADD KEY `fk_users2group2` (`userid`)", +"ALTER TABLE `vtiger_customaction` ADD CONSTRAINT `customaction_FK1` FOREIGN KEY (`cvid`) REFERENCES `vtiger_customview` (`cvid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_profile2globalpermissions` ADD CONSTRAINT `fk_profile2globalpermissions57` FOREIGN KEY (`profileid`) REFERENCES `vtiger_profile` (`profileid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_invoice` ADD CONSTRAINT `fk_Invoice2` FOREIGN KEY (`salesorderid`) REFERENCES `vtiger_salesorder` (`salesorderid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_purchaseorder` ADD CONSTRAINT `fk_PO3` FOREIGN KEY (`contactid`) REFERENCES `vtiger_contactdetails` (`contactid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_purchaseorder` ADD CONSTRAINT `fk_PO2` FOREIGN KEY (`vendorid`) REFERENCES `vtiger_vendor` (`vendorid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_purchaseorder` ADD CONSTRAINT `fk_PO2345` FOREIGN KEY (`quoteid`) REFERENCES `vtiger_quotes` (`quoteid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_quotes` ADD CONSTRAINT `fk_Quotes3` FOREIGN KEY (`contactid`) REFERENCES `vtiger_contactdetails` (`contactid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_quotes` ADD CONSTRAINT `fk_Quotes2` FOREIGN KEY (`potentialid`) REFERENCES `vtiger_potential` (`potentialid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_salesorder` ADD CONSTRAINT `fk_SO4` FOREIGN KEY (`contactid`) REFERENCES `vtiger_contactdetails` (`contactid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_salesorder` ADD CONSTRAINT `fk_SO2` FOREIGN KEY (`vendorid`) REFERENCES `vtiger_vendor` (`vendorid`) ON DELETE CASCADE", +"ALTER TABLE `vtiger_vendorcontactrel` ADD CONSTRAINT `fk_VendorContactRel45` FOREIGN KEY (`vendorid`) REFERENCES `vtiger_vendor` (`vendorid`) ON DELETE CASCADE" + ); +foreach($query_array as $query) +{ + //Execute($query); + //These above array queries will not make any problems if failed to execute. whereas the user get confused if it fails. so we are not goiong to display these queries if it is executed successfully or not + $conn->query($query); +} + +//First check whether this table is exist and the proceed +$currency_columns = $conn->getColumnNames("vtiger_currency_info"); +if(!is_array($currency_columns)) +{ + $currency_query = "CREATE TABLE `vtiger_currency_info` ( + `id` int(11) NOT NULL auto_increment, + `currency_name` varchar(100) default NULL, + `currency_code` varchar(100) default NULL, + `currency_symbol` varchar(30) default NULL, + `conversion_rate` decimal(10,3) default NULL, + `currency_status` varchar(25) default NULL, + `defaultid` varchar(10) NOT NULL default '0', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB"; + Execute($currency_query); +} +elseif(!in_array("id",$currency_columns)) +{ + $currency_query_array = Array( + "alter table vtiger_currency_info drop primary key", + "alter table vtiger_currency_info add column id int(11) NOT NULL auto_increment primary key FIRST", + "alter table vtiger_currency_info add column conversion_rate decimal(10,3) default NULL", + "alter table vtiger_currency_info add column currency_status varchar(25) default NULL", + "alter table vtiger_currency_info add column defaultid varchar(10) NOT NULL default '0'", + ); + foreach($currency_query_array as $query) + { + Execute($query); + } +} + +$migrationlog->debug("Database Modifications for 5.0(Alpha) Dev 3 ==> 5.0 Alpha (5) ends here."); + + +/************************* The following changes have been made after 5.0 Alpha 5 *************************/ +$migrationlog->debug("Database Modifications after 5.0(Alpha 5) starts here."); + + +//Added on 22-04-06 - to add the Notify Owner vtiger_field in Contacts and Accounts +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (4, $newfieldid, 'notify_owner','contactdetails',1,56,'notify_owner','Notify Owner',1,0,0,10,24,4,1,'C~O',1,NULL,'ADV')"; +Execute($insert_query); +populateFieldForSecurity('4',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (6, $newfieldid, 'notify_owner','account',1,56,'notify_owner','Notify Owner',1,0,0,10,18,9,1,'C~O',1,NULL,'ADV')"; +Execute($insert_query); +populateFieldForSecurity('6',$newfieldid); + +$notify_owner_array = Array( + "update vtiger_field set sequence=26 where tabid=4 and fieldname='modifiedtime'", + "update vtiger_field set sequence=25 where tabid=4 and fieldname='createdtime'", + + //"insert into vtiger_field values(4,".$conn->getUniqueID("vtiger_field").",'notify_owner','contactdetails',1,56,'notify_owner','Notify Owner',1,0,0,10,24,4,1,'C~O',1,NULL,'ADV')", + "alter table vtiger_contactdetails add column notify_owner varchar(3) default 0 after reference", + + "update vtiger_field set sequence=21 where tabid=6 and fieldname='modifiedtime'", + "update vtiger_field set sequence=20 where tabid=6 and fieldname='createdtime'", + "update vtiger_field set sequence=19 where tabid=6 and fieldname='assigned_user_id'", + + //"insert into vtiger_field values(6,".$conn->getUniqueID("vtiger_field").",'notify_owner','account',1,56,'notify_owner','Notify Owner',1,0,0,10,18,9,1,'C~O',1,NULL,'ADV')", + "alter table vtiger_account add column notify_owner varchar(3) default 0 after emailoptout" + ); +foreach($notify_owner_array as $query) +{ + Execute($query); +} + +//Added for RSS entries +$newfieldid = $conn->getUniqueID("vtiger_field"); +$rss_insert_query = "insert into vtiger_field values (24, $newfieldid, 'rsscategory','rss',1,'15','rsscategory','rsscategory',1,0,0,255,13,null,1,'V~O',1,null,'BAS')"; +Execute($rss_insert_query); +populateFieldForSecurity('24',$newfieldid); + +//Quick Create Feature added for Vendor & PriceBook +$quickcreate_query = Array( + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 18 and fieldname = 'vendorname'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 18 and fieldname = 'phone'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 3 WHERE tabid = 18 and fieldname = 'email'", + + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 1 WHERE tabid = 19 and fieldname = 'bookname'", + "UPDATE vtiger_field SET quickcreate = 0,quickcreatesequence = 2 WHERE tabid = 19 and fieldname = 'active'" + ); +foreach($quickcreate_query as $query) +{ + Execute($query); +} + + +//Added on 24-04-06 to populate vtiger_customview All for Campaign and webmails modules +$cvid1 = $conn->getUniqueID("vtiger_customview"); +$cvid2 = $conn->getUniqueID("vtiger_customview"); +$customview_query_array = Array( + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$cvid1.",'All',1,0,'Campaigns')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid1.",0,'vtiger_campaign:campaignname:campaignname:Campaigns_Campaign_Name:V')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid1.",1,'vtiger_campaign:campaigntype:campaigntype:Campaigns_Campaign_Type:N')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid1.",2,'vtiger_campaign:campaignstatus:campaignstatus:Campaigns_Campaign_Status:N')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid1.",3,'vtiger_campaign:expectedrevenue:expectedrevenue:Campaigns_Expected_Revenue:V')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid1.",4,'vtiger_campaign:closingdate:closingdate:Campaigns_Expected_Close_Date:D')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid1.",5,'vtiger_crmentity:smownerid:assigned_user_id:Campaigns_Assigned_To:V')", + + + "insert into vtiger_customview(cvid,viewname,setdefault,setmetrics,entitytype) values(".$cvid2.",'All',1,0,'Webmails')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid2.",0,'subject:subject:subject:Subject:V')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid2.",1,'from:fromname:fromname:From:N')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid2.",2,'to:tpname:toname:To:N')", + "insert into vtiger_cvcolumnlist (cvid,columnindex,columnname) values (".$cvid2.",3,'body:body:body:Body:V')" + + ); +foreach($customview_query_array as $query) +{ + Execute($query); +} + + +$query_array2 = Array( + //"INSERT INTO vtiger_parenttabrel VALUES(2,4,2)", + //"INSERT INTO vtiger_parenttabrel VALUES(2,6,3)", + "update vtiger_cvcolumnlist set columnname ='vtiger_crmentity:smownerid:assigned_user_id:Emails_Sender:V' where columnname='vtiger_crmentity:smownerid:assigned_user_id:Emails_Assigned_To:V'", + "update vtiger_field set sequence = 2 where columnname='filename' and tablename = 'vtiger_attachments'", + "delete from vtiger_cvcolumnlist where columnname = 'vtiger_seactivityrel:crmid:parent_id:Emails_Related_To:I'", + //"update vtiger_cvcolumnlist set columnindex = 1 where cvid=20 and columnindex=3", + "update vtiger_field set info_type='ADV' where tabid=18 and columnname in ('street','pobox','city','state','postalcode','country','description')", + "update vtiger_field set info_type='ADV' where tabid in (20,21,22,23) and columnname in ('description','terms_conditions')", + + "create table vtiger_inventorytaxinfo (taxid int(3) NOT NULL, taxname varchar(50) default NULL, taxlabel varchar(50) default NULL, percentage decimal(7,3) default NULL, deleted int(1) default 0, PRIMARY KEY (taxid), KEY vtiger_inventorytaxinfo_taxname_idx (taxname))", + "create table vtiger_producttaxrel ( productid int(11) NOT NULL, taxid int(3) NOT NULL, taxpercentage decimal(7,3) default NULL, KEY vtiger_producttaxrel_productid_idx (productid), KEY vtiger_producttaxrel_taxid_idx (taxid))", + "alter table vtiger_producttaxrel ADD CONSTRAINT fk_1_vtiger_producttaxrel FOREIGN KEY (productid) REFERENCES vtiger_products(productid) ON DELETE CASCADE", + + "update vtiger_field set uitype=83, tablename='vtiger_producttaxrel' where tabid=14 and fieldname='taxclass'", + "insert into vtiger_moduleowners values(".$this->localGetTabID('Campaigns').",1)", + + "alter table vtiger_attachments add column path varchar(255) default NULL" + ); + +foreach($query_array2 as $query) +{ + Execute($query); +} + +//This code will retrieve all the attachments from db and write it in a file +$attach_query_result = $conn->query("select vtiger_crmentity.createdtime, vtiger_attachments.* from vtiger_attachments inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_attachments.attachmentsid"); +$noof_attachments = $conn->num_rows($attach_query_result); +for($attach_count = 0;$attach_count < $noof_attachments ;$attach_count++) +{ + $attach_id = $conn->query_result($attach_query_result,$attach_count,'attachmentsid'); + $attach_name = $conn->query_result($attach_query_result,$attach_count,'name'); + $attach_data = $conn->query_result($attach_query_result,$attach_count,'attachmentcontents'); + + $created_time = $conn->query_result($attach_query_result,$attach_count,'createdtime'); + //$filepath = decideFilePath(); + + //Added to set the file path where to store the file based on the created time + $date = explode(" ",$created_time); + $date_details = explode("-",$date[0]); + + $year = $date_details[0]; + $month = $date_details[1]; + $day = $date_details[2]; + + //this is used to convert the month from number to string ie., 03 - March, 04 - April, etc., + $month = date("F", mktime(0, 0, 0, $month, $day, $year)); + + $week_no = floor(($day-1)/7)+1;//decide the week ie., 1-7 = week1, 8-14=week2, 15-21=week3, etc., + $week = "week".$week_no; + + $filepath = 'storage/'; + + if(!is_dir($filepath.$year)) + mkdir($filepath.$year); + if(!is_dir($filepath.$year."/".$month)) + mkdir($filepath."$year/$month"); + if(!is_dir($filepath.$year."/".$month."/".$week)) + mkdir($filepath."$year/$month/$week"); + + $filepath = $filepath.$year."/".$month."/".$week."/"; + $migrationlog->debug("File Path = $filepath"); + //upto this added to set the file path based on attachment created time + + //In this file name (attachmentid_filename) the file will be stored in the harddisk + $moved_filename = $attach_id."_".$attach_name; + //write the contents in the file + $handle = @fopen($filepath.$moved_filename,'w'); + fputs($handle, base64_decode($attach_data)); + fclose($handle); + + //update the path in the db + $update_attach = Execute("update vtiger_attachments set path='".$filepath."' where attachmentsid=$attach_id"); +} + +//Before drop these fields we had read the contents of the file from db and wrote it in a file. +$alter_query_array = Array( + "alter table vtiger_attachments drop column attachmentsize", + "alter table vtiger_attachments drop column attachmentcontents" + ); +foreach($alter_query_array as $query) +{ + Execute($query); +} + + +//To populate the comboStrings for Campaigns module which are added newly +require_once('include/ComboStrings.php'); +global $combo_strings; + +$comboTables = Array('campaigntype','campaignstatus','expectedresponse'); +foreach ($comboTables as $tablename) +{ + $values = $combo_strings[$tablename."_dom"]; + $i=0; + foreach ($values as $val => $cal) + { + if($val != '') + { + $conn->query("insert into vtiger_".$tablename. " values(null,'".$val."',".$i.",1)"); + } + else + { + $conn->query("insert into vtiger_".$tablename. " values(null,'--None--',".$i.",1)"); + } + $i++; + } + +} + +$update_query3 = "update vtiger_currency_info set conversion_rate=1, currency_status='Active', defaultid='-11' where id=1"; +Execute($update_query3); + +$update_query4 = "update vtiger_relatedlists set label='Purchase Order' where tabid=18 and name='get_purchase_orders'"; +Execute($update_query4); + + + +//Added on 27-05-06 + +$create_query27 = "CREATE TABLE vtiger_invitees (activityid int(19) NOT NULL, inviteeid int(19) NOT NULL, PRIMARY KEY (activityid,inviteeid))"; +Execute($create_query27); + +$alter_query_array17 = Array( + "ALTER TABLE vtiger_users ADD column hour_format varchar(30) default 'am/pm' AFTER date_format", + "ALTER TABLE vtiger_users ADD column start_hour varchar(30) default '10:00' AFTER hour_format", + "ALTER TABLE vtiger_users ADD column end_hour varchar(30) default '23:00' AFTER start_hour" + ); +foreach($alter_query_array17 as $query) +{ + Execute($query); +} + +$create_query28 = "CREATE TABLE vtiger_emaildetails ( + emailid int(19) NOT NULL, + from_email varchar(50) NOT NULL default '', + to_email text, + cc_email text, + bcc_email text, + assigned_user_email varchar(50) NOT NULL default '', + idlists varchar(50) NOT NULL default '', + email_flag varchar(50) NOT NULL default '', + PRIMARY KEY (`emailid`) + )"; +Execute($create_query28); + + +$obj_array = Array('Leads'=>'vtiger_leaddetails','Contacts'=>'vtiger_contactdetails'); +$leadfieldid = $conn->query_result($conn->query("select fieldid from vtiger_field where tabid=7 and fieldname='email'"),0,'fieldid'); +$contactfieldid = $conn->query_result($conn->query("select fieldid from vtiger_field where tabid=4 and fieldname='email'"),0,'fieldid'); +$fieldid_array = Array("Leads"=>"$leadfieldid","Contacts"=>"$contactfieldid"); +$idname_array = Array("Leads"=>"leadid","Contacts"=>"contactid"); + +$query = 'select * from vtiger_seactivityrel where activityid in (select activityid from vtiger_activity where activitytype="Emails") group by activityid'; +$result = $conn->query($query); +$numofrows = $conn->num_rows($result); + +for($i=0;$i<$numofrows;$i++) +{ + $toemail = ""; + $idlists = ''; + + $emailid = $conn->query_result($result,$i,'activityid'); + + $result1 = $conn->query("select * from vtiger_seactivityrel where activityid = $emailid"); + while($row = $conn->fetch_array($result1)) + { + $result2 = $conn->query("select setype from vtiger_crmentity where crmid=".$row['crmid']); + $module = $conn->query_result($result2,0,'setype'); + $idlists .= $row['crmid']."@$fieldid_array[$module]|"; + + if($module == 'Leads' || $module == 'Contacts') + { + $result3 = $conn->query("select lastname, firstname, email from $obj_array[$module] where $idname_array[$module] = ".$row['crmid']); + + $toemail .= $conn->query_result($result3,0,'lastname')." ".$conn->query_result($result3,0,'firstname')."<".$conn->query_result($result3,0,'email').">###"; + } + else + { + //the parent is not a Lead or Contact. so we have avoided the insert query + } + } + + //insert this idlists and toemail values in vtiger_emaildetails table + $sql = "insert into vtiger_emaildetails values ($emailid,'',\"$toemail\",'','','',\"$idlists\",'SAVE')"; + Execute($sql); +} + + +$update_query5 = "update vtiger_field set quickcreate=1, quickcreatesequence=NULL where tabid in (10,14)"; +Execute($update_query5); + + + +//Security vtiger_profile and vtiger_tab table handling by DON starts +$sql_sec="select profileid from vtiger_profile"; +$result_sec=$conn->query($sql_sec); +$num_rows=$conn->num_rows($result_sec); +for($i=0;$i<$num_rows;$i++) +{ + $prof_id=$conn->query_result($result_sec,$i,'profileid'); + $sql1_sec="insert into vtiger_profile2utility values(".$prof_id.",13,8,0)"; + Execute($sql1_sec); + + $sql2_sec="insert into vtiger_profile2utility values(".$prof_id.",7,9,0)"; + Execute($sql2_sec); + + $sql3_sec="insert into vtiger_profile2tab values(".$prof_id.",26,0)"; + Execute($sql3_sec); + + $sql4_sec="insert into vtiger_profile2tab values(".$prof_id.",27,0)"; + Execute($sql4_sec); + + $sql7_sec="insert into vtiger_profile2standardpermissions values(".$prof_id.",26,0,0)"; + Execute($sql7_sec); + + $sql8_sec="insert into vtiger_profile2standardpermissions values(".$prof_id.",26,1,0)"; + Execute($sql8_sec); + + $sql9_sec="insert into vtiger_profile2standardpermissions values(".$prof_id.",26,2,0)"; + Execute($sql9_sec); + + $sql10_sec="insert into vtiger_profile2standardpermissions values(".$prof_id.",26,3,0)"; + Execute($sql10_sec); + + $sql11_sec="insert into vtiger_profile2standardpermissions values(".$prof_id.",26,4,0)"; + Execute($sql11_sec); + +} + +//Inserting into vtiger_tab tables +$sec2="INSERT INTO vtiger_tab VALUES (27,'Portal',0,24,'Portal',null,null,1)"; +$sec3="INSERT INTO vtiger_tab VALUES (28,'Webmails',0,25,'Webmails',null,null,1)"; + +//Insert into vtiger_def_org_share tables +$sec4="insert into vtiger_def_org_share values (".$conn->getUniqueID('vtiger_def_org_share').",26,2,0)"; + +Execute($sec2); +Execute($sec3); +Execute($sec4); + +//Inserting into datashare related modules table + +Execute("insert into vtiger_datashare_relatedmodules_seq values(1)"); + +//Lead Related Module +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",7,10)"); + +//Account Related Module +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",6,2)"); +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",6,13)"); +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",6,20)"); +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",6,22)"); +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",6,23)"); +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",6,10)"); + + +//Potential Related Module +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",2,20)"); +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",2,22)"); + +//Quote Related Module +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",20,22)"); + +//SO Related Module +Execute("insert into vtiger_datashare_relatedmodules values (".$conn->getUniqueID('vtiger_datashare_relatedmodules').",22,23)"); + + +//By Don Ends + +//Added the vtiger_tabel vtiger_mail_accounts which has been added by mmbrich +$alter_query18 = "alter table vtiger_mail_accounts add column int_mailer int(1) default '0'"; +Execute($alter_query18); + +$update_query_array5 = Array( + "update vtiger_field set info_type='BAS' where tabid=6 and fieldname in ('tickersymbol','account_id')", + "update vtiger_relatedlists set label = 'Activity History' where tabid in (4,6,7,20,21,22,23) and label = 'History'", + "update vtiger_relatedlists set label = 'Products' where tabid=2 and name='get_products' and label='History'", + "update vtiger_relatedlists set label = 'Activity History' where tabid=2 and name='get_history' and label='History'" + ); +foreach($update_query_array5 as $query) +{ + Execute($query); +} + +$insert_query_array27 = Array( + "insert into vtiger_relatedlists values(".$conn->getUniqueID('vtiger_relatedlists').",13,0,'get_ticket_history',3,'Ticket History',0)", + "insert into vtiger_parenttabrel values (2,10,4)", + "insert into vtiger_parenttabrel values (4,10,7)" + ); +foreach($insert_query_array27 as $query) +{ + Execute($query); +} + + +//User fields added in field table +$user_query_array = Array( + +"alter table vtiger_users add column confirm_password varchar(50)", +"insert into vtiger_tab values (29,'Users',0,26,'Users',null,null,1)", + +"insert into vtiger_blocks values (79,29,'LBL_USERLOGIN_ROLE',1,0,0,0,0,0)", +"insert into vtiger_blocks values (80,29,'LBL_MORE_INFORMATION',2,0,0,0,0,0)", +"insert into vtiger_blocks values (81,29,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0)", + ); +foreach($user_query_array as $query) +{ + Execute($query); +} + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid, 'user_name','vtiger_users',1,'106','user_name','User Name',1,0,0,11,1,79,1,'V~M',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid, 'is_admin','vtiger_users',1,'156','is_admin','Admin',1,0,0,3,2,79,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid, 'user_password','vtiger_users',1,'99','user_password','Password',1,0,0,30,3,79,4,'P~M',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid, 'confirm_password','vtiger_users',1,'99','confirm_password','Confirm Password',1,0,0,30,4,79,4,'P~M',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'first_name','vtiger_users',1,'1','first_name','First Name',1,0,0,30,5,79,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'last_name','vtiger_users',1,'2','last_name','Last Name',1,0,0,30,6,79,1,'V~M',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'roleid','vtiger_user2role',1,'98','roleid','Role',1,0,0,200,7,79,1,'V~M',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'email1','vtiger_users',1,'104','email1','Email',1,0,0,100,9,79,1,'E~M',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'status','vtiger_users',1,'115','status','Status',1,0,0,100,10,79,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'activity_view','vtiger_users',1,'15','activity_view','Default Activity View',1,0,0,100,13,79,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'lead_view','vtiger_users',1,'15','lead_view','Default Lead View',1,0,0,100,12,79,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'currency_id','vtiger_users',1,'116','currency_id','Currency',1,0,0,100,11,79,1,'I~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'title','vtiger_users',1,'1','title','Title',1,0,0,50,1,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'phone_work','vtiger_users',1,'1','phone_work','Office Phone',1,0,0,50,2,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'department','vtiger_users',1,'1','department','Department',1,0,0,50,3,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'phone_mobile','vtiger_users',1,'1','phone_mobile','Mobile',1,0,0,50,4,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'reports_to_id','vtiger_users',1,'101','reports_to_id','Reports To',1,0,0,50,5,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'phone_other','vtiger_users',1,'1','phone_other','Other Phone',1,0,0,50,5,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'email2','vtiger_users',1,'13','email2','Other Email',1,0,0,100,6,80,1,'E~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'phone_fax','vtiger_users',1,'1','phone_fax','Fax',1,0,0,50,7,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'yahoo_id','vtiger_users',1,'13','yahoo_id','Yahoo id',1,0,0,100,7,80,1,'E~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'phone_home','vtiger_users',1,'1','phone_home','Home Phone',1,0,0,50,8,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'imagename','vtiger_users',1,'105','imagename','User Image',1,0,0,250,9,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'date_format','vtiger_users',1,'15','date_format','Date Format',1,0,0,30,10,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'tagcloud','vtiger_users',1,'103','tagcloud','Tag Cloud',1,0,0,250,13,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'signature','vtiger_users',1,'21','signature','Signature',1,0,0,250,11,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'description','vtiger_users',1,'21','description','Notes',1,0,0,250,12,80,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'address_street','vtiger_users',1,'21','address_street','Street Address',1,0,0,250,1,81,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'address_city','vtiger_users',1,'1','address_city','City',1,0,0,100,2,81,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'address_state','vtiger_users',1,'1','address_state','State',1,0,0,100,3,81,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'address_postalcode','vtiger_users',1,'1','address_postalcode','Postal Code',1,0,0,100,4,81,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$insert_query = "insert into vtiger_field values (29, $newfieldid,'address_country','vtiger_users',1,'1','address_country','Country',1,0,0,100,5,81,1,'V~O',1,null,'BAS')"; +Execute($insert_query); +populateFieldForSecurity('29',$newfieldid); + + +$create_query29 = "CREATE TABLE vtiger_status ( + `statusid` int(19) NOT NULL auto_increment, + `status` varchar(200) NOT NULL, + `sortorderid` int(19) NOT NULL default '0', + `presence` int(1) NOT NULL default '1', + PRIMARY KEY (`statusid`) + )"; +Execute($create_query29); + +Execute("insert into vtiger_status values (1,'Active',0,1)"); +Execute("insert into vtiger_status values (2,'Inactive',1,1)"); + +$create_query30 = "CREATE TABLE vtiger_activity_view ( + `activity_viewid` int(19) NOT NULL auto_increment, + `activity_view` varchar(200) NOT NULL, + `sortorderid` int(19) NOT NULL default '0', + `presence` int(1) NOT NULL default '1', + PRIMARY KEY (`activity_viewid`) + )"; +Execute($create_query30); + +Execute("insert into vtiger_activity_view values (1,'Today',0,1)"); +Execute("insert into vtiger_activity_view values (2,'This Week',1,1)"); +Execute("insert into vtiger_activity_view values (3,'This Month',2,1)"); +Execute("insert into vtiger_activity_view values (4,'This Year',3,1)"); + + +$create_query31 = "CREATE TABLE vtiger_lead_view ( + `lead_viewid` int(19) NOT NULL auto_increment, + `lead_view` varchar(200) NOT NULL, + `sortorderid` int(19) NOT NULL default '0', + `presence` int(1) NOT NULL default '1', + PRIMARY KEY (`lead_viewid`) + )"; +Execute($create_query31); + +Execute("insert into vtiger_lead_view values (1,'Today',0,1)"); +Execute("insert into vtiger_lead_view values (2,'Last 2 Days',1,1)"); +Execute("insert into vtiger_lead_view values (3,'Last Week',2,1)"); + + +$create_query32 = "CREATE TABLE vtiger_date_format ( + `date_formatid` int(19) NOT NULL auto_increment, + `date_format` varchar(200) NOT NULL, + `sortorderid` int(19) NOT NULL default '0', + `presence` int(1) NOT NULL default '1', + PRIMARY KEY (`date_formatid`) + )"; +Execute($create_query32); + +Execute("insert into vtiger_date_format values (1,'dd-mm-yyyy',0,1)"); +Execute("insert into vtiger_date_format values (2,'mm-dd-yyyy',1,1)"); +Execute("insert into vtiger_date_format values (3,'yyyy-mm-dd',2,1)"); +//end of User fields added in field table + +//Activities and Leads Added under Marketing +Execute("insert into vtiger_parenttabrel values (2,7,5)"); +Execute("insert into vtiger_parenttabrel values (2,9,6)"); +Execute("insert into vtiger_parenttabrel values (4,9,8)"); + +//Queries to remove the rss categories +Execute("drop table vtiger_rsscategory"); +Execute("delete from vtiger_field where tabid=24"); + +//Added on 23-06-06 +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (29, $newfieldid, 'hour_format','vtiger_users',1,'116','hour_format','Calendar Hour Format',1,0,0,100,13,79,3,'I~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (29, $newfieldid, 'end_hour','vtiger_users',1,'116','end_hour','Day ends at',1,0,0,100,15,79,3,'I~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('29',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (29, $newfieldid, 'start_hour','vtiger_users',1,'116','start_hour','Day starts at',1,0,0,100,14,79,3,'I~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('29',$newfieldid); + +Execute("insert into vtiger_relatedlists values (".$conn->getUniqueID('vtiger_relatedlists').",".getTabid("Campaigns").",".getTabid("Potentials").",'get_opportunities',3,'Potentials',0)"); +Execute("insert into vtiger_relatedlists values(".$conn->getUniqueID('vtiger_relatedlists').",".getTabid("Campaigns").",9,'get_activities',4,'Activities',0)"); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (2, $newfieldid, 'campaignid','vtiger_potential',1,'58','campaignid','Campaign Source',1,0,0,100,12,1,1,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('2',$newfieldid); + +//Added on 28-06-06 +//Campaigns module added in Leads and Contacts RelatedList +Execute("insert into vtiger_relatedlists values(".$conn->getUniqueID('vtiger_relatedlists').",".getTabid("Leads").",".getTabid("Campaigns").",'get_campaigns',6,'Campaigns',0)"); +Execute("insert into vtiger_relatedlists values(".$conn->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("Campaigns").",'get_campaigns',11,'Campaigns',0)"); + +//Contact Name has been removed from Events Information +Execute("delete from vtiger_field where tabid=16 and fieldname='contact_id'"); + +//queries to resequence the fields +$fieldname=array('eventstatus','sendnotification','activitytype','location','createdtime','modifiedtime','taskpriority','notime','visibility'); +$tablename=array('vtiger_activity','vtiger_activity','vtiger_activity','vtiger_activity','vtiger_crmentity','vtiger_crmentity','vtiger_activity','vtiger_activity','vtiger_activity'); + +$sequence = array(10,11,12,13,14,15,16,17,18); +for($j = 0;$j < 9;$j++) +{ + Execute("update vtiger_field set sequence=".$sequence[$j]." where tablename='".$tablename[$j]."' && fieldname='".$fieldname[$j]."' and tabid=16"); +} + +//Campaign has been removed from field table +Execute("delete from vtiger_field where tabid=7 and fieldname='campaignid'"); +Execute("delete from vtiger_field where tabid=4 and fieldname='campaignid'"); + +//Query added to have Calendar under Marketing and Support +$conn->query("insert into vtiger_parenttabrel values (2,17,7)"); +$conn->query("insert into vtiger_parenttabrel values (4,17,9)"); + + + +//Added on 02-08-2006 ie., 2nd August 2006 + +//column added for proxy server settings +Execute("alter table vtiger_systems add column server_port int(19) default NULL after server"); + +//type changed to support decimal places +Execute("alter table vtiger_campaign change expectedrevenue expectedrevenue decimal(11,3)"); +Execute("alter table vtiger_campaign change budgetcost budgetcost decimal(11,3)"); +Execute("alter table vtiger_campaign change actualcost actualcost decimal(11,3)"); +Execute("alter table vtiger_campaign change expectedroi expectedroi decimal(11,3)"); +Execute("alter table vtiger_campaign change actualroi actualroi decimal(11,3)"); + +//homeorder value modified to get graph in homepage +Execute("update vtiger_users set homeorder='ALVT,PLVT,QLTQ,CVLVT,HLT,OLV,GRT,OLTSO,ILTI,MNL,HDB'"); + +//Removed activities from product related list +Execute("delete from vtiger_relatedlists where tabid = 14 and related_tabid=9"); +Execute("insert into vtiger_relatedlists values(".$conn->getUniqueID('vtiger_relatedlists').",".getTabid("HelpDesk").",9,'get_history',4,'Activity History',0)"); + +//Assigned to field for Events made Optional +Execute("update vtiger_field set typeofdata='V~M' where columnname='smownerid' and tabid=16 and fieldname='assigned_user_id'"); + +//Query added to have Notes under Marketing and Support --Jeri -- 04-06-06 +Execute("insert into vtiger_parenttabrel values (2,8,8)"); + + +//Update Query for quickcreate sequence of Campaign & Ticket -- Added by Ahmed -- 11-07-2006 +Execute("update vtiger_field set quickcreatesequence='3' where fieldname='filename' and tabid=13"); +Execute("update vtiger_field set quickcreatesequence='4' where fieldname='ticketpriorities' and tabid=13"); +Execute("update vtiger_field set quickcreatesequence='3' where fieldname='campaigntype' and tabid=26"); +Execute("update vtiger_field set quickcreatesequence='6' where fieldname='campaignstatus' and tabid=26"); +Execute("update vtiger_field set quickcreatesequence='2' where fieldname='closingdate' and tabid=26"); + + +//Added for Tax and Inventory - Product details handling + +Execute("CREATE TABLE vtiger_inventoryproductrel (id int(19) NOT NULL, productid int(19) NOT NULL, sequence_no int(4) NOT NULL default 1, quantity int(19) default NULL, listprice decimal(11,3) default NULL, discount_percent decimal(7,3) default NULL, discount_amount decimal(11,3) default NULL, comment varchar(100) default NULL, KEY inventoryproductrel_id_idx (id), KEY inventoryproductrel_productid_idx (productid) ) ENGINE=InnoDB"); + +//Execute("alter table vtiger_inventorytaxinfo add column deleted int(1) default 0"); + +Execute("CREATE TABLE vtiger_shippingtaxinfo ( taxid int(3) NOT NULL, taxname varchar(50) default NULL, taxlabel varchar(50) default NULL, percentage decimal(7,3) default NULL, deleted int(1) default '0', PRIMARY KEY (taxid), KEY shippingtaxinfo_taxname_idx (taxname) ) ENGINE=InnoDB"); + +Execute("CREATE TABLE vtiger_inventoryshippingrel (id int(19) NOT NULL, KEY inventoryishippingrel_id_idx (id) ) ENGINE=InnoDB"); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (21, $newfieldid, 'taxtype','vtiger_purchaseorder',1,'15','hdnTaxType','Tax Type',1,0,0,100,14,57,3,'V~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('21',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (21, $newfieldid, 'discount_percent','vtiger_purchaseorder',1,'1','hdnDiscountPercent','Discount Percent',1,0,0,100,14,57,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('21',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (21, $newfieldid, 'discount_amount','vtiger_purchaseorder',1,'1','hdnDiscountAmount','Discount Amount',1,0,0,100,14,57,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('21',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (21, $newfieldid, 's_h_amount','vtiger_purchaseorder',1,'1','hdnS_H_Amount','S&H Amount',1,0,0,100,14,57,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('21',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (22, $newfieldid, 'taxtype','vtiger_salesorder',1,'15','hdnTaxType','Tax Type',1,0,0,100,15,63,3,'V~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('22',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (22, $newfieldid, 'discount_percent','vtiger_salesorder',1,'1','hdnDiscountPercent','Discount Percent',1,0,0,100,15,63,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('22',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (22, $newfieldid, 'discount_amount','vtiger_salesorder',1,'1','hdnDiscountAmount','Discount Amount',1,0,0,100,15,63,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('22',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (22, $newfieldid, 's_h_amount','vtiger_salesorder',1,'1','hdnS_H_Amount','S&H Amount',1,0,0,100,15,63,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('22',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (20, $newfieldid, 'taxtype','vtiger_quotes',1,'15','hdnTaxType','Tax Type',1,0,0,100,14,51,3,'V~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('20',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (20, $newfieldid, 'discount_percent','vtiger_quotes',1,'1','hdnDiscountPercent','Discount Percent',1,0,0,100,14,51,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('20',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (20, $newfieldid, 'discount_amount','vtiger_quotes',1,'1','hdnDiscountAmount','Discount Amount',1,0,0,100,14,51,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('20',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (20, $newfieldid, 's_h_amount','vtiger_quotes',1,'1','hdnS_H_Amount','S&H Amount',1,0,0,100,14,51,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('20',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (23, $newfieldid, 'taxtype','vtiger_invoice',1,'15','hdnTaxType','Tax Type',1,0,0,100,13,69,3,'V~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('23',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (23, $newfieldid, 'discount_percent','vtiger_invoice',1,'1','hdnDiscountPercent','Discount Percent',1,0,0,100,13,69,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('23',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (23, $newfieldid, 'discount_amount','vtiger_invoice',1,'1','hdnDiscountAmount','Discount Amount',1,0,0,100,13,69,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('23',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (23, $newfieldid, 's_h_amount','vtiger_invoice',1,'1','hdnS_H_Amount','S&H Amount',1,0,0,100,14,57,3,'N~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('23',$newfieldid); + + +Execute("alter table vtiger_purchaseorder add column taxtype varchar(25) default NULL after subtotal"); +Execute("alter table vtiger_purchaseorder add column discount_percent decimal(11,3) default NULL after taxtype"); +Execute("alter table vtiger_purchaseorder add column discount_amount decimal(11,3) default NULL after discount_percent"); +Execute("alter table vtiger_purchaseorder add column s_h_amount decimal(11,3) default NULL after discount_amount"); + +Execute("alter table vtiger_salesorder add column taxtype varchar(25) default NULL after subtotal"); +Execute("alter table vtiger_salesorder add column discount_percent decimal(11,3) default NULL after taxtype"); +Execute("alter table vtiger_salesorder add column discount_amount decimal(11,3) default NULL after discount_percent"); +Execute("alter table vtiger_salesorder add column s_h_amount decimal(11,3) default NULL after discount_amount"); + +Execute("alter table vtiger_quotes add column taxtype varchar(25) default NULL after total"); +Execute("alter table vtiger_quotes add column discount_percent decimal(11,3) default NULL after taxtype"); +Execute("alter table vtiger_quotes add column discount_amount decimal(11,3) default NULL after discount_percent"); +Execute("alter table vtiger_quotes add column s_h_amount decimal(11,3) default NULL after discount_amount"); + +Execute("alter table vtiger_invoice add column taxtype varchar(25) default NULL after total"); +Execute("alter table vtiger_invoice add column discount_percent decimal(11,3) default NULL after taxtype"); +Execute("alter table vtiger_invoice add column discount_amount decimal(11,3) default NULL after discount_percent"); +Execute("alter table vtiger_invoice add column s_h_amount decimal(11,3) default NULL after discount_amount"); + + +//Update Query to Match Notes List View Header Fieldnames with Custom View combo values +Execute("update vtiger_field set fieldlabel='Title' where fieldlabel='Subject' and tabid=8"); +Execute("update vtiger_field set fieldlabel='File' where fieldlabel='Attachment' and tabid=8"); + + +//Update Query to change the UI type of Rating Field in Accounts Module from 1 to 15 to display combo list +Execute("update vtiger_field set uitype=15 where tabid=6 and fieldname='rating'"); + + +//Insert and Update Query for new block addition for Campaigns Module +Execute("update vtiger_blocks set blocklabel='LBL_EXPECTATIONS_AND_ACTUALS' where tabid=26 and blockid=78"); +Execute("insert into vtiger_blocks values (82,26,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0)"); + + +//Update Query for rearrangements of fields in Campaigns Module's Detail/Edit/Create View +Execute("update vtiger_field set sequence=1 where tabid=26 and columnname='campaignname' and fieldname='campaignname'"); +Execute("update vtiger_field set sequence=2 where tabid=26 and columnname='campaignstatus' and fieldname='campaignstatus'"); +Execute("update vtiger_field set sequence=3 where tabid=26 and columnname='smownerid' and fieldname='assigned_user_id'"); +Execute("update vtiger_field set sequence=4 where tabid=26 and columnname='product_id' and fieldname='product_id'"); +Execute("update vtiger_field set sequence=5 where tabid=26 and columnname='campaigntype' and fieldname='campaigntype'"); +Execute("update vtiger_field set sequence=6 where tabid=26 and columnname='closingdate' and fieldname='closingdate'"); +Execute("update vtiger_field set sequence=7 where tabid=26 and columnname='targetaudience' and fieldname='targetaudience'"); +Execute("update vtiger_field set sequence=8 where tabid=26 and columnname='targetsize' and fieldname='targetsize'"); +Execute("update vtiger_field set sequence=9 where tabid=26 and columnname='sponsor' and fieldname='sponsor'"); +Execute("update vtiger_field set sequence=10 where tabid=26 and columnname='numsent' and fieldname='numsent'"); +Execute("update vtiger_field set sequence=11 where tabid=26 and columnname='createdtime' and fieldname='createdtime'"); +Execute("update vtiger_field set sequence=12 where tabid=26 and columnname='modifiedtime' and fieldname='modifiedtime'"); + +Execute("update vtiger_field set sequence=1, block=78 where tabid=26 and columnname='budgetcost' and fieldname='budgetcost'"); +Execute("update vtiger_field set sequence=2, block=78 where tabid=26 and columnname='actualcost' and fieldname='actualcost'"); +Execute("update vtiger_field set sequence=3, block=78 where tabid=26 and columnname='expectedresponse' and fieldname='expectedresponse'"); +Execute("update vtiger_field set sequence=4, block=78 where tabid=26 and columnname='expectedrevenue' and fieldname='expectedrevenue'"); +Execute("update vtiger_field set sequence=5, block=78 where tabid=26 and columnname='expectedsalescount' and fieldname='expectedsalescount'"); +Execute("update vtiger_field set sequence=6, block=78 where tabid=26 and columnname='actualsalescount' and fieldname='actualsalescount'"); +Execute("update vtiger_field set sequence=7, block=78 where tabid=26 and columnname='expectedresponsecount' and fieldname='expectedresponsecount'"); +Execute("update vtiger_field set sequence=8, block=78 where tabid=26 and columnname='actualresponsecount' and fieldname='actualresponsecount'"); +Execute("update vtiger_field set sequence=9, block=78 where tabid=26 and columnname='expectedroi' and fieldname='expectedroi'"); +Execute("update vtiger_field set sequence=10, block=78 where tabid=26 and columnname='actualroi' and fieldname='actualroi'"); + + + +//Update query to set the fieldname in user detail/edit/create view +Execute("update vtiger_field set sequence=1 where tabid=29 and columnname='user_name' and fieldname='user_name' and block=79"); +Execute("update vtiger_field set sequence=2 where tabid=29 and columnname='is_admin' and fieldname='is_admin' and block=79"); +Execute("update vtiger_field set sequence=3 where tabid=29 and columnname='user_password' and fieldname='user_password' and block=79"); +Execute("update vtiger_field set sequence=4 where tabid=29 and columnname='email1' and fieldname='email1' and block=79"); +Execute("update vtiger_field set sequence=5 where tabid=29 and columnname='confirm_password' and fieldname='confirm_password' and block=79"); +Execute("update vtiger_field set sequence=6 where tabid=29 and columnname='status' and fieldname='status' and block=79"); +Execute("update vtiger_field set sequence=7 where tabid=29 and columnname='first_name' and fieldname='first_name' and block=79"); +Execute("update vtiger_field set sequence=8 where tabid=29 and columnname='currency_id' and fieldname='currency_id' and block=79"); +Execute("update vtiger_field set sequence=9 where tabid=29 and columnname='last_name' and fieldname='last_name' and block=79"); +Execute("update vtiger_field set sequence=10 where tabid=29 and columnname='lead_view' and fieldname='lead_view' and block=79"); +Execute("update vtiger_field set sequence=11 where tabid=29 and columnname='roleid' and fieldname='roleid' and block=79"); +Execute("update vtiger_field set sequence=12 where tabid=29 and columnname='activity_view' and fieldname='activity_view' and block=79"); +Execute("update vtiger_field set sequence=13 where tabid=29 and columnname='hour_format' and fieldname='hour_format' and block=79"); +Execute("update vtiger_field set sequence=14 where tabid=29 and columnname='start_hour' and fieldname='start_hour' and block=79"); +Execute("update vtiger_field set sequence=15 where tabid=29 and columnname='end_hour' and fieldname='end_hour' and block=79"); + +Execute("update vtiger_field set sequence=1 where tabid=29 and columnname='title' and fieldname='title' and block=80"); +Execute("update vtiger_field set sequence=2 where tabid=29 and columnname='phone_fax' and fieldname='phone_fax' and block=80"); +Execute("update vtiger_field set sequence=3 where tabid=29 and columnname='department' and fieldname='department' and block=80"); +Execute("update vtiger_field set sequence=4 where tabid=29 and columnname='email2' and fieldname='email2' and block=80"); +Execute("update vtiger_field set sequence=5 where tabid=29 and columnname='phone_work' and fieldname='phone_work' and block=80"); +Execute("update vtiger_field set sequence=6 where tabid=29 and columnname='yahoo_id' and fieldname='yahoo_id' and block=80"); +Execute("update vtiger_field set sequence=7 where tabid=29 and columnname='phone_mobile' and fieldname='phone_mobile' and block=80"); +Execute("update vtiger_field set sequence=8 where tabid=29 and columnname='reports_to_id' and fieldname='reports_to_id' and block=80"); +Execute("update vtiger_field set sequence=9 where tabid=29 and columnname='phone_home' and fieldname='phone_home' and block=80"); +Execute("update vtiger_field set sequence=10 where tabid=29 and columnname='imagename' and fieldname='imagename' and block=80"); +Execute("update vtiger_field set sequence=11 where tabid=29 and columnname='phone_other' and fieldname='phone_other' and block=80"); +Execute("update vtiger_field set sequence=12 where tabid=29 and columnname='date_format' and fieldname='date_format' and block=80"); +Execute("update vtiger_field set sequence=13 where tabid=29 and columnname='signature' and fieldname='signature' and block=80"); +Execute("update vtiger_field set sequence=14 where tabid=29 and columnname='description' and fieldname='description' and block=80"); +Execute("update vtiger_field set sequence=15 where tabid=29 and columnname='tagcloud' and fieldname='tagcloud' and block=80"); + +Execute("update vtiger_field set sequence=1 where tabid=29 and columnname='address_street' and fieldname='address_street' and block=81"); +Execute("update vtiger_field set sequence=2 where tabid=29 and columnname='address_country' and fieldname='address_country' and block=81"); +Execute("update vtiger_field set sequence=3 where tabid=29 and columnname='address_city' and fieldname='address_city' and block=81"); +Execute("update vtiger_field set sequence=4 where tabid=29 and columnname='address_postalcode' and fieldname='address_postalcode' and block=81"); +Execute("update vtiger_field set sequence=5 where tabid=29 and columnname='address_state' and fieldname='address_state' and block=81"); + +//Added for Recurring events +Execute("alter table vtiger_recurringevents add column recurringfreq int(19) default NULL"); +Execute("alter table vtiger_recurringevents add column recurringinfo varchar(50) default NULL"); + + +//Update Query for changing the uitype for existing picklist entries making it non-editable +Execute("update vtiger_field set uitype=111 where fieldname in ('sales_stage','ticketstatus','taskstatus','eventstatus','faqstatus','quotestage','postatus','sostatus','invoicestatus')"); + + + + + + + + + + +//Inventory Tax handlings -- Starts + +//Added to populate the default Shipping & Hanlding tax informations +$shvatid = $conn->getUniqueID("vtiger_shippingtaxinfo"); +$shsalesid = $conn->getUniqueID("vtiger_shippingtaxinfo"); +$shserviceid = $conn->getUniqueID("vtiger_shippingtaxinfo"); + +$conn->query("insert into vtiger_shippingtaxinfo values($shvatid,'shtax".$shvatid."','VAT','4.50','0')"); +$conn->query("insert into vtiger_shippingtaxinfo values($shsalesid,'shtax".$shsalesid."','Sales','10.00','0')"); +$conn->query("insert into vtiger_shippingtaxinfo values($shserviceid,'shtax".$shserviceid."','Service','12.50','0')"); + +//After added these taxes we should add these taxes as columns in vtiger_inventoryshippingrel table +$conn->query("alter table vtiger_inventoryshippingrel add column shtax$shvatid decimal(7,3) default NULL"); +$conn->query("alter table vtiger_inventoryshippingrel add column shtax$shsalesid decimal(7,3) default NULL"); +$conn->query("alter table vtiger_inventoryshippingrel add column shtax$shserviceid decimal(7,3) default NULL"); + + +//Added to populate the Common tax which will be used to save the existing tax (percentage will be calculated based on the total tax amount retrieved from the entity tables of PO, SO, Quotes and Invoice) +$migratedtaxid = 1; +$migratedtaxid = $conn->getUniqueID("vtiger_inventorytaxinfo"); +$migrated_taxname = "tax$migratedtaxid"; +$conn->query("insert into vtiger_inventorytaxinfo values($migratedtaxid,'".$migrated_taxname."','Tax','0.00','0')"); + +//After added these taxes we should add these taxes as columns in vtiger_inventoryproductrel table +$conn->query("alter table vtiger_inventoryproductrel add column $migrated_taxname decimal(7,3) default NULL"); + +//Now we should create tax for each and every value given in picklist taxclass +$taxres = $conn->query("select * from vtiger_taxclass"); +$taxcount = $conn->num_rows($taxres); +for($i=0;$i<$taxcount;$i++) +{ + $taxlabel = $conn->query_result($taxres,$i,'taxclass'); + + $newtaxid = $conn->getUniqueID("vtiger_inventorytaxinfo"); + $addtaxres = $conn->query("alter table vtiger_inventoryproductrel add column tax$newtaxid decimal(7,3) default NULL"); + if($addtaxres) + $conn->query("insert into vtiger_inventorytaxinfo values($newtaxid,'tax".$newtaxid."','".$taxlabel."','0.00','0')"); +} +//Finished the add tax process based on the available tax classes + +//To save Product - Tax relationship +//get Product - taxclass and add entry in vtiger_producttaxrel for this product - tax relationship +$productres = $conn->query("select productid, taxclass from vtiger_products"); +$productcount = $conn->num_rows($productres); +for($i=0;$i<$productcount;$i++) +{ + $productid = $conn->query_result($productres,$i,'productid'); + $taxlabel = $conn->query_result($productres,$i,'taxclass'); + + $taxres = $conn->query("select taxid from vtiger_inventorytaxinfo where taxlabel='".addslashes($taxlabel)."'"); + $taxid = $conn->query_result($taxres,0,'taxid'); + + $taxquery = "insert into vtiger_producttaxrel values($productid, \"$taxid\", '0.00')"; + //Execute($taxquery); + $conn->query($taxquery); +} + + + + + +//Retrieve values from poproductrel, soproductrel, quotesproductrel, invoiceproductrel and store in vtiger_inventoryproductrel + +$inventory_tables = Array( + 'vtiger_poproductrel'=>'purchaseorderid', + 'vtiger_soproductrel'=>'salesorderid', + 'vtiger_quotesproductrel'=>'quoteid', + 'vtiger_invoiceproductrel'=>'invoiceid' + ); + +foreach($inventory_tables as $tablename => $idname) +{ + $res = $conn->query("select * from $tablename order by $idname"); + $count = $conn->num_rows($res); + + $id = $oldid = 0; + $seqno = 0; + + for($i=0;$i<$count;$i++) + { + $oldid = $id; + $id = $conn->query_result($res,$i,$idname); + + //for every new PO/SO/Quotes/Invoice entity we should set the sequence start value as 1 + if($id != $oldid) + $seqno = 1; + + $productid = $conn->query_result($res,$i,'productid'); + $quantity = $conn->query_result($res,$i,'quantity'); + $listprice = $conn->query_result($res,$i,'listprice'); + + $query1 = "insert into vtiger_inventoryproductrel(id,productid,sequence_no,quantity,listprice) values($id, $productid,$seqno, $quantity, $listprice)"; + Execute($query1); + $seqno++; + } +} + + +//Now for each and every PO, SO, Quotes and Invoice we should get the total, discount, tax +$inventory_tables = Array( + 'vtiger_purchaseorder'=>'purchaseorderid', + 'vtiger_salesorder'=>'salesorderid', + 'vtiger_quotes'=>'quoteid', + 'vtiger_invoice'=>'invoiceid' + ); + +foreach($inventory_tables as $tablename => $idname) +{ + $res2 = $conn->query("select * from $tablename order by $idname"); + $entitycount = $conn->num_rows($res2); + + for($i=0;$i<$entitycount;$i++) + { + $idval = $conn->query_result($res2,$i,$idname); + + //$res3 = $conn->query("select * from $tablename where $idname=$idval"); + $subtotal = $conn->query_result($res2,$i,'subtotal'); + $taxamount = $conn->query_result($res2,$i,'salestax'); + + //Now based on the inventory tax total - calculate the percentage + $taxpercent = '0.00'; + if($taxamount > 0 && $subtotal >0) + { + $taxpercent = $taxamount*100/$subtotal; + } + + //update the taxtype as group + $query2 = "update $tablename set taxtype='group'"; + Execute($query2); + + //update the calculated percentage for the entity ie., PO/SO/Quotes/Invoice + $query3 = "update vtiger_inventoryproductrel set $migrated_taxname='".$taxpercent."' where id=$idval"; + Execute($query3); + } +} + + +//we have retrieve and saved all the values, so we can delete the unwanted tables +Execute("drop table vtiger_poproductrel"); +Execute("drop table vtiger_soproductrel"); +Execute("drop table vtiger_quotesproductrel"); +Execute("drop table vtiger_invoiceproductrel"); + +//Inventory Tax handlings -- Ends + + +//Add Inventory History tracking tables ie.,PO Status, SO Status, Quote Stage and Invoice Status tables +//PO Status +Execute("CREATE TABLE vtiger_postatushistory ( historyid int(19) NOT NULL auto_increment, purchaseorderid int(19) NOT NULL, vendorname varchar(100) default NULL, total decimal(10,0) default NULL, postatus varchar(200) default NULL, lastmodified datetime default NULL, PRIMARY KEY (historyid), KEY postatushistory_purchaseorderid_idx (purchaseorderid), CONSTRAINT fk_1_vtiger_postatushistory FOREIGN KEY (purchaseorderid) REFERENCES vtiger_purchaseorder (purchaseorderid) ON DELETE CASCADE ) ENGINE=InnoDB"); + +//SO Status +Execute("CREATE TABLE vtiger_sostatushistory (historyid int(19) NOT NULL auto_increment, salesorderid int(19) NOT NULL, accountname varchar(100) default NULL, total decimal(10,0) default NULL, sostatus varchar(200) default NULL, lastmodified datetime default NULL, PRIMARY KEY (historyid), KEY sostatushistory_salesorderid_idx (salesorderid), CONSTRAINT fk_1_vtiger_sostatushistory FOREIGN KEY (salesorderid) REFERENCES vtiger_salesorder (salesorderid) ON DELETE CASCADE ) ENGINE=InnoDB"); + +//Quote Stage +Execute("CREATE TABLE vtiger_quotestagehistory ( historyid int(19) NOT NULL auto_increment, quoteid int(19) NOT NULL, accountname varchar(100) default NULL, total decimal(10,0) default NULL, quotestage varchar(200) default NULL, lastmodified datetime default NULL, PRIMARY KEY (historyid), KEY quotestagehistory_quoteid_idx (quoteid), CONSTRAINT fk_1_vtiger_quotestagehistory FOREIGN KEY (quoteid) REFERENCES vtiger_quotes (quoteid) ON DELETE CASCADE) ENGINE=InnoDB"); + +//Invoice Status +Execute("CREATE TABLE vtiger_invoicestatushistory ( historyid int(19) NOT NULL auto_increment, invoiceid int(19) NOT NULL, accountname varchar(100) default NULL, total decimal(10,0) default NULL, invoicestatus varchar(200) default NULL, lastmodified datetime default NULL, PRIMARY KEY (historyid), KEY invoicestatushistory_invoiceid_idx (invoiceid), CONSTRAINT fk_1_vtiger_invoicestatushistory FOREIGN KEY (invoiceid) REFERENCES vtiger_invoice (invoiceid) ON DELETE CASCADE) ENGINE=InnoDB"); + + +//User image handling +Execute("insert into vtiger_blocks values (83,29,'LBL_USER_IMAGE_INFORMATION',4,0,0,0,0,0)"); +Execute("update vtiger_field set block=83 where tabid=29 and fieldname='imagename' and columnname='imagename'"); + +Execute("update vtiger_field set tablename='vtiger_products' where fieldname='taxclass' && tabid=14"); + +Execute("update vtiger_field set info_type='BAS' where tabid=4 and fieldname='email' and columnname='email'"); + +Execute("update vtiger_field set info_type='ADV' where tabid=4 and fieldname='otherphone' and columnname='otherphone'"); + +Execute("CREATE TABLE vtiger_salesmanattachmentsrel ( smid int(19) NOT NULL default '0', attachmentsid int(19) NOT NULL default '0', PRIMARY KEY (smid, attachmentsid), KEY salesmanattachmentsrel_smid_idx (smid), KEY salesmanattachmentsrel_attachmentsid_idx (attachmentsid), CONSTRAINT fk_1_vtiger_salesmanattachmentsrel FOREIGN KEY (smid) REFERENCES vtiger_users (id), CONSTRAINT fk_2_vtiger_salesmanattachmentsrel FOREIGN KEY (attachmentsid) REFERENCES vtiger_attachments (attachmentsid) ON DELETE CASCADE) ENGINE=InnoDB"); + + +//Changes made for Activity merge with Calendar - Starts +Execute("alter table vtiger_activity add column time_end varchar(50) default NULL after time_start"); + +Execute("delete from vtiger_tab where tabid=17"); + +Execute("update vtiger_tab set name='Calendar',tablabel='Calendar' where tabid=9"); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (9, $newfieldid, 'time_end','vtiger_activity', 1,'2','time_end','End Time',1,0,0,100,6,19,3,'T~O',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('9',$newfieldid); + +$newfieldid = $conn->getUniqueID("vtiger_field"); +$query = "insert into vtiger_field values (16, $newfieldid, 'time_end','vtiger_activity', 1,'2','time_end','End Time',1,0,0,100,6,41,3,'T~M',1,null,'BAS')"; +Execute($query); +populateFieldForSecurity('16',$newfieldid); + +Execute("delete from vtiger_profile2tab where tabid=17"); + +Execute("delete from vtiger_org_share_action2tab where tabid=17"); + +Execute("delete from vtiger_def_org_share where tabid=17"); + +Execute("delete from vtiger_parenttabrel where tabid=17"); +//Changes made for Activity merge with Calendar - Ends + +//audit trial table +Execute("create table vtiger_audit_trial(auditid int(19) NOT NULL, userid int(19) default NULL, module varchar(255) default NULL, action varchar(255) default NULL, recordid varchar(20) default NULL, actiondate datetime default NULL, PRIMARY KEY (auditid)) ENGINE=InnoDB"); + +//Added after 5 rc release +Execute("alter table vtiger_account modify siccode varchar(50)"); +Execute("update vtiger_field set typeofdata='V~O' where fieldname='siccode' and columnname='siccode' and tabid=6"); + +//changes made for CustomView and Reports - Activities changed to Calendar -- Starts +//Added to change the entitytype from Activities to Calendar for customview +Execute("update vtiger_crmentity set setype='Calendar' where setype='Activities'"); +Execute("update vtiger_customview set entitytype='Calendar' where entitytype='Activities'"); + +//Added to change the primarymodule from Activities to Calendar for Reports +Execute("update vtiger_reportmodules set primarymodule='Calendar' where primarymodule='Activities'"); +Execute("update vtiger_reportmodules set primarymodule='PurchaseOrder' where primarymodule='Orders'"); +Execute("update vtiger_reportmodules set secondarymodules='PurchaseOrder' where secondarymodules='Orders'"); + +//we should change the Activities to Calendar in columnname values in customview and report related tables +$prefix = "vtiger_"; +$change_cols_array = Array( + "cvcolumnlist"=>"columnname", + "cvstdfilter"=>"columnname", + "cvadvfilter"=>"columnname", + "selectcolumn"=>"columnname", + "relcriteria"=>"columnname", + "reportsortcol"=>"columnname", + "reportdatefilter"=>"datecolumnname", + "reportsummary"=>"columnname", + ); + +//This is to change Activities to Calendar +foreach($change_cols_array as $tablename => $columnname) +{ + $result = $conn->query("select $columnname from $prefix$tablename where $columnname like \"%Activities%\""); + + while($row = $conn->fetch_row($result)) + { + if($row[$columnname] !='' && $row[$columnname] != 'none') + { + Execute("update $prefix$tablename set $columnname=\"".str_replace("Activities","Calendar",$row[$columnname])."\" where $columnname=\"$row[$columnname]\""); + } + } +} + +//This is to change the Orders to PurchaseOrder +foreach($change_cols_array as $tablename => $columnname) +{ + $result1 = $conn->query("select $columnname from $prefix$tablename where $columnname like \"%Orders%\""); + + while($row1 = $conn->fetch_row($result1)) + { + if($row1[$columnname] !='' && $row1[$columnname] != 'none') + { + Execute("update $prefix$tablename set $columnname=\"".str_replace("Orders","PurchaseOrder",$row1[$columnname])."\" where $columnname=\"$row1[$columnname]\""); + } + } +} +//we have to change the table name from activity to crmentity for customview activity description +Execute('update vtiger_cvcolumnlist set columnname="vtiger_crmentity:description:description:Calendar_Description:V" where columnname="vtiger_activity:description:description:Calendar_Description:V"'); +//we have to change the table name (alias) from activity to crmentiryCalendar for reports activity description +Execute('update vtiger_selectcolumn set columnname="vtiger_crmentityCalendar:description:Calendar_Description:description:V" where columnname="vtiger_activity:description:Calendar_Description:description:V"'); +//changes made for CustomView and Reports - Activities changed to Calendar -- Ends + +Execute("update vtiger_field set uitype = 16 where tabid=2 and uitype=111 and columnname='sales_stage'"); + +Execute("update vtiger_field set quickcreate=1,quickcreatesequence=null where fieldname='duration_hours' and tabid=16"); + +Execute("update vtiger_field set quickcreate=0,quickcreatesequence=5 where fieldname='due_date' and tabid=16"); + +//we have to add id, sortorderid and presence in all existing custom field pick list tables. +$cf_picklist_res = $conn->query("select fieldname from vtiger_field where uitype=15 and fieldname like 'cf_%'"); +$noofPicklists = $conn->num_rows($cf_picklist_res); +for($i=0;$i<$noofPicklists;$i++) +{ + $fieldname = $conn->query_result($cf_picklist_res,$i,'fieldname'); + + $tablename = "vtiger_".$fieldname; + $idname = $fieldname."id"; + + $alterquery = "alter table $tablename add column $idname int(19) auto_increment PRIMARY KEY FIRST, add column sortorderid int(19) default 0 NOT NULL, add column presence int(1) default 1 NOT NULL"; + Execute($alterquery); +} + +$conn->query("alter table vtiger_organizationdetails drop primary key"); +Execute("alter table vtiger_organizationdetails change column organizationame organizationname varchar(60) NOT NULL"); +Execute("alter table vtiger_organizationdetails ADD PRIMARY KEY (organizationname)"); + +//Activity related changes +Execute('update vtiger_field set typeofdata="D~M~OTH~GE~date_start~Start Date & Time", uitype=23 where fieldname="due_date" and tabid=16'); +Execute('update vtiger_field set uitype=53 where tabid=16 and fieldname="assigned_user_id"'); + +Execute('update vtiger_field set typeofdata="D~M~OTH~GE~date_start~Start Date & Time", uitype=23 where fieldname="due_date" and tabid=9'); +Execute('update vtiger_field set uitype=53 where tabid=9 and fieldname="assigned_user_id"'); + +Execute("alter table vtiger_activity change column subject subject varchar(100) NOT NULL"); +Execute("alter table vtiger_activity change column activitytype activitytype varchar(50) NOT NULL"); +Execute("alter table vtiger_activity change column date_start date_start date NOT NULL"); +Execute("alter table vtiger_activity change column time_start time_start varchar(50) default NULL"); +//Execute("alter table vtiger_activity change column visibility visibility varchar(50) NOT NULL default 'all'"); + +Execute("delete from vtiger_field where tabid=14 and fieldname='currency'"); + +//Product related changes +Execute('update vtiger_field set typeofdata="D~O~OTH~GE~sales_start_date~Sales Start Date" where tabid=14 and fieldname="sales_end_date"'); +Execute('update vtiger_field set typeofdata="D~O~OTH~GE~start_date~Start Date" where tabid=14 and fieldname="expiry_date"'); + +//changes related to Incoming mail server settings +Execute("alter table vtiger_mail_accounts drop column showbody"); + +//change the Account relatedlist Activity label from Acivities to Activities +Execute("update vtiger_relatedlists set label='Activities' where tabid=6 and relation_id=3"); + +//change the fieldname from title to notes_title for notes and update in columnlist also +Execute("update vtiger_field set fieldname='notes_title' where tabid=8 and fieldname='title'"); +Execute('update vtiger_cvcolumnlist set columnname="vtiger_notes:title:notes_title:Notes_Title:V" where columnname="vtiger_notes:title:title:Notes_Title:V"'); + +//change the sequence of Billing and Shipping address details for Inventory modules +Execute("update vtiger_field set sequence=5 where tabid in (20,21,22,23) and fieldname='bill_city'"); +Execute("update vtiger_field set sequence=6 where tabid in (20,21,22,23) and fieldname='ship_city'"); +Execute("update vtiger_field set sequence=7 where tabid in (20,21,22,23) and fieldname='bill_state'"); +Execute("update vtiger_field set sequence=8 where tabid in (20,21,22,23) and fieldname='ship_state'"); +Execute("update vtiger_field set sequence=9 where tabid in (20,21,22,23) and fieldname='bill_code'"); +Execute("update vtiger_field set sequence=10 where tabid in (20,21,22,23) and fieldname='ship_code'"); +Execute("update vtiger_field set sequence=11 where tabid in (20,21,22,23) and fieldname='bill_country'"); +Execute("update vtiger_field set sequence=12 where tabid in (20,21,22,23) and fieldname='ship_country'"); + +//for vtiger_campaignleadrel table +Execute("alter table vtiger_campaignleadrel DROP PRIMARY KEY"); +Execute("alter table vtiger_campaignleadrel ADD PRIMARY KEY (campaignid,leadid)"); + +//for vtiger_campaigncontrel table +Execute("alter table vtiger_campaigncontrel DROP PRIMARY KEY"); +Execute("alter table vtiger_campaigncontrel ADD PRIMARY KEY (campaignid,contactid)"); + +//for vtiger_seactivityrel table +Execute("alter table vtiger_seactivityrel DROP PRIMARY KEY"); +Execute("alter table vtiger_seactivityrel ADD PRIMARY KEY (crmid,activityid)"); + +//change the block for vendor address details +Execute("update vtiger_field set fieldname='street' where tabid=18 and columnname='street'"); +Execute("update vtiger_field set block=46 where tabid=18 and fieldname in ('city','country','pobox','postalcode','state','street')"); + +//change the calendar sharing access to private +Execute("update vtiger_def_org_share set permission=3 where tabid=9"); +//Now sharing access is not available for Emails +Execute("delete from vtiger_def_org_share where tabid=10"); + +//we have to delete the entry from datashare_relatedmodules (Settings -> Sharing Access -> Add Privileges) +Execute("delete from vtiger_datashare_relatedmodules where tabid=10"); +Execute("delete from vtiger_datashare_relatedmodules where relatedto_tabid=10"); + + +//change the share_action_name in vtiger_org_share_action_mapping table for entry Public:Read,Create/Edit +Execute('update vtiger_org_share_action_mapping set share_action_name="Public: Read, Create/Edit" where share_action_name="Public:Read,Create/Edit"'); + +//delete the entries from vtiger_profile2standardpermissions table for Emails +Execute("delete from vtiger_profile2standardpermissions where tabid=10"); + +//delete the tagcloud entry from users +Execute("delete from vtiger_field where tabid=29 and fieldname='tagcloud'"); +Execute("alter table vtiger_users drop column tagcloud"); + +//we have missed to add the Received Shipment in postatus table +$sortorderid = $conn->query_result($conn->query("select max(sortorderid) as id from vtiger_postatus"),0,'id')+1; +Execute("insert into vtiger_postatus values('','Received Shipment',$sortorderid,1)"); +Execute("alter table vtiger_attachments add index attachments_description_name_type_attachmentsid_idx (`description`,`type`,`attachmentsid`)"); + +//Added after 5.0 GA release + +//In 4.2.3 we have assigned to group option only for Leads, HelpDesk and Activies and default None can be assigned. Now we will assign the unassigned entities to current user +Execute("update vtiger_crmentity set smownerid=1 where smownerid=0 and setype not in ('Leads','HelpDesk','Calendar')"); + +//CALCULATE Activity End Time (time_end) +//we have to calculate activity end time (time_end) based on start time (time_start) and duration (duration_hours, duration_minutes) +$sql = "select * from vtiger_activity"; +$result = $conn->query($sql); +$num_rows = $conn->num_rows($result); +for($i=0;$i<$num_rows;$i++) +{ + //First we have to retrieve the time_start, duration_hours and duration_minutes and form as a date with time + $activityid = $conn->query_result($result,$i,'activityid'); + $date_start = $conn->query_result($result,$i,'date_start'); + $time_start = $conn->query_result($result,$i,'time_start'); + $duration_hours = $conn->query_result($result,$i,'duration_hours'); + $duration_minutes = $conn->query_result($result,$i,'duration_minutes'); + + if($duration_hours != '' && $duration_minutes != '') + { + $date_details = explode("-",$date_start); + $start_year = $date_details[0]; + $start_month = $date_details[1]; + $start_date = $date_details[2]; + + $start_details = explode(":",$time_start); + $start_hour = $start_details[0]; + $start_minutes = $start_details[1]; + + $full_duration = "$duration_hours:$duration_minutes:00"; + + $start = date("Y-m-d H:i:s",mktime($start_hour, $start_minutes, 0, $start_month, $start_date, $start_year)); + $end = date("Y-m-d H:i:s",mktime($start_hour+$duration_hours, $start_minutes+$duration_minutes, 0, $start_month, $start_date, $start_year)); + + $end_details = explode(" ",$end); + $due_date = $end_details[0]; + + $end_time_details = explode(":",$end_details[1]); + $time_end = $end_time_details[0].":".$end_time_details[1]; + + $update_query = "update vtiger_activity set due_date=\"$due_date\", time_end=\"$time_end\" where activityid=$activityid"; + + $conn->query($update_query); + } +} + +//Added after 5.0.1 +//we have to delete the entries from customview and report related tables for deleted customfields +include("modules/Migration/deleteCustomFields.php"); + + + + +//Finally add vtiger_ prefix for all the entries in 'tablename' column in field table - 2nd August 2006 +$field_res = $conn->query("select fieldid, tablename from vtiger_field"); +for($field_count=0;$field_count<$conn->num_rows($field_res);$field_count++) +{ + //get the tablename + $tablename = $conn->query_result($field_res,$field_count,'tablename'); + + //check whether the table name has the prefix vtiger_ + if(substr($tablename, 0, 7) != 'vtiger_') + { + $tablename = "vtiger_$tablename"; + + //Now update the tablename + $fieldid = $conn->query_result($field_res,$field_count,'fieldid'); + Execute("update vtiger_field set tablename=\"$tablename\" where fieldid=$fieldid"); + } +} + + +$migrationlog->debug("\n\nDB Changes from 4.2.x to 5.0 GA -------- Ends \n\n"); + + +//Added to get the conversion rate and update for all records +?> + +query($query); + + $query_count++; + if(is_object($status)) + { + echo ' + + '.get_class($status).' + S + '.$query.' + '; + $success_query_array[$success_query_count++] = $query; + $migrationlog->debug("Query Success ==> $query"); + } + else + { + echo ' + + '.$status.' + F + '.$query.' + '; + $failure_query_array[$failure_query_count++] = $query; + $migrationlog->debug("Query Failed ==> $query \n Error is ==> [".$conn->database->ErrorNo()."]".$conn->database->ErrorMsg()); + //$migrationlog->debug("Error is ==> ".$conn->ErrorMsg()); + } +} + +//Added on 23-12-2005 which is used to populate the vtiger_profile2field and vtiger_def_org_field table entries for the field per tab +//if we enter a field in vtiger_field table then we must populate that field in these table for security access +function populateFieldForSecurity($tabid,$fieldid) +{ + global $conn; + + $profileresult = $conn->query("select * from vtiger_profile"); + $countprofiles = $conn->num_rows($profileresult); + for ($i=0;$i<$countprofiles;$i++) + { + $profileid = $conn->query_result($profileresult,$i,'profileid'); + $sqlProf2FieldInsert[$i] = 'insert into vtiger_profile2field values ('.$profileid.','.$tabid.','.$fieldid.',0,1)'; + Execute($sqlProf2FieldInsert[$i]); + } + $def_query = "insert into vtiger_def_org_field values (".$tabid.",".$fieldid.",0,1)"; + Execute($def_query); +} + +function localcreateRole($roleName,$parentRoleId,$roleProfileArray) +{ + global $migrationlog; + $migrationlog->debug("Entering localcreateRole(".$roleName.",".$parentRoleId.",".$roleProfileArray.") method ..."); + + global $conn; + $parentRoleDetails = localgetRoleInformation($parentRoleId); + $parentRoleInfo=$parentRoleDetails[$parentRoleId]; + $roleid_no=$conn->getUniqueId("vtiger_role"); + $roleId='H'.$roleid_no; + $parentRoleHr=$parentRoleInfo[1]; + $parentRoleDepth=$parentRoleInfo[2]; + $nowParentRoleHr=$parentRoleHr.'::'.$roleId; + $nowRoleDepth=$parentRoleDepth + 1; + + //Inserting vtiger_role into db + $query="insert into vtiger_role values('".$roleId."','".$roleName."','".$nowParentRoleHr."',".$nowRoleDepth.")"; + $conn->query($query); + + //Inserting into vtiger_role2profile vtiger_table + foreach($roleProfileArray as $profileId) + { + if($profileId != '') + { + localinsertRole2ProfileRelation($roleId,$profileId); + } + } + + $migrationlog->debug("Exiting localcreateRole method ..."); + return $roleId; + +} +function localgetRoleInformation($roleid) +{ + global $migrationlog; + $migrationlog->debug("Entering localgetRoleInformation(".$roleid.") method ..."); + global $conn; + + $query = "select * from vtiger_role where roleid='".$roleid."'"; + $result = $conn->query($query); + $rolename=$conn->query_result($result,0,'rolename'); + $parentrole=$conn->query_result($result,0,'parentrole'); + $roledepth=$conn->query_result($result,0,'depth'); + $parentRoleArr=explode('::',$parentrole); + $immediateParent=$parentRoleArr[sizeof($parentRoleArr)-2]; + + $roleDet=Array(); + $roleDet[]=$rolename; + $roleDet[]=$parentrole; + $roleDet[]=$roledepth; + $roleDet[]=$immediateParent; + $roleInfo=Array(); + $roleInfo[$roleid]=$roleDet; + + $migrationlog->debug("Exiting localgetRoleInformation method ..."); + + return $roleInfo; +} + +function localinsertRole2ProfileRelation($roleId,$profileId) +{ + global $migrationlog; + $migrationlog->debug("Entering localinsertRole2ProfileRelation(".$roleId.",".$profileId.") method ..."); + + global $conn; + $query="insert into vtiger_role2profile values('".$roleId."',".$profileId.")"; + $conn->query($query); + + $migrationlog->debug("Exiting localinsertRole2ProfileRelation method ..."); +} + +?> diff --git a/oss/vtiger/trunk/modules/Migration/DBChanges/501_to_502.php b/oss/vtiger/trunk/modules/Migration/DBChanges/501_to_502.php new file mode 100644 index 00000000..878f1cc0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/DBChanges/501_to_502.php @@ -0,0 +1,72 @@ +debug("\n\nDB Changes from 5.0.1 to 5.0.2 -------- Starts \n\n"); + +//Query added to show Manufacturer field in Products module +ExecuteQuery("update vtiger_field set displaytype=1,block=31 where tabid=14 and block=1"); +ExecuteQuery("update vtiger_field set block=23,displaytype=1 where block=1 and displaytype=23 and tabid=10"); +ExecuteQuery("update vtiger_field set block=22,displaytype=1 where block=1 and displaytype=22 and tabid=10"); + +//Added to rearange the attachment in HelpDesk +ExecuteQuery(" update vtiger_field set block=25,sequence=12 where tabid=13 and fieldname='filename'"); + +//Query added to as entityname,its tablename,its primarykey are saved in a table +ExecuteQuery(" CREATE TABLE `vtiger_entityname` ( + `tabid` int(19) NOT NULL default '0', + `modulename` varchar(50) NOT NULL, + `tablename` varchar(50) NOT NULL, + `fieldname` varchar(150) NOT NULL, + `entityidfield` varchar(150) NOT NULL, + PRIMARY KEY (`tabid`), + KEY `entityname_tabid_idx` (`tabid`) +)"); + +//Data Populated for the existing modules +ExecuteQuery("insert into vtiger_entityname values(7,'Leads','vtiger_leaddetails','lastname,firstname','leadid')"); +ExecuteQuery("insert into vtiger_entityname values(6,'Accounts','vtiger_account','accountname','accountid')"); +ExecuteQuery("insert into vtiger_entityname values(4,'Contacts','vtiger_contactdetails','lastname,firstname','contactid')"); +ExecuteQuery("insert into vtiger_entityname values(2,'Potentials','vtiger_potential','potentialname','potentialid')"); +ExecuteQuery("insert into vtiger_entityname values(8,'Notes','vtiger_notes','title','notesid')"); +ExecuteQuery("insert into vtiger_entityname values(13,'HelpDesk','vtiger_troubletickets','title','ticketid')"); +ExecuteQuery("insert into vtiger_entityname values(9,'Calendar','vtiger_activity','subject','activityid')"); +ExecuteQuery("insert into vtiger_entityname values(10,'Emails','vtiger_activity','subject','activityid')"); +ExecuteQuery("insert into vtiger_entityname values(14,'Products','vtiger_products','productname','productid')"); +ExecuteQuery("insert into vtiger_entityname values(29,'Users','vtiger_users','last_name,first_name','id')"); +ExecuteQuery("insert into vtiger_entityname values(23,'Invoice','vtiger_invoice','subject','invoiceid')"); +ExecuteQuery("insert into vtiger_entityname values(20,'Quotes','vtiger_quotes','subject','quoteid')"); +ExecuteQuery("insert into vtiger_entityname values(21,'PurchaseOrder','vtiger_purchaseorder','subject','purchaseorderid')"); +ExecuteQuery("insert into vtiger_entityname values(22,'SalesOrder','vtiger_salesorder','subject','salesorderid')"); +ExecuteQuery("insert into vtiger_entityname values(18,'Vendors','vtiger_vendor','vendorname','vendorid')"); +ExecuteQuery("insert into vtiger_entityname values(19,'PriceBooks','vtiger_pricebook','bookname','pricebookid')"); +ExecuteQuery("insert into vtiger_entityname values(26,'Campaigns','vtiger_campaign','campaignname','campaignid')"); +ExecuteQuery("insert into vtiger_entityname values(15,'Faq','vtiger_faq','question','id')"); + +//added quantity in stock in product default listview - All +$res = $adb->query("select vtiger_cvcolumnlist.cvid from vtiger_cvcolumnlist inner join vtiger_customview on vtiger_cvcolumnlist.cvid=vtiger_customview.cvid where entitytype='Products' and viewname='All'"); +if($adb->num_rows != 0) +{ + $cvid = $adb->query_result($res,0,'cvid'); + $adb->query("insert into vtiger_cvcolumnlist values($cvid,5,'vtiger_products:qtyinstock:qtyinstock:Products_Quantity_In_Stock:V')"); +} + + +//echo "
      5.0/5.0.1 ==> 5.0.2 Database changes has been done.
    "; + +$migrationlog->debug("\n\nDB Changes from 5.0.1 to 5.0.2 -------- Ends \n\n"); + +?> diff --git a/oss/vtiger/trunk/modules/Migration/DBChanges/502_to_503rc2.php b/oss/vtiger/trunk/modules/Migration/DBChanges/502_to_503rc2.php new file mode 100644 index 00000000..347b0bc1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/DBChanges/502_to_503rc2.php @@ -0,0 +1,111 @@ +debug("\n\nDB Changes from 5.0.2 to 5.0.3 RC2 -------- Starts \n\n"); + +$query_array = Array( + "alter table vtiger_entityname add column entityidcolumn varchar(150)", + + "update vtiger_entityname set entityidcolumn='leadid' where tabid=7", + "update vtiger_entityname set entityidcolumn='account_id' where tabid=6", + "update vtiger_entityname set entityidcolumn='contact_id' where tabid=4", + "update vtiger_entityname set entityidcolumn='potential_id' where tabid=2", + "update vtiger_entityname set entityidcolumn='notesid' where tabid=8", + "update vtiger_entityname set entityidcolumn='ticketid' where tabid=13", + "update vtiger_entityname set entityidcolumn='activityid' where tabid=9", + "update vtiger_entityname set entityidcolumn='activityid' where tabid=10", + "update vtiger_entityname set entityidcolumn='product_id' where tabid=14", + "update vtiger_entityname set entityidcolumn='id' where tabid=29", + "update vtiger_entityname set entityidcolumn='invoiceid' where tabid=23", + "update vtiger_entityname set entityidcolumn='quote_id' where tabid=20", + "update vtiger_entityname set entityidcolumn='purchaseorderid' where tabid=21", + "update vtiger_entityname set entityidcolumn='salesorder_id' where tabid=22", + "update vtiger_entityname set entityidcolumn='vendor_id' where tabid=18", + "update vtiger_entityname set entityidcolumn='pricebookid' where tabid=19", + "update vtiger_entityname set entityidcolumn='campaignid' where tabid=26", + "update vtiger_entityname set entityidcolumn='id' where tabid=15", + "alter table vtiger_entityname MODIFY entityidcolumn varchar(150) NOT NULL", + + "update vtiger_field set fieldlabel='Part Number' where tabid=14 and fieldname='productcode'", + + + "alter table vtiger_tab change customized customized integer(19)", + "alter table vtiger_tab add column ownedby integer(19)", + "ALTER TABLE vtiger_blocks ADD CONSTRAINT fk_1_vtiger_blocks FOREIGN KEY (tabid) REFERENCES vtiger_tab(tabid) ON DELETE CASCADE", + "alter table vtiger_crmentity modify setype varchar(25)", + + "ALTER TABLE vtiger_customview ADD INDEX customview_entitytype_idx (entitytype)", + "ALTER TABLE vtiger_customview ADD CONSTRAINT fk_1_vtiger_customview FOREIGN KEY (entitytype) REFERENCES vtiger_tab (name) ON DELETE CASCADE", + + "alter table vtiger_parenttabrel change parenttabid parenttabid integer(19)", + "alter table vtiger_parenttabrel change tabid tabid integer(19)", + + "ALTER TABLE vtiger_parenttabrel ADD CONSTRAINT fk_1_vtiger_parenttabrel FOREIGN KEY (tabid) REFERENCES vtiger_tab(tabid) ON DELETE CASCADE", + + "ALTER TABLE vtiger_parenttabrel ADD CONSTRAINT fk_2_vtiger_parenttabrel FOREIGN KEY (parenttabid) REFERENCES vtiger_parenttab(parenttabid) ON DELETE CASCADE", + + "ALTER TABLE vtiger_entityname ADD CONSTRAINT fk_1_vtiger_entityname FOREIGN KEY (tabid) REFERENCES vtiger_tab(tabid) ON DELETE CASCADE", + + "alter table vtiger_parenttab engine=InnoDB", + + "update vtiger_tab set customized=0", + "update vtiger_tab set ownedby=1", + "update vtiger_tab set ownedby=0 where tabid in (2,4,6,7,9,13,16,20,21,22,23,26)", + + ); + +foreach($query_array as $query) +{ + ExecuteQuery($query); +} + + +ExecuteQuery("ALTER TABLE vtiger_users MODIFY user_password varchar(32)"); + +//Changes related to Product - Lead/Account/Contact/Potential relationship - Mickie - 13-01-2007 +ExecuteQuery("delete from vtiger_field where tabid=14 and fieldname in ('parent_id','contact_id')"); + +//Before drop the contactid from products, we have to save this product - contact relationship in seproductsrel table +//ExecuteQuery("insert into vtiger_seproductsrel (select contactid, productid from vtiger_products where contactid is not NULL)"); +//In above query, if there is any duplicate entry then execution stopped. So we will insert undeleted products one by one +$product_contact_res = $adb->query("select contactid, productid from vtiger_products inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_products.productid where vtiger_crmentity.deleted=0 and contactid != 0 and contactid is NOT NULL"); +for($i=0;$i<$adb->num_rows($product_contact_res);$i++) +{ + $crmid = $adb->query_result($product_contact_res,$i,'contactid'); + $productid = $adb->query_result($product_contact_res,$i,'productid'); + + $adb->query("insert into vtiger_seproductsrel values ($crmid , $productid)"); +} +ExecuteQuery("alter table vtiger_products drop column contactid"); + + +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",14,7,'get_leads',9,'Leads',0)"); +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",14,6,'get_accounts',10,'Accounts',0)"); +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",14,4,'get_contacts',11,'Contacts',0)"); +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",14,2,'get_opportunities',12,'Potentials',0)"); + +ExecuteQuery("alter table vtiger_seproductsrel add column setype varchar(100)"); +//we have to update setype for all existing entries which will be NULL before execute the following query +ExecuteQuery("update vtiger_seproductsrel,vtiger_crmentity set vtiger_seproductsrel.setype=vtiger_crmentity.setype where vtiger_crmentity.crmid=vtiger_seproductsrel.crmid"); + + +ExecuteQuery("CREATE TABLE vtiger_version (id int(11) NOT NULL auto_increment, old_version varchar(30) default NULL, current_version varchar(30) default NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1"); + +ExecuteQuery("delete from vtiger_selectcolumn WHERE columnname LIKE '%vtiger_crmentityRelProducts%'"); +//echo "
      5.0.2 ==> 5.0.3 Database changes has been done.
    "; + +$migrationlog->debug("\n\nDB Changes from 5.0.2 to 5.0.3 RC2 -------- Ends \n\n"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Migration/DBChanges/503_to_504rc.php b/oss/vtiger/trunk/modules/Migration/DBChanges/503_to_504rc.php new file mode 100644 index 00000000..59e7f0bf --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/DBChanges/503_to_504rc.php @@ -0,0 +1,787 @@ +debug("\n\nDB Changes from 5.0.3 to 5.0.4 RC-------- Starts \n\n"); + + + +/**These two database changes are directly applied in index.php at line 186 to avoid fatal error before starting migration. + * So that these two lines are commented. + + //Added for UserBased TagCloud + ExecuteQuery("alter table vtiger_users add column tagcloud_view int(1) default 1"); + //Added for the Internal mailer option in Users module - By srini 04-09-07 + ExecuteQuery("alter table vtiger_users add column internal_mailer int(3) NOT NULL default '1'"); + */ + +ExecuteQuery("insert into vtiger_field values(29,".$adb->getUniqueID('vtiger_field').",'internal_mailer','vtiger_users',1,'56','internal_mailer','INTERNAL_MAIL_COMPOSER',1,0,0,50,15,80,1,'V~O',1,null,'BAS')"); + +//Added when prodving FCK editor feature in Email Templates. +//before using FCK editor we are using text area. it store next line as \n. so we change the \n to
    when displaying the contents. +//Now we are using FCK editor. So new line character will be automatically saved as
    //But the contents created with text area still having \n character as next line. So we need to change it to
    +//this code will get the contents from db and then convert all \n character with
    and again update in db. + +$result=$adb->query("select templateid,body from vtiger_emailtemplates"); + +for($i=0;$i<$adb->num_rows($result);$i++) +{ +$body=addslashes(nl2br($adb->query_result($result,$i,'body'))); +$templateid=$adb->query_result($result,$i,'templateid'); + +$adb->pquery("update vtiger_emailtemplates set body=? where templateid=?", array($body, $templateid)); +} + + + +//for Customer Portal Login details +$body=' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    $logo$
    vtiger CRM
    The honest Open Source CRM
    +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Dear $contact_name$,
    Thank you very much for subscribing to the vtiger CRM - annual support service.
    Here is your self service portal login details:
    + + + + + + + + + + + +

    User ID : $login_name$
    Password: $password$
    $URL$
    +
    NOTE: We suggest you to change your password after logging in first time.

    Help Documentation

    After logging in to vtiger Self-service Portal first time, you can access the vtiger CRM documents from the Documents tab. Following documents are available for your reference:
    +
      +
    • Installation Manual (Windows & Linux OS)
    • +
    • User & Administrator Manual
    • +
    • vtiger Customer Portal - User Manual
    • +
    • vtiger Outlook Plugin - User Manual
    • +
    • vtiger Office Plug-in - User Manual
    • +
    • vtiger Thunderbird Extension - User Manual
    • +
    • vtiger Web Forms - User Manual
    • +
    • vtiger Firefox Tool bar - User Manual
    • +
    +

    Knowledge Base

    Periodically we update frequently asked question based on our customer experiences. You can access the latest articles from the FAQ tab.

    vtiger CRM - Details

    Kindly let us know your current vtiger CRM version and system specification so that we can provide you necessary guidelines to enhance your vtiger CRM system performance. Based on your system specification we alert you about the latest security & upgrade patches.

    Thank you once again and wish you a wonderful experience with vtiger CRM.


    Best Regards
    $support_team$
    www.vtiger.com
    +
    +
    + + + + + + + + + + + +
    Shree Narayana Complex, No 11 Sarathy Nagar, Vijaya Nagar , Velachery, Chennai - 600 042 India
    Telephone No: +91 - 44 - 4202 - 1990 Toll Free No: +1 877 788 4437
    Email Id: support@vtiger.com
    +
    +
    '; + +$fieldid = $adb->getUniqueID('vtiger_emailtemplates'); +$login_id=$fieldid; +$adb->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Customer Login Details','Customer Portal Login Details','Send Portal login details to customer','".$body."',0,".$fieldid.")"); + + +//for Support end notification before a week +$body=' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    $logo$
    vtiger CRM
    The honest Open Source CRM
    +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Dear $contacts-lastname$,
    This is just a notification mail regarding your support end.
    Priority: Urgent
    Your Support is going to expire on next week
    Please contact support@vtiger.com.





    Sincerly
    Support Team
    www.vtiger.com
    +
    +
    + + + + + + + + + + + +
    Shree Narayana Complex, No 11 Sarathy Nagar, Vijaya Nagar , Velachery, Chennai - 600 042 India
    Telephone No: +91 - 44 - 4202 - 1990 Toll Free No: +1 877 788 4437
    Email Id: info@vtiger.com
    +
    +
    '; +$fieldid = $adb->getUniqueID('vtiger_emailtemplates'); +$week_id=$fieldid; +$adb->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Support end notification before a week','VtigerCRM Support Notification','Send Notification mail to customer before a week of support end date','".$body."',0,".$fieldid.")"); + + + + +//for Support end notification before a month +$body=' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    $logo$
    vtiger CRM
    The honest Open Source CRM
    +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Dear $contacts-lastname$,
    This is just a notification mail regarding your support end.
    Priority: Normal
    Your Support is going to expire on next month.
    Please contact support@vtiger.com





    Sincerly
    Support Team
    www.vtiger.com
    +
    +
    + + + + + + + + + + + +
    Shree Narayana Complex, No 11 Sarathy Nagar, Vijaya Nagar , Velachery, Chennai - 600 042 India
    Telephone No: +91 - 44 - 4202 - 1990 Toll Free No: +1 877 788 4437
    Email Id: info@vtiger.com
    +
    +
    '; +$fieldid = $adb->getUniqueID('vtiger_emailtemplates'); +$month_id=$fieldid; +$adb->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Support end notification before a month','VtigerCRM Support Notification','Send Notification mail to customer before a month of support end date','".$body."',0,".$fieldid.")"); + + + +//Queries for Notification scheduler +//to add a new column type in vtiger_notificationscheduler + +ExecuteQuery("alter table vtiger_notificationscheduler add column type varchar(10)"); + +$adb->query("update vtiger_notificationscheduler set notificationbody='".$login_id."',type='select' where schedulednotificationid=5"); +$adb->query("update vtiger_notificationscheduler set notificationbody='".$week_id."',type='select' where schedulednotificationid=6"); + + + + + +$adb->query("update vtiger_notificationscheduler set schedulednotificationname='LBL_SUPPORT_DESCRIPTION_MONTH',active='1',notificationsubject='Support end notification',notificationbody='".$month_id."',label='LBL_SUPPORT_NOTICIATION_MONTH',type='select' where schedulednotificationid=7"); + + +$fieldid = $adb->getUniqueID('vtiger_notificationscheduler'); +$adb->query("insert into vtiger_notificationscheduler(schedulednotificationid,schedulednotificationname,active,notificationsubject,notificationbody,label,type) values (".$fieldid.",'LBL_ACTIVITY_REMINDER_DESCRIPTION',1,'Activity Reminder Notification','This is a reminder notification for the Activity','LBL_ACTIVITY_NOTIFICATION','')"); + + +//End of Email templates and Notificatin Scheduler changes. + + +//creating the new tables vtiger_picklist,vtiger_picklist_seq and vtiger_role2picklist +$adb->query("CREATE TABLE `vtiger_picklist` (`picklistid` int(11) NOT NULL auto_increment,`name` varchar(200) NOT NULL,PRIMARY KEY (`picklistid`),UNIQUE KEY `picklist_name_idx` (`name`)) ENGINE=InnoDB"); + +$adb->query("CREATE TABLE `vtiger_role2picklist` ( + `roleid` varchar(255) NOT NULL, + `picklistvalueid` int(11) NOT NULL, + `picklistid` int(11) NOT NULL, + `sortid` int(11) default NULL, + PRIMARY KEY (`roleid`,`picklistvalueid`,`picklistid`), + KEY `role2picklist_roleid_picklistid_idx` (`roleid`,`picklistid`,`picklistvalueid`), + KEY `fk_2_vtiger_role2picklist` (`picklistid`)) type='InnoDB'"); + +//$adb->query("alter table vtiger_role2picklist add CONSTRAINT `fk_1_vtiger_role2picklist` FOREIGN KEY (`roleid`) REFERENCES `vtiger_role` (`roleid`) ON DELETE CASCADE"); + +$adb->query("alter table vtiger_role2picklist add CONSTRAINT `fk_3_vtiger_role2picklist` FOREIGN KEY (`picklistid`) REFERENCES `vtiger_picklist` (`picklistid`) ON DELETE CASCADE"); + + +//$adb->query("CREATE TABLE `vtiger_picklistvalues_seq` (`id` int(11) NOT NULL)"); +//$adb->query("insert into vtiger_picklistvalues_seq values(1)"); +//Alter picklist tables +$picklist_arr = array('leadsource','accounttype','industry','leadstatus','rating','opportunity_type','salutationtype','sales_stage','ticketstatus','ticketpriorities','ticketseverities','ticketcategories','eventstatus','taskstatus','taskpriority','manufacturer','productcategory','faqcategories','usageunit','glacct','quotestage','carrier','faqstatus','invoicestatus','postatus','sostatus','campaigntype','campaignstatus','expectedresponse'); + +$custom_result = $adb->query("select * from vtiger_field where (uitype=15 or uitype=33) and fieldname like '%cf_%'"); +$numrow = $adb->num_rows($custom_result); +for($i=0; $i < $numrow; $i++) +{ + $picklist_arr[] = $adb->query_result($custom_result,$i,'fieldname'); +} + +for($i=0;$iquery("alter table vtiger_$table_name drop column sortorderid"); + $adb->query("alter table vtiger_$table_name add column picklist_valueid int(19) not null default '0'"); +} + +//Inserting values on vtiger_picklist tables +function insert_picklist_table($picklist) +{ + global $adb; + $picklist_uniqueid = $adb->getUniqueID("vtiger_picklist"); + $adb->query("insert into vtiger_picklist values('$picklist_uniqueid','$picklist')"); + insert_values($picklist,$picklist_uniqueid); +} + +//Function to insert values on vtiger_role2picklist table and updating the values for picklist tables +function insert_values($picklist,$picklistid) +{ + global $adb; + $result = $adb->query("select * from vtiger_$picklist"); + $numrow = $adb->num_rows($result); + for($i=0; $i < $numrow; $i++) + { + $picklist_name = decode_html($adb->query_result($result,$i,$picklist)); + $picklist_valueid = getUniquePicklistID(); + $picklistquery = "update vtiger_$picklist set picklist_valueid=? where $picklist=?"; + $adb->pquery($picklistquery, array($picklist_valueid, $picklist_name)); + $sql="select roleid from vtiger_role"; + $role_result = $adb->query($sql); + $numrows = $adb->num_rows($role_result); + for($k=0; $k < $numrows; $k++) + { + $roleid = $adb->query_result($role_result,$k,'roleid'); + $adb->query("insert into vtiger_role2picklist values('".$roleid."',".$picklist_valueid.",$picklistid,".$i.")"); + } + } +} + + + +//drop the column description in troubletickets table -- by liza on 30-08-2007 +ExecuteQuery("update vtiger_field set tablename='vtiger_crmentity' where tabid =13 and fieldname='description'"); +ExecuteQuery("update vtiger_crmentity inner join vtiger_troubletickets on vtiger_troubletickets.ticketid=vtiger_crmentity.crmid set vtiger_crmentity.description=vtiger_troubletickets.description"); +ExecuteQuery("alter table vtiger_troubletickets drop column description"); + +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_crmentity:description:description:HelpDesk_Description:V' where columnname='vtiger_troubletickets:description:description:HelpDesk_Description:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_crmentity:description:HelpDesk_Description:V' where columnname='vtiger_troubletickets:description:description:HelpDesk_Description:V'"); + +//Changed the ordinary field to mandatory field for the field EventStatus??(Event Module) +//Changing the typeofdata as "V~M" from "V~O"--added by Bharath 30-08-07 +ExecuteQuery("update vtiger_field set typeofdata='V~M' where tabid=16 and columnname='eventstatus'"); + +//Modified the vtiger_mail_accounts for change password in incoming mail server settings - by srini 04-09-07 +ExecuteQuery("alter table vtiger_mail_accounts modify column mail_password varchar(150)"); + +//Modified the vtiger_portal table for make as default option in Mysites - by srini 04-09-07 +ExecuteQuery("alter table vtiger_portal add column setdefault int(3) NOT NULL default '0'"); + +//Modifed the quantity field from integer to decimal -By shahul +//Added to fix the ticket # 4119 +ExecuteQuery("alter table vtiger_inventoryproductrel modify column quantity decimal(25,3)"); + +//4065 -- to support email address as a user name -- by bharathi + +//ALTER TABLE vtiger_users MODIFY user_name varchar(100); + +//added for the ticket#4109 -- by bharathi +ExecuteQuery("update vtiger_relatedlists set sequence=sequence+1 where tabid=6 and sequence>6"); +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID("vtiger_relatedlists").",6,10,'get_emails',7,'Emails',0)"); + +//added by Dinakaran for the ticket(http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/4125) Date:24/08/2007 +ExecuteQuery("alter table vtiger_attachments add column subject varchar(200)"); + +//Added by mangai regarding performance + +ExecuteQuery("ALTER TABLE vtiger_cntactivityrel ADD CONSTRAINT fk_1_vtiger_cntactivityrel FOREIGN KEY (`activityid`) REFERENCES `vtiger_activity` (`activityid`) ON DELETE CASCADE"); + +ExecuteQuery("ALTER TABLE vtiger_recurringevents ADD CONSTRAINT fk_1_vtiger_recurringevents FOREIGN KEY(activityid) REFERENCES vtiger_activity(activityid)"); + +ExecuteQuery("alter table vtiger_activity add column recurringtype varchar(30) default NULL"); + +ExecuteQuery("UPDATE vtiger_field SET tablename='vtiger_activity' where fieldname='recurringtype'"); + +ExecuteQuery("update vtiger_activity inner join vtiger_recurringevents on vtiger_recurringevents.activityid=vtiger_activity.activityid set vtiger_activity.recurringtype = vtiger_recurringevents.recurringtype"); + +//Added for the fix 3919 by akilan on 20th september +ExecuteQuery("update vtiger_field set uitype=255 where tabid in (7,4) and columnname='lastname'"); + +//We need to remove the field team from quotes. To avoid data loss, we need to create a new custom field and to move the team field values into the newly created sutom field. + +//Getting block id for custom information +$blockid = $adb->query_result($adb->query("select blockid from vtiger_blocks where tabid=20 and blocklabel = 'LBL_CUSTOM_INFORMATION'"),0,'blockid'); + +//Getting the sequence +$seq = $adb->query_result($adb->query("select max(sequence) as seq from vtiger_field where block=".$blockid." and tabid=20"),0,'seq'); + +//Removing the Team field from field table. +ExecuteQuery("delete from vtiger_field where tabid=20 and fieldname = 'team' and columnname='team'"); +//Creating new Custom field for quotes module and populating security entries. + +//Getting the biggest custom field name and id +$newfieldid=$adb->getUniqueID("vtiger_field"); +$new_cf_name = 'cf_'.$newfieldid; +$query="insert into vtiger_field values(20,".$newfieldid.",'".$new_cf_name."','vtiger_quotescf',2,1,'".$new_cf_name."','Team',0,0,0,100,".($seq+1).",".$blockid.",1,'V~O~LE~30',1,0,'BAS')"; +$result = $adb->query($query); + + +//Populate security entries for this new field +$profileresult = $adb->query("select * from vtiger_profile"); +$countprofiles = $adb->num_rows($profileresult); +for($i=0;$i<$countprofiles;$i++) +{ + $profileid = $adb->query_result($profileresult,$i,'profileid'); + $sqlProf2FieldInsert[$i] = 'insert into vtiger_profile2field values ('.$profileid.',20,'.$newfieldid.',0,1)'; + ExecuteQuery($sqlProf2FieldInsert[$i]); +} +$def_query = "insert into vtiger_def_org_field values (20,".$newfieldid.",0,1)"; +ExecuteQuery($def_query); +//End of security popullation + +ExecuteQuery("ALTER TABLE vtiger_quotescf ADD ".$new_cf_name." VARCHAR(100)"); + +//Copying all the existing values for team field in vtiger_quotes table into vtiger_quotescf table. ie, moving values from team field into a new custom field. +ExecuteQuery("update vtiger_quotescf inner join vtiger_quotes on vtiger_quotescf.quoteid=vtiger_quotes.quoteid set $new_cf_name=vtiger_quotes.team"); + +//If any custom view referring to the deleted field 'team' then we need to update it to point the newly created custom field. +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_quotescf:$new_cf_name:$new_cf_name:Quotes_Team:V' where columnname='vtiger_quotes:team:team:Quotes_Team:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_quotescf:$new_cf_name:$new_cf_name:Quotes_Team:V' where columnname='vtiger_quotes:team:team:Quotes_Team:V'"); +//Removing the team column from the vtiger_quotes table +ExecuteQuery("ALTER TABLE vtiger_quotes drop team"); + +//Added by Akilan on 18th November +ExecuteQuery("CREATE TABLE vtiger_soapservice (id int(19) default NULL, type varchar(25) default NULL,sessionid varchar(100) default NULL) ENGINE=InnoDB"); +//Added by dinakaran. 18th November +////User Name field size increased into 255 chars in vtiger_users table +ExecuteQuery("alter table vtiger_users change user_name user_name varchar(255)"); + +//And by dina to change sequence for purchaseorder +ExecuteQuery("update vtiger_field set sequence=5 where columnname='purchaseorder' and tabid=22"); + + +//Added by shahul for #4574 +////Changed type of data for Price Book's active field. +ExecuteQuery("update vtiger_field set typeofdata='C~O' where tabid=19 and fieldname='active'"); + +//Added by shaul for the fix 4615 +ExecuteQuery("update vtiger_field set typeofdata='N~O' where fieldname='expectedrevenue' and tabid=26"); +ExecuteQuery("update vtiger_field set typeofdata='N~O' where fieldname='budgetcost' and tabid=26"); +ExecuteQuery("update vtiger_field set typeofdata='N~O' where fieldname='actualcost' and tabid=26"); +ExecuteQuery("update vtiger_field set typeofdata='I~O' where fieldname='targetsize' and tabid=26"); +ExecuteQuery("update vtiger_field set typeofdata='I~O' where fieldname='expectedresponsecount' and tabid=26"); +ExecuteQuery("update vtiger_field set typeofdata='I~O' where fieldname='expectedsalescount' and tabid=26"); +ExecuteQuery("update vtiger_field set typeofdata='I~O' where fieldname='actualresponsecount' and tabid=26"); +ExecuteQuery("update vtiger_field set typeofdata='I~O' where fieldname='actualsalescount' and tabid=26"); + + +//Added by Akilan to fix the issue #4544 +ExecuteQuery("alter table vtiger_attachments change column name name varchar(255)"); + +// Added by akilan to fix the issue #4568 +// Custom field default value is null that should be replace to Empty value. +$cfresult = $adb->query("select columnname,tablename,uitype,fieldname,fieldlabel,typeofdata from vtiger_field where columnname like 'cf_%' and uitype in (1,13,11,15,17,85) order by columnname"); +$countcf = $adb->num_rows($cfresult); +for($i=0;$i<$countcf;$i++) +{ + $column = $adb->query_result($cfresult,$i,'columnname'); + $table = $adb->query_result($cfresult,$i,'tablename'); + $adb->query("alter table $table alter $column set default ''"); + $adb->query("update $table set $column = '' where $column is NULL"); +} + +//Added by liza for 4242 ticket +ExecuteQuery("alter table vtiger_products modify column qtyinstock decimal(25,3)"); +ExecuteQuery("update vtiger_field set typeofdata='NN~O' where tabid=14 and fieldname='qtyinstock'"); + + +//Added by Pavani 4th December +//To add check boxes for import/export for Trouble Tickets and Vendors +$profileresult = $adb->query("select * from vtiger_profile"); +$countprofiles = $adb->num_rows($profileresult); +for($i=0;$i<$countprofiles;$i++) +{ + $profileid = $adb->query_result($profileresult,$i,'profileid'); + + //For Trouble Tickets + ExecuteQuery("insert into vtiger_profile2utility values(".$profileid.",13,5,0)"); + ExecuteQuery("insert into vtiger_profile2utility values(".$profileid.",13,6,0)"); + //For Vendors + ExecuteQuery("insert into vtiger_profile2utility values(".$profileid.",18,5,0)"); + ExecuteQuery("insert into vtiger_profile2utility values(".$profileid.",18,6,0)"); + +} + +//Added by Minnie to set the TABLE - storage_engine type - InnoDB +ExecuteQuery("ALTER TABLE vtiger_blocks Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_activity_reminder Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_currency_info Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_customerdetails Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_defaultcv Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_def_org_field Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_def_org_share Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_durationhrs Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_durationmins Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_emaildetails Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_emailtemplates Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_faqcategories Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_faqstatus Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_files Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_freetags Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_group2role Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_group2rs Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_headers Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_import_maps Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_inventory_tandc Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_invitees Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_loginhistory Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_mail_accounts Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_portalinfo Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_profile2field Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_profile2standardpermissions Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_profile2tab Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_profile2utility Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_relatedlists Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_role2profile Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_rss Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_sales_stage Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_sharedcalendar Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_systems Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_taskstatus Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_ticketstracktime Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_users2group Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_users_last_import Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_wordtemplates Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_activsubtype Type=InnoDB"); +ExecuteQuery("ALTER TABLE vtiger_version Type=InnoDB"); + +//Added by Asha for tickets #4513 +////File Name field size increased into 255 chars in vtiger_attachments table +ExecuteQuery("alter table vtiger_attachments change name name varchar(255)"); +////Data type for File Path field changed to TEXT in vtiger_attachments table +ExecuteQuery("alter table vtiger_attachments change path path TEXT"); + +//Added by bharathi #4657 +ExecuteQuery("alter table vtiger_attachments drop index attachments_description_name_type_attachmentsid_idx"); +ExecuteQuery("alter table vtiger_attachments add index attachments_description_type_attachmentsid_idx (`description`,`type`,`attachmentsid`)"); + +//Added by Asha for ticket #4724 +ExecuteQuery("update vtiger_selectcolumn set columnname = 'vtiger_campaign:campaignname:Potentials_Campaign_Source:campaignid:V' where columnname = 'vtiger_potential:campaignid:Potentials_Campaign_Source:campaignid:V'"); + +//Added by bharathi for #4590 on dec 21-2007 +ExecuteQuery("alter table vtiger_potential change column amount amount decimal(14,2) default '0.00'"); + +//Added by Srini for #4684 on dec 21-2007 +ExecuteQuery("update vtiger_field set uitype=19 where fieldname='update_log' and tablename='vtiger_troubletickets'"); + +//In 503 we are using
    tags for line breaks in Inventory Notification mails. In 504 it is not necessary. +//this code will get the contents from db and then convert all
    character with \n and again update in db. +$result=$adb->query("select notificationid,notificationbody from vtiger_inventorynotification"); + +for($i=0;$i<$adb->num_rows($result);$i++) +{ + $body=decode_html($adb->query_result($result,$i,'notificationbody')); + $body=str_replace('
    ','\n', $body); + $notificationid=$adb->query_result($result,$i,'notificationid'); + $adb->pquery("update vtiger_inventorynotification set notificationbody=? where notificationid=?", array($body, $notificationid)); +} +//Added by Asha for #4826 +ExecuteQuery("update vtiger_pricebook set active=0 where active is null"); + +$migrationlog->debug("\n\nDB Changes from 5.0.3 to 5.0.4 RC-------- Ends \n\n"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Migration/DBChanges/503rc2_to_503.php b/oss/vtiger/trunk/modules/Migration/DBChanges/503rc2_to_503.php new file mode 100644 index 00000000..6945c924 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/DBChanges/503rc2_to_503.php @@ -0,0 +1,853 @@ +debug("\n\nDB Changes from 5.0.3RC2 to 5.0.3 -------- Starts \n\n"); + +$query_array = Array( + //description field added in vtiger_inventoryproductrel + "alter table vtiger_inventoryproductrel add column description TEXT default NULL after comment", + + //size increased for comment field + "alter table vtiger_inventoryproductrel change comment comment varchar(250)", + + //size increased for tax and discount related fields in Inventory modules + "alter table vtiger_purchaseorder change salestax salestax decimal(25,3)", + "alter table vtiger_purchaseorder change adjustment adjustment decimal(25,3)", + "alter table vtiger_purchaseorder change salescommission salescommission decimal(25,3)", + "alter table vtiger_purchaseorder change exciseduty exciseduty decimal(25,3)", + "alter table vtiger_purchaseorder change total total decimal(25,3)", + "alter table vtiger_purchaseorder change subtotal subtotal decimal(25,3)", + "alter table vtiger_purchaseorder change discount_percent discount_percent decimal(25,3)", + "alter table vtiger_purchaseorder change discount_amount discount_amount decimal(25,3)", + "alter table vtiger_purchaseorder change s_h_amount s_h_amount decimal(25,3)", + + "alter table vtiger_salesorder change salestax salestax decimal(25,3)", + "alter table vtiger_salesorder change adjustment adjustment decimal(25,3)", + "alter table vtiger_salesorder change salescommission salescommission decimal(25,3)", + "alter table vtiger_salesorder change exciseduty exciseduty decimal(25,3)", + "alter table vtiger_salesorder change total total decimal(25,3)", + "alter table vtiger_salesorder change subtotal subtotal decimal(25,3)", + "alter table vtiger_salesorder change discount_percent discount_percent decimal(25,3)", + "alter table vtiger_salesorder change discount_amount discount_amount decimal(25,3)", + "alter table vtiger_salesorder change s_h_amount s_h_amount decimal(25,3)", + + "alter table vtiger_invoice change salestax salestax decimal(25,3)", + "alter table vtiger_invoice change adjustment adjustment decimal(25,3)", + "alter table vtiger_invoice change salescommission salescommission decimal(25,3)", + "alter table vtiger_invoice change exciseduty exciseduty decimal(25,3)", + "alter table vtiger_invoice change total total decimal(25,3)", + "alter table vtiger_invoice change subtotal subtotal decimal(25,3)", + "alter table vtiger_invoice change discount_percent discount_percent decimal(25,3)", + "alter table vtiger_invoice change discount_amount discount_amount decimal(25,3)", + "alter table vtiger_invoice change s_h_amount s_h_amount decimal(25,3)", + + "alter table vtiger_quotes change subtotal subtotal decimal(25,3)", + "alter table vtiger_quotes change tax tax decimal(25,3)", + "alter table vtiger_quotes change adjustment adjustment decimal(25,3)", + "alter table vtiger_quotes change total total decimal(25,3)", + "alter table vtiger_quotes change discount_percent discount_percent decimal(25,3)", + "alter table vtiger_quotes change discount_amount discount_amount decimal(25,3)", + "alter table vtiger_quotes change s_h_amount s_h_amount decimal(25,3)", + + "alter table vtiger_pricebookproductrel change listprice listprice decimal(25,3)", + + "alter table vtiger_inventoryproductrel change listprice listprice decimal(25,3)", + + "alter table vtiger_products change unit_price unit_price decimal(25,2)", + + "alter table vtiger_campaign change expectedrevenue expectedrevenue decimal(25,3)", + "alter table vtiger_campaign change budgetcost budgetcost decimal(25,3)", + "alter table vtiger_campaign change actualcost actualcost decimal(25,3)", + "alter table vtiger_campaign change expectedroi expectedroi decimal(25,3)", + "alter table vtiger_campaign change actualroi actualroi decimal(25,3)", + + //unwanted currency column removed from lead and contact + "alter table vtiger_leadsubdetails drop column currency", + + "alter table vtiger_contactdetails drop column currency", + + //Amount and probability field datatype modified.(http://forums.vtiger.com/viewtopic.php?t=14006) + + "alter table vtiger_potential change probability probability decimal(5,2)", + "alter table vtiger_potential change amount amount decimal(12,2)", + + //Homepage order has been changed + "update vtiger_users set homeorder = 'HDB,ALVT,PLVT,QLTQ,CVLVT,HLT,OLV,GRT,OLTSO,ILTI,MNL,OLTPO,LTFAQ'", + + ); + +foreach($query_array as $query) +{ + ExecuteQuery($query); +} + +//Added to avoid migration error. +//Check for the table availability before alter. +$exists1=$adb->query("show create table vtiger_opportunitystage"); +if($exists1) +{ + ExecuteQuery("alter table vtiger_opportunitystage change probability probability decimal(5,2)"); +} + +$exists2=$adb->query("show create table vtiger_dealintimation"); +if($exists2) +{ + ExecuteQuery("alter table vtiger_dealintimation change dealprobability dealprobability decimal(5,2)"); +} + +$exists3=$adb->query("show create table vtiger_potstagehistory"); +if($exists3) +{ + ExecuteQuery("alter table vtiger_potstagehistory change probability probability decimal(5,2)"); + ExecuteQuery("alter table vtiger_potstagehistory change amount amount decimal(12,2)"); +} +//Check ends + +//Added for Custom Invoice Number, No need for security population +//Invoice Number has been set the uitype as 3 which is a new UI type. user can configure but non editable +$newfieldid = $adb->getUniqueID("vtiger_field"); +ExecuteQuery("insert into vtiger_field values(23,".$newfieldid.",'invoice_no','vtiger_invoice',1,'3','invoice_no','Invoice No',1,0,0,100,3,69,1,'V~M',1,NULL,'BAS')"); +//Populate security entries for this new field +$profileresult = $adb->query("select * from vtiger_profile"); +$countprofiles = $adb->num_rows($profileresult); +for($i=0;$i<$countprofiles;$i++) +{ + $profileid = $adb->query_result($profileresult,$i,'profileid'); + $sqlProf2FieldInsert[$i] = 'insert into vtiger_profile2field values ('.$profileid.',23,'.$newfieldid.',0,1)'; + ExecuteQuery($sqlProf2FieldInsert[$i]); +} +$def_query = "insert into vtiger_def_org_field values (23,".$newfieldid.",0,1)"; +ExecuteQuery($def_query); + +ExecuteQuery("alter table vtiger_invoice add column (invoice_no varchar(50) UNIQUE default NULL)"); + +$res = $adb->query("select cvid from vtiger_customview where entitytype='Invoice' and viewname='All'"); +$cvid = $adb->query_result($res,0,'cvid'); + +ExecuteQuery("update vtiger_cvcolumnlist set columnindex=6 where columnindex=5 and cvid=$cvid"); +ExecuteQuery("update vtiger_cvcolumnlist set columnindex=5 where columnindex=4 and cvid=$cvid"); +ExecuteQuery("update vtiger_cvcolumnlist set columnindex=4 where columnindex=3 and cvid=$cvid"); +ExecuteQuery("update vtiger_cvcolumnlist set columnindex=3 where columnindex=2 and cvid=$cvid"); +ExecuteQuery("update vtiger_cvcolumnlist set columnindex=2 where columnindex=1 and cvid=$cvid"); +ExecuteQuery("insert into vtiger_cvcolumnlist values($cvid,1,'vtiger_invoice:invoice_no:invoice_no:Invoice_invoice_no:V')"); + +//Added for product custom view taxclass issue Ticket #3364 +ExecuteQuery("update vtiger_field set tablename='vtiger_products' where tablename='vtiger_producttaxrel' and columnname='taxclass'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_products:taxclass:taxclass:Products_Tax_Class:V' where columnname='vtiger_producttaxrel:taxclass:taxclass:Products_Tax_Class:V'"); + + + + +//Display type 3 added in profile & default org tables + +$profileresult = $adb->query("select * from vtiger_profile"); +$countprofiles = $adb->num_rows($profileresult); + +$res = $adb->query("select * from vtiger_field where fieldid not in (select fieldid from vtiger_profile2field) and generatedtype=1 and displaytype=3 and tabid!=29"); +//$res = $adb->query("select * from vtiger_field where generatedtype=1 and displaytype=3 and tabid!=29"); +$num_fields = $adb->num_rows($res); +for($i=0;$i<$num_fields;$i++) +{ + $tabid = $adb->query_result($res,$i,'tabid'); + $fieldid = $adb->query_result($res,$i,'fieldid'); + + //For each profile, we have to enter the current fields + for ($j=0;$j<$countprofiles;$j++) + { + $profileid = $adb->query_result($profileresult,$j,'profileid'); + ExecuteQuery('insert into vtiger_profile2field values ('.$profileid.','.$tabid.','.$fieldid.',0,1)'); + } + + $def_query = "insert into vtiger_def_org_field values (".$tabid.",".$fieldid.",0,1)"; + ExecuteQuery($def_query); +} + + +$query_array2 = Array( + + //Added To fix Duplicate items in Report's Select Column(ticket #3665) + + "update vtiger_field set fieldlabel='Adjustment' where tabid=22 and columnname='adjustment'", + + "update vtiger_field set fieldlabel='Sub Total' where tabid=22 and columnname='subtotal'", + + "update vtiger_field set fieldlabel='Adjustment' where tabid=23 and columnname='adjustment'", + + "update vtiger_field set fieldlabel='Sales Tax' where tabid=20 and columnname='tax'", + + // Changes made to make discontinued column in vtiger_products '0' during deactivation. + + "alter table vtiger_products modify discontinued int(1) NOT NULL default 0", + + "UPDATE vtiger_products SET discontinued=1 WHERE discontinued IS NULL", + + //Ref : ticket#3278, 3309, 3461 + "update vtiger_field set typeofdata='E~O' where fieldname in ('yahooid','yahoo_id')", + "alter table vtiger_leaddetails modify noofemployees int(50)", + "update vtiger_field set typeofdata='I~O' where fieldname ='noofemployees' && tabid='7'", + + //Ref : ticket#3521 + "update vtiger_field set typeofdata ='D~O' where tabid=21 && fieldname='duedate'", + + + //Changes made to add an email Id for standarduser since a user must have an Email Id.Changes for 5.0.3. + "update vtiger_users set email1='standarduser@vtigeruser.com' where id = '2' and email1 = ''", + + + //#3668, this query is already available in the file modules/Migration/DBChanges/42P2_to_50.php + "update vtiger_crmentity set setype='Calendar' where setype='Activities'", + + //we don't have field security for Emails module, so we can delete the existing entries + "delete from vtiger_profile2field where tabid=10", + "delete from vtiger_def_org_field where tabid=10", + ); + +foreach($query_array2 as $query) +{ + ExecuteQuery($query); +} + + +//change the picklist - presence value ie., if presence = 0 then you cannot edit, if presence = 1 then you can edit +$noneditable_tables = Array("ticketstatus","taskstatus","eventstatus","eventstatus","faqstatus","quotestage","postatus","sostatus","invoicestatus"); +$noneditable_values = Array( + "sales_stage"=>"Closed Won", + ); +foreach($noneditable_tables as $picklistname) +{ + //we have to interchange 0 and 1, so change 0->2, 1->0, 2->1 + ExecuteQuery("UPDATE vtiger_".$picklistname." SET PRESENCE=2 WHERE PRESENCE=0"); + ExecuteQuery("UPDATE vtiger_".$picklistname." SET PRESENCE=0 WHERE PRESENCE=1"); + ExecuteQuery("UPDATE vtiger_".$picklistname." SET PRESENCE=1 WHERE PRESENCE=2"); +} +foreach($noneditable_values as $picklistname => $value) +{ + ExecuteQuery("UPDATE vtiger_".$picklistname." SET PRESENCE=0 WHERE $picklistname='".$value."'"); +} + +//Assigned To value is shown as empty in Accounts, Emails and PO listviews because of uitype 52 +ExecuteQuery("update vtiger_field set uitype=53 where fieldname='assigned_user_id' and tabid in (6,10,21)"); + +//AccountName is shown as empty in SO/Quotes/Invoice listview because of account details in vtiger_cvcolumnlist.columnname +$modules_array = Array("SalesOrder","Quotes","Invoice","Contacts","Potentials"); +foreach($modules_array as $module) +{ + ExecuteQuery("update vtiger_cvcolumnlist inner join vtiger_customview on vtiger_customview.cvid=vtiger_cvcolumnlist.cvid set columnname='vtiger_account:accountname:accountname:".$module."_Account_Name:V' where columnname like '%:accountid:account_id:%' and vtiger_customview.entitytype='".$module."'"); +} + +//Previously PurchaseOrder was named as Order. Now we have to change the entitytype from Orders to PurchaseOrder +ExecuteQuery("update vtiger_customview set entitytype='PurchaseOrder' where entitytype='Orders'"); + +//ContactName is shown as empty in SO/Quotes/Invoice listview because of contact details in vtiger_cvcolumnlist.columnname +$modules_array = Array("SalesOrder","Quotes","Invoice","PurchaseOrder","Notes","Calendar"); +foreach($modules_array as $module) +{ + ExecuteQuery("update vtiger_cvcolumnlist inner join vtiger_customview on vtiger_customview.cvid=vtiger_cvcolumnlist.cvid set columnname='vtiger_contactdetails:lastname:lastname:".$module."_Contact_Name:V' where columnname like '%:contactid:contact_id:%' and vtiger_customview.entitytype='".$module."'"); +} + +/* +$res = $adb->query("select vtiger_cvcolumnlist.*, vtiger_customview.viewname from vtiger_cvcolumnlist inner join vtiger_customview on vtiger_customview.cvid=vtiger_cvcolumnlist.cvid where columnname like '%:accountid:account_id:%' and vtiger_customview.entitytype='SalesOrder'"); +for($i=0;$i<$adb->num_rows($res);$i++) +{ + $cvid = $adb->query_result($res,$i,'cvid'); + $columnindex = $adb->query_result($res,$i,'columnindex'); + ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_account:accountname:accountname:SalesOrder_Account_Name:V' where cvid=$cvid and columnindex=$columnindex"); +} +*/ + +//ContactName in Calendar listview is a link but record id is empty in link so when we click the link fatal error comes +//ExecuteQuery("update vtiger_cvcolumnlist inner join vtiger_customview on vtiger_customview.cvid=vtiger_cvcolumnlist.cvid set columnname = 'vtiger_cntactivityrel:contactid:contact_id:Calendar_Contact_Name:V' where columnname = 'vtiger_contactdetails:lastname:lastname:Calendar_Contact_Name:V' and vtiger_customview.entitytype='Calendar'"); + +//Related To is not displayed in Calendar Listview +ExecuteQuery("update vtiger_cvcolumnlist inner join vtiger_customview on vtiger_customview.cvid=vtiger_cvcolumnlist.cvid set columnname = 'vtiger_seactivityrel:crmid:parent_id:Calendar_Related_to:V' where columnname = 'vtiger_seactivityrel:crmid:parent_id:Calendar_Related_To:V' and vtiger_customview.entitytype='Calendar'"); + +/* Owner id is set to 1 for modules other than Leads, Helpdesk and Calendar irrespective of whether it is assigned to a group + [ This is done to fix an issue with 4.2.x versions. So resetting the owner id to 0 for other modules if it is assigned to a group */ +ExecuteQuery("update vtiger_crmentity set smownerid=0 where crmid in + (select accountid from vtiger_accountgrouprelation union select campaignid from vtiger_campaigngrouprelation + union select contactid from vtiger_contactgrouprelation union select invoiceid from vtiger_invoicegrouprelation + union select purchaseorderid from vtiger_pogrouprelation union select potentialid from vtiger_potentialgrouprelation + union select quoteid from vtiger_quotegrouprelation union select salesorderid from vtiger_sogrouprelation)"); + +//Change Emails to Webmails in main tabs - My Home Page, Marketing, Support drop down menu +ExecuteQuery("update vtiger_parenttabrel set tabid=28 where tabid=10"); + +//we have to put invoiceid as default Invoice Number for all invoices otherwise we cannot edit the invoices +ExecuteQuery("update vtiger_invoice set invoice_no=invoiceid"); + +//change the typeofdata for Emails fields(Custom Fields) from V~O to E~O +ExecuteQuery("update vtiger_field set typeofdata='E~O' where uitype=13 and typeofdata='V~O'"); + +//set the visible to 0 for the mandatory fields for both profile2field and def_org_share_field +ExecuteQuery("update vtiger_profile2field inner join vtiger_field on vtiger_field.fieldid = vtiger_profile2field.fieldid set visible=0 where uitype in (2,6,22,73,24,81,50,23,16,53,20) or displaytype=3"); +ExecuteQuery("update vtiger_def_org_field inner join vtiger_field on vtiger_field.fieldid = vtiger_def_org_field.fieldid set visible=0 where uitype in (2,6,22,73,24,81,50,23,16,53,20) or displaytype=3"); + +//remove http:// from the website in Accounts (In 5.x we will handle this in code instead of db) +ExecuteQuery("update vtiger_account set website = REPLACE(website,'http://','')"); + +//Change the invoice_no as Invoice No - fieldlabel in field table +ExecuteQuery("update vtiger_field set fieldlabel='Invoice No' where fieldlabel='invoice_no' and tabid='23'"); + +//Change the filter value for Account - Member Of in advance filter +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_account:parentid:account_id:Accounts_Member_Of:V' where columnname='vtiger_account:accountname:accountname:Accounts_Member_Of:V'"); + +//Drop the salestax from Quotes/PO/SO/Invoice which is unwanted field +ExecuteQuery("delete from vtiger_field where fieldname in ('txtTax') and tabid in (20,21,22,23)"); +ExecuteQuery("alter table vtiger_quotes drop column tax"); +ExecuteQuery("alter table vtiger_purchaseorder drop column salestax"); +ExecuteQuery("alter table vtiger_salesorder drop column salestax"); +ExecuteQuery("alter table vtiger_invoice drop column salestax"); + +//Contact Name is not shown in Notes ListView because of cvcolumnlist entry as now we need lastname in the query result +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_contactdetails:lastname:lastname:Notes_Contact_Name:V' where columnname='vtiger_notes:contact_id:contact_id:Notes_Contact_Name:I'"); + +//Missed Activity History entry in Potential related list has been added +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",2,9,'get_history',8,'Activity History',0)"); + +//Change the commission rate from decimal(3,3) to decimal(7,3) in products +ExecuteQuery("alter table vtiger_products modify column commissionrate decimal(7,3)"); + +//In inventory notification mails, line breaks are not propter. we have to replace \n with
    +$res = $adb->query("select notificationid, notificationbody from vtiger_inventorynotification"); +for($i=0;$i<$adb->num_rows($res);$i++) +{ + $notificationid = $adb->query_result($res,$i,'notificationid'); + $notificationbody = $adb->query_result($res,$i,'notificationbody'); + //Replace \n with
    + $notificationbody = str_replace("\n","
    ",$notificationbody); + ExecuteQuery("update vtiger_inventorynotification set notificationbody='$notificationbody' where notificationid=$notificationid"); +} + +//Move all the Potential custom fields into corresponding block(2) as they are placed in description block +ExecuteQuery("update vtiger_field set block=(select blockid from vtiger_blocks where tabid=2 and blocklabel='LBL_CUSTOM_INFORMATION') where tabid=2 and fieldname like 'cf_%'"); + +//Calendar - End Time fieldlabel has one extra space so that it comes twice in columns list in customview creation +ExecuteQuery("update vtiger_field set fieldlabel='End Time' where tabid=9 and fieldname='time_end'"); + +//change the cntactivityrel table primary key, add relatedlist entries then only related to, contact will be displayed +$adb->query("alter table vtiger_cntactivityrel drop primary key"); +$adb->query("alter table vtiger_cntactivityrel add primary key (contactid, activityid), ENGINE=InnoDB"); +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",9,0,'get_users',1,'Users',0)"); +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",9,4,'get_contacts',2,'Contacts',0)"); + +//Added activity history and Invoice status history in Invoice relatedlist +ExecuteQuery("insert into vtiger_relatedlists values (".$adb->getUniqueID('vtiger_relatedlists').",23,9,'get_history',3,'Activity History',0), (".$adb->getUniqueID('vtiger_relatedlists').",23,0,'get_invoicestatushistory',4,'Invoice Status History',0)"); + +//Changed the activity reminder notification as active +ExecuteQuery("update vtiger_notificationscheduler set active=1 where schedulednotificationname='LBL_ACTIVITY_REMINDER_DESCRIPTION'"); + +//Change Event Status values Planned, Held, Not Held as non editable +ExecuteQuery("update vtiger_eventstatus set presence=0 where eventstatus in ('Planned','Held','Not Held')"); + +//If engine is MyISAM then order is changing regularly so we have to change the engine to InnoDB +ExecuteQuery("alter table vtiger_industry engine=InnoDB"); +ExecuteQuery("alter table vtiger_industry modify column industry varchar(200) NOT NULL"); +$adb->query("alter table vtiger_industry drop index Industry_UK0"); +$adb->query("alter table vtiger_industry add UNIQUE index industry_industry_idx(industry)"); + +//we have removed contactid from products so that in cvcolumnlist we have to remove this column +ExecuteQuery("delete from vtiger_cvcolumnlist where columnname='vtiger_products:contactid:contact_id:Products_Contact_Name:I'"); + +//Make the Closed Lost as non editable in Sales Stage +ExecuteQuery("update vtiger_sales_stage set presence=0 where sales_stage='Closed Lost'"); + +//Added to fix the issues in group to entity relationship +$adb->query("DELETE FROM vtiger_leadgrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_leadgrouprelation DROP FOREIGN KEY fk_1_vtiger_leadgrouprelation"); +$adb->query("ALTER TABLE vtiger_leadgrouprelation DROP FOREIGN KEY fk_2_vtiger_leadgrouprelation"); + +$adb->query("DELETE FROM vtiger_accountgrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_accountgrouprelation DROP FOREIGN KEY fk_1_vtiger_accountgrouprelation"); +$adb->query("ALTER TABLE vtiger_accountgrouprelation DROP FOREIGN KEY fk_2_vtiger_accountgrouprelation"); + +$adb->query("DELETE FROM vtiger_contactgrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_contactgrouprelation DROP FOREIGN KEY fk_1_vtiger_contactgrouprelation"); +$adb->query("ALTER TABLE vtiger_contactgrouprelation DROP FOREIGN KEY fk_2_vtiger_contactgrouprelation"); + +$adb->query("DELETE FROM vtiger_potentialgrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_potentialgrouprelation DROP FOREIGN KEY fk_1_vtiger_potentialgrouprelation"); +$adb->query("ALTER TABLE vtiger_potentialgrouprelation DROP FOREIGN KEY fk_2_vtiger_potentialgrouprelation"); + +$adb->query("DELETE FROM vtiger_campaigngrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_campaigngrouprelation DROP FOREIGN KEY fk_1_vtiger_campaigngrouprelation"); +$adb->query("ALTER TABLE vtiger_campaigngrouprelation DROP FOREIGN KEY fk_2_vtiger_campaigngrouprelation"); + +$adb->query("DELETE FROM vtiger_activitygrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_activitygrouprelation DROP FOREIGN KEY fk_1_vtiger_activitygrouprelation"); +$adb->query("ALTER TABLE vtiger_activitygrouprelation DROP FOREIGN KEY fk_2_vtiger_activitygrouprelation"); + +$adb->query("DELETE FROM vtiger_ticketgrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_ticketgrouprelation DROP FOREIGN KEY fk_1_vtiger_ticketgrouprelation"); +$adb->query("ALTER TABLE vtiger_ticketgrouprelation DROP FOREIGN KEY fk_2_vtiger_ticketgrouprelation"); + +$adb->query("DELETE FROM vtiger_sogrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_sogrouprelation DROP FOREIGN KEY fk_1_vtiger_sogrouprelation"); +$adb->query("ALTER TABLE vtiger_sogrouprelation DROP FOREIGN KEY fk_2_vtiger_sogrouprelation"); + +$adb->query("DELETE FROM vtiger_quotegrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_quotegrouprelation DROP FOREIGN KEY fk_1_vtiger_quotegrouprelation"); +$adb->query("ALTER TABLE vtiger_quotegrouprelation DROP FOREIGN KEY fk_2_vtiger_quotegrouprelation"); + +$adb->query("DELETE FROM vtiger_pogrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_pogrouprelation DROP FOREIGN KEY fk_1_vtiger_pogrouprelation"); +$adb->query("ALTER TABLE vtiger_pogrouprelation DROP FOREIGN KEY fk_2_vtiger_pogrouprelation"); + +$adb->query("DELETE FROM vtiger_invoicegrouprelation where groupname is NULL or groupname = ''"); +$adb->query("ALTER TABLE vtiger_invoicegrouprelation DROP FOREIGN KEY fk_1_vtiger_invoicegrouprelation"); +$adb->query("ALTER TABLE vtiger_invoicegrouprelation DROP FOREIGN KEY fk_2_vtiger_invoicegrouprelation"); + + + + +ExecuteQuery("ALTER TABLE vtiger_leadgrouprelation ADD CONSTRAINT fk_1_vtiger_leadgrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_leadgrouprelation ADD CONSTRAINT fk_2_vtiger_leadgrouprelation FOREIGN KEY (leadid) REFERENCES vtiger_leaddetails(leadid) ON DELETE CASCADE"); + +ExecuteQuery("ALTER TABLE vtiger_accountgrouprelation ADD CONSTRAINT fk_1_vtiger_accountgrouprelation FOREIGN KEY (accountid) REFERENCES vtiger_account(accountid) ON DELETE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_accountgrouprelation ADD CONSTRAINT fk_2_vtiger_accountgrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); + +ExecuteQuery("ALTER TABLE vtiger_contactgrouprelation ADD CONSTRAINT fk_1_vtiger_contactgrouprelation FOREIGN KEY (contactid) REFERENCES vtiger_contactdetails(contactid) ON DELETE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_contactgrouprelation ADD CONSTRAINT fk_2_vtiger_contactgrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); + +ExecuteQuery("ALTER TABLE vtiger_potentialgrouprelation ADD CONSTRAINT fk_1_vtiger_potentialgrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_potentialgrouprelation ADD CONSTRAINT fk_2_vtiger_potentialgrouprelation FOREIGN KEY (potentialid) REFERENCES vtiger_potential(potentialid) ON DELETE CASCADE"); + +ExecuteQuery("ALTER TABLE vtiger_campaigngrouprelation ADD CONSTRAINT fk_1_vtiger_campaigngrouprelation FOREIGN KEY (campaignid) REFERENCES vtiger_campaign(campaignid) ON DELETE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_campaigngrouprelation ADD CONSTRAINT fk_2_vtiger_campaigngrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); + +ExecuteQuery("ALTER TABLE vtiger_activitygrouprelation ADD CONSTRAINT fk_1_vtiger_activitygrouprelation FOREIGN KEY (activityid) REFERENCES vtiger_activity(activityid) ON DELETE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_activitygrouprelation ADD CONSTRAINT fk_2_vtiger_activitygrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); + +ExecuteQuery("ALTER TABLE vtiger_ticketgrouprelation ADD CONSTRAINT fk_1_vtiger_ticketgrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_ticketgrouprelation ADD CONSTRAINT fk_2_vtiger_ticketgrouprelation FOREIGN KEY (ticketid) REFERENCES vtiger_troubletickets(ticketid) ON DELETE CASCADE"); + +ExecuteQuery("ALTER TABLE vtiger_sogrouprelation ADD CONSTRAINT fk_1_vtiger_sogrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_sogrouprelation ADD CONSTRAINT fk_2_vtiger_sogrouprelation FOREIGN KEY (salesorderid) REFERENCES vtiger_salesorder(salesorderid) ON DELETE CASCADE"); + +ExecuteQuery("ALTER TABLE vtiger_quotegrouprelation ADD CONSTRAINT fk_1_vtiger_quotegrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_quotegrouprelation ADD CONSTRAINT fk_2_vtiger_quotegrouprelation FOREIGN KEY (quoteid) REFERENCES vtiger_quotes(quoteid) ON DELETE CASCADE"); + + +ExecuteQuery("ALTER TABLE vtiger_pogrouprelation ADD CONSTRAINT fk_1_vtiger_pogrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_pogrouprelation ADD CONSTRAINT fk_2_vtiger_pogrouprelation FOREIGN KEY (purchaseorderid) REFERENCES vtiger_purchaseorder(purchaseorderid) ON DELETE CASCADE"); + + +ExecuteQuery("ALTER TABLE vtiger_invoicegrouprelation ADD CONSTRAINT fk_1_vtiger_invoicegrouprelation FOREIGN KEY (groupname) REFERENCES vtiger_groups(groupname) ON UPDATE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_invoicegrouprelation ADD CONSTRAINT fk_2_vtiger_invoicegrouprelation FOREIGN KEY (invoiceid) REFERENCES vtiger_invoice(invoiceid) ON DELETE CASCADE"); + +//For emails listview, we have to update the column sender +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_crmentity:smownerid:assigned_user_id:Emails_Sender:V' where columnname='vtiger_crmentity:smownerid:assigned_user_id:Emails_Assigned_To:V'"); + +//if is_admin is set as 0 then we have to update as off and update status as Active if the status is NULL +ExecuteQuery("update vtiger_users set is_admin='off' where is_admin='0'"); +ExecuteQuery("update vtiger_users set status='Active' where status is NULL"); + +//Update the City, State, Zip and Country to Mailing City, State, Zip and Country +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_contactaddress:mailingcity:mailingcity:Contacts_Mailing_City:V' where columnname='vtiger_contactaddress:mailingcity:mailingcity:Contacts_City:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_contactaddress:mailingstate:mailingstate:Contacts_Mailing_State:V' where columnname='vtiger_contactaddress:mailingstate:mailingstate:Contacts_State:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_contactaddress:mailingzip:mailingzip:Contacts_Mailing_Zip:V' where columnname='vtiger_contactaddress:mailingzip:mailingzip:Contacts_Zip:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_contactaddress:mailingcountry:mailingcountry:Contacts_Mailing_Country:V' where columnname='vtiger_contactaddress:mailingcountry:mailingcountry:Contacts_Country:V'"); + +//Added Attachments and Quote stage history in Quotes relatedlist +ExecuteQuery("update vtiger_relatedlists set sequence=4 where tabid=20 and name='get_history'"); +ExecuteQuery("insert into vtiger_relatedlists values (".$adb->getUniqueID('vtiger_relatedlists').",20,0,'get_attachments',3,'Attachments',0), (".$adb->getUniqueID('vtiger_relatedlists').",20,0,'get_quotestagehistory',5,'Quote Stage History',0)"); + +//Added SalesOrder Status History in SalesOrder relatedlist +ExecuteQuery("insert into vtiger_relatedlists values (".$adb->getUniqueID('vtiger_relatedlists').",22,0,'get_sostatushistory',5,'SalesOrder Status History',0)"); + +//Added PurchaseOrder Status History in PurchaseOrder relatedlist +ExecuteQuery("insert into vtiger_relatedlists values (".$adb->getUniqueID('vtiger_relatedlists').",21,0,'get_postatushistory',4,'PurchaseOrder Status History',0)"); + +//Update SalesOrder Id as SalesOrder No for default All SalesOrder customview (only All customview has this field) +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_crmentity:crmid::SalesOrder_Order_No:I' where columnname='vtiger_crmentity:crmid::SalesOrder_Order_Id:I'"); + +//Update PurchaseOrder Id as Purchase No for default All PurchaseOrder customview (only All customview has this field) +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_crmentity:crmid::PurchaseOrder_Order_No:I' where columnname='vtiger_crmentity:crmid::PurchaseOrder_Order_Id:I'"); + + + + + + +$query = "select * from vtiger_emaildetails"; +$result = $adb->query($query); +$find_array = Array('<','>'); +$replace_array = Array('<','>'); +for($i = 0; $i < $adb->num_rows($result); $i++) +{ + $emailID = $adb->query_result($result,$i,'emailid'); + $from_email = $adb->query_result($result,$i,'from_email'); + $to_email = $adb->query_result($result,$i,'to_email'); + $cc_email = $adb->query_result($result,$i,'cc_email'); + $bcc_email = $adb->query_result($result,$i,'bcc_email'); + $assigned_user_email = $adb->query_result($result,$i,'assigned_user_email'); + $replace_from_email = str_replace($find_array,$replace_array,$from_email); + $replace_to_email = str_replace($find_array,$replace_array,$to_email); + $replace_cc_email = str_replace($find_array,$replace_array,$cc_email); + $replace_bcc_email = str_replace($find_array,$replace_array,$bcc_email); + $replace_assigned_user_email = str_replace($find_array,$replace_array,$assigned_user_email); + $query = "update vtiger_emaildetails set from_email='".$replace_from_email."', to_email='".$replace_to_email."', cc_email='".$replace_cc_email."' ,bcc_email='".$assigned_user_email."' where emailid=".$emailID; + //echo $query.'
    '; + ExecuteQuery($query); +} + +ExecuteQuery("delete from vtiger_selectcolumn where columnname='vtiger_contactdetailsProducts:lastname:Products_Contact_Name:contact_id:I'"); +ExecuteQuery("delete from vtiger_selectcolumn where columnname='vtiger_invoice:notes:Invoice_Notes:notes:V'"); +ExecuteQuery("delete from vtiger_selectcolumn where columnname='vtiger_invoice:invoiceterms:Invoice_Invoice_Terms:invoiceterms:V'"); + +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_leaddetails:email:Leads_Email:email:V' where columnname='vtiger_leaddetails:email:Leads_Email:email:E'"); + + + +//to remove Export from Emails Module Under Profiles +ExecuteQuery("delete from vtiger_profile2utility where tabid=10"); + + +//ALTER TABLE Queries + +ExecuteQuery("alter table vtiger_accountbillads change column city bill_city varchar(30)"); +ExecuteQuery("alter table vtiger_accountbillads change column code bill_code varchar(30)"); +ExecuteQuery("alter table vtiger_accountbillads change column country bill_country varchar(30)"); +ExecuteQuery("alter table vtiger_accountbillads change column state bill_state varchar(30)"); +ExecuteQuery("alter table vtiger_accountbillads change column street bill_street varchar(250)"); +ExecuteQuery("alter table vtiger_accountbillads change column pobox bill_pobox varchar(30)"); + +ExecuteQuery("alter table vtiger_accountshipads change column city ship_city varchar(30)"); +ExecuteQuery("alter table vtiger_accountshipads change column code ship_code varchar(30)"); +ExecuteQuery("alter table vtiger_accountshipads change column country ship_country varchar(30)"); +ExecuteQuery("alter table vtiger_accountshipads change column state ship_state varchar(30)"); +ExecuteQuery("alter table vtiger_accountshipads change column street ship_street varchar(250)"); +ExecuteQuery("alter table vtiger_accountshipads change column pobox ship_pobox varchar(30)"); + + +//Field Table Update Queries +ExecuteQuery("update vtiger_field set columnname='bill_city' where columnname='city' and tablename='vtiger_accountbillads'"); +ExecuteQuery("update vtiger_field set columnname='bill_code' where columnname='code' and tablename='vtiger_accountbillads'"); +ExecuteQuery("update vtiger_field set columnname='bill_country' where columnname='country' and tablename='vtiger_accountbillads'"); +ExecuteQuery("update vtiger_field set columnname='bill_state' where columnname='state' and tablename='vtiger_accountbillads'"); +ExecuteQuery("update vtiger_field set columnname='bill_street' where columnname='street' and tablename='vtiger_accountbillads'"); +ExecuteQuery("update vtiger_field set columnname='bill_pobox' where columnname='pobox' and tablename='vtiger_accountbillads'"); + + +ExecuteQuery("update vtiger_field set columnname='ship_city' where columnname='city' and tablename='vtiger_accountshipads'"); +ExecuteQuery("update vtiger_field set columnname='ship_code' where columnname='code' and tablename='vtiger_accountshipads'"); +ExecuteQuery("update vtiger_field set columnname='ship_country' where columnname='country' and tablename='vtiger_accountshipads'"); +ExecuteQuery("update vtiger_field set columnname='ship_state' where columnname='state' and tablename='vtiger_accountshipads'"); +ExecuteQuery("update vtiger_field set columnname='ship_street' where columnname='street' and tablename='vtiger_accountshipads'"); +ExecuteQuery("update vtiger_field set columnname='ship_pobox' where columnname='pobox' and tablename='vtiger_accountshipads'"); + + +//CustomView Queries +//Available in Populate CustomView.php so migration for that particular field +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountbillads:bill_city:bill_city:Accounts_Billing_City:V' where columnname='vtiger_accountbillads:city:bill_city:Accounts_City:V'"); + +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountbillads:bill_city:bill_city:Accounts_Billing_City:V' where columnname='vtiger_accountbillads:city:bill_city:Accounts_Billing_City:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountbillads:bill_code:bill_code:Accounts_Billing_Code:V' where columnname='vtiger_accountbillads:code:bill_code:Accounts_Billing_Code:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountbillads:bill_country:bill_country:Accounts_Billing_Country:V' where columnname='vtiger_accountbillads:country:bill_country:Accounts_Billing_Country:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountbillads:bill_state:bill_state:Accounts_Billing_State:V' where columnname='vtiger_accountbillads:state:bill_state:Accounts_Billing_State:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountbillads:bill_street:bill_street:Accounts_Billing_Address:V' where columnname='vtiger_accountbillads:street:bill_street:Accounts_Billing_Address:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountbillads:bill_pobox:bill_pobox:Accounts_Billing_Po_Box:V' where columnname='vtiger_accountbillads:pobox:bill_pobox:Accounts_Billing_Po_Box:V'"); + + + +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountshipads:ship_street:ship_street:Accounts_Shipping_Address:V' where columnname='vtiger_accountshipads:street:ship_street:Accounts_Shipping_Address:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountshipads:ship_pobox:ship_pobox:Accounts_Shipping_Po_Box:V' where columnname='vtiger_accountshipads:pobox:ship_pobox:Accounts_Shipping_Po_Box:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountshipads:ship_city:ship_city:Accounts_Shipping_City:V' where columnname='vtiger_accountshipads:city:ship_city:Accounts_Shipping_City:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountshipads:ship_state:ship_state:Accounts_Shipping_State:V' where columnname='vtiger_accountshipads:state:ship_state:Accounts_Shipping_State:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountshipads:ship_code:ship_code:Accounts_Shipping_Code:V' where columnname='vtiger_accountshipads:code:ship_code:Accounts_Shipping_Code:V'"); +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_accountshipads:ship_country:ship_country:Accounts_Shipping_Country:V' where columnname='vtiger_accountshipads:country:ship_country:Accounts_Shipping_Country:V'"); + +//CustomView Advanced Filter + +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountbillads:bill_city:bill_city:Accounts_Billing_City:V' where columnname='vtiger_accountbillads:city:bill_city:Accounts_Billing_City:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountbillads:bill_code:bill_code:Accounts_Billing_Code:V' where columnname='vtiger_accountbillads:code:bill_code:Accounts_Billing_Code:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountbillads:bill_country:bill_country:Accounts_Billing_Country:V' where columnname='vtiger_accountbillads:country:bill_country:Accounts_Billing_Country:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountbillads:bill_state:bill_state:Accounts_Billing_State:V' where columnname='vtiger_accountbillads:state:bill_state:Accounts_Billing_State:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountbillads:bill_street:bill_street:Accounts_Billing_Address:V' where columnname='vtiger_accountbillads:street:bill_street:Accounts_Billing_Address:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountbillads:bill_pobox:bill_pobox:Accounts_Billing_Po_Box:V' where columnname='vtiger_accountbillads:pobox:bill_pobox:Accounts_Billing_Po_Box:V'"); + + + +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountshipads:ship_street:ship_street:Accounts_Shipping_Address:V' where columnname='vtiger_accountshipads:street:ship_street:Accounts_Shipping_Address:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountshipads:ship_pobox:ship_pobox:Accounts_Shipping_Po_Box:V' where columnname='vtiger_accountshipads:pobox:ship_pobox:Accounts_Shipping_Po_Box:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountshipads:ship_city:ship_city:Accounts_Shipping_City:V' where columnname='vtiger_accountshipads:city:ship_city:Accounts_Shipping_City:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountshipads:ship_state:ship_state:Accounts_Shipping_State:V' where columnname='vtiger_accountshipads:state:ship_state:Accounts_Shipping_State:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountshipads:ship_code:ship_code:Accounts_Shipping_Code:V' where columnname='vtiger_accountshipads:code:ship_code:Accounts_Shipping_Code:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_accountshipads:ship_country:ship_country:Accounts_Shipping_Country:V' where columnname='vtiger_accountshipads:country:ship_country:Accounts_Shipping_Country:V'"); + + +//Reports Columns +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountbillads:bill_country:Accounts_Billing_Country:bill_country:V' where columnname='vtiger_accountbillads:country:Accounts_Billing_Country:bill_country:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountbillads:bill_city:Accounts_Billing_City:bill_city:V' where columnname='vtiger_accountbillads:city:Accounts_Billing_City:bill_city:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountbillads:bill_pobox:Accounts_Billing_Po_Box:bill_pobox:V' where columnname='vtiger_accountbillads:pobox:Accounts_Billing_Po_Box:bill_pobox:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountbillads:bill_street:Accounts_Billing_Address:bill_street:V' where columnname='vtiger_accountbillads:street:Accounts_Billing_Address:bill_street:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountbillads:bill_code:Accounts_Billing_Code:bill_code:V' where columnname='vtiger_accountbillads:code:Accounts_Billing_Code:bill_code:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountbillads:bill_state:Accounts_Billing_State:bill_state:V' where columnname='vtiger_accountbillads:state:Accounts_Billing_State:bill_state:V'"); + + +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountshipads:ship_city:Accounts_Shipping_City:ship_city:V' where columnname='vtiger_accountshipads:city:Accounts_Shipping_City:ship_city:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountshipads:ship_pobox:Accounts_Shipping_Po_Box:ship_pobox:V' where columnname='vtiger_accountshipads:pobox:Accounts_Shipping_Po_Box:ship_pobox:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountshipads:ship_street:Accounts_Shipping_Address:ship_street:V' where columnname='vtiger_accountshipads:street:Accounts_Shipping_Address:ship_street:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountshipads:ship_country:Accounts_Shipping_Country:ship_country:V' where columnname='vtiger_accountshipads:country:Accounts_Shipping_Country:ship_country:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountshipads:ship_code:Accounts_Shipping_Code:ship_code:V' where columnname='vtiger_accountshipads:code:Accounts_Shipping_Code:ship_code:V'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountshipads:ship_state:Accounts_Shipping_State:ship_state:V' where columnname='vtiger_accountshipads:state:Accounts_Shipping_State:ship_state:V'"); + +//Reports Advanced Filter +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountbillads:bill_country:Accounts_Billing_Country:bill_country:V' where columnname='vtiger_accountbillads:country:Accounts_Billing_Country:bill_country:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountbillads:bill_city:Accounts_Billing_City:bill_city:V' where columnname='vtiger_accountbillads:city:Accounts_Billing_City:bill_city:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountbillads:bill_pobox:Accounts_Billing_Po_Box:bill_pobox:V' where columnname='vtiger_accountbillads:pobox:Accounts_Billing_Po_Box:bill_pobox:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountbillads:bill_street:Accounts_Billing_Address:bill_street:V' where columnname='vtiger_accountbillads:street:Accounts_Billing_Address:bill_street:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountbillads:bill_code:Accounts_Billing_Code:bill_code:V' where columnname='vtiger_accountbillads:code:Accounts_Billing_Code:bill_code:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountbillads:bill_state:Accounts_Billing_State:bill_state:V' where columnname='vtiger_accountbillads:state:Accounts_Billing_State:bill_state:V'"); + + +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountshipads:ship_city:Accounts_Shipping_City:ship_city:V' where columnname='vtiger_accountshipads:city:Accounts_Shipping_City:ship_city:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountshipads:ship_pobox:Accounts_Shipping_Po_Box:ship_pobox:V' where columnname='vtiger_accountshipads:pobox:Accounts_Shipping_Po_Box:ship_pobox:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountshipads:ship_street:Accounts_Shipping_Address:ship_street:V' where columnname='vtiger_accountshipads:street:Accounts_Shipping_Address:ship_street:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountshipads:ship_country:Accounts_Shipping_Country:ship_country:V' where columnname='vtiger_accountshipads:country:Accounts_Shipping_Country:ship_country:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountshipads:ship_code:Accounts_Shipping_Code:ship_code:V' where columnname='vtiger_accountshipads:code:Accounts_Shipping_Code:ship_code:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountshipads:ship_state:Accounts_Shipping_State:ship_state:V' where columnname='vtiger_accountshipads:state:Accounts_Shipping_State:ship_state:V'"); + + +//FieldLabel of Phone Field for Contacts has been changed to Other Phone + +ExecuteQuery("update vtiger_field set fieldlabel = 'Other Phone' where tablename='vtiger_contactsubdetails' and columnname='otherphone'"); + +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_contactsubdetails:otherphone:otherphone:Contacts_Other_Phone:V' where columnname='vtiger_contactsubdetails:otherphone:otherphone:Contacts_Phone:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_contactsubdetails:otherphone:otherphone:Contacts_Other_Phone:V' where columnname='vtiger_contactsubdetails:otherphone:otherphone:Contacts_Phone:V'"); + + +//get the values from vtiger_selectcolumn with columnname like 'vtiger_contactdetails%' get the columnname value check for the field Phone and change the FieldLabel from Contacts_Phone to Contacts_Other_Phone -- To be done + +$query1 = "select columnname from vtiger_selectcolumn where columnname like 'vtiger_contactdetails%' and columnname like '%Contacts_Phone%'"; +$result = $adb->query($query1); +for($i = 0;$i < $adb->num_rows($result);$i++) +{ + $columnname = $adb->query_result($result,$i,'columnname'); + $update_columnname = str_replace('Contacts_Phone','Contacts_Other_Phone',$columnname); + $query = "update vtiger_selectcolumn set columnname='$update_columnname' where columnname='$columnname'"; + $adb->query($query); +} + +//get the values from vtiger_relcriteria with columnname like 'vtiger_contactdetails%' get the columnname value check for the field Phone and change the FieldLabel from Contacts_Phone to Contacts_Other_Phone-- To be done +$query1 = "select columnname from vtiger_relcriteria where columnname like 'vtiger_contactdetails%' and columnname like '%Contacts_Phone%'"; +$result = $adb->query($query1); +for($i = 0;$i < $adb->num_rows($result);$i++) +{ + $columnname = $adb->query_result($result,$i,'columnname'); + $update_columnname = str_replace('Contacts_Phone','Contacts_Other_Phone',$columnname); + $query = "update vtiger_relcriteria set columnname='$update_columnname' where columnname='$columnname'"; + $adb->query($query); +} + +//Removed the default value Mr in salutation +ExecuteQuery("alter table vtiger_contactdetails change column salutation salutation varchar(50)"); +ExecuteQuery("update vtiger_campaignstatus set campaignstatus='Completed' where campaignstatus='Complete'"); +ExecuteQuery("update vtiger_crmentity set setype='PurchaseOrder' where setype='Orders'"); +ExecuteQuery("update vtiger_crmentity set setype='PurchaseOrder Attachment' where setype='Orders Attachment'"); +ExecuteQuery("update vtiger_crmentity set setype='Vendors' where setype='Vendor'"); +ExecuteQuery("update vtiger_customview set entitytype='Vendors' where entitytype='Vendor'"); + +//Fixed customview related changes +//Calendar - Related To +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_seactivityrel:crmid:parent_id:Calendar_Related_to:V' where columnname='vtiger_seactivityrel:crmid:parent_id:Calendar_Related_to:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_seactivityrel:crmid:parent_id:Calendar_Related_to:V' where columnname='vtiger_seactivityrel:crmid:parent_id:Calendar_Related_to:I'"); + +//Calendar - Start Date (Date & Time) +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_activity:date_start:date_start:Calendar_Start_Date:DT' where columnname='vtiger_activity:date_start:date_start:Calendar_Start_Date_&_Time:DT' or columnname = 'activity:date_start:date_start:Activities_Start_Date_&_Time:DT'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_activity:date_start:date_start:Calendar_Start_Date:DT' where columnname='vtiger_activity:date_start:date_start:Calendar_Start_Date_&_Time:DT' or columnname = 'activity:date_start:date_start:Activities_Start_Date_&_Time:DT'"); + +//Notes - Related To +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_senotesrel:crmid:parent_id:Notes_Related_to:V' where columnname='vtiger_senotesrel:crmid:parent_id:Notes_Related_to:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_senotesrel:crmid:parent_id:Notes_Related_to:V' where columnname='vtiger_senotesrel:crmid:parent_id:Notes_Related_to:I'"); + +//Notes - Contact Name +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_contactdetails:lastname:lastname:Notes_Contact_Name:V' where columnname='vtiger_notes:contact_id:contact_id:Notes_Contact_Name:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_contactdetails:lastname:lastname:Notes_Contact_Name:V' where columnname='vtiger_notes:contact_id:contact_id:Notes_Contact_Name:V'"); + +//Notes - title +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_notes:title:notes_title:Notes_Title:V' where columnname='vtiger_notes:title:title:Notes_Subject:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_notes:title:notes_title:Notes_Title:V' where columnname='vtiger_notes:title:title:Notes_Subject:V'"); + +//In Products - Related To and Contact should be deleted +ExecuteQuery("delete from vtiger_cvcolumnlist where columnname='vtiger_seproductsrel:crmid:parent_id:Products_Related_to:I'"); +ExecuteQuery("delete from vtiger_cvadvfilter where columnname='vtiger_seproductsrel:crmid:parent_id:Products_Related_to:I'"); +ExecuteQuery("delete from vtiger_cvcolumnlist where columnname='vtiger_products:contactid:contact_id:Products_Contact_Name:I'"); +ExecuteQuery("delete from vtiger_cvadvfilter where columnname='vtiger_products:contactid:contact_id:Products_Contact_Name:I'"); + +//For vendors module we have to update the module name as Vendors from Vendor +$result = $adb->query("select vtiger_cvcolumnlist.cvid, vtiger_cvcolumnlist.columnname from vtiger_customview inner join vtiger_cvcolumnlist on vtiger_customview.cvid = vtiger_cvcolumnlist.cvid where vtiger_customview.entitytype='Vendors' and columnname != ''"); +for($i=0;$i<$adb->num_rows($result);$i++) +{ + $cvid = $adb->query_result($result,$i,'cvid'); + $columnname = $adb->query_result($result,$i,'columnname'); + $new_columnname = str_replace(':Vendor_',':Vendors_',$columnname); + + $adb->query("update vtiger_cvcolumnlist set columnname='$new_columnname' where columnname='$columnname'"); + $adb->query("update vtiger_cvadvfilter set columnname='$new_columnname' where columnname='$columnname'"); +} + +//Vendor - instead of street, treet has been saved previously +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_vendor:street:street:Vendors_Street:V' where columnname='vtiger_vendor:street:treet:Vendors_Street:V'"); + +//Accounts - Other Email +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_account:email2:email2:Accounts_Other_Email:V' where columnname='vtiger_account:email2:email2:Accounts_Other_Email:E'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_account:email2:email2:Accounts_Other_Email:V' where columnname='vtiger_account:email2:email2:Accounts_Other_Email:E'"); + +//Accounts - SIC Code +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_account:siccode:siccode:Accounts_SIC_Code:V' where columnname='vtiger_account:siccode:siccode:Accounts_SIC_Code:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_account:siccode:siccode:Accounts_SIC_Code:V' where columnname='vtiger_account:siccode:siccode:Accounts_SIC_Code:I'"); + +//Account - Member Of +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_account:parentid:account_id:Accounts_Member_Of:V' where columnname='vtiger_account:parentid:account_id:Accounts_Member_Of:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_account:parentid:account_id:Accounts_Member_Of:V' where columnname='vtiger_account:parentid:account_id:Accounts_Member_Of:I'"); + +//Account - Email +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_account:email1:email1:Accounts_Email:V' where columnname='vtiger_account:email1:email1:Accounts_Email:E'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_account:email1:email1:Accounts_Email:V' where columnname='vtiger_account:email1:email1:Accounts_Email:E'"); + +//Contact - Email +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_contactdetails:email:email:Contacts_Email:V' where columnname='vtiger_contactdetails:email:email:Contacts_Email:E'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_contactdetails:email:email:Contacts_Email:V' where columnname='vtiger_contactdetails:email:email:Contacts_Email:E'"); + +//Leads - Email +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_leaddetails:email:email:Leads_Email:V' where columnname='vtiger_leaddetails:email:email:Leads_Email:E'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_leaddetails:email:email:Leads_Email:V' where columnname='vtiger_leaddetails:email:email:Leads_Email:E'"); + +//Tickect - Related To +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_troubletickets:parent_id:parent_id:HelpDesk_Related_to:V' where columnname='vtiger_troubletickets:parent_id:parent_id:HelpDesk_Related_to:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_troubletickets:parent_id:parent_id:HelpDesk_Related_to:V' where columnname='vtiger_troubletickets:parent_id:parent_id:HelpDesk_Related_to:I'"); + +//Ticket - Product Name +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_troubletickets:product_id:product_id:HelpDesk_Product_Name:V' where columnname='vtiger_troubletickets:product_id:product_id:HelpDesk_Product_Name:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_troubletickets:product_id:product_id:HelpDesk_Product_Name:V' where columnname='vtiger_troubletickets:product_id:product_id:HelpDesk_Product_Name:I'"); + +//Invoice - Sales Order +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_invoice:salesorderid:salesorder_id:Invoice_Sales_Order:V' where columnname='vtiger_invoice:salesorderid:salesorder_id:Invoice_Sales_Order:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_invoice:salesorderid:salesorder_id:Invoice_Sales_Order:V' where columnname='vtiger_invoice:salesorderid:salesorder_id:Invoice_Sales_Order:I'"); + +//Product - Active +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_products:discontinued:discontinued:Products_Product_Active:C' where columnname='vtiger_products:discontinued:discontinued:Products_Product_Active:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_products:discontinued:discontinued:Products_Product_Active:C' where columnname='vtiger_products:discontinued:discontinued:Products_Product_Active:V'"); + +//Product - Vendor Name +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_products:vendor_id:vendor_id:Products_Vendor_Name:V' where columnname='vtiger_products:vendor_id:vendor_id:Products_Vendor_Name:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_products:vendor_id:vendor_id:Products_Vendor_Name:V' where columnname='vtiger_products:vendor_id:vendor_id:Products_Vendor_Name:I'"); + +//Product - Product Code (Part Number) +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_products:productcode:productcode:Products_Part_Number:V' where columnname='vtiger_products:productcode:productcode:Products_Product_Code:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_products:productcode:productcode:Products_Part_Number:V' where columnname='vtiger_products:productcode:productcode:Products_Product_Code:V'"); + +//Purchase Order - Vendor Name +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_purchaseorder:vendorid:vendor_id:PurchaseOrder_Vendor_Name:V' where columnname='vtiger_purchaseorder:vendorid:vendor_id:PurchaseOrder_Vendor_Name:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_purchaseorder:vendorid:vendor_id:PurchaseOrder_Vendor_Name:V' where columnname='vtiger_purchaseorder:vendorid:vendor_id:PurchaseOrder_Vendor_Name:I'"); + +//Purchase Order - Due Date +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_purchaseorder:duedate:duedate:PurchaseOrder_Due_Date:D' where columnname='vtiger_purchaseorder:duedate:duedate:PurchaseOrder_Due_Date:V'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_purchaseorder:duedate:duedate:PurchaseOrder_Due_Date:D' where columnname='vtiger_purchaseorder:duedate:duedate:PurchaseOrder_Due_Date:V'"); + +//SalesOrder - Potential Name +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_salesorder:potentialid:potential_id:SalesOrder_Potential_Name:V' where columnname='vtiger_salesorder:potentialid:potential_id:SalesOrder_Potential_Name:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_salesorder:potentialid:potential_id:SalesOrder_Potential_Name:V' where columnname='vtiger_salesorder:potentialid:potential_id:SalesOrder_Potential_Name:I'"); + +//SalesOrder - Quote Name +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_salesorder:quoteid:quote_id:SalesOrder_Quote_Name:V' where columnname='vtiger_salesorder:quoteid:quote_id:SalesOrder_Quote_Name:I'"); +ExecuteQuery("update vtiger_cvadvfilter set columnname='vtiger_salesorder:quoteid:quote_id:SalesOrder_Quote_Name:V' where columnname='vtiger_salesorder:quoteid:quote_id:SalesOrder_Quote_Name:I'"); + + +//Products Related To field deleted from vtiger_selectcolumn +ExecuteQuery("delete from vtiger_selectcolumn where columnname ='vtiger_seproductsrel:crmid:Products_Related_To:parent_id:I'"); + +//cvstdfilter table is in MyISAM engine so that the order of diplay will not be same in all time +$adb->query("alter table vtiger_cvstdfilter engine=InnoDB"); + +//we have to set set permission as 3 in vtiger_def_org_share as the Calendar is private +ExecuteQuery("update vtiger_def_org_share set permission=3 where tabid=16"); + + +//Query added to delete custom field entries available only in field table and not in customfield tables +$customtables_array = Array('vtiger_accountscf','vtiger_campaignscf','vtiger_contactscf','vtiger_invoicecf','vtiger_leadscf','vtiger_potentialscf','vtiger_pricebookcf','vtiger_productcf','vtiger_purchaseordercf','vtiger_quotescf','vtiger_salesordercf','vtiger_ticketcf','vtiger_vendorcf'); + +foreach($customtables_array as $customfieldtable) +{ + + $sql = "select fieldname,tablename,columnname,fieldid from vtiger_field where tablename='$customfieldtable'"; + $result = $adb->query($sql); + + $columns=$adb->getColumnNames($customfieldtable); + for($i=0;$i < $adb->num_rows($result); $i++) + { + $columnname = $adb->query_result($result,$i,'columnname'); + if(!in_array($columnname,$columns)) + { + $fieldID = $adb->query_result($result,$i,'fieldid'); + $query = "delete from vtiger_field where fieldid=".$fieldID; + $result1 = $adb->query($query); + } + } +} + + +$tables_array = Array( + "vtiger_cvcolumnlist"=>"columnname", + "vtiger_cvstdfilter"=>"columnname", + "vtiger_cvadvfilter"=>"columnname", + "vtiger_selectcolumn"=>"columnname", + "vtiger_relcriteria"=>"columnname", + "vtiger_reportsortcol"=>"columnname", + "vtiger_reportdatefilter"=>"datecolumnname", + "vtiger_reportsummary"=>"columnname", + ); + + +foreach($tables_array as $tablename => $columnname) +{ + $query = "select $columnname from $tablename where $columnname like '%:cf_%'"; + $result = $adb->query($query); + $noofrows = $adb->num_rows($result); + + for($i=0;$i<$noofrows;$i++) + { + //First get the fieldname from the result + $col_value = $adb->query_result($result,$i,$columnname); + $fieldname = substr($col_value,strpos($col_value,':cf_')+1,6); + + //Now check whether this field is available in field table + $sql1 = "select fieldid from vtiger_field where fieldname='".$fieldname."'"; + $result1 = $adb->query($sql1); + $noofrows1 = $adb->num_rows($result1); + $fieldid = $adb->query_result($result1,0,"fieldid"); + + //if there is no field then we have to delete that field entries + if($noofrows1 == 0 && !isset($fieldid)) + { + //Now we have to delete that customfield from the $tablename + $adb->query("delete from $tablename where $columnname like '%:".$fieldname.":%'"); + } + } +} + + + + + + + +$migrationlog->debug("\n\nDB Changes from 5.0.3RC2 to 5.0.3 -------- Ends \n\n"); + + + +?> diff --git a/oss/vtiger/trunk/modules/Migration/DBChanges/504_to_510rc.php b/oss/vtiger/trunk/modules/Migration/DBChanges/504_to_510rc.php new file mode 100644 index 00000000..e7d44736 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/DBChanges/504_to_510rc.php @@ -0,0 +1,2031 @@ +debug("\n\nDB Changes from 5.0.4 to 5.1.0 RC -------- Starts \n\n"); + +require_once('include/events/include.inc'); +$em = new VTEventsManager($adb); +/* For the event api */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_eventhandlers (eventhandler_id int, event_name varchar(100), handler_path varchar(400), handler_class varchar(100), cond text, is_active boolean, primary key(eventhandler_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_eventhandler_module(eventhandler_module_id int, module_name VARCHAR(100), handler_class VARCHAR(100), PRIMARY KEY(eventhandler_module_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +/* Added new column actions to vtiger_relatedlists which tracks the type of actions allowed for that related list */ +if(!in_array('actions', $adb->getColumnNames('vtiger_relatedlists'))) { + ExecuteQuery("alter table vtiger_relatedlists add column actions VARCHAR(50) default ''"); +} + +$accounts_tab_id = getTabid('Accounts'); +$contacts_tab_id = getTabid('Contacts'); +$notes_tab_id = getTabid('Documents'); +$products_tab_id = getTabid('Products'); +$leads_tab_id = getTabid('Leads'); +$campaigns_tab_id = getTabid('Campaigns'); +$potentials_tab_id = getTabid('Potentials'); +$emails_tab_id = getTabid('Emails'); +$calendar_tab_id = getTabid('Calendar'); +$helpdesk_tab_id = getTabid('HelpDesk'); +$quotes_tab_id = getTabid('Quotes'); +$so_tab_id = getTabid('SalesOrder'); +$po_tab_id = getTabid('PurchaseOrder'); +$invoice_tab_id = getTabid('Invoice'); +$pb_tab_id = getTabid('PriceBooks'); +$vendors_tab_id = getTabid('Vendors'); + +// Accounts related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$accounts_tab_id"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$accounts_tab_id AND related_tabid=$notes_tab_id"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='select' WHERE tabid=$accounts_tab_id AND related_tabid=$products_tab_id"); + +// Leads related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$leads_tab_idAND related_tabid=$notes_tab_id"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$leads_tab_id AND related_tabid IN ($calendar_tab_id,$emails_tab_id)"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='select' WHERE tabid=$leads_tab_id AND related_tabid IN ($products_tab_id,$campaigns_tab_id)"); + +// Contacts related list +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$contacts_tab_id"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$contacts_tab_id AND related_tabid=$notes_tab_id"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='select' WHERE tabid=$contacts_tab_id AND related_tabid IN ($products_tab_id,$campaigns_tab_id)"); + +// Potentials related list +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$potentials_tab_id AND related_tabid IN ($calendar_tab_id,$quotes_tab_id,$so_tab_id)");; +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$potentials_tab_id AND related_tabid=$notes_tab_id"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='select' WHERE tabid=$potentials_tab_id AND related_tabid IN ($products_tab_id,$contacts_tab_id)"); + +// Products related list +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$products_tab_id AND related_tabid IN ($helpdesk_tab_id,$quotes_tab_id,$so_tab_id,$po_tab_id,$invoice_tab_id,$pb_tab_id)");; +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$products_tab_id AND related_tabid=$notes_tab_id"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='select' WHERE tabid=$products_tab_id AND related_tabid IN ($accounts_tab_id,$contacts_tab_id,$leads_tab_id,$potentials_tab_id)"); + +// Emails related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='select,bulkmail' WHERE tabid=$emails_tab_id AND related_tabid=$contacts_tab_id"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$emails_tab_id AND related_tabid=$notes_tab_id"); + +// Trouble Tickets related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$helpdesk_tab_id AND related_tabid IN ($notes_tab_id,$calendar_tab_id)"); + +// Products related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='select' WHERE tabid=$pb_tab_id AND related_tabid IN ($products_tab_id)"); + +// Vendors related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$vendors_tab_id AND related_tabid IN ($emails_tab_id,$po_tab_id)");; +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$vendors_tab_id AND related_tabid=$products_tab_id"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='select' WHERE tabid=$vendors_tab_id AND related_tabid IN ($contacts_tab_id)"); + +// Quotes related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$quotes_tab_id AND related_tabid IN ($notes_tab_id)"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$quotes_tab_id AND related_tabid IN ($calendar_tab_id)"); + +// PO related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$po_tab_id AND related_tabid IN ($notes_tab_id)"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$po_tab_id AND related_tabid IN ($calendar_tab_id)"); + +// SO related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$so_tab_id AND related_tabid IN ($notes_tab_id)"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$so_tab_id AND related_tabid IN ($calendar_tab_id)"); + +// Invoices related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$invoice_tab_id AND related_tabid IN ($notes_tab_id)"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$invoice_tab_id AND related_tabid IN ($calendar_tab_id)"); + +// Campaigns related lists +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select' WHERE tabid=$campaigns_tab_id AND related_tabid IN ($contacts_tab_id,$leads_tab_id)"); +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add' WHERE tabid=$campaigns_tab_id AND related_tabid IN ($calendar_tab_id,$potentials_tab_id)"); + +require_once("modules/com_vtiger_workflow/include.inc"); +require_once("modules/com_vtiger_workflow/tasks/VTEntityMethodTask.inc"); +require_once("modules/com_vtiger_workflow/VTEntityMethodManager.inc"); +$emm = new VTEntityMethodManager($adb); + +/* Update the profileid, block id in sequence table, to the current highest value of block id used. */ +$tmp = $adb->getUniqueId('vtiger_blocks'); +$max_block_id_query = $adb->query("SELECT MAX(blockid) AS max_blockid FROM vtiger_blocks"); +if($adb->num_rows($max_block_id_query)>0){ + $max_block_id = $adb->query_result($max_block_id_query,0,"max_blockid"); + ExecuteQuery("UPDATE vtiger_blocks_seq SET id=".($max_block_id)); +} + +$tmp = $adb->getUniqueId('vtiger_profile'); +$max_profile_id_query = $adb->query("SELECT MAX(profileid) AS max_profileid FROM vtiger_profile"); +if($adb->num_rows($max_profile_id_query)>0){ + $max_profile_id = $adb->query_result($max_profile_id_query,0,"max_profileid"); + ExecuteQuery("UPDATE vtiger_profile_seq SET id=".($max_profile_id)); +} + +/* Migration queries to cleanup ui type 15, 16, 111 - + * 15 for Standard picklist types, + * 16 for non-standard picklist types which do not support Role-based picklist */ +ExecuteQuery("update vtiger_field set uitype = '15' where uitype='16'"); +ExecuteQuery("update vtiger_field set uitype = '15', typeofdata='V~M' where uitype='111'"); + +ExecuteQuery("update vtiger_field set uitype=16 where fieldname in " . + "('visibility','duration_minutes','recurringtype','hdnTaxType','recurring_frequency','activity_view','lead_view','date_format','reminder_interval')" . + " and uitype = '15'"); + +/* Function to add Field Security for newly added fields */ +function addFieldSecurity($tabid, $fieldid, $allow_merge=false) { + global $adb; + ExecuteQuery("INSERT INTO vtiger_def_org_field (tabid, fieldid, visible, readonly) VALUES ($tabid, $fieldid, 0, 1)"); + + $profile_result = $adb->query("select distinct(profileid) as profileid from vtiger_profile"); + $num_profiles = $adb->num_rows($profile_result); + for($j=0; $j<$num_profiles; $j++) { + $profileid = $adb->query_result($profile_result,$j,'profileid'); + ExecuteQuery("INSERT INTO vtiger_profile2field (profileid, tabid, fieldid, visible, readonly) VALUES($profileid, $tabid, $fieldid, 0, 1)"); + } + + if ($allow_merge) { + $user_result = $adb->query("select distinct(id) as userid from vtiger_users"); + $num_users = $adb->num_rows($user_result); + for($j=0; $j<$num_users; $j++) { + $userid = $adb->query_result($user_result,$j,'userid'); + ExecuteQuery("INSERT INTO vtiger_user2mergefields VALUES($userid, $tabid, $fieldid, 0)"); + } + } +} + +/* Add Total column in default customview of Purchase Order */ +$res = $adb->query("select cvid from vtiger_customview where viewname='All' and entitytype='PurchaseOrder'"); + +if($adb->num_rows($res)>0){ + $po_cvid = $adb->query_result($res, 0, 'cvid'); + $adb->query("update vtiger_cvcolumnlist set columnindex = 5 where columnindex = 4 and cvid = $po_cvid"); + $adb->query("insert into vtiger_cvcolumnlist values ($po_cvid, 4, 'vtiger_purchaseorder:total:hdnGrandTotal:PurchaseOrder_Total:V')"); +} + + + +/* To Provide an option to Create Product from Quick Create */ +ExecuteQuery("UPDATE vtiger_field SET quickcreate = 0 WHERE tablename='vtiger_products' and columnname='productname'"); +ExecuteQuery("UPDATE vtiger_field SET quickcreate = 0 WHERE tablename='vtiger_products' and columnname='discontinued'"); +ExecuteQuery("UPDATE vtiger_field SET quickcreate = 0 WHERE tablename='vtiger_products' and columnname='unit_price'"); +ExecuteQuery("UPDATE vtiger_field SET quickcreate = 0 WHERE tablename='vtiger_products' and columnname='qtyinstock'"); + +/* Necessary DB Changes for Restoring the Related information of a Deleted Record */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_relatedlists_rb(entityid int(19), action varchar(50), rel_table varchar(200), rel_column varchar(200), ref_column varchar(200), related_crm_ids text) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +// Enable Search icon for all profiles by default for Recyclebin module +$profileresult = $adb->query("select * from vtiger_profile"); +$countprofiles = $adb->num_rows($profileresult); +for($i=0;$i<$countprofiles;$i++) +{ + $profileid = $adb->query_result($profileresult,$i,'profileid'); + ExecuteQuery("insert into vtiger_profile2utility values($profileid,30,3,0)"); + ExecuteQuery("insert into vtiger_profile2tab values ($profileid,30,0)"); +} + +/* For Role based customview support */ +ExecuteQuery("alter table vtiger_customview add column status int(1) default '3'"); +ExecuteQuery("update vtiger_customview set status=0 where viewname='All'"); +ExecuteQuery("alter table vtiger_customview add column userid int(19) default '1'"); + +/* Reminder Popup support for Calendar Events */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_activity_reminder_popup(reminderid int(19) NOT NULL AUTO_INCREMENT,semodule varchar(100) NOT NULL,recordid varchar(100) NOT NULL,date_start DATE,time_start varchar(100) NOT NULL,status int(2) NOT NULL, PRIMARY KEY(reminderid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_reminder_interval(reminder_intervalid int(19) NOT NULL AUTO_INCREMENT,reminder_interval varchar(200) NOT NULL,sortorderid int(19) NOT NULL,presence int(1) NOT NULL, PRIMARY KEY(reminder_intervalid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("alter table vtiger_users add column reminder_interval varchar(100) NOT NULL"); +ExecuteQuery("alter table vtiger_users add column reminder_next_time varchar(100)"); + +ExecuteQuery("INSERT INTO vtiger_reminder_interval values(".$adb->getUniqueId("vtiger_reminder_interval").",'None',0,1)"); +ExecuteQuery("INSERT INTO vtiger_reminder_interval values(".$adb->getUniqueId("vtiger_reminder_interval").",'1 Minute',1,1)"); +ExecuteQuery("INSERT INTO vtiger_reminder_interval values(".$adb->getUniqueId("vtiger_reminder_interval").",'5 Minutes',2,1)"); +ExecuteQuery("INSERT INTO vtiger_reminder_interval values(".$adb->getUniqueId("vtiger_reminder_interval").",'15 Minutes',3,1)"); +ExecuteQuery("INSERT INTO vtiger_reminder_interval values(".$adb->getUniqueId("vtiger_reminder_interval").",'30 Minutes',4,1)"); +ExecuteQuery("INSERT INTO vtiger_reminder_interval values(".$adb->getUniqueId("vtiger_reminder_interval").",'45 Minutes',5,1)"); +ExecuteQuery("INSERT INTO vtiger_reminder_interval values(".$adb->getUniqueId("vtiger_reminder_interval").",'1 Hour',6,1)"); +ExecuteQuery("INSERT INTO vtiger_reminder_interval values(".$adb->getUniqueId("vtiger_reminder_interval").",'1 Day',7,1)"); +ExecuteQuery("UPDATE vtiger_users SET reminder_interval='5 Minutes', reminder_next_time='".date('Y-m-d H:i')."'"); +$user_adv_block_id = $adb->getUniqueID('vtiger_blocks'); +ExecuteQuery("insert into vtiger_blocks values (".$user_adv_block_id.",29,'LBL_USER_ADV_OPTIONS',5,0,0,0,0,0)"); //Added a New Block User Image Info in Users Module +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values (29,".$adb->getUniqueID("vtiger_field").",'reminder_interval','vtiger_users',1,'16','reminder_interval','Reminder Interval',1,0,0,100,1,$user_adv_block_id,1,'V~O',1,null,'BAS')"); + +/* For Duplicate Records Merging feature */ +ExecuteQuery("INSERT INTO vtiger_actionmapping values(10,'DuplicatesHandling',0)"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_user2mergefields (userid int(11) REFERENCES vtiger_users( id ) , tabid int( 19 ) ,fieldid int( 19 ), visible int(2)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +function insertUser2mergefields($userid, $tabid) +{ + global $log,$adb; + $log->debug("Entering insertUser2mergefields(".$userid.") method ..."); + $log->info("in insertUser2mergefields ".$userid); + + foreach($tabid AS $key=>$tab_id) { + $fld_result = getFieldsResultForMerge($tab_id); + if ($fld_result != null) { + $num_rows = $adb->num_rows($fld_result); + for($j=0; $j<$num_rows; $j++) { + $field_id = $adb->query_result($fld_result,$j,'fieldid'); + $data_type = explode("~",$adb->query_result($fld_result,$j,'typeofdata')); + if($data_type[1] == 'M') { + $visible = 1; + } else { + $visible = 2; + } + ExecuteQuery("insert into vtiger_user2mergefields values ($userid, $tab_id, $field_id, $visible)"); + } + } + } + $log->debug("Exiting insertUser2mergefields method ..."); +} + +$tabid = Array(); +$tab_res = $adb->query("SELECT distinct tabid FROM vtiger_tab"); +$noOfTabs = $adb->num_rows($tab_res); +for($i=0;$i<$noOfTabs;$i++) { + $tabid[] = $adb->query_result($tab_res,$i,'tabid'); +} + +$usr_sql = $adb->query("select id from vtiger_users"); +$num_usr = $adb->num_rows($usr_sql); +for($i=0;$i<$num_usr;$i++) { + insertUser2mergefields($adb->query_result($usr_sql,$i,'id'),$tabid); +} + +$profile_sql = $adb->query("select profileid from vtiger_profile"); +$num_profile = $adb->num_rows($profile_sql); +/*Duplicate merging is supported for + * Accounts, Potentials, Contacts, Leads, Products, Vendors, TroubleTickets + */ +$dupSupported = array(6, 2, 4, 7, 14, 18, 13); +for($i=0;$i<$num_profile;$i++) { + $profile_id = $adb->query_result($profile_sql,$i,'profileid'); + for($j=0;$j<$noOfTabs;$j++) { + if (in_array($tabid[$j], $dupSupported)) { + ExecuteQuery("insert into vtiger_profile2utility values($profile_id,".$tabid[$j].",10,0)"); + } + } +} + +/* Local Backup Feature */ +ExecuteQuery("alter table vtiger_systems add column server_path varchar(256)"); + +/* Multi-Currency Support in Products, Pricebooks and Other Inventory Modules */ + +// To save mapping between products and its price in different currencies. +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_productcurrencyrel (productid int(11) not null, currencyid int(11) not null, converted_price decimal(25,2) default NULL, actual_price decimal(25, 2) default NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +// Update Product related tables +ExecuteQuery("alter table vtiger_products drop column currency"); +ExecuteQuery("alter table vtiger_products add column currency_id int(19) not null default '1'"); + +// Update Currency related tables +ExecuteQuery("alter table vtiger_currency_info add column deleted int(1) not null default '0'"); + +// Update Inventory related tables +ExecuteQuery("alter table vtiger_quotes drop column currency"); +ExecuteQuery("alter table vtiger_quotes add column currency_id int(19) not null default '1'"); +ExecuteQuery("alter table vtiger_quotes add column conversion_rate decimal(10,3) not null default '1.000'"); +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values(20,$field_id,'currency_id','vtiger_quotes','1','117','currency_id','Currency','1','0','1','100','21','51','3','I~O','1',null,'BAS')"); +addFieldSecurity(20,$field_id); + +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values(20,$field_id,'conversion_rate','vtiger_quotes','1','1','conversion_rate','Conversion Rate','1','0','1','100','22','51','3','N~O','1',null,'BAS')"); +addFieldSecurity(20,$field_id); + +ExecuteQuery("alter table vtiger_purchaseorder add column currency_id int(19) not null default '1'"); +ExecuteQuery("alter table vtiger_purchaseorder add column conversion_rate decimal(10,3) not null default '1.000'"); +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values(21,$field_id,'currency_id','vtiger_purchaseorder','1','117','currency_id','Currency','1','0','1','100','18','57','3','I~O','1',null,'BAS')"); +addFieldSecurity(21,$field_id); + +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values(21,$field_id,'conversion_rate','vtiger_purchaseorder','1','1','conversion_rate','Conversion Rate','1','0','1','100','19','57','3','N~O','1',null,'BAS')"); +addFieldSecurity(21,$field_id); + +ExecuteQuery("alter table vtiger_salesorder add column currency_id int(19) not null default '1'"); +ExecuteQuery("alter table vtiger_salesorder add column conversion_rate decimal(10,3) not null default '1.000'"); +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values(22,$field_id,'currency_id','vtiger_salesorder','1','117','currency_id','Currency','1','0','1','100','19','63','3','I~O','1',null,'BAS')"); +addFieldSecurity(22,$field_id); + +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values(22,$field_id,'conversion_rate','vtiger_salesorder','1','1','conversion_rate','Conversion Rate','1','0','1','100','20','63','3','N~O','1',null,'BAS')"); +addFieldSecurity(22,$field_id); + +ExecuteQuery("alter table vtiger_invoice add column currency_id int(19) not null default '1'"); +ExecuteQuery("alter table vtiger_invoice add column conversion_rate decimal(10,3) not null default '1.000'"); +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values(23,$field_id,'currency_id','vtiger_invoice','1','117','currency_id','Currency','1','0','1','100','18','69','3','I~O','1',null,'BAS')"); +addFieldSecurity(23,$field_id); + +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values(23,$field_id,'conversion_rate','vtiger_invoice','1','1','conversion_rate','Conversion Rate','1','0','1','100','19','69','3','N~O','1',null,'BAS')"); +addFieldSecurity(23,$field_id); + +// Update Price Book related tables +ExecuteQuery("alter table vtiger_pricebook drop column description"); +ExecuteQuery("alter table vtiger_pricebook add column currency_id int(19) not null default '1'"); +ExecuteQuery("alter table vtiger_pricebookproductrel add column usedcurrency int(11) not null default '1'"); +$pb_currency_field_id = $adb->getUniqueID('vtiger_field'); +$pb_tab_id = getTabid('PriceBooks'); +$adb->query("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values($pb_tab_id,$pb_currency_field_id,'currency_id','vtiger_pricebook','1','117','currency_id','Currency','1','0','0','100','5','48','1','I~M','0','3','BAS')"); +$adb->query("insert into vtiger_cvcolumnlist values('23','2','vtiger_pricebook:currency_id:currency_id:PriceBooks_Currency:I')"); +addFieldSecurity($pb_tab_id,$pb_currency_field_id); + +/* Documents module */ +$documents_tab_id = getTabid('Documents'); +ExecuteQuery("delete from vtiger_cvcolumnlist where columnname like '%Notes_Contact_Name%'"); +ExecuteQuery("delete from vtiger_cvcolumnlist where columnname like '%Notes_Related_to%'"); + +ExecuteQuery("insert into vtiger_def_org_share values (".$adb->getUniqueID('vtiger_def_org_share').",$documents_tab_id,2,0)"); + +for($i=0;$i<4;$i++) +{ + ExecuteQuery("insert into vtiger_org_share_action2tab values(".$i.",$documents_tab_id)"); +} + +ExecuteQuery("alter table vtiger_customview drop foreign key fk_1_vtiger_customview "); +ExecuteQuery("update vtiger_customview set entitytype='Documents' where entitytype='Notes'"); +ExecuteQuery("update vtiger_tab set ownedby=0,name='Documents',tablabel='Documents' where tabid=$documents_tab_id"); +ExecuteQuery("update vtiger_entityname set modulename='Documents' where tabid=$documents_tab_id"); +ExecuteQuery("alter table vtiger_customview add constraint FOREIGN KEY fk_1_vtiger_customview (entitytype) REFERENCES vtiger_tab (name) ON DELETE CASCADE"); + +ExecuteQuery("UPDATE vtiger_relatedlists SET actions='add,select', related_tabid=$documents_tab_id WHERE name='get_attachments'"); +ExecuteQuery("alter table vtiger_notes add(folderid int(19) DEFAULT 1,filetype varchar(50) default NULL,filelocationtype varchar(5) default NULL,filedownloadcount int(19) default NULL,filestatus int(19) default NULL,filesize int(19) NOT NULL default '0',fileversion varchar(50) default NULL)"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_attachmentsfolder ( folderid int(19) AUTO_INCREMENT NOT NULL,foldername varchar(200) NOT NULL default '', description varchar(250) default '', createdby int(19) NOT NULL, sequence int(19) default NULL, PRIMARY KEY (folderid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("insert into vtiger_attachmentsfolder values (1,'Existing Notes','Contains all Notes migrated from the earlier version',1,1)"); + +ExecuteQuery("alter table vtiger_senotesrel drop foreign key fk_2_vtiger_senotesrel "); + +ExecuteQuery("UPDATE vtiger_crmentity SET setype='Documents' WHERE setype='Notes'"); + +$attachmentidQuery = 'select vtiger_seattachmentsrel.attachmentsid as attachmentid, vtiger_seattachmentsrel.crmid as id from vtiger_seattachmentsrel INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_seattachmentsrel.crmid WHERE vtiger_crmentity.deleted = 0'; +$res = $adb->pquery($attachmentidQuery,array()); +if($adb->num_rows($res)>0){ + for($index=0;$index<$adb->num_rows($res);$index++){ + $attachmentid = $adb->query_result($res,$index,'attachmentid'); + $crmid = $adb->query_result($res,$index,'id'); + if($attachmentid != ''){ + $attachmentInfoQuery = 'select * from vtiger_attachments where attachmentsid = ?'; + $attachres = $adb->pquery($attachmentInfoQuery,array($attachmentid)); + if($adb->num_rows($attachres)>0){ + $filename = $adb->query_result($attachres,0,'name'); + $attch_sub = $adb->query_result($attachres,0,'subject'); + $description = $adb->query_result($attachres,0,'description'); + $filepath = $adb->query_result($attachres,0,'path'); + $filetype = $adb->query_result($attachres,0,'type'); + if(file_exists($filepath.$attachmentid."_".$filename)) { + $filesize = filesize($filepath.$attachmentid."_".$filename); + $filestatus = "1"; + } else { + $filesize = "0"; + $filestatus = "0"; + } + + $noteid_query = $adb->pquery("SELECT notesid FROM vtiger_notes WHERE notesid = ?",array($crmid)); + if($adb->num_rows($noteid_query)>0) { + $notesid = $adb->query_result($noteid_query,0,"notesid"); + ExecuteQuery("update vtiger_notes set folderid = 1,filestatus='$filestatus',filelocationtype='I',filedownloadcount=0,fileversion='',filetype='".$filetype."',filesize='".$filesize."',filename='".$filename."' where notesid = ".$notesid); + } else { + require_once("modules/Documents/Documents.php"); + + $notes_obj = new Documents(); + if($attch_sub == '') $attch_sub = $filename; + $notes_obj->column_fields['notes_title'] = decode_html($attch_sub); + $notes_obj->column_fields['notecontent'] = decode_html($description); + $notes_obj->column_fields['assigned_user_id'] = 1; + $notes_obj->save("Documents"); + $notesid = $notes_obj->id; + + ExecuteQuery("Update vtiger_notes set folderid=1,filedownloadcount=0, filestatus='$filestatus', fileversion='', filesize = '$filesize', filetype = '$filetype' , filelocationtype = 'I', filename = '$filename' where notesid = $notesid"); + ExecuteQuery("INSERT INTO vtiger_senotesrel VALUES($crmid,$notesid)"); + ExecuteQuery("INSERT INTO vtiger_seattachmentsrel VALUES($notesid,$attachmentid)"); + } + } + } + else{ + ExecuteQuery("update vtiger_notes set folderid=1, filestatus=1,filelocationtype='',filedownloadcount='',fileversion='',filetype='',filesize='',filename='' where notesid = ".$notesid); + } + } +} + +$fieldid = Array(); +for($i=0;$i<8;$i++) +{ + $fieldid[$i] = $adb->getUniqueID("vtiger_field"); +} +$file_block_id = $adb->getUniqueID('vtiger_blocks'); +ExecuteQuery("insert into vtiger_blocks values($file_block_id,$documents_tab_id,'LBL_FILE_INFORMATION',2,0,0,0,0,0)"); + +$description_block_id_Query = 'select blockid from vtiger_blocks where tabid = '.$documents_tab_id.' and blocklabel = "" '; +$desc_id = $adb->pquery($description_block_id_Query,array()); +if($adb->num_rows($desc_id)>0){ + $desc = $adb->query_result($desc_id,0,'blockid'); + $desc_update = 'update vtiger_blocks set blocklabel ="LBL_DESCRIPTION",show_title = 0,sequence = 3 where blockid = ?'; + $desc_block_update = $adb->pquery($desc_update,array($desc)); + ExecuteQuery("update vtiger_field set sequence=1,quickcreate=1,presence=2,block=$desc where tabid=$documents_tab_id and columnname='notecontent'"); +} + +ExecuteQuery("update vtiger_field set sequence=1 where tabid=$documents_tab_id and columnname='title'"); +ExecuteQuery("update vtiger_field set sequence=8,quickcreate=3 where tabid=$documents_tab_id and columnname='createdtime'"); +ExecuteQuery("update vtiger_field set sequence=9,quickcreate=3 where tabid=$documents_tab_id and columnname='modifiedtime'"); + +ExecuteQuery("update vtiger_field set sequence = 3,quickcreate=3,block = $file_block_id,fieldlabel='File Name',displaytype = 1,uitype=28 where tabid = $documents_tab_id and columnname = 'filename'"); + +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values ($documents_tab_id,".$fieldid[0].",'smownerid','vtiger_crmentity',1,53,'assigned_user_id','Assigned To',1,0,0,100,2,17,1,'V~M',0,3,'BAS')"); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values ($documents_tab_id,".$fieldid[1].",'filetype','vtiger_notes',1,1,'filetype','File Type',1,2,0,100,5,$file_block_id,2,'V~O',3,'','BAS')"); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values ($documents_tab_id,".$fieldid[2].",'filesize','vtiger_notes',1,1,'filesize','File Size',1,2,0,100,4,$file_block_id,2,'V~O',3,'','BAS')"); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values ($documents_tab_id,".$fieldid[3].",'filelocationtype','vtiger_notes',1,27,'filelocationtype','Download Type',1,0,0,100,1,$file_block_id,1,'V~O',1,'','BAS')"); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values ($documents_tab_id,".$fieldid[4].",'fileversion','vtiger_notes',1,1,'fileversion','Version',1,2,0,100,6,17,1,'V~O',1,'','BAS')"); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values ($documents_tab_id,".$fieldid[5].",'filestatus','vtiger_notes',1,56,'filestatus','Active',1,2,0,100,2,$file_block_id,1,'V~O',1,'','BAS')"); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values ($documents_tab_id,".$fieldid[6].",'filedownloadcount','vtiger_notes',1,1,'filedownloadcount','Download Count',1,2,0,100,6,$file_block_id,2,'I~O',3,'','BAS')"); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values ($documents_tab_id,".$fieldid[7].",'folderid','vtiger_notes',1,26,'folderid','Folder Name',1,2,0,100,4,17,1,'V~O',2,'2','BAS')"); + +for($i=0;$iquery($dbQuery); +$noofrecords = $adb->num_rows($dbresult); +if($noofrecords > 0) +{ + for($i=0;$i<$noofrecords;$i++) + { + $contactid = $adb->query_result($dbresult,$i,'contact_id'); + $notesid = $adb->query_result($dbresult,$i,'notesid'); + $dup_check = $adb->pquery("SELECT * from vtiger_senotesrel WHERE crmid = ? AND notesid = ?",array($contactid,$notesid)); + if($contactid != 0 && $adb->num_rows($dup_check)==0){ + ExecuteQuery("insert into vtiger_senotesrel values (".$contactid.",".$notesid.")"); + } + } +} + +ExecuteQuery("delete from vtiger_field where tabid = 8 and fieldname = 'contact_id'"); +ExecuteQuery("delete from vtiger_field where tabid = 8 and fieldname = 'parent_id'"); + +ExecuteQuery("alter table vtiger_notes drop column contact_id"); + +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_notes:filename:filename:Documents_Filename:V' where cvid = 22 and columnindex = 3"); +custom_addCustomFilterColumn('Documents','All', 'vtiger_crmentity','smownerid','assigned_user_id','Documents_Assigned_To:V',7); + +ExecuteQuery("UPDATE vtiger_field SET columnname='name' WHERE fieldname='filename' AND tablename='vtiger_attachments' AND tabid=".getTabid('Emails')); + +//remove filename column from trouble ticket +ExecuteQuery("alter table vtiger_troubletickets drop column filename"); +ExecuteQuery("delete from vtiger_field where fieldname='filename' and tablename='vtiger_attachments' AND tabid=".getTabid('HelpDesk')); +//End: Database changes regarding Documents module + +/* Home Page Customization */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_homestuff (stuffid int(19) NOT NULL default '0', stuffsequence int(19) NOT NULL default '0', stufftype varchar(100) default NULL, userid int(19) NOT NULL, visible int(10) NOT NULL default '0', stufftitle varchar(100) default NULL, PRIMARY KEY (stuffid), KEY stuff_stuffid_idx (stuffid), KEY fk_1_vtiger_homestuff (userid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_homedashbd (stuffid int(19) NOT NULL default 0, dashbdname varchar(100) default NULL, dashbdtype varchar(100) default NULL, PRIMARY KEY (stuffid), KEY stuff_stuffid_idx (stuffid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_homedefault (stuffid int(19) NOT NULL default 0, hometype varchar(30) NOT NULL, maxentries int(19) default NULL, setype varchar(30) default NULL, PRIMARY KEY (stuffid), KEY stuff_stuffid_idx (stuffid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_homemodule (stuffid int(19) NOT NULL, modulename varchar(100) default NULL, maxentries int(19) NOT NULL, customviewid int(19) NOT NULL, setype varchar(30) NOT NULL, PRIMARY KEY (stuffid), KEY stuff_stuffid_idx (stuffid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_homemoduleflds (stuffid int(19) default NULL, fieldname varchar(255) default NULL, KEY stuff_stuffid_idx (stuffid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_homerss (stuffid int(19) NOT NULL default 0, url varchar(100) default NULL, maxentries int(19) NOT NULL, PRIMARY KEY (stuffid), KEY stuff_stuffid_idx (stuffid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("ALTER TABLE vtiger_homestuff ADD CONSTRAINT fk_1_vtiger_homestuff FOREIGN KEY (userid) REFERENCES vtiger_users (id) ON DELETE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_homedashbd ADD CONSTRAINT fk_1_vtiger_homedashbd FOREIGN KEY (stuffid) REFERENCES vtiger_homestuff (stuffid) ON DELETE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_homedefault ADD CONSTRAINT fk_1_vtiger_homedefault FOREIGN KEY (stuffid) REFERENCES vtiger_homestuff (stuffid) ON DELETE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_homemodule ADD CONSTRAINT fk_1_vtiger_homemodule FOREIGN KEY (stuffid) REFERENCES vtiger_homestuff (stuffid) ON DELETE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_homemoduleflds ADD CONSTRAINT fk_1_vtiger_homemoduleflds FOREIGN KEY (stuffid) REFERENCES vtiger_homemodule (stuffid) ON DELETE CASCADE"); +ExecuteQuery("ALTER TABLE vtiger_homerss ADD CONSTRAINT fk_1_vtiger_homerss FOREIGN KEY (stuffid) REFERENCES vtiger_homestuff (stuffid) ON DELETE CASCADE"); + +//to get the users lists +$query = $adb->pquery('select * from vtiger_users',array()); +for($i=0;$i<$adb->num_rows($query);$i++) +{ + $userid = $adb->query_result($query,$i,'id'); + + $s1=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s1.",1,'Default',".$userid.",1,'Top Accounts')"; + $res=$adb->pquery($sql,array()); + + $s2=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s2.",2,'Default',".$userid.",1,'Home Page Dashboard')"; + $res=$adb->pquery($sql,array()); + + $s3=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s3.",3,'Default',".$userid.",1,'Top Potentials')"; + $res=$adb->pquery($sql,array()); + + $s4=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s4.",4,'Default',".$userid.",1,'Top Quotes')"; + $res=$adb->pquery($sql,array()); + + $s5=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s5.",5,'Default',".$userid.",1,'Key Metrics')"; + $res=$adb->pquery($sql,array()); + + $s6=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s6.",6,'Default',".$userid.",1,'Top Trouble Tickets')"; + $res=$adb->pquery($sql,array()); + + $s7=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s7.",7,'Default',".$userid.",1,'Upcoming Activities')"; + $res=$adb->pquery($sql,array()); + + $s8=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s8.",8,'Default',".$userid.",1,'My Group Allocation')"; + $res=$adb->pquery($sql,array()); + + $s9=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s9.",9,'Default',".$userid.",1,'Top Sales Orders')"; + $res=$adb->pquery($sql,array()); + + $s10=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s10.",10,'Default',".$userid.",1,'Top Invoices')"; + $res=$adb->pquery($sql,array()); + + $s11=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s11.",11,'Default',".$userid.",1,'My New Leads')"; + $res=$adb->pquery($sql,array()); + + $s12=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s12.",12,'Default',".$userid.",1,'Top Purchase Orders')"; + $res=$adb->pquery($sql,array()); + + $s13=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s13.",13,'Default',".$userid.",1,'Pending Activities')"; + $res=$adb->pquery($sql,array()); + + $s14=$adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values(".$s14.",14,'Default',".$userid.",1,'My Recent FAQs')"; + $res=$adb->pquery($sql,array()); + + // Non-Default Home Page widget (no entry is requried in vtiger_homedefault below) + $tc = $adb->getUniqueID("vtiger_homestuff"); + $sql="insert into vtiger_homestuff values($tc, 15, 'Tag Cloud', $userid, 0, 'Tag Cloud')"; + $adb->query($sql); + + $sql="insert into vtiger_homedefault values(".$s1.",'ALVT',5,'Accounts')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s2.",'HDB',5,'Dashboard')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s3.",'PLVT',5,'Potentials')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s4.",'QLTQ',5,'Quotes')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s5.",'CVLVT',5,'NULL')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s6.",'HLT',5,'HelpDesk')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s7.",'UA',5,'Calendar')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s8.",'GRT',5,'NULL')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s9.",'OLTSO',5,'SalesOrder')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s10.",'ILTI',5,'Invoice')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s11.",'MNL',5,'Leads')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s12.",'OLTPO',5,'PurchaseOrder')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s13.",'PA',5,'Calendar')"; + $adb->pquery($sql,array()); + + $sql="insert into vtiger_homedefault values(".$s14.",'LTFAQ',5,'Faq')"; + $adb->pquery($sql,array()); +} +for($i=0;$i<$adb->num_rows($query);$i++) +{ + $def_homeorder = $adb->query_result($query,$i,'homeorder'); + $user_id = $adb->query_result($query,$i,'id'); + $def_array = explode(",",$def_homeorder); + $sql = $adb->pquery("SELECT vtiger_homestuff.stuffid FROM vtiger_homestuff INNER JOIN vtiger_homedefault WHERE vtiger_homedefault.hometype in (". generateQuestionMarks($def_array) . ") AND vtiger_homestuff.stuffid = vtiger_homedefault.stuffid AND vtiger_homestuff.userid = ?",array($def_array,$user_id)); + $stuffid_list = array(); + for($j=0;$j<$adb->num_rows($sql);$j++) { + $stuffid_list[] = $adb->query_result($sql,$j,'stuffid'); + } + $adb->pquery("UPDATE vtiger_homestuff SET visible = 0 WHERE stuffid in (". generateQuestionMarks($stuffid_list) .")",array($stuffid_list)); +} + +/* For Layout Editor */ +ExecuteQuery("ALTER TABLE vtiger_blocks ADD COLUMN display_status int(1) NOT NULL DEFAULT '1'"); + +/* Adding Custom Events Migration */ +ExecuteQuery("UPDATE vtiger_field SET uitype=15,typeofdata='V~M' WHERE tabid=16 and columnname='activitytype'"); +ExecuteQuery("alter table vtiger_activitytype drop column sortorderid"); +ExecuteQuery("alter table vtiger_activitytype add column picklist_valueid int(19) NOT NULL default '0'"); +$picklist_id = $adb->getUniqueId("vtiger_picklist"); +ExecuteQuery("INSERT INTO vtiger_picklist VALUES(".$picklist_id.",'activitytype')"); + +$query = $adb->pquery("SELECT * from vtiger_activitytype",array()); +for($i=0;$i<$adb->num_rows($query);$i++){ + $picklist_valueid = $adb->getUniqueID('vtiger_picklistvalues'); + $activitytypeid = $adb->query_result($query,$i,'activitytypeid'); + $adb->pquery("UPDATE vtiger_activitytype SET picklist_valueid=? , presence=0 WHERE activitytypeid = ? ",array($picklist_valueid,$activitytypeid)); +} + +$role_query = $adb->query("SELECT * FROM vtiger_role"); +for($j=0;$j<$adb->num_rows($role_query);$j++){ + $roleid = $adb->query_result($role_query,$j,'roleid'); + $query = $adb->pquery("SELECT * from vtiger_activitytype",array()); + for($i=0;$i<$adb->num_rows($query);$i++){ + $picklist_valueid = $adb->query_result($query,$i,'picklist_valueid'); + ExecuteQuery("INSERT INTO vtiger_role2picklist VALUES('".$roleid."',".$picklist_valueid.",".$picklist_id.",$i)"); + } +} + +$uniqueid = $adb->getUniqueID("vtiger_relatedlists"); +$faqtabid = getTabid('Faq'); +ExecuteQuery("insert into vtiger_relatedlists values($uniqueid,$faqtabid,$documents_tab_id,'get_attachments',1,'Documents',0,'add,select')"); +//CustomEvents Migration Ends + +/* Important column renaming to support database porting */ +$adb->pquery("ALTER TABLE vtiger_profile2standardpermissions CHANGE Operation testoperation INTEGER", array()); +$adb->pquery("ALTER TABLE vtiger_profile2standardpermissions CHANGE testoperation operation INTEGER", array()); + +$renameArray = array( + "vtiger_sales_stage", + "vtiger_faqcategories", + "vtiger_faqstatus", + "vtiger_rating", + "vtiger_ticketcategories", + "vtiger_ticketpriorities", + "vtiger_ticketseverities", + "vtiger_ticketstatus" +); +foreach($renameArray as $tablename) { + $adb->pquery("ALTER TABLE $tablename CHANGE PRESENCE testpresence INTEGER", array()); + $adb->pquery("ALTER TABLE $tablename CHANGE testpresence presence INTEGER", array()); +} +// Renaming completed + +/* Important database schema changes to support database porting */ +ExecuteQuery("alter table vtiger_attachments drop index attachments_description_type_attachmentsid_idx"); +ExecuteQuery("alter table vtiger_attachments modify column description TEXT"); +ExecuteQuery("alter table vtiger_emaildetails modify column idlists TEXT"); + +/* Product Bundles Feature */ +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Products").",'get_products',13,'Product Bundles',0,'add,select')"); +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Products").",'get_parent_products',14,'Parent Products',0,'')"); + +/* vtmailscanner customization */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_mailscanner(scannerid INT AUTO_INCREMENT NOT NULL PRIMARY KEY,scannername VARCHAR(30), + server VARCHAR(100),protocol VARCHAR(10),username VARCHAR(255),password VARCHAR(255),ssltype VARCHAR(10), +sslmethod VARCHAR(30),connecturl VARCHAR(255),searchfor VARCHAR(10),markas VARCHAR(10),isvalid INT(1)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_mailscanner_ids(scannerid INT, messageid TEXT,crmid INT) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_mailscanner_folders(folderid INT AUTO_INCREMENT NOT NULL PRIMARY KEY,scannerid INT,foldername VARCHAR(255),lastscan VARCHAR(30),rescan INT(1), enabled INT(1)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_mailscanner_rules(ruleid INT AUTO_INCREMENT NOT NULL PRIMARY KEY,scannerid INT,fromaddress VARCHAR(255),toaddress VARCHAR(255),subjectop VARCHAR(20),subject VARCHAR(255),bodyop VARCHAR(20),body VARCHAR(255),matchusing VARCHAR(5),sequence INT) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_mailscanner_actions(actionid INT AUTO_INCREMENT NOT NULL PRIMARY KEY,scannerid INT,actiontype VARCHAR(10),module VARCHAR(30),lookup VARCHAR(30),sequence INT) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_mailscanner_ruleactions(ruleid INT,actionid INT) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +// END + +/* Recurring Invoice Feature */ +$new_block_seq_no = 2; +// Get all the blocks of the same module (SalesOrder), and update their sequence depending on the sequence of the new block added. +$res = $adb->query("SELECT blockid FROM vtiger_blocks WHERE tabid = ". getTabid('SalesOrder') ." AND sequence >= ". $new_block_seq_no); +$no_of_blocks = $adb->num_rows($res); +for ($i=0; $i<$no_of_blocks;$i++) { + $blockid = $adb->query_result($res, $i, 'blockid'); + ExecuteQuery("UPDATE vtiger_blocks SET sequence = sequence+1 WHERE blockid=$blockid"); +} +// Add new block to show recurring invoice information at specified position (sequence of blocks) +$new_block_id = $adb->getUniqueID('vtiger_blocks'); +ExecuteQuery("INSERT INTO vtiger_blocks VALUES (".$new_block_id.",".getTabid('SalesOrder').",'Recurring Invoice Information',$new_block_seq_no,0,0,0,0,0,1)"); + +ExecuteQuery("ALTER TABLE vtiger_salesorder ADD COLUMN enable_recurring INT default 0"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_invoice_recurring_info(salesorderid INT, recurring_frequency VARCHAR(200), start_period DATE, end_period DATE, last_recurring_date DATE default NULL, " . + " payment_duration VARCHAR(200), invoice_status VARCHAR(200)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_recurring_frequency(recurring_frequency_id INT, recurring_frequency VARCHAR(200), sortorderid INT, presence INT) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +// Add default values for the recurring_frequency picklist +ExecuteQuery("INSERT INTO vtiger_recurring_frequency values(".$adb->getUniqueID('vtiger_recurring_frequency').",'--None--',1,1)"); +ExecuteQuery("INSERT INTO vtiger_recurring_frequency values(".$adb->getUniqueID('vtiger_recurring_frequency').",'Daily',2,1)"); +ExecuteQuery("INSERT INTO vtiger_recurring_frequency values(".$adb->getUniqueID('vtiger_recurring_frequency').",'Weekly',3,1)"); +ExecuteQuery("INSERT INTO vtiger_recurring_frequency values(".$adb->getUniqueID('vtiger_recurring_frequency').",'Monthly',4,1)"); +ExecuteQuery("INSERT INTO vtiger_recurring_frequency values(".$adb->getUniqueID('vtiger_recurring_frequency').",'Quarterly',5,1)"); +ExecuteQuery("INSERT INTO vtiger_recurring_frequency values(".$adb->getUniqueID('vtiger_recurring_frequency').",'Yearly',6,1)"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_payment_duration(payment_duration_id INT, payment_duration VARCHAR(200), sortorderid INT, presence INT) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +// Add default values for the vtiger_payment_duration picklist +ExecuteQuery("INSERT INTO vtiger_payment_duration values(".$adb->getUniqueID('vtiger_payment_duration').",'Net 30 days',1,1)"); +ExecuteQuery("INSERT INTO vtiger_payment_duration values(".$adb->getUniqueID('vtiger_payment_duration').",'Net 45 days',2,1)"); +ExecuteQuery("INSERT INTO vtiger_payment_duration values(".$adb->getUniqueID('vtiger_payment_duration').",'Net 60 days',3,1)"); + +// Add fields for the Recurring Information block +$salesorder_tabid = getTabid('SalesOrder'); +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values($salesorder_tabid,$field_id,'enable_recurring','vtiger_salesorder',1,'56','enable_recurring','Enable Recurring',1,0,0,100,1,$new_block_id,1,'C~O',3,null,'BAS')"); +addFieldSecurity($salesorder_tabid,$field_id); + +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values($salesorder_tabid,$field_id,'recurring_frequency','vtiger_invoice_recurring_info',1,'16','recurring_frequency','Frequency',1,0,0,100,2,$new_block_id,1,'V~O',3,null,'BAS')"); +addFieldSecurity($salesorder_tabid,$field_id); + +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values($salesorder_tabid,$field_id,'start_period','vtiger_invoice_recurring_info',1,'5','start_period','Start Period',1,0,0,100,3,$new_block_id,1,'D~O',3,null,'BAS')"); +addFieldSecurity($salesorder_tabid,$field_id); + +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values($salesorder_tabid,$field_id,'end_period','vtiger_invoice_recurring_info',1,'5','end_period','End Period',1,0,0,100,4,$new_block_id,1,'D~O~OTH~G~start_period~Start Period',3,null,'BAS')"); +addFieldSecurity($salesorder_tabid,$field_id); + +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values($salesorder_tabid,$field_id,'payment_duration','vtiger_invoice_recurring_info',1,'16','payment_duration','Payment Duration',1,0,0,100,5,$new_block_id,1,'V~O',3,null,'BAS')"); +addFieldSecurity($salesorder_tabid,$field_id); + +$field_id = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type) values($salesorder_tabid,$field_id,'invoice_status','vtiger_invoice_recurring_info',1,'15','invoicestatus','Invoice Status',1,0,0,100,6,$new_block_id,1,'V~O',3,null,'BAS')"); +addFieldSecurity($salesorder_tabid,$field_id); + +// Add new picklist value 'AutoCreated' for Invoice Status and add the same for all the existing roles. +$picklistRes = $adb->query("SELECT picklistid FROM vtiger_picklist WHERE name='invoicestatus'"); +if($adb->num_rows($picklistRes)>0){ + $picklistid = $adb->query_result($picklistRes,0,'picklistid'); + + $picklist_valueid = $adb->getUniqueID('vtiger_picklistvalues'); + $max_seq_id_qry = $adb->pquery("SELECT max(inovicestatusid) as maxid from vtiger_invoicestatus",array()); + if($adb->num_rows($max_seq_id_qry)>0) { + $tmp = $adb->getUniqueID('vtiger_invoicestatus'); + $max_seq_id = $adb->query_result($max_seq_id_qry,0,'maxid'); + $adb->pquery("UPDATE vtiger_invoicestatus_seq SET id=?",array($max_seq_id)); + } + $id = $adb->getUniqueID('vtiger_invoicestatus'); + + ExecuteQuery("insert into vtiger_invoicestatus values($id, 'AutoCreated', 1, $picklist_valueid)"); + + //Default entries for role2picklist relation has been inserted.. + $sql="select roleid from vtiger_role"; + $role_result = $adb->pquery($sql, array()); + $numrow = $adb->num_rows($role_result); + for($k=0; $k < $numrow; $k ++) + { + $roleid = $adb->query_result($role_result,$k,'roleid'); + $params = array($roleid, $picklist_valueid, $picklistid, $id-1); + $adb->pquery("insert into vtiger_role2picklist values(?,?,?,?)", $params); + } +} + +// Add Event handler for Recurring Invoice +$em->registerHandler('vtiger.entity.aftersave', 'modules/SalesOrder/RecurringInvoiceHandler.php', 'RecurringInvoiceHandler'); + +/* Workflow Manager - com_vtiger_workflow */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS com_vtiger_workflows_seq (id int(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("insert into com_vtiger_workflows_seq (id) values(1)"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS com_vtiger_workflows (workflow_id int, module_name varchar(100), summary varchar(100), test varchar(400), task_id int(11), exec_date int, execution_condition varchar(50)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery('CREATE TABLE IF NOT EXISTS com_vtiger_workflow_activatedonce (entity_id int, workflow_id int) ENGINE=InnoDB DEFAULT CHARSET=utf8;'); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS com_vtiger_workflowtasks_seq (id int(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("insert into com_vtiger_workflowtasks_seq (id) values(1)"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS com_vtiger_workflowtasks (task_id int, workflow_id int, summary varchar(100), task text, primary key(task_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS com_vtiger_workflowtask_queue (task_id int, entity_id varchar(100), do_after int, primary key(task_id, entity_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("CREATE TABLE IF NOT EXISTS com_vtiger_workflowtasks_entitymethod_seq (id int(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("insert into com_vtiger_workflowtasks_entitymethod_seq (id) values(1)"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS com_vtiger_workflowtasks_entitymethod (workflowtasks_entitymethod_id int, module_name varchar(100), method_name varchar(100), function_path varchar(400), function_name varchar(100), primary key(workflowtasks_entitymethod_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +ExecuteQuery("CREATE TABLE com_vtiger_workflowtemplates ( + template_id int(11) NOT NULL default '0', + module_name varchar(100) default NULL, + title varchar(400) default NULL, + template text, PRIMARY KEY (template_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +$em->registerHandler('vtiger.entity.aftersave', 'modules/com_vtiger_workflow/VTEventHandler.inc', 'VTWorkflowEventHandler'); +// com_vtiger_workflow ends + +/* Mass Edit Feature */ +ExecuteQuery("ALTER TABLE vtiger_field ADD COLUMN masseditable int(11) NOT NULL DEFAULT '1'"); +$tab_field_array = array( + 'Accounts'=>array('accountname','account_id'), + 'Contacts'=>array('imagename','portal','contact_id'), + 'Products'=>array('imagename','product_id'), + 'Invoice'=>array('invoice_no','salesorder_id'), + 'SalesOrder'=>array('quote_id','salesorder_no','enable_recurring','recurring_frequency','start_period','end_period','payment_duration','invoicestatus'), + 'PurchaseOrder'=>array('purchaseorder_no'), + 'Quotes'=>array('quote_no'), + 'HelpDesk'=>array('filename'), +); +foreach($tab_field_array as $index=>$value){ + $tabid = getTabid($index); + $adb->pquery("UPDATE vtiger_field SET masseditable=0 WHERE tabid=? AND fieldname IN (".generateQuestionMarks($value).")",array($tabid,$value)); +} + +/* Showing Emails in Vendors related list */ +ExecuteQuery("insert into vtiger_relatedlists values(".$adb->getUniqueID('vtiger_relatedlists').",".getTabid("Vendors").",".getTabid("Emails").",'get_emails',4,'Emails',0,'add')"); + +/* Added for module sequence number customization */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_modentity_num (num_id int(19) NOT NULL, semodule varchar(50) NOT NULL, prefix varchar(50) NOT NULL DEFAULT '', start_id varchar(50) NOT NULL, cur_id varchar(50) NOT NULL, active int(2) NOT NULL, PRIMARY KEY(num_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +// Setup module sequence numbering for all modules (except Invoice). +function custom_addInventoryRows($paramArray){ + global $adb; + + $fieldCreateCount = 0; + + for($index = 0; $index < count($paramArray); ++$index) { + $criteria = $paramArray[$index]; + + $semodule = $criteria['semodule']; + $adb->pquery("INSERT into vtiger_modentity_num values(?,?,?,?,?,?)",array($adb->getUniqueId("vtiger_modentity_num"),$semodule,$criteria['prefix'],$criteria['startid'],$criteria['curid'],1)); + } +} +$modseq = array( + 'Leads' =>'LEA', + 'Accounts' =>'ACC', + 'Campaigns' =>'CAM', + 'Contacts' =>'CON', + 'Potentials'=>'POT', + 'HelpDesk' =>'TT', + 'Quotes' =>'QUO', + 'SalesOrder'=>'SO', + 'PurchaseOrder'=>'PO', + 'Products' =>'PRO', + 'Vendors' =>'VEN', + 'PriceBooks'=>'PB', + 'Faq' =>'FAQ', + 'Documents' =>'DOC' +); +foreach($modseq as $modname => $prefix) { + custom_addInventoryRows( + array( + array('semodule'=>$modname, 'active'=>'1','prefix'=>$prefix,'startid'=>'1','curid'=>'1') + ) + ); +} +// Setup module sequence for Invoice +@include_once('user_privileges/CustomInvoiceNo.php'); +// We need to move the existing information of Custom numbering to database +// but in case the previous setting is not available...we are defaulting +if(!isset($inv_str)) $inv_str = 'INV'; +if(!isset($inv_no)) $inv_no = '1'; + +custom_addInventoryRows( + array( + array('semodule'=>'Invoice', 'active'=>'1','prefix'=>decode_html($inv_str),'startid'=>'1','curid'=>$inv_no) + ) + ); + +// Add Module Number Field to UI. + +$blockid = getBlockId(6,'LBL_ACCOUNT_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (6,".$adb->getUniqueID("vtiger_field").",'account_no','vtiger_account',1,'4','account_no','Account No',1,0,0,100,2,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_account ADD COLUMN account_no varchar(100) not null"); + +$blockid = getBlockId(7,'LBL_LEAD_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (7,".$adb->getUniqueID("vtiger_field").",'lead_no','vtiger_leaddetails',1,'4','lead_no','Lead No',1,0,0,100,3,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_leaddetails ADD COLUMN lead_no varchar(100) not null"); + +$blockid = getBlockId(4,'LBL_CONTACT_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (4,".$adb->getUniqueID("vtiger_field").",'contact_no','vtiger_contactdetails',1,'4','contact_no','Contact Id',1,0,0,100,3,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_contactdetails ADD COLUMN contact_no varchar(100) not null"); + +$blockid = getBlockId(2,'LBL_OPPORTUNITY_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (2,".$adb->getUniqueID("vtiger_field").",'potential_no','vtiger_potential',1,'4','potential_no','Potential No',1,0,0,100,2,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_potential ADD COLUMN potential_no varchar(100) not null"); + +$blockid = getBlockId(26,'LBL_CAMPAIGN_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (26,".$adb->getUniqueID("vtiger_field").",'campaign_no','vtiger_campaign',1,'4','campaign_no','Campaign No',1,0,0,100,2,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_campaign ADD COLUMN campaign_no varchar(100) not null"); + +$blockid = getBlockId(13,'LBL_TICKET_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (13,".$adb->getUniqueID("vtiger_field").",'ticket_no','vtiger_troubletickets',1,'4','ticket_no','Ticket No',1,0,0,100,1,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_troubletickets ADD COLUMN ticket_no varchar(100) not null"); + +$blockid = getBlockId(14,'LBL_PRODUCT_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (14,".$adb->getUniqueID("vtiger_field").",'product_no','vtiger_products',1,'4','product_no','Product No',1,0,0,100,2,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_products ADD COLUMN product_no varchar(100) not null"); + +$blockid = getBlockId(8,'LBL_NOTE_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (8,".$adb->getUniqueID("vtiger_field").",'note_no','vtiger_notes',1,'4','note_no','Document No',1,0,0,100,7,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_notes ADD COLUMN note_no varchar(100) not null"); + +$blockid = getBlockId(15,'LBL_FAQ_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (15,".$adb->getUniqueID("vtiger_field").",'faq_no','vtiger_faq',1,'4','faq_no','Faq No',1,0,0,100,2,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_faq ADD COLUMN faq_no varchar(100) not null"); + +$blockid = getBlockId(18,'LBL_VENDOR_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (18,".$adb->getUniqueID("vtiger_field").",'vendor_no','vtiger_vendor',1,'4','vendor_no','Vendor No',1,0,0,100,2,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_vendor ADD COLUMN vendor_no varchar(100) not null"); + +$blockid = getBlockId(19,'LBL_PRICEBOOK_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (19,".$adb->getUniqueID("vtiger_field").",'pricebook_no','vtiger_pricebook',1,'4','pricebook_no','PriceBook No',1,0,0,100,3,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_pricebook ADD COLUMN pricebook_no varchar(100) not null"); + +$blockid = getBlockId(22,'LBL_SO_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (22,".$adb->getUniqueID("vtiger_field").",'salesorder_no','vtiger_salesorder',1,'4','salesorder_no','SalesOrder No',1,0,0,100,3,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_salesorder ADD COLUMN salesorder_no varchar(100) not null"); + +$blockid = getBlockId(21,'LBL_PO_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (21,".$adb->getUniqueID("vtiger_field").",'purchaseorder_no','vtiger_purchaseorder',1,'4','purchaseorder_no','PurchaseOrder No',1,0,0,100,2,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_purchaseorder ADD COLUMN purchaseorder_no varchar(100) not null"); + +$blockid = getBlockId(20,'LBL_QUOTE_INFORMATION'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (20,".$adb->getUniqueID("vtiger_field").",'quote_no','vtiger_quotes',1,'4','quote_no','Quote No',1,0,0,100,3,$blockid,1,'V~O',1,null,'BAS',0)"); +ExecuteQuery("ALTER TABLE vtiger_quotes ADD COLUMN quote_no varchar(100) not null"); + + +$field_result = $adb->query("select tabid, fieldid from vtiger_field where uitype='4'"); +$num_fields = $adb->num_rows($field_result); +for($i = 0; $i<$num_fields; $i++) +{ + $tab_id = $adb->query_result($field_result,$i,'tabid'); + $fld_id = $adb->query_result($field_result,$i,'fieldid'); + addFieldSecurity($tab_id, $fld_id, false); +} + +ExecuteQuery("update vtiger_field set uitype = '4' where tabid = 23 and columnname = 'invoice_no' "); +ExecuteQuery("update vtiger_field set typeofdata = 'V~O' where tabid = 23 and columnname = 'invoice_no' "); + +// ADD COLUMN TO SPECIFIED MODULE CUSTOM VIEW / FILTER. +function custom_addCustomFilterColumn($module, $filtername, $tablename, $columnname, $fieldname, $displayinfo, $columnindex=0) { + global $adb; + + $result = $adb->query("SELECT * FROM vtiger_customview WHERE entitytype = '".$adb->sql_escape_string($module)."' AND viewname = '".$adb->sql_escape_string($filtername)."'"); + if($adb->num_rows($result) > 0) { + $cvid = $adb->query_result($result, 0, 'cvid'); + } + + if($cvid == null) return; + + // (cvid, columnindex) is combined key so we have to update columnindex suitably + ExecuteQuery("UPDATE vtiger_cvcolumnlist set columnindex=columnindex+1 WHERE cvid = $cvid AND columnindex >= $columnindex ORDER BY columnindex DESC"); + + $cvcolumnname_value = $tablename . ":" . $columnname . ":" . $fieldname . ":" . $displayinfo; + ExecuteQuery("INSERT INTO vtiger_cvcolumnlist(cvid, columnindex, columnname) VALUES ($cvid, $columnindex, '$cvcolumnname_value')"); +} + +// REMOVE SPECIFIED COLUMN FROM MODULE FILTER. +function custom_removeCustomFilterColumn($module, $filtername, $tablename, $columnname, $fieldname, $displayinfo) { + global $adb; + + $result = $adb->query("SELECT * FROM vtiger_customview WHERE entitytype = '".$adb->sql_escape_string($module)."' AND viewname = '".$adb->sql_escape_string($filtername)."'"); + if($adb->num_rows($result) > 0) { + $cvid = $adb->query_result($result, 0, 'cvid'); + } + + if($cvid == null) return; + + $cvcolumnname_value = $tablename . ":" . $columnname . ":" . $fieldname . ":" . $displayinfo; + ExecuteQuery("DELETE FROM vtiger_cvcolumnlist where cvid = $cvid and columnname like '$cvcolumnname_value:%' "); +} + +custom_addCustomFilterColumn('Leads', 'All', 'vtiger_leaddetails', 'lead_no', 'lead_no', 'Leads_Lead_No:V'); +custom_addCustomFilterColumn('Accounts', 'All', 'vtiger_account', 'account_no', 'account_no', 'Accounts_Account_No:V'); +custom_addCustomFilterColumn('Campaigns', 'All', 'vtiger_campaign', 'campaign_no', 'campaign_no', 'Campaigns_Campaign_No:V'); +custom_addCustomFilterColumn('Contacts', 'All', 'vtiger_contactdetails', 'contact_no', 'contact_no', 'Contacts_Contact_Id:V'); +custom_addCustomFilterColumn('Potentials', 'All', 'vtiger_potential', 'potential_no', 'potential_no', 'Potentials_Potential_No:V'); + +custom_removeCustomFilterColumn('HelpDesk', 'All', 'vtiger_crmentity', 'crmid', '', 'HelpDesk_Ticket_ID'); +custom_addCustomFilterColumn('HelpDesk', 'All', 'vtiger_troubletickets', 'ticket_no', 'ticket_no', 'HelpDesk_Ticket_No:V'); + +custom_removeCustomFilterColumn('Quotes', 'All', 'vtiger_crmentity', 'crmid', '', 'Quotes_Quote_No'); +custom_addCustomFilterColumn('Quotes', 'All', 'vtiger_quotes', 'quote_no', 'quote_no', 'Quotes_Quote_No:V'); + +custom_removeCustomFilterColumn('SalesOrder', 'All', 'vtiger_crmentity', 'crmid','','SalesOrder_Order_No'); +custom_addCustomFilterColumn('SalesOrder', 'All', 'vtiger_salesorder', 'salesorder_no', 'salesorder_no', 'SalesOrder_SalesOrder_No:V'); + +custom_removeCustomFilterColumn('PurchaseOrder', 'All', 'vtiger_crmentity', 'crmid', '', 'PurchaseOrder_Order_No'); +custom_addCustomFilterColumn('PurchaseOrder', 'All', 'vtiger_purchaseorder', 'purchaseorder_no', 'purchaseorder_no', 'PurchaseOrder_PurchaseOrder_No:V'); + +custom_addCustomFilterColumn('Products', 'All', 'vtiger_products', 'product_no', 'product_no', 'Products_Product_No:V'); +custom_addCustomFilterColumn('Vendors', 'All', 'vtiger_vendor', 'vendor_no', 'vendor_no', 'Vendors_Vendor_No:V'); +custom_addCustomFilterColumn('PriceBooks', 'All', 'vtiger_pricebook', 'pricebook_no', 'pricebook_no', 'PriceBooks_PriceBook_No:V'); + +custom_removeCustomFilterColumn('Faq', 'All', 'vtiger_faq', 'id', '', 'Faq_FAQ_Id'); +custom_addCustomFilterColumn('Faq', 'All', 'vtiger_faq', 'faq_no', 'faq_no', 'Faq_Faq_No:V'); + +custom_addCustomFilterColumn('Documents', 'All', 'vtiger_notes', 'note_no', 'note_no', 'Notes_Note_No:V'); +// Sequence number customization ends + +/*asterisk related changes*/ +$sql = "drop table if exists vtiger_asteriskextensions"; +ExecuteQuery($sql); +$sql = "create table vtiger_asteriskextensions (userid int(11), asterisk_extension varchar(50), use_asterisk varchar(3)) ENGINE=InnoDB DEFAULT CHARSET=utf8"; +ExecuteQuery($sql); +$sql = "drop table if exists vtiger_asterisk"; +ExecuteQuery($sql); +$sql = "create table vtiger_asterisk (server varchar(30), port varchar(30), username varchar(50), password varchar(50), version varchar(50)) ENGINE=InnoDB DEFAULT CHARSET=utf8"; +ExecuteQuery($sql); +$sql = "drop table if exists vtiger_asteriskincomingcalls"; +ExecuteQuery($sql); +$sql = "create table vtiger_asteriskincomingcalls (from_number varchar(50) not null, from_name varchar(50) not null, to_number varchar(50) not null, callertype varchar(30), flag int(19), timer int(19)) ENGINE=InnoDB DEFAULT CHARSET=utf8"; +ExecuteQuery($sql); +$sql = "drop table if exists vtiger_asteriskoutgoingcalls"; +ExecuteQuery($sql); +$sql = "create table vtiger_asteriskoutgoingcalls (userid int(11) not null, from_number varchar(30) not null, to_number varchar(30) not null) ENGINE=InnoDB DEFAULT CHARSET=utf8"; +ExecuteQuery($sql); + +/*asterisk changes end here*/ +/* Updated phone field uitype */ +ExecuteQuery("update vtiger_field set uitype='11' where fieldname='mobile' and tabid=".getTabid('Leads')); +ExecuteQuery("update vtiger_field set uitype='11' where fieldname='mobile' and tabid=".getTabid('Contacts')); +ExecuteQuery("update vtiger_field set uitype='11' where fieldname='fax' and tabid=".getTabid('Leads')); +ExecuteQuery("update vtiger_field set uitype='11' where fieldname='fax' and tabid=".getTabid('Contacts')); +ExecuteQuery("update vtiger_field set uitype='11' where fieldname='fax' and tabid=".getTabid('Accounts')); + +/* Support to Configure the functionality of Updating Inventory Stock for Invoice/SalesOrder */ +ExecuteQuery("ALTER TABLE vtiger_inventoryproductrel ADD COLUMN incrementondel int(11) not null default '0'"); +$invoiceids = $adb->pquery("SELECT invoiceid from vtiger_invoice",array()); +$noOfRows = $adb->num_rows($invoiceids); +for($i=0;$i<$noOfRows;$i++){ + $adb->pquery("UPDATE vtiger_inventoryproductrel SET incrementondel = 1 WHERE id=?",array($adb->query_result($invoiceids,$i,"invoiceid"))); +} + +$emm->addEntityMethod("SalesOrder","UpdateInventory","include/InventoryHandler.php","handleInventoryProductRel");//Adding EntityMethod for Updating Products data after creating SalesOrder +$emm->addEntityMethod("Invoice","UpdateInventory","include/InventoryHandler.php","handleInventoryProductRel");//Adding EntityMethod for Updating Products data after creating Invoice + +$vtWorkFlow = new VTWorkflowManager($adb); +$invWorkFlow = $vtWorkFlow->newWorkFlow("Invoice"); +$invWorkFlow->test = '[{"fieldname":"subject","operation":"does not contain","value":"`!`"}]'; +$invWorkFlow->description = "UpdateInventoryProducts On Every Save"; +$vtWorkFlow->save($invWorkFlow); + +$tm = new VTTaskManager($adb); +$task = $tm->createTask('VTEntityMethodTask', $invWorkFlow->id); +$task->active=true; +$task->methodName = "UpdateInventory"; +$tm->saveTask($task); + +/* Support to track if a module is of CrmEntity type or not */ +ExecuteQuery("ALTER TABLE vtiger_tab ADD COLUMN isentitytype INT NOT NULL DEFAULT 1"); +ExecuteQuery("UPDATE vtiger_tab SET isentitytype=0 WHERE name IN ('Home','Dashboard','Rss','Reports','Portal','Users','Recyclebin')"); + +/* Support for different languages to be stored in database instead of config file - Vtlib */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_language(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), " . + "prefix VARCHAR(10), label VARCHAR(30), lastupdated DATETIME, sequence INT, isdefault INT(1), active INT(1)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +/* Register default language English. This will automatically register all the other langauges from config file */ +require_once('vtlib/Vtiger/Language.php'); +$vtlanguage = new Vtiger_Language(); +$vtlanguage->register('en_us','US English','English',true,true,true); + +/* To store relationship between the modules in a common table */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_crmentityrel (crmid int(11) NOT NULL, module varchar(100) NOT NULL, relcrmid int(11) NOT NULL, relmodule varchar(100) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +/* To store the field to module relationship for uitype 10 */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_fieldmodulerel (fieldid int(11) NOT NULL, module varchar(100) NOT NULL, relmodule varchar(100) NOT NULL, + status varchar(10) default NULL, sequence int(11) default NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +/* Making users and groups depends on vtiger_users_seq */ +$max_grp_id = $adb->query("SELECT MAX(groupid) as maxid from vtiger_groups"); +$maxid = $adb->query_result($max_grp_id,0,"maxid"); + +$user_result = $adb->query("select max(id) as userid from vtiger_users"); +$inc_num = $adb->query_result($user_result,0,"userid"); + +$adb->getUniqueId("vtiger_users");//Creates vtiger_users_seq table if not exists. +$seq_id = $inc_num+$maxid; +$adb->pquery("UPDATE vtiger_users_seq SET id=?",array($seq_id)); + +$tab_info = array( + "vtiger_group2grouprel"=>array("fk_2_vtiger_group2grouprel","(groupid)","vtiger_groups(groupid)"), + "vtiger_users2group"=>array("fk_1_vtiger_users2group","(groupid)","vtiger_groups(groupid)"), + "vtiger_group2role"=>array("fk_1_vtiger_group2role","(groupid)","vtiger_groups(groupid)"), + "vtiger_group2rs"=>array("fk_1_vtiger_group2rs","(groupid)","vtiger_groups(groupid)"), + "vtiger_datashare_grp2grp"=>array("fk_2_vtiger_datashare_grp2grp","(share_groupid)","vtiger_groups(groupid)"), + "vtiger_datashare_grp2grp"=>array("fk_3_vtiger_datashare_grp2grp","(to_groupid)","vtiger_groups(groupid)"), + "vtiger_datashare_grp2role"=>array("fk_2_vtiger_datashare_grp2role","(share_groupid)","vtiger_groups(groupid)"), + "vtiger_datashare_role2group"=>array("fk_2_vtiger_datashare_role2group","(to_groupid)","vtiger_groups(groupid)"), + "vtiger_datashare_grp2rs"=>array("fk_2_vtiger_datashare_grp2rs","(share_groupid)","vtiger_groups(groupid)"), + "vtiger_datashare_rs2grp"=>array("fk_2_vtiger_datashare_rs2grp","(to_groupid)","vtiger_groups(groupid)"), + "vtiger_tmp_read_group_sharing_per"=>array("fk_1_vtiger_tmp_read_group_sharing_per","(sharedgroupid)","vtiger_groups(groupid)"), + "vtiger_tmp_write_group_sharing_per"=>array("fk_1_vtiger_tmp_write_group_sharing_per","(sharedgroupid)","vtiger_groups(groupid)"), +); +$drop_key_array = array("vtiger_group2grouprel","vtiger_datashare_grp2grp"); + +foreach($tab_info as $table=>$value){ + //Update constraints for vtiger_group2grouprel table + if(in_array($table,$drop_key_array)){ + ExecuteQuery("ALTER TABLE $table DROP FOREIGN KEY ".$value[0]); + } + ExecuteQuery("ALTER TABLE $table ADD CONSTRAINT ".$value[0]." FOREIGN KEY ".$value[1]." REFERENCES ".$value[2]." ON DELETE CASCADE ON UPDATE CASCADE"); +} + +$grp_result = $adb->query("select groupid from vtiger_groups ORDER BY groupid ASC"); +$num_grps = $adb->num_rows($grp_result); + +for($i=$num_grps-1; $i>=0; $i--) { + $oldId = $adb->query_result($grp_result,$i,"groupid"); + $newId = $adb->getUniqueId("vtiger_users"); + + ExecuteQuery("UPDATE vtiger_groups set groupid = $newId where groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_users2group set groupid = $newId where groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_group2grouprel set groupid = $newId where groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_group2role set groupid = $newId where groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_group2rs set groupid = $newId where groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_datashare_grp2grp set share_groupid = $newId where share_groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_datashare_grp2grp set to_groupid = $newId where to_groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_datashare_grp2role set share_groupid = $newId where share_groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_datashare_grp2rs set share_groupid = $newId where share_groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_datashare_role2group set to_groupid = $newId where to_groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_datashare_rs2grp set to_groupid = $newId where to_groupid = $oldId"); + ExecuteQuery("UPDATE vtiger_tmp_read_group_sharing_per set sharedgroupid = $newId where sharedgroupid = $oldId"); + ExecuteQuery("UPDATE vtiger_tmp_write_group_sharing_per set sharedgroupid = $newId where sharedgroupid = $oldId"); +} + +$sql_result = $adb->query("select crmid,setype from vtiger_crmentity where smownerid=0 order by setype"); +$num_rows = $adb->num_rows($sql_result); +$groupTables_array = array ( + 'Leads'=>array ('vtiger_leadgrouprelation','leadid'), + 'Accounts'=>array ('vtiger_accountgrouprelation','accountid'), + 'Contacts'=>array ('vtiger_contactgrouprelation','contactid'), + 'Potentials'=>array ('vtiger_potentialgrouprelation','potentialid'), + 'Quotes'=>array ('vtiger_quotegrouprelation','quoteid'), + 'SalesOrder'=>array ('vtiger_sogrouprelation','salesorderid'), + 'Invoice'=>array ('vtiger_invoicegrouprelation','invoiceid'), + 'PurchaseOrder'=>array ('vtiger_pogrouprelation','purchaseorderid'), + 'HelpDesk'=>array ('vtiger_ticketgrouprelation','ticketid'), + 'Campaigns'=>array ('vtiger_campaigngrouprelation','campaignid'), + 'Calendar'=>array ('vtiger_activitygrouprelation','activityid') + ); + +foreach($groupTables_array as $module=>$index){ + $modulereltable = $index[0]; + $modulerelindex = $index[1]; + ExecuteQuery("update vtiger_crmentity INNER JOIN {$modulereltable} ON vtiger_crmentity.crmid = {$modulereltable}.{$modulerelindex} INNER JOIN vtiger_groups ON vtiger_groups.groupname = {$modulereltable}.groupname set smownerid = vtiger_groups.groupid"); + ExecuteQuery("UPDATE vtiger_crmentity SET smownerid=1 WHERE smownerid=0 AND setype='{$module}'"); +} +// user-group ends + +/* Product Comment was Missing in Inventory PDF's - Fixed this by eliminating column product_description from vtiger_products + * and referring to description column of vtiger_crmentity wherever required */ +ExecuteQuery("UPDATE vtiger_crmentity, vtiger_products SET vtiger_crmentity.description=vtiger_products.product_description + WHERE vtiger_products.productid = vtiger_crmentity.crmid"); +ExecuteQuery("ALTER TABLE vtiger_products DROP COLUMN product_description"); +ExecuteQuery("UPDATE vtiger_field set fieldname='description', columnname='description', tablename='vtiger_crmentity' + WHERE tablename='vtiger_products' AND fieldname='product_description'"); + +/* Remove Products from all the Main tabs except for Inventory */ +$productTabId = getTabid('Products'); + +$inventoryTabRes = $adb->query("SELECT parenttabid FROM vtiger_parenttab WHERE parenttab_label='Inventory'"); +if($adb->num_rows($inventoryTabRes)>0){ + $inventoryTabId = $adb->query_result($inventoryTabRes, 0, 'parenttabid'); + ExecuteQuery("DELETE FROM vtiger_parenttabrel WHERE tabid=$productTabId AND parenttabid != $inventoryTabId"); +} + +$adb->query("ALTER TABLE vtiger_producttaxrel DROP FOREIGN KEY fk_1_vtiger_producttaxrel"); +$adb->query("ALTER TABLE vtiger_pricebookproductrel DROP FOREIGN KEY fk_2_vtiger_pricebookproductrel"); + +/* Vtlib Changes - Table added to store different types of links */ +/*ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_links (linkid INT AUTO_INCREMENT NOT NULL PRIMARY KEY, + tabid INT, linktype VARCHAR(20), linklabel VARCHAR(30), linkurl VARCHAR(255), linkicon VARCHAR(100), sequence INT) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE INDEX link_tabidtype_idx ON vtiger_links(tabid,linktype)");*/ + +/* Column added to vtiger_tab to track the version of the module */ +if(!in_array('version', $adb->getColumnNames('vtiger_tab'))) { + ExecuteQuery("ALTER TABLE vtiger_tab ADD COLUMN version VARCHAR(10)"); +} + +/*adding the notebook to vtiger*/ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_notebook_contents (userid int(19) not null, notebookid int(19), contents text) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +/*notbook changes end*/ + +/* Move Settings Page Information to Database */ +// This function moves the settings page to database +function moveSettingsToDatabase($adb){ + $adb->query("drop table if exists vtiger_settings_blocks"); + $adb->query("drop table if exists vtiger_settings_field"); + $adb->query("CREATE TABLE IF NOT EXISTS vtiger_settings_blocks (blockid int(19), label varchar(250), sequence int(19), primary key pk_vtiger_settings_blocks (blockid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + $adb->query("CREATE TABLE IF NOT EXISTS vtiger_settings_field (fieldid int(19), blockid int(19), name varchar(250), iconpath text, description text, linkto text, sequence int(19), active int(19) default 0,foreign key fk_vtiger_settings_fields (blockid) references vtiger_settings_blocks(blockid) on delete cascade) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + + //icons for all fields + $icons = array("ico-users.gif", + "ico-roles.gif", + "ico-profile.gif", + "ico-groups.gif", + "shareaccess.gif", + "orgshar.gif", + "audit.gif", + "set-IcoLoginHistory.gif", + "vtlib_modmng.gif", + "picklist.gif", + "ViewTemplate.gif", + "mailmarge.gif", + "notification.gif", + "inventory.gif", + "company.gif", + "ogmailserver.gif", + "backupserver.gif", + "assign.gif", + "currency.gif", + "taxConfiguration.gif", + "system.gif", + "proxy.gif", + "announ.gif", + "set-IcoTwoTabConfig.gif", + "terms.gif", + "settingsInvNumber.gif", + "mailScanner.gif", + "settingsWorkflow.png"); + + //labels for blocks + $blocks = array('LBL_MODULE_MANAGER', + 'LBL_USER_MANAGEMENT', + 'LBL_STUDIO', + 'LBL_COMMUNICATION_TEMPLATES', + 'LBL_OTHER_SETTINGS'); + + //field names + $names = array('LBL_USERS', + 'LBL_ROLES', + 'LBL_PROFILES', + 'USERGROUPLIST', + 'LBL_SHARING_ACCESS', + 'LBL_FIELDS_ACCESS', + 'LBL_AUDIT_TRAIL', + 'LBL_LOGIN_HISTORY_DETAILS', + 'VTLIB_LBL_MODULE_MANAGER', + 'LBL_PICKLIST_EDITOR', + 'EMAILTEMPLATES', + 'LBL_MAIL_MERGE', + 'NOTIFICATIONSCHEDULERS', + 'INVENTORYNOTIFICATION', + 'LBL_COMPANY_DETAILS', + 'LBL_MAIL_SERVER_SETTINGS', + 'LBL_BACKUP_SERVER_SETTINGS', + 'LBL_ASSIGN_MODULE_OWNERS', + 'LBL_CURRENCY_SETTINGS', + 'LBL_TAX_SETTINGS', + 'LBL_SYSTEM_INFO', + 'LBL_PROXY_SETTINGS', + 'LBL_ANNOUNCEMENT', + 'LBL_DEFAULT_MODULE_VIEW', + 'INVENTORYTERMSANDCONDITIONS', + 'LBL_CUSTOMIZE_MODENT_NUMBER', + 'LBL_MAIL_SCANNER', + 'LBL_LIST_WORKFLOWS',); + + $name_blocks = array('LBL_USERS'=>'LBL_USER_MANAGEMENT', + 'LBL_ROLES'=>'LBL_USER_MANAGEMENT', + 'LBL_PROFILES'=>'LBL_USER_MANAGEMENT', + 'USERGROUPLIST'=>'LBL_USER_MANAGEMENT', + 'LBL_SHARING_ACCESS'=>'LBL_USER_MANAGEMENT', + 'LBL_FIELDS_ACCESS'=>'LBL_USER_MANAGEMENT', + 'LBL_AUDIT_TRAIL'=>'LBL_USER_MANAGEMENT', + 'LBL_LOGIN_HISTORY_DETAILS'=>'LBL_USER_MANAGEMENT', + 'VTLIB_LBL_MODULE_MANAGER'=>'LBL_STUDIO', + 'LBL_PICKLIST_EDITOR'=>'LBL_STUDIO', + 'EMAILTEMPLATES'=>'LBL_COMMUNICATION_TEMPLATES', + 'LBL_MAIL_MERGE'=>'LBL_COMMUNICATION_TEMPLATES', + 'NOTIFICATIONSCHEDULERS'=>'LBL_COMMUNICATION_TEMPLATES', + 'INVENTORYNOTIFICATION'=>'LBL_COMMUNICATION_TEMPLATES', + 'LBL_COMPANY_DETAILS'=>'LBL_COMMUNICATION_TEMPLATES', + 'LBL_MAIL_SERVER_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_BACKUP_SERVER_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_ASSIGN_MODULE_OWNERS'=>'LBL_OTHER_SETTINGS', + 'LBL_CURRENCY_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_TAX_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_SYSTEM_INFO'=>'LBL_OTHER_SETTINGS', + 'LBL_PROXY_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_ANNOUNCEMENT'=>'LBL_OTHER_SETTINGS', + 'LBL_DEFAULT_MODULE_VIEW'=>'LBL_OTHER_SETTINGS', + 'INVENTORYTERMSANDCONDITIONS'=>'LBL_OTHER_SETTINGS', + 'LBL_CUSTOMIZE_MODENT_NUMBER'=>'LBL_OTHER_SETTINGS', + 'LBL_MAIL_SCANNER'=>'LBL_OTHER_SETTINGS', + 'LBL_LIST_WORKFLOWS'=>'LBL_OTHER_SETTINGS',); + + //description for fields + $description = array('LBL_USER_DESCRIPTION', + 'LBL_ROLE_DESCRIPTION', + 'LBL_PROFILE_DESCRIPTION', + 'LBL_GROUP_DESCRIPTION', + 'LBL_SHARING_ACCESS_DESCRIPTION', + 'LBL_SHARING_FIELDS_DESCRIPTION', + 'LBL_AUDIT_DESCRIPTION', + 'LBL_LOGIN_HISTORY_DESCRIPTION', + 'VTLIB_LBL_MODULE_MANAGER_DESCRIPTION', + 'LBL_PICKLIST_DESCRIPTION', + 'LBL_EMAIL_TEMPLATE_DESCRIPTION', + 'LBL_MAIL_MERGE_DESCRIPTION', + 'LBL_NOTIF_SCHED_DESCRIPTION', + 'LBL_INV_NOTIF_DESCRIPTION', + 'LBL_COMPANY_DESCRIPTION', + 'LBL_MAIL_SERVER_DESCRIPTION', + 'LBL_BACKUP_SERVER_DESCRIPTION', + 'LBL_MODULE_OWNERS_DESCRIPTION', + 'LBL_CURRENCY_DESCRIPTION', + 'LBL_TAX_DESCRIPTION', + 'LBL_SYSTEM_DESCRIPTION', + 'LBL_PROXY_DESCRIPTION', + 'LBL_ANNOUNCEMENT_DESCRIPTION', + 'LBL_DEFAULT_MODULE_VIEW_DESC', + 'LBL_INV_TANDC_DESCRIPTION', + 'LBL_CUSTOMIZE_MODENT_NUMBER_DESCRIPTION', + 'LBL_MAIL_SCANNER_DESCRIPTION', + 'LBL_LIST_WORKFLOWS_DESCRIPTION'); + + + $links = array('index.php?module=Administration&action=index&parenttab=Settings', + 'index.php?module=Settings&action=listroles&parenttab=Settings', + 'index.php?module=Settings&action=ListProfiles&parenttab=Settings', + 'index.php?module=Settings&action=listgroups&parenttab=Settings', + 'index.php?module=Settings&action=OrgSharingDetailView&parenttab=Settings', + 'index.php?module=Settings&action=DefaultFieldPermissions&parenttab=Settings', + 'index.php?module=Settings&action=AuditTrailList&parenttab=Settings', + 'index.php?module=Settings&action=ListLoginHistory&parenttab=Settings', + 'index.php?module=Settings&action=ModuleManager&parenttab=Settings', + 'index.php?module=PickList&action=PickList&parenttab=Settings', + 'index.php?module=Settings&action=listemailtemplates&parenttab=Settings', + 'index.php?module=Settings&action=listwordtemplates&parenttab=Settings', + 'index.php?module=Settings&action=listnotificationschedulers&parenttab=Settings', + 'index.php?module=Settings&action=listinventorynotifications&parenttab=Settings', + 'index.php?module=Settings&action=OrganizationConfig&parenttab=Settings', + 'index.php?module=Settings&action=EmailConfig&parenttab=Settings', + 'index.php?module=Settings&action=BackupServerConfig&parenttab=Settings', + 'index.php?module=Settings&action=ListModuleOwners&parenttab=Settings', + 'index.php?module=Settings&action=CurrencyListView&parenttab=Settings', + 'index.php?module=Settings&action=TaxConfig&parenttab=Settings', + 'index.php?module=System&action=listsysconfig&parenttab=Settings', + 'index.php?module=Settings&action=ProxyServerConfig&parenttab=Settings', + 'index.php?module=Settings&action=Announcements&parenttab=Settings', + 'index.php?module=Settings&action=DefModuleView&parenttab=Settings', + 'index.php?module=Settings&action=OrganizationTermsandConditions&parenttab=Settings', + 'index.php?module=Settings&action=CustomModEntityNo&parenttab=Settings', + 'index.php?module=Settings&action=MailScanner&parenttab=Settings', + 'index.php?module=com_vtiger_workflow&action=workflowlist&parenttab=Settings',); + + //insert settings blocks + $count = count($blocks); + for($i=0; $i<$count; $i++){ + $adb->query("insert into vtiger_settings_blocks values (".$adb->getUniqueID('vtiger_settings_blocks').", '$blocks[$i]', $i+1)"); + } + + $count = count($icons); + //insert settings fields + for($i=0, $seq=1; $i<$count; $i++, $seq++){ + if($i==8 || $i==12 || $i==18) { + $seq = 1; + } + $adb->query("insert into vtiger_settings_field (fieldid, blockid, name, iconpath, description, linkto, sequence) values (".$adb->getUniqueID('vtiger_settings_field').", ".getSettingsBlockId($name_blocks[$names[$i]]).", '$names[$i]', '$icons[$i]', '$description[$i]', '$links[$i]', $seq)"); + } + //hide the system details tab for now + $adb->query("update vtiger_settings_field set active=1 where name='LBL_SYSTEM_INFO'"); +} +//move settings page to database starts +moveSettingsToDatabase($adb); +//settings page to database ends +// END + + +/* Email status tracking*/ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_email_access(crmid INT, mailid INT, accessdate DATE, accesstime TIME) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_email_track(crmid INT, mailid INT, access_count INT, primary key(crmid, mailid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +$fieldid = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) VALUES ('10',".$fieldid.", 'access_count', 'vtiger_email_track', '1', '25', 'access_count', 'Access Count', '1', '0', '0', '100', '6', '21', '3', 'V~O', '1', NULL, 'BAS', 0)"); +addFieldSecurity(10, $fieldid, 'false'); +// END + +/* Reports Revamped */ +ExecuteQuery("ALTER TABLE vtiger_report ADD COLUMN owner int(11) NOT NULL"); +ExecuteQuery("UPDATE vtiger_field INNER JOIN vtiger_field as vtiger_field1 on vtiger_field1.tabid=vtiger_field.tabid SET vtiger_field.block = vtiger_field1.block WHERE vtiger_field.fieldname='faq_answer' and vtiger_field1.fieldname='question' and vtiger_field.tabid=15"); +ExecuteQuery("ALTER TABLE vtiger_report ADD COLUMN sharingtype varchar(200) NOT NULL DEFAULT 'Private'"); +ExecuteQuery("UPDATE vtiger_report SET sharingtype='Public', owner=1"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_reportsharing(reportid int(19) not null,shareid int(19) not null,setype varchar(200) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_reportfilters(filterid int(11) not null,name varchar(200) not null) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("INSERT INTO vtiger_reportfilters values(1,'Private')"); +ExecuteQuery("INSERT INTO vtiger_reportfilters values(2,'Public')"); +ExecuteQuery("INSERT INTO vtiger_reportfilters values(3,'Shared')"); + +/* Account Hierarchy */ +populateLinks(); + +/* Product Bundles Revamping */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_inventorysubproductrel(id int(19) NOT NULL, sequence_no INT(10) NOT NULL, productid INT(19) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +/* Support for Calendar Custom Fields */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_activitycf(activityid INT default '0' primary key) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +ExecuteQuery("insert into vtiger_blocks values (".$adb->getUniqueID('vtiger_blocks').",9,'LBL_CUSTOM_INFORMATION',3,0,0,0,0,0,1)"); +ExecuteQuery("insert into vtiger_blocks values (".$adb->getUniqueID('vtiger_blocks').",16,'LBL_CUSTOM_INFORMATION',4,0,0,0,0,0,1)"); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable) values (16,".$adb->getUniqueID('vtiger_field').",'contactid','vtiger_cntactivityrel',1,'57','contact_id','Contact Name',1,0,0,100,1,19,1,'I~O',1,null,'BAS',1)"); + +/* Added new field Help Info for vtiger_field table */ +if(!in_array('helpinfo', $adb->getColumnNames('vtiger_field'))) { + ExecuteQuery("ALTER TABLE vtiger_field ADD COLUMN helpinfo TEXT"); +} + +/* Add Services and Service Contracts Module */ + +// Added Hours and Days fields for HelpDesk module. +$helpDeskTabid = getTabid('HelpDesk'); +$ttBlockid = getBlockId($helpDeskTabid,'LBL_TICKET_INFORMATION'); + +$tt_field1 = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable, helpinfo) values ($helpDeskTabid,$tt_field1,'hours','vtiger_troubletickets',1,'1','hours','Hours',1,0,0,100,9,$ttBlockid,1,'I~O',1,null,'BAS',1, + 'This gives the estimated hours for the Ticket
    When the same ticket is added to a Service Contract, based on the Tracking Unit of the Service Contract, Used units is updated whenever a ticket is Closed.')"); +addFieldSecurity($helpDeskTabid, $tt_field1); +ExecuteQuery("ALTER TABLE vtiger_troubletickets ADD COLUMN hours VARCHAR(200)"); + +$tt_field2 = $adb->getUniqueID('vtiger_field'); +ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable, helpinfo) values ($helpDeskTabid,$tt_field2,'days','vtiger_troubletickets',1,'1','days','Days',1,0,0,100,10,$ttBlockid,1,'I~O',1,null,'BAS',1, + 'This gives the estimated days for the Ticket
    When the same ticket is added to a Service Contract, based on the Tracking Unit of the Service Contract, Used units is updated whenever a ticket is Closed.')"); +addFieldSecurity($helpDeskTabid, $tt_field2); +ExecuteQuery("ALTER TABLE vtiger_troubletickets ADD COLUMN days VARCHAR(200)"); +// Adding fields ends here + +//layout editor changes +$helpdesktabid = getTabid('HelpDesk'); +$invoicetabid = getTabid('Invoice'); +$salesordertabid = getTabid('SalesOrder'); +$purchaseorder = getTabid('PurchaseOrder'); +$faqtabid = getTabid('Faq'); +$quotes = getTabid('Quotes'); +$contacttabid = getTabid('Contacts'); +$campaigntabid = getTabid('Campaigns'); +$leadtabid = getTabid('Leads'); +$potentialtabid = getTabid('Potentials'); +$pricebooktabid = getTabid('PriceBooks'); +$producttabid = getTabid('Products'); +$vendortabid= getTabid('Vendors'); +$accounttabid = getTabid('Accounts'); + +ExecuteQuery("alter table vtiger_blocks add column iscustom int default 0"); + +ExecuteQuery("update vtiger_field set presence=2"); +ExecuteQuery("update vtiger_field set presence=0 where quickcreate=0 or fieldname='createdtime' or fieldname='modifiedtime' or typeofdata like '%M';"); +ExecuteQuery("update vtiger_field set presence=0 where fieldname in ('update_log','parent_id','comments','solution') and tabid=$helpdesktabid"); +ExecuteQuery("update vtiger_field set presence=0 where fieldname='potentialname'"); +ExecuteQuery("update vtiger_field set presence=0 where fieldname = 'comments' and tabid = $faqtabid"); +ExecuteQuery("update vtiger_field set typeofdata='I~M',presence=2 where fieldname='account_id' and tabid =$potentialtabid "); +ExecuteQuery("update vtiger_field set typeofdata='I~M',presence=2 where fieldname='account_id' and tabid =$quotes"); +ExecuteQuery("update vtiger_field set typeofdata='I~M',presence=2 where fieldname='account_id' and tabid =$salesordertabid"); +ExecuteQuery("update vtiger_field set typeofdata='I~M',presence=2 where fieldname='account_id' and tabid =$invoicetabid"); + +ExecuteQuery("update vtiger_field set presence=0,quickcreate=2 where fieldname='account_id' and tabid = $contacttabid"); +ExecuteQuery("update vtiger_field set presence=0,quickcreate=0 where fieldname='taxclass' and tabid=$producttabid"); +ExecuteQuery("update vtiger_field set presence = 0,quickcreate=3 where block = $new_block_id "); //for recurring invoice block the fields are always active +ExecuteQuery("update vtiger_field set quickcreate=3 where fieldname='createdtime' or fieldname='modifiedtime'"); +ExecuteQuery("update vtiger_field set quickcreate=3 where tabid in ($invoicetabid,$salesordertabid,$purchaseorder,$quotes,$faqtabid)"); +ExecuteQuery("update vtiger_field set quickcreate=1 where fieldname in ('subject','account_id','bill_street','ship_street') and tabid= $invoicetabid"); +ExecuteQuery("update vtiger_field set quickcreate=1 where fieldname in ('subject','account_id','bill_street','ship_street') and tabid= $salesordertabid"); +ExecuteQuery("update vtiger_field set quickcreate=1 where fieldname in ('subject','vendor_id','bill_street','ship_street') and tabid = $purchaseorder"); +ExecuteQuery("update vtiger_field set quickcreate=1 where fieldname in ('subject','account_id','bill_street','ship_street') and tabid= $quotes"); + +ExecuteQuery("update vtiger_field set masseditable=0 where tabid = $documents_tab_id or fieldname ='createdtime' or fieldname = 'modifiedtime'"); +ExecuteQuery("update vtiger_field set typeofdata='V~O',presence=0 where uitype=4"); +ExecuteQuery("update vtiger_field set quickcreate=3,masseditable=0 where uitype=4 AND displaytype=2"); +ExecuteQuery("update vtiger_field set quickcreate=3 where fieldname='imagename'"); +ExecuteQuery("update vtiger_field set quickcreate=2,presence=2 where fieldname in('website','phone') and tabid = $accounttabid"); +ExecuteQuery("update vtiger_field set quickcreate=2,presence=2 where fieldname in('closingdate','campaigntype','expectedresponse','product_id','campaignstatus') and tabid = $campaigntabid"); +ExecuteQuery("update vtiger_field set quickcreate=2,presence=2 where fieldname in('firstname','phone','email') and tabid = $contacttabid"); +ExecuteQuery("update vtiger_field set quickcreate=2,presence=2 where fieldname in('firstname','phone','email','company') and tabid = $leadtabid "); +ExecuteQuery("update vtiger_field set quickcreate=2,presence=2 where fieldname in('closingdate','sales_stage','amount','account_id') and tabid = $potentialtabid"); +ExecuteQuery("update vtiger_field set quickcreate=2,presence=2 where fieldname in('active') and tabid = $pricebooktabid"); +ExecuteQuery("update vtiger_field set quickcreate=2,presence=2 where fieldname in('discontinued','unit_price') and tabid = $producttabid"); +ExecuteQuery("update vtiger_field set quickcreate=2,presence=2 where fieldname in('phone','email') and tabid = $vendortabid"); +ExecuteQuery("update vtiger_field set quickcreate=2,presence=2 where fieldname in('ticket_title','ticketstatus') and tabid = $helpdesktabid"); +$faqbasicblock = getBlockId($faqtabid,'LBL_FAQ_INFORMATION'); + +ExecuteQuery("update vtiger_field set block = $faqbasicblock ,sequence = 7 where fieldname = 'question' and tabid = $faqtabid"); +ExecuteQuery("update vtiger_field set block = $faqbasicblock ,sequence = 8 where fieldname = 'faq_answer' and tabid = $faqtabid"); + +/* Added support for setting a custom view as default per user basis */ +ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_user_module_preferences (userid int, tabid int, default_cvid int, primary key(userid, tabid), CONSTRAINT fk_1_vtiger_user_module_preferences FOREIGN KEY (userid) REFERENCES vtiger_users (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fk_2_vtiger_user_module_preferences FOREIGN KEY (tabid) REFERENCES vtiger_tab (tabid) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +/* home page related changes */ +if(columnExists("homeorder", "vtiger_users")){ + ExecuteQuery("alter table vtiger_users drop column homeorder"); +} +if(columnExists("tagcloud_view", "vtiger_users")){ + ExecuteQuery("alter table vtiger_users drop column tagcloud_view"); +} +if(columnExists("defhomeview", "vtiger_users")){ + ExecuteQuery("alter table vtiger_users drop column defhomeview"); +} +ExecuteQuery("create table vtiger_home_layout (userid int(19), layout int(19)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + +/* Add Invoices to the related list of Contacts */ +ExecuteQuery("INSERT INTO vtiger_relatedlists VALUES(".$adb->getUniqueID('vtiger_relatedlists').",". getTabid('Contacts').",".getTabid('Invoice').",'get_invoices',12,'Invoice',0, 'add')"); + +/* For Webservices Support */ +require_once 'include/Webservices/Utils.php'; +webserviceMigration(); + +/* Install Vtlib Compliant Modules */ +installMandatoryModules(); +require_once('include/utils/installVtlibSelectedModules.php'); + +/*adding B2C model support*/ +ExecuteQuery("alter table vtiger_potential change accountid related_to int(19)"); +$sql = "select fieldid from vtiger_field where tabid=? and columnname=?"; +$result = $adb->pquery($sql, array(getTabid('Potentials'), 'accountid')); +$fieldid = $adb->query_result($result,0,"fieldid"); +ExecuteQuery("update vtiger_field set uitype='10', typeofdata='V~M', columnname='related_to', fieldname='related_to',fieldlabel='Related To', presence=0 where fieldid=$fieldid"); +ExecuteQuery("insert into vtiger_fieldmodulerel (fieldid, module, relmodule, status, sequence) values ($fieldid, 'Potentials', 'Accounts', NULL, 0), ($fieldid, 'Potentials', 'Contacts', NULL, 1)"); + +ExecuteQuery("update vtiger_cvcolumnlist set columnname='vtiger_potential:related_to:related_to:Potentials_Related_To:V' where columnname='vtiger_account:accountname:accountname:Potentials_Account_Name:V'"); + +// Function to call installation of mandatory modules +function installMandatoryModules(){ + + if ($handle = opendir('packages/5.1.0/mandatory')) { + + while (false !== ($file = readdir($handle))) { + $filename_arr = explode(".", $file); + $packagename = $filename_arr[0]; + if (!empty($packagename)) { + $packagepath = "packages/5.1.0/mandatory/$file"; + installVtlibModule($packagename, $packagepath); + } + } + closedir($handle); + } +} + +// Function to populate Links +function populateLinks() { + include_once('vtlib/Vtiger/Module.php'); + + // Links for Accounts module + $moduleInstance = Vtiger_Module::getInstance('Accounts'); + // Detail View Custom link + $moduleInstance->addLink( + 'DETAILVIEWBASIC', 'LBL_ADD_NOTE', + 'index.php?module=Documents&action=EditView&return_module=$MODULE$&return_action=DetailView&return_id=$RECORD$&parent_id=$RECORD$', + 'themes/images/bookMark.gif' + ); + $moduleInstance->addLink('DETAILVIEWBASIC', 'LBL_SHOW_ACCOUNT_HIERARCHY', 'index.php?module=Accounts&action=AccountHierarchy&accountid=$RECORD$'); + + $moduleInstance2 = Vtiger_Module::getInstance('Leads'); + $moduleInstance2->addLink( + 'DETAILVIEWBASIC', 'LBL_ADD_NOTE', + 'index.php?module=Documents&action=EditView&return_module=$MODULE$&return_action=DetailView&return_id=$RECORD$&parent_id=$RECORD$', + 'themes/images/bookMark.gif' + ); + + $moduleInstance3 = Vtiger_Module::getInstance('Contacts'); + $moduleInstance3->addLink( + 'DETAILVIEWBASIC', 'LBL_ADD_NOTE', + 'index.php?module=Documents&action=EditView&return_module=$MODULE$&return_action=DetailView&return_id=$RECORD$&parent_id=$RECORD$', + 'themes/images/bookMark.gif' + ); +} + +/* For Webservices Support */ +function webserviceMigration(){ + global $adb; + require_once 'include/utils/CommonUtils.php'; + require_once 'include/Webservices/Utils.php'; + $fieldTypeInfo = array('picklist'=>array(15,16),'text'=>array(19,20,21,24),'autogenerated'=>array(3),'phone'=>array(11), + 'multipicklist'=>array(33),'url'=>array(17),'skype'=>array(85),'boolean'=>array(56,156), + 'owner'=>array(53),'file'=>array(61,28)); + $referenceMapping = array("50"=>array("Accounts"),"51"=>array("Accounts"),"57"=>array("Contacts"),"58"=>array("Campaigns"), + "73"=>array("Accounts"),"75"=>array("Vendors"),"76"=>array("Potentials"),"78"=>array("Quotes"), + "80"=>array("SalesOrder"),"81"=>array("Vendors"),"101"=>array("Users"),"52"=>array("Users"), + "357"=>array("Contacts","Accounts","Leads","Users","Vendors"),"59"=>array("Products"), + "66"=>array("Leads","Accounts","Potentials","HelpDesk"),"77"=>array("Users"),"68"=>array("Contacts","Accounts"), + "117"=>array('Currency'),"116"=>array('Currency'),'26'=>array('DocumentFolders'),'10'=>array()); + ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_ws_fieldtype(fieldtypeid integer(19) not null auto_increment,uitype varchar(30)not null,fieldtype varchar(200) not null,PRIMARY KEY(fieldtypeid),UNIQUE KEY uitype_idx (uitype)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_ws_referencetype(fieldtypeid integer(19) not null,type varchar(25) not null,PRIMARY KEY(fieldtypeid,type), CONSTRAINT `fk_1_vtiger_referencetype` FOREIGN KEY (`fieldtypeid`) REFERENCES `vtiger_ws_fieldtype` (`fieldtypeid`) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_ws_userauthtoken(userid integer(19) not null,token varchar(25) not null,expiretime INTEGER(19),PRIMARY KEY(userid,expiretime),UNIQUE KEY userid_idx (userid)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + ExecuteQuery("alter table vtiger_users add column accesskey varchar(36);"); + $fieldid = $adb->getUniqueID("vtiger_field"); + $usersTabId = getTabid("Users"); + $user_adv_block_id = getBlockId($usersTabId,'LBL_USER_ADV_OPTIONS'); + ExecuteQuery("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable, helpinfo) values($usersTabId,$fieldid,'accesskey','vtiger_users',1,3,'accesskey','Webservice Access Key',1,0,0,100,2,$user_adv_block_id,2,'V~O',1,null,'BAS',0,'Webservice Access Key');"); + + foreach($referenceMapping as $uitype=>$referenceArray){ + $success = true; + $result = $adb->pquery("insert into vtiger_ws_fieldtype(uitype,fieldtype) values(?,?)",array($uitype,"reference")); + if(!is_object($result)){ + $success=false; + } + $result = $adb->pquery("select * from vtiger_ws_fieldtype where uitype=?",array($uitype)); + $rowCount = $adb->num_rows($result); + for($i=0;$i<$rowCount;$i++){ + $fieldTypeId = $adb->query_result($result,$i,"fieldtypeid"); + foreach($referenceArray as $index=>$referenceType){ + $result = $adb->pquery("insert into vtiger_ws_referencetype(fieldtypeid,type) values(?,?)",array($fieldTypeId,$referenceType)); + if(!is_object($result)){ + echo "failed for: $referenceType, uitype: $fieldTypeId"; + $success=false; + } + } + } + if(!$success){ + echo "Migration Query Failed"; + break; + } + } + + foreach($fieldTypeInfo as $type=>$uitypes){ + foreach($uitypes as $uitype){ + $result = $adb->pquery("insert into vtiger_ws_fieldtype(uitype,fieldtype) values(?,?)",array($uitype,$type)); + if(!is_object($result)){ + "Query for fieldtype details($uitype:uitype,$type:fieldtype)"; + } + } + } + + $sql = "select * from vtiger_users"; + $updateQuery = "update vtiger_users set accesskey=? where id=?"; + $result = $adb->pquery($sql,array()); + $rowCount = $adb->num_rows($result); + for($i=0;$i<$rowCount;$i++){ + $userId = $adb->query_result($result,$i,"id"); + $insertResult = $adb->pquery($updateQuery,array(vtws_generateRandomAccessKey(16),$userId)); + if(!is_object($insertResult)){ + echo "failed for user: ".$adb->query_result($result,$i,"user_name"); + break; + } + } + ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_ws_entity(id integer(11) not null auto_increment PRIMARY + KEY,name varchar(25) not null UNIQUE,handler_path varchar(255) NOT NULL,handler_class varchar(64) NOT NULL, + ismodule int(3) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_ws_entity_name(entity_id integer(11) not null PRIMARY + KEY,name_fields varchar(50),index_field varchar(50),table_name varchar(50)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + + $names = vtws_getModuleNameList(); + $moduleHandler = array('file'=>'include/Webservices/VtigerModuleOperation.php', + 'class'=>'VtigerModuleOperation'); + foreach ($names as $tab){ + if(in_array($tab,array('Rss','Webmails','Recyclebin'))){ + continue; + } + $entityId = $adb->getUniqueID("vtiger_ws_entity"); + $adb->pquery('insert into vtiger_ws_entity(id,name,handler_path,handler_class,ismodule) values (?,?,?,?,?)', + array($entityId,$tab,$moduleHandler['file'],$moduleHandler['class'],1)); + } + $entityId = $adb->getUniqueID("vtiger_ws_entity"); + $adb->pquery('insert into vtiger_ws_entity(id,name,handler_path,handler_class,ismodule) values (?,?,?,?,?)', + array($entityId,'Events',$moduleHandler['file'],$moduleHandler['class'],1)); + $entityId = $adb->getUniqueID("vtiger_ws_entity"); + $adb->pquery('insert into vtiger_ws_entity(id,name,handler_path,handler_class,ismodule) values (?,?,?,?,?)', + array($entityId,'Users',$moduleHandler['file'],$moduleHandler['class'],1)); + + vtws_addDefaultActorTypeEntity('Groups',array('fieldNames'=>'groupname', + 'indexField'=>'groupid','tableName'=>'vtiger_groups')); + ExecuteQuery("CREATE TABLE IF NOT EXISTS `vtiger_ws_entity_tables` (`webservice_entity_id` int(11) NOT NULL ,`table_name` varchar(50) NOT NULL , PRIMARY KEY (`webservice_entity_id`,`table_name`), CONSTRAINT `fk_1_vtiger_ws_actor_tables` FOREIGN KEY (`webservice_entity_id`) REFERENCES `vtiger_ws_entity` (`id`) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8"); + ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_ws_entity_fieldtype(fieldtypeid integer(19) not null auto_increment,table_name varchar(50) not null,field_name varchar(50) not null,fieldtype varchar(200) not null,PRIMARY KEY(fieldtypeid),UNIQUE KEY vtiger_idx_1_tablename_fieldname (table_name,field_name)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_ws_entity_referencetype(fieldtypeid integer(19) not null,type varchar(25) not null,PRIMARY KEY(fieldtypeid,type), CONSTRAINT `vtiger_fk_1_actors_referencetype` FOREIGN KEY (`fieldtypeid`) REFERENCES `vtiger_ws_entity_fieldtype` (`fieldtypeid`) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + require_once("include/Webservices/WebServiceError.php"); + require_once 'include/Webservices/VtigerWebserviceObject.php'; + $webserviceObject = VtigerWebserviceObject::fromName($adb,'Groups'); + ExecuteQuery("insert into vtiger_ws_entity_tables(webservice_entity_id,table_name) values ({$webserviceObject->getEntityId()},'vtiger_groups')"); + ExecuteQuery("CREATE TABLE IF NOT EXISTS vtiger_ws_operation(operationid int(11) not null auto_increment PRIMARY KEY,name varchar(128) + not null UNIQUE,handler_path varchar(255),handler_method varchar(64), type varchar(8) not null,prelogin int(3) not null, KEY vtiger_idx_ws_oepration_prelogin (prelogin)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + ExecuteQuery("CREATE TABLE IF NOT EXISTS `vtiger_ws_operation_parameters` (`operationid` int(11) NOT NULL, `name` varchar(128) NOT NULL, + `type` varchar(64) NOT NULL, sequence int(11) not null,PRIMARY KEY (`operationid`,`name`), CONSTRAINT + `vtiger_fk_1_ws_operation_params` FOREIGN KEY (`operationid`) REFERENCES `vtiger_ws_operation` (`operationid`) + ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + $operationMeta = array( + "login"=>array( + "include"=>array( + "include/Webservices/Login.php" + ), + "handler"=>"vtws_login", + "params"=>array( + "username"=>"String", + "accessKey"=>"String" + ), + "prelogin"=>1, + "type"=>"POST" + ), + "retrieve"=>array( + "include"=>array( + "include/Webservices/Retrieve.php" + ), + "handler"=>"vtws_retrieve", + "params"=>array( + "id"=>"String" + ), + "prelogin"=>0, + "type"=>"GET" + ), + "create"=>array( + "include"=>array( + "include/Webservices/Create.php" + ), + "handler"=>"vtws_create", + "params"=>array( + "elementType"=>"String", + "element"=>"encoded" + ), + "prelogin"=>0, + "type"=>"POST" + ), + "update"=>array( + "include"=>array( + "include/Webservices/Update.php" + ), + "handler"=>"vtws_update", + "params"=>array( + "element"=>"encoded" + ), + "prelogin"=>0, + "type"=>"POST" + ), + "delete"=>array( + "include"=>array( + "include/Webservices/Delete.php" + ), + "handler"=>"vtws_delete", + "params"=>array( + "id"=>"String" + ), + "prelogin"=>0, + "type"=>"POST" + ), + "sync"=>array( + "include"=>array( + "include/Webservices/GetUpdates.php" + ), + "handler"=>"vtws_sync", + "params"=>array( + "modifiedTime"=>"DateTime", + "elementType"=>"String" + ), + "prelogin"=>0, + "type"=>"GET" + ), + "query"=>array( + "include"=>array( + "include/Webservices/Query.php" + ), + "handler"=>"vtws_query", + "params"=>array( + "query"=>"String" + ), + "prelogin"=>0, + "type"=>"GET" + ), + "logout"=>array( + "include"=>array( + "include/Webservices/Logout.php" + ), + "handler"=>"vtws_logout", + "params"=>array( + "sessionName"=>"String" + ), + "prelogin"=>0, + "type"=>"POST" + ), + "listtypes"=>array( + "include"=>array( + "include/Webservices/ModuleTypes.php" + ), + "handler"=>"vtws_listtypes", + "params"=>array(), + "prelogin"=>0, + "type"=>"GET" + ), + "getchallenge"=>array( + "include"=>array( + "include/Webservices/AuthToken.php" + ), + "handler"=>"vtws_getchallenge", + "params"=>array( + "username"=>"String" + ), + "prelogin"=>1, + "type"=>"GET" + ), + "describe"=>array( + "include"=>array( + "include/Webservices/DescribeObject.php" + ), + "handler"=>"vtws_describe", + "params"=>array( + "elementType"=>"String" + ), + "prelogin"=>0, + "type"=>"GET" + ), + "extendsession"=>array( + "include"=>array( + "include/Webservices/ExtendSession.php" + ), + "handler"=>"vtws_extendSession", + 'params'=>array(), + "prelogin"=>1, + "type"=>"POST" + ) + ); + $createOperationQuery = "insert into vtiger_ws_operation(operationid,name,handler_path,handler_method,type,prelogin) + values (?,?,?,?,?,?);"; + $createOperationParamsQuery = "insert into vtiger_ws_operation_parameters(operationid,name,type,sequence) + values (?,?,?,?);"; + foreach ($operationMeta as $operationName => $operationDetails) { + $operationId = $adb->getUniqueID("vtiger_ws_operation"); + $result = $adb->pquery($createOperationQuery,array($operationId,$operationName,$operationDetails['include'], + $operationDetails['handler'],$operationDetails['type'],$operationDetails['prelogin'])); + $params = $operationDetails['params']; + $sequence = 1; + foreach ($params as $paramName => $paramType) { + $result = $adb->pquery($createOperationParamsQuery,array($operationId,$paramName,$paramType,$sequence++)); + } + } + + vtws_addDefaultActorTypeEntity('Currency',array('fieldNames'=>'currency_name', + 'indexField'=>'id','tableName'=>'vtiger_currency_info')); + require_once 'include/Webservices/VtigerWebserviceObject.php'; + $webserviceObject = VtigerWebserviceObject::fromName($adb,'Currency'); + ExecuteQuery("insert into vtiger_ws_entity_tables(webservice_entity_id,table_name) values ({$webserviceObject->getEntityId()},'vtiger_currency_info')"); + + vtws_addDefaultActorTypeEntity('DocumentFolders',array('fieldNames'=>'foldername', + 'indexField'=>'folderid','tableName'=>'vtiger_attachmentsfolder')); + $webserviceObject = VtigerWebserviceObject::fromName($adb,'DocumentFolders'); + ExecuteQuery("insert into vtiger_ws_entity_tables(webservice_entity_id,table_name) values ({$webserviceObject->getEntityId()},'vtiger_attachmentsfolder')"); + + $success = true; + $fieldTypeId = $adb->getUniqueID("vtiger_ws_entity_fieldtype"); + $result = $adb->pquery("insert into vtiger_ws_entity_fieldtype(fieldtypeid,table_name,field_name,fieldtype) values(?,?,?,?);", + array($fieldTypeId,'vtiger_attachmentsfolder','createdby',"reference")); + if(!is_object($result)){ + echo "failed fo init
    "; + $success=false; + } + $result = $adb->pquery("insert into vtiger_ws_entity_referencetype(fieldtypeid,type) values(?,?)",array($fieldTypeId,'Users')); + if(!is_object($result)){ + echo "failed for: Users, fieldtypeid: $fieldTypeId"; + $success=false; + } + if(!$success){ + echo "Migration Query Failed"; + } + +} + ExecuteQuery("ALTER TABLE vtiger_notes MODIFY filename varchar(200)"); + +$todoid = getTabid('Calendar'); +$eventid = getTabid('Events'); +// Assigned To field should always come in quickcreate otherwise smownerid will not be filled +Executequery("UPDATE vtiger_field set quickcreate = 0,quickcreatesequence = 4 WHERE fieldname = 'assigned_user_id' AND tabid = $accounttabid"); +Executequery("UPDATE vtiger_field set quickcreate = 0,quickcreatesequence = 6 WHERE fieldname = 'assigned_user_id' AND tabid = $leadtabid"); +Executequery("UPDATE vtiger_field set quickcreate = 0,quickcreatesequence = 6 WHERE fieldname = 'assigned_user_id' AND tabid = $contacttabid"); +Executequery("UPDATE vtiger_field set quickcreate = 0,quickcreatesequence = 6 WHERE fieldname = 'assigned_user_id' AND tabid = $potentialtabid"); +Executequery("UPDATE vtiger_field set quickcreate = 0,quickcreatesequence = 7 WHERE fieldname = 'assigned_user_id' AND tabid = $campaigntabid"); +Executequery("UPDATE vtiger_field set quickcreate = 0,quickcreatesequence = 4 WHERE fieldname = 'assigned_user_id' AND tabid = $helpdesktabid"); +Executequery("UPDATE vtiger_field set quickcreatesequence = 3 WHERE fieldname = 'ticketpriorities' AND tabid = $helpdesktabid"); +Executequery("UPDATE vtiger_field set quickcreatesequence = 2 WHERE fieldname = 'ticketstatus' AND tabid = $helpdesktabid"); +Executequery("UPDATE vtiger_field set quickcreate = 0,quickcreatesequence = 4 WHERE fieldname ='assigned_user_id' AND tabid = $todoid"); +Executequery("UPDATE vtiger_field set quickcreate = 0,quickcreatesequence = 6 WHERE fieldname ='assigned_user_id' AND tabid = $eventid"); + + +include_once('modules/Utilities/Currencies.php'); + +ExecuteQuery("CREATE TABLE vtiger_currencies(currencyid INTEGER(19),currency_name varchar(200),currency_code varchar(50),currency_symbol varchar(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); +foreach($currencies as $key=>$value){ + ExecuteQuery("insert into vtiger_currencies values(".$adb->getUniqueID("vtiger_currencies").",'$key','".$value[0]."','".$value[1]."')"); +} +$cur_result = $adb->query("SELECT * from vtiger_currency_info"); +for($i=0;$i<$adb->num_rows($cur_result);$i++){ + $cur_symbol = $adb->query_result($cur_result,$i,"currency_symbol"); + $cur_code = $adb->query_result($cur_result,$i,"currency_code"); + $cur_name = $adb->query_result($cur_result,$i,"currency_name"); + $cur_id = $adb->query_result($cur_result,$i,"id"); + $currency_exists = $adb->pquery("SELECT * from vtiger_currencies WHERE currency_code=?",array($cur_code)); + if($adb->num_rows($currency_exists)>0){ + $currency_name = $adb->query_result($currency_exists,0,"currency_name"); + ExecuteQuery("UPDATE vtiger_currency_info SET vtiger_currency_info.currency_name = '$currency_name' WHERE id=$cur_id"); + } else { + ExecuteQuery("insert into vtiger_currencies values(".$adb->getUniqueID("vtiger_currencies").",'$cur_name','$cur_code','$cur_symbol')"); + } +} +Executequery("UPDATE vtiger_products set handler = 1 WHERE handler = 0"); + +//Emails fields +$email_Tabid = getTabid('Emails'); +$blockid = $adb->getUniqueID('vtiger_blocks'); +$adb->query("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable, helpinfo) values($email_Tabid,".$adb->getUniqueID("vtiger_field").",'from_email','vtiger_emaildetails',1,12,'from_email','From',1,2,0,100,1,$blockid,3,'V~M',3,NULL,'BAS',0,NULL)"); +$adb->query("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable, helpinfo) values($email_Tabid,".$adb->getUniqueID("vtiger_field").",'to_email','vtiger_emaildetails',1,8,'saved_toid','To',1,2,0,100,2,$blockid,1,'V~M',3,NULL,'BAS',0,NULL)"); +$adb->query("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable, helpinfo) values($email_Tabid,".$adb->getUniqueID("vtiger_field").",'cc_email','vtiger_emaildetails',1,8,'ccmail','CC',1,2,0,1000,3,$blockid,1,'V~O',3,NULL,'BAS',0,NULL)"); +$adb->query("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable, helpinfo) values($email_Tabid,".$adb->getUniqueID("vtiger_field").",'bcc_email','vtiger_emaildetails',1,8,'bccmail','BCC' ,1,2,0,1000,4,$blockid,1,'V~O',3,NULL,'BAS',0,NULL)"); +$adb->query("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable, helpinfo) values($email_Tabid,".$adb->getUniqueID("vtiger_field").",'idlists','vtiger_emaildetails',1,1,'parent_id','Parent ID' ,1,2,0,1000,5,$blockid,3,'V~O',3,NULL,'BAS',0,NULL)"); +$adb->query("insert into vtiger_field (tabid, fieldid, columnname, tablename, generatedtype, uitype, fieldname, fieldlabel, readonly, presence, selected, maximumlength, sequence, block, displaytype, typeofdata, quickcreate, quickcreatesequence, info_type, masseditable, helpinfo) values($email_Tabid,".$adb->getUniqueID("vtiger_field").",'email_flag','vtiger_emaildetails',1,16,'email_flag','Email Flag' ,1,2,0,1000,6,$blockid,3,'V~O',3,NULL,'BAS',0,NULL)"); + +require_once('include/Zend/Json.php'); +$json = new Zend_Json(); + +$result = $adb->query("SELECT * FROM vtiger_emaildetails"); +$rows = $adb->num_rows($result); +for($i=0 ; $i<$rows ;$i++) { + $emailid = $adb->query_result($result,$i,'emailid'); + $to = $adb->query_result($result,$i,'to_email'); + $cc = $adb->query_result($result,$i,'cc_email'); + $bcc = $adb->query_result($result,$i,'bcc_email'); + + $to = ereg_replace("###",",",$to); + $to = str_replace('&lt;','<',$to); + $to = str_replace('&gt;','>',$to); + $to = explode(',',$to); + $to_json = $json->encode($to); + + $cc = str_replace('&lt;','<',$cc); + $cc = str_replace('&gt;','>',$cc); + $cc = ereg_replace("###",",",$cc); + $cc = explode(',',$cc); + $cc_json = $json->encode($cc); + + $bcc = str_replace('&lt;','<',$bcc); + $bcc = str_replace('&gt;','>',$bcc); + $bcc = ereg_replace("###",",",$bcc); + $bcc = explode(',',$bcc); + $bcc_json = $json->encode($bcc); + + $adb->pquery("UPDATE vtiger_emaildetails set to_email = ?, cc_email= ?, bcc_email= ? WHERE emailid = ?",array($to_json,$cc_json,$bcc_json,$emailid)); +} + +//Reports Migration Handling for Older reports - STARTS + +updateReportColumns("vtiger_selectcolumn"); +updateReportColumns("vtiger_relcriteria"); + +function updateReportColumns($table){ + global $adb; + $report_update_array = array( + "vtiger_campaign"=>"(vtiger_reportmodules.primarymodule='Potentials' OR vtiger_reportmodules.secondarymodules = 'Potentials') AND $table.columnname LIKE '%vtiger_campaign%'", + "vtiger_vendorRel"=>"$table.columnname LIKE '%vtiger_vendorRel%'", + "vtiger_potentialRel"=>"$table.columnname LIKE '%vtiger_potentialRel%'", + ); + + foreach($report_update_array as $key=>$where){ + $query = "SELECT vtiger_report.reportid as reportid,$table.columnname AS columnname FROM vtiger_report INNER JOIN $table ON $table.queryid = vtiger_report.reportid INNER JOIN vtiger_reportmodules ON vtiger_reportmodules.reportmodulesid = vtiger_report.reportid WHERE $where"; + $result = $adb->query($query); + if($adb->num_rows($result) > 0){ + for($i=0;$i<$adb->num_rows($result);$i++){ + $reportid = $adb->query_result($result,$i,"reportid"); + $colname = $adb->query_result($result,$i,"columnname"); + $column_array = split(":",$colname); + $column = split("_",$column_array[2]); + $mod_name = $column[0]; + $newcolname = str_replace("$key",$key."$mod_name",$colname); + ExecuteQuery("UPDATE $table SET columnname = '".$newcolname."' WHERE queryid = ".$reportid." AND columnname = '".$colname."'"); + } + } + } + $query = "SELECT vtiger_reportmodules.primarymodule as primarymodule, vtiger_report.reportid as reportid,$table.columnname AS columnname FROM vtiger_report INNER JOIN $table ON $table.queryid = vtiger_report.reportid INNER JOIN vtiger_reportmodules ON vtiger_reportmodules.reportmodulesid = vtiger_report.reportid WHERE $table.columnname LIKE 'vtiger_products%:products_description:%'"; + $result = $adb->query($query); + if($adb->num_rows($result) > 0){ + for($i=0;$i<$adb->num_rows($result);$i++){ + $pri_module = $adb->query_result($result,$i,"reportid"); + $reportid = $adb->query_result($result,$i,"reportid"); + $colname = $adb->query_result($result,$i,"columnname"); + $column_array = split(":",$colname); + if($pri_module!="Products"){ + $column_array[0]='vtiger_crmentityProducts'; + $column_array[1]='description'; + } else { + $column_array[0]='vtiger_crmentity'; + $column_array[1]='description'; + } + $newcolname = $column_array[0].":".$column_array[1].":".$column_array[2].":".$column_array[3].":".$column_array[4]; + ExecuteQuery("UPDATE $table SET columnname = '".$newcolname."' WHERE queryid = ".$reportid." AND columnname = '".$colname."'"); + } + } + $query = "SELECT vtiger_reportmodules.primarymodule as primarymodule, vtiger_report.reportid as reportid,$table.columnname AS columnname FROM vtiger_report INNER JOIN $table ON $table.queryid = vtiger_report.reportid INNER JOIN vtiger_reportmodules ON vtiger_reportmodules.reportmodulesid = vtiger_report.reportid WHERE $table.columnname LIKE 'vtiger_accountPotentials%:accountname:%:account_id:%'"; + $result = $adb->query($query); + if($adb->num_rows($result) > 0){ + for($i=0;$i<$adb->num_rows($result);$i++){ + $reportid = $adb->query_result($result,$i,"reportid"); + $colname = $adb->query_result($result,$i,"columnname"); + $column_array = split(":",$colname); + $column_array[0]='vtiger_potential'; + $column_array[1]='related_to'; + $column_array[2]='Potentials_Related_To'; + $column_array[3]='related_to'; + $newcolname = $column_array[0].":".$column_array[1].":".$column_array[2].":".$column_array[3].":".$column_array[4]; + ExecuteQuery("UPDATE $table SET columnname = '".$newcolname."' WHERE queryid = ".$reportid." AND columnname = '".$colname."'"); + } + } +} +//ENDS + +ExecuteQuery("ALTER TABLE vtiger_inventoryproductrel ADD COLUMN lineitem_id int(19) AUTO_INCREMENT UNIQUE"); + +ExecuteQuery("update vtiger_field set typeofdata='V~M' where fieldname='sales_stage' and tabid =$potentialtabid"); + +ExecuteQuery("update vtiger_cvcolumnlist set columnname ='vtiger_emaildetails:to_email:saved_toid:Emails_To:V' where columnname ='vtiger_crmentity:smownerid:assigned_user_id:Emails_Sender:V'"); + +// for Workflow in settings page of every module + $module_manager_id = getSettingsBlockId('LBL_MODULE_MANAGER'); + $result = $adb->pquery("SELECT max(sequence) AS maxseq FROM vtiger_settings_field WHERE blockid = ?",array($module_manager_id)); + $maxseq = $adb->query_result($result,0,'maxseq'); + if($maxseq < 0 || $maxseq == NULL){ + $maxseq=1; + } + $adb->pquery("INSERT INTO vtiger_settings_field (fieldid, blockid, name, iconpath, description, linkto, sequence) VALUES (?,?,?,?,?,?,?)",array($adb->getUniqueID('vtiger_settings_field'), $module_manager_id, 'LBL_WORKFLOW_LIST', 'settingsWorkflow.png', 'LBL_AVAILABLE_WORKLIST_LIST', 'index.php?module=com_vtiger_workflow&action=workflowlist', $maxseq)); + + +$migrationlog->debug("\n\nDB Changes from 5.0.4 to 5.1.0 RC -------- Ends \n\n"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Migration/DBChanges/504rc_to_504.php b/oss/vtiger/trunk/modules/Migration/DBChanges/504rc_to_504.php new file mode 100644 index 00000000..bfa6eb33 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/DBChanges/504rc_to_504.php @@ -0,0 +1,355 @@ +debug("\n\nDB Changes from 5.0.4rc to 5.0.4 -------- Starts \n\n"); + +//Increased the size of salution field for Leads module +ExecuteQuery("alter table vtiger_leaddetails modify column salutation varchar(50)"); + +//Added to handle the crypt_type in users table. From 5.0.4 onwards the default crypt type will be MD5. But for existing users crypt type will be empty untill they change their password. Once the existing users change the password then their crypt type will be set as MD5 +ExecuteQuery("alter table vtiger_users add column crypt_type varchar(20) not null default 'MD5'"); +ExecuteQuery("update vtiger_users set crypt_type=''"); + +//In 503 to 504rc release we have included the role based picklist migration but the sequence tables for corresponding picklists are not handled. Now we are handling the sequence tables +//Popullating arry with picklist field names +$picklist_arr = array('leadsource'=>'leadsourceid','accounttype'=>'accounttypeid','industry'=>'industryid','leadstatus'=>'leadstatusid','rating'=>'rating_id','opportunity_type'=>'opptypeid','salutationtype'=>'salutationid','sales_stage'=>'sales_stage_id','ticketstatus'=>'ticketstatus_id','ticketpriorities'=>'ticketpriorities_id','ticketseverities'=>'ticketseverities_id','ticketcategories'=>'ticketcategories_id','eventstatus'=>'eventstatusid','taskstatus'=>'taskstatusid','taskpriority'=>'taskpriorityid','manufacturer'=>'manufacturerid','productcategory'=>'productcategoryid','faqcategories'=>'faqcategories_id','usageunit'=>'usageunitid','glacct'=>'glacctid','quotestage'=>'quotestageid','carrier'=>'carrierid','faqstatus'=>'faqstatus_id','invoicestatus'=>'invoicestatusid','postatus'=>'postatusid','sostatus'=>'sostatusid','campaigntype'=>'campaigntypeid','campaignstatus'=>'campaignstatusid','expectedresponse'=>'expectedresponseid'); + +$custom_result = $adb->query("select fieldname from vtiger_field where (uitype=15 or uitype=33) and fieldname like '%cf_%'"); +$numrow = $adb->num_rows($custom_result); +for($i=0; $i < $numrow; $i++) +{ + $fieldname=$adb->query_result($custom_result,$i,'fieldname'); + $picklist_arr[$fieldname] = $adb->query_result($custom_result,$i,'fieldname')."id"; +} + +foreach($picklist_arr as $picklistname => $picklistidname) +{ + $result = $adb->query("select max(".$picklistidname.") as id from vtiger_".$picklistname); + $max_count = 1; + if ($adb->num_rows($result) > 0) { + $max_count = $adb->query_result($result,0,'id'); + if ($max_count <= 0) $max_count = 1; + } + $adb->query("drop table if exists vtiger_".$picklistname."_seq"); + $adb->query("create table vtiger_".$picklistname."_seq (id integer(11))"); + $adb->query("insert into vtiger_".$picklistname."_seq (id) values(".$max_count.")"); + + //In 5.0.3 to 5.0.4 RC migration, for some utf8 character picklist values, picklist_valueid is set as 0 because of query instead of pquery + $result = $adb->query("select * from vtiger_$picklistname where picklist_valueid=0"); + $numrow = $adb->num_rows($result); + for($i=0; $i < $numrow; $i++) + { + $picklist_array_values[$picklistname][] = decode_html($adb->query_result($result,$i,$picklistname)); + } + + //we have retrieved the picklist values to which the picklist_valueid is 0. So we can delete those entries + $adb->query("delete from vtiger_$picklistname where picklist_valueid=0"); + + $temp_array = $picklist_array_values[$picklistname]; + if(is_array($temp_array)) + foreach($temp_array as $ind => $picklist_value) + { + $picklist_autoincrementid = $adb->getUniqueID($picklistname);//auto increment for each picklist table + $picklist_valueid = getUniquePicklistID();//unique value id for each picklist value + + $picklistquery = "insert into vtiger_$picklistname values(?,?,?,?) "; + $adb->pquery($picklistquery, array($picklist_autoincrementid, $picklist_value, 1, $picklist_valueid)); + + //get the picklist's unique id from vtiger_picklist table + $res = $adb->query("select * from vtiger_picklist where name='$picklistname'"); + $picklistid = $adb->query_result($res, 0, 'picklistid'); + + //we have to insert the picklist value in vtiger_role2picklist table for each available roles + $sql="select roleid from vtiger_role"; + $role_result = $adb->query($sql); + $numrows = $adb->num_rows($role_result); + + for($k=0; $k < $numrows; $k++) + { + $roleid = $adb->query_result($role_result,$k,'roleid'); + + //get the max sortid for each picklist + $res = $adb->query("select max(sortid)+1 sortid from vtiger_role2picklist where roleid = '$roleid' and picklistid ='$picklistid'"); + $sortid = $adb->query_result($res, 0, 'sortid'); + + $query = "insert into vtiger_role2picklist values(?,?,?,?)"; + $adb->pquery($query, array($roleid, $picklist_valueid, $picklistid, $sortid)); + } + } +} + +//When we change the ticket description from troubletickets table to crmentity table we have handled in customview but missed in reports - #4968 +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_crmentity:description:HelpDesk_Description:description:V' where columnname='vtiger_troubletickets:description:HelpDesk_Description:description:V'"); +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_crmentityHelpDesk:description:HelpDesk_Description:description:V' where columnname='vtiger_troubletickets:description:HelpDesk_Description:description:V'"); +ExecuteQuery("update vtiger_reportsortcol set columnname='vtiger_crmentityHelpDesk:description:HelpDesk_Description:description:V' where columnname='vtiger_troubletickets:description:HelpDesk_Description:description:V'"); + +//Some fields in customview related tables are changed in latest version but not handled in migration +//Array format is -- oldvalue => newvalue - old values will be updated with new values +//customview related tables to be changed - cvcolumnlist, cvadvfilter +$cv_fields_list = Array( + //campaigns module + "vtiger_campaign:product_id:product_id:Campaigns_Product:V"=>"vtiger_products:productname:productname:Campaigns_Product:V", + "vtiger_campaign:targetsize:targetsize:Campaigns_TargetSize:N"=>"vtiger_campaign:targetsize:targetsize:Campaigns_TargetSize:I", + "vtiger_campaign:budgetcost:budgetcost:Campaigns_Budget_Cost:I"=>"vtiger_campaign:budgetcost:budgetcost:Campaigns_Budget_Cost:N", + "vtiger_campaign:actualcost:actualcost:Campaigns_Actual_Cost:I"=>"vtiger_campaign:actualcost:actualcost:Campaigns_Actual_Cost:N", + "vtiger_campaign:expectedrevenue:expectedrevenue:Campaigns_Expected_Revenue:I"=>"vtiger_campaign:expectedrevenue:expectedrevenue:Campaigns_Expected_Revenue:N", + "vtiger_campaign:expectedsalescount:expectedsalescount:Campaigns_Expected_Sales_Count:N"=>"vtiger_campaign:expectedsalescount:expectedsalescount:Campaigns_Expected_Sales_Count:I", + "vtiger_campaign:actualsalescount:actualsalescount:Campaigns_Actual_Sales_Count:N"=>"vtiger_campaign:actualsalescount:actualsalescount:Campaigns_Actual_Sales_Count:I", + //calendar module + "vtiger_recurringevents:recurringtype:recurringtype:Calendar_Recurrence:V"=>"vtiger_activity:recurringtype:recurringtype:Calendar_Recurrence:O", + "vtiger_activity:time_start::Calendar_Start_Time:V"=>"vtiger_activity:time_start::Calendar_Start_Time:I", + "vtiger_activity:time_end:time_end:Calendar_End_Time:V"=>"vtiger_activity:time_end:time_end:Calendar_End_Time:T", + "activity:date_start:date_start:Activities_Start_Date_&_Time:DT"=>"vtiger_activity:date_start:date_start:Calendar_Start_Date_&_Time:DT", + //Calendar Module + "vtiger_activity:activitytype:activitytype:Calendar_Activity_Type:C"=>"vtiger_activity:activitytype:activitytype:Calendar_Activity_Type:V", + //Campaign Module + "vtiger_campaign:product_id:product_id:Campaigns_Product:I"=>"vtiger_products:productname:productname:Campaigns_Product:V", + "vtiger_campaign:expectedresponsecount:expectedresponsecount:Campaigns_Expected_Response_Count:N"=>"vtiger_campaign:expectedresponsecount:expectedresponsecount:Campaigns_Expected_Response_Count:I", + "vtiger_campaign:actualresponsecount:actualresponsecount:Campaigns_Actual_Response_Count:N"=>"vtiger_campaign:actualresponsecount:actualresponsecount:Campaigns_Actual_Response_Count:I", + //Contacts Module + "vtiger_contactsubdetails:birthday:birthday:Contacts_Birthdate:V"=>"vtiger_contactsubdetails:birthday:birthday:Contacts_Birthdate:D", + //Leads Module + "vtiger_leaddetails:noofemployees:noofemployees:Leads_No_Of_Employees:V"=>"vtiger_leaddetails:noofemployees:noofemployees:Leads_No_Of_Employees:I", + //Potentials Module + "vtiger_potential:campaignid:campaignid:Potentials_Campaign_Source:N"=>"vtiger_potential:campaignid:campaignid:Potentials_Campaign_Source:V", + //FAQ Module + "vtiger_faq:product_id:product_id:Faq_Product_Name:I"=>"vtiger_faq:product_id:product_id:Faq_Product_Name:V", + //Products Module + "vtiger_products:qtyinstock:qtyinstock:Products_Qty_In_Stock:I"=>"vtiger_products:qtyinstock:qtyinstock:Products_Qty_In_Stock:NN", + "vtiger_products:handler:assigned_user_id:Products_Handler:I"=>"vtiger_products:handler:assigned_user_id:Products_Handler:V", + //Vendors Module + "vtiger_vendor:email:email:Vendors_Email:E"=>"vtiger_vendor:email:email:Vendors_Email:V", + //Price Books Module + "vtiger_pricebook:active:active:PriceBooks_Active:V"=>"vtiger_pricebook:active:active:PriceBooks_Active:C", + //Quotes Module + "vtiger_quotes:potentialid:potential_id:Quotes_Potential_Name:I"=>"vtiger_quotes:potentialid:potential_id:Quotes_Potential_Name:V", + "vtiger_quotes:inventorymanager:assigned_user_id1:Quotes_Inventory_Manager:I"=>"vtiger_quotes:inventorymanager:assigned_user_id1:Quotes_Inventory_Manager:V", + ); + +foreach($cv_fields_list as $oldval => $newval) +{ + ExecuteQuery("update vtiger_cvcolumnlist set columnname='$newval' where columnname = '$oldval'"); + ExecuteQuery("update vtiger_cvadvfilter set columnname='$newval' where columnname = '$oldval'"); +} + +//Some fields in report related tables are changed in latest version but not handled in migration +//Report related tables to be changed - selectcolumn, relcriteria, reportsortcol +//Array format is -- oldvalue => newvalue - old values will be updated with new values +$report_fields_list = Array( + //Calendar module + "vtiger_recurringevents:recurringtype:Calendar_Recurrence:recurringtype:O"=>"vtiger_activity:recurringtype:Calendar_Recurrence:recurringtype:O", + //Campaign module + "vtiger_campaign:targetsize:Campaigns_TargetSize:targetsize:N"=>"vtiger_campaign:targetsize:Campaigns_TargetSize:targetsize:I", + "vtiger_campaign:budgetcost:Campaigns_Budget_Cost:budgetcost:I"=>"vtiger_campaign:budgetcost:Campaigns_Budget_Cost:budgetcost:N", + "vtiger_campaign:actualcost:Campaigns_Actual_Cost:actualcost:I"=>"vtiger_campaign:actualcost:Campaigns_Actual_Cost:actualcost:N", + "vtiger_campaign:expectedrevenue:Campaigns_Expected_Revenue:expectedrevenue:I"=>"vtiger_campaign:expectedrevenue:Campaigns_Expected_Revenue:expectedrevenue:N", + "vtiger_campaign:expectedsalescount:Campaigns_Expected_Sales_Count:expectedsalescount:N"=>"vtiger_campaign:expectedsalescount:Campaigns_Expected_Sales_Count:expectedsalescount:I", + "vtiger_campaign:actualsalescount:Campaigns_Actual_Sales_Count:actualsalescount:N"=>"vtiger_campaign:actualsalescount:Campaigns_Actual_Sales_Count:actualsalescount:I", + "vtiger_campaign:expectedresponsecount:Campaigns_Expected_Response_Count:expectedresponsecount:N"=>"vtiger_campaign:expectedresponsecount:Campaigns_Expected_Response_Count:expectedresponsecount:I", + "vtiger_campaign:actualresponsecount:Campaigns_Actual_Response_Count:actualresponsecount:N"=>"vtiger_campaign:actualresponsecount:Campaigns_Actual_Response_Count:actualresponsecount:I", + "vtiger_crmentityRelCalendar:setype:Calendar_Related_To:parent_id:I"=>"vtiger_crmentityRelCalendar:setype:Calendar_Related_To:parent_id:V", + "vtiger_contactdetailsCalendar:lastname:Calendar_Contact_Name:contact_id:I"=>"vtiger_contactdetailsCalendar:lastname:Calendar_Contact_Name:contact_id:V", + //Calendar Module + "activity:date_start:Activities_Start_Date_&_Time:date_start:DT"=>"vtiger_activity:date_start:Calendar_Start_Date_&_Time:date_start:DT", + "vtiger_activity:activitytype:Calendar_Activity_Type:activitytype:C"=>"vtiger_activity:activitytype:Calendar_Activity_Type:activitytype:V", + //"vtiger_activity:status:Calendar_Status:taskstatus:V"=>"vtiger_activity:status:Calendar_Status:taskstatus:V", + //Campaign Module + "vtiger_campaign:product_id:Campaigns_Product:product_id:I"=>"vtiger_products:productname:Campaigns_Product:productname:V", + "vtiger_campaign:expectedresponsecount:Campaigns_Expected_Response_Count:expectedresponsecount:N"=>"vtiger_campaign:expectedresponsecount:Campaigns_Expected_Response_Count:expectedresponsecount:I", + "vtiger_campaign:actualresponsecount:Campaigns_Actual_Response_Count:actualresponsecount:N"=>"vtiger_campaign:actualresponsecount:Campaigns_Actual_Response_Count:actualresponsecount:I", + //Contacts Module + "vtiger_contactsubdetails:birthday:Contacts_Birthdate:birthday:V"=>"vtiger_contactsubdetails:birthday:Contacts_Birthdate:birthday:D", + //Leads Module + "vtiger_leaddetails:noofemployees:Leads_No_Of_Employees:noofemployees:V"=>"vtiger_leaddetails:noofemployees:Leads_No_Of_Employees:noofemployees:I", + //Potentials Module + "vtiger_potential:campaignid:Potentials_Campaign_Source:campaignid:N"=>"vtiger_potential:campaignid:Potentials_Campaign_Source:campaignid:V", + //FAQ Module + "vtiger_faq:product_id:Faq_Product_Name:product_id:I"=>"vtiger_faq:product_id:Faq_Product_Name:product_id:V", + //Products Module + "vtiger_products:qtyinstock:Products_Qty_In_Stock:qtyinstock:I"=>"vtiger_products:qtyinstock:Products_Qty_In_Stock:qtyinstock:NN", + "vtiger_products:handler:Products_Handler:assigned_user_id:I"=>"vtiger_products:handler:Products_Handler:assigned_user_id:V", + //Quotes Module + "vtiger_quotes:potentialid:Quotes_Potential_Name:potential_id:I"=>"vtiger_quotes:potentialid:Quotes_Potential_Name:potential_id:V", + "vtiger_quotes:inventorymanager:Quotes_Inventory_Manager:assigned_user_id1:I"=>"vtiger_quotes:inventorymanager:Quotes_Inventory_Manager:assigned_user_id1:V", + ); + +foreach($report_fields_list as $oldval => $newval) +{ + ExecuteQuery("update vtiger_selectcolumn set columnname='$newval' where columnname='$oldval'"); + ExecuteQuery("update vtiger_relcriteria set columnname='$newval' where columnname='$oldval'"); + ExecuteQuery("update vtiger_reportsortcol set columnname='$newval' where columnname='$oldval'"); +} + + +//we have removed the Team field in quotes and added a new custom field for Team. So we can remove that field from reports (we have changed this field name in customview related tables in 503 - 504rc migration) +ExecuteQuery("delete from vtiger_selectcolumn where columnname='vtiger_quotes:team:Quotes_Team:team:V'"); +ExecuteQuery("delete from vtiger_relcriteria where columnname='vtiger_quotes:team:Quotes_Team:team:V'"); +ExecuteQuery("delete from vtiger_reportsortcol where columnname='vtiger_quotes:team:Quotes_Team:team:V'"); + +//Update the webmail password with encryption +update_webmail_password(); +function update_webmail_password() +{ + global $adb,$migrationlog; + $migrationlog->debug("\nInside update_webmail_password() function starts\n\n"); + require_once("modules/Users/Users.php"); + $res_set = $adb->query('select * from vtiger_mail_accounts'); + $user_obj = new Users(); + while($row = $adb->fetchByAssoc($res_set)) + { + $adb->query("update vtiger_mail_accounts set mail_password = '".$user_obj->changepassword($row['mail_password'])."' where mail_username='".$row['mail_username']."'"); + } + $migrationlog->debug("\nInside update_webmail_password() function ends\n"); +} + +//Modified to increase the length of the outgoinfg server(smtp) servername, username and password +ExecuteQuery("alter table vtiger_systems change column server_username server_username varchar(100)"); +ExecuteQuery("alter table vtiger_systems change column server server varchar(100)"); +ExecuteQuery("alter table vtiger_systems change column server_password server_password varchar(100)"); + +//In our whole product, the picklist table columns and the corresponding picklists storage column in entity tables are changed to varchar(200) +$picklist_query_array = Array( + "alter table vtiger_account modify account_type varchar(200) default NULL", + "alter table vtiger_activity modify activitytype varchar(200) default NULL", + "alter table vtiger_users modify activity_view varchar(200) default NULL", + "alter table vtiger_campaign modify campaignstatus varchar(200) default NULL", + "alter table vtiger_campaign modify campaigntype varchar(200) default NULL", + "alter table vtiger_quotes modify carrier varchar(200) default NULL", + "alter table vtiger_purchaseorder modify carrier varchar(200) default NULL", + "alter table vtiger_salesorder modify carrier varchar(200) default NULL", + "alter table vtiger_users modify date_format varchar(200) default NULL", + "alter table vtiger_activity modify duration_minutes varchar(200) default NULL", + "alter table vtiger_activity drop key activity_status_eventstatus_idx, add key activity_status_idx(status)", + "alter table vtiger_activity modify eventstatus varchar(200) default NULL", + "alter table vtiger_campaign modify expectedresponse varchar(200) default NULL", + "alter table vtiger_faqcategories modify faqcategories varchar(200) default NULL", + "alter table vtiger_faq modify category varchar(200) default NULL", + "alter table vtiger_faqstatus modify faqstatus varchar(200) default NULL", + "alter table vtiger_faq modify status varchar(200) default NULL", + "alter table vtiger_vendor modify glacct varchar(200) default NULL", + "alter table vtiger_account modify industry varchar(200) default NULL", + "alter table vtiger_leaddetails modify industry varchar(200) default NULL", + "alter table vtiger_leaddetails modify leadsource varchar(200) default NULL", + "alter table vtiger_contactsubdetails modify leadsource varchar(200) default NULL", + "alter table vtiger_potential modify leadsource varchar(200) default NULL", + "alter table vtiger_users modify lead_view varchar(200) default NULL", + "alter table vtiger_products modify manufacturer varchar(200) default NULL", + "alter table vtiger_potential modify potentialtype varchar(200) default NULL", + "alter table vtiger_products modify productcategory varchar(200) default NULL", + "alter table vtiger_account modify rating varchar(200) default NULL", + "alter table vtiger_leaddetails modify rating varchar(200) default NULL", + "alter table vtiger_activity modify recurringtype varchar(200) default NULL", + "alter table vtiger_potential modify sales_stage varchar(200) default NULL", + "alter table vtiger_leaddetails modify salutation varchar(200) default NULL", + "alter table vtiger_contactdetails modify salutation varchar(200) default NULL", + "alter table vtiger_taskpriority modify taskpriority varchar(200) default NULL", + "alter table vtiger_activity modify priority varchar(200) default NULL", + "alter table vtiger_taskstatus modify taskstatus varchar(200) default NULL", + "alter table vtiger_activity modify status varchar(200) default NULL", + "alter table vtiger_ticketcategories modify ticketcategories varchar(200) default NULL", + "alter table vtiger_troubletickets modify category varchar(200) default NULL", + "alter table vtiger_ticketpriorities modify ticketpriorities varchar(200) default NULL", + "alter table vtiger_troubletickets modify priority varchar(200) default NULL", + "alter table vtiger_ticketseverities modify ticketseverities varchar(200) default NULL", + "alter table vtiger_troubletickets modify severity varchar(200) default NULL", + "alter table vtiger_ticketstatus modify ticketstatus varchar(200) default NULL", + "alter table vtiger_troubletickets modify status varchar(200) default NULL", + ); +foreach($picklist_query_array as $query) +{ + ExecuteQuery($query); +} + +// Modified to change the comparison datatype from Integer to Varchar for Account name +ExecuteQuery("update vtiger_relcriteria set columnname='vtiger_accountContacts:accountname:Contacts_Account_Name:account_id:V' where columnname='vtiger_accountContacts:accountname:Contacts_Account_Name:account_id:I'"); +ExecuteQuery("update vtiger_selectcolumn set columnname='vtiger_accountContacts:accountname:Contacts_Account_Name:account_id:V' where columnname='vtiger_accountContacts:accountname:Contacts_Account_Name:account_id:I'"); + +// Modified to change the typeofdata for hour_format, start_hour and end_hour to 'V~O' instead of 'I~O' +ExecuteQuery("update vtiger_field set typeofdata = 'V~O' where tablename='vtiger_users' and fieldname in ('hour_format','start_hour','end_hour')"); + +//Since we don't have field level access for Users and RSS modules we have to delete if there is any entry for these modules in vtiger_profile2field table +$adb->query("delete from vtiger_profile2field where tabid=29"); +$adb->query("delete from vtiger_profile2field where tabid=24"); + +// Modified the typeofdata for all module email field & custom email field in Custom View & Reports. +typeOfDataChanges(); +function typeOfDataChanges() +{ + global $adb,$migrationlog; + $migrationlog->debug("\nInside typeOfDataChanges() function Starts\n\n"); + + $field_table_sql="select columnname,fieldname from vtiger_field where uitype=13"; + $result=$adb->query($field_table_sql); + $num_rows = $adb->num_rows($result); + for($k=0; $k < $num_rows; $k++) + { + $columnname=$adb->query_result($result,$k,'columnname'); + $fieldname=$adb->query_result($result,$k,'fieldname'); + $tablename_array = array('vtiger_cvcolumnlist','vtiger_cvadvfilter','vtiger_selectcolumn','vtiger_relcriteria','vtiger_reportsortcol'); + foreach($tablename_array as $tablename) + { + $custom_sql="select columnname from ".$tablename." where columnname like '%cf%' or columnname like '%email%'"; + $custom_result = $adb->query($custom_sql); + $num_rows2 = $adb->num_rows($custom_result); + for($l=0; $l < $num_rows2; $l++) + { + $table_columnname=$adb->query_result($custom_result,$l,'columnname'); + $values = explode(':',$table_columnname); + if($columnname == $values[1] && $fieldname == $values[2]) + { + ExecuteQuery("update ".$tablename." set columnname='".$values[0].":".$values[1].":".$values[2].":".$values[3].":E' where columnname='".$values[0].":".$values[1].":".$values[2].":".$values[3].":V'"); + } + if($columnname == $values[1] && $fieldname == $values[3]) + { + ExecuteQuery("update ".$tablename." set columnname='".$values[0].":".$values[1].":".$values[2].":".$values[3].":E' where columnname='".$values[0].":".$values[1].":".$values[2].":".$values[3].":V'"); + } + } + } + } + $migrationlog->debug("\nInside typeOfDataChanges() function Ends\n\n"); +} +//Added to remove the unwanted \n characters from inventory notification schedulers +$result=$adb->query("select notificationid,notificationbody from vtiger_inventorynotification"); + +for($i=0;$i<$adb->num_rows($result);$i++) +{ + $body=decode_html($adb->query_result($result,$i,'notificationbody')); + $body=str_replace('\n','', $body); + $notificationid=$adb->query_result($result,$i,'notificationid'); + $adb->pquery("update vtiger_inventorynotification set notificationbody=? where notificationid=?", array($body, $notificationid)); +} +//In 5.0.4, support start and end date notification scheduler should be defaultly active. If it is inactive previouly then we have to change them as active +ExecuteQuery("update vtiger_notificationscheduler set active=1 where schedulednotificationid in (5,6)"); + +//Query added to modify the date_format field length in vtiger_users table +ExecuteQuery("alter table vtiger_users modify date_format varchar(200) default NULL"); +// Updated the sequence number of taskstatus for the ticket #5027 +ExecuteQuery("update vtiger_field set sequence = 8 where columnname = 'status' and tablename = 'vtiger_activity' and fieldname = 'taskstatus' and uitype = 111"); + +$arr=$adb->getColumnNames("vtiger_users"); +if(!in_array("internal_mailer", $arr)) +{ + $adb->pquery("alter table vtiger_users add column internal_mailer int(3) NOT NULL default '1'", array()); +} + +global $dbname; +include("modules/Migration/HTMLtoUTF8Conversion.php"); + +$migrationlog->debug("\n\nDB Changes from 5.0.4rc to 5.0.4 -------- Ends \n\n"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Migration/DBChanges/510rc_to_510.php b/oss/vtiger/trunk/modules/Migration/DBChanges/510rc_to_510.php new file mode 100644 index 00000000..d8d1d87c --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/DBChanges/510rc_to_510.php @@ -0,0 +1,72 @@ +debug("\n\nDB Changes from 5.1.0 RC to 5.1.0 -------- Starts \n\n"); + +require_once('vtlib/Vtiger/Package.php'); +require_once('vtlib/Vtiger/Module.php'); +$package = new Vtiger_Package(); + +ExecuteQuery("DELETE vtiger_cvcolumnlist FROM vtiger_cvcolumnlist INNER JOIN vtiger_customview WHERE vtiger_cvcolumnlist.columnname LIKE '%vtiger_notes:filename%' AND vtiger_customview.cvid = vtiger_cvcolumnlist.cvid AND vtiger_customview.entitytype='HelpDesk'"); +ExecuteQuery("DELETE vtiger_cvcolumnlist FROM vtiger_cvcolumnlist INNER JOIN vtiger_customview WHERE (vtiger_cvcolumnlist.columnname LIKE '%parent_id%' OR vtiger_cvcolumnlist.columnname LIKE '%vtiger_contactdetails%') AND vtiger_customview.cvid = vtiger_cvcolumnlist.cvid AND vtiger_customview.entitytype='Documents'"); + +ExecuteQuery("DELETE vtiger_cvadvfilter FROM vtiger_cvadvfilter INNER JOIN vtiger_customview WHERE vtiger_cvadvfilter.columnname LIKE '%vtiger_notes:filename%' AND vtiger_customview.cvid = vtiger_cvadvfilter.cvid AND vtiger_customview.entitytype='HelpDesk'"); +ExecuteQuery("DELETE vtiger_cvadvfilter FROM vtiger_cvadvfilter INNER JOIN vtiger_customview WHERE (vtiger_cvadvfilter.columnname LIKE '%parent_id%' OR vtiger_cvadvfilter.columnname LIKE '%vtiger_contactdetails%') AND vtiger_customview.cvid = vtiger_cvadvfilter.cvid AND vtiger_customview.entitytype='Documents'"); + +// Update PBXManager module files +$moduleInstance = Vtiger_Module::getInstance('PBXManager'); +$package->initUpdate($moduleInstance, 'packages/5.1.0/mandatory/PBXManager.zip', true); + +// Update ServiceContracts module files +$moduleInstance = Vtiger_Module::getInstance('ServiceContracts'); +$package->initUpdate($moduleInstance, 'packages/5.1.0/mandatory/ServiceContracts.zip', true); + +// Update Services module files +$moduleInstance = Vtiger_Module::getInstance('Services'); +$package->initUpdate($moduleInstance, 'packages/5.1.0/mandatory/Services.zip', true); + +// Install/Update Optional modules +require_once('include/utils/installVtlibSelectedModules.php'); + +// Fixed issue with Calendar duration calculation +ExecuteQuery("ALTER TABLE vtiger_activity MODIFY duration_hours VARCHAR(200)"); + +$result = $adb->query("SELECT activityid,date_start,due_date, time_start,time_end FROM vtiger_activity WHERE activitytype NOT IN ('Task','Emails')"); +$noofrows = $adb->num_rows($result); +for($index=0;$index<$noofrows;$index++){ + $activityid = $adb->query_result($result,$index,'activityid'); + $date_start = $adb->query_result($result,$index,'date_start'); + $time_start = $adb->query_result($result,$index,'time_start'); + $due_date = $adb->query_result($result,$index,'due_date'); + $time_end = $adb->query_result($result,$index,'time_end'); + + $start_date = split("-",$date_start); + $end_date = split("-",$due_date); + $start_time = split(":",$time_start); + $end_time = split(":",$time_end); + + $start = mktime(intval($start_time[0]),intval($start_time[1]),0,intval($start_date[1]),intval($start_date[2]),intval($start_date[0])); + $end = mktime(intval($end_time[0]),intval($end_time[1]),0,intval($end_date[1]),intval($end_date[2]),intval($end_date[0])); + + $duration_in_minutes = floor(($end-$start)/(60));//get the difference between start time and end time in minutes + $hours = floor($duration_in_minutes/60); + $minutes = $duration_in_minutes%60; + $adb->pquery("UPDATE vtiger_activity SET duration_hours=?, duration_minutes=? WHERE activityid=?",array($hours, $minutes,$activityid)); +} + +$migrationlog->debug("\n\nDB Changes from 5.1.0 RC to 5.1.0 -------- Ends \n\n"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Migration/HTMLtoUTF8Conversion.php b/oss/vtiger/trunk/modules/Migration/HTMLtoUTF8Conversion.php new file mode 100644 index 00000000..f4cd1bd2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/HTMLtoUTF8Conversion.php @@ -0,0 +1,156 @@ +
    Started UTF8 Conversion
    '; + +//echo ''; +//This function will convert all the html values in the database into utf-8 values +//echo ''; +$query = " ALTER DATABASE ".$dbname." DEFAULT CHARACTER SET utf8"; +//echo ""; +$adb->query($query); +$query = "SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0"; +//echo ""; +$adb->query($query); +$tables_res = $adb->query("show tables"); +while($row = $adb->fetch_array($tables_res)) +{ + //echo ""; + $query =" LOCK TABLES `".$row[0]."` WRITE "; + //echo ""; + $adb->query($query); + + $query =" ALTER TABLE ".$row[0]." CONVERT TO CHARACTER SET utf8 "; + //echo ""; + $adb->query($query); + + $query =" UNLOCK TABLES "; + //echo ""; + $adb->query($query); + + //echo ""; +} +$query = " SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS "; +//echo ""; +$adb->query($query); +//echo '
    Setting the character set as utf8 and collation as utf8_general_ci for all tables and Databases.
    ".$query."
    ".$query."
    LOCKING TABLE$queryUNLOCKING TABLE
    ".$query."
    '; + +convert_html2utf8_db(); + +/** +* Function to convert html values to its original character available in a database +* This function can called at any time after the migration +* It get all the tables and its VARCHAR/TEXT/LONGTEXT fields from the DB +* Converts the html-values to its original character and restore it. +**/ +function convert_html2utf8_db() +{ + global $adb,$log; + //Getting all the tables from the current database. + $alltables = $adb->get_tables(); + $log->debug("Started HTML to UTF-8 Conversion"); + $values=Array(); + //Tables for which conversion to utf8 not required. + $skip_tables=Array('vtiger_sharedcalendar', 'vtiger_potcompetitorrel', 'vtiger_users2group', 'vtiger_group2grouprel', 'vtiger_group2role', 'vtiger_group2rs', 'vtiger_campaigncontrel', 'vtiger_campaignleadrel', 'vtiger_cntactivityrel', 'vtiger_crmentitynotesrel', 'vtiger_salesmanactivityrel', 'vtiger_vendorcontactrel', 'vtiger_salesmanticketrel', 'vtiger_seactivityrel', 'vtiger_seticketsrel', 'vtiger_senotesrel', 'vtiger_profile2globalpermissions', 'vtiger_profile2standardpermissions', 'vtiger_profile2field', 'vtiger_role2profile', 'vtiger_profile2utility', 'vtiger_activityproductrel', 'vtiger_pricebookproductrel', 'vtiger_activity_reminder', 'vtiger_actionmapping', 'vtiger_org_share_action2tab', 'vtiger_datashare_relatedmodule_permission', 'vtiger_tmp_read_user_sharing_per', 'vtiger_tmp_read_group_sharing_per', 'vtiger_tmp_write_user_sharing_per', 'vtiger_tmp_write_group_sharing_per', 'vtiger_tmp_read_user_rel_sharing_per', 'vtiger_tmp_read_group_rel_sharing_per', 'vtiger_tmp_write_user_rel_sharing_per', 'vtiger_tmp_write_group_rel_sharing_per', 'vtiger_role2picklist', 'vtiger_freetagged_objects', 'vtiger_tab', 'vtiger_blocks', 'vtiger_group2role', 'vtiger_group2rs'); + + //echo ''; + //echo ''; + + for($i=0;$iquery("SHOW COLUMNS FROM $table"); + while ($row = $adb->fetch_array($result)) + { + //Getting the primary key column of the table. + if($row['key'] == 'PRI') + { + $values[$table]['key'][]=$row['field']; + } + //And Getting columns of type varchar, text and longtext. + if(stristr($row['type'],'varchar') != '' || stristr($row['type'],'text') != '' || stristr($row['type'],'longtext') != '') + { + $values[$table]['columns'][] = $row['field']; + } + } + } + } + + $final_array=$values; + foreach($final_array as $tablename=>$value) + { + //Going to update values in the table. + $key = $value['key']; + $cols = $value['columns']; + if($cols != "" && $key != "") + { + if(count($key) > 1) + $key_list = implode(", ", $key); + else + $key_list = $key[0]; + + if(count($cols) > 1) + $col_list = implode(", ", $cols); + else + $col_list = $cols[0]; + //Getting the records available in the table. + $query="SELECT $key_list, $col_list FROM $tablename"; + $res1 = $adb->query($query); + $val = Array(); + $id = Array(); + // echo ' + // + // '; + $log->debug("Converting values in the table :".$tablename); + //Sending the current status to the browser + for($k=0; $k < $adb->num_rows($res1); $k++) + { + $whereStr = ""; + for($l=0; $l < count($key); $l++) + { + $id[$l] = $adb->query_result($res1, $k, $key[$l]); + if($l != 0) + $whereStr .= " and "; + $whereStr .= $key[$l]."=?"; + } + $updateStr = ""; + for($j=0; $j < count($cols); $j++) + { + //Converting the html values to utf8 chars + //echo "
    Updating the value of ".$cols[$j]." column with utf8 value"; + $val[$j] = html_to_utf8(decode_html($adb->query_result($res1, $k, $cols[$j]))); + if($j != 0) + $updateStr .= ", "; + $updateStr .= $cols[$j]."=?"; + } + $updateQ = "UPDATE $tablename SET $updateStr where $whereStr"; + $params = array($val, $id); + $adb->pquery($updateQ, $params); + } + // echo ' + // + // '; + //Sending the current status to the browser + } + } +// echo '
    Started converting data from HTML to UTF-8
    Updating the values in the table '.$tablename.'Completed
    '; +// echo '


    Conversion completed.
    '; + $log->debug("HTML to UTF-8 Conversion has been completed"); +} + +?> diff --git a/oss/vtiger/trunk/modules/Migration/Migration.php b/oss/vtiger/trunk/modules/Migration/Migration.php new file mode 100644 index 00000000..8999753a --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/Migration.php @@ -0,0 +1,472 @@ + Take a dump of old database +//Step : 2 => Drop the New Database +//Step : 3 => Create the New Database +//Step : 4 => Put the old dump into the New Database +//Step : 5 => Modify the new database with the new changes + +class Migration +{ + + var $conn; + var $oldconn; + + //Old Database Parameters + var $old_hostname; + var $old_mysql_port; + var $old_mysql_username; + var $old_mysql_password; + var $old_dbname; + + //New Database Parameters + var $new_hostname; + var $new_mysql_port; + var $new_mysql_username; + var $new_mysql_password; + var $new_dbname; + + /** Constructor with old database and new database connections + */ + function Migration($old='',$new='') + { + global $migrationlog; + $migrationlog->debug("Inside the constructor Migration."); + + $this->oldconn = $old; + $this->conn = $new; + $migrationlog->debug("Database Object has been created."); + } + + /** function used to set the Old database parameters in the migration object properties + * @param string $hostname - old database hostname + * @param int $mysql_port - old database mysql port number + * @param string $mysql_username - old database mysql user name + * @param string $mysql_password - old database mysql password + * @param string $dbname - old database name + * @return void + */ + function setOldDatabaseParams($hostname,$mysql_port,$mysql_username,$mysql_password,$dbname) + { + global $migrationlog; + $migrationlog->debug("Inside the function setOldDatabaseParams($hostname,$mysql_port,$mysql_username,$mysql_password,$dbname)"); + + $this->old_hostname = $hostname; + $this->old_mysql_port = $mysql_port; + $this->old_mysql_username = $mysql_username; + $this->old_mysql_password = $mysql_password; + $this->old_dbname = $dbname; + + $migrationlog->debug("Old Database Parameters has been set."); + } + + /** function used to set the Current ie., new 5.0 database parameters in the migration object properties + * @param string $hostname - new database hostname + * @param int $mysql_port - new database mysql port number + * @param string $mysql_username - new database mysql user name + * @param string $mysql_password - new database mysql password + * @param string $dbname - new database name + * @return void + */ + function setNewDatabaseParams($hostname,$mysql_port,$mysql_username,$mysql_password,$dbname) + { + global $migrationlog; + $migrationlog->debug("Inside the function setNewDatabaseParams($hostname,$mysql_port,$mysql_username,$mysql_password,$dbname)"); + + $this->new_hostname = $hostname; + $this->new_mysql_port = $mysql_port; + $this->new_mysql_username = $mysql_username; + $this->new_mysql_password = $mysql_password; + $this->new_dbname = $dbname; + + $migrationlog->debug("New Database Parameters has been set."); + } + + /** function used to take the database dump + * @param string $host_name - host name in where the database is available + * @param int $mysql_port - mysql port number + * @param string $mysql_username - mysql user name + * @param string $mysql_password - mysql password + * @param string $dbname - database name + * @return string $dump_filename - return the dump filename + */ + function takeDatabaseDump($host_name,$mysql_port,$mysql_username,$mysql_password,$dbname) + { + global $migrationlog; + $migrationlog->debug("Inside the function takeDatabaseDump($host_name,$mysql_port,$mysql_username,$mysql_password,$dbname). Going to take the specified database dump..."); + + $dump_filename = 'dump_'.$dbname.'.txt'; + + if($mysql_password != '') + { + $password_str = " -p".$mysql_password; + } + else + { + $password_str = ''; + } + + //This if is used when we cannot access mysql from vtiger root directory + if($_SESSION['set_server_mysql_path'] != '') + { + $current_working_dir = getcwd(); + $server_mysql_path = $_SESSION['set_server_mysql_path']; + + $dump_str = "mysqldump -u".$mysql_username.$password_str." -h ".$host_name." --port=".$mysql_port." ".$dbname." >> ".$dump_filename; + $migrationlog->debug("Server path set. Dump string to execute ==> $dump_str"); + + chdir ($server_mysql_path); + + exec("echo 'set FOREIGN_KEY_CHECKS = 0;' > ".$dump_filename); + exec($dump_str); + exec("echo 'set FOREIGN_KEY_CHECKS = 1;' >> ".$dump_filename); + + exec('cp "'.$server_mysql_path.'\\'.$dump_filename.'" "'.$current_working_dir.'\\'.$dump_filename).'"'; + chdir ($current_working_dir); + } + else + { + $migrationlog->debug("Dump string to execute ==> mysqldump -u".$mysql_username." -h ".$host_name.$password_str." --port=".$mysql_port." ".$dbname." >> ".$dump_filename); + + exec("echo 'set FOREIGN_KEY_CHECKS = 0;' > ".$dump_filename); + exec("mysqldump -u".$mysql_username." -h ".$host_name.$password_str." --port=".$mysql_port." ".$dbname." >> ".$dump_filename); + exec("echo 'set FOREIGN_KEY_CHECKS = 1;' >> ".$dump_filename); + } + + $_SESSION['migration_log'] .= '
    '.$dbname.' Database Dump has been taken and the file is ==> '.$dump_filename; + $migrationlog->debug("
    $dbname Database Dump has been taken and the file is ==> $dump_filename"); + + return $dump_filename; + } + + /** function used to drop the database + * @param object $conn - adodb object which is connected with the current(new) database + * @param string $dbname - database name which we want to drop + * @return void + */ + function dropDatabase($conn,$dbname) + { + global $migrationlog; + $migrationlog->debug("Inside the function dropDatabase(".get_class($conn).",".$dbname."). Going to drop the database - $dbname"); + $sql = "drop database ".$dbname; + $conn->query($sql); + + $migrationlog->debug("Database ($dbname) has been dropped."); + $_SESSION['migration_log'] .= '
    '.$dbname.' Database has been dropped.'; + } + + /** function used to create the database + * @param object $conn - adodb object which is connected with the current(new) database + * @param string $dbname - database name which we want to drop + * @return void + */ + function createDatabase($conn,$dbname) + { + global $migrationlog; + $migrationlog->debug("Inside the function createDatabase(".get_class($conn).",".$dbname."). Going to create the database - $dbname"); + + $sql = "create database ".$dbname; + $conn->query($sql); + + $_SESSION['migration_log'] .= '
    '.$dbname.' Database has been created.'; + $migrationlog->debug("Database ($dbname) has been dropped."); + + //Added to avoid the No Database Selected error when execute the queries + $conn->connect(); + } + + /** function used to apply the dump data to a database + * @param string $host_name - host name + * @param int $mysql_port - mysql port number + * @param string $mysql_username - mysql user name + * @param string $mysql_password - mysql password + * @param string $dbname - database name to which we want to apply the dump + * @param string $dumpfile - dump file which contains the data dump of a database + * @return void + */ + function applyDumpData($host_name,$mysql_port,$mysql_username,$mysql_password,$dbname,$dumpfile) + { + global $migrationlog; + $migrationlog->debug("Inside the function applyDumpData($host_name,$mysql_port,$mysql_username,$mysql_password,$dbname,$dumpfile)."); + + if($mysql_password != '') + { + $password_str = " --password=".$mysql_password; + } + else + { + $password_str = ''; + } + + //This if is used when we cannot access mysql from vtiger root directory + if($_SESSION['set_server_mysql_path'] != '') + { + $current_working_dir = getcwd(); + $server_mysql_path = $_SESSION['set_server_mysql_path']; + + $dump_str = "mysql --user=".$mysql_username.$password_str." -h ".$host_name." --force --port=".$mysql_port." ".$dbname." < ".$dumpfile; + $migrationlog->debug("MySQL server path set. Dump string to apply ==> $dump_str"); + + //exec("path = $server_mysql_path"); + chdir ($server_mysql_path); + + exec($dump_str); + + chdir ($current_working_dir); + } + else + { + exec("mysql --user=".$mysql_username." -h ".$host_name." --force --port=".$mysql_port.$password_str." ".$dbname." < ".$dumpfile); + $migrationlog->debug("Dump string to apply ==> mysql --user=$mysql_username -h $host_name --force --port=$mysql_port $password_str $dbname < $dumpfile"); + } + + $_SESSION['migration_log'] .= '
    Database Dump has been applied to the '.$dbname.' Database from '.$dumpfile.''; + $migrationlog->debug("
    Database Dump has been applied to the $dbname database from $dumpfile "); + } + + + /** function used to get the tabid + * @param string $module - module to which we want to get the tabid + * @return int $tabid - return the tabid of the module + */ + function localGetTabID($module) + { + global $conn; + + $sql = "select tabid from vtiger_tab where name='".$module."'"; + $result = $conn->query($sql); + $tabid= $conn->query_result($result,0,"tabid"); + + return $tabid; + } + + /** function used to get the table count of the new database + * @return int $tables - return the number of tables available in the new database + */ + function getTablesCountInNewDatabase() + { + global $migrationlog; + $migrationlog->debug("Inside the function getTablesCountInNewDatabase()"); + $newconn = @mysql_connect($this->new_hostname.':'.$this->new_mysql_port,$this->new_mysql_username,$this->new_mysql_password); + $tables = @mysql_num_rows(mysql_list_tables($this->new_dbname,$newconn)); + + $migrationlog->debug("Number of Tables in New Database = $tables"); + return $tables; + } + + /** function used to get the table count of the old database + * @return int $tables - return the number of tables available in the old database + */ + function getTablesCountInOldDatabase() + { + global $migrationlog; + $migrationlog->debug("Inside the function getTablesCountInOldDatabase()"); + $oldconn = @mysql_connect($this->old_hostname.':'.$this->old_mysql_port,$this->old_mysql_username,$this->old_mysql_password); + $tables = @mysql_num_rows(mysql_list_tables($this->old_dbname,$oldconn)); + + $migrationlog->debug("Number of Tables in Old Database = $tables"); + return $tables; + } + + /** function used to modify the database from old version to match with new version + * @param object $conn - adodb object which is connected with the current(new) database + * @return void + */ + function modifyDatabase($conn) + { + global $migrationlog; + $migrationlog->debug("Inside the function modifyDatabase(".get_class($conn).")"); + $migrationlog->debug("\n\n\nMickie ---- Starts"); + + $_SESSION['migration_log'] .= "
    The current database is going to be modified by executing the following queries...
    "; + + //Added variables to get the queries list and count + $query_count = 1; + $success_query_count = 1; + $failure_query_count = 1; + $success_query_array = Array(); + $failure_query_array = Array(); + + //To handle the file includes for each and every version + //Here we have to decide which files should be included, where the files will be added newly for every public release + //In this included file we have included modules/Migration/DBChanges/42P2_to_50.php which will apply the db changes upto 5.0. + include("modules/Migration/MigrationInfo.php"); + + $migrationlog->debug("Mickie ---- Ends\n\n\n"); + } + + /** function used to run the migration process based on the option selected and values given + * @param int $same_databases - 1 if both databases are same otherwise 0 + * @param string $option - selected migration option (dbsource or dumpsource) + * @param string $old_dump_file_name - dump file name of the old database which is optional when we use dbsource + * @return void + */ + function migrate($same_databases, $option, $old_dump_file_name='') + { + //1. Migration Procedure -- when we give the Source Database values + //Step : 1 => Take a dump of old database + //Step : 2 => Drop the New Database + //Step : 3 => Create the New Database + //Step : 4 => Put the old dump into the New Database + //Step : 5 => Modify the new database with the new changes + + //2. Migration Procedure -- when we give the Database dump file + //Step : 1 => Drop the New Database + //Step : 2 => Create the New Database + //Step : 3 => Put the dump into the New Database + //Step : 4 => Modify the new database with the new changes + + global $migrationlog; + global $conn; + $migrationlog->debug("Database Migration from Old Database to the Current Database Starts."); + $migrationlog->debug("Migration Option = $option"); + + //Set the old database parameters + $old_host_name = $this->old_hostname; + $old_mysql_port = $this->old_mysql_port; + $old_mysql_username = $this->old_mysql_username; + $old_mysql_password = $this->old_mysql_password; + $old_dbname = $this->old_dbname; + + //Set the new database parameters + $new_host_name = $this->new_hostname; + $new_mysql_port = $this->new_mysql_port; + $new_mysql_username = $this->new_mysql_username; + $new_mysql_password = $this->new_mysql_password; + $new_dbname = $this->new_dbname; + + //This will be done when we give the Source Database details + if($option == 'dbsource') + { + //Take the dump of the old Database + $migrationlog->debug("Going to take the old Database Dump."); + $dump_file = $this->takeDatabaseDump($old_host_name,$old_mysql_port,$old_mysql_username,$old_mysql_password,$old_dbname); + + //check the file size is greater than 10000 bytes (~app) and if yes then continue else goto step1 + if(is_file($dump_file) && filesize($dump_file) > 10000) + { + $_SESSION['migration_log'] .= "Source database dump taken successfully."; + } + else + { + echo '
    The Source database dump taken may not contain all values. So please use other option.'; + include("modules/Migration/MigrationStep1.php"); + exit; + } + } + elseif($option == 'dumpsource') + { + $dump_file = $old_dump_file_name; + } + + //if old db and new db are different then take new db dump + if($old_dbname != $new_dbname) + { + //This is to take dump of the new database for backup purpose + $migrationlog->debug("Going to take the current Database Dump."); + $new_dump_file = $this->takeDatabaseDump($new_host_name,$new_mysql_port,$new_mysql_username,$new_mysql_password,$new_dbname); + + //check the file size is greater than 10000 bytes (~app) and if yes then continue else goto step1 + if(is_file($new_dump_file) && filesize($new_dump_file) > 10000) + { + $_SESSION['migration_log'] .= "Current database dump taken successfully."; + } + else + { + $_SESSION['migration_log'] .= '
    The Current database dump taken may not contain all values. So may not be reload the current database if any problem occurs in migration. If the migration not completed please rename the install.php and install folder and run the install.php'; + //include("modules/Migration/MigrationStep1.php"); + //exit; + } + + } + + + $continue_process = 1; + if($same_databases == 1) + { + $_SESSION['migration_log'] .= '
    Same databases are used. so skip the process of drop and create the current database.'; + } + else + { + $_SESSION['migration_log'] .= '
    Databases are different. So drop the Current Database and create. Also apply the dump of Old Database'; + //Drop the current(latest) Database + $migrationlog->debug("Going to Drop the current Database"); + $this->dropDatabase($conn,$new_dbname); + + //Create the new current(latest) Database + $migrationlog->debug("Going to Create the current Database"); + $this->createDatabase($conn,$new_dbname); + + //Apply the dump of the old database to the current database + $migrationlog->debug("Going to apply the old database dump to the new database."); + $this->applyDumpData($new_host_name,$new_mysql_port,$new_mysql_username,$new_mysql_password,$new_dbname,$dump_file); + + //get the number of tables in new database + $new_tables_count = $this->getTablesCountInNewDatabase(); + + //get the number of tables in old database + $old_tables_count = $this->getTablesCountInOldDatabase(); + + //if tables are missing after apply the dump, then alert the user and quit + if(($new_tables_count != $old_tables_count && $option == 'dbsource') || ($new_tables_count < 180 && $option == 'dumpsource')) + { + $migrationlog->debug("New Database tables not equal to Old Database tables count. Reload the current database again and quit."); + + $continue_process = 0; + $msg = "The dump may not be applied correctly. Tables exist in 4.2.3 database : $old_tables_count. Tables exist in current database after apply the dump : $new_tables_count"; + ?> + + debug("Going to modify the current database which is now as old database setup"); + $this->modifyDatabase($conn); + + $migrationlog->debug("Database Modifications Ends......"); + $migrationlog->debug("Database Migration from Old Database to the Current Database has been Finished."); + } + else + { + //Drop the current(latest) Database + $migrationlog->debug("Problem in migration. so going to Restore the current Database"); + $migrationlog->debug("Going to Drop the current Database"); + $this->dropDatabase($conn,$new_dbname); + + //Create the new current(latest) Database + $migrationlog->debug("Going to Create the current Database"); + $this->createDatabase($conn,$new_dbname); + + //Reload the new db dump and quit + $migrationlog->debug("Going to apply the new backup db dump"); + $this->applyDumpData($new_host_name,$new_mysql_port,$new_mysql_username,$new_mysql_password,$new_dbname,$new_dump_file); + + //Return to Step1 + echo '
    Dump could not be applied correctly. so your previous database restored.'; + include("modules/Migration/MigrationStep1.php"); + } + + //Now we should recalculate the user and sharing privileges + RecalculateSharingRules(); + } + +} + + + +?> diff --git a/oss/vtiger/trunk/modules/Migration/MigrationCheck.php b/oss/vtiger/trunk/modules/Migration/MigrationCheck.php new file mode 100644 index 00000000..47a1890a --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/MigrationCheck.php @@ -0,0 +1,422 @@ +is_admin != 'on') +{ + die("

    ".$app_strings['LBL_PERMISSION']." ".$app_strings['LBL_GO_BACK'].".
    "); +} + +include("config.inc.php"); +$migration_log = ''; + +//Added for Migration Log +$migrationlog =& LoggerManager::getLogger('MIGRATION'); + +//new database values get from the current vtigerCRM's config.php +global $dbconfig; +$new_host_name = $dbconfig['db_hostname']; +$new_mysql_username = $dbconfig['db_username']; +$new_mysql_password = $dbconfig['db_password']; +$new_dbname = $dbconfig['db_name']; + +//this is to check whether the user_privileges folder has write permission +if(!is_writable($root_directory."user_privileges/")) +{ + echo "
    Please give read/write permission to user_privileges folder."; + include("modules/Migration/MigrationStep1.php"); + exit; +} + +//this is to check whether the mysql path is needed and has been entered or not +if($_REQUEST['getmysqlpath'] == 1 && $_REQUEST['server_mysql_path'] != '') +{ + $mysql_path_found = false; + $server_mysql_path = $_REQUEST['server_mysql_path']; + if(is_file($server_mysql_path."/mysqldump")) + { + $mysql_path_found = true; + @session_unregister('set_server_mysql_path'); + $_SESSION['set_server_mysql_path'] = $server_mysql_path; + $migration_log .='MySQL Dump file has found in ==> '.$server_mysql_path; + } + elseif(substr($_ENV["OS"],0,3) == "Win" && is_file($server_mysql_path."\mysqldump.exe")) + { + $mysql_path_found = true; + @session_unregister('set_server_mysql_path'); + $_SESSION['set_server_mysql_path'] = $server_mysql_path; + $migration_log .='MySQL Dump file has found in ==> '.$server_mysql_path; + } + + if(!$mysql_path_found && $_REQUEST['migration_option'] != 'alter_db_details') + { + //header("Location: index.php?module=Migration&action=MigrationStep1&parenttab=Settings"); + echo '
    MySQL dump file is not exist in the specified MySQL Server Path'; + include("modules/Migration/MigrationStep1.php"); + exit; + } +} +$migrationlog->debug("$migration_log"); +//echo '
    Proceed with migration'; + + +$migrationlog->debug("Migration Option - ".$_REQUEST['migration_option']); +include("modules/Migration/Migration.php"); +if($_REQUEST['migration_option'] == 'db_details') +{ + //Source MySQL database details have been given. + //old database values + $old_host_name = $_REQUEST['old_host_name']; + $old_mysql_port = $_REQUEST['old_port_no']; + $old_mysql_username = $_REQUEST['old_mysql_username']; + $old_mysql_password = $_REQUEST['old_mysql_password']; + $old_dbname = $_REQUEST['old_dbname']; + + $migrationlog->debug("old host name = ".$old_host_name); + $migrationlog->debug("old MySQL port = ".$old_mysql_port); + $migrationlog->debug("old MySQL username = ".$old_mysql_username); + $migrationlog->debug("old MySQL password = ".$old_mysql_password); + $migrationlog->debug("old db name = ".$old_dbname); + + //make a connection with the old database + $oldconn = @mysql_connect($old_host_name.":".$old_mysql_port,$old_mysql_username,$old_mysql_password); + + //make a connection with the new database + $newconn = @mysql_connect($new_host_name,$new_mysql_username,$new_mysql_password); + + if(!$oldconn) + { + echo '
    Source Database Server cannot be connected'; + $continue1 = 0; + } + elseif(!$newconn) + { + echo '
    Current working Database Server cannot be connected'; + $continue1 = 0; + } + else + { + $migration_log .= ' Database Servers can be connected. Can proceed with migration'; + $migrationlog->debug("Database Servers can be connected. continue1 = 1"); + $continue1 = 1; + } + + if($continue1 == 1) + { + //check whether the specified databases are exist or not + $olddb_exist = @mysql_select_db($old_dbname,$oldconn); + //$newdb_exist = @mysql_select_db($new_dbname,$oldconn); + if(!$olddb_exist) + { + echo '
    Source Database does not exist'; + $continue2 = 0; + } + //elseif(!$newdb_exist) + //{ + // echo '
    New Database is not exist'; + // $continue2 = 0; + //} + else + { + $migration_log .= '
    Required databases exist'; + $migrationlog->debug("Required databases exist. continue2 = 1"); + $continue2 = 1; + } + } + + if($continue2 == 1) + { + //Check whether the vtiger_table are exist in the databases or not + $old_tables = @mysql_num_rows(mysql_list_tables($old_dbname,$oldconn)); + //$new_tables = @mysql_num_rows(mysql_list_tables($new_dbname)); + + if(!$old_tables) + { + echo '
    Tables do not exist in the Source Database'; + $continue3 = 0; + } + /* if(!$new_tables) + { + echo '
    Tables are not exist in New Database'; + $continue3 = 0; + } + */ + else + { + $migration_log .= '
    Tables exist in both the Databases'; + $migrationlog->debug("Tables exist in the database. continue3 = 1"); + $continue3 = 1; + } + } + + //To check whether the two databases are same + if($continue3 == 1) + { + $new_host = explode(":",$new_host_name); + + if($old_host_name == $new_host[0] && $old_mysql_port == $new_host[1] && $old_mysql_username == $new_mysql_username && $old_mysql_password == $new_mysql_password && $old_dbname == $new_dbname) + { + echo '
    Both the databases are the same.'; + $continue4 = 1;//change the value to 0 if you don't want to proceed with the same database + $same_databases = 1; + } + else + { + $continue4 = 1; + $same_databases = 0; + } + } + + //$continue1 -- Database servers can be connected + //$continue2 -- Database exists in the servers + //$continue3 -- Tables are exist in the databases + //$continue4 -- Two databases are not same + + if($continue1 == 1 && $continue2 == 1 && $continue3 == 1 && $continue4 == 1) + { + $migrationlog->debug("Going to migrate..."); + + $new_host = explode(":",$new_host_name); + + $conn = new PearDatabase("mysql",$new_host_name,$new_dbname,$new_mysql_username,$new_mysql_password); + $conn->connect(); + + $migrationlog->debug("MICKIE ==> Option = DB details. From the given DB details we will migrate."); + + @session_unregister('migration_log'); + $_SESSION['migration_log'] = $migration_log; + if($conn) + { + $migrationlog->debug("Pear Database object created. Going to create migration object."); + + $obj = new Migration('',$conn); + $obj->setOldDatabaseParams($old_host_name,$old_mysql_port,$old_mysql_username,$old_mysql_password,$old_dbname); + $obj->setNewDatabaseParams($new_host[0],$new_host[1],$new_mysql_username,$new_mysql_password,$new_dbname); + $obj->migrate($same_databases,'dbsource'); + } + else + { + echo '
    Cannot make a connection with the current database setup.'; + include("modules/Migration/MigrationStep1.php"); + } + } + else + { + echo '
    ERROR!!!!!!Please check the input values, unable to proceed.'; + include("modules/Migration/MigrationStep1.php"); + } + + +} +elseif($_REQUEST['migration_option'] == 'dump_details') +{ + $old_dump_details = $_FILES['old_dump_filename']; + $old_dump_filename = $old_dump_details['name']; + $migrationlog->debug("Dump file name ==> $old_dump_filename"); + + //MySQL Dump file details has given + if($old_dump_details['size'] != 0 && is_file($old_dump_details['tmp_name'])) + { + $gotostep1 = 0; + //apply this dump file to the new database + $checkDumpFileAndApply = 1; + } + else + { + $gotostep1 = 1; + if($old_dump_details['error'] == 2 || $old_dump_details['error'] == 1) + { + $invalid_dump = 1; + $errormessage = "Sorry, the uploaded file exceeds the maximum filesize limit. Try other option."; + } + elseif($old_dump_details['error'] == 4 || $old_dump_details['size'] == 0 || !is_file($old_dump_details['tmp_name'])) + { + $invalid_dump = 1; + $errormessage = "Please enter a valid Dump file."; + } + $migrationlog->debug("Dump file error no = ".$old_dump_details['error']); + } + + if($gotostep1 == 1) + { + if($invalid_dump == 1) + { + echo "
    $errormessage"; + } + include("modules/Migration/MigrationStep1.php"); + exit; + } + + if($checkDumpFileAndApply == 1) + { + //TODO - Check whether the given file is Dump file and then apply to the new database + $migration_log .= '
    Going to apply the Dump file to the new database.'; + + //If the dump is valid and going to migrate then we should move the browsed dump file to root directory + global $root_directory; + move_uploaded_file($old_dump_details['tmp_name'],$root_directory.$old_dump_details['name']); + + include("config.inc.php"); + global $dbconfig; + + $new_host_name = $dbconfig['db_hostname']; + $new_dbname = $dbconfig['db_name']; + $new_mysql_username = $dbconfig['db_username']; + $new_mysql_password = $dbconfig['db_password']; + + $conn = new PearDatabase("mysql",$new_host_name,$new_dbname,$new_mysql_username,$new_mysql_password); + $conn->connect(); + + $migrationlog->debug("MICKIE ==> Option = Dump File. Selected Dump File will be applied to the new database"); + + @session_unregister('migration_log'); + $_SESSION['migration_log'] = $migration_log; + if($conn) + { + $migrationlog->debug("Pear Database object created. Going to create migration object."); + + $obj = new Migration('',$conn); + + $new_host = explode(":",$new_host_name); + $temp_new_host_name = $new_host[0]; + $new_mysql_port = $new_host[1]; + + $obj->setNewDatabaseParams($new_host[0],$new_host[1],$new_mysql_username,$new_mysql_password,$new_dbname); + $obj->migrate(0,'dumpsource',$old_dump_filename); + } + } + +} +elseif($_REQUEST['migration_option'] == 'alter_db_details') +{ + //old database values + $old_host_name = $_REQUEST['alter_old_host_name']; + $old_mysql_port = $_REQUEST['alter_old_port_no']; + $old_mysql_username = $_REQUEST['alter_old_mysql_username']; + $old_mysql_password = $_REQUEST['alter_old_mysql_password']; + $old_dbname = $_REQUEST['alter_old_dbname']; + + $migrationlog->debug("old host name = ".$old_host_name); + $migrationlog->debug("old MySQL port = ".$old_mysql_port); + $migrationlog->debug("old MySQL username = ".$old_mysql_username); + $migrationlog->debug("old MySQL password = ".$old_mysql_password); + $migrationlog->debug("old db name = ".$old_dbname); + + //make a connection with the old database + $oldconn = @mysql_connect($old_host_name.":".$old_mysql_port,$old_mysql_username,$old_mysql_password); + + if(!$oldconn) + { + echo '
    Source Database Server cannot be connected'; + $continue1 = 0; + } + else + { + $migration_log .= ' Database Server can be connected. Can proceed with migration'; + $migrationlog->debug("Database server connected. continue1 = 1"); + $continue1 = 1; + } + + if($continue1 == 1) + { + //check whether the specified databases are exist or not + $olddb_exist = @mysql_select_db($old_dbname,$oldconn); + + if(!$olddb_exist) + { + echo '
    Source Database does not exist'; + $continue2 = 0; + } + else + { + $migration_log .= '
    Required database exist'; + $migrationlog->debug("Database exist. continue2 = 1"); + $continue2 = 1; + } + } + + if($continue2 == 1) + { + //Check whether the vtiger_table are exist in the databases or not + $old_tables = @mysql_num_rows(mysql_list_tables($old_dbname,$oldconn)); + + if(!$old_tables) + { + echo '
    Tables do not exist in the Source Database'; + $continue3 = 0; + } + else + { + $migration_log .= '
    Tables exist in the Database'; + $migrationlog->debug("Tables exist. continue3 = 1"); + $continue3 = 1; + } + } + + //$continue1 -- Database server can be connected + //$continue2 -- Database exists in the server + //$continue3 -- Tables are exist in the database + + if($continue1 == 1 && $continue2 == 1 && $continue3 == 1) + { + + $conn = new PearDatabase("mysql",$old_host_name.":".$old_mysql_port,$old_dbname,$old_mysql_username,$old_mysql_password); + $conn->connect(); + + $migrationlog->debug("MICKIE ==> Option = Alter DB details. From the given DB details we will migrate."); + + @session_unregister('migration_log'); + $_SESSION['migration_log'] = $migration_log; + if($conn) + { + $migrationlog->debug("Database object created. Going to create Migration object"); + + $obj = new Migration('',$conn); + $obj->setOldDatabaseParams($old_host_name,$old_mysql_port,$old_mysql_username,$old_mysql_password,$old_dbname); + //$obj->migrate($same_databases,'dbsource'); + $obj->modifyDatabase($conn); + } + else + { + echo '
    Cannot make a connection with the current database setup'; + include("modules/Migration/MigrationStep1.php"); + } + } + else + { + echo '
    ERROR!!!!!!Please check the input values, unable to proceed.'; + include("modules/Migration/MigrationStep1.php"); + } +} +else +{ + //Return to the MigrationStep1 + include("modules/Migration/MigrationStep1.php"); + exit; +} + +?> + + + + diff --git a/oss/vtiger/trunk/modules/Migration/MigrationInfo.php b/oss/vtiger/trunk/modules/Migration/MigrationInfo.php new file mode 100644 index 00000000..d07ec8a1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/MigrationInfo.php @@ -0,0 +1,309 @@ + + + + + + + + + + + + +

    + Settings > Migrate from Previous Version +
    +
     
    + + + + + + + +
    + + + + + + + + + + + + + +
    + Migrate From Previous Version
    + Update your new vtiger CRM 5 database with the data from previous installation
    + To Start, follow the instructions below +
    + Migration Results +


    +
    + + + + + +
    Migration is in progress. Please wait...
    + Your old data is now moving into new vtiger CRM
    +
    + + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Destination(Current) Database +
    + Host Name + + new_hostname; ?> +
    + MySQL Port No + + new_mysql_port; ?> +
    + MySQL Username + + new_mysql_username; ?> +
    + MYSQL Password + + new_mysql_password); ?> +
    + DB Name + + new_dbname; ?> +
    + +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Source Database +
    + Host Name + + old_hostname; ?> +
    + MySQL Port No + + old_mysql_port; ?> +
    + MySQL Username + + old_mysql_username; ?> +
    + MYSQL Password + + old_mysql_password); ?> +
    + DB Name + + old_dbname; ?> +
    + +
    + +
    + + + Migration Process Log +
    + + +
    + +

    + + Migration Queries Log +
    + + + + + + + + + + + + + + debug("Mickie ---- Patch Process ---- Starts \n\n\n"); + + //This will be used in PatchApply.php file. if this is not set we can't proceed + $source_version = '50'; + $continue_42P2 = true; + + //Now we have to include PatchApply.php which will include necessary patch files + include("modules/Migration/PatchApply.php"); + + $migrationlog->debug("Mickie ---- Patch Process ---- Ends \n\n\n"); + + + + ?> +
    +
    These following queries are executed to modify the 4.2.3/4.2 Patch2 database to 5.0 database. +
    Status Object Suceess/Failure Query
    +
    + + +

    + + Failed Queries Log +
    + + '.$failed_query.''; + ?> +
    + +

    + + + + + + + + + + + + + + + +
    + Total Number of queries executed : + + +
    + Queries Successed : + + + + +
    + Queries Failed : + + + + +
    + + + +
    + + Note : Please copy and archive the failed queries log. This may help in future references.

    +
     
    +
    + + + +
    +
    +
    +
    + +
     
    diff --git a/oss/vtiger/trunk/modules/Migration/MigrationStep0.php b/oss/vtiger/trunk/modules/Migration/MigrationStep0.php new file mode 100644 index 00000000..4edac241 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/MigrationStep0.php @@ -0,0 +1,70 @@ +is_admin != 'on') +{ + die("

    ".$app_strings['LBL_PERMISSION']." ".$app_strings['LBL_GO_BACK'].".
    "); +} + +// Remove the MigrationStep0.tpl file from Smarty cache +$migration_tpl_file = get_smarty_compiled_file('MigrationStep0.tpl'); +if ($migration_tpl_file != null) unlink($migration_tpl_file); + +global $adb,$default_charset,$theme; + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty = new vtigerCRM_Smarty(); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("MODULE","Migration"); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +if($adb->isPostgres()) + $db_status='1'; +else + $db_status=check_db_utf8_support($adb); + +$config_status=get_config_status(); + +$smarty->assign("DB_CHARSET", get_db_charset($adb)); +$smarty->assign("DB_STATUS", $db_status); +$smarty->assign("CONFIG_CHARSET", $default_charset); +$smarty->assign("CONFIG_STATUS", $config_status); + +$data_conversion_msg = array( + /* php: utf8, d: utf8 */ + '1' => array('msg1'=> '', 'msg2' => '', 'checked' => 'true'), + '2' => array('msg1'=> "To have complete UTF-8 support:-
    1. Set \$default_charset='UTF-8'; in config.inc.php
    2. Select the check box below for database charset handling and data conversion.
    ", + 'msg2' => 'To continue without UTF-8 support, keep the above option unchecked.', 'checked' => 'false'), + '3' => array('msg1'=> "To have complete UTF-8 support, we recommend you to set \$default_charset='UTF-8'; in config.inc.php.", + 'msg2' => "Select the above check box after changing the config file, if you need UTF-8 data conversion (Unicode support).", + 'checked' => 'false'), + '4' => array('msg1'=> "UTF-8 should be enabled for database to have complete unicode support. This will be handled in data conversion to UTF-8.", + 'msg2' => "De-select the above check box, if you do not need UTF-8 data conversion (Unicode support will be inconsistent).", + 'checked' => 'true')); + +$db_migration_status = getMigrationCharsetFlag(); + +if ($db_migration_status == MIG_CHARSET_PHP_UTF8_DB_UTF8) { + header("Location: index.php?module=Migration&action=index&parenttab=Settings"); +} + +$smarty->assign("CONVERSION_MSG", $data_conversion_msg[$db_migration_status]); + +$smarty->display("MigrationStep0.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Migration/MigrationStep1.php b/oss/vtiger/trunk/modules/Migration/MigrationStep1.php new file mode 100644 index 00000000..a52a6125 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/MigrationStep1.php @@ -0,0 +1,137 @@ +is_admin != 'on') +{ + die("

    ".$app_strings['LBL_PERMISSION']." ".$app_strings['LBL_GO_BACK'].".
    "); +} + +//To get the Current installed MySQL path +include("connection.php"); +$vtiger_home = $_ENV["VTIGER_HOME"]; +$mysqldir = $mysql_dir; + +if(is_file($mysqldir."/bin/mysqldump")) +{ + $installed_mysql_path = $mysqldir."/bin/mysqldump"; + $getmysqlpath = 0; +} +elseif(is_file($vtiger_home."/mysql/bin/mysqldump")) +{ + $installed_mysql_path = $vtiger_home."/mysql/bin/mysqldump"; + $getmysqlpath = 0; +} +elseif(substr($_ENV["OS"],0,3) == "Win") +{ + if(is_file($vtiger_home.'\mysql\bin\mysql.exe')) + { + $installed_mysql_path = $vtiger_home.'\mysql\bin\mysqldump.exe'; + @session_unregister('set_server_mysql_path'); + $_SESSION['set_server_mysql_path'] = $vtiger_home.'\mysql\bin'; + $getmysqlpath = 0; + } + else + { + $getmysqlpath = 1; + } +} +else +{ + $getmysqlpath = 1; + + if($_REQUEST['migration_option'] == 'alter_db_details') + $showmysqlpath = 'none'; + else + $showmysqlpath = 'block'; +} + + + +require_once('Smarty_setup.php'); + +global $app_strings,$app_list_strings,$mod_strings,$theme,$currentModule; + +$smarty = new vtigerCRM_Smarty(); + + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("MODULE","Migration"); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +$smarty->assign("DB_DETAILS_CHECKED", 'checked'); +$smarty->assign("SHOW_DB_DETAILS", 'block'); + +//Based on this $getmysqlpath variable we should get the mysql path from the user +$smarty->assign("GET_MYSQL_PATH",$getmysqlpath); +$smarty->assign("SHOW_MYSQL_PATH",$showmysqlpath); + +//this is to set the entered values when we could not proceed the migration and return to step1 +if($_REQUEST['migration_option'] != '') +{ + if($_REQUEST['migration_option'] == 'db_details') + { + if($_REQUEST['old_host_name'] != '') + $smarty->assign("OLD_HOST_NAME", $_REQUEST['old_host_name']); + if($_REQUEST['old_port_no'] != '') + $smarty->assign("OLD_PORT_NO", $_REQUEST['old_port_no']); + if($_REQUEST['old_mysql_username'] != '') + $smarty->assign("OLD_MYSQL_USERNAME", $_REQUEST['old_mysql_username']); + if($_REQUEST['old_mysql_password'] != '') + $smarty->assign("OLD_MYSQL_PASSWORD", $_REQUEST['old_mysql_password']); + if($_REQUEST['old_dbname'] != '') + $smarty->assign("OLD_DBNAME", $_REQUEST['old_dbname']); + + if($_REQUEST['server_mysql_path'] != '') + $smarty->assign("SERVER_MYSQL_PATH", $_REQUEST['server_mysql_path']); + } + elseif($_REQUEST['migration_option'] == 'dump_details') + { + $smarty->assign("DUMP_DETAILS_CHECKED", 'checked'); + $smarty->assign("DB_DETAILS_CHECKED", ''); + + $smarty->assign("SHOW_DUMP_DETAILS", 'block'); + $smarty->assign("SHOW_DB_DETAILS", 'none'); + } + else + { + if($_REQUEST['alter_old_host_name'] != '') + $smarty->assign("ALTER_OLD_HOST_NAME", $_REQUEST['alter_old_host_name']); + if($_REQUEST['alter_old_port_no'] != '') + $smarty->assign("ALTER_OLD_PORT_NO", $_REQUEST['alter_old_port_no']); + if($_REQUEST['alter_old_mysql_username'] != '') + $smarty->assign("ALTER_OLD_MYSQL_USERNAME", $_REQUEST['alter_old_mysql_username']); + if($_REQUEST['alter_old_mysql_password'] != '') + $smarty->assign("ALTER_OLD_MYSQL_PASSWORD", $_REQUEST['alter_old_mysql_password']); + if($_REQUEST['alter_old_dbname'] != '') + $smarty->assign("ALTER_OLD_DBNAME", $_REQUEST['alter_old_dbname']); + + if($_REQUEST['server_mysql_path'] != '') + $smarty->assign("SERVER_MYSQL_PATH", $_REQUEST['server_mysql_path']); + + $smarty->assign("DB_DETAILS_CHECKED", ''); + $smarty->assign("DUMP_DETAILS_CHECKED", ''); + $smarty->assign("ALTER_DB_DETAILS_CHECKED", 'checked'); + + $smarty->assign("SHOW_DB_DETAILS", 'none'); + $smarty->assign("SHOW_DUMP_DETAILS", 'none'); + $smarty->assign("SHOW_ALTER_DB_DETAILS", 'block'); + } +} + +$smarty->display("MigrationStep1.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Migration/PatchApply.php b/oss/vtiger/trunk/modules/Migration/PatchApply.php new file mode 100644 index 00000000..029a05ef --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/PatchApply.php @@ -0,0 +1,197 @@ +is_admin != 'on') +{ + die("

    ".$app_strings['LBL_PERMISSION']." ".$app_strings['LBL_GO_BACK'].".
    "); +} + +include("modules/Migration/versions.php"); +$migrationlog =& LoggerManager::getLogger('MIGRATION'); + +//global $vtiger_current_version; +if($_REQUEST['source_version'] != '') + $source_version = $_REQUEST['source_version']; + +//echo '
    Source Version = '.$source_version.'
    Current Version = '.$current_version; + +if(!isset($source_version) || empty($source_version)) +{ + //If source version is not set then we cannot proceed + echo "
    Source Version is not set. Please provide the Source Version and contiune the Patch Process"; + exit; +} + +$reach = 0; +foreach($versions as $version => $label) +{ + if($version == $source_version || $reach == 1) + { + $reach = 1; + $temp[] = $version; + } +} +$temp[] = $current_version; + +if(!isset($continue_42P2))//This variable is used in MigrationInfo.php to avoid display the table tag +{ + echo "
    Going to apply the Database Changes...
    "; + //echo ''; + echo '
    '; +} + +//Here we have to decide the database object to which we have to run the migration queries +//For options 1 and 2 we need to execute the queries in current database ie., adb object +//But for option 3, we have to run the queries in given 4.2.3 database ie., conn object +//This session variable should be used in all patch files(which contains the queries) so that based on the option selected the queries will be executed in the corresponding database. ie., in all patch files we have to assign this session object to adb and conn objects +global $adb; +if($_REQUEST['migration_option'] == 'alter_db_details') + $_SESSION['adodb_current_object'] = $conn; +else + $_SESSION['adodb_current_object'] = $adb; + + +for($patch_count=0;$patch_count ".$temp[$patch_count+1]." Database changes -- Starts.".$end_tag; + + include($filename);//include the file which contains the corresponding db changes + + echo $start_tag.$temp[$patch_count]." ==> ".$temp[$patch_count+1]." Database changes -- Ends.".$end_tag; + } + elseif(isset($temp[$patch_count+1])) + { + echo $empty_tag.$start_tag."There is no Database Changes from ".$temp[$patch_count]." ==> ".$temp[$patch_count+1].$end_tag; + } + else + { + //No file available or Migration not provided for this release + //echo '
    No Migration / No File ==> '.$filename; + } + if($adb->isMySQL()) { + @include_once('modules/Migration/Performance/'.$temp[$patch_count+1].'_mysql.php'); + } elseif($adb->isPostgres()) { + @include_once('modules/Migration/Performance/'.$temp[$patch_count+1].'_postgres.php'); + } +} + + if(getMigrationCharsetFlag() == MIG_CHARSET_PHP_UTF8_DB_UTF8) + { + echo '


    '; + include("modules/Migration/HTMLtoUTF8Conversion.php"); + } + +if(!isset($continue_42P2))//This variable is used in MigrationInfo.php to avoid display the table tag +{ + echo ''; + echo '

    Failed Queries Log +
    '; + + if(is_array($failure_query_array)) + foreach($failure_query_array as $failed_query) + echo '
    '.$failed_query.';'; + else + echo '
    No queries failed during Patch Update.'; + + echo '
    '; + //echo "Failed Queries ==>
    ";print_r($failure_query_array);echo '
    '; +} + + +//HANDLE HERE - Mickie +//Here we have to update the version in table. so that when we do migration next time we will get the version +global $vtiger_current_version; +$res = $adb->pquery("select * from vtiger_version", array()); +if($adb->num_rows($res)) +{ + $res = $adb->pquery("update vtiger_version set old_version=?,current_version=?", array($versions[$source_version], $vtiger_current_version)); +} +else +{ + $adb->pquery("insert into vtiger_version (id, old_version, current_version) values ('', ?, ?);", array($versions[$source_version], $vtiger_current_version)); +} + +//If currency name in config.inc.php file and currency name in vtiger_currency_info table is differ then we have to change in config.inc.php file +$mig_currency = $adb->query_result($adb->pquery("select currency_name from vtiger_currency_info", array()),0,'currency_name'); +if($currency_name != $mig_currency) +{ + echo "

    NOTE:

    Please change the base currency name as '$mig_currency' in config.inc.php ie., change the variable currency name as $"."currency_name = '$mig_currency' in config.inc.php file.


    "; +} + +echo ' + + + + +
     
    +
    + + + +
    +


    '; + +perform_post_migration_activities(); + +//Function used to execute the query and display the success/failure of the query +function ExecuteQuery($query) +{ + global $adb; + global $conn, $query_count, $success_query_count, $failure_query_count, $success_query_array, $failure_query_array; + global $migrationlog; + + //For third option migration we have to use the $conn object because the queries should be executed in 4.2.3 db + if($_REQUEST['migration_option'] == 'alter_db_details') + $status = $conn->query($query); + else + $status = $adb->query($query); + + $query_count++; + if(is_object($status)) + { + echo ' + + '.get_class($status).' + S + '.$query.' + '; + $success_query_array[$success_query_count++] = $query; + $migrationlog->debug("Query Success ==> $query"); + } + else + { + echo ' + + '.$status.' + F + '.$query.' + '; + $failure_query_array[$failure_query_count++] = $query; + $migrationlog->debug("Query Failed ==> $query \n Error is ==> [".$adb->database->ErrorNo()."]".$adb->database->ErrorMsg()); + } +} + + +?> diff --git a/oss/vtiger/trunk/modules/Migration/deleteCustomFields.php b/oss/vtiger/trunk/modules/Migration/deleteCustomFields.php new file mode 100644 index 00000000..7b8ad017 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/deleteCustomFields.php @@ -0,0 +1,57 @@ +"columnname", + "vtiger_cvstdfilter"=>"columnname", + "vtiger_cvadvfilter"=>"columnname", + "vtiger_selectcolumn"=>"columnname", + "vtiger_relcriteria"=>"columnname", + "vtiger_reportsortcol"=>"columnname", + "vtiger_reportdatefilter"=>"datecolumnname", + "vtiger_reportsummary"=>"columnname", + ); + + +foreach($tables_array as $tablename => $columnname) +{ + $query = "select $columnname from $tablename where $columnname like '%:cf_%'"; + $result = $conn->query($query); + $noofrows = $conn->num_rows($result); + + for($i=0;$i<$noofrows;$i++) + { + //First get the fieldname from the result + $col_value = $conn->query_result($result,$i,$columnname); + $fieldname = substr($col_value,strpos($col_value,':cf_')+1,6); + + //Now check whether this field is available in field table + $sql1 = "select fieldid from vtiger_field where fieldname='".$fieldname."' and vtiger_field.presence in (0,2)"; + $result1 = $conn->query($sql1); + $noofrows1 = $conn->num_rows($result1); + $fieldid = $conn->query_result($result1,0,"fieldid"); + + //if there is no field then we have to delete that field entries + if($noofrows1 == 0 && !isset($fieldid)) + { + //Now we have to delete that customfield from the $tablename + Execute("delete from $tablename where $columnname like '%:".$fieldname.":%'"); + } + } +} + + + +?> diff --git a/oss/vtiger/trunk/modules/Migration/index.php b/oss/vtiger/trunk/modules/Migration/index.php new file mode 100644 index 00000000..ebd43fb0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/index.php @@ -0,0 +1,134 @@ +is_admin != 'on') +{ + die("

    ".$app_strings['LBL_PERMISSION']." ".$app_strings['LBL_GO_BACK'].".
    "); +} + +// Remove the Migration.tpl file from Smarty cache +$migration_tpl_file = get_smarty_compiled_file('Migration.tpl'); +if ($migration_tpl_file != null) unlink($migration_tpl_file); + +if(getMigrationCharsetFlag() != MIG_CHARSET_PHP_UTF8_DB_UTF8 && !isset($_REQUEST['migration_charstcheck'])) +{ + include('modules/Migration/MigrationStep0.php'); + exit; +} + +include("modules/Migration/versions.php"); +require_once('Smarty_setup.php'); +global $app_strings,$app_list_strings,$mod_strings,$theme,$currentModule; +include("vtigerversion.php"); +//Check the current version before starting migration. If the current versin is latest, then we wont allow to do 5.x migration. But here we must allow for 4.x migration. Because 4.x migration can be done with out changing the current database. -Shahul +$status=true; +$exists=$adb->query("show create table vtiger_version"); +if($exists) +{ + $result = $adb->query("select * from vtiger_version"); + $dbversion = $adb->query_result($result, 0, 'current_version'); + if($dbversion == $vtiger_current_version) + { + $status=false; + } + +} +if(!$adb->isPostgres()) { + if(isset($_REQUEST['dbconversionutf8'])) { + if($_REQUEST['dbconversionutf8'] == 'yes') { + $query = " ALTER DATABASE ".$dbconfig['db_name']." DEFAULT CHARACTER SET utf8"; + $adb->query($query); + } + } +} + +//Added to check config variables($CALENDAR_DISPLAY = 'true',$CHAT_DISPLAY = 'true';) is present or Not +global $CALENDAR_DISPLAY,$CHAT_DISPLAY; +$cal_status =false; +$chat_status =false; +$final_status =false; +$disp_msg = ''; + +if(isset($CALENDAR_DISPLAY)) + $cal_status = true; +if(isset($CHAT_DISPLAY)) + $chat_status = true; + +if($cal_status == false && $chat_status == true) +{ + $final_status = false; + $disp_msg = 'The $CALENDAR_DISPLAY variable not available in the config.inc.php file .
    Please add the following line at the end of the file config.inc.php before starting migration.
    '; + $disp_msg .= ' $CALENDAR_DISPLAY = '."'true'; "; +} +else if($cal_status == true && $chat_status == false) +{ + $final_status = false; + $disp_msg = 'The $CHAT_DISPLAY variable not available in the config.inc.php file .
    Please add the following line at the end of the file config.inc.php before starting migration.
    '; + $disp_msg .= '$CHAT_DISPLAY ='." 'true'; "; +} +else if($cal_status == false && $chat_status == false) +{ + $final_status = false; + $disp_msg = 'The $CALENDAR_DISPLAY, $CHAT_DISPLAY variables are not available in the config.inc.php file .
    Please add the following lines at the end of the file config.inc.php before starting migration.
    '; + $disp_msg .= ' $CALENDAR_DISPLAY = '."'true';
    ".'$CHAT_DISPLAY = '." 'true'; "; +} +else if($cal_status == true && $chat_status == true) + $final_status = true; + +if(!$final_status) +{ + echo '
    + + +
    '; + echo ' '; + echo $disp_msg; + echo '

    Kindly do the necessary changes in config.inc.php and click on the "Proceed" button to proceed with the Migration.
    '; + echo '

    + + + +
    '; + exit; + +} + + +$smarty = new vtigerCRM_Smarty(); + +$smarty->assign("MIG_CHECK", $status); +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("MODULE","Migration"); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +$source_versions = ""; + +$smarty->assign("SOURCE_VERSION", $source_versions); +global $vtiger_current_version; +$smarty->assign("CURRENT_VERSION", $vtiger_current_version); + +$smarty->display("Migration.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Migration/language/en_us.lang.php b/oss/vtiger/trunk/modules/Migration/language/en_us.lang.php new file mode 100644 index 00000000..3c4dec91 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/language/en_us.lang.php @@ -0,0 +1,100 @@ +'Enter Values to Migrate Data from Source to Current (Latest) vtigerCRM ', +'LBL_CURRENT_VT_MYSQL_EXIST'=>'Current vtiger\'s MySQL Exist in', +'LBL_THIS_MACHINE'=>'This Machine', +'LBL_DIFFERENT_MACHINE'=>'Different Machine', +'LBL_CURRENT_VT_MYSQL_PATH'=>'Current vtiger\'s MySQL path', +'LBL_SOURCE_VT_MYSQL_DUMPFILE'=>'vtiger Source Dump File name', +'LBL_NOTE_TITLE'=>'Note:', +'LBL_NOTES_LIST1'=>'If Current MySQL Exist in the Same Machine then enter the MySQL Path (or) you can enter the Dump file if you have.', +'LBL_NOTES_LIST2'=>'If Current MySQL Exist in different Machine then enter the (Source) Dump filename with the full Path.', +'LBL_NOTES_DUMP_PROCESS'=>'To take Database dump please execute the following command from inside the mysql/bin directory +
    mysqldump --user="mysql_username" --password="mysql-password" -h "hostname" --port="mysql_port" "database_name" > dump_filename +
    add SET FOREIGN_KEY_CHECKS = 0; -- at the start of the dump file +
    add SET FOREIGN_KEY_CHECKS = 1; -- at the end of the dump file', +'LBL_NOTES_LIST3'=>'Give the MySQL path like /home/crm/vtigerCRM4_5/mysql', +'LBL_NOTES_LIST4'=>'Give the Dump filename with full Path like /home/fullpath/4_2_dump.txt', + +'LBL_CURRENT_MYSQL_PATH_FOUND'=>'Current installation\'s MySQL path has been found.', +'LBL_SOURCE_HOST_NAME'=>'Source Host Name :', +'LBL_SOURCE_MYSQL_PORT_NO'=>'Source MySql Port No :', +'LBL_SOURCE_MYSQL_USER_NAME'=>'Source MySql User Name :', +'LBL_SOURCE_MYSQL_PASSWORD'=>'Source MySql Password :', +'LBL_SOURCE_DB_NAME'=>'Source Database Name :', +'LBL_MIGRATE'=>'Migrate to Current Version', +//Added after 5 Beta +'LBL_UPGRADE_VTIGER'=>'Upgrade vtiger CRM Database', +'LBL_UPGRADE_FROM_VTIGER_423'=>'Upgrade database from vtiger CRM 4.2.3 to 5.0.0', +'LBL_SETTINGS'=>'Settings', +'LBL_STEP'=>'Step', +'LBL_SELECT_SOURCE'=>'Select Source', +'LBL_STEP1_DESC'=>'To Start database migration, you must specify the format in which the old data is available', +'LBL_RADIO_BUTTON1_TEXT'=>'I have access to vtiger CRM live database system', +'LBL_RADIO_BUTTON1_DESC'=>'This option requires you to have the host machine\'s ( where the DB is stored ) address and DB access details. Both local and remote systems are supported in this method. Refer documentation for Help.', +'LBL_RADIO_BUTTON2_TEXT'=>'I have access to vtiger CRM archived database dump', +'LBL_RADIO_BUTTON2_DESC'=>'This option requires database dump available locally in the same machine in which you are upgrading. You cannot access data dump from a different machine (remote database server). Refer documentation for Help.', +'LBL_RADIO_BUTTON3_TEXT'=>'I have a new database with 4.2.3 Data', +'LBL_RADIO_BUTTON3_DESC'=>'This option requires vtiger CRM 4.2.3 database system details, including database server ID, user name, and password. You cannot access data dump from a different machine (remote database server).', + +'LBL_HOST_DB_ACCESS_DETAILS'=>'Host Database Access Details', +'LBL_MYSQL_HOST_NAME_IP'=>'MySQL Host Name or IP Address : ', +'LBL_MYSQL_PORT'=>'MySQL Port Number : ', +'LBL_MYSQL_USER_NAME'=>'MySql User Name : ', +'LBL_MYSQL_PASSWORD'=>'MySql Password : ', +'LBL_DB_NAME'=>'Database Name : ', + +'LBL_LOCATE_DB_DUMP_FILE'=>'Locate Database Dump File', +'LBL_DUMP_FILE_LOCATION'=>'Dump File Location : ', + +'LBL_RADIO_BUTTON3_PROCESS'=>'Please do not specify the 4.2.3 database details. This option will alter the given database directly. +
    It is strongly recommended that to do the following. +
    1. Take a dump of your 4.2.3 database +
    2. Create new database (Better is to create a database in the server where your vtiger 5.0 Database is running.) +
    3. Apply this 4.2.3 dump to this new database. +
    Now give this new database access details. This migration will modify this Database to fit with the 5.0 Schema. +Then you can give this Database name in config.inc.php file to use this Database ie., $dbconfig[\'db_name\'] = \'new db name\';', + +'LBL_ENTER_MYSQL_SERVER_PATH'=>'Enter MySQL Server Path', +'LBL_SERVER_PATH_DESC'=>'MySQL path in the server like /home/5beta/vtigerCRM5_beta/mysql/bin or c:\Program Files\mysql\bin', +'LBL_MYSQL_SERVER_PATH'=>'MySQL Server Path : ', +'LBL_MIGRATE_BUTTON'=>'Migrate', +'LBL_CANCEL_BUTTON'=>'Cancel', +'LBL_UPGRADE_FROM_VTIGER_5X'=>'Upgrade database from vtiger CRM 5.x to next version', +'LBL_PATCH_OR_MIGRATION'=>'you must specify the source database version (Patch update or Migration)', +//Added for java script alerts +'ENTER_SOURCE_HOST' => 'Please enter the Source Host Name', +'ENTER_SOURCE_MYSQL_PORT' => 'Please enter the Source MySql Port Number', +'ENTER_SOURCE_MYSQL_USER' => 'Please enter the Source MySql User Name', +'ENTER_SOURCE_DATABASE' => 'Please enter the Source Database Name', +'ENTER_SOURCE_MYSQL_DUMP' => 'Please enter the Valid MySQL Dump File', +'ENTER_HOST' => 'Please enter the Host Name', +'ENTER_MYSQL_PORT' => 'Please enter the MySql Port Number', +'ENTER_MYSQL_USER' => 'Please enter the MySql User Name', +'ENTER_DATABASE' => 'Please enter the Database Name', +'SELECT_ANYONE_OPTION' => 'Please select any one option', +'ENTER_CORRECT_MYSQL_PATH' => 'Please enter the Correct MySQL Path', + +); + + + + + + +?> diff --git a/oss/vtiger/trunk/modules/Migration/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Migration/language/zh_cn.lang.php new file mode 100644 index 00000000..b39a0e44 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/language/zh_cn.lang.php @@ -0,0 +1,96 @@ + '输入升级数据,从 来源版本 升级到 最新版本的vtigerCRM ', +'LBL_CURRENT_VT_MYSQL_EXIST' => '目前 vtiger 的数据库存在于', + 'LBL_THIS_MACHINE' => '这台机器', + 'LBL_DIFFERENT_MACHINE' => '不同机器', + 'LBL_CURRENT_VT_MYSQL_PATH' => '目前 vtiger 的数据库路径', + 'LBL_SOURCE_VT_MYSQL_DUMPFILE' => 'vtiger 来源版本 汇出资料的文件名称', + 'LBL_NOTE_TITLE' => '备注:', + 'LBL_NOTES_LIST1' => '如果目前的数据库是在同一台机器,输入数据库路径(或)输入汇出数据的文件名称。', + 'LBL_NOTES_LIST2' => '如果目前的数据库存在于不同机器,输入(来源)汇出数据的文件名称与完整路径。', + 'LBL_NOTES_DUMP_PROCESS' => '要将数据库汇出,请参考下面指令:
    mysqldump --user="mysql_username" --password="mysql-password" -h "hostname" --port="mysql_port" "database_name" > dump_filename
    新增 SET_FOREIGN_KEY_CHECKS = 0; -- 到档案开始的地方
    新增 SET_FOREIGN_KEY_CHECKS = 1; -- 到档案结束的地方', + 'LBL_NOTES_LIST3' => '提供数据库的路径,像是 /home/crm/vtigerCRM4_5/mysql', + 'LBL_NOTES_LIST4' => '提供汇出数据的档案路径,像是 /home/fullpath/4_2_dump.txt', + + 'LBL_CURRENT_MYSQL_PATH_FOUND' => '找到目前版本的数据库路径。', + 'LBL_SOURCE_HOST_NAME' => '来源主机名称:', + 'LBL_SOURCE_MYSQL_PORT_NO' => '来源数据库连接端口:', + 'LBL_SOURCE_MYSQL_USER_NAME' => '来源数据库账号:', + 'LBL_SOURCE_MYSQL_PASSWORD' => '来源数据库密码:', + 'LBL_SOURCE_DB_NAME' => '来源数据库名称:', + 'LBL_MIGRATE' => '升级到最新版本', +//Added after 5 Beta +'LBL_UPGRADE_VTIGER' => '升级 vtiger CRM 数据库', + 'LBL_UPGRADE_FROM_VTIGER_423' => '将数据库从 vtiger CRM 4.2.3 升级到 5.0.0', + 'LBL_SETTINGS' => '设定', + 'LBL_STEP' => '步骤', + 'LBL_SELECT_SOURCE' => '选择来源', + 'LBL_STEP1_DESC' => '要开始数据库移转,您必须指定旧有数据的格式', + 'LBL_RADIO_BUTTON1_TEXT' => '我有 vtiger CRM 数据库系统的权限', + 'LBL_RADIO_BUTTON1_DESC' => '这个选项需要主机(数据库所在)地址与数据库权限细节,这个方法同时支持本地与远程系统,细节请参考文件说明。', + 'LBL_RADIO_BUTTON2_TEXT' => '我有 vtiger CRM 数据库备份', + 'LBL_RADIO_BUTTON2_DESC' => '这个选项需要有数据库备份文件在同一台机器来进行升级,您无法存取不同主机(远程数据库服务器)的备份数据,细节请参考文件说明。', + 'LBL_RADIO_BUTTON3_TEXT' => '我有新的数据库包含 4.2.3 数据', + 'LBL_RADIO_BUTTON3_DESC' => '这个选项需要 vtiger CRM 4.2.3 数据库系统细节,包含服务器编号、账号与密码,您无法存取不同主机(远程数据库服务器)的备份数据。', + +'LBL_HOST_DB_ACCESS_DETAILS' => '主机数据库存取权限', + 'LBL_MYSQL_HOST_NAME_IP' => 'MySQL 主机名称或IP地址:', + 'LBL_MYSQL_PORT' => 'MySQL 连接埠编号:', + 'LBL_MYSQL_USER_NAME' => 'MySql 账号:', + 'LBL_MYSQL_PASSWORD' => 'MySql 密码:', + 'LBL_DB_NAME' => '数据库名称:', + + 'LBL_LOCATE_DB_DUMP_FILE' => '数据库备份文件', + 'LBL_DUMP_FILE_LOCATION' => '备份文件位置:', + +'LBL_RADIO_BUTTON3_PROCESS'=>'Please do not specify the 4.2.3 database details. This option will alter the given database directly. +
    It is strongly recommended that to do the following. +
    1. Take a dump of your 4.2.3 database +
    2. Create new database (Better is to create a database in the server where your vtiger 5.0 Database is running.) +
    3. Apply this 4.2.3 dump to this new database. +
    Now give this new database access details. This migration will modify this Database to fit with the 5.0 Schema. +Then you can give this Database name in config.inc.php file to use this Database ie., $dbconfig[\'db_name\'] = \'new db name\';', + 'LBL_ENTER_MYSQL_SERVER_PATH' => '输入 MySQL 服务器路径', +'LBL_SERVER_PATH_DESC' => 'MySQL 在服务器的路径,像是 /home/5beta/vtigerCRM5_beta/mysql/binc:\Program Files\mysql\bin', + 'LBL_MYSQL_SERVER_PATH' => 'MySQL 服务器路径:', + 'LBL_MIGRATE_BUTTON' => '转换', + 'LBL_CANCEL_BUTTON' => '取消', +'LBL_UPGRADE_FROM_VTIGER_5X' => '升级 vtiger CRM 5.x 数据库到下一个版本', + 'LBL_PATCH_OR_MIGRATION' => '您必须指定来源数据库的版本(修补程序更新或是转换)', +//Added for java script alerts +'ENTER_SOURCE_HOST' => '请输入源主机名称', +'ENTER_SOURCE_MYSQL_PORT' => '请输入源主机MYSQL名称', +'ENTER_SOURCE_MYSQL_USER' => '请输入mysql的用户名', +'ENTER_SOURCE_DATABASE' => '请输入数据库密码', +'ENTER_SOURCE_MYSQL_DUMP' => '请输入有效的mysql转储文件', +'ENTER_HOST' => '请输入主机名称', +'ENTER_MYSQL_PORT' => '请输入mysql的端口号', +'ENTER_MYSQL_USER' => '请输入mysql的用户名', +'ENTER_DATABASE' => '请输入数据库名', +'SELECT_ANYONE_OPTION' => '请选择其中的任何一个选项', +'ENTER_CORRECT_MYSQL_PATH' => '请输入正确的mysql路径', + +); + + + + + + +?> diff --git a/oss/vtiger/trunk/modules/Migration/rename_tables.php b/oss/vtiger/trunk/modules/Migration/rename_tables.php new file mode 100644 index 00000000..a77a777a --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/rename_tables.php @@ -0,0 +1,71 @@ +debug("Inside the file rename_tables.php to rename the table names with prefix vtiger_"); + +//Rename all the tables with prefix vtiger_ +$tables_list = $conn->get_tables(); +foreach($tables_list as $index => $tablename) +{ + $sql = "rename table $tablename to $prefix$tablename"; + Execute($sql); +} +//Table renaming ends. + + +//In these following tablename => field we have to add the prefix vtiger_ as they are the tablenames +$change_cols_array = Array( + "cvcolumnlist"=>"columnname", + "cvstdfilter"=>"columnname", + "cvadvfilter"=>"columnname", + "selectcolumn"=>"columnname", + "relcriteria"=>"columnname", + "reportsortcol"=>"columnname", + "reportdatefilter"=>"datecolumnname", + "reportsummary"=>"columnname", + "field"=>"tablename", + ); + +foreach($change_cols_array as $tablename => $columnname) +{ + $result = $conn->query("select $columnname from $prefix$tablename"); + + while($row = $conn->fetch_row($result)) + { + if((!strstr($row[$columnname],$prefix)) && $row[$columnname] !='' && $row[$columnname] != 'none') + { + //for reportsummary we should add prefix in second value ie., after first :(semicolon) + if($tablename == 'reportsummary') + { + $queries_list .= "update $prefix$tablename set $columnname=\"".str_replace("cb:","cb:$prefix",$row[$columnname])."\" where $columnname=\"$row[$columnname]\"&&##"; + } + else + { + $queries_list .= "update $prefix$tablename set $columnname=\"$prefix$row[$columnname]\" where $columnname=\"$row[$columnname]\"&&##"; + } + } + } +} + +$queries_array = explode("&&##",trim($queries_list,"&&##")); + +foreach($queries_array as $index => $query) +{ + Execute($query); +} + + +$migrationlog->debug("End of file rename_tables.php. The table names renamed with prefix vtiger_"); +?> diff --git a/oss/vtiger/trunk/modules/Migration/updateCurrency.php b/oss/vtiger/trunk/modules/Migration/updateCurrency.php new file mode 100644 index 00000000..6f2f7571 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/updateCurrency.php @@ -0,0 +1,79 @@ +println('conversion rate = '.$crate); + + $query = "UPDATE vtiger_currency_info SET conversion_rate=? WHERE id=1"; + $result = $conn->pquery($query, array($crate)); + + //array should be id || vtiger_fieldname => vtiger_tablename + $modules_array = Array( + "accountid||annualrevenue" => "vtiger_account", + + "leadid||annualrevenue" => "vtiger_leaddetails", + + "potentialid||amount" => "vtiger_potential", + + "productid||unit_price" => "vtiger_products", + + "salesorderid||salestax" => "vtiger_salesorder", + "salesorderid||adjustment" => "vtiger_salesorder", + "salesorderid||total" => "vtiger_salesorder", + "salesorderid||subtotal" => "vtiger_salesorder", + + "purchaseorderid||salestax" => "vtiger_purchaseorder", + "purchaseorderid||adjustment" => "vtiger_purchaseorder", + "purchaseorderid||total" => "vtiger_purchaseorder", + "purchaseorderid||subtotal" => "vtiger_purchaseorder", + + "quoteid||tax" => "vtiger_quotes", + "quoteid||adjustment" => "vtiger_quotes", + "quoteid||total" => "vtiger_quotes", + "quoteid||subtotal" => "vtiger_quotes", + + "invoiceid||salestax" => "vtiger_invoice", + "invoiceid||adjustment" => "vtiger_invoice", + "invoiceid||total" => "vtiger_invoice", + "invoiceid||subtotal" => "vtiger_invoice", + ); + + foreach($modules_array as $fielddetails => $table) + { + $temp = explode("||",$fielddetails); + $id_name = $temp[0]; + $fieldname = $temp[1]; + + $res = $conn->query("select $id_name, $fieldname from $table"); + $record_count = $conn->num_rows($res); + + for($i=0;$i<$record_count;$i++) + { + $recordid = $conn->query_result($res,$i,$id_name); + $old_value = $conn->query_result($res,$i,$fieldname); + + //calculate the new value + $new_value = $old_value/$crate;//convertToDollar($old_value,$crate); + $conn->println("old value = $old_value && new value = $new_value"); + + $update_query = "update $table set $fieldname='".$new_value."' where $id_name=$recordid"; + $update_result = $conn->query($update_query); + } + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Migration/versions.php b/oss/vtiger/trunk/modules/Migration/versions.php new file mode 100644 index 00000000..934f2b11 --- /dev/null +++ b/oss/vtiger/trunk/modules/Migration/versions.php @@ -0,0 +1,28 @@ +"5.0", + "501"=>"5.0.1", + "502"=>"5.0.2", + "503rc2"=>"5.0.3 RC2", + "503"=>"5.0.3", + "504rc"=>"5.0.4 RC", + "504"=>"5.0.4", + "510rc"=>"5.1.0 RC", + ); + +$current_version = '510'; + +?> diff --git a/oss/vtiger/trunk/modules/Mobile/Mobile-README b/oss/vtiger/trunk/modules/Mobile/Mobile-README new file mode 100644 index 00000000..b7f7612c --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/Mobile-README @@ -0,0 +1,12 @@ +Project URL: http://code.google.com/p/iui + +Modified version: http://www.k10design.net//iui/iui.js + +Further Customization: + +iui.js ++ Avoided re-fetching link each time by re-writing href after first fetch ++ To get back default behavior use 'nocache' for the link's class attribute + +iui.css ++ Added -moz- specific rules \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/Mobile.Config.php b/oss/vtiger/trunk/modules/Mobile/Mobile.Config.php new file mode 100644 index 00000000..ec74dfe1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/Mobile.Config.php @@ -0,0 +1,19 @@ + 25, + + + 'Cache.Info' => true + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/Mobile.js b/oss/vtiger/trunk/modules/Mobile/Mobile.js new file mode 100644 index 00000000..c4a24d1a --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/Mobile.js @@ -0,0 +1,60 @@ +/*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************/ +if(typeof($) == 'undefined') { + $ = function(id) { + var node = document.getElementById(id); + if(typeof(node) == 'undefined') node = false; + return node; + } + $fnT = function(id1, id2) { + var node1 = $(id1); + var node2 = $(id2); + if(node1) node1.style.display = 'none'; + if(node2) node2.style.display = 'block'; + } + $fnFocus = function(id) { + try { + var node = $(id); + node.focus(); + } catch(error) { + } + } + + $fnAddClass = function(node, toadd) { + var classValue = node.className; + var regex = new RegExp(toadd, "g"); + if(classValue.match(regex) == null) { + classValue += " " + toadd; + node.className = classValue; + } + } + $fnRemoveClass = function(node, toremove) { + var classValue = node.className; + var regex = new RegExp(toremove, "g"); + classValue = classValue.replace(regex, ''); + node.className = classValue; + } + + $fnCheckboxOn = function(idprefix) { + //$fnT((idprefix+'_on'), (idprefix+'_off')); + + var nodeon = $(idprefix+'_on'); + var nodeoff = $(idprefix+'_off'); + if(nodeon) $fnAddClass(nodeon.parentNode, 'hide'); + if(nodeoff) $fnRemoveClass(nodeoff.parentNode, 'hide'); + } + $fnCheckboxOff = function(idprefix) { + //$fnT((idprefix+'_off'), (idprefix+'_on')); + + var nodeon = $(idprefix+'_on'); + var nodeoff = $(idprefix+'_off'); + if(nodeon) $fnRemoveClass(nodeon.parentNode, 'hide'); + if(nodeoff) $fnAddClass(nodeoff.parentNode, 'hide'); + } +} \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/Mobile.php b/oss/vtiger/trunk/modules/Mobile/Mobile.php new file mode 100644 index 00000000..f2a90c46 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/Mobile.php @@ -0,0 +1,82 @@ +retrieveCurrentUserInfoFromFile($current_user_id,"Users"); + } + return $current_user; + } + + static function currentUserName() { + if(isset($_SESSION)) { + return $_SESSION[self::SESSION_LOGIN_USER]; + } + } + + static function currentUserId() { + if(isset($_SESSION)) { + return $_SESSION[self::SESSION_LOGIN_USERID]; + } + } + + static function config($key, $defvalue = false) { + // Defined in the configuration file + global $Module_Mobile_Configuration; + if(isset($Module_Mobile_Configuration) && isset($Module_Mobile_Configuration[$key])) { + return $Module_Mobile_Configuration[$key]; + } + returN $defvalue; + } + + static function authenticate($username, $password, $updateInSession = false) { + $userfocus = CRMEntity::getInstance('Users'); + $userfocus->column_fields['user_name'] = $username; + $authsuccess = $userfocus->doLogin($password); + if($updateInSession) { + $_SESSION[Mobile::SESSION_LOGIN_USER] = $username; + $_SESSION[self::SESSION_LOGIN_USERID] = $userfocus->retrieve_user_id($username); + } + return $authsuccess; + } +} +?> diff --git a/oss/vtiger/trunk/modules/Mobile/MobileAjax.php b/oss/vtiger/trunk/modules/Mobile/MobileAjax.php new file mode 100644 index 00000000..50e0401f --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/MobileAjax.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Mobile/MobileHandler.php b/oss/vtiger/trunk/modules/Mobile/MobileHandler.php new file mode 100644 index 00000000..40dfc172 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/MobileHandler.php @@ -0,0 +1,24 @@ + diff --git a/oss/vtiger/trunk/modules/Mobile/controllers/Detail.php b/oss/vtiger/trunk/modules/Mobile/controllers/Detail.php new file mode 100644 index 00000000..1c0cc1e8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/controllers/Detail.php @@ -0,0 +1,24 @@ +assign('ID', $ws_id); + +$moduleInstance = Mobile_Core_Module::fromWSID($ws_id); + +$smarty->assign('_MODULE', $moduleInstance); +$smarty->assign('_RECORD', Mobile_Core_Search::retrieve($ws_id, $moduleInstance)); + +$smarty->display(Mobile::templatePath('Detail.tpl')); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/controllers/Home.php b/oss/vtiger/trunk/modules/Mobile/controllers/Home.php new file mode 100644 index 00000000..b4a6783f --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/controllers/Home.php @@ -0,0 +1,22 @@ +assign('TITLE', 'vtiger CRM'); + +$smarty->assign('_MODULES', Mobile_Core_Module::listAll(true)); + +$smarty->assign('_ALLSKINS', Mobile_Core_Skin::listAll()); +$smarty->assign('_SELSKIN', Mobile_Core_Skin::selected()); + +$smarty->display(Mobile::templatePath('Home.tpl')); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/controllers/List.php b/oss/vtiger/trunk/modules/Mobile/controllers/List.php new file mode 100644 index 00000000..5018d91a --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/controllers/List.php @@ -0,0 +1,42 @@ +assign('_MODULE', $moduleInstance); +$smarty->assign('_PAGER', $pagingInstance); + +if($q === '') { + $smarty->assign('_RECORDS', Mobile_Core_Search::entity($moduleInstance, $pagingInstance)); + $smarty->assign('_SEARCH_Q', ''); +} else { + $smarty->assign('_RECORDS', + Mobile_Core_Search::query($moduleInstance, $q, + Mobile_Core_Session::get(Mobile_Core_Search::sessionkey($moduleInstance)), + $pagingInstance + ) + ); +} +$smarty->assign('_SEARCH_Q', $q); + +$smarty->assign('_MODE', vtlib_purify($_REQUEST['mode'])); + +$smarty->display(Mobile::templatePath('List.tpl'));; + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/controllers/Login.php b/oss/vtiger/trunk/modules/Mobile/controllers/Login.php new file mode 100644 index 00000000..b37820c8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/controllers/Login.php @@ -0,0 +1,28 @@ +assign('TITLE', 'vtiger CRM Mobile'); + +if(isset($_REQUEST['username'])) $smarty->assign("_ERR", "Login failed! Try again..."); + +$smarty->display(Mobile::templatePath('Login.tpl')); + + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/controllers/Logout.php b/oss/vtiger/trunk/modules/Mobile/controllers/Logout.php new file mode 100644 index 00000000..bec080c1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/controllers/Logout.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/controllers/Search.php b/oss/vtiger/trunk/modules/Mobile/controllers/Search.php new file mode 100644 index 00000000..756a2152 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/controllers/Search.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/controllers/SearchConfig.php b/oss/vtiger/trunk/modules/Mobile/controllers/SearchConfig.php new file mode 100644 index 00000000..c295fa99 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/controllers/SearchConfig.php @@ -0,0 +1,42 @@ +$v) { + if(preg_match("/field_(.*)/i", $k, $m)) { + $fieldnames[] = vtlib_purify($m[1]); + } + } + + Mobile_Core_Session::put(Mobile_Core_Search::sessionkey($moduleInstance), $fieldnames); + + header("Location: index.php?action=List&module={$moduleInstance->name}&mode=search"); + +} else { + + $searchfields = Mobile_Core_Session::get(Mobile_Core_Search::sessionkey($moduleInstance)); + if($searchfields === false) { + $searchfields = $moduleInstance->fieldnames(); + } + + $smarty = new vtigerCRM_Smarty(); + $smarty->assign('_MODULE', $moduleInstance); + $smarty->assign("_SEARCHIN", $searchfields); + $smarty->display(Mobile::templatePath('SearchConfig.tpl')); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/controllers/Settings.php b/oss/vtiger/trunk/modules/Mobile/controllers/Settings.php new file mode 100644 index 00000000..a710e26c --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/controllers/Settings.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/Block.php b/oss/vtiger/trunk/modules/Mobile/core/Block.php new file mode 100644 index 00000000..8ded745b --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/Block.php @@ -0,0 +1,36 @@ +pquery(" + SELECT blocklabel, fieldname FROM vtiger_field INNER JOIN vtiger_blocks WHERE + vtiger_field.block = vtiger_blocks.blockid AND vtiger_field.tabid = ? + ORDER BY vtiger_blocks.sequence, vtiger_field.sequence", array(getTabid($moduleName))); + + $blockmap = array(); + + if(!empty($result)) { + while($resultrow = $adb->fetch_array($result)) { + $blocklabel = Mobile::getTranslation($resultrow['blocklabel'], $moduleName); + $blockmap[$blocklabel][] = $resultrow['fieldname']; + } + } + return $blockmap; + + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/Cache.php b/oss/vtiger/trunk/modules/Mobile/core/Cache.php new file mode 100644 index 00000000..89045187 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/Cache.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/Field.php b/oss/vtiger/trunk/modules/Mobile/core/Field.php new file mode 100644 index 00000000..201598a3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/Field.php @@ -0,0 +1,107 @@ + $v) { + if($k == 'type') { + $this->newtype = 'aaa'; + } + $this->$k = $v; + } + } + + function typeName() { + if(isset($this->type)) { + return $this->type['name']; + } + return false; + } + + function isReferenceType() { + return ($this->typeName() == 'reference'); + } + + function format($rawvalue) { + $datatype = $this->typeName(); + + switch($datatype) { + case 'password': + return '********'; + + case 'reference': + case 'owner': + $refersTo = $this->type['refersTo']; + + // No link to Currency reference information + if(preg_match('/(.*)x(.*)/i', $rawvalue)) { + if(!empty($refersTo)) { + if(in_array('Currency', $this->type['refersTo'])) { + return Mobile_Core_Record::summary($rawvalue); + } + } else { + $summary = Mobile_Core_Record::summary($rawvalue); + return "$summary"; + } + } + break; + + case 'email': + if(!empty($rawvalue)) { + return "$rawvalue"; + } + + case 'phone': + case 'mobile': + if(!empty($rawvalue)) { + return "$rawvalue"; + } + + case 'url': + if(!empty($rawvalue)) { + $targeturl = $rawvalue; + if(!preg_match("/:\/\//i", $rawvalue)) { // Not prefixed yet? + $targeturl = "http://$rawvalue"; + } + return "$rawvalue"; + } + } + return $rawvalue; // "$rawvalue ". var_export($datatype, true) . " "; + } + + static function getEntityFieldnames($moduleInstance) { + // TODO Re-write module name if its Events. + $modulename = $moduleInstance->name; + if($modulename == 'Events') $modulename = 'Calendar'; + + $fieldnames = vtws_getEntityNameFields($modulename); + + $replacemap = array(); + + /* Rewrite the entity fieldname with mapping columnname */ + /* Having fieldname and columnname is preferable */ + if($moduleInstance->name == 'HelpDesk') { + $replacemap['title'] = 'ticket_title'; + } else if($moduleInstance->name == 'Documents') { + $replacemap['title'] = 'notes_title'; + } + + if(!empty($replacemap)) { + foreach($replacemap as $replacekey=>$replacevalue) { + $targetkey = array_search($replacekey, $fieldnames); + if($targetkey !== false) $fieldnames[$targetkey] = $replacevalue; + } + } + return $fieldnames; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/MobileService.php b/oss/vtiger/trunk/modules/Mobile/core/MobileService.php new file mode 100644 index 00000000..cb72dbb5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/MobileService.php @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/Module.php b/oss/vtiger/trunk/modules/Mobile/core/Module.php new file mode 100644 index 00000000..15f83455 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/Module.php @@ -0,0 +1,153 @@ +name = $name; + $this->isEntity = $isEntity; + $this->label = $label; + $this->singular = $singular; + } + + function entityFields() { + if($this->_entityfields === false) { + $this->_entityfields = Mobile_Core_Field::getEntityFieldnames($this); + } + return $this->_entityfields; + } + + function fields() { + if(empty($this->_fields)) { + $this->_fields = $this->doDescribe(); + } + return $this->_fields; + } + + function fieldnames() { + $fieldinstances = $this->fields(); + $names = array(); + foreach($fieldinstances as $fieldinstance) { + $names[] = $fieldinstance->name; + } + return $names; + } + + function fieldLookup($name) { + $fieldinstances = $this->fields(); + foreach($fieldinstances as $fieldinstance) { + if($fieldinstance->name == $name) { + return $fieldinstance; + } + } + return false; + } + + function fieldValue($name, $rawvalue) { + $fieldinstance = $this->fieldLookup($name); + return ($fieldinstance? $fieldinstance->format($rawvalue) : $rawvalue); + } + + function fieldLabel($name) { + $fieldinstance = $this->fieldLookup($name); + return ($fieldinstance? $fieldinstance->label : $name); + } + + function fieldsGroup() { + if($this->_fieldsgroup === false) { + $this->_fieldsgroup = Mobile_Core_Block::groupFields($this->name); + } + return $this->_fieldsgroup; + } + + function doDescribe() { + $describe = vtws_describe($this->name, MobileService::currentUser()); + $instances = array(); + if(!empty($describe['fields'])) { + foreach($describe['fields'] as $infomap) { + $instance = new Mobile_Core_Field($infomap); + $instances[] = $instance; + } + } + return $instances; + } + + static function getInstance($modulename) { + $cachekey = "module.instance.{$modulename}"; + + $moduleInstance = Mobile_Core_Cache::get($cachekey); + if($moduleInstance === false) { + $moduleInstance = new Mobile_Core_Module($modulename, '', + Mobile::getTranslation($modulename, $modulename), $modulename); + + Mobile_Core_Cache::put($cachekey, $moduleInstance); + } + return $moduleInstance; + } + + static function fromWSID($wsid) { + $cachekey = "module.fromwsid.metainfo.{$wsid}"; + + $metainfo = Mobile_Core_Cache::get($cachekey); + if($metainfo === false) { + global $adb; + $idsplit = vtws_getIdComponents($wsid); + $metainfo = VtigerWebserviceObject::fromId($adb, $idsplit[0]); + Mobile_Core_Cache::put($cachekey, $metainfo); + } + return self::getInstance($metainfo->getEntityName()); + } + + static function listAll($filterOnlyEntity = false) { + + $cachekey = "module.listinfo"; + + $listTypesInfo = Mobile_Core_Cache::get($cachekey); + if($listTypesInfo === false) { + $listTypesInfo = vtws_listtypes(MobileService::currentUser()); + Mobile_Core_Cache::put($cachekey, $listTypesInfo); + } + + $instances = array(); + foreach($listTypesInfo['types'] as $name) { + $info = $listTypesInfo['information'][$name]; + $instance = new self( + $name, $info['isEntity'], $info['label'], $info['singular'] + ); + + $filterOutInstance = false; + if($filterOnlyEntity && (!$instance->isEntity || in_array($name, array('Users')))) { + $filterOutInstance = true; + } + + if(!$filterOutInstance) { + $instances[$name] = $instance; + } + sort($instances); + } + return $instances; + } + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/Paging.php b/oss/vtiger/trunk/modules/Mobile/core/Paging.php new file mode 100644 index 00000000..305a207d --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/Paging.php @@ -0,0 +1,69 @@ +_start; + } + + function count() { + return $this->_limit; + } + + function current() { + return $this->_page; + } + + function next() { + return ($this->current()+1); + } + + function previous() { + return ($this->current() < 1? 0 : ($this->current()-1)); + } + + function hasNext($countOnPage) { + return ($countOnPage >= $this->count()); + } + + function hasPrevious() { + return ($this->start() != 0); + } + + function initStart($page) { + + if(empty($page)) $page = 0; + $this->_page = $page; + + if($page < 1) $this->_start = 0; + else $this->_start = ($page * $this->_limit); + } + + static function getInstance($page = 0, $limit = false) { + $instance = new self(); + + if($limit === false) { + $limit = Mobile::config('Navigation.Limit', 2); + } + + $instance->_limit = $limit; + $instance->initStart($page); + return $instance; + } + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/Record.php b/oss/vtiger/trunk/modules/Mobile/core/Record.php new file mode 100644 index 00000000..bb840309 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/Record.php @@ -0,0 +1,80 @@ +fields = array(); + + foreach($infomap as $k=>$v) { + if($k == 'id') $this->id = $v; + else $this->fields[$k] = $v; + } + $this->moduleInstance = $moduleInstance; + } + + function lookupBlockFields($blocklabel) { + $fieldblocks = $this->moduleInstance->fieldsGroup(); + if(!empty($fieldblocks)) { + foreach($fieldblocks as $key=>$fieldnames) { + if($key == $blocklabel) { + return $fieldnames; + } + } + } + return false; + } + + function isBlockEmpty($blocklabel, $valuelookup = true) { + $fieldnames = $this->lookupBlockFields($blocklabel); + if(!empty($fieldnames)) { + if($valuelookup) { + foreach($fieldnames as $fieldname) { + $rawvalue = $this->fieldRawValue($fieldname); + if(!empty($rawvalue)) { + return false; + } + } + } + } + return true; + } + + function fieldRawValue($name) { + if(isset($this->fields[$name])) return $this->fields[$name]; + return null; + } + + function fieldValue($name) { + $rawvalue = $this->fieldRawValue($name); + if($this->moduleInstance) return $this->moduleInstance->fieldValue($name, $rawvalue); + return $rawvalue; + } + + function __toString() { + return implode(', ', $this->fields); + } + + static function summary($wsid) { + return vtws_getName($wsid, MobileService::currentUser()); + } + + static function retrieve($wsid, $moduleInstance = false) { + $infomap = vtws_retrieve($wsid, MobileService::currentUser()); + return new self($infomap, $moduleInstance); + } + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/Search.php b/oss/vtiger/trunk/modules/Mobile/core/Search.php new file mode 100644 index 00000000..84175ea1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/Search.php @@ -0,0 +1,74 @@ +name}"; + } + + static function retrieve($wsid, $moduleInstance = false) { + return Mobile_Core_Record::retrieve($wsid, $moduleInstance); + } + + static function query($moduleInstance, $input, $fieldnames = false, $paging = false) { + + $entityfields = $moduleInstance->entityFields(); + if(empty($fieldnames)) { + $fieldnames = $moduleInstance->fieldnames(); + } + + $queryString = "SELECT " . implode(',', $entityfields) . " FROM {$moduleInstance->name} "; + $whereCondition = ''; + + foreach($fieldnames as $fieldname) { + if($fieldname == 'id') continue; + + // TODO Skip filename search in documents module. + if($moduleInstance->name == 'Documents' && $fieldname == 'filename') continue; + + $fieldInstance = $moduleInstance->fieldLookup($fieldname); + if($fieldInstance->isReferenceType()) continue; + + + if($whereCondition != '') $whereCondition .= ' OR '; + $whereCondition .= " $fieldname LIKE '%{$input}%' "; + } + + $fullQueryString = "$queryString WHERE $whereCondition"; + + return self::_query($fullQueryString, $paging); + } + + static function entity($moduleInstance, $paging = false) { + $fieldnames = $moduleInstance->entityFields(); + $queryString = "SELECT " . implode(',', $fieldnames) . " FROM {$moduleInstance->name}"; + return self::_query($queryString, $paging); + } + + private static function _query($queryString, $paging = false) { + if($paging !== false) { + $limitClause = " LIMIT {$paging->start()}, {$paging->count()}"; + } + + $queryString .= " $limitClause ;"; + + $qresultRows = vtws_query($queryString, MobileService::currentUser()); + + $resultRows = array(); + foreach($qresultRows as $row) { + $resultRows[] = new Mobile_Core_Record($row, $fieldnames); + } + return $resultRows; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/Session.php b/oss/vtiger/trunk/modules/Mobile/core/Session.php new file mode 100644 index 00000000..518571bd --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/Session.php @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/core/Skin.php b/oss/vtiger/trunk/modules/Mobile/core/Skin.php new file mode 100644 index 00000000..df4e540c --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/core/Skin.php @@ -0,0 +1,33 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/index.php b/oss/vtiger/trunk/modules/Mobile/index.php new file mode 100644 index 00000000..760434b4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/index.php @@ -0,0 +1,40 @@ + diff --git a/oss/vtiger/trunk/modules/Mobile/language/en_us.lang.php b/oss/vtiger/trunk/modules/Mobile/language/en_us.lang.php new file mode 100644 index 00000000..ad5031df --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/language/en_us.lang.php @@ -0,0 +1,15 @@ + 'Mobile', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/appicon.jpg b/oss/vtiger/trunk/modules/Mobile/resources/images/appicon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2646df1a2caa8ff2e767ada33ee3ecb6edf7d9ba GIT binary patch literal 51989 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 L{C~Xy*nRgu-O;56 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/add_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/add_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..36180ccac4a854d56dfd7d03538d7b39a82001c5 GIT binary patch literal 746 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVA|;E;uumfCn;e8NQ&YA|D+>o zFKoWQNM>ASZ*(F_{@+HMo3nFtyVr?9WDlk>$RF01%q=Zt6RitlQ*&c$yDeXD9J8w| zm~D0x#E3lm(hmtfgpDY3&MLQ(<v@bKbi|rlcl>vqGSS#W^QT>NdBb#P(Rb@)-F#Je*pPtU=C%r8vzOww@R`!7rZtIWV@8u8srr#Cq~^$X*ez!vMAJ;>XjAi%I;m4wju`Iq+ZRA%|2$i0QNs!jdUUbl?L zSC8>uNe&h-m>N5C`8-BDu%0HV54{iHKj-K9)WgHWb79KI-kEbB{@8pT$l>9c7PN;a z=6}5tb4TOD>*^hHY(N0i1q+sn@AKb&d+)6tGSPXu^W`axKh2L!n{Piu(k{-vSLoM# zOV)g20|Nsj4Lic*SGMV7hFthN|MPc$wzl~K(GvBWjsE=mIQ8M3mY|*~p!oRz|IjSH zy88deKKy@P&NlD=eo%}_{QLjs+=t)4&2zjYAqE~YXqY&0;^+6%`+0og?G08GIk4`p zOZf5oDKoROvhwr)|Nrk-Ud;}1tmCB<=Z+jvIeX@e&d0ys=YK!XmoMfL_MW9GO5%>4+@9!spn(BcrhC12lo3Js^C}U=3X5p~yN(c4>rT-@XrHOd|4NlbIQ2 Xv|V0x>14-ZkfS_Z{an^LB{Ts5yO~;u literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/add_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/add_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..d8729ee12e94c63d20c2c5309053d0597383c7dd GIT binary patch literal 1140 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/address_book_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/address_book_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3b41ed3a5c8489d3794be76cbfc7542e036227 GIT binary patch literal 1795 zcmXw33se(l7ETD6#4tR?kbqhqiU2_h_5~`^E*2vQyF+$nXczR~f@hf1$hVpu*K1fVHcwtIArlB) z8_gG!YZk;t@*k!nnzL@PHNq;{ne7pU#&?mivz_^z^QZ2K{cA~fmxcP7s~y9iq%<${ zN14p?$0fb(6K_7K32oY-7YV)@L1pff8K?H>Z9C|0(=crsnKO?BNSIpjGhc zLAFawjOYF#^Hk+ZuAkV+omtgZMu8;B{AXJA1z;U5%|3)DwIu#{dB~mx%_P1U-GR$%?At&I1LK^!1M3;(e zjngZrMD`;CM_ceTVj1YNTJSuNvHbROneLeqz)Ea26aOLRc-vX=@>LS41O|s-k;zFH zIngh9zR@7ZZM6XAwE2}*IV4c*mc3$vn!~4BmIqX-hg9K)1i^IJX3k@S9y_x;HSSO& zSNj8f5SVe_DXj$N03MIHnVj;qpG`)uM%q5MvO3REU*^DY!X?1Kd8DJ|fwLjoTp|Uz z9f)J*P4z!FMHk9+i$k&S9(w0NO3aOUO0;uK$Id3VHL}001iH~_8$K4nMj|2*OGbI6 zBZ)*(-I|}@rOVjX z%Xi#{UMmP*ej^JDuZqk6RN=M-RlI`Xy_{OJYU{BZ+2WS0;~R&^Jv8Ugt%{tGWRLqU z;~x7aXYM{rcp0eYdCa|YDzs@#Z`h0Dc{;{ZpX)I%WAJNV--XY1(p{Yt^0eANo1{VO zGq{t3XH$-DE#?GOv+G`u?WTPDpjo=*&X2WiJ9_d(W~o25z|-Vou)}??a4tn)@{o^z zXyVQ%4x<62D}r}jZB!o5^X|W<_fhU77)7)u@^IfD(^hT@Zr0`{#pMLm5BdD`Wlm%w zOPk=Y7x*u7#CY2Rkkn|`N-?hEwi_ttZy7gmvNI=k&7AhU|MED?gWq+6PKPF+l!om8 z+3C;({Shxe=I66&O=sBRcJ>GErPP@(#G8Jnz0hBl!rd`;TYp_Uo3qy5=T!K0O8|Bu z{=rfzV3b7q1^YqxO3sLdT5`5AcZRi4o;?cqo67gbNhvbLc}SF4YjE{qi%y#=@Lo2% zMq0-mPLh{M0+?!8HP4YSd%%iX1%Fj8@)OUQ!lA@-0aEIEr+Yn_atZsG#O$miK!RK& zUI|jUvYCl-|1$R8uT|0;RE2>G{is|ii7W;tpBGR}DD))STqSaoMjec|VCwG-^Wi(( zu|Al%7TCFrBk(hrUDZo+W$V-MztRHfs_6!B35Jy=9c;^L?Ox|K%aC<|Z2=VxPzlCs z+VX;^No-2R<5(_E5>8u7-P(XGO6$6xfKrK1vb65zB!aM1$t(d_-P7nb5WI{TnELQE zZUUzqO9)0S_@o0`r8SMBm;iU944 z{#0X-*Im}V9(VbNiDBoFtBQZyegZr4_u7`IdyJla-F=3Mr$?YTdUDN16}}7y`c6S% gQFeH5v7^n4L=bxyl)V3xd*6C4+<$<7hliH`AM;Z;U;qFB literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/alert_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/alert_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d67e2feac53ccc384daf51be5a3a68362d5759 GIT binary patch literal 1155 zcmZ9L3rv$&6vr>{6>9kyl*ef4gsKc?1T2%N6^mH%>)*9VC-XN&}K+&{tY67dCK`*u>ou1N(O}q_P|726|t)kgW zLClQ;YisLrJ5smdJe^L*V&UH!4`ztIr&1?r{OuYGi?Ef*UL=kf7z zhH|8@z2H_S7#yHG9YQkE=d3kq~7%A z$5p#IQwzPNHrc9ZK^1hr2V7J*Bx)|q^n8|h&I>P{Au;Fb?eEBc8u}vEsp%@;!(0o` z;SRgv060R*g&GbVyN)|!)t9F@;JcrJGek&zvknz|?)9EzwRX)eoik~jq}gX`i23{1 z3ZFdX3vH`)+Zuf2D8g(+UpOJ*WOrUTl3s#o)K6Pi_0W^U*|E_OtCTblBuu%f8+M)lD&&oGr=)bwtUbM;4U(^e#jrzrEB zF2N2aN6C(N3di-HFZ!o{-YElzAdz)zhm1XNImZV+Ir@OEGd0$-8yXtW;IsL5oTQ{A zqS&xG`X|${r=*E&EB{WjbT9{ZmI61qDSz82dSO8+0AA!45uK)x= zpsTA3mhl5B@6zc8q*0~icEfG4&qd6lu=c zi;M&0efx&#Exz)VMz)YGR8izlyyFNX?ng%@kB0lNwYCjP*0;ot{|+#Rw6a9ebHBB9 z<(Xz(@{Kep%l+BQVDWogL2H1~G_+oM#rVvgdO!F@U*d;vo`=@u8m2L0DI&%#B7s0K bR{}w-K+g}k-U+ZH%lxKA#D=$r(K&wug{u<= literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/alert_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/alert_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..49276c394e72ebb1b32cd7c5aa7368db2033a293 GIT binary patch literal 2112 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/briefcase_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/briefcase_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..23fb325bf17c22976e6ee7c9cfe19188eeda83ce GIT binary patch literal 1070 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VE*dq;uumfCn@CsbHws^ar3l_ zQimB2m$RAu+|KjH{G3sT<)3p`YC2Ez0JSju|DSX)y;1G(?$l|MY@`ka&Elz-m>FRD z@Bi@+-)<)N{y!flXL0ht0=Vi!*^Nw(!WY2vy3Ehh2D&+qnKGSs z9#PBA3^Dgm_QC!2^^)K2R3A<_`Eh3B+^M3j@1DQE&oevE&^TlBpW_Rqncynd+t*9Z z+w=d-f^)yy6VoT!D{q=p{QcH{f4lm`3nKs8uR~QPrOYhzjro6mGjr4beaRJHjg_qr zpA?UmIMXsi;zz{Hz$bQp|D7&)b=RJ)m{X4J-hX>Tp1Si#DjzF#PXW0K=vk9lJAUul zy=X#P+bX5Q@oZ^4txp)z+V=BY&%2v^g;uI!o$P)ZftC9f9|Qu z85o_=&@kY*Q@e-}V%E>^@9hsSx9{QkzcS6@43}G5{r`W)Q2jsu|Cc|!yZpUGL1I3)IOEl)dp2DEobRza&uhJWLj3?qBhIi4@D9l6A$O9$)+LjP>yQ z_wf&E!u;ge`~*39N_Bd8c-!EDB_t()26@N6F71*;@{r>va`0(D{<&y9A{X21BUDAmI zzd!0i!|UgNpj*V%{Mz`Q)!6;|Q=B6j86PKEh@Ppg%{r~^}Vd?wl=jY~!@893Q zQL2mS#}NeyNr4OBpP$bM_I`iT8@-4aw%zu9WoD7TH->=!359{BG`0)KY zKV0qa*XqprkMrBk+y4)^S`b$z*0z6toe|8W&#&2=nQrH|WyjYW{y7?7F2FlOQc@yh zN4;^)@2|};gHI_|On?8-HPzVAvd!M7;46*@(UIBLq z4xMfeT#ATsasLP`n8`B76;IJk(J|)-M7=_XphbECwBLPqr7ip8-b4UwEN@p*tMdjW&wiyMl#a2yRwVAJ<|cFvXZ-`yv1D2pzAdLQ6$S!eQH zwCcrE-7+383%lXJ$bM~%(~_y^koC4mGLuw?#-~V-f2UU}maH{4OZYClHSxP|I6fwD zIScRCnS&aGuBP*L$Ib{DJ1r-&E+B%+_THrBt63iFla-X?Kv^|s6*b1*iy~gFcIDqb z{0SHWy9S)tUytqS=eZu{rP&qQZp#p3GDT_s1}>KpwOCun0X~uHsbfVaKF@lfztzWW z0HmSy!mY1oV9`ljnGlW@>r1HF*(0P&tgSJ(4W=AxsyBmO7gv%c|6VMw-~Ok^GxpZW zetV6E=qI#Vm{RbHPw&lMh8A0{Gt(pCL{Q>KkGz9IE#|D$ttlf-yM`*e)i zBqvDVk~pmMO~O(ti??x2?nPTWB0&5`PY4DEYA>lK4GP|`00{mUjiL&+`4bPXW=p4k zS})$QW2ZEsuR_0RIz|*u^-aYiYNzcAW4sqnbdqZE!E%Y1sW8Nk;<){W$~3l@D2SIQ zB)qX&;=t>UdiP{8$CB7=0${7)fNole_E&|IW&wgAk4TiUt-r|_ra}l4O-gHlt3ydY z1TgJa7JB#k2Ayu*IZDR_9OHYm4&44ZND~eDk4VG9vS!xp(fRKm9nOtx&W$UT$@4cu z+z+3BHn=yxp+8mD^?O2WLHE(T?oQp%+vfL#lNk|c5*imhzES24&~6lQDN_`Gd*p)y zb%TS$jP3bqHm~Kus9sMX*?fnSI|#!tjysEd@!03tmYyiT%C34G7tHK_xOIhLB4$)e z%5ljO$L{8s&TP>XKn)|D=En}F^IKmOc4GjSDsy}wI;W!*a>UcqaE6nYs`)tB@`q2u zY>araPqR}`_b6Z=r=I2-G$gq+NQttSVsfI$;t2nu;K)i%TgO-R4nKLBjK2*biooxL*cak@(7w+M3~ W_@K70ajkyPjc07nPU}uV8~y_-Yiuz9 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/buildings_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/buildings_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..be5793f11b5c8802476d7e0ac58d091b2dfd576f GIT binary patch literal 918 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/calculator_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/calculator_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1de0315cafffdb2b96e74c9a6d736ad239a20cb1 GIT binary patch literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV3ziDaSW-Lla!JG1gWV{FU+nh znacFJJe-YFMs^*dmo;1 zyPEVLTei)A_<#NUg3}M#{-h^d2$+_>BU$dO!jXdqKm5OM&j<7Y$fIz*zrV{L{(k?z z#J)fOj(_<4+@HBPl=i{UnQ2bvPziE-Erc>*YEai=lB0J-0Q3DL&Y}MM zzdT=?z5RY;10aAJDe>Vk`;mtG_7b1Oa@udGtn4`zw}bi6w1A|9AD_D)p6BlnhbnA2 zxPCrQPkp_y!JmI84K$BQCSC5Et?}lbKsG2K+aCSpmyr1XFYO2SSCC`CzPip2bgO{= zle702HhRVgww^tEm^sn;>c5|?g^Un2Z3q3?+V=04l&JfkFk{LK){Ui)D@Du>@2?kN z28ty7_$|Gty|EFhSmML)=lbX5s{I|NZ&* zv%3+d2OJ>3PUzPC`g~aW+N?>Rc)X16@ccI@Vqz*V`jhtK&j-H4?s*?C^YHNKK>V4M zl9m>hlA0PS$fNh>No9Gw_%kh=2j|5VkDh*i{oC~aKR-Vg1iPJ?;msad*1O^zY9NiC Lu6{1-oD!M<#WstZ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/calculator_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/calculator_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed3f95d055c2fc8fa50367c2b9e7d78961c7aaf GIT binary patch literal 1264 zcmXw2dr%Wc7!RH%Hm*`&MlK>m#i}h-38^oPW(33+8l_gWL+d3W#99Yow4=6Zjz{~K0c%r^fPvTIBh?)Ex>uh!$>2+=CGd#T^&$$owC%eI= z>?%+N0H{J=QJ?}eV;t>p`1}lRyFv=7nxn(DZ2z}J1Ko7m-~L|#YzioV%p~?Cxz4Y4ly`jAaC|!280SRwmhP1YUQbS|-qXD@DnWNNDfRpbRnz%~mB_SUo1OdG zhk|1K1nqmGO{5_C^{l@5v`?I7v(dyo8`o0f3`AG#LRHD3DxJ+k@y?|htpW@rC)B^C`wPWlt%>JmC#&}r`Q4QLBe zr-Wc`8HuZS7-(RBZ6(01KSraX8LRgZghCxVeqe#LgCV!M!xc4q=_>@t#;t1JAE?ux zsY^zdC&f@6u~ApYR(IUe-3?T;P&v~^lGY2SWzP-r=@xm(9JJz&9UO`&y9e*yT<}$% z+n< zzzg&1l>p#yUR(b|G0Kg^EIlS7gErAFtpbHY0Tvi<(4QgJAj{*_lxGjF$ng;37xK$4 z&uGv*U>H&V;+y|-GDQwn?Bk*+JYlW$WKEG^mmzxy}PMfy~tIh=8cXVg)yQL z;%dwLMU`w~EB8)TR@N94S3ZVeVP;=Xm)m{G(cS&cJT$N0H8OZ(@iOK82>iy>m*2LM q-;+E|Xla4}_u$#mQdTLFAVefga(0sgfHG;U`TF(z zmwk!1w_TX{Weu0h^;lZ=}=gVr# zGg$!;w9;8}YSxZ%g~AX~l+9=3%@yzuO@FFSoaSc@+eXyX)Z_+kQ0Qv2UL4A{3_)}Z z-9b+F;RY*cKJH~GJ!~@KFf6+mrlX@OWUZi+bXjr3>L#oB4sci6ej7@LxA(5io5R?4 zYiYX578K|=kCpoSK;JCU&ar#_7-Rsr!*xNg*Gsl%mPm@KswB0>8r$3-hvBW~a$uaH zvnl_lE*Hi%6Bs}S&LXRJb9r7qCB>MBIKy<1ukDxtEGjm#ffSD(Y)*WUI52=PZk3#J zuvqci!e@Lh=zxg;u$6IV?>JSHJv>~02X$LI+gLGRP}+*WyseTRs~$sVT7* zxT_VmO8|D{SE#4QKc$aVND9U!oX#00UmFI|+j=}xuMo}Hu^)Nhp{h~KM z()}h@-SwZ5HHwg?ccmjvtc=2OkVVl!JKHaLbif9ZUR|mK8p`QPF!#v_BzkaLeBSj< z-B;{v8P6kh576rEExpJ35Z399mtg@{U`mG?2tv?`gS+IgZLzKfIzPz?2K4UD1O|Q;0M^-hQif;k9PVBZU^EyZiOcBsM0!K0dt*9NleAi?NxKc*Y zOwWlMlhB~@%ARX+C_|e`r!xXx&{BD^j7@}lM$$q)emDZtL<( zc^Hu2Jd)8tIuqKp>%86K>1Bj~0dx0B*LaX&P0jo9&2f^c$tJvlowzd9au>x5ZnP70 z`;RrYTZy6ooua{eVp5)-zyt`(UQSJyD<-og>n;yi5a#0IHG#jftT**0FSPccsmTgg z00wPlfEj&n;Jm(^7gj|u@#?Fel&(5+`_&>=Wkd|5d|c=G9wjgsG=JxKg^FFnQ(+4UxTf zO^(+~&4jf!D~|OCpm;-3b#?W$ka#kY?rhq#H>Fz~)8z=x;fL@N8K9sJfR*NCg=O?* z{(N|)nzd}D@}x$iIU`ppM}px8_Ti%ive3c(863Q|H0Em^aY#8~#PF32?Q(XpHyn<# zHV<#?mH2QX`P|5{*{a5$^|Ah&&{XJkp|;@nmANylegNQdHkakNcW;Y&>_Mb%NlUsW Hl^6d9Wq~9q literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/camera_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/camera_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba88be02c2bb3957a499d4fcff54224386ded6d GIT binary patch literal 927 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/camera_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/camera_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c466358f7a01a353e064c71b92ece2e6bc0f888d GIT binary patch literal 2419 zcmaJ@dpOf=AKx-!{bUg)+cSwq#AXU1vz9}pC~}M?hliL|k4&kbiJ?|bJtDF4ei$vm43=X6k{zi!FMBZYsX`sF9;nMOg!)1sJ1hOJMWxnQg&1kDUdb_9ZIGVT$G zno|tIL^Y8}AV!LYxFBTo9-3*I_%@cpPH|Hb(x#O~Qejyjkn$c%J1DKMnrZ?rgaWFu zKyaIcxHN-+CQD`A%C(Zx%|_m|!z|;Yu))>=Ef=;K%3+gb2>yg2v*lbYIJw?fG2)9E z?;*u$HLtk79qWOGj=7^)dHf$C=n4{1e2Ykr2=L?XOWS^L>A#DgeSezl`IT+wDr(b? zPq$t0)SPR4%m26^UO1X(Uz2VjtXFAVf>x5!Qe|wZtR4c~l%}a%77K2GajQQTEmtbn z3bUsc8`ZhiwM;0cJT+`=Y}iTtb;PR4NfM)lN76+1k{C!Nsp{ZC62Z=nFf-lR%wJ<6 zGLa3RI{)EEw~vhEGqyn1rGtoUAi&6yyTv&s2H88Q1ut%#!gsxMcNibUy0DMl9e}@8 z_sd_Z{hI1!FM8dcl3@s=h9}nD-sthp+i+__Fe)0yN%Fnpp&xjQ_c3czgXC<_6w3)K z$u2*DDY&dvX{FpOJM5J@c(0#Wa@W$z$5ZoG()B)gQG&;<;m<%HZr%n6!9QAX^D8L@ z{=_}JU>7p>Y5L;tjBxUffiCy3%x|Vaq>m=L$y(+?{kvdshF4{~dv+I`t~)$OX!_i#G*P)*3rzCur6|r_$bUJG1z8BQjw4h5b+) zW)#C?Bs%vhPLJ5eQGi$=99HPOluTX@i?wuw`RRQF zD|&AFx2-Ol-H6P3Zr1JNq@DgAl7#o(8T}#cb`sl&+c-J-J0st%-x83f33PjP{K-4{ zp7FO{!6S!Snr(JoX^7qVN;q@go7-O2YB!KkFv)?#_+>BP=3St^Kl!iHtT)c%orvQ6 zZmkHyHU5FHbFe)8(+GckZXEO_V)%~Lvt%lwEs~SFxvH$DjPx$o!n()_v+Uxdj!LVt zHE-zhol)hB+~x%&6uBca3CkNzf#pd9;@Ld254-dJ)pg@5G+v9^^F(ZenzUi)7z&CZ zolu+1Kh~X{Kn>cHX6jzXSdX>(8LyUz8R`c;buG<*hWSQJ?8tu53ooC?je0>`dV-8X z2sH3B(4pe2UkJ)I=da%Yt&H@l8szkG*oYz7;ON*687sk5Ezqw*o(R^BolM|u3yCuD zqoBR18n@S-*;q1dQmpeA3_lN@HEZvOj8Dpy6=F#;H+J*-5`C{SGBoc z6IDo@1Lju__%aUp;ssY`Pe5RNFv*z-BJ&iV#YvL2=CL(>Di?&9< z>GLatm#xL{FiyL+UrNGmWJZR?iAtkCds({b#ovI@7wmhscJ6Pe$0ix{`N8#w`Txowj2p~@)0Syf{0B``H_VAY|`Hi?HzM!#bVssprlL`i- zl@QBOML;Db;|fa$1A@qj19rrx*}eD)#VR3gbxclY0esaep%vYmT?9gQX>XpM7QFT4 z3Pi7q1#N9h?hJL0b^;DbZ=)Pjm8Qagy{_yYu9Fd(zA;vnqiOjAgORjpMVV9via-^E zf9gfTt7=vJ!qTPvQ_X75lHtPj-(6RvMRG5$V>C<1x-0IlyrGx0%sA{AJ4tTF56w*J z4zo?&@Igyp_pC}hlOy5M&o%vmC-0_lb?C{tqt+u)=xJ5}_Lqlc;_fO7AL~cgU%D6K zkv%D#=`i?=s=Px`-oufTD(ssL?~!A)E>iB1yBVih!=ER@H@-_Z+$*5OAyLk6})a%+@++xU2t{RmNrN>ecX{ zFRq+v$m?`qq@}JE{*dX!TqLVc2UQPH6Q4g}IR98#bnNj$ck;h|ks8d*j7N2a;J?qocyHcLy+fg8{0G=WQf&YL literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cancel_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cancel_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f2245528ab3759334ee2173257d35b234c7435 GIT binary patch literal 1202 zcmYk5ZA?>V6vzMVWv!(}DNtUdTA-zdp;SZz8nX^W5E5lumN}V(!dMX#mn_RR_%I2$ zfi7FJDTIh_V}6jBWt$&}Tc#jd=3pgs4CO@_rBX^?pl{Ik-rn6iP2fq+b8~af?{`j~ zJkO=qPL#$(Z;u8LQ+BNQ4f-3)#1;;{OV+3wAgZaXxbV%!>$P>S5;yV`?b_VtiYw|! z!|-3uimzK*S`7KbM5woUMyCvF586KZ-CkbjpKtzbYf@MrRnKZ_?aFHY3iHsy64$D))C0Jt5sHsm29H7$_ z^}mW8-!*>nU>tk@febNv=hiVYF%5&!ljlj^Kq8-u7(NdZt3ljd@?p0m z84Sa)8>*;Otf>p6VvN`V_YRIzWbPe?@MNvijvZNTZld!qhVYd0f zBT`TxO~K%bQN5vJCz9*AqIe-5S$rTJHcTR}jnVAs)bt;YV-;m*%5cX>w^??b zaS@tj9~g#VH>uc>u+ZX*V9pgnC=`SR{O;Wy5Bm?rp(tIJiCYUkOj+IFSpUTW$sGs= zgP3&%Vf9DAu$xpQ8HURrggX$X2M6RK^UXs-sz@T0;fJSdm@zvbw9R6XKC@|7LgiL2 z0T*5C@P)vzn^b;(!0GXLL4@d``5fd60!7I?Br8N3E!gFphK0?4F!NzaA<_9HDbqdM z6dfx>PAmb2Vc5+ouISqA(;3M46s!TDTe|?4bs2Kk3|3x>)#zi=PsU%m*Sde{p&@Ul zh)Z#J$c&DFVJtMep<-?;(wln5%hR^zh|*;EWpWt;p92z35DvGSNkhQnA#0Z$EI}+- z^o3lSo5nq(_aA+`Nc0Ca7k*?n^<%cdyj^_JM7y<~XM%Tk%+2MJ-wT>E@~zij=|8;o;#2LqoE`Qw54| ze1Wfyjrl4Pu0|ry>gX!}pQB##ZqH*j-Dv~xk%OeA7;-T*8l(j literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cancel_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cancel_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..8945459baeb9b1d8b677cb286e5f7e9b57f8363c GIT binary patch literal 2264 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cd_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cd_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..197776a034c525809fc2acc19876e81234fc5667 GIT binary patch literal 2320 zcmYjRX;f3!8vSw;l8{`c1R+sCW>8U?1jHdsioPOLL{W-1VF=RFs+CvJTEmzYCqxwF z3Gynwf)*84tD+(jA~LFg0|f;V5JZ9yKukhH?z>>u>$_{6d(JvP_TJz3?R~O74-V9$ zEu;Z}-sVjKq4>_4TU0Xsmn5xI0#G|Q2l$317e>X@5-;-$v-4wTE;>HeZ2K}}`UY^; zEF;=5ZN&L~7;6s}tCkOY%2a`Z)#03w7X_zUP#gs?Eb5`Xyn+iUK9BCpNdX% z`A}-s&2Vhm8yj8rSe~7EQi@?1YSwxJweLVsMr13BBm|*O80K2xs)?1v^0d#G%B>Ie&VrlHtF7qd*^Iujhcy77Z^qZyK z30CeoJ~U2|4Q!iMw;4pb927R1TZA_6T%LHc;*@@z9!>e(FE40utFDCwJ*H-!U#dN% zdRXz;=D0qk)?f}8cyJLTG4k3r+vyD0=o=Y9QFAXWT|ftx9SeF!#=*|i5SSDMu0EB5 z=+zJafe2(BBIuHcV8x)rj-{qR1O&!Esz8g7;G-G?nNk4@n8x5~&~Mvv{@KR)UVWmn zz$O#e#taxyY5_qAK)|$c_hmnLm@{CMLWIf=DYU7CdqePdMF;~^vGq|p;B^C&PQjZ)0)`$9Xfzu1jw^t! zO9h&G62vpi{F`5GX8#etiCv>G%u|ew%s2DJ$RrGZP{EW+19GJr6q;FhH$4LcG8Ie^ zC3~LAy~9^O&DqeWy)SsPZ)DQ})YQ+*WsRxrsBwq0PyBAx6Zz=<{b&Ez*Z$$2<|!x6xgheH$SB2` z3L7mMsJXYUod1o`V~iKM+r>l3H7;EhmO&fGCIZW)W7T_tLim20azfWG zOFqanI`UW7MS5vIxJJ(CX)DWzYr;0|X{XvX2yXYiZGY31SN?P0>!R_)T)xv1BO32`&UCRC{_f1h zKr}yBX|Y*uj?J;u%Wd@+*7@xl|9aD&y7Z_G|ME`^eh~8f_>q}I&DSHO;SF|cC3$)! zB*o5cHOouiY}8)0i2ou{zb#bqL^s#GX-fbnq6T9#Nk>MTw`OW)QXjQ^MfqPSkWnK2 z<-o8E7NTU_>SziKDhU)?0_d1KfT5*57?|0D+SC?4YB2D!V8V7c z8!({h0tuHstyIGB#1t^_APo(Vz$ilN{67oz6AaV;9Fzf*iU5;F1`3e?4171BkU*b| zK&-nttTds+?2HN&vj87wF`y$_*yU~mahw$}XFs-)9;|mTgK4!Ew0Jm7aIF5fBhXJ` zrvFVf_k4p_PF43&??rY_b~d0=slb3d7ho-nPvb6B&w>hvpTwOw=R%DZ12QgWi5UwB zcwY5zNgos{7#N#^_jvXQIHIJl532g)J&oUo+RjsvL@u~n!KXdsRmQEn?E_K$cdD!d zd1q5oot=ldC$c;uA|iU3knVkZH|LrP8yt2I^>IvdTJTHQT0vI$pF7=@VO8qJ_Y*@* zx>cb+JTsOU7|&d-P>sx(S-HcpXptgqPI?_5R22LG0EC#1F>u| z##%qCeJan-DUd1z_QI6{7R%yCZTz zS~|dW&g+k>`d;QC&dUuyx;Q$oNM6R`c@gpN6K2G_sh~UDs~-m@Y@dqtZjpzuQO%l(RmBLNMKz zeXBC@ic?bDkav}T+pS#@g7{j&Mpbyokzj@Fiw^5}4R-FV-SST@CIUT@8hd6%b literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cd_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/cd_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..88098d988865cf67827af53648966b7df7b30f23 GIT binary patch literal 3627 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/delete_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/delete_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..50941f9d3364f57c5a8fda15fe09d74b4765d6af GIT binary patch literal 1014 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/delete_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/delete_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..74ce0029fb55b04f59b89efc73b3b39888a080ca GIT binary patch literal 2900 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/door_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/door_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..12ec52a7c6c1527b8f602cb3393235b895730014 GIT binary patch literal 1244 zcmX|A3rtg27{2X+I|dY5>Y#`nv}hsQg10R!qGW}N1s1|X8O{y$wqnVM4;+~xsI&!I z+K8J-vWdtWg=KCm%ao}Jy|f)+*sUyab0!;<$6Npz3{Et}H`~iSt=R zH#Mn&(TCuXyQdN#?&Y?oAr6G9;cHDD|9oQKUw9PX^Hwo_B2s}ziWIo&kCi1Eunx)~ zul?Nmy|155lo`m6qc(qcpZOopGKb;l5rl~hbE{F@vezTYFXC(z_2rKgrF);{!z^H7 zY7ver6gZyq$~Rl6fy5E2!kq%@i0yeP2!ign%xNKnQbH;r2tvG@h}JflT69y6?FM9? zDFPcpv<9v~Vj_{z={RY7X#XitT&Lrlh)nVeEzkiO|7;v*lcg$>{A=XobH_l%)5d~^ znMxl-_!ygIlXBGzGrQa?jX3SMS{RMSWNNhj(yMP8=IJm9*T7KYxbcP|=p{cy7<`#C zq|Rh9;LZJAtotWS0cK-|F+hoG@NG&Gp4_{_a9^WiI#&=aaoLbDFE@nnw$TT z0lsk~G}_%heSd@+HNICNXw?V$G=xbUNycl}Zrwa1*w%%$kG-546T#W=?c_)#5^>t> zJ{9SVq>iToP<}|J_I^Vx(MPos@-Y zptCsK$6M4MHg|@RYErEv$%_xjD!7sYq9#P4z}f)eRQYe0c|4xiqjtF$V)LH*GP5jd z&1PivDxIau+5p+63ii)L{pZRfsMRia>(tWW-wXZ7Hk=et_ECztPd~fsDwZ0+6NI_e zLI!($rMEQWHBuC`mHJ`KMp;6oP8kZfi=E!DtH->_ei1&?tPv9){Z@IE1;P$pbHOS* z2PK0#fRceVGkNrA(rrV?uG`uclddhWu$zBJ-?yornbcohtiZE{o(p%k{14M;Bp$fh zs;kpC>A-wX`oROWpT>jiAe3lB0>{5rF-!>8kCJ6dwX<}%W9<~9SY!m=X%p?HZ$rUL zJnKkB&xv66K4YWRAqc6b;ks^e$1nZ_7qv1CZ=&YKSf^;j5hofQrfka{I+LlXbGH}4 zJ?^!RsaOzi9h}sl%GB+O@oUdx3WefVC^L(XrPj1h!3W`?p|T-)t_TolEj(qeaPcbC zG79u~QJG>>?sD6KC#fMJ=Z7cFnpm%UZHW&6NXzyS Y0cQ4O?Mykd(nkO1?8(dgN>0}P3#yF@8~^|S literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/down_arrow_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/down_arrow_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c10021ed02ef7fffa59f10284c8003b9f2c49283 GIT binary patch literal 802 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV0!84;uumfCn?2&xoWfj`tZbm zQVlxaW;ee4d%RvpzuwTG)^cJ}VwVm(P|N@SNsi_X{ST+N?OVmvJd1;$SzB0`S(%yn z@csY)S?1UN)~@*XE4NKJ;}s)Vb;=n-E(Qf2mV=>+E|-4)?|*hK?sww8142_B-!4gI zP%D@w`R(*hu*yRw5B}G;$=Clkw)yvI_QU7#Eo^yWYHjuZ|0PNQ6##8MWbgoJ3D5ny z|H(hTedRy=-JXN_h{a6Fe}9gfKvleI)!+Z$u;$0t_J^0o;c7>*x2x*ZoPU`1Ml!@bY*L<|P&q694}H z=>&!p*!w972?-Zo-KhzCa-CgyhQjm}^|x!lOmKYjeb&lg6Ar_1k`0D(G# zjkflovU;pwtv=@sxf&E07!F7;a@0_AYFhB$e)YzKCl9hXN9~rs!{B`Ox1hLX&VoI$ z)m{Izw^(s~G)dGuS-M=*4q|Z<(Bd7+3+5F(zc_im&ipvTnxCf+6ukXe-KHPE&%of% zAGYJ-a{JSM{Ah1%e0o{C&ANZypFJ8&UY|a2-~iABU;wfl+{oLYAmVUPeCd>oqfBPs z4A@s2C}amXGjV4ye@cFMm+3-t_sNKO?|HxS=2WFRJFuN_sMWu|&SIXMZlzjsEx#Vq zABbCA_yqd)O@6nk{Cn<{sZ$gGpU^y1@bM>moBaO&MlZZM4LbhUo&WITn3Uy-!=98_XBNAka22&!X&;o8+>awuOPbrfI z0$TZ5bOR~6kwuwwYX{gQiM^6ok3JNM+? zTc4FF@b?Y%rO{~q>Bsr+!7tM_eCTktlpQ8%G_TBberopFc5$H|X=ZVqthd5G^h+JR9kS(k(v|>l-pYuAvV%~F5rsWmJP$xi9RHFa|qC!&ez_sIT zOM`?0u-*dBG5zS5(SOpktu0TnRKJ~GGS~~%0jh{}Si=!sR5Pidt7I?=pTyLM7Gwt% z?hWlbHtZVQCd)ob@wi+ExuwP#R!pVv`p*oLub_@{$Oh?y9_Xs-bl|SY9Sf%h%>d1- z0tKW~{qnITSK4{NN9bOy5sKyp@MJ5{#mrI!k%uZMM?Seaj~U9cZ7j-JBqAp#hnMa4 zc>2|jTQRpC(n3n!f2g`esZ@GE2>`N9THopj8Xe#2X8#adQe0wn=KVBs!fTQ}qUtQh z$bO%9u3!)iu|hfakWi8pfl%0b1KO=P$PvUXjdTr45Ntpb0mcu;Tqi`H(NMoP+!o z>#rCwKDSvJ|HfSHXCZF>CmzGiElWR_*=4O4F609}8+zX;?`Nkx=b&lLo@hI$Ny;oYr-OdcEY}+sNoQ>MrLC4b234*SBAR^kbR)>qkU2{{k3oGbsQ7 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/down_arrow_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/down_arrow_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fc205f46147362f052b75741e608c4c5f09d8cd5 GIT binary patch literal 1548 zcmX|>3s4hR6owNMg2fdathy0OfTE~?fK(_2n}R$?MMb5kV-pB5Lq)+S8AMi4f(i_x z@(`_2P@zSUM>`-^valcoqpA2PQb>phbQDc6RuYoz?XHR5ncbbe=bZ1J|D1d8$qg}) zvuzgIP$-ny(NSTs#Mha8W-^HP{)~+G6pGd3=&+E@!i$Mqm`hAj07!I;yP_SeDzYla zd*)Pqz}ThkhtJ;RpWHahY<77@H5N$tomZ2X-v;)>!ua#d`13H#tpjot)r_-fSeX)G zw&BJu4UqCG9eYs}HIrQjr~m)~S0LbVllX!;<2?Rw0zZ)}Y8{rd8KP7K_s!J5zmRQW zhj}$vLLN|M1(4&7wNTE4404p!G;}|d^`O{vnaaS5IOAyXl2QvG2=Xi_fDm93=(1hx zig`(HUi8mqa$TJku(2WuV8S3_+dG325g~37RKf)SS1A?Xem+K{L98+;0o30pzl8uM zZUT{KXrCd-N5~W#n_>ePesobIREwC8BDlw7Jm>VU;CK!pJC zGZHqH?St=8+Am!EDZ51KIULqMnMSiHRg`zAn{K>%JF`ThybX+&-p z6|sp%@z&3PlnCJK?$f2GI%k+U1$_-vVxQ0(JPv?^8-)sLO22dXJqrJk{oV(SZ8Szq zg(7q-4<(p{=I`maF;S--x5MNd2$F$%>vlO&A-plm}y`UPu1t17{ zl}yTvtaGp9*>2f(e(YM$ zU}gKP7J>>uM;f{%;RyS>`*^^bXy1Bdw1g{sj|X9-)NH?W9l0UgZoz4Z@?Q(NW9GFpd`YG8Df;zDHWkuS+y4U(&*RAO5n_%7U zg6r<$9U9XVixCm=qT)2Ub%&Gq34hs-CJck=Q!4#P9+Vz_utIq*@b4?NR%T4Hs{kYi zJgDyWmqx8=LWb@6Eyj0qu`+SzqUC%1=QCD)k;TYPy~Vu5&P3DJhe}3w=kD_I|HD%C z*NYzFXWzcEvrRo$QnC|~FYQfJJ+~HlOElwqorq}KQYxceO+>E}qG_CgmeC#89OCXX zVHh?8T;c1ECikJIZ{I4HczliF*_+B$FSK?LCo3_XZWlD`Sld;~F?6aKk~=AQLT8?0 zx^3VtL#($%FN+P#D7sTSsA!6gi4(n_2jFuLYsY!DV&yY=JMbyjGX5> zdvu`M|5jonhtuIpHT~(CH>PUco~^Y=kdg-zniz^)HR`>m|8kA9{6oq1&G{c~h4}ga literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/download_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/download_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..5202bbfe699b0b776d7244bbc5883a3bb730ca1e GIT binary patch literal 972 zcmYjP4@?tR9Ih)V&KJIN@j)#>!zc?rv5s|fa{&T9pYaW zf*r2JY;LNvf_eeXh7ND~&5{HmR5#V=iZEWA(NAnEMg(*(LD>m_l`8jUbDV5XB2%B?aQLS0txesH$z*&RiBCXkLDf zG?joI;h~({k|@`+cFtun^>*yQ;!k?Se+T}=04gx4^$rJ};cGC49Sv~}q5oftU)cc> zf+z4_54`-#AibV_?!mg5Awu&C-;QA50KvkYx#JDf(>PGzl5iqfzF1r)!uRY~S z@tn;n)@zIR6$!-W&ev+=QZ%3Ub3pS|%j&d3@qRyrFR98=rHBtiI6TxWk4Z6sD#NsJ zjF;|j=HG2BWwk)@=Ayd|O(!Snk$tbA9Ml1FK2l=!ivyvS-DjS90`Wu|DbzV#t+f`C?B=OLZF~ z{_(zHE>eL3kZ>#y_heRh<7^{&JN;4(@maGvK3X%<#fW5K`dGgjAx}W$XFhE2va;T8 zMpjZ;65B{FDI5#rkMu*0ofQ;6T<1A?@=y0u2O)A;^-2}!rv**0`z4yNNy}vYx6K`w1 z#+pW>*(Pj@*-br}rppSZ?qkAF^fa2~jf9xUmF4AQf zxj3Zm>wchqHP^s^C^IAND^IYdc_2NzYXFu)ce%FC$$H}Z=-o7*hLc%A70u-(XO(S5 zyJEG^THPA6>I2=(LAe#TY-t{hBG%q^@RPIiTcNYNqm7?9VxWS5Z?L~GJi&kFwT0Z* zK+Ai0@I@=nMoi@bK(d!mYA30lxxhfRDPB{`lE0Kv6o|-gHq#&9G34$*02{*b^(vhtah4T%kw;cJmi?yNcX+tXYzbI?#5pl zJRQB~4z{(K1JR!O_Fhd|Z9nUOb~IodR+~%D9lo_n%wj~0DAG1ZRNp>glhZF! zvKvwX=2oLYL(JjWHWoD;Visr1`Y$Qa>h}Ar9Gf4j*VW(#p4HP+3N5L?OU4a=t-&cy zL}XT$esS$ztfej`J>5ziQHemh{@)qD7_Expg<`}&E-JJd42JPCAu~)L5b~n*@J1G8 z`wCuHb!W`1mkHTMmZ8|$5dcseKdt08=DRN;##G+27ke=1HF>$v$>#VQg<-etdez4n z0O4)w$Q7QOvJ~Fk{!iz0$k#{3I|SXGZuOa7jFKr%8=T`>X|yFaopS0l4?vPeOzDDU zi8!X-zhXpZck|`U5I{HsA8uqBvUz&q@9<+%^zzj)6&t}YVAk|Z1I!WH(pGJv=b+eT?YHjhy)DFNgILN^o)o9tcKR5+x;aRk9c-J!-Np{DjkvqkUV zmk6Trlx;MU8p7_r$(d4P+%du>FU_ZqUPR0-oAy^{OyS`vY)q@FBFTWueQon@a`p`P6Gc zU}NX(9x%~`^dRlsWLq&1l3ED6fD#FM?;*Iv8 zY;wyl+1v*~p{C-Os}ZE9kMQ_>hjf8JpylKyPMka%SpMH1!aO*K9OxIb#@P^5?^^t1 zKt5cD255*2(PLzGLfL!liK?czluVQuF#fiD0tqM_kKmM2YClYLLbM#FlV$G*m1(B$ Mgji0@%_yGae~K{4Jpcdz literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/download_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/download_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1386fcb9001f65bbcfb2af13d00311b07a4f98 GIT binary patch literal 1946 zcmYLK4OA0X7EX)|e}P0qn8B_gNLi^01IcPF)IfkB+CpGC1-cdj1ySk|l|?C~3<)?v zr69FZeinl*MYpRh*t%lnm>^a}ph#JjA|=V;P$(b?!Zrz+%-czVXYV;P@4R=u_uYHH zx%bX#aeSa_ zPXs{mULq(!B*FpU?k42FMb*bVAd~=Usf!xLNK3Bqk7+^AGY*FAw&Y~7&!3ZsZ<()X z0vS;}24yxSWMO3{b%y&1_jp`QMRfE!dUt#8)NMey9$HXG)_R{$k@kafoN2wWb-h1d zZ6W$qL*0X_McqyIK>Ew{HGoP<38%rMAWF6}tp-j#=Y+HaMYxxMQQo*Ny!h)KicI4R zGpB8g;s!7~@kO)rlvc1U2!UZc$>G|4E@h}EBX;M1N%@7+^!45j3eWEpD3>F3khk=q z$7AZI3?D79Q)V(o#g}JBK3h^f>3`Ffh0s~51b|0a%nI!@9mZ5PAY7aTdMnqYE~`8yDeV)5c8|gWn%{6c5#?SAG0Qtn(fW1RmAu+zlI&IKEd~LU?j^!8 zz~-*TcfQ+&=F1dr7XffH^4WfQ9(#T!a?zP|faUj`e!s>n{^8w-s-q%Oz}7eguUprqPN(~BHQY(WdMeR)*C0mTg;eH9S=xsMEL+C1Fb#+ARsxo4v~&3oBs$pl zhe9g7)R$ZlDNT4~-@s|IX`T2xEQbaxv?ok4ad&xW(+{1|vz%eD({g`g! zDjDAA9wBBs44;`AlU-~0n?ndcx+}qOySYBI^_`=i&Tfiu3fwaBAn5wp>`(r+13&cs z?s;$hbN+D6*8cPdzqQW#7knM|X=Rc3xIHqtO0C3Tk}&n?El=~ICjdjJuF`Z{OuZO> z*HQx)KhHsu9TuM^?wlyi-Sf*axpw4R6qNfqWVr_c)R(oMkR zeh?ILmHBh#qYaZe63RM>Szb9fs3!pwb3Hia*~2pnOdc4B|?&>e!ZnP z0T;Yg#U2E;%=aZ_8(&PBF-Z4SF0vz5IJ>6i$II{p2Hc)5ab{B?2#W47bKbd1W*X(5 zYgVaT=m-4>(|N5opMJMQKmB-f5ucE+%#2W7TK%R0w%P<{>7(U060u(*)F^V=>u1Ek z7yd6>V=sdWg&=>_PfiCzkiUY+Th44*i?%IWrxv47h2a3hctq4geAVOI6&NKIVOpP< zCJ9`Mg8&&yAwS_+2eVZsXF85y2nkGsDwSUGMja1DQN2qDs@g^Xg;cA~_>BL5q!JUq z*RNMdI}SQC_7Z-*+xe-P`;$rR>Iw|Ld}9?CS8-LTraNYsNh9pNn!0 zdFA-Fx2l+j1)_Jk&Ua-0wCV_eEJeiezp*1+`B8bKw5c{Srt++GO2A(vOm3$e1xhZVRIW=r#dX{O z%&uI6j>T~8$$)aWN1&V_2+uuvB(y8#`aJ%NtBp+fdwpeF;l)}baW6GFzCqg1^tm>8 zJuj&`!dO)+r3Y0@CLipgrdT^^9@Njx<>EV8M|k1WDdFHm!;4TuuQ|p$9jun7G6sB`UJuc+jc{uZp@m9<6DQZRo ssyuarN(@Zcb+PeD;0XKfp43G4avg2qm)r0WzDdtN;K2 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/downloads_folder_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/downloads_folder_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..046463d1a14a212ebe99bb4afd51e365c916423d GIT binary patch literal 763 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU^?XK;uumfCn;e8NQ&YA|D=-n z8=vo15$9(2d2oDwJ&$|c$LqEy4f52Ef#g975`X^hclHnNeQ3^Y%?tv!&#&jXv;Do< z+c|a99(t-JIzttHnX~Kh{<$0V4!8RE@PI(j9UYz|p8JyT?(RPR;otH2J+tcn{5%a+ z{qy^K{loqC|0VbR`+5EV5ET4=tl#$j&Kn*fuPmNP|NlQUeekXKH4jYr@9*-5`}fxa zl_w@8{P;fo;rHw3dEUqUQ+ZLY>>1Z~e}BC(Oex6Z=ilE;-rN80=z(Krjx10;cYJ}0 zmfHn}%DAw$z31f&5h~@ITQ{jRPp~+`eJCb}r|HcZo}4p1JZB~(B(8Wflj-`71?w6f zzPxVFQi|_zuQaftNC{X=GVV}r4QdeKVMRA-_J(X6*DBBTs4)< zyT9-3hwt*r&3icHoA)-V9sZ~;FKOcP-|)|mU%iY_J3j-R`}_QTiGB5l(-@eUg}J4h z7tPT*y!tr5q|6pxNj>}e^B;abmv1YV@!_%GUkglT5O02dEq=Iv{d~zOJ8nu!NE9BC z>}P0h+re=7w*P!dmq=a25-_zC4Wt~$(696GNaMJ() literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/downloads_folder_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/downloads_folder_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..a492e069a16a06a7b8c0e31fc24e79e14df3567c GIT binary patch literal 1323 zcmYjR3s6%>6paQjnkS_E@*>Velp(dKc}X0tpAvyc$$)&+`oR%iLO`s{AmFb9l0ZTr z8Vn-JM;>s#X)!LShKpKy;=%vwP?6z4y$ydv;fq z82|a)IrHX_NTj*K7{NxDg{LOP%e9&her6+)JYEY05t|Ryi_u1oYm)@P*;O;At$3eS zH?k%S=X)0%Y35SmuWCifF~>aJNn%mDt&>1S#XIh3vZ2VIEP)i$r{cU(tkq#07s z?R}aZXp4wJsh9FJvrrVn<#CXhoE!vxmdT~?3nU$m3H#;PK6b{fo(HMIiyyGx)?a^$ zm6t5W_b&-F$SAXTa(K-mTr=LnST>OVi}i&m^(+MNuD4`2PdfliyhREag%ftoCgKEJ z3J*9@NySroI)eBv`fU_qB{U3uAT(~_<1N@!va@vSs0M=|OQG*bu9s`<3_hTgf=Qk` zHPU8gA7B>PZO4hu@oYg5L@ws{GbRD(bjOPwW>z3oU-+&I4ZYierhRKPblmPT+%^~t zU1hub0e~RDSfKjLgaHTx9E8%wG0O0+MPJo?q4_APZ{DDO(}qg}i^!J;vwJVbM!} z-l%@e`X@*~_|e%{oj!@7wZh@@5JeNbcDhH&eU7&a$fNyoKnaird_%e7^Ii0hn@ouz zOF7ALYE@qC(?6=vXM9#{jY)Hfb?sp5i}X?}@o}X~SO64#!M-wt=Fv_Z0ayU}d&wB7 zyyJ@H7H_+kA9OW9s@Z%`vvWn~wtkO_!eQa#T8t4c z1>J@Tz$SUi#JOkj(2%Rebx`t_aQl!gu0D-=E~ z)0w1ga(kagO`G`d{Q4cLv9NP{f`)fX9)RP}-Kp7l@2qS%+-d8v zYKw{p3kE8NhUj#BkdICMOVcRh4m!>Z4fOK!%qhE&b8SAkjDuvJ=N6=+Xrh1GE)k literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/downloads_folder_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/downloads_folder_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ec111b7a17b8ad7e4c607af49f2b9026ca4497e8 GIT binary patch literal 1659 zcmZuyeN<9s944{5unU^51hari^koz9Ol|6}sF9wUxUy5tm57*I`4yFY83Y<>wlw=t zOGj;%)oFf|l`ZS)Ze(fBHD|SIA!gak29^dW@a_`qoc*!)+=+>spvc&0e!{j&v4|?d7YP9PWV`zjwu3NL@Aadb+rL<59(< z1OLI8fLftLh(xT@9p!w;;qo}Q_r(NKc{~m$tonwZ6RC^`G#ME0GQ0|4+lB`a?0OeU zrRJZaj`ZK8?x$&k?kq(Tmn`_e3Ad{=RQ~h~J$03YT{4z42}Iw!`{6gu=V3G{Jh{p8 zau%kRgSi(>?tb0Hf3D7~bOb5|t%wQ%RI1FX$#_|Z0$QfrqB$|=qfXJBc~J+S!}zF) ztLn4Y=8X81;5iW`nFft@04{rKt9~e*!OT$sz|5I|BLGl_^lIfeCkV8R?OlTn6w|4) zTp(!Ba2O+bRXXJNiw>g0zqXPiB0LB!3t3MSP7;QHJ4IQ+@TAYa=41GxmDSCcoNKjm zv#a)QA3EPry`b@w1zNtZpR~UEWLEk(WvwGsjiRhe&27Hv*-W{R3*T=qg@vdsS(LU; zBElb$SR!HEq5&G?-nbsQxk+oYq?rtF1M&!=ffxWKz4k@`U~_2$IU=44>BqN^22YU|Fv5iV=oIC(C4cWaF;Ch)%HmFWyk-z)l}{5M_4y^AbYmOoSS>h0 zeROQ&XAip~s#{(Vca#&n-}9y)zDC~7@rY9E<6ROO8;6j|MGUCGm9!|XKuP*;f&3|D zXtB;ec!~4{pXL3BreC}n`!RGd${gL(d+yujOw?t4Wo2x+%gm*_@xN@B+2Pj0@F31E zazA4OsN3MX`V8S{WyH@MHIaRWUCY`L)Sj2SvTFrSYGBl;H;X1w6-i4wPZ!d8Hg(BK!JYJy- zNCU3FFFh0!zlO%L^2wBg(?tI-{kGrxhh zGuNtOcKWFj=`wCTH;`wslIOm2wpg`7i&AA4ORHhD4T0{XOJRRk-xhp`(o!__U}TXB z849!aE-aVpY8Urw@@bL&Tc|U0%^ilZS3-zMVXNfv&dr1Gfh?8YF3oH!Q~VX+MVvfk z4>>T@JMZiP2x}->Nwd{U`x0sxciVc?s&8cvShuPIP@BDyV#Ogvp-xYaDR2r?wFvPl z<=ouy;k^no-HYhOf5qHgSapam{JcW=a#p0`U z?HyfklAJGX)dE1fVKa9b^2~HB>FZ-oVfig;EsV->vf;PE#O@?Ew9d0=Cp(A&Ol_eFNH|r6W>kWYGDSAy0BReY_P-;;I(@;$6 zBM6|Fxs&GS&J2-FsKWrcQ%e zQBhc^ICxNT#;2G{n48Sh=+yv*(SnjrBE&E2u%M~?J3E(EbeEcQH6qj~9o|9ejm X38j}3#hivS9`^OvMRC!!ks{?kG>-*P literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/edit_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/edit_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..88ab8a781fc96ad6a5b0753dbddb08fa42ecf4d0 GIT binary patch literal 883 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV7BsfaSW-Lla!*sw84M3(&Hab zKl#0t=ie#;1n)L@+FG4k9QZ@)c#bSk%m4pLDoY|aywBKh|MT3_Z@-vE>h|(TR8&?< z&f8OSbVJqqi}l_+&N?%Kl^)7&IB;h5xr6%U?|X_jCQK6%O|1CxLXcTrUY?nooBQx& z@%0kV;%Yu}Kny;(bY}fA(RAr)=FuTJcV?PyO_iAO|6f|g&rhm{=kES45fK?7QTPAf z*#)0o&y;~!kj3!7NBdlu&-!gMv^@$VR-HC{Q}J!G6eVm~I5Nt3o zHU??}`ryz9ru$z`pPSaBzdd5LN8yc3Ed!e$e`Y^?^?N?g_V_*N1;2`?AN28?^6>ln z`#kM_^U^H-guju3xY6l)&cFXZ#k5s9Mb2K2uT9(W=ZmiM-`4Xy<@ak-fBgGxet4<4 z{Qq~)FP5@{H8kyRD8H4OzIng@wi~NX7FfK{Se&u%-w)Np-QwpZkJQyCJg6-0cl>es zbG`W4$%pTWN3Lgu=xcBMH(!0Vh>EL4&X%bKSEf&8k_DNJ8<9t zP$eir5)%><0%leiT$}J)dHqTW?!%kc*GuHp{%Kt}^YK;Nw)^(`{#K=k2>sYBvS?;w zVl0SXSKdOWj)-_9xi#W=GUo$_cyh7qAD28 zD`J10?cqtP-V%1T|IU2)eLbH|P%yEre0}`CzyE%JpT1n}Ms6F(TcFSg3<~11D19Yz z_-FBR2^JO>i8!13e=m>qO3$7bk@~JC=-IxO#7cd=y*wZQ(PMIYqu>Dr9+rcPnL{7^ z3R&T;5G3d_?;z)Y6@i=`y2jNmHlbhR4p`}AGEDlyxIg#iyyxqAL3S}SNS;lcsgkS> OHpkP|&t;ucLK6TRf1;TH literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/edit_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/edit_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..09fca96b69b14b42bcc1866430b44f3a8fa21036 GIT binary patch literal 1444 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 NMGKdPln8_w{{ma5TQ~p! literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/error_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/error_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..efb6673cf91c287d830bff2402ef8e37895af2f6 GIT binary patch literal 2394 zcmYjR3sh6b77Z^p__-2_&yt7|0ti|}5_kwyBoa|X{D6vJMG`^)KRf}g55YhTl!$^A z{E$L<1hqw5w1C!X1(HiH8ZeR6N=1E^aDj@!4?&CslHBPH*!4VX&7HMo?(DN?&pzi^ z)W-1HGw01D5D2p))`o4yXBX?3PQt$ja&q1h2s7vrVWC?ORq?nKF1|9Awy1`V`bHL8CaExwkUEiEco5 z)?(|}&xn&~3LW90uKV^uAn!TfVdxHv*?2s3Tl^VOVPS<$EjlI#8Q0Y%_DZuw3G0ED zBM$dT@OzqVEG_sH6k$x~oMgdUybzbCMkxMX)X_iwLUhGB(50pC%# z!?zXf@SV1HSl!+ZPy2mbYU40dh=Ek2VT^^`U;%0#oy=SdbezfX^=0ZCe0?(-8O#O-`o{Jj=5d_p_!vv9 zkprd~Go3{5sbZn<^bm7qRrKA#1E18o;Z$+?*_i~@PkZ~yh0dGXxVb%S5gJ+&+7fMZWD1yuDcCd>*T$v`O!BK*O?va@34ytl!e?T~6j{k<$-76{HJ9|bl zTo!FP6H*vb__^=>dFTDRPD!-mdlRC?i*8gO8k~ONyWC#fAh=6$LfqbpoQ|*w;5OTt z&J=HA0bhNipP#^TV)}o4{F$U3b0bK2h~*%inU-rT4PCj}ZYe;=-AL)#`$(xPVywHQ zWj_u=hkM-K0t=9$s$l>HyYisl$h6&0D|0#qB7g3oTK{@4sx_%SHcAg&TO>jIeTs_Z ze&_E5IgwdauWIY>=m&>4h!2jvX6hr_eFZrqU(?qfJK4H{GkdjV&`}ztHex0kLi1Qd zqUR-$&@7sRjKQd~LVkeWYZ|#q{UZ#!G4X-Z8<~jCm<~T~w2v>P*Ohu} zNA+&VzyY6zp(Om$#xbb~7hDcG1eZYT<$17|?*}>f-k@8ZAeWBexsgCS;_>IoC0HV47D=E!D z#mpw#W3u)-o!#SeH}Oj%(F^zS8XwxE|Q`30P_`CM&=NO zf_Fvd)SIj6tv&YpdWY&X)U;>Lsd2f6p!g-NJ*CzywEtQ-B}Fhka$2Or8(}(4>nBKl zmIpnUYNV5eVpK1_Ijn5z{xr?C8REzQJYAHqX@&TZmv^A>@oi5idxwu70}uYbW>|01 zaKwvpCv7k0dnS=SvD+x_Ba)-l))xysRa}TF|JMykgFYH-{m=o%Hm@LHDcG@_-M1eC zm^smijnR&$tg+h{c=-M=M=EpCoTimA4KT(DvSzBrDR|3TkcHY6bz#~T{8n!jZdozHlT|UBzBn9 z64jWwD$8XmVJ0k(Z*kOI4_2gWn?R&dUU&O-BejCK7W4gAkARk)R29)%AV{aDVd3!u9s7to5$Pq{TfbwXlJWJUE`uq zx*+%N>R)v%5Qh)T1bNB5PVefva%`6wrnFW(e!{O5M6iu-I#={@s&^H)w=)^DBACtQ zcg3isTMBW6Sc*~q$~OKA!O@l&u-vP_C180$praF_&C*bMg0tK7r^25N?bw;+m= zN)E3U*GEs2)BjkY$$GKt!mr(qZ}Qm+Xueqiy^N2C0C1bWg39dakNT-j!?_GQz&*8|`APSWlM6m{ynvD;7jQ`f^g}JBfOijv=G-(2r zAvC$D-*MVBrM_3Pd82%?V2(UgBiD_z}4f pguEv_u(Hznpg8w=8Pg_bBH>B#S0AssB#E`IN37l$_9L5{{}*5uvcCWT literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/expand_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/expand_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..d6755b6c4381745c7a8e59f844ed44aac259dd95 GIT binary patch literal 1024 zcmZ8e3rw3;82#GPa$6|vptO`BEfxlYbSt<7)GZAgj1`6H)G1LBiOMvQ`HB)_K$yd@ zNQgsICg2h^#>m1pLIOTUQ%i~~+D#~9M!J^u0SKiXkM?i>m;Vpbn4RR_n|${>=Y03v zj>oDi#G-T&0Ei7o%8oIolwC-`?5cJ8MF8G}p{(@DroQ^&{xP~xWjU!7># zw4z49;DgtgUZCmv`Do+`tJ9vbC(mjg4~2aR?K8&Ax6R`{H0@iP>TZzAjde|%9@TS! z@S)t7?~Dj3m zr~S6eLQp4`n;Z6>=srEyqA4A}Jz*cXmVJ2;75~y%^>w%A9sl`r4sP#Zt+eq%LH3<3 z8kE8q9Y;|VNCaF6EchT*ECk_>R4CApK>g)vqd&931{Yb23GeXU92KI(GDzXXV0k$N z5~&?Y7XQfoBdd&S`r&4^UTSqpMQ8SEs>B$(lFfh1QtE z^*zDihnaik2g-Kv?*D8n%>HfQ_%XImq!z# zx#aw(*n0lz^src_KyeB+XcKTC!<*obPl1(rCxrj@fm4$6VVIvdp1pcwfaJt&Pr5Dj zK$DTCr3xU|0vH!Kz)zN=IAs>-7@3<>f519UV@3Hn$irvk+;cz${D3o=@{&>zC$#jx zskkJ8!)>I5SiBhF!Xy;ku@mx`SRD4>;5t&bI%IpQY*RNd`Q`#7q^kiFC2#ez9G1&~ z$uEj86kCicy>jf*BRUp6bkpP;9{cO<%iQ$N;AFnUTTQ-(dQWXSGKN zKczjJc)~3ix&B^B@263m?49MOHP%)0@^@9gQDUWD2R?9Oo$>C8H`#nl;1!kTETA> zb@*ug)DJD9sEtJlWDzPXK{_Na4&jS2~0pu=+S+g;pI>|Mo_f{F+jF$m~cAhwBu*a`R$6wvPQjD7boVPeG??8W(H=NEJri}`+?|w@gz|< zc6oZSKB`8WYQl7`nX`NkU!O7o=H_6Vd3?N9DE6~vNa+T5%q$Xkj)%-|cu<%eO-oOx z#YANV1zxQy4~b629o4kAabOttb$x#j#wuTz2zR~o#cL<7=*cZlz40Wr%h=>qSEv8r zDFUI+B7j7ThawrQF!R8N{Uv=n9KJ9HiJ%;_CO$O)AnomzPP-Pe#~R{{KK$!eOpqVN zk>UijL!$tYodDCv1E8-ukKwP4OkX;s55EIu6gZJdV3L&yR5v^WvJt18L5QL-w{%`J z1IR$c!htJB?wS!6#|SCGvTxPDiYa?bs-Ytn7*ZM)hlC@=3&7(U9|b7taM0z=P3Poj zp{A}~2}kDGKEK~McgGU8{a7Sfik19$VY45{Gj(TBOt(-uTdwaM^mNH^a@Y#R8@OhcHZ>~nK$~<% zRf;T$P$ACwLGlAE7o+8%BM$|=L;hmMy^iU-_Nr^Q3eDZ2h}-<;BgUrj*nFAqgSooW zYD0~3gT!WEh{sJzP!@_7=9TC;qB(BPNN>NC>JelgD6ppleJ`yE%iG>^H)~_hXJ#o@ zZ5OL&yE7Q6iCvSmk_K;?-qgT=Hm!l6_!s@KjLT&<4lwbE9}6`eg%pzWb-GBQw0D;H zmDQ)%j*}%?^2wD=`V%I#XLIHxD3QoKMb(^!Dg)#n^U1L>%Li|=sDqXyNoKb=Db45oE8Rug#)+B#BttS95@Fo7u!WDr0e1}|05!1J&C^NeH%x#flO)(oE!vcb^> zJk@;y9k{K#jgjy_in|+!$PN?-!#}vF#(-h@F6p@#vm^Nw@2JUABEku3Y%79Eh>8o} z%=#OKN;%ZNgg=`EaZ4+7*=OR2pNkwqpVeY%Q`EoxI$C16e2#(?xSgf--8dN3I67KS zXzSy?g!~1=$`!<{`7&$>@fpp%Y!aeY!_mRM)N;XcCUeyCn65-*JjL*S&C~APFxz@g ziF&Q16_E`^{-W#K5a?RVPJ4}B{bZgj%A4*lMy0v*GtM~o&&&hy2%`K;X!aJNPzNKc z63coV<16>PJ2rgbN$T*_knPeB>@-xHVFnSHRGK^12}I_&yY9^UbZ-DQRPBj F{=YHK{X75w literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/expand_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/expand_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..789094bfd57579e90a64a7ffa5af1011301a9d8c GIT binary patch literal 2289 zcmXw52~-nV77dF5wQND`CQ;fTv>=LEh$6V9K@m|KWN>2y2{eKWN<=}Br3_2hJE8~# zB2n8Bk1(LvM*|1}5=?-Q%sBQ4HWETuMx{H8K!QoCrb6_cQ}yfr^WMAn-~ayqRd^^k zaM_YoOHe4(vY>r?{)V*9rpFeIyf0n7I)g&la)b8x9ZqG(P%%_w5Cy}lXx0mDOfD&* zP6>*IsuO6=SP0M%@=g4=H zpc9VpW9$cB-B09nVMR2NR0yb&>C{J%4(ZL;TwsxZ2tD(4KmAA0+y0Q5#iyhB=D zq{KDWSNU7N7hM7}eP zzk>IUeBqm>(McoBEI9jRN{cPlro=Ix6KcuRt(Rfphp??##LP^ovp^zN8KodY%FYHJ zoJ|5IK@K(98bOdCUkRimHx)XuhsflDPH}TXhd$r{CxRnl1~dMeW16zrJ|X{_`vv1- zrw~zl?qrKr;aSrlCGGX#B-bSxs7B2%ez`d;xljfJINv-hP(FbXLpy3kIpemqXDZnP z(2kLqJDx&ySyxb(;m>zI#Bsy&TY0DxG0U8H6{b5{OH z1|-O+bLJAwuFU14q_0g%;m%)tb8I42iWjI<{fYaogIPVaPx7BlbZ{Ru%}$)O9*oIy zhgjJ1L6GFM6U>u~5CF%P$pM|%W}%K;kOFhXZ>uq6aC-uxZYegkIrDR*c7ZA|t+x{~ zRau}@jIRwjXTu+f3F{Wl9tTgtpc6o#dQGH^VYsCw!}6sd`1gU*;QU(`mlVqUk+ znbX%BBOHPqSDeF}$@N)8+?2GQ?r7oW-HystEYA1gGi4yg8rgK4eX>XeAlP%Kv%gQJ z(Bc^GPGi8dV-6IUjUrE8aR2o0*qC`_a8yNBmZnRqKQoO4wZ9f6u@VQ^0G44H=z1a$}ueiS` zarZltioG80@NJow2*@3#CEpMdd>-mr*QqXvWYgtu647T)rl5B=%7EvD2r9R)X++m3 zzDq|;{uYUV8#zPwex1uVy7P$q353I%$HnA*Mrh!UX6B&s_K2bc@N95AQp+AT)$$f&Dl4LQu5sla|1D4fbFx7e`Fvs#*qdN&CDE^ZH7^8#Q@d zRa0B}#{Ma6qq=@;JK;)WAhTb&=s{cJe%AcS_GEqCnDQ8~?Op@`LeQyH(b`@W{Z@_K zitMO2Wu$RD=;>Ddvywbz>51py1~{vS>ijYzSWE34;t|O~}J(>RLLTX|o%WMeQlJMZ#d%e+iv;JW|gNtd={F z-P^>a?`j6qL%8~?K#jj6kfbg7v#Rrb=}vS7U#DdRQin;(goALYlYy-DG@MAG1} zASm5-iW+O@PTc%Y8I_upLr6^JSe88@9CCR$x;FLD;`^&GKFk5esickL;I*@?h(F4` z>$hKD8iP7-ciwI`A$}yPbJ@am866i_5gi*l{@M6Z*jBUJ(UxQozS^8`x!1cEWV6|F z+-Z{uK`v z;I_{Y+I@vxym8g1GZN1irU`zj)wF!bmm3??5}Ex2=*a*7o1{OyzaI~@|L?@| z=>C45{r~=?{`m0Ny!qpt;0WFyKfl{IbEtD4u2*3ODgvo0I%wZ^zy3eaec!qto}WBB zf;VAOSn`jv$IpHEuCFu!Y9IFzdmj0^KS@8X%yv!K3wmnwq};31PDkfWJw5I`^Vl(vK2KLamvv4FO#p2oVo?A9 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/file_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/file_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..18f9b2644888a65aafa55d14e7cc0ac024f451e7 GIT binary patch literal 1175 zcmX|<4NMz#7{<#wi;lw*SfDT?3>1yR+R;pjK}$==Aj3kDkdP^qwtP9V6=+NE?(ZEXyvf}qckloAJkPza zDob!C@JPfF3WXAwp2p86o(%GOo<`iQmG8PKl*9Syd~Qxvmspy7sAu7e>Jkr7%aJsP zve`2&q?Kth^F}UJ{NP9Q10d!8?>Btt!MXZycu46aa)X^4}Yo zc5Gr{3d`ma#DVeMimvpj^$*%!&OJ*INCfW@3V<5v{zi^;*2}qdntE>TRV7zYtK{a_ zhShz^kk(W&COo$pV*s6uitaNQ?%ta!eCoA@j+Lpqba_6E^sX&1nH40P&$OTTU7L|? z48l7e#O~;nrK`VI1&n59ou9mZ{G6zPSHjC4KV^+bdt)nB8jy7T=S-?|=t2ME#mn6u z_iM~OOT1yL9p1B#12E@Uo#QB&dR#Qg!BL6ZWsj5(MET3*NgTPhB|*-jhbjM>yK}DU zM*ipAw?ce?04)rGUImOb9)rEkCL7Sh(9MhnD0`_KYD++&mS=U)=!ab|^;_)asr!e- zT%FZYpwI)HUG2r1kY*eGm#88UQSRLhI@P4HK>s)&_SJr-8)C88tZU!#e93t_tDV5Z z0F$_Py>t@*vx)KU9WPTpGL#fu3fQbs9QR+j?Yb!ZttLHP30Z*>d7(x{u-NeAXC zpb0`_6#xd;%)ZSqM({Z}E^#}XRD~a1pa?_x7e?LT1Gukm0LQyU#Y5 zCT2ejjs18cq-Y#g0LbzcD6$qwibct{4su%H(pLa#a&)#g+nn+Zex9MPcZO6~aA1&t zdYeA>i4y~~5c%%sY&q#MrhhwL*T%8BD;2gyI|l;zt&?bqbHA~E4L~r?t2P*C&Aq2q z6NRCMPjL;I6`X$m^1kq}%&%pB4Bs^wW+%*!ji>S2I8m!m;>PTeCJP{X+34wJD$xu8 zkNi=`D;&hYVq#)U-X5toE@<=bIfpB9!XMnP-Y3?}^+f1xC4$&E)bmb(Hcm!KRlvkR zP_Obo5=F3#Y5f4CtRQ6BJfE!0w&f7(Ap6$%c;={2Y*?mJA&9CSLBg|N#5C<^yB0eu zQ?}VDv&rP7Nk5I!)YR`^4Jw>^h)sAX13if91u-pn|D)57%|FQ=V9m=^&mFwI(m7!^ zo2Rzc!>Fr+7oo3%%h&Q88^@>%ngXbypvi=@o>c z(*>#%i&NR=#3dR*FcW{4b~Fr-X}76EN4C;c!_;KGf?Kca^}c;aYqGoC-FM&je$V^7 z@AJOj;mw=YCMBdLAPACFxUOIe{LbN@cnrR)_U?UwAX5$&7OX0+IZf(UqG#{z*>5ak zhH4jY%3V=)47Tl#t8O$y;Jd z1VE={Ty&e~!MTvorQW}Tao%;(-Z7V~A3uL!McGr&?$`*>cT4`1p?Pt6s7#c15TBQb z#u0K>7sAU2`jZUmxY}wcGJF)KK0CDTUc(ZeS#Ji~f!u!2X;~@+r)JqQo z0Ptm{HazyB4XS@^Z>s(`bauln=VFy5J!#Sc;p;WQKK$B<8O$pVUxRK(*{qz{1EYKS<-``CRumYaToFhwjDej{YUPtR-vN+dg-OUXEBb`F~Knznwdl>>O1V~t#6sQV83H< zT=ZdD6y{Xoq;y`F8ncaysynP@SIk|hP5{JlZ1BjNGoohGVqhY|jjk>Fs{vE9z20$7dzg&klJe~*1!mzCR6x~?S_0W0-CZ=iC!TRRUK}}b z;vKjFXaMZo$8J02lMlh5*Xv2G)-ij{RRP~$u*v|CO|GLzd)C|p&gRD9FH*RA KQ^DnYZQXzCbim30 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/film_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/film_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a429910c30967184dec3a1c26188e8ef19f98530 GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV7le$;uumfCn+T%At7LHUC}ul;zY%sjr3(=W!W+5+w0*~v#@K-Y$C+;e6f5pJzbi!Rh zFnvAa4#$;~4Rd4}4Yu38?&wKe+IQPqA7Wk7iID$4zQ4C`n_vImFk)TxkN?l_*YoWE z|2KWYqqIbUX9;N!(o$0rlG9Rte4o$gdiMVQ{}Lbo)D3cNBG6Aie!tg0e189b$#bn* z22yM5KGYvt`rYC$fAHt;_v68ig(z;4`0!o+@cH`xl3T*>{r~^@etlc#wIq;T$1lVb z{V|Q7a@Zi+~*JD6e8UOiv{J@8|=j(ZT7CqBH0#%Z7aiJj4w=4&Rw>ZAt z;;J~~ze7_h+x|RhhZ`Qt`XeXZtc>_29w%(ZAP#b8%Bho_42mMG2ai2DW6#4Z@atpj zGph#+^R6;@bs7~_PuXl{{PoBDAO<_IuR<O;m&|D__&TsY0I*{c0r zXWawAjEP)oA5|4*m)o>-uQ_)0M6GG`^GXX&>M>{6&$pLE1YXmw2iAwr=iir@@oL+@|3BYKJ1?Klc33|{L%I3HRq+Q|b^rgI zI{*aGFi8Rh_2;D`&a3brU!(oWhrX|hy_e=cP zXOsRTWX~7-!|&yJ{{R1<{Nvwe@n!OL{}U24;(pD4f4aDB|9-_!P}4yXS)sgix6_k@ zGdTp?euIF7%sa}5K731ruRa^Z8l|!MsHi9_<5zUDUo3nqY{7g12F#ChLZ^Mqc^ou zAQ}~ksZmS|Ec2^^#6%FW_m)->zhIGOx-2V9v__rngl2{Io_F`Q&3>G7a?bm_&+|U- zdzv+6o6=LWQY8{eddcSE?ZSzRD`l>*kJqgaOC*@Nq_}WLeVajNR|t<107LPcE2XP% zZ#?l&(YoYpRfUBQhpZF7Gp2^RA03%GLmZ{vP4T&Gz_y1hShN7&KpkkQHgUcmq&^$1 zd(rkjZIvueR=AUU;^Bf8(Zd*DF22R9BoSMvCiQjy% z_WjQ@xte*cid{*^OLq3WIx;8FecLF&0o1p~Gu&jpEIK=NdLlypQFy!y1++Vc5`KEd zeLhCYAilDIy!`kf$8oy8x1WFkP#xhL-sR0t8})Wpq{IshxmZ@pf?OKm{VUwvEZ|Q5 z!QWVIh=KMsVsiz#7=}Tpa`gPsk2HpPA}3>9q3qs_(J?5x6&D`N9KMojjPgVFFCMyr z{J*q?1p;@%%;R8y#@xL=z!8GR_MG)+8GJBmh!U`9Brqo$S8>1c4LISIweqi!?6#G#NlaQSz^bK}tikS|fY2 zH;l5+4jQATF~Y|{bvOdF5Vr z;Q+EUk$*BYzR<~5^(pS=e7`)FXwX+xP3jGXOr3DfaF6b8dG~V8swD&8bbMBrj}9l@ ux#w^=asly&rvM-$u4bqb66CIRiGgAgqR8)U{`N+>7%us`thh_9JN6&PiQb3+ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/film_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/film_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c47d3a13f8361b9be22f1a808d6abe8cdee93f55 GIT binary patch literal 1200 zcmYjQ3rtgI6uwYeC@mDokh)|mD9*=Veb8u?kV2^M|2A0Vqn^+jzbP(4vP+Dm3zyH$fvXk6La=!DO??31J zs}H581O>hvh#*K%>VEkV_>Cl=00w*?D=uC}5Wf?t@+4(ZvqqQbyCb8PKc-*hj`mvn z6IqVAQ7P5|oDq+PZyzkH_JJh;Xioi@jt|>c?0@^ex}A>Ijx>u62(a1Ns+I)x)WxUt z?;^aoq)dyo-{QcGm-9^KO*zJ2SAPJkAUU_xv!>`gox#8J?o@dD8O;Vx_Kfd(g-jBe z;hDp~Y}!b;JvD7Jqc)r^C5U{dYlSx)Y|&5PXuAd?p$Hk%2mm2;yH?D-h2v@6CxClx zbX~3)P38C$=slovK9s^5EH)f)OSOxCnNh&)@enmp=>h7v1%4yfOJ=a(IJ%Kg|Fpbj zM=?7(RPB2(0gScLz3JmH%|;22R>Hf+Qb@3xHvo9P#_5|>U9CiR-WvOv>T}E@#cb%I za5u4Jnzf@0>?rQll6-*Xg;?1}s6?zcCr3BKAHoAgKbt&y;gz!K7-fogzSjLT9B3HN zCRHf6=hIO7)QC($mCNqa0g;y`kpe>NTwUO-4@K3rjp|=h4%j$M68$g4%P6tGMtTnI6cFx{PyG|xPgNgnrbbq4FOdc(oe~6{ z!sT)WbE}g!T(=u?hs1|a4SEy_ofJ3kvDT+H6ng+41?a z&~R%hxdCe7g0!)TB8MxldhMfR$lp`9fQX6zO%h`R5GPPxPwrjhLF zp?Ig?x-x5+?`Mn8m*5q%>y-Q8nmMEaNXZ7IPa1RB0;AU|*9WM#$B)gER|Mv)EsXE2 zq0DOqe*iN|h)T9zNh-e|v;5zIn8Na>u$>tPg13hPMFJQlgsXCv^B@9lHs4vUOasn} zY~3x9P~_eh$GQ{k6{C^=+1~#qfeyqDI~p1)jEgJ$Zi)ZvCohll-V4gg#mwwBn=0;M z)&rjx*E>(A`#n#i2~)$btA9(^JMMukZy7qj-W*)=Qs$$qBQkhmnA0u`4p{Z#(^Rw;h=I)(yJKZ~f)PeWB=jA-_^FBQ1)TAWs@!*Mg z0N|nAtJqIxFDBev=v{0=#{jS(r6Mk^xH0=$ZQVDcCerHAO>9PFa^r=pq|8iB1&2lg zLfKP)GzG}q@EFNU9m{CGR*KHsq{GtPa_2R~K_}vPd;0_;x~3=!xLhtUb?U87WT!}K zdKvpQ>u~vKVB=4Td|4Ai%dhL-wTWZCWC4y|mlK})AJxp%)L1`q1X?L8n9U||_wj=; zKPlLjmfQ?;a}wj+ti(c0q%T(Ay~pCZfhSuJYkk+k_^ffej^SoRJ5{mPty{k>GAgQ< zv{*nS5`p{vLf9zug+=QU{3aHGFk8T6Az>B90zOWA<;DXphQY}9L1@iQVEv=w==I}$ zvGQ1mj0lIm{?G7+?GCPV8%cvqOLiDCSYT+{0DgQA2;%S{fQNy%D+YGE-6_dQmDbzh zQ6A#O3CXG&P^TrXi4luLiR}R?;;(tiGG!cDG;+1$`;K4l4jmlhI<2qFtr8HEJ>qJO z+7Y^ZQl+9uO~p_7%@ky#v-o-d!;Mh1Hq^5`5RdIk4wgI>8q~2e_UiDqEpN}3KLBI< z;1T_r)|eKr%e=FxGiQ8CfG7^pA{FMG5NCNs8b^hQm^G?h0`4RH3XX(=!vg|+ z{h*+J$Dp7X*;SNz#{cz4e!k#GXu+_GUMrL13%fOPwZPLociR4;@0m7c;(GLCPjcCC zR%St|;FViJ=*kMscIRjj;DAtDgU>2vp`?vys^6BA?oVge6+D3{O-PL?*#*zNz fz|L}i!ubFgj4#Lzx}M(Ez|bjoCn+Aqt1ABj?>KWd literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/flag_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/flag_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..130f5dcf67ea1bc310dca8a10b4e030cb0a00bbe GIT binary patch literal 1122 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VA1q+aSW-Lla!K>knrHiqeuMw z{c{phQl@nff5-TVKh*A?0vJv61Uv5^sCc}hY9%fu;5LYi8avNE%?vmgHV_qU|n zW={i~FoX0751uFf`1V}>@a*&VCI8h`p8xRvv^rbge0fQU`u_<(4xak^$lUsUx?0$^ z|4e88KfQ6|re)oRBBKv~{vO<*c(ijO+!~dO2YH(e7#uF%XGwCNsHQgW$&s0ccN%1+ z(i3#t4^?e$Z4#BTsraz=1IwSuy*qsummm4T$XI>-^0o9?lOJuZ-I(~)(DluaXD`z) z32E?4iceh};u)CvBvANTO9^v%u_%K**fTa44EY=!1RO5zPd*kE$$3gQCh2`WmsKb8 zf&~i|FIKu&a23Q~pINN7^vJfnp35hK*qb=j5*`^8hG?&cVo=~=KIm=b!1}*Fulum!kJ8uSeP3_BK4zpiLrnXOoEr10 zSDS$G`Tzf+Oh(1eg_d2N6DK~Dp9Ito5j2sQ076~x~r46FXh{NB59AXUsZ9<{}<;zKHl5- zpntp8ocHs*H`P?0IdJ0Cu@8+?KOYy@d#J6yGo;GyspR^WmylEl46|Jid4OO(_nGZ= zX$d#Fy!p)_0kfz|%ZVMz+zHJKi*PfXHa5(hIrEhmL`PHfhp)G{^XKH`@cjSxH~GiM z&(G7<)YKf^+}!*m(iGM=q(amsB?7Zta!QIw%*LFTPxSZIvBvMKNwnCI|6W8)Ow5+; ziqlu~9$+B+-wz@V960ddy**0}uq^n&JoWcqpisPlFT^BfhJ)wgFW=*ve-Om?boFyt I=akR{0N>LP#Q*>R literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/flag_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/flag_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d09f9bf5e4edccc78db016f56ab999a9084a83a2 GIT binary patch literal 1455 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 X0b;7uEWxmK*Cr?>DK+t4f=KZnGGY~B literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/folder_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/folder_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..11e5e3b87ef64e4e3bb5f3bccd237ae7087ed4cc GIT binary patch literal 1327 zcmZ8he@qi+7(O^aV8;)^u&WMQL>aQpmKK45dY}~{Lokd)iBXOd=rmK&8R86Uxze>t zRH{Q@5m%f)h#46mQ->l~c66Y@6sHqsHjf|EI+ckE_MpdoyR-bU?Mv>yOa19`RyEZW5l&jiTd5O zW0I7SxpSiauJhIFPKxCPRfB-hphb#_Z!XHQ6H;DvJJ?u}ze4#gMZ znvx>in5;)NoN52xjP8Jq;W-UE{z_g6rKo5C%tPX@2VieaTR?>(7`6w_T@lrqmVo=b zwp4gSer&uUFK_7=$@zRjYwgz$_w|KUMxJ+ED#$v0JuJ-kmYO5I#tM>Cb4wqP53(x+ zV*yYjP+4UHRnkH-)+M(sL?G{6|1A?Qpsq*HMpK`DwK8m1!eq#ABbQ>rszbA{?hRV} z&C|7pR?mp6il8?H$J+cLS#ZyuZ+%Djt5uzv$b0$q-ky<8507OBYuCvCsx|j)H1;-P z{lz~;mp4EQ+y(GZPrHKF)tC*L>jbOB`=gSfZL{_Lg`5ioBVOGn26UH8%wWKC6I}*< z)SUHbX-WJM&_t~d|5=&T>SgtQ!<01SlpCd(R#`qXSx3%bDmo|ne$vo$0FVMLzZEC8 z60B=M?laNuLgmkp425bru6um47xTGGWg+kXu-Dq6Lz+Q7%BO|9H3;_FWqdA@PVsf* zL#YZ5UDs?{)G4Qcs+7|RjE+QDTy9dMHAj%3iz|1%Fp*Qz(8J;5)uf61a+ukbaZ0qh zkoX+QAefdfVy8!gU|O2)Q=+WeL|7RBBwhTJeY|o?N;8Z(cvgVHYGDvcC*b+fL^$fL zP*}C&nTB-@67`Z&b|T|?Zkw3Y@4ZU z5Xcj*@k_kwjr}@v3xc(pBM`^wQ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/gear_wheel_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/gear_wheel_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..06bf232568e87d9c51f6678c3b1d9b5ce03175a7 GIT binary patch literal 1165 zcmYjPdr*{B6hFJ)zF79f63YinECR7+A&=d%+<;&JV=M}_ms7efuhdd3v^xJ-^>?&N=rU zeI6C{sa{}r0PwctWoK^r=#;VOGG|dUJDlKk|DquX;@a+# zk=gKtQ|---1Ol_Hu_`4#!Mr-zF}m-yqWSwEKxP|NOSNzHkg3RPOeS5C!C+9F{B(VP zv#IONqum;@!Hc+WY#^;nydby6UNB2cO0 zfZ=k0>!pDJ78sEf-AQ0zkpVwF54U@*h!a(fxybNjbj}Zj_WZP<^mPTriGqFo9g>%w zLq#o&<1cwaZfHH;ZMgNfGJ10AZR;BUa0E$`D;g`4#n+v?7(!Di z!6E^fkeCd7nG%+U`rzt}-(vgt#f=!Nt~-ArJ&czX9KRNP^G+DJa|@O{-hU`z$RB}r zR;09*X7(}NdJv$ACTR|+`Cb_4>GE`$3?U4|c(4?DW0AhdLnA$!Nx|zt-76k(Qs!wEjY4i9%UoH28f{&ZkI^Z$@LcHjR>d+Di>B3se$eH8)9q z%&_1E|F>Z-C6Kp)wR1Z7&r3j04#UKv4@kL082-t3EnF^FgdOLRAyT2;#RM=Ii#Y)< zmZ}fUlSm+p)slP2JpDSvOs7$kTKN!1r%q&4B-lTNAdv02yk2V#LnGPJWC56s( zYYs-JaPfcL1ip^=$fZ|f$2-sXW3_O1ei@WOJb3m|C8+oeupBPTcsbBzcY@RHht)DJ z@J4!IBwAnSs>u23;b4KUBN@MC5-U}3hjIbmwE#T(I9#zSz^jM^uYVbWT@DCdasXcu z4K_v!i3p20@4En2qJs=Wbf_gm^e zJ73dyxUqQq+3LMR-@A9DX*b_2+4cO^Z|ZL}_Y(exJ#q1WQ2R4wtw)oAgqt zhZWiwrHBAFGXvixY;1o&Xe+aQwBR@5%mk z@^buPE05jSPPctfd7Wk14#wxE>?q0bqhk=c2{*yA1e7m+xGlFKu?>sn<>Y6d%`#N| E3lyB`lK=n! literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/gear_wheel_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/gear_wheel_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..79dda505a36b3fba5a098d23c22ce7e0faf97b35 GIT binary patch literal 2011 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/globe_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/globe_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..d96a7dd8e1603a9fa9b34b71bb3176153e9b01b5 GIT binary patch literal 2191 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/hard_disk_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/hard_disk_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..2c07cbd1d8d2e25b811a91e05511af0f647d78cb GIT binary patch literal 724 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV4Cge;uumfCn;e8NQ&YA|3wmv zSm~q|!!t8l@o{o#3gwzm8K{~7=J`F;Mw@AvC@>i_*s{_(k=F-ak$XX3<( zjja#m4(vPUjFd< z{Q`gf+cPtp_iHep?$>4l+6%Op!I5F#f2Q9*e}Fl^|NdpTdHNWGq5vnummj|v&L2C> zAj8Yf@cQ#NhBsfnGo0GHgW>Ro6%6MN>|%KK;VZ+tuiqKKdO^Bb4hC{HCv!+WfX6`EQUc1CEn(=wY4a1*6AAoe9 z=4>z!a5%`mjA5^4#(&j_Zq^@)jGcvN4+$+cUN@t#ODNB^Fei{hbMpQ+Q?7qi8@6BK z75-dw;hS=`kj&JiWBf>Na5%V}Mev7u$^Xr+^_fktr*TG~^)a(@&EFKW<@)CNy((QZ zl21Q2M4{9_D>~H`T=?#mH?RbP0l+XkK DTaHU} literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/hard_disk_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/hard_disk_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c0eea832bbaf03c4a101e013c97c448f0e9232ff GIT binary patch literal 1343 zcmZ`(Yfw{16pjrBgp1^XJPHyLd{A*}QczSXc^C{RDpjjRt%QgIJ}^~5I)Wjffoc>f zF=Ley5O5GdM%B3;ip7rml+Kb(ANtBgs7qBlR5C5yrm5Ond#u&X5_+MntTF{CDq$01`^G znT>LtrWHU!0Fq5sxkxu|ckDM-4^sZwY@iY#T9R1LFpmaQ`7Kwfog8qvyLhw@6OnE# zTt{%oVKF1N7D_k;?=u-tgz#s%4B+E~Fx_F;$dI}dtky!2sQ65gNI$e$+}k%!D*@_y zz?RjKu;_5$@sobb*f?O*RNU1rY40J(RznN`Cz~d{54b#2v;t(W$<5FyEEpI95Y!6b zwS17w+q*w$m}lz{%vk1&Nt#H;ny1uc=rh_KI0I(gstCxxbl+dez^%j00N|U6pcIYr zStHriZWJ+`ch54!5Vt}S0WvNGJ_tM802o1ec@J@U54uRHjmP@PC>UCKexhyqcl}~# zvhw;rM|=?&6owMfYVk}RZ5aC7Ax36bd6$q9X6HhVAY=8n$NfJCaxSu5b7+tg7ca+8 zgP{;b^mozGBahBDwREcgPIDzBIkkAr9Im=~?80DL#q-<(!EP~^Pgldv*?leFKb5+r zsnFs8u&ryuTqezv**)eLRBUS@+nWN@0T`gyZ5H50K4b3hl7{d`o>!+Zx#AJ1eVT; zkAo-0LV(b-Of$v0&gK))C;*{ZHUxF9HbKx56-0iBB$*83^hVW$kYkgv- z86hb@1$p~8P1X9I0&qv$V|CkvQM1ghW;A_H7i(@#AcT3eP&W$5slj-x?7%thn>odU zk`3o0y`xTZx{gF~0!vm%cZQ@oXKTNm46l`bHCl3)kaIoOuedLqiwoB~3K7;#Co*Yx zX7{qZC&Nh7QP*_*%g$R#VGXylv(xobw))HlPx@l*dg5C3s`_6m%j68eIxI1$8oBJZ zaYvwDwv0Wa`i7aVpKZ@8tY;P49Z%*X?`tUs%bgBA0O=2MF1dNFV|&5(JVyw)Ma>++ zB+sL0>nruiHcK=+G`?_JR2fz=Eg!ZtYmX}uFYjo)7;KO<(x=X?{g_`9mqOU%V7#;^ zg4iC2Htc5gr6}SqV=FazfQgHs*h+PC`ZHe$HYL>kCcf?3djP6s^|XMonqw)H zf{YvNE0wf;U(bsVALTYULuOrXnTAv^ZPJdgJKwFNDBSbSLjN7@Qa?M$f+sC@J>_(J zoZpToVu=-xKf+|y=9(+ogM#aOw`37wBpc^^IDL2F)v=hZ++Fdq@(m&M9p$==9~X&N5*WT9}hv01d^y@gD>!s_={?)5iricE|4pa v!a{KZDleN!V{>zaP*s@q=myQ`|Nb^CrZ#j)aMHNC-~KKpY7^%co0t19x(<&P literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/hard_disk_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/hard_disk_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee6964817c583a80b06f055e1f96b40ed0543a0 GIT binary patch literal 1426 zcmb7^Yfw{H5XU2d_~3#8wd5*7Y?0y!crhZWK_CJG6)Xt&9=SviELa{26DV>a)*vMc z2u?*%YPC|7ia@nh(Ini!kR}otr$Uq(LR73U1{ERi(@W?~zqTLF*)wNmfBWCvbGAHo zYlOpsr3*+Tl0#Hv*fzq_XVyFlu^%ohoFtL#c14A;6Sxf=l!g+QBmkCX+x{=hk$8F` z@2_?&e|p!a1p>^UlBHRcEAC~*^YulM1J5da=UQ=H*(7=HdbfR!j&8*i-;WMZJUuCt z7T@kU76yWtfI>8(1sFdG1AZohp-w&4RJn8c9INLhzwfY~#5C69fIVD0Tjt<#35|KS zj>g>y!)IYQDwia8!T?CqSw@5LMhw6~_X?yFdc2H~P@yZ5hcIod7+$?Bz}(*9|48OD zRAl1{*^EHrasd?B5)FArdpr?PES5A>H#O>x52yf43+hbKP5p&eUILP%L8-6bq@pNF zaEJnNQi$VleZEvV0&09R19`4V1!1tooQ4jkrgG5zo`0wY#o8Gm7K2PA5%r4RfAGg! z*J!Z@wDzsO_QzjcW;xH#7xpX1r;qtW581f34u;c$fJG+ilk|#uZ;v^f)$25zYsN?}51}!yt zLqvTbL5jx)o@42T5iLgHH)58xrsqz{!@3FHY*0ZTYe5M@4H17DN!{WkNY|JZFTY)1 zepf%JoSz@RwLS*kix0ByaNB-nL?B(aJGhmd7pkg?^{Zo7r~5{(dy_zoceAP&^sosK z6fTaq2X-BD@`-u3XniD-9{>x|X_`E)mSwzC zA`_OLM84P8hbi+{6!TrQL2JEPMW@)Yiqq<86@UUWJUGDL7ETL1w#bs@6 z6P6two9zYm?XrOF7evhmwlgoW%JPo*kLTawOuB=0D{~!k|D3}-bAkhHj2`246%b!w zhS26f5JLL1Y(sN$Knqyb{sv7s^ z#|1oU{L3!`MnnM`yMMD%sf6%-4D^X68_U(wr(ZxSuN1uG^jRiu9&M%FH<=!Y@V?)_ zr>_)ezgQ_L#fm%p5VNKGpIoHYTE%^y=Bt-V z!IPdW>`X?s8%qj>S7prAv+z1+`+p>ix{&dt6Q2z8sj>sf`?+R4i;N3}UL(lFi>F!q ziiJYI8-5Ii$zXK3iRz4HYHec@G#fm#cIK%q7QHjXRnUE}?-Lu7K98d|-#qG=cSKHY z?|w0f@<@!pFP+%drCvOys)6(mJt;7`X2=>N?I#+Jg23k+_S#Cg>RvUUPqasmh- z;P3M*VBnq=jI2g={!bN=8SZH$ccy@f{0xAF0k9f?ASW#fBqzp#;NV>`jxpj7_mUtk zdK-9zV(Sb91>7hQjyN2{(?>R_$`c_R8#*LCXS=Vbh#X_E!nYd#b>o@VOX(BGbRtdD zSsN!Qi@s4}N>@@ak3_@mQRMap)@hUy$;ueMmRL^`5rav)F2mW~bXZ4g>{_P#%BlUl z$m+6{r}{>-4?p)tVa;Pdwu0=%m~a!P&ySGkN&Q|Ihn_4EvW_slyE|mr zSnn#rH56p>$UHu2@$~XvIOS`!`Gx)V{}{{`YnI>5DDh{)G#u(8TS`IN?1n<@2@Inl zglrZ&{e3?~2WUqq>rN0Hsj1Qc=c4K3dlr>jG@+W9c(;rao%ys_|Jv*4Y`3m+h%yRR z)X%FYo0|!O*Zv)`|3Ne1a!QXI2Dt{m>ZfkbrU*I08g6&b-eH!8u%ktIoLqHOQ|U7C z>-?*a_prsD-dz6flPB})K2m6Ho+<0N^ZD8}K6?GF+~o-G(_IZN_4FF8_U>`jlB#C3 z^UnB9bKqer?ft>ZGE(ce&}Q4mKZ7i6WKu_HJ50XX0}^XYO3@aHns1!ZEf{%kFL>ve z8+x_AgPdzpkZv+4|63lQW!&4tT(>Qnwm;0F{yKkc1-4Zx60gK>C=jOoI%JYVy)HXi2vNhp`^czJnL~(y%AE3vNQIy;q`7$SLCN=GnfhN=NB3s{ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/heart_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/heart_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..20e3f905744a45087c1d74bc5a44abd7af0a571b GIT binary patch literal 1648 zcmXX{2~d+)5Pld40e&Qih5$+c+lY!aA)ZByAZl_sz@S9I?*X(bEwC z;2h2hi^O)aMG1Ip?M)8W1At!|9u~4S+tf2uHltCMd?Nah~b+FyY?fLFgU42Q@fZJ3jFlCAj7}pztYG@2} z4*m<8b%gRav5R+E&U>Fz@)r?4r3HGr5@yaI0)#*SX3RgLn*blwTJT|T7_=JjQpKKS zt1&l()>L+9+uYaM4YdXPkzAKiy@9WbJ+Q?Hpb&unCd^>)iwSfLYk{Jp7c^?8NJk)E z7J_`qj9BOks2*;BXpggG2Rf4(XbjkS9ST|p$3XMDZXnaS?EjjIw}oeHx%}O$+3|P$ z8ZOl<6&f8Bh{QFJVM3uq)y8Bc5j0v_{JfV8la#L<>Jn3;gra?jG0+dWv*9?xhNj(m z^sG=d1|f3%H5gF!bBQEU?1@w(-EvtF1~kzfvuVUt&6Lf=D}?R-PEM}-M}l*8%#8MJ z+x%_MzHB6=33c}?s?NN&OOqVx%r7}!E+Xf7Ug^zfNq^>>^o&jCZx7>&GuyM~@ZDs~ z6}4BWS!INL8jwD8^~@IKDczv0p~;A^suvumr%O4u)%-dqFkeh z@;#oF!Qa8kO1f2C5ZSc1Cl5w!nZqg<*Ew5QZYTra(K*d5| zPxMlXY6p8iC*$!;sH_Z#y3kEyOuPspG$%8Ih8q9Y^yz9SSP@_0np|zy^NOCFZW^6I zqleacdFfr8*(rEl42Ppv$}|!cb7z@QC{(qv3FsJVFKQF~R51xoosgh)9c_shO6nhz z%LJ%gR@<1jf8H%23x7F#)>d;*4MdpG97p7$N{ylEkSH3dJ8x|bFID!<=DWsW)n12{ zToI+Fge*13aX2xu1BBzs7kT&cP6}NWW^|01Xx zdR#l#eV)eHf?HEKFf((+4@vG3#BpM=x?^JM3Dee=b3(s31Tki3*#>#ZE3PM#M^P>l zK5YCY5QmACg(Z%@`0D5J?NA%|CHE0k`|=MOp|X2VD{w-p+Vnkn*1lwJ}AA5$R+e%cYl z5i$d-Q;tYf$L@vH=0;BBzv#C%pssYJPaWkQX@-h3JGSSmT9;Bq=PQ`IZ*aLWoY!YR z#u4L83XRIVQRL;9wqR`Du7u{dlgQH*s63MoL`8NZrWBd0!9yj6S zVy3_YDYqqukp;BsszVo5XUfCXxt?Orow1YPgs1y#_f$1#wl@Ez zTYV^LISwahA4#*87y2;c95(MKF)6^bI6pt%{#Ac0)@W`+>D`6K5gwyMC$3J6`4oM$ zYzN(GpI#z>X1)q0CF#k5q39} GllecdED>A) literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/heart_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/heart_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..36f129870080a3938a66dd6344f86a9e5065545f GIT binary patch literal 2460 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 Ha|QnZCrAD% literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/help_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/help_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..60613de7957f5127055a9b9a89fedd616c13b0a8 GIT binary patch literal 2271 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 YnPIY!=F9-uOTHk!r>mdKI;Vst0Nr)Dl>h($ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/info_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/info_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..f597d5995fab7027dfdca340958e00178112ba27 GIT binary patch literal 1632 zcmYLJ4Ny{96vn7m=?k?&p>_m+(tZ)crP{WhnM=~LMp~PeAp&AKu9>ZgNj%iFG73#M z&2ng)YHORe$g+P$0j0v|cl%wD%4kLlHv~a}w@+<0SQs2O6+pJMIBu#6bsR#7zE*I!e=k)6<-Lq){dJ@2?(ZeI6x3*Ie-fg0zw9( zyahpME{D6;WUXBTLJ%wz**_U>^}>bW->;@=viwJb#44rvL;2f7j|^^#zD{7BI;A0s z3Y~=UOHzo}lL^EZM~OrNkwEa!s8rX`u)<`uz+jrho#AkpLe)+1!U>l&H&e*v2?UOTp(UmA=BcG*-$3->Qtw=*Yp);sD+BN-y2n^8abij+50z8A| zg68I;Ydz7}(mDFnF+HOn-kL0>PLFxiTjZEmva|jKy+j~ob#p$O5^?-l@gV_k$4@+j z0f&_f^1Xkuu<@%qXNSG3@HICiyLE!4vM5#)-xg|axc+t}B~9_?!;KxOT54a19UD0& z36IO=vfaqUC`SP!e22rQ1b=!KJ0xN4#&MLvohe$9>hJuxXWz$Sl83_A z@1D~BW<%h&IC7R>$V=$l6^_^P(I|q>r8p^h`h-XOH&$+GZBGvA<>AAo`xWN7qv`Fu zo7MXF>(zbqo0PCe*=+l}BvzR#AullMH^o*uVd~DV`8nG2fOO($`T09+k1ETOYD~Qb zBdC{wAnf4^53YeEw3;AKdGH~e$2Dx|x1o%dQz$@jnjxBi+L+e7bhmSTzp(`d6)lK> zE942dZHH}L#v3KU;b%{l2HPzVRxO7Rf+*P&b;;wJt5vB~V@Cy5N<7BTPn#$*@B%JX zoMWZWFS})#{$1i3W>pyNJ#Q%FdLxH%UNO%t2fAO0Z~{Pu>W3iNHBsIeGN?%$Kwx~_ ze9p60 z(Dhr;DwO<8DYsZSG;#V{F-q$zFP>8~=gKGZ>!plwd2L{e#KUzs&7|$iRhOj2#SLZq zSL`b*HJKYXfR@5_O;psr-nMI#=~aK`{L>fLG~vl9Je$Rh(;ShNR2v zBbLb zyvofAm@0PIvD%Q4KIlck0Za}K_?tu`bS*2?^~;KfwLY7-so@*DA}c$`kG`m_esYBU-(`$j_jpwkv>_ciEWLM=4{r#!wHCZLSIR6xiaa{iabQ$lEE z(ZfarL0}X}?a1Ik5edYHA*j@-SZ&1Srz5=&U1BlnKQaNgZ`<4vpZP;V++VTWlK%j^ C=K@y% literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/info_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/info_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e12690066d8233c3ddc0309f63d37b28621ee0 GIT binary patch literal 2259 zcmYLK2~<-_77cQ zy|-4aDOAY#0*Fs}7^_x}u0XGid9vDd-zlfgS54XT{%#~F`he5pcU82N%C46<49x4Z zFGl1;2n&g$Gwcu+UCxT7%jq$6B$mlQ=m?^277CRb8Jjc4)_bRan=DlH*I*&oAXcr@ z_@dq2MA+$}W@5C9rl>8%uRT)ta;A|%A`YDNXiu)Lsc$)PB9Sz~C6h>G@}~VaNyidN z-pU(fuf!W9vR13*DkeMgAfVUBA#^6w?#x-1Ts|199#>INo(#a1zv^0*qr)@~0D3R2 zPF=2OZ1tts=;lo}4p|y01t#G>e)-tjpZkeuXAK+H>wr`^ z@!ki`A5Q39sP*{wQKyB*n7f~O*-%L^RnZ;p>JpT@%6{$Z1)?*1TAQdZ5^9f)=gT@} zrCs;G#6{EYC{6~R!$0jpPWPP@IYleh+o;=Pu01|nkh-8p)aI1CcovuA^5Rz6qBn$~ zoSKQWu#XcIr9s2&b<~t^j}znW(A=s;_7F`^B3agYdneXWF9~#0&B{UF86I1PAFQ^Obn2W0xz3Pf}JqUl1tw$x7Kz# zqZf-a>0Zc_g`J?ULQjk6dd?-qeXSNPR8?~DaCV5%h{QNA9ij`Wrz(B}=fqc`Q>UT!j9F;7COxj;dCTVkAsbRuyz98wT zj)kS$_%H>1P(#7HmX*P!86bBT1M|jMq!$Ft!YzWt7uBHqcmaH@B zG2z}}f~I|v?#z&uPr=LAT~@!v&J94t^F{VJ0wfkno&k0}bqtrc0r@T56}MYt|7&^A ze_mM-WIIBM`;QF@FTXb4=;;nG8=M`cdgP)vpxV`Q;!sq_w($}!ZpZwn%2Ov-uXf6? zppGO^y>do^-#1~k>c8@;CE`hSH&41e7~I1*q=U!8r{Y}S@93tqaX-0C03fy=u6QBB3m#TLGy%w6wHnr+8ptHd*z#l{+ngf+c-Zw` z1guX_YgKa3vz>!&{x52ZbcsLc?0m3SlpO}u>-90}<5%oNGaK~kqdP_c08qRn7;^Ch zu>Ye}R2d!hi~s+;v6_IWqkl~9TQaA6&yXzx)_cf26eKHGnHbl=}sv5o+WzCOX&n)WKN(sWI7NJt*yYHm6d^-_a5Spj> zip~?wkTmG_{G!{&x0Jn3{&Q7ZNpo;E5BLkD7d%9dg%iNp6qQkWyuvMzU9H$E=enf> zDjQbeoxH80^-(|FG>ddJgbd{VIONV-a(ZRL-72@mjjHUBQbk|qVNBoRvv9G=>^X~b z8gAL;h->Ph`pSpugWG(mx`cw!*$f|}+=1>%`k{9XDb+*v8Dototxrbtig;p0wygD1 z*jTNP$js+9ZV4?4&}uw5M{J$+Y1qbseQQjyW{58;?|ONpAa&E8w++~~JYGm(mSUVo zgKT@#>Db#P2G9=FlDwB4Q+l;b)Ou;t#xoTi8X}*+_XtPlS@$X{Wcn8ZKvdRU>P9QE z6Ev_22kM7kWtWg4NK1!^0v$aCOfE&Sguwf!e?MSuveL$UUvjv4z`kVjq?N19IfXTF zFNG~qR&1U4ura`{zw-i{ZMIzFhNK)ik?zO~*2=?#z0@1)Qm44Z+mW!50PK z*saDEu|)atBa0)W`IFL9K&4_uUJt5TK5tUyao)k6Y`oW1T@S2g1mJ=?RLnyW;gEU$ zwE$1?T5*PWetc8Uo1NPu;h3)ntQn4ein>b#_a2*)pMb^hzYyasUO!3pp;R7j(=-&0 z#5#Wdc`k>1uBh(#uX~^0^z5#$Sj`(fcy|U~J!7%5xXW}QDc@&PpCN}_2B_uJ`eF>` dCz=^%Q`}&A)xZ2?ujWqMHwT4oxE_dP{{`BZZx;Xn literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/iphone_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/iphone_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..82199cc14fdc73c9d1cbdf99506a3641d5bc0571 GIT binary patch literal 780 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV7lz-;uumfCn?2&S@X5NPl3>n zxd#sa>6edvcRGGq|8KhudNYJG0vLpufm;6mcXIU1KJRN$^z+;OcKLn(>wi5J5370d z>Fs`yaKlSRu%aYKvjfv!XE)86qZa&lPbg3M{Jp6OKoBrlEP2P*FQUvq(7Z%J-Z|P$ zW%Ap}#hjldB)BAi0H_;ehhf9p`}+U(*Z()XQ};kR+={XM;Les{Cu5Aj2de`0cY>i_>s{qgg)_+fn&eW+r?2haQG z^Vrw_OZoBpyFRnLv~jZlyVI=xUdf~b=Rp#GTDqZuYx>~2ew(~~ozb7)zxx~edpjLF znmJE0sI}Dto&V>@$H@=XCy7Ii{dx$bxvnPt$M5(2KvRXA6|9ZB80-K4P5klkvGw8g z^EqHjOAnrx=hz+i8a_W&jwuxd~C{C)raoH%&ujKab5hd+QM z-`D>$iuv(@KkG$2TO^|&TUuK^&;0*?{&QT0db04KsozgYqx5s4&nqG~Z`kPc=l}f1 zM#i-N=kM1`>c#B%@}FsYmbni<*oGvROXm+AIiiv@;rd;z?=R~FUhj{u$CqM#Mnj3o7(zJO zY71kyEye(jtqa*QwRWGU-I51?|pv1 z@9)oh*YjreYnkbJ=>mZuv#L`27W|_86pP>*Y<)Q@5D5RN(rVs5IixpErpj{P`{?y- zumoGYve+1p2# zQB<~YKP5pQ$X&p}bKd#+o6ZN5TWtgYZrAm1#XAamNA{U4=JV%!-CdyM*Wi}N_*B?U zl7yU#v);)tP@js<&z7`ogeVdq)I{g(uCxT@40zewg%$QEl0K1PHGy)mbx#-oLL_Ra70)!K?B+@OV<(?CFPx_(xL92@ zBKb?0(~;xEVr=9L?RBWjt>XWIS3+GE`ufavY5P5>iaAGJ$`}`M(BAxjCRvd@EeT=` zQNZL2i(XV%F)#7K2Fj1|yMAEF`!96|tyTVF{3elyLGRSg*cb70iMqKpD- zR@ze;@5uS?NPO1Jq^E~gkd^OLEq*3!sHm_3@Q6(w&`<(!aRc7iU<~3j#S%I=O92F2 z(tI+<_mMBsnwx=fbjI~iBj3|c0rc{?A01G>pDD6YfKvt5#VtRM=tz_cb{ms6U!KBq zc3iyUF`-x4Z9(6NuDoVj!dnK4<W`+cmqjlh27H9+je;M>P)wfG~!Wkh6d`u09-`P z(hqITIuZ*QWGB1lQ~xt)Qr;=9UOFyE24YxR+Uh==MUXPr^ggrpuyGbSjcrW zfm^N_^hV=7T(1u`>h;^RiwEkj#g}To3rEUU?soKS;mG^4ww5oBTv=MYd}|dJvz=uq matvNHumLB9AP7jjGofH@I?!cW+R6V11XTyCwO=2=E&l?AI3&6N literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/iphone_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/iphone_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a7983ea7d67714217230dcc9c4b0d47ab9177919 GIT binary patch literal 1446 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/alert_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/alert_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..06d84a23dbb57eba5a65dea4b583f632a04b808c GIT binary patch literal 3156 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/briefcase_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/briefcase_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d298bc54ac8730041f7fd50e71474bedc0bde3ca GIT binary patch literal 1301 zcmYk6dr%Ws6vhL~OIaltEeW*=FxIB6kc2oxO0dCzc>n?mYHdfeSrFRk3}K`L(IP94 ziKtMZLajm!TB}l9AGB4hXr`{{sHg>6u?`g$rBP{3Yyz9eCbtU&#y{@fnR9>lJKs5b z@7d~VIy>q0RXyWJz?1& zFidh!a-A=mG>|F2;CWqKW3EnW+oRE|Yc6=X$a_8+hi*mZSbpoz%wpvrT2JM=+a~ie zID~hpw}Y%E7!dBi8twLy+W1(Ge*EKD2nU1r7m3vo#UhkKHj(CC0ql4|G^(rzVmj(7$(30xOp}F*0cj!5(6I8=^pjRt(tcD4%dG6 znDLSn^#GUqO9Ei4j=bUZ8uj6u5QO*Z0NX>kc4c|)nlM;nrn3Mb>&f$-N{mttxrQ3w z(FK{zLv?X6cdW1(Ysq(xWz>~7Gz6YJ2!L65Mzjeqi*jGTYP0pQ3>nsvzr2{saX^{$(T1JnyI+W*Ig!dx1kFY2 zn?ezZr&JE4njH7!m(j()Z_Xr$m? z=+=t<&THM(q=6Lgum~skwWWQyr5K++{M+^^&2cN8@jY8{S0c>#)av4JPUgr&e^Bqm5J zT+uSYem>|<%{*Nn5nOpTG7u8?ZFr@NRXw8liHS@FaUNC5&&DOTG2;r?=l4B3XS^Yp zyCP7pu|EhRVhr4KKYz3SFz-5iYzr2qQVqw4{N3~Z#TM4L%a;@kM9LGqwZ5>2;B~wp zjr~97DU*KN*X+&aGTcV;uK08&q`|&a)tJZSHW7Dqs_+S#o%vHQ+#&dR>(ND(7>E^? z>bbR1*KXWRYkyC68E9u}o|LAUb#l498>R<)_~=3VBMWcx($n|5BH3qmc$^`0*B}-4eVhI$uj@ z5jx^kC58}mh}cITw22t{usY_ojB4M zK4cN(8Kfj8d@@Q&VVa|#q)?VC+wp`lKb2bBRefE>eC7hDJ$vKx)VS&OTohf)2Q`Cxq;;zlY;sVMh zD$3%5%Fzl&)V6MUBoU2bOr%w`tpU;Mu?VpUga(*CfF$DQxH_kQ=@nf=MU7=q(0 zM;s1E;Ks63v6C{n@G!P_Z(DA`;owj%J0fj+ZI*}yJzJ~|pZHi6182;JL%USVjDc(X zOXBCw!7k$f$ci9aFe4}PKOzLVE`hwg9UyPWRU?IcVYs*f0pN~syCu!}{F|=NfI?<- zeVKG@kgRUw}_FVa`*a<8>@&yLfZV!QmNunKGU zy`&tERqiRUub2pL-MSLya57<-6VgNyW9|UvPMT#I?S(Wd)n-bLX-C50q|eZFGiHOg z4u>NM$O#++0cy#xIvo~z&%t2f9u$u?9{M_|nlEa6fVTg8ST3(F=>Y&BZ+T)66N03V zP4S4zY0fCaMe}FXe}}dJ>8gn5UEN!Btcw-Xs$2pl>?>tmT%@DOl`PB~2&nPV_xi@& z#fOvkTs2)JPs*jZ*QWDc4+x*;QS@~;HR%2OIuu3K=zXo;48kF87A70VS6mFhiZ3Z1 z7Z|lF2^NM5AV_I#dAHRnlOKe7wmT2EBwZztAJ}0r0gz@;I0>b(g=(AVf#+3wwF(q=SD=?}2S|t`HbL%+gN3N?zWbip3&_ z`HKjs()>cgZ3m<*edc8)m z@U2JbAxdN7qTIiO7aUThjM{4mlbI$|waq|Th{o*(xN~ifZfNxt84G`@s$h9O+db5m z*$I0QuOFNFcy{KSz5Se#L2#NH@)aG46x8py#Q;#N#b*+B48x*!~XP0BzV8e1a^#-_peF^zR4DD-H?Xw#!T z^KoC;vPm!~XUG^XEF<;kzI|QUHGQi1S9S_M?bywDHz!ZB#XPY&MbjskrCO6&L|J|= zOuwaZVWHv76~Peatg>TnCnRayO;XF;qRyr^Cz-M71AzVHp{;9@sl@T0k0Y*G65pVG@j&cI6MZs-w!|%Pz0g1;9&yk6 zki7G?WIx4p+F>%DEO{~2YAuse>Tg>#<}#gJURNTIh;mK6o|m@~>wE?yJDX-{F^#R; z4kngruDrQ-vgfgViEn6m<=Dufii!$Xn^IW3|>a vcK;(3HG=_@stk-_pa)LUNRAjsE{5 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 Ttc}e*y5SxX8pC@S!Y}*}gN1gb literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/calculator_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/calculator_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c64f360543d3c234875f96360d952239046094 GIT binary patch literal 1579 zcmX|BYfuwc6b?orGMm6)Es0nIb;KfA61FqqK#d?+z|kUL1NFfYl2BVKh(>&%>jDiR zD4>IYh*3+ewJOS3@j=O&;-@ z=_{`DB4-wh#f^*zi-G^1_ScC6zk3fIddp%tjzxxr#2q*%!}u6nWC0)xdv>$7Hof=m zi@KqKl=)H)hr?U(-|p?qez$aFRcf#*T~9xf^wkA3;>QCoVFM0 z;=qaMw8^Za10HO5cMmp-E(quK^~sYkD<~icqvV@;(@0(aF)dP9D1nI|MMbC>rV0wW z=ER~d>c@3@ab8}VC@nn=%><*R#OdrxsvqMxoQU8x~{2b!M!x4ZUsW{**ON%;qZ)D!iPgSf!;=A&bOwb|NST;;v?*3-1T08hc>g9`HYd1AVIbc-Ba-NEHE;|Kz9v@a@W zCVH#m%`oeD?ou}TU=`IRJPEh8F=R%ToC4jS%sODu%;dm*g8|!msr=A}fsDL+@r$Q7 zLw#OYOvfiucQ!YfO?uT^@}es&s_c<6@aT|l_Ro*qJ_?#?-}ywMmJ!j6E!Su=X^?aD z76d_FMOSDLgX9jHHYPo_{N2TTVgjV9ArK4XLID6^*Xt8;!BN1pn}=Im)KcLRQAE_* z>co0lPqs5vnc_PpWLF_XFgm|~XK#whfb$_oZyxUQS8pi0AvzbNM>aRoWe@*4=5`Ap zg?<3WY)0$^y9$@kK!S~FF%PuhoG(vMpE=_+b|Ip$;n3p*Xco=hs|G!X~(4;Y{g5RisIaXaSvK9UqoZRBn-=vC;FN8UtL& zUH8gj@<(tcIG5k7E81c*Xn>$Q5TNw?6BYKMVfUpX^^lL-QsCuqr>=WQ`HU?)0u|em zqGQR=-@SRBa+lHKlK#%gBEr^%s}m*S*;8}E8Cvh@f6z7DsMjFzO$;+p5Fzb);n&p3bbWcg?+~xp5 z0}lQ+zvx$}0Z0(QOU&mBa5T>uTQI3N557xQZ>`(m8aFSpcedOc*;>ZNnDa|ZOE;b+ zihd9t*J-r;){m1FrxjMXY_!zid{yw2LRQeRl9H0x9nABW?b0XlKEAE!&Am}@P|2Qc zO(*MwyO0cFy`nREQnh%y{W#%Vl*1=QCOf56D$igtS^sZ7(wBGlR7Se@?1^LHU&Mj! zyIv literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/camera_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/camera_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..be81d3d4ac55b2dce672619fc948e96b8db2a2aa GIT binary patch literal 1599 zcmZ8hdo=pl+t zYb%aaCT*KX#u$$Z%~E+cLu_NIjD(3Xza35g?0(Pre(yQo`@Q#j@BMu473}caVq(0^ z7yw{G+e!`4O3cDGL}|}~cn=i-C=`uK2}~$pGjHIvmjH%~HtPRJvK@jXDK>f@LbO~j!Pr67>8o!=ktF&moueUzE=<>^CCDN_Ne?2 zJgrHm6sKKtM4;345!xk@lgu!O<-KCNr*WR!Hy`UddbC34$)QzfR8O`9f6b)l5q-(# zfzc1V>naNxD$l-W7AFT?OW66@B@t1hN=?;FkNCZOHNDmRNKR?BTDJOt!8VuS{?f5k zwW=EgssEbuMKyNo+crdZ1dC&5-|yy; zxoC%Q907;J;c>WfLL&U4RXN`r&cl*4lvOY;_UBJp4W1Yqs}57a<7i1=e4%ydlSH-m zUQNMTo%0j30rwbGYIfMOj^z-kR>V?GjoGAB8et_cyoqnFmewi9NeD@EmI(8rV6Lt_ zT<*+MxYiQOg+jb~b}F3`kbFtpNaKsUvr{Qag*lXM$$~+cv?jCIRsI?A^^d^zYNI3^ zAd3xXHilPLvX93ai7AVsjsWqxvZ5T7fSQiH`^3s`Q}Oea+<`ZPPkOQpk?cf`Yku+A zZeDv>hJBl*J@uyLFgKtZksIeH-!ClAc(ltQWb&jZA3xA`;Zp3iVCT1sne|?R|<|GWatCpbAzPQ-BAzD#4{p`N%ZU>a`F}!@%kGa~v*YlC7d^Tv~ zt;I1>=%lL?kxq3Z)ixGVH&;%2iDwBa_Ui59@0$hua9dkugUX`5@hfTQ(iRhKcw}*N zv8{=HgPCBO%OgaSD;~UUOUTo2dUU%ar1htXl9ll=#_n87h|`eyp2^JkOj*vDWyeE{ zA^O^!nuM|`w-5Z)uDUMzGN~|=%wSz0ciVmlf*97aTE#&oThpSPRFEE@%gBJBv`^aJ ztErNfA7}|ip|_)Xqg6|JUH3zY{4@cfzv@^%tL4gFXql54#(^p$lvkt^6K5Ohm1BxR zhK?8P0z&)DBCM!pgJbh4-j=LTynBM`0%hA<$CT_k|H}zq;KDP5eKTB0dVLb-e#*W{ zIXcBag@%Umq=h6RUqB#YY!W#;f;3HaQfXVATu5C*hoYlhpt9&z$kx^cf;D)8J69tZY|C#J zdCilowU}u^V{=%n3m+r8_Du{}RJMN02a|H60}-$WhG8vIS~o=xuIB09{C~zHfZOKH9-i+96bpKqk014(7c==^e?axL literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/camera_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/camera_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..389f59f1e47e9466753c9bbf6099f1a79a704ac2 GIT binary patch literal 2359 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 vldkp`6WzAv&UxqasJ@RL)YJ zeZFF7YD~_oiNglnhdx3Z@N)Wt9?Y(v#{ ziyGT2-t9QU6OOAZU3eCfN!TUx=BY4q^Ia|qx7BVk&gYMNP$u{_#>6u;B^E!KTW_h~ zjwv5aEIN08aD`4>92qtV)X)6HI}e5RZHWSPig{v#_o}V9yma%Yheo#}yUM)xW@U={ z#oYiztB6~%GLE|9(qH`BCd#NuZ_~y1+V%Yo8fqU2q$#kR2!x|v<`6xK9P=tBb#~lI zFirKPuWOB%(kXVWGx&Hkmu9W)5E#Ltb2=Oe1On_YjfUfI<_hEa;P|XFYs9~>YE&65 z>4k$flc1L&f;MhHz|7pCzAa>1cxmbEy9i#Y>T)eDO(51`aG-O>K}B8S9(tswXTITa zb$jfA1H3Cbt}3WExIuN-a8Tan;wIm>@V@wCOy@Z9BjC z6!1nUnrsow4uW=#e5xB(=Xa236ayMc3zKlPw=-xOg_X=3lRMnPmUc;26fr z&N<+`j@hSov&Jtw#dtl?OB7pn231@N&WO4)(f3GLyEdM^AhLYab^oe!!L=EW@1?OR zf>YqUG?_SrhOw+b1vOgF%Y>c?wxk+}7DvkW` zr`y-om*?kx?gGL|ct zFfI9y3SVAH^631qW{r&yZ{60+1tEK+*?9!gtO|idnr(iq4q>r!h$4X?Yoq`Y13POL z0fo`&6%3!1>cvHL9Q-~jL=G9k{use0OAlOMgADZECwfv?`{h=n!dck@URIj@?weAY zjz>o4=jN`+xnkoCL-wCDjs1a4jv>cMFj~(c4i1Z@5qlxi5(k2r+Pnwc1suFS1hsRy z&)PsqYZ9v`sZSoTr$Ob>6$XO=D*z_KUw7s^a+?1y`G4dRU}OU%Qh-7E_|QndQzZF% ztDtid2q$-vW}ktg;HEn(f}jeZV5cfjST3cc$`-$3j#pn^R|2b=pbVD(lR-mT!f^UD z`@OzHV3f9Ns5ab^9sp2a1QY;9>+;ZXB8UzRxaWWzZ(Dj%O>X|C=p2x@|RsFrwt2;y|^m16iX_nSC56a}Z*5{axr z2n0_#xQND6GH?HByWloBC)j_&8bjoo?YwH=AJDhP!s2E8UKVR{#hU9VTyVQJ~E z&$w`zzzT+Dyu%tjGMr8+RkAei3>U)#mFSLP-Rz(_eW+`Ma;jT(BQ>iZoUZLfD&fX6 z4CV`d-d%pax29%Lh_`KS0l!WwG6i$Tg%;Vc7O+f6=AG5Tp?fIOft4(i;mX~Y+LD*% zemHnv%HX*Y3RN;gGenx1>B6^`0D=IlepPe` zUphZ;fHc#!&b+pbAm|>U;}XOBm%3Yrv+rJbo~GxkOqJIW?t{%fZ1ut&iNQU|ahFOc z(GtlC1q$38xKL9bW>&_b)8PU_ZQN(iTDV-WP}EV81O_moOIKNJLg`E;!_*>KtvAmSGtj)n+jps;k^sp9kNDF&0_Y||5>bb zPxw&_zYIQD6yf-2Ei& zAViv|1j?aHrYHKgYOH?k<>s@vL8UDhOOULSo;+?Vd~OH;{VP42OIan8^Ubcr)7MwCFT3tovh<9w%RVsbTbLz>d}4l7`*OPAVVc9QCtv?*pq!q21&wGv zyve=7+`AB5QF%UO#*dVpJ0O_TIW|6sxo9e^tkP3Y(PbZ*g4UcLUH$flyQ zOowSYI3>@_z4oJp{qV8iBWz6lEcy16!|*kCnfI7#G8t@Tp%t_~&p{@;QGE1?(EUQ& z0#+ z`lUk~?I%g?L=1cEv`v_xF3>B8xriD4$x8V0j<=P z3nBw22H}bKuWr0rS(v*M_4Yr%tn&*}{9l`*frO2dp)WxGF+57hiaVAJ-7bIn`${9j zwQJY*4t*}g^))g^4fNhpQb7!oP-TTlXISfa_ zx9u&c;HihEjsfECEhq}|WzpQ{fmT6t<98uKd%|o*TFPhDr3xlKVqyI!j&lm4c8ip5D)QY Tz7;yQD8Bn`-A!V9k(vJmz#Bm^ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/door_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/door_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..55126401f2b4447ff218cb28c9efae70e926a92d GIT binary patch literal 1028 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U_R~X;uumfCn?2&`MTZ_`+pxN zySGi8C>hJe{^R_I|NrgT{Lb;4n|z&?wdgbxP}l$eNsi(_fQsCrAL}zKPiA3eR#s8yo;N&a&hYTunkCbs`#?Cc;^P-{X64)UYd%4hWicuP ztu!`PX6EKrcI2KhQ$n)t->>rr&UM`dxe{#CgZumIc|gF&hlfWe;3mJkVY5Sn{3MPU zGXuXaWQHh9auWaXU;dGhn3x-zSeiy!Vv2xZQewc>c?T7gjx;G9KXayI5x*?dNICX^ z=^HmVnHU=z8g1BMWK>f(`SgK9r#PM;mT5WHTh19-)nk~sL5N>2tz;)&DO@p2@>20?fv^$_unT*QHJjO;G zo+e5k6_ZZX)QCYPwlH`{$l023u1<6MB>@Cb;SCHz(|UL&9O6@2yYwI5sWhicOv%Pd zFAuXomUZivPd*X% zla&vs2^4P+exJAJ+5i7fdP35plpp6$oL#V5`N)U&^2~?p-SRBjK1=S9{Aawu@XwE* z^B)40M(9EvB$MnKYo6;KinUGqnQKZmMssi%eUF@U+DNnJ}Bn@@9*;; zKK)#*@hYL{zvK-GU@|!V;jws`Jk(GjmwL&%|Nl-OIC13QfdeNF9{>UcwU=$7pMeQY zQsSR;&4P+_67w78b$`2I}8mTtorl+e|kc~kHa6{zc+7-xBqYa=ZGN4XkZXJZETo0 zapKp<&-e3)pMRfF@&BRz;ph7Gk_AuXc|N>;A3vi~BaRWQGAS`3At5a(=}}@*l29@b zCnf&+`R_}mq2r?-R|d|H^5-KXBTN7P`}_L~Fp0lU5QAuAW-!Y){VH5m;sLVI)78&q Iol`;+0PvyBZ~y=R literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/door_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/door_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3785efae5bb3fc2e47b840c904c9b0ede1d38e8c GIT binary patch literal 1261 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 G=KK$th{ELn literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/download_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/download_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7a61d1b2d57f243108031cb2d6b827eca9ad1f GIT binary patch literal 1491 zcmX|>3s4hR6owN53xtIv6eU0_2_imtB@%fk5|Hpz5s;S!F$v*e)f!s#XC@UI$lUHsN2z^eR+^ND~j4p?<0%CG&xa@0m^dklUE^B7&;S3!t?kFqm zK@NBi(91>YVM0{BwR2Tlj^m>~{j#D&{zq0{O0biUO`cIUl$;#lcnd_%F{{p%bLJ5n zop$-L^4(K{@C?D8#=j>Uzj?T2P$Uotu&YH}B(3KDY^xHf!jEdw95>P!S?y27CyM%G zY^9=rhM&~?GU18sueAI3FG)_HDwz&VO`yEvK;aTYD;$YkZS&FRAalO+&&;|7NQql< z?faya z1mM8=m!KGWeF%brb4o=p4C_l3eXU&aX5AM%Vl{8y&);K4)*&fu)iC}?0PKCbbFZas zrTx3qm?Qx*7_}VqbB&ydlK=#+ScmXb>IJXjcG3evH+}4ZwggpU;ye}*=zvWG6t@;? zOr{DEK>6MPRRLg^AxU!lB~1$|1m|uF1A-DQMi)^t+kZJiS*u+hQfdQ9xG4}1BS4p; zLg}GF9o&NiPMWW#A046N3u#0nX>VZSsYq%_%dfEm!S^4OlBw-KY*E==AWK^`=16-BqeLW0DWvh814HlOhHkH?iQ(ZbG zS-ypRk0P_fFFV1m4^wxq!-ms`svJ6sT_=+Tr+tl|=5KvwhuLDS=$hJ={lT5!K!F19 zyMA8nicvwgD5MY#H?r#d2j5PocAIZMa+r5CVS1uv6SY&kr%?wj-wOT9$YF zxaTe7xiQDt4&w_0HKjoL`0)nc+YKmKl*;nNl7a~{5nXTwS2fHBy~i7at2xbbsQv{p z&&S3SB?dfNGBxR{MY~CKZdQ|26SIeevL4`}(Jb13JhpQo5w;b2e?f#2?uXXOXPXg} ztp}|Iq!k*I^ck%AIwoA_=i#BzKI>B|6!w#QgA69QE-RJO*=$~#N?9h7FS&;j_0!H> znI^Ud%+B8N0&hyx*U1Iif&nE!cb|0UmQ5Vk41%BxPLY#^Bx&pg+&r#HAzG=lMgJcc zz9X%s=!Wr^?t?9;-?%53J%8`^?Zxs+lH*Bh%PSe5CSJ?1e4>n;gO)C7is4Uw^a zJtLOh@cBJJgmpa$WWNGUKVLiJ48`_Wq>pB~i)iSj2gl`cI8rv3Ysum9cp`e(2K9?I zKZu)UcXmsaAipa|C8UF@QN0LN~&5dZ)H literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/download_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/download_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff1c2ba79ff41acd14014b7a72985a9a1c671b3 GIT binary patch literal 1893 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/edit_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/edit_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..20023a1fbc67b08ff71fe98f50745178ec7b2bc8 GIT binary patch literal 1422 zcmYjRc~BEq7{^8um9CSyE|{*@A}@pm%cY>_wr?H zmRVR>EcgG$cR%q4=f)B;@qCf!rMIxKJmBx^9h#&N2}-sQlNLBGy4rJQCV2TVmm~i~ zOc*oDnlz1!(d2rKbdQ|xd4nPKh}iXJ(B|XX(uddzVy*jF&4ZSfN_9m^2@JO*2>dq; zn~ZgefmxrIy+fSHu21Hv83U9m`-7)$_KnmWh)|{ZbB|m^r`{TX&lL*b=B7;ma2^1% z?AhO~v>m)_Wk$48bVUcZ7jKWbms1#$=^qxB?(NOXOwE-Qq9gCDR$74|`0Uv;(B){} zZHgJumzEgZR;crOI#hO@0joFCm2@ZP7VOEf<45J@Hh%UJnK-2AeURhEEQf z&f+YZR~9k)vF4GEMB4Y!*48=0*_T&~^)osO3Bh&1kxh2g2Fbm4xVgC*?og}Y){RQ~ z+FNRDr2R1YiwrHrOu=ZO#Lx;nG?J2PztB*H&)0`8pf~~NNF_r3%710jTb}>md?ld{bZJT50z^ugy0VT{aZDD z`?-W5?;NV(_~u8ljE|n+Ko!pmzqHCgQk@_Z^-*X^S?`?CP-s8H!KK-uirz#Bxz|G+ z$@?r+6)*}dFoiX>WPCbMSNrN<{7EUxh#M}W+D<7@%zhwFGK^WSMsTIHXJQx9vJ$7&d$3 zRui9e@9^DcQ;9++dU4=vW`*0%)064wu>4Da$)i(E`W1*=+bOxG#(~hMb?2Wf$d*R2 zrcfx2<>e7)Ac%}S5qE-_G)@QhRvQf2GEY*IwnwvEjWW=Lb<>E6qS-wG#&5e85*X$U z?Aw<^0i4e6WZYPZ3@DudGoo|f|;?S zKzJqZn11@5C&`9oBg?FGLFBefupxOCIq?!;B6qaG(rb<;hyDekB9TBK$j;90!g0K@ zsXXKl@X+DksYUD*C9G1Z=uS>8f~X(cu*p6aRK?ffLBU3w8)X6YC_t3CZ=xuI0mHD@ zVzHQ+^#0XS;uj{#uGD$RN=qG(g5DV7*x#!~mA_h9MGw|i=d6+m7Xa5gJD--m>DjPI zC=`+%9UUQ^rjg%x0#&{wtalJSFj&O`&|FC3()%i-dg&S0RhC)nj~{JPZ+43%cWr&V z!+ZZZ%yOJlaMiO`R^YQle&z1P$Dw=r;yQNUni`eJw^SAmkJ(}g4XKn}7XoU!7imD_ aJR8ZPyTmOj-6JG$j@{oc$hVR!Nc$gtnx}RE literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/edit_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/edit_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..86486ecd120077d4b25eb892665b5052f15826e4 GIT binary patch literal 1704 zcmZ8i2~ZPf6pn^7T|gZQ%QeAxAVo@m+6fJEGZ0juR7G1MA&42U6(mIxjD!$Kuu;%* zSwOC01*F1&LL6ce6TwQbX%*!ZjFbY35`sX&k?jI1Ouw1kH?#A<<9qLW|DF#G4lqJl zq7Vp#5h2ho47Rq*kAWWirlzF4Lm>3x34Y!OX(eP5NP<5iAjmR7XT_4Mt|=zVEIW?z zYn%SjSo!lrO#dDYO$6nciOz)jYZDvOy6)HkFjoD@75O9RQp=8012Jdw^CK>Xdwa83 z#au4yGK;mOp}Ms!aPQaOWww{^*p>9wa5Y6`=15L_FK2iE*n*c&A3OZJ{t`uhOFU5K z$vmOfF5%f}>C)Zwf{o8` zid&qp4UJxP(J=TwMo3CoEY^mVY?Zah!M)DOLdcK8%Xh=enz}0ia%CkjBs@nUMUBL4 z+FU^4Q|GoIVMvEWOp8cS6q!OIk=`dQT6Ld0Lg6)J;kXy_wzK(T5u5-y9V``*$(u|! zkwU-ej(IUW9F04jh?a_&ObcAEr}p?-h#*Va!u9?vNHxtyY6Qy*(g}?hhWXdI}B-=(6%(rxtCO>slp((;4*mGFiCbMdf8xZ|7dP zg+ofAA;2@05u<)L^{KSbNp5ijB9ds+VHt`U2LdN~a?sU1W$}t)XcAA{eSo;r6^q5b zr&VoDTj=T3%pxB-R+7W48(n@5m5H#7d3BNEP3tJ&M0BUnW+!x|b7*V86UuZM5X}6< zIzKKI{iZsJk|dg=*J5GtD7Y}HFo_t=yK)7?EvZ{+X4hzS0W{y%Y5RFayI4KB5s7~- z6KTeiF{FZZz7ETzs6u+kIUYY_3+xL>A!x`Vl>v#BVu^i&Bqh5^ZU|tv+Kc zo)y$r*u1q^ccmv7H=RLu7pm}dKoYOI+VpY(M4@F$6ZK%M^2FFLA4n3W!Uy;n05@F# zEH~6!Mierp9PDTDhh=L5!+d2fpdWw5c+=crW@s3jH4<23Q#=wjw_@VeD%p6;;&| zu~?ktdYhLO>*}7WGAGlmqt?|SvC^$a7vYF^DjNKQf>^#^dlxAnD1Ld;?Qf>-V2KJC zT8ABPDdml`G3o2NDS4eX^4g|(TG`R`Y8;AI&&}CLWmQ4ZsRdtw36mVTGa~9C&*otAU`4LB^T5TfbjmiU?OFnLuWE`Qd z&(*`@@f;DPb!N<~3Ke67L!1X89g$O`Gy%+dht*2w|-~r84D2?-OF|dFIAL|BJw8`$}`+Os56~50x{o!#N@* zuSBtd+6TL9SA)dl9|<$*UNTASl~8)J;n z9t=JN1KqW5mKoX3s5Go;TUeZa@>M}lPF=Lq-#7TCrc1Wk(Z|pCY`wI>HUrxZ7C!4M zrDorLb~~@}m);GX_SXz)DccBzRaTc;%hHk*SCIxZNY7(sEkFEBK3F8eVDo^o8|(JN OG97|{u-{D|Qu=>%1|qir literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/error_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/error_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c9592289351c7188f02ed359bfde21f421aad768 GIT binary patch literal 1691 zcmYk7c~nwa9LG@#HD4}K3e~vPK)Ix8dm4#anPo|C%@kXpCo_|5Umz&4Tr%sF85%9- zoJJ?I#TJ+M@)ef3G#QNx!6DLfa zfWzS?My?8HU^8i~+Y+#`XK#oeha+$!!$V{D6?1tI{-SzMh3VT_6*9O`cvJ&+X0m%L zDrg$P&O^1n(5O(6`_Y_qCfDHhE zqH~QXDo4Il{{d*bYj}FoCuFHzC6&mFb7bGOwLs{VJujp112*|ns*L9Hq$`(rPoP$6 z3-t6U1VK8vSd7qM6h$w4qd@@yM!p_J{ow}3RKBfj+6yWc%r**l@UhS6dO+AwiBn}Rz!B5ThUG|n5Jg0J5W9p z&uL}3XM{Mmf(Dv7R~WT=e#o-g0Uk zF1JXwIkVJ;ORP-S9*+Yr%B!Y2tQVx;OCwWM*^H89u?9frf`0} z(eLantKE>Fv+3k=1}f-#R(k(%+9-dIOR4KtPd|r@lxeRPta?Bk@bL3;V|)dFd5;z_ zKl`SR@&%*gFprD@UsT#b9+PoxVe6fI>t-C^kjS^ry4T{6T{dLjUy-jW?uS*g#8-)3 z?hjobx_W(G7HxRcLEq-DbYTe7hyqm~b9za*-4NmfVR>Ti**`3W*R!%^NUJsCcGaPyVo6Ln8}KXd~u6*DzD<;9=lf$`^pkZA`CBP<#yxu4!-Zm;vW)wZaF%3Yr=_ zF0{$oA`sUwJm?QASRjdHK8!h4yDN+sc_5}4RsRgsM2c@h@_dbpUcU5PQd8ILa z93GdiAO1jv6>=y0A9-++M-9k_e2q1b3X;uc!?*fuLX-7o(~Rjp zf4&du>x+Qq*B!o_iF|y3lipKQK~HuKd66c^4aN+a%*~MQZT~?6vs>=?KPkA$Zvy0j zTaIMKRoK^`?7zEai|gDXswD1_d@ZNhsK5B4VQ<#@^HFn^QRPMPL5%E>)or~cm)mpq zN+*9wV`OhX;NEm?A02u1##(P>aRHCbW?$^sW{8W6DB7H;n+U7?@AX`0-@Sx9c4``P zcEj=2sXNudDZma*PJp^DVAuHGTvZv#q%MOYDt_ZiSq}2La4A3&)lj;$iUrZ*DK=OXib`yDU2650$!YFjuxKC%k3Zv$rxtp{axfJ$ zgQ?*JYUFR}dCTCl*$n<7YzN#b&u0<-HQoxXnrrBHsT92uEm25VRj$oC=bgFkh7>g~&mU!Get$-ye0xdsB MWJGlM4LV!$A9xclga7~l literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/error_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/error_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..57bc53ceaaccf3efca13319d63493e9f34990603 GIT binary patch literal 2329 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/expand_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/expand_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..515e4ff4f8c7e978d8cd4ac826b4c2bb58b2bcf1 GIT binary patch literal 2266 zcmX|D2~<F@>KtTMJp$^plDTDxFXAEUbYTD2@MxoZjgas+DLs8oPtWK|(0-pIsns+ph6*q0LD1&Y>sLlv4xwLo zj;UQXYy!wns;#1gm@1cwCpFw7Nvj)aoDD3f-9CoCEk{zx1f-X|<5L%yXiIW77K6cn z+BiiqKPkSbxHy)ofi~1u9d?j)Y&BZN&LV)zOH#24vP6PXagSHbmaf$Q_=%NW7=jjA7aE)yvd=+%9b%M*&$Qkvp~_1CYsF2pXp4tU(%c*lE=3dxX_mUUuzY6rI#cNMND!Ae zSYx(%dw_obo~k!PAP|!IA*e|ko;YTX-WaQa)b`mqjtGfJGziE(X@#0a3q-c#ON$2U zN{^`4Yi<6)#{_=9bA|{B8wsmJ<~GO;u=Npdr8c`+ch3tZmhRRzfsAMkqlfd?9b|c) zDS0=Qhbcroj}g3f%8SV6M=pqFp=Rkh38(6?9XXni=`BKA{$SBRU=Q<&H|n=wN> zJBnnSkqA_{2x+0EkB`;dN?YGB2Efm%>bAZ5x=F*f3vN-(H}CuV4{-f_wP=Zm!V5E@ zZHm>*9J-`zgL-PxVrWF;BpLAGe2%AQ8)0gpw`FfKk~M;PSu3W6B&G-@%lR( ztF_Ixb?etfzHv1n0-Z#fomWi&cvsji!j}a9@=C3v;*g|T&0i-t>I!y#gbY4c(=?&qU83L zc(zx1uTwv)Ee6{z(=x_FSGgslVJgLhEyJ~97JwzGFUH>(R zZn@G2N^AuNxfr+6xJZI_VK!SKXOp?Ss4`6O#g^YL*G^x4KB#R`-WH6ry_mLQai=XR zA?N9CWOOu=>(}LkY^p}?_Ju-M<6?y^elIU4*+t@%2C8<()m<#xCruW&3co;?UG&}30u=Q zuw71JV?l7a?{b}r%i)cqJgudc$@U8}fDM6hRNAIE*v{FC(aKg}$D*|A$3r2qYh5?) zf6RUBoZOJfkhg%d&krXc_a=V{TMZ&Q_K4`_BT%onYc}`W;|ddrT%?0vK*@C79`0DW zcFP9$o!n`^pf&AYcK{GUMW}n*9oHmh{KSy}6e#(os;K{;NJq7<>KtE&}oMo@cqcX#2AXT4&vI8_O{aK9scB3ii@ z{vzb_Ih?XwzR&(q`4&2zUI}0OV}ljcj&bZmUF`6+{q-Ay&^xlT@I>Kr=V!Y0AphX~ J^}f`s{{wckO7{Q& literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/file_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/file_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..9303457328fe341489a8ff7bdc0c565d3b6f9356 GIT binary patch literal 1180 zcmX|Ae@q)?7%tvmNRI(yDX^)apdhq*v~goA$l8=KGC~U5M8z~mDQ%1<47UXY;dVoQ z!?wCPEI&dh>ew_xT!=O3db9`#?IcWCW?Wi+Nn%K@8`;{ecm4d17B6}4`{R4x=Y8Ji zdB0X=L2h{1-Y_1I7oK-iQ3TIeE=OewQ*D$bb&{f{?@-gzHj1KJzFy8o5G&C% zR@E>0%=f69yx5>$`Rm0_QN>HFJ4!EYT-XgEAclOz=`fqo-rfz=Cj1-Cx5?3tjtwOr zzsl%v+%rXuKW$!mFqVtXw29Fw`u3Ws=6Ky~PcHhdC_q9!>WoJaWFLYg#vqB&Z^B51 zu@i=L&uI)3SEgg)PtqCI+e|jhUXi_*bAjyaySy@gc2qPR-+gefu0j zUgu%G@zzDVC}mkFd;zuDI#RAjZVN`62}l!^d)#g*vI0Q0NO`HaaT7?GG7q4$tbicm zRKK#VM!|LkFmr>!3a@(~au*O8B4yF4YzgQ*Q!e_Cija^aN1D2Zvj?XAn##kCW)SOR zy;h2HH7@}`pj~fdPks2jc<%0(I1~eln<%xK%|pA8trnKO3IJFQu3@as<%2ybd{w4U z>)BkFA`%JT>L7+VCeUpQY9uZtsBy;bT2+M<3NVb(K{zh$0Hi%sxzo>>Q<4BaF*L1@ z)IW@{u6$|fdGJ$@Er z6wWQKmO^n4Bt;CoTH#N!xPp=f>&l?Hn$Wh4V^@Oj-Rb65=OW~2j(t0T)TtRVW)rvJ zQt5Eh8F_mOKX&Vji}e98<%+Ryw>#UK^(ToH+SA`ud|Yp?LTP zKgpgNeII*L9C`mlT;A-HAk$VebtzN;SF3m9TJ1aRv&ZzXy~Oc@zWmT0Oaj>7EEc2J iO*_WmJE)D=DnNJ-3T}OWwmg4>W1E*#ptvc=&;JLKusrbq literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/file_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/file_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..043cb47fd4b1141828927fa28e876b44020be20b GIT binary patch literal 1431 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 VOXv0&rK&%eyEeN(^PO66{twxGF=hY& literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/flag_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/flag_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb50f6d6e9576a0fb305346c14eca067295fa4c GIT binary patch literal 1113 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 Ojx@0`TR1nOA@RSF9i0~d literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/folder_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/folder_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb407df3a794afcf1322d36d011ffe6e30e5106 GIT binary patch literal 1076 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VE*mt;uumfCn;fpAyAOv|Nljn zOkg_6rc&kM@BQ^UGCxE-JMCvEtlzhMf($oAQPR)v{jG-e z_V>=Y5-T6~kz3z$BTU`@`HhW@59JT<-_LKLA}KjTqGIP!i7i{cNXXfUnCvW^{`%JH z_BoMBpN@wMWivu8-emuB|IV4LKt10Jw3CEVewLEPcr#niod_NXFmKNsQ7=q zP{6;*5C6~acac7KV$G=!@9)=x!UY%vNk9Mpmj@b>-}c`^=f{ta+=sX4-|sY&NMuw$ z{Qv)dP#6MLHT__47pVR5Vd_KuX0zrsizJzunT>&1SWfxBv4O##j+=u`F z`}6etuaNln|Nn7_{+RxayayBnj{NzcIg`QAJ?zB4>XhaeeN7!rrzT0C*6g&Cdn3Jr zL(7F#NFzeOZ`&U`3+C=;zx9P~dn5s4_W%Eu(>oa(40u=$+J3wt_*dLb+N5DZU(1}6 z>1TE3{a*4~X&Unk59R z3a1`3KXCb|m!jxpKmP~+8jkK1y;2=qUt6L&V`ESbIGE;KyeP;ZAmDsZeewUIvl9yJ zN)n=P*vU=`IBp`D`SH?!k!9Z&c>1)1Etqo#q?X6!pt#|$_g8!RAG`2xYj`{9X7r8j zGmb~<`2tFJ%-izD;~6lafMV(AXa2+Q@7qiK`}6P6fiq`LFm%Rv9f)t+UvF=?VMCF@ zpFcm_AxUbwbou8NI6qt{->b=E?+-`HlJca-w@HGkhHtyN8*^{(_N?*#j?=JHNP zP?R`){CZ#Kpl*7EkUQU<2DPB+X4$HOlcR*a>Koq&?9V)KgUx=9@-2@gXIUX0_$!@s z@ca9CNeRh%0|O(Y$r%>ARO=;yQGNQrseiK{et*B82bN~OzUF6^el5=?7--AJ#^$DS zeKH?V9sl-@#)tZc*T>gG6J^rRPfy>!UunF4^Q2TIxdUhZ%x|3D{!tw4%A}OEw6F!+ d9-e@h$;|NIsX(smd&y%E-_zC4Wt~$(698#C_VWM$ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/folder_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/folder_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe129a84a607efad138846fce2db367dd3b375e GIT binary patch literal 1246 zcmZ8h4NO~A6n;(ETPPG28L_45CItqCAt9TDQrgH28`Bw5(e?F} zS?H{TQf3g5mJSBla6l9{bxB)Vw#MN~8HP+DPz7h0%ZlkNY^B#*ibj3OdpGx;@B7X< z_ndRp!opX>DA5!ILBa&N{1Ujv2i{OJ{GM)T@E{1OPr%P9m34_l3=#Z^01$nO^q*BM z5s5^Z?k=04XI-;MP#|li;;p8fbuvG_{(^WE`246nEDTWI{6ocVs`2dKyVg#U@m2A&r zvwSlWna6|O)%}F(rKR2?gNhg=C=XdMvI=03G<-ne;t;JStcbC=)XVULBX7vuix|+Z zpIdJ)pP2C7Z|a*%DEx=VQ2`WVFixFCY&%R*et_8xhIp&NU?@`0p@C;lQMU_5DB5IX zEkJd^fd5PIsEa z0yTYSY9vg-qT43Df`(_g=osmDPADRUEEIRTH^Nh9Eu>ldZ-0~GlZL5bMu1&P0 z1em>WYPZ)VC9!oBAcB^Bz{4e z74t)dmIhgB#27~AjA71uW;~zI|D4bH|DW^y|IYLLpXX%xF}(D3 zH|qib^t}(c`(t-lIkfTEbu5m80HAf++ubc7zC7$CnNaS$2|z zi^vj34tVL*Rwao$xW$0*GIJXkXZzb?3SB?m` z@RB*B5Q@H!L{O;?4@Ie!^q`x?Swa-Gz@}X|)u9MaEaV--dvfCDHNtyYo_mc{dO#?s zK$X&faByGr(ig375JbaVviubR($@w+Ap$^63&>Y-U}9nfOizu2l@%<-nBnm{049i!k6|z*+_UJrIVHb<@m%v z_wLc5v@|}J90;N&o!MPZP3EMQOe^$*{>VKtv4_F9xPNNFQBlrC3-{#YK=9x@OP2(+ zB2~CBUWR?vT3EbXK#J0hR1sVZnLF~{jiqVb;Ap?Ewe8Pkyi4V-okMbOC+<$=ba=lPHH zQ^=cK`{j9Q_ByzuL;IU{`1yNR_LcgbLYz_~Q*P1U^ul^Ad~>2;OO>~b_LQh#r^Fsy z_V_(-@p5LwH!o%lOdF2ZiuMI$PqTp3a+l5%-I?BJF(jODLG&uYIf6>ql zDjI^U$w|CfOUHV$rlW4DomV?=G)>!DuN6m)x-Pn5d|3^N-KMWGq zB|KygHHFH}Zx#>;yCEMR7O^cEeJqwt`eOAS!8vAth^cSRTe^?4i3c)4x4@F;zG`c@7%oCPp9&YkShGw^{H$M#pH_ zHYHrP4GbvE74}F6)|Z!Mrs<`+xb(Cte9vD8|I1uwo#)r?09u4rpHU+*SXe z7j)aFF1ES{_%3Wku$;9Ncs$P2at)6y2ppFWGnz{y9Tq1(eu^AO-dTJgVVTio22P_aLu}0UF zK;MPFiS}&Rcmtj=ry4fa*E1s!soVx<YY;^NNf^ z{qiQm5b2~LkIQAj#YY>7S4^9qlXpl~GJyqei$gzp_q@RF@Omfetls$W$5`sr6fDsb zQzEfGXpAG3k#SmgA>6?XIQ!uZ>T!ovL~%hl@V69lZuuFqaPi(9+{|7+5%eWo?PRP{ zI*JCow%pK8hBW(j8Qjie8yd87OUk=^?F8yNoa|@s=G1-LM(_Ok{X5T#``cqu?~(7| z<9bZZax41e?WSg;E5)0)>G6$=arc@1HO~eT)Ko-4jefhb;EuT&j7@E><6bax zy=)o!CG}iVNAU;Et|6@xl;)_gnb)8E4u~^7YDvH28uy3IOjJ3%ZCG~m%h|4oZd1wY z)ULW*^Un_=$`ey-GPzT{HvF8mw+JFJDrDo^?P|Mg{)Cw4282rd5@y&405JB0uyre%DO->f0qjlB_ zbmh$gdai+wT8#X`>}qdsUtO-h|9B{TrbhYN;|ODwB%i_^#;$%qb3Sp?4YFSh-FTMK zH|JgHl-)^6trYApxWng?ubv!kp4)lBFDdvCJ)`aVz-4-V>5$yX_WFA+%b^?Rlxo(L eDmmw@;^DxD>W(OD^($EP0Pyx;xYyD`(*6(R_@6=m literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/gear_wheel_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/gear_wheel_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4e65663bca47a44f99262abb670f042ef188c74b GIT binary patch literal 2779 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 PJxq1X*rb?ybcFve2DX4D literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/heart_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/heart_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..16e96cf4a67bca6262b3c9030ab75b07fcab630e GIT binary patch literal 1616 zcmX|B2~d+q6#i)-f%t;~L=%c~cnj1VtvD4LIfe@g9Km{Wr zP!yPsR}m3HIjjn35J3?%D2E1<2&AHDE;PX$+n>O6XWs74?tbrm@6Gp?vnwRf5^s-( zAjmQ}$S)LKiF0O-MQ8DGFAW4?mj(N64NJQagVa#aLkNJFT*?m}-x8SW-T#b_Cs+)N zIz}&7l#h}Odi`upp7ukqGi&Xje_V0B-;hR8(I~vVlWI$6TDNFbWr6t|PN_sDlEKr- zQC0coUejlGZQfkUVzEq&uAykC3e0Vxj}x1H#gp#W@$hPE8|xJieh~qJOfZm6tAgaR z2}mZBK#O7FC71P$KhM3Fj`?Q1ldU^xWwpWFieL|!bs}sO5+=m(<5)I5a4Uk##%LWz`S9rGdbv`(D z$kAi?A!eh9CaMI5Kfx=YbT| zrBAOZ08}zr#}fPw3x%F=0e%}y&&(Vr*n~zSh=wl*qAmG4&_QtYeSyBC%9VJs=czTw zSH{BZDB6n8A``jbabJRWB@V6kdb!06rNhHoxy>9Y8vqtk_}I4Qp2 zlKPZ0qgbme4}IuXa#n#l0l-gi+Y)jnV4j69*Y63&nVP1v#Y?%7LroJt=c1Z6bm2l` zzgijB{(i*Se#C}HV-_CeEO)r(V2q!9mSWZEMBt~}*a2qZ3$qB*;Jp2@@-w{!6Fh0& zj8m%1hO|Sh{^+m8?6%MSxb-P-`iV%Z8fUCVbi6_NQL7&Caj2^%8faum9~l6UfFQAc zBlkLcb z-H)F_d6S5wQBtNZCc2FY%yO!_3r}Lvv4D<632J71qI6GFN^t^#(jnBwk(dc`BeEw# zb65A&2jWj*H(}$KhO-|J0}6vD@{+x6d6@ryuf?ERK*S|&8s%%dB3{#;y=xnJc&a=_ zMbUkkEoX7L7W`$`*!;aa;ADqd*hAJpPS+pN<}~-Z?ktCmxo4MMLDdE)6u)$9&xqO- z;Cr!{RXI-K7t7QQSi2)XS*I?VRK%}M3)mzR z3qa(~?zzmY0i;Lexq) z91iZ0G#=$2ek;fybR~Y4svXPI+@ECD?-;oI-J&E-H4_*zzM#TWqsG*rlW1;}_ehU+ i*BpUv%o5}83;+f)sJuhoSdL821q=2M@vHYivi}1n?+=;) literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/heart_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/heart_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7cedf690676c047ee7b91a2435e8f7c3ca07d3 GIT binary patch literal 2350 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/help_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/help_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4651888cef199af19e53e8b89093cd66ee195f89 GIT binary patch literal 3264 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/house_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/house_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..a21f076aa9467d49315d5f60f98b224fe56b7541 GIT binary patch literal 1759 zcmYLJ3sjP68vYT}QGfGNE5DvCm7TIy8^D?sM@lf=ky+EMR=3M45Mg6h%rXem`7AWxl`y+eKKIeS*_j}Lte9w1Y z>F&&r1N|fX0RRZ3r>E{gN66jY^FjNmlI?Z?@M)r_()OKcU@^WVp_>4L;3I~IAIxQ4 z-Zl+a(f7W7fG*bD4DuWqxQU6b@a~y@)hXLkB&lTHr6e6QlqDu6UW>!5gs`HoQ*&}M zRjt=v2)e%(0m+dBED8}iS1XhGt3UttP9lZp{FU{mgM+0gu$LPpL6Ld?YPmsVGZ+js z2TEb!m{8W*%A@aJ!X)4dFc=I^d}@|JbOQ>HAokuR2RL008?_`?BC4vY5;lGJ`$Hz9 zGTAKmkQn$>D3i%}+1bOGl7w6gjfN3-7Z^#D^3N{_QJ4`GAJpsr2);hi?!`x(iI%xZ zg7{d%iFhK63|f@`keZ)9>BBK*JZxA4oZg-u8IMPsz+?rLV3^S~@ec)t_{S>#6;0ryod4PMSzZ3k&1>D;DHmwcY+Pm=osFXA#!*^zbtC zU<`qfg$W5^iuX2WZGGIwmuT(_M4HimL)WUUq1xvQcOV!+1{s{fk*VqF%^hXNJaPA| zf#h^9t@f(T3&TfKKrc5p;E1n6{n;NimwfUsp5pzR<4-q<++fE}pjcR=L&b%4v|1nh6# zp?ekp!Mp{?AL0Q7{tuwl8_^K~l9E0G+__v%m%8!l6{<&(U%-XO!4aWxQCl|Xxb~qC zaje2ff}ZmabN@Den8D%cElA}18Aq=F2sKg~y>|_Gfe6B9GVDgRMQIHXovjD4T4WA% z1Sy$z8xkpM`yz1X(ew_rf{_0Qj~dEEr$3dkmTLaGHJ830q6k;jJ4b3_yCQ}HhSqdQ zk%*zc z`pEfwhzHxXmgR>xYq|@@cK^T7?E8VVS`f81Rnr`OY-CSYjt%Ri)zr}1Gp|$H{A>gFcD0wo?Y}v2rJ81oc!fRyg6x~1`3s1_-kS5Xo4gm1 zTMegKIg1--FuT_M-RtF*n=#G0&XcXTd4er?|8I{TXUgEY)J>(Iu#5|ND?$e>8lzI> zW@u0k8Xu^!cLbNrgT`B+=^lL8jvz6j3o${3P8cy*T#kGnPEJOo=Y@*C?+g?W!BrE# zTXl_lF}>QQSWNhgo&E8%urp(?sBtrKYgvou>nDDqaqxb&XLpxcxcLpaR{ajOubXvI zZKod)1**H=A%{Qw=0Jik$=BPf)IV%y<8gfDjg+(v$Mr9juF$*ICC3WQ^0Cf9brh;{ zyAZoa!CWT1q`mP?Z`hiWg+1j(KQ2qF`ijEdSf+~E{i<#b4#bZ(1klHdy~;giGTCf) z0gF}3;c(;(hW+iCC;GlF5Jm2-vn+@^{i3Wt%w68!^M}huM@9)3)i@Zt3*2%+&T2M&*A2!46Vx literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/house_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/house_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe380c4c1d44a717dfff94179e7d39905995269 GIT binary patch literal 2431 zcmXX|4LFnQ8{f<}AFt1fy$a(}{pD+nkZ&P6M8rv@GxKp0hjsMN5*ynLr4W}mKBkiX zl~XxXI>pSCmig#Jbi{n*GtKIhgzf#mvvXh9`@YxnKKFCqzu$d7_x(KiAqVzps2Qjs z5D1L`f1gnJi?Wbj|fG}}4 zJSa)jR7~~#>U>sO(KOq}P5m|oxuh*gInL+A=bW8CZ$m0HK*3AFd~l`vKhlpbX%Lqt zU4=dj-GfAJso$XHd7`NMrJ#6GMd7Km*GmUMP(cy44-y(FdB~mkt6FBK4MK|EQN}B} zmJ9rMHI+u1-l{1+Ync@`iIRgOn?zhKXlS6FO8Aa+bks+BA(8CV*Q(EE5m} z0e*gLAUWAui4I9!`d^REOWuE)x?uH-;q3JEv<4~OHDg8M9Tc8p^2cKZ4%3%NJ3G5o zU*GLm*LP89mNFXbt#Rv;NIqp^GOc!CU}0Yv65Fmr5QjHBoX6vjhL4LxT&ce8Pp}=6z5NjjXu%u@4;?_nB0-_xS5uG zT!u`s2}bJZM6<(g_7UE-rd{BLT*>7L4{_iqXkplp2TmCH6$HKxgW}OA&nOFDKn$#n zfmdbsaojVhYs-er`uZLG5yuqp?<18OuRbcUcg!Qq%@d>zi|Vu9*TmgRA3P zQfD#D+mmz*G3*yM1dS2laOg0g)}IN)!8pQSF>!JQz98%-=;P~)%gB6+mO*P>l;uTd zHphcbexN|#VSv6I8oCNrL}J&a8R*VVAMikxtAMh$tbqv{6amX;^Z+`I8%te(znwqw zh=Y?0E9W~dHm(yC3Y+1PwOy4{>P0xybU<%r21veZ4Ltd_7`Gx_bBvHXfwxJA3Nj$T zT-w}RfI=c=N|TdhpewkF)N*QS7qfoB27|?-FnTkOfI?$Y4E59b>WPt*7`8`28Ng{% zA-K{q3MU}$5D;H)0L(mZ034H##W~R?m6VG@ z7jKo=Em^km5kuTrU?%=NpjTf24Bb6Wb~>}@#H?dEF|XWo*$bOSss;pX-lw4F`l?Zb z;fe5@(C^b!-=k%5E@-Zx*gJlFH~!L%UhlwKHlsuJDf;OJv`o*;T5^6#s(-k0`oEb8 zRd@ahDtqR@_E z-B)@E<+uzo?43l4rtu{lWVAC1h2o325Ln~-{e?t4s+GrNIpJbsSHSWL@Zf;0-F;hv zUB2Bmms6F|P_#8B%54+I<>*#+S0RTWtmKaKN(Gy?C^}nU(eIj`2pl4%d^uboQZFYH zd3_}#+UAFHay=)*0R4NTkqA@W^qL=Dp9!4u)U`R}%SvciTK1?%W~XdgS?)6mUd{dE z`mA5so;ioGG`HLPBj4xwt56hOEqi6ohM&#Ef|s^AukywgTC=Jzs-UJIEWo8pdH1Va zC1t#Ua?Zr)+Rp%1%UA|S)+3ushwKQjDE7ogTBx%1?>SK}Y3fPCE$;0-uRbZEP+I&# z;}jeYjJ!pb!pp$&$QIo2TQ1S^=)<0gk)f2WGAZ;;-a8dMH|!jKdII@0Z~f~BE&h^- zj+4n`&nX{z9ob7BGO|Ny3A4g0JSTTzx!T5Quzk?HiFkh<>XCdHGG-6mJ04Z#cCOwu z&}bu7v89cwSp;o_O)X6?ghJqL+19beva0`iM25YuJH|?RYd6#4?w=yn9y{~xp}_xY zd>q@z2Sf7lrqrdkZ;%&i(+NH5aq}k@&PUmJzcBt5bs=)*jD9@S57#*a#rE3jdU|U6 z@_t+hn^xLABg?(4=C4dVvse_ss{ZOhaWFMV-l?OB3cP{OKklu&@a&<1SUWm)ciCBG zqvfd`M3149EpGjz10Rg3Fn8EqiLF{Y0q9f?+N<#qqW^a6e$1Y_(*g=}N5W&P_Lxbd z6ZU4OJhn6?=5woW;2qL~&7#YE8XgJ3@=r|z{r;B>sEbIO4cbX1UTRsM01AsXKLSBR zyFZG(UUeIx9tW~5H|GuDuN4`jbqQ&!X~ci4cF zbXjgho8Lh#(pi7QfapQzhSLw)BpZcCpzCI9G^3q z`nFv|&W2UesFMY=DYY&_UzXl%mc9$CQ&O|fGN^7-UGQf3huO{Iwn-~$9sX0{-!uc= zF82Fd?C7`wzo7q)4g#;;*-xk%e@$;%w8K+KRJ6}~x7vIl#EaP}XNK~ypY9vy zFF&|{9D(l>5L8-hqKm)-{9UUM_GVZ4@YQzwwaP>>_Ao;?sW^aiQ~(&SY|aWbQZ1doYmomNl0j*E%l7=i4f^a*=N}^Tb?K{H7Zi|C8|#yHYmnkh6~n zdpkSLdW1qtUdNZUd3H})U9{R=d(4#mm(PQbd|c$02d~2tQCLJo1Rp+wTUXbDNQ(hg54Pon*+1HI#SQxJ7iL0PV;4XeL5!{g<=qdCHB^h)n|{7=KeD;QRWe4;A{gpoL7J>aSQ-T z{Qv+#$OfanMD^tTBR~*tWa{+VsnzQnPB>gXJI!jv&yhq4-%KQ6KVJ>l+-CT4bC<_* z_bxZ+krWckdZE6)E(n5fn@s{fUlj}^2!m)c8hbP<*r%wfxt@AU_=@J~&mBCGZ0Js4 zQ!UJ@qE{MBX&0ztBTdHfox5F_+OI;1o zgdj3VgRF*|1&fLGp+_Z}iQYn=lP$@K<^E>cAX(Ug2r`(j(%S4U#P4S9eJOFOgDQuh zc_hAWt0X_B`fk`02P@f;p=IMYbBmVB-CQb2cF)Jfch7nGcQhC77++RmT~T^!;UA8# zi9H`~PnZsngH%S896^E}HaO+GVIsN+OUo`=#IS8#i@OwO`|y@RrluyK&hpxlVbd|G zz-GfTJD2Lz17O)u%$PH|huH>w@+h5N<$y2SWX)@OWo+L=pCP2oRbf+w&>C{HlkA_D zHTrmX0m%@9{QQg4y$8!%AFrx8jlFnE-W{<2r3AQB?kyKzGW8sKda6P1zwa%(T`;-+ zWzJ%ADGzf78}cjY@$nJ)#6PR~DgxeAsx)Fwmn zD|_VqA9L#l%LDIkA89<3b^u49fE_wZ63r~-kp4Gm(&oxal~#}mlmapU0C?mTCR4X& zG>&j31gDdta)NOwi~toR+5I?2B~Jh-*sv@= zXG59}L405lkA!w9l};g($!6`WnW@nLSgl0B>Y4}Ch(P=FcRABr`0mq&NDpTl6V-rd zt5n*|@FIrD6o{h!hs}%*YLuhFY2>{%A8tq5>Q6$8v`=Z2z=ng3a;urmtB4a1qS z-?Bmh8rQ(mA?k%$&K!8s!qdSOOZ8n0m%LYkz(LWz)UPNxl{Taq*Eb3RQUWRD+wl~G zVaf)ZhE+VJpo`ADe(~Jy;dfVEzg9lup>RIr<`~iC={rJlZW`Tnx1jP_oY(d5H*|h_ zvpuBs#`9js)t<%e4C8`u@8SznlxHn23qsB2Sm@d0Hd>XmcjDuxhg+547R6=|tceD> z#xI0k1*Rp`^9&wqbI%%{-PGl!46Q)lw%KSk2QRqVpS$khl5;oTbwXmVB~3TP5=e)v zfZsnN%ubME>Z0oE7sR|n!$cGHWZOj6E*3YqpW@r|YIB9AJi5Np;N&qCznPDiqPg*AI5G+K(W%g?32o!U}gD zaGc%L8L`q~j;#B9W6r+k+Yi45v+>kMeC@B~;KFN5gJGozacfFvvC+w44sF4Xh_iP7mLN&8O<$|GYN^u35zJ_X-B%2&S(kL zZYw_?@v@hRmRzpq$&=I!QRT$YP6Q2f%pn1@4@NW@KzY20VAe)_@O1VJ^nb--C<*c4 SJN)O3vuk?H+UTYzX2HJ`5){S& literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/info_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/info_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..728352117d6782a88c107fbbce30c596088e22f1 GIT binary patch literal 2192 zcmYLKdpuNm8y^m1a4;ceti_CbE0^%DQU)I~tkSl#v2Dz_l(k(bWf8_8jM~gp-boh} zt!|sruC~IQX2^Xe;!P=I5ZYEVA`WKeyoc%Y**|{gIp=rI^Zh>0_xC){Vei-;VxVWC zhrwVBLa9MJQERiZa9H%3nwdF=!Qdi8g92#jm*N-%2D*tskT|@ZvXt z`4>-~Wbt?>SZDJuv)JX@HY)E8hvNKg-uQ{U86ktT#ay{hO zn2*~;>;2^CyZ^d!FGHgI!A%`?3iQ}XFY+ zS6i3#@v`o2)Lf;C3ox1=GU|`i)$d55vXOWO1MY#^okS4i)DE?`>*{_)m;@_IhSLvrPiPGMVwp@)3-UZ6tQ{se;Tx*@of&0^22%|8b-v4u#zrBQ`y&!@$=5$ors zP#UxnXq;OHx$dTzI(riCXS|YAbzbAeJztzB%_|nOv$voq!1VBv>wX2}6R zIZX%jIAN=@bB)%#{}1MrM{&@|KMjV(6|BO|=EJ}CKXQHeT31y4OS3wOJdcOnT9T9e*x*3{ZE-lvAV-%r$Vwvh^`CDUo;v2@nX?@mhv z4?Lcvb$|0PAe-H9rg1~L={le}gKNV#&u(Z4@p9`a#AaG4WOuD_M07VzkG>uBgnZP55rt{Jn+PR6ycvBH^`hg zeb=Z>yL*&klHtwJfiCZ?0$@;FAuBXvr{tX*P-mUzJ0h;+g9wr7u26QhK<)6w1Rcc^ zdq@KxqSyy7FX#v*2(rTx4G!hV68Ww~r`7udE)(g}TO{0e`SWsII@ade@wrR;XzT5c zpRUM-fk!4u_{ZG7WXivqj7U{8@K{mhx`pHqR&Fl0YnId@*rYN z^J1&b`uS|@@Rj+CPTCb;4tL2987(VKDmkKw@+#tCMCJ$pqClK4{7FB;6@_7O*<~#D ziArhDEhBIOE14A5sI$%U@t+p3%T8v<{Bk<$TuAFg^6BO1GcJiJF1$FV6O-X;MMN7P z@x;mb{I9Chq*~!CLLo?A#lt3Kf9CV`|6ZmrKFs}^m;6R0f;#U!l`pt?3S|=HUfcl;?-id}PKD8QGauI(Y}32?H$OTT8KDiZ{|AI?Cfx-+tFFYl|CA=0ZN-jnJHx zBaq7^5eGWI#h94*0!DQpU~*qec=@q}(45U&+PHZn^8D5LYhMobfBr+2zZl-q%Z=if z9~0-dDPA3^Cxd54hPs z5_hNeoJNbO<)L8egkGUIR;>{E{L8w_y(cB9xi@AyQV(SWkaDnVNQPLeLupiPVAk8y zRyZl95Qm$P4*7>S$FWK5WTR+H)xiGpJ-eyxS!$5YJd&Zn-&9+&Z1+qnco%2H!qwjg zXWaTOr77I|>Q#bqiym0ea1?KE$(ZYodLCUc&7q}tRte_&(gtH*R(wA>-Q4t4npPSu z+AiD9jCGl?*hxef3!&X501XfXv#uV#AQMTQT_DV64$Nev?2!q~Qq-d>L Y0F#hJ?`Y~`JFM)725%3#6UfN>KY`9KGynhq literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/iphone_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/iphone_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..e765eebad056e7735f3b610cb75f93737f67b9af GIT binary patch literal 1033 zcmX|9e@t6d6fS#=4t!7o8@#s0l8AFLZ2Ty(Ta-Nur5lN>Q|5vhlkzB_1RW-BZ4ml^ zI!4(hS(Z74xiQ^z%mfQV8Nu-SBeol37K6%MkVm^FI;Xa_2#@ylU2pg5{y6vECZbSeJNodeRi;c{MZiW;q?n6F+|~fV zdzlAk^(|p9O#zgiGP<7OCD<)XZkj?#z|}JV;HJ|ha!pySmR9zJaS{+`9-;gfaFo0_ zrLC*iF)RP3XdDyQ4`Z?7fmMG^H$`&VR}r4qvZVO23jk1P87(TZT&q=OJ|26q0Q7nM zkc)b!3Ibz3p`YR;#<6RT003mt{{8B1viU?}9wVAJrSgz>XFHPx1*pTaaTLg&U3{V{ zKmGRuiK;!%O*9JcnkCw;t$ZbkisW9n*KzV>r@2!)zP`B`x)W_=LPC9d!v6>guni3G z%MhvbX+(ZHNAuW6uU*GD5OD<}?nCF4i9B%GcBsco#^hUCiVEb(OJg0U%q9;_?oN+# zQR$ZwUYXr%qEU)0YqMH!*kBx+TbHCx>k%121Eif?{|JRc6zKFdsE;J6HygjrVk4`v zVWBjh|H}jbhKaX}G3=L?16Jz{9F&niVvmJ(Oz_Uw%@%5K8>4 zcpwc*g=#ibi*JsLsJ7_z;3dKxn`SovoW}`({L0nI!nU>W8D+I^t*kjKE`Q6-w`+>N z?w{BT21kaTI)25n1woJ_E?eb`{(kU_e1mUfEhCvd`ymr7t%WXN#>7;VYgEIf+OGcq3HS^O literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/iphone_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/iphone_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5751d891c9460de055fe62e47a6972a3b8529ac6 GIT binary patch literal 1420 zcmXw33s4hR6kS-^L|6iX0wGG!SlVJn6Ea8;HGDNNDdK0WLZ=E+5N!(z7(r!&pz?`= zs58xg6F*o4serU2wqvvTIG|F9*bz`FiAbl=Q36;AknHOVgq^v&v+tdI?>YD0_evAu zx4Js}IwJ_;8Y_<80l)q>qhs)$ouB^!L7aBRMn~*AUXzkaqOUjQN>7cyAU^i8pG=tl zG@=8`rR+F*res;w>j$jrjnD~z6kW!&r?mIPy0~MvKU>2eA0MweEYj9(Q!?KVJe=AV zd!s!{j6Gihu{N;!*7yiZ*&q0%OcIjmw_kYTkV`*1Jw(wmWn_ux3c6a(_B5H2n88OgOAxVHz9U*Lc*vHzHFJ zKpmy-@=Z_tgw9xD?S|W;vv4u_3T-|WbjJw*lXaVvg$hNfaklr)>ZGp6KmB1+8rj-G z0{BqWBR@xb#1&2i2(rx1Rv3W@!@Rr#u(Y(EsKPU6O5s9DD992n0HK74=V}oaum!^c z0(zE{9UUa8>mW@)q^nVZ=B*C%1m4L+1Wa+J)*&rz3$}ZA8irvzmODI~0)VhFt|@?r$v1W1sOubt5VIhT!bUoJS>C_CQV}^4VP;towO88PgWZTi9Ji6EPA9% zjfq|}I!Kg+ww0yKBXVBw8IV=vGb!NQ`Gs-s*r&yn;gp#x%5Cnvd2h^?>9m7-Ym#60J&xr!BlWV3a4omK^aPvXnWARcc(moPaI?56Ej0%l)7lc|eQ8G_1; zQ)BQ{6daJ+rBu@uJ_;rU+Wn+B-iW_>b1&;PP_@01OXQuxg>ob@`TSPHh_@xBa;bN! z;jKrinR>TL+gjIFJtpbo!b$AA#F}R^g6yrIa#Nj}4QRUdZFd&vifFVJ)m69|f4*F3 zdoEs#i23Wh@zwoI+~Y=*U&>BflVM*Jb$71@w{C!~lJ#bO&9B*z z_kl=x`;GKex!{D4{+|1sL*y~Ulf&V#pm}?GUUG+~Z+P_btoL2<6;WOnr#n0`n~qUW z#RYlSo2-qWZ+t&`1y0(-S$NCXjIh1nK?J~dtpb1|Ss8f;8-{~zXBUZ$iI2V;x&QS4 DG@qeV literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/left_arrow_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/left_arrow_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..89af104d30759437a1156018c9c52d4259b8c0fd GIT binary patch literal 1019 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U_RvO;uumfCn;fpAyAOv|Nljn zOkg@m#qHwn<~%(A>x~Qy9(+1k-}axUUh?1n|0h3u zKF;4}T|OTgOgR@f@-`UouwLX|WKgQoV#D;=m{*iJU>PHKz19*Dor3i{Huk?izDsxW z?B6UbFBqkg7EC$thUqB(hrON`dOxv*s(b``73fh=&{ljtapvbU+g{yCLYHJN1?BJn zLn<{Ph&`<{J-cjgZ+ugE*qkYPg^0xZ= zcmo5YO~!xH8#I(;|D^x;|6iM#nc4jC{{R0ap4yNXYEavJ^l`&mG0=96C!_z%C|zlmpm z-TzdC$q52et@nPv+Wg<{x!&JO1%0bN{eK zx<5X4&jiNMeONN%XntPa8^b3z{f?5Z>QO!AuQMM$-!9G5EDR> z{~zMQLsBRF-%IRzXQ{9+GRmzh*6ow_;q~*+OZ@v6o@!D0jMF*ihB2$&MQ#4htt?=d z9g4c)xq8n1w>jSry?=Mt-TuAZgOr4nNvS`+{+2)dUA|tz!*C8TQXt+q6glhEir5=Z zU;a7v|J_}7`}cR!(|&yYEDyAz-otPVzO|GfAA+}z*$-`S_6{P@^h z!VPhyQpDnu*>QIyAALXh|6z0XehJCC|4LV(Sp$|oVKg&C$Q8p{y9MbDAkChxelF{r G5}E)4XYa)T literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/left_arrow_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/left_arrow_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6607727396a4b491ca2b34cfa194fed4d45b1017 GIT binary patch literal 1280 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/lens_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/lens_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4e526938ac2467030feaf1ca413aea128883bfdb GIT binary patch literal 2471 zcmYLKdpwi-A772f)Mk}rPsC7k5z`XRoQbGJNRciWMnC1ms|&(5mrNm2E)!85%Bh!2 zcWPtI<;cvs$SJZBc1oFb+iI8R_lR@O=k*uo#vtaoG1OkEa z-0toVpZJ*v1;Fp)Nl9N22;HNe?yh?h%fqSM`HhW@iWQg3_4#~0a_Le7Ok-1%HV%$v zy86dRt6FL3bNQF1FsPZcu$iX(wz!Nw1Big2s@_%%Vi8(fs6LF_tvg6TuZ=D{rUBv# z*~;WanXF?4uYX|~esdxaYnBf=be7lDT8x{!n`!8VGnd0%C#ck@-u&!rAHqgqgyP#r z5>F{N#Z@@do=htTVwn&c0)v8rz(z+Wu-)AQTxu|;O{G#T|LpED;3l8ecrjbs< z+pmwH$Hc^>*X3>EEUP~uJ=@5?`f@)h z@sF#&*M3#Oz%Hibr1oi5$3g&!q%p!m$nxBRCeqLDVALzJ1$nyXOvPnsVx+bZ>nKG3C1|)75MDZtk-u zYt#13^*8)kfB!;1e}Ae%A=8I(Z9yuvicBC9p)GqA5X4v=MNxc~IPe$%lVSY9xIVOn z-a9ROYXvwtIRU}J9K=5f77CtXxOkNI=5Wng(b*sJ7bKy)$8I@FZphnXXcoZ zkUqKF+f1TbKy=rtE-dr7H2H>|khfVY^+YYFHzxP?#GYU4w{(?bi5dI+j%>+Zqr#-j zHK_*!Ln4HoTFz-Y=_W&vfUs;I^0lSPt-RHtb&wFAxTtkM@`jvizPI+Iu2)~_ezU12 zKZ~{JJYKWzP6lJEznG5>I_YHDPhZ!<+5HPE7j(`{fU%F;*1Zw;Vf;YPtWWWLp(dBW}P?#5eN^YLrf zw&Bfe1PuuyGSe!*lE7l&?AXZ(((0$HAdGloYeg6?)-#!o^ zlbH@NxrU|GD#vO_RZMA2ERu0^lA#qV3k9PmwSErREgJh__&!nA-&0~(cd%)Q@>}F8 z*uA*;^%fm7HVOc+ky=|@qw7WNNJrWPn%8t(0>U=d%I)dt!CUa4k(XajdA~or!OgtQ z9~~3J0CC`}4%>s@8RCv#0e0S8&)O~j?Ck8Uue(}$rKSdlw_X{;?G)H>;h3J3^kHK~ z98MfO8;n%Mc`Tlkw4~+dm!7@&ad}2vv2|s0^L!*0Yl?Juh(a0-CNOp6QoA8eg1ow5 zD!6=(q3t~)JguSO4Be+#7831g5_ZbT1~4(%3h3%$09P}6AYSh%us<&ko^e%powP;~Zi_z-IvB2UXV4BsL{JrKr4BDg5{qM%I>JvAs3U6@UTdF+hJ!q1>O9=SP=4z@0Kn9XnG#zQ0z2vC z#gVtlWV8!ILs9hLd#+T~v|XuMX-j|4ZcCFSoZEQ*>x{@C=-O&6c!A=m{e7Xd6Feck z_d28l;@mSmPHW>T$ee{G5`8}kCkGg^ z$%phhSV)Aq`#Vs0lDYNtUG?BYTTye$*OIhzn9(yOwy}g1Rb1srSAHM5g?^V%a}z~W z{jj*!_aF0q6gQRKnRyFaKRH+*B$tXIXteFZlKE)g%AqKQTyDjahWew~Y&JR<4dHMg zq=9KEbF_z1+!a?($qu^<_rhWhVbe6DSftToJn!xyIXKKd)dnw`ZOr3_m4vtk4!Qk5 z)*5^pk_Cd`tGdeP{rm2x9m#4qpL@Q6unhJ~=M7T!Bip##Ap23CXfJDr{F~Iq9_cdqc+tb6xz0Qr2{(pv3uO|Qi literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/line_graph_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/line_graph_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..62a87c1dfc3a50a5bb4683c6de669dcbd7228743 GIT binary patch literal 1150 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U~%u#yH-lAy}1@|qu&oGm7U9za5pmNnk(VuVR zd-k2!{qL^srg=(ytTOTK|K)4I`clp*@--NUupX@3&k-fX($@0(zA#T)!u2;g z_b*&HsU|te&-V%Ini=~4r`=l0x6=Do=SOK9u*M`uaR;{llK&j{@;x>FmzeP5zjPL( zHM4TJ?&0nE^Cj=?-+k!A%fotY@9*C;m=RI7a0WYAThkH7m#M=!Mv&x7K}a@4f#Mpb#ecu z6zNtM%|Pq^-&Uv6G)y-sEi!O(Ji;3Hd0w;r(?jPvUUn3#+I@LYBbbsQd zWBd5FoOOyl+mcju{-4|(NC`*=m=VDvQTOj!LdDk-!RASa z=l`h>|Nry1@K4YIngvX2Hs?3;IygwQJ)9m>6qp&1z`WEeH*l`xn?(~f@|eW`eaJk* z;xETuFt<%*N{P+O6WjbuwjQsZ_*_>}=g8vaE7-o}F4MC0GCHHQ;?J{Ve5|2IOOjhKuWie8mMjJ!BTFcD9(p9p#%O)V+82mb$f$dzfu_3s@BwS6(@>%je77 z=X_F|oZmI?VtQ|0W`EgCU5H!7DO1MqjmFdyo(5$Hp1uFQ7h-U)H5V{3v8Zz>HMt%L zuC|n}UjKmobB|(V_ls?Z&s<~nmic|m$iJt~HOrv*Ns`S+mIdz*mMh&8R}9&C_Tgiu z&PPJcS?}+2gM1$|$&l}W0?(122;=Sl>s8u4x(+pU9m&v-`@?>w=R2nz{}KgZA$Q;B zLC22vMJ=DA`$}c~0bt(z{~waiehQ~4Ff$v^=8Ty%Gqkg@b#8OUzw`0`CI09$4sPUS5D;KE(0#)>HEwfIfX6@HhwBd6g{NfI{t!JGBhK}R5n^Im+O$6(|Ng#x z>s3Nxmv1|h*|hrok&%&G|Nr?}EDtto(X^QsK*c~)(TfOXhJyc1tEVJg;sx32>FVdQ I&MBb@0L4-G^8f$< literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/line_graph_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/line_graph_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ccdc9bc5d71f0886ebc3c91dc78c8b5d2797ca77 GIT binary patch literal 1648 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 VjE2RF%k4dmy~(_diPyML)qf^1ZU+DW literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/lock_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/lock_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..2d08a7534f62474e6911c52e5df562e15bb62644 GIT binary patch literal 1695 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 YGZ+{BXte!RR{=8E)78&qol`;+0Fc!iBLDyZ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/magic_wand_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/magic_wand_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3d44fe3f60896184d3195c7113b2d5091b46c446 GIT binary patch literal 1434 zcmY+E3rtg27{_ldv?vz=A8RYl64X_griI2?Qt<|@1B`;=BMPo9T`hYgfSODmwOw0R zEM`hzIw#gDV=itE-JI*Dg(BB#u}EDcJR;E40j(OOEss8Edv>8d@JsGF`OZ1tFaPg5 z=YFc~*%?vumdt}7C@L$HlZ(yq(_aJu8xNP4k3&#+K^7-{SLt~HpUlS=Apq*<`aJC% zck8q9(Qf)?9B%b{P)^r*WBuMk6khR)WEb)WbU$zs>nPAM3USxC~xEFh5zJpi!L5%v*^ z1n9iSR9-Xb?2=d+Y3GX5^S2$~^Z8gfrb}?C6Q|KTdrJ;dK97jVWcY)DI+@IhC@xlq zp+K5L4g$~?Pp7pyoOne$qD0`U?SL|%`&8(e{O`xPTag(`eGg79zDClOgI>;_fnze2 zla2zQA(Mkmd=D61iIJ$}y=PhEW8nzX55NhlnI}=+b~h&<|FAiK&g1A1g%y>VNWI`2 zF`-nRUM$2iSdIeyDM}DjJa7ODF#?#kDW%dP2Ez~TIi5!?#JF@#l~Fwq`5MuK({Sx4 zm?;78_DfpE9Ek?_;X6*dj?5iyMhK z--W7DZ=AvK^uHbYc)O8vT&6lv(EES}f7G=M77Z7{>L!Hp67jcVqzt8ADq)Dd;=1%* zgCsn@_WXDw{;3UF|9ElXn<`_x?xIAs^=VhN)fy|<`}^})MQv@IqNXMRPp489XBxvd zZ8FhAsKBJgYO>j2p1!ZJdJ(wq82a`2U>kFPBpI_;`c}nCz?~%5n3<b?f_J4I&kId?N^I=E-5WJqflnI~nUMf|b@MS_@n}kZfdN_8J&A zcz`>#6fum&^}7mlmN8eKU-#{$%QYJ8uoTvVOh#W>OGkaY^~4bg;^;i-f@T?kxkX)a)N z1&%K5Umen&(2HZ3h6V@2H;BdN>xT?m2)oy=B_!{NReBF!W;R^@j42Md#w-8w)ip+I z$h%LfW2$OuYlR+w3BTsj?rKP20OddQrkF5tTX$W>PPptRNR8p2R29H@N_axGz2Zsoly-LOo<>hr?_>kNB0?Nyudy`;e7u%@Av(Nw!A^^Ht9 z$avkMT3pM`Y@z}tQR8v#(9n;#M{5MqyCBoqz` z1cC*_Hk)?W&K)BG*H9#iW}Ny$8uXPBMac^Sarc7mQ44L=Ot2K|3?Q=eG?*s7-*!Qt kDY`gK!`jr6lCXDXJXGzu`LD2AP(8h$wK<#9xREdaAB70SW&i*H literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/mail_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/mail_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..42189d42e82b9a0f0b838ce07a7a66ff164bd4ef GIT binary patch literal 1238 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 UU(alMHy`9oPgg&ebxsLQ0F;)gIRF3v literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/move_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/move_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..debc7f0fd10551055aa024cbd9eab9cb57c9eca9 GIT binary patch literal 1493 zcmX|A3s4hR6b;=96e0+Pu(6H-X~ha?Fcf4IGDHgE4+Lv<vK#&9$2q2ab@i#^xh@zqL~kpq&1Cs{a(TOb@$vIB4vz35PhD|q z8}mu?{KXvx1CZ$#dt1rr+3POLrLeQADl%A1W|8rvX+X&txMxY?P&|fQ?SV^v9ew<< z>qM*M_{yt|H+y^gskGkyt07nSE$>$y%IB)#M-Id6U=QvpXl~J40}kwpDJhNk^s@(K z6n%iAXf=xBAgc%;L$I1A3U66|iq4}VqQ$3*4AY>S&dDRKlE0d?I_G`PT9CzLdNG+S zPZpB}Pv#hV^r;n7VE$d-8Kg5LZuVSGo`aLJ%1QG?&Ti)EBM}6nz&bC90AM!npLNA% z4H|Uy>h`q?j;%dVMIODLbc~L0XCfz;|>M%85jx9P;2aD%B!9>ZdSOdPsnUtxl@A;k`8I zpv&R_J4vzA?MKS&f12Lr<$H`yc$sI8Cp+%c13s`Nhfpm5>DUwUp%K20JuKV!;@+X- z!3C6>j%1(rjx$ThJpEZS$-`rXTg1x(;>E#`tfITBZ6B5Lb?+jHUtEYK5+$;|)Ha@e zT6BGAGbQ6;^1-cG_^BvKP(FlEv#yI z{CQ;ed{s*3(B=LS^mKJKxt*7FBsa6fTy{zzsu8Qf2&Y`Z{F!CcJ#!zPE*tK;HGNDV zPzPXEQ9iLDoo_mK{>S@H_6EbDXByuz(k;3lx@r0Oo~thR%g`-nqc{7(KTNzwQV{_j zC1{rI6sli{8_?X}2FU1J`WUmwYMykDyyX;Cr@LtQz|NHcxkf9Sjk-Ioj+HbYy!OWT zUu`naN+d)FzdUty4t8b~(D^vaXq~jR4MAM5IAaEiJY+aU-rb>nH7%lCa7^IFJR5w? z{(lOKIiXSFV=L)Vpnz*uHLP1(duhciZgs~D8am43fljS$BHij`#1T1&-iq~@pS{%k zjI<2QPZx>A@@6zwl1kF%AcTusj=IYJ+x=ZBt!sELeABD$ z29dj*W-&sQiG(nrjQ$YiS&T}pR$VBpYDlx}Ewp%@7@U(?vO^Wsd_mL5@>a%f-Rc)M zFJk=}zP3!No}Mg}XLj<8fjOxvK>{6`0$@pwgRRUr8?Q&{Nq^RRlSmn}08p^Wa1B2o z#_DosRePJ%A>v|&ZF^umqv>$9R4TQh5<&z~B^HZiaCO+-4EAK|?2d(SXHZow9vag% z64{|pXdxkx1M95eEqtIrfJulE@&dLq@}3kS^q!f{kJ>P$w~54mxh1Ba!7Tn4)==R; literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/move_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/move_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f052f000ade4af6c206f61c1233e3a64f97f23ad GIT binary patch literal 2200 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 V%*>+kl1~HmRy literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/music_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/music_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..dee4de9588c4ee1f1ac97d778f2200e11c3f4c32 GIT binary patch literal 2127 zcmXw4X;@QN8cqy^fC1v3sFg)3I(3?xq*X9tiUowRZn)Rc1O$9srmU@^F<}jhT8g$3 zM#gAepN^Hq1*p_}@nS(E#N|=aQW`Sa!71v!8bfZ9n|tQO*dOQI`{R4R@BQBMp6^tx zT)reYXlf9P#R^VIPDq8{aPQ)A;hw*D?`sx|H#sFCe$AeS^o$b`du-+fv~m3^L$-o? zM?*iUO-py#aI9cfbjwr-U;&VR@@zR__%ue#{AE084?v9$V$4*NvKh(AYesm1`LdiA zu(fR;hzs~(h7a*=4;upXYENI7=Xu46-d2KMP_u>1%gJw+@OY%G=XQ#;>Cz=BB5jh; z+b9!80uG0R@8ipS_{dxAFhl)QjXOd>+T|$T8a9R-di)hHH#Zj{$slQE3J=N2&qWX< zPYO2)g3w!46sWK&@G0j%OVR-Vw(0}lkiRifWD*B=p_<`PC$ky*{lWUQ2lASjGqEvk zqCHNts4S5ZwY3$B^!h@PP^h;~meQaT!^p5|5WmdjWhP!1;9~_-4TRpA(bUwEPv%^b zC8q?+a`J7mrj|Szg0w8|_4LB%=)>iRkx8qT(A|G{VNgGaQ)q>;m#GPhCvtW#@1f0LozJ;A+lNwrb!{9=AnIU(l{M3x6>M{YF8Oke_-=Cel{@=;0aKkwHNr3mKYml^%0H;B2{Q ziY|*%ybv5wTpxcHm^+{NB|r6Kspy(Gucf`&Zm4Ao@DaN~6lsAl+UNXukc2) zrc6MMep&%wDn6xig>b#sahhy`C1Lggyp7iWX7-y5pUZVDN#!A|20p6!F@pj`7_NoRTsLnL^yU_Xc9n}td_*Dz{#p@3JB_5n&n37;iw=cQ4k8pswW!D(`vjWtC%zZ&O^}1t&wO+sd+>L=$9bd{ zI2uvN+mlJz+*3FcY|0BxAy?yZ88NKqCh2kS)1g`|Lc0UzumR)jB?(J5ck;Rq;R*by zPKmszzP>*H;dr+^)G#MmbWAUWBhfnz(kR=o46kSnfL$=9{p>Lv=oYo-r-+w8A;%rr zCLuI3P7aH^*wY)v^MSBSv|%IIpVaRiPXLrmNm%0eXCGraAC;N8y&J=AHP&v&Ilcvr z+e+DOV>#0*7C@nAbcEb}_6{F zV~%xS-L>%+Ir>g?>G=dfsXk*i?l8RKZ)&}`O_kB6>3lf6E9QqqZ__X7tZM}3!onEg z_5IgOq=OKD?f2S2WOGB7i#pniii?XQX1}^@zg3D3EI-~}N7MeN%wEsL7o&~ApM$x( zZP)ZQ%R+rR$cIb@Ej;I6Ve9b|?kOv8YEOowrL9h+vB$*`AivS(@NR{q0SBd4|I)b4 ztGN=%9Qa&`guitZ_U63!b&d{2v(e?1u7A9LX0QEc_>gH+jc={ErYXJJb5>Eu-Nyp4mQnimcKnJ_n~ z{y_#&op<3gu1a!=V=fB(?Y+xm1_pNzZG7H8tZjdz9EY`;+|%^Mc2Scl^Wa^YLx>_y05e z^Ye3mZj{UXI0|G)XCj2;m;M9lr@AKRC*Vh~T`TKqH!~6ID z^SJllouIfx9-=to;QRaak~ePLkhI&g|ImlWzoXmoD7h_v^g%nnd|bww^`%?pZ49Rmw~zsh1un^w=Wzy5COkMG}=nT3VTC$;}K{PX*JBQOlE^Q_7F!!v*X zza)q2`!hd_F|z>y#N9Ec4TT&G1llg@J1%`D@~&Qd@5H3-zR%Lt!hHYV<51|_JcZvN zKW10q?URQcy@V$;GBj1Vyq}tS*C7AQetpgcagg6bCT!$vFc4sPe^5;`1gPHo>sHS2YtI)ALyy>{=Fr`ziZ~EyyN_A6W1#!2{d*z&b+w0$o9EP#?~~5 zNrxm)8mmd$RsZaA6q;^hBp{w#F>hjZ9M^0au&>cmCOV&)L9q7f{1+Z&c_7buy85}S Ib4q9e04G>rwg3PC literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/network_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/network_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6907ba89c7d68576164c4a639f7fb2585d64ec07 GIT binary patch literal 991 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/picture_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/picture_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9267b39bb71af68c52f064904b86540917c01e GIT binary patch literal 1291 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/print_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/print_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec5befb85e61da17bfa67dd60c4f36ac359694b GIT binary patch literal 1539 zcmX|B2~bm46#e0A0R2F1z$9RcfS?^Td=izlgs>|VkUCN;OV~uzN(zdIF)@H4Yy!$E zTU4smLBvX31|$(=*u`465o!{&fVhxCfdEN5d=$!y5HLi3%Hpyit;k0oNKfJLDvO-{n8Sd_OA(o-A zelHD@lE(;C-`g2qlTsjNjwcY6j=TZ*_rAmy}a`)ZAVOA zT(~9lwLh3tx|wcU1zjlqkSf;Kz`cGJk5}MFi|XFiFD&Hy?|r7{V>;4$++;B9*90y` zRjOukWK;Dbgsbk@$afxf8o-5`)VNit>T5sr6I`z3+qI1nqdMMy(%0vfQuh5lnme0H z?Z}Kp`kzgsDD5W7UYawy{4N(45fOoKF?EapQTNC{s`l_5>g(J~D%zJF)%j=Uh_kv~ z6Vn$G;v0TxA(5*7CO_z+hs8Vcz0*rc&MuZz_XR9u?EY(RB8f!lp`s|NQ!&#`I&4BA zA2||?$NQz>{p>h=|02qcr?`TGT?j_5qXq;v(`vZAwlD#(2DE{LM8pLx5d@mzM4V!N z9?mKjC-dXFr$W0@>;ujCT+D-}#IUnG9*?}A_^GcNAGR6-IXv%QzGy%(WvK^*kv;lu z>zmuhqQnEa20uz#!pf2I0S8>b?i6t%@L9_YfTsaj|$Nliev6%d2=inPJ&R z|C1Qj?ueqw7{xy`CJ~6XHZNyscQPOJFREOcujTPd$|lRb*T`#mRaH5%ZWA8^9cQn+ zOc0WzidW1mZGmB!_R|_UMuhDx>^nmmzW9Xs9E!@u=Fad+N-~Vo6$)Z!^1f>WeTzkm z?;-`V^*Q2Oe*X_v1@MYDcAK-*R0=;3}RMi4Zzh6{nb~ zI4c{fzpiRAdB4)G3F%nj9>o0W z5NVw)DJuL)#7@Qhl%?Na##%S)O39?fIdynxg{J?}_pk0%Z^(~~j3kr5a&>Jbn_EoE zU+U(S^$Q2)xRj|_BA(e_TT>%Qfr7qu)7NMGt|J1*q|^22=t`I4O}HIfx395yrrm0T2EWZW*r&;hnfV_C9=R_7 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/push_pin_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/push_pin_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..350bc434b1f3786dd2791847972435700be451b5 GIT binary patch literal 1265 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/redo_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/redo_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec1087a9409e6702b3bea4692e85978a8d0900c GIT binary patch literal 1298 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/remove_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/remove_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b6ad7f854e38f388e8660a43960ae9a8cfd21d GIT binary patch literal 677 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFy(l3IKbv0|yJyt4n=uUz_Ihpjock@tXt0E>bBB97nw zUadiM?0nr4n5vzGUOUQ$emV5nmU=lTDCe|o}?|E+G*j13G7{(#t18z0)M+kk=v zXx^4{jJ&`gbUk?d2*bDh42BQZsmneH&0$XA$Sgd6WKAt^NbVkfBbEb5mVbE3e)ze5 z4v+o*{RsF)&KDpXE)gNC;7)0K_OO%k|v7>pZVMLS!topm`_M(!FvRq44B;r86g=nW%3P3l9nc?N}w#LuX%Y;Doc)I$z JtaD0e0swVV5I6t; literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/right_arrow_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/right_arrow_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..7dcba6094eb59d53e8e8504f406cb76c90e0d6a0 GIT binary patch literal 1053 zcmYjQe@s(X6n@b7sQ4Jj64xq@Qgw|3rP8f972nWW=~!SRDolwy`eV(MtYgT=Hb-eO zRZ?fi<|+xyPNRWD9a+>#GQxXMN(rTOTcg5afkM$SSXySFufN{iE0u&l?mfvp_nhxL zU(VO`UeV#C#Epp%1SLrdL?v`&MGq6E@5#^eNC;whB%=Hyb!}4Yr(N_T1irqB#W~OykCh@XaESBfy&LHz0)2O~UFP7(8kE$ttHPcs9{X~8Jw;9*V>y&3t#Vsef zW7-K^4M+gc#v3FG=jUf!3KgIEwfigSC1)!Ag$Cl<5&!^744YDXYxKxcHW(+n`~{oZ zx4lS@X;q!I9uNsxiNQfDK@8eCJGNOkSzLSdvulrx56ZG)Skg)i!*+kMl?vhN+iCq} zpDgTQFc@YvEEdPX@N2KaIsn-68y~Q!2%t-Q@g1sk;9qadTVtq;L7jE{vbN#vltaCK z|GB(%DKGUGgbedfQ+r3_&sp9S+|yRV4Hrrt+;=~0PJ6%pQ(cuvs1c7b- zgp+Ny5=^|+P}Jjn$9&lOgM`YL=+fC7IrrSd>21_zC$UWl4FW1 zvaVWhw)s}6s=noKbZPw$d+)xotY!>vfv#?M3?pe(dqkT?ECIdynd5YHvPw)oCB~jo6ANJ#3}-ladrVtZ7%yHd$ckn1x+Oe1c_wU@mKabNw`>pwPE-bSBRa1gC{7d#LnsU`tyqEa zmhl=;Xi%I(0jGikZAVLZ$t%tvfrOUwZd@;qtOeR0FO((wN5ABplbrMYzVG{ek5lw! zbcD5)lNE_XvW`3#7DJr$gJnr3_Vn!R9TLfWJTfdaHmi|?!YFY`0>CNN{C`hQoA5+O zM~8EJx#w>mq9|HXdwPOiCd6n=T(PlHEN0=cDPw)@4ioYX=ukmi z4CMi%K?MMyR4tZJ1cCu)s;fGgrg zJ#t!WAR_>iQt9xRba;4>?&&F)N~Hr_?KC*0Y4+1ujx@^ay^bt>2f_7OG`L<)#8d~j zwf#yn8o(rXRS8a|hzMQP5n;~z1e-vfhjL$nopi2#HJ|@hKEE=uk9lH>6oO;N=dW!ixn{7jq zUJjcG|GIq(SbP*Lh~~tJAAde_y+Zqa^);W`Brov`|1j8VBWG8NZoF4G-QTe``isQY zZIOrxfI~VuEkI(A**=smP$&SiT_^R%S>{Y95XpN$clRB|0Z1vkoe5e4pE>j@D3B60 zAxN^{0iq(l5{a`q=MkX4ilVx4y01)zYb54Fr9q&lpC?ziznFQAaR@sTn6Gq{0Zc;_ z9ia3OW26~IgW){p@CeS*18+IkP&Vp77G7vHmE@<%ZhMlAo%w?kEg zZvI2B*I0HC3iT5V+1L`2bC5i=WQ7f@k5n%XaW1L^qCa{MF}n zzd@UO&~zpTChkTRRW>O?XhvrL)s}GFpT%W${rE9!{&#Jya#^)j zq~Fx<)bCf>%}z+A3egA+(>5^>wX30aStAZK|wX1mHZd zf-07(5_`F7H`#VA10(aWt)awMAVP@vh-qwq^7MKcu6BeV|GUAm(m4s-j9|OI!T3!{ z$KGI*ZpV}b@fAzGPKIyKV8VSZ<`;}@F1~&KZz{%nU0>r*c z(QJq+G1|AZWbiDQPDgew-ma)DTGw=1P+dWB`JVl^ZMnRl?xWZL`l2Ax)J$fbHpj*1 Oz)xg&bl4APP{F@-E^E~Q literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_add_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_add_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..206c5895fea0f34618e41b245f4e3e36c0dd32a5 GIT binary patch literal 1603 zcmYjR3s4hR6b%F-pM?ZaAz}rzf*nvGw18Dvpn&|eKoJI{BqWg7Q2|91Buz+wpp=h@ zh%kJN;-?~FXb1ez5)74Cf)OlLiV&irRe^+W5|Zq8Lpq~x=I(oMX773To_p>+9kqA2 zh1ohY6bfY#78(?T>~=ac!64s>6T6fs6viwpC?Gbco}9`@H%hX8)-E?lq@!4a0+8uj zNP6k!296)O{o`FxzxH@r^H3v|PDNZ%Fih@sR!%i$O@BBsXDkw33Z&C_0(3eZ5Q)|U z01$~7YzINw9{IahyEzq2-2{zVz1(p9iNG`_Jdc-Xv;q>yo0yM4&t7xi*Qr^)d|>0Y zZGDc8j(onzO~~g9AMyG8hkT(>D2HJXgW-S(CW50?*GdJ&oq#*hk4&Q6WriebI5w+5m#cum!Z69_}?z@aHNP+D3K0Hs~X?sgzuB}Nc4FdSH7X9qDUO4a;l zf~sp3cm|_e5fr^tV%ol0pJb%i$&&AgGalqxfEF(PxOTSMHN9}cF!)z$OP!;0?(uR5 zO2@7KlHt;GCIS9N8(!GXDE>A~o+!jsTE}_ayIDH2%#a)C==ySiXPWP^8a3FD^$o1M z_}v|UOja-UhfUt>d;T%kPw`CFKHKGM@cg{T_X>}taiMweX=d2?=J zpf$11i~YQOe8=Pdic#yUOg%0+g+wCdK;ifNL*hzVWo1PyDGZ)!!80}*zJ}v5Uj5d- zuvig%fv18U(DwGO1$TTw!7sESW28U>hynUU$tUTf-2BS0pwRq^A}K-+0OJ{4<33x2 zBx3YHU=<9*=CP7^j8lL&CdAo_+t>M-nH{q9?x|v)MZO1MJm?x|Q#;shfB9>xH4y2& za57s~C-xJqtHs6`MrXFow61B{fRYE4Jhh}R86<)FYUQfSBfi;JT`d*MGH}K~DIg}& zsX4RO!%@N6M(Tyy(M)f5?2dvGf*Tg1DHX5}8tdaKn5HFhK8atoP#gAM0>eNzgUR85 zn*>cD5kFP`_GRW~H0Q-AO_ga5!EnD^<^T$=i6hw`U5`D{#f~%T;W=i(SJBBd>}iR@;evZQxev8%Us&H)1#qM8^HbZ4 z&#-UzBwO0GGE~Z`iq67V`JEB;O0T3)w6oGaF=zxp3&(;HwTvSGDvTg|hxZn# z$yyT<%{E1;+FvMLYUl*6a++vf9v+%BM9}(_*{hV7wo^|qp!3mj@f4bJY0^?4c4(Vj zcZ%#=yajDrVI~;Z58|IEG`%Q`*nY*Z3LzWGm~H#auTgTC0nz8?{v4J8rJ@@^ebNnp z3AKA_mKPmdp!u3IR#ikbt1_Wls`~?E`sKcRr5eMG9M!)Z7)Fpa{u}B>6dZ-dc3YXI z1zTZKdYFi~exoWE=WPVUW+9D=@J4w{AyI77a@38dr88O|AW)N$9K_Lhu0DHr&Tu4B zkM#m)f($lO5lr-VTg=E;U9=S>h0~#I@H#_po)kr!fx=a1M_;es1#VQ2dmte_~y?c zF#e31ITR%$c301j(U9JS5%I(Bx`P%mB5)=Y!mc1cu*v>QClrJ?G^)cf<}i0AeYNf$ M7Q8p;Rv?M}A2dn|`~Uy| literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_add_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_add_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3a7bb8e8e4b655255d4aa7a5842501715928c1 GIT binary patch literal 2191 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 Hz~cV{;QT9F literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_remove_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_remove_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..e2573a954013487feb563ba6455bd1b9ab0e9ac5 GIT binary patch literal 1511 zcmX|B4K$Ql82*M#R-fNmrm`JOQ4%wpO}onEHzGf^NZE{;p*@ETIf;xJgGP!5t21md zyHcA|`AeJPm>EXK8f&Sx6*5zXbD~V4nPI;9_70u>&UwFk?>YBA@B2K@dv9?>*dbGs zEhZ2InFa^>9|a>$AI4blmz_VLh9INHV1J(P+8jwv9q_7#%f zxVVsBr#I(5mJT49P4y$SNsJ_L6hcvo*ik)KoAG}3{3oMOse`YU5eG9EHRST4d#l{MpP9%=bpf>J`2_+JdP$G*86+_MKo<2UON!4*2LX?gaW6`F+er8a7l^5>IlQqAZsm^tVT=aC^`hH6nJQtHRbaD zXE88|wLhzFXHM_BQL8nMpybHQJeh#^d02OQ%qjP| zBiD9^{dZN=%*H8*_Q1vJc#dJ-r)nT9cY zdZc*#V19C%srSzbBj#^07j{QA9q4P51qhAE*kjEY)yJWyv!ODBQ-xL0VH0QRx0nU% z^++kh`id+d(c{9~X6%N2+eS&smld+%0Qr;fstFmhm7je_VY6X6xv_E2hQbrR$sNSj zxB2G!qm{!%OUMphC&J?->->Vc-F8^py+8JA9_8zM_eT%47^_SUL-hr1q^XWbt5duF zp$vLMu4|fVl;s1wqU#sssDKZ%bVLGyz{J0rz{yZL2ZaT=toB%(H)HBkBAHyZCLASu z}bu&I+yDH2XcL~;}&0gUQ$sWOF}(vI91C}XqP zUwqUoRtLYE6tG|clbJxK(UQnyGDW>Gv%8>XA+GKl-RD^E$|WxFkPi^j35;dwb_r;g zwe*!E9j1V)IAWn;lohr`91y&djQRd$_=gIrb=#A6u1yQNPdY*)pUyq&>8hwS z2{l{Il;3xUJ9GXzpTzI%JiFv&h=1U0=)`mG;R{lL<49jIs!gQIrj90(Y0-)8U`Njo zKm62k7W0wMAGWIqz74~#4-A(d@8T%59b5;iKQBAL-T5eviCh>|&dxY-1T0qf3!=vZ z@K7uen_G(AJ9CG`X)4`Tti8_D&B0HHGwF}ZW~Vr=!gZf;ntye#V^Kn!wn&P$+-sST zij9m+1t_Rbr&KHf&yhsAycEOnqzl}&2r|tpeKGlMY8UTjOSRD&rC6a9SO)e6$8_zx0Ukflbgu;(I6+!f_X#F}kAk4qfmz@6}IUes$ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_remove_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/round_remove_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..465ecf648053a8fe4e1e213fe9fb7fa7433d83e3 GIT binary patch literal 2064 zcmYjSc~leE8x14`2@{~mk|1kbaI0Z)t&#*p0TsoHh!)MTi5?XwYK<6^Owh4mwvqkr_n4yxRMhH4%)=~HBzF|nzp1ag__SU5PI~&NXI5$C;rZ8XfTrygIJr=~R zq`Yt<20=S$hi*ox18=Y0D?G@}mvpab`T2(@=7#tO(B{$RMVn^ZDs39Vo#Vr< zM;-24P9JEzoAuj{2bXG(D$LvIQ>e40j{*leC&a@CzVP_rZJA4IGMJJAf@!YlAn1n8 z{i4K9DNyfCw1h{fQ94nCDkv88Sfdt214Vq)5-j12pI42%j$*o9r5nJ51Z&!)@&J;6 z<$}v_E*f{)xIvf*s8Mn9ojpMXUY-7Hk38%B1VIM7H_a{s^1tU(X6MbBEK?adcWYx43P#1d2sX@xH{z_*pS?Uk0c@mgtlR+f1KERGkd~%Wu*V+hf-E5mb_BlDf-?U(^&kdpL zP=gzbw)L$2K4tRpniUo)CJz)X{=Jqg@OQyUkt$Ymp_6j>#JW@jo?i7p=6)ZkGViZf z*CouIogXz1zHD0BGOM!V&cphI?|U|RYq9#6Ws*S<UGeRjT-P!#y2 zA+rQx0W8u)`PHi6jHtRzZ-$K;H7&Hvw`tuKZQn9$sFg9L%A(Wvof6NFuq_7o7VgQf z1fvV5;Zbz;`~@B!3{j~cFGQP-a)2}cq1na#GjDk47JI&lyB}ckd8wE^ck5Acu9F~b zh>sEfGeB3EQp!AxJko#LQ&#?&VNh3;ZZ6ER#fq6y^{6Hgk9Q{pEXSgu@`4Je;G|gf z?3ObyKvV=GSEkM=d|j7QJL2QC$S&QX%M+9Qo2x&*jgvmR+@V$16Ohs@=Z~Uh-vp>& z3Zk%EwDvRG%a@TW*BWaGn6~MNMuFZCQ7IfM53K+>`gdV@<(5if+9?|=6A=!B6-8ez zI&NNc`PR*j7OkQ0=;SpL6i2G6N~CZMWNN0uESEkr^yhFsIE1Agox&Bdx9q`+?Tb*RXdJH)fJWlRJ##+|kx&L$_x9ivPFbw}PKOz4f%| zRUm$067;=p3y+w|m`NnAWr!3oHM$8X<^pfHYk^YnXy~e34!TV+F_9fU)J}gssTHj8 zvU9&{*e}NtA3_J*J+CdUDGc#MV3W(TNG8Q2%6i%lX$%|zFreOKoZH5r|{9LdTK6q6)6r1 zZs=MMW*!X>;1RzFa3cCQ#V~EY8iY>zJRz;_!0%Ii(kHt}(v$tE6RHc5b#25p;IMh4r?)Q{Y0sBPG@@eyKh9Uu2FUbwg`&w?a=x#X9~-XFGX+q!tXHVd-X66Pou x?IrX|we5`4dh7K=>t~&tR1rq7SN7DifyY&-w|0AE9{?uTW7cepyd41w{{ePN;@JQI literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/rss_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/rss_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..86606a36a876f96c82b321ecb496c9607b555a88 GIT binary patch literal 1915 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 EFPJk%!vFvP literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/scissors_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/scissors_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf9393a79cdcd8f2f40ab17bb1aaf3d202d6992 GIT binary patch literal 2259 zcmX|D3sh2h8poW$%4^J4i(<_nT6U`0P#jAeg);N8KAUN>)C94#Ik~<{B_CYK5jAT~ zQ}InRZCgIdM{R1OlAx$*vYC~yL`*TCh>9QrcW+VqopbO1od5YAzxzFY-_7v#b~V~; zx*35$7`eMS{{)|AAD@j#_N-?3pmk0%$2Np^FKVm!{>&KGgP+6uid%6@n< zu_1Q$U`l!Urekhy7nm)~-${G(E6Xc~JKEb1nV6bdjWi~viC=fKQ8nfIIOcBVX<$kf_{mbABttIqrM{~X;%tcU$&OvcH1WF z8yFanda}!>r+4h!Ifo(A)oqJot;bkD#xD@6&NNrR)>5pjP}dpe9}q|+l6BFqI>G@~ zWWKE?+XOZy&PGPMGbsok!^F>mTzBRI_eBJMuLeeTtRIK49HMljVq)?s^#a zmf1Joyg8^tN5u*B09XPJM(*?V^W&P~WX0lp9|TY=%HTAAiDxQ8727r({m=YEeLQ_q2rNL#f{pO;j4n>z93DhbZB1L7aEG&tzlXyA3 z^?BblF&qPc%S@$&hKACXB}V+07HNBu)Qe(VZRiG_sbMNBl`DD_CWM3>5~PsJHQ@Bp zBm~z$C7r@9mYsa0LrC4_@^Xre94FCZ?A7Y7i?RiM4)0DF)kTt@;pzGP-w80f^R)F< zBR-c~O&)D*Ru$K&XNQ{{IGpI{q=8n!(tA^G|6sSW=ObCb12W6-L%j(6j+i~KT?^=A z-110gX0bDwrKOq78#hYDlillplX*lI5zNa?R85TUAU+If`eXdsTwqBc0Qc@WrR+V5 zKP8OBXth^lK|wRY&DV#ry9VZTaCy^=`Yb^1bGDyYew!jVVELT??DQ0HoD~Dj^O>EES31tQ%S$Bm$m3qE*0!UL9T|H#ZvsoGsoP9YuPw91lahOIWF2$>+gHR3DIg%?azkjcB@};HL8f=6 zlRASb6pC;Ekf^;!IU$)(EYWGmB|q{X{230E>?A*FO1>o3+;R28*x5}ENFB%i=2Wli zYu*gQAj|%bhAYmPg;7Vo+1^!gddr&j$X}Q!SGs0`s#M7x`K1PP0F{TA7`ky%_E?=? zGYF0xwX$kTl9!5wk!Yl)AQF51fkIWWuld&|5VF?C;_-Y<+Fa|0xX;Wy!%$!`d4q#m zt0vl7_EG=w?yD%_<#wsVSo~kvxzvV4P6{(sHfwYCmgY=n!f)q<lCd1UF zW`BED$40yv1bvjG2x?9em|5KEikd$hAb7pQ2^T|91Af)S^EdNUmz|F;ul!V{+J$fa z;lEb`k|3NRzrMO2GhpApcIZLvh(`A4W*dhDn$We%l-~_>LotKU(~{%K+_es~1A-Te z6RFqo9+nyL9~9p+X-S5lS0l=hjRzgAZbw9gmgTm+^)SWv-w1NyDbZ)8Wzh-u_i09NJp8_r=6$~l0P6lJw>Gr?hR zxt)baXN<|f)7}em@%!&_RG!ELju}chM^%-uwE<^OuRgzYE>>3+CzM{OrKKefCOLV* z#O!~zQc1l*+%9!mwpeJ9JdbY-4-ZFIRaHIh>FL?*>FK!v-nlz{Z3;{c}Ym{mP`x}UV7wzQaeO)adA0y&QRB7U;aPz5j9s_{^{y% RwfGT*`*CmQhfb8M{{xw;o)G{5 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/script_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/script_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..1cfb80e62ff393dd9bc2630ec018e87d2c88e129 GIT binary patch literal 1241 zcmYL{X;4#F6vsm#3Cn|kAUuQ)p*n*&IAn23XDBAnAYf%3T9%@d4QQ)Y7{JmIctmy_ z3Ir-tQW4ND%Ctaf#kP=yLL0PPartlisMG67E1*pIq~Lv{wA{b&K*LBKcl>E zb(Wgn{L@8A{goSbI1WJ8B*Trvap!2*2S_c$ic`zbF^abKitlh#OjlBD(qr`}r+dm0 zv7woZ_j}{f5&8SX2{EL-M}!I0c1|Hz&(3f0rT)79p3IcAHv#db;!M9&Io&H-V@w`w zs=aL2U-IMNVJK)*Z!a}zdhM)X~4@R!$kb--hbwvdm%|*dq zeRz9AX>U~ubd%HENg8p?D#mAb^>LJfV>PDCyUVN)vQpE zGj&II05(4@SLr*o007AQhwqX{y{x*s3K?RR0YHiB6~yk4rq)FPPb8{ZizeCBb`^LQ zo|(<#>3^XGD-v2s5RkDrExClIgN6pdLi6mp4K#ZNozS-nx@=e-pqbOZmBa z!_MJq+dv8*X`Bc&M~)&$pZvG%J#JIRQ-}DxybmttrH!o|AvF`XDa_Y=TQdE|Tl^GE zvv-8mo>phx+g2Jkm!$rka2Y6@m8;eD5A%+k#{eIn>$7v(jd5QvTRvr5b_ zI>nv)b8i*y**trAnM#2|nYeU!QU;$JDN)Piauh#7u@6TFCS`ih5A&JzEIM zmM__`0|{A(Nuyc~Xf&n>;a@Mpy#1vTh-lh?((65Y7mbNzaz4YG9LPUjopuQ@<{#`| z4?L!yyHHqUt18OLxh{=(yI`%WCq%6BZFuGNr`S2Er1bpKf(!}37ZaHAKv;A--I`%f X=<#W3viBIcYk9{-Cvd-s;$8h0>*ie) literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/script_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/script_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..cd530ee6467a11cc6a5b69c59d32a7e6eca09a20 GIT binary patch literal 1598 zcmY*Z2~bl<7|z8D;DdxgFyV$UgCmCtC{mytnj$!e=vdJz@(2jnQ7);9N?wS7P^g?L zv}&}6!caw_BTx$omp~cJP#r;QP2vHAsV0I#FvoU7keTkxzMXyZfB$~}_x-zN@o}52 zEFCNf1cFseGzhpiQ5(^6Va_1(iY-=6$FnP&>^ofd4UywNB6gPrK^J1UV3>Q5II7M_E%p|G&J zOt2m>83vGoVVV(%M14j9fCv@yIh>~*tReNQ5h{|I>4zNXY_sub-JIahX0uIc^X_x3 zBO>S#W8sl2Q#ZAjtxi0wnhady=bqeF%u9)iRFZ&rX02^4t-z}zO4b>~eNEf0o3Q&A z8Lm&PzZ@~Z|Lu^nHz+mMi#J28C%Pf2%)Rcc$o3dsaAe-A=%{)oMtV+hW-9IbkAl z&A~*ciepJ|L&+_a_blr;14#dUB6xL2#$@(qGj`^O`goT|W9q@{${>12`9-d;l_0Dr zPqudv2~P%q8T42T<+=rr)+J-S^=T3p)x;&B8Ydzp0B69#H0T!YWxpzM+jsu7UTMp4 zG=ZlDI4~HMHX_qB0Ice(rFyepIJYaAp1)8akRQP2Yz$4w3|P^e1~JB39Z3Kzx;Q8q z($q%osJRd{qCj-1MmU+p3h2WxP8SyvO~Fb6q=2HRm;tSqTwh6D^u8AMgmVkol+Z&? zKwyxVVF=J+n8Ms`_+xl@AQTP29@4B@4)dch`2L~Y;TJrq(OYI9Y2%Tu;^iy?9EHSE zu~aOrst#if6H$OiJRtC?OT6C*@TyZf0M?d3#jY09E#?Ar#%3Ir45?{f+aFyDn-<7$ z14pNw7b&DF5sFqodGlYy(8~kDS!5Ml9ZV< zAjGdOP-nI<-2FsVBLQ?;E zAziJUItI5m>T?KZ@?o6W5-nR2&NS##ghd1vYpnYWF)G7iXjp$i;pOtFzG*>{Dd#=) z?06Dl9CjZ_HBQ-6lN95oM2x$qDM-s|$Y4T)UaFq;>Q_?dzNvjl*luIrNQN$a)UUc8 z{Qq+?jo$G&fyn=>)jd`w#_4U@MuUx&C;nTkct&EGRE8i`-q>aAnCAVF)(n zbayICb~{?4!TI_F6Rj`2`lKRD&%Fk%bOU13GlhnR#-gwdQ#7XsmvRb2?}drkInv3gX^{&lnTK+k=$*3_>L>r)0*{V zE^{=iWW!=;RdHFfTf~|dt44+_j z^MTZDwMJ{_muMmY(Ok8(OG^tYYiiQ*jxWr(lgVTjnRRy}fY|-Vk6=$;1i3 npx3J5Mub)!4KV>fJ@sV5*|j$DbzQ+FMj|m^#BpzK#DxC=S;y+2 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/shield_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/shield_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..119c4e896cf7f195d93a253683452287297a90e4 GIT binary patch literal 1643 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 PjqN>p@v?}jFg*8v`PF5^ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/star_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/star_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..4fcc138a5be0a083a6ba440df256fcbb01b32990 GIT binary patch literal 1411 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 Ma#qsyMCjeW0aILSK>z>% literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/stop_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/stop_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..ca630fdc1304ae93ea0aa74b7794b97d2a505fa1 GIT binary patch literal 1525 zcmXX`2~bm46b)OT@M)AH{4fdu5rwjZqzViWAhO6}!cZ-sAd$V49fU-LuxK!lvPvzb zpj3-kBZ^c78ptze3d zFc^LR1KuI%7gjADEc%|wbzj9`v;_X%UWb^!M#my*rq6W3z`~_$j6Exs&aT@UM&`6m-LA)S7^PDnf707VnTE9U&49upl@NYlHM`~^0MPn!A zNhmxhhjwcT3k88RB9W+wV=!XR*qpHjqsSs~5VJW^5D(%*0N#r?^$;M)s%(rBmvSiZ zvnF-!S(nM5a7o-lV4d~X=M+p3!+_(^- z|Fk^WYQseFf8F`J(q(MlyxlAWB)QB7w0A8j6af+G4hE3a1n&BN3IZ z0{Y>E99GlPbs?&t1O(R@BNeBhVaiC@mZhSpzaN6r{}o08pnC zr6fHVjSGNA^qi2ba)E*@hkCYpdTuFvC|h|z+}RVR_l?D2ZcCz<8r2;pb%DqtW8ua4 zLN#N`_3B{d!O-a}Btd^xZ@JMivMTs^x72cJyZcGHB})&cS)8nN%hR^se;;icRbWZa zHZ-vB!@D}mgz=h+?`%TPVPn;I@Giv6pHg=c)LC9u@Af}IUlqmF?{R(C)*1I(a%Wt~ z_`4=@D&E8DmmEx_ry^nJ)rBJMs{}4i71Hf~yM7@7){?%*^>GqkZsAD`XfpvT6~}E6 zb*7O?`L*8JAcL{$)TBuye&GB52+gHX4bq%N&w{7#TgJ_oxn>3w%eE{(8^o2lVbON< zp1vm$E_~>4_-d!lN_xiLnuE|x63$7_xeKORgdA*D+E2~6+nHn3`kJ%Lg?`8I#D2{^ z-pQKI4`R%nc04Cv$}Z{2sd1ioY+BeI@OOX~(-PTmN-ZmqL8DF6(N*UfB#21Vw>bOS z6icai0*#D75Ci~;r~m_tYwO8aqxK{$jpD(H5<26LdDtXWZCM{swSLJTB-?O+HUTbU zSqONa%jNy3*$B1lDII19KX$Ro)42B+GsMTxtvE?HuDUU$_~udJ$&R?DS!ZVP^Y(q| zQ(t0!Ki#4{zxP#nYM`K0?B;B2UB;t@p0%WFWxft~lA>)4z@ZvPU4&rRub%U$%W$gz z=-UZEUvt<~emLo$Dqae|p{6-|x@N3n{sc7|RImsZT5AC`^T`Heh$GEwikn+*4TSoB(_QD4m`PC9zy6Xe0JivPm3l%S#4U?E-$6yh)UO>fVT zyG9Qq2(n3|T9cfv-*#S_uW!BGOmP+8xFCmn^LIWlu($WZ?#tQ5d2h@n9q{j=yfHo{ z!dhu>Xo>dJKCyFh`MAh!t!p>mEtaRr@x2AC(kJPursi0hy$`43m5?kM7Ep`~Spz2F zrkkuI|2j0LWzVkUn`hNcht4(_6tcmz;*(tV7X4wXuF*}p21fs-_USxX Q)K{uJ{e5WOZB$0_|7oVoYybcN literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/stop_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/stop_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..09847dec51b6ed0dafa0ee51285f47a4ef8d67f2 GIT binary patch literal 2225 zcmX|C3sh3s8pbG6V|-+j=afxdwVWO%f;aUxiQx;oGvdn9UJB9?8`DHHLsJm*(gQOo zALGq5?P1xBmG;oAK(Wl!tY&I7NuW|@N(D0$p$+G;sYUPB{}6(l>iuQ@dkf+Tqb|J!9 zLdFSDG6X?Q(7+wXIF9M#AGSedoqiOe+a$1uVBQ9kzm==L_IUpCA6MGgw>Umws1Sx0 zJ;diLJ^p8tlY^oIgu|AmIEFU)eu{bwbyrsqw3Z#^vN@l3z|5L#lj%lXM%+(43wEle zT!A1HZzqGnh+DGmu@#?($K%D|?=?X&VuyI3VAwXU>9XIK%-^YHWI}QS}Gn*4%@kV50%*l(gD+O1ee`8hKANp2uCq0=r}|RP=mA9d%gNv#+qN zTYFrIqA1=>O!3K4x?!cL7{AI%gy-=VA=>e53oI6t$HHVsti$D5(jMDbyMS4dEqz^1 zRrs#NNW9pulxRTpcCR@VnV@#aM1%3#g4fiG+m@|4fQzh46p+a!Bm%(@n=@|{3Y+sF z1zS*1F zk|asN_3hGI!rJ>u&ibPWLiar`svhMf`8hK4J=|PF=6VBi(1)=(AuYDRF_u71Z-%z` zkU+Eok3LKr)CLT~3wXRy=UFNmm5r9hX(v_7%6lZBYEgNFK#b-on2C4X3ojZx+SzYj zZp3}vSBWpIAM^mW{B6_sMeFAH`(ym&(MMgeOHauMOSk;Y<@1&{5X*uJN1+Xbx#Ctb(Bg8AdUgp!Iclrl5i#@n zLWniDBSkI>LPX(s*R8@;%$uoB^b%c0rs8eSfxPQ2mqbD33n=Y3KcP{UMY_N;+IO{% zll{+c&*{*CmIj9D#`U&RF%N~fMgbySdB_1miV|Q1iGWN7omBJosi)xhm3R`Hy8g|_ z@pu7Ud}f&53Dw2CMZzO1A4pcVb!tZXy#<#YYe-i;SMSv7gvCm9QjJec6x%lqIeHaA zFw|Ry5)8WTHuL{y%If`w#iyT>1Aogp>86e=$4<)eVs3!7YnaV4+^md9+?q(L zjy?9s7MH!qrm>1viN`qj?e#-Jm%Rgd1oS3=^y@yncevcPd zv930dJTHFRuya>V$L=55l0MMacxLsg=?J_OghNdvqG8Hd`ZscX8p+GYqo!*lgHexd zPFR6uv1|l9u+X6UXI*TZQKx*6wAy0x(jdX{#iO1EW5D(hLIazi`S2}K*4X_(@@Q%T zYc54k?@Tyd0ZE6%JZqWz2xfff0J(_X$#0f%k$rN2sLrW$Zra~)RdV780bLTh1b*~Us<9_uB zjof2vs(-io@NRF4#)0~l#j&T9cLJ-~{$PNxC?ZEhcYOr>GNErJ@md-lqti2Vd5#`;u zrj2xfGW4$CCl48Wa{-M`7gt E1wKbLegFUf literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tag_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tag_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..79769a4f10261f18a6ea5d75629233974da15718 GIT binary patch literal 1695 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 T4fpgtvg=ZkQbk`U!e##eIXgq0 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trackback_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trackback_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..2e500a5f8cf59af74a71edb43f4cbd7ffb98f1f8 GIT binary patch literal 1435 zcmX|B3sjO<97ma{_$ivEP>!@HbsZHX4JOJX%~0l(oLf!_&9-8?(wv&gE6E2wu$DUM z5Y5hVH7&Q6nWY(;ZkA@NJhL>kEi?0(`518bft}rRe)pbx&+q&FANO~^qR8+NYt(ua z0)en*?GB2DSBwD`YvB3$w*gBCgc*+&#NcEpc-*r@_z(fWIf|)qFe1B#KKecLcjUYW7wkqjDi*lahO{SPNZj=??_vyADczYyT*N z-4l0;t?CkU_wNUD8PFKVvm4bUj6*1nRj2FchC>6UD`Ex-@965y6U0on;JyX*)4lad zfr+8@ocpe8jcVnjvhA0*6`cIW-mBx2db}w^k~HZ1<*aGiFn*JF-Hvg~9ASdcWfQIS z5oe{4GKo9%tjb4dLP~N98H`;iy#9!Tz^&e)2&1nRX}}ICh@960(9u2v(8cKCK)>`` zI{MEnmi&yU>V#Yaz%(QS6bwv3?wKuz_h}IIX)lC25)Um-UG%+~r(G~O2Trk{fik8T zVI5_4_fVFATDl>^)=M1aUhT;2x5R-6q4}a!vx#z@RummmMs)EZY?ut;s`A2aA08Rk z1;y^%r11?Z7f`w;mOTh&*Hd_V(JveYVJ;B00dDUzDN(KsHi})Z! zUJF1BC9=!J4R`q=`)kgF!5yEe>T*kGs;TM{N!^<-p1zh2`JcpaewE1eRIBJ;YZ`WYs z8vMO12Cbz4#<(iF~ zk-P9nBZaq*yEH%lq){*_12vd@(1oj4BVuE>N|kLj*nCwd{EiH6uyfL7zn*;vTABvV z!B?z1umqGDVHj);Mo%jCq2{kB8SJ+&1Cl8)-N3&>SdQ{b>nVAY*jDUQXtAyGjpPX$ zi^0*dXZ>9#4!JgwS9ykiBK20HTk4S4>32@vHCuYF(wW-n^dw1Qo{D%4t=0XzIMpTq e!z2QMu&Rwjw3Opa9ecN2H0)Wy;Xw^duJ}Lunwk6n literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trackback_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trackback_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..bb10f57a09ec8ee5eb0e0495a748b262c1066c51 GIT binary patch literal 1811 zcmXw44OCNC5`Gwnfg}(hV!#3+ViB<9Pb-Kt0R_<_wd&F?t0blY+LaY4o)uUm31AGu zD#7Il2iwG-Qm9mrtw8zlJrk-yA%UV5YB2;XKRvbyTQGqn@9j&_ch1~<&zzZW=9@Qj zZ^ePsJw%TH4*&p&dy{t`M0ct~a9DKBFDhCD0PN3ucgG(txFX{X*8J(^Q=qU)?gB8gA^U++cbVntuq<26nL)k&!5Yd>wPe&BTRazu^_LO-?rRaMil z+9PDAlv<{v6Z?&vcXvcmH%ARY8jZ;?QTg@x_Sve!ALzaPjX_S7ggmGx%sR-lDK)>IZa9$fj@zjr<5*`k{ekiGiaQU6{=!cT*^-l<9ov z`fR|nvFLS~FNB*Yb#>qSQz#Vw7s9)YoyChE&5Zo1e@3B1@#ogA!Y0fVFF(wV+N{w* znot#_xu$_MEhuv6Lu#nzo@pr(^nUMA?orQQtmf7hc}vw+4EyF=7~e_{R9NVFXIa&E z6tx0mC3Qxv6_it*sHe0XPc8#US};EWeeh+83Eym=e|~7krIBr+J_jSqFuk_t*^_tK z4GkXkLCt%9;}Y-mC5PLmtbR|Y7mwxnCdO=Ji_;HO4st(R-@73uHTcy#w~Vh`9Ayw* zi1!dv$-5Pi`GFtCE=7E)zFBanGYaoiLpqTKR2znQ&y+{<)`xN zQA)3W`^E;9GkT5)ikwBwk%#+;86;>8`^Xs_7Djy9WC7&ZZH$(W{V>?SZ=}_TTnIL3 zBB*0mR{YV=$m2!cfSXSn%QF>6B)4|IXz$-jS44yzy}5vnAcCj}5)tSRBgg|tW5P#R z)&)c~c``bVG+)S~sSRh`5d^WSObBusdmqUmRJ#sopnglO0aX(^Qt^y^87NT)%qak~ zHRRsZ0`d_Si_PjCC-uMz6N%5aoIS)@weWEhDHl9_t@qJsNc;{%TJgVH=Qfa6w+es` zAt*v9u-&dUnT_kQ*aDhOi+1)ylhMd4^|YAH^qLY1Ka($*f|`S!h^UKEFY+%z;2~4P z@&-%`uwpi@#jx>owT@RFX!`RhPpSt+@k{E*|79|mY{O%()l7a9^HO*el(Rdr10)P0 zB~07O{xKJ@1j)46tzL&Yq26rP=PU*@fAX~p8cM+-1v6k|(1hr{n&vpzv{xJgD6)sl ziS;1Nu)+2Q$pW&zt0bvWPiV<0j$XnzgH_cGxC2xI^y44k$y^1E7R{xWUvX<+z%^FQ z$I;Tq&WQ^%dYc$8F7Z}#la+En^bV+l**1G+@|~0|2ug5e&#(&`OFgU`v?(NV_s$a3 z*irQwEX=fJTFy-YSwA5Jl)$mNxQW2r4BL{`OIngOBO(w|NcOQ+>xBIn5J9ODo276_ z%;eKn4x#&Jo8_exlXRa);E1UEv>-wavH0%6y>=ik3$MKQD9vWubjfwwThwsac(!6h_q=VaCk(b*%`nP>N`?>z#d1&7|9yOG}oA(O?9JkLDFdLKg4*lN5 L)ZMod_@(~`jtFP= literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trash_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/trash_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..73595a596ec6bbf5818085141d411d65975b4ad4 GIT binary patch literal 1249 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tune_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tune_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b1984672f58896027a0828684673f799717b1f GIT binary patch literal 1553 zcmYjRc~p{F6vqWL{cuYSvN1DToZ}=O%4NjFB3E)LD;qaN(H7H8OEU%0MDyU9xlCwg znoCVOc5-ksK{0p3t)i0?I@)3`VCDdce)BRc4}v=NOI>#?;I^vU^0ja0L&o(0EW)|vawSPf`aGh z4I6osw3jOe?Rc+aiGXA~HC%71t@Zm;WL&%TGN-i!r)Kxs2Z3O4ApdOu6R-+E%J|}Z zI(>TkL=mlC3T}rEg#ZYGBvQmIN&59j!Sp{Bz0TiJ{PWxN(=dSgsV-Au&j>BwH!anz z8n#tX_oiBc=(y2tmdB@4GpExtJ=xsGW+aQ-m5f^JXE}r@b5QSe(MiX^)VU4Fl#F{| z{_+d-e4^FSz4Jpe9pS+mT4#E_8cY!AS&QJYC;Y&M+cjR)ntS2W*5C%8{#|WWgJ)mN z=_+U=j&yETOPs+~6=l4`Had8`9)2{`-Eiq{ zyh_Et{V?7Fn`GGe#(8&f@)+;7On^^C)is|z0P=N6WUYgjdzoGB+ADx zdwt~*-X35(o;DxE865I5o`EZH34BKbJjM_|8aNW5LDp}LEbXZuTQg?5SN7k#X~c3U zFU`&-HL|Fmny+;2|H;7hbBmdDzdQFvV|7!@Vjjh*ZBow9pK+btalKDNfd>^^s|y3g z=`&xgRWcSsz-6)ZlELFB-6 z${xD>rKUNKvzqX%@ObyNEF01*-y8Mmdlyc~lvN|kWGlKnk&uI?%B4MGP)K8hayBsX zZ?cN%w{`&-d6YeEPB-JJCjijxA|(`Wf&-03FrGvzUC2r5c_Wgq`<0 zylP&nnHG8N_Fkc3yPeJ!&1I6?^`3+%pTuVXnHMdLt6=OdTy#5e9u1qIP-0V*nueXme`=XLarSDI$TIp^z zamZ)&dVUV{Y^w}}m%&3^Litv{4UwiY0PovoEU8sX8az1x>MTGtCHTp{W7@T-hx76ra1Z-oq z01qG1FhMW4ec2KAU6``15l=WYEViAxc6<8Wx*O110$zdskm9`v3gy7uIlsk@l-$t| zy*{qS?zOABet+RpxoHb(_A1uz{b1I*yhP+nTHX0ymr5bcDZR*K1FrueC&+@#|GKvt Xtm@n4f?Qizlw#lGh&SQUAyWFk_B8G} literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tune_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/tune_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..7b2f2f8e43902d26ef03fe0ff24f03ce1abe28b2 GIT binary patch literal 2174 zcmZvec~nzL7KZ~b2*Lxx(gp}k!lD8OvbnHIfFP>~7?rVgOhTYrMifQ`MIaDRK-m|= z=0Z!iG-6{QA_^Kv(8d8-MH>YnC`+p&L6!hn-UP7!n>wf7J@1}ZU;XZ_TU9SJD9~G5 z(?k;ngK7KvP(qXzv)VN_D4(a}qmXSvIa&)c) zTDeAPALV0BdAz*RFA&7*>%hF9|(a#;uaG}r-l}nJ@B^IP0Bq&xmqP|UEX8d?q&ZFz?% z``oZOD}RX5Uo!YXJJ#l8EGe}sKe7~-$9)F(T^~+TUjrV=Bj~hZz;;u(#sPL^2n10M z8hJco!e0H*9ZS`ourW5u*q--cd7=KE)=yF7$#m48!9Iyd4EyY1c?s#U+ZrR_3PFcV zhPB4GKW?SXp1w2a44-*;#UK(xpYG=s`<=-7Q4H5A37two9LA)g%lgtHUWHq|{C?$B zzfc<0NvW2;{%#Bw$Y^-KdDpt8{I-qBcm#aw%~NeU{Vea@)C?NHF8OdWu{uM+p_fDr zqdWcVod;S}E$mPucnkmJ4DRhH!2>q<+pw6GEwNutk>1ZIeg)gABP!O2%mS_+I|!kM zw7Lfv=raKS=x0e;cCGzZ0y8WyA)R>zBi=%O>F)k?W^a|&z}(Z>Gq*o|XiN{uW% zpA~06C7J;y)z62Wj1GHy0AtaCed(0?^D!c_Y^U|+CFROM5Vg-=GnH(p*5{%2ooQ1F z6Kal(v2x1a89P2T!pUc&9ClO-W^z#k`>g#|iRxD723vxQHy@W{_y|#w2o+o9z2uUO zh=6%K=;ygM>L$-64KjyvTkwm*C14frQm|Lki)OTE-@`5S7oB;kfXxN24T>1jNM{!m zjsJ5dw{7b-hbc!_beu4FIH~$`!24u9brr39QP+Z9gB{JzITUB4ovnj4p^ozNklMi& z;ukWz^YXYijlbINH+8ocDXSHNn7sr|0U1H=%eA_Ho#87sHS4>QNvquZChg`}8P=KP zyor8?$6smLGl<`Rc}urE|E>IT^IZIHjS;m0mFP#&9$$4Oen*3LQ1vbDp8{@3ILC9a zpPCA@V%)1PdYb!-bk`EqPtZ&aGNklv(+h#C?({pDX9xe`x#Bef+wSMy3yrp%3NfM_ z!gGWlLIfken$(HxxVf?B-wh>K56RmF^|^j?=CoUjhJ-SLLd5fpI zx$d8AWjL`W`S@?CaoD$@ku*kM(4Kg=#5l>+$EM%W>%MrshLqV+GAVs%_)`z}3p4aq zDOyO<*i=wE#LdY5Q-@zF(KPI`_dtY%^G2N^v472rYupDhbyAm1yG5UFhcmS?BA3|V z@2#tfj=!;8XC8S;&|wEDtHzgn!EXqvIq@{8UtTSJ`9$9raf()jHgqH1q_J;0yk-R*jURRjr1emKhi` zZ>P)Uh2CfNUDD5O;w*0EJMcc{5nRmDcvTojtk=yxbxSp(AaeHp?z*&a*WOq_FpnD^ z&rU4Yd-lYIqULKHa;fytLwzLK$!t9hMFgE>JP7Q|fLMmqUwe0MOfk0u!FP6Vrv_aN zrXQC#{HK9f;Z)EehTH(*z>j?6?c1}B zb|*HquR2m&Oi{wRQJ>xNo>sA>hgBU8iLR3Hy*kE88s8ODq+1BruBO07@jy@l71!FEo*})Yap2|VWQPcwEnMwu)F2fLd7%`1l zcnJnzIstFuM{yD7p)C(;)%GEmbwx-x17p{52?elUZtleW9m5n($f*keSqeN!CY7k4 zOkPzv;C*3igL%4YKtSNtV$pMN7Mzz-iTD?z8cKb@YMx+VPYHamEnG6foVxgb}t=q=N`D{IspSTZH zHhvNppCFqr6ivQBf+mqSx{+6pl2pGz!onKpOeV8*_)bOqqD5HiYh2b5@j(+I%Sy|9 zo)2YNZxQ|sdwwAA3B1PIG(&@wfG06R^YdA(2}s$#g~wzt^jm8R0@q*v{#5{A4f7(8 S65b8HRll!SAmw)t8vB3dcJAl^ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/undo_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/undo_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..8760c8ab53e4589dfd3f43f096672760bb60510b GIT binary patch literal 1359 zcmZ`(4NOy46n@yMhy`^x_MWm7g$6}fDJ5&%kROF8o1=_5K}A|{U?dI^QGVqy=fD+Dd}ij9uim0z7Etl>~b2!P9*7yYMB z>tapYYD=tR?5&5;4p;kUw(cLyfVq4rje>7K%JlXYFpbALpRB_`eOaPI@xI7wfl-ku zH``APs#6Zl8cmtmu5O#SM$@Ta3fs~_h={-?I>PSHU`8Z6)&*qeNvrXxUCFOv)51=! zp9^kCTSdl-f(FeC7v-ylIjH>Ohb)zlsC%C@M)=IwmIOcl0XK9l7# z-@7z?*32vW3F4MrYv=X!sCO@`Uqdni0|hWi5^|$~$yK5e0)!-On9-s>DTxq=2Rm%$ zN}bxEW{3fiVI^K}R-(*($m-Pta1qJTv>m^5-2LX_h1z%Ci*hTCTwSa~yY}an4!Jgz zo*2ex^!?3tSAB8w2LFoDTLs*Qj|_{nQK7yMj=qzX+`#+ey^XAoPFDt11PSL@6BqsX zyTV?3(`2qIir-T)D{q^Sjn0v4?5Ru#bpilF@Aa;Vj9(ceFH77}dfof^#`UpvO)UCs zQAWdsxSDO{7c_-AH#yv@6Ok#EAqi0dty^w;DmDyqmVbW#elvUO&E}yQy(+ZPd#u@| zmnoX>30=E0A;>YguB!CxhO;zPy@O3Eetoye{Hdjoab?oriFr87hEk#L z0NrA>Lpbh$=(IVApwl4|;1EgJsC^ry=O7msI;49(1C5Uk*+My!h3f;lzIHa&G|qlw zbZmL%z~dEJI-1u?Ki{7D69iBTgAUie-=DSZrzZ6 zrM^$)6KMKIclY(9dOmyRSEm%;iS_vR7)REf^l%R9-=sXH#h``5i}F=Q z9dST%mWgsixV2iR|MDP%86K7@JV4y3xvua1<or^sY6NYdl0NYb7c&U6Z_*L*2z_wfGQ ziOhyGt${)c*~jod&2~+{M$i$$4J+)ss-(v46=!M&PP}+5T^d&5ILjb?Z?tfXCO59g zHY0%0#iDbG+Tr$^i%p`Z9baiXh|vQS+d|;wWmTNmvFsS>1O7i1{@>sBZ#xb0O2Tt? SK5RMVB#VuSi*DE|Ed2}q3ZJk5 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/undo_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/undo_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..befba25b211f35ac107454753e330dc732b28e20 GIT binary patch literal 2035 zcma)7dsNd$77hl(D}h8<2%@~@Q4ta%h=>L(C=}MBq98>QVuW=;lr=wEkDDZAq5}|NMThJc&sadmfo5KXSXF@nH5yW5*B9`L&*_k~1TZVXaz< z5#ChXT~~4iW(DSp@it%k{*|zdf2Hxb&MIXA0*ywcQq>yHp7`V!bz>cwbtRI?^(To0 z0wJvERxZ0_Z{n6c(lhY+aWf%+n(=r&IH|6buR{uf0u2DPPYu8Zqf>!RqtXq|Y9Ww$ zv+r zQR{C@TpxHVQ|Z^~%lV%R^>*8z9nBRO3JCx$%?RzYYMro|GV7?$dyJ=#ZwztX7)HNZ zPZtZ6AV|mukgLgOu;Elk1r_utxhB%rvUoFnni?n^45(J4v-}{uX;fCoWLQz_1z6q~ zx^{B(zeswCmaK5>7Wqk^(vEYnNl8O*5bMiwyG@!(5-!o~Usgk_N}^l`G#>^Lb`FCB zJI~noV&YVrheLOH?}9702ia{I*z0R6BDdi#P2Cwzi>$5OH-5JEdf^$(OaX9FFEJvB zJog9}PQW5^-G%RpA0#wbubImX|GRR!vT8%_CSvH&OR0H$c7!MPqI0VaZMeRGw)@u2 zC8yd(XTE8BJAaquL=F4;$(lj;Q+wRHM1*ZuH}(*-Pv1&)5m*_6C-k;r+7Z~LeK|}I zR^-a;V*RSXe#ElB6x(zUPRj0E_$^`jQeU}IW3rc4FRd2f0_z)vZ3e>SJhHaA0{r7yCmB#d&s^+wNdY;@1~p8L{22Q%;%P)No@f z@u3yzzIEo>_}#8MP=W5h9Fgc;kjIn*gF3|dWT*8`r`GkFJL0V6(KAp}w9Af*`@EiV zoXX!?CGQXHX|al;CH?AiEhEV8qU`R}SN(8Lf%tvPh)H2Mg0es^8hi~V^Fg3ir>cXi zORD7nkd>E#M&aN&1c0Hbz#Hk|;Up~QlJWkjj3IUMybS1dv;|Ii+`|g5i52+ACsJ4D%!E=;uc(FeTD{v1 zMwTTKDXdJiiHj@e>UmQmQO+^{*hNHH2Yaz4E)tTt<#6B#uk*Y?OYX1@I8`K3d!0Yua`i~IgCY=CKw30+TLi#yh_r1Ko^DTK}?JG95@{8#3IQg#! zP$<;Rx|)M$Qd-o*$vgL+fH`lSkYpDtVTaWp*U=TrCIS{~%B(~}jtrphQK~u<*$VO| zl2$uaBJZ3HK$98aQwAgBL+NTwc?n#$r&K=clKvz^;@G5Ik3fwaFCXfP{$+i^_-|X; z%`&N@Ue9T-kcP34g2_Sh8HW1IOn3-q4{`B42(&9FhBMd-8JScBP-&2E zrdmEx^AY{JL5oiRy*_KhY*|yww_mNR!f(wpbH0be739x}2DoSnFDwmNZ$Dpe}%>@aYoMQ1I zLljcgHzoHDzFhP0k7qG;@w6544{GT|=d3q(@?{2fR6d@br~OXK{9m4<=iQb?Q4y%b zv`A7F@tHWlM^ux8y>ZwJcHN%xB`#shsOh2KZHkr*SOiZ@UXjB@RHu%*XSV*DEjCmk zh~6BErO8lC!Z>IA*kEE%FA_KeBT~aA`z!4J+IE4V+@D&C@L%kSk#*E`y()9~X-(E+ zwW-OZQLqVzzYWx86x*FNg|GK@l*GPuO5X(O+qL3Buo;a;H!kwj{btM-jB@(H?Y@x? zcW*ras{6dTJ0S~!8~&{$2#_7<#gl*b|3xC+|CHQUjhpzV@m@^Sw#eI?sm%WX9IxW3 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/unlock_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/unlock_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..a62422f6d985e70ea6796af6e27a725b94c70ea3 GIT binary patch literal 1371 zcmXX`4Ny{96h;tCfsnQIkxnEryS7^^u4S6?V`*X2#8%4c>V}dsTcbt0PFf*6u>~wl ztEp`^qSpOu`mbpxcCrA`tZ|LZ8g*S0)MmG=^_3ME!rl9z`{us)=H7F@bH4AKdmBGr zzlI()FN#1Q(DTGO8{rqh=PU|*yK4Ae0)foQ%gN5KHOb2tkd#U#7LOoY1WvJ7jMzG4 zZM8ey?cY(UpO#oIySkd$Y!=*v&IADD+(*jD$Vk7zV4%mw#zw(GOGrqdS=D~I_vKiG z1DdnU{Jpo8fthJ4HFmKQu6C^nIdkq3XV0D;FdB_iyWJl2RjE`V-`7uL925PQSo8UN zI(3Ipd5uokYl(B$Y~a5IwcTsybi(b#9l_pdN%3yUEj^0gxbd6FpQ`C;X7l}t+BIp@EdHoa%Rf%ESELk1_Zm320mlQE?J zYwPCKHi|7npF%;|IJ5kRcDhIuE$U5XZa~lN>x*@rCRbF+s#__{!HU&|W8114;lub+0`V7146- z-{;z6vj*z@{o~7$I)>@fQr9&eRiqd?e*q2CA)*ERGu!jm|8k`7ZU*bC*Vhe}f#xHJ z)j~l~b9q^5X(?2XO(Ky}Nu-7GBnQyYjPT(tDQFV1=4Z*bv>ZC7Nb32b!W;0X>kYFLGZwO8i70_^QjfneVSjeU$8)STSo zNWj0_hP{1JtQ)bK@os0GTcOGh4;pH{1U;Ds#~RNcDR>J!A7VPO7u~G$+b}XSWKvAn zu&+2#fH5S|p;T7xZxGUGKm*NZ6kaEK*8ONzjc!tQ(6w}2XpRo0pt=tg<3$rL=VQtD z+<^lHYj1w(3=98gR(bu#)u(C}JlS;jNTr3x6DC#q66O9SdmuIdB|Wfsyg8^FEX&O( zjo7(mPE35g*l>es>iDtl!i^pEPU5v5e)2>{(-`{6wj9oBwDsABtPefuk;k(RA3gLj z*W7iL9ak5Z#$2>%?W7Q1R}fTQu24wj3dOO)6(en9!+W!ftI1XnsPOtH*p5pw4WjnH z>&7OWGM!8aRt{J}%AGvWw(V!|)9p;}<8$zi5CC}areHMy`ZRPa$jjl_B61SO>j9Jx ifK}}ijCDA707!(L literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/unlock_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/unlock_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..defbf7fbbe74522a1e3ffb73db5938c8badb8a0a GIT binary patch literal 1686 zcmXw42~-nj5Z+`VA=?1ql5hxxpz?$#2~p%wB3BU+L@O4HN=$%MMG>$PMA%#nVm&}X zMbVTLtyPc$Pel<41nN~ms(5k*RPZ99as+d1Hw5Rsf9LJ|^M5n*&HV2#jEjvlha4dQ z0L-IShOa~Qw}xegL%&)3_KgDoZgW(4$a-!$i%DjpMgTz^cbm*;R^^EhXJ==vqoX6n zupkJsK>xAS8?KD}{an>R3*Tw!uC#`Xp})lji|8I^=3G^W8%7pqW-2?0jlnKl9mhLx ze0@lVbbduEzSg?YWGb3h=0k6cFO4t>7xlJ}4wehcLb54zE32Bu#Q5ca3PnK>>2r*= zwe^>roE&>B2s-%t`;+^c;ZD_PZ;*J6B$##!M$RcZB@ALuPY==8*OypTRYjBp=dt`V zU*9dbku@B6i#s;xK9f*ohnt;@N{r~rzLZR{n`2sPog3jqfS~Am44c}^1A2?9t1k3L z4=bzW`SB6i6hahmh;}L~vtz3=CcbGjA2za4(Uu8}z5-WGh|dFX}l zQq^Na_^5q)z3zcZGnI~#iZhI*aUbn*iXm-uUpozE8|{KW_?o5KXU&MG4KMLA1D!gU zuGLN#DDE6(5E=QptquDpK)D{olM@mW9QtnO-F?(IIGGeP{W&V~l@CAE_oQSfOIDNA zY^a26#N6|UW+7N%i&KQW#y%DA@?x{@&;~BNOyojgW`(8p&&A2pQ=fi!+k4`1UKvHk z`KXM(Y3^43=X;z#U@p z(4LMULlAM-(Maq!MK76d)r7){l0~N@;u-~s4o>PCIotc<#+HD2vf{8gHO&Pf?>e zk4kD^EpiV`WdhK(hX=fil=HG}i%I6~UYlO*`*5pmXGcx~QN;tG`SdpE!n?Ca+D3{O zS#2xcK$-VL=8b?!o2!iFBGMHf#!TKU7L&#Sh@|`Ne#`Rqh3@e$YuicHEMT_T+);?O`fNucvPb z8~X(aG&&0kWH9bKTv{*(4Omn%z#nFlUe*2CQ*gAC9If$oV}WukbMp7wq-DOmkBy^&CC9oFy-yF&JP5cS`P`!y?N5&!_8b3o)Ah6Uu@t?lC5nI` zqOMwkoJv~J1&7YD_Tv(SK^%)UXEChZ6@fvOv_+MT(Z!g$7NLEF#~W>qOU=#nSHhA= zfxl`;#s}Wk3yVK+<63|7SbN}bg=fz8e;ziBuB=XfdS2qbu1BZGtFeX%tmKrGB`L|t zuM-0MZ%y>(ViGr@cV2Tx_4ye?+~15)wO=MqDyAebu^HB-s7>uOI*qGb*^iK4r@))( zbp7Tbn@nXldQrD%b(*Pr@JcGn)L1<$85NE!9=p~;uR|=WV>1kPH0IZ*rr>`tlIk7+ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/up_arrow_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/up_arrow_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..379b3232bf6ac4ab7787e9c5b625cd7853cb28fc GIT binary patch literal 1115 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 Q?a&ssnZ;%n`f^YI59|~VtN;K2 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/warning_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/warning_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..29a4f85f8ef9097d4161422e804243891ad7300b GIT binary patch literal 1357 zcmXX`Yfw{17!8dOfr~_-O;RaTj9MLABUC_vKzU3_35eEGMg(JsprE7%ZQ_{Zk^muy zfC^}>N))Tm;uMh%q9S=wD2k$>;r>1=A z)Quslh8Z*Gex%_g~~WK+r9v3D3+!q^$g7HN)9FzNHr%dzI-{@NbRh*n@Va&!DGM zDCnmVa}s&#gs`@mx%2_O<8d_Wa+@~y$gxd)3BGYDI$G$P8T-z~DY{c{tq%Ukf2+v9 zvlFH}0Jx>YKm?iAOLGfguTzChjxVPUde31E`TE}6W!Ht#i3#dMi7ZyIyfl9XfJMbk zYO1ku^KST@k7(~&B!L_??jw=w3Gjx(}u*5&JR zXDtE1u#1rHxgN+)T3=p{1+#*?a>K-*C@A(hgusXLJLQ7XAsRt* z^3Ky%Hd|&c&^yAlF`3|m{`p0XqV9%Tp+HxY$;Lpp&__7bz!yQ)n&uSajs;Fyp1!#( z4MkveUZT1%*aq-=G@8Jw08I680KR1aD?@=6hk}%ZCn0K&sGFnd6?azse`ub*#w3c0 zRr)}eE(sZgXL<}Efhril`f*?feZ)+t0sydBYr1l&G+K_t#%+I1)MW3zw*MtAkD$p` z!pe9-e1bg0=9oE-;*$uZh2h+hF$?8evvoL3g=n?Jmc0VSTX4u0xs5?TnGjyD^?MT^ z=B!9;>&TF&Z0ex*?;a&37P`YOGh$YJ13{Ft2x2ihpb3N~kt|g@W{ogvqNC|@@Xoz; z49|DlxG+G~JJ4-FqCyAbLVf3K*?hNkK@7_;=6=TKOlT+k2Yym|rtjmlCHL7J4aXoY zJeFa5dsWVT9Wk8MeVNSY8EZ0p>XORrPmGLS=|V}~(|V!#_`?l4>=9+QHcIQrXkpaU z4SXgxAt9V0w@Z64vq`MlHXEF6rVbr$X@RtIS+)hATx}#WKPRO-?h+7hRUlGNnBK;U zlo}?nm-Vfl{ac;BafkF?M1(~sSU9!v$N8VFEjsG8{nRopI(GI|!h~vJml5}{g(CKbrnvIpH?ZPnh{qYTazqJFaT%9u8 z37PQyRl>!~Dcg`uiqlT=PQpZEsQSspz`Y_D~c+U52OD?FjQA3vt;v} z0UyBBoWAF^m8iLq2EoA5c*s=?YqwM1Ke|JLsVf5KP|QBPdr^#EoZd8`+*0(o+KvaQ z14@z~6<<~Cx@|ZZHPI=gY&y@}{6_4~;XX{YQ>dpPU$Ia2qDEiw?wWmXpB>&iO{7Nr zZIOF*XJy0e_J&D>@ucaclsSS<7cQGSq@n%f?B__J$fRHJ9`}p1hT_>dCm|*N*I1tN EKj>ndkN^Mx literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/warning_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/warning_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..05d5bca94912fce2f0224496116e467cea8774a2 GIT binary patch literal 1847 zcmXX_3se(V8V;Kh9+|9wJQA@DPyq|o1X2sGLKb9|s3nN5Y+ILv08O!O$%0Y@k}(8E z;)>#K<;_O1yT@%k3&nGMP+-yw8XnP{u3Df+NdiKuC>cp@5)yKEApGad+&TCD|M!32 z|J_k$XYHZ+Z}2CPNHkt%Mh>w?tUSIH;$2o*`3s3eaq}|L4pnrBgmfXXNdjPl;$QV3Ja-4+ z_RVrs8?SrNL{Wdl%*~W(mSJ-)kJp|k>4A%kLZFG*@)sSxaOJ2*YmVvrs?EoPIO%2K zjvkj-ua@D9>_iu^wVD8`hdMS27;n@*WK8uptA79WNe^<=h!<1U{`Q;1e0Hy3UXr8ph$4zgrbhV2*#}1B+|me9#35rqknL)a zH@u`O8tZ?D&D;EGU$yvo2>s+``R7N;uq$q6Q&b$0Zb`vl#BkMasG{WOM9)Mo z9(~M@N7hLFobR0ySZwvfv>ngq|a&*yI zKB>>!cXV?-oz(QLQ33YTp5G;f1zHtD{_NXl`Sg*#GJLP}d z(>gO7KFO%nc}&yHpVG5vLxTRMk;V%LghEjTMvOIfWvtNtvoL*7Dm|NR2Rm}k+3%=_ z@wT+RIW4A_RnJbX)1Q46n&sg@faI3k*)g%bD7oS`N;nUidP4jM?U5 z5#NLCp5Fe#fZ*VQily{kujZ6B>d#M^ZSO|q4g5p$_W-ld{@NOibqlx$*gjeqVRG}n ze*~OP|6TWpJ%$Wajzq+aj^eM|zr2fum!Ft;@tai}HElHJ&Y;f%jA2E>f|D3NKQ4wG z1{6-Hb}nta53J4*%wj-$oQ)1YMSZ<5_T;q4n-~h+JJ?h1D?dHHrHor0bT}-eD4*c4 zoyg~YYZO4h9oc0xplI^L%|cL6>&;S?AF2JE>8Y2fXWP3PMAI7REKsps zE=PmOW-Iaya`vBoHxzT@P{;pq|_z0JDow;jMK_U-rmZPE#J}+3i;QLMjAuN>%x-A)ONad zc3yQjfz6)43O#T&H~qLfAA}fg?3ug#^%?)~NS5^o7oM7VZ(&Buh4?C|*cg^wASA+Q zs?@3V=g~vrPv%5+_rX@v^u^OqUenWdL?(r?$nj(GNVmW+{aOnEAjYQAmG0jU z(`9bgu83e+qC}Ef6c8MgpIrI;;L5KOw1&|q9f_Em+Le{^A!9efQmy()Wx1{9B*i5) zj2zTDjd!QM+orsfN_V@S`6+5Al8`SfC!_Db$thkFcH}+n;(`U9-s_)OLLY>y($zk` zxP?i^^eVuZm}D?oGLL;+COO0DuZ+KgFFg5%zt;PqHKy;$<*A;kL-lF?n(W}AMe$oTu|KEu1LgDGj~@*>P8^84 z3<&)n``y;I;l;PrI(0oonMJlc3gpl|BoH<5y02f5^)CZ@RGN E|5$dM^8f$< literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/wrench_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/wrench_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..4d51f4b24c0328aae3cb2404be9957c92b001fd3 GIT binary patch literal 1480 zcmY*Z3s4hR6h#oQx}Z}^*`NYa0cWu0SL%n)mJAdDMu)lwtS|C>UiGK*>2GG_TIFZjeMn1 zN^)W(Q%xxH2wAgl!QAE0QTd~6cNcC{jnNxjQiArVLte)-obs7PekaJB6O_&DmRN;5s>;KtUh ztWeZd+6nb?7rW3td6#ix)U$#I43LZ!V%7;C509$V$dl_vut(e@V-df$-Te7wXuyW< zPXFLIlIhfgqCyAcbg^90?vT@!GXW`8!qrfi3Vmb3p{+iz7_U=z9U0JSwZEI|wM9ii zekJToU$0NYy_|3-{=QsFgUCY6rm8`W&<>><0vRABm3VW-)ozAaB@PWLgt$c~F#v;V{XTj5%ZX(C6-hhZ*Zw;qqrHdLeIsh%~# zkc3-Y@&{W}US2IbdGe%8p=gygHqKMYUwzB+-S7{0rjxq^1VJ{V6NYra2v-(h zggp$oDuNgiN+6^UOAwnV9jvZC%_u7`1cTyc`$L%cp2#^VdQDYxd~!2m^vs29F-3X+ z>x&-mW_^6+%VqDEA(l6$^~$D{aQC1CdH1T(T_Jm7+=NtOKxJ2xrmd-R`HJpgQJ0FDjv0ABAgU`5MXU~;k(umx)b z^-X05M|20^l^(RYDD88FS*KU~FT3>Pj*N`F5ts_8Mb&X}g&3ZG6rFld3aFtc_O;=+ zv8JllaVR=k4{bkfjJUJEE&&;IcZK4wwUMsgQXh74!T^fyV6ft93 z=&t0lSgij5Y(hS`b3uIc-mtJjWhEXWC@LsWu!ue%rCw!Z6NCgm%$r^syXt=^8ACFw zpK=4Gp14o!JIT9J9v@u+OSd zqXHhw_4aJ9-1F*!Ahta*ST1HhW@zO39Vb>dqUk^ER6x~Rx z!4ogMjkR0phcs-60HhK)AG2En==tM=5`r*TZ0Zn1k=g}HDq+W_u(lY40fNrY&G|b$ zeJ(zXKWq&EDALLi<1-2rw;Ab|`3|QA#(qL4Y&q{S-m053-F2f7o7&op zA`zKNzX&y3Y(He$x*roQ5saQQ_eZ^@K>=;irCAYW`m`%;6U+@AJ(albR3~QrvwJ`t zsIIRN(R4^Qi$w_X@-T`vk#iwwmpa|sA9v6@Kf_9L=u1ggT+}_>4xJORuJS6>&U12N KTEcl=p8Q`n9rPps literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/wrench_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/wrench_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c19546c7e5ac9c6a7458a613783e60fe5c5aa912 GIT binary patch literal 2025 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 WOMRITec~F$_#ARPJg6>^R`7po3XX69 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_in_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_in_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..940adc1110dd6516a82495324ad07fff4790947b GIT binary patch literal 2670 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 Ic~CR{0t#>_GXMYp literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_out_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_out_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..40ed87dcd66f8b77c7f7d76b6f1461990091b6fa GIT binary patch literal 1716 zcmXX`3s92j8pcal3gxMe+G;{xD=IJ9TA3kcp41jo&zPnLA?4XLHFp#80*IxS&{kBF zQ8ByIu5-4N?r9UORiH>y@>XVrlE|vyRxYfBTz>ig{gIxT@B3!HnfH00_nr5B&K)5B z3+?`eI|6|~C+$l}hhHE2S&D@330kZffk0L!B@q5ize%CSxf~iDoxgBlVA(N^#!0DE zI-_8aBn(^W`>9?uVAAE4&b}Y1ovF|}!Qlu9;`GHVM|gTJk%HTn<8q&)&+yEzGVjj_ zh?|=#{1M$dF%)@G=Qp}NmwMO5k94K`=F1-pxFIyA&c$fTnKg&=GHBTFaA{mt*34kr z-8Z{q8FN!wlTHOfHb58V>-&L}l(eBdHZM=D!;62tcerytzA%L+6P2iTue|RNL7|e# z|rj0*u?32sSL$q1tX&%2GsOSHd!@BY4QS3U8&$>8`snMpYKAM49I$f zOqTZc_xE@8!g%`h=_eat!le2W&Bn>Glz+t6o&2Tx^bh$RSzg&FhnN>HUoX3O@gn(c zTcycuYsM;}O2UL}#t&~w5@8^b$Ziat2{Hid_YF7X(a4aH4M=377yKU*6bMFyFF;*- zoywywht^IV+Pq|ulR6l&oQ3t=`&iUIFC2%Cd!~2V1dz6>Z! zDDEBgcs=~pvX$((NM$u4{`^D~E_-D+T{HWkZMF^6QW16I1CzKgM|qYxi@`0^E7R%A z%-2l8?rN*$gQ*o#Da6nb3WW+9OcCXqy%APr*HzW`9L>U_5JT*s_q~DR^8Z}u+4L>j{hVJeE42$vciFXP^{%a? z2D&mr{Q6K@a?{>I8`miy^7wyWR+IojVW^fpaBD*_)}3+91+m}|xswSh*}P_A#C1L& zR}FspW3b+YVN^k&4QL(|h^wuiEWn#ElGs*YHr;CEO+ITS;h7!PhIzr&AJ1AJ8oYgq z$2$l^&JKZ;icfm=;}c`T6YbE1Q?o!I>235513M}#bG}z4tmIM!T z16;lcM7kp1c0l?XK=Eq|!`oZ5q@}pUNu$xAl9SJ)@M4H;h9JC4OiYaIU8Tu~DA?Jr*Z-A| zEX1WCBhrK-yyS$Xb^Wv8IY39M%Msn~jNI0)ThBeV%+b{ZQCf2H=;6FQfdm2}f_3Xw zUfjNY4Qh))i}BypE>S z13>{}_H=di(WnOpTPAm`$6_~b!pXX%GFv?%H?;Ssr#OidLL2JSsJ&QkhoWI55vPj~BXgorHa5$sSU{9X3mzdBJ HPiFrOPDEeV literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_out_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/zoom_out_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f188ebf2418975480e9d026716dcc86f51fddb6e GIT binary patch literal 2510 zcmYLLeLR!v8()nfn<=s9Q5_>GrHoZLtL0^i-snx!>9A~cDkl!b#B5#@BBiW|PCugj z80lqd+1NqlZ5`ovLS9Nvt!(S4jlDeQ5x;Y;&*y&b&;7^!y{_xNuIu}K&iU`&hFM^_ z0D(YYe0?Z;;T=D-3{mhm`plV01j6XDFU4a&vnYfin$PF+Rm-jynYFjKBNs0=$MEax z^#Rx#61CGKjaoHs_x11Vk3bDij2l?$uL}zkX8;ipRNB#qL71ZTCEDY_KBImbdiAlw zC><&?U!aaRP2)!8z51Su`|3s@R#*$J(sKdBGMr=1X8I~knidS{zmZz7n{G;XD}FcPoK3dY3GvH<{dVe z4I`O^->{aR7#<#;T%EH~oP~1)gBlW=<)6oPq&o%+oi#dbVbTc1Mp*;|pw_KhhuX7e z56a1D59;S#yVAK_ZmN(CIkgvWNO9OU3m9^QMx#ZZj_%6MF!Yo3ya;1{erqpIIg16! zi5k_x1KwkW_wK#4iiwFyhp+0?D#e?jR=?uAc}*kmQH?>+WYQblbAj^N3`M;-DpY2VPs-YZu1d_J5ul?s3$2>y-6S-7HiQOpBJzf;*3&q6LCzm+1S_TJs?k{7)eDxH=jZY$sc zy`}(+3*pfhlPbrPfy*hxOK}JX;$YTW~1yj1wf%R zl`?(g)%{9m{{FdmU-a}C`|sV$P^lDVFt#JeV3d*xFof4Z6$G(Yh0&PG5d$$V*b2}= z@vWk#PcyowAqXN8oT7;WwH#S)Ig50vqZY%#o4UWi2JJe3`B9R(%k$@`Ueo!w-;DkY z{%qT#HL<=ieR0Q#AZMT|>*+>;5=j^@I#GosE(z1_t16x3;CeT=8{MerEt`Vh5`q#s ztW7usQ_73AY1`dRC)nnCvDUZ$V>?(w{9*n42G*$3YddjXZNDDpLTaz&Bhx=8Ea;QH z*AS5hLhW&w?)p!ys=pHNue&1rIEyB!#iS5S^(E|IEN=Lmqbv-JdbZvn+4L_C*Wti5 zcRHQ)j*P@Bwlcf+F7V;teY`VoXJlNsP*i70{|;e$tJM0Vr2y*NrK}3ld2Rk2F?eWv z>3>=DYq)GLc0trH^JfCihbKmaMVVi5-b9duk19QMU5_v{e%#vY2zVexl&|v zuX*1gIW^i_c{FWZz^bf4$3FuBRMM%uH`0lrl z+9=_^TA#1t+FbJ)o47bsi{(U z1`fgFV>UcItZHj*Q)d;N9bdU}rCMmUg}s2xR&4ikcjx>Nur=Mo^Kj9T@y;L7aK|29 zwR+tke$C2qzs#Arf-9C>PQ_w*Q?<3VMkh~JqaA|;H0IQY4Pt2@4}{sUMXpxDR0a2X z&E31skx^03hQ`LkjLb}ePevB;-7)Di?Hhs|Qq5On7$# zAA}D+mw)IvfeH)+QDkzuOL#W!Dx=i34ANYo@tKzuqO5pmnQeaO=xM!g$#@>aetdnO zsOV`cz*QfvAE5mlx&o#;5q|CR<{8dKp-p;kdJ>P19aV8bIkRupbm*s=+FC{BiJ$CNtzL~X zG&WjNQ(I?DfK3AzOxzzE;W!{a4_o=7AXw~9K} zHi=rkUWWxJ9vv$iWF0Gw$CWRi^)DC~@cfqZouvtgxbcRZ+HV|ix zM*!TbuJEb{Raf%?;EzyXv3Ubg13|%>_B6IZ@sL)Aznx&xyl^hjgICS;69%?01#IZ+ zr^1J5^v9((=&s;RH0GBNcH&m05=hi(8s!BZS3G?8qs zo2&F-sRbB4UBRqVVo74hEyw@_C~4lQ`am)HiE+WWnLmwov>?m;95-FRVZ2@68H`b=Y0$e*l@EDA5SYlQZ(ZntDBr3`HD4OIjtCC++7^m9k+78g06`Xg=DnWFSnXRIU`u zg7=~Y0s%T34FLcwjd17E=G-1P6fOHTPH~(fIS99LkbtEd#UhtH#*6EYD#6!+xF)&c z&9?MtTnQnv<_YsX#c1#>Fx=H3VZMk!S!n>JY$pExzuz zlXOz6lnu#d-PycFY(=3^VXkNM@-F4&EwnhkG&?(cz@H4u>m>vdDYzs;cRxIHE^~Bh z$I_mN*HM)^l|q_(Z!%Z9Y|!O*_?LktgDGPU?Pj&`*$gh+3rK`saicF!V&yh-_VwOP JsrIBL{|&c9!(jjb literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/backButton.png b/oss/vtiger/trunk/modules/Mobile/resources/iui/backButton.png new file mode 100644 index 0000000000000000000000000000000000000000..e27ea8cdf9a4f3b35c78f6bb0a407a4047e72e12 GIT binary patch literal 816 zcmV-01JC@4P)bjHXOOu;C=bm%!b8qQKFBYiNkNO|%7ySIJu2Y@Z0Ra$@|h{{KDF!wUiay4ePIl$1|oy7p)(1ow7 zpJZTzo@Ujo_5>tq2Mlrozr48EHFO7XNgA_29ANiNAo}}5{S52Sbo1IDYVdhwS+_Wy zoKFX!%mpCCX3~4hOG}-xdkE2FW}D0a0cPL4n(>DQ$e1)=fCCL&TtG%ONRX*&K$Hs1 z^0Wo3~(tBk?t!FTGG|Z4oXdx zId|<57s|Dp6h>m#K}vyEsFVO0D?%#V(Rz3m{w?xMP4Uv?Xp}Cb@AZxCtZ0}cc6*JNbM-_bh@vw>o;~9>&@|ZG&9()b uZiGWt*08@evNu^#lbM`SC`$WRfB^uXx!j#d-gDys00006a2G$37eJC1 zL6jIkkr_sy8b+TQNTnJ{ryEPG98R(wN1Gi_wH;8m9Z|X-OQs%7s2)_n9#p{}Rl^@v z#UEG3Aw!5EM2R9qhayFZB464gM~)*%kR)Q>CrXbeWZx)Cjwn*4DpRK}PK_>U;4fOR zFlyj4ZQwa@;X!xfLwMsxdgDlGuSsvbO@HK6gymI&z*vXoS%~IaiRNI9=VXuQXOie{ zi?eTqv2l&Fa)_mKiKTOkymODWb&jxhkFa)+v3i!di=fGsp0SywyPT-NrL)GTwa4zB zu!H~r0J=#;K~xyijmXy$!9W;>;SV7zS{9M$y@u#r5MA#7g3PRw{bw9_&fXWkf9`}J z1UhHm$9o*K`Xixl1;=mfRA;%_3Y(>)9#FT}61$1aVkKFm!Dj@AF(nLS9U==pBsfww zkwRiXBoOZsal{%#3|fuQz{&)Jk|Pu-Ch=p0=?EiFM-h38D55||>5ox0_qa}&ZhXto+2n%b?bJ&~1lBv8U}fi7AzZCsS>JitIdH978H@x%3$FF(~jbN&or(c+Q=_jfbP0l+XkK Dpz1Xj literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/cancel.png b/oss/vtiger/trunk/modules/Mobile/resources/iui/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6dcc87d7b0dab235b2f81f4639c13eeb953e28 GIT binary patch literal 362 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.css b/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.css new file mode 100644 index 00000000..187c94d0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.css @@ -0,0 +1,406 @@ +/* iui.css (c) 2007-9 by iUI Project Members, see LICENSE.txt for license */ +body { + margin: 0; + font-family: Helvetica; + background: #FFFFFF; + color: #000000; + overflow-x: hidden; + -webkit-user-select: none; + -webkit-text-size-adjust: none; +} + +body > *:not(.toolbar) { + display: none; + position: absolute; + margin: 0; + padding: 0; + left: 0; + top: 45px; + width: 100%; + min-height: 372px; +} + +body[orient="landscape"] > *:not(.toolbar) { + min-height: 268px; +} + +body > *[selected="true"] { + display: block; +} + +a[selected], a:active { + background-color: #194fdb !important; + background-image: url(listArrowSel.png), url(selection.png) !important; + background-repeat: no-repeat, repeat-x; + background-position: right center, left top; + color: #FFFFFF !important; +} + +a[selected="progress"] { + background-image: url(loading.gif), url(selection.png) !important; +} + +/************************************************************************************************/ + +body > .toolbar { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + border-bottom: 1px solid #2d3642; + border-top: 1px solid #6d84a2; + padding: 10px; + height: 45px; + background: url(toolbar.png) #6d84a2 repeat-x; +} + +.toolbar > h1 { + position: absolute; + overflow: hidden; + left: 50%; + margin: 1px 0 0 -75px; + height: 45px; + font-size: 20px; + width: 150px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + color: #FFFFFF; +} + +body[orient="landscape"] > .toolbar > h1 { + margin-left: -125px; + width: 250px; +} + +.button { + position: absolute; + overflow: hidden; + top: 8px; + right: 6px; + margin: 0; + border-width: 0 5px; + padding: 0 3px; + width: auto; + height: 30px; + line-height: 30px; + font-family: inherit; + font-size: 12px; + font-weight: bold; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0; + text-overflow: ellipsis; + text-decoration: none; + white-space: nowrap; + background: none; + -moz-border-image: url(toolButton.png) 0 5 0 5; + -webkit-border-image: url(toolButton.png) 0 5 0 5; +} + +.blueButton { + -moz-border-image: url(blueButton.png) 0 5 0 5; + -webkit-border-image: url(blueButton.png) 0 5 0 5; + border-width: 0 5px; +} + +.leftButton { + left: 6px; + right: auto; +} + +#backButton { + display: none; + left: 6px; + right: auto; + padding: 0; + max-width: 55px; + border-width: 0 8px 0 14px; + -moz-border-image: url(backButton.png) 0 8 0 14; + -webkit-border-image: url(backButton.png) 0 8 0 14; +} + +.whiteButton, +.grayButton { + display: block; + border-width: 0 12px; + padding: 10px; + text-align: center; + font-size: 20px; + font-weight: bold; + text-decoration: inherit; + color: inherit; +} + +.whiteButton { + -moz-border-image: url(whiteButton.png) 0 12 0 12; + -webkit-border-image: url(whiteButton.png) 0 12 0 12; + text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0; +} + +.grayButton { + -moz-border-image: url(grayButton.png) 0 12 0 12; + -webkit-border-image: url(grayButton.png) 0 12 0 12; + color: #FFFFFF; +} + +/************************************************************************************************/ + +body > ul > li { + position: relative; + margin: 0; + border-bottom: 1px solid #E0E0E0; + padding: 8px 0 8px 10px; + font-size: 20px; + font-weight: bold; + list-style: none; +} + +body > ul > li.group { + position: relative; + top: -1px; + margin-bottom: -2px; + border-top: 1px solid #7d7d7d; + border-bottom: 1px solid #999999; + padding: 1px 10px; + background: url(listGroup.png) repeat-x; + font-size: 17px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0; + color: #FFFFFF; +} + +body > ul > li.group:first-child { + top: 0; + border-top: none; +} + +body > ul > li > a { + display: block; + margin: -8px 0 -8px -10px; + padding: 8px 32px 8px 10px; + text-decoration: none; + color: inherit; + background: url(listArrow.png) no-repeat right center; +} + +a[target="_replace"] { + box-sizing: border-box; + -webkit-box-sizing: border-box; + padding-top: 25px; + padding-bottom: 25px; + font-size: 18px; + color: cornflowerblue; + background-color: #FFFFFF; + background-image: none; +} + +/************************************************************************************************/ + +body > .dialog { + top: 0; + width: 100%; + min-height: 417px; + z-index: 2; + background: rgba(0, 0, 0, 0.8); + padding: 0; + text-align: right; +} + +.dialog > fieldset { + box-sizing: border-box; + -webkit-box-sizing: border-box; + width: 100%; + margin: 0; + border: none; + border-top: 1px solid #6d84a2; + padding: 10px 6px; + background: url(toolbar.png) #7388a5 repeat-x; +} + +.dialog > fieldset > h1 { + margin: 0 10px 0 10px; + padding: 0; + font-size: 20px; + font-weight: bold; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; + text-align: center; +} + +.dialog > fieldset > label { + position: absolute; + margin: 16px 0 0 6px; + font-size: 14px; + color: #999999; +} + +input:not(input[type|=radio]):not(input[type|=checkbox]) { + box-sizing: border-box; + -webkit-box-sizing: border-box; + width: 100%; + margin: 8px 0 0 0; + padding: 6px 6px 6px 44px; + font-size: 16px; + font-weight: normal; +} + +/************************************************************************************************/ + +body > .panel { + box-sizing: border-box; + -webkit-box-sizing: border-box; + padding: 10px; + background: #c8c8c8 url(pinstripes.png); +} + +.panel > fieldset { + position: relative; + margin: 0 0 20px 0; + padding: 0; + background: #FFFFFF; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border: 1px solid #999999; + text-align: right; + font-size: 16px; +} + +.row { + position: relative; + min-height: 42px; + border-bottom: 1px solid #999999; + -moz-border-radius: 0; + -webkit-border-radius: 0; + text-align: right; +} + +fieldset > .row:last-child { + border-bottom: none !important; +} + +.row > input:not(input[type|=radio]):not(input[type|=checkbox]) { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + margin: 0; + border: none; + padding: 12px 10px 0 110px; + height: 42px; + background: none; +} +.row > input[type|=radio], .row > input[type|=checkbox] { + margin: 7px 7px 0 0; + height: 25px; + width: 25px; +} + +.row > label { + position: absolute; + margin: 0 0 0 14px; + line-height: 42px; + font-weight: bold; +} + +.row > span { + position: absolute; + padding: 12px 10px 0 110px; + margin: 0; +} + +.row > .toggle { + position: absolute; + top: 6px; + right: 6px; + width: 100px; + height: 28px; +} + +.toggle { + border: 1px solid #888888; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + background: #FFFFFF url(toggle.png) repeat-x; + font-size: 19px; + font-weight: bold; + line-height: 30px; +} + +.toggle[toggled="true"] { + border: 1px solid #143fae; + background: #194fdb url(toggleOn.png) repeat-x; +} + +.toggleOn { + display: none; + position: absolute; + width: 60px; + text-align: center; + left: 0; + top: 0; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; +} + +.toggleOff { + position: absolute; + width: 60px; + text-align: center; + right: 0; + top: 0; + color: #666666; +} + +.toggle[toggled="true"] > .toggleOn { + display: block; +} + +.toggle[toggled="true"] > .toggleOff { + display: none; +} + +.thumb { + position: absolute; + top: -1px; + left: -1px; + width: 40px; + height: 28px; + border: 1px solid #888888; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + background: #ffffff url(thumb.png) repeat-x; +} + +.toggle[toggled="true"] > .thumb { + left: auto; + right: -1px; +} + +.panel > h2 { + margin: 0 0 8px 14px; + font-size: inherit; + font-weight: bold; + color: #4d4d70; + text-shadow: rgba(255, 255, 255, 0.75) 2px 2px 0; +} + +/************************************************************************************************/ + +#preloader { + display: none; + background-image: url(loading.gif), url(selection.png), + url(blueButton.png), url(listArrowSel.png), url(listGroup.png); +} + +/************************************************************************************************/ +/* table extension from http://www.k10design.net/articles/iui/ (dependent image blue_hd_bg.png) */ + +.itable { border: 1px solid gray; } +.itable tr.header th { text-align: left; } +.itable tr.alt { background-color: #eff7ff; } +.itable tr.reg { background-color: #fff; } +.itable th { background: url(blue_hd_bg.png) top left repeat-x; border-right: 1px solid grey; } +.itable th:last-child { border-right: none; } +.itable td { border-right: 1px solid gray; } +.itable tr:first-child { white-space: nowrap; } +.itable tr:last-child { border-right: none; } diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.js b/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.js new file mode 100644 index 00000000..38d76611 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.js @@ -0,0 +1,701 @@ +/* + Copyright (c) 2007, iUI Project Members + See LICENSE.txt for licensing terms + */ + + +(function() { + +var slideSpeed = 20; +var slideInterval = 0; + +var currentPage = null; +var currentDialog = null; +var currentWidth = 0; +var currentHash = location.hash; +var hashPrefix = "#_"; +var pageHistory = []; +var newPageCount = 0; +var checkTimer; +var hasOrientationEvent = false; +var portraitVal = "portrait"; +var landscapeVal = "landscape"; + +// CWZ +var loadedPages = []; +var actionButtons = []; + +// ************************************************************************************************* + +window.iui = +{ + showPage: function(page, backwards) + { + if (page) + { + if (currentDialog) + { + currentDialog.removeAttribute("selected"); + currentDialog = null; + } + + if (hasClass(page, "dialog")) + showDialog(page); + else + { + var fromPage = currentPage; + currentPage = page; + + if (fromPage) + { + if (fromPage.onblur) + fromPage.onblur(); + + if (fromPage.getAttribute("onunload") && backwards) + eval(fromPage.getAttribute("onunload")); + + setTimeout(slidePages, 0, fromPage, page, backwards); + } + else + updatePage(page, fromPage); + + var lNewPage = (loadedPages.indexOf(page.id) == -1); + + if (lNewPage) + { + loadedPages.push(page.id); + + if (page.getAttribute("stylesheet")) + loadStylesheet(page.getAttribute("stylesheet")); + + if (page.getAttribute("script")) + loadScript(page.getAttribute("script"), function() { continueLoadingPage(page, lNewPage); }); + else + continueLoadingPage(page, lNewPage); + } + else + continueLoadingPage(page, lNewPage); + } + } + }, + + showPageById: function(pageId) + { + var page = $(pageId); + if (page) + { + var index = pageHistory.indexOf(pageId); + var backwards = index != -1; + if (backwards) + pageHistory.splice(index, pageHistory.length); + + iui.showPage(page, backwards); + } + }, + + showPageByHref: function(href, args, method, replace, cb) + { + var req = new XMLHttpRequest(); + req.onerror = function() + { + if (cb) + cb(false); + }; + + req.onreadystatechange = function() + { + if (req.readyState == 4) + { + if (replace) + replaceElementWithSource(replace, req.responseText); + else + { + var frag = document.createElement("div"); + frag.innerHTML = req.responseText; + iui.insertPages(frag.childNodes); + } + if (cb) + setTimeout(cb, 1000, true); + } + }; + + if (args) + { + req.open("POST", href, true); // CWZ 02/11/2009 + //req.open(method || "GET", href, true); + req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + req.setRequestHeader("Content-Length", args.length); + req.send(args.join("&")); + } + else + { + req.open(method || "GET", href, true); + req.send(null); + } + }, + + insertPages: function(nodes) + { + var targetPage; + for (var i = 0; i < nodes.length; ++i) + { + var child = nodes[i]; + if (child.nodeType == 1) + { + if (!child.id) + child.id = "__" + (++newPageCount) + "__"; + + var clone = $(child.id); + if (clone) + clone.parentNode.replaceChild(child, clone); + else + document.body.appendChild(child); + + if (child.getAttribute("selected") == "true" || !targetPage) + targetPage = child; + + --i; + } + } + + if (targetPage) + iui.showPage(targetPage); + }, + + getSelectedPage: function() + { + for (var child = document.body.firstChild; child; child = child.nextSibling) + { + if (child.nodeType == 1 && child.getAttribute("selected") == "true") + return child; + } + }, + isNativeUrl: function(href) + { + for(var i = 0; i < iui.nativeUrlPatterns.length; i++) + { + if(href.match(iui.nativeUrlPatterns[i])) return true; + } + return false; + }, + nativeUrlPatterns: [ + new RegExp("^http:\/\/maps.google.com\/maps\?"), + new RegExp("^mailto:"), + new RegExp("^tel:"), + new RegExp("^http:\/\/www.youtube.com\/watch\\?v="), + new RegExp("^http:\/\/www.youtube.com\/v\/") + ] +}; + +// ************************************************************************************************* + +addEventListener("submit", function(event) +{ + if (hasClass(findParent(event.target, "form"), "dialog") || hasClass(findParent(event.target, "form"), "panel")) + { + submitForm(findParent(event.target, "form")); + event.preventDefault(); + } +}, true); + +addEventListener("load", function(event) +{ + var page = iui.getSelectedPage(); + if (page) + iui.showPage(page); + + setTimeout(preloadImages, 0); + setTimeout(checkOrientAndLocation, 0); + checkTimer = setInterval(checkOrientAndLocation, 300); +}, false); + +addEventListener("unload", function(event) +{ + return; +}, false); + +addEventListener("click", function(event) +{ + var link = findParent(event.target, "a"); + if (link) + { + /* Prasad: Perform load and cache the DOM for re-use unless asked no-to-cache */ + function custom_load() { + if(!hasClass(link, "nocache")) { + link.setAttribute("xhref", link.href); + link.setAttribute("href", "#__" + (newPageCount) + "__"); + } + unselect(); + } + /* END */ + + function unselect() { link.removeAttribute("selected"); } + + if (link.href && link.hash && link.hash != "#") + { + link.setAttribute("selected", "true"); + iui.showPage($(link.hash.substr(1))); + setTimeout(unselect, 500); + } + else if (link == $("backButton")) + history.back(); + else if (link.getAttribute("type") == "submit") + submitForm(findParent(link, "form")); + else if (link.getAttribute("type") == "cancel") + cancelDialog(findParent(link, "form")); + else if (link.target == "_replace") + { + link.setAttribute("selected", "progress"); + iui.showPageByHref(link.href, null, null, link, custom_load); // Prasad: unselect); + } + else if (iui.isNativeUrl(link.href)) + { + return; + } + else if (!link.target) + { + link.setAttribute("selected", "progress"); + iui.showPageByHref(link.href, null, null, null, custom_load); // Prasad: unselect); + } + else + return; + + event.preventDefault(); + } +}, true); + +addEventListener("click", function(event) +{ + var div = findParent(event.target, "div"); + if (div && hasClass(div, "toggle")) + { + div.setAttribute("toggled", div.getAttribute("toggled") != "true"); + event.preventDefault(); + } +}, true); + +function orientChangeHandler() +{ + var orientation=window.orientation; + switch(orientation) + { + case 0: + setOrientation(portraitVal); + break; + + case 90: + case -90: + setOrientation(landscapeVal); + break; + } +} + +if (typeof window.onorientationchange == "object") +{ + window.onorientationchange=orientChangeHandler; + hasOrientationEvent = true; + setTimeout(orientChangeHandler, 0); +} + +function checkOrientAndLocation() +{ + if (!hasOrientationEvent) + { + if (window.innerWidth != currentWidth) + { + currentWidth = window.innerWidth; + var orient = currentWidth == 320 ? portraitVal : landscapeVal; + setOrientation(orient); + } + } + + if (location.hash != currentHash) + { + var pageId = location.hash.substr(hashPrefix.length); + iui.showPageById(pageId); + } +} + +function setOrientation(orient) +{ + document.body.setAttribute("orient", orient); + setTimeout(scrollTo, 100, 0, 1); +} + +function showDialog(page) +{ + currentDialog = page; + page.setAttribute("selected", "true"); + + if (hasClass(page, "dialog") && !page.target) + showForm(page); +} + +function showForm(form) +{ + form.onsubmit = function(event) + { + event.preventDefault(); + submitForm(form); + }; + + form.onclick = function(event) + { + if (event.target == form && hasClass(form, "dialog")) + cancelDialog(form); + }; +} + +function cancelDialog(form) +{ + form.removeAttribute("selected"); +} + +function updatePage(page, fromPage) +{ + if (!page.id) + page.id = "__" + (++newPageCount) + "__"; + + location.href = currentHash = hashPrefix + page.id; + pageHistory.push(page.id); + + var pageTitle = $("pageTitle"); + if (page.title) + pageTitle.innerHTML = page.title; + + if (page.localName.toLowerCase() == "form" && !page.target) + showForm(page); + + var backButton = $("backButton"); + if (backButton) + { + var prevPage = $(pageHistory[pageHistory.length-2]); + if (prevPage && !page.getAttribute("hideBackButton")) + { + backButton.style.display = "inline"; + backButton.innerHTML = prevPage.title ? prevPage.title : "Back"; + } + else + backButton.style.display = "none"; + } +} + +function slidePagesNew(fromPage, toPage, backwards) +{ + try + { + var page = (backwards ? fromPage : toPage); + var axis = page.getAttribute("axis"); + + if (axis == "y") + page.style.top = "100%"; + else + { + if (backwards) + { + fromPage.style.left = "0%"; + toPage.style.left = "-100%"; + } + else + { + fromPage.style.left = "0%"; + toPage.style.left = "100%"; + } + } + + var transitionProperty = (axis == "y") ? 'top' : 'left'; + var transitionDuration = 300; + + toPage.style.webkitTransitionDuration = transitionDuration + "ms"; + fromPage.style.webkitTransitionDuration = transitionDuration + "ms"; + + toPage.setAttribute("selected", "true"); + scrollTo(0, 1); + + clearInterval(checkTimer); + + fromPage.style.webkitTransitionProperty = transitionProperty; + fromPage.style.transitionTimingFunction = "ease-in"; + + toPage.style.webkitTransitionProperty = transitionProperty; + toPage.style.transitionTimingFunction = "ease-in"; + + if (backwards) + { + fromPage.style.left="100%"; + toPage.style.left="0%"; + } + else + { + fromPage.style.left="-100%"; + toPage.style.left="0%"; + } + + // Call completion function sometime after we think we'll be done + setTimeout(slideComplete, transitionDuration); + + function slideComplete() + { + if (!hasClass(toPage, "dialog")) + fromPage.removeAttribute("selected"); + + toPage.style.webkitTransitionDuration = "0s"; + fromPage.style.webkitTransitionDuration = "0s"; + + checkTimer = setInterval(checkOrientAndLocation,300); + setTimeout(updatePage, 0, toPage, fromPage); + } + } + catch (ex) { alert(ex); } +} + +function slidePages(fromPage, toPage, backwards) +{ + var axis = (backwards ? fromPage : toPage).getAttribute("axis"); + if (axis == "y") + (backwards ? fromPage : toPage).style.top = "100%"; + else + toPage.style.left = "100%"; + + toPage.setAttribute("selected", "true"); + scrollTo(0, 1); + clearInterval(checkTimer); + + var percent = 100; + slide(); + var timer = setInterval(slide, slideInterval); + + function slide() + { + percent -= slideSpeed; + if (percent <= 0) + { + percent = 0; + if (!hasClass(toPage, "dialog")) + fromPage.removeAttribute("selected"); + clearInterval(timer); + checkTimer = setInterval(checkOrientAndLocation, 300); + setTimeout(updatePage, 0, toPage, fromPage); + } + + if (axis == "y") + { + backwards + ? fromPage.style.top = (100-percent) + "%" + : toPage.style.top = percent + "%"; + } + else + { + fromPage.style.left = (backwards ? (100-percent) : (percent-100)) + "%"; + toPage.style.left = (backwards ? -percent : percent) + "%"; + } + } +} + +function preloadImages() +{ + var preloader = document.createElement("div"); + preloader.id = "preloader"; + document.body.appendChild(preloader); +} + +function submitForm(form) +{ + // CWZ + if (form.getAttribute("target") == "_self") + form.submit(); + else + iui.showPageByHref(form.action, encodeForm(form), form.method || "POST"); +} + +function encodeForm(form) +{ + function encode(inputs) + { + for (var i = 0; i < inputs.length; ++i) + { + if (inputs[i].name) + { + if ((inputs[i].getAttribute("type") == "checkbox" && !inputs[i].checked) + || (inputs[i].getAttribute("type") == "radio" && !inputs[i].checked) + || (inputs[i].getAttribute("type") == "submit") + || (inputs[i].name && inputs[i].disabled)) + { + continue; + } + else + args.push(inputs[i].name + "=" + escape(inputs[i].value)); + } + } + } + + var args = []; + encode(form.getElementsByTagName("input")); + encode(form.getElementsByTagName("textarea")); // added in 0.20 + encode(form.getElementsByTagName("select")); + return args; +} + +function findParent(node, localName) +{ + while (node && (node.nodeType != 1 || node.localName.toLowerCase() != localName)) + node = node.parentNode; + return node; +} + +function hasClass(self, name) +{ + var re = new RegExp("(^|\\s)"+name+"($|\\s)"); + return re.exec(self.getAttribute("class")) != null; +} + +function replaceElementWithSource(replace, source) +{ + var page = replace.parentNode; + var parent = replace; + while (page.parentNode != document.body) + { + page = page.parentNode; + parent = parent.parentNode; + } + + var frag = document.createElement(parent.localName); + frag.innerHTML = source; + + page.removeChild(parent); + + while (frag.firstChild) + page.appendChild(frag.firstChild); +} + +function $(id) { return document.getElementById(id); } +function ddd() { console.log.apply(console, arguments); } + +// CWZ 04/24/2009 +function loadActionButton(page) +{ + try + { + var btn = $("actionButton"); + var lSet = false; + + if (!actionButtons[page.id]) + { + actionButtons[page.id] = { "title" : "", "href" : null, "target" : null, "visible" : true }; + + if (page.getAttribute("actionbutton")) + { + var oButton = eval("("+page.getAttribute("actionbutton")+")"); + + if (oButton) + { + if (oButton.title ) actionButtons[page.id].title = oButton.title; + if (oButton.href ) actionButtons[page.id].href = oButton.href; + if (oButton.target ) actionButtons[page.id].target = oButton.target; + } + + if (!btn) + { + var oToolbar = document.getElementsByClassName("toolbar")[0]; + btn = document.createElement("A"); + btn.id="actionButton"; + btn.className="button"; + + oToolbar.appendChild(btn); + } + } + else if (!btn) // stores the fact that the page has no button + { + lSet = true; + actionButtons[page.id].visible = false; + } + else + { + lSet = true; + actionButtons[page.id].title = btn.innerHTML; + actionButtons[page.id].href = btn.href; + actionButtons[page.id].target = btn.target; + } + } + + if (!lSet) + { + btn.style.visibility = (actionButtons[page.id].visible ? "visible" : "hidden"); + + if (actionButtons[page.id].title != null) btn.innerHTML = actionButtons[page.id].title; + if (actionButtons[page.id].href != null) btn.href = actionButtons[page.id].href; + if (actionButtons[page.id].target != null) btn.target = actionButtons[page.id].target; + } + } + catch (ex) { console.log(ex); } +} + +// CWZ 04/27/2009 +function continueLoadingPage(page, lNewPage) +{ + if (lNewPage && page.getAttribute("onload")) + eval(page.getAttribute("onload")); + + loadActionButton(page); + + if (page.onfocus) + page.onfocus(); +} + +// CWZ adapted from http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml +// and http://stackoverflow.com/questions/756382/bookmarklet-wait-until-javascript-is-loaded/756436 +function loadScript(cFilename, callback) +{ + var script = document.createElement("script"); + + script.setAttribute("type","text/javascript"); + script.setAttribute("src", cFilename); + + var done = false; + script.onload = script.onreadystatechange = function() + { + if( !done && ( !this.readyState + || this.readyState == "loaded" + || this.readyState == "complete") ) + { + done = true; + + callback(); + } + }; + + document.getElementsByTagName("head")[0].appendChild(script); + + return script; +} + +function loadStylesheet(cFilename, callback) +{ + var stylesheet = document.createElement("link"); + + stylesheet.setAttribute("rel", "stylesheet"); + stylesheet.setAttribute("type", "text/css"); + stylesheet.setAttribute("href", cFilename); + + if (callback) + { + var done = false; + stylesheet.onload = stylesheet.onreadystatechange = function() + { + if( !done && ( !this.readyState + || this.readyState == "loaded" + || this.readyState == "complete") ) + { + done = true; + + callback(); + } + }; + } + + document.getElementsByTagName("head")[0].appendChild(stylesheet); +} + + +})(); + diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.original.css b/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.original.css new file mode 100644 index 00000000..159398b7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.original.css @@ -0,0 +1,386 @@ +/* iui.css (c) 2007-9 by iUI Project Members, see LICENSE.txt for license */ +body { + margin: 0; + font-family: Helvetica; + background: #FFFFFF; + color: #000000; + overflow-x: hidden; + -webkit-user-select: none; + -webkit-text-size-adjust: none; +} + +body > *:not(.toolbar) { + display: none; + position: absolute; + margin: 0; + padding: 0; + left: 0; + top: 45px; + width: 100%; + min-height: 372px; +} + +body[orient="landscape"] > *:not(.toolbar) { + min-height: 268px; +} + +body > *[selected="true"] { + display: block; +} + +a[selected], a:active { + background-color: #194fdb !important; + background-image: url(listArrowSel.png), url(selection.png) !important; + background-repeat: no-repeat, repeat-x; + background-position: right center, left top; + color: #FFFFFF !important; +} + +a[selected="progress"] { + background-image: url(loading.gif), url(selection.png) !important; +} + +/************************************************************************************************/ + +body > .toolbar { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + border-bottom: 1px solid #2d3642; + border-top: 1px solid #6d84a2; + padding: 10px; + height: 45px; + background: url(toolbar.png) #6d84a2 repeat-x; +} + +.toolbar > h1 { + position: absolute; + overflow: hidden; + left: 50%; + margin: 1px 0 0 -75px; + height: 45px; + font-size: 20px; + width: 150px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + color: #FFFFFF; +} + +body[orient="landscape"] > .toolbar > h1 { + margin-left: -125px; + width: 250px; +} + +.button { + position: absolute; + overflow: hidden; + top: 8px; + right: 6px; + margin: 0; + border-width: 0 5px; + padding: 0 3px; + width: auto; + height: 30px; + line-height: 30px; + font-family: inherit; + font-size: 12px; + font-weight: bold; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0; + text-overflow: ellipsis; + text-decoration: none; + white-space: nowrap; + background: none; + -webkit-border-image: url(toolButton.png) 0 5 0 5; +} + +.blueButton { + -webkit-border-image: url(blueButton.png) 0 5 0 5; + border-width: 0 5px; +} + +.leftButton { + left: 6px; + right: auto; +} + +#backButton { + display: none; + left: 6px; + right: auto; + padding: 0; + max-width: 55px; + border-width: 0 8px 0 14px; + -webkit-border-image: url(backButton.png) 0 8 0 14; +} + +.whiteButton, +.grayButton { + display: block; + border-width: 0 12px; + padding: 10px; + text-align: center; + font-size: 20px; + font-weight: bold; + text-decoration: inherit; + color: inherit; +} + +.whiteButton { + -webkit-border-image: url(whiteButton.png) 0 12 0 12; + text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0; +} + +.grayButton { + -webkit-border-image: url(grayButton.png) 0 12 0 12; + color: #FFFFFF; +} + +/************************************************************************************************/ + +body > ul > li { + position: relative; + margin: 0; + border-bottom: 1px solid #E0E0E0; + padding: 8px 0 8px 10px; + font-size: 20px; + font-weight: bold; + list-style: none; +} + +body > ul > li.group { + position: relative; + top: -1px; + margin-bottom: -2px; + border-top: 1px solid #7d7d7d; + border-bottom: 1px solid #999999; + padding: 1px 10px; + background: url(listGroup.png) repeat-x; + font-size: 17px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0; + color: #FFFFFF; +} + +body > ul > li.group:first-child { + top: 0; + border-top: none; +} + +body > ul > li > a { + display: block; + margin: -8px 0 -8px -10px; + padding: 8px 32px 8px 10px; + text-decoration: none; + color: inherit; + background: url(listArrow.png) no-repeat right center; +} + +a[target="_replace"] { + box-sizing: border-box; + -webkit-box-sizing: border-box; + padding-top: 25px; + padding-bottom: 25px; + font-size: 18px; + color: cornflowerblue; + background-color: #FFFFFF; + background-image: none; +} + +/************************************************************************************************/ + +body > .dialog { + top: 0; + width: 100%; + min-height: 417px; + z-index: 2; + background: rgba(0, 0, 0, 0.8); + padding: 0; + text-align: right; +} + +.dialog > fieldset { + box-sizing: border-box; + -webkit-box-sizing: border-box; + width: 100%; + margin: 0; + border: none; + border-top: 1px solid #6d84a2; + padding: 10px 6px; + background: url(toolbar.png) #7388a5 repeat-x; +} + +.dialog > fieldset > h1 { + margin: 0 10px 0 10px; + padding: 0; + font-size: 20px; + font-weight: bold; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; + text-align: center; +} + +.dialog > fieldset > label { + position: absolute; + margin: 16px 0 0 6px; + font-size: 14px; + color: #999999; +} + +input:not(input[type|=radio]):not(input[type|=checkbox]) { + box-sizing: border-box; + -webkit-box-sizing: border-box; + width: 100%; + margin: 8px 0 0 0; + padding: 6px 6px 6px 44px; + font-size: 16px; + font-weight: normal; +} + +/************************************************************************************************/ + +body > .panel { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + padding: 10px; + background: #c8c8c8 url(pinstripes.png); +} + +.panel > fieldset { + position: relative; + margin: 0 0 20px 0; + padding: 0; + background: #FFFFFF; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border: 1px solid #999999; + text-align: right; + font-size: 16px; +} + +.row { + position: relative; + min-height: 42px; + border-bottom: 1px solid #999999; + -webkit-border-radius: 0; + text-align: right; +} + +fieldset > .row:last-child { + border-bottom: none !important; +} + +.row > input:not(input[type|=radio]):not(input[type|=checkbox]) { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + margin: 0; + border: none; + padding: 12px 10px 0 110px; + height: 42px; + background: none; +} +.row > input[type|=radio], .row > input[type|=checkbox] { + margin: 7px 7px 0 0; + height: 25px; + width: 25px; +} + +.row > label { + position: absolute; + margin: 0 0 0 14px; + line-height: 42px; + font-weight: bold; +} + +.row > span { + position: absolute; + padding: 12px 10px 0 110px; + margin: 0; +} + +.row > .toggle { + position: absolute; + top: 6px; + right: 6px; + width: 100px; + height: 28px; +} + +.toggle { + border: 1px solid #888888; + -webkit-border-radius: 6px; + background: #FFFFFF url(toggle.png) repeat-x; + font-size: 19px; + font-weight: bold; + line-height: 30px; +} + +.toggle[toggled="true"] { + border: 1px solid #143fae; + background: #194fdb url(toggleOn.png) repeat-x; +} + +.toggleOn { + display: none; + position: absolute; + width: 60px; + text-align: center; + left: 0; + top: 0; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; +} + +.toggleOff { + position: absolute; + width: 60px; + text-align: center; + right: 0; + top: 0; + color: #666666; +} + +.toggle[toggled="true"] > .toggleOn { + display: block; +} + +.toggle[toggled="true"] > .toggleOff { + display: none; +} + +.thumb { + position: absolute; + top: -1px; + left: -1px; + width: 40px; + height: 28px; + border: 1px solid #888888; + -webkit-border-radius: 6px; + background: #ffffff url(thumb.png) repeat-x; +} + +.toggle[toggled="true"] > .thumb { + left: auto; + right: -1px; +} + +.panel > h2 { + margin: 0 0 8px 14px; + font-size: inherit; + font-weight: bold; + color: #4d4d70; + text-shadow: rgba(255, 255, 255, 0.75) 2px 2px 0; +} + +/************************************************************************************************/ + +#preloader { + display: none; + background-image: url(loading.gif), url(selection.png), + url(blueButton.png), url(listArrowSel.png), url(listGroup.png); +} \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.original.js b/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.original.js new file mode 100644 index 00000000..b7a7c7c6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/resources/iui/iui.original.js @@ -0,0 +1,444 @@ +/* + Copyright (c) 2007-9, iUI Project Members + See LICENSE.txt for licensing terms + */ + + +(function() { + +var slideSpeed = 20; +var slideInterval = 0; + +var currentPage = null; +var currentDialog = null; +var currentWidth = 0; +var currentHash = location.hash; +var hashPrefix = "#_"; +var pageHistory = []; +var newPageCount = 0; +var checkTimer; +var hasOrientationEvent = false; +var portraitVal = "portrait"; +var landscapeVal = "landscape"; + +// ************************************************************************************************* + +window.iui = +{ + showPage: function(page, backwards) + { + if (page) + { + if (currentDialog) + { + currentDialog.removeAttribute("selected"); + currentDialog = null; + } + + if (hasClass(page, "dialog")) + showDialog(page); + else + { + var fromPage = currentPage; + currentPage = page; + + if (fromPage) + setTimeout(slidePages, 0, fromPage, page, backwards); + else + updatePage(page, fromPage); + } + } + }, + + showPageById: function(pageId) + { + var page = $(pageId); + if (page) + { + var index = pageHistory.indexOf(pageId); + var backwards = index != -1; + if (backwards) + pageHistory.splice(index, pageHistory.length); + + iui.showPage(page, backwards); + } + }, + + showPageByHref: function(href, args, method, replace, cb) + { + var req = new XMLHttpRequest(); + req.onerror = function() + { + if (cb) + cb(false); + }; + + req.onreadystatechange = function() + { + if (req.readyState == 4) + { + if (replace) + replaceElementWithSource(replace, req.responseText); + else + { + var frag = document.createElement("div"); + frag.innerHTML = req.responseText; + iui.insertPages(frag.childNodes); + } + if (cb) + setTimeout(cb, 1000, true); + } + }; + + if (args) + { + req.open(method || "GET", href, true); + req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + req.setRequestHeader("Content-Length", args.length); + req.send(args.join("&")); + } + else + { + req.open(method || "GET", href, true); + req.send(null); + } + }, + + insertPages: function(nodes) + { + var targetPage; + for (var i = 0; i < nodes.length; ++i) + { + var child = nodes[i]; + if (child.nodeType == 1) + { + if (!child.id) + child.id = "__" + (++newPageCount) + "__"; + + var clone = $(child.id); + if (clone) + clone.parentNode.replaceChild(child, clone); + else + document.body.appendChild(child); + + if (child.getAttribute("selected") == "true" || !targetPage) + targetPage = child; + + --i; + } + } + + if (targetPage) + iui.showPage(targetPage); + }, + + getSelectedPage: function() + { + for (var child = document.body.firstChild; child; child = child.nextSibling) + { + if (child.nodeType == 1 && child.getAttribute("selected") == "true") + return child; + } + }, + isNativeUrl: function(href) + { + for(var i = 0; i < iui.nativeUrlPatterns.length; i++) + { + if(href.match(iui.nativeUrlPatterns[i])) return true; + } + return false; + }, + nativeUrlPatterns: [ + new RegExp("^http:\/\/maps.google.com\/maps\?"), + new RegExp("^mailto:"), + new RegExp("^tel:"), + new RegExp("^http:\/\/www.youtube.com\/watch\\?v="), + new RegExp("^http:\/\/www.youtube.com\/v\/") + ] +}; + +// ************************************************************************************************* + +addEventListener("load", function(event) +{ + var page = iui.getSelectedPage(); + if (page) + iui.showPage(page); + + setTimeout(preloadImages, 0); + setTimeout(checkOrientAndLocation, 0); + checkTimer = setInterval(checkOrientAndLocation, 300); +}, false); + +addEventListener("unload", function(event) +{ + return; +}, false); + +addEventListener("click", function(event) +{ + var link = findParent(event.target, "a"); + if (link) + { + function unselect() { link.removeAttribute("selected"); } + + if (link.href && link.hash && link.hash != "#") + { + link.setAttribute("selected", "true"); + iui.showPage($(link.hash.substr(1))); + setTimeout(unselect, 500); + } + else if (link == $("backButton")) + history.back(); + else if (link.getAttribute("type") == "submit") + submitForm(findParent(link, "form")); + else if (link.getAttribute("type") == "cancel") + cancelDialog(findParent(link, "form")); + else if (link.target == "_replace") + { + link.setAttribute("selected", "progress"); + iui.showPageByHref(link.href, null, null, link, unselect); + } + else if (iui.isNativeUrl(link.href)) + { + return; + } + else if (!link.target) + { + link.setAttribute("selected", "progress"); + iui.showPageByHref(link.href, null, null, null, unselect); + } + else + return; + + event.preventDefault(); + } +}, true); + +addEventListener("click", function(event) +{ + var div = findParent(event.target, "div"); + if (div && hasClass(div, "toggle")) + { + div.setAttribute("toggled", div.getAttribute("toggled") != "true"); + event.preventDefault(); + } +}, true); + +function orientChangeHandler() +{ + var orientation=window.orientation; + switch(orientation) + { + case 0: + setOrientation(portraitVal); + break; + + case 90: + case -90: + setOrientation(landscapeVal); + break; + } +} + +if (typeof window.onorientationchange == "object") +{ + window.onorientationchange=orientChangeHandler; + hasOrientationEvent = true; + setTimeout(orientChangeHandler, 0); +} + +function checkOrientAndLocation() +{ + if (!hasOrientationEvent) + { + if (window.innerWidth != currentWidth) + { + currentWidth = window.innerWidth; + var orient = currentWidth == 320 ? portraitVal : landscapeVal; + setOrientation(orient); + } + } + + if (location.hash != currentHash) + { + var pageId = location.hash.substr(hashPrefix.length); + iui.showPageById(pageId); + } +} + +function setOrientation(orient) +{ + document.body.setAttribute("orient", orient); + setTimeout(scrollTo, 100, 0, 1); +} + +function showDialog(page) +{ + currentDialog = page; + page.setAttribute("selected", "true"); + + if (hasClass(page, "dialog") && !page.target) + showForm(page); +} + +function showForm(form) +{ + form.onsubmit = function(event) + { + event.preventDefault(); + submitForm(form); + }; + + form.onclick = function(event) + { + if (event.target == form && hasClass(form, "dialog")) + cancelDialog(form); + }; +} + +function cancelDialog(form) +{ + form.removeAttribute("selected"); +} + +function updatePage(page, fromPage) +{ + if (!page.id) + page.id = "__" + (++newPageCount) + "__"; + + location.href = currentHash = hashPrefix + page.id; + pageHistory.push(page.id); + + var pageTitle = $("pageTitle"); + if (page.title) + pageTitle.innerHTML = page.title; + + if (page.localName.toLowerCase() == "form" && !page.target) + showForm(page); + + var backButton = $("backButton"); + if (backButton) + { + var prevPage = $(pageHistory[pageHistory.length-2]); + if (prevPage && !page.getAttribute("hideBackButton")) + { + backButton.style.display = "inline"; + backButton.innerHTML = prevPage.title ? prevPage.title : "Back"; + } + else + backButton.style.display = "none"; + } +} + +function slidePages(fromPage, toPage, backwards) +{ + var axis = (backwards ? fromPage : toPage).getAttribute("axis"); + if (axis == "y") + (backwards ? fromPage : toPage).style.top = "100%"; + else + toPage.style.left = "100%"; + + toPage.setAttribute("selected", "true"); + scrollTo(0, 1); + clearInterval(checkTimer); + + var percent = 100; + slide(); + var timer = setInterval(slide, slideInterval); + + function slide() + { + percent -= slideSpeed; + if (percent <= 0) + { + percent = 0; + if (!hasClass(toPage, "dialog")) + fromPage.removeAttribute("selected"); + clearInterval(timer); + checkTimer = setInterval(checkOrientAndLocation, 300); + setTimeout(updatePage, 0, toPage, fromPage); + } + + if (axis == "y") + { + backwards + ? fromPage.style.top = (100-percent) + "%" + : toPage.style.top = percent + "%"; + } + else + { + fromPage.style.left = (backwards ? (100-percent) : (percent-100)) + "%"; + toPage.style.left = (backwards ? -percent : percent) + "%"; + } + } +} + +function preloadImages() +{ + var preloader = document.createElement("div"); + preloader.id = "preloader"; + document.body.appendChild(preloader); +} + + +function submitForm(form) +{ + iui.showPageByHref(form.action || "POST", encodeForm(form), form.method); +} + + +function encodeForm(form) +{ + function encode(inputs) + { + for (var i = 0; i < inputs.length; ++i) + { + if (inputs[i].name) + args.push(inputs[i].name + "=" + escape(inputs[i].value)); + } + } + + var args = []; + encode(form.getElementsByTagName("input")); + encode(form.getElementsByTagName("textarea")); + encode(form.getElementsByTagName("select")); + return args; +} + +function findParent(node, localName) +{ + while (node && (node.nodeType != 1 || node.localName.toLowerCase() != localName)) + node = node.parentNode; + return node; +} + +function hasClass(self, name) +{ + var re = new RegExp("(^|\\s)"+name+"($|\\s)"); + return re.exec(self.getAttribute("class")) != null; +} + +function replaceElementWithSource(replace, source) +{ + var page = replace.parentNode; + var parent = replace; + while (page.parentNode != document.body) + { + page = page.parentNode; + parent = parent.parentNode; + } + + var frag = document.createElement(parent.localName); + frag.innerHTML = source; + + page.removeChild(parent); + + while (frag.firstChild) + page.appendChild(frag.firstChild); +} + +function $(id) { return document.getElementById(id); } +function ddd() { console.log.apply(console, arguments); } + +})(); diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/iuix.css b/oss/vtiger/trunk/modules/Mobile/resources/iui/iuix.css new file mode 100644 index 00000000..67eead37 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/resources/iui/iuix.css @@ -0,0 +1 @@ +body{margin:0;font-family:Helvetica;background:#FFF;color:#000;overflow-x:hidden;-webkit-user-select:none;-webkit-text-size-adjust:none;}body>*:not(.toolbar){display:none;position:absolute;margin:0;padding:0;left:0;top:45px;width:100%;min-height:372px;}body[orient="landscape"]>*:not(.toolbar){min-height:268px;}body>*[selected="true"]{display:block;}a[selected],a:active{background-color:#194fdb!important;background-image:url(listArrowSel.png),url(selection.png)!important;background-repeat:no-repeat,repeat-x;background-position:right center,left top;color:#FFF!important;}a[selected="progress"]{background-image:url(loading.gif),url(selection.png)!important;}body>.toolbar{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-bottom:1px solid #2d3642;border-top:1px solid #6d84a2;padding:10px;height:45px;background:url(toolbar.png) #6d84a2 repeat-x;}.toolbar>h1{position:absolute;overflow:hidden;left:50%;margin:1px 0 0 -75px;height:45px;font-size:20px;width:150px;font-weight:bold;text-shadow:rgba(0,0,0,0.4) 0 -1px 0;text-align:center;text-overflow:ellipsis;white-space:nowrap;color:#FFF;}body[orient="landscape"]>.toolbar>h1{margin-left:-125px;width:250px;}.button{position:absolute;overflow:hidden;top:8px;right:6px;margin:0;border-width:0 5px;padding:0 3px;width:auto;height:30px;line-height:30px;font-family:inherit;font-size:12px;font-weight:bold;color:#FFF;text-shadow:rgba(0,0,0,0.6) 0 -1px 0;text-overflow:ellipsis;text-decoration:none;white-space:nowrap;background:none;-webkit-border-image:url(toolButton.png) 0 5 0 5;}.blueButton{-webkit-border-image:url(blueButton.png) 0 5 0 5;border-width:0 5px;}.leftButton{left:6px;right:auto;}#backButton{display:none;left:6px;right:auto;padding:0;max-width:55px;border-width:0 8px 0 14px;-webkit-border-image:url(backButton.png) 0 8 0 14;}.whiteButton,.grayButton{display:block;border-width:0 12px;padding:10px;text-align:center;font-size:20px;font-weight:bold;text-decoration:inherit;color:inherit;}.whiteButton{-webkit-border-image:url(whiteButton.png) 0 12 0 12;text-shadow:rgba(255,255,255,0.7) 0 1px 0;}.grayButton{-webkit-border-image:url(grayButton.png) 0 12 0 12;color:#FFF;}body>ul>li{position:relative;margin:0;border-bottom:1px solid #E0E0E0;padding:8px 0 8px 10px;font-size:20px;font-weight:bold;list-style:none;}body>ul>li.group{position:relative;top:-1px;margin-bottom:-2px;border-top:1px solid #7d7d7d;border-bottom:1px solid #999;padding:1px 10px;background:url(listGroup.png) repeat-x;font-size:17px;font-weight:bold;text-shadow:rgba(0,0,0,0.4) 0 1px 0;color:#FFF;}body>ul>li.group:first-child{top:0;border-top:none;}body>ul>li>a{display:block;margin:-8px 0 -8px -10px;padding:8px 32px 8px 10px;text-decoration:none;color:inherit;background:url(listArrow.png) no-repeat right center;}a[target="_replace"]{box-sizing:border-box;-webkit-box-sizing:border-box;padding-top:25px;padding-bottom:25px;font-size:18px;color:cornflowerblue;background-color:#FFF;background-image:none;}body>.dialog{top:0;width:100%;min-height:417px;z-index:2;background:rgba(0,0,0,0.8);padding:0;text-align:right;}.dialog>fieldset{box-sizing:border-box;-webkit-box-sizing:border-box;width:100%;margin:0;border:none;border-top:1px solid #6d84a2;padding:10px 6px;background:url(toolbar.png) #7388a5 repeat-x;}.dialog>fieldset>h1{margin:0 10px 0 10px;padding:0;font-size:20px;font-weight:bold;color:#FFF;text-shadow:rgba(0,0,0,0.4) 0 -1px 0;text-align:center;}.dialog>fieldset>label{position:absolute;margin:16px 0 0 6px;font-size:14px;color:#999;}input:not(input[type|=radio]):not(input[type|=checkbox]){box-sizing:border-box;-webkit-box-sizing:border-box;width:100%;margin:8px 0 0 0;padding:6px 6px 6px 44px;font-size:16px;font-weight:normal;}body>.panel{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:10px;background:#c8c8c8 url(pinstripes.png);}.panel>fieldset{position:relative;margin:0 0 20px 0;padding:0;background:#FFF;-webkit-border-radius:10px;-moz-border-radius:10px;border:1px solid #999;text-align:right;font-size:16px;}.row{position:relative;min-height:42px;border-bottom:1px solid #999;-webkit-border-radius:0;text-align:right;}fieldset>.row:last-child{border-bottom:none!important;}.row>input:not(input[type|=radio]):not(input[type|=checkbox]){box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;margin:0;border:none;padding:12px 10px 0 110px;height:42px;background:none;}.row>input[type|=radio],.row>input[type|=checkbox]{margin:7px 7px 0 0;height:25px;width:25px;}.row>label{position:absolute;margin:0 0 0 14px;line-height:42px;font-weight:bold;}.row>span{position:absolute;padding:12px 10px 0 110px;margin:0;}.row>.toggle{position:absolute;top:6px;right:6px;width:100px;height:28px;}.toggle{border:1px solid #888;-webkit-border-radius:6px;background:#FFF url(toggle.png) repeat-x;font-size:19px;font-weight:bold;line-height:30px;}.toggle[toggled="true"]{border:1px solid #143fae;background:#194fdb url(toggleOn.png) repeat-x;}.toggleOn{display:none;position:absolute;width:60px;text-align:center;left:0;top:0;color:#FFF;text-shadow:rgba(0,0,0,0.4) 0 -1px 0;}.toggleOff{position:absolute;width:60px;text-align:center;right:0;top:0;color:#666;}.toggle[toggled="true"]>.toggleOn{display:block;}.toggle[toggled="true"]>.toggleOff{display:none;}.thumb{position:absolute;top:-1px;left:-1px;width:40px;height:28px;border:1px solid #888;-webkit-border-radius:6px;background:#fff url(thumb.png) repeat-x;}.toggle[toggled="true"]>.thumb{left:auto;right:-1px;}.panel>h2{margin:0 0 8px 14px;font-size:inherit;font-weight:bold;color:#4d4d70;text-shadow:rgba(255,255,255,0.75) 2px 2px 0;}#preloader{display:none;background-image:url(loading.gif),url(selection.png),url(blueButton.png),url(listArrowSel.png),url(listGroup.png);} \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/iuix.js b/oss/vtiger/trunk/modules/Mobile/resources/iui/iuix.js new file mode 100644 index 00000000..68e1cba1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/resources/iui/iuix.js @@ -0,0 +1 @@ +(function(){var _1=20;var _2=0;var _3=null;var _4=null;var _5=0;var _6=location.hash;var _7="#_";var _8=[];var _9=0;var _a;var _b=false;var _c="portrait";var _d="landscape";window.iui={showPage:function(_e,_f){if(_e){if(_4){_4.removeAttribute("selected");_4=null;}if(hasClass(_e,"dialog")){showDialog(_e);}else{var _10=_3;_3=_e;if(_10){setTimeout(slidePages,0,_10,_e,_f);}else{updatePage(_e,_10);}}}},showPageById:function(_11){var _12=$(_11);if(_12){var _13=_8.indexOf(_11);var _14=_13!=-1;if(_14){_8.splice(_13,_8.length);}iui.showPage(_12,_14);}},showPageByHref:function(_15,_16,_17,_18,cb){var req=new XMLHttpRequest();req.onerror=function(){if(cb){cb(false);}};req.onreadystatechange=function(){if(req.readyState==4){if(_18){replaceElementWithSource(_18,req.responseText);}else{var _1b=document.createElement("div");_1b.innerHTML=req.responseText;iui.insertPages(_1b.childNodes);}if(cb){setTimeout(cb,1000,true);}}};if(_16){req.open(_17||"GET",_15,true);req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");req.setRequestHeader("Content-Length",_16.length);req.send(_16.join("&"));}else{req.open(_17||"GET",_15,true);req.send(null);}},insertPages:function(_1c){var _1d;for(var i=0;i<_1c.length;++i){var _1f=_1c[i];if(_1f.nodeType==1){if(!_1f.id){_1f.id="__"+(++_9)+"__";}var _20=$(_1f.id);if(_20){_20.parentNode.replaceChild(_1f,_20);}else{document.body.appendChild(_1f);}if(_1f.getAttribute("selected")=="true"||!_1d){_1d=_1f;}--i;}}if(_1d){iui.showPage(_1d);}},getSelectedPage:function(){for(var _21=document.body.firstChild;_21;_21=_21.nextSibling){if(_21.nodeType==1&&_21.getAttribute("selected")=="true"){return _21;}}},isNativeUrl:function(_22){for(var i=0;iCgZF_RMP;g_&g!eAw8+>M~{e^us?&19oxF zesu1f-zQziO$!7&@4IwANODeU)>*x*Rn^qtPS=tAh0|PL2=Z@Q!F+ZRSJaYqUMAhQ zG`Dhu3(aFX@_xb(O9venU+*Q2KNu!0^l!Yucs8g@r!jItQ`$kM_RelF{r G5}E+j-eN=m literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/listArrowSel.png b/oss/vtiger/trunk/modules/Mobile/resources/iui/listArrowSel.png new file mode 100644 index 0000000000000000000000000000000000000000..86832ebc7b961840d95938a98a0905cb09bc84a9 GIT binary patch literal 308 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 Is33zi04%B!Q2+n{ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/pinstripes.png b/oss/vtiger/trunk/modules/Mobile/resources/iui/pinstripes.png new file mode 100644 index 0000000000000000000000000000000000000000..c99777512fb135af7dcdf4130e5770072cb39241 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)O!2~4dW-8AFQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jio`u#978H@CD~Lx<6>s|lboE)9K^uL#$fKtT%LaBX8=$M NgQu&X%Q~loCIB>$9?k#& literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/selection.png b/oss/vtiger/trunk/modules/Mobile/resources/iui/selection.png new file mode 100644 index 0000000000000000000000000000000000000000..537e3f0b13ea422a5ac5487317872414d51574c1 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiX1&%978x{Sr2X$Jj5WtvT?p{@1r}0Gc6VGKL6Qv;l%Dc zTgw%X}gxBOXmxAbz1ds%&OUSwBY#<9&n!x%hW{an^L HB{Ts5+CMp^ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/thumb.png b/oss/vtiger/trunk/modules/Mobile/resources/iui/thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..cefa8fc5e9db724b96d36a8df814ecdf85d05582 GIT binary patch literal 2835 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/toggle.png b/oss/vtiger/trunk/modules/Mobile/resources/iui/toggle.png new file mode 100644 index 0000000000000000000000000000000000000000..3b62ebf26eaf8b21e341d413a6bd7cebcf5e7075 GIT binary patch literal 2815 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/iui/whiteButton.png b/oss/vtiger/trunk/modules/Mobile/resources/iui/whiteButton.png new file mode 100644 index 0000000000000000000000000000000000000000..5514b270053a41039e9e96ef8591796521ee0312 GIT binary patch literal 978 zcmV;@11}R*8aG1*L?d1O->_T@+D~u1Y}!yL0VI=|WL) zUB!jV?nDqFVEqcjNU7Q;7-O1A(q?8dlX-96yZ5-5q-Ly5=jDGlkNe*5{m(h~zIU$B ztvpZh0>hld-kwYNkqy3Ko}K-V%D(G)Z`(9CN35XDjL&xuH$Mh_XF(}UB(Tw%lJL(m|<1LC)=R9eoc+{eJ zNQwFm3ZOo%tAYib`a=Ya6#-N=4JiO(J0G^!!{zGLYx*)_QJi=^gsb6jQm_J=B!6wD zD%0-bC{8`;0(Q9FGD%w0qhLC5rQirtj;nGAUq!X!Dqd2rt6&lNPuJ>g7pqvn zrLC}dJQx&>lhnC-)EE`H)reg0T)izKV$|3W#Z{x-uG+(BCOFiFCeuK~FK_qmdcCS1 z>8qPuMY7^&mwW$}US2j%`m-B`MG8c7zyGk_Te#n^&tIcWp2Z*u%VSYOaGhsH3-(@~ zmGI-aXiXaBcJ0@|xe~1jq8+&sKXGKh9t>WX-&ip>B{%Tf)t#qUx1u_4ei+87UrHDfl6dXpw%k7!k~_oku06C3S8F^@(Qf&-L}LBUh<3`S518 zHslKoXby|rLrF-aMbk8j+ef37#cK7AgI*>xK3*KI+wDGQqnw)Edn!H~2Jv7#l+-p> zSL68q&WJ!JQ!W>a*5>p3XLojzq*mM7in|*4KU7;ZTp6~iyZ`_I07*qoM6N<$f;?{4 AHUIzs literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/skins/default.css b/oss/vtiger/trunk/modules/Mobile/resources/skins/default.css new file mode 100644 index 00000000..2930d3e0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Mobile/resources/skins/default.css @@ -0,0 +1,172 @@ +/*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************/ +body { + font-family: Helvetica; + padding: 0; + margin: 0; +} + +h1, h2, h3, h4, h5, b, p, i, u { + padding: 0; + margin: 0; +} + +p { + color: #9f9f9f; +} + +table { + font: inherit; +} + +a { + color: #0070BA; + text-decoration: none; +} + +input { + font-size: 15px; +} + +.error { + color: red; +} + +.button { + color: white; + background-color: #5992CC; + border: 1px solid #5992CC; + border-right: 2px groove; + border-bottom: 2px groove; + width: 80px; + height: 25px; +} + +img { + border: 0; + vertical-align: top; +} + +.hide { + display: none; +} + +.toright { + float: right; +} + +.toolbar { + background: #5992CC; +} + +.toolbar .link { + color: white; + font-size: 12px; + font-weight: bold; +} + +.page_title { + font-size: 20px; + background-color: #5992CC; + padding: 5px 0 2px 0; + color: white; + text-align: center; +} + +.panel_login { + border: 2px solid #5992CC; +} + +.table_list, .table_detail { + +} + +.table_list td { + border-bottom: 1px solid #DDDDFF; + font-size: 15px; +} + +.table_list a, .table_detail a { + display: block; + padding: 10px 1px 10px 5px; +} + +.table_list .info > td { + padding: 10px 1px; +} + +a.link_rhook { + display: block; + text-decoration: none; + padding: 0 10px 0 0; + margin-bottom: 2px; +} + +a.autolink { + border-bottom: 0; + padding: 0; + font: inherit; + display: inline; +} + +.table_detail .hdrlabel { + font-weight: bold; + font-size: 15px; + border-bottom: 1px solid #DDDDFF; +} + +.table_detail .label, .table_detail .label2 { + font-size: 13px; + text-align: right; + color: gray; + font-weight: normal; +} + +.table_detail .label2 { + font-size: 15px; + text-align: left; +} + +.table_detail .data { + font-size: 14px; +} + +.searchbox { + font-size: 20px; + margin: 20px; +} + +/* Checkbox UI similar to iPhone */ +.table_checkbox { + width: 100px; + font-size: 12px; + font-weight: bold; + border: 1px solid #888888; + background-color: #FCFCFC; +} +.table_checkbox .on { + float: right; + padding: 5px 15px; + background: #5F92FF; + color: white; +} + +.table_checkbox .off { + float: left; + padding: 5px 15px; + background: #EFEFEF; + color: #888888; +} + +.table_checkbox a { + color: inherit; + padding: 0; +} + +/* END */ diff --git a/oss/vtiger/trunk/modules/Notes/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Notes/language/zh_cn.lang.php new file mode 100644 index 00000000..d91573a3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Notes/language/zh_cn.lang.php @@ -0,0 +1,41 @@ + '备忘录', + 'LBL_MODULE_TITLE' => '备忘录: 首页', + 'LBL_SEARCH_FORM_TITLE' => '查找备忘录', + 'LBL_LIST_FORM_TITLE' => '备忘录列表', + 'LBL_NEW_FORM_TITLE' => '新增列表', + 'LBL_LIST_SUBJECT' => '主题', + 'LBL_LIST_CONTACT_NAME' => '联系人姓名', + 'LBL_LIST_RELATED_TO' => '相关对象', + 'LBL_LIST_DATE_MODIFIED' => '最新修改', + 'LBL_NOTE' => '备忘录:', + 'LBL_NOTE_SUBJECT' => '备忘录主题:', + 'LBL_CONTACT_NAME' => '联系人姓名:', + 'LBL_PHONE' => '电话:', + 'LBL_SUBJECT' => '主题:', + 'LBL_CLOSE' => '完成:', + 'LBL_RELATED_TO' => '相关对象:', + 'LBL_EMAIL_ADDRESS' => 'Email地址:', + 'LBL_COLON' => ':', + 'ERR_DELETE_RECORD' => '必须指定记录编号才能删除客户.', + 'LBL_LIST_FILENAME' => '*附件', + 'LBL_FILENAME' => '*附件:', + 'LBL_NOTE_INFORMATION' => '备忘录信息', + 'LBL_TOOL_FORM_TITLE' => '备忘录工具', + 'Contact Name' => '联系人姓名', + 'Related To' => '相关对象', + 'Subject' => '主题', + 'Created Time' => '创建时间', + 'Modified Time' => '修改时间', + 'Attachment' => '附件', + 'Note' => '备注', + 'Related to' => '相关对象', + 'Last Modified' => '最新更改日期', + 'File' => '文件', + 'LBL_ALL' => '所有', + 'LBL_ASSIGNED_TO' => '负责人', + 'Assigned To' => '负责人', + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Orders/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Orders/language/zh_cn.lang.php new file mode 100644 index 00000000..e5c0dab5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Orders/language/zh_cn.lang.php @@ -0,0 +1,138 @@ + '订单', + 'LBL_SO_MODULE_NAME' => '销售订单', + 'LBL_RELATED_PRODUCTS' => '系列产品', + 'LBL_MODULE_TITLE' => '订单: Home', + 'LBL_SEARCH_FORM_TITLE' => '查找订单', + 'LBL_LIST_FORM_TITLE' => '采购订单列表', + 'LBL_LIST_SO_FORM_TITLE' => '销售订单列表', + 'LBL_NEW_FORM_TITLE' => '新增采购订单', + 'LBL_NEW_FORM_SO_TITLE' => '新增销售订单', + 'LBL_MEMBER_ORG_FORM_TITLE' => '下属单位', + 'LBL_LIST_ACCOUNT_NAME' => '客户姓名', + 'LBL_LIST_CITY' => '城市', + 'LBL_LIST_WEBSITE' => '网站', + 'LBL_LIST_STATE' => '省份', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_EMAIL_ADDRESS' => 'Email地址', + 'LBL_LIST_CONTACT_NAME' => '联系人姓名', + 'db_name' => 'LBL_LIST_ACCOUNT_NAME', + 'db_website' => 'LBL_LIST_WEBSITE', + 'db_billing_address_city' => 'LBL_LIST_CITY', + 'LBL_ACCOUNT' => '客户:', + 'LBL_ACCOUNT_NAME' => '客户名称:', + 'LBL_PHONE' => '电话:', + 'LBL_WEBSITE' => '网站:', + 'LBL_FAX' => '传真:', + 'LBL_TICKER_SYMBOL' => '股票代码:', + 'LBL_OTHER_PHONE' => '其他电话:', + 'LBL_ANY_PHONE' => '任意电话:', + 'LBL_MEMBER_OF' => '上级单位:', + 'LBL_EMAIL' => 'Email:', + 'LBL_EMPLOYEES' => '员工:', + 'LBL_OTHER_EMAIL_ADDRESS' => '其它Email:', + 'LBL_ANY_EMAIL' => '任意Email:', + 'LBL_OWNERSHIP' => '所有制:', + 'LBL_RATING' => '评价:', + 'LBL_INDUSTRY' => '行业:', + 'LBL_SIC_CODE' => '行业编码:', + 'LBL_TYPE' => '类型:', + 'LBL_ANNUAL_REVENUE' => '年收入:', + 'LBL_ADDRESS_INFORMATION' => '地址信息', + 'LBL_Quote_INFORMATION' => '客户信息', + 'LBL_CUSTOM_INFORMATION' => '自定义信息', + 'LBL_BILLING_ADDRESS' => '付款地址:', + 'LBL_SHIPPING_ADDRESS' => '付款地址:', + 'LBL_ANY_ADDRESS' => '任何地址:', + 'LBL_CITY' => '城市:', + 'LBL_STATE' => '省份:', + 'LBL_POSTAL_CODE' => '邮编:', + 'LBL_COUNTRY' => '国家:', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息:', + 'LBL_TERMS_INFORMATION' => '付款条件', + 'LBL_DESCRIPTION' => '描述:', + 'NTC_COPY_BILLING_ADDRESS' => '将付款地址复制到收货地址', + 'NTC_COPY_SHIPPING_ADDRESS' => '将收货地址复制到付款地址', + 'NTC_REMOVE_MEMBER_ORG_CONFIRMATION' => '您确定要删除关于这个会员组织的记录?', + 'LBL_DUPLICATE' => '复制具有潜力的客户', + 'MSG_DUPLICATE' => '创建这个客户可能创建重复的客户。你可以选择客户列表中的客户复制创建新的公司,以继承它相关的数据。', + 'LBL_INVITEE' => '联系人', + 'ERR_DELETE_RECORD' => '删除这个客户必须指定这个客户的记录编号.', + 'LBL_SELECT_ACCOUNT' => '选择客户', + 'LBL_GENERAL_INFORMATION' => '一般信息', + 'LBL_NEW_POTENTIAL' => '新增商机', + 'LBL_POTENTIAL_TITLE' => '商机', + 'LBL_NEW_TASK' => '新增任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => '新增电话', + 'LBL_CALL_TITLE' => '电话', + 'LBL_NEW_MEETING' => '新增会议', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '撰写新邮件', + 'LBL_EMAIL_TITLE' => 'Emails', + 'LBL_NEW_CONTACT' => '新增联系人', + 'LBL_CONTACT_TITLE' => '联系人', + 'LBL_ALL' => '所有', + 'LBL_PROSPECT' => '期望', + 'LBL_INVESTOR' => '投资商', + 'LBL_RESELLER' => '代理商', + 'LBL_PARTNER' => '合作伙伴', + 'LBL_TOOL_FORM_TITLE' => '客户工具', + 'Subject' => '主题', + 'Quote Name' => '报价单名称', + 'Vendor Name' => '供应商名称', + 'Requisition No' => '申请编号', + 'Tracking Number' => '查询号', + 'Contact Name' => '联系人姓名', + 'Due Date' => '到期日期', + 'Carrier' => '运输公司', + 'Type' => '类型', + 'Sales Tax' => '销售税', + 'Sales Commission' => '销售佣金', + 'Excise Duty' => '货物税', + 'Total' => '总计', + 'Product Name' => '产品名称', + 'Assigned To' => '负责人', + 'Billing Address' => '付款地址', + 'Shipping Address' => '收货地址', + 'Billing City' => '城市', + 'Billing State' => '省份', + 'Billing Code' => '邮编', + 'Billing Country' => '国家', + 'Shipping City' => '城市', + 'Shipping State' => '省份', + 'Shipping Code' => '邮编', + 'Shipping Country' => '国家', + 'City' => '城市', + 'State' => '省份', + 'Code' => '邮编', + 'Country' => '国家', + 'Created Time' => '创建时间', + 'Modified Time' => '修改时间', + 'Description' => '描述', + 'Potential Name' => '商机名称', + 'Customer No' => '客户编号', + 'Purchase Order' => '采购订单', + 'Vendor Terms' => '商家期约', + 'Pending' => '等待', + 'Account Name' => '客户姓名', + 'Terms & Conditions' => '付款条件', + 'LBL_PO_INFORMATION' => '采购订单信息', + 'LBL_PO' => '采购订单', + 'LBL_SO_INFORMATION' => '销售订单信息', + 'LBL_SO' => '销售订单:', + 'LBL_SO_FORM_TITLE' => '销售', + 'LBL_PO_FORM_TITLE' => '采购', + 'LBL_SUBJECT_TITLE' => '主题', + 'LBL_VENDOR_NAME_TITLE' => '供应商名称', + 'LBL_TRACKING_NO_TITLE' => '查询号:', + 'LBL_PO_SEARCH_TITLE' => '查找采购订单', + 'LBL_SO_SEARCH_TITLE' => '查找销售订单', + 'LBL_QUOTE_NAME_TITLE' => '报价单名称', + 'Order Id' => '订单编号', + 'LBL_MY_TOP_SO' => '最近销售订单', + 'Status' => '状态', + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PickList/AssignValues.php b/oss/vtiger/trunk/modules/PickList/AssignValues.php new file mode 100644 index 00000000..ed945ac9 --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/AssignValues.php @@ -0,0 +1,53 @@ +assign("IMAGE_PATH",$image_path); + +$fieldName = vtlib_purify($_REQUEST["fieldname"]); +$fieldLabel = vtlib_purify($_REQUEST['fieldlabel']); +$moduleName = vtlib_purify($_REQUEST["moduleName"]); +$roleid = vtlib_purify($_REQUEST['roleid']); +if(!empty($roleid)){ + $roleName = getRoleName($roleid); +} + +if($moduleName == 'Events'){ + $temp_module_strings = return_module_language($current_language, 'Calendar'); +}else{ + $temp_module_strings = return_module_language($current_language, $moduleName); +} + +if(!empty($fieldName)){ + $values = getAllPickListValues($fieldName); +} + +$assignedValues = getAssignedPicklistValues($fieldName, $roleid, $adb); + +$smarty->assign("THEME",$theme); +$smarty->assign("FIELDNAME",$fieldName); +$smarty->assign("FIELDLABEL", getTranslatedString($fieldLabel)); +$smarty->assign("MODULE",$moduleName); +$smarty->assign("PICKVAL",$values); +$smarty->assign("ASSIGNED_VALUES",$assignedValues); +$smarty->assign("ROLEID",$roleid); +$smarty->assign("ROLENAME", $roleName); +$smarty->assign("MOD", return_module_language($current_language,'PickList')); +$smarty->assign("APP",$app_strings); + +$data = $smarty->fetch("modules/PickList/AssignPicklistValues.tpl"); +echo $data; + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PickList/PickList.php b/oss/vtiger/trunk/modules/PickList/PickList.php new file mode 100644 index 00000000..6345043a --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/PickList.php @@ -0,0 +1,78 @@ +assign("MODULE_LISTS",$modules); +$smarty->assign("ROLE_LISTS",getrole2picklist()); +$smarty->assign("ALL_LISTS",$available_module_picklist); + +$smarty->assign("APP", $app_strings); //the include language files +$smarty->assign("MOD", return_module_language($current_language,'Settings')); //the settings module language file +$smarty->assign("MOD_PICKLIST", return_module_language($current_language,'PickList')); //the picklist module language files +$smarty->assign("TEMP_MOD", $temp_module_strings); //the selected modules' language file + +$smarty->assign("MODULE",$fld_module); +$smarty->assign("PICKLIST_VALUES",$picklist_fields); +$smarty->assign("THEME",$theme); +$smarty->assign("UITYPE", $uitype); +$smarty->assign("SEL_ROLEID",$roleid); + +if($_REQUEST['directmode'] != 'ajax'){ + $smarty->display("modules/PickList/PickList.tpl"); +}else{ + $smarty->display("modules/PickList/PickListContents.tpl"); +} + +?> diff --git a/oss/vtiger/trunk/modules/PickList/PickListAction.php b/oss/vtiger/trunk/modules/PickList/PickListAction.php new file mode 100644 index 00000000..06dce632 --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/PickListAction.php @@ -0,0 +1,139 @@ +sql_escape_string($tableName); +$mode = trim($_REQUEST['mode']); +if(empty($mode)){ + echo "action mode is empty"; + exit; +} + +if($mode == 'add'){ + $newValues = $_REQUEST['newValues']; + $selectedRoles = $_REQUEST['selectedRoles']; + + $arr = Zend_Json::decode($newValues); + $roles = Zend_Json::decode($selectedRoles); + $count = count($arr); + + $sql = "select picklistid from vtiger_picklist where name=?"; + $result = $adb->pquery($sql, array($tableName)); + $picklistid = $adb->query_result($result,0,"picklistid"); + + for($i=0; $i<$count;$i++){ + $val = trim($arr[$i]); + if(!empty($val)){ + $id = $adb->getUniqueID("vtiger_$tableName"); + $picklist_valueid = getUniquePicklistID(); + $sql = "insert into vtiger_$tableName values (?,?,?,?)"; + $adb->pquery($sql, array($id, $val, 1, $picklist_valueid)); + + //add the picklist values to the selected roles + for($j=0;$jquery_result($adb->pquery($sql, array($roleid, $picklistid)),0,'sortid'); + + $sql = "insert into vtiger_role2picklist values(?,?,?,?)"; + $adb->pquery($sql, array($roleid, $picklist_valueid, $picklistid, $sortid)); + } + } + } + echo "SUCCESS"; +}elseif($mode == 'edit'){ + $newValues = Zend_Json::decode($_REQUEST['newValues']); + $oldValues = Zend_Json::decode($_REQUEST['oldValues']); + if(count($newValues) != count($oldValues)){ + echo "Some error occured"; + exit; + } + + $qry="select tablename,columnname from vtiger_field where fieldname=? and presence in (0,2)"; + $result = $adb->pquery($qry, array($tableName)); + $num = $adb->num_rows($result); + + for($i=0; $ipquery($sql, array($newVal, $oldVal)); + + //replace the value of this piclist with new one in all records + if($num > 0){ + for($n=0;$n<$num;$n++){ + $table_name = $adb->query_result($result,$n,'tablename'); + $columnName = $adb->query_result($result,$n,'columnname'); + + $sql = "update $table_name set $columnName=? where $columnName=?"; + $adb->pquery($sql, array($newVal, $oldVal)); + } + } + } + } + echo "SUCCESS"; +}elseif($mode == 'delete'){ + $values = Zend_Json::decode($_REQUEST['values']); + $replaceVal = $_REQUEST['replaceVal']; + if(!empty($replaceVal)){ + $sql = "select * from vtiger_$tableName where $tableName=?"; + $result = $adb->pquery($sql, array($replaceVal)); + $replacePicklistID = $adb->query_result($result, 0, "picklist_valueid"); + } + + for($i=0;$ipquery($sql, array($values[$i])); + $origPicklistID = $adb->query_result($result, 0, "picklist_valueid"); + + //give permissions for the new picklist + if(!empty($replaceVal)){ + $sql = "select * from vtiger_role2picklist where picklistvalueid=?"; + $result = $adb->pquery($sql, array($replacePicklistID)); + $count = $adb->num_rows($result); + + if($count == 0){ + $sql = "update vtiger_role2picklist set picklistvalueid=? where picklistvalueid=?"; + $adb->pquery($sql, array($replacePicklistID, $origPicklistID)); + } + } + + $sql = "delete from vtiger_$tableName where $tableName=?"; + $adb->pquery($sql, array($values[$i])); + $sql = "delete from vtiger_role2picklist where picklistvalueid=?"; + $adb->pquery($sql, array($origPicklistID)); + + //replace the value of this piclist with new one in all records + $qry="select tablename,columnname from vtiger_field where fieldname=? and presence in (0,2)"; + $result = $adb->pquery($qry, array($tableName)); + $num = $adb->num_rows($result); + if($num > 0){ + for($n=0;$n<$num;$n++){ + $table_name = $adb->query_result($result,$n,'tablename'); + $columnName = $adb->query_result($result,$n,'columnname'); + + $sql = "update $table_name set $columnName=? where $columnName=?"; + $adb->pquery($sql, array($replaceVal, $values[$i])); + } + } + } + echo "SUCCESS"; +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PickList/PickListAjax.php b/oss/vtiger/trunk/modules/PickList/PickListAjax.php new file mode 100644 index 00000000..0903b4dd --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/PickListAjax.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/PickList/PickListUtils.php b/oss/vtiger/trunk/modules/PickList/PickListUtils.php new file mode 100644 index 00000000..c2669748 --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/PickListUtils.php @@ -0,0 +1,211 @@ +$fieldlabel,'generatedtype'=>$generatedtype,'columnname'=>$columnname,'fieldname'=>$fieldname,'value'=>picklistvalues)) + */ +function getUserFldArray($fld_module,$roleid){ + global $adb, $log; + $user_fld = Array(); + $tabid = getTabid($fld_module); + + $query="select vtiger_field.fieldlabel,vtiger_field.columnname,vtiger_field.fieldname, vtiger_field.uitype" . + " FROM vtiger_field inner join vtiger_picklist on vtiger_field.fieldname = vtiger_picklist.name" . + " where (displaytype=1 and vtiger_field.tabid=? and vtiger_field.uitype in ('15','55','33','16') " . + " or (vtiger_field.tabid=? and fieldname='salutationtype' and fieldname !='vendortype')) " . + " and vtiger_field.presence in (0,2) ORDER BY vtiger_picklist.picklistid ASC"; + + $result = $adb->pquery($query, array($tabid, $tabid)); + $noofrows = $adb->num_rows($result); + + if($noofrows > 0){ + $fieldlist = array(); + for($i=0; $i<$noofrows; $i++){ + $user_fld = array(); + $fld_name = $adb->query_result($result,$i,"fieldname"); + + $user_fld['fieldlabel'] = $adb->query_result($result,$i,"fieldlabel"); + $user_fld['generatedtype'] = $adb->query_result($result,$i,"generatedtype"); + $user_fld['columnname'] = $adb->query_result($result,$i,"columnname"); + $user_fld['fieldname'] = $adb->query_result($result,$i,"fieldname"); + $user_fld['uitype'] = $adb->query_result($result,$i,"uitype"); + $user_fld['value'] = getAssignedPicklistValues($user_fld['fieldname'], $roleid, $adb); + $fieldlist[] = $user_fld; + } + } + return $fieldlist; +} + +/** + * Function to get modules which has picklist values + * It gets the picklist modules and return in an array in the following format + * $modules = Array($tabid=>$tablabel,$tabid1=>$tablabel1,$tabid2=>$tablabel2,-------------,$tabidn=>$tablabeln) + */ +function getPickListModules(){ + global $adb; + // vtlib customization: Ignore disabled modules. + $query = 'select distinct vtiger_field.fieldname,vtiger_field.tabid,vtiger_tab.tablabel, vtiger_tab.name as tabname,uitype from vtiger_field inner join vtiger_tab on vtiger_tab.tabid=vtiger_field.tabid where uitype IN (15,33) and vtiger_field.tabid != 29 and vtiger_tab.presence != 1 and vtiger_field.presence in (0,2) order by vtiger_field.tabid ASC'; + // END + $result = $adb->pquery($query, array()); + while($row = $adb->fetch_array($result)){ + $modules[$row['tablabel']] = $row['tabname']; + } + return $modules; +} + +/** + * this function returns all the roles present in the CRM so that they can be displayed in the picklist module + * @return array $role - the roles present in the CRM in the array format + */ +function getrole2picklist(){ + global $adb; + $query = "select rolename,roleid from vtiger_role where roleid not in('H1') order by roleid"; + $result = $adb->pquery($query, array()); + while($row = $adb->fetch_array($result)){ + $role[$row['roleid']] = $row['rolename']; + } + return $role; + +} + +/** + * this function returns the picklists available for a module + * @param array $picklist_details - the details about the picklists in the module + * @return array $module_pick - the picklists present in the module in an array format + */ +function get_available_module_picklist($picklist_details){ + $avail_pick_values = $picklist_details; + foreach($avail_pick_values as $key => $val){ + $module_pick[$avail_pick_values[$key]['fieldname']] = getTranslatedString($avail_pick_values[$key]['fieldlabel']); + } + return $module_pick; +} + +/** + * this function returns all the picklist values that are available for a given + * @param string $fieldName - the name of the field + * @return array $arr - the array containing the picklist values + */ +function getAllPickListValues($fieldName){ + global $adb; + $sql = 'SELECT * FROM vtiger_'.$adb->sql_escape_string($fieldName); + $result = $adb->query($sql); + $count = $adb->num_rows($result); + + $arr = array(); + for($i=0;$i<$count;$i++){ + $arr[] = $adb->query_result($result, $i, $fieldName); + } + return $arr; +} + + +/** + * this function accepts the fieldname and the language string array and returns all the editable picklist values for that fieldname + * @param string $fieldName - the name of the picklist + * @param array $lang - the language string array + * @param object $adb - the peardatabase object + * @return array $pick - the editable picklist values + */ +function getEditablePicklistValues($fieldName, $lang, $adb){ + $values = array(); + $fieldName = $adb->sql_escape_string($fieldName); + $sql="select $fieldName from vtiger_$fieldName where presence=1 and $fieldName <> '--None--'"; + $res = $adb->query($sql); + $RowCount = $adb->num_rows($res); + if($RowCount > 0){ + for($i=0;$i<$RowCount;$i++){ + $pick_val = $adb->query_result($res,$i,$fieldName); + if($lang[$pick_val] != ''){ + $values[]=$lang[$pick_val]; + }else{ + $values[]=$pick_val; + } + } + } + return $values; +} + +/** + * this function accepts the fieldname and the language string array and returns all the non-editable picklist values for that fieldname + * @param string $fieldName - the name of the picklist + * @param array $lang - the language string array + * @param object $adb - the peardatabase object + * @return array $pick - the no-editable picklist values + */ +function getNonEditablePicklistValues($fieldName, $lang, $adb){ + $values = array(); + $fieldName = $adb->sql_escape_string($fieldName); + $sql = "select $fieldName from vtiger_$fieldName where presence=0"; + $result = $adb->query($sql); + $count = $adb->num_rows($result); + for($i=0;$i<$count;$i++){ + $non_val = $adb->query_result($result,$i,$fieldName); + if($lang[$non_val] != ''){ + $values[]=$lang[$non_val]; + }else{ + $values[]=$non_val; + } + } + if(count($values)==0){ + $values = ""; + } + return $values; +} + +/** + * this function returns all the assigned picklist values for the given tablename for the given roleid + * @param string $tableName - the picklist tablename + * @param integer $roleid - the roleid of the role for which you want data + * @param object $adb - the peardatabase object + * @return array $val - the assigned picklist values in array format + */ +function getAssignedPicklistValues($tableName, $roleid, $adb){ + $arr = array(); + + $sub = getSubordinateRoleAndUsers($roleid); + $subRoles = array($roleid); + $subRoles = array_merge($subRoles, array_keys($sub)); + + $sql = "select picklistid from vtiger_picklist where name = ?"; + $result = $adb->pquery($sql, array($tableName)); + if($adb->num_rows($result)){ + $picklistid = $adb->query_result($result, 0, "picklistid"); + + + $roleids = array(); + foreach($subRoles as $role){ + $roleids[] = $role; + } + + $sql = "SELECT distinct ".$adb->sql_escape_string($tableName)." FROM ". $adb->sql_escape_string("vtiger_$tableName") + . " inner join vtiger_role2picklist on ".$adb->sql_escape_string("vtiger_$tableName").".picklist_valueid=vtiger_role2picklist.picklistvalueid" + . " and roleid in (".generateQuestionMarks($roleids).") order by sortid"; + $result = $adb->pquery($sql, $roleids); + $count = $adb->num_rows($result); + + if($count) { + while($resultrow = $adb->fetch_array($result)) { + $arr[] = $resultrow[$tableName]; + } + } + } + // END + + return $arr; +} +?> diff --git a/oss/vtiger/trunk/modules/PickList/SaveAssignedValues.php b/oss/vtiger/trunk/modules/PickList/SaveAssignedValues.php new file mode 100644 index 00000000..d8bfc7a8 --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/SaveAssignedValues.php @@ -0,0 +1,71 @@ +pquery($sql, array($tableName)); +if($adb->num_rows($result) > 0){ + $picklistid = $adb->query_result($result, 0, "picklistid"); +} + +if(!empty($roleid)){ + assignValues($picklistid, $roleid, $values, $tableName); +} + +$otherRoles = Zend_Json::decode($otherRoles); +if(!empty($otherRoles)){ + foreach($otherRoles as $role){ + assignValues($picklistid, $role, $values, $tableName); + } +} + +echo "SUCCESS"; + + +function assignValues($picklistid, $roleid, $values, $tableName){ + global $adb; + $count = count($values); + //delete older values + $sql = 'DELETE FROM vtiger_role2picklist WHERE roleid=? AND picklistid=?'; + $adb->pquery($sql, array($roleid,$picklistid)); + + //insert the new values + for($i=0;$i<$count;$i++){ + $pickVal = $values[$i]; + $tableName = $adb->sql_escape_string($tableName); + $sql = "SELECT * FROM vtiger_$tableName WHERE $tableName=?"; + $result = $adb->pquery($sql, array($pickVal)); + if($adb->num_rows($result) > 0){ + $picklistvalueid = $adb->query_result($result, 0, "picklist_valueid"); + $sortid = $i+1; + $sql = 'INSERT INTO vtiger_role2picklist VALUES (?,?,?,?)'; + $adb->pquery($sql, array($roleid, $picklistvalueid, $picklistid, $sortid)); + } + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PickList/ShowActionDivs.php b/oss/vtiger/trunk/modules/PickList/ShowActionDivs.php new file mode 100644 index 00000000..292f149f --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/ShowActionDivs.php @@ -0,0 +1,61 @@ +assign("IMAGE_PATH",$image_path); + +$fieldName=vtlib_purify($_REQUEST["fieldname"]); +$fieldLabel =vtlib_purify($_REQUEST["fieldlabel"]); +$moduleName=vtlib_purify($_REQUEST["moduleName"]); +$mode=$_REQUEST["mode"]; + +if($moduleName == 'Events'){ + $temp_module_strings = return_module_language($current_language, 'Calendar'); +}else{ + $temp_module_strings = return_module_language($current_language, $moduleName); +} + +if(isset($fieldName)){ + $editableValues = getEditablePicklistValues($fieldName, $temp_module_strings, $adb); + $nonEditableValues = getNonEditablePicklistValues($fieldName, $temp_module_strings, $adb); +} +$temp_label = getTranslatedString($fieldLabel); +$roleDetails=getAllRoleDetails(); + +// Remove Organization from the list of roles (which is the first one in the list of roles) +array_shift($roleDetails); + +$smarty->assign("FIELDNAME",$fieldName); +$smarty->assign("FIELDLABEL",$temp_label); +$smarty->assign('NONEDITPICKLIST',$nonEditableValues); +$smarty->assign("MODULE",$moduleName); +$smarty->assign("PICKVAL",$editableValues); +$smarty->assign("ROLEDETAILS",$roleDetails); +$smarty->assign("MOD", return_module_language($current_language,'PickList')); +$smarty->assign("APP",$app_strings); + +if($mode == 'add'){ + $data = $smarty->fetch("modules/PickList/AddPickList.tpl"); +}elseif($mode == 'edit'){ + $data = $smarty->fetch("modules/PickList/EditPickList.tpl"); +}elseif($mode == 'delete'){ + $data = $smarty->fetch("modules/PickList/DeletePickList.tpl"); +} + +echo $data; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PickList/ShowRoleSelect.php b/oss/vtiger/trunk/modules/PickList/ShowRoleSelect.php new file mode 100644 index 00000000..4b9b4cef --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/ShowRoleSelect.php @@ -0,0 +1,34 @@ +getRoleName($roleid))); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("ROLES",$otherRoles); +$smarty->assign("MOD", return_module_language($current_language,'PickList')); +$smarty->assign("APP",$app_strings); + +$str = $smarty->fetch("modules/PickList/ShowRoleSelect.tpl"); +echo $str; +?> diff --git a/oss/vtiger/trunk/modules/PickList/language/en_us.lang.php b/oss/vtiger/trunk/modules/PickList/language/en_us.lang.php new file mode 100644 index 00000000..f5ffec17 --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/language/en_us.lang.php @@ -0,0 +1,34 @@ +'Assign', + 'ADD_PICKLIST_VALUES'=>'Add picklist values', + 'LBL_EXISTING_PICKLIST_VALUES'=>'Existing picklist values', + 'LBL_PICKLIST_ADDINFO'=>'Add new entries here', + 'LBL_SELECT_ROLES'=>'Select roles', + 'LBL_NON_EDITABLE_PICKLIST_ENTRIES'=>'Non-editable values', + 'EDIT_PICKLIST_VALUE'=>'Edit picklist values', + 'LBL_EDIT_HERE'=>'Replace with: ', + 'LBL_SELECT_TO_EDIT'=>'Select a value to edit: ', + 'DELETE_PICKLIST_VALUES'=>'Delete picklist values', + 'LBL_REPLACE_WITH'=>'Replace with: ', + 'ASSIGN_PICKLIST_VALUES'=>'Assign Picklist Values', + 'LBL_PICKLIST_VALUES'=>'Available picklist values', + 'LBL_PICKLIST_VALUES_ASSIGNED_TO'=>'Assigned picklist values for ', + 'LBL_ADD_TO_OTHER_ROLES'=>'Add to other roles', + 'LBL_OK_BUTTON_LABEL'=>'Ok', + 'LBL_SELECT_ROLES'=>'Select roles', + 'LBL_DISPLAYED_VALUES'=>'All accessible values for the role are shown below', +); +?> diff --git a/oss/vtiger/trunk/modules/PickList/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/PickList/language/zh_cn.lang.php new file mode 100644 index 00000000..f5ffec17 --- /dev/null +++ b/oss/vtiger/trunk/modules/PickList/language/zh_cn.lang.php @@ -0,0 +1,34 @@ +'Assign', + 'ADD_PICKLIST_VALUES'=>'Add picklist values', + 'LBL_EXISTING_PICKLIST_VALUES'=>'Existing picklist values', + 'LBL_PICKLIST_ADDINFO'=>'Add new entries here', + 'LBL_SELECT_ROLES'=>'Select roles', + 'LBL_NON_EDITABLE_PICKLIST_ENTRIES'=>'Non-editable values', + 'EDIT_PICKLIST_VALUE'=>'Edit picklist values', + 'LBL_EDIT_HERE'=>'Replace with: ', + 'LBL_SELECT_TO_EDIT'=>'Select a value to edit: ', + 'DELETE_PICKLIST_VALUES'=>'Delete picklist values', + 'LBL_REPLACE_WITH'=>'Replace with: ', + 'ASSIGN_PICKLIST_VALUES'=>'Assign Picklist Values', + 'LBL_PICKLIST_VALUES'=>'Available picklist values', + 'LBL_PICKLIST_VALUES_ASSIGNED_TO'=>'Assigned picklist values for ', + 'LBL_ADD_TO_OTHER_ROLES'=>'Add to other roles', + 'LBL_OK_BUTTON_LABEL'=>'Ok', + 'LBL_SELECT_ROLES'=>'Select roles', + 'LBL_DISPLAYED_VALUES'=>'All accessible values for the role are shown below', +); +?> diff --git a/oss/vtiger/trunk/modules/Portal/Delete.php b/oss/vtiger/trunk/modules/Portal/Delete.php new file mode 100644 index 00000000..f426e90e --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/Delete.php @@ -0,0 +1,22 @@ +pquery($del_query, array($_REQUEST['record'])); + + //code added for returning back to the current view after delete from list view +header("Location: index.php?action=PortalAjax&module=Portal&file=ListView&mode=ajax&datamode=manage"); +?> diff --git a/oss/vtiger/trunk/modules/Portal/ListView.php b/oss/vtiger/trunk/modules/Portal/ListView.php new file mode 100644 index 00000000..15f17bf9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/ListView.php @@ -0,0 +1,78 @@ +pquery($query, array()); +//Getting the Default URL Value if any +$default_url = $adb->query_result($result,0,'portalurl'); +$no_of_portals=$adb->num_rows($result); +$portal_info=array(); +//added as an enhancement to set default +?> + +query_result($result,0,'portalurl'); +$smarty = new vtigerCRM_Smarty; +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("DEFAULT_URL", $def_ault); +$smarty->assign("APP", $app_strings); +$smarty->assign("PORTAL_COUNT", count($portal_info)); +$smarty->assign("PORTALS", $portal_info); +$smarty->assign("MODULE", $currentModule); +$smarty->assign("DEFAULT",'yes'); +$smarty->assign("CATEGORY", getParentTab()); +if($_REQUEST['datamode'] == 'data') + $smarty->display("MySitesContents.tpl"); +elseif($_REQUEST['datamode'] == 'manage') + $smarty->display("MySitesManage.tpl"); +else + $smarty->display("MySites.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Portal/Popup.php b/oss/vtiger/trunk/modules/Portal/Popup.php new file mode 100644 index 00000000..969cdabb --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/Popup.php @@ -0,0 +1,67 @@ +pquery($query, array($portalid)); + $portalname = $adb->query_result($result,0,'portalname'); + $portalurl = $adb->query_result($result,0,'portalurl'); + /* to remove http:// from portal url*/ + $portalurl = preg_replace("/http:\/\//i","",$portalurl); +} +$portal_inputs=''; +$portal_inputs.='

    '; + +echo $portal_inputs; + + +?> diff --git a/oss/vtiger/trunk/modules/Portal/Portal.js b/oss/vtiger/trunk/modules/Portal/Portal.js new file mode 100644 index 00000000..129b2c00 --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/Portal.js @@ -0,0 +1,146 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. +* + ********************************************************************************/ + + +function fetchAddSite(id) +{ + $("status").style.display="inline"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'module=Portal&action=PortalAjax&file=Popup&record='+id, + onComplete: function(response) { + $("status").style.display="none"; + $('editportal_cont').innerHTML = response.responseText; + } + } + ); +} + +function fetchContents(mode) +{ + // Reloading the window is better, If not reloaded ... mysitesArray variable needs to be updated + // using eval method on javascript. + if(mode == 'data') { + window.location.href = 'index.php?module=Portal&action=ListView&parenttab=Tools'; + return; + } + $("status").style.display="inline"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'action=PortalAjax&mode=ajax&module=Portal&file=ListView&datamode='+mode, + onComplete: function(response) { + $("status").style.display="none"; + $('portalcont').innerHTML = response.responseText; + } + } + ); +} +function DeleteSite(id) +{ + if(confirm(alert_arr.SURE_TO_DELETE)) + { + $("status").style.display="inline"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'action=PortalAjax&mode=ajax&file=Delete&module=Portal&record='+id, + onComplete: function(response) { + $("status").style.display="none"; + $('portalcont').innerHTML = response.responseText; + } + } + ); + } +} +function SaveSite(id) +{ + if ($('portalurl').value.replace(/^\s+/g, '').replace(/\s+$/g, '').length==0) { + alert(alert_arr.SITEURL_CANNOT_BE_EMPTY) + return false; + } + if ($('portalname').value.replace(/^\s+/g, '').replace(/\s+$/g, '').length==0) { + alert(alert_arr.SITENAME_CANNOT_BE_EMPTY) + return false; + } + Effect.Puff('orgLay'); + $("status").style.display="inline"; + var portalurl = document.getElementById('portalurl').value; + var portalurl = portalurl.replace(/&/g, "#$#$#"); + var portalname = document.getElementById('portalname').value; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'action=PortalAjax&mode=ajax&file=Save&module=Portal&portalname='+portalname+'&portalurl='+portalurl+'&record='+id, + onComplete: function(response) { + if(response.responseText.indexOf(":#:FAILURE") > -1) + { + alert(alert_arr.VALID_DATA) + }else + { + $('portalcont').innerHTML = response.responseText; + } + $("status").style.display="none"; + } + } + ); +} +function setSite(oUrllist) +{ + //var url = oUrllist.options[oUrllist.options.selectedIndex].value; + var id = oUrllist.options[oUrllist.options.selectedIndex].value; + document.getElementById('locatesite').src = mysitesArray[id]; +} +//added as an enhancement to set default value +function defaultMysites(oSelectlist) +{ + var id = $("urllist").value; + $("status").style.display="block"; + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody:'action=PortalAjax&mode=ajax&file=Save&module=Portal&check=true&passing_var='+id, + onComplete: function(response) { + //alert(response.responseText); + $("status").style.display="none"; + } + } + ); + +} + +var oRegex = new Object() ; +oRegex.UriProtocol = new RegExp('') ; +oRegex.UriProtocol.compile( '^(((http|https|ftp|news):\/\/)|mailto:)', 'gi' ) ; + +oRegex.UrlOnChangeProtocol = new RegExp('') ; +oRegex.UrlOnChangeProtocol.compile( '^(http|https|ftp|news)://(?=.)', 'gi' ) ; + +function OnUrlChange() +{ + var sUrl; + var sProtocol; + + sUrl=document.getElementById("portalurl").value ; + sProtocol=oRegex.UrlOnChangeProtocol.exec( sUrl ) ; + if ( sProtocol ) + { + sUrl = sUrl.substr( sProtocol[0].length ) ; + document.getElementById("portalurl").value = sUrl ; + } + + +} diff --git a/oss/vtiger/trunk/modules/Portal/Portal.php b/oss/vtiger/trunk/modules/Portal/Portal.php new file mode 100644 index 00000000..de7e3a38 --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/Portal.php @@ -0,0 +1,47 @@ +println("just entered the SavePortal method"); + $portalid=$adb->getUniqueID('vtiger_portal'); + $query="insert into vtiger_portal values(?,?,?,?,?)"; + $params=array($portalid,$portalname,$portalurl,0,0); + $adb->println($query); + $result=$adb->pquery($query,$params); + return $portalid; +} +/** Function to update the portal in database + * @param $portalname : Type String + * @param $portalurl : Type String + * @param $portalid : Type Integer + * This function updates the portal with the given $portalname,$portalurl + * This Returns $portalid + */ +function UpdatePortal($portalname,$portalurl,$portalid) +{ + global $adb; + $adb->println("just entered the SavePortal method"); + $query="update vtiger_portal set portalname=? ,portalurl=? where portalid=?"; + $params=array($portalname, $portalurl, $portalid); + $adb->println($query); + $result=$adb->pquery($query, $params); + return $portalid; +} +?> diff --git a/oss/vtiger/trunk/modules/Portal/PortalAjax.php b/oss/vtiger/trunk/modules/Portal/PortalAjax.php new file mode 100644 index 00000000..b1b7fcdc --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/PortalAjax.php @@ -0,0 +1,13 @@ + + diff --git a/oss/vtiger/trunk/modules/Portal/Save.php b/oss/vtiger/trunk/modules/Portal/Save.php new file mode 100644 index 00000000..032f027e --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/Save.php @@ -0,0 +1,44 @@ +pquery($updateDefalt, array($_REQUEST['passing_var'])); + $updateZero = "UPDATE vtiger_portal SET setdefault=0 WHERE portalid not in(?)"; + $set_default= $adb->pquery($updateZero, array($_REQUEST['passing_var'])); + exit(); +} +if($portlname != '' && $portlurl != '') +{ + if(isset($_REQUEST['record']) && $_REQUEST['record'] !='') + { + $result=UpdatePortal($portlname,"http://".str_replace("#$#$#","&",$portlurl),$_REQUEST['record']); + } + else + { + $result=SavePortal($portlname,"http://".str_replace("#$#$#","&",$portlurl)); + } + header("Location: index.php?action=PortalAjax&module=Portal&file=ListView&mode=ajax&datamode=manage"); +}else +{ + echo ":#:FAILURE"; +} +?> diff --git a/oss/vtiger/trunk/modules/Portal/index.php b/oss/vtiger/trunk/modules/Portal/index.php new file mode 100644 index 00000000..d46fe334 --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/index.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Portal/language/en_us.lang.php b/oss/vtiger/trunk/modules/Portal/language/en_us.lang.php new file mode 100644 index 00000000..6fb714bf --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/language/en_us.lang.php @@ -0,0 +1,34 @@ +"BookMarked URL's", +'LBL_MANAGE_BOOKMARKS'=>'Manage Bookmarks', +'LBL_BOOKMARK_LIST'=>'Bookmark List', +'LBL_MY_BOOKMARKS'=>'My Bookmarks', +'LBL_NEW_BOOKMARK'=>'New Bookmark', +'LBL_BOOKMARK'=>'Bookmark', +'LBL_NAME'=>'Name :', +'LBL_URL'=>'URL :', +'LBL_ADD'=>'Add', +'LBL_SNO'=>'#', +'LBL_BOOKMARK_NAME_URL'=>'Bookmark Name & URL', +'LBL_TOOLS'=>'Tools', +'LBL_MANAGE_SITES'=>'Manage Sites', +'LBL_MY_SITES'=>'Sites', + +// Added/Updated for vtiger CRM 5.0.4 +//added as an enhancement +'LBL_SET_DEFAULT_BUTTON'=>'Set As Default', +); +?> diff --git a/oss/vtiger/trunk/modules/Portal/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Portal/language/zh_cn.lang.php new file mode 100644 index 00000000..b69ee855 --- /dev/null +++ b/oss/vtiger/trunk/modules/Portal/language/zh_cn.lang.php @@ -0,0 +1,32 @@ + '书签网址的', + 'LBL_MANAGE_BOOKMARKS' => '管理书签', + 'LBL_BOOKMARK_LIST' => '书签列表', + 'LBL_MY_BOOKMARKS' => '我的书签', + 'LBL_NEW_BOOKMARK' => '新增书签', + 'LBL_BOOKMARK' => '书签', + 'LBL_NAME' => '名称:', + 'LBL_URL' => '网址:', + 'LBL_ADD' => '新增', + 'LBL_SNO' => '#', + 'LBL_BOOKMARK_NAME_URL' => '书签名称 & 网址', + 'LBL_TOOLS' => '工具', + 'LBL_MANAGE_SITES' => '管理网站', + 'LBL_MY_SITES' => '我的网站', +//added as an enhancement +'LBL_SET_DEFAULT_BUTTON'=>'预设', +); +?> diff --git a/oss/vtiger/trunk/modules/Potentials/CallRelatedList.php b/oss/vtiger/trunk/modules/Potentials/CallRelatedList.php new file mode 100644 index 00000000..741aad54 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/CallRelatedList.php @@ -0,0 +1,75 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['potentialname']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); + } + + global $mod_strings; + global $app_strings; + global $currentModule; + global $theme; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + } + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + if (isset($focus->name)) $smarty->assign("NAME", $focus->name); + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $smarty->assign("CATEGORY",$category); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("ID",$focus->id); + $smarty->assign("MODULE",$currentModule); + $smarty->assign("SINGLE_MOD",$app_strings['Potential']); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + //$smarty->assign("ACCOUNTID",$focus->column_fields['account_id']); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/Charts.php b/oss/vtiger/trunk/modules/Potentials/Charts.php new file mode 100644 index 00000000..67194ede --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/Charts.php @@ -0,0 +1,1241 @@ +debug("Entering outcome_by_month(".$date_start.",". $date_end.",". $user_id.") method ..."); + global $app_strings,$lang_crm, $app_list_strings, $current_module_strings,$current_user, $log, $charset, $tmp_dir; + global $theme; + include_once ('Image/Graph.php'); + include_once ('Image/Canvas.php'); + + $log =& LoggerManager::getLogger('outcome_by_month chart'); + // Set the basic parameters of the graph + $canvas =& Image_Canvas::factory('png', array('width' => $width, 'height' => $height, 'usemap' => true)); + $imagemap = $canvas->getImageMap(); + $graph =& Image_Graph::factory('graph', $canvas); + $log->debug("graph object created"); + + // add a TrueType font + $font =& $graph->addNew('font', calculate_font_name($lang_crm)); + // set the font size to 11 pixels + $font->setSize(8); + + $graph->setFont($font); + // create the plotarea layout + $title =& Image_Graph::factory('title', array('Title',10)); + $plotarea =& Image_Graph::factory('plotarea',array( + 'axis', + 'axis' + )); + $footer =& Image_Graph::factory('title', array('Footer',8)); + $graph->add( + Image_Graph::vertical($title, + Image_Graph::vertical( + $plotarea, + $footer, + 90 + ), + 5 + ) + ); + + //$graph->SetScale("textlin"); + + if (!file_exists($cache_file_name) || !file_exists($cache_file_name.'.map') || $refresh == true) { + //$font = calculate_font_family($lang_crm); + + $log->debug("date_start is: $date_start"); + $log->debug("date_end is: $date_end"); + $log->debug("user_id is: "); + $log->debug($user_id); + $log->debug("cache_file_name is: $cache_file_name"); + + //build the where clause for the query that matches $user + $where = ""; + $first = true; + $current = 0; + + //build the where clause for the query that matches $date_start and $date_end + $where .= " closingdate >= '$date_start' AND closingdate <= '$date_end'"; + $subtitle = $current_module_strings['LBL_DATE_RANGE']." ".getDisplayDate($date_start)." ".$current_module_strings['LBL_DATE_RANGE_TO']." ".getDisplayDate($date_end)."\n"; + + //Now do the db queries + //query for opportunity data that matches $datay and $user + $opp = new Potentials(); + $opp_list = $opp->get_full_list("vtiger_potential.amount DESC, vtiger_potential.closingdate DESC", $where); + + //build pipeline by sales stage data + $total = 0; + $count = array(); + $sum = array(); + $months = array(); + $other = $current_module_strings['LBL_LEAD_SOURCE_OTHER']; + if (isset($opp_list)) { + foreach ($opp_list as $record) { + $month = substr_replace($record->column_fields['closingdate'],'',-3); + if (!in_array($month, $months)) { array_push($months, $month); } + if ($record->column_fields['sales_stage'] == 'Closed Won' || $record->column_fields['sales_stage'] == 'Closed Lost') { + $sales_stage=$record->column_fields['sales_stage']; + } + else { + $sales_stage=$other; + } + + if (!isset($sum[$month][$sales_stage][$record->column_fields['assigned_user_id']])) + { + $sum[$month][$sales_stage][$record->column_fields['assigned_user_id']] = 0; + } + if (isset($record->column_fields['amount']) && in_array($record->column_fields['assigned_user_id'],$user_id)) { + // Strip all non numbers from this string. + $amount = convertFromMasterCurrency(ereg_replace('[^0-9]', '', floor($record->column_fields['amount'])),$current_user->conv_rate); + $sum[$month][$sales_stage][$record->column_fields['assigned_user_id']] = $sum[$month][$sales_stage][$record->column_fields['assigned_user_id']] + $amount; + if (isset($count[$month][$sales_stage][$record->column_fields['assigned_user_id']])) { + + $count[$month][$sales_stage][$record->column_fields['assigned_user_id']]++; + } else { + + $count[$month][$sales_stage][$record->column_fields['assigned_user_id']] = 1; + } + $total = $total + ($amount/1000); + } + } + } + + $legend = array(); + $datax = array(); + $aTargets = array(); + $aAlts = array(); + $stages = array($other, 'Closed Lost', 'Closed Won'); + //sort the months or push a bogus month on the array so that an empty chart is drawn + if (empty($months)) { + array_push($months, date('Y-m',time())); + } + else{ + sort($months); + } + foreach($months as $month) { + foreach($stages as $stage) { + $log->debug("stage is $stage"); + foreach ($user_id as $the_id) { + $the_user = get_assigned_user_name($the_id); + if (!isset($datax[$stage][$the_id])) { + $datax[$stage][$the_id] = array(); + } + if (!isset($aAlts[$stage][$the_id])) { + $aAlts[$stage][$the_id] = array(); + } + if (!isset($aTargets[$stage][$the_id])) { + $aTargets[$stage][$the_id] = array(); + } + + if (isset($sum[$month][$stage][$the_id])) { + array_push($datax[$stage][$the_id], $sum[$month][$stage][$the_id]/1000); + array_push($aAlts[$stage][$the_id], $the_user.' - '.$count[$month][$stage][$the_id]." ".$current_module_strings['LBL_OPPS_OUTCOME']." $stage"); + } + else { + array_push($datax[$stage][$the_id], 0); + array_push($aAlts[$stage][$the_id], ""); + } + $cvid = getCvIdOfAll("Potentials"); + array_push($aTargets[$stage][$the_id], "index.php?module=Potentials&action=ListView&date_closed=$month&sales_stage=".urlencode($stage)."&query=true&type=dbrd&owner=".$the_user."&viewname=".$cvid); + } + } + array_push($legend,$month); + } + $log->debug("datax is:"); + $log->debug($datax); + $log->debug("aAlts is:"); + $log->debug($aAlts); + $log->debug("aTargets is:"); + $log->debug($aTargets); + $log->debug("sum is:"); + $log->debug($sum); + $log->debug("count is:"); + $log->debug($count); + + //now build the bar plots for each user across the sales stages + $index = 0; + $datasets = array(); + $xlabels = array(); + $fills =& Image_Graph::factory('Image_Graph_Fill_Array'); + $color = array('Closed Lost'=>'#FF9900','Closed Won'=>'#009933', $other=>'#0066CC'); + foreach($stages as $stage) { + $datasets[$index] = & Image_Graph::factory('dataset'); + foreach($datax[$stage] as $ownerid=>$owner_amt) { + foreach($owner_amt as $i=>$y) { + $x = 1+2*$i; + $datasets[$index]->addPoint( + $x, + $y, + array( + 'url' => $aTargets[$stage][$ownerid][$i], + 'alt' => $aAlts[$stage][$ownerid][$i] + ) + ); + } + } + // Set fill colors for bars + $fills->addColor($color[$stage]); + $index++; + } + + for($i=0;$i$m) { + $monthSum = 0; + foreach($user_id as $the_id) { + foreach($stages as $stage) $monthSum += $datax[$stage][$the_id][$num]; + } + if($monthSum > $maximum) $maximum = $monthSum; + $log->debug('maximum = '.$maximum.' month = '.$m.' sum = '.$monthSum); + } + + if($theme == "blue") + { + $font_color = "#212473"; + } + else + { + $font_color = "#000000"; + } + $font->setColor($font_color); + + // Create the grouped bar plot + $gbplot = & $plotarea->addNew('bar', array($datasets, 'stacked')); + $gbplot->setFillStyle($fills); + + //You can change the width of the bars if you like + $gbplot->setBarWidth(50/count($months),"%"); + + // set margin + $plotarea->setPadding(array('top'=>0,'bottom'=>0,'left'=>10,'right'=>30)); + + // Set white margin color + $graph->setBackgroundColor('#F5F5F5'); + + // Use a box around the plot area + $gbplot->setBorderColor('black'); + + // Use a gradient to fill the plot area + $gbplot->setBackground(Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_VERTICAL, 'white', '#E5E5E5'))); + + // Setup title + $titlestr = $current_module_strings['LBL_TOTAL_PIPELINE'].$current_user->currency_symbol.$total.$app_strings['LBL_THOUSANDS_SYMBOL']; + //$titlestr = $current_module_strings['LBL_TOTAL_PIPELINE'].$current_user->currency_symbol.$total; + + $title->setText($titlestr); + + // Create the xaxis labels + $array_data =& Image_Graph::factory('Image_Graph_DataPreprocessor_Array', + array($xlabels) + ); + + // Setup X-axis + $xaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_X); + $xaxis->setDataPreprocessor($array_data); + $xaxis->forceMinimum(0); + $xaxis->forceMaximum(2*count($months)); + $xaxis->setLabelInterval(1); + $xaxis->setTickOptions(0,0); + $xaxis->setLabelInterval(2,2); + $xaxis->setTickOptions(5,0,2); + + // set grid + $gridY =& $plotarea->addNew('line_grid', IMAGE_GRAPH_AXIS_Y); + $gridY->setLineColor('#E5E5E5@0.5'); + + + // Add some grace to y-axis so the bars doesn't go + // all the way to the end of the plot area + $yaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); + $yaxis->forceMaximum($maximum * 1.1); + $ticks = get_tickspacing($maximum); + + // Setup the Y-axis to be displayed in the bottom of the + // graph. We also finetune the exact layout of the title, + // ticks and labels to make them look nice. + $yaxis->setAxisIntersection('max'); + + // Then fix the tick marks + $valueproc =& Image_Graph::factory('Image_Graph_DataPreprocessor_Formatted', $current_user->currency_symbol."%d"); + $yaxis->setFontSize(8); + $yaxis->setDataPreprocessor($valueproc); + // Arrange Y-Axis tick marks inside + $yaxis->setLabelInterval($ticks[0]); + $yaxis->setTickOptions(-5,0); + $yaxis->setLabelInterval($ticks[1],2); + $yaxis->setTickOptions(-2,0,2); + $yaxis->setLabelOption('position','inside'); + + // Finally setup the title + $yaxis->setLabelOption('position','inside'); + + // eliminate zero values + $gbplot->setDataSelector(Image_Graph::factory('Image_Graph_DataSelector_NoZeros')); + + // set markers + $marker =& $graph->addNew('value_marker', IMAGE_GRAPH_VALUE_Y); + $marker->setDataPreprocessor($valueproc); + $marker->setFillColor('000000@0.0'); + $marker->setBorderColor('000000@0.0'); + $marker->setFontColor('white'); + $marker->setFontSize(8); + $gbplot->setMarker($marker); + + $subtitle .= $current_module_strings['LBL_OPP_SIZE'].$current_user->currency_symbol.$current_module_strings['LBL_OPP_SIZE_VALUE']; + $footer->setText($subtitle); + $footer->setAlignment(IMAGE_GRAPH_ALIGN_TOP_RIGHT); + + // .. and stroke the graph + $imgMap = $graph->done( + array( + 'tohtml' => true, + 'border' => 0, + 'filename' => $cache_file_name, + 'filepath' => './', + 'urlpath' => '' + )); + //$imgMap = htmlspecialchars($output); + save_image_map($cache_file_name.'.map', $imgMap); + } + else { + $imgMap_fp = fopen($cache_file_name.'.map', "rb"); + $imgMap = fread($imgMap_fp, filesize($cache_file_name.'.map')); + fclose($imgMap_fp); + } + $fileModTime = filemtime($cache_file_name.'.map'); + $return = "\n$imgMap"; + $log->debug("Exiting outcome_by_month method ..."); + return $return; + } + + /** + * Creates lead_source_by_outcome pipeline image as a horizontal accumlated bar graph for multiple vtiger_users. + * param $datay- the lead source data to display in the x-axis + * param $date_start- the begin date of opps to find + * param $date_end- the end date of opps to find + * param $ids - list of assigned vtiger_users of opps to find + * param $cache_file_name - file name to write image to + * param $refresh - boolean whether to rebuild image if exists + * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.. + * All Rights Reserved.. + * Contributor(s): ______________________________________.. + */ + function lead_source_by_outcome($datay=array('foo','bar'), $user_id=array('1'), $cache_file_name='a_file', $refresh=false,$width=900,$height=500){ + global $log,$current_user; + $log->debug("Entering lead_source_by_outcome(".$datay.",".$user_id.",".$cache_file_name.",".$refresh.") method ..."); + global $app_strings,$lang_crm, $current_module_strings,$charset, $tmp_dir; + global $theme; + + include_once ('Image/Graph.php'); + include_once ('Image/Canvas.php'); + + $log =& LoggerManager::getLogger('lead_source_by_outcome chart'); + // Set the basic parameters of the graph + $canvas =& Image_Canvas::factory('png', array('width' => $width, 'height' => $height, 'usemap' => true)); + $imagemap = $canvas->getImageMap(); + $graph =& Image_Graph::factory('graph', $canvas); + $log->debug("graph object created"); + // add a TrueType font + $font =& $graph->addNew('font', calculate_font_name($lang_crm)); + // set the font size to 11 pixels + $font->setSize(8); + + $graph->setFont($font); + // create the plotarea layout + $title =& Image_Graph::factory('title', array('Test',10)); + $plotarea =& Image_Graph::factory('plotarea',array( + 'axis', + 'axis', + 'horizontal' + )); + $footer =& Image_Graph::factory('title', array('Footer',8)); + $graph->add( + Image_Graph::vertical($title, + Image_Graph::vertical( + $plotarea, + $footer, + 90 + ), + 5 + ) + ); + + if (!file_exists($cache_file_name) || !file_exists($cache_file_name.'.map') || $refresh == true) { + + $log->debug("datay is:"); + $log->debug($datay); + $log->debug("user_id is: "); + $log->debug($user_id); + $log->debug("cache_file_name is: $cache_file_name"); + + $where=""; + //build the where clause for the query that matches $datay + $count = count($datay); + if ($count>0) { + $where .= " leadsource in ( "; + $ls_i = 0; + foreach ($datay as $key=>$value) { + if($ls_i != 0) $where .= ", "; + $where .= "'".addslashes($key)."'"; + $ls_i++; + } + $where .= ")"; + } + + //Now do the db queries + //query for opportunity data that matches $datay and $user + $opp = new Potentials(); + $opp_list = $opp->get_full_list("vtiger_potential.amount DESC, vtiger_potential.closingdate DESC", $where); + + //build pipeline by sales stage data + $total = 0; + $count = array(); + $sum = array(); + $other = $current_module_strings['LBL_LEAD_SOURCE_OTHER']; + if (isset($opp_list)) { + foreach ($opp_list as $record) { + //if lead source is blank, set it to the language's "none" value + if (isset($record->column_fields['leadsource']) && $record->column_fields['leadsource'] != '') { + $lead_source = $record->column_fields['leadsource']; + } + else { + $lead_source = $current_module_strings['NTC_NO_LEGENDS']; + } + + if ($record->column_fields['sales_stage'] == 'Closed Won' || $record->column_fields['sales_stage'] == 'Closed Lost') { + $sales_stage=$record->column_fields['sales_stage']; + } + else { + $sales_stage=$other; + } + + if (!isset($sum[$lead_source][$sales_stage][$record->column_fields['assigned_user_id']])) { + $sum[$lead_source][$sales_stage][$record->column_fields['assigned_user_id']] = 0; + } + if (isset($record->column_fields['amount']) && in_array($record->column_fields['assigned_user_id'],$user_id)) { + // Strip all non numbers from this string. + $amount = convertFromMasterCurrency(ereg_replace('[^0-9]', '', floor($record->column_fields['amount'])),$current_user->conv_rate); + $sum[$lead_source][$sales_stage][$record->column_fields['assigned_user_id']] = $sum[$lead_source][$sales_stage][$record->column_fields['assigned_user_id']] + $amount; + if (isset($count[$lead_source][$sales_stage][$record->column_fields['assigned_user_id']])) { + $count[$lead_source][$sales_stage][$record->column_fields['assigned_user_id']]++; + } + else { + $count[$lead_source][$sales_stage][$record->column_fields['assigned_user_id']] = 1; + } + $total = $total + ($amount/1000); + } + } + } + $legend = array(); + $datax = array(); + $aTargets = array(); + $aAlts = array(); + $stages = array($other,'Closed Lost', 'Closed Won'); + foreach($datay as $lead=>$translation) { + if ($lead == '') { + $lead = $current_module_strings['NTC_NO_LEGENDS']; + $translation = $current_module_strings['NTC_NO_LEGENDS']; + } + foreach($stages as $stage) { + foreach ($user_id as $the_id) { + $the_user = get_assigned_user_name($the_id); + $log->debug("stage_key is $stage"); + if (!isset($datax[$stage][$the_id])) { + $datax[$stage][$the_id] = array(); + } + if (!isset($aAlts[$stage][$the_id])) { + $aAlts[$stage][$the_id] = array(); + } + if (!isset($aTargets[$stage][$the_id])) { + $aTargets[$stage][$the_id] = array(); + } + + if (isset($sum[$lead][$stage][$the_id])) { + array_push($datax[$stage][$the_id], $sum[$lead][$stage][$the_id]/1000); + array_push($aAlts[$stage][$the_id], $the_user.' - '.$count[$lead][$stage][$the_id]." ".$current_module_strings['LBL_OPPS_OUTCOME']." $stage"); + } + else { + array_push($datax[$stage][$the_id], 0); + array_push($aAlts[$stage][$the_id], ""); + } + $cvid = getCvIdOfAll("Potentials"); + array_push($aTargets[$stage][$the_id], "index.php?module=Potentials&action=ListView&leadsource=".urlencode($lead)."&sales_stage=".urlencode($stage)."&query=true&type=dbrd&owner=".$the_user."&viewname=".$cvid); + } + } + array_push($legend,$translation); + } + + $log->debug("datax is:"); + $log->debug($datax); + $log->debug("aAlts is:"); + $log->debug($aAlts); + $log->debug("aTargets is:"); + $log->debug($aTargets); + $log->debug("sum is:"); + $log->debug($sum); + $log->debug("count is:"); + $log->debug($count); + + //now build the bar plots for each user across the sales stages + $color = array('Closed Lost'=>'FF9900','Closed Won'=>'009933', $other=>'0066CC'); + $index = 0; + $xlabels = array(); + $datasets = array(); + $fills =& Image_Graph::factory('Image_Graph_Fill_Array'); + foreach($stages as $stage) { + // Now create a bar pot + $datasets[$index] = & Image_Graph::factory('dataset'); + foreach($datax[$stage] as $ownerid=>$owner_amt) { + foreach($owner_amt as $i=>$y) { + $x = 1+2*$i; + $datasets[$index]->addPoint( + //$datay[$legend[$x]], + $x, + $y, + array( + 'url' => $aTargets[$stage][$ownerid][$i], + 'alt' => $aAlts[$stage][$ownerid][$i], + 'target' => '' + ) + ); + } + } + // Set fill colors for bars + $fills->addColor("#".$color[$stage]); + $log->debug("datax[$stage] is: "); + $log->debug($datax[$stage]); + $index++; + } + + for($i=0;$i$legend_text) { + $dataxSum = 0; + foreach($user_id as $the_id) { + foreach($stages as $stage) $dataxSum += $datax[$stage][$the_id][$legendidx]; + } + if($dataxSum > $maximum) $maximum = $dataxSum; + } + + if($theme == "blue") + { + $font_color = "#212473"; + } + else + { + $font_color = "#000000"; + } + $font->setColor($font_color); + + // Create the grouped bar plot + $gbplot = & $plotarea->addNew('bar', array($datasets, 'stacked')); + $gbplot->setFillStyle($fills); + + //You can change the width of the bars if you like + $gbplot->setBarWidth(50/count($legend),"%"); + + // Set white margin color + $graph->setBackgroundColor('#F5F5F5'); + + // Use a box around the plot area + $gbplot->setBorderColor('black'); + + // Use a gradient to fill the plot area + $gbplot->setBackground(Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_HORIZONTAL, 'white', '#E5E5E5'))); + + // Setup title + $titlestr = $current_module_strings['LBL_ALL_OPPORTUNITIES'].$current_user->currency_symbol.$total.$app_strings['LBL_THOUSANDS_SYMBOL']; + //$titlestr = $current_module_strings['LBL_ALL_OPPORTUNITIES'].$current_user->currency_symbol.$total; + $title->setText($titlestr); + + // Create the xaxis labels + $array_data =& Image_Graph::factory('Image_Graph_DataPreprocessor_Array', + array($xlabels) + ); + + // Setup X-axis + $xaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_X); + $xaxis->setDataPreprocessor($array_data); + $xaxis->forceMinimum(0); + $xaxis->forceMaximum(2*count($legend)); + $xaxis->setLabelInterval(1); + $xaxis->setTickOptions(0,0); + $xaxis->setLabelInterval(2,2); + $xaxis->setTickOptions(5,0,2); + $xaxis->setInverted(true); + + // set grid + $gridY =& $plotarea->addNew('line_grid', IMAGE_GRAPH_AXIS_Y); + $gridY->setLineColor('#E5E5E5@0.5'); + + // Add some grace to y-axis so the bars doesn't go + // all the way to the end of the plot area + $yaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); + $yaxis->forceMaximum($maximum * 1.1); + $ticks = get_tickspacing($maximum); + + // Then fix the tick marks + $yaxis->setFontSize(8); + $yaxis->setAxisIntersection('max'); + $valueproc =& Image_Graph::factory('Image_Graph_DataPreprocessor_Formatted', $current_user->currency_symbol."%d"); + $yaxis->setDataPreprocessor($valueproc); + $yaxis->setLabelInterval($ticks[0]); + $yaxis->setTickOptions(-5,0); + $yaxis->setLabelInterval($ticks[1],2); + $yaxis->setTickOptions(-2,0,2); + + // eliminate zero values + $gbplot->setDataSelector(Image_Graph::factory('Image_Graph_DataSelector_NoZeros')); + + // set markers + $marker =& $graph->addNew('value_marker', IMAGE_GRAPH_VALUE_Y); + $marker->setDataPreprocessor($valueproc); + $marker->setFillColor('#000000@0.0'); + $marker->setBorderColor('#000000@0.0'); + $marker->setFontColor('white'); + $marker->setFontSize(8); + $gbplot->setMarker($marker); + + // Finally setup the title + $subtitle = $current_module_strings['LBL_OPP_SIZE'].$current_user->currency_symbol.$current_module_strings['LBL_OPP_SIZE_VALUE']; + $footer->setText($subtitle); + $footer->setAlignment(IMAGE_GRAPH_ALIGN_TOP_RIGHT); + + // .. and stroke the graph + $imgMap = $graph->done( + array( + 'tohtml' => true, + 'border' => 0, + 'filename' => $cache_file_name, + 'filepath' => './', + 'urlpath' => '' + )); + //$imgMap = htmlspecialchars($output); + save_image_map($cache_file_name.'.map', $imgMap); + } + else { + $imgMap_fp = fopen($cache_file_name.'.map', "rb"); + $imgMap = fread($imgMap_fp, filesize($cache_file_name.'.map')); + fclose($imgMap_fp); + } + $fileModTime = filemtime($cache_file_name.'.map'); + $return = "\n$imgMap"; + $log->debug("Exiting lead_source_by_outcome method ..."); + return $return; + } + + /** + * Creates opportunity pipeline image as a horizontal accumlated bar graph for multiple vtiger_users. + * param $datax- the sales stage data to display in the x-axis + * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.. + * All Rights Reserved.. + * Contributor(s): ______________________________________.. + */ + function pipeline_by_sales_stage($datax=array('foo','bar'), $date_start='2071-10-15', $date_end='2071-10-15', $user_id=array('1'), $cache_file_name='a_file', $refresh=false,$width=900,$height=500){ + global $log,$current_user; + $log->debug("Entering pipeline_by_sales_stage(".$datax.",".$date_start.",".$date_end.",".$user_id.",".$cache_file_name.",".$refresh.") method ..."); + global $app_strings,$lang_crm, $current_module_strings, $charset, $tmp_dir; + global $theme; + include_once ('Image/Graph.php'); + include_once ('Image/Canvas.php'); + + $log =& LoggerManager::getLogger('opportunity charts'); + // Set the basic parameters of the graph + + + $canvas =& Image_Canvas::factory('png', array('width' => $width, 'height' => $height, 'usemap' => true)); + $imagemap = $canvas->getImageMap(); + $graph =& Image_Graph::factory('graph', $canvas); + //$log->debug("graph object created"); + // add a TrueType font + //$font =& $graph->addNew('font', calculate_font_name($lang_crm)); + $font =& $graph->addNew('font', calculate_font_name($lang_crm)); + // set the font size to 11 pixels + $font->setSize(8); + + $graph->setFont($font); + $title =& Image_Graph::factory('title', array('Test',10)); + $plotarea =& Image_Graph::factory('plotarea',array( + 'axis', + 'axis', + 'horizontal' + )); + $footer =& Image_Graph::factory('title', array('Footer',8)); + $graph->add( + Image_Graph::vertical($title, + Image_Graph::vertical( + $plotarea, + $footer, + 90 + ), + 5 + ) + ); + $log->debug("graph object created"); + + + if (!file_exists($cache_file_name) || !file_exists($cache_file_name.'.map') || $refresh == true) { + + $log->debug("starting pipeline chart"); + $log->debug("datax is:"); + $log->debug($datax); + $log->debug("user_id is: "); + $log->debug($user_id); + $log->debug("cache_file_name is: $cache_file_name"); + + $where=""; + //build the where clause for the query that matches $datax + $count = count($datax); + if ($count>0) { + $where .= " sales_stage in ( "; + $ss_i = 0; + foreach ($datax as $key=>$value) { + if($ss_i != 0) $where .= ", "; + $where .= "'".addslashes($key)."'"; + $ss_i++; + } + $where .= ")"; + } + + //build the where clause for the query that matches $date_start and $date_end + $where .= " AND closingdate >= '$date_start' AND closingdate <= '$date_end'"; + $subtitle = $current_module_strings['LBL_DATE_RANGE']." ".getDisplayDate($date_start)." ".$current_module_strings['LBL_DATE_RANGE_TO']." ".getDisplayDate($date_end)."\n"; + + //Now do the db queries + //query for opportunity data that matches $datax and $user + $opp = new Potentials(); + $opp_list = $opp->get_full_list("vtiger_potential.amount DESC, vtiger_potential.closingdate DESC", $where); + + //build pipeline by sales stage data + $total = 0; + $count = array(); + $sum = array(); + if (isset($opp_list)) { + foreach ($opp_list as $record) { + if (!isset($sum[$record->column_fields['sales_stage']][$record->column_fields['assigned_user_id']])) { + $sum[$record->column_fields['sales_stage']][$record->column_fields['assigned_user_id']] = 0; + } + if (isset($record->column_fields['amount']) && in_array($record->column_fields['assigned_user_id'],$user_id)) { + // Strip all non numbers from this string. + $amount = convertFromMasterCurrency(ereg_replace('[^0-9]', '', floor($record->column_fields['amount'])),$current_user->conv_rate); + $sum[$record->column_fields['sales_stage']][$record->column_fields['assigned_user_id']] = $sum[$record->column_fields['sales_stage']][$record->column_fields['assigned_user_id']] + $amount; + if (isset($count[$record->column_fields['sales_stage']][$record->column_fields['assigned_user_id']])) { + $count[$record->column_fields['sales_stage']][$record->column_fields['assigned_user_id']]++; + } + else { + $count[$record->column_fields['sales_stage']][$record->column_fields['assigned_user_id']] = 1; + } + $total = $total + ($amount/1000); + } + } + } + $legend = array(); + $datay = array(); + $aTargets = array(); + $aAlts = array(); + foreach ($datax as $stage_key=>$stage_translation) { + foreach ($user_id as $the_id) { + $the_user = get_assigned_user_name($the_id); + if (!isset($datay[$the_id])) { + $datay[$the_id] = array(); + } + if (!isset($aAlts[$the_id])) { + $aAlts[$the_id] = array(); + } + if (!isset($aTargets[$the_id])) { + $aTargets[$the_id] = array(); + } + + if (isset($sum[$stage_key][$the_id])) { + array_push($datay[$the_id], $sum[$stage_key][$the_id]/1000); + array_push($aAlts[$the_id], $the_user.' - '.$count[$stage_key][$the_id]." ".$current_module_strings['LBL_OPPS_IN_STAGE']." $stage_translation"); + } + else { + array_push($datay[$the_id], 0); + array_push($aAlts[$the_id], ""); + } + $cvid = getCvIdOfAll("Potentials"); + array_push($aTargets[$the_id], "index.php?module=Potentials&action=ListView&sales_stage=".urlencode($stage_key)."&closingdate_start=".urlencode($date_start)."&closingdate_end=".urlencode($date_end)."&query=true&type=dbrd&owner=".$the_user."&viewname=".$cvid); + } + array_push($legend,$stage_translation); + } + + $log->debug("datay is:"); + $log->debug($datay); + $log->debug("aAlts is:"); + $log->debug($aAlts); + $log->debug("aTargets is:"); + $log->debug($aTargets); + $log->debug("sum is:"); + $log->debug($sum); + $log->debug("count is:"); + $log->debug($count); + + //now build the bar plots for each user across the sales stages + $colors = color_generator(count($user_id),'#D50100','#002222'); + $index = 0; + $datasets = array(); + $xlabels = array(); + $fills =& Image_Graph::factory('Image_Graph_Fill_Array'); + foreach($user_id as $the_id) { + // Now create a bar pot + $datasets[$index] = & Image_Graph::factory('dataset'); + foreach($datay[$the_id] as $i => $y) { + $x = 1+2*$i; + $datasets[$index]->addPoint( + $x, + $y, + array( + 'url' => $aTargets[$the_id][$i], + 'alt' => $aAlts[$the_id][$i] + ) + ); + } + + // Set fill colors for bars + $fills->addColor($colors[$index]); + + $index++; + } + for($i=0;$i$legend_text) { + $legendsum = 0; + foreach($user_id as $the_id) $legendsum += $datay[$the_id][$legendidx]; + if($legendsum > $maximum) $maximum = $legendsum; + } + // Create the grouped bar plot + $gbplot = & $plotarea->addNew('bar', array($datasets, 'stacked')); + $gbplot->setFillStyle($fills); + + //You can change the width of the bars if you like + $gbplot->setBarWidth(50/count($legend),"%"); + + + // Set white margin color + $graph->setBackgroundColor('#F5F5F5'); + + // Use a box around the plot area + $gbplot->setBorderColor('black'); + + // Use a gradient to fill the plot area + $gbplot->setBackground(Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_HORIZONTAL, 'white', '#E5E5E5'))); + + if($theme == "blue") + { + $font_color = "#212473"; + } + else + { + $font_color = "#000000"; + } + $font->setColor($font_color); + + // Setup title + $titlestr = $current_module_strings['LBL_TOTAL_PIPELINE'].$current_user->currency_symbol.$total.$app_strings['LBL_THOUSANDS_SYMBOL']; + //$titlestr = $current_module_strings['LBL_TOTAL_PIPELINE'].$current_user->currency_symbol.$total; + $title->setText($titlestr); + + // Create the xaxis labels + $array_data =& Image_Graph::factory('Image_Graph_DataPreprocessor_Array', + array($xlabels) + ); + + + // Setup X-axis + $xaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_X); + $xaxis->setDataPreprocessor($array_data); + $xaxis->forceMinimum(0); + $xaxis->forceMaximum(2*count($legend)); + $xaxis->setLabelInterval(1); + $xaxis->setTickOptions(0,0); + $xaxis->setLabelInterval(2,2); + $xaxis->setTickOptions(5,0,2); + $xaxis->setInverted(true); + + // Setup Y-axis + $yaxis =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); + $yaxis->setFontSize(8); + $yaxis->setAxisIntersection('max'); + + // Add some grace to y-axis so the bars doesn't go + // all the way to the end of the plot area + $yaxis->forceMaximum($maximum * 1.1); + $ticks = get_tickspacing($maximum); + + // set grid + $gridY =& $plotarea->addNew('line_grid', IMAGE_GRAPH_AXIS_Y); + $gridY->setLineColor('#E5E5E5@0.5'); + + // First make the labels look right + $valueproc =& Image_Graph::factory('Image_Graph_DataPreprocessor_Formatted', $current_user->currency_symbol."%d"); + $yaxis->setDataPreprocessor($valueproc); + $yaxis->setLabelInterval($ticks[0]); + $yaxis->setTickOptions(-5,0); + $yaxis->setLabelInterval($ticks[1],2); + $yaxis->setTickOptions(-2,0,2); + + // eliminate zero values + $gbplot->setDataSelector(Image_Graph::factory('Image_Graph_DataSelector_NoZeros')); + + // set markers + $marker =& $graph->addNew('value_marker', IMAGE_GRAPH_VALUE_Y); + $marker->setDataPreprocessor($valueproc); + $marker->setFillColor('000000@0.0'); + $marker->setBorderColor('000000@0.0'); + $marker->setFontColor('white'); + $marker->setFontSize(8); + $gbplot->setMarker($marker); + + // Finally setup the title + + $subtitle .= $current_module_strings['LBL_OPP_SIZE'].$current_user->currency_symbol.$current_module_strings['LBL_OPP_SIZE_VALUE']; + $footer->setText($subtitle); + $footer->setAlignment(IMAGE_GRAPH_ALIGN_TOP_RIGHT); + + // .. and stroke the graph + $imgMap = $graph->done( + array( + 'tohtml' => true, + 'border' => 0, + 'filename' => $cache_file_name, + 'filepath' => './', + 'urlpath' => '' + )); + //$imgMap = $graph->GetHTMLImageMap('pipeline'); + save_image_map($cache_file_name.'.map', $imgMap); + } + else { + $imgMap_fp = fopen($cache_file_name.'.map', "rb"); + $imgMap = fread($imgMap_fp, filesize($cache_file_name.'.map')); + fclose($imgMap_fp); + } + $fileModTime = filemtime($cache_file_name.'.map'); + $return = "\n$imgMap"; + $log->debug("Exiting pipeline_by_sales_stage method ..."); + return $return; + } + + /** + * Creates pie chart image of opportunities by lead_source. + * param $datax- the sales stage data to display in the x-axis + * param $datay- the sum of opportunity amounts for each opportunity in each sales stage + * to display in the y-axis + * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.. + * All Rights Reserved.. + * Contributor(s): ______________________________________.. + */ + function pipeline_by_lead_source($legends=array('foo','bar'), $user_id=array('1'), $cache_file_name='a_file', $refresh=true,$width=900,$height=500){ + global $log,$current_user; + $log->debug("Entering pipeline_by_lead_source(".$legends.") method ..."); + global $app_strings,$lang_crm, $current_module_strings, $log, $charset, $tmp_dir; + global $theme; + + include_once ('Image/Graph.php'); + include_once ('Image/Canvas.php'); + + $font = calculate_font_name($lang_crm); + if (!file_exists($cache_file_name) || !file_exists($cache_file_name.'.map') || $refresh == true) { + $log =& LoggerManager::getLogger('opportunity charts'); + $log->debug("starting pipeline chart"); + $log->debug("legends is:"); + $log->debug($legends); + $log->debug("user_id is: "); + $log->debug($user_id); + $log->debug("cache_file_name is: $cache_file_name"); + + //Now do the db queries + //query for opportunity data that matches $legends and $user + $where=""; + //build the where clause for the query that matches $datax + $count = count($legends); + if ($count>0) { + $where .= " leadsource in ( "; + $ls_i = 0; + foreach ($legends as $key=>$value) { + if($ls_i != 0) $where .= ", "; + $where .= "'".addslashes($key)."'"; + $ls_i++; + } + $where .= ")"; + } + + $opp = new Potentials(); + $opp_list = $opp->get_full_list("vtiger_potential.amount DESC, vtiger_potential.closingdate DESC", $where); + + //build pipeline by lead source data + $total = 0; + $count = array(); + $sum = array(); + if (isset($opp_list)) { + foreach ($opp_list as $record) { + if (!isset($sum[$record->column_fields['leadsource']])) $sum[$record->column_fields['leadsource']] = 0; + if (isset($record->column_fields['amount']) && isset($record->column_fields['leadsource'])) { + // Strip all non numbers from this string. + $amount = convertFromMasterCurrency(ereg_replace('[^0-9]', '', floor($record->column_fields['amount'])),$current_user->conv_rate); + $sum[$record->column_fields['leadsource']] = $sum[$record->column_fields['leadsource']] + ($amount/1000); + if (isset($count[$record->column_fields['leadsource']])) $count[$record->column_fields['leadsource']]++; + else $count[$record->column_fields['leadsource']] = 1; + $total = $total + ($amount/1000); + } + } + } + + $visible_legends = array(); + $data= array(); + $aTargets = array(); + $aAlts = array(); + foreach ($legends as $lead_source_key=>$lead_source_translation) { + if (isset($sum[$lead_source_key])) + { + array_push($data, $sum[$lead_source_key]); + if($lead_source_key != '') + { + array_push($visible_legends, $lead_source_translation); + } + else + { + // put none in if the vtiger_field is blank. + array_push($visible_legends, $current_module_strings['NTC_NO_LEGENDS']); + } + $cvid = getCvIdOfAll("Potentials"); + array_push($aTargets, "index.php?module=Potentials&action=ListView&leadsource=".urlencode($lead_source_key)."&query=true&type=dbrd&viewname=".$cvid); + array_push($aAlts, $count[$lead_source_key]." ".$current_module_strings['LBL_OPPS_IN_LEAD_SOURCE']." $lead_source_translation "); + } + } + + $log->debug("sum is:"); + $log->debug($sum); + $log->debug("count is:"); + $log->debug($count); + $log->debug("total is: $total"); + if ($total == 0) { +$log->debug("Exiting pipeline_by_lead_source method ..."); + return ($current_module_strings['ERR_NO_OPPS']); + } + + if($theme == "blue") + { + $font_color = "#212473"; + } + else + { + $font_color = "#000000"; + } + + + $canvas =& Image_Canvas::factory('png', array('width' => $width, 'height' => $height, 'usemap' => true)); + $imagemap = $canvas->getImageMap(); + $graph =& Image_Graph::factory('graph', $canvas); + + $font =& $graph->addNew('font', calculate_font_name($lang_crm)); + // set the font size to 11 pixels + $font->setSize(8); + $font->setColor($font_color); + + $graph->setFont($font); + // create the plotarea layout + $title =& Image_Graph::factory('title', array('Test',10)); + $plotarea =& Image_Graph::factory('plotarea',array( + 'category', + 'axis' + )); + $footer =& Image_Graph::factory('title', array('Footer',8)); + $graph->add( + Image_Graph::vertical($title, + Image_Graph::vertical( + $plotarea, + $footer, + 90 + ), + 5 + ) + ); + + // Generate colours + $colors = color_generator(count($visible_legends),'#33CCFF','#3322FF'); + $index = 0; + $dataset = & Image_Graph::factory('dataset'); + $fills =& Image_Graph::factory('Image_Graph_Fill_Array'); + foreach($visible_legends as $legend) { + $dataset->addPoint( + $legend, + $data[$index], + array( + 'url' => $aTargets[$index], + 'alt' => $aAlts[$index] + ) + ); + $fills->addColor($colors[$index]); + $log->debug('point ='.$legend.','.$data[$index]); + + $index++; + } + + // create the pie chart and associate the filling colours + $gbplot = & $plotarea->addNew('pie', $dataset); + $plotarea->hideAxis(); + $gbplot->setFillStyle($fills); + + // Setup title + $titlestr = $current_module_strings['LBL_TOTAL_PIPELINE'].$current_user->currency_symbol.$total.$app_strings['LBL_THOUSANDS_SYMBOL']; + //$titlestr = $current_module_strings['LBL_TOTAL_PIPELINE'].$current_user->currency_symbol.$total; + + $title->setText($titlestr); + + // format the data values + $valueproc =& Image_Graph::factory('Image_Graph_DataPreprocessor_Formatted', $current_user->currency_symbol."%d"); + + // set markers + $marker =& $graph->addNew('value_marker', IMAGE_GRAPH_VALUE_Y); + $marker->setDataPreprocessor($valueproc); + $marker->setFillColor('#FFFFFF'); + $marker->setBorderColor($font_color); + $marker->setFontColor($font_color); + $marker->setFontSize(8); + $pointingMarker =& $graph->addNew('Image_Graph_Marker_Pointing_Angular', array(20, &$marker)); + $gbplot->setMarker($pointingMarker); + + // set legend + $legend_box =& $plotarea->addNew('legend'); + $legend_box->setPadding(array('top'=>20,'bottom'=>0,'left'=>0,'right'=>0)); + $legend_box->setFillColor('#F5F5F5'); + $legend_box->showShadow(); + + $subtitle = $current_module_strings['LBL_OPP_SIZE'].$current_user->currency_symbol.$current_module_strings['LBL_OPP_SIZE_VALUE']; + $footer->setText($subtitle); + $footer->setAlignment(IMAGE_GRAPH_ALIGN_TOP_LEFT); + + $imgMap = $graph->done( + array( + 'tohtml' => true, + 'border' => 0, + 'filename' => $cache_file_name, + 'filepath' => './', + 'urlpath' => '' + )); + //$imgMap = htmlspecialchars($output); + save_image_map($cache_file_name.'.map', $imgMap); + } + else { + $imgMap_fp = fopen($cache_file_name.'.map', "rb"); + $imgMap = fread($imgMap_fp, filesize($cache_file_name.'.map')); + fclose($imgMap_fp); + } + $fileModTime = filemtime($cache_file_name.'.map'); + $return = "\n$imgMap"; + $log->debug("Exiting pipeline_by_lead_source method ..."); + return $return; + + } + +} + + +/** + * Creates a file with the image map + * param $filename - file name to save to + * param $image_map - image map string to save + * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc. + * All Rights Reserved. + * Contributor(s): ______________________________________.. + */ +function save_image_map($filename,$image_map) +{ + global $log; + $log->debug("Entering save_image_map(".$filename.",".$image_map.") method ..."); + // save the image map to file + $log =& LoggerManager::getLogger('save_image_file'); + + if (!$handle = fopen($filename, 'w')) { + $log->debug("Cannot open file ($filename)"); + $log->debug("Exiting save_image_map method ..."); + return; + } + + // Write $somecontent to our opened file. + if (fwrite($handle, $image_map) === FALSE) { + $log->debug("Cannot write to file ($filename)"); + $log->debug("Exiting save_image_map method ..."); + return false; + } + + $log->debug("Success, wrote ($image_map) to file ($filename)"); + + fclose($handle); + $log->debug("Exiting save_image_map method ..."); + return true; + +} + +// retrieve the translated strings. +$app_strings = return_application_language($current_language); + +if(isset($app_strings['LBL_CHARSET'])) +{ + $charset = $app_strings['LBL_CHARSET']; +} +else +{ + $charset = $default_charset; +} + + +?> diff --git a/oss/vtiger/trunk/modules/Potentials/CustomView.php b/oss/vtiger/trunk/modules/Potentials/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Potentials/Delete.php b/oss/vtiger/trunk/modules/Potentials/Delete.php new file mode 100644 index 00000000..e9046f54 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/Delete.php @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/DetailView.php b/oss/vtiger/trunk/modules/Potentials/DetailView.php new file mode 100644 index 00000000..29e3d383 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/DetailView.php @@ -0,0 +1,128 @@ +retrieve_entity_info($_REQUEST['record'],"Potentials"); + $focus->id = $_REQUEST['record']; + $focus->name=$focus->column_fields['potentialname']; +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Potential detail view"); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); + +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); +else $smarty->assign("NAME", ""); + +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); + +$smarty->assign("CUSTOMFIELD", $cust_fld); +$smarty->assign("SINGLE_MOD", 'Opportunity'); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + + +if(isPermitted("Potentials","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); +if(isPermitted("Invoice","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("CONVERTINVOICE","permitted"); +if(isPermitted("Potentials","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +$tabid = getTabid("Potentials"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$smarty->assign("CONVERTMODE",'potentoinvoice'); +$smarty->assign("MODULE","Potentials"); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); + +if($singlepane_view == 'true') +{ + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); + +$smarty->assign("SinglePane_View", $singlepane_view); +$smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); +$smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("DetailView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/DetailViewAjax.php b/oss/vtiger/trunk/modules/Potentials/DetailViewAjax.php new file mode 100644 index 00000000..0ab8965d --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/DetailViewAjax.php @@ -0,0 +1,51 @@ +retrieve_entity_info($crmid,"Potentials"); + $modObj->column_fields[$fieldname] = $fieldvalue; + $_REQUEST[$fieldname] = $fieldvalue; + if($fieldname == 'amount')//amount converted to dollar value while saving + { + $modObj->column_fields[$fieldname] = getConvertedPrice($fieldvalue); + } + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("Potentials"); + sendNotificationToOwner('Potentials',&$modObj); + if($modObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/EditView.php b/oss/vtiger/trunk/modules/Potentials/EditView.php new file mode 100644 index 00000000..aaf62107 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/EditView.php @@ -0,0 +1,164 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if(isset($_REQUEST['record']) && $_REQUEST['record'] != ''){ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"Potentials"); + $focus->name=$focus->column_fields['potentialname']; +} + +//adding support for uitype 10 +if(!empty($_REQUEST['contact_id'])){ + $focus->column_fields['related_to'] = $_REQUEST['contact_id']; +}elseif(!empty($_REQUEST['account_id'])){ + $focus->column_fields['related_to'] = $_REQUEST['account_id']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') + $smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +else +{ + $smarty->assign("BASBLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS')); +} +$smarty->assign("OP_MODE",$disp_view); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +//needed when creating a new opportunity with a default vtiger_account value passed in +if (isset($_REQUEST['accountname']) && is_null($focus->accountname)) { + $focus->accountname = $_REQUEST['accountname']; +} +if (isset($_REQUEST['accountid']) && is_null($focus->related_to)) { + $focus->related_to = $_REQUEST['accountid']; +} +if (isset($_REQUEST['contactid']) && is_null($focus->related_to)) { + $focus->related_to = $_REQUEST['contactid']; +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Potential detail view"); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +if (isset($focus->name)) +$smarty->assign("NAME", $focus->name); +else +$smarty->assign("NAME", ""); + +if(isset($cust_fld)) +{ + $smarty->assign("CUSTOMFIELD", $cust_fld); +} +if($focus->mode == 'edit') +{ + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MODE", $focus->mode); +} + + + +// Unimplemented until jscalendar language vtiger_files are fixed +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +if (isset($_REQUEST['return_module'])) +$smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if (isset($_REQUEST['return_action'])) +$smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if (isset($_REQUEST['return_id'])) +$smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset($_REQUEST['return_viewname'])) +$smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path);$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Potential'); + + + $tabid = getTabid("Potentials"); + $validationData = getDBValidationData($focus->tab_name,$tabid); + $data = split_validationdataArray($validationData); + + $smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); + $smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); + $smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +//fix for potential duplicate header +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
    '. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .'
    '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +if($focus->mode == 'edit') +$smarty->display("salesEditView.tpl"); +else +$smarty->display("CreateView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/ExportRecords.php b/oss/vtiger/trunk/modules/Potentials/ExportRecords.php new file mode 100644 index 00000000..dcbf10eb --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/ExportRecords.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Potentials/FindDuplicateRecords.php b/oss/vtiger/trunk/modules/Potentials/FindDuplicateRecords.php new file mode 100644 index 00000000..a1ff9757 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/FindDuplicateRecords.php @@ -0,0 +1,106 @@ +pquery($sql, array($id)); + DeleteEntity($req_module,$return_module,$focus,$id,""); + } + else { + $ids_list[] = $id; + } +} + if(count($ids_list) > 0) { + $ret = getEntityName($req_module,$ids_list); + if(count($ret) > 0) + { + $errormsg = implode(',',$ret); + } + echo "
    "; + echo "
    + + + + + + + + + +
    + $app_strings[LBL_DUP_PERMISSION] $req_module $errormsg
    + $app_strings[LBL_GO_BACK]
    +
    +
    "; + echo "
    "; + exit; + } +} + +include("include/saveMergeCriteria.php"); +$ret_arr=getDuplicateRecordsArr($req_module); + +$fld_values=$ret_arr[0]; +$total_num_group=count($fld_values); +$fld_name=$ret_arr[1]; +$ui_type=$ret_arr[2]; + +$smarty->assign("NAVIGATION",$ret_arr["navigation"]);//Added for page navigation +$smarty->assign("MODULE",$req_module); +$smarty->assign("NUM_GROUP",$total_num_group); +$smarty->assign("FIELD_NAMES",$fld_name); +$smarty->assign("CATEGORY",$parenttab); +$smarty->assign("ALL_VALUES",$fld_values); +if(isPermitted($req_module,'Delete','') == 'yes') + $button_del = $app_strings['LBL_MASS_DELETE']; +$smarty->assign("DELETE",$button_del); + +$smarty->assign("MOD", return_module_language($current_language,$req_module)); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MODE",'view'); +if(isset($_REQUEST['button_view'])) +{ + $smarty->assign("VIEW",'true'); +} +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("FindDuplicateAjax.tpl"); +else + $smarty->display('FindDuplicateDisplay.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/Import.php b/oss/vtiger/trunk/modules/Potentials/Import.php new file mode 100644 index 00000000..71867d63 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/Import.php @@ -0,0 +1,45 @@ + + diff --git a/oss/vtiger/trunk/modules/Potentials/ListView.php b/oss/vtiger/trunk/modules/Potentials/ListView.php new file mode 100644 index 00000000..536b6700 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/ListView.php @@ -0,0 +1,261 @@ +initSortbyField('Potentials'); +// END +$smarty = new vtigerCRM_Smarty(); +$other_text = Array(); + +if(!$_SESSION['lvs'][$currentModule]) +{ + unset($_SESSION['lvs']); + $modObj = new ListViewSession(); + $modObj->sorder = $sorder; + $modObj->sortby = $order_by; + $_SESSION['lvs'][$currentModule] = get_object_vars($modObj); +} + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR","The User does not have permission to Change/Delete ".$errormsg." ".$currentModule); +}else +{ + $smarty->assign("ERROR",""); +} +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION['POTENTIALS_ORDER_BY'] = $order_by; +$_SESSION['POTENTIALS_SORT_ORDER'] = $sorder; +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> + +if(isset($_REQUEST['query']) && $_REQUEST['query'] == 'true') +{ + list($where, $ustring) = split("#@@#",getWhereCondition($currentModule)); + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); +} + +//<<<>>>>>> +$oCustomView = new CustomView("Potentials"); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); + +//To check if a user is able to edit/delete a customview +$edit_permit = $oCustomView->isPermittedCustomView($viewid,'EditView',$currentModule); +$delete_permit = $oCustomView->isPermittedCustomView($viewid,'Delete',$currentModule); +$smarty->assign("CV_EDIT_PERMIT",$edit_permit); +$smarty->assign("CV_DELETE_PERMIT",$delete_permit); + +//Added to handle approving or denying status-public by the admin in CustomView +$statusdetails = $oCustomView->isPermittedChangeStatus($viewnamedesc['status']); +$smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + +//<<<<>>>> +$smarty->assign("CHANGE_OWNER",getUserslist()); +$smarty->assign("CHANGE_GROUP_OWNER",getGroupslist()); +if(isPermitted('Potentials','Delete','') == 'yes') +{ + $other_text['del'] = $app_strings[LBL_MASS_DELETE]; +} +if(isPermitted('Potentials','EditView','') == 'yes') +{ + $other_text['mass_edit'] = $app_strings[LBL_MASS_EDIT]; + $other_text['c_owner'] = $app_strings[LBL_CHANGE_OWNER]; +} + +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} + +//Retreive the list from Database +//<<<<<<<<>>>>>>>> +if($viewid != "0") +{ + $listquery = getListQuery("Potentials"); + $list_query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"Potentials"); +}else +{ + $list_query = getListQuery("Potentials"); +} +//<<<<<<<>>>>>>>> +if(isset($where) && $where != '') +{ + if(isset($_REQUEST['from_dashboard']) && $_REQUEST['from_dashboard'] == 'true') + $list_query .= " AND vtiger_potential.sales_stage = '".$mod_strings['Closed Won']."' AND ".$where; + elseif(isset($_REQUEST['from_homepagedb']) && $_REQUEST['from_homepagedb'] == 'true') + $list_query .= " AND vtiger_potential.sales_stage not in( '".$mod_strings['Closed Won']."' , '".$mod_strings['Closed Lost']."' )AND ".$where; + else + $list_query .= " AND ".$where; + + $_SESSION['export_where'] = $where; +} +else + unset($_SESSION['export_where']); + + +if(isset($order_by) && $order_by != '') +{ + if($order_by == 'smownerid') + { + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY user_name'; + $list_query .= ' ORDER BY user_name '.$sorder; + } + else + { + $tablename = getTableNameForField('Potentials',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY '.$tablename.$order_by; + + $list_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; + } +} +if($viewid ==0) +{ + echo "
    "; + echo "
    + + + + + + + + + +
    $app_strings[LBL_PERMISSION]
    + $app_strings[LBL_GO_BACK]
    +
    +
    "; + echo "
    "; + exit; +} +//Constructing the list view + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Opportunity'); +$smarty->assign("BUTTONS",$other_text); +$smarty->assign("CATEGORY",$category); + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +//Retreive the List View Table Header +if($viewid !='') +$url_string .="&viewname=".$viewid; + +$listview_header = getListViewHeader($focus,"Potentials",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_header_search=getSearchListHeaderValues($focus,"Potentials",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER", $listview_header_search); + + +$listview_entries = getListViewEntries($focus,"Potentials",$list_result,$navigation_array,"","","EditView","Delete",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); +$smarty->assign("LISTENTITY", $listview_entries); + +$smarty->assign("AVALABLE_FIELDS", getMergeFields($currentModule,"available_fields")); +$smarty->assign("FIELDS_TO_MERGE", getMergeFields($currentModule,"fileds_to_merge")); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string,"Potentials","index",$viewid); +$alphabetical = AlphabeticalSearch($currentModule,'index','potentialname','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($currentModule); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("SELECT_SCRIPT", $view_script); + +$check_button = Button_Check($currentModule); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display("ListView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/ListViewPagging.php b/oss/vtiger/trunk/modules/Potentials/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/ListViewTop.php b/oss/vtiger/trunk/modules/Potentials/ListViewTop.php new file mode 100644 index 00000000..ab30ab24 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/ListViewTop.php @@ -0,0 +1,98 @@ +$title,'Header'=>$listview_header,'Entries'=>$listview_entries) where as listview_header and listview_entries are arrays of header and entity values which are returned from function getListViewHeader and getListViewEntries +*/ +function getTopPotentials($maxval,$calCnt) +{ + $log = LoggerManager::getLogger('top opportunity_list'); + $log->debug("Entering getTopPotentials() method ..."); + require_once("data/Tracker.php"); + require_once('modules/Potentials/Potentials.php'); + require_once('include/logging.php'); + require_once('include/ListView/ListView.php'); + + global $app_strings; + global $adb; + global $current_language; + global $current_user; + $current_module_strings = return_module_language($current_language, "Potentials"); + + $title=array(); + $title[]='myTopOpenPotentials.gif'; + $title[]=$current_module_strings['LBL_TOP_OPPORTUNITIES']; + $title[]='home_mypot'; + $where = "AND vtiger_potential.sales_stage not in ('Closed Won','Closed Lost','".$current_module_strings['Closed Won']."','".$current_module_strings['Closed Lost']."') AND vtiger_crmentity.smownerid='".$current_user->id."'"; + $header=array(); + $header[]=$current_module_strings['LBL_LIST_OPPORTUNITY_NAME']; + //$header[]=$current_module_strings['LBL_LIST_ACCOUNT_NAME']; + $currencyid=fetchCurrency($current_user->id); + $rate_symbol = getCurrencySymbolandCRate($currencyid); + $rate = $rate_symbol['rate']; + $curr_symbol = $rate_symbol['symbol']; + $header[]=$current_module_strings['LBL_LIST_AMOUNT'].'('.$curr_symbol.')'; + $list_query = getListQuery("Potentials",$where); + $list_query .=" ORDER BY amount DESC"; + + $list_query .=" LIMIT " . $adb->sql_escape_string($maxval); + + if($calCnt == 'calculateCnt') { + $list_result_rows = $adb->query(mkCountQuery($list_query)); + return $adb->query_result($list_result_rows, 0, 'count'); + } + + $list_result = $adb->query($list_query); + + $open_potentials_list = array(); + $noofrows = $adb->num_rows($list_result); + + $entries=array(); + if ($noofrows) { + for($i=0;$i<$noofrows;$i++) + { + $open_potentials_list[] = Array('name' => $adb->query_result($list_result,$i,'potentialname'), + 'id' => $adb->query_result($list_result,$i,'potentialid'), + 'amount' => $adb->query_result($list_result,$i,'amount'), + ); + $potentialid=$adb->query_result($list_result,$i,'potentialid'); + $potentialname = $adb->query_result($list_result,$i,'potentialname'); + $Top_Potential = (strlen($potentialname) > 20) ? (substr($potentialname,0,20).'...') : $potentialname; + $value=array(); + $value[]=''.$Top_Potential.''; + + $value[]=convertFromDollar($adb->query_result($list_result,$i,'amount'),$rate); + $entries[$potentialid]=$value; + } + } + + $search_qry = "&query=true&Fields0=vtiger_crmentity.smownerid&Condition0=is&Srch_value0=".$current_user->column_fields['user_name']."&Fields1=vtiger_potential.sales_stage&Condition1=dcts&Srch_value1=closed&searchtype=advance&search_cnt=2&matchtype=all"; + + $values=Array('ModuleName'=>'Potentials','Title'=>$title,'Header'=>$header,'Entries'=>$entries,'search_qry'=>$search_qry); + + if ( ($display_empty_home_blocks && count($open_potentials_list) == 0 ) || (count($open_potentials_list)>0) ) + { + $log->debug("Exiting getTopPotentials method ..."); + return $values; + } +} +?> diff --git a/oss/vtiger/trunk/modules/Potentials/MassEdit.php b/oss/vtiger/trunk/modules/Potentials/MassEdit.php new file mode 100644 index 00000000..348dab37 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/MassEdit.php @@ -0,0 +1,45 @@ +mode = ''; +$mode = 'mass_edit'; +$disp_view = getView($focus->mode); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("IDS",$_REQUEST['idstring']); +$smarty->assign("MASS_EDIT","1"); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("APP",$app_strings); +$smarty->assign("CATEGORY",getParentTab()); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/MassEditSave.php b/oss/vtiger/trunk/modules/Potentials/MassEditSave.php new file mode 100644 index 00000000..0e1f2a6f --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/MassEditSave.php @@ -0,0 +1,67 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if($fieldname == 'assigned_user_id'){ + if($_REQUEST['assigntype'] == 'U') { + $value = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $value = $_REQUEST['assigned_group_id']; + } + } else { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + } + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/Popup.php b/oss/vtiger/trunk/modules/Potentials/Popup.php new file mode 100644 index 00000000..491b56b5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/Popup.php @@ -0,0 +1,17 @@ + diff --git a/oss/vtiger/trunk/modules/Potentials/Potentials.js b/oss/vtiger/trunk/modules/Potentials/Potentials.js new file mode 100644 index 00000000..9f2bd778 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/Potentials.js @@ -0,0 +1,89 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + + +document.write(" +assign("EDIT_DUPLICATE",""); + if($record_count == 2) { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + else { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[2]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[2]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + + $all_values_array=getRecordValues($exploded_id,$module); + $all_values=$all_values_array[0]; + $js_arr_val=$all_values_array[1]; + $fld_array=$all_values_array[2]; + $js_arr=implode(",",$js_arr_val); + + $imported_records = Array(); + $sql="select bean_id from vtiger_users_last_import where bean_type=? and deleted=0"; + $result = $adb->pquery($sql, array($module)); + $num_rows=$adb->num_rows($result); + $count=0; + for($i=0; $i<$num_rows;$i++) + { + foreach($exploded_id as $value) + if($value == $adb->query_result($result,$i,"bean_id")) + $count++; + array_push($imported_records,$adb->query_result($result,$i,"bean_id")); + } + + if ($record_count == $count) + $no_existing=1; + else + $no_existing=0; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("RECORD_COUNT",$record_count); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULENAME", $module); + $smarty->assign("PARENT_TAB", $parent_tab); + $smarty->assign("JS_ARRAY", $js_arr); + $smarty->assign("ID_ARRAY", $exploded_id); + $smarty->assign("IDSTRING",$idstring); + $smarty->assign("ALLVALUES", $all_values); + $smarty->assign("FIELD_ARRAY", $fld_array); + $smarty->assign("IMPORTED_RECORDS", $imported_records); + $smarty->assign("NO_EXISTING", $no_existing); + $smarty->display("MergeFields.tpl"); +} + +?> diff --git a/oss/vtiger/trunk/modules/Potentials/QuickCreate.php b/oss/vtiger/trunk/modules/Potentials/QuickCreate.php new file mode 100644 index 00000000..8d5998b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/QuickCreate.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Potentials/Save.php b/oss/vtiger/trunk/modules/Potentials/Save.php new file mode 100644 index 00000000..72d2369b --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/Save.php @@ -0,0 +1,74 @@ +id); +$rate_symbol = getCurrencySymbolandCRate($currencyid); +$rate = $rate_symbol['rate']; +$curr_symbol= $rate_symbol['symbol']; + +setObjectValuesFromRequest($focus); + +if(isset($_REQUEST['amount'])) +{ + $value = convertToDollar($_REQUEST['amount'],$rate); + $focus->column_fields['amount'] = $value; +} + +if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} +$focus->save("Potentials"); +$pot_id = $return_id = $focus->id; + +$parenttab = getParentTab(); +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "Potentials"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + +$local_log->debug("Saved record with id of ".$return_id); + +//code added for returning back to the current view after edit from list view +if($_REQUEST['return_viewname'] == '') $return_viewname='0'; +if($_REQUEST['return_viewname'] != '')$return_viewname=vtlib_purify($_REQUEST['return_viewname']); + +//Added to send mail to the vtiger_potential-owner about the Potential +if($focus->mode == 'edit') { // For non-edit mode sending mail is handled during Save + $status = sendNotificationToOwner('Potentials',$focus); +} + +header("Location: index.php?action=$return_action&module=$return_module&parenttab=$parenttab&record=$return_id&pot_id=$pot_id&viewname=$return_viewname&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/Settings.php b/oss/vtiger/trunk/modules/Potentials/Settings.php new file mode 100644 index 00000000..980dd078 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/Settings.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Potentials/TagCloud.php b/oss/vtiger/trunk/modules/Potentials/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Potentials/UnifiedSearch.php b/oss/vtiger/trunk/modules/Potentials/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Potentials/index.php b/oss/vtiger/trunk/modules/Potentials/index.php new file mode 100644 index 00000000..c31a5646 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/index.php @@ -0,0 +1,30 @@ + diff --git a/oss/vtiger/trunk/modules/Potentials/language/en_us.lang.php b/oss/vtiger/trunk/modules/Potentials/language/en_us.lang.php new file mode 100644 index 00000000..656cf4e6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/language/en_us.lang.php @@ -0,0 +1,156 @@ +'Potentials', +'LBL_MODULE_TITLE'=>'Potentials: Home', +'LBL_SEARCH_FORM_TITLE'=>'Potential Search', +'LBL_LIST_FORM_TITLE'=>'Potential List', +'LBL_OPPORTUNITY_NAME'=>'Potential Name:', +'LBL_OPPORTUNITY'=>'Potential:', +'LBL_NAME'=>'Potential Name', +'LBL_INVITEE'=>'Contacts', +'LBL_LIST_OPPORTUNITY_NAME'=>'Potential', +'LBL_LIST_ACCOUNT_NAME'=>'Account Name', +'LBL_PRODUCT_NAME'=>'Product Name', +'LBL_LIST_AMOUNT'=>'Amount', +'LBL_LIST_DATE_CLOSED'=>'Expected Close', +'LBL_LIST_SALES_STAGE'=>'Sales Stage', + +'LBL_OPPORTUNITY_NAME'=>'Potential Name:', +'LBL_ACCOUNT_NAME'=>'Account Name:', +'LBL_AMOUNT'=>'Amount:', +'LBL_DATE_CLOSED'=>'Expected Close Date:', +'LBL_TYPE'=>'Type:', +'LBL_NEXT_STEP'=>'Next Step:', +'LBL_LEAD_SOURCE'=>'Lead Source:', +'LBL_SALES_STAGE'=>'Sales Stage:', +'LBL_PROBABILITY'=>'Probability (%):', +'LBL_DESCRIPTION'=>'Description:', +'LBL_OPPORTUNITY_INFORMATION'=>'Potential Information:', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information:', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', + +'LBL_NEW_FORM_TITLE'=>'New Potential', + +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the opportunity.", +'LBL_TOP_OPPORTUNITIES'=>"My Top Open Potentials", + +'NTC_REMOVE_OPP_CONFIRMATION'=>'Are you sure you want to remove this contact from this opportunity?', + +'NTC_NONE_SCHEDULED'=>'None scheduled.', + +'LBL_SELECT_OPPOPTUNITY'=>'Select Potential', +'LBL_GENERAL_INFORMATION'=>'General Information', + + + +//for v4 release added +'LBL_NEW_POTENTIAL'=>'New Potential', +'LBL_POTENTIAL_TITLE'=>'Potentials', + +'LBL_NEW_TASK'=>'New Task', +'LBL_TASK_TITLE'=>'Tasks', +'LBL_NEW_CALL'=>'New Call', +'LBL_CALL_TITLE'=>'Calls', +'LBL_NEW_MEETING'=>'New Meeting', +'LBL_MEETING_TITLE'=>'Meetings', +'LBL_NEW_EMAIL'=>'New Email', +'LBL_EMAIL_TITLE'=>'Emails', +'LBL_NEW_NOTE'=>'New Document', +'LBL_NOTE_TITLE'=>'Documents', + +'LBL_NEW_ATTACHMENT'=>'New Attachment', +'LBL_ATTACHMENT_TITLE'=>'Attachments', + +'LBL_NEW_CONTACT'=>'New Contact', +'LBL_CONTACT_TITLE'=>'Contacts', + +//Added vtiger_fields after RC1 - Release +'LBL_ALL'=>'All', +'LBL_WON'=>'Won', +'LBL_LOST'=>'Lost', +'LBL_VALUE_PROPOSITION'=>'Value Proposition', +'LBL_PROSPECTING'=>'Prospecting', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Potential Tools', +//Added for 4GA +'Potential Name'=>'Potential Name', +'Amount'=>'Amount', +'Account Name'=>'Account Name', +'Currency'=>'Currency', +'Expected Close Date'=>'Expected Close Date', +'Opportunity Type'=>'Opportunity Type', +'Type'=>'Type', +'Next Step'=>'Next Step', +'Lead Source'=>'Lead Source', +'Sales Stage'=>'Sales Stage', +'Assigned To'=>'Assigned To', +'Probability'=>'Probability (%)', +'Campaign Source'=>'Campaign Source', +'Description'=>'Description', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +//Added for 4.2 Release -- CustomView +'Potential'=>'Potential', +'Expected Close'=>'Expected Close', + +//Added for Existing Picklist Strings + +'Prospecting'=>'Prospecting', +'Qualification'=>'Qualification', +'Needs Analysis'=>'Needs Analysis', +'Value Proposition'=>'Value Proposition', +'Id. Decision Makers'=>'Id. Decision Makers', +'Perception Analysis'=>'Perception Analysis', +'Proposal/Price Quote'=>'Proposal/Price Quote', +'Negotiation/Review'=>'Negotiation/Review', +'Closed Won'=>'Closed Won', +'Closed Lost'=>'Closed Lost', + +'Cold Call'=>'Cold Call', +'Existing Customer'=>'Existing Customer', +'Self Generated'=>'Self Generated', +'Employee'=>'Employee', +'Partner'=>'Partner', +'Public Relations'=>'Public Relations', +'Direct Mail'=>'Direct Mail', +'Conference'=>'Conference', +'Trade Show'=>'Trade Show', +'Web Site'=>'Web Site', +'Word of mouth'=>'Word of mouth', +'Other'=>'Other', + +'--None--'=>'--None--', +'Existing Business'=>'Existing Business', +'New Business'=>'New Business', + +// Added after 5.0.4 GA + +// Module Sequence Numbering +'Potential No' => 'Potential No', +// END + +); + +?> diff --git a/oss/vtiger/trunk/modules/Potentials/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Potentials/language/zh_cn.lang.php new file mode 100644 index 00000000..84579115 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/language/zh_cn.lang.php @@ -0,0 +1,158 @@ + '业务', + 'LBL_MODULE_TITLE' => '业务: 首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻业务', + 'LBL_LIST_FORM_TITLE' => '业务列表', + //'LBL_OPPORTUNITY_NAME' => '业务名称:', + 'LBL_OPPORTUNITY_NAME' => '机会名称:', + //'LBL_OPPORTUNITY' => '业务:', + 'LBL_OPPORTUNITY' => '机会:', + 'LBL_NAME' => '业务名称', + 'LBL_INVITEE' => '联系人', + 'LBL_LIST_OPPORTUNITY_NAME' => '可能性', + 'LBL_LIST_ACCOUNT_NAME' => '客户名称', + 'LBL_PRODUCT_NAME' => '业务类型', + 'LBL_LIST_AMOUNT' => '合计', + 'LBL_LIST_DATE_CLOSED' => '预期结束', + 'LBL_LIST_SALES_STAGE' => '销售策略', + +'LBL_OPPORTUNITY_NAME'=>'潜在客户名称:', + 'LBL_ACCOUNT_NAME' => '客户名称:', +'LBL_AMOUNT' => '合计:', + 'LBL_DATE_CLOSED' => '预期结束日期:', + 'LBL_TYPE' => '类型:', + 'LBL_NEXT_STEP' => '下一步:', + 'LBL_LEAD_SOURCE' => '接触来源:', + 'LBL_SALES_STAGE' => '客服场景:', + 'LBL_PROBABILITY' => '可能性 (%):', + 'LBL_DESCRIPTION' => '描述:', + 'LBL_OPPORTUNITY_INFORMATION' => '业务信息:', + 'LBL_DESCRIPTION_INFORMATION' => '描述信息:', + 'LBL_CUSTOM_INFORMATION' => '自订信息', + + 'LBL_NEW_FORM_TITLE' => '新增业务', + + 'ERR_DELETE_RECORD' => '删除业务必须指定记录编号.', + 'LBL_TOP_OPPORTUNITIES' => '最佳业务', + +'NTC_REMOVE_OPP_CONFIRMATION' => '您确定要从业务中删除这位联系人?', + + 'NTC_NONE_SCHEDULED' => '未安排行程', + +'LBL_SELECT_OPPOPTUNITY' => '选择业务', + 'LBL_GENERAL_INFORMATION' => '一般信息', + + + +//for v4 release added + 'LBL_NEW_POTENTIAL' => '新增业务', + 'LBL_POTENTIAL_TITLE' => '业务', + +'LBL_NEW_TASK' => '新增任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => '新增电话记录', + 'LBL_CALL_TITLE' => '电话记录', + 'LBL_NEW_MEETING' => '新增会议', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '新增电子邮件', + 'LBL_EMAIL_TITLE' => '电子邮件', + 'LBL_NEW_NOTE' => '新增备忘录', + 'LBL_NOTE_TITLE' => '备忘录', + + 'LBL_NEW_ATTACHMENT' => '新增附件', + 'LBL_ATTACHMENT_TITLE' => '附件', + + 'LBL_NEW_CONTACT' => '新增联系人', + 'LBL_CONTACT_TITLE' => '联系人', + +//Added vtiger_fields after RC1 - Release + 'LBL_ALL' => '全部', + 'LBL_WON' => '获得', + 'LBL_LOST' => '失去', + 'LBL_VALUE_PROPOSITION' => '价值建议', + 'LBL_PROSPECTING' => '预期值', + +// Added for 4GA + 'LBL_TOOL_FORM_TITLE' => '业务编辑器', +//Added for 4GA +'Potential Name' => '业务名称', + 'Amount' => '合计', + 'Account Name' => '客户名称', + 'Currency' => '货币', +'Expected Close Date' => '预定结束日期', + 'Opportunity Type' => '机会类型', + 'Type' => '类型', + 'Next Step' => '下一步', + 'Lead Source' => '接触来源', + 'Sales Stage' => '销售策略', +'Assigned To' => '负责人', + 'Probability' => '可能性 (%)', + 'Campaign Source' => '活动来源', +'Description' => '描述', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', +//Added for 4.2 Release -- CustomView + 'Potential' => '业务', + 'Expected Close' => '预期结案日期', + +//Added for Existing Picklist Strings + + 'Prospecting' => '潜在客户', + 'Qualification' => '具有资格', + 'Needs Analysis' => '需要分析', + 'Value Proposition' => '价值主张', + 'Id. Decision Makers' => '决策者', + 'Perception Analysis' => '感觉分析', + 'Proposal/Price Quote' => '建议书/报价单', + 'Negotiation/Review' => '交涉/审阅', + 'Closed Won' => '成功结案', + 'Closed Lost' => '失败结案', + + 'Cold Call' => '陌生拜访', + 'Existing Customer' => '既有客户', + 'Self Generated' => '自动产生', + 'Employee' => '员工', + 'Partner' => '伙伴', + 'Public Relations' => '公众关系', + 'Direct Mail' => '邮件营销', + 'Conference' => '研讨会', + 'Trade Show' => '贸易展览', + 'Web Site' => '网站', + 'Word of mouth' => '朋友介绍', + 'Other' => '其它', + + '--None--' => '-- 无 --', + 'Existing Business' => '已有商务往来', + 'New Business' => '新客户', + +// Added after 5.0.4 GA + +// Module Sequence Numbering +'Potential No' => 'Potential No', +// END + +); + +?> diff --git a/oss/vtiger/trunk/modules/Potentials/updateRelations.php b/oss/vtiger/trunk/modules/Potentials/updateRelations.php new file mode 100644 index 00000000..040b46d0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Potentials/updateRelations.php @@ -0,0 +1,55 @@ +pquery($sql, array($id, $forCRMRecord)); + } elseif($dest_mod == 'Products') {//when we select product from potential related list + $sql = "insert into vtiger_seproductsrel values (?,?,?)"; + $adb->pquery($sql, array($forCRMRecord, $id,'Potentials')); + } elseif($dest_mod == 'Documents') { + $sql = "insert into vtiger_senotesrel values (?,?)"; + $adb->pquery($sql, array($forCRMRecord, $id)); + } else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/CallRelatedList.php b/oss/vtiger/trunk/modules/PriceBooks/CallRelatedList.php new file mode 100644 index 00000000..ee6ff619 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/CallRelatedList.php @@ -0,0 +1,80 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['bookname']; + $log->debug("PriceBook id =".$focus->id); + $log->debug("PriceBook Name =".$focus->name); + } + if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + } + + $related_array=getRelatedLists($currentModule,$focus); + + global $mod_strings; + global $app_strings; + global $theme, $currentModule; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + if(isset($focus->name)) + $smarty->assign("NAME", $focus->name); + $smarty->assign("CATEGORY",$category); + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $smarty->assign("ID",$focus->id); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $smarty->assign("CURRENCY_ID",$focus->column_fields['currency_id']); + $smarty->assign("MODULE",$currentmodule); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("SINGLE_MOD",$app_strings['PriceBook']); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("RelatedListContents.tpl"); + else + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/CustomView.php b/oss/vtiger/trunk/modules/PriceBooks/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/PriceBooks/Delete.php b/oss/vtiger/trunk/modules/PriceBooks/Delete.php new file mode 100644 index 00000000..0148d6e2 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/Delete.php @@ -0,0 +1,51 @@ +pquery("delete from vtiger_pricebookproductrel where pricebookid=? and productid=?", array($pricebookid, $productid)); +} + +if($_REQUEST['module'] == $_REQUEST['return_module']) + $focus->mark_deleted($_REQUEST['record']); + +$parenttab = getParentTab(); + +header("Location: index.php?module=".vtlib_purify($_REQUEST['return_module'])."&action=".vtlib_purify($_REQUEST['return_action'])."&record=".vtlib_purify($_REQUEST['return_id'])."&parenttab=$parenttab$url"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/DetailView.php b/oss/vtiger/trunk/modules/PriceBooks/DetailView.php new file mode 100644 index 00000000..76a72447 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/DetailView.php @@ -0,0 +1,107 @@ +retrieve_entity_info($_REQUEST['record'],"PriceBooks"); + $focus->id = $_REQUEST['record']; + $focus->name = $focus->column_fields['bookname']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; +} + +global $app_strings,$mod_strings,$theme,$currentModule,$singlepane_view; + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); + +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); + +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$smarty->assign("CUSTOMFIELD", $cust_fld); + +if(isPermitted("PriceBooks","PriceBookEditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +if(isPermitted("PriceBooks","DeletePriceBook",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", vtlib_purify($_REQUEST['record'])); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign("NAME", $focus->name); + + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$tabid = getTabid("PriceBooks"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$smarty->assign("MODULE", $currentModule); +$smarty->assign("SINGLE_MOD", 'PriceBook'); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); + +if($singlepane_view == 'true') +{ + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); + +$smarty->assign("SinglePane_View", $singlepane_view); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("Inventory/InventoryDetailView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/DetailViewAjax.php b/oss/vtiger/trunk/modules/PriceBooks/DetailViewAjax.php new file mode 100644 index 00000000..a2233ae7 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/DetailViewAjax.php @@ -0,0 +1,46 @@ +retrieve_entity_info($crmid,"PriceBooks"); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("PriceBooks"); + if($modObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/EditView.php b/oss/vtiger/trunk/modules/PriceBooks/EditView.php new file mode 100644 index 00000000..85ad9fa1 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/EditView.php @@ -0,0 +1,125 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if(isset($_REQUEST['record']) && $_REQUEST['record'] != '') +{ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"PriceBooks"); + $focus->name = $focus->column_fields['bookname']; +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') + $smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +else +{ + $bas_block = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS'); + $blocks['basicTab'] = $bas_block; + + $smarty->assign("BLOCKS",$blocks); + $smarty->assign("BLOCKS_COUNT",count($blocks)); +} +$smarty->assign("OP_MODE",$disp_view); + +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'PriceBook'); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +if(isset($cust_fld)) +{ + $smarty->assign("CUSTOMFIELD", $cust_fld); +} + +$smarty->assign("ID", $focus->id); +if(isset($focus->name)) + $smarty->assign("NAME", $focus->name); + +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); +if($focus->mode == 'edit') +{ + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MODE", $focus->mode); +} + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if(isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path);$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + + +$tabid = getTabid("PriceBooks"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +// Added to set price book active when creating a new pricebook +if($focus->mode != 'edit' && $_REQUEST['isDuplicate'] != 'true') + $smarty->assign('PRICE_BOOK_MODE', 'create'); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
    '. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +if($focus->mode == 'edit') + $smarty->display('Inventory/InventoryEditView.tpl'); +else + $smarty->display('Inventory/InventoryCreateView.tpl'); +?> diff --git a/oss/vtiger/trunk/modules/PriceBooks/ListView.php b/oss/vtiger/trunk/modules/PriceBooks/ListView.php new file mode 100644 index 00000000..c6646430 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/ListView.php @@ -0,0 +1,193 @@ +assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'PriceBook'); + +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$focus = new PriceBooks(); +// Initialize sort by fields +$focus->initSortbyField('PriceBooks'); +// END +$other_text=Array(); + +if(!$_SESSION['lvs'][$currentModule]) +{ + unset($_SESSION['lvs']); + $modObj = new ListViewSession(); + $modObj->sorder = $sorder; + $modObj->sortby = $order_by; + $_SESSION['lvs'][$currentModule] = get_object_vars($modObj); +} + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR","The User does not have permission to delete ".$errormsg." ".$currentModule); +}else +{ + $smarty->assign("ERROR",""); +} +if (!isset($where)) $where = ""; + +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION['PRICEBOOK_ORDER_BY'] = $order_by; +$_SESSION['PRICEBOOK_SORT_ORDER'] = $sorder; +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> + +if(isset($_REQUEST['query']) && $_REQUEST['query'] != '' && $_REQUEST['query'] == 'true') +{ + list($where, $ustring) = split("#@@#",getWhereCondition($currentModule)); + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); + +} + +//<<<>>>>>> +$oCustomView = new CustomView("PriceBooks"); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); + +//Added to handle approving or denying status-public by the admin in CustomView +$statusdetails = $oCustomView->isPermittedChangeStatus($viewnamedesc['status']); +$smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + +//To check if a user is able to edit/delete a customview +$edit_permit = $oCustomView->isPermittedCustomView($viewid,'EditView',$currentModule); +$delete_permit = $oCustomView->isPermittedCustomView($viewid,'Delete',$currentModule); +$smarty->assign("CV_EDIT_PERMIT",$edit_permit); +$smarty->assign("CV_DELETE_PERMIT",$delete_permit); + +//<<<<>>>> +if(isPermitted('PriceBooks','DeletePriceBook','') == 'yes') + $other_text['del'] = $app_strings[LBL_MASS_DELETE]; +if(isPermitted('PriceBooks','EditView','') == 'yes') + $other_text['mass_edit'] = $app_strings[LBL_MASS_EDIT]; +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} + +//Retreive the list from Database +//<<<<<<<<>>>>>>>> +if($viewid != "0") +{ + $listquery = getListQuery("PriceBooks"); + $list_query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"PriceBooks"); +}else +{ + $list_query = getListQuery("PriceBooks"); +} +//<<<<<<<>>>>>>>> + + +if(isset($where) && $where != '') +{ + $list_query .= ' and '.$where; +} + +if(isset($order_by) && $order_by != '') +{ + $tablename = getTableNameForField('PriceBooks',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY '.$tablename.$order_by; + $list_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; +} + +///Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +//Retreive the List View Table Header + +$listview_header = getListViewHeader($focus,"PriceBooks",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_header_search = getSearchListHeaderValues($focus,"PriceBooks",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER",$listview_header_search); + +$listview_entries = getListViewEntries($focus,"PriceBooks",$list_result,$navigation_array,'','&return_module=PriceBooks&return_action=index','EditView','Delete',$oCustomView); +$smarty->assign("LISTENTITY", $listview_entries); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string,"PriceBooks","index",$viewid); +$alphabetical = AlphabeticalSearch($currentModule,'index','bookname','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($module); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("SELECT_SCRIPT", $view_script); +$smarty->assign("BUTTONS", $other_text); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display("ListView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/ListViewPagging.php b/oss/vtiger/trunk/modules/PriceBooks/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/MassEdit.php b/oss/vtiger/trunk/modules/PriceBooks/MassEdit.php new file mode 100644 index 00000000..348dab37 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/MassEdit.php @@ -0,0 +1,45 @@ +mode = ''; +$mode = 'mass_edit'; +$disp_view = getView($focus->mode); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("IDS",$_REQUEST['idstring']); +$smarty->assign("MASS_EDIT","1"); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("APP",$app_strings); +$smarty->assign("CATEGORY",getParentTab()); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/MassEditSave.php b/oss/vtiger/trunk/modules/PriceBooks/MassEditSave.php new file mode 100644 index 00000000..0e1f2a6f --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/MassEditSave.php @@ -0,0 +1,67 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if($fieldname == 'assigned_user_id'){ + if($_REQUEST['assigntype'] == 'U') { + $value = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $value = $_REQUEST['assigned_group_id']; + } + } else { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + } + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/Popup.php b/oss/vtiger/trunk/modules/PriceBooks/Popup.php new file mode 100644 index 00000000..18d2d154 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/Popup.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/PriceBooks/PriceBooks.js b/oss/vtiger/trunk/modules/PriceBooks/PriceBooks.js new file mode 100644 index 00000000..5fb03320 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/PriceBooks.js @@ -0,0 +1,192 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + +prod_array = new Array(); +function addtopricebook() +{ + x = document.addToPB.selected_id.length; + prod_array = new Array(x); + idstring = ""; + + if ( x == undefined) + { + if (document.addToPB.selected_id.checked) + { + yy = document.addToPB.selected_id.value+"_listprice"; + document.addToPB.idlist.value=document.addToPB.selected_id.value; + + var elem = document.addToPB.elements; + var ele_len =elem.length; + var i=0,j=0; + + for(i=0; i'crmid','vtiger_pricebook'=>'pricebookid','vtiger_pricebookcf'=>'pricebookid'); + /** + * Mandatory table for supporting custom fields. + */ + var $customFieldTable = Array('vtiger_pricebookcf', 'pricebookid'); + var $column_fields = Array(); + + var $sortby_fields = Array('bookname'); + + // This is the list of fields that are in the lists. + var $list_fields = Array( + 'Price Book Name'=>Array('pricebook'=>'bookname'), + 'Active'=>Array('pricebook'=>'active') + ); + + var $list_fields_name = Array( + 'Price Book Name'=>'bookname', + 'Active'=>'active' + ); + var $list_link_field= 'bookname'; + + var $search_fields = Array( + 'Price Book Name'=>Array('pricebook'=>'bookname') + ); + var $search_fields_name = Array( + 'Price Book Name'=>'bookname', + ); + + //Added these variables which are used as default order by and sortorder in ListView + var $default_order_by = 'bookname'; + var $default_sort_order = 'ASC'; + + var $mandatory_fields = Array('bookname','currency_id','pricebook_no','createdtime' ,'modifiedtime'); + + /** Constructor which will set the column_fields in this object + */ + function PriceBooks() { + $this->log =LoggerManager::getLogger('pricebook'); + $this->log->debug("Entering PriceBooks() method ..."); + $this->db = PearDatabase::getInstance(); + $this->column_fields = getColumnFields('PriceBooks'); + $this->log->debug("Exiting PriceBook method ..."); + } + + function save_module($module) + { + // Update the list prices in the price book with the unit price, if the Currency has been changed + $this->updateListPrices(); + } + + /* Function to Update the List prices for all the products of a current price book + with its Unit price, if the Currency for Price book has changed. */ + function updateListPrices() { + global $log, $adb; + $log->debug("Entering function updateListPrices..."); + $pricebook_currency = $this->column_fields['currency_id']; + $prod_res = $adb->pquery("select productid from vtiger_pricebookproductrel where pricebookid=? and usedcurrency != ?", + array($this->id,$pricebook_currency)); + $numRows = $adb->num_rows($prod_res); + $prod_ids = array(); + for($i=0;$i<$numRows;$i++) { + $prod_ids[] = $adb->query_result($prod_res,$i,'productid'); + } + if(count($prod_ids) > 0) { + $prod_price_list = getPricesForProducts($pricebook_currency,$prod_ids); + + for($i=0;$iid, $product_id); + $adb->pquery($query, $params); + } + } + $log->debug("Exiting function updateListPrices..."); + } + + /** Function used to get the sort order for PriceBook listview + * @return string $sorder - first check the $_REQUEST['sorder'] if request value is empty then check in the $_SESSION['PRICEBOOK_SORT_ORDER'] if this session value is empty then default sort order will be returned. + */ + function getSortOrder() + { + global $log; + $log->debug("Entering getSortOrder() method ..."); + if(isset($_REQUEST['sorder'])) + $sorder = $this->db->sql_escape_string($_REQUEST['sorder']); + else + $sorder = (($_SESSION['PRICEBOOK_SORT_ORDER'] != '')?($_SESSION['PRICEBOOK_SORT_ORDER']):($this->default_sort_order)); + $log->debug("Exiting getSortOrder() method ..."); + return $sorder; + } + + /** Function used to get the order by value for PriceBook listview + * @return string $order_by - first check the $_REQUEST['order_by'] if request value is empty then check in the $_SESSION['PRICEBOOK_ORDER_BY'] if this session value is empty then default order by will be returned. + */ + function getOrderBy() + { + global $log; + $log->debug("Entering getOrderBy() method ..."); + + $use_default_order_by = ''; + if(PerformancePrefs::getBoolean('LISTVIEW_DEFAULT_SORTING', true)) { + $use_default_order_by = $this->default_order_by; + } + + if (isset($_REQUEST['order_by'])) + $order_by = $this->db->sql_escape_string($_REQUEST['order_by']); + else + $order_by = (($_SESSION['PRICEBOOK_ORDER_BY'] != '')?($_SESSION['PRICEBOOK_ORDER_BY']):($use_default_order_by)); + $log->debug("Exiting getOrderBy method ..."); + return $order_by; + } + + /** function used to get the products which are related to the pricebook + * @param int $id - pricebook id + * @return array - return an array which will be returned from the function getPriceBookRelatedProducts + **/ + function get_pricebook_products($id, $cur_tab_id, $rel_tab_id, $actions=false) { + global $log, $singlepane_view,$currentModule,$current_user; + $log->debug("Entering get_pricebook_products(".$id.") method ..."); + $this_module = $currentModule; + + $related_module = vtlib_getModuleNameById($rel_tab_id); + require_once("modules/$related_module/$related_module.php"); + $other = new $related_module(); + vtlib_setup_modulevars($related_module, $other); + $singular_modname = vtlib_toSingular($related_module); + + $parenttab = getParentTab(); + + if($singlepane_view == 'true') + $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; + else + $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; + + $button = ''; + + if($actions) { + if(is_string($actions)) $actions = explode(',', strtoupper($actions)); + if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { + $button .= " "; + } + } + + $query = 'select vtiger_products.productid, vtiger_products.productname, vtiger_products.productcode, vtiger_products.commissionrate, vtiger_products.qty_per_unit, vtiger_products.unit_price, vtiger_crmentity.crmid, vtiger_crmentity.smownerid,vtiger_pricebookproductrel.listprice from vtiger_products inner join vtiger_pricebookproductrel on vtiger_products.productid = vtiger_pricebookproductrel.productid inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_products.productid inner join vtiger_pricebook on vtiger_pricebook.pricebookid = vtiger_pricebookproductrel.pricebookid where vtiger_pricebook.pricebookid = '.$id.' and vtiger_crmentity.deleted = 0'; + + $return_value = getPriceBookRelatedProducts($query,$this,$returnset); + + if($return_value == null) $return_value = Array(); + $return_value['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_pricebook_products method ..."); + return $return_value; + } + + /** function used to get the services which are related to the pricebook + * @param int $id - pricebook id + * @return array - return an array which will be returned from the function getPriceBookRelatedServices + **/ + function get_pricebook_services($id, $cur_tab_id, $rel_tab_id, $actions=false) { + global $log, $singlepane_view,$currentModule,$current_user; + $log->debug("Entering get_pricebook_services(".$id.") method ..."); + $this_module = $currentModule; + + $related_module = vtlib_getModuleNameById($rel_tab_id); + require_once("modules/$related_module/$related_module.php"); + $other = new $related_module(); + vtlib_setup_modulevars($related_module, $other); + $singular_modname = vtlib_toSingular($related_module); + + $parenttab = getParentTab(); + + if($singlepane_view == 'true') + $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; + else + $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; + + $button = ''; + + if($actions) { + if(is_string($actions)) $actions = explode(',', strtoupper($actions)); + if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { + $button .= " "; + } + } + + $query = 'select vtiger_service.serviceid, vtiger_service.servicename, vtiger_service.commissionrate, + vtiger_service.qty_per_unit, vtiger_service.unit_price, vtiger_crmentity.crmid, vtiger_crmentity.smownerid, + vtiger_pricebookproductrel.listprice from vtiger_service + inner join vtiger_pricebookproductrel on vtiger_service.serviceid = vtiger_pricebookproductrel.productid + inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_service.serviceid + inner join vtiger_pricebook on vtiger_pricebook.pricebookid = vtiger_pricebookproductrel.pricebookid + where vtiger_pricebook.pricebookid = '.$id.' and vtiger_crmentity.deleted = 0'; + + $return_value = $other->getPriceBookRelatedServices($query,$this,$returnset); + + if($return_value == null) $return_value = Array(); + $return_value['CUSTOM_BUTTON'] = $button; + + $log->debug("Exiting get_pricebook_services method ..."); + return $return_value; + } + + /** function used to get whether the pricebook has related with a product or not + * @param int $id - product id + * @return true or false - if there are no pricebooks available or associated pricebooks for the product is equal to total number of pricebooks then return false, else return true + */ + function get_pricebook_noproduct($id) + { + global $log; + $log->debug("Entering get_pricebook_noproduct(".$id.") method ..."); + + $query = "select vtiger_crmentity.crmid, vtiger_pricebook.* from vtiger_pricebook inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_pricebook.pricebookid where vtiger_crmentity.deleted=0"; + $result = $this->db->pquery($query, array()); + $no_count = $this->db->num_rows($result); + if($no_count !=0) + { + $pb_query = 'select vtiger_crmentity.crmid, vtiger_pricebook.pricebookid,vtiger_pricebookproductrel.productid from vtiger_pricebook inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_pricebook.pricebookid inner join vtiger_pricebookproductrel on vtiger_pricebookproductrel.pricebookid=vtiger_pricebook.pricebookid where vtiger_crmentity.deleted=0 and vtiger_pricebookproductrel.productid=?'; + $result_pb = $this->db->pquery($pb_query, array($id)); + if($no_count == $this->db->num_rows($result_pb)) + { + $log->debug("Exiting get_pricebook_noproduct method ..."); + return false; + } + elseif($this->db->num_rows($result_pb) == 0) + { + $log->debug("Exiting get_pricebook_noproduct method ..."); + return true; + } + elseif($this->db->num_rows($result_pb) < $no_count) + { + $log->debug("Exiting get_pricebook_noproduct method ..."); + return true; + } + } + else + { + $log->debug("Exiting get_pricebook_noproduct method ..."); + return false; + } + } + + /* + * Function to get the primary query part of a report + * @param - $module Primary module name + * returns the query string formed on fetching the related data for report for primary module + */ + function generateReportsQuery($module){ + $moduletable = $this->table_name; + $moduleindex = $this->table_index; + + $query = "from $moduletable + inner join vtiger_crmentity on vtiger_crmentity.crmid=$moduletable.$moduleindex + left join vtiger_currency_info as vtiger_currency_info$module on vtiger_currency_info$module.id = $moduletable.currency_id + left join vtiger_groups as vtiger_groups$module on vtiger_groups$module.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_users$module on vtiger_users$module.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid"; + return $query; + } + + /* + * Function to get the secondary query part of a report + * @param - $module primary module name + * @param - $secmodule secondary module name + * returns the query string formed on fetching the related data for report for secondary module + */ + function generateReportsSecQuery($module,$secmodule){ + $query = $this->getRelationQuery($module,$secmodule,"vtiger_pricebook","pricebookid"); + $query .=" left join vtiger_crmentity as vtiger_crmentityPriceBooks on vtiger_crmentityPriceBooks.crmid=vtiger_pricebook.pricebookid and vtiger_crmentityPriceBooks.deleted=0 + left join vtiger_currency_info as vtiger_currency_infoPriceBooks on vtiger_currency_infoPriceBooks.id = vtiger_pricebook.currency_id + left join vtiger_users as vtiger_usersPriceBooks on vtiger_usersPriceBooks.id = vtiger_crmentityPriceBooks.smownerid + left join vtiger_groups as vtiger_groupsPriceBooks on vtiger_groupsPriceBooks.groupid = vtiger_crmentityPriceBooks.smownerid"; + + return $query; + } + + /* + * Function to get the relation tables for related modules + * @param - $secmodule secondary module name + * returns the array with table names and fieldnames storing relations between module and this module + */ + function setRelationTables($secmodule){ + $rel_tables = array ( + "Products" => array("vtiger_pricebookproductrel"=>array("pricebookid","productid"),"vtiger_pricebook"=>"pricebookid"), + "Services" => array("vtiger_pricebookproductrel"=>array("pricebookid","productid"),"vtiger_pricebook"=>"pricebookid"), + ); + return $rel_tables[$secmodule]; + } + +} +?> diff --git a/oss/vtiger/trunk/modules/PriceBooks/PriceBooksAjax.php b/oss/vtiger/trunk/modules/PriceBooks/PriceBooksAjax.php new file mode 100644 index 00000000..ce66087f --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/PriceBooksAjax.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/PriceBooks/QuickCreate.php b/oss/vtiger/trunk/modules/PriceBooks/QuickCreate.php new file mode 100644 index 00000000..8d5998b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/QuickCreate.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/PriceBooks/Save.php b/oss/vtiger/trunk/modules/PriceBooks/Save.php new file mode 100644 index 00000000..0a83a735 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/Save.php @@ -0,0 +1,51 @@ +column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} +$focus->save("PriceBooks"); +$return_id = $focus->id; + +$parenttab = getParentTab(); +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "PriceBooks"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + +header("Location: index.php?action=$return_action&module=$return_module&parenttab=$parenttab&record=$return_id&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/Settings.php b/oss/vtiger/trunk/modules/PriceBooks/Settings.php new file mode 100644 index 00000000..980dd078 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/Settings.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/PriceBooks/TagCloud.php b/oss/vtiger/trunk/modules/PriceBooks/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/PriceBooks/UnifiedSearch.php b/oss/vtiger/trunk/modules/PriceBooks/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PriceBooks/index.php b/oss/vtiger/trunk/modules/PriceBooks/index.php new file mode 100644 index 00000000..cdab8de1 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/index.php @@ -0,0 +1,20 @@ + diff --git a/oss/vtiger/trunk/modules/PriceBooks/language/en_us.lang.php b/oss/vtiger/trunk/modules/PriceBooks/language/en_us.lang.php new file mode 100644 index 00000000..251726ec --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/language/en_us.lang.php @@ -0,0 +1,42 @@ +'Price Book Information:', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', +'LBL_DESCRIPTION_INFORMATION'=>'Description Name:', +//Mapping for price book +'Price Book Name'=>'Price Book Name', +'Product Name'=>'Product Name', +'Active'=>'Active', +'Description'=>'Description', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'LBL_LIST_PRODUCT_NAME'=>'Product Name', +'LBL_PRODUCT_CODE'=>'Part Number', +'LBL_PRODUCT_UNIT_PRICE'=>'Unit Price', +'LBL_PB_LIST_PRICE'=>'List Price', +'LBL_ACTION'=>'Action', +'PriceBook'=>'Price Book', + +// Added after 5.0.4 GA +'Currency'=>'Currency', + +// Module Sequence Numbering +'PriceBook No' => 'PriceBook No', +// END +); + + + +?> diff --git a/oss/vtiger/trunk/modules/PriceBooks/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/PriceBooks/language/zh_cn.lang.php new file mode 100644 index 00000000..60effc78 --- /dev/null +++ b/oss/vtiger/trunk/modules/PriceBooks/language/zh_cn.lang.php @@ -0,0 +1,41 @@ + '价目表信息:', + 'LBL_CUSTOM_INFORMATION' => '自订信息:', + 'LBL_DESCRIPTION_INFORMATION' => '描述名称:', + //Mapping for price book + 'Price Book Name' => '价目表名称', + 'Product Name' => '产品名称', + 'Active' => '启用', + 'Description' => '说明', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'LBL_LIST_PRODUCT_NAME' => '产品名称', + 'LBL_PRODUCT_CODE' => '产品代号', + 'LBL_PRODUCT_UNIT_PRICE' => '单位价格', + 'LBL_PB_LIST_PRICE' => '定价', + 'LBL_ACTION' => '操作', + 'PriceBook' => '价目表', +// Added after 5.0.4 GA +'Currency'=>'Currency', + +// Module Sequence Numbering +'PriceBook No' => 'PriceBook No', +// END +); + + + +?> diff --git a/oss/vtiger/trunk/modules/Products/AddProductToPriceBooks.html b/oss/vtiger/trunk/modules/Products/AddProductToPriceBooks.html new file mode 100644 index 00000000..26e461a8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/AddProductToPriceBooks.html @@ -0,0 +1,156 @@ + + + + + + + + +
     
      +{PRICEBOOKLISTHEADER} + + + + + + + + + +
    + + {LISTHEADER} + {LISTENTITY} +
    +
     
    + + + +
    + +  + + + diff --git a/oss/vtiger/trunk/modules/Products/AddProductToPriceBooks.php b/oss/vtiger/trunk/modules/Products/AddProductToPriceBooks.php new file mode 100644 index 00000000..7aab869b --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/AddProductToPriceBooks.php @@ -0,0 +1,170 @@ +id,'unit_price') != '0'){ + echo ""; + echo "
    "; + echo "
    + + + + + + + + + +
    $app_strings[LBL_UNIT_PRICE_NOT_PERMITTED]
    + $app_strings[LBL_GO_BACK]
    +
    "; + echo "
    "; + exit(); +} + +$smarty=new vtigerCRM_Smarty; + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); + +$focus = new PriceBooks(); + +//Retreive the list of PriceBooks +$list_query = getListQuery("PriceBooks"); + +$list_query .= ' and vtiger_pricebook.active<>0 ORDER BY pricebookid DESC '; + +$list_result = $adb->query($list_query); +$num_rows = $adb->num_rows($list_result); + +$record_string= "Total No of PriceBooks : ".$num_rows; + +//Retreiving the array of already releated products +$sql1="select vtiger_crmentity.crmid, vtiger_pricebookproductrel.pricebookid,vtiger_products.unit_price + from vtiger_pricebookproductrel inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_pricebookproductrel.productid + inner join vtiger_products on vtiger_products.productid=vtiger_pricebookproductrel.productid + where vtiger_crmentity.deleted=0 and vtiger_pricebookproductrel.productid=?"; +$res1 = $adb->pquery($sql1, array($productid)); +$num_prod_rows = $adb->num_rows($res1); +$pbk_array = Array(); +for($i=0; $i<$num_prod_rows; $i++) +{ + $pbkid=$adb->query_result($res1,$i,"pricebookid"); + $pbk_array[$pbkid] = $pbkid; +} + +$pro_unit_price = getUnitPrice($productid, $currentModule); +$prod_price_details = getPriceDetailsForProduct($productid, $pro_unit_price); + +$prod_cur_price = array(); +for($i=0; $i + + '; + + //we should not display the Add to PriceBook button if there is no pricebooks to associate + if($num_rows != $num_prod_rows) + $other_text .=' '; + +$other_text .=''; +$other_text .=' + + '; + +$smarty->assign("PRICEBOOKLISTHEADER", get_form_header($current_module_strings['LBL_LIST_PRICEBOOK_FORM_TITLE'], $other_text, false )); + + +//List View Table Header +$list_header = ''; +$list_header .= ''; +$list_header .=''; +$list_header .= ''.$mod_strings['LBL_PRICEBOOK'].''; +$list_header .= ''.$app_strings['LBL_CURRENCY'].''; +$list_header .= ''.$mod_strings['LBL_PRODUCT_UNIT_PRICE'].''; +$list_header .= ''.$mod_strings['LBL_PB_LIST_PRICE'].''; +$list_header .= ''; + +$smarty->assign("LISTHEADER", $list_header); + +$list_body =''; +for($i=0; $i<$num_rows; $i++) +{ + $entity_id = $adb->query_result($list_result,$i,"crmid"); + if(! array_key_exists($entity_id, $pbk_array)) + { + $pk_currency_id = $adb->query_result($list_result,$i,"currency_id"); + $pk_currency_name = $adb->query_result($list_result,$i,"currency_name"); + $unit_price = $prod_cur_price[$pk_currency_id]; + $field_name = $entity_id."_listprice"; + $unit_price_array[]="'".$unit_price."'"; + $field_name_array[]="'".$field_name."'"; + + $list_body .= ''; + $list_body .= ''; + $list_body .= ''.$adb->query_result($list_result,$i,"bookname").''; + $list_body .= ''.$pk_currency_name.''; + $list_body .= ''.$unit_price.''; + + $list_body .=''; + if(isPermitted("PriceBooks","EditView","") == 'yes') + $list_body .= ''; + else + $list_body .= ''; + $list_body .= ''; + } + +} + +$smarty->assign("UNIT_PRICE_ARRAY",implode(",",$unit_price_array)); +$smarty->assign("FIELD_NAME_ARRAY",implode(",",$field_name_array)); + +if($order_by !='') + $url_string .="&order_by=".$order_by; +if($sorder !='') + $url_string .="&sorder=".$sorder; + +$smarty->assign("LISTENTITY", $list_body); +$smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +$smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +$smarty->assign("RETURN_ID", $productid); +$smarty->assign("CATEGORY", $parenttab); + +$smarty->display("AddProductToPriceBooks.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/AddProductsToPriceBook.html b/oss/vtiger/trunk/modules/Products/AddProductsToPriceBook.html new file mode 100644 index 00000000..68b5818b --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/AddProductsToPriceBook.html @@ -0,0 +1,58 @@ + + + + +
    +
    +{PRODUCTLISTHEADER} + + + + + + + +
    + + + + {NAVIGATION} + +
     {RECORD_COUNTS}
    +
    + + {LISTHEADER} + {LISTENTITY} +
    +
     
    + + + + + diff --git a/oss/vtiger/trunk/modules/Products/AddProductsToPriceBook.php b/oss/vtiger/trunk/modules/Products/AddProductsToPriceBook.php new file mode 100644 index 00000000..72e1d86d --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/AddProductsToPriceBook.php @@ -0,0 +1,189 @@ +id); +$parenttab = getParentTab(); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +require_once($theme_path.'layout_utils.php'); + +if(getFieldVisibilityPermission('Products',$current_user->id,'unit_price') != '0'){ + echo ""; + echo "
    "; + echo "
    + + + + + + + + + +
    $app_strings[LBL_UNIT_PRICE_NOT_PERMITTED]
    + $app_strings[LBL_GO_BACK]
    +
    "; + echo "
    "; + exit(); +} + +$pricebookname = getPriceBookName($pricebook_id); + +$smarty= new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); + +$focus = new Products(); + +if (isset($_REQUEST['order_by'])) + $order_by = $adb->sql_escape_string($_REQUEST['order_by']); + +$url_string = ''; // assigning http url string +$sorder = 'ASC'; // Default sort order +if(isset($_REQUEST['sorder']) && $_REQUEST['sorder'] != '') + $sorder = $adb->sql_escape_string($_REQUEST['sorder']); + + +//Retreive the list of Products +$list_query = getListQuery("Products"); + +if(isset($order_by) && $order_by != '') +{ + $list_query .= ' and vtiger_products.discontinued<>0 ORDER BY '.$order_by.' '.$sorder; +} + +$list_query .= " and vtiger_products.discontinued<>0 group by vtiger_crmentity.crmid"; +$list_result = $adb->query($list_query); +$num_rows = $adb->num_rows($list_result); + +$record_string= "Total No of Product Available : ".$num_rows; + +//Retreiving the array of already releated products +$sql1 = "select productid from vtiger_pricebookproductrel + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_pricebookproductrel.productid + WHERE vtiger_crmentity.setype='Products' AND vtiger_crmentity.deleted=0 AND pricebookid=?"; +$res1 = $adb->pquery($sql1, array($pricebook_id)); +$num_prod_rows = $adb->num_rows($res1); +$prod_array = Array(); +for($i=0; $i<$num_prod_rows; $i++) +{ + $prodid=$adb->query_result($res1,$i,"productid"); + $prod_array[$prodid] = $prodid; +} + + +//Buttons Add To PriceBook and Cancel +$other_text = ' + + + + '; + +$other_text .=' + +
      + + + + '; + + //we should not display the Add to PriceBook button if there is no products to associate + if($num_rows != $num_prod_rows && $num_rows > 0) + $other_text .=''; + +$other_text .=' 
    '; + +$smarty->assign("PRODUCTLISTHEADER", get_form_header($current_module_strings['LBL_LIST_FORM_TITLE'], $other_text, false )); + +//Retreive the List View Table Header + +$list_header = ''; +$list_header .= ''; +$list_header .=''; +$list_header .= ''.$mod_strings['LBL_LIST_PRODUCT_NAME'].''; +if(getFieldVisibilityPermission('Products', $current_user->id, 'productcode') == '0') + $list_header .= ''.$mod_strings['LBL_PRODUCT_CODE'].''; +if(getFieldVisibilityPermission('Products', $current_user->id, 'unit_price') == '0') + $list_header .= ''.$mod_strings['LBL_PRODUCT_UNIT_PRICE'].''; +$list_header .= ''.$mod_strings['LBL_PB_LIST_PRICE'].''; +$list_header .= ''; + +$smarty->assign("LISTHEADER", $list_header); + + +//if the product is not associated already then we should display that products +$new_prod_array = array(); +$unit_price_array=array(); +$field_name_array=array(); +$entity_id_array =array(); +for($i=0; $i<$num_rows; $i++) +{ + $entity_id = $adb->query_result($list_result,$i,"crmid"); + if(! array_key_exists($entity_id, $prod_array)) + { + $new_prod_array[] = $entity_id; + } + $entity_id_array[$entity_id] = $i; +} +$prod_price_list = getPricesForProducts($currency_id, $new_prod_array); + +$list_body =''; +for($i=0; $iinfo("Products :: Showing the List of products to be added in price book"); + $entity_id = $new_prod_array[$i]; + + $list_body .= ''; + $unit_price = $prod_price_list[$entity_id]; + $field_name = $entity_id."_listprice"; + $unit_price_array[]="'".$unit_price."'"; + $field_name_array[]="'".$field_name."'"; + + $list_body .= ''; + $list_body .= ''.$adb->query_result($list_result,$entity_id_array[$entity_id],"productname").''; + + if(getFieldVisibilityPermission('Products', $current_user->id, 'productcode') == '0') + $list_body .= ''.$adb->query_result($list_result,$entity_id_array[$entity_id],"productcode").''; + if(getFieldVisibilityPermission('Products', $current_user->id, 'unit_price') == '0') + $list_body .= ''.$unit_price.''; + + $list_body .=''; + if(isPermitted("PriceBooks","EditView","") == 'yes') + $list_body .= ''; + else + $list_body .= ''; + $list_body .= ''; +} + +$smarty->assign("UNIT_PRICE_ARRAY",implode(",",$unit_price_array)); +$smarty->assign("FIELD_NAME_ARRAY",implode(",",$field_name_array)); + +if($order_by !='') + $url_string .="&order_by=".$order_by; +if($sorder !='') + $url_string .="&sorder=".$sorder; + +$smarty->assign("LISTENTITY", $list_body); +$smarty->assign("CATEGORY", $parenttab); + +$smarty->display("AddProductsToPriceBook.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/CallRelatedList.php b/oss/vtiger/trunk/modules/Products/CallRelatedList.php new file mode 100644 index 00000000..4b93cd87 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/CallRelatedList.php @@ -0,0 +1,74 @@ +retrieve_entity_info($record,$currentModule); + $focus->id = $record; + $focus->name=$focus->column_fields['productname']; + $product_base_currency = getProductBaseCurrency($focus->id,$currentModule); + } else { + $product_base_currency = fetchCurrency($current_user->id); + } + + $smarty = new vtigerCRM_Smarty; + + if($isduplicate == 'true') $focus->id = ''; + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + if(!$_SESSION['rlvs'][$currentModule]) unset($_SESSION['rlvs']); + + $smarty->assign('APP', $app_strings); + $smarty->assign('MOD', $mod_strings); + $smarty->assign('MODULE', $currentModule); + // TODO: Update Single Module Instance name here. + $smarty->assign('SINGLE_MOD', getTranslatedString($currentModule)); + $smarty->assign('CATEGORY', $category); + $smarty->assign('IMAGE_PATH', "themes/$theme/images/"); + $smarty->assign('THEME', $theme); + $smarty->assign('ID', $focus->id); + $smarty->assign('MODE', $focus->mode); + $smarty->assign('CHECK', $tool_buttons); + + $smarty->assign('NAME', $focus->name); + $smarty->assign('UPDATEINFO',updateInfo($focus->id)); + + $smarty->assign("CURRENCY_ID",$product_base_currency); + + $is_member = $focus->ismember_check(); + $smarty->assign("IS_MEMBER",$is_member); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $related_array = getRelatedLists($currentModule, $focus); + + $smarty->assign('RELATEDLISTS', $related_array); + $smarty->display('RelatedLists.tpl'); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/CustomView.php b/oss/vtiger/trunk/modules/Products/CustomView.php new file mode 100644 index 00000000..aebb8b53 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/CustomView.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Products/Delete.php b/oss/vtiger/trunk/modules/Products/Delete.php new file mode 100644 index 00000000..77a0dceb --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/Delete.php @@ -0,0 +1,37 @@ +deleteProduct2ProductRelation($record, $return_id, $_REQUEST['is_parent']); + +$parenttab = getParentTab(); + +if(isset($_REQUEST['activity_mode'])) + $url .= '&activity_mode='.vtlib_purify($_REQUEST['activity_mode']); + +header("Location: index.php?module=$return_module&action=$return_action&record=$return_id&parenttab=$parenttab&relmodule=$module".$url); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/DeletePriceBookProductRel.php b/oss/vtiger/trunk/modules/Products/DeletePriceBookProductRel.php new file mode 100644 index 00000000..105fcbbe --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/DeletePriceBookProductRel.php @@ -0,0 +1,33 @@ +info("Products :: Deleting Price Book - Delete from PriceBook RelatedList"); + $query = "delete from vtiger_pricebookproductrel where pricebookid=? and productid=?"; + $adb->pquery($query, array($return_id, $record)); +} +else +{ + $log->info("Products :: Deleting Price Book"); + $query = "delete from vtiger_pricebookproductrel where pricebookid=? and productid=?"; + $adb->pquery($query, array($record, $return_id)); +} + +header("Location: index.php?module=".$return_module."&action=".$return_module."Ajax&file=$return_action&ajax=delpbprorel&record=".$return_id); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/DetailView.php b/oss/vtiger/trunk/modules/Products/DetailView.php new file mode 100644 index 00000000..f5b7dfcf --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/DetailView.php @@ -0,0 +1,127 @@ +'.$_SESSION['image_type_error'].'

    E+omo{HJKfyO%AR4F+VedUO_Ou^C2*-5U~e$ibVFV3 z>p!vEce9%hlgs69#3O>qWUjRZ)q|0iauw~8JaL*))FyE*OYSxH^NJkvTeHa;gkh`5tsL+P*5!t7_) z(_=(hQ%t5lk(j~xGA$tiBHdKo2$J?bHa%TNv^AyYiil+0zrW`<{5`_jW*%Sv=*pju z_OFGZRi}gI+8%z#={cbO5_vmU5LlY0ss=EJ4Py>H{{>=XP{CXcA`F%C1 z75~2KAD;bwf2WbdD|_w3>)*#qLY3`2usG}U^P8>3r|$3bD(pOE{O8ZN$q%nykLP)F z#)n5nM`9xn`}>GU$-3I#hoD+g5`bV{m21r7mnT1W{gIh;za>R--QK_F7APG#df;@! zZPPdZ>y2%8R!(IEySK?*`STU+N2kia#|J!1pZ-I0(SZ;B6DK}AKew1?{=UD5GEbPt zZLEeE?&NvuOt7A}M$G*>$IkiAf7Z{iIlMjkxrCoj_K{h4fYA;L0H=>n?#tX2|88o- zlef3#f7ip0rET}`?|*#x^Z_7%s5!*3w0>umzT9hesXH})U!I(OzTyr)D@1OQ1jJ#? Y3^wyO$vwEH+Xxc(boFyt=akR{0L0TZ!vFvP literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/left_arrow_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/left_arrow_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..062f6e81bd23f2e23e16c0c663010bea4c7d8f8b GIT binary patch literal 1024 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U_S2Y;uumfCn;fpAyAOv|Nljn zOkg@m#ckq&Gpo;)<-Ff!00cQ+Tb`;M1<3&wB`Gaws6Q5(UcGI5bP7wQ<&6J-A1WLz zU;_e(ffChRSDx<;&Kr-|o@XQDDH`Veny- z(WF#Hi17#2PMAOL+RXcTwXRW8l1$B_M?C-k{ZIe#e}3n~pZn`oqM@dAr0jb+eQxfI z_}st=BF_b;PDpr=n3|N3oRsq8&s*!mo!sFbMt{tiFY`mxJ8f*p|CO4qeM~(1iRw|y zmLsZ?6*p%{wA`2}d1HozVo+YcZQtZ$lGAR<9g8DMWl*rd4k}#H1!pk0Xj$Rd0BM|%BEhO+k}n z&Nw~d0Xic2K~iE;#ox#Lo{pdX+cPtB3oA2A8!Iydsl)&4|AQhErrqHG_mu9A9Tvyg z^#a?<V=a#v6a;Km7myKac&tf5{c! zKkG9;_V4gM!FvDypLBurf5$)kzi$tXO|SzkPU<{P{`BRa7-y%wOj67vp6zyjl74)g zUL*hK-|zX3y>ll%JU{57x zMpLrdNu}&WwYL6pJ!qP6DpdLYrQOph&zn}1tLQ}gVZ zI4NE)8CefiFLh>)@cA8Cw$?i%y`pCQm7Oke_%Q!{$&#NlCF5f4j~9epjc!y7{;Rlg z8dO8njoS0(H*0+lU3q`;?{9lnd)vf-hslWvKYn*VJimTE&k~7q2M!#7Dvq30r*Cq* zH2B)7{}1o(w%>WrHtom%-{Obw$J=`v&Ta$(Na8sZE&oTu=zeAN$%Fq7?%lor#(n$L zAHP4dpA>@_q!h9Eug11JmEmWv{(m*MdVk%2bwx=>h+bGGh0)9m^6KiRR!SOaf%JO1 L`njxgN@xNA#9H2S literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/left_arrow_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/left_arrow_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ce54388462d2ff5dc828cf1984ecf123e103c817 GIT binary patch literal 1297 zcmaJ>drVVT7%$WzlgoH5a4Sq`b;BUoLbHKc0YP9E0S7~8jG?!s1KElc+=Kx3(h@sx z7#=cP2(G4xV{_x>Qo_X2v@37gL`ep5TWKbCJRB_`6#6*3r7YV&+n3z)CHMP1&Uaq5 z?`OQ{xo`hI91iD6Kbe$;z#Ji5NC%x^|*U4*;0%lep}-lK#Mn=U08DL1~pF$jV8BfZf*K`nNifJrFUm6cP5= zH|Uo{DWn6|TqKtz{n*_pu3W&$2_Lo;UvdM3=>XInhvv_Gy6md<2YJYLFI9ETZ)a{wcNh7B z==S$5Ih@P}Z$m?K6T4xK&Gdebv+oO6wE@JjdA9Z#qc(zU9s2?Ri^*i_DPWWRMW;AsWbe^PVQDZ* z<@QpddZKK(A>XvU<$7Ey;3tTE^p2_RFfb=G2ySZTS#2Z6KMf4wW;_8tC+;ka#j5~- zpzt&ZqAi2D*LDe8YX)uo&B>^^d#6{5d_?9c;_#aq?vjcu3`Pt5TrXhwtTceFhh43} z;@>t+9sQf@%^q>W`b$MV0YFVu5y!cvsZwEgb_O1*gRo;Z2@TD(z;>&3>>skgARr%e ztI(#$t+WI4qW`O7lAv-|78Jm+A!fldcmEVOw*&7Cc0?yAUIMaeNLL4;s1552L7eW1 zkuN^!(*NdhQ?s=gN9#|{S`2t7Z-7;55d)T61j0{XP2MV6sYF7?#}re>&-Gx10iitGUE!||BWTy*X~C-; literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lens_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lens_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4efb16b762d492de7fb0c3c2b4deb7d903f96d7c GIT binary patch literal 867 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVAk?Q`4*s=vRt_xH!w*VoI>nKP&7+_`hJ_SgOO z+fnrMQ)9Awe?loIL|aiofyRX^A?X%XUtT!N$;pXnYik=iJ3BYl|Nr;*&bHj!mbtmU zZ0zjqOfh;;Ckcs)8iSnm4}MnYGPty)ArZ@H`=th*x=so`u}I2pP#?~z?B4; zAAWxPtbX{p|9r`Re}4XcdvWn``5QNG?5q9t=jCsp`}P|f8vad5NO%HLcFq85N#&0R z|5~T7kCXiK@9*rV4;Q)Y4!=eM@DRL1YAIQZei!N1%)c%YiBs-B!^ zDSm#=n4`1f#s6PlyFdQjU9Jz()YU$Hc5IyE!FOkFZszeirNvcLRP^fxOdrtpgo5uM z=H%zUpRi!v!gB{sA3pry@$vri_5c1n-COvWt$D=?j^=4Q-=5}VU-!56%cryVPdi!N zyWgdwcNk_yi=l~$>Eo|ozHqm=y6{Q>!M%NzwT?kSUIz~x`}hAB`~Cl3r%rWq6l^k* zv8?-a)-o`8`TGE8sLO#7?&5m%%hbQZ-~NhB5SnDTDfPp(iOD}cKC?W$YA*ZzdE&-} zf8uf~C4uUJsp3%j0bt1K)ulZA{qNh^=(gbN?+xDU{@T+R9y3ev$XUOL_diemowN6N zDI-|@p=<_bX6D1prsDi^X>H|m{MQ@H>?vqYeEwCPr{<9nPo1CHAuWIZd`MDK$~f>{ zsayN|mc4H+|NXBz{_%^}ApuWIHrGtUNQiR}Nwb}3*!+6K#5YfStLy%yi-}w|O4~3= zILYGkle_FNF98D;6tHP2DJj5Y{2-x)LC($1jSraE&D7M?>{dvLeS7m#>rua7Irrv& o;y(|b`ucX`E^kmO`~RPrLEx+6y93s%*Mm&+boFyt=akR{0Ctb5;Q#;t literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lens_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lens_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..fae7878e92b21abed3f090209831e92c9dd48e65 GIT binary patch literal 1679 zcmXw33s6#N7^QMi3-Z;bhMH+hJ~Bn^VVfalK3m6hODh!?S!t)TnjR=BV49D75;|!{ zOig8`rDdh20!o%|+e#B9UuaZYLSpj1cduq==D+v;GxwbTJKuNa&j||+K(1W35(a}I zg981+p|{1tGJr$Raf-JR27@0A^27a^c#TN%S#fxHc)p;Z&oKVOhh-v>XgLA`o=4N2 z`aIQ%)F`Aer@nq3NdHKcEraMV5X|fOeKpM3_!mB~b+vPJH!_2ze0%WGM^30q8Px{% zV&{5d*YTD!(ml-14ZZ{I;i$N-$9?*+4~mvWHZj98HYS2%>*mJyiHiEz|D@{OZg1M` zltdvN13;Zd>WV`BhYt#JJntP7Ga+Z+4%=;b-VF~I_j_o#m^rHwOi9jH9^g2gz z%FE68ZEafls~h$;Q`01&r{~*4LZQ%-u2X-Pyw@nOH8CyoI-%U0XKii01^_iLw!YY@JC`EpzoE!ymK z -Y>k>%$DoSFNXKAv^n~pH9K6~c9VbxMyk7{f8g+)gEy@Nh6>5SRWq(c&jJP7;3 z_#F`VGEQ0!GlyAHlAp#-7fUN6Dr_7bo!q0MqR_@m<}!L8BKfumJ)h#y0}i`ZxFIwl ziD{mdJz{eQ`>C}JRc{9mY%LR3-OHLPFj&rL>NnKu%)e-T%-X~&Zippk2cOWnLNkVp zW%Rb1@NEtBd`gRWaq61OXY48hgFCj>o-f~ed2$A~#X2tfz|D;je#Oy-jF};mhy9g$ z#&Y)T+$eCtXp!I3YQlgD;qSQt22Y!z+omqp>D4p7;(Uz*Gn?>7kD63t)Gmg}oJUWN z#=ji14&NIeZhGAdq@^q!Kk_TX)&LgfZo`|w-qzpj*R$?M6TdxS(4f-&--83CUU)M8 zwv~jsjr5@aGk7l9KQAb|^SQ0vtKMP!LfoLyG^VItXJ#3#M|X60%du3gGQXigiTC&S zUmK4`-=Tw`hgPRifHfQ*0045y_D%X4sl+u_TO1iylsG$OD46cPvh8PMi96|l=mM)E z6jNGW?wktDed^Crtf!@bfKF4<&*7%3=Tw?^u6VAFtW>abS>l&9cr3j+RX)!txqVUH zC^xrA7;VPATD~-F>YQw%^~A{26Aj?_vI-7|*O_bX3N%wyvnUU^nKipRJEr- z5Kw4YeSfoMscP@&md0-YwyCtbV~oeMj2-34KO<@~#gU#NOS*pb`-6jrV`KK%<8U|( zgUycd2@K4hP{}3hZFV*ACR%kGR9;>_%5S>3jvapLXSolP&D(e}@)Znet_S%tXJ=u%u!;gyMR>H3KJ zgwe!v`+ZOehKn4c-M|It>PpqVZ~?wz?d=6ujHDK^JZigaMyH<%V(D%Re(&C^%>C5T z(#$#5=I8>4@WX|ja5?my*>vftO$|1Ms*%1AfsfL$7T0&vJ7sgfZe-y+cmdaJIQSjKYK{4%dAwOkyt1{e-PUnKAHTi3pZ~n8OZIWn@n?n3*@W=` zX8S<$x|#X@F)m#ro;HII;_((U-n18x$K*^r9_yi1^($8__Ty%Uei*+;c$yzLqwceI zpY-)TuDywXB8eE=O(Qf29BNUE|M@;;Fw@e~Ec^Zg2DHKRX zC&t6g&8<$-6SgKP>HbwvqCbG8(?Hc`TgtTX^=kT$F06q0sM&d5806W7ebC-ezX!gA G3;zS(hETx( literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lens_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lens_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4d4f4023ae65bcc5e37b9345fda5c93622ef99 GIT binary patch literal 2444 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 Q*+P1aj5FD(J*S1zf2Mn6YybcN literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/line_graph_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/line_graph_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..b1318c7279b5a42035511378db0c97bee38365fb GIT binary patch literal 1209 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U}^AlaSW-Lla#Q)5Gcs-|NkOO zCaiQ)NrYq{1@so8{ z#~72D!N$3qF%)tz5OBCS|3-$(TBDewu0^Kig<@`tk85m7E)D$msFu;dnBh{9K=bl% zeWwoIVEY!$EwgAtZ2kA%4f7;TPptpA!q7kVCu0rRG@mmY1sfCu7!II6_c8R9x)wb;Rzkcyg{Rg1u{{K%ot1Z-E zz{7CS*W;A>7Fi!(-tYTU1SHZnXy3bKuEUh*q*wz0$R`Bj)aNF7b z`$l_yed$fiTf^K{2??gABa9&r?3tOHdHA`R^-bjV{r`LX0CTA*Gcz-ny~o7%hev0Z z^GL7XpYY@Ov7-kRRE{broI2N#BL|d+gr(0#Lp}!siH3{*swIMK&Ds%nPqN0keVVP3 z=C!2xl2plubszRM&v?Y#bGuc-ed_Wrxt_~}j#wPAcq1$D_(j&)$~QchPc4#8<2s@> zui|z6Nqw+~oI0QE|Nq~(=J)6Mj`1yX4+c+~`tZoya(FJT+QU=-?|=G_Z_nkM z+hxp~5A4t9S<9YhSo2gQ>Bpbn@`tD2|1Yuc@6Yoe*rjStII=)Y+}zN3Fs7$j(PLWg z!nEJ4ZN1<38>FnUJo(}2Ve7UcW=A&dLO(X;fB$(V``=0bp`&p6!()5p!^`9UOW6Hw ziemW8IEfV!V&H`J)Zhym4hEfgU#tlJ@W z*qq(V>)^lu4AeRMTii^fgac+D=4vx;iPGfaYzxI0sw($~Vo|R(StA$PP+zCKC^GHW&yT zSftVM{MflCGJX$)>W)ma-V?QEz8UkAi98H9<=0tn$g^(euKoEU?l4PJRIla3ZUO(+ zB@8cOIBq_ zU&m^@kZbqEOOuY@xLLk<`GX(V|JFEN6`KLp-gN9BKU*6x93>?G8Q<_OJg9or)k2~| z;=jPz^dFzQ8z26!@2Cub1WMDd2iDAo|JU=JcK#x%!Tw+3U)}E`2Y>)beBcKgmz0>6 zHto;9zsIA$pYcl6n!&fRsq?A1w)X08^X=>3K@#kuX)`St!K%?q7iNZY5_1bL?frKh OWTB_4pUXO@geCws2q#Mb literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/line_graph_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/line_graph_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fbc3116bac1fe2e7d092b6b29cfa16b9ff55ad GIT binary patch literal 1727 zcmaJ?dr(uy8jl16(j$nM$2mUoXf0aPF*(UqL6PuCq*#YyP45MvSKPX^ zlVGZJ%<8mdALzB`^+s)}-k6{@l{z1rMEURS-pycSFr_Giads4dKons{-~kqm&^y;> zb3Jfq@M#Sx9C$Y@`F6m98|nLKP%(d%zlz5&-sv9%V6b^&S@TMlfT2(znrPrfNsx}t}<-c-vV z4H5N2BtTojq$>o4=X_x;Y$!K$c&n%}l7FjZy6@E+oM8jQB;mDCf&kE!U+l-@60;%z z``@iaqSIkSP5SJ%&aQF=zg1x+eX8+;hZGo94ZkSmf%_*9VTv5_QOe=`>2lp^i(2S) zd#aodEC5s2pbENeHSMPQ;YndcQe7Bli7h289>T0u^ z*1n!;YHA#|uO(LNZ?ZrC=UWNeQ{C9n!EgPKEHcZtS%G2POHPRhR#c$pC)W2jdZH$` z5I6IG{gIAuWLbsL|LNzC?gx=7bfar*OxhYRVd5-VoUrM-N3X5@u-fUm%7r%jJ%qG{PoVan)he@QVk`aA7Kjj; zHyRt3#HtIV6h@*mV8o0dh}!G3vwQUivN;vGfi0+cg+Q=3cBVKXJC)fGpLNkW($0fk zu#1#fj)G#8hPj_jiAvUmC}S4U5~FGNKi_Flqhp?#OY`a6nSG&}lTu=l-zniiUw>3o z;yF-Tb>8`?Q3hqbx);i*i-pdVT}6wg!c_$>a^nSI26C}y0(qo<-sAH4csS1rP_J(C z4tR~T=s{=NqyfIt0J~kJLH0^U;lzo%$f>MvzO&8wb`cx6p?Ja8IK~kr1Gi{ML6OI2 z;_R=ea^Co&4{E&Lf_mjSa`!V2F9^TlAw4{z%AtWt(pRB~q*G-fNV+nc!(l~W5~$p> zQz0ei;k8MXF9syt#rH#bW8XmSj_Wz;Cw^fhUDO8={@fUxJFOPPx(9k~PwokcrWbgK z`tj?0ulKi0&Y!Aemvc+2jq?*oL;4Q7=cvd#L<0~6K+;2<-yf=tkGz2c0EFgq*MuFn z@&#c{y9QlmNqK@P+29;`BN$g{)WQ?Yulo34^dx@xpoBq>Ig0oGe+2otEePe4?oQX! z$d`zAmMCq#tHS7fFw24fDdc;fQ+L3@idX>m`bx_;FM1ST*cBWf4=*qKZ7nCPVHo30 zL_PX!JYsXCAzF7JE+<@fMJ8xA1KTSdUrI8QPY`D>O&%6uk)P_ulV2 z=X~G&qNTa9uwX+002DUuw7kLZav}4?{Hlo|I{@x(vY7WA9dGxfYqYJmKT%*M@ z(ip(A&FVusovym0^CLrdD(Vr1mNZ6J_rpsE8z;`rjS@bek0>uMm!3)RXkJLYp~vI# z1m{LurLTMI+Dt_w0-Rye691i6BViLsgtCI-S09o3kwuzL%KW3P1D)AhN3S8??mggL zU3S7(?jGxj;L?&&>UOiX6uq+f_$_*u^tubRrxGhlzrqzenC#tp9649UvurTKH6$1c zuMFNA-ClxPHmJ*hcc1Sk0uFINvn;SQ1vJF~%TU1ai7_;UmlxsYGc>($%({)IBa|~? zC^DJkrn{Q^J1)K!f>Y;aYk%%Kx&KJz2UWF(#a;06lPzN%S1fDiKKERH^wO!&m-GEY z!OInivIjaTdFj9nnNTG&5GD+Sv2F6#^lL-DcxWAZ55#i{p|~Egmz9#XH11XQS^~EAqxFE5<2mqc+O1 zeX9R6VoAOKx*G+zr0zt${MUHQ_olx03=Z}MXXwa)*z|4|y#0^bqMqm1H%w@!dWVL3 zbKky-8urOuk=4J4UD%C#@wO?VDBL+z^XAOn4;KdxuNv!WinrcXfF?6sMrV#tiNs{S zKwz%rW!)xF7UpI&2zn`61Wa);P!w-Ijq~?1SjQw`d0`$Rr7unkTt0Z6PN(y+t-bxb zZ)d!f)+hAFTIV4S(IdTc%jR4 PSU5K|G+TbGw;lTr@{+hR literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lock_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lock_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..10fa96cd4a37eb2ad2e3dee8f6ac28eb25a7e05c GIT binary patch literal 1408 zcmX|B4OCKR7zP=lc9~)`Ku=T4|4K!-w4=$-6w~8O`|+n4A|YkjAaf@(g%rGrSei|% zrN?TkY;~mETBfB4X}Qp_wod0*Dw?yu1rC#|Aa@to*?Z3S-E+_Pz3=n9&-=cgG%Ym| z@8ao#LZR?Uo8q@1Uy^k>IU@VSp^Xp1}vi$t~0QO`U z>u#q&tE|EjLvyn9QxEFuAT{EOf?>{me_vnU3*H36%|4})K~GOVS<%wcqMdo%3Q&b+ zHl){LREC+yL0(@a_ETsr+UBX;i^kz_A|`X7>il^hEMksAp%84PiXzGu=cL*{ zuVn(R-f>)Lb_%C5>c+{TJG+YW25QM*=UO{K>Zzx+e8MBjWr%_N*TMO6#hFhtR zZycN%UgovFa8t?bWPbu0jb5m(uEu9%WH|E2d-9)d(udT3)0&%7VVz{BcrT`JyB^S|@yu-u^E?0<|wTlN*z+*ub=%W1OLtmDh4I70 zm-0tf@=NAd)-@+N$0}CqF`xMmJ8I4fu1P{RO)$6Q!{x#7<-(^>&x_^OY*L<5+-c!% zw2`pmYUq>Bb_u>bAt`Is1bBuY( zeT?+vn&4)a4I|r5+OR_~84})ewWVJ9jb1lS zbzBj^bWG(jK@p6!06E>GL%x4keVIu@XJ*xC<(ofO&3ipxu7KgTK~I|-BTH`#!>C{w zP}kOy+S!n~N&BX13aIm@^6DEK^EEDyhCrA|3Uw!PwWJtwS7>+E1@zVD&l8z-ZJlx0hoIAY|EU(iOz2T8cdk$PppYu@~ zkkA(xRETEnS6W7E240;jF?4tUYS;KM;W1F|HGh{|k)Ib5>d_wH@`oW(ariw@6tZZ; zj~(j9D`{>CBQgK%z7;{hcRIXEZad@o9F<*^!u-JY@684k?)YYdYux&ctm(tKO_3L)k~1!$oX2htt60@tW$_G(YpT z7-j1|=$D4{I%M2LA|b_WS~{l<``%)lA*#m5d&zOL$vNd~+OrLOhVmLB%)LdEQHM04 u?aAXJn)8s5JT_aA-O=D|S%P8M+jfRQk=|1A>skI1>)oV;)cAG=yYgR@Uy*A7 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lock_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/lock_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e66a84826f54d8dfb3cff35b5a4af2d494b785 GIT binary patch literal 1734 zcmX|C3s{q76#lot25dvFF>rDjpjd{Cm10r@q=j0DBp^y{Oac=Gl+-E2=7tjz1r$38p4Cbk{UtF)R#}%a{)c4~82I*vOV4_Fh`9`u`J7?+%g_?<3gc*k% z9UZOh?d^CNiXak+2s(`YXef5&%9YsUn~l>x4MM$@$H4ZQ97$<)e72oKZeoT z*3S<8@u8?7A<3T-Mx&q$;+t>Wp)$mC^hHW!D?VqjT=LlLi+TXK!b0P7>cH*7v)acu zvT^aE2&z^lz~PE5rl~4{K){TSmdWJui@e&}{^)JnsOhQghj+2j%k8N%4Kwqia z8HR-^XUkVK)z=UE2L>wivy(d)a7F76-`@kh2uB%*TwPs-A5{2Ki-4_8t1NSO*EiAkJyDkYu;oH{V`F1j zk$LuHbWDt#SBbC3T~c%M;HmwDq5J5(nS2L@GD4ZA(kaXLGNyER$<6YI^A?^IQa}Yk$+lMzhhlM4@5QNj979 zcfGN9iI5HtUL*HTr*z&xQ|Ooy@As_fthW0>D*aa}vm?7w4N}Ri-_#E#5f%Z+s1`d4 zAP-0#k_qj!_lny)>U>_lH%%HW+VDxVgWWH@23=NqfO4WkJdulPN%!uj3>`?CRwe#r zht@+ll`OEe)KKzzW5^YL6Kns2k2vF9x@+Nk=PZ-rrcEj;wg8|gP8x3AFYRA{8N2&s#M=gp4Jv znn>J?Ma^sJOLzC!Wm0u?>PI`hgnl{j%yU8TI1fa`z}QGq6A+uHYaS#Z>->p>w6r4Y z$@+P21b@*^=|=@&$N?{%^Q8c;z-B!@^5q_M+UGB|K4@Uu@Qd$vPGOw>K%u)@;xdN* zKja&{&0<#TM~!qW1G`)Z2$kI?;8(+-)|L*-Ymny@;k!l*^X;JwC9*L)4zfT)i0^&# zz}DDJf4qHvk2+=!UlVl+E|XnrcUc#5 zW|!}Xt*X4dTm>ua`f(oUxNv^;CN2qH fi}qK)npYA7`JtZ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/logout_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/logout_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b5a27344ae4a5508c06566d86ef6c6a3aa1c168c GIT binary patch literal 891 zcmV->1BCpEP)pIElET{R5(v{lYdOqWgN$!I}fqeFJiT|S)FaJ-L-#*c%8yP23< zd-dFjU#hKV`|SICzk8n7-tW)*^HmAC9x>K5Jsb|`7i-k?l=Z}ai)@eww*jmcHZ|+Tu1uK`ZK_GbEbNv%KmeuQ;!=?qq;X z9b;sk;0zv?7*m$Yzb%g(j~7k>7%9dnXT;dwJ^MFso|)q%;Lc zZyzJGYmx%*6z0Jh>?0AplXD9IouwVIt)9En~y4V>jn5q6W#6>M9vWfp!%YQC%*5;_YW28 zE4$ca>n79LgQ?L=N8pb;7PRk6z%G{rI23@$KFs|x%4ZK>Qu?sY+J!+TkuQ_jC6j1V z0I3Fa<;{pM?F)dcL)=@|$Kw^lq%@8ax&0R@6vb;n96QR@g4{YW+3dY4o%C^f)=)!Pq#T7zvTQw{1>5lvC|^;Ug1ol{iS= z(?XKfgRbfvuh|A!-|!phrviK;y+>!D==?PMebZD9jAN+vu)@+^7yX+>LT-(HSw`XP zGa28oa!V1pKNl8ROR7gv;mU&Q=WgN#}X_Xo)NvEtdM}gGRJTP_4gG&U4%Cs5} zKr%})R6HP#Q36p}7FfWA1-b8Q6+ywcRE`BiF$TBV$Hnr6QJo>y30(9wU~ ze|Bfzo%i!T&-49$e#>cTY3T?Ag8AI5dNIJHNt4#F`%gP6OPRY@_;`VX5T7}UvBX(| zWo~D%!Xp-|ypyroCj;wz&%)5}9E|+W!$h0~)4*)354wmAr*mK$lJ`hoS{bYHtPG&7 zt!?zaL$JbN-ziuGX2LA81V#xpFiO4w)AR;dW;SC}ZX31~bYjQlZv0%_1BbF+94_yJ zTV+2y6ax@e_u{y`6?RFbSR=jCu7)tcRC{sa(jQ%67Mce={{jd+FM&H=0Pa*V1pe1B zHM9=1W1Fxj{ZFjTx(BOE9oSabg*_!baK6?DubKgfZ>SK}^Z+h|(Z%NgoAx=JNn8Q90h0)M92-0~Qcq zRc0H^b2{*SK^K0atzz5cSv`P2T0u0eAnDE!BscHFDvTa*WCeOwb}$ynz&WLYb3KQV z7kAHx3ejoq_*#6(Sp-077q#0q9!o zcmg<*LV&ZQfP?Yigk^XmP=V=Z>hW>n9T;WbL-T`wu_><;c2~NwpAP$|q939<6~Y^y z1JJXwB|ruNlEJyiGyy)P&=yzW-SB!WNo_`x>M?)aEWQf1lqi-a_o{vfm4lGdlPCN! zgpl!DGz>VL1n$?2QGjC{I08%zsKT7+o47UbNPW#XvJ}=u-Pl{&3m1y&DFUz?$I(GQ z;|y$I>`MpC1Ja)Y#8OmCFild88-4$%zkl9`(*%fV8UlOQIAmQb8<>a~AQ7B%+9=>a z40ObDD0}{X;mz3(+%Ht~U0{*b1X!{aq=7s13_yS!bv+MX3gDVujR;CoP`zp_z#1kz zAYsf3qWLc91XZH0_r(zBtSUZ9tP>h5m}6lLV1sxT~Gt|MS=6a%y(g;SOMLb z26d8_OH1$-IcX$GuER-U2?`hw*ftEH)KC{R0Y!XN1r*hHq}O42p%o7v|A%Fv#p9%R zqIQtqf7a?TTeOt`R5D5pi|QyKlB`PI*Cts5K{TZ266kr6E{3DZYukgg&E^6ni6iMvmMHN- zR3ql4v|u?&Z#_wGGdbx8a+0IG564J)?CCv9$+%DJddl7)>0;{xun3Sr|74b?wuk2e z1H2wwi|LUK&`-Jx16eDKFSO(9-#cMLPGZX7wXN)fZNiv=!$#(Nd;Dsa?sA8PPXf#( zxiE?-fnjtx4C53qOi;owxgMsn+px@P!A5?3cJZ=fGvOEJBY78Gikh)Kz8H(b$}ek- z%#oo#`9%KVS@yo&^L8G^r@Otd(7^|b9RpzC6pYW^!m-jL8ee!PVXZKohJNO_p}#Jq laBzmS=GeHQ|0@5s{11*uF~1uu1Oos7002ovPDHLkV1l*Sl5zk5 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/logout_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/logout_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..84126723451725f0f9fce995af5aaca5891908a5 GIT binary patch literal 2059 zcmV+m2=w=fP)pMy-7qtR9HvFmw8Z>XA;IIh6R(F%fd6^ZDXFk!+ZdcDj)Kb408w6wI|dn&;d3TSIcT>Md8O`7I6aRktbmhRS3)IQ!tA;{m>w`F-7emSpgj#9q}tp!7{^jp0Mzj3V$q) zErU3|3gU#bSd>x^%Zz4NWnIA6M=xSo{w1tD*$tbbpYZq6o3O9!#kW;=u%Y@6HlOW- zOHChKYwu!v-CcOr-iBNGRjf{{#)8<2o^cQiFv&6GkfDt;%tDV~x^E7&+|nT0eh8xP za`4QqJWTXGg-JnWm=b;#?@F35E2$M9W^`bFP8ZDbuj8vzH?gYZHtfoKv7R6p;Jf;M z>}u?XS5rTHW%m#y>w|6j8T?t&q^bl1yk)iaU#2@EFx{JiZb^V>Ybr!;83d3Gk!LO@ z`V?Yva2fO?Yw%wDIeaL+fQ4Bbr@-vhXg23`rJxVf^h(E zo2`WDK05V=7&(ATG6AH^0d^k4AG}XuQa}mb3}*=&F)yVR3l4YSi`*+%UicI2%5Gs3 zDd16m7e43iA>{lZBm}^Lk6rs&fCwk3-K36sfJG}|;zy@me}DkupH@iFhrv64PSp@qSVZ{&MId%#L>9Z^buoedrOK2!Jb}PswseQ^4fTA>?!qTDi4bj*swkl2l7N@@SK#faTFgq2!8EG_U4sut zzq2B}R%kyiw0+G3Le3MY12V4+Bby)?=m{xUMhZ~gos1E5atF zwgyH4zKu}v0_A_KyFCf#dxw5kaQ<>&akF4ZtcYd+lcg|a1sGt|3zAfV{l5VIMKZyV z*qk&Pkv;*K_)z6Lgv$X&yg-?NQ}g=%(%+qeeWzsLGz7N}JOMzwgaBv=IfTi*fLoEg zKouYcIy4ohMxH_Y-Ji#$VsT+IStsF+X&AS=dhOmQpge6oOm*-tpPn1 zfU#D596+0L#xl1Y&xBZ-2|SY7oPGm9sEQY; zC_n(u(p3CoKq+3Qp)@VF5%V+JF!alRgs+($tb{EA@IvA?G7~uO2grh11s>D9pr}{C z_#2q80`?3r<^?JMR2$EDoxltGPSZ@N!n-jIFidWRZDBWtAN?1maTTyBxdlgB&3Gno zz5_=V6P}E0!#g$Y1NvM83V=~Bh*wR)2*C4x#dw7P-XVb5i7hb7Xoqz{H%uu7)+IOL zP$^%@__Y2cdqmryFo?JXd0|m+L}F6FoAv8FpepKIIfZ|DQ6%~s)Jct6TZl7g;h>FzCPB8WydN1 zh1X$ox<~K=P6HPscZ5sTO}G?ahIMK+-j~#ttG$>gu4d2q6uQ4*=hZiL#b!+V>oypy zcE^l0J2BH?H)cEe!f;an=DO_1JlAl1A;&3*=~(jv!{MJeOlM^{{f_!g}VmZxTydD002ovPDHLkV1lPMqTB!g literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/magic_wand_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/magic_wand_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..aafca565603e63b80129ca469c14846b45573ff0 GIT binary patch literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV4C3R;uumfCn-gNX@lQ>y?1AS zK0Ek)zfb-*wdm7Irx}3?|Nl=?I>x}e?7Z=lA3H6k{G5^cByHYm*J;cUxg+VTjUQiT zU(@s7(js!E*V>-o0lR zsOg_xprm->z@BWq!^idGCF}nEJ+AQM|L%sGvy&D>t;uXSGQYnoD*nAu#;TP@KxfZ? zcyX~i&w06f=?{MXp8N2Ae?HHgH9kCd^z&vywMelA1qJRw)H+RFd`m=Eu*{w^`kzWP|f*H26R&GYVk`StVj zbKfKrV*>*Nh&q;o7X=**L>LZUZrY-#s^ROHWz@sfa$bGXX6q$}XDd&=j^+AYsUx_N skx6vJ_qvt7wO6?Iyka*wAP@2%Gehks4eNK8w7?FVdQ&MBb@0N+bX=l}o! literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/magic_wand_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/magic_wand_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..5f5072e7a19bd826396e999069fe15e5bae8d7b5 GIT binary patch literal 1133 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U@`G@aSW-Lla#W6VT0d(y>}-+ zK0A25-Y5T?TJ-6pU}m7g|NoN~9bw{qrf%W5S%`L(qXDZW+t+a$|GU!g(Ra!c$sIRyjkgaJ=?VD{*v>IKIW$)^lS3n zGb+fd{P0Tm@b&roCHL*AK761yN45FNL{^^oc-!et!&)gh|nzyf-|E50y&o^o0UZpPvH{M$3Ux(h#i{%l-hwP)tR%U35ldU{T5oZjDm z@KVHl$A=Ge+N#&zH{SFAV|$~cPorb+d{?Khx30~G8ezp}XSl(x;^&WjZAaF!^UTZB zMt{mhP0ev2S1MkB`4351$r4FR^bEmpwG1Z?Ws| zo~(3bzum7Vt!Y0ttM^MTJ3H(2hwGLT8~=VcZ=3zx-+0b1)eWE4%<8}RxO1l!)aq00 zlY)YNojkdc-QxfMXVrh7@gAPPzy4vH|6H@lj#o^Z8ok42J^cT@pJ%=$%lrLVoZSsC zS%F%CDJz5VOo63kWh1}*ed9GT8z(u2`t~~dgtR2S+9JubK3CYU{>Nb*mGZwmM)vy| z4&RU8A7G>p)_EwKannN`oijZ0_v#aV{CX>Wc;@Bh5_$Gj|Nc*O|JcI6_Ms~e5X7Gn zd-q^>&9T3eCwAL6VWZS~m#~A|CZDFyF`CoZ*vJU6azn$cHe+BahR8Z?Y`BHQZHji_J}fCA0m^;g{Iv8T$N^9uD7|)c z_1r{NlL!?3@#`!1;dcJ_l6Eye972&zNCC2Y+FDkJ*aPFYufn@2@$^8EI9 zcfS4l`1p7vFb%f-|Np;U{W=rG9-p%tc^ecM7!EGqa#*ov_KvB=7IUWhEa2p2`D8ZZ z#{K8a4jhSHh4-$dS{9v)(R{mf+UMu5Buc+B?z(j)T69I0^fu8zQ5n(&ApC5JrX4t~69p z0R%7L@vbAoHm%FUew0M8Rqk$Vz^H+ftV*Yyy8O zQDzQ#8|0km--Ulcth}CwS?{)X?WlaJR4UzD@NW0uB0%;}zo&WZs4Mg&i7}^kOo6av zSMF_x4LS))j5>6I)GxKS;PE|!FCh%Xsw&BqP=1=wVXs&F+!N2E>T#vmc(4^6cv#db z-wi9Ui=bKJJT9D^qQT`264Gm@RijjOJRXxuD-a`wfgOi1va>Z`IrbLn_pAIU!|-kW zC-i2nWy(mQuq1q;hvc*_xvwdO%{B1Oja766?eQ|w|jvmuS?Ot%ZwhOlp3aAOW^rn0TV&n_+POOyG zU)UfkE2H9R6pF0ya)4}TddZv=*E&^=sC#3;CXR$>Rd0D3s73e2y|oQ^g07h7+qB|O zY-Z~O*1KQc&{;wk{v8nvWzQ^ydvnZW;hAP~yU6}nIX1$SF*Fpy`qZTaoZJk8loUE@ z8?TnymdQZ8E8LcC@(5@wvKj^*ep&0j!Bh>dEH2KjR^RtxgfTo*pfm88(ac$;S>5r0%xcerm8fZ_OkTGR zrfu|>>lCj;M8x>;l9T>(*wlY<+cg9I{hln5NY|LDI!HLOb0;Arc7?p^p@7~cRMB^f zEVj=46xFtC3dNCCwCeL^m#*@yPTNX2<7ka$XmFlFjqAGhuyH$GB*di1NK*!w90g{d_ zDu;pG#6{(MAou8^@)QuhHJ!`lx}_pc18s}S0wy;w_*1ul8MrxAfdAhcL=^`Tr&`C5 zaQN&p%8(#z0keRp>gb@_qf4T_^kEDSyT+SOjTl{X8DeZ_sFLN{EjgbxaKS!0`UkA0$ru881PIpJVM4r^VbCv}ta!1a&2! vo~zib;(B!rbU<)xR?YPnU31E9@5hV>UM;!*Yn#f)KHHD_Iy&+}1h?Qn*6Ph# literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/mail_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/mail_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3d58fbb6582602084bea4e5844db1fe630b54efa GIT binary patch literal 774 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU^?sR;uumfCn;e8NQ&YA|3wmv zU^?l`yuJT-E3g|MpFV%T=e0k-?Jx5~R3s(-_&4+L?Nf6eS}SWGKEI#i zlW%-`VSM=h{(4D>=`M#4ayA(7I9$v>uxjs%XK}Kg1)Yz0G*uND`|T=(@~$i`u+`7z z`4$=Ae`WH!&RhRAgroV+?ViZ-@EFj_|Nle4+67z>K6mP9V)1#LV`^1$)SyJ2p{!zRwxk71oKTfT8pMKg+>~ zoDB*hZWmWie8{lw;iY8WzE(5$P6)LH!mm%4!W-r5frM8n%3I8iKVA0xsK1RK>UvMGyNi|*&#)L zHrz0t&U$-lnMQEr%S#7lFfH=h+w;5dj|538 zv3@>}z}^9-m*4Gy!re+k5|na55x1lrmS5BorZsYe{Ftv<-R=+B>t1G zbm{*-`R6yg^vaVn8XFrQ>PuhOhf1XYL3%<$g3@sYHnuj9KY>B66fDmKVKFm^<_eva S{mv2z;(NOKxvX%xr1tD+ZAnV5cSh`u<+NnS)>b z@YDW!$-MnF#}6ECS}D1@d*g}E8w`wWYW_ApeAK?5M`_O-p8x;;CPSV3^Y?S}!~6Hw zOKx$gl+@ev^T>xUmxI~#c{SU_?f(gGd0{W4d-CLw4R3!Lw@u$aQ}T*yg{0k|Kc_!@ zKc5c@FkslE9Jb|iFpy|?xSfqnO{uJ~QtzCjKA*V$+WjR{7oEGq)@NL_{FK$V6vHz-;tyFtX4xFx$kl8h(sr>w$4lJZ`o{G4 zm&!H2aF$Hi*N~}r@^Aj4<_C?!t9U$fB6Dt5@Yvqp^10@GPwau{$NA^hzmWQTb5GHG zruF9!&62uYpe!aB?D#H3k{#?wm-A3ZPH#04Ts{9czmWJtCY?uIz8M$m;V|&@e;xSg5+XYB1UJOJ z)?5t^JPrrb9mK44UDvO1zvNxP?rp!|wA#mD4!)k4Wjm~^eR7_c+Y0+mG+ce5U)Z-o zqq$&3@rq#9g}nTC4L07fELF@g{QG@|fw5k29N4Wo=kIbhC@?TQJZ!>UCEnhr)|J+w zw(^gs?~8+KJKnqK{&zeRV_4jFX4GJO$y3|b=A78N&@-}D{Zm6s=tunaioWIxPul$lv8+qo& z>Mbcdv!e5FTCv<}sW8*9=bg(B`ADr?Z+)3_66eZ-C!a)Zzz(#zbdVPm;}`o)W_>Ha z&|La9g?qP0hK5vV%n_dVEB{F9RJ%-N<(-%iy-fF?Z?EW{?;?)aUPm^M$!cmz&HNk4!87C$`y ze!YZU?XMFHRMig^JU{H;w%-1~gXzEaDUtzZ!tCPAKrrcHPeJ>i^n`>Re}S226$k&} zi@(=P{_7|*{`2>5HzU|-O)MAJ%kwZPa04?FtC$;e*bOGeEoksPt>O%p6Bs3hd88y4o?0aFTwM4spP+!zb8KY z`VPxINr^xHw>$dAOn7*^K8?-TGp~!Mozbo=jjc}3v2FMMdT0TZ6!OLQ$I&0Z#kE6y x+?fAI-mC-0E6A>tl$0k+S|1uftVS=Vm>D*&ch=8|Rq6xDd%F6$taD0e0szlLOPK%w literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/mail_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/mail_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c976f306ce0e3c3a87526657a33a780290ba8a28 GIT binary patch literal 1882 zcmZ`)d03L!8pl9T{BTboorKiP(MED9nif8l++vJeO1q9Cq0XqOWsYQ{h$voj!^TWU z%Tlu}r&7AgR<* zZa_jH5R{KM*d0!v3eGGiWrL{6fmR z`?y^u56@Sz-bKwO!0Rk4ewrj|t)8gtYFrOe0j|tZcY*;udhKJ~UCwjkC}xo|$c*~x zgFYm^IrMxvAMp#BNaSK)^ng|C@V<$AHi^nQ>4QZurW!@1it84lG6+BiRRwbkVV}Za zb5GH7d_VHIu{Obi9+M2|&YMqK*VDIJ6DktfTqtTd+@+0)sJ1;|UHsU%U@rcVMFv`f z^JDKeeGoK-4-a@X&2A_Nn+lE}Gw$Y}^WZg*+uM-Yo+ks+%Qt|=-{earokYxZcM#I7 zeTMBQ&11T2`?*Elo{*LtTDUpJgS4#X71*^CnL#k!C##_0-SmXd=l{`y`<5Jo_<+#E z#~lAz!a-{VBFmgmUr0)eldcwMIeSUd&$N!#+`X49wn(yd6(kdGl{X%MJ)1CD1Efc& z`>9+sf19DoS7G{WV3X7Yus*)i^#p&K+cLgWCvR;z^yN+iTkxGpHciow_ zY*HI`WqDa7AL$`+9UTB5PD%lux-S7qek7Xr_TuO_ks}PILfbj7dT>!ifqwfY-+3W)#Z+PMs2_U88tEVT1Silf#B|^EFlRa$dqPc|X2!T(9x*Vz@ zeE8H}7voH(^c7z_*k?h{&c+VxQM|EhxV@5xfSxsrYOTqrgCL5M>}v%{B~|3rMvzQ;H9=nFn$)xo2SOLit8!X|&+bJ5~> zod-Bn5K5vPeM25gt(qmA7(j_jj9jY~7q1nci3t0Aw==;;sV1sQMd|C(tA}2D4C5MN3Lh&fHO176YZu@y9KA+OzCcUAo6{@?|#tR|5;PRU^w_m=L+t( z^2%xYUop~a0|t8j=U!|Z&9Yo2K-}4FNCD0e<|RLIBxDh(Qf;v}g3eNq_;36v&6GxI zykK)YRvMf1gRdV&w{N@rr6pPaf#(Cy!1S=nOC&nWzg0% zI)P`*P)a&GZrrDz5wmuTbr%c3!EY|S%YlLj*y{`+w z0T3C-C6gXofqlucxdA#XncbuvpXZ!LjAyxCG7r)-cJ8u>VAYo=xmU-q<8OC5v-LE6 z%Iwz$NUa2noi`zIPS@#W+Fb5rso_`hg=dH1SgpNqtL!#F?I3usp5UrK@y$#E+||bj zt{)%9jkaua`lkd*9Y}@o&K_haXXl+oB0ldw??^<1Y+-qRuIhqhoNw5>KS*AbJ!PP$ tmuI$$MQ1P=qqSE%-mO9Zzi;lp?NA791N`>F5|p*vh=x7Ae6`Gs}F zC$XKHF0kb+Gsw{;7r^df-e~@0#f|zKPYN_vL^`w{n)*J0wc5AspNILB-cJfG+B?DS z^XV}Z0(zpk zTX-mIW>wJFdQanYk&Vxne>1u>=X%#dIk1$IV8VOLXL^;z@4cqU$N$(U`KP`4`Qzf! z=O5;)hFK>jK@4{C+kfVf`1Unr*Fv9!hD|uk(GGL~Px*WM2ls0WPrq{K;rSDw2#deO zl$4b8l$0mQNl8Ng|3Cixo|&EBNXDY$_Wl1mTk1A%*s$W?-{0Sl{{R1fKg4uqhArVM UzCLFVdQ&MBb@0I2dKu>b%7 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/monitor_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/monitor_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..99eaa97409ceb26e72ec9b06fcb1d95e2dc31e45 GIT binary patch literal 845 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U>5OoaSW-Lla#Q)5Gcs-|NkOO zCNQ03^78ht8PD(gOGZijYwi5Y2@!qx^Ly~Ivkp_mo*BQ{RS*p_>Hq(v#2^3XKNJ_1 zc0T;?c8KYogMm{UAO5cgNrGg5{{L^!%&aWT%q(mis+*9IlJo;40+l>}00@p8IdH%y zm3zhviGRih1`vHszZxbsPV8*mC1zk`^ymNo`HV=$2@4A|vukrRD=U|t`FH-ni33Mi zIF+FKq7NKCcLZV`gsQ(mfx3%L5&xEPVKX{eMuf zfL;3gH$SuR;d-{XFtt??ALc)_KfHcF56_vN|C0ay{W}a(_5Hgz&W2Of#V_~Q|Cg-$|M&QZzt{8I>g(%_ zq0SCDGyg}=-`CZimwc4@{yY(@;R73`G$ZHALw|NkkwT1MGg{qWh!wG~i*C`BCl z`}c4A!86JntM9Cgoz0n<4l(RdmUZ;^!1B)Q-C-O5{5a!&frX8&&0c2D{J4yrt$($) z-s{w32b+HA1EaFCa{G^+ysKlsOsNbN(dCf(H-F;9hvyEf*Hr7}MgE=9$avThVrtL1 zjl2y80?ZD#s{$2PZD9I+enNZ)m!hjivQ mbSz%wcYFI=#sm6b`+x~^)eZCc!Rerkz~JfX=d#Wzp$P!;$8@y- literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/monitor_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/monitor_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e85ecee5914eac008363faed5a8437e8738e1078 GIT binary patch literal 1003 zcmZ8gX-pGA6y7>mioJj}Qcw{oQjef5^*~H4YC$WASTFuymRj)+Mk64iJ+v4M28jo4 z6!_y21JOjTa)TK<%{ zDHw+FRqK>$T}Xm4O>c-A;EX-cyCH-$0}5)qy$*+?Qwbvp ztwuYF7NIzV3MXXo=zcUV$X12e>MxlLZm3It)7|OdY&gxNA3c{LAjfGFq|rMB>d#EQ7xe>jISwQXrDLivft?;$TI++FjE|Q;86jw>v~dAu2IVH7yI-SQtw@s9+~oLLLkR3PT`BEdpYY zl;4_f-m^o5ggQLF5d}Mo&8~zxn99JKd)oO(5@@-QF{~)w8y#OE(nk#MT~adFlG5VZ z;6M4PJv*7zv>c)7qok-sPJ6#j)O_t&Y`(>uw|>n&6TA7WVZ}hdqOwMDQs(#h>ga(Z z@Rs=vfs2E_@Oj_!Gvh|v=Xsbbm)KPkH`EQ`325BT$0b7NIm> zo1w0=TT5PV8rZr`I_Jp%noDdzo+^8H++VF5xm3^;FO_m+QmMb=dVG+#`ejRmUK&~X z!Z&FSaS@QBg_o1Viuee-AL>Z|bbQZJURds>;k&T2~Xse@gDcmjD0& literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/move_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/move_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e4702418ece3b58c4aaea5500c480a14c0d1108d GIT binary patch literal 880 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU^e%3aSW-Llaz9R(Iq{O?|Smj zD@P6-I8gACKmP9PlDkuHTww$%{{KJ8Mf}06!cf2drk6}xO8_4|(cGLGi2GPeE zBusv1YQ6+A|Npl+yHSuqK*05&c~a+}maZLsQ#B_@Je%LaRwnGweQ~eY>5XqrPMYC< zMpxyp;c=t&N27Z93V@~o14Cq1nc|)4&;N3%mio3mUVeU|#ryqDa?Hxi%*=Tb$^b0c=%YIr|{(V?GkcETsi-M>Y@HkOh`zmIHElH z)Yq3kH_G#z`QY;D_v`Ss`8@L<JZKkafg8*o5k(#$GYQgTFwMI;NjN3>UZD0p0~ns12e)!2=pqIf%zA}Gv{p0=5fQ5i0Td89%Ap__k{FB%9+ANdB!J2>wZx-x zOi4q%>ji?>*pMZLLk^oFMPNWfM4%{;Ego#hv0a2|-@JWq-p>EM@B6>^zgG|u7HBhj z!E6G7U=th^5Q)!}sn3dpk9|isq6C6PZEyf9`dAr{?_^gQ2CqKQ^hHA;5{b%x63ynq zbgx9aE4FwrhVhneCU>5_eb~`mD{i(v)C_q-&;|oyY${;pyi$8UppswCnGSThnk8z8 z5eQy+&;QBXCy8S229}(01J?vRNh*s|C-g~$9i`_o@mPG*lc?-uVw5H9n&*{n${)*Tvf!}>kx+Of zr4`xNK_xXD%%e;A+_xBp3DA#Prc%trKoi{{K#lkU|NA{qC6Q}A<|sw?ssSEX>Y1hy zntio{=eM@kfPGw5Cd=@XVVTWN$tFxoRWeDWuVM|R##&rN001H;{R(A$%W}R6(>cnA zi#5N^n132P@I~A07?#N@Jlbmq$igc)$6{EWR%fujaUZ}-os>o~m&-Wlq{b+Y+8W8g z$tPyG-${;icaLZ9e9qK)^zpd7c|-i&sA1vTee7+^as_G= zWH9KZ8rs%Xc*W3NU6o=Oqr|G20`$|^3vpDdCu7=p_qL65eSPQoYP_o#+PSRVa#XnG zhR|68@5z60HfJ(TeUV#MbUk$E*oj9y5l%PDvt~Q6ZeETIbpCr{&CjWfhD(x>LS5r- zQOLE(6ndk)g7(!b_X{3#Yazf)bvN$;CfZAnJ0EJ9&N=OGRa_UPDBh3EDPomoJ9YGE z+gSh_{kY4E`%8t5FGTQdON`m%B3#BLCU@1AZM#1!@6FQu@`C8a zv3(Nuy3?C_Qm)fVwiIsI{Lrx zKJHJ-R)vFdSfuaYaHC39oKjOW?Ocw)p=fVs-Dk$@bt{`%oQ=cA_*|ve{X;%IMfDhV zyTmggT`$ST8!IaRRQB)~2zcG`vjfyjnNC;`-aeFEs9=-uHnZE%DQ4Ub8g2a6Lgq1S z^woEyKjNRS)_?r4T&bd}L59fKj10HT&rM{CAcO9+ef?)Dc7KBrnXK1`$ll8#B}k!6 zJs`M!eoalH>W7K!Bu+%&#H18Qn~akRM6dUrqRSP*u@sX5ExbG!x$`RUl<~g?o?@95 zalrsxDm0=?brVCjB%F>y$z-{s*bkR9S``)8tb2{YLS!S{R=WC33ouRiEP0kvOiM6i z$N<>l8ij#PDryn?x9?%N3p_T^0pex13;i-YXFkJq1`waXJXbwiWEvl+U{**W$bchs z*nHv;mIwfFCS*8nJgw2S6vIoN$DQe?<5hv@jgNph{TO zfS5*aCyLXI29ZPjSnUn!bnq<(N4w#jYij1`4rgcbT0C#ypjvJ;wmLbD1YT?3OxnX% zT1?AH`0KuP7UW?5=kHXqd3}S;B3Ju@5Wcn0Md8-#YrfJsTjY2o40$?XY1ZUh<=lN? zr1g$vL`S<_-mVbBp+b*=v^TRHg6m(?f*)UXA69f;AlBkH9>a))SZjN(0rg)zMH9R! KEa09WC+A<+b>(aT literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/move_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/move_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..19a8ff822a4f6b1d28d3f2bef5c311368ced85b4 GIT binary patch literal 2288 zcmX|C3se(l8Vx2OV0dJKk|@f%1w<2!6$CV>s3 zMIH2UHveQ)h<) z=Zev>HjdyM4qyyrqQwYysgHFTvvVJyEIN&L8A!T&=m_Z?X=Cbk8O<-8N+T&tsQo20 zTK{z#jnsdg+IW~sJ1cXilFps=t0;*)fxy4Clu#cUEjsTsx*L{oFxMPSWF$>98T$EV zafhTGol!#qx(N7W&g%;htqPEDD8k490zB@kv7^>@BM2iV{o%#`TZwkw@vI6WtA?Kd z4;hNNN_U!=n6TMI6CZZ00EV1>G^F+*C!F_0mi|{xSgrG5{d1zX;i}PqIjnyeBlhyLL057WuEwQn6+-@$TQf zYlmX0`hv`qZOtcyoDBTA_x$tTuxTq|Q(eHrzQkS0&p%GO)#RrpA1#k6kE+a% znGF~z_q-reL}ndds<1aCvh^2&x=#Ky7J}m`wzeahmerjoP;aNjghgp)#_8-&s>X9PlCiO$0^6*V1X#TI(%PIhdsSU1Zf{irg+dwQ+SUB&XUDn(Uq^q=n z#ja`poY~nkD981SXKt7Q9+%4Cb2WcV(4|$- z1#XN178A|09^*x&&W&0Ty=8#OV1!Ip`v|ewQbY?w?6#c8Ef<0U<`LFKW8keExxD5B4@9y;F(%Pb<8)*{q>mKGCoM2%9c>~dj~zpwH~~O zJP8d&NcT4SZ)$xs&(=?-dlrlbz>U#4lDuMOfTNkYjo`oVgl9m<%`9V^>t{!K=e-;> zYxYE{H(K7F+OU{f-DEgm2N!Y*!$XRYPYoP$JT6}EFy4V8QZozzTDD%_=G58JDn>D5 zsr;1VFmZvG+_S~}G{bt^Gq}cd7}Uo2-(5R!GySx9{K|$CKd{p+(!cUNMk$@u|45j2 z)YMZ#%Y?SAG>4{=N2?a-`-^-mgMzHL1I1di++cTe%J&;D+W3{1zD?e3>_W-Es{GzV zW;Pr;{BT=DL+naz(fZXz4!ua?#hu4YjhMl}ia`msYtT5lttU%K)9@0cE9H_T?VNkr zZrA>-*4h(&h3jA9aenC>ws_ULzCI{eT_s|ao1J7PW~O(c zvy+2x+xNm@ za+OG%78&CB^G1BrFZOY(ry1ZK7X{KQ5>nOrIs2^~4nqgDOQpU5;4`Nkw~`jXB5D)R zm^G^)hHidl>Amz@^eXDGD2rGV*qv%$8@Ldhqdfj)+- z(U$U!lx?88&p2+yE4P}Gg~0J@xcs(>yMNQTad*|8SBy&|8oHZBHG?T_`LJ7Ss3RjY zYBVFQ^4sk>g~~+-`0`XhP|`*7Wj?wQTfC}Vu12Hvm0n9w(X8KmWC>Uzh>6NQd~h-& zF%yVUz4Q?K&(-_ecd6e=ymjv;PKmIrv~Kj1qpS4lH&yr=73^qMvB*$1h;2mQ+DZGM zJThn!#-)D#{Icq&zr-T4>lOvH;v;S@71mEphI@K@$nXWtl0KeOL!1LiX5b)Ft;atitPmfo zh1?>p8nzYHM6FHh&XE*W^Z&V`@k&0E8e1LZx}l6mG+z@&n%Qh#;a%A@F~uqySm__q z8B~;9TTrlB5QgZT+g71RNAOO~J$lyT6w@%?8AN#L6XWTFPP+V-#@qydm!^a|HgN?;T z1_nk(A2t~o{`voR^27W4>v=!`V%H%9hiMO2@075YZ*JNn!^|wq%`7i148qL}+RDtA z=g;Tqzh9eB@#&}e9gq&7^9~t2xPN~?(1aeIT~2R!?Dy3tSA6;=e0Z+@eF?dJf6sjQ z@_T>zn*aZcHWn5Z|M~xWdLs}p!nD2zS}$MsFD;_`tH^L|NcJx;s1a8j1r{=iO=$V*X{oq#?*eD(l)u z?iqcINlZvcfVc~2+sD_N&sdAawY}EgXY}XS*Y3vtm;7Cf-&J~ZuidxYJ?-gn=9Td} zG5T>@H(3k~3=ClUKD^^Ut$XqP`m1q&(vl`5|2|vrCAxam@96wjYS^>FVdQ&MBb@0EMY~ A^Z)<= literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/music_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/music_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..0f343c76075edf057a8808f26f646f5a688cd823 GIT binary patch literal 1499 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/network_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/network_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc65b48c86edd0bbe678bdb2d2474fd0f1b66e9 GIT binary patch literal 780 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V7lz-;uumfCn;fpAyAOv|Nljn zOel1cN?2lT^5;rUPR{1}_Vq@0_Se5ZbmX6%bJ7<^u)-w8YfP4wmdxem;cc_c^9}#} z`FXh^q84IWl2VxBP6%_+PF8{pr5QfG%jNf-|NDLSq5byzCI9{ZdHBQo_xf%B_y0He z^ZWbkhuX})C$BDjxar3iX0Yu*9XtR34Y?2$oSKmS@BD|~=k43x0~Oc&|2zHR|NZqm z<>%&3P+TGpQJit`zJ0xf#f_U1=WOfFe)#pdyv_Z+opH_If0GZo$9F!wKi|G(i!sER zN;wDb-{-0S_c!^%RFRa5!{-k#&`~>a;KP4;=EMK%dFucFQ_X;cz#&QYU%~wMAE*6U z>v4gFjje6{|H$|8XSRhNQey|(o0O8!Fva-Or%!Argf`oG8)d9qZFu6-CZiRc8;m=O zHW?WhJKp*H{eOL1`}{h?J3l{6et7k}Ji*2nV$5tn0P$wZxs99+1|qH(rGLKQDm(Y!U$un;m#c?x&<`P}eOoOK zG$u1lvRMCq!84cDk2=f?&BVBU6d&*%p1Yji>-C%4UT0rES7rPFblCs@V0Tp%{QuV~ zZ(p~7<>Gn%|C0M^|DRi+ckK9qBOHa+%2WRR|8IXq9VlG?|J;YqhojqUtG_LZ`0(iG zXKo%KfVk+8d literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/network_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/network_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b40dec08d2bd2ed046a0f6bb80bf03fa9f7e99f3 GIT binary patch literal 979 zcmbVLX-pGA6fTq?!T{nCOFb&J#-Ju`0R5@${>yOb920C z<^}2>yd|#+Q^ko)W%1!|_RD_6Zo?~TDTyqDb*T-)X<79F6U~c^{Up7sR+fEZBuHrH z&hO~jY=7g8YYrbc6fc*{i%zEXw#f}Z+K5v`y*?kZUqbHxXL#}|9ebQ;Hmd46SGrz~>=Va!A9jCnbE zQ#&mBcux_fn0=;`{}oXp=N!Dg!t|UroAX?vg4j8mq!Kjyk?nHpj|R?VE1K$hzRNU@DQ0E0Zte+(i8i}ptKPQfhjoZE z@E8ecmE-g^K0Z}h9$Gg3ojT2T`+||2amPyGs1*msow9kw01#*t>t<`I_uZv&ml9C7 z#n;1-)(0;$>}tBN*Dp9&;L z8(w{{Z_BTqv?g`qN=Bf<|NoN?Esd=E)*5Brx4qhAsY}Zb$^R!F1hGTp4yt9?{C*M_ z`!3(lZ&wyijm;gN?>GJ#tvL!b9jw{q*#^J;dU=OG{p#s6Xz%Hsr^PJ(xxVe`@;swI zfBsHSd>!s6&ISbD+xS;Y072h>A&%b@*6kICXirHi0{C$?rd?prdl+01$lm@N~934-kBMq$FeTZ(;l)JBSMy92xfgXR({U|FJUv zR~b%TK88n6KQo9)%QCRCFflAWbc2D9pPxZmQk;RAk&%Img@FU4Pee?D;qU+d48Q;W zdT|wI0tChtMx1C#Y?)jsQ=XUan9GZ1Pb%zdvhx-O|#m=2RbzuDvr+k0^ zn&Iu+w+!z-|72hXvfqFC#vsGa%y90)B?cZr5rz+(A`Dkveq}Hh0mV22!$lxlM_7bG zSnxN8_R9ybfZ52~V8Fw0u>Dr_g|z>iHyVsYWrLQO9Jz5!=~3R>dDCUBXV0t1zw_(E z-p1DowGI-lYL~PwX}PMkOtka3{1j+1Fqwg(`a$;X&_kcU)ft?Bz1wY9+p(NSr=)mv z>g$c?Sd?}-h6Hsr0>Q(Vm!I290@KQprK&d*|3qI(gGRNJr-#nvb)Bp4+^%<=_IQ6w z+de^Nb8g|o4<8?w{P*wY;exjW^dsRZm@75(hqL#5DC-nQ)P>x}Ni znD$Nux{QC96DW|NzDWUsWT3Colad}Krlg1fxlfXSMB3?@nW{zKGd|mkZJU4I{A}6p s-{0R){{R2~eqfUOpFabX?|^17Gu#w(3)by&00lCGr>mdKI;Vst0FZ^aC;$Ke literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/no_sound_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/no_sound_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..5fcf2d96897df51df1b43d6319e8f18d46fff29e GIT binary patch literal 1686 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/picture_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/picture_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c24cfdcc6859b992d859bc88dbd73b6ffda8ae12 GIT binary patch literal 1350 zcmXX`4^UEf9Dj)h$rHG2h*m-?&8|EiSen=B`3I+#nUO7>HAzugxoT%+^He~Quw`jz zwbe4s+q!Et_10$1?Gb3iO^!&LD_J4c?6wt>rYP`!d!XOD_xs+x`+Pp%&->oz{pzwZ zQ-cD-0wD+rN>39AiO%vql=;MIE!*gXpn#xsL1OmtO9f(?-{|dBE(P(JC07d2fuU1oRQHRqSj8_FO0#XRml>ni=$u7F{7Ws%6Ha89rX$+MWG1#JL^VGQRXZjY-aQ7AksrdC-n zqsDDVbr@ibvxu6*c3SPk5EOS8I>$#*OF;U&O2!xauIZL&q52#p0HMrVO?-r?3NYRx ze`iOP7y!EHIrc3pO43bXAQZth6%{F%i$q+ce ztX_yDoB5;|zTdj!h|{);uyz&RzRPmxZNs%ay(ggdOHjw7^=G~@GEc_cbhUQZ6z3(s zU{q#I1bEk+R3}!^ah}`dY8kO(7=`TyCdSA?{gtaLsPsdTA4V!u@+Q4@HIHzot3^I- zk}3hL;&|f#fR@t6mf|sP&p5$u!LryL2to*G`tH&UM<2l6PTzFliJic7xIKDJ|9uMm z{aO3F)$ue90_*l2FaUIzwuwKOBKyyOz3Ps?QJs}5xJOP~YmH64c+MD9ZczOSyFhhAxrhg%A+^v?FkQy z&a0=k>^@lTGc0J_9!M;$uj?an=@fcB^GO`4oMHPd12q{!bz^X?>Nqua|6jZq%hI^z z5u17C8@k^(Iwcgkxndd$_bGhP$fG4BFrX8hu=;&HiODO&ntK=bm{t$sy|15!_eBhu z#3$3|?YP_XRwXabzB*VIt^X-&SHv=Zr%h8Cp8K7A{7&${gX&*TM{<$(psHETCLT@3 zVfgF)9_X`d^a+4D-dHHL@+$SJ;x6iy!3B}o0Xxdd$;}P*{sy0HOx?QiPblN{6!DUki^aHK?p3;o8Q!$D zx8-9j9LJ4g9#`3XB^zaR-%jV=l)7a(W1}Ifbyz-wJqLAKhqy`%lkzKEll5}P5O;pf z<>(c8V=Z-cBjD#lFedGcao2u4hwieHbuIa5=x@3L z2MH}sqQB2Zb*^T@t`AX4^HF||s#H`j60Vtcy(H-{cE0x$a%M#f_7b;*xVZQnaGV)2 r4CwNTqL9S_Zrj4+TCKJX_DPYTk#D!nyTCA)csc1QnSz^1qU!$v3N?F- literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/picture_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/picture_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..22d2f3566d53fcd943f1e40ee64726d77efaaf1b GIT binary patch literal 1741 zcmX|C4OCNg6o2mFW58n~klRcda|B5u8#9j{jOW%QDKafe?ZZ9i9A@W)mJylku}vmW zDg-ScV)X4v!#Nky9pm*K)k2mq7e&n{2?ew+LH z(Sn?u5a<45tUcoySf+@s>Rgw1a36bB?^Egh!@bm?r;qaV4N!)+tAUKyhNc2;-!BTp zc?#pzA>x3d-w|bfwO%QyQYTSEBYl6Qx&VnDh40p%89&y!>v2&@o;@e_oIqSUnAGAdnAeJJDWTTqHX5GMnKutPy1Y%haaaqLZQiUcT%0sSKODnlSeMMZVO({DLWMFc!8a42X3y@?)!YWkBN z6ic%%1~hAX56#i@_gPevG&SaWxCZ9)sCy;?3X3>Ot=|jL0HDO%N@^%3Zf-M@Y03O% z!IDLjignkdy#RC{gc15eE2DeEYPQonQzj0dNVfyYT9>%Fjj!q^sKv zlFm%|F-z(!d>?fF!m{G}iXZ?AgEA%MQnsYL+*whUh1|Av{d8BDlhgL$psX8&YA=gx zx{VtdS`Ym?Cu&{N)DuUkQFz{6kEBljlQHG`;m2#FuBSXLbLoXA^y$j*k>$35*3sm3 zqw}|a;o^ELc zV|!}kt9b4pTf08{a>E041^EU=;c>)4s0lK!{G(}^i&94C&Xm6xCaglw-gv`iYiaO}dyOaoLbk4^mRj3euOIFy zexz2ndFv6|p~l5&iOW32Xxz4PRO(-2TJ_SulDcj;MrhRh^e{W&#hm1_=1tKo^%lb< z5n&b7l%k?fGNhajRm=MN2YZsPmzq;fX9bAz^oQk(jy!3q2;lNzAGa@xh}$ zf7!}glHW)9jY0x=oTCQ@Sn1%Llg93hL8ZEq?2vF1eg#cpZ8FI$|7;bnJ8ZQL4L-)} zMlW^Q+t;%KJCb=(A=ETn$_0Z`=goPQCSpjfTBFGe1#i5f`~2xU)=6;OWWuMfzvUCg zk&`6Ui)Xpp#U!yqSTo~h^G+Q9z+**(Q3n`O6AB6w+Mio+E9PWT{hjHjwDxoJfm~1( zfB0qs?DMR#MKH499bJn1v$=pkNJhzE X=si)ziH^e=^^y0YbsG$wdffg$9@R+O literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/print_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/print_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..5e01d2b531c6fdaf41d5b0c916e975f1a7afb6dc GIT binary patch literal 840 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVCMI9aSW-Lla%7XyfpRc^QEaN zycdp2N=Qh|v#YFGxO??wfk+;p>i_?f9K%&KG*Se_gw7l|bLh;0LuY{WnL|K)F2IM1IyH9S2%Jv<=r|NsB=AOHW`AD+LzUUFZ} z&qEjN3qSo=_n#N@;%(aw7O3_E$B(BkSg_zg!T)=D+!rlE*YUtDU59g*#3LWv1IU) zF5PQ>%Sp)peTvG&#_9*}W=KxDAeQatC2hL?^KYQ5f&NRGTNit$?dey^`TxJCK540t zjN4z=to!GILr6%=!-u#1d7@`dnJ4p8Ig1HwVbaE=s!F$bFBdoG;~kCDr*=L(zOT1} zS77_6ga?1V_CNeMmEGw7ynQyz5Y-QV{S9sNcbWX~+i!UuC7Clk=j)7&_UtMXTb*X8 zo6L61-(K?GpC6|Ws4Ja1@b$q$Xqf-}`d9k!b$NTqxcYzR3+B(9=;(ERp5v_pjH?;< z|NonA@%NAM;r09fOIk!qNY>T?Jt?% zFTTyR=+Gq|o*W+@t~>G)L6?IzX3ewBHapCmr^W^ZZSVWv8`S(f`~{K}l6ER53Vi$y z42?DXc^{1p3=A>~i;Y*TT4f+(Tg2kJd225(v$(nW;n|yiD?U7U>hH&Wdr~2(An9jZ z#=g%|%*_nU%*@RZcVBhJ?BDmSu&5y6#<`OR4<0yr^yr5mdKI;Vst04f)iXaE2J literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/print_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/print_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..54ff7ec0336d4d1f28ff16573c180b6014d3827a GIT binary patch literal 1330 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 U>*Ia9_%p~pPgg&ebxsLQ02SnlW&i*H literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/push_pin_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/push_pin_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..2ee07783e474221fbb9db7b90b36aa118af09aff GIT binary patch literal 1260 zcmXw34NOy47%j!LV#^SW(kCz!$0YvHmgUdi+AT&vLDH;2Z#ep*EWottoqp zkjhu~b;2D%@g?QrJb);-4G(+qYAWR5$!O@^eGa ze%>zgv_JB^m;((7K$mgG8c8@jzd+WbLv)$ei(zEgd9qtar>HKYZ70QDeNE*SicovG z?Eb`-h&@S3^g0dr4f|(ML9TDMXPRe6Nrl&On+kPzHk0}FoMYx0I|-S};y|%8r7`$r z7a6TQ4+a9?{Dj3LZkS-; zOhIq;cdav}>Lzf9Ia5RX@tvvGs5mL@KL%f=c9@D;UmmK$+7~or)L}bjHjTlaK3mry zo%I^%h{&wl&}zH5yJnJ#C_5{l@1>N~jR8+uT3Xynm8G#K3~yt)LS88+rtQJ~Z{f`0 zzyQ#`2!#12*dc}tVrT=dm$99x;H#3z%FQP zXQsvNQbr{1)YMIdOK!=n7%B zTBMw_5##dLhUVEEbxlTV6^ii(6xW}Eow(|zKxZVv5~ zzHxsM2p;@{6%0!c|E*OfY4HD!RUjUygMv(BSv#(?|FR zI`kq`dO-93P-9z*af*sKABXXfn_~31haFa(I-2WvVHmDI9}a$QJ5wVB9SO!vmX$CLj1R-4I4+=%gShH;LcO3n4Mle`kc|832H`1 zzv(MCVYjcZ??ib}^gJ*qPk_zIRW?m+?MRce$JibM*TaQ6w~0h5v++7F*@4Z{39k44 z1*lX^0L52E-w-|Sn@RXY8RahnByEj?)b&m8WxNZK=^3>7&|0pN*Sf3Ge43!bKKsfUD5 Lli4?!+;jf}&zy9s literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/push_pin_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/push_pin_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4e51d6801d98ef4cd72ec2c53ff4f62b87d29cd7 GIT binary patch literal 1818 zcmYjS4Ny~877j*3l?PGjhD00^K#Fw{LQ)lEW0n|)D%LpG9Y#$_pd{E1O~7u~@RtxG zLBzk^RvQUn!gf&wB=5{Qr=^78f}X=l&OdH2pa=YIG5 z-o5XH#h%%e3E{N_c&+V>zAq%9m`sfpp@ae)`!1fBo?-G z$YV4qVh6;=ExvdK(wWWt$_qhM?Z2z>*m@y2WKz60U>;l$20*~k6kk~flFnrYou3i3 zMQM&+5lbp-Ge*nG0frLHu#Ih=&dtnkFXKOndiU4*ACWJ(^|zO%ye$zEA67g^28U=5 zzUPPHhWSbJn=J7YptDk)^2s+^_w2WK|M0c3T?6Y~RoHkF`Ezz%y>(!v>-}+NrFoej zB)yC7CKW+;xw)<3U2PgBRyx^LjpZp_eVcFn-oSHPG~DKjre`=5-VbW>augD5 z<=0)UTeZCm0ElLRY^TdX)jp7maFfNL-e$3{NAEx zhQB~yq}@!h^awzTply?PL;n#tXOLPQpBj9i2vj$ON9hTXyN6m_3;U$|et{ZKd*=eQ zV+xk3Ditgk%3XQ*oK?N2bGL9hR9-Ga`zV+Eba`vWV7B#(yhm>Bcg+Mt!*H}pr5@}j z^yvp}Z|3pRkI+hDCn)~h^_0QFDvLpl4btsHeUY&jH3!LYyh){fzN1t^{pU0Q+uG}l z*cE6y_TY7n+o8v#?nw+fh5JnEph6^KJc&polSrM;<#My9Ru1s*or>)rXc$_Mm>(}y z0%P>R{gb1Dw8q-NHF~>3g~R`SR(SK&liBer{?st4P(v70585CqQVRp(#$`AhJ)tH( zrg}PyeSFqyv@OnXq_-1dve|65k4wjPXWjR04&e439H#a)F^)ad2 zeQxeimpm?vl65^3GOFIph9I?87I2Pv6nOX~6Nrhk5GMq#xzS)wVF-=uyJs~4>_5_I zG-`ObxkRZ{s^r};0cyv}OivjaD0p?`^|q-Kz&@pj>vYfiOK$C?YQbw(Z2iup9UjAI zadJP?$7I)fc2#*<*~Wwi_lZT2S7IKkosHPa7#33U-LDm64nFzpJ9)(1cyESt8BCIN z-rtNIvErwCYJ8{j5|L%#WN~oK%=Q75TCcY`tSl+jT2H2IIr)B~U`At{J-Wc0nEDX_@M0xCfl7p{^BPbT?rUH>@6r* z*^f*j2TQJBCm=`Ua!*f!Z|xkSs7fS&EZWiy0ox~)#f5(ri^b-Yd(&4_I)vgvM!Iv! zv>b>E3rk0}8skPU=K0pWLS)8>7N&X+Wl^YxoL0)7jp&I&_mpBRjz!G%cp~VRk-o}Y zgulPPh)(Z8orozHv!?ext(RT!AEx|yZYeGHJKb+g`lT2QW`j^D+;sZ%X+U>XPIz+e zLS#-Gg~Q$)*>?^F+ZrNmqaSSfA`yf-bLNax$Ed%albHBxPFzw_vH?C#Km>U|O*rpe zryYrAVAGWXFT3~B@BIGNQU?oMYXzl|NTkHcF;s!j!t+_kP#p*HKj(R^Cev}FTAh6I zFA*VYsHJ~*yWNg9-ZOVMcjzWmQBjdycHu&dOeTwZ>oqlWEDq;_y&Z?cCBlvMhetP8 z*}^}dEcgq`;Bqk^rKUdB4G#}LD0Emhw();CaOof@%36jXNJN{%6M;Y3SKxU!+>^bu pQ7;J3Sv$boFV_fc%U%B#4T(53v;JZYqM5!LKYZvIy_v=?{U5;%<6N0eD*JA z0^8UmeZcx|KoP z{I$Hy((2-1Zvu@u|Kas{`8Ij`Is>R7kE)9GJHGyxZ)@+D|G#V9izoeSW;Ql9K4jK@ z-^4F(|F7orL*c{MV6;m@bP$l+xq+UhBf~`&4eV1q{ROp&OCX#yPW6zS*1($ zBGK<0{KY4g^SzxaB%bpB$5(4+Ze``e_GMvh_wPqY*wy?!_2Khxb5L>v22#?`|G&+j zyH`H8wOmdKI;Vst071cBJ^%m! literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/redo_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/redo_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..29de3bfd7291718efdb936adfebe62136d009354 GIT binary patch literal 1313 zcmZvcdr%Ws6vhLqiIwFcp|Gp1l&5u|CJ-^8NKhl{NNH*jVyonV1feL3I>Z+-fUy)X z7NJ6mL}}|NMv4P1pv43h0u>}8iqt|wioBFpiqt%JyMg*goqjXlJ#+8O{oQ-doO^Ou zQCsX6FI`L^5bU>YW$wTuWc4B*AoZ}Mz=9HL<>v#+{*#@A_2q7Lu~&O`OPbS zU2C~r=iU8k^)6MajX6*8Q!j)bqT(|1xkjCi@gmC&3rP<(wm#Oa`((yv6>Xl>lq7zb zM@u-K!dZ6IXJK&7_nRT6;TXieT!Ep9T%kedhcsMFg*!ttUJX8^OirGFeUJ8b*vy^Y zlq_z{i$5{Z!Y(bXc^gKn4^dAVXQg6X+Ext)rbOm}=9EaV1CQglG0~~S-eY6S5j0lx z_nx+@G{L2eJ$(hbA&*rmMcTTDmqO;b{0;QoB4bxWWq~}Z=V=A#roni6!xSkCT44t` z`gs9#J2F7B^8)Q(or8G|hP<2=cTFS@iKu(nK*z{NHH z-i^1yGoI(XwZ>LddL-Hf>ghLiDBIeU?{&5`P3u}25{{@C>Meoc;9{#iTyN260cL|q zs(tKEB+}RWNZc7elJ;%gPWvU1%oWazc>uV)=F*Y*nKEGZ%d#*e3q1V6Cdm+8Lpy1) zNX4@J9PJZ|fau`rON_7Vt&?otB-nZLu--6B)I_T>c%C=#L8 zJ9Di?fMKEc+wH@{UBbIwz?#c8uAe>-FAw_8?Zz(l7wknID!spV6foj=Zzug|5$R^! zsH(_wHs>AbvwD{5&-x}byDz3#?C<0`J9NeQ9Qo?~2NVf=74a~k&CZHmtqyQthC`>j z)C^y8LDF8j=h9fGhE2C2(gQg&;o~KZ^8LY$?K3u!J4Y7o52-kRRn{i=SS#pMhu6we z7%Wfrgf42wxZm&{yDP4?H>qls+p{#`WOKjL-Ad>4@Hd<{2u0-;=e!Z!iYeHo7o$=Y zLglo6@QLgrgG-FU_0g!Y?E2vnylOTaxi^+_{Z8$Tnm-zfoTH=Tg|ilS?>aUwj3>|= zO%z0_*_A@w{1j3gaiX4L5?CLUQf#3`!CCYO_q#y4!Xl- z@2~p-yWe$6thOCiPc7(-t8bhh9!#o(ybuwQNPOfx!T_wF4zwmLY`zomSq^H`%5Qp( mL9)g|EAW51)SF%F%{f4TTawQ@W+iu9_ix)A#jM=O&HM+!fNIqM literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/redo_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/redo_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b516dc49b6934e225c6129edc947481ae3eb44 GIT binary patch literal 1961 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 CZk71} literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/remove_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/remove_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..d45b895a5a49f9949c824cf1166fa8e7ecce966d GIT binary patch literal 557 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VEp3g;uumfCn;fpAyAOv|Nljn zOeE1sDG3P)1@o%E7}`J1m&}s-^U?nG`aZGsqAb54=3!9axNVq}z~aL(QEJO6z& zWY`&m?7A6xrM?@9ChY3ZFuWX{s*@zZv6uZ<`6`>S+al|c^dkd`xsLJbN$ z3OEH8Wx1mAKl?j5AM`M$eKw{NjuK&(|?qx39`g%`}b^<_BwOivIBZe|_8Z z`~MAVet(|7VD-nJ&pyAe=ZVqjDd2{>rJYwZ6(=&0HSrxxs9R>0s<@-H}3KNdVg`i zF{PbCDwF?ZGHg?9>UF%8;(C}m|y?juw!G9!JmI0=QaWXBRD9*e*N+D ztMcLh>*FQn?f>bs`9XVQ{eMY`5Q_@Qy4t@d4gdkf=q8H?r`6e}$;V6XtFQ7;e!Z~o z$H5~XJ_E%N0RS=Y>r-Rq@8|P*c;f9Z9%baQw*;E>^9+hfx6|3$=HHi)NvVAKq#<9x zT2ev+*#n1;{QPzOVeXbP0 Hl+XkKU0WiR literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/right_arrow_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/right_arrow_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..516d24ddbb3a8d259990e250df83fedd584d9559 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU`q0IaSW-Lla#OkB*pOmf0D|Q z1C{SC9$(Y*e`nu+F`nNu*6kIKm4nDBr7*}J)|V7yv{Q_pW*+?`J*LoYIy+cSDdWKY z`u`G7mZ(Z@Np-PYGc!I}f(fE)5XZiZ>g4;Pf#5^XGH_*GJ!amw_`jjadWH4{hYFLw>ZRvpWolhAI^76Ym1JTkl6SCZ+n{knGNzhAn@i) z56_}W0n=^jw>^FG<+L481IW`qKmQg#{Cs}B#Js=%&VP7&zMjpgVQ%L{M<0(lj$fYZ z^ZlLPAI=C>`t`5&;pO`AlJn|P6Mp=8t?$UZBVvZ+jUP89>gxX=`|$g@xf{&XuWz{z z|Ms6RX;+h)^5fTQ{xDzre}9sH{QNG@%q=Y3JdH#A@NxFMgQDsj}W>1NOxt35Z3^3^V_qzV)GJ_fwD-Pgg&ebxsLQ E08ybhnE(I) literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/right_arrow_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/right_arrow_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1cf3381d5e46e820636119b8ffd544d4d37699 GIT binary patch literal 1091 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VBzv~aSW-Lla#Q)5Gcs-|NkOO zCNQ0(63VQtt=;~7P3?P02?+_lze1mWPFS~Be0~)~VUp7E&@=!46%>5>PUP;Pj~@3c9LC6}0sZC7%3I#4Ru8 z4RuCJLPA2p{Efe@wGY?x1-;p5Vw(0KJvr&e@dF1w{Jd`8X3Z~eY*YR9*YS`4h3w`V zl|B^Y2iu>N2-KMH@B4ITC&!76y>puzC$~;)Y@IlIC||6Az9?Y&Wy^ec6TD#RH+7dCRX7>G1Hyx;D*#)Xfc`+EUn zdx@a=PEo#x4i_F77{2Ik?LE5vfO^6FuELt+bE~H5ZqAu`xLet#Vk67OKZbw)9F*~! z7TYQoj2lmuZ6wOA*hLS4*Xn|Lf-+*4!Nb>x+^_SH>+qpS$_5P5MuNKzRGdclk$6 z-|hb!{rUTUe&drnps>yg2B0hX(KfHeaeu;m7{~iDE+5BT$-OsPnAL^UT z+YvcaBE)s4L`2-(_9yt0em^yM2gk%Hpz$M4td%(vgK=b2Wc<0Ad9x3l@- zpVRU@^7VgHA0(zGT@Zed_MonM{=>7Y!|m5`z5Z2m*6_yZ0|yQuyZ6k2UvJJ|Ee<-e zdv0T+_vNO>kLUf_8$bUIZZp@9|FcIk`{i%j`zhv|q9FDt+4)R3FhAa2QsUpAq=1LX zi3wGu{STj>7Po(|apUJg>2q)wDV=WGzrW7t&;P%Z8$Z4kZhL-y{{KDeUp@N2_(G1j z87zYxXPUO(zTV(ZePRE@pPQfWm&>gD@n6H}ey2AmBLf|`+V02S|Nqyg^S}RJwc_Qw o|BG)3Eq}-Z1Q7SY@;QuVX2@LUH?`QQ`5#E$)78&qol`;+0H5F)2mk;8 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/right_arrow_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/right_arrow_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f407531e625f6b03a8585cf6a9f5948a3c705571 GIT binary patch literal 1304 zcmaJ>eM}Q)7%v`P`8cbaI9qiVRze|T(sGNIKrA>w@pE$`=$Nz@u$ys!x*1@lH>g%% zW=)*mVHCS&VT@3aeImA}H#StDGiv5nD6T+7HocaQe&4%;;fyyzle--S3`{ zx9-iY>lZ{Ui(s)>3vxDOZfAV-%nE~<_o2$lNfs;AnvNZ#Pk}7%UC`QMuvt*Z0*HWmyY72xe9D5 zWHvxw52*khumJ!NydsO289HCG|6F0|Bi(_c@#~ooMumQNnBV8pW}H>mWo#&@$;d7^ zOP=5G{O~+P17L|J2Ku6jU;3J&U+ZZ~Ot>!ZnXGRT%;8%g_r0^+;qqNv!%w@ouP-t1 zPR3@XB=QPN9+9@NU=Su}^q1*6?5VGkQqIPgqx%@b{{E{BZ!hJrOEq{zGGeCbk#?m6 zyWtqiQ?4z3A{*xXgZ{)IOPHSpui|jvRWHTC%mc^0g2oFV0fa7w)T~rgy&@?RVxs~Q zhhcc-&Nx`SbuXM-k)pu?SCY7At@R-0E!J&2*A@R+koEY0n3J9!m37m%7x}!d`Sy#a z0>agD!M7jA(|M0~Jh{~nLG;I`9MYUO#omwA|EyDozNN3j%*So39~Pp=+BlnS=@HjW zB@@n^G=>lWtUBIrAqYxW9lmeOXhs+Vb&>O6|2}~F74B)fR9$;AiZq&mgqGr6BT*;j zGFWqjVCrKA0fpP`;zOv74`;WW)P_;dq!4Mu0Z-Cn;KtIlO;qJ6y7BeDGu&ziWyn#d$vq;z}OSjuu#ZCbPtay{@N#=^_q16v;6b-mLT zvoRw$dqK5*y$=7)Q-@AO-5X#s@y!QU2+GHX$Y)k0ZGR%-z1n~@ls-kfRUW5(3op`K zT9N(nZ&N|h`rSvCj~@2hfB&xNN6IfCbxggGSP$>6RVptJI7ciGoZqXgk^P6|x7f3C zu?wdm+V8za0oOLTL?cD&^=U|}@hO^yJN~d&MhAFzMiwb}CY?$Av( zYn*l!CGiv;s^Q5wbB4#h?tfavk8i?*^lWa@fmvnqyD<+=ut;+1l#=|2H-;GB7YOG&0)r^V{TyPu{BYh|BH&SNNlU1^*eS zI~g1q_WfsJWo6|sVSK$xTS}NiPeq>L7Xu^1gU`PizJK}5z{JeVz|INsJp%&^BQt}R zk{rYDzyCPCKYqRH5G$+n@87?F0Hyx_2OGsCGwEoRI0uuEl(aO%`=5Uq9)J1G@cio^ zhWjtyF~sSJgV`WHNE{?D4OAz=$tVQU2etzodV>ExYlcJwv^;$Mem{@=zCUg3=bq;a zeEY1wKY+=%VQ!~mh(m+pkH@nw{N~{)1!?>LU*)tR*8v3qhJ&r#T3vRETmSzL?7E?; z^hmUAg3{&l6Sq8l;D0J0OMcIJ`R}tBV#*mEdYsoJM=G-UUz)~f2R0$;=ikTHho{T$ zmzekO*Xa-M&Q`ZEuiU0#wvNNJW%J#zxYQqqj-63B`)&He@BQz2KmcMhMBnxG_a)-$ zlM{Y?nBMAGeyp&A``-Sf9f2?TpC8_P;NYPH=fBG5LDg5DKT-Gn@apta^*3B3=I#H_ z6#nD=<8%*+J^x#h82SzP4+)BV(hganwLC&FcsLoPc~}`(-@jmZ_~ON{ z`x>5pKZ-4Pg7gBx|Nl+TS-;IomYXDQwr0|Uw8u|{Mbi@=JpsCCeq-ar&d!Jbx1Z;c zkKdnA@$u{R=g-*~6Yag%lpXj2vK*MVQc_Z$Bmi+55T~z-S$*L1qcpwmyV<|JxqpxQ zkjURBB31uG1D>5ow`}hFe|De$|G&S#&ueUac>F&QKpeo#5ESQh$4^i=9mMx^^>bP0 Hl+XkKD6GrB literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_add_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_add_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..2f38b03b321ea5ea065e9a088e5ae42450968694 GIT binary patch literal 1618 zcmYjQ3s4hR6h)(}g;k`Cx+~P^XoEUx0yqQ;O#~64O{w_750r!u$aJI;L?uwn8Uhi~ zPW%A|tr4xCv8{kVtW&bljU$#%bet*{HKZVM#7a;Co8N9<1V`_iyT93Y-Z}T4yLWZ+ zswuv+e0_X;rX(fCuK{<&o0B1M?JoS1^znhvr1;o%^5bHOfzd1d?)>yj=kqy#4Ylq* zHdsGR;O@uz3Ym0cx?)(9H9#y=<&@-rtv)m@HnJ9Q`%8Xjy{#F)aOsS>GM)lb@G>A- zL=MDCfYca`B6`Z%Y8&hcQP&H3p)oF}^{E|?37mZf6YZa zsXI1jtG{~Hwqs2{LRNS^9JN<;U0M z2q`&&c!Q#8ldT`XB_{(op$SI8$M+TSIM%;3(=;qpxFw`Zqf{O|sI=VCnBla`yBcmB z0=hE;YtwCKyH@)FB#Jf}I)-#gyLChCM~WOS7nd*#aa0ee+g!}~VoX6RALQkB_cZD9 zBIbcc@%x2p9G`pBJ6&KN94>1JF~G-B9!<8|dQ3tnAt3>RcJe-5vOKb)eD6UEw+B<> z*qrJympX=Z4nim7Pf$?e9Fpwe8oedGx^R!BR)NWhJe)PHV^#GEh^A?2ca}7pB-|QH z7uM$wgBTO*XlW}L=<3>#us`?|%+!}iMaDI5k4rsE0$zyBae$@YJW$7aRL{xh0k4SO zZ!|8v@}IRUI$`{qTQIKh05iMTXFIl`vqRkKaG^FZ?6}^+y2ajUkS~e7}t>9+U5JmThousO1k3W zv##Acy(MZ*L`+-xG7k3N*z7ji{(Vq*TwTZbgqI90$>%|8YauGbq1hb+k35p(ieU z(fPz>^E}5xnvm_~oyc}$5gLimp&Ym8r@#UZm31$`ntgA&IEx(Vok2AFn}xjfI~roI z1;0axO9~epW+x@4KP%3twES9jV1Ep;b?P`Zusf%O99CKGFyng*8aUyT^YS@~Z?;Mx&8f{YP@`h{GN? z>~Cs&%*T&N9GV4}XiiwDyLUQ9tzG`ISDMtWP!FG!0zZK%qiMGH!2?nVA4sJ9N2z^Q fu+D2wU}%QV&Lv+(e%%-O&TC04ljASOiAw(mPjwYi literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_add_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_add_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ceee589f7f31deb3a543e33eb78ad6e4fed9964d GIT binary patch literal 2271 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 O3h;LbvL9{}*8c*?OsU!c literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_remove_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/round_remove_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..bafcff86d9a43acd8c3a985f669e9a47a006f496 GIT binary patch literal 1551 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 Unx+ZiXdfSMd`(yT)0ZUp))%!m7`j= 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 PE0BPvtDnm{r-UW|T&+@K literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/save_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/save_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa2517c3941dffc38b8858e584bbda6a135dd69 GIT binary patch literal 1255 zcmXw&c~BE)6u_fPf=D=o6ob_+Mux-ClB0kOwUH1sX~zSrQx#j5xFMa2RGm&sZFC{P z8YK!cfoH=*}c0k(oqER9eJf1Tf&Dhfs zz>4Dfb?i5|7rx0>U3(epYSz~V4qQM5R%P=C6EQz}ifRSu#seGuz1bP9SArP(_C^{M zlvRGFx{qjH4K0lO&~QAfDL=2^N!mbZRq~~KA+vCOHZ>{x^>rcv#5%Xz?6_sdxLmH0 zi&gT5TkX9Vo(Mc*db<1xaHV|sKr1CZ!)^{&PDy)|aC zkT==kzx-_;dWXw1lSn4U#NaUI3Db5oVB8!N5YwJp?NrF^dp>I>jd3`^5Os{6r4m4- z18eKpX3VW|bvvcwa1P*UN#@( zPRkSGa2f!ZZQJLrb-ZMJp4DyV>YA2w%~-lbxHsBcPyjadWd#(i;wkQyTh4dq`lm&9 z#?>?yHR_*r|M@B-)41DCpB&X@-Q&HMN-Ln&heCmISM;(&3F5bf+4J|oEz6^SDSy9% z$pQehKRu{O#Phqmw8hZAHfS@X4=t_aR1Mnjj4$dPR-L3QqU2hSbXPMRd+x}^2y{ol zZRJo+q56z;Y?~2&5$I*S*MEg!a5Fn%1$P_SGYy&W@wg^pNf}3@zgPg}-K^S^1DV7E6$bjyG{3OGT z(M5f5i+h_OxtD!fHqfK~yyhqP!O`kd&qZ6DhJ)HA?sQT>PL`=J5y|sxXDi$|h5hdkS_VWvDnfO~wwfyL6g?Hg@P{5gj=a?5n_*$n%nfXCb6xE_A4^^wfctb-V$OaB(w%W5w#k%I~=*Lsi!Fr6uyi+1p~~sU95U$ zBQW#-a1d}uto5eitEr{%X|Ja$bDiR{9MS&^ Dc|}kJ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/save_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/save_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab8b3ce4ae8007b7f02e8ff9aabd84f8c1a9bb1 GIT binary patch literal 1515 zcmYjR3s4hR6x|pSAZ|1jgaFb-s+N(+M?|1#7egrVQvu72=x7N6k#9xhDky*DrKJp?hD*9z7o=bjadxFTv30>E49G`)(8L#@LI z`JkJqq;FqSD__K{P6^N>8s*)tXU#D6I4EMdYqJ$-KFLb&^i$vORypl^rj?{} z$J~p(3VWmU_K& zNs?>~+MoG^<2Y-B<{USQOgq3xyXMQMaR164T6mD(nWwG*PeD;s8cL;)o1& z*$Zr-@}u@%XqUg$Y(Uip3?$v_q@gEzOco@ZJtIGFmN1E+D!7URZj0?g2-|AzP_e>| z2J~YFF0}Uo)2IRK_9cucU4x7*oZ+5y>GdTl^`nw*w}oM=Sc$PS`v?OAVOA?uP2haK z%+-UD^?^a1_{~XlAH2{>yYsdsT~r*`iY7ZdXy>b%=0hC!du?RNYHf(y6jY`tU7G$Wo?6Th%sG!WWQ0OKryiVux;G!oKjgY)}%q1Z*}+r7!&}- zF}q0s6h`+ObUGLVD4uL7Gn_Sd2Bcs#i6=xbPq#qewvW3U=W z%VrwLca@_U8Dce+NM9Zp#$gGXpO*XN6zpl4d%pt!P|Ez=379Q4dP6-9=lwF_ReR8> z|8-q0*XtH$D?DQ{8j$K4spLmZY*`2=Hfi?4uS9X{CWT#PJX%!#Xn;RIYkS`#r8Dic zijW`rHu*X7^rOu}dLl0&TT$azZ`?{^F zX^zZ~6RTr4Pl5W8E2^BYrO@IRjq8;ylM^vDeGvnZfzXfT9u3v&0E=?mV!Eh#LtA<$VFl^z9c7Fy2>3Sv%EEy!kUip~JDTkeH&$ z(dSpC8Z0(;#Awh-dt@FAyug-eay?dvVqT>GV!oqARKJfm7yc(L;u z(X-mF5^6P1oY9Zol)xBiO%us>S>Fu>DjIPNDB?ZU$ddq*&Elz+WL*Q6Qtw$aay#E4 zal_GupCipkb?vx#-si8o+T8B$1?VXB*`Y&6@J1P-9cZ=_= zSl@qNMbOna4g=Dk?=oGmI3tG9b2j@BJ$a8|%W(GY2TPVNQxpHZ*{$G90u|t);vNow z-yZ~0UBM%%sr^a$oXbr~(K8FCCX3_=Db@P08w*6D3~@?R-ZFJX`^)nGU4>tL~Ro_&l|nvo>y{;0j+<_#eXh+=>7I literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/scissors_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/scissors_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..7c32ace8936315e8f53d3103ffe1407384f9101e GIT binary patch literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV4mvf;uumfCn=$!>C~%Pf2UqG z{k?O?jvta681(e?{!P2~?eou8*Vhw|G6J>y|DV)o7!rC_=1NGYMBKg#!^C@cEIVJY zJ$dphf5XDUi=vH^(!rBARplcCGa@SX?{44S+|a;q zcyD#NzQSpUxlPK&+^2u^&NlmB|Nr0L|4+5U|Aq&KZcR@}NH8$o-VwjM?(lzpdAmRH z+mfEvhlZL~r_=&%0XoRZG17A9Z~yt0zyII-{QUp!>fiUWU%&X}Kf~hZ-_zmi|H<1G zeW?%gdskOt3(=6|`0UM%ZEGFfqn|TquU2i|IC0{Exwp5QTUgyNwyF8i@$k&d%{-^4 z>v=kuLv1j8aBuH!_I^3bO^uC>iVxn+wdT2Y?HW(~zPeP4>TfcK-`(A2J#a$r3 zfC9-${Klrz;)6@Q#U)!>TP4=4(UF{ISADGD=clLqzrVf9Jn$?RsZD+wQbQZ)&2~+y4F6)9L?Cn)&qQ>;EIp$NoAy{g-v{XH_40ur&;h z4Ez3rt>m40!Nr03e|gyDYAVlh=lLs!9Zy~{h)c^d$cykY{AJ-_ z`1F^N;pUCU438c^VK7vZX0Vjy=eT|K;p7_(4E7+sKmhc75-`pl)c!v3;q>+QJj?at z(h~mtZ*QF1-2Cv(S$3Z3DraY(kK29rz^RjG4}AE}e|Y2P>5?oK5t2LX?5?+0LQ@&Y zj2~a$Y9C(tTVDbQB##_bmAGeHf2g3_G2vjd&gNa!|9_h8sr}mJ800hM;rsjbJjdVL zr6>IPz&0-)$sIrby}rIaTzD=Gf;gaX>RiFCs@}q5={+T=16Fwoiph7u2=)>#Z-_NhlkNZ>V9u^ z$=La(Z-bxq<;~GN_x~I3ty-BP$vT-C9EQvcXC}E8ttn*x1~SRh)z4*}Q$iB}LAlZX literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/scissors_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/scissors_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..f41ced456b3e8ad100112503559d61fe4043774f GIT binary patch literal 1690 zcmYLJ3s90-6t*bb5_7D~|1Zm?+T6;ugjy|7$}AtbvOOKs1YN~3N<%HdRVW{%=K9K} zOp2YhcB?Hlw^COWZb$-`)2ferWb-gSt@kD%?ue0yJ~HBCBoYkPWnd@e)S z>gsA^$k9%D)x*bvru8;v9~6!7vM(sSwCz-U{Gn#qX64S@`5W%Mvr=|-;UXiWtSeeD zAFU)6YPo=nTeC)jD=TwZ#6jka8F5L>)3Wi=VO&9RG0ixlwK=lQY-@&;9B*iMqJTK- zQ841i-sR7qKY#xqrnsvu2AshcE zS+I9+(BZj%QA&UYwQ9 zo#h}4gT-Qbj$}@XvL@jt=zd5Q_@TS52{v>Qu~rEOv9A07!CDeScoc!BtFk`zvgYmm zPF&~X*chX}x5+2;GZzCNVG^R{E?c*3^{0i0GmS{E6EyOBKDc^!QP?tE#@_w$N&cDsEVdQrEYOR8MRg_Zft9#(dmt+Ooo*_m54(Srke7? zbypP&jH84vZj6R>%W<3QBxb}%Pl*=_nZaN(c4XH$6J=Y}t<=&0sV!52MC1!>pbCW))U`p+nh+MvrRWBS? zPa`>*}9qlj7Xlu6xKT-cHJhm&t@X=G3N)jT?+=tNf0|Dk>sM{igRv77W`$Lqk;6Z4z;9e4dZaT2zpg zm6L;qv=jkw1)Zj|#`K#Yoi>i6ytvgc5lpMJe--elrZh|2_To)F{&IQj1I6Jbku)03 zJ-Jttzx$=7sJDDg#6;W%b@H(wcw&-+(d2v&*#bJh6CO| zyyU*rQP3g5>xHW-XL`&`Kw8M^(SgPQ54K;Pjf#Wkr;ck|zYk_)mOG@pyc8J)1Uh)M z!Z|@_oyHhF1#5&uTI=0s+i2*gs(H zySL9m$P*bEU?Lm+W24lUKuR7tr?FXK?_V=-mO=R9LA7U7lNLvvcN1JU)(Qj)+#BJd zeen}Rq3N;?XXC|a*2J|dlLJ;-Il*_Z1fODC6irJ;`5H^Xlf#jxXUnrcqq_Nso<$0d zVXFVO#TvL|uo^{?iLiz{4yBqc@cw{DeY!sx^`(z>eP~;2!|GAZ0*GOEp``ivEW*Uu z3CgvmJo&#ntmdt{W`gv{yO&iG>9*EeZx`OXckef6XJ=_ZK!7ASH&qe7Dhg zPvh_q`_|QJPtwH3;eKbx&9mh`I^f|#aCOZl;PI9C|A!r8L4$uVI0)7i&&2fG6X;#$ HMN9h+!H!=b literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/scissors_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/scissors_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..0909b7343f4a50fb9f8850f76c791fa8063a6008 GIT binary patch literal 2259 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 DG2WA@ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/script_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/script_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..f263444b87f17a138c5d285b76cd4a5488910ff9 GIT binary patch literal 1253 zcmX|BYfuwc7!9lhD$6r8E>Q>+aZqUq#PL;di9(PW1x0jhN5}&O+nE;H+A8>1mPa5| zM5VC5*vve6G>v4jmfXzF5al21kRR0g<`=7G9+cP*RPH>3 zSlaRDLxX7F2O)cc+I*OB01ga~gry52(#M?_mGcv=qgP|n?zIIU`6?hNLA1Zwc>9-O z#|rzE&Yq7BQ}T+eb#H!C<14a8q}%q^)_klPwy)e8(EG`>W!c`x-Qu@TE;7nRJ?WS1 z$9aJpP>7$D1o;QXK}l;lP#`A`8jVlj3Iqbm;Z&JjCJY7u$fORs**x|24OmqkkK8c; zfl-L%LW@)b>dGeb1)i`j6k5wMlNJ}VZpgSle%zExrcMrZ_&oMT$8!BJ;+ zVqEqXh2(t(%Q$1es`(yR7#OH001V#`??4n+s+k?!9)02vX#=QU#U~>Bl?lm$ZgmRv zEKEA-vWneRbc0!37C}=*7mrV^_jwXqxo3Zsd5*x~(Zrju@*yGgq`QFPu<0;nR=rozn&Kcet&n%RLtlrA~x>!qJ`lbr^!ZN3rZ%3IR$ zUvps)i6967C4Y3xHiTdIns}kpU@!(;C8TQ()f@CZ^|vZ_ZtuVwmCg7w0);nut58ky zQ?H;MnVM56l-*Wmo>}0-dy5V6zu!NXgwPhXfO5U$Yzy}A$#fD$DbX*?|1dT4ydT^* z0AsZqyWjPaz?UUxBn_N;%ff>YHalm^>Z4aln6`1r$m&6NE!}tZH>8lD2vYbcZmev5 z4x3#V%T{1O?eHAS$FE;>oo3!ZcCViXOD=o7aa3xwGuD3~J1I>$O_mt~QyfJ>N?BCFNSX6x zDO*9H$T6Dft<7>4LN|@Dg2o`WszfeK}e8sUbhzFK*{VKe=^>up;M<<7_EQ zmnZFy{8<)mEXOq5s6|h5`|z;MIyBuhrJ~h>K45Fd8(Uv1jj~MhuQpH%b9_j++#eb; zZGcw*OemlocP%X~)A2u5cs<+i>W%{ENY)f;e~Lt>p44fLMy=LZ|FD5+R3QaST8ndz z&t4tv!+uNQ4_B>7gt5Q2l#mRJUy$aN5OaC+lPBMIa=+Nz0jGvja6RurC^=|R<<^KK z;`3$`5dy1bw@ArrvzwL|yzT)VEH3^sV*5Xr*1WJBiD_O{(SlO9589!{5R{aZXU1`_= literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/script_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/script_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f8832b2f0807127967022486a31676f3e8b636b2 GIT binary patch literal 1617 zcmXw32~-nT6io;Wg2N(en}`y&f~_71iQ~&p1SOzVtXmS{ltnN@p%O?kzdr~Q5p?l#t2t!*mpWz#1z3n8UXXM9Vg%En&69EbBZ#e zt=D0D^1D-be@l~~{u_@3w;$8e?NC)ety5m9-dq<^WqJ_WPM(lg;KwC0TrR_LiA;vi zD!m4*Kua1047CCStU{0>G7XOj7$Z6z%1!m*7MMom_?e0$X@K2X($)XxA{LX$v~%xi zZ*+^~FvXp5o924?=jfl@X&lU)KP#c6sAS0nWl#;##>2{Zg=O`xZ#Zo`v@)S*W#a`$ zYegB;#o?B)J?d%I`(PySje9U*Gt)nOnSs*UVFZeaTRks3GSnu#$$7U9;EgJ zxW=!!+I{Yo=EZK8@dZg2`58i|n=3qnw}v$d*BN+vclRZEYjWc~2VTBxy(e>85W;=( zJk(>7tw0uLV{^Tpkow*VnMwcj@}8y3>B; ztFru2hny3t+AB$cZ*wxA-Lkx8Pf|fOk<|#iRu?OQZ@AUkLXh16LrVTT)TjfVQGal# zEYX&&TRXZEi(4(}A`|6PpSYLw(*k6>4wR z5*iIb4)wATxnfNJFB@Eoz-#H#3`z`yS%8)x-x#rCHU@b2BMMIiI+Kz$9LvO*0>^Qg z0j`3cdYDqP-Pu0N+W|0rFHW>50Gi_OCH%sJt^<)?0W)W7=yebQt4U=P1J5>P7~FYl z)D_^T*J9BuqS3;xX4nD#ePRWmcm=?$@Jl&d8R)#Yeq3Vc)d3WSz~Q{knSu?9m4I~@ zjB7jc`hsHI^>a>6mXcZl04s@HK84bY0V<#@S)xo!3$fTYww!U-I_~U(V<>um-+Vhr zH6+HsSwFHAm%&pm2{aq}dyQC0@^r`*Zh&JkkChr)s&y!kvsg!^!kFEWy4zi-lCox* z%%yUJQ72gbcuKn=u};aPC~F%z(i>Nd-Tw?-`&`={f_2gZ0vJ5yLKq{8VpI*+Vztiv z-R43ljI_OW7Ib1$N5}fx;1V%hTl<(dvu88?l5o3!1(%bGjXV;b#dk(|5YVhp$9}Ou ziSZ`G>eVVxsZ^>l`yfm|rw$zkn3RP&p1_(URxNPA3b`-==ez?&cYI>rEgP(NT-wLh zES}E40x9HKz*r@2@c4_qXm5EB4f!$+fk!a_6xY%;+hIzmH?(E|m`o~iX>R#RL^Qz! zK>fz{&lb>ZCnbxrnwkl6fWGZLHO)Ji!6@}z;+oC30}k>d8@_7IZD+If8(%4*LQks) zGdj$mXv-a?WkQ{8#E_lH-puISqp*>PylGE9 zHk*M!T@8yM0#GeP1GYll@VS5mbV6{o0-G$u5l#r*}!?v9;vx9uSH(z&Iks48QU_#wWQV_H+x%v9Q-5thFzgP5^GOo z);@C7i2;k@SDL?<1ptKs+PYW(#f~Oj!?L+Avh*1l>86o)EOnlH<9BtV_QHZBztjy# zOPA#(MGx%elF=m3^Z7)RBh1<)WR3P{SQMuq(^Sw)R|jvrb+~SW%~CM_eA!{SJoyK~ zjqfgX6eZwWo=NA{Z@ivl`F7{u*P(+kFlN+U#sGD|1i#|ownKNIs6F}V?$4kFu8hvu SkxzQr#$!H>6;^#BI`}{5$|7w5 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/shield_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/shield_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..d9406126e579cb28da942eb76a620016c24074ef GIT binary patch literal 998 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU|#F#;uumfCn@0obIdc@+BZh; zUnJLL0p%I~|4%xky3pu%%>G`J^*v(G<0YrweEzF&B{Nu#!I5F#e@2ixxmo9H*%qbR`j%$G_s=QBOr7D<&ASX2-~ME{`i*tpgTI`!{{Q>S#Pj>J)%X7_cU~7* zO#~|c{~v4=3rMRG)B7eXWeJ8yZ$C3|urf0!hzT>OONugZ16_RaJEuwdz>yONHavY8&c>;i z#wI7`abX4L215fN`1AAo{D<$_=kuh`t4Xf-`_Q=A@P2$-eSMuVNEYOS|Nm{yIEpzK z2(WHQIQsYes(Js;-8jkkiM>E>cGkNoS8Z1JY&kc{vUFLt{#1{+55VyI|6k?IM!^OJ z9*2wdPFCF86aE+G#2h#l+^5oX@sRm}(+s~)ypD{Xsakl~an_H;avAj;rdMQ*-S0VW zIi+}-4PpYzL2s@G10IKi=?nE(4*s6+v#We@N7yZuwqG+j8J-J2OT9be(eZ`nQhV3* zRXU&1SQHYtip%+X(et^N`Z*u4gWSM!(3aaFK%(Jd`;3iIf6|^Vzp1lq_nj$K_R3G^ zh%G3&yiH!c_`hP-okbmz^BUa~-mQ?zS9AWnU~56|X|4~z1ObgiCQuN3%{AO}{>_iu z%%5H{h_n4=c=z!W!>7+*7@oiX!tmoCBg2<3Ul=|Eu{h9XhPTfcp8Vsy|Gmg!2S_gv z{Quvy{K)Y=pL%ci&q*_Q@b~*3uz`l?^05`RH;OMlpTqUfco+Qz5f*T<$9h^8hd{Qlhh@aJuQp85O#Cp<{|adyFp zkJBHXZqDZ6Z@Cg)uUj6$aT(+oV2XF~zkTWH=e}8mHJg8FDIESVd*aN8H@n4oikxbA z;@`z5?l`Yi`04199PX5_5bF*ZG&D9gIxZ?WRydRYyN*a`sN}u9zYl!)_f)t|{m&`& zc;Azo9m2W6raPH6Oay}N&d$#M&Q8xB?b@WS2hG7JdCr{qfB&@9+23ZH6Ta=Q{~!1N r_xJaQ|NsAAZv;$p$q5Mw5WAQew(lyDp1|mt4&r;d`njxgN@xNALZ;Hy literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/shield_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/shield_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..ee79b590cd537b94e4c751efc41d7bcc5a29e943 GIT binary patch literal 1704 zcmXYx3s}=|9Uhs-dNROb#W44YER=7k(rA@4~CDR&~h@qA)sZMD}13^^WOy*@w zmrhrnJ+>Tz)pA}EL`Qi!!rU{rlQ(8aW+vsG+yDI0{hsH&{GRvy{eGYK`@HX4b~5fG zCx_h*78Vvxq!{8UaD_&HdKwjJ*)bfd`-48ElsCV$1UCQx z%`fpg!)wP!f+{@r(+L*+MMg>sDiN`@<~L~d`~3L8p}Jm=%po53DbFD|6Uz#uHZafD z!+O9iV7yLOeSPr7D5zjM15_rQzv zZ`;%~!~K;xguVg??|gqVBl)u6yw2_Jz*<<}nNK*;v8U=)CQSrnIesctkyMqcpz8V= zZ+vPDgm$vPV3ll#S4b!kSmhQ=?Qb!0vdkl+12fHaO!PAApf!d^{@lBLR!nW&7*OF zW4$jO&03O2#P)?4SAvq|SxvBec_e6IxATm9qQJSSr7TnAYV$=>Zwk_CvO|&gpX;#? zV_Q5jBwo^|Lteh8Q^Oo(-DB}}i!sgh7t-!bjCls2x>n^<{s(s0eV-&}f!E}XQW-9!M)SSac zigI`7ucTzr8gJtLGO2Se9I<4yd*|VYCk{XT-idxP`n-5B`%vYb<|0Au-AW>3ar7pr z7#Lr*72hvJ`ikxK@%=@XUlvAPB~`?yTIy2)PFTrm>pJ$mreZDEHS8yylYn!qWn?Ds z;E{40Qb<|gKTv3I`c(LvErIZ3C!7fw4-3@=yUUjAy|oQL+K?zqZTq>7$DfQC5U+ns zd2FQmKnFP4x3VMOA}NfENS`)E(Y`?xhv)Z0Ej;1Mn{Vz-iV7yd`v`*F`oN)(VA0Ph zrlqDW04$n1+D7^zonN=(k#?`uy($*tB!9Ub`_Q%B4*RisV2}OJCzE5a|DOGm|NPGV zIAO@>h@3+LhZ5G*MabS@ps8%5yV4xRB2I<;m-U zAYXJWZ(jmE$`e&i@qggv?h8F!B|gClhz`9>X3lnpzX6|~S@UD&gYHl)RAW$LdogzH zA~oB36&|DRpY&)1hAZQ;z+4Pzr)rQstWES8Z< z-7tO;$yK9^B%>~n>G1BfynXbVvP(YO=|nRW_PlVx8#~0pcgdS%a*4#C-zjTDOoL1t z|JBaQT}l9!34<}1o=LPCPivek#}+=<2mz+?>3REvJ+D3ztKqK#y%=4BYvs6{drah}1%vn19C=2CCyT`4 zChg?0wXbtwKRq{CH$8xWJtNxEhEmm{ejP&dJ`OqFhQJn3p#`gdAPGQrf~Z>f-Nz z7YX{FNxJ?JX@I60W&$$u&{-i%`qn-aU^41;006j{Cm@`50d#udNV>oGc3o?WEcU#9 SA-gcw?30eh5rt7y&i?`3)iG26 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/shield_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/shield_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6fc12cbebc397745d3adcd080c0bba89976157 GIT binary patch literal 2443 zcmX|D30M;A8b(Rn5RFP9JA!0sWyw;OEfQv>X=>$dJLd|bWxLX+bvG{amPk*VlmS#J#z13`PX~R(4fN5RRx!maZ5iLo6woO71XiicI z2l+u^`A6;-g=>+uV?5k8yQ+Swy54w_p5)ok^Oy8_FpL~-)DqLErTlGDHSs6*3^BU} zV8jU$>f-v}sTnb_mCo4kfghMzJ^|s!OYZJpB`znx8OulO9(TV3hF8dl1my#|(dm3N zK%*CTlSDF@NC=Ta z?~1G3YdUvRss>E&6RV$+e0_X@p`4VW(?ZtCbTNw+oD$jd<}<$LsQLJN!<%U~!j%py zo0(BZXQkmEwfLoG&p8Meq$Wp@*Pkr5dQ%&+Csxz>8|uf|)SB)syrB6bQnH7~t3%!q zs&z+i3-Pw#jT5KBp7Ao?a`VAbn)J+%8Q=b_dK{QXtUDG{=zVZ_RV8VxKGEV5+)CX3cQ2H>cIp zxJ!wX_RKttiPoOeCW$=nELNk_vCjy%l`Nf7m8jRLrl&#T+j^ga1Odc5e}hn*HjpJ<_|C zO-R}B9Jg{M!5=Iw+0c{#$ApsupgND7;=I9VDT#BdVb1!f`DLl@70!Jua+MwG?Ecrw zsf^{K)H2JexI+CA>zl zg5a1gFaN`B2ObU;pL7w;aKEL$7B$*ISCa zpe`w~$hNDdO4z*?Yfk+C8tIdK_H*;@pm9P>Z> z1GmN2zpr_k@KVz7+Zd`JuR`qkxo(7MjBjkzWu@fmNpb~AMv%hB*BY&pIjqxXfxT)a zmJL8$oymE+ISf_Khlf;7BJ`w|e8N^iQdB&gu75A#U)TQKE3aFyhzn4YiVDmI1GUOKe+2W^+8lxozQPJ?YDMOY_TKadifR zlN^TO4W4P+j4Fi}rUwRyRZ9p&UuiVU+?SN2k}i+lchTN+lDE99DGzl=?elK;VcG-k2V-gb+d3GIbYY`7Zy5`$SHt zzts}g|7sB?arXht8<~tKO@b>mCd;ZWQdl)#4++5$L`?vIcj^otSOXT~=`7@9esqR_F4I_P1np+RkMXUd_F-#38!y9+rgG%9xr?Sg*B| z8yeXJfeCS$TFDkMWv-R50ig{50*2-RmAcD{N9QN-3&4`p%1fkKo7;G;NRy7SZSzQK zc9@#b*V=1%rDQYmg0zeW5G>bpTe?jWKnN#;A{3eN5W}cPtgA+Jg|Fr~2U=5&Ktd7N zOlnAvT^6-!pmoAml$N=I8~vQe!}a&Xf9+Ee7OpNMLZ;DLjjGxnVI`pRje{3cKs5=2 zJP`;Gw3DNU(^;#sb5l%mhUmGMQkL{DRa9UNe#9%~-d^rpnjcQEOwQmf`WA#-#i!4L07zOv$P9t8SY9CkaFILaCHFP9>*wpjt zncZO5wSBU*9fbQ#pt0g@RgK2jx(PFR0}Zp@+6m0@oG&^T>v?LRNOrnhdZF`5HULcF;Xe+0gmG@mvsGEK)QE%ZD-se6YV# zs2$&0Z;F|gD)}BU&-6`tzVMQ_9O+L&hi_7iCOdSX{rCBbPFdO;`v98#cv%kTl-R8d zLs=+oDbq7L@c-Sg&XeQtvhQA$^@?fuFAHT&@wHz+%~P_IXRUq`)wYdnA2Q2lui@F& zo;4dE=6sCH{Oo4kX^!KdLpYWP0>x5zLI3y+MWZ}s_GB%031g3O3tS!If8URD;(wi@ Bz2E=< literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/sound_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/sound_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6457c685e237416de0000f5c04c61e0a79bfa924 GIT binary patch literal 809 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVEW+c;uumfCn-fih~vzjS2-uY zC0>31pXdHJmB`bFjxYih{{Nq(rE2Gyok7Qt4!P zAn(_|lJ53&Xkn=_xJbl1@@0$+{^yox~MKa zYaa_lE2qo6|Msa%rd*Y1IjRa)_2KpV`nKx%b;dS7f3-h6dEK68e*NF%AK%~0H&141 zpR9KHb}A1Lz^s07e}6qs{eNSFJ->fWe+c5p*Zobc`1O@vrv4wVp+kgMo8znZ>gsGj z0M+yH(EIuJ5^=Tv&VBfCI=`*nzTTkb$H(apPd<+?s1z)7YpbvSZ}8{;e|b4ExGleb zU+2lczc01o`%iUd5a<2=n&gUK|F~n~T3_2AUjP2S#Ju}^Pkxv(v0R=R2q3;Qd~mn_ zzJ7(C{KNn;(c~SU--5iU-0*Y9oseW za*2O6KTjMuapDBmWOlHJlUx=7<61IOLQ>Ll;S7GS&Bj3gYzrVjf++Y9y9waFmdKI;Vst0I__D~?CV16o4M~Z@4R=+*(QaAnJ*mL)IRti;<>p=gYhxTeTb%wWh%dtQ$* z6{JPq(5h=7JbUEIA(Z4ZI%A!bzV3l1Z$x+=NQ9qpMsbpD$~D_?AzMQ6B`yz*CXMBLWi?kwZhUM+yG=XH+wo`EMb zEu05+>e!n%GpO7EKzfQZ|1bjS{7!xbOH3fG*CE$CwDgna7;i?`XbK)($l95EnelpI zS5dO3|2y}LFI%m%cXReflyx1iQU5Z;M(t6ljW`vs2w0PEO$_+cop`?56BuBgK9Im9 zZ5ApBFS<5I1Yk;e(;%>h>Kyo$h_B;x9#b4T{&J=`tZS5MXu?N+8j^?5H?w9+COU}kDNZt?!d_RMEX_H&>Ins zs7b4q=xK}2ec}?OtPllptmIgpsn?JOMG8G;q}Hb;Dg~H=yCa>Fdvt`O-Nbmi5;s7m{1E35!y2hnecW?Wh9 z5AQ*(WAB2CnfJhfflogO_j!MQysB_V@9*6K+vmp6IzzcfGMV8d3#y-?=CL zT-PrCxV5E$n71ShQ-~kiUHDYDT1#t2M}lRi$O5dcd8sI%@tkJ-Xk+Y|6WOLAFC`|p zYOxFKb2&=!tawLOX!k8!Af+{}Y;o~85aGi&+8BI)l{)9Z-!QDIj?#7F)Ed_l@B literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/sound_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/sound_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..63339d7c4a9ebf3a2d52692629937ff9fb74a583 GIT binary patch literal 1746 zcmX|C4OCNQ7#>`hD98*?ZbM=U=qSbgr9&!iB0nw=u_$)Z*v1e}opn$%B8>ew85$@G zAs~Y(+9{&|(GnHCv?~lHS_U;tPh%iXA>Dv*gWaF*+Vr0D-TR&Id*0{$fA8Up^pwSm zLKl%pq{V_QiEk6%748*4Cf=VE7ynBlk?RGCn=*^EIbxcaI3(eC&e_t_zPz@$9UUdY zSr-UjdPDGMhjYl+bJ<)v{;Sq@DYiurIK{(`uRI(6|9SIw!2NvDx3l+)A;b0$PK<$k z#`a<_-|3U%7uF43vC9j%rVL5ZY;BFIvc7ZJ-y`@|0L>VG*;HfOQT@YDA#hgm22G1i z&TZ##xCoBxPGx&onq&Pc@^r(KD|$zB&$iyOPf;Rat64#hx-6s#>u87edSDTEeZC)T zE8oF`;-yi&5z^LkH|+D&#GRUk8kNez2Y8WtR(g^BUgWj7vDUS(L^2}>?4wqYT(~-! zoW3lXoJ=N@HxT>P$)gEgiHD?Cde*0N82-~(KJu~N;7lzmw_NfA$KIjyb_vKy8$Z;f zh%oN%b~YD5ah;{V;83X<$MT&HUF-r6hkku#=^bv8?JhZLjBo{>*!pq#RMiIaun66N|#q%!w{+1iMSYW zo1$*j-?i@OY#O+XSt#oDZ8Y_e!63hM-dkb%N6G>P#_4j+=~TeEE$EyBRFhs?`nq2{ zK5wuuO+D^&x>(~+1jG47kR_H@$$8r6HQsK6Bj_}n|3kLm@77!>$UB**= z{dzm)Wj`UF6E|WIC59?}-dmO@dynI>Sypv^v63Csz4M0t)~_!i3No{OpHHZ-;MT2U zfwI(e|FqHz3-A8zT##J$X*m1EUyh8)>DA>;4-@^K^m1SPGCT9g$@B65>z7q?f|V9<_HTRjCL;*CULtX#lT6rJV5Yafdj-ev ze5cDwfz2Y2)|q`z+&MF48g$iUPdzV=31zKJZ#c-f*WOY4mDIVSZ@~WK?luiyq~La; zPpefH(`On&nuDOT)fShjZTRBmuqi7aHtRrIy4Dt4C$5!;9s!Bb}HyF^QK2PPS6W)y0rOv*nXmsoT>%x2 zPuSX63?3Vq>*?<6>r)%u1D}w{xuMU?$<57GP1A|z4xL6DrqSt=6MG^L^CX-y)%yLK zuOD7JGms_=gPLU8$35MIO=d_TB3d1P>fR6{a$>~ed;owIUWeJFXz!#1NOgO@Ghbv@ QyZ>4wK~j2RYl8T|e?B;6q5uE@ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/star_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/star_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..48ef254aae0bcb307ac6e067a80f21bd933e0a6f GIT binary patch literal 797 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 TcwrNx0mvp#S3j3^P69bor8x$J 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tag_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tag_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6f17c74218f4ee1c6ec509de922eee6a93f791a9 GIT binary patch literal 1025 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tag_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tag_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..74929fa59229789307e9b87b84adef91f641ed0a GIT binary patch literal 2163 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/toolbox_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/toolbox_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a788e912336460deb4c6e3eb635e8fe610df00a9 GIT binary patch literal 682 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU@G)itS2GqQKw3It`Zf@I&B#44T0jWt@VF_tjO;@+AkKZq~pqmk_@sPoT z&(F{EnCIO|*irad?C|sR^B+E1rgn@c|K6UX1|kr{x6Ir1eWTWMdr37lp8EnU`gMQ) zLv$xS{P8vP*yVFG8mG?Ycm4E#|9+nO|9={z4xc!1=u}(cfmN~X77+WBetvzeet7D3 zdr7(d{|8W~TDn(s3*sQLMCGSq36N6!>L zdp`BF#KC{RfjZJ-vUqCN^zd9icR%sRsWV3poH*38s;%|0EX0c`2?+@sUPpbtAJ8fap&I>i_Zg zvpVzkIfjRS*RSFEa6%wGA;D?WTWg`&t@C>uAKIySL0tw``}M2v;oJW6CG%<%Qxw$9 zBL5c|*Zlu9u@ML$%9{Wx^wXU_c@GiRnkVRW=5hY-`pA@jYGrT-G@y GGywq9i9baE literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/toolbox_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/toolbox_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..137e80302ef77d5733a3dcbcf12528b22b8f3c44 GIT binary patch literal 1039 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V7}(*;uumfCn;fpAyAOv|Nljn zOkg_ch-zY5o}j#xn4M!-SQx{6MtS?Xq#GORVh?}Ijh5PYk{P1x;L?jXZ*EmII1t~^ z+snJ2yZ-O5qaVJXm!BgBG4D_&qq_QXCShga!_WQaOV<7W*&NC%EG*2-Z*IfyKT04zG2P3Ppr4GES1s*r*;^gw$_t*b7sQLGWb2%$SN79zL`~GiiV`15;9!dZTb22ulC`m&*df7)%`mE;p=((HC^@l z>dz{iICx0m1gGbw`}O}*EB^gtXO`YCz^rWiE#uG6$&(*me(ui$GvMb_=EIxC*Gue} z5h1aoV8^rH@BMjv=Pl#usjoBq^ZR>$V|VxLh4uGU+qUn&XKb)B>AbprTusW4Pam0~ z5mI^fNcF?_Pd~HW>8Y38SM&emhv)if7JvW!n)z_|UarGaPfwTp_xJbl1#4EF`ta^t zXq)wVI|Bow#A9oqac2`^Z0wod-cCN7e0Ki zAJ(S5-p<$~`<0;q5Y+to+WzoUxLVuw93`HfGc!IeSgCdT!^6MTZON_+o1kVTCL|>M z`2JqLxoewTbBCJtVRN02A09uBZae(`zk$J?|6Jn6TQ?*<5D`dBNI7)osFl+j9`-(& zWT37DWD|Y^_v5Fy+!bUkpC4Nv z-Y$P%GOj*3>Bkpt_b64ynny_qKfeC82I^pjh8x&@U%wh3-VRJz_xAih{o$kfQ?Z%{ zi3vY`iUyT20!;)a7O<+nf4L8D*N>M3syg`L-|ze`-5)AP&V2YReFT(ufXbR8K77?a z+`oRlq(t4Hq=bJzyOX&0)jdo2!TJ?uPEwN4kKZpvnO{E-=V^PhCPH~~%7=%Rhwq=y zmz*(Uh6>F6si~$v4xRb?;K#RKt`Gw$zJEm@YLZh^uR`ThfW|CXcJKv+3(LFA42uFC UU%0l{a{vGU literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/toolbox_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/toolbox_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..821b1225c591464019ee435c45ddc947ef666058 GIT binary patch literal 1243 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 C(2Ons literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trash_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trash_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..73ea77e65a7c6935861485810c58cd7afc4d0e5c GIT binary patch literal 840 zcmYjPdq`7J82`MxK6ceKQoB>iNM%JOo0djIx2;(T684~?jOH4d{ZV3pVx*}h)&3At zALhznAh4KLuQP~FFfzn2k*&g)Z!fa};SgO8TSy}1H=;-Nun9`^G zG!%rL5dt09kgS5D?t@A_=6V(v0@~2<2vCGkF#G2xNP-_E9t%b?lmb!ULG=4!GKlK= zQeUhWMR8^!mC0;08gt+OetBwjZ;QI+k;~rc#M0+r=lajqppJ?iKbj(tB%I{t_)I5q zGxV9`HhYn;Wx(-pS=tJj!y+G2)+z63DzRP-ZJ#G$0yrSUmjL4DLF8sZ@^c{0&44&R z3k23xlmapmRzale%@#QpFN8>kmb#>g&T<@jpp7N4+j}O+_a_YiL^gAa~%o|HaGM?|q`%+2>3pq?C+*5l;S=&HUlUo&2Ur&EKT#=r9 zv{`dLnbY39YSogr3pM7;rRi)MDrg-%n7^B1jhw5yi#6}H&YvLJniI#}*+zs382QRwE$P_Q#o8rB!CX|1^E zVt;v=kaC?a#D|X4Hqr02t5+SDkrKv+P-auW<+;ZppA6G#w-8I%gZ_~7D^IoFM zx_x^aJWeLA#**nx>t44eZ7V;0Cx5i>b%gr`>9$Y*H=6P&5F|;acq8L)e(dQw{q? literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trash_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trash_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c169f296a6af4c06434729949eb69565106d2e73 GIT binary patch literal 1264 zcmXYv3rv$&6vqpNBIU!DHw8C};3E(l>z_jgr#M)#;^}4KseEyXVhN2`)ESm@MCb zb$*pxv1btFK4*PBFF2H3mDo~jXZpWxt94dhy**<&e4}9`c7JW9CfRqAmUek+Ko^uu zi+|GNAS7JEtu9c9oL$`4C5!6Dk9se|M}8-=MZs*OD39Lx(x1fcxgAkh!Y=?n=PycZ++EaF<0(oqUERN?J z0~DOtLT$`muZH@M8yvTX3^j*Nr^dH_HcWr~jk!ZRb7WbJodz1Q9431k79wTTobjbS z+1Z=!ukTiI3r`|6#>iiHzkOM!zMGaIj;$dpxI>Ba{C5v41#?2`ffi8~wSXlkY9=w= zq%$htayWQ!ww)S0iQ4Xz%ZgL1)G?d!)92oSyfW4Pr@gw=SF^lkzu3Kp*FxJ0gr`i6 z^Mfh)Hre)ozNP$l1WHtHA834eFe4Eav^}C z8eS`g!kVGJHOj){V`5@7W{WVqx6qei?WAkQd&`Q4t@6{&2|rhSuw~wE3X`X9?PFB> z&C;Bp?x1@v)w&#b7XXYC*@(Ix)eTfd&(E2J*Fuy1R?w69!hQfC2!I2JTyu|Q6MHDO z!A|X=6$0hK+j2?z8f+{u>gW~cTex?hb8F%fUwXzRc)8;vIIysOQUL&* z8sPp>{D^`LOs42q=imzT0?DO~bHUz(*oEp)>U9SoF;-*Vt^y`yeE?-RowhneQ)h;N za?7I6gRzahiFce)&peZT+>Bg9cL~^YF`L(iJ zdHGjyu0H3>l%x%lTtSk)D(+m#F_lGyccl@l$OlAX5wJB%PhYG{uudG8PvuGAH7A@^ zh{Ym=SfB{bDV1pRC-m9!?LrCN>HN1s`cq?tihH2~8Sl1362&W8GRAV%%&UIVc9@hw zVLmE)&`yW*-_zjEA{q?Sv1ZsVN)fY=Fx1ya2}jW^kz>)P7D#~FIzAX9PrB4#7wX$b zFj2wL^CfNx65o3S1vU0Z20YiXNCIQQ8q-z%oF!~)D~YBO{xGxMywH+&;$72pW@hGd lV4E18mH_l#rbr}mhvRV#d{eg3(DcOh-n~n}xsfP3`9I&EVxa&4 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trash_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/trash_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..93f19ea455ddd5921f5725088c05e301c765c6e0 GIT binary patch literal 1652 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 M)6+!4E2(1nzxKT7!vFvP literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tune_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tune_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..0cfea4d1c47e70db14f98aecea6561b0a3c4d6f4 GIT binary patch literal 1600 zcmXw3dpOg37@x*4KbN7HYc8XU8l&9mY;z}<>Zqo$8CpG0akL6O=QM_85pzz8a8T() zr)Dab!+DGiC*?9xbadH{l*s5}bD8g9>W}aDeV+Gu-_Pgse!kE5W$z93*G8HkVKA6> zV1Up5m1w+rG!QHIo8;Yc7!08v=tB%oDWy^>oK})B0Is{QQ$}iB+4-o*oLL2~7?4YE z$G^AqyJeXVK2J4XIgZj;D;X>~f0}C{BisM5If4aFL_!X^5cDKCcazC7pi$&~GnPT# z9d9HM1OTAPyZHPWnI&AnWdJmZ!HAX5e$o_7aLu&Vh^Yk&i;vj;US(ou8+Ac>IRo8D zDl#S&FWW#g3PmonB!Wd?>E%oqW&q-FD^SqnUuAef10Jjt4x@#>RmNkjqd99};k{1C zG)Fx((W3;7i&rEH-DAhCteRh2lZHdS7Hz>CG))fc9U7?-@0=ZMS*kV6?B)u5G+NSB zyd~$Dv56^pZ`D@4aOo%N5F8DCMSHpj`4%1zPx0U}nWV5I?C0Q8DW>$3D+STC5v-)YV9XXhv7@fkI(B!$EuQ~SfqOCGZlUfPo1uJx%JM5@yac26(!tZ2B5xT=9 zaea-)t^V+p=UdUZ>q(C`fuNTr3X{~kMl~Kw(>cAdhQ6PL96ewqp*fF?pw-!j_*;9- z&I~scrcP=6a;cdfL@nA-b4zjKW>9dkO}9}=Y(gA8ywLyhR%9~n)TV!|Ta?JQeMDsY z>hw9PxDEa7IKli%uQvUEb#|yPN`MKkz zJ4V!}Rb^UR+NeYi?(@_k5DW<-(<$Nuk1BIgzS@fmUf6x8*5Ekms}i&aFN2Q5>Y%K~ zF(+MXLv2E$MA$12Hfhc+KZssGsT!N;1qtPxQqSi+Con#ZOF7W81*^2fq0b4Ku_`+; z*yd&}$E?kxY;3tfZ=a82fCkg}Ofv20$)8cejSmRYQHuuV>^zHpv7Rux3$G*!9{lz>HV+(&J^oQe)lQW&De3;+}i5eesbh`X5J6Gr`a^C^gR4B zPdkkO!NVk`bL4y^8=Wl~3n{qReTmBpjlLUqwf0nArNLE1y@~-UQYL81D;9?gf1S*g z?_ejf4}MZYQ0HZfM)3d0ws5d?l;ZPj3E<%wwT9kr{w(8A`iJ7&6!LBG42}z2AT7_< zpOji6IvEV{f-z9U$Yqm8aOGgs`Ok|+!tvMmN@UD-VqMyASJR21CF$uICB(?C-1KxY zYH(;T8Tb#V-~S>_WVJFF&MSQ@pJTGl!>G>YkB4$F6QtWxs$g&zbF_?NmFj!?Ks+otNepb(>W{OqMJB znp@2-Ed!g3T$nEWsVpDDM>PHLUGJvrbztc0=jk9^H&jD4gBZre9Ehox+aILncVi(> zrDOjy(28DOk_%_Pbi!HK{eI2g7~|sOcZlqeq)TIQuX=aUc1*&zAt+?Z0{k89!qE6>D7FoZ>Y~bFADR2 D)^F|x literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tune_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/tune_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..72f5572aaa432aa43f5904e8128ff4172044a0fd GIT binary patch literal 2265 zcmZuzX;@Ne8x|241jWPxvs^$;v&2kkTn13mEOXH8%CBrfLTy@1r*SD8QQT7toH9+z zCBG(HT*|b}1aZ%D&*e%pGSW%~ml-jZ^Br}%=Fj)zoaZ|4b)EZp-ur&u=YG>^KAuRp zAzVd81?jbi>IX)Xl}A$@e4o2;VNpdzv&f4|@sBBB&@psyQ3U`D!`1$8WF*-Q+$p?K z(Jr-OivW_&;lt8Y?&mfIaB*u`@D1}F1Oj0VfWf5G>6Ljk;wl&2jLh6>1k~PA7pkp~ zgT4yR%tRmnz@8vaofj^$)KdW3I{?u90qvMw#{;k!B_L~)h$o3DSGsQz0u^14#C~_4 z*sqr3f4LD!CZl1Y(G$%SJvWUnzUeyx4JJy}BL)Sntt_4P*3ae(I`-vxgU@UydZIRU zz`SWOo|0$Zv^o5q$1m6Q7mjRoX#DRaX+J(u;JzvI_;>)r;oT}Ug9|K~x&`b_7QSVL zsQZL?s6!kr)T6*?;o*U9!eTHOC1tsNz3>B&==8Ukl!jBvW!;hqF)QT?Pia@LY-=_# zv1lxse;)x^tCeG?!zXA$_p?=B4$6V_ks}8oPCKtnO|?Wjp0hbqvg`T;%HzJ88Cz76 zrZ&tGbCL5>+wKv$fsI-?(NwhIZrOS9%R*6t9GfbtWVyIuL`j{tF#g!e=b&{@%XUtU-x!&tg{P_JI5%vWu)yGuibI}1*w^t z)Dk}4if<2jm7~Q{u|&AeC8C)ED(g zeFmQ#8O1&GtopQRQ8~XA|Iy*qD69M^xzbgnF=>JgF~d*%R`#@Z)2z=@Oz!~k*6;j; z`HR6i5#xS8;IK!$Nv_ZBuRsp~LWSqAM>br_ZFe#=Z&+*i<)um8ra}@bF(76)Mv9!q zC>649zC1sJ(kQqr9C>Vu0F;zLvqTFF0+#}P(j=L-`4NY*pQ z7xK=7$6(S{{f;pStCR;Fm&#;BkhT?Nu2yL!(NNUFRM*@~d0gahmf}C@bmaB4vLeaY z(P(6Yz$ZNifr4Arm>ToynklntqZwQ(CdX?LbeJc zxA&+^TW?sGSx?tPhjr-+2&`0g*12Lh&SUe2nhCch{TJ^0uw{%V64h0?uTsF%fPx;F zgS?Xiwe>N+YQ-j+Em4nq-7}^%1O&wA-Lc3tA@uzj7hti@fDpz}Yc-I$2m^KY5DA&I zse8%mOY=>yvwssA-u6FxQ->S#58)s&P2(gMwgHfKNK(`FN|s4@wFW?*{3RX$u(_L$ z1@Ah5?c#TKz<(M803cK<{mU}ZV@5RvfPd?OPa9XOE;mWU;$tZ+9?SHkV+w%C1e651 zY$1PbbJ%j2|nG2psBlvYtt(SoCstD)wm>iiC36anN|5PpQ*p?k@S~8^NgYP zsa9iGE#O06cgh@mxR#D8rvx<{27_NlX3lo{n!2PnST?%O6;`5AgU?nc0UIwMu`qGU zq-MRqg>e$tSn?n#FiCV72FEG}LuF#+Av5veq9kere*7co?umP<#g1!9-{ikB7?Opg|fETSTCJJdMF((2FKH^&f*!L-wI` zdK^3a<2Xt4ZAEJ2s|o3 zap|Q|+RYK2w7c$3>a**8{R9NU=i96MS;?#m{VEnCYye<~d|9R&lu(Ii`m}G!cjE=b z2_3y`#_&bqcC(=3`!b*~fkMj;T1b9Ni#46M0ln`uufgtL(HP53{Kbs9PG?70oKK2# z1&L9MxY^2)T`?2~xMxDjeJI}X3Bu0U6ypN7iZz`X-%QG$2$#q55%AGWgtc2BSVr;O zUz0@quu`5P0hAt8gA^lwx!5*ol(h2+i)CLa2il6v1f4~%Uh^f3v&aMTyQzALye?F+lqwt=>PA!;kA}oF zR)i~O1Wvf`FvpKS4q`Hy!pu`%qVrJ>@uDGOIUu>Lk_|iYy9!gA_CN_z!R6|Wh_<{Z z*7l@U?5NusxBYJ5GT7>*?;s4uI{v+EpS92Lw-BgGn74FNb+0CSW!-DH54GHl&i)@$ CYB)mx literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/undo_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/undo_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6af7572bf71a2a1b110183c00cc5457bab1daacd GIT binary patch literal 781 zcmY*XZAep57=E2|TRL$@Iw#u7DH25{LK%p|Sd^9~Rue>U-csoU6oOKxTSaPSVu2`W zVjBd3pnr-;bAI)qSPoPyGu%ciGehon_i=ac-96oH^uq(^Jn+8fd7k$07l#Dp2Yz@Y$m3!~N9})%6A=*#nx@HMqM#Iy z_PBU4;wU(lngk-D0JdBtI6OXJXbQsp9C`>~Tn-RXE+9z~a1el0z$VH&$L|GFaSNf) zR6YXdaXi>^bJs{F=+1IYm(vN0Usl0RP^1HdKjOffCfOwb;qG`KIJrFz+okUSH+M)m z!@ZoFGlCBeFAZ+m4+0**-27*lLvhdT^(Ey2Yd)VZifen*v3F&;Dn3>sjG_pMq&^*z4RKhTorS}?r-y=m7P zd<$a*9yX)GglTk0l^h~>KNxCGb)t?#qtg?5l+{F=XX`A76}R`FZ&r-HEnYQVWW49v sxMZAD%7IlZ?0U%6xXe9Fu=@Y!hQs=OX~75nk+MKN|74MB_=M)}KYLhme*gdg literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/undo_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/undo_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..01fcfe4a409407af2383a84d0fdabb35592d6c36 GIT binary patch literal 1369 zcmZ`(4NOy46n+z^O3U0(;XN?|&Wbdq@rMF!eL#O+`|e(cZp*TL$#>7q$-Un> z=gZAKm6iEcSm=^a2!g`Ww~2St5e{%3gIq2 zC^NA;H~7E5w&JcUA-yZQ!cZ&va1f@7xiow-sn_Wg*{ULepj7DXzUNHdL$Fhsvx^Z$AP9`W zaPXi8&IUedQi(s-*qg7<%yDzZd(VDNy*d;ak)Bm%b-OZp_V3wR17^&Pi5HvR%{7xL zu{SqWTNC+F#(EsUNg54IQNV(kyG)qZB{I510MYrVZpSdeVMJ`*%HZ!@tVBU!BS2>! z^=x4<-Ya=Nx6Di0B7? zFYD9XzWnm2Tl~>V=C>iU@(H)iVQFcLly@v^o0-X{cvF`mQnKGqdxC8;u)q%oM-z&+ z-$+vn$l_RJ=VwI2!iVCFU_t((_N5ns?HL8lJ=-5-^Ij1ELI-p*U8w6`_!9+bPsAE)Hr{w9)LcY;MD{%-3j<_T2IK5Ea@CL}hV z{N$3*sEM<~M-H(OajWokZx43m?>bN}qy=;QUJvB)cp&?f3!0!gIW_YqCx~gtLGOLj zPH5=C5Y)ezm+|BS!I^-?0r(EDc{+A9743(UR{i7(F_G4LP|(aX$jb5e#*AKsR8T&T4R6A44f6V%;xE^` zq6`Ivert-CxbucGY8TF3b=t{ypvUTr7={Ie1F9r#RJ$EVv>jy@$MC)5%I?D7_`)($ zVg0eu#abZI=exTw!z;1^Y$fW#!XK@!XBUkQR$spJri*fF-9==0)j3EMH1O5q%z%L} zWC=3PSl@=j=gYDYu|PvJ8(wie8(!qTkL(Rjf|u!zSsWUTI<_Y(eJ?ducluhql!m-T zI!ZW3R0Az~9lr=Izxa<T}e{JP*Ya9fRi&8NsEpwDdF1PPW ze);0KP#%x2)^TT)Age^<8F7;oJ H(#k&or}42D literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/undo_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/undo_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb69d8303f6fdca510017681b62237d64f7b14b GIT binary patch literal 2101 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/unlock_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/unlock_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..1b01312f8940446f5d016044bdaf11013d5e0e5a GIT binary patch literal 1382 zcmXX`4OCKR7{+_`8Up@n_){cNZLJ@S%F3zGaALKzQtXFgNE~g;2A#Qb)4(nZDQ&ts zPuprPYE)YL%!tjs}_V5?Vx3wHcr&0k93>&2$V^6*dy(MX&bvj@#<&9oOz;oJW3xM22c z*C0yNui86vdM_ogg|;!f2HPH8?yRP8i#(1#nc84btnhfJPuZ=tb=0!^7xsw7Qc0!z z#T->3Zw$;HI=N`>hD5~I+kZId!4%OFf|1ATZVGf`<%7$#8g?wVzo!gh8HFQ>TaA(T zEYTgvJuYOleIP&F9>V+5c4-@QZFJpqVdC?<`BH0_le_8SmMvt>8`tS4k^BV>>)Vd( zvx?R=xkwIpxa!J}B)wl+!SC8AE<3iy4n&Jveru_Fh%D~Xc5XkITJvknNlnhz+U_C+ za&b@V{up2XXO&qRq>EOt637%*r4d^nU7V=@3hr++at@5T?cyqAA&L*7lvRrlS0 zpX!z!wy>W7pj@*w&<2Ub4|Obu=bMzs!fRhOJnKnUkIl|wC#N5*xA&X3Q9b_*Y&-*i z-2EEiPv(xeN%2k2N*$WPPT3znzD`xT_zA&EpYdvVUSyylsFPG1Ld9)o%X#99rRx`d zC|=`v3JX^`(OLewqPwsOpi~KrO~rB}ljhTz%O1gc7N!D)_rtGVn2g zH^1W>B@@vJ(SGLBt&^6%EG6CNEfYJjafZpV8_;k0T%lTw0h?OEfN4-5{OpLzo;Ex$ zFv`*gso`91B)2~+Wpz@^(>bJ^1Cm4AXiMX>e zt!n3y%%DQ!O51n3H>C>(dbRDM_nP>u8}2>~A7-41w6s(xDJ?zI_*V176rZDR=?zo~ z6daG+d){ts-Ax4wQ0k<73%o8f=5WZ=dHU!g>+yXLJ?9&-=lB%&0k7NP0RUu)XI}qW qq`0X<;*Q#~VAupeBZjt>1$4utC&j7SJxzCY#CvY`X8zUnV)TC-&5K$9 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/unlock_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/unlock_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3e786f6af8629c3e9ee3f6135a7ba89664c5b642 GIT binary patch literal 1698 zcmX|C3s6#N6uxj35&v|Y5CEK^WysnsBRnWX|&TWb$6OHdwnFHrl>{P)Z~=ljq9o$s7Gw=_9vB@W|@ z0RR9OzbZBbwli&e3JQMi%g_G|0H~euvC->uMGQKT4m$w|^38IxTSonvXg@zcv#+l& z!nQFOj2rxpq}=qU6&=XcYdUzO#d|Va_P+c}X!8i}A?)WGm9r4CA#XX};?KLC0-3j~Ru zAqWJ*WL{pLHxdMW!o$OfLsE`P|8X!vxVAPbj*>e>G!qTK4XEd5pApk<~c5qcAfw6L5ET zmtW0L5xu;;{2XZ*;>QTFSd4}7>BjL7BzdXl+(6Ab&Tv<$i_MpunwoB$7@Nx%2n3G) zz!xKtNDO4P>@e!Jpj<8G_{@mR&BE7C!bSO+zr6G2mzCk=H`r>TlarIzSGw~sM0i;t zNTnbDutod?GLG_jrKP3zF4z(}aP<$GTmTBbi=v}Rg8a=G-sj7o!+_+vsDjhKtOsnQ z?ah^PpmgKtOLTm`)oSV1n+$ANRFrKj9dWqFEE{b&Zk_;h9RA{qh_?QVeGSbATxA#j zRjX-O4#z?_noQnubsCLmHBa8rPmXO9TF`D3i9`}QP-qo)EVycgf_~~hb%J#tg#H)o{8lr}sCv~l^CW%BS z`q?zY?#dfuzhAtv+ifZtk0>wAAb7O6obm`95WFj{S~mQa(R}Pn+tJaysCJ4KtVk&W zBkUFJzu$!Gq~L|Ux>&sPbQXDb?DB-uhdbva$g$^mBPamMa8<04ZPDO>l?7_mBj^6( zdn6&hT}!$)wJ>5=_12AExVX3rGo3e|OD-Eb=*t*j-%OnArc#(EPqmtmTi2~_F?|AU z%I#OpB5-Hom-VVNm-^q&@eA(8;ZnV`SeqN}7>7v!gFQwJm_|R02&3d&i+Ca$SX${T zUXi-|Z@yPtZ28vmhOEk-y{Y5B)|u4PQ&zv|3$~MIY^T%dMuW~DboB(mxl~UOHgfig zHJ&wzK@8&;a};=@0?FT=?#mxAp&x*ku`v(V$}(v3TxlNDfBEp9<~HsbC1^SHDtJ)-evZxMY3og?vI z>PsZ6@(+1*u49hyBgc=;!CL0Qorjqmc-)37PA0CpVVm z2KCz1^x*lUNRlWuB`?3A`r?b%k;gw@D2`niPu}EIqd{w*YEn7VGId!biQ$N(dKant zr7}M<@#L)@^S%bQzoUL8ixtLVGGCPiiJs248m@l#eF+3vSVq$uZ@H8v^|4we?&x(Y ze<4T82^i&2&8D$~TF=_Y*9{MEg+YPj_DO?IeFXk$qb4ATrkwQsnwH6AX2`aoe#BTU o5CjE-AgDa)YL9*UjeN5pkj?ISf3I(u!KPn)TvF^GG4$g909tGcB>(^b literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/up_arrow_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/up_arrow_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..90c9717e906319b49fc154649ec8c500aa61ac71 GIT binary patch literal 751 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVA|&C;uumfCn@CsJ^IX46$=oSxp6P=;rzm*lCz_L zN`Pt(88p-b)l^?Ik6shH#KI&+MFNCD>^G736HHmas+q;Qq4x!P`4)M zh?q$aAFr?Hk+1*jT&Tsbt;{ShEqwTRxV}W5edWi;H|ja(`_J4}4YfNlAtAxw&-bLM zO)U(^%gyB4{NwiI5LdUTnQ zK>-uk`7UR?xf}u*7!G{Y%=SxIedoW9n3ra^y7itHs?(k^1UuDqmqs}`Gvr>sz3$G$ ze+$;h70S#hXQ~c6`vK^L|NooX8F^;-+$xR@jSPHzC|#}1-{YQv*wciBx{A)k+BWqr zIj9#M%^%$V|DPxR|DWWF&yVd7x6kKb-uLI<@dMpYR3#v44jDXnzkYsCef__bA7B5< zAI?`{{`WU2>Br~S)@>mFg5&VP_wV^W|Lbc~6aM_0-T3gh{Ei?0<#~Aa@2fp#09SMV ze0~p5O>)AIZ_Pk8`7KBI!`kBG_b0$?GI?;keA$2d{RSWY{5^Z%gM1>x zF?sOYTy5I>`4U@pL`q8Rn8@_!cXeC-eZ#$QOSre6nE848yJQ!AW@hHY@nMWS>JT|* X23Fn2;`e5#NP_sDu6{1-oD!MvqqU**+A{o7uM>k-F4iH?Rm6|p3 z5URviK<{J^NVd=hHFm~;rF$b!s9ONu7|PDO`O05&ipUt|g3h^!7)s9G z`9gjF1G#MFB|nDugo?BCx|gQs6q2ja^WZ{MDOifx(Z$(nZ9e}nCj9r<$YPOpX8}aQ zNzvi*0HQ5v;>`DzgAXpWR$XX50brZ-NO=)igFkv-8)tVA!i~IW{oZXnTa2ak3m*>L zo#X9E95(MszHgeaJ>ZUw+I(TM*+#hgQ-1q0F~wA9St*Mk$%W@5wxr4e94ko^={Eh~ z@#dDQs?g?CAWa}Jq^1h6O#(t31VO8Kr;Vm&vDluGZ`cc29$_-OpaSV?pJi^Vhw_G= zUc33}b*bV~bksZ;#gv1k#UKNe%RqT%?Kngb>>&)dqVsmCR;s@R9Q=G4vAPN7VMtIb z(QNsUi8E$e+?JRyrKDZm@DI&Mc;$@8V5w7Pe)X~u_sZ+tOLS^%8kGt^v(iq@sW7ER z!nAB#kcrc0E+gwPN@Z%h>!6G#RTD+d!V(z+0ZTm{ma4?;;9zoTV;#7l!Mohi1YK!r z^3FzSdn-k_(2@}JQ=oquxxfD$b`GE%`2(VkHgWqtnt{!K{&Ml}ZsjUM-!2)0VqY}Hp5*lr}JdIvA^5H1ef-yrQ?5Azq*Ox}*9aA_t}1zgc) zmt=ji^J3qH#v7_#)yY@#v*M?Fhj^{IlUFJAezeTIZ+&r%uXPyJX$@X?7eYVH@UB}; zXe+fRm_tH*ud&i>chS^pLgv|6rNfn_wg$AT^#)?MyXs%xhLoEfkcg!suu*jN;VCWW zZ-7 zZbn`72pE!j8n+mDEHTZfP6eETg$#td{ks@q5exU?qo#A?A;vdYI1>%<8|Q&$ey~<# zWCdPVe!VI(a?4O33)vD+M^^y`d}9nu(car_-guS-Lyi|3!{z3>Gx*fhM0~8J_c13e cq=3IwMWxjCD8p{`(RTUnIaw#g{h6TVKb_JbHvj+t literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/up_arrow_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/up_arrow_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..efe27297f99259d53e66bc41877394e50f1f3165 GIT binary patch literal 1455 zcmYjQ3sh2f7>7tSz2qZXVh=%=C+jT0dp3KD6ltwZd#obol84exYl{=TGl(qAW#Th3 z-KeaYtrD}fUK12uYNTx~q1J$V&dgdhSmL||_x^WL+;-3T-`Ds3zTfZv`~F|yiu5#E zaC9(az>Z~n-bcG?#KMy#eTE^vJqf!!Zn~6+lK>FM zuB(0O4oR;6AZgke_6F|7xi1Bw*Po08WABhp-)EtGw*BL}y0hKqFP&|7w4mn%l9{`U z{cz^PSM*7FvB#Yau;r(mzRD7jkhmPuTrs-yPcg?-Q41w)y|8>KCv=4F?In%YqLAcp zb7=4Srb^bIH8Xxz zkFl$*!`NLEv|xucl^UN)rH)Wp9P9;^EdN{6aVg=nzbJJ_^$M3BDYTMzHaU&vH ztEt2W+=c4Q*^Gp{E}crHDyS?}(F-ma06nVNi{CbO7>%w!kbP=+V-Nd9?#gFBly513 zKlH<&`E=|PTVpQXU%6V;7g;Vv2c29BYt{rx$OL?wr{AtrXBcpf9)=TdDf6_5_n{o} ztY5Ro8EKVlA4^mLpmoy;tNBPWXS1fazJ5j%KB-K+3k{`oy6fa&S7pX47ubr;>WyymYtU!eqPEx-u-9uUdO+4Guw1mOv(+`^j8UIG z8o;l-JkrnD8?(`YewIncRYuwNVeKwYDBODneb%3?wtFE6;5f5a;G12dZLyEY#J30? z?2j>dws7eR{Kshlb_I~21DYztnVr=cIl-T4BP(&X7sm>a-z-ijyQ*=%qu&l7gR%+s zdOX#i`b-$9s02hsj8O0^%T5;@*Uxu20g(t~zC`W6iN1n~Ud*FK?r3xnWR){1#4$11 z4N5v8(MA|BT#rffN`)xUA|S@w;sN&TvIwR>5=`KMr$D7DK>+dUNxMZE1qI`5wijer z$pFCK=}g*x{|U&DR;5Y_2EfTOaU*{Ahw7&gEE*yZEo5*;^AjfHz@s@g10B+!Vg5wU zSUf@-1j1s*{12JtV*+vYGknGpz9xhdJUt9!v0CgQ09xWT0ISQ$FFRlDu SRQC;^kY!8K`Ii<65Bvkm8^Qnp literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/user_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/user_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c7484f69de717929b816bd18897db319b0a57dce GIT binary patch literal 959 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/user_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/user_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5c25f719f636e377eaac2ad03b119f49b5cf688b GIT binary patch literal 2225 zcmXw43p~?%8{f`U0izWa3Zv`c&QK{ow*#NF_)uM6f32R zm+DZ`$*r}kTgY7ATq4K-~ai1p6B;`zt8jhe$VsI_VxDAMXp0a zAP`+IPwHV%nk{cF1o(|hOq_*4v>0Agmm`c~S|~OYR6+oNW_c85ZC%c7Xh>wGr&A$# z{GSjQ3?`nE^2uDrG)?^K#?JLTCZN7#JhSRy@e*2HT|JFJAavvp>SJWCqS2N-jNvJ( zRlK`pA5q|1Hq%d@9L;vXtmrM;pcNGrsyA=m7-cye2@Fiqz~k{`LL~Hu6~xr8T3|!n z+}sd;etrlv8jVtbE*i^*#v(7M>~#30FwqR^`?BQVehtWR#w9W=xYB@lGD!tIQPn27VDn7?ys{kHnl5ushI#YqqN zZMUwLim>|C<6SQ3R5N3WupjdDZ$=qY;~8}Ag8pR}yl<$!lLO>Z+}Mr`yM^YF$(wWb zu72G)NBho%du31TDSKzS!qzF&O|?V8C_wdE9SHt6-3C^OWA-t(jDIxD; z(F1)eHpD+3=6xNz@`AP(*TY%4sZsj zR4TTysR0w6 z4(1y7Q#P5P^B|G&O}VEpy{>!h38x*t(zn}7_t=SoTbt8I(WFd7aW1IxA>B1PzKEiqdV`B!IpH z68mgk+h+@#wTDgBwzrSNd)xdxM1~OtH78xSw?<}Zp>5U9BMi-<4RPf+o>&FI=Yr}2 z@BMUg%w6*BBV#q)UMD?pB)AFlwVHhco&$8^cu5WUoXD9yn!UPyw$I@)ga!l?NAhkxT&eIykA=mzK7+6rAUe$mNHG!t}HFU zPXS?V8Rkr@W?sEtj^l6($!LmVg%*D>AaLZFCMpVvXaOb-`cW6I{3J+dmB0hm0<$; z?2teBl*7P*gka$0Q&O^{dS>2MTx&|kEl?S_;l12;fsI%sm>zdxVRt%-=f{1pyy{r8 zd#(OTF%EVUkRpl!rJMh#x7GbezRJkS~1lAmM zqc0H$OY$-&lhLKuw||P(J^uFa&(Zb@Dv28>n19ZZ*&Vrh0()7z^!}cGw|(#J*x&Q9 zar8~@*=K_ZQxnBAOPHkvMMXu_A`a(cKwS8GZ7w&sQTg$i%_buwo%PljR@QkW zY>l-w48I1m$5s_ir-iD3LK(nk%4g+Dr9V4_oI>O##AM3GB~vJ{je(hrz%O$iUX{F% z{KMX=CFOh{sALMiXs*zSjv14P#8?u6pbg4zv0*+JMiv&{T~jDM63X~Y#{g#XSh#8i z9IzbR(OxMZ1^hC=2i|{BE|g?{Z;969Ws(;xFRF_<{AnqlX$q*9lqwLvq-#=R1>fS~ z?l3z2LnydtpiJv=R4ip$UX+4o0EFUGNOIWn?-Kyl#jM5ygKUe+EV$u(zZFzNyxhF0 Jk6c5~{~y#%CJO)n literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/warning_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/warning_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1d0e113d2c7093f75bee10c8015bf7bf648001 GIT binary patch literal 871 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVAk_=aSW-Lla#OkB*pOmf6@`v zg{Hsn)QC=7FSv&1zs0*h5APKiUR4p8Z3R(qD68Sm8}6-rHuqD_#b9mPO+ho|$)nSyep|<|nJ{h7F~^ zN()_&`3u@GIq}%v+#$IwZHJ-G=b)4yKVHi-YtI*GX1Z*yzD_bcFoqGT#i8?~ce@3@ z_3`vHy*B;*{|_GB|NrOl4}Fbu9b4v4cbxt4uuTfcDZl_|l0IPhw`<+4|K*%AO^0~& z_x(-$@$ zyo=Wwv!(I`4Q3@daL8%$;bRW z_5YL>^))s&I<81muG*ED00b5Peycannj^sc|Ml`eAXohVZ*uq`XM=%&%f1F%XH0GQ?7;lo1H2hypDiN5L8rmQNy< ziWHTmilL0Z4z`HaA1VYwBoQ12oB`458iG*NnS`LthF!8<2)#4=cJ7_`&OP_Mdtc>_ z_$`aP1H35|%A(k1B+rWD0?ii+Jr8wkk8BInWj`bPxrux59Mm95OySMYV zvCq?7K&ew%W!-%FH277>*Gd6QY2Ww**dZ-lR{s z;p$AkuR5Q4i9_ZiCG6Y}yP5AMUSqifi}N}UM=_1bB7l@4YA8rq(Fha-k%`V&1iB_9 z4jfC60w~UM(ZrpvE(^B4+in`T($0V4A)>#)(H<+t?24kJ4!b~SQ2>xD$1~85U~Q1z z$Yy_G&I$SK`h4Cjc#K#VIlvMEj+_@RBc`fNc7y-|!dccsprkjHb`*W1AsFQ%5o0ZJ z{|{-sJSFh?n)%~bqq1KA{`vkvgo~{AV5Am1jMg_pxyoFDA{xC%rxCCO*>ug zoPK2e_nBB(-TOBf*}W#PK!FrCo^cf*Y$?fj%Fov`Io{~Pg^W}g_Q+};=O~%&a*~qc zj0tN-KqmA4UI}R^^oqbeT1NGC8nB^M2)x_VDh|ZmZ&c;1o|94HnR==;d)hB^jTH?CX@Mb=u@oyg{5mn;$Po*NJ<1s$7ULb(nQ^hwA|T1lOfEZ4II$k9-6B}tl1qkg)KP1i zR5gRD4V_>qlD0liym8!}=W6g$ENW6$pEz>wZD1~W&G%6B6s)eSfvI;s8l`1QB<4LR zW?|~;EP@@K4ub3#4oP-H#+bx+#GJ81rpSKk4?%p0G#5ANo>@iC$i75IhfO}LZOLF) z8<#7?-q*o3H85P`maem87Bc9hC0#h#Zzf}YQtC?HsckG$V6q2V7L`Q#E{J|3<7_?pF}(L5!Nngv zjW@kEKG`$!o!$9?`dM-PzNI;hP2sIkgWMGmb+Gj*^`w@2GRk}TrsRmtFDkn`mdwd> zc=ZK@z-%q7i-=(O@`#LWP1gV5YP-gp>e-i)6mbECKh%HYoX@X6&HAyT_?SP1lG6VG DXB?jj literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/warning_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/warning_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb822c4d4b874556b8a0266284986d5f48bcbdd GIT binary patch literal 1877 zcmYjS3s6&68cqsE!D~^TH;N{JBv`Ql!n0sf9$M(Q!gg^iPB9@6n7U4hJcP0_*Fd-k zmIcKEwkuIK1x{Fi_a@(Cvi$G3~@ zU(bTwN56VJmuo!oVf(?`L1sgXvFsm6cXG|UIep~U0p4ozVl!)~$iaFtXZT1Ors?Sr z%}x5iw^&wIOYMnE@i$X!i~{c?cC$;f`W1iqe@+gKgPg$I0b;YNi~lu4&F@&)C;j_m zNa_dub~e^g@=bqjWS%b;4u-dY9P^3_)eZCDM4$<{_iGGr%%8`oKC#Od+e`k4t(ZR1 z3{@r7xu+Md8fi!s7pF=rLVlsiz$$5y`IWpqMPvSQxeiGPbom2xtdGZdmf$E73nw!$ zi~wnr1juU9pc5ttc7jsCAA|?M;FR{@Y5~Ir`i*R6E8f}LY{|Rm>LDyNT3Cn%!jsTh z8bp=JWYnQTF!)C1@jk}mj|c!!M(^LqMTcnre%4zNcz;#hg)W=8Fb|?8p(a9L1J36U zUUJJC6k12(np$lLf!Dzcm>E;k z)!nMA9qPAkL>W)wPx1^gF`4VdyXh&qlK=EpGyKC~)@d?)mun5W-r4a$p-N_GfO&)#9v4Q_a!eb}U42-s}Vjb{}uJZB*a2mtU8 zBfxfZoUG$376eKx>3r;El~niAqy*&k;nd&d!5pLD=h~}SXwcJxEw?*iuv^bz?x1?`%_sB|0w>o!37~UG|a`=N`1Dv>X zvG~89^VC-G_!(S{&T1i;hg;cZtEL0RxiL?aI3Q|W^N0yGx<|ZFO2jq^_-fOw^&o{T7v0YdW?x%R&rt0J!K~ z3_OIip-;cxXv<@U)VXKM$Cb)?=Z?dvi70r=K(xlhtM)vb+J9HB z1YbZa{q)`5eOFP#0rH~l{S@5M?#uhaFmDF7V2T>|yZ z0nFo)bgTel*tzW3h5ocV&o}7Y(oTiqi{6BmHQ+mzf9V>i(%7K?9ol| zpWDHSTuC~RQfhfcdm9eZO47qBrBa>tZXy7U?avylbC&-0s$q5guDa^c;0-jK*l3!?b4WH!o|gm$M5Rq+Y;|_!CyDbv?%zV899fI8bxt5y6Y*u<*t>cp zHT$5K1KgI)VVlj%c45|)%Q};SCsMB+O7BC-REfB#il^1k0H-mr08=p^(w7XCj@k2f z!2jb*Bj~Cnr%rj%!aR@~+95!}J=3X|>_+Fg2-knXa$Z_4)lDVdKL%Md_$``;-E> zuUpl9^&xgaxBPp7d>y7M#N(!wEgYoTL%tU6+e@b~GAYCr=T&cyE*i2Z5qqL34IWj? zHbC6DJ6qm}-ugfsY3Ek`i=(A3_Ki*ZmAQE52K!oJn+i)E)65zqNNBCQd+mi8t?yin zut|FJo9%gwD+!s;-rPTx^S$JYpJSb0$?|f=Jn>JJ#2bL)f=~BkkDBHObl#K7u#tEp oXX5FP6;J$aTVB6=1+=Z~NQ0LOHjOxGuCM(k95@{JT@1hYe+n0wp#T5? literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/wrench_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/wrench_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..98f2aee46557eb378f0014e48b54a2754af8fd1b GIT binary patch literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVEWo zB6-2`hq4YD`+xj8OlMbaHn16r2q+I=!3AHS&r5faT;$Z`e+EX;mEScqEDSx(a)~;GES@FSzq@jIpNRe?uS<&v-5nH zvrBuBn4Xv*I5Dx}#|y>7i|b>`A^Hv(I22v_Xq64rRwuTLC%@j%Ag1!yw1?Nf=kvtu z-*2$t-|w>@rgu(#c(Z#t4}YD3{eG>)91gG}oeUk4Kw6hg@BJrM1=MP61lD?d`+A=E zIJ?A(qOVMc^WDzjqCv4MdBRB6z^g4GvqJM}+&xqUy6 z`20PIKR&+IKD_*SzocA@&EbOhn+rcDGv}S<0RpIw#6Q1hKRo$-KF|ERy5t}KfU2KA z@0XB^vpW32;p)oI!Oiw@$jYn!_WwP1^K!bxy?r(3KKy*>+s2;WZ)`JV`>Wq~BrZ63 z7&8L_#Mvn`3;Z0vy}IUnCtv~0^%Y(M>?Nx~LBXA;2(C4ftaVhJQ%v^z3l#jaY5r~Ql zQA}Ey{{DoEv8I{GC6Z|){4x~}nox)%VTt>NakE{r3M?CsW%p@t?tE8_vJ z)`dQg`zgZQx@=J$t;?SSN32UqZva9#xKK9l3_rU*J`_=fhftXhWEG%X9~NjJlbN#K z8AgK!iuTQe5ZXt^F-#)&Owo~_wPk=j1^@svCvHr!V4ck3e140YH5yB$P$=Km+!#Gh zXG9K0N9x<#dwU7=8+ab-o{J5b!6D!nfK#e4j|fF==Hx2N`GfCPP)|a`tFKmyTD=RQ z0qkV*Qop0*m`C@Njd&ZQyVId6nKtubwH9KhzM5t|4+7J$U#q4)c00f9kM;b{ty`KY zf913qf1rIZ*gi1Wx5TaYzj|c2bC1H5Y^#fAM)h`eJFNX7upLsc+vZlRM(iiyWLo#;RwL4mFLMY zEEG}O&C~=62Fm9>)s_yo8fXydfFPO&Q1Q15TXiv-u-CKD*#dle$~8|CZS~B}ccWsB zQUR`jON&mh9#>U^V+$Py$4gs0++yc~ZEiXRPaa~$rXp8(G_cqORU$wna3X40XRg`~CH3gMQF zO|ZE>uqjs{5G+nfXI-qKF(uh*qv0XPt^y8t?mmH?eM&-{;Sn7CS(u`KK#!@Elxp2Cxmp<#0lcgu=D z-Pdoq{WDV+Sw%bJv+Xm6#+;*d53Txipl9Ui}UvQyzh4n{}~Tdwen^VISxO?!q#P@!eFru2mJ=t!gnNTKrs6U?$w3y`` zLUb$40IyA2SLY=J5Juz@|9!v5BlzxeU1d|}$Nn<*6BBVLu8E07gUMk7O+d_FgBvr$SSY>Be?)pe)qPH7Q! z`DauL2l941=7vK^`?rzcxgs@~{jKvm+S{!c(|)^n^4UK(RjQ3+f=UtA7l}BoSY9@> zflL)7o7rtNjzcwA^4Gy{Ek#V&#IezhF@-ik2;MS$fUAXa(WuDN-Um%N2CY(AK#UfP z13`~aAV6`#3Va7fIOKD3nA=N4{=ONEMI`O|eNlRVpUQC97{dtc@!iut+M9B3r{K(g DF0kCy literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/wrench_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/wrench_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..be6bdcf4e0ffc8e3d0ce8ab1253b315e9f9819b5 GIT binary patch literal 2038 zcmZ8i3s4hx8V90*(^X)6uqz(16c4OaLQ<8KNDe^@XnnO*twJCMQY)As9v38J1(~3d z4puaw2uA1(7Nv&jRj51`St3Y0QtQou!y~SUfrFCpG9i!MTZnUYZfE}c?dZ0Fr)ne%D`v4Sd;`-R-TW zH>2;%rgekIezM;!c zIMo8q-M@vrcRM~;JX2cHbSX?(7lsb>sKC{p>&+knGAZ4%!m*SyLDO_ zdA{UoXp>qOh+hXqq`4fg|GWt3qjsfdm3Na&4z8% zzsLvx!R;v)>zF61R3Q+EA_JWwc>z7AN>t|hu&=u^gF0gvY}?E^ zvh@%^1>1QR({MOy3*kb8Qfr&Z+_RUeKoBUgC8xtQKJ<6$>OGsN>ti#h>5#XKE9BCT z<`84h!r${}EfQBJoZ5nCz(qfo1s9h8BLMxrm_wR&Xiba1o-0)A!9f`BGU3kzvU($j z(UeVG&&&JvLY|6yHZnF&9=YqwE12P$063_3NU{ze(s?*}AG@+Y3t{=fNWErff+A|? z&Wo7oAq7zT^(WVbGLyX&@yTM-)Q4!}UM?ubEe}lwgQpBeq;!u{nV}}r6eH%mN9Yf+ z7wLA%v>fZ|qvrOyo46N$II= zH)?Koh$gJ*GE|2!CAK%;L|#{3#RziSd9Q)C;vBFe(~y=mg3gfE?!^ zNBBueNn{Rk82r2DU3}~-ZEV!U9?6T^|HT@Ofv&Buc+lP&5TIG7)jl%KO(w`XJZW_L zy-a#tT?U<=DI%XU7!u68F*7QH$wGF`GdV} z)McW^r(zcAALQNMpsNfD+*L4K4^42S*0D;zNd=Qmr#pSMl~EgR9zFeU;?#+v=4!XX zrlw$Y^nLdW_l|PT2WTM>d^=rj9VjZ+~Q^1-K2`k@8Xh4ar+2y=FdM?`xjQ_vr*Jj58(va-oN(< zsmX^|1uOLY2HVJ}I#Bj-<&o~z)>dbcc=O04+w7RA3%#+&^rF~-r zcDMZobg^r_w6uu1+4i7-7lNA2ns*E?z!w(DJ)ItED8-p}`?L~!R!;+HEz)CR^XO7k zspdlb?B`$vyWz3O_;iT7SH8XGoqov=dtnsHXdIYnw-QRML&pWU2rO8@)(iFEEAex1 zkTZ|PNbEN?C*G+Sj}&jgRl{hXZ7UQ85=_b5n+i-@Zv+r2e%5NIq66;5U-AAA(GYkX z%$n}5P!*p{On#AqcdYBO7e;Sakk3Qr_cl3#Yeb6{BE{vzW>G@M%Uj9w?_+oDiN3QvDgVFJ<@ehF literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_in_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_in_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..55e4dec81722e14eee505c8077aa85d6d19e1be3 GIT binary patch literal 979 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV4mga;uumfCn=?Ysha(Gg}nTI zCRSHhW;QmqHumrD<8N$A{oK;b{!PDRR`HXK4436+^8b&R_r`nU#8d|+peYRh|0g8? zfye0+bLwAwnD{?_U(HW`W)KPHW=hWd{5S3G&;2hheg0p!`P(1&>)c>n42}%@{xe!x z+r&3EHZ8ETwf=kR)Tt-$-o5+r>({RzoSdAD+rJ4)-GB301Z0bpmI1@FYZpLFhEM-l zpB%|{mIZUb4k#=r(713VB;BIw%L`{mN5?W=UfzxU^7eJR%HG~u9ew^@#|rIJh6X?| zr}}g6L64|8jX?15*Ee;Ge`gFbuO{tj9h))Kh@T%ns~>*uKVS0SpP#?qUR-=!{>F_P z`)YsvdHMVG_4WIs|5sO@Fu$X(QTfiSjsLy8@t?H62MTs5_X}F`KuxIp@!((U^!0I) zfByZQ{q*5t_w|yJl9BuB|Nnb^`+ENT*4CEF_&pT|5Bz+4IQ_K!`$~Hwu6<7YE>PW8 zRZmW|6hA*_%+cBL;{UI&-5>w%F4qU??rNVtJ2uYo;JY(7H}mKf+0@U^o0(m(Qr%zX zE=VuP|0zJf7kvLPCqMuFgazvso;z^*@Zk@SkN2Oi|M%zV-onRh%_~-LG*8?4_B1E^ zy1%twKApXP+R5tP{VpB7!%*ip{dRW_HjeZ6-|rCNa-{(j#BXO`7gteTD#DZV=KuQo z4}aG$S+l2uL0$Xs#K-FQ=LnmY{o*rafjZy-vy1D|FH`>tfBP#kL1>cUrqmDDCMN&* z_{{R~s=4g<=ZPB^{)x+}l!PchlzsphsCsoN4}bsrb~d^#`1*T;H@m;~G=|5_Qap0j zFXH{rlYi&zJzmNPR(~j)fti{4Fte#Rzg${d`5gcC#xi>fniHRYRp+UBWW-bFXLd-- z-#?!ftXe7Kz;~r??eAOmzP0@Kzv}qMFItBLJT2K=GYunw3V`8tNSf_L!{*l;Ccb&v zTV3}rT}UEX?N8<-i?+5N;9>O7kOGR@P~&t;ucLK6TF(bPEr literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_in_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/royalblue/zoom_in_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..3174495d1b796c973a2f22c2479a3c232318eebc GIT binary patch literal 1816 zcmXw32~<;88V;Zd&;T8=BoL6rVJm`xIG_jh)f{CT4j_zzR0J`=8J7yx8kUg9W=7ct zsue3@PCYYXtq!zop#>5WRuQmR41s7smH-L~vLxXp@6HR*@0|DEeeb;c-S2+ifB%~i zVS#3*Hl{cn&MY|SXe9O|>n~$Gb{}URQsZ!VS@6*#|46@|$oRr2c64;Dv~<8Ed1l5y zDwP@%F~sxPy43lpUNc0ch)Z3VAI_i6R2pE@aR4M1c=LEXHLdQ7ReDwy!Og?n$JoTw zTf4qmGy#cV{7I{m9Hv4>lfufJv+rL&qdW?)`ZnP}hUznRm&`}cZV&1XODZpV7WEr$ zQRZ5oiHl-7P^p41Vq#_o8-5ZWwqt!gD_1FGD9|B_y%fs(_~2moYlq_ECRXbIz&RfI z!KfO5+a?XZj06lZ8B;ApFZ(Sz{imLOj~H%crKLb9)GojLVRy~cG()m)-yf$W5{Wge zTVIvGK~zvpT>+`Zj1PMRCE)Q z$+Q@soYpjaGqzT3HIw{d$BrFOZ83ymC@wCBnwxpx$>S%~%R0wBwUaN;dEK26L#PiG zgI0%Bv|ku41$rB}EWf!V84G_n)5S>@FJvs;%Ei!rES%zX?c<*Fsrrbpgnl1-ZBkZNmN3$gr6SOx zEE{Ef80c2ti!a}3Cl*6&6w{$n@Uej!QFSvpm&9D*-(W_51Cu$ep=_P?wHRUA~PNE_xanG8da)b`?iI z=|_7qT7^HLi+NSl#5Taakn;DHYU~egs?+G?79yAfh%lThSbVQEA?- z>M&>CuRJ%;*!tP+{uIRCJj{Fs2B;5;bPIZvKn7WzyaS)UZwq5lEg=h)O`!GQpXe=`Ks#@wA_8`%is7x7w7w7wS z$2X%b>W`DEj4)@#-V7J=VKgu8BEmzz|F0y zs+w4A%_3HZbCc86v)=g)-#Hu6_&sCJes4hv>DFf&MCB*yLzri(CWceBg~=uxHVA`a zBO`~_=51_DOic?7K79CKNT<_@gIowG$J=#g7K<`j0^_38;q&UJS4)m7xdp%6$*KLt z#mIv|5_QYN$%}8=mga4_k0!;eD4z4CR^h#CO9sBazU=(FEm6hKvw>!h19Mt3WDak-V1&DHtVD6G S^e;61d+@QaqyM8PC@l+g4K$qGx#DGkO%Cu1 zWs3>|flxc(LGpt~Bl)9*g5Sw!&MYDjDmDj5#6$GT2ug=Sb91wJTUDj@^XJczIy#%x znp;{FF)-RQWh?wYWuTsS)$W#XsJ%_KJp)|Qs>qZRA|NP&q$ir6A1En4e{$&ME1e6a zm#Gs|A1Go_puvS8G#chZ^V)$(`qJlJ+=nwGuGU9eo5M#R-PNuV7-U#?Ebd29yYc~R zpC$8%EZ{2o*|>gt8>dUVTq#{pN5unM_VNl{{EdpyV?&{DMlKpW4CA&DX%XWJ<+H z0^I(tXli<8c>45d1{;7@LGj!quiK~kfyg&J!|9TFGp-EOz_h2!Rz?S2e>Bz8(^G|EWol|V z$%AE*l9LI~Jbsb|&i^_$xKPIZ~zyfLS5vmzQ{zES%=Xj)Se1uay#O;qy!rP zNW*U$v9H>+_U_e04aJWuQjhOb-f}UTWdCl6sTJNOs~NrYjPAB4gWaRF(S(WlaFF!9 zg69sF-))7x#_p#F8XJGqI68aYrXt}0n7FjydAw+UncCIbM8%@0Ev`MX)NlOE{+#|D)?Msyl=CztXzY5+@a;*9n$Z^Xu#WYxwj6}G6BBJHY>?elRk%rxve`W{;h3D+X+ER{GmKIJsa{&e$&18DX0YMN=yeu39P^d0| z$z(!r-n?D4!{cSZ@|WDE`g-eJG_TRNWaqZYZ0yPk4r8$w^#lXY_ znWni}J4#baD+*eiF8joWpjDX+6pRekxMr?OC6fXk8_LAv?PL+ONbqSdM=Bh?GZL(z zprBt{Yl4;qY3*rG+JhEq)F(RP|8sUO3HTlJKbaNDf}p#~>5)V1`v;eZpU@3?6L7e-SaRwPX=pS^SS*%uT--ghZCERrF8O57of&Ds!o|Bw1TMn` z6oLr%A3U&2NJ_F(QdK1soI8i}C@3O)9)DcI@0qkfo143%M{3&AQa|WHHG*S+Y&X|Z z@YSqagfjkaU1x;hbUOAYDJZn%j>PjeNo5&WdTJ_`nk7>fxEyn=Py)q)XA z=Pq5J&v@ns7V%IjL93(T2tXX zyR))_k}RpKtGzyaSOJAXp*bcTG#ijn$z<_h2ZzHEt@MX5iu7#lDxFfQ`Q0Uk=+@R& zwEK@shSaKN(8n_ zs>)mMvl>-#Fr@H)aYs|)ZO7OEzy(u;JH;!Kc=E(l)NZh_l<4VJ=Hu<3pIuX)Ph{5Q z^ZNi@hSRcv{NG&u8@n^0vUp9wF&VAocS8e!i9Nx`z=QDvmWVJL;gvPErAAl<+9=>Vh73l4gtf z;+)na`lmmQ!G`Pa_BkB>rlqCbvmKTNTQk}dv(jD$sr^D&bE5Xy1~iP6%_p71*r4e0 z*U>Z--aws^=2MLi%~;Igzb<-=cFmMheECrkzW#m@7yJ+DIEeG6mDcUwY~ZQ%H@x>t zWC4am`O z+U;sa$bok4cfF5K8|vuk>a6yec8b1?`k?Gnv8ZjS2T-S!!%^}k`Q#Xc5B(#vh`)4q z)Yew{gj0H-L(2x(5eTYv+(@2CD}6fr_cxm#x-0wjE z6&1A^6=0^Ac->axh~14-~B;tOzVh&3$0o9VH>x*frovw3Q;vL1W+zS zfOUg#dt6_C8!5j8W$FZlw$<_DAn9<$V`fblK`D_%7)uxB@js7Spvw)~BIwK0sz~mj z5Dmbq|4;9ab^DO8wub3w=re4OHatd9N^T^KrOh+>bA1kIL)T0SJ#)d1TXxJkUoN+< z9c)5EK8K4~to|%`iqaq)Gq&An(%EU%(b3cUTr@kG#sFR44)7|j&}7R(o^Z{|WD4O9 zpAo8Kerai0X{na(34NGi%-02O(q#xF66sZpy;0&!W7LZ7%naway53%0l}rwPXD~O@ uFyieA$-w0{xHhnnFddxhd+Z)LFZ_u_@QHJQ;6&`ae15>qn{;mQ`4*s=vRt_xH!w*VoI>nKP&7+_`hJ_SgOO z+fnrMQ)9Awe?loIMBAEG>n!I_otjzj`q|m)rlzJhMn*<4^7eIqu9Us9yuLeszw1TQ znm@-srPR-wtJA{|(IhA;Y7BDNk6&M3r;Cb;`iY5&P1|4p-^i}=r(Z~%pIEH@;qC7I zsS|zz)q{NT^W$gr!_WQaOaA-w^Y`0}i;v6SxN&1&?XN#Ct)H(y|9;(kOTCu71L0-+ zo}Z|JYN`D3;9u+X^>LDa{{5Z(^x`r7^R@9uJakjAd|>9b?w91p%bb8|C~*C{Qo zqN1W-H+Z1>Qh**R`2Jx|e*XIj3)U?>ci{Bl!yg_W?>}Gv@6Xe{g^$^qSFGS@p0@Mt zX-@Wae`~*dI(z@LlhwWZT{?P)VP>=#nwXeA{`%z$cZ;hFuLKa>+gDlZ7!>4n@W8Qu z|9`RH|L=9`R5wS#CL(MV${|bNmD>6Z7lHsP*57#Cp z|M>XK^6;v;?Dyx18yEhG%c+zEss{$@q4Wd5=+&!BdHDO^x3kf0!Pnm#yxIM=r!hQc zmg14Kei83~p8Pv!@9|Pbu=+#U49v{ThnY>q`Q_5u%IEm6HQB7p+4Ao|bH`nTC-N=N^(~JJGQD^@fRW zp7vJP{Yw`UxoniSVUlo?#pfq?*$MeKL*;Bp2TTs*(@U$F-i>xe?3Fj0}=$B-4fGVB3l9-{~AQ7E7?DxCOfUM+oh70Y&L54dU(u`qN4nAgHuw*HK5?m&D7SVu*?{)n4hBx*>ro&1cgc_ zlckSwiM*N`7g1ZAX|eCWJ`FD>sfrIi_$x`FP`E?p<+ti*MjhCY(z;|;EV>D|Y}w*! zfsLIX7W67H+?}7;@1U-P1jCeL$3NrK>2&9@iAlp<2rjPw)i>fOgYn>x!oot&S_HGR zvsuby<(}QY@9yd9ItSC|l=IgSv| zfe;Dwc?3t}L{h2r>90j$W@k9fJEgc0f6Lo8<)V^&_tWdPAXf7U)wZI@7MeP4nc{#Od zMk((2Ru+Mm_$wwKv@Q>nsS&%m^p!0TH!Uf)zlfxYG*N2 z2BRU1$zYxv3G@XbfDV-qHl?3DnP!1uP<+t~gdOlE{f@<1YcE0LX5{JeI{i!2Y}S%* zSTHQwC2UTx+Mh58@j{B04Kun1SfvoaX%q_8vZ(VCYY;ujbhpyH{E1#C=Yh^Di-#1V_4p3R3CfCE1Az|*B6!2J>Rh%&w3`a{wcxa z*&I6TdMJQYo~I-T22aFCSAU#ozF@U|-&fcB89B!0=ACMGZ=K(J-j2-6HYn4Y$AgeX z$>!F_5`L_y!4+BFyp*5Oc`*xNi`iH&=Lw3I-x!QTdr1N_O|Pq~;7)WlkU*%VXmN>m z>6h=9?=QMxvqxKqeb(zm!g!+{fAsZ8^Vj#_F{^qWPbjN!+iPiI7#2JNT%OQlotAQv zl}c4oQlbzP_!htxc-jJMi;apqG_*j##CUpo=2c+U6<6AUOrxotG4Fs?)zx2m z`|e(Ts~r~yW~&5d(+FQ9gw3#yS5i`vgrL7;_=NH0lX~UO*q)aSpZ&aOX@o14pYbK`Hgm3_-!W0=rk<{#W%+F|9HG<-E}xWK010h zHRZ4mkw_%4>grNLBO}Yl4U1~8t%vRj#~+!E9_P9Q@mdhS?;(UGDZ~QFLUgTaR#wPzr zth#t*{B?;Pnx8$IcRD`QBimt>L)kvSM!vivQ-{B04)pO6Uvbu8Q-utPcHV4P27?fO zm!IFh-+sSd@v^nGg_qgp=Z`er%6E!fxLsk5?8_dWYu?%b7BY;QXEDGi1Y&;*fn?e@ zZ$B>+g2DiVPmo^!?d(gz{XbXv>)emZ$*en?(&qlhb#@Y4!}p5tpRvrQQvtgoqwtaE z>PSx2;zs>6VMy zySlW~&;9;(h$|ozY-niG6e%HsA_B@2P)d-JARx#?1tp3d z%K!!&MGPb;B{ZJ`Dm5S?4>Z9-5>oEJ5&oaQXYM_7XU86ni|o{s|=lvjt;o4t{$qUwpIlL z*~?VfJg-S6F(6%astpBSHfX*~k<2YEO;r%WK=5{F6AGq{ROyjLV!YJ{LXcKRN>9iU zu@_!QlC-l*P85E0DlwSbXp6h|$DqS&#=Q!&2~!snd8&Z|OeTJ&P{KP4a&kzvfA)ll z=Dy-N5}^_1+NP9tfuui%1|mVg-`^joaoh+rySM_ndY@D%6pDFk8+Um}iSxR`K-C2| z((%UY*M+4YPyC7T5y{Gq0c;fd@mYfVa8gNdP ziu`f=ePdX*OGKS9PXbDSdXbIEMv7Gr_vp}J1N#B~42hQ3QiwKX+R*#7<)002O_Od=e3 z9>ZcKi@!hQvkzPC-`C;scxxPF){yDw=)C2Ru&B@{7#1ELep>qZ*1hUFM20=V8g2$RBjtiJuv;)T z5KQCxRke+JEwaDq?bY<~@}h`DvpNtv7NAgWJKI7e+x$czNL>>iA`(xSaq6oGm>{aS ztFbkEKnVoFh|#c!P?1;Ws?( zQ%<{Y73W;5jGsHUk~&;f8A=MCTXd3%V%ut~^iWGYP2FtXGSSx8*Zj~vRK4%WGL5Ji z?r{R#cy@cD9}cdrtvq%3>E&!Sbx$9(Ng!TWNg0c)D7y%f#8(g>UQyo zB;0G>EOw$rT~YWKpsr~&M#8teb+qdKMp(VfSlR9l?x()voNw;s&9^iD%CqYl#_Kw* zLRlXC+juH!>gv(RN=w%@lgqzp{WH4i^uq~vEtt`7S1)wc>p}Oa(o+oIu{UZ(o6I^s z?TY(0B@@Stg!F0eJtmV<4V;VeoeQO|SEh$vB;;>VPW!8(p))Fv`FY>ws%i@N!|Jsb9rO zb+_)z`%S*pdYDe@wPq#Xob18m_)b4BV4PB>7$<`uk^2Lw&Fx zY9XD`(NPh%g)7M|rcYW}SV&k#1geHJb#}M=mMv)qe7DnxTLT%PlU)aqilSX(Wiw=K zZBg!?qo{r;W9jAoXmpjB$z-ZWM^_@TK`%lQ#s9A7O!rp-kRrYoNQ97FfgtWtb+vu$ zi4*o}nwq%moE+Po*}1rxq2~p>ws8xjx%qZve_2D)sWAhvY%-WCbK+P{{#xB4K$!ej z$ogsc_$W82gpcL)$BZnK%2I&DQ>OqIR~JZ&B^nj^0LI_H1aRC~ixG(vp>-qhENZA- z@Ne%?L_h#Q3!X`i$xjAfHCtJktZS0co1{}ia0`pFIMLrnGy9h=M8j@R&uM9) z`h0ztAP@*7+mwxDQDxyFA)@X^Hk&P&?>s<*bkv@KPq@ZwDKJ95c<}rkHzw4IU2QBI+d;j4_Oy=yvqleAcSXm*|G}V_sVm{Wi zg-i-1i!+cAgB@g1sT@fH-$pbqjtLq4bjV3^wvf2nwaA_1O+QmsOef}*(Ro~|J`FE4 zv>$9p5KaI#K8*Z@7)^ z>_A@(AINn4fQcp~vtxg~(WI4PhwY^jSuQcF_$={Yz-1zd=o!f8JcS4DT)c&wYf#4U zu9rF=+n>i9=^E(k%DHCEf^P%vi1nuc#L82<5GU0`5sEQY9}LVSH1O-m2=o2Rtop0cwL6J0iLt&_Ic6VxN62K2^DeZkRHNkwaW23 zShSxakBc!}fsf|*#L}I{P=ibT44ortWMeBiEmb4HdpQ`cecp$1o-8TvZftB^-2VWs z_^(LS4G3%~=S73k-qPoJWkEQ#<4oLOvLKT;Gh~4*Hf$g#3a2#ToNhjn3hn;C^XeAy z2Z9=^rjCF!5FTk1j8ltyj2le)p2wTzIv|Y*sg%UjANHK0;I(wcaf@f~H+6w` zt@tWANvYxwnqX~Ao13j08{67D1YgIKXcEGQu94D`2$_&S!e2m{eu8a>IwahYURYRE zSh!R_as@;&=-~`a(jpif4&Rdx+%4D~LAxnG`<@k lWneAL(VLa5HU%$KK5&@L{dZ^+xbU}oyIe^wm0Ls7{{!3St6Ts8 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/add_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/add_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..83a3020ea46834baa89c0e5e31f44b2ea664d172 GIT binary patch literal 629 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV6yRaaSW-Lla#OkB*pOmf6@`P zir3%f9=EUiGr>{p@q-5yiRu-Xkv*7pV0-@klq*-SNJuO^_CGx#VMpcXX*_0I zA-WG`9oS$0U&6xThT)M7j8GE~r7{>M@c;popO^sDRrK`Lt^AaHQdYch+6+--$@^aGd!}jlP%pDVh~;_C@Twd zo;Jra``Z8a_xBsu{Qoz%5d|K0taC;#4_#_rmmpIRUO-CfSp)6+8t7zF?O*2qDu zb-Z-q+>s+HXV09``S|_){qL*8){41=Y3S(unKyOn)erag*RTKg@9*y?Kt1*nKmak{ z>6@^zva+%?zCRXZ4lqn)z4*}Q$iB} Dl#(Wu literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/add_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/add_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..d3eada1c252a92fe67be802fb0e9b7d6d929d1e7 GIT binary patch literal 815 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VEX3i;uumfCn;fpAyAOv|NkVF zB@eE>weGL~^Fy)OdtP(%mdNZ3*H^ws11`}-1od5;`9crtkT##@Ju9{tJ!HXtblsKTP~)0O&I*<3a@ zH@7oSPMl~k7p?vOvAK~k&*soPpbI4Q;&&c`+TU34&$ytl@L{Q@o`VJ_$W=i9CIJok z;jbWZg7yFZzsXRQAiICC_i8u^y6GgOw6J{H4>Sr{?(1ju!|(6!4^$Fa)*-@Bte~u{ z%nZbb*Uz^{QTOk$_2KjL?E`fjzVn*hKgi=`Cc!pi#teyl|9_l=m{)Rsp&)|-56eMe zpCjMzr^h@KW@cshcI6(^hS_IQnDw`-q&<5j=onht|K=IQ!63H@Jb1pp_Q#39&=@Y+ zH*Y2C{{Cuxl8V;Q?5k>#vHj~;DjMCd3eD+@ZjG~?c%pa1Ls{yO^M@p1k( zU}PLRI&{W6cO|P$G_%>$NS}Z?(eTZo^`PQz5Rz*(74Mv zcwU~zK>p9q&+H2)wzf6`O?i0S|Bo2NPr%qeFK-Vr^5loVzsq^JBO)SzyaV|V2Pqw5 z-w$&0(GSnh%ZqRWEmyGn-8pmD1c>yZY(`*EK7Z~%U*g{W`hLaluf>l%IzQje(7?#3 z=pWFB)@H^Kdk$rRR9XuQPc|_&-pnE_e7SvV_I1t&MJ*j2C)mTn!kU3zwEGQAu-!my e|6Qg*T+hs4{#7g`@YJIukTIUFelF{r5}E*p?{dQc literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/add_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/add_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d53492e20533697b297ecf6d39483faf48ac2c9c GIT binary patch literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFi-V#aSW-Lla!*scxPYn^N-)( z+oy1>eEj4|#iCVA`lur{gl&j0KVohITV`F8-`^*wW8+bH;AHS}POWE;9#t`cO#!R;@$2jAo^^d@ zPHloghZasL{(q6>1B0w=E?e9Gf@FnXfjmtOr^DBsg4mMOxN}B#celmmPKKB{b6i&b z{{P<|AuyPDh?_sSkRapJ^>|NrYjfeBIza@mi+zs(QNx37Qk zuHpXvdShgnub*MzqtV&2vPyg}hsW$UMtB?Qd zJN6=J5D*dAQTybDVW?8ffd>is$3J|2?!V^Z(IYIHH~VF5y?O$9gdRQG4siw82L)wi zLCS82n^?L3|Nr-Q_QUV*@AK6E|95mkdRkgqLQ+!FkH4?Qot>O)0-vgZ{jIdp_s3_T z>p}kg^XKQ}hv(^%^wyXdE literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/address_book_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/address_book_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..def0bfbca946685f31328386c3862e75c9d89a17 GIT binary patch literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU>5XraSW-Lla$iXh{6sZ6I|EBDBujhaGf1t7X z|NT9cpXUqw`1AAh|KjKRHR%Zn2|y)4H7REeMH>`E7!F9weDGv5T=npZlmm;5eK+GC zrtJqx?bDB#99z9@-L`+xic7BsmRaU2r8V(`^d%(%ji~tWps{I94^Q*jwWdJFD1@D@ z|Mw@c;>!!e!<*C3OJ2DWBJuC<@8bu60AicXX+y>a10IGAGLKg?sx7cm+bh&i9Czc# ziTP~R`fFvCm_nvnKA&%VS;G1K^4E0-qV#`&9cgoBqacF;$6<%wV>;3U?xqQQxBWj%G?n2uVXXpOk?z(F0qO3^`a1 z^2Tt)3Itl^+Llk7Fz0WH0sDivWX{_zEO&iFC(f+TF5h_eOuLE+^8sdXEK7Zu{qXtu z`8@V@e-aFgjFK$s{#YDd6S?`pEKyNWNgW*>i5oX=NYpvReqesZ1hfbkdm)z=f&%pD z1r9Z*4gbADzT9tIz;>DQlMBy+-78n=a+Iqp?dw!AG>+*!(;W5ztOXcM-}5UZfEF0- zssBHZQFgy@@ZbU>H@-#5& k>z|ht6BC4f_8- zDJ3Bxq2lMOsmI%RrNcLE-uQXt%GHJ|R<1JO;N}+2)iC<;>8bYNx7Ou#5|UB{Mg|53 zKy4s>i9mffw&(x<^8df&kAHvup8oLbt2A3!SXkR{ez{302JGzW%}sk`nECn556`!+ zw@i41q_N`1hlNc&Jv_|T($>v$*P1prG%%dhtN-;y^6=*8=OwR%gh~KC!7k1Ywrk26 zMZNvuWd^PKN?32O8AgH<<0H}srj^zrd2 zn6CUAYNzA2hM*7c@7rti8gPRZDV=I!X6G}wv#XT*TzGJBazR1Cfh5KwJSp-J9Y8}S zxNLoKpplse1Tr%-HImr*WDab2VtJ#Q}rt zYdUQpvm+uS7yjUQ$GqZSy~i_%dL^w%H*egK$h*7i=!9w0jupJVrpsn#X2xU6!{g!D z@`M?xO2Xv`Q-@@|qRAwFh=@<$LCymXJcm_xS z++RIgB}8=F#FpG$vsIQ)K5|B8pDj=;G@5>V{;ePL@&5k$z?fxg)|}apf8UO+y1JSz zIy#!CJF%g&v-9Eg_3;HfQ2U!AK78ko`SAVy{SRNx95`?wAvN`A!HWxuZ7(k`KYTPK zG*t4PV6O{bY4u4`hsINzS9zV3fxbi+GtZ*On5?Cflj>&nuHfSQ46kIDSccYPND zNP27f{lMIWukP=!Rv~tvFPH9DoThLTDi!hJIsf7L_c^#vF#iAl-~Gn}^FusPE8IWj zX9)cL^_5$d&x3LQL&ug4PziQHota79%t;K!#>R)=-{0Wj#v%yzd6T=5&f9 zJnek)i5s?VjpUmQNrXU$zn-4Y1N1si`uTau0pa244<0^LJIVh2-Q8pXLBXUItJXMp zHbI;P&Q&+||93dQCUSGv&Ye3YZ``~oSy53T5m6|T@uOk-^5;C-+NXU|3?b^785-2@ Ux=wD%4+QZ&UHx3vIVCg!07Od6X8-^I literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/address_book_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/address_book_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e3a8fb1be60958be5396c1dc43dad04b24d4a0 GIT binary patch literal 1274 zcmX|=3rtg27{_n9&?3F9JZCS1Q3W<4t+Z4a2(G0t9zzfrvLYDDBOr)Us3gqHw6;Uhk_BQTb+#swMjm=lQx75ep#%L<12JP)g5kAM7Oep5)8-|9#*8obOa7 z#7B|rT{UBw{<&_}SvIzwqM4bqKN^iirqIDs9f>Q}|dA0w6PD-`1PC@?mZ7 z!pATAh0o^z5PcJR|2`s-aFMjMW`stgWv325d}xS|PacR*NDv(C2{I|UMat2y?t}&w zX!`0}uD2YIJAFMY?qpdQkJnHTTRT+mmyVv-^{=T%o`{`N+{}_UQ-hbbZ?W{bGuvyM ze(G1x3n{#m6m*$g8eRLq&8-=+TP;RHL#GjuK|jx_C+rq#i`wgwot=$pG+MOaTnB1x zW8>4KpKN6#)gQ4lN;mYu(x!Gh7*>mr08E4V`gx+81W}P;4$=EC1L^{j3~?yk(OZ67 z*dK1SS(Ui{Vo(6Fvc|)P@zgbUi=()c0I(Q(5Y_!)L@bp`XW3830ARYCk(glx04P77 zf-?PWwNMT-(AXeWj7!AfWdP}O`HsjB10J!9R_1V#QX~^0pnKR!4yD^#a!Zt=rT1`p?CTD`3RXz4*FZ&23^&fg{l#m z#?fwI9>G>#UY<`Tf$XMyY1_~Ux~^Ez^ok$9o?*kwzX@JFqvL&jePu9#%ouA5xH_x6 z3?s?O$v*ofvry;>bN+=o?9dp9iV_rXd@Yvh{*S!*J|KabO9(B1axUS|( zyTq$TzZ&!8QQoFgm#N(gH_XBj@JZHBkgu8H4X8%R~&(fhzhB+D|d2tR3X$4fOt(%-N}_D6=qCAvg_HcOEUAP4qPViMa&~itZ6C!Mk2DUw@oIi0 z8Vu5MC{Rto7L86vzjX^%G0r}tIY;de!J`Zoi=}_JMsT#^O<5F0%2tJF<^#3kfg@Wx z+n-9y%50=}?*^p3UePHKMfVo@CLeIxpw!(9CE?EKRWykl7a1Ap{D|L+>=S!&&p7Lc zj(J*$q|59Idrq}g;_U?hfcmXoGB4377*BEL7U@-BCu?h)P>Zj*6!(R9*=rs~k|`8` zbF>^aj*@A_E-SECaezCcV?R!f8XFr!6tnYC&MsqI1`JGn_(4L~{MkfYhd}MJD=blZ zMC3=t@4W$G*Dcd2MB&UF*Z-kxLHd`YIED~=mw3Od8goY~p9+JaEV%_kGW`Ah_3z7G z=4V2lo}Ms~NK|78^oOIO3Bmdz6CV=t$Nb`w8K?3gV3^0siHQlp@^mo1q=ZzpP1sz~ z<=Q(qDo!&V&=W?p6&=`;TJU*h6%a{BIyF(@4 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/alert_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/alert_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd731d4cef876c85007b9ae7df45d7431bb9211 GIT binary patch literal 1018 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU_R*S;uumfCn=$UNjm!WkA43- zzl-a~{@cI4{!y)Y`S%(&Hnuii>Fs~g6A}_QICxggH_Sd)J!8+ri5u;ifdFXG|Njh* z4Ez2w0+|fv7MAguS=kHRU7Z>J{Q2|a-o5)Tm|0ml_;`6GPMNhv^kGP2*-tY5xd`@_r2%guM~vdYCaI*Z=<~y0hr%DUfr3?nz1n8uH-rbK!)Pl$ynh zRvpq-);)Xf`0?WhjvP7Cz!MP}DY;|kP6@lZKS#d5y}f<@`T6$shYy`v2GyMe)cxbb zzr*~6g@tCRs;Xs-jEp>I4M3U|G&Bw@ShM7Wo~rKIV`q+h5rWtU)R16N{q4>v>+*O1 z{(paezrJKc?elg2|Nr}Y_(1u)dw=WS-ulW4G2Z6zM!^FLJS+#R(R@k!eIow+&6oe_+W_JXajId8~yKtaIe;{DXVM}Pgzk_uv{ zb+{h*XZl`$hq))io4>I!p*PfwJ0s3W_IzYgu)VQY7UHzVj9-E}!G0VE5MMpjE6H7q!`J(t6X+87LusATCys>=3nW)Jf4=U}=z?QmPG~{J4;BY5~c@Kbe ziF?b78T`(lz_^L)USnU^Ay>a$tO6VNpE-Qy!d;I;cMHwW{F@ZDPimdlG{9;zb@su)Ox5|pP_ue>e4So=MsAk-jiQzTJ?U0WVWiH zW2oVCm!Mt0KLZoZ|Nkrp5Arf7axfe`>*@5O;ot3xRvdPJ3hN4=F$Y}LH9EJ~{%-Hg zi8I%1Ehv9B$Au-$tvooiqi6A|-@sH4OmB@#H{IU;{zO(*mXVBo-JFL&4v&%1B_KAs zu;t_YhZh&S^Z3uRNqz9>QObqu*VA{@{cRJ1XP+kN182|vO}zN%=%PzOm)5_1`}SGv zzM7-okDQ#Wb$@?-`r{{0{w!Uzrs(*UD=D83Hn&eocqIV@kT_yyxO}O4KwYG}I>H*jS`_AyhQAF+HZ7GK_{UPGynl$-8;0EH61_ z6QilQ4&#gso-!>j1L-j(#3-{I4WU#TGd1z9@E@f1TKls0{?_w;`~CJ>`_lKJ0Voq| z6952EfeiXS-Hco7aF}jXB<@-S0OQO+x^F}h?=b5QMYjon;9+8OY zov%OhGNFF?>tQU5#ZrvCdxthLIVHHC$WV-ptzTT8`IkIdSXF&5O~dCdUPd@eCb;m82PebH{z^FaW$C837y|9lN%>f7dlPH}9#@XiVR{8NiW9n?Jx{ zMq@@sM&ifKEwLZR$1Uw_Hvl9O3BY340bOD-AP@-dR92M7uIcC+2~_q|sCS@HC;$P61J+hJV0mQ)v%IuSQqQVs6fzm; zfAvbCi^0JW2)KM$4lFM%0n{B-mTq78Ox#_mmpVK#{`ZQjgS{wzY$7@r1VKvK&p)@x zWHRMCh3crKg(X`tq7YiO4X3ZNlIB;b?W(;MUI&}cYhLFdE$Q0TrDrS-M=VGjZi8?+ zJ?Ef$D6vEo@chI?4kY4yQLkt&+?bd>QY(|q6RCanq7-6uUJ``8%UmdJ=&OJ5c*Z9(ySei z^^x5kb?Dk9d*X>`I;FADmNCzT=N+?fTpnp-sXVWx4xe(9Kbt|yn-#lS6HnB2;JT^R zwfXQGERV}~c5Lv_yeDz z^lPE}i#;nt&?tcq5xG8IJ$jQn^xu@2*9oBA!R?)I*qlCQpp&xI*yo#)H-#2~5BiHb zJiWWA;Xxt^E|&q1Ju6LZOh|>S8mtL;N+@O-cnly~NoQAmw$=KFL}0D?{7htHBs189 zK$uDTbA!sr2cF4uoO{~ct7+-u=h+5UB7+hM95Ry%WM_zX4%?eB6lCwm+ zA7?jR^nlU=P%ropp=45C5l-()$uzvN!JO}0chIBh-D(s+ivpXJN*=jt^ySQo5_Tu3 zm(;2gMMkK;3Q)!+- z#?WOO=Sc+T(h$UK0)^6XWY=XY*yq_n;6&Yi&S9Hm`%C$nO=zRi0G?dt3F-!Qb~P+yGz(3F#7m|?Y_e;nZ;YK zm>?b>YMoJEW!_9JfN)@m0rWeiOL=p0-)}~sC0)V!aK^icoS5^C4^Iuh_xfUPj}C{| z)xTo*&Pp~&J&>7i;(~Gh!!hRQ(G+BhE5qqz+UJEc<$Px;HE6(!&En+4>%OBy@8`)q zs7J?meCLKpT2w&6=jE@jllJR%8=Ko&BmzlENdhx{BO`D4`upc*7MqtegIW!8|5J%X zA{2|o)1Wt`y*i)}SMHT6#^XuC>B&#chvw!ICb~F=U#u5XkhM2^bg{7#kWI+Gs&=TH4!-!D6w~!NGf?=jP@pgF{3AR4SFWe~*u2*J8C=5Lk!B ze!^hTZ{6M9o6u-P`i(JPYmhM*jS$jU zb71tsB&hxKa0MbkBE$r)&Zt&;|zZ zj!px(XlXEXecR!pV5C}i5BoS*Wt7z^AdcBLwSe-~?bPv+dq)Yg1R+~Cf zOR^lTzjS+|_ojIfZ~Jz^*|X;oM9cFIW#dvT(wweo>vJ~4pS9ZSNxO$o7C^y73&T7aSQ1e98Cyd8f>)z{88s99f zWzfJAiDjsLzhB+n7g5F$gcwr@l%cq4A?r!y8$11R9eT}PLrb)&;=3{denDl&`x`Lp zme)0|g@$j4w>c9qwwH47uH{;`xvB$xmzC0eQB}F_^y!0B-yzjUT`|!W9q^C!qGn*T zBu=q7uFpY%f>htv@0{>ECKPRlcC=jXhrOxq3mSzUb7K9;R(T|zqeUymRGZK6>-q2tw;lZ?n>M`P>S~I!z#2R;r0_oyFR%8 z=JCA$mF4zsA*_(C#`wGE=rISa&<}@?K=14zR%fg`(L9VZ(`*;;rlw^9p3K*3 zikhbLd@zjS>Mm<%IT=-%R(QLuL9WL_jNi<{p2>Pa^XxxsY?X~T{^Vel+mLWdKM8rj zr8S?^vBt?u*A5kHS4I#5aEEUfd+(f*7kC0@BUxSfQ_W=Wyk0F_7P)cxAg6$@wYWzg z6~ao#PBxtxu{y^p&8_55(gSZ9=6cZg!2{`nsp`FR?oYniW8Q0imzBo0CkLyXbO;JE zn$9V|MV5`HDqmLu&yRVN-h(V!IwGG@H0Xrj3~L#)-sPspcJ%}Ax7)_PC2ihgnJ&kM zL^;Exm4LKI^W56rVl7cg>`|2oJuJ6E6lOb9W5BBB{vrI;3bqQeSU7m%x&3%qj!9*i zAX!S(6PW5yIZ-GE>&;~ zGSYJ1);;4~^bN1mWz$F)gLABR^w=DG*mZc9{QfF_{oK_CPglLJG&F!s3$-gBXGV9_g$( zI+%(cy_04S3yu^l%*rJE#AKDIN->vokVufgaFujj)(>*Ptk(DfWv+AS0a5dW6$g7H zHI3I)V7~3Ci{Ypa+5wER5-%kLavqePAXc89Qvbd|I(Y-DOp%a&cZ)#k`~Zo>We?e> zL-05B0_@eFPfvi0G`XPq*M|Qz_qk-PAq07W^pIH!^DbY9phpy!OEi)PCDD$sd-NmzaPDSq+pVRKx`JQgav?~}~?d#Wy z#qbu}*ja|*3j1jb^=J=Q?AX8Zwi_&b_A^xq60qrJt_jb@5!SW!p&Rap-eF>~%vpO+ zDxeEcL>#}cycft&FaCG{GeLL6q++KV#u>fVYS-jiFBN_naUE81!4%xjK2A)5M$gOZ z5oQOdydO(z&tx{VI3)2E3BdQOFbus_Yy5#=f555RILFEK4qQOM#g*C5b3m5>JLT!K zZ9Z-s#LO0sC-7xUP2|N|Ck$xbcBCGLYlT~W+v??-4%csrLLVmX8&DB$xb7v90tE@( zWE4s;mABirCdOnKoK#kX@e*H~iB^|&rL$|IIbrpi4$x@xOni`pCJp`1>ylPPLR&rNLQ0f9 z{QSjYu=p--w`pyJahfACkjj>Ktn=U?ECXqY%Y}R`=I+;4(POT(oy@jo-85rnQV;i2 z_1;}k1F_v~V+OSC2A?9)jaYnM+Tqf$Kbg+Sh<2;+Ov4Du9XQXFO|qDpLJTz?gb%9N zhqdg2r&RXGcCVuuJwCe%si8;euk#(`k_R2FE)rlo#X-?B0R=0g|;;a}cPONvn5ZH9V z)39yq@i}iMbbo4)4RGrQHUKvb*V1}t8~fwSaM`hniPzahMMa6JsW&FLx-Q=wY9U7n zSjn*_78gx)UeScG*=)$@=%^4H{okh@?Y)}jWQ1fpwph|h(#TJ8o~R~UK%uH*2d-yG4Y|0EZLLOI?S_sOMDhtwDZqlb63RowXs^l_8v#*!9 zy!EEY{2>hLZQ*91WMZ`}h>5_p~)*E;*MA_HE5($@Q1ws*arsub)+n zA^CICJxr)+j0n2G8ijfnmt0VCj@ZZjm)*+lSplm)w{gbK4MU%Jn0RS4)e4P-8#62^ z6`-cCufJ1GEeD{lKe%dnhO6*(;cLR8Q221?wr#uD=EquCn&!S4$Rdvf{LnEWu=WpJeyTfA5+B!Ko)hKCOdCk9ia&KX-so^AS z5;iaS8GA2YUtJc7#bQ4M94^{sVPWyJpOS`J{ygMt;n4XqwomN;-7YLg4h6!Fs?4c8JAWvGastAT*0MYDu+eDH63Qm;Vd0jc;M2DTpI z_tM`QM{x<<-YBb}yENdTya0g8>KgfeR}e{yxt%5wxtyj{jSE(Ch?v=7p&jrz-M#9QtM+2Ql-{ z-{0GRY<+FcSM%pbU~?l7w9lUX@c#b&JooqiPx*2FgZ!e7#)*xSC(mu{?40@V^!4>T zAn@nUAM-6HrZNy4llByRyj1Gv=f|6>>dKaumbT|1Gjsj_f2ljFzsnu&pKqTJRaf=> z-QKnd3m7iWl9Z5;m@#vvWJ?Q+SbB(~4yY|05$9yPXddUVZW8 zt=`PeRr8*_3lU{dYMLqA&#|kWALLh?^M+gv4m_?0#XTkqFNuC%zh=wIE6RMf8_zqxw4l&6TmMzWncwx@%P+{-pmK)C^Npk(#NNiEy3*3p z%{z8j#C$&9FE6>T_V=*^ht8Z((APh&psLy`IOG4nzsV4bk`7L@00x$XiK%I!JM$z^ zKmk3T^b6?p!@!iqspZBlZ(o=61ITBFNC^oE?J4|qCbCUGexJbFpQoqm^GshKlQ?1G z#Cz-z6@R|Ip8n%v@^St>RbRQ37e8Q5N=h7dwZ#-fV1beX6Qw4AjE#|No)xclUPh|9)=n?*H}w|9zI1{qyhd z^Z#?L%m2sku6t}{2UV7IQ2pn#v(f6Tm6mPC`{fg-K7aTyt>VK2!La)Wp$26i++SZW zxv%#3sSi(H8ncOsg^BF6udg#c;o)ug=l6g4`GPzUl}ZT*?c4J2?=$@K@9XS?=dQI0 zM&`Z0_xJz)`v2!XyuTm6M+~Aa>CfNa+kbqOHs`PT^Mmv7>N|Jt@cjSxFYU+2&+3Q& z|L<8LCHddDV8do(1H;WmHGhAJ9!{vM+b2Cs>J=Zo7)yGV!Fzco&W?ul>tFP2|s|MpnwG_`2OCW znVb9G3I*;B8#WmH`Tc!9OzZ#u@`rbqzh9Ae5J*b=`~Uwq)bd~d|J(cORQ&j$2z2a! zNvP=0@BB$%l`SnT1z8o}-bfyPet!PLnz*<)Hcd^ta&95`_9)FA~O#Xe)cga^Rjf+m%upI?8Q9|o%Xpp^oQ zm)VYX0}S=-{p#{qhzJM6Y%;5bgy6}^Q&pHs_)78&qol`;+09yp-!vFvP literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/briefcase_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/briefcase_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3862da91b0fd2a6841a8bc1c3223896ce2ba340a GIT binary patch literal 1165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVu!MNJIEGZrNlK7N017hv|DU81 z_He#^{gM3pJF6djey%U|+=8q|NVV# zulM2i_xbMBg^72z@o}3(SrDY^rT3XtoSU=7mzrX7rKJ4Bvxv%bL5yY`czdn3i+%{(o&t0AL z1RwyaoG^K6;t!xGDC~iu{0rz{W^V3_nG>@bT3cHm0=>!ub=|N3{XbZob3gpQUk_3Y zQmv$VH0Unl|Nq7?CEx$sAKqR5{zcwTASv9m$z?g=7{9; zZhNEU%z?dM#IBfv#(3MySLZ- z!UA>wc?N%eo<8v5@pJyR_xJZ3*ZluC*U`si#>0cn>?~ioxVepI%$#}98RDdxGaGpu z40v1*ig#-Gc1>}3&b#M-z=}pAP=^f5B5waAb+Wv87kJmzWzF3+yDRnjSUP9|6aIu=}F1~MxZ8!|NoO5pZ)p!d%Ck@9G~mK=JtMzg3Ppp zgaoK$3Xr*@=IN_)H8nSoIc@pz`xj|Ec=Rak$MFLPKK#FL4>q-+sK_QTG;m_;NoI(l zKy3*Y_5TjlJ3aXGll%Yvy1&2vUwW$jf8tjrh=N3*f*;@C%QFMP;pgY)Z?u{`efso= z_xIQHTwfobo{*TDyrbabrFuWUKJ{0xvNl27(O<-;g@V!1zw*zgtN^S9(rhIRNzW|Nkjx3p8NZ14`1Nn-m*S^|DmHGb3d?V0SyAWv`Oki z>%+Ud%XxZwdLo!V9`BduiQiwBcwU87`RYkmj&1~W`-PTp?e2ocdQ3#@O1TaS?83{1OQ8CM`-{6 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/buildings_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/buildings_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..822b31c91212f2ae6870ae2b0f72e7f5410d9b71 GIT binary patch literal 1176 zcmX|AeNfV89RDc>#1QccK}|#A)H!Xa^M%b4jGC^_0BK$}Ey?MXsq1{f&V*!+@U${o zmwKKWojc@@HeEZ<^92+qmQ3@emUAd7D_b7;atn-?XFp`O=k9sF_uTXOem>uq=Uc~4 z|J)lBfPo;$J1v#Pg)Pao(Mb3-2##1G$m@I>i^;2O<>xUFz2-l!*&Q|?|FWwjgV9(i zSIQ~%Cxe4vFa!XfNwhj0HydPf3IcJcc4}O$-Z&V#(_XW@=&&V5X0$C&0>zZtW;tf8nD>)_4UL!yM5>0G5`SE zTf7wVEX++PKDPmY2#Leh4i`+deNBsxA2VnoVN|lFb0X7usQJ4%;r~eUQZoO57YaBX z7ug)niP348%wkGbZxGy~+Tr=q*C5b8fYy4X$}i;U__&K4JJj7Bt?An)lAOR+&nJBp zNbyRf)7uqY%5hJ(;|HzuDpPVyV(BZa@Mz0>SRR1QRV^^HuP?830xZ1TLGZt~S_6%|NaxMUCA&2nzT45z|{LjIwl-0+mNM$%HJou>bOglLj7GO@^=E@BY<-R9NFPhCfLHYY`_Ai{0DLa zS={1=mVFZzFPsE68uIMAn(c^iLxxD{SXLGv_|!N*jQrJKf$;G8e2FDkiJ^8|+8}|JUSJ(m8Q?Gh zU^Ox^HyGGa?ivuiEk;CDvR`a_rMx1}Wc*|arLZ~8mcsi=dB4w(ZQ_!4|CoEf9EOVB zmGJWAA$s)9Y*aQ-l2#m~XtnkOeE~$=PcbAhl&BUk~=ws7H?xHB_ z?`kY2`$oD0Mn?0|%>FKD$yZ*+XC0TRlQ0 zMXo15`x&jR>AIx)G@{Q=9IWFJZs@3#m)We^Qk-d0M~f{>$R9I#e&uZbk^s5=Pstt< zAP!n1$FHj{e^`D#$m}Og-CFqMg&~7)n|pGrNcLQRMNE}JwAfU>pi8-$v@4tUUrR8; zUjaDDVdBdNe*5d4gdq{uDKUC)!A<4ja~+w|88J5P|5d^|Zzlj2Ud=7B_V83Fqfr>$Ul+K{lY`7KYb@!iq0xr0G{+h zkB+$nmT?CjSa_~;^YV;&xw+FT7YanGqJ;`3l2W5ktl5T!a!Qa$2@nBiwcWg=%5;s! et;e`sc?8rrvsGcp48I6pp|s=atj8%A#Qy>rz$UK% literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/buildings_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/buildings_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ad9178b7819c706bf6e056853dfea94f74d54ece GIT binary patch literal 1558 zcmXX`2~bm46#WpE07+Q{B(emMgpp<-VUc0bVB$|CFzisNqJ|IxRYyRiELuoGF|kt6 zuqw(js1ybPX%S>Ffv_ag2%;5(McG9xWvR-Z{Qe}qnfLy@ckeytuAd(od<1Q{#}EJj zG{YYZhrjl!jnsqB)U2$}0HFJp0a79}Dp_oi*13t!PaE6oSoe(yugF#|$UojGut8gtHNMf=rBjIsIf=F+@*Cew%)@>`Q1P=?1Hj(A z@3|O1mLv5W7;}+FlacH@iPpFPu1sbjM1j0pYui;YI0W@3130dYLc>F4Am-g-cHHnT zxziDJI^8@kWfh0RVNP~ui-M)9&hDd`9M_)*EgYDF0WUlM5M8b1uuB+z}sKndaYJsCv>w_gLb+W+v zby%NV?lW1_+tafO23dG{e)WvB`njSFy61$G1S5v;3YkO_9UOW2AOr(~VD;Q+PX6)7 z%ft`=EY!*k)QD8dgWxKPbUtCIXu!D+>g^A-qM+20+B5ri)|avQRvPAgXpU^l@^t6}|8XnG?oSKSdGP&&IY~`ojZX_F6 z6%LKsgk})*pKli09UQnFp^W3J0#m)Gh=dRnc4@r|BtOZ%uwwj+%0T_zd`f7g+}T8U z&n{00qc@3v-k8I{D_gPEpS=9;V6i7KGZTQ&z_0~91^@+#h`36V=NR|kN5zgY&oA0I z6Sgal^qNQA( z?yptsuBmcrniYBYO-WKu`VwRgD-U&}uJE|Lq6%Ug<~p)`ECy?uoE~XWj(M%H`7Ldo zXc~J|p+i;&aJH0W2-us5v(_Q~z=$5&xsg^AclO5!d;ZzRhGJ0UpZ$0Hnnj#ZIZL$i zw&_b|w7xp*AcW9CPh_)VblQGgyWZwWo+<-j(DrVzRNx#oy)`QppmHE(e9?^?u^UR; zmtRMNEoempBqSn8Y>7HFsPqlBSA>|9W;oTFH`nofy+;}C&88guz{WBNCa24MLO!e= zU;1?^pI6;b-SFTMk6TgG)g#-uyRIFrcK$0|U*$FYi8Zc5-=OV)Kd<>FelD&3-bG;a z7!MhT8n^Z6%D}tKGWUYM@IIK864hWd=bLdrr9H z4)3!~GgDRz2$G&Sf%14K9yspX=d5h8ZHj#u|r2Dl(%yy$g_@n_2`-(qF)B;D7>0PUU*(G%pCR zuew+kS$>x{8D!F)yLsTfg@gtY2Rg8cO(((u#xU1u?cHC;q%q}V=*8}tC7I8@dn*d0 zrUB0u*T5M?^~nO=sTq$T_h)vUmIpJVN|ZJ6EZdG@<8sW>H=;^`jNLsKMFVY~c2~5n z-R~+a1Jn2NNqSq~Pr{W^w=p)cG#3K|8WYKcr>#IW#j^h^iw0#EI@ak3(dYi2IN~Wbpa?rwQ@#UhofiSpWkI74VS+ zbHn5;cwm_SQkl8`1M;fP0ssI2 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/calculator_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/calculator_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..22a983e35850902d62d583fe41a5315952d8bcc1 GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU^?vS;uumfCn+TX2vSp@?x=qM zZxz41-3}uIg93vG?Di}yEM?l-nr(mo{r$}j)c5~CSZ&3Z7ay1H|NrloS4X$8fsv8Y zltVZE|3BRN@BjbvA09pRW=m6hcDAT!QyowXP*2Z6b4CURjsqKhi61uz_S@jVNJ&ZY)YR1QTwfpGzWO)&S23{RAr~BZ z85DUKHt6jXusO5eFeaz^z;CUE@*z`a7QUZ4^V>iBdBq2!yvw^eLRsa&I%+O1)L-zINgXYk_nYhwc-sQLYkSN-?@|NlQU zfa2u;|B&+=f%bARZ%m%8@q2xvg!-c2d@rrH?>qEvQp-EG1K*y{WONV;Eo}t{LQ-Sv zpY`$kCHB?-KbMe}cI*HUeE9V>TVz{bA0IOi9DaU&zG5Q7S0=F8P0|d-2jAV@Ehzy6 zSFT1P;0NaeI>zl9QXIf$Bhk+s1f^wXCcREXOZrJ+;55Jv@G1em}@Eh=!8Gz*sQg zU^#d;Q1(H*cm0DF;{evVDJ(0D^3QKDo7BH45G#^_Of&LJOo+e>FVdQ&MBb@0D|61 A-v9sr literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/calculator_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/calculator_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae724c6dd67f282c0f384b7b26e81db3ac10446 GIT binary patch literal 969 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V4mRV;uumfCn;fpAyAOv|NkTx z@r2aWr#s5u|6BE4-foAHfkDB9glqhcjE#4_yt)$i*Z=>=D9i#@duYRhi;s`b{`c?i zb8SVvV+T$gInuC@f&0h#0|!35e{bJ5eSMsvfw6J!w8>MyHlJjK=y4F&i~IHO@9*#b zpETs(-~WGq!N*JGDW9RXA1pZg|Gx|n@cjSxH+jYC)yY5p{k7gD#G|0Ee}2OB>BkRn zUThay15pjM|Nj2^f^Yru_7XdG?2wo-bLPV&EiEmc`hR~C1q1{V9z1xEU{Uyph1uHL zdJ}Wt8D_8(a?T&*Wia45CX zGM*7CDR_8@Rm4tPTRV;$YOl1*rcIl8WMo=`wWOt`!~XIB0aWUB^PfL8O>K`a0|Vgz zRE&eUgmp?3l(U85WcPf#TBT06>qts^m{r7OY$^oKef#=V^@KaJl*8}u@<0B+zP|py zef>Wb$^XB;z6OR3dq57vz?LbBK&SIGU;1xvA(OQz%iOTjQK3RebP?OPaO3L5^4oi7 z9eQdFRQvyb&e@H;42C?19p3F)GTbbj!$i#hZ7VS6BS0 zln1Ln)X^+&ufSFR=f^=%7_=FupEKC7VS~Yp88a3v`JR7&U*d`X|NqZ_c%1*rCQ#4- z11#wv{|^2wTek{2e*bID%+JryB_BI);zU8Y5(9{H4{dp%uEJOM@6SmEZEbG-$#Qlz zCqDfCp6?QnG%-CfG4aPo;j2s#r6m_P3NjdQFmJqH?xL4X-0+_;%A2@R4h=RKM@eeO9Dz{}{Uw825 zi%)ar%#m<}C*SAi=kLF_ulDpYkV-ABE}>&Te)RP8@Bsam`s3&4=lZaO>BO(3W?8xO zvbcV1+K(?UjhTgog_(_wjRSvNUVfejBsyX8Wb3mhPH?Pmgt*>m-DSy{GiQoML`H^6 zNzb;*zq4aq_u2M}1Mr{AP@o|5%zrTN9 z508oIY3%Im%-Z(<_xJvXPfv&Q_?$U2`)Nw*p9xPPCObKb>&O24_xAVq|63UD1I?*_ z_-N_-7iCNkvpzoi|Npg3qoFZ1{R`}_8@9v*h@OWFZ7oU<{0f1TljTQnfB5zF^_1?tRbRV6DemF*_4g&9 zVU;u0kc+{A+X0!ou3(?G0t2 z&MH0de*Oo6fUq#Pzz**>K##brOioWv|M6AYm=~ht5C>y~R6uZW^Y$K~3C9awU(@B; zINLlw$%0|_Js|CL=BN-T?E}LsXEM;;1{_B|v8Vt4uY2((dxWf&Sl8=`iY)K6Kd{`9 z6=YN}zP@&qfpLgvLq|ed*t*@8r+M|kS`W?Q0A{6g1@G_KR@^*$;=~CBP0h~GHwT;9 zdCc?gsjT38W>^BT#7VcK?(e_9{|>WxPLFCk6+4e*Ci3d-|FwQ>RGWxN)N+Ph5y8eqT-Ej_UVz&C{kmD=e{us80eW znUwUTq)BOMY10ytk{)GdWW3l>_IH=wrpGH7{$*rl#pPvWX#D;B{QO~{gYA9-W0Ic@ z2q4?P~c(S@a0*&kv3n2pg5=6$p`n{?r(ehXn{B=jF=f({8D5p4lGIn>F{** Kb6Mw<&;$TlPdvT= literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/camera_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/camera_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbb62cb9f7e8277beed742817896e3e0a21e86f GIT binary patch literal 848 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cancel_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cancel_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7e82f5751cf292534a6bf53b06ed968b737498 GIT binary patch literal 2537 zcmYLL4?L6kA0HcM3`c(uZkghgyKU_*9JjF>aVPr2xw;Y(cOi=_Q`sLhe_^Gd^IVGiCi4;}gdfxy{eq@XBDZ9<%59QYCf04vBa26OP>tnhjNM=y9q zZ8_SBBY&wYmA0SZ7lFxv24IZ7i$m4XR4O^}Lsi2OVD{Zv-1@_yHG{cd=f~H^a5#r% z768y(_Z=5=y9C|%ley_NEp8esjhUq31+ z2dWx&=x8%9W&|vJ&g`QrbCUzPxGR{rGQg!PLVn zWh0>1u3d#fl_qFLJtLhQooed3x*vz!X0ux!CC!V@Hr)>`EXfQF4UL0oL60^)GL&7f z*WOgWf2oC-gX5pw{AD`rTu@6(3&Pvmo7^$dmb06po&6%Owl;Oem%{Yn<_Ez$h`HZw zv45rpL5LlGaJWj|&M!cK3-d}E*=&qTtzOqc1MsyB2E)Xdqy*x+@MElUWXJI;^e!xz zcGjq3bf`?E1|3PQIDTAqoEJZTHIhXmli7sqdG)g500NT0A86Qh%n=;_cT70Yur45A z7y$r4!Kf{gu&%J!B0aEaQCNi*$J~k?Lb=Mwbq-4e%<0PfH0|&A4wjCltZ%f1B<{_!x7%-yGL7J+ zQuM|wM^#|$12LZlbHcu>D6_xHHMv`M^8lol{zLVpFpsl?(JjPj%L5?f z0U*4>&4!No6qa?;GHQ?Oy&Py<#p3c~Z)tnKywJMLx6h#`JZU>d_MYII4>^Hp?Az|2 zQlItxuiYsjN*$Ud7qsofb|x>!H4^Pltc0(U+YfK3`am`MpX*OQTcRBVv3&VaM~5s( z2(p|!EqT|UKGJr&q@*OX3uN));yiSppS!y|U-Wa6BmRg+!BTogsRH+|@L^Xw`5`}C=N=T~6cv&rEqWamlY8U$IU73$)*O{9dEpaVYM15pQhT6LqVFu9 zMr4XR{0g?O?R4A}Jysh;Dyo4(T8yD25GB8yZ}1s6a-Ks=)&Ky3UydXgiosPuSF9;5 zEk%HA+yizHQDmg8Eg?Q$zVr2Iu*>zQ|2ZL2>}sL>dh_B%k!of#ra2pI3CYcX%q@@6 z7V8lHt`1Qz(=Lm%gW^vVWU(8n(BgZq zyOMnNldnWV?c`sI98jddHbv%w3WPZAz3mY3$B5HAe+*&D!Pchg7xwn{szBLidPaVR zYssEw%E6vZ&T(;hivYVSA|pc$Vk{g1ihXW!%D#R3n1aYUOaS$RCOJI(t_Ko1lJl>~ z^Ioi>&Z{qLZ$#hp>Fx?`3=0cu&oq04vN5-@u`!Q`h%gTc327dU3tAi%*fPPx0LC!b zjg2_=?c3OZ!?UIG?vqzJJRVU85+n;XWM<43Z_t}&*!INgAAH~zs>bWru3<1Z9PS99 zcfANpOiE&ISb|{RxwDR(k-=Mg#TJRz7Z(+Evj5X(-Vj=&lIO{p*3ObP%G8$4U;=`+ ze_za~sIaSJ#qaTlf&=6n)XK^V>g?>y2L;%v4u7~)rFpvB91fq-nwXfho0^&`ZV!G` zeAJEP-`)?;&*o@n_t10;M`Jc^Iv(^BDW6eZRb`;1s<^PSvQo|$lp{cP@1X$iU7xF r`=HIxru3O3Mo~j~Kz=bC;y@rkAu%U?L@3Dg6T@>@a0KZVF)sISn#}pD literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cd_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cd_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..86e3e20f366ce983b4a5e5dcf89e4e3ade5c9a87 GIT binary patch literal 1063 zcmXYvdrVVT9LG-|bPg{RxMnMRP>L?H4NVKWEolj5D}zn~;sDG3n70L5jkvimUSp$x z-By^PO01Od(k8=2MFE4tct~v(#7SW;Fdd_|Y|5jhWkOqMd+!d9lYGzlR?J@fd6a$0Du5tlHd?LgVwc;26yHQLJR<9Q7DK{FK(3N@F}Vm-mz~z&NidR#XKz% zi5QqDDQWif1wbGy*2SLTc@i8W2#JDI=39HK%<|9uo$@jw)|Ziy!`$}v_P!i=0SOSnd%*E8=OffX?;RrUsrUZl%Uu}?el>q@ zyV%xPhV$;>qb2N^o(XOJ_}`(ySKlFHMW1GreD0!PXz=PLVW=aZoQ)*tT-jOwg)5am zSWVyWIl~BFo|{tCETn+`BdLPCwx(|G@jcO~@Z2GG%q|~uCU>-C@>eEvgCP0FJ)1V8 zV#cMPQ>z*9M|T|rA@6RDljCf!$3?ds{^gmRz&XmQs%Y=p%7K|jmr~7}_Nlt@fbwvJ zudDm>Ytk5X5(~Wb)x#Rrdpgn@rFi#ZnfeC%UUqXDPW35JJoYmE}*-@hr z;5ZKF2;lX40X;AfEZS^Q8$Y4yIDzHtZGK~^!n@RK*}Dtub1ORvJFi3qnchwJ7rgSv zXRHWJ+Lv$PIlqwBU7l_`@g0w{So51eP_A_JT#ws;>>Jm;4B`q&@W z;JF|5s8n&*Ht_S!X~BttqE90Dy;op-umoa>VwYcLW@dN1R;xvZYTh*AD+`B>&|u7> zNsjd@m2BP_m|sBEAdGc0H%Z?~v*nmr%tD1iVewG{_cfT8>thgObF9qmc}_o7SxG+C z+`N~9qNx5-Y70Z7(J;c|O71vjhE(}mj9?V~YuUZDbAyrI(b*X-(lo?)*IAR-k04W1 zQ%G`hG6J8@#bh#>du8EOz5YiP<7!(}=~jVjYiskQQfbeUdnvn^r`J~3*Vk7xH8q*- zrrVBX-N?wuN!yeCw7^0q*J80e*m_t3>pM0%ncq!3)xGf0!v^;gK2M$5Wj7(PGdXUj z?R8#3Gq<@jKWNxsiu5QG{G1_qA%w!c3+cSDA# z!eXVEEW3AReqN#<9mQ)aDk?VZZZriJghYe#hYBK-$@H$So5vjvN37Lmjr93^fWX(A w;R7LP@Z%jQ+L4x))(RWrfU-jmZYYAFfCJp~rG=`u&#&7OCZq_ieTY^54@STSga7~l literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cd_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cd_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..e15ef465b1a0c99c1cffd7083f900711e41d16ae GIT binary patch literal 1840 zcmXw(c{tnI8pnTa!bloRqP>Eu2;!oa(5eiXSfWVhYHx~ZQ*DW*9a>AxQ(7%T1f^=d zx2dfQ#^cJ+X)QH0%Vdg*sHJpDh}%(BZDbHiBDoQB&-0vf{yLxc`+m>+zWFDD{B@xw zPyhgQ0|SU;^^M%#I@;<}oPz%X0NU$;MDO6#Dryu5G|kR1S1Gr0`9rmYMU_H!GBdw~ zNh`@Op>3~%f<=&%)6li_bmi-APtVaL<}NiwrK0lVrMY+I>r2O#Tl04Sg1I?}Krjc{ z*w}zfO-(_TmX^QP5;BnKN=3hPW8gc68jej&O6oB*G8&qln>}3=|2GYX*D7B7>~W@s zojS{^tLsCd4+^AP@)QO;L*=57uiw##U^1DsoE)tpVwCYW$mg+mdCuOSeN!G&&teU7xLl!hX@x~{t}ZS-hfUeykzYk= z>qzjI4gHq`12~QVtPykQ6&B&;yjOenw(+dV#m=l3C5M9y@%69X56VLp+Ba`qj;;IQ zz{b{iG;=|&7brUnlsdZ#U@86x3-DAm8H#QH_8q6J_H&n{r;DHgdJ3`7OlJc>Zii3M z!@Qc`UW7{5O3H1YPO>3aaa;lTL|o5G*`1qb7J3Zfca3A*+9g56R}^1_q^OP-h_2_m z43(3G>vG3T^KH*PODyy_ChpMNOp|Pw!oJxeISguYd@pa-pyF8JD zG{9kRJ&u8a*KiBzAiqwyAT|qi3k^7O+qC-+QOkJgO7h6sbfX>iXd$-IE)wRW!&dOp zhN{Y@JMplLXHtX9Fjb~cJT#O&eCmx-un(U+>ieC|75caQS@vkD#a7Oy0614r8op#RW%g9D5xfta$>a*| zCO3G(xr;^En!idw_*j?j4D%Xx(#k>K67FS+KSrto!*hL$(e7mEnIF0#(^dtSCa$F$ z!3Cd0mBzRWu`Ig5sR{EAyLh3ee{e-PqJA$WZgtu?QY_&kamugIwOi`WR#)p77OF0L zfIFvW%DTkQt0%}h?$tdfodhd*yyh_6y8PPjX^)x!8zZkm`27AD#x2zHQdhZ8obD3d z0!$|PZ&C`dn6`1HhDMDF4-a=wlT0}{Iy#0#TU#^KbBec5xhdOo?gN($Z7w#1!@X^P ze121|?c^evVGl`H=39QbdbQn7?VCo=^?DK4er_U>zV}ZDCMZOHXlMx5l}N{(pOQDrF8$SqRH|Bwcy12QYG`MWjWk3FEp*M*X z`_sL96k|cy&U;>?i@9g&o9kOIZXa`nJ4n4Ww(uwm8Jny9t8ZnCW#`z}BP}qFFHu&1@8b*(4s!bY`=#qk z=NSnz&#^Z)mUCtYD?4E7!5n1(--o+=F}&Cwg-S$-4(@0=o|g8&i4+Q?0EykR>~pkEO2C!g@F{{g2}WM=>X literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cd_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/cd_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..af220811b0afcd9ba56d0144b12cd24ad30f73fb GIT binary patch literal 2550 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/comment_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/comment_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..dc28a08dc0e7c484cc9d2323c02d15d4f3584170 GIT binary patch literal 771 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU^?aL;uumfCn+T%A)(^qqo;qq z%iI0<`|GQBMSv1vn&3ZfU7d0&4mHKdI*5qoaSmzqeQM@b)y?uz9mF5I?^9 z=ks&_w)y+(3~j2v^)ybOUd{|ry`$*qtK0qZ_W#sHYkqxs`MR>{czhE9)@lC z6I$58Zu$BBy?j^F45pX|KE@&CVl*q`_J z?b%XOQ+IUltNVEfVqMbDudl^H)=U2T`}_EZ|NraRN=r-k=vDmuq{@8ecKrUjREWZm zGlpCY1{^F0wVVF`f1N4t#ANP-q{LOW5BtuzgeImr6s6z&tD2dc)*)R1_D9msUvIS! zFZZ7xpt3Qu>8GsPxg$r8e0clX92EATkW5TT`San`Rc%H+J-s%0`?>`g$DVc7|NmzQ z3e}qb|K>hCe}Dgeh+>w58+i{X@VFjSub*w|;reZTP#W6_DLsuB69V47S@rd0?Sz?g ziYK(}78aZ#S)G3^%45-#CY5J%dOj9z|Mm}T9fKpozWf8-`_jEa`j3h4h{~3H+QynFI>MpykX+RkIFu>5XA>m8PwIEbF;Cr z{q&t}w)Xb!^85u&O-zTs=iir{F=IxZ!fI%OXu8*>e}1c>DkcO*eD6MiJ5^>u*GnB$n~{AE`z75 KpUXO@geCymNpwvB literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/comment_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/comment_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c259158ba8df9d53979446abee745c97bf5ef6 GIT binary patch literal 1081 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U}5ldaSW-Lla$iXRQ~>+_@2t& z+kPDHmp9@OVc_HIQ&&24Xmd*o%WO#r36NHX|NoOx5)u+BzP$K&&wswXb!T_C;fI1^ zM38_E&jZ0ueY;#?B(S{ zdDDT8c<}65(vOdymkU5N|N8&mo>^O4`>O7PCr?s-fOrszpa0*>hp}$YyL(9M-~a#h zY;JCDJcgyEr9NB#|1*S|{PX*N`>^IKSFU)J7_0pNa$tJ<4>J`poY9f^`}})8DA<4@ za7fbSh*S%=v4MfXpFck*GeQKVT>k(6-+r7?@9>4AQ>IQ0{Ndx{!((6fF9mJ`&=ukd z-6k~;-rn9`u=oGJzsU)SiHSdcepZKB_Vu;+;rI9VOaA-!xBJm9dHcEr5gqRYa`>7% z|Nj2o-#B;f+=tKm=kvf!{P~#u@cQ`u694}Ebe__9;|MU40*)lUnQvcj1XuD|{qXhm z@gH|_rEw@uS8hK5QeXG?*GZ^?hff~WeEajWSW{3?uq}Rno!}Lp9t&w{>BGOj%S+s_ zyde+qT~c6R;LL)5cXsLl0h^kd8d&X9ubf9bK#-G@!?VBcZ_;JcPfBf*lz`)SZ@X!DM z^B;bHf1fA+{=U>5<^TWbtGXWbym#;3QiyYHt}GO6Fc5G(c-={4A>#x`$5@G|1u85r z6*7Oh>o^@Y$S_8kIFO?Ga_3J;tyFupTafGPdl3Dy@c zcU7D}y~kfumO&rvR43i79~ywc?V%I5=f|Pz>+c`=`t_@XgruaTUG1+U3Mwi`HWXja zYkRiLZA}_9K$NaA0rQ7A(9vw0Hf>Vxld(MX;o)I+Ha|Z!$c^*!ZE|j4O;i zzW8rF%aZF1o0c%XXb_Z8S-O7dne4S&b8qjvq4wP7rk(O4*CUC)CzU`ViJ4&^Ge_V# RAMRd|>7K5BF6*2UngD+(1h)VH literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/comment_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/comment_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..afb647367e345b5d04b551cf330f02109e4e632e GIT binary patch literal 1309 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVusrc}aSW-LlawHl02E~S|3As) z*`Dg}`yQOVz5S?t-Jb~yTT^9ZWc*!PTGKf>In53qfhcRTesFQ|@oM|pe@|5O)Xp6^ zeE95vg9jZ$PuKtXaqz>_*Wqo~*T)-wDERzl^5n^-X$c8XHg7iU z=>%5ktQ+nzq^U!UJNUdIdVAi%rxKEamf!yW|IgFY z(^DWd-J&NfIQZ~OkbyuQhh8(}NUdZ|C}RS1r8a2%`2Jp=83e!rO)U&loVgi3%k;EG z{`vhqpA7_{TBTW^M78w)eShDc&CSiNE#AJ~2(petnTY;@x$-$?|;b2@~mV2g$gIWC@;e^d^12^ z0;P_|!he5$9{%wByu1jzf;Gqd#1n7o|Nna!%J1E>AqJwR$>M>!3QOJpf4!!T4>wJS zs4Ov4R#p;(gc4BlyMEjH`2B}?9lqP@#Xl@!v1@lc^N;C#8JMKY+_ZX#DQ7 zwSVsH{LH#OZtt`o=Rfp6{9n(;*7pCugo4Nw#sB|}Jv_Y(R;*mP(89^Vp&{}7yuCdC zFJ1vAulWz{nUBa6a-IyICid(z4==BFA~aDs6*3q;INmQW)GemJ@4%TOD(hCQI`!e{ zY4J8-TpDw5a~r?8wRQHwjT;>sCQkgQyzv<{KPX*g1m;@(q~s)?x<7w@zIt^vo9E4& zH#|U3B>(vP+x+nQ`}-w5HqLpt0_f>y?_Uh_t9-t`~ik^s{ zOoJG#behq?eaZ5ryY|=qes_Iq_H~K6e}7JXV2|205fs0`6ryyU5tvze-XtX@U7s|0 zGSfW!`hTx4Ej`TxEKE`oQc|9zrlhFs>f{A0PMNlox50qnNKKOh*D;UtWjY5HBF{m=|(Ydp0j&%g|Onwqxm(Wpk!W?r`Q%E|?l*c6;^P tyWbLjv(#OG4RqxH|561kV8dZFGsDICpV!>{sC5VALQhvemvv4FO#nndQUCw| literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/delete_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/delete_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..37670caae13ec8d0301e76bf768a1fde96926d8a GIT binary patch literal 772 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 FzX7|<#svTX literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/door_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/door_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..15726c3f5e2c52698bf9f9b6b8d2ee17d9a65d8a GIT binary patch literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVAAt+aSW-Lla%7XwEg{^%0GX9 z^Gmw9xv|AO`2YVu&z(DW%%@BhF_n~%kO1mo`2XL@ak^goPk){rB|lHq&ya%%COMkV zZES2ze0ytaMDFt^Pf`rb&D&QeCnO|5>CU-%IGl?mF_}+uP_i-RNx#ZuIcf{rhwD01%uwaNvVH*x^Zyw+EY>Vlbo0s`1kks_sS3xnHiog{`n|i_hfz$-_zC4Wt~$(699s;|C#^* literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/door_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/door_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..5821ba1b0d5977f4de4b9bac85780b7f7ee6e13b GIT binary patch literal 783 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V7lh%;uumfCn?2&dHef2m4E*J z=9hGHb1TuD^Wgvg|2%i@+%carRmAk-Q=k@x|Njp;OxKJ5>Cd;LETxY5wB5~_N`ga7p%&NF7tlq@MN?cDU>=jZ1<|2OWM-w4roD4UU+ z+mHVcqp`8^;q&wDB_kqkZaBpZvB}`!{r&Y4Vl_WLFgh=8Xkdtu-DFn+HTNa6n3&iO zRvjH39wsIx9vd4Qp7?z=i9bF(WRBrWJ6JE1$O17$+GWj}H5zZ`+t(Xy*tBWUiGwOE2!B$%sLZ$awM(frz!q__yM9=NlWzMXU1J{`!gAp zm6h+5?%A`4=Y%W!CK*L;h~}h28yLJJ=2;Xntxj|LB>@CbLpMB-pTwWw;O^eOfOW?s zh+xiHLp}xtp2H5`|M$PH_FB@yt9bCi!OOM>W;qIlw&w1dt#ZTe?tB){H8b@$0G$C0 z{0$F&_rEXT{`dd?`31|Dvzv3YUHoZZ_b1`UzsJ^LP$wMfcrxFG2)aOwaoX50apJ_UkC&h4nXVU`RPp_t?BVC<=XZWP+CP7P z!n41QV(eg}lM)jW64H{A9wjCv2?3oVl$4lORsZJ)r{f|YSEit#p!1QDk){9t{r&v~ gm{{H?h(WApW=Qnvv@35F@&H-q>FVdQ&MBb@0KV>1ssI20 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/door_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/door_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..05d0b11527305734ade2faafcd7060a5cf6a6654 GIT binary patch literal 972 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFi-Y$aSW-Llaz9RG4KA)&p&>D zmpAI^>De(wfc4-1|K|^!JzMJ>=@}?I+XkrT|Nldsda?UH&5wF;>8bYr!kf%s!6d~e z6P9{UpY)_41*raPLUwj{I4@X6=>>zDni`v~uI?t81E)`){_y8#F&i7(or@e0(_S|G z|F5|4*qJkD4xBmTGmUx1%$bsP|NfjjaOzlJFtQOlnD^EEbeeM1#>R#R1U9hn7;{Sl z4FS4INt0#9j2RLYm6ac({{8%%zN1Q__dFw9uA`H$gk87@%0J0?A_wRKHbX;05Y-mG zKJMVr3s>RtmRu8LKYV)|y+f)<7NSM!g9e1LNP}eqBf_XfnH&O>c|rF4{|{mdvqG(~ zVzIEWkg%)$Y&Lu_ja(9vl9GM$ z_UAxhm5`9&Fp2p?D_j!f$&%7i$(GjELaDYl32bbSgcQNnPnookm%)IiLE!KI{XFdSK>TxNYiIVQ{mk)LzH5E#N7t_Q!f|C#N~&aK$k z$(6C(YR4U6g_Ene%GH%loO#dM@Xm44+jpv#KrR3OJC!jQ3kwVL3ky${0Ac}d?$5u4 z)&008Hq)$ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/down_arrow_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/down_arrow_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..27f83c927bea3160eea5238d1c71e40019e58366 GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV5;+UaSW-Lla%7X>_6W&`v0@D zw;56l)6$-OpCcoqKXb;+{Tf;)W-Fa$1Zw&JKgrSj!R_tur9KrE@yN)$;o;%w3Ap&b z>A$1|%lkV!yVuQuC_7~E;Q#)5o}8RDJa68-k?4~A_y4#66U2l=A)n_n21~O1`Td>W znFlNeRDS>e|A^eAgoK12zvV9j1wob_Dq$3he$e*+=oDrMpQE|{|3Ak)jnBB;+}zg0 zK~)(%INmScv%l_dQbJmqTd9_?@Zo-WdjpWsAQz_q4YeqJ_2uSt{dlQ^EWN$G5;tz# z2#7g&>eQ)%M@Kx{?(eTRHUNTxq9VKU!oq0~cZOV4+!E{{L@tcq4Cv0}so=t5?6Y)UbbX z_&nQsL-Y9)5}8Z|Yrn2?SLM9xTW)Opf0Yua)~lPp>lp07&TLXOZ8OimwESuNJ^%iL#$zW=oH%gw=+O^PUIw=<_n-Ig%jeHug#`s~9zAg20K|_?(m>{c z53jCff4{mqJb%i>sfp7kPD}go>#O$R{q_GPcI@0KInTEK+=nM0C(mEFaN)nCq(#<= zRS?Zih7FC4jSrump8l>|T>qwuw)SB)W#z*k-ru)xOFuu)(5CLslkl9Jp7}d={P0Wp z3ej}P0Iccf=jU?8&(7S`P**>H4CI6t7Z1m4YHI$QG-;Ccg{zQ|Jk&YQuJ%=AZ0z5q myLSD0etEgSZQ)8tj50I0cVGK=DcT=oDubu1pUXO@geCx@RZNWl literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/down_arrow_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/down_arrow_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..e273eab74f5fd5d14589b73401bbc36cb0806dec GIT binary patch literal 920 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V2<~6aSW-Llaz9RIq&Yi&p(d$ z%NzZ;Vqk3i|H8FPPmZYa1C{>&pLB5f&)eJcjkrF2;(7BXhlhu!2Z;YKG!poBK7PN1 zoK3}v#`8Qtr9icZvJd|M|6lUP&6^Sy76r3E{{LS;rwFJTDxIX1!pQiSMHix2DT7fd z;>2dS&i(cOKV+%7@q$fKI>i3tDd$Q?2uFs!Vykc&3z%~#|KR@mip3A?eR$=ddga+$ zlz#rNUm3cbNS!1Dfkp) zT>jVClWY5TE^XI2tH7zUf1}0)o~2iwKiU&-d6a>H9pts9=nt>2>$5pBI|2>&LV8Y;E=b{~6ucTQ2Wv3wA`!1#O`N3IZ$_ z7ar>UF{kPG>Z{yZJ9Mx3geWQBvb%VHQP}B-Y`JpxbK)wEDoT&cCrxOX!eD%O-}jem z`>xl5O-OPnyZHONe9X7Ex3{}SMRmo7g-v@1w6~>LOIVoM*x2}Ruk>~ayP7{A4j;XF zGdv(5f!_xdI>6|2x&GnZUF+*_t;_PJO`MoEee%@QA0HpHAHKi8exua6GiS~mICbh& z!Q*4TZT#|ff4+SB^hH!i=vMCR(dXPf8EHp{=KqO5yZPh0!&hrhqe zdAw)LoC%6+$-H}ej(&Le_xF6pe|2?AN=mygoMnRO&SGR{W$b481nS-e)P48&{KSQd{}wG;WW8}FB<>Dnf_0ysu77vBe*8wyFu!TO zZc(!yetv!)l%{y@+__^g{eM?q*B4=N@#9$*K&zk{v%wlai|gBn>Bejc^aE;)0%`<$ znP+?6-K2`&-|nt&Il@x!$=NCU;|nyUWPmkoPCsw+{LIYVj&X5)Z!a%D&y#etE&C0c=13F;3|gg(oseC~!_?feGrebQsQ< zxJ3YJ1Ne@7>KsOvJIPmOjbljhRf1_n$|9oE` z&r|>JPhvt!%8}V@b^jY%4(uv@ZD_=-t^Jz6yxg4C%xv3q14Fph_4fOJy1KYXq%2t~ z0R#)C85$WF85wNYu)zRmqIAApdTMH_fr&|jm}E!Q!;_cOdGzD3V)zyq^9NH-&cBjWAbyg%*@QP$Vf@B31{nGJOHK!9v>ec zo;Ppa@bt^uC+;Z!Z`ZuGw{-KWRavsTqM%;Nd^FoU|L(S&yPG_txE^)9zrWx3&)?tE zHP{Ud4Gjwl3mtX#m(M?V@ZdVv*x0>dvtim^FTK7#es}(j4TXz)dQ5ir^za-83UFFA z&73*2arW%l4^K{3=P7@GFS($sEbHQxD@U>{nSlW8XeEhd>*My9#c!@U>n15FS(cfp zxu>ro^52)2#%;UH-y7}NxpQk)cJ|c=#_|yLT0!yqYF_S3I(o`?(znB>C21DRYw|-DNgq!h{=wva)aM z-~Zbi&o6J6^5D^)<)wnh2`ZDu9RMD^R@8y|| zjg9?oU%7H+L)Yfbn~nec`Z}8#Vgy*0o11&%y>{lXFtN7!|Njgj8dJ`0$1QrLOvgzCSZ>ObMK#lqO+WheQ`}-dXotV+w+}sER4^L0m*Z8!d;s3|S)==;K z{P)-T@cQ`u0X#d4pYt*6RQ><^n|-@%o2ZD0#Ely_B0-h=)EHccuEg+ z)$>ba*DdC%5_;$2=>)X+-Lh5t#EqM|4ur}5~yKh`S#iYUP%A*mx#A0SHo4Q!Bpzvt_oHzU>at z5OR1S?*Rh=W(V!6>Pb`n{9CX@T4lk_L&h^izAusfJnMXv^tOpCp{$+?oRcPena#4T z@Luz~efALdqySB{sCaSVlkjnWwz}W{dS%6W|Ns9Bw5eg&ga7qxZU1?A{!9KdH29OA pARr*{BPAzi&*7s-EoH#knHjRY3O+qD(tQGQiKnZd%Q~loCIE`6Rz&~+ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/download_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/download_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..849bd82acea3b25d2678e26116315d488f5fdd21 GIT binary patch literal 1073 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VE*Ch;uumfCn;fpAyAOv|NkVH zXEwFJa{iqTU$6A<&(G72eTh0cXY7w0Jrd^O?X7y~2t-*^bivP4SC8}j|9|?#>C?s^ zK7E>y^J9Pge~EoHKTm!5@KBj8PwrjqDX*?`JU{?7IsphO{yaJPr+d2I|Nnn~f3NpC zxITXWzxW*$FaNI&U!N^0ApvqB$Qda>wHBqn&Xkv$hVt3j+3i`kr}VWLGY}m9|NpV!LS9#hQXUv2MHbs4y z&nD(@h6Tt4x)NwpLp8f}#g7k)htJQq-{_{HBR6B_Ovxuto=8MQ3LgCPUj7I>L}$qb zLoNmdo&yI0{<#1Df9%pR$2%owizbwA`M>B)%{T5 z@yN2ev2i{)@_DM7_o7vHKhNwD+4(*%hj{~7dB|j-(FPpM{6~)d|9|DA&_eI%R}&0n zEKmGA=p=O4R$+Tgs0&LPTZ4*GvBuBG@A3}<0}SHXgdbl&iyvMeFW^0)mcf`Ijnm%V z9vmmT%ikAB@iFgTULOm>TtEtXWxEJX~B{5yAXs z8xjw*?WhY23#$-dgs5=;bi9AQ#J~Ul+501c8e3XeY@XKq_`oRVg5;irl!QM&KV9`M z3ltQru$g07%$BZ_B;20p=jYcpeSMrE2Pfw~ptBR8T0rrC;qv9!@~@{t+vM%*4j7*V z#&O^WV3OU?b@&6wW1zSOruahzKqYL_(y#LnsjDgd;!^MFb9a@$pSN<=EUo4R4GhfO z+}wAz?#TEe^6lYa_qNyOc?K(1ubk`aFVdQ&MBb@0OWDz A0RR91 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/download_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/download_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb950370db6dc60a72119cec8e633f6f299ad44 GIT binary patch literal 1277 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVupIGpaSW-LlawHl02E~S|6i(r z1xzQoh*$jja`Vsh^>MC$etw?bJWFij27~_s;=<92y1G+4boju^oC*&-)ee{c|Nnoy zTb$pt#{T~PtZDy$fA4?z`MEw1zr1bQgNG0AEnli+Z2?XP(G>3{tG zy1&asfBbxX{Xe(3{{Q-~ze;t_!~s)clhARlb%5r?(Hh&Ze71@nOgwAyuAM5etG-Wgc_(Z)(?Pg@%YFjiKYci_yPUAtFmF{tn!xEuNFnKf8n&jd>@1_J@6yO00xzneETMDUX9 zhT?<^Om|p4J)B%5K5USl**V|i(3yrMsd=kkRX%`NHpvjEiQ@?0k%RyDU->#~Vf4kN z`W_sWOwTwXn$JjW3k~h+(3c4)*MBib-?+5x04vCaIa5HIc$j33p8Y?6hFPdH*2^pN zF019y&n+__Ec?K%z^U@^oq_c2rK_A=7VMsX)LUxT)a6ZJtuYf1asusRZoa~Jr{3AU z!||8)RmMJ<>7NfzQpk+ipz5Kd^x$3c92FzsyS6N4oW{)F{ky>qJygJ;Q?VhE@34N{ zo&*75;pBw$^z;NE`0?|z`r*y#=OzCA``c~&V&dfk^X)q{fO>!qJydW&KjTA!F~`jR zKRzb2NlHqxv9WoG9Zk2~6lZ2;HpK+4?EHLtL#GG#_Er}drpVvjS1T>|=LeTUWMrhp zf1s2Gt034sU;&}9Kp%o_m0~?{&`q;p zW~U5O{e(qO!B-4lDweQxbapOWqV3`2{sff1fKF_(esKQ1y~Mh||Nq+`Ze(UR5K=Un zEg&EJ?*0A!8l3`QHBK!D=HKUu-&fN(z3qvFpGRL~W8=fe$Ne=jVP-VUocZ(m>hSe9 zSy)*m>i+z2+?aafhmDO5PyW3GUv}Mbr*TwBV_2Kz>c{X4uRFwSr z^_5$-{m;L@(#`$;eABkwxOr2u?(eUo1z%s8vW16l&x2(&rkds0|yQ?$n;-0#Bt7*t0?9Ef|cT;!oL#|^Y$rO zT2?*+o8uoz1Jzf1=);T3K0RTy2 BP*wl{ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/downloads_folder_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/downloads_folder_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d11f03ce672aa5b1694061635ae47fd1bd1178 GIT binary patch literal 662 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV2bs0aSW-Lla#OkB*pOmf09l4 zzeDA0Y;1fp4(zZ0FZtwY>T4HQmsy>LPSJYf+4S`Ec06e3mzR8ZclYrR@9pc({{Qzk8EVYW@9*^w*PFC5G5z6* zikih!|Nr0N>;qS`uS-A`G-@=>`0)LGd|SV~z0sc^ADb6kzIpSeWZnONXOWG#z5Ts} zUEQA(2Tq(gap2_1lL~5TZWkEb+}zm0!oolv1^EeRnS66chXJ#+v@|maaC39FJ(_8p ze(2`QmoE#x{Res!qBQ0FK~4q(9%e&ntM2dj_4TgD+r>I8Fup9xxb-iCgXcER6WgAJ z@q-LaIlYmW!H|RHpy;oTTQ4T)W%RJjS5*@KF!_A>Ifc%k-ME7 z>y9vkHJx$fJ>bCMdhojMd5Z&#?0>u+_!Rf6PvW{EXz>1wLhYQ-F^*|Lp)({WF%*<5 zHQimh`zIqvU(Cggf(!~k%cR|mPAM$@pOtY~{py(mxrx(N(vJMpXDna7>P6m}o(=`$ z`;)fq0DC&+lA$1j0Z@y!(TW2M|5y_rEo}CjthYMR-!sHKzU}y#f^wtD9S%aqhu;OM z>OsTl<74&1&(F`7w6L_0C{VT0%gbZSm6dHfAHVOwQM=k-M?U;LUJeV?htHo^?@T{0 tS142Uk*Un=TRbELmE7e)DGumpW`-*rH%{-FQF#c&_jL7hS?83{1ON=RCnx{_ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/downloads_folder_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/downloads_folder_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..18c68845d963bac037b9821874ad0c88b7f358c3 GIT binary patch literal 934 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V9xb)aSW-Lla#Q)5Gcs-|NkOO zCNQ03Q~vMJ_x<(%iyj24XlolgI>qdnAj1t&lw?u+>`i^mgUid$|JRS%^X31yxx1JD z|MOGXZ`DtzieLZb_cO)C$+7AB^0xi||9^JO&Z@t+mix~?5#HR4mm-=F3;U=#C ze}5nU@aHIZTl)DpgFnB&_iG%EjF?dmRrmA%e2b$#K0Z8`f`UNUWo3FoLV`u%ClPj_ zivRzUetqwEkO*Y>_xJaCh!&+6&HVCq1~tFG_3Ci{`~Uwq)TD#Y!Qy}Z{hjUD)so=I zR{q{L0V?H^Z(!9WSGjozs(N=15N^H@%aNMPIO#lD)|WH8?9KmGO?6nQ*zz^ ze`jH8zkU`!Jm0=PK<7ZJ;3ifXnH5X9&+w#h*Zuu-6sF|oYxOSH7M}KBsNy`dzH{^?y@fioU)UXV#ek1O-yN^6px-ndjeAF!}$dQ)z$o_q?|3>+1|TI5`b} z{QPOSVe@9=Kfk_qGXk~#|6g-{BQJv^2eTu4IFs*$OANV}XE};Z-)pxkH(^V=N*ddw zc@AldRwbm}KWgt;Q0~G~CVrQ9(hjiJk_#I-4=`}JTyz$2oO49-PCeuFiJJ{#6fV&{_(BZ>} z7pz-%uHfk@Q8qn2J&{6FQ`5Hi{dIBt8##f_WjM%d7pUX>`~9&X z7S@N0cE8!)$ocKHT-r0n?e;D%1?5J)sD_%3K zm1X8?ioLbu{~!u@*Z&DI2s^6F(a}k@@AvrjV4aJ zqoU!iUK6iXO_FEGocN`B#>_KkR=<6>e67|lX@+ujB?IFnuld22_w+9mJP^QfR4Ge> z;XFgn!4o>)4Qf8Ve^nJOJ^2aa48cit>>;9edw1`DlbulB$#JIV42y%1@%3`B<|c~= z&-EwC0Hf+aLT2X4f~TiM+3M=**gDkf9)@UZXq;HEXwjhqM~<*;e}3J+qYC0+peFN| zd=H*IOA81NPTo=Yn2p)o+&r%I)2B~7_5c1fE^q(;|G)8{U%Z7-^=$|IMdSr$3+&vn zLqbGUR5I`GuGXu9ckbNb;o{=r*Bo2et%rWIeg%c}|Np>9z2wYrQz)nJ!NZ4% z0U;qNKR!NYZ+mKBEs2QuXHEB0tQ#7EVDjY2j&X7G9-fy*_L&E=WZ>104-(SD+ zRikPY#0^Q{`1f?=P_TCL^Xq$fu$i6b)~#DS@%!tJW?G){V*>)HYg-s*F-u5FO8)!* zpMQB`(h&=%;NZy*54ZD2oNa0Z`>YKV?I3q9XN;J$Kzo^J!%a}e`Trkc3(&31#>U27 zOj%Yevm@>6{(y2*0z^wvVrr`C&kqj|zgP91zA@;inG&P5^zHnxurN>p1{sl(lq9rZ g`Oy~;E-VW(GlU-~d;ZhzL@P+#)78&qol`;+0I6rnvj6}9 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/edit_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/edit_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..cb22b815e298a4f82d9307356d7b847052bbfe43 GIT binary patch literal 864 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU{?2ZaSW-Lla!*s^ykM%=Vu2R znXT8y>|Av8z<~n`7A^X8;?${C0X{xCvOq2W|0k&|`FV1(`ay0norrad7M)tPeEIPM zr%#{$@at@LTd=zSUv4fg9#*i@L)izuzrR2Cxqifs%QsF;hz#(U@$lkecb=M>8Xg@T z9iH{^`_q2>d;3}$s2XVUq09r@^Y71je{c7G*8qnGXAh5thrj#h^ITsSn_ltfi6*l) zH}~Q9_xDTAv#mV?(UNp<>CbC#t)pFBTr8F>RgwJn@9*gkpRQ)Jsimc{rKP2{O+B`p3P)zL6glUsf5*wFs z%gV^yf#_(eet3HN`g7sy<8CYI=^azl*6v>P^XzPMp7ZnV(<}b}vpsxu^>vAN_xJx_ zzipe^oaW}ooM4-p*dM(#PQS;+#lfYit(|!F&#SB2ZQ0k?8`u2)^)LB%lX&6hHTSv)q4vMg8Ajt-+r`Chx2H_eq=A)0i0uAYK3|)X>x{{Pq98{p-EI z`6bTHw?F^k?QL_Bv*GLFQh$7UdU}0N&liVGm9soR05v`lsO!Ro3mgH#p~)4Wzv&*n zX`C*ZcYo*U1uGQzFV;NeI{aKezAiOAmDS7JdvQh@P&riR#S0fcT)%KZ;K$eB;)mzk z*Gsgxv`F^JS)MBR`>T{KOiZjzKYrhzQzuUzTQ#$>u@M^3mwB)#Hg|RPHu3ZG>vt7C zKDO-IwQF;4-MZynkl6w<8kovVPHz-Epuod&a4~b}gI^&lycL23UFIF+{I4RAvqRUo x+QlaHYuo`VolJ&FUl{l2-kkS*JugTfGsBMbK$n+ud}2Z7c)I$ztaD0e0sweTnn?fv literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/edit_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/edit_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea1818c7ed56cd3eb0dbe47635a0812cc41eb6a GIT binary patch literal 1397 zcmYjR3rtgI6fUopM=>!nXu(BR10ox?luck%I$k1b7}OWwpf3g?(@`&azP>orIrWblslp%!`)FIN+p*VEHDccfR;7hU}cRaX9gj*~)oEsx0F>bf$GLKUq4u0Y=jCXyYbRARj=yL4g zqdooky+oVUhUj~Hv0bUDbM;Vb7Ck0ram|WvL!V&q$q!Gnzvptt_N1k8M#jusPA-Qd zwOJnw)eQ-omMrtTyq0+>LxiibC36|AV%^@LB)4D>4-Y7^&`1*qis&tOTWB;IoyI7( z)W&6PFY1d^bd%PjFi>>8iM>@Xd-81WRQC+O-A)i^!B%IVvF*i_G{@$*yj$Bp;ub z84HtXG{!i<04h%j1rnCth)2hI!md#$Yv~5VGMp*3FaleN{9l954v9l_p-8tuha{35is; zCRb#$MkCLf*<|3V7mRj#+JHp1Mtnq5{BFTFJ>3dnmMK}> z&Yg;~s;V<(GTBmLLBS!{$jE1Wdk9A&+Ho0Rk77S4J}5t~iaMcIugyU!Dk{iV7{|2e z^pm&j@q)%O7K=5+8CyZTaUe8BN93wnk{yA7>P`9EEK_SBkT;K{2R&PHZW)=Wq3UZk zWg97*f;$`P13^PeE7J}@%;MQvv#z@aHuU$06Z64%tRS`}$$i6~>$^I-Zr!<~LorP1 z3^944`RP~93dPRbPy`r1him*)83aL07nk+F)vBTpCI2BQ2bT1pQ=`eZA*Oh?(mXG( zf$4O*^NkzIfRCc$l|Wx$+`eRj|86#UZeq9_Ma>Cz>2$Sd%9(3HP7tYAV9U947gmRa zg`Mgbe5_YFVKsq3fEyb#OCbo4fJaCAc^y-azJ2{IoOxU!bt*UVDm=kT-WLbhzhn%hQBB z<%bh(>nVw@d)@~SqCnCZR{mP1P$*`=!AopTLoF?Xr382Rh5Nr4c5fd% ztWUo4{$Ghays7ThgdciTQ%3ma?2fyCI+;k;Wi}Vw08IbH+yWo6v!^7bCN{-$%Krm~ C2bO67 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/edit_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/edit_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ae5393c8cd2b446e2baecf7c1f1ed84473d28a35 GIT binary patch literal 1620 zcmYjS4N#J297jA+dwPJ$0!lUW=v5MNYX*+Gz!c214-4wMP8i9&oUw&+Q zqGm~4rlnKEOm`9xoR(s;{3vxJhlMV(2mtsnTo%WKn>Cs+ zwyiki+{DyxwW{ks*evt;*Q%?5+N!FlaE~*si5VHQ{z$MKyo4J!w4(aw4IMpld2hWy zAd@{&C}fXiGP})^-bQJgK58|XYSD0tb?p*CcwXCd>;bAm$}m7lr08P=0)dw@CLyux zwhE2)!!*)4*BJ?TW0hEBg2O(66thruUA?OIb_&7 zS^bAn*5iD)u%MtoV>^F&c3GeB4pef^I>DNJrzY&!5xc#pdKZ1o+I4jE>{|-d-F+Lk zxp<92efEPl1}wXMUa8j&ZOedx<&Z0^bnvZxYJyxIf$fipL5?RRAU{lxB{65mKjR9r zA>7K!&!IRRPSJg^*4sXBRmwWMEhWp!_xYIT-d;65InvhVwkmvkzLT%7FE52A4b&S9 zq~?~pB)w5j+`FF|D9$vMh0|!$eo(L+uE{PE_WT6v&BX5nJRXk?>|dkg*vt?0uLt~j zP2d!awB{i3ITKGaQ_n|Ezj%dmP}?79$8IpEL2#C>T%*0b2sW$)|C_CQ%xxT)!5v2eC zz?*HiT^umx7x|LJOoK5l_T+BCy?epYD_P#oU_uQb_{2I-&*NmajjXu3GX)dMwp|!9 z!dK%0#Y}r{;)<@xUqj&Vd>Dm7;Yk5Ii8W_CuaV_Ikwv($u6wqJk-YT*$80@4J)1|; zmcuXiaYY~yvz3*H5fKp)$T0~giJU%x1mgu@u77p5OQuq(7JArfb5fWl1K8SEi6!)q zkKvX3IHOP~4<3()9FuaA%m5I^ZD_zMUiyCv(m8#M$-Ylv85tRMS`~+WFn$G*kqwr( zu&|I@SGPqmsiI-nHgmVEx3^bt`*x>(ymLQKMUxP*Az7uGk(NoRsHFu;-_l(5@t>13 zvbo$yMG3f4@(Xdde&$UaPs#xT84Lz-FO^Cf9v%imKX*lAZJU;+r-`8S#KbM4Wq!nM zj}S81Y%&@{r_>$%oRX4~8v;Rb_%}zZG(+`q$kn*NlbANMfeVGBf{(T{j&H0%D;!yh zpyr{`XxAcK&Ytu?EdS(~W*n;VKds|7wk~KJ`mLy5uf`X!%_ry literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/error_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/error_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..8affbc136ff6bba2fe9f495c13cc9e00b29500ce GIT binary patch literal 918 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV2<^4aSW-Lla#OkB*pOmf0B!M z#ou4PZ)b1MUu;+ZZ_NQ9IC$W|hvwfA6u7Jal?@!csi%rv>Fg9?5HJn%o)WE}haC%`t z!JdrerDmF18dfi-yqS3A8$&=SgUZjEeEvyRH<=3iLWH97# zJ;SaDSTmQh3k_G>6C(1lv^WYHq_fEVp@B3l1-QH@!PtpY+L5 z?wt8>PXDUu5gQrnz`jiS^YL-}k2#jb`J9}bA6KqkZCLa3Q|rU?^X(-v=e4%BHnz97 zKYVsJn&yf_PW@f7e-)F1 z(6*V9Im(<3s~(l?kJ+jGhzSx*P0w4?&(EtoGsm)8R9IMe{gNdt%=Y&3%*@Kl%*MvX zhkt*6FFDV?`W!HE?mz$X<;ujMpdjl6XyQytNlTlSn3D1&0f;RN9yENJsvUlLUHtyM z-=Cg(JI+ulEd2OgOY78e9UUFDh^VN2KY>ZS{XY;SBqV^s3z(jm8RVpUramz)R0MJv NJYD@<);T3K0RRqftwaC- literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/error_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/error_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..9150b003d369c5bd15bff78d65abd5e1830cba39 GIT binary patch literal 1445 zcmXX`3s6#77`}uODwfX`Y|2cMEw?1hwA3&cO>%u;n)Whe@iMdF;@Gz28#PVBOsyuJ z(OBDUHJegurv5Tpb&zvl%BfxpQnd7(PEcoiNxB<+KPg;#*)bt$`-JZ$p#Kn zhahf>7Ok4_vMr}iGu0>N$3CxgRMJ8v2P{k^**$gk&{~{DJLRoxjT36ub6Sb#+*wR} z@B5aS9!mdD=h~fjK?X~~2T|mX`U4}?uXEOza3T0b{aM{Z(M7jWY0ea)9+my)TDl?^ zSu`T^vjK>AQma9y<;6vqr55}?J;1AxW=y|8WO+y>+aG5z>a|Gk!8^ziS?8c?2-&yu41MR4UzM;{N@F$w@Y0&CcvN$PsNSjVlEo3C1ciKRc%sl<5vC z@J)6NC5Ikd${=2w@u@gT3{MYxe7rI$VO#jVzCZ{}2$&t$E3uW6amwIzj&J>*hP)gR zbva_2ehG_hCVsfOBf?(wXA5sZQ2nTLi+DwTTr zGBt0J3F8BS5{bsjAXV^fH-$*3vU@sm%3>P;pq;fs11TIT@*}W#9MSIYO zf4hu+Fg&wtu>@U^G=8nNvr`r3(2`X&5=lFBOwhxI8yel#Sq+Qz73y;OmMt$6Tgj+}?=A`f|gB@;Dd2qQ!d<$yK>~N{XYDsJv zPLm%!Yxy&higUMHnN}-0`kWBkU?1Kooj2}l-*!K%1Y2HHM`U{v&v*z+bjNQq;uEJb zp)oLA1PMH|Wrcu@LvMm*f<2#*tcSc-yN((9g(B33Tk0pB{++4wZZmDGh=cC@Q$(5t zv3(@VV=xN7+^A8BGI}i`HNEk8?NIh$%dCy_bu@6w7d60XS%&Ai-bsjrYAd<1jxZC}?#t2-d_86DlYmAOKAw zkrY=V67c@_{M8)~I~wGZUoi(YMm=A+{n*rDCY$Xv5R<@R!Z1ts@wJTt#4XLWN2yfG z6$*t$tELvO^5anqKvc?}^hy+oG-XreYNiRfN&(fIx9}DXbG#&3MafE)*7b6@&iCW|9X7Nb2D`dGDk-`jD#X>OmTf zh9?r0;~4^>P?%p`T|Ex|893g{)?}SttM(?5>V2c4%ATouKu$pWCg+n`tXIIsG0@D( z3H0(6;YXy|+l`Bb%RQsTJ1-cFHWiN&2NMZ@T)86l+W2kFv;O|tcVlCkPoSy1MX(j+ p=cB@W41nJp_y+{(KTGt09}Tr#pLIeBCuWx3>7h}y8zIbs{{e|@r%M0; literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/error_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/error_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8fd1754a04f2dbbc91fa4b665b65714a2057df GIT binary patch literal 1890 zcmX9<3pAVA7XAsLL@H*Gq8=3tp%ST4)ry#Sq*qbnRb{B>oy!b{saFU}xHI((Ez{0~ zJG$CpglmdQiK17P)>PZkUI~Iyqr@ZfAdmSIXRUMgS!eD2?eBd1{QLiRpudlfmXQ_! z06HXJVi0J}6;l%mt{J(xd;rj}B@qe1*|%e3kTKvPAeYCYLb)@H=nHccQG-;xoAe`Z zo`sf(cW*+h$A*U`*J!j|6-P(j5rT^BKAX)>Dt9(i#+~?3SVea)#pmz0bH}R8j3g2= zOd?T*u_JH8{QUgVoaHiUoJg=?JW_Vl?3g=QGCDLqp8iEdL~9YfD%HwjS49akyjF;( z$javjvM3V@8Yn9(B+-kAY-nsevi||(0%Jt8u4Ky=)gdk}!ea?mUS+FRXHqPD&5rBBpByllY3y&dGjiaUu4>WHYSzB8})zx#T0d)69vS`b~t;9Etfkort@_15I?2TLJu(4RXyhRt{ahGD3^aa zGnGlQoOGH10Jo}FZi!8;zhFte#Vw4c3>=DOGoy8SVB;(&N|_~|)}=Fq(NvqdPkIc! zzVhS}zyMB^>Kl@_IqR9x5_Mhlio-DSU~K;0UqubaI2FtPLoio-XwDxJ*c1$-jfu;aPYu>11PffgPt%qJ- zYIRA=yV@ZEFF-F?f1jT#)lgt$)`A!qm>Q$J6jzvBB%JpPhxpn>mh_z;%sc%HTBaJl z+1fg`gAOSz|KtC=HLf;^|3fZe8c9USw*a5n&EDHER=|+oV6{M)CxPn4_j!~VWXcFH z&?(+G%pvu)TKNN0Qm}p;Tlfd3&n*#}wxEb!to5Mx&T1=TUx0#`!_;49)H&GmSP0|3 zSjb@4w8fp~ft5M!PE>0NKPEA36bZ?aKVQ8aZ;eP-&veN%{KuIMr3$e{;*V2weA-01 z>%utA21X{6Kf8g$cz7;ym{~C4CMT}CrsnZ_;XF&;M08e`AcfY90NIZ6AI|A(Bmq2p zMRQG=NZa;bf%gil`GD_#H?pp$b99@SjTw4~vWrPtq~^lBRO3FJ5sSWiQx&}}&n=@+J7buum1FoTc~dwYABVvbePV>FMzf2gO?F00ZG`-%n#KdGP zw=hz&I%Nih!{JnB77t6_7p>74j4I=P$YG0#C9I@<_uXK&;A4*Hk$BfdCO#;;@Rffh zceXbb#;Q4gGFAnRMni0DY(_YFLZm6aUj+FfW*RIAZx+o?tSLJM7hV z+SN73+1XjC$zXx>*%ogeUu=NGVzFr%88}6?B3T93xL}{8FD)$%x3siejrsEEAu>k&4Vk0S6AFmzqTBL)HfBwN$NzcZtv6(yhGe;C^(%jna+0e*HMXkrB@NlGifn;=R z<#{qSi#LaR`fS{tzr$}23kiwxeM&yWh@5tSdtyI@z7!kj+3BJr4bLJ*FKhO+wI^6; zrX=W?n-e1SrhimX+eF3rSd_dUyBMTa{d@H(h)58z-tnM^HxRHo@%`SZ11YZRWzVg> zb9XW)UCqwh+GM$8xfJ5@g@!}OB>~76WV`I~lcMh6)+kL)X(7NnJ$R&FuGIy_ImyeP J*x?yd{5Sd~hD!hd literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/expand_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/expand_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..80634bfeefeb63556a56e7aeed98b0c61c1a5716 GIT binary patch literal 963 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVD9pCaSW-LleDMk>#fK6_xGJP zSiq>KcTU~vR@5dQAoy_wsFvaX|D>Ovp04iMIg>Ny!~g&PdHm3cEQaqcND5?qqvVGlABEY<%F5U{ zIXTTueFjbLzO*!Q1>i<9%olP6EP^!0SYK+d~x@zR#RfBtevOGz>O z`SS-P1ZIEy_>tlA<*N)TDoS<0pgeZz(v?*}z2AWH|NlGnOSbvXx3heIyZ*uNySu;t z`~TNeSg{i*;oGB!WU}`R-STJk&i)vhvi`Iq5ttwCntu)bhBHh zUE{v%9J)|BM_4dL?bf2V`g_1?A+FrLXYZ5WzkhRCSz3ewg&7VVKDLrGbgLk_6s+VvX@j~_i^U}0tbAt5ft@%Zr* zknR8fLtF)P5rdMF62s4*zc`qfm>5))l^EW>eamnbXpE_eaigH1;1Qt9H~;?qi$hIS zh2huFpA7&0{o?@Xxp(hA#3*1)iaG@Fv|U_Z&}V8R$>e;abFRotX6q$Yt3v9fzVoee z5=t{>5Ip#IPtNP2SvMIk{NBF%_tcrm*}@Ey0z@HEne_87cM=1SO~sE14}nS89_ZzM zC80<5$K>tnjcR^;XnZ(*iAv1d_woBBA(jF){1#`nwziJBaN$71!(U&e-^|{g6MOW) z0fiF>4jkA}dHP!DrJ$fUvt~(Y7=HNuT_2RoKuK3nM5tiHWLLky??TDp*lME n*T?PED){;;w8Zp0B(E?td}l1q3@Nr+57Or8>gTe~DWM4fuBWYA literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/expand_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/expand_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..2686b14868ffb36bdaadec84e2516c4a8d60479b GIT binary patch literal 1494 zcmX|B3ou(*7`~ARAs(5gop`4$O4TDwi#|}fXy{PNwq070dW>bNWZOomM6~g!RgX1l zs#4pTYL#NQRND|?Rn;R@wOg!+N3~%kbR+S~-Rm)XXU@HI|MQ*y`~UBJ=VYJq_tDWZ z)B*rNhjIc8g1>}~p^1jyGnW@TmWSm=q4=pNR}j3JxZQ{6f?%*Rz+jA*tbN9O|NeJG8=Lma@?m*) zcuQ&*`OuoAVKy`}D#``)@)AqaG%Jp%86)5jXR#hP>%&XuW^V$goJYoLH_*uCQ9P%y}pfw(Ka--b&t<9?=u1THObIZC`DnSgr>R%52r?NiA59aTb7EL z94THsr1SH)yB7rrKKr9GpJ&v|2>Az6x zEVDCYCtk4_`_1y7KR>Dt+z3D%=$16|3+c&fO}B?)v$8aOt$&RBurld3W*OJ>g6Cd4 zHjVf608fx3Mb1ffdQ^I!Bw58p=x%Zx9jM2!9AHm{Yer*`t`qta?7aCi^GNM0nb>@l zo%I2{hO&0q#3OEJ0jty%z=%8jtjj+2ItHu~CYN+Boc8spsZpePgowO#TC-6}eZbMp zw88zbRUH7%KyAJgV4?N0dslsWDgIE-d#(6F&sSyP^TAq3-j@*I#ZB{S6GZ+^6350O zZ!&T*?Mk1mC~o9XN^YWV#7KFNq(b`E6JL@8?5fq zQm>(*gb;fk1S1u*pK8}X)`;r9&6e2DIXb?#TC9uQ(vp2vW;Dpo)H8KlTmL>&Sy$H| z82=|`wJYiRaGCK7w%(%hB z&cUIP{WpfnAYv#Ws_}DU@ylOFS3g6n*|fY@A4Z4$eK8{-s*s>+v)@uVU82GeKJP vOP8xMDm0h$FNGXS+sxNC?NYT-Agl-y*yD8lfnT4$|HePX%O8B^NoD^B3Y*MJ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/expand_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/expand_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c418e2a80281a195ba7f3c3a2ce3c258debd31f2 GIT binary patch literal 2043 zcmXw430PBC77qIsb_NoP1_G`igwQEbtWj363|L1+1~nmS_$rQU3JQS;fv_ov!@#tH z0VY!vA{eo30tq1y2C30u5mdyWf~~-dY)Qy+=LPJ0-+TAH` znj#Pg^U#BVN8r&}`xqO-@8qnwTYYuRqsbeFlq{1>vU1z^q#Q{llgaX> zS+9ymWp)fUo1o|F>U#Xob>hlgKdTMz+1?tpvSfHMR?LEdpH+GFg-1{>MtAGC=Y9+S zikfG|Xbliu-1_j;M!0N0M8)*Bh&y;V%yiz*%nnOmU)gDYi?=f~ZyN5^EG(%MMVN>? zd;97QCpI5j7h16Bl>a8#Y?s@GANz^52OfPv2{)1P0I2l>ls4z z?=6gaGhxFo7q=Y~(wy~{bw?EY8wyqXk_GwWY4n9=kyFTEP)oXwmN+(_Y`-^MEl*qpS&S*nKH4&nK~sRPUdzp`=;AvWfVKDPp<5qdGnhTa zg`=+n3tKEzisPA>DLPK2RyqVN%)e?y@-hMC?ew%Nu<*w(##oNN?mn9QEloa9x{Fd< z>$JF-goH_)lgl8CRu5?HvO2rE{_5vl6_SlD%tZeKEYj9u9TeH=Ye&sFb2DRVD9cJ36^aM%OugsD_2(-K3(SNf$F z_Y4g^`aUY^p3eCPP~&8J3%o{or;Z;lm%vIu4jw8*(lY^dyemB(Dsu2bO^lCwE{t=N zoAdLHMa{8d{g~B_1`ZtInhS7N!4gu>t$X5KJCar{&YGn7k6Z|_K~f9`EDlE}J*nFD zeJN7PZb~z&9x;W`wH=%Ke?TB+E6*)d*W>z~XRpu31y4Z{E;;XbTWUiN{g!Z}^}8LT zE%O#w-5HD8LKHMh9i|lwq=~Q4$85oRbx%I$nlo^Ah7xy=tB4mhJ>q~IH2$w_j$Q6n zcf>BFPVRT^P{qgXcz!7BlEeOmgS989lP$*N_7EEv{qy(3mIS!hq`o-?!2f4?QugjM zTGYxOzwGb}Z};tQ{?7E97L{PO&-Bb?!|lAj6Xo!yh^SmMJw3f%xTR5^ zr#gnn@$oM>H8lqwl-XKaPpH>c;&|p?eRFYbb>96k$Ajvwfk=VI8*qW6?!a3~ZwM0Z zP2~;`4_eO64>&0RbmkN+KUkmz2aebbhrQPxE82bUd^yM!S~?y-b}Z)Yhj-^l?Mb6Q zM>d^qw|=M^ZHT<+9@+R(_(b%i(X=S}YZZhMd|^p@#x=Qyvtm9kVMu* zl}!*?6F5N$3{krI`^p02*PBvBLkD*xjtrt&pEmfC6?&DC@t<1Gd*$YnpBA{e#ZXyU za0>u%X^3ln%^8*kAT;s~&t(58z5QQ%tQyG$U){Yw?zHOosRD|k76*=$DffteSU9=@ z-55*1{M7uHG5^5DLEURDmE7{|vhot&{{0;1<(Sx+yY(V?%LPC%i|)`S3V;4_PU|6- Wt3NU>Wz70$=Rx^y2sJd3t)fzMYMYO@T8|7f_qY>5aS%1`I44g_U;2GfT8iy~#X7HKfHO z6-6Al7(2psmR{_Ve{x-y}g{~;TP z%FLD@N}L{tz8&zqP`lyV_Gw(IXIFzQusL&(7pR=cAmYgFdXrLC#`-<8w;Y^2fn}TH zrbd-BYtmFUo?lxJ@w{W$kN5ZOdoF~Bgrp>ZKuSuB^oKV;xp&xr6*w6&JZk;_|G#m} zo(jRk3T!}NYiqkg{QrTYKzX2VoIW1fU;kg?-@m`7AG~?fbG1QSKkmTQLr_VUNAfL< z{`2jQW-;ir{rl@E0TDk`aB#kTy#z2^d#*Cb%F42(rKO38L-lYT0UBuZ=jZ44gU64v zuVyTNcPB9+G10Lz4XT;rh<*J(gFAaFg_nyf+;d@30*V9U(b2=$$iUFh@e`9A!$kKb z!VuL>k_W#0{;uC9Z(p}SMJeaO@qT$8p!rQN|1v|gC4xMimNxDGzqh~F_s%xk{O~F- p>zXw>`y(PEru_f&vsfCej+x>6vim!GqBFqp@9FC2vd$@?2>_Gm9c%yq literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/file_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/file_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..99b20fdf0bb6f7970f01de5983a5148e697b6b2f GIT binary patch literal 929 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V9xM#aSW-Lla%7Xr0zfW-@oVQ z<@wl@7`eGm^XKa7%FD^U+q>fmP&vc@|4EL|{`~sd?d%*ow{hmo&c?=x6B`BFmsyv; zGpPCbtG99TS4oVwTp{K7O=&`nH;%pN>k-W`*c<+WbI%&e;vLPbT{ z{P_6#il3j${rTnPX6{WhAr>6^z_^L^hryZcK0ZD?Z{ED&(b77_^F~HSCjI=pyFEE- zV1tt!w?5EsW4v)-fBk=ny8pk9Zm2!(CsHT|G(1f#ZAu6S%zFJv-xCviPcv0kT8bFX zI2^aPvRR1_CTSle@Nlz3WTfQkr942OAHUa0kR2k)yJ-La2V9aspcl8Nzg{RTdxA*-`YAD^Tpkix&z; zFaGb>D1yp$L;l+^6=KJTOCaTx|5);+}P0B*$GT}GaFl3m4I>NGljMM z-JQe)5CFz>LXwl_0!gSf8yf`AHnH=|38XUm*cuxfGb_)6rKyb!X%^br+JS7zn>%LC zlyv0*YWe?v&RIiV1_K`EgWoTGV4r<(;?ffB2B96*jZ2Kp?*46MR!PiJx%y7(0TVbQ zfbC355&~Kq_V?4*)9ZPq%{ETVWd;Ic?#udOVq$lJL4NP=_xJa!Ar4|@;6JwPgpBD5 PZ4lqn)z4*}Q$iB}Y(u5{ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/file_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/file_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..8222a412989fbb57b1939acc6bc221670f07ad40 GIT binary patch literal 1085 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVu&{W#IEGZrNlI~GUhX&l-@oVQ z<@rhqgBZEFPxI^Q>dMRIz1#ca3L{X%|Nlvj;y?brHgDgx%Zgc8SeRK^*=Nec#zw(d zRjD8Ritq01JpJMAZF4p~KfONf@O61VKRxZ{2LeBLpl+b{Lj?!+*Z-HWu(%;PW9Cdr z2}#bIU7R4EUEQxE3zjT7QSkhoZQtqX>mQV|KF0DGn1iI4o<#5*{{Qc9bGyoD+jNDc>IonMxE2VJUkDc85kKIS}ZOJm5vfxbbN1fGjk+g#s7b{%s}8J z<_gpMvH@sy@Eo=Tv46k6_cwNSa;|2E>g!=z;XP6I!>_N|T{2B^K}s<3f&=kO1R5H< z#q}qpZrr!e4rri~%D*H|P+9=RrVvv{LNjA{c=#rn4}X3Zdpv4xXIKW)Jd<~2AfJM| zorlzc9wwLrMGk9;NL2j!Vd%=&IOBK!!~6U9OFV)~2Jt1N%><^J38^dl`uGmr`Tt+? zUozaTnY{r&xq7;44%3oP-&KuQ2N9NCc@crx*iM@y4+C5E-RYjOXXuFP{kufD#7d zuTBh-20*h643n*(+DjOek1$Tz(p6~HAb1%XkWPgR%F4>$`{&zB?yLFf6nZ-G!SVC+ zd4S1&4=~RD^9X~C1ZKWOV7g9BN_v!>lr#zGa-koeetus6RoZOB#Y2o|e9r8Th>ZLS z((v{D{r&#`{{H?h2iCXdx*;Qj0uS?sk{{dmC^fe4@F|G)Bb`oI1EKRmSG_~36l|9}6v zcAw`rHa0Rslr+xNI&l8{ffFZA02TlL|0BmeoEajMl#=r2$M^U4Y#`t?YvR=dUw{%I zW1D`w)W1{W#CG5cLWq@XrC!5Jh@njqAExt&JA8#G&pEe{m%)JH@P>we|MQhYrKP3J z3mBpTGpj=;eK?&{y-c)$8)RzEsfB_E40sqe?yuVM&c3(9F~gx@#y+i_3;sZ|9^iUzhl;W`#J*v_W0#r*vL^>sK~WMt%;#1BtS z3h$7bAr4iO1Pt;Yj9(}B_3YoNFh;+(1N1!ixm^W7U*sn0)>{_$x z3g3aA1MCmN5~V$7x6E9)d%vTQ%G%sKQ3if+ASMEh+puX%%*OivjT~%kt9d}6`un@% tQfwy`sM8n@9e8>KX~n$RGuE#w30K1Tnq|4EC)qZ1d{&!zZ9Z*&Tq>G`Lufu9cNm1 z^Ea%TG*j{A>@st~!aWslfzJB>zp0&7S^4qt`uhJ1CB6ae*wc3Sio)jqfB&{C@q>+w z>EFo9z`$|n&;QtGO{*=Yw{78S@HCoKl)8IqeZhB!kE|e5oHjlby^H+w5YKTzsE&`1CO{Y@4S5lKl&NJyvva{dFsNf$eePT~uEm$kV)Y zUWELg-{1QmzPG;ul{(bXT>t-{;hws`zw9@$zIfP`$GEAgWGf_S4rMVK{rLaip4r&g z_>TAqlWh;2w?kx{xRpF)JiNS&j0_A6Z0i60`TzX<{K8#wY!j~jcik)iv9l)sldSktgh&UPlme}`T(M{H8Q#t!uR;SY=uOJ-fn zySwYFe5CQhnuaxUciEvPMTIPob~wRQVmtw=?nDO2=nL1brGbsE`l{9Czk#vj>x({! z0;jJB?a%yraDRV2Pfkvb##5o9Bgw)2JW%6496a3KFTp2o_vb&*Pdw-6+oxB2eI@F5 z{qUDJ_xAp_XJ%$T{PuRa#J@j3d!dn@l$et8Brz#TC;>( y>d44Q-+#cUeg=#~d59%RDL};wjyO0$xXcWUU*DU}`PI4@#P@Xdb6Mw<&;$U|D|`k3 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/film_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/film_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ba4324982eb95750bf4ae8a1657f89d3d53ddb GIT binary patch literal 950 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFxPszIEGZrNlI~G>X);P`|#!F z=ZZ8nH@2vT{r~?Ndw6^5O_@B|x1o~}sOA6vrrTfs|F8d-eB8e-AT%)T!Sm;fJDKh3 z{v0XzeJ++QTbp~wUZ6Ul!X(GA4?vY{adC2NWo2bMn%>{v|35v^G0@HA$LHt#%-+ohB8D(i!$GFD>BsLo zFqhM~N2cMdPKi6jX-F zI8^!T%gcJNBF0^jFJS6*yEd|zF3n^(tYcCPRjkqR@9*#9A3i*Ep3?I9{e643u&}T> zZHH_d#DZ>|ankRA+SJ{&Kce>6$H(q(;#8RbxN3u31@yJjDisk?QPtC%uCI?zwqiKj z3^jEY@6{_;9&kRtwl-R1YKuhLLQAMQ+MFB17uNs(w=~JKBMaoL|NjrI;QsgT@9BcC zuR?cdMNF6&ERbl-y;l!vk_P*RpCZwMUOWe)WEWSmfOROX(l{2@DZt#J*#(J|L$la; zczA&J9ctzNf0CE+P1?dXP;vxDOX-37J68?2dL63&A9xgMW)$BX%VM^rUw#3T$l>|+ z^(TrLfPo|jHS3nf(KG?eOor)^Cm`yb*7g)c9652qql_cLg3Ff&Z1AC5Dx0@#X;Gi^ z_;`Qt6poEETS4NWAlaqzdgoFeKP0@?1Gjrb7`S34tbPZE=ogc5-C#7UEG z)PA{P7``b-S?I;97jKeNQ%!$qmYYT+S%;0qPY?I`5spBBN Mr>mdKI;Vst0O;1IUH||9 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/flag_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/flag_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6da186220be53bd7d7070731e2e7cebf039e51dc GIT binary patch literal 793 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV0z%`;uumfCuzdu>DS-SxA^(* z(o^mK-~H#*#QVj?&2MA@s$}^8Kk3EW`33*K%-sCnzV_dr{~sr-|F8b7en;Ka9xTn^ z$guA}i=d#8!hazD$B!QjtgNgIApZFa7yp0%_U#8d2m2##Ztl~9f`U85#l)6?jQ#rc ztMjW@uRGY-*`7#CNd6W4^b|4;toY22@%%-Q|igX6mG z%RM`;UcA+PqT#!G{QD_E9flK&+*r66 zNr=F_^;Yr0r9$9e|Cc}a|MPQxW)OfVY07Ak`0)I^ z{0=22hGpzvF`x4XIT;jqSPq_@_;2@FWhXxQu80GCZy48Y+qKa*)X><4Wzq>BmAyCa z9|FcDFn%1r9s2(Mz9gTl-Jt^~PMrAg{(XGg{{R0B3pQ*vE+{B6;NavkG%&19toZ+r z`S9xN>m`0vROTB10nj$E{<4Gf?dv7plFoWl)1tZve zCr)MwUr;&(+U3;A3THPhX$IQ5ulDz`4?jPrv#F`6CAzt}`2n$65)VYV&f%TB4F&=X z2d9?W1~5v>?lyYE#G%iqI5XW-B6HCcqpjP%MQyhz`MT-G@yGywn)MOZZe literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/flag_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/flag_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d1614faf1c1daec5228a367872cd7501acae3b GIT binary patch literal 1010 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VBYEJ;uumfCn+T%A>qN3N00dV z`{yL2q)hqn_jh^QUbA3Q(b-rgvH1E`JR|NkVQ(gY7r@A>;{pRfC`AHVn4 z|G&S#|F-Wxsy9FC{rvpcfS_%@ef^&Y4<1w;IefU-t6_e9`-&AW zf=UkG+gBU?;oIHcNoHZ!#JRXWE#mTZwWeO0Pv&gA#>DpCR*^%gY1Jlq_0u+z4g8>> z4Y{z9^MHbg>&4%uCxQzYuNVB+JR`EvE4izGg5HEzU!F5mT-#Ose#^BP*Hh*+&uN{> z_{YT9iNix_smt1_L0pqM3?IFFvv>bCad0##nSc8C|3CkBiJOA||Nl?_@%_Dgj0`wt zlx{QCJdmFRv=XFn(Jt2i|BVg)xPD@U@EiF9nn7{>|No)PgFvm4AY;;%FIV*b|1YmP z38E_L;L;E8@9*aU;`D^)4-yi7@ITzV!NB;>@9+GpTMfPe#RF>~7646Ic(`41#*7(~ zEUc{a{{8&h{`&Ry{HFbNf0GiDQ&SV3C!{B&C8a%h{J8b`WdHeg#x=jbbUu8#dODAi zk`jC3Gng@r6Bj0SPMQ>?zv;&6@b!D{@2PzK@6}iB=IQ!ztM2Ts_ZONZe?xM|&Ykrh zo}O`rMkcQW#l)gGFGG^!p-jeI4?zheDJdyhQbJKn7`OivIBR_ICc9oE)D2|NbWb`1tvGx|*7rqnn$XpF|okAse0Xoq pQUlDJKbWWf{tFa}H}Hj+#mw-1xjFBr$R{QszNf37%Q~loCIC0D*dYJ_ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/flag_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/flag_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2b6722e56cd2888ea519203922bb4e096e35da GIT binary patch literal 1249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVu&nTOaSW-Llaz9R$ztb@ABPVs zt4l~qs@DAfH}~O>kICHI@^43d`275Q|BWlbOh9c6|NkHA3c7UZdH(&Kum7J8U;nTE z|G&Tg`{wTcSN;3Px#g{~5JgFc)H3qlPf*ZOI(6X0i4!24kd$<0!Q#cU9k|({Y7VM? zeE681?cMemp8Na%C;a&M*P0m!4)@O9F8BY}SMO)%=iBq_um7L+5{p0YdS=O! zv%8n!55(FF8+ls{1Q-r}TsRs>$;rkB$k8fN*;UsG!gG`U#Ip1Ad_H(X_IzL6o(Ct*om zZP+T7%v1G#%e4zpn_GdL_qIw+hHQe4E7NycK7YOoZ0ey|92*%^yc5M1Hv=Qo@Xz1h z(;tFD|NsC0?W-NHwZ8*J8PIm6TZ~hfQrs1+A>2bR8Qj#=*b);J**HB5S6Mx=pT!K7 zk!I@Y>EX%0w`b`pW{H3Q-3wtl8vX~k*4O=CxQC~r6Ozs0VQ zI0V{v;wG0Rw^F))iBzmT58UEN@daR)?y3Df?cwX~`8@LWH7P$nKR0KVwzg(A7B*(K zwqA0fab%0{zi*ZZDsMfe71$_fbn$vR(B}GXAjO9?x!d zgQ>n>)UEE$coX;F$sfKmr@0uy7k^b-dS_smXuIk|kyml2ThXY}&N1X4LOaBjEW8!05j}0JJyvDw;Wo*4J%uo1Vnzn8G9 z`*Y&Ji4!LdoIH6_K~2r=0)v~I8(Uad7|5R>F9B7`H+OUxFiT5IGlKv(H@D+igAf1j z*Ta?k{mp;p$p8QUjsN`o+^%u9r>BQ!|Nno$AcC0i>nr!+?fLg5>i+(6-E!7odfo3& zt&C8)PpnA{!otFyY#TOiG_3jgX(~+O*H>+@rhki%t1=!qdi3arr>E25HvW3beHa*c z5)zVvlYa0dy9E9C`Z^pg`|+{*;pgY)OITQ1dKMjge}BK^zWV>?pw4;t{Q2)4>F?v} rCY3ldT1)@dhlne=%Yz~t=w)VxADb8cVs;Sa2Jt;z{an^LB{Ts5NpSc5 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/folder_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/folder_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..60aeffead455028b958146e64c22b7fa03806d82 GIT binary patch literal 725 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V4CCU;uumfCn;fpAyAOv|Nljn zOkg_6ru^Tb@B8cj7d;48(bhJ0bc)$CL53TmD9NJs*_-;B2bY(h|F0jj=ga?Zb9XQQ z|L3Q&->RQb6~F$=?`MjOlVj8M)$a5o9iA~|BFZIR7!cAQN z|NcJy;m=X-w)FFH27i8k@7FjS88M?Cs_y6i`4&fge0+E=1qFey%gXeGganJiPa^C< z761Py{rcYTAQ8y$@9*#P5G_hCn)&7J3~GLV>($}@_y7NKs7VK(gT?>+`#amQt0lpa zt^B=h0#xqj|NrubH>aQ9pp}rCnkpbBrgpl3jje+pCjI@reDjheDvYg5jtVO)D<1~> zNfKxy%;=wgf14i$2A2fTy7LE4oahKO%v|@6|N8ge-}6D?4RYttub;&a&$q9CAT}XO z!Opwx@1LVEnV+xKeRUF2Qc`{ZS^lW&nZ4HU_b8pb*$!_csZy<+J+X_xJZp z{`>d$^noKsTsFRzlu$UzWo&GG`22i(Nr{r`n<5YVYW^$)}h3?|GonWzg4@rL6E&(BAg@KrkLAkgfU zle!Z2B_t*${`mS^9PaYZ>dey8(tA7>9AWw*^Z)g8e|Q*tdiwhP$;rz%1wF~pX_z^) rvvKdot`DpsUW_mtDnm{r-UW|Uc6fY literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/folder_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/folder_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ad184f070b971a5c4bbe1c336231044d87f9c7ca GIT binary patch literal 791 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFx~TXaSW-LlawHl02E~S|6i(r z1%*yZNk~YrDF1ip`~Ld>MGt~kEKrD7*HXIVlgkd#kOY)Zu&90ZroQIEy}j)J{pVZ$ z{{MBh`PM7jq`@X7fmHnXFTY>O)wPl>F)^`?onOu@@U|dSe^UTU%z*<37OYS>ub`uI zq~QO*=4IE{-xmou%?MQic0%E&FZIR7!i!Aq?Ec>H5NLr&^qE74{v1AXqeB>CPa@c! z|MC~5rcM!&m@-8~qwGNElW%c0R-*z4lfSR_vG5!3!#LyF`PMrd}+$Z#O zVwsVFfdN$3>Vf^$T8|ry69PaX_5Xj9iW5_2gBoAMElw~W7%m6qvt_U*lre$%hcwtT z=Bi2p!GyPvIM{M_AtQqU&jAIO|MeE4Uq3%)WXlSTe;lrB0WkpV%CE2051*fJ|MFEs z{C3&H$gU)pbHwkRBC4=GzVJVQ~LF!u=t}t$JYHDPh z#5dvR6o!(`|Nj3!|3Uf{NE#%+obic^hc`np&lx+22*i+&kJ*`xjg8~NgAWI#e0Y4E zAIZf@iK(fkKR-M?{9e_2`o^H6W=f3K(zo-&!oooD2Q)M(B`Ha0!SbUoAYAmc%gkVY VM6{OgU1B9j-qY33Wt~$(69BWZMlk>Y literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/gear_wheel_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/gear_wheel_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb243ee5ae4c1a633859d4fab89e14c18612a70 GIT binary patch literal 1008 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVBYTO;uumfCn@CsN$qZEd|G&v;LtY0(2Ih-w_Ob;{jqe#3tCU`R=(C|_+iCB- zJsGHzTXYjmei8Dul|4C{zZ$F4mY#&OWe45v%L22ud8QI zo$6`?f`>OYCiC36bH}~z-=ECI3lSG zmo?6qL98^?SH*MNT$YC1JF>YyZxxm2Fe`9w)Ai&BsZKeuk(a@NhiRj~1v?I{{HL~~f63}ollJU>m*;+jwcwv@!{nLeX?u20 zd$P*N6Qa}R{6S6z10Lp$+$H~0dDU7Zer0WK?8{XN3{_F&H2$3JUp_sTp-kNK#xo|6 zk68|Gu;;&qG3MJ6?zh8WD#)J?k@tXtfa}5QcmD|61vE0B3k`@D zypqCrSq>@+ zG8po>9%S!hFI8Kk!<7AC&Yao#N=!ik?5aEOvO8RQ{q9b+H$_8HU5(RCcPaeZLnR07;FmTU%R?x~QowYwhXj*^`r#BUV#W)Bo-L z{q?6095}FG)v8}JdV9|vx^d&jvHkV`_xuNf#)%UrJ_geEz?2J&0A_}y^9MHzJ-&Y$ P$YtbP0l+XkK5&h6+ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/gear_wheel_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/gear_wheel_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..8a018f5900111f386f27c7da87778db9a741dafb GIT binary patch literal 1676 zcmXX`3sh5A7QG=69+Ch7!BAKw!Dw5wHOM$X1x+9jL5i$EiVLlw1VTrtd^Hv+B!D6a zGa<@AMnFI*ANh!a24gf36rqn_6oEoQXdR**0Tua)`sO9}taa~QZ>_V>+3)UicV1`+ zi?IHa^#A}u;9e#hJxPWInWDQ+;IjgNX;>hW5q`2PI)-dhwo5SgYP5wLOF~1|(Q%37 z;LvMx*$PcYka(D42PgnLq}VE|y6K> zw<$1{v*J`qi@w;p*D; zn06;^@y~LZY~`1@!3zJxq@<+u)z_yP0Renbb#=7M^`B5CXtD5uR&(Hn?|uMxFPVJ$ zdmr{z#OEU_R-Ns$;iY=l6B|JwjF;@~Vo7Q-FTT=}U#odHd4q78dp1jVG=4+QMVEuI6$R%B%_-Tcnc`^54=LZ>eY*>U zFMh%+OBvWd@00(~aY@_uB$V?c5_sw#dW8jbMq1Dz3@^B`eYbY)(%JN|pk-&nzj_Z< z*_|c>`YnZNSK6VjYJ_`qf7gP2?F6XViqHe0U{CJITS6*E1job_@amt8qx_0y=L$xd-eviZbU!`Bi&Sl(Y zsa-nUZHbtPQU^d6+{;|usdpL+U{*HJllMiUdZA3y`#a5*WITQNUmKD{lbb(_OE#;0 z9@7zP>%aGz>CYB-dNgtKih9>m2|Lc8r88+a*4@bzNxvjcm#Gvb?DahSk*0o)9-S*x z9M}z`q~lHKbt35DA;e^dq9CI4-={^c&&*}D4b9ZC02^`lT(z9?yj;3aG6)yFIpJ|) zBee*3lVZ*}zUQM>=mV;m$hX^iqN~r&-{0R9gTb6Z5XAl6`?Zqku~r`5+uK`EP*_-7 zS68-`AHfl1inbqM{;HY%Bco{8U^N8Yf@wU_+Gj#`aq&a~IiZh_QamNEJZ|Ae_4&?s2+e2W8d&7?$}V!X(#+_ zE{wCBkYOZp=sY^Zbf`PT#UfO-{vJXa$K=_M>DWI0_SZJ=%gD&`vvJ3AG=Jlp3Z^`m zIHCxi4A&4Obq!dZ0!DolLAs#o*@;^%lkG<%N`*q8LN7FPd}1QOGvl4CwzQPga{Knz z24hn7U-WP|tVmlNSF4lPIV literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/gear_wheel_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/gear_wheel_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..71ff0174b793a92aefcf1c96b6f7028f97533d3c GIT binary patch literal 2256 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 tZ8SP@>O{`;DO2X0K6zo)C8%Q~loCIGZ>x>EoE literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/globe_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/globe_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba24d273a8b155fa88746e909057797202cec2f GIT binary patch literal 1590 zcmXw32~g5m7)OOf0xhq=##E%tbklSgI!rJ!K>73biS3(t??3-}@AnTdG3cQmqobWt?_tdr+QayCu8ru(^h=$!of`rS zS`{}(qaL9LnPzor0546VeBCgpy4hC%G|CN>M|tzEBf<}jwB2bvGX4Q@)WgZdQ<;(x z5f=btcFA$%t^5-3iv80FCSKfIkQQiRb`^2NpwdKF3yk3NxKFH9Xi%s}M1TuS2+*lV z0Q6)814>UY(pI=oXJdwxlp8uvR=0@?XPpH~nX?!Vw5on!_5%Y2NunYIq71+_n1kr2 zKUN1>!DU9Kq_ElS+?k0N_^f4Fw&CI7C5Jo2sAy)5qMuL4TUuJ;BT7mp;v0Xy+yQxl zkU2JIw5qfEOVmT5^*8FVE|qe2O%NU?R2{x`Yq8SQI%|S4I$F=a&C^Zpc3I+OZ5xvnq=E~gh8XcZe{1^x5J7@2!Dv}GU?QA zb#sRlCPXqJvya`$c6y8p#pQT14673R!XWiunK zMn0UlfmK|=t92*)YX!&w^`x7oZckDEAqILVv59u|_89CcSU-D5`w;!iw2xyvV$hZ= zp9_+*rR=|~%977PwQMefatkZ~Cf6*pOqMQPD*ZcNK&roSny3uHGkZPdN*AyT#PLnA_0GndqnWs#nQzw-PlG=<^s zj1}t|Wk&7{ah1hu>$(cuYD-}e=j`z8`o}fT6ZhWnAmh%nzHnphDLo;9S8v0D^e^P_ z$#>~yGa&<431J?1)Zld{!L!L~_vx#Pe>eVS$8^O#d(W|C@3_>wN$tuid_z;s7UV~I zFaJ8sK$9c-YPaE13mT@&6Aq%FKmmvw6cUcPFA5uUI~k1I$ae6~c64~&xwxrq5@&Dk zG7+;&*-8jweOftwd%Ekjjfa2N72TOyME2@3O~s**JBUng;n20v(=Dp)4E(${;+_f@ zLyKr}sln3yXu$hp>VC$a2K-K5%sQT;Y{4mfCi^;aT$C8RKQ!J4d|5jn`XO`QN$RohRvH-|qh5!d>YQwWwP!8w zltq2UMT@8iENjG0-qJgrS4U$q&Yej5@TTtLlWTihb=T`zPgn1&%87o23h^^XX@$z; V6C;I%+Jo>H#f*$)G)AyX{sZ2>8TJ4G literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/globe_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/globe_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..06b7562789edff3c2da193be2779685e4b5efbed GIT binary patch literal 2124 zcmYk73sh3s8plBtP>+_^OfUsR9kWbPrt+1VkBTxY)9hgdXs@NEh4=bGP{`Nh^dQT; zIhS%Y%gnN}vGM_uXo*o-hG{BUk&XjcmMG%6N0@cj-D~ahTIc)k{r&d$-@9mQa?XJAP52yi6qEJ)`w3?Nf{WH%LknZ1k#0_WVk+*_$4QZJy+P8p?xsY zefbZoh=>S#CbJ2!AGZhM;>rQ{+FAerLGrA2>WsX9N(BV5W)spurGrSizm-*3R8&{8 z(AM)1jh0a)Wg2GFc51LCD>miRScB>h)qoD1=&1(T;GFIZFsIWNaG)nGDCGx%(73Z; z@2!4t3*T3(`*brlTr>W+0@i2&e$6}W#E7fw5jP6b(b2ISISYdLymgBqC4}g=$7xt& z6JyK6hp+q7dlu+3X&cMQno{C5)8DF_n>YaoR}?C60kr|M4r0KULwEpaHZ&@o9zefx zJNZ-{ULQpdu}xR2<%1A0*>bn#R`<(up?2<^)#;b*SPTXulkLR5eiMylfip)L6R)bc zUuF#8LXHbAuTC}}Yz2oauMngH@w1IDPSD}j*4ErdkL*NUrMJg%ftk@9ca(k{j{h)} z^M^D1fFq?BFVcqzZHh0jHOpSW$z(E@S79Wo+ElumrJHfFwEkZ}dsnH$cv6x*v8~N{ z&*^R}*{l4*LNt_^tM=E+tF_b*23jFL!_%kG6pAU&Jyfi*H{LGl?Cd10aOzI^Ypj8K z$old1v)3rbL{$L}KmN*=)Jdhyvl4&|8hg#X#Mjv17oDS?@fkJKw5^Db!q|r?L zekunRgm7|lisZh4XV$EL%Pj_VT2vYgfk1GtU&n}gs<-T&$7Kjh>Z!NL2?mUXHa4)$ zgqh?qhs&KmD11j$q$hUo9aIi`?#D+zzqLK0mQ5kA&K&y53LYGDe8201akvZ;06~t= zaL=I(4-b!$#x{i$^D2TNPz|+W=Vqr7D~eep=JeM*`P)VpiJbt?ESNsOUOTkdcY{s|F92|{Bi%pfEfp`*W3s9b8*aGH)T6V9F;u2vCP|= z>_kkN>hV{E{<%qQGC%W^=Y(cCB%nR&nur2|d;0xw`%=@tmBbVJa5PDV18)b5ti7eK zs&vV=jkdAMb@sMSt8Q4Q@{cb!O+o0bJfFw#=MR~aa?$#g$BrFqtRlUwDE%gLFQ}(Y z%qgV!e8_h~2lZe5tMmCmY;VXG{I!r%<Vs=6{9t0=-j=jI%qhE=7{#RYW(|o<pUs6|-y)LXXLQ*;v z&E_)4qLG4TzU?qn&>)z=6PnJ~1WNUrnbGL3TC(cNdGi+HFE*0#J4imIgeWYHynZRSjv%fxHg9JBC&?s*v(A+a~9^ zKqVsL+I{{rd8kF`@I(MLu~;k+3WWlZNTi;fHb)*^@z)ztmchRX7q41CaEycCUJ}fA zmV>Xkk08pOUFm(E(~x^j35|XW((~7+a z#7m5}ByPg>!0)DkdQbru>n#KXz!+~zi^U;j9#Pkv5obLdqCL)5MgKsuW6J}P3tzs? zdfbtIXG-krdN_LJ#?Sc!#bvZxCZ0DgKl9}l3M31y2riPeiU*k&qCU8RdfB$6U#7kb&&%yCkx^4wos`D4jiDy z$HzmPK8;GF(HdDgB)78iBYgXI>k_e>UOVXxWL3hV@RzXxA)z5x^W7>}{;UL+%X~O~ zaCbF({rJ*i>vHAbP}Qfn=e_S1kC^eczJc??(6rQ$m~Dx9Q#hg#k0ciCHdokZsv4E3 zt^fzODqUi;UOcte(Gqfl$qRnckykTgyAGC(3`pXA5a-tjY7)0y8MfTgG;~qb%pbAa zbIUyXyUkqTj+jC;(MWl^JbSS%r z4%~ Ix)3VozZ3lThX4Qo literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/hard_disk_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/hard_disk_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..2de61e731adadf5c31246e5841df2c59731226b6 GIT binary patch literal 602 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 Aga7~l literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/heart_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/heart_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..ce360ed14151b7cd1e9a94f317c9c78d59baaac8 GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU{>{XaSW-Lla#OkB*pOme^N?9 zLc)(fPrZM9ey(4&ul~Q@;R8T$=FA^wmxzkimX-=7W@hHY?fvqb=i67u{rr4gKXZng zpx{Jaqf0@J5HlDY8TS2W{Pyje^R3%=_K1p#FbD|>GB7eSGJN~?o#DmHmkiw8T>E&q zxeq*l@v=!=Oq79#hZiW%!0_|uPlm@&o-zmv2`zv)XHWI}dzoQkVZxD-k|N9h{`}nj z@YvaC9-p2bo>N+N`HQTFVC#3tbC2(&@w@`e}8`;|M32QJt%;HVNr5wBQJvi z&tZdw|K)Q`8m8`aX3w+9-D!NEV}aeRNi3$^-~fC0{IT`tPfxvtA};dmV987l7yxUys!QAg!6Dazq~}7n6@@ro`ajSc*Uw!27i8i?SA*g9iG3x ze*VvjYHwo$0|SVSHWwBO9x&iwy-+XMBf3a=m$ls4R>p?zMXPF+_b@WJJn8;vxOw%e z`XCntmzn@xu|NfZ?Y;TicOG``H?p?cn+}&CH{rOz$atR4ZNy)muzm9(R z{M?^SO--%s_V)J%dn$guTE2bybbEdM_pUSSAXXppU|1iwzbt-p)mdO-5-dwiRb>N$ zHg*4bMmBYSexyf4tk^$e#tpxeuTTxMn&S4=ytJ!7*yLNYrzU4kObpNY`L@4B<>kdy zbanTN#_EEDqp7lS=ER8;XV07&IjgnR)j2He+v3iRg?F0S`R~oQD}A+n-n_WpMT;J> uhlPbXr=_K-0-dSo=H|u+wA~G26*EJ@XS@3{4-PH`@jYGrT-G@yGywo#fQOy{ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/heart_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/heart_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..884a73f720e93627ef6cce690c68313bcd5b3d56 GIT binary patch literal 1291 zcmYLJ4@?tx6fRUNe~#8grw3CO#0`iWv}L21(R3o9#Zfk83AzC-6h(-FFej{~3MGY( z2{PFlfeBM|vLQ@~ilVHqYkX2oM&!7-^OZ^4T3o1?{eUjag*`M}#C#|e zD%Ih%)mI3GbK<_f^lBW#l|}&O>Ah)qI3VFe_|lU?7DRPSX8Z`B&r7)R295q#l{J|l ztkQIrrh0uonQ{5)M8Vy}``?6*w{6$+zU=MUUtROXs_hv59nCa0-_Lv=`(8%~iG`S>I=nN%``!YQ>bPIg12H|Zy5k$JsJsVtw> zS$C#T$B#nZ-rng#qg4_G0k-TblB^(uW!g}9L``6`+EnvT6-Y<@Rhb{Z7U;sX7GIT zM&j!7V((TGjdmaa0yZ-<1I;A-oXg>G*jz5xGb+XIx6^a^4Fp`oFo&3(|R+}zy0aywDkTWDa!PCer(e)p7DN^ZN4mqcY{@~!iC z;gpmBLU3@fC`&E?veL(NI$hxPxH5(1#X?W(zh}E-@$vBwImI5h@%JtP9LOIHH>*KT zb^*IhJ2W;nX0e)52Sp`CMdY}PSS6x&@}N2*akHPF-?j#$=UBzB>y<+lLQq+r|4Y~H zk)cPAMlEwHQs=N@bad3R@H9-Mk#v)%bh-z5d3PpnG;dy?uOi5+r*O2jB8mO+W?%fk7nqW~hnN0S8Rvh2aAN#>G^{9Fm zowpLFtlb#}Pfbn180OSifbxWxm>AIovmv^L&Z`^N>t(M?kpC4@Ea2hT^7)T!GO0Z| zE$vgdeeYX=Fi;237%6gLbixH%Zw#F-&F8OqsP4&I2W-?xdScE@PiR#t?TAXNDl)C? zCKMKSXZris783{}IlAP%PB8wrOV_|u8-UdUzY6{?Th#L>fyl?@0wMO~=AmYTl&31l z$&pecB2Mp^urL5``x01xGjNv$xZM3f{LW5V@3?0Kzuk=m>@gn4pIUoi7Iz1^V`d^N Jp(~zU`5$m?fR_LO literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/heart_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/heart_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..eec592d51251728de70dc24efa3a311ee287171a GIT binary patch literal 1772 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 A&Hw-a literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/help_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/help_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..52ff589b0cccf31d76b5db152c375b4b7c81b210 GIT binary patch literal 3067 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 JD~wmt{{a4>%^3gy literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/house_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/house_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..ab1478683b864ec4c2b0d83c56eca054876b0253 GIT binary patch literal 978 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/house_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/house_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..64ca1d2208245bc2658da2f625b50a82eb65a352 GIT binary patch literal 2223 zcmX|C2{c>z8qY#(Nvk^3CR#)$#!FEV-5hIdLr;sL)#>XZLaCynOl@sQLdv74DoH7i zX+x}|My#d-|zQ*MPVU7U`#Dd zVK5jbILJR7dgAq$F$%h;WoOU9V8&;I{iz2sYw0vB4SER!LBf`ZQ#pSQwSPvE+`yCy?xyk@mi?irwf zsnviV-?f0s_OyBM-lVHi+TC^Olkuvj${y+l7}*#}wtGWvV-&*e@eS*V>6T&TgNz}5 z=hu>;ZFegV6PoHSWjW?W3?ucy(QP9eN^ad^rY0=HckkW|r^4afwDBHS52mJs1uYc_ zg6P0NF8cK8?TB1Z>;AG=F$sK_87X#3wi+KD9mUY%JkBiuzWWar*xq@x8V8{pPN7gV z0ReVK9)rgW^9>AfJ$0U)05B7S@;mQ|f);mnv$M-G2-b`G`wK-9#laz^QedRXequ!= z645)}98`@hFE94O6iI6)CtwK)IPEgK5m{$FjS&0#qHoG;Ph}()6{+LDfyDGthNKb<#=BdqhNh|P2T-1#k{2d=axQR3CVz7+tiIvdlJ~q zcb*>dQgW18ZBy>erg>?lW2(Z`I8%5G<f=U%n=Ali*-&WnUkXN`)gT zEQZmYrB?9|nIqqGSnbw>XY_P=kfNlJDK0L?CMFaB0LTC%4dUorIh9J))08C=i)&Th zl3cFeg;Me|IA1U7?ye9?d#|Ym-Z>k^$?Hae;lhhOmp+O$zmKKh9C%fm24=;Y?N)NTT z@GQ4b_PD!8|FqrFQ3j}$-rRccT*|rSg(6kwyjou`UTN#SSjYse|89o21X3X`Dd`r@ z*N<(e(`j>PB6ij~=cuO-_1+)~>zx^6FiLalP22F_efK+K0@%QnR=1FOHGDGUDCVag zp-_l-aF7BEGcnw1=i@>vqJu+m!@99T$hPaJ_jk)wN=WKwf7^vtMK>U#1WX0_#ApA2 zRX*guYBS06F*kh0+Nrh5Y~5dY=HKEgx4%DS6i-dOUc_qQL|ejw>%yhX+P-X;IjbAz zq&9KfCjvS6p|&XRgrd-REWy75Ik*yRZLbKEhc^!pRbMm=yLfbW`0hZ9B%_lh8Vm%CJsjQY~O+e+D3yLh zKq8gM>%DPU9IlDJs0WP4<6-;V`f*iGNB#n)K0d&JI&cYsLAaWexHWpV>NYr)l#JDB zmpU1a>w*nOoB~8M^L58k+9j7wj;Rf&5pY)fZ_tTUk~V|Y9hh8swS2@Z2r&@ECQ)BAy|xdh2Q@yaS8c3lz1XZ-3s;;jR7Wum zfjVsss~D2pW#mp%sE$JoL_52J-ZNNz14KfdP2%kM<67}75CVP2!jzdplL-|PvJMru zX%i|C6;!U%T@3Sc%=>SrWB=OOefa_=-5+jdW+qW9jfC!U|ep)jS_&g!qqWRa)oLt^g$!OJ<|n7ZF_Ot@p`qzMDlqS znW8f-PZ}uCZ`QQy@`x4jGsHhU2O&yxV&$^t*_F!DS^t#vbaW7Zm&qJOV%c1}Li6P{ z*|56hs3>9LhP1lqEKEOR3R{7Q$jC@ZE~tB^S(;a0hFA=)=D@xpm6eo~$e{L}Su=US k0HQJomO=B`c_n%z>?AE7@t9%#m;QKgK#2dZzBKm#0fU__rvLx| literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/info_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/info_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..35e8ec4017f46dac1b679b8e3e17f30fddaea709 GIT binary patch literal 829 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU}o`jaSW-Lla#OkB*pOmf0B!M z#rJoyZ-0N6U$n30?KYqW#p8D^N5A6^CFYn^|lo%5eQ=Rw=Vuj7=g`y0KJT3vZ@{E4V2}8m*eJ-Lz`?N5KKtm)8~fSA7~WWPn?ycas5JYX znz4Im?|;U1GH09_XG zYHpB-%$>Q@;}!!y*s*6e@-ip_wTR|D%b2WomwghmaP6Pq18Z!H}E%Yj--|0d|lcmV<_j4GJQz7k`U+D&z=y?@n~#VD$X*&*1*gxl3g1_d&xsFzeipac*Z;5c^Yh}GJY~uq#>+r$pzugZNqLe0#A!fm zU;Aszp;m73qV@N8B>sPOHQRB9Qla6-?^;@?+}EsKYyIWRmwEqwe}8Yw%zU{2KM+7- ah?(I#%iQzf*R=9MVeIMZ=d#Wzp$PyXJ$AwX literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/info_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/info_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca0421be5f7b18658144fb7079bbb61cb83c0ce GIT binary patch literal 1293 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 K&t;ucLK6TEVpg>P literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/iphone_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/iphone_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdb1205a72478d20f04525216572734c451bb3f GIT binary patch literal 945 zcmXw%e@xS89L9^&L0l)y1OYLO?BZe;R1gq6F%4u+ITK>cnDJK_rLZ%(Oi>J*XI9yg zIms0DJQZEQXaZ`COeHb*$I;Q@V9UrPm~iIqY?(+zAe$$b)zS5}h0)~gH+{dK_v!OK z?|b=R%|7YcjcXwYl2-3mAL47aFw(^Qn{M61K#<5(t*+FXTqx#QHDFnsj!%6Vf7gxR zw}zD+u*qze2S$GCJ#)5s-lt6G7Xd()u(O9JiVY!T;o({ta5I>K`9 zbyMCFh*oBqqV(7=nT?x!j=eG#yLPvB-M2ZNaE`XNwllB7RC2Gatup0AlCH`!#kfB! z%F435oi7bJTmqyHlZvX-&H~Hy+!3+SxXpfwB2Z}!FD}@K4iW^;V~ZhA6d>))?BTxV zc$gvpObu9uRjEr<%a!L+s4&fY=J+3XyX=`t<EE_-VQ02H}jyx76+ zlc+H0Iv9?|B6W7EydY^0et_WF9Q(~11ppW8bUK&)hXN*j!X`}u8`U_+)-$p6ut=lP zxHh=m?m~7k)-f6CM#^nz%bOIS{P4xj&Ya#g!C(*uT*AP7O>NCcS?LpiZDP{@PmxIM z>&x{RhA|)__eKz+Su9&-76wl_!Z-kvrJKZD;?nA|2t_;(h?bipe%?hBlgJH=P!E5Y z_pg%1q_&%mMG%<4LEBW5!o%0e^KPLfggNt&9WZ;&CQEnrkoa4Y8p>phc_G z{pfhMZpni6aRZ8BQ+gB)8&Gupzx^kF`#3Xh2y|DNRUMfR0bMQP-z=c3N)Av1&MMr z<+3PfIi@1&P-xLiONdl!EY)gVvNJz53y9w;f`*-%e@4f$f-+TL2 zYDyy2>7Ww?LDVFE{7L-nLzp8OKR>;A@i_$9-%N@>o>AT@C>VoB#imEQ4>#xkzQ#kp z{-e)@rCD41JkbA@@9s}e{L1Wz!jk|{oHZ_5ocTWAAcLbT4bbIJ`Xfc#-f(z$xN_&bdgx7m8wUmnV3vFX06ZlCVAJrx z@qyT~OHC=ozX}c5DkU=#2NG;oC34#2W`yRypBE$6REP9Bb?z@Ed$Dzi90lWX zf%St`7LzO6Y}%1&b!s$w&CZ%%sT!w3Y(x?BcI8blY=LsR8UqH;G1w`A3GR>MZijMP zSL{u%3UM$1pEYr)5QJ1m=ykW3JzG1fYwr1Uznqmi+n3`~hSTAp#^L2rIJe8^=lN+eEQ8spIEGud@ z+^74PD_^ng1;w~?<9;tHIU8nc^%@zAEg?BOJ1cqK(PNbC?CdTVLp>MgWL1Lcz^1S{ z91feyZFvguJxf80`Jl3dzj9e)4O5*R5q2c;NA8bfq>xGOV6pQK6uo%&aWRRDpr-=4C zRjfjMzXC(zH!$8tUTA6UJW${M2LZL92&*y7`>$E#MIf9Dw%k~&OBgAi~GZ@%v5-bq(2*aXFlN%Z$ zdiUa|85|B*djf8DZ$`X3I}zR}T3C*)M4qFtxg0j<%#FF+pt{{BqdygWQwXt=3rsZ3<1Gcp}B zY^GO``8`KoG+%9N6Q3zAUh<^V%h%L$REOdJGGS`sz_$a)ZNkBjcBtFyH#fgfqLZYA Ll=y+zyi5NBgS<%M literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/left_arrow_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/left_arrow_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..2263c0bae7a381d66d912fefe22bfb2d912acc01 GIT binary patch literal 622 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU^4Y|aSW-Lla#OkB*pOm|Dmpb ze|{?0z5X_LcKG_(|9&32VBw@g%YMGQTb+I*BJ%3LzyFUro&YHas&_JcaDKl1qwVkS z*d9K4Qd3!5`|yDe|Lq;GGePvZT&wwf?X7W4%p9XnMMXS4Jv}_r_2UzNeEn_icXrO4 zIsOo1l3FtN6+V6@>F38M$;!&grl!_$xbE+-qX&TCgZxp|9v&W^|B@h)g2%^vK^_3w zo%HkX^Zp-OUtd38P_Q5?EddCUlMiS9-v9r<&VgocQqmzWpMeA75XaAAYVM zF99|2&)3(}fBa)+Keuti2CvK&s}2AB{@(xa{r&x5{{j7I!TaO$bN<6CFQ>z_qyQcF zIV9GnUt_siR>Ow)-hYV7QcjERly zefZ1OE_YWODd-mh+@A-T|x)8}j z*$21h-=FjT-tOJ55gr}RAt6&9{{R1f$*l8G`AmrXoxLFW8O}~la~c~T+DD2(rLzuR z2Wrp1yKl2=M8pi|pdco_fA8+t8%+u!F13X49SFlkatcm4l=%@1E~ z%~p{-cjn9=W}rd;|2u7b@cR1tbLM&XZYk-h9aGfRZC&)^{{DI%`}%)L2?+`^KK~^p zBd#xV zuW#?@?kqfU!b3QpL(%%*-(;u>ASFAh-rf>3EPN$(?!bWqAKw43hZzr)Y*4W`nxtU& z;s5{ow*UYCK|?$#5vc9LwQHYt7Cd}3?SB2gf)l4tPMmu0BJcmt&-o9pzrP>k0+0(q z3LiXuc=Pwm%j)xkm;2@a{P~!@ea{}7!$8jk>LjHc@wixV@cevx$$j(#+9pediK}J{`~(xA85^dp8NHG5)_UWumJ&7b>ytBj*d5nUjXZ+`f-!4{&8A=h0JG;Bz_jGW4 rumADkpuU@1Tl|tJh#V~O!)RuP9a}}e+$~h91<8B5`njxgN@xNA(zCJJ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/left_arrow_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/left_arrow_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fc826d3ded70aa4086ed056085780bb15f581de7 GIT binary patch literal 1031 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 F`X5xBOw<4X literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lens_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lens_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..2390d5909b52b2a96216a39488217df052939937 GIT binary patch literal 2456 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/line_graph_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/line_graph_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..76158bd063fa95879d3af4943e8cae867d2f1505 GIT binary patch literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVEpIl;uumfCn;e8NQ&YA|D-*& z&(A%6f4~03gjEw~&ivWFZJL@oL}o|H&r|h92bP`=|7UDqU;tJB>-&58NWb=%%wR=} zZh(YA=KT8pUEfpc|NsB|h77Ctp<>=G-2eXnKmXzD>+rVa{_~CQ>?-YU1Omoo5EV`z z51pTHFB!M5=48XWwet3L1~&Eo<}@}pH#@qzvL5Azn%!tv_wUcig7^1q+04w$*!cMP z*zD}=*xcOQ+V;C*`d}I&uqNk@Po0ynbTmAok2j}t^AKboPKpYwvKfm!NHSE}7aqxvp-?jVzeW>um zXAkQPGe3!NE-H0qWVin9&jth#xkVC;V2hX;xVSiLk4yU<1BrXO`njxgN@xNAt|{@+ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/line_graph_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/line_graph_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..534a2ebae13b0d964eafc9936dd757e7fe2eb808 GIT binary patch literal 800 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V0!N9;uumfCn;fpAyAOv|Nljn zOjzlpl!SzY9ktKTJ$`?`{zSm(fV8w{^0%U9&EWw8h}NV;ppqZ|{oePWCVfZE zQ!Vx$Ua)aVNg%oZ|Lw2xxSR7M34MPrAFAtM1`%4ciq&Ac@@#g9{K6wm|Ns9tuKE3~ z_u=7oexCXE^=UsoK4x!jY-H@JM7GnvjTNXez2g5r+r!8E@@{{`fgXV=0=e}c^P7bmHk*HsTh(>u$e9_%m!cMb@7pab z*kc%xy>L~?)%P(j7W2OX9sU2m&Do8-E`}T~2bZ7ryi*^|cbAP@`)16y<&8fXS9Hxh zXjYxC)Ksm1*SCE0wL@mlWt5t}%T3zgo2Jxx=7^bb^QwIhfWZnhrC*Vc!H|Q+{Xz>% z@Xi1AUG)kM4Hku&Z_jl^?%b}-RQ`O|NrMVHa9mvWS^8>@KI7y@?p)4#|aRxLlOcf z?;>EN92PY;GBPp%VMD`%qQZ~+KcKNn5nT1`uzh=#vTlN3`?1ZMC jX)`T=&IPJQPsGd&ZclAwv>I00f~@s)^>bP0l+XkK-6U!2 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/line_graph_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/line_graph_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..495a38094e5df7f458605c82d839f5b1d3602d97 GIT binary patch literal 1028 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFrW5xaSW-LlawHl02E~S|6i(r z1uvb{VwiV-=jR{4zsnna*)V11%%APsrm3kj0|8iHQX^;G|9{SI;qJ5Lz8S~tE1JrD z3}oN`|4ECwdnb|#8LlslR=2z_{YS-lPDI^z$Y zKO5Ured%cI?Cb<-dw6|)Jdb_dpM-#b0Ea>y9;matIBNd?oBQzWY;zthEiE1pICSU` z&wTs(w2H5vO}I&vK_;5d+Uu-X0K|NZ{=A9U>&J(ZyE;n8z?p6a81NI&?Si z>iu5h=8g^5taKWHzWDz?<(wiPgCdX1MSiBpW`&o3^IIP?`3iKHwS*>I^Q%*P&v<8U zF`uBLSLa^yz2z<}#>qX6t1d-Vw-@_ei@Flk*&+X~>HWOoWmB4V?|%l2(*OTM`W5+H z6$OsWV&L1#w(+~Yu$1E=Q8%B8zCZc1yS}k{RBg(AHYY`GZ+VWe;GE)!Y{O#;N;j$} z&-7R{rK$d0gMHcirPsW&c|Fhn1P4LN#ErZ_@3HtNamQ5tFHPY6rH~kObkkJ*{W~xJ z-*{lNenEN2*G-~=$0SnJ1RG}>K4)35s_w&j`_0!D?KbCrzzT9w&IChX5b+$@Qu*Q8 z!TKhy1nY)*-8WIaG z2Z2#(V`IY;6cof$|NoyWr&@}cYLbtS4-YWr(|>e6(SXG6ArI!Bo*s=^7k*CZ*tlVX zgG_@8BryY1u=$nH{q_IT5|WdfwGT|&dqVX0-{0n4v7iJ1(d@+82sGR9#L1I}7li)& z{XPBR<>lu=(mp`^AEG8HF(Dx#F)dB(@89R&Z|~Ywl{o7bAM2W&oc)oJkz4=&`B^Lt kcJiY3+6qV#!j(ap8QA33FVdQ&MBb@05a*tApigX literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lock_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lock_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..15a6e8a71b697cd356b5012895a4f837b7c8aa87 GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU{>{XaSW-Lla%7XEF&ZHM@&qN zm5q&!lZlCmiw6kg?P@9t9v*6CRri}Sh}|9{9qQd08y_qVsd|G&Gt z{Qv#E)&KwB{QUfX{+&Hv>tAk4{Vyye^lkBKcCg|k$7d1}5=Vaj{3$6RDQPHURnqbB zXty}e|9^ke1q4MCFI>Bp_~XmR#fMwD#UJU%?ARc%45HD=k&~12cl^GZpY>l~UHvaB zBlF7A!r})AGcz$g(~sQs<^Qs?(f{0CT-LZ>V}@Af^h`rT!=j+5(6HvmhepO{_vP*D zYVK@Ic0V}#`g+M7J9bE_sHpHv_zF}F^oWyTLt|s(!|UtgdHm*$UU{iqb<*FP4Xg~BJ`W!q57jA5XK>Gc{&&v~Yr#epm5tXH zO*wQ=+IaCbuQa3Q$6x$q`TS_OBAyL(B}Jr!2Oq#OtSl9OLQg=d#Wzp$PyV C?uiWm literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lock_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/lock_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..a6835602c033af8503b4a6d8704715eb8743b2ce GIT binary patch literal 1233 zcmX|A3rt&O6uzYb9ozzCkKTehK%m56p#uhHj8ej5sF^UHkyl$vm(5`dj6k5Y&_ZDh z<X8?0Yi*#16tA>tQxg9GEqX-R2qe4mX=IW!xM8#PT$pcUY0FKy{b z$@Wuc&x^ONl<#fK#9=U)#E!#@iCB6HYhedaEaNP-|JiVy2}N(ufHcWr{%B9-RDM}K=_i|wKvZ3$2nuvn}W zK6jG8pfl*X613{b*!D`4z>Gx=UQrR%cyf4`9vvNx>3I9UxDThs%e0W$WT;OwTf~+L z5srl(Ci9}s@GJ;tc*d2e zWkRaacr4XyEoOle6Om+-(HO|sva@B|7Kd}!Djt457|i4G)(>{I>LyT#mj0sZrb}Jw+Fdx4S(Kxf*_=(k zvbJdV7atGCY%QE2@XC@-V7w(pWB@XXYio=~zQmx{hRiQ4P(#DQsC?7O*?Mf!qHS(t zGIjbOr7-k2=DKA>>s?-Bl^bEI65R?CL@GL`01>4BQ=6}-ejzV1%I);&e2WC-hNHKX zd66zm21AbXv5Aigrd87%et!-@mhqFL#@m=aB|#O`q}IP4Yx9a3uEsR~&|r`JD8gB* zvyz}M$^<4Byua<58-^^4JghIGEcx{G!DbMleckTK2d8q=)$3a5LMUv$(hR5l3!DvyAjsNX8Ig-uy(&>qgz?oJaUfEKNA0l zNS$4QzIym4UT4K&u~ECuVzqHNoc7F-o27GI;oQQa@BY#Es?lLIap1!p^4Ih5jBbbg zU>-i+A&Ny4#^m51n7lWp`^Y*Zf(nlavm@@9FG@JH-f(VzCzF4_kHet-skze&-e3uzTa9d zXGbuef`=d|I43(}7w|N61qOg;>G9(;5ai#GlaZD$(}@IR0SH0}LXoao@uH0d8*n(B zL8Hl1pi8M#VsW@?Xy@C9^;BwficD&MaC-gvlA-q74m47m7`{?Re}uu~@pBjqhM;R~ zB+bmskS!JqdD-JKJKggV4c}17@GQ=L=Xmq@0{oj~SiJq)v8O81mV#BCvUjiP3^CRV zGYSO-1ub=Ub`k&-tkdb>$zj7m+5FomGx%M^D}&sI;swOV#|Om5#s(A=6lk{cyAmSV zl^*lZ@1;>SN4y(RTW=GMv_SuU+a~RkK_f4+zvIWID_5LtAxtHq^Ta^vbQeb{pxsc1{N@-z!UO4(FL?jY5JL;nu<;ZfQ!%`a>>b%B2^4g-lnx|*Bw6r9Y zyXQ`)rKg(|XHd353u-GP7)lMq8goY#kf+0#LuzAaw@oUBCGD(K=GRv`gzL|aO`Sbd zMkIb8ai))N$DmcGtha-KoS-%h!v9iC!?3yYtM3H}#0P$US;6D(rl*(5{n0%l2z^vB zY>>0cT~jBkwAyy&IG7EA?mo}ivu7Zc!?BKx9`*KPk{TPX+Mdam786qo zvVN$l4N6pyBO)SbMZ~i-WXb&y6=0ZWd|+$XB4`gzlDrg!*u%Gz!ot3)E1`Ou{2*w! zt781}^=6Z?x3?;Js0k{7L2bAdnH>)|&rc3VbXB+?I452tWfOmC>1jJ?i)IyzeLKv? z8sx~o0uep_K7t_BI^nEe>v?tNd%%?-Y;6gV(KF2ZKWa z$HmERgtZ(-ge3IH1IqeclhmUpd+e_15%^(URH4j0_mTNhlBDLt80kqL62-4ALqo{U z&1DAS@yr!g^?H5Ft|@k1h%dzfnd~0dG>qC+P9y#LQ+IVtp!XyF1!f~Qa)U2ZYDDBn zUd&K)A{-4bvBg~-X|WZX;_ GDE|k}skg`g literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/magic_wand_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/magic_wand_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..238c0f31c7b28b0ac183917e03cbed545c428a02 GIT binary patch literal 707 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVCwR8aSW-Lla!#q^ylYi_dl<; zzP_J-ci(4;SU#Yl|NoPejx~tu$DK<^Pk#L4_xtr{Zg0=ep7<0f2a-IJ{`%?ZaJfH! zzxOxK?Cf-O4sL$XJ%$T%%7|4TMSiyF!wvm#lnz-%j`R^t``U|KmWxvon!x zrLWBl_SF2G)HrqO)Q4YRU+1ykSO5RO(W9lDU^gAgJh0Sz`uh4mKRjPtI@-;1>Cz>h zKYwa??#{i-bAMlL@{jNT?GG>apU+zM_FkqYcqb{tr+Xwjh$@Bi1gx%bN% z-q~H=|M2tk^FV!dsR=1b2|G$YPJ-GZ#TFD4^h;bX?$^)1zsug7th!^{2uU^d#3_)hFBa;p-i*$2~dhqu4b{_q>JqZ=RpMBl` zV8Vp>#KeWHQBkul`_HjCsi2`!!oG|hqT$HWpU1ww=DDsH|F7Wfv(k2X`?{DTqG1q+ zBrS3=MwpGl>FVjZ=ddn~4G5rWEC2svKD@X3yTm;E>SG08KP~k)&%5{K*U!(-eUnU# z4Gat*>R1k56m&2UVK{iXX^Wz&hOc9mQ4d$kdG$$~t(O>{tvvNQmg{$=j^IW{CeaPw o>sI>KUg6sFirwUZJSZ(OGenA;XuR0U!2~kQ)78&qol`;+0BWI9u>b%7 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/magic_wand_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/magic_wand_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..235cf0c33dc8a24aa4f3c2dbcd65f99d1309f64f GIT binary patch literal 1131 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U@`J^aSW-Lla#Q4;m^;{?tflw zeSJUw?!M0w)1`ol82A!z|27fc5*J9 z+uGXNI2DK|PMrAghSfF%Y5dZ zyKwX7*$+=n3bz5>VqEk8-`s~lZ}RBJ?Mn#=3)4$XNJxO{ztyB4zt19mXH_Y;yuAJ4 z+1v9a#q{G&CFG`_OvuVQbm7X4GX;--@wUm^*BSiz`@6ldb>_^(%gfG+*ZujS2n|rH zN&Rxx|6*f&dYY$CpPu;f(NZ2iKRzBWuP&bLdG`}7%HCKUp4iMTX|>xL;k z|BIiW`<yk-`xMei2J{P_ww&RCGKH+>i^%H(Ad}r^~NdoNkKusPM%!JUia_E z$?w0;O1Ih9|2NuG`+eTSo4}ASPCJ+6;p3S$VbZjuitq1an_G7LsEv-E%`qbm8kiZ3 zX9_GWD;xRc?;Ed)**M8D)VJ5sC!{6u+?km?uBxibXU>?}+9zkdOy_|9fe)Xb`%kH0 z1$+NcHshv;Iyz@~8HB46U)-@m5|o?SV~4-EOTA0Iy-cXd*Ps++~XBGm$D z3^T;a4Gpu}K#3S4>$I`q78189+JXBpBAF#ETKbR&2q0>cl7Q)_qpRm8sv1zL`tj>4 z_u+Q__mXxsKO91lO-KRC3W$kaEH5gtI&kiw;(=qwjum|Svhw`)cXz)1`uO;GBrq$0 zV!2-ZIw(y56SvRVjl2yC3=9XCZ#k^kGkeF>Vv9LbeHL)?vV1a|apV4TW(SVMuEKlQ zQZ0+l#b~}=I_>lGR}!UP8F$^f5-qwSOL`k~-9v7WLCg%F&A0?bUY!jE8SLrm=d#Wz Gp$Py09V`6+ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/magic_wand_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/magic_wand_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e138573356d06a6b05e32d1cbc6b0fc5a581d8 GIT binary patch literal 1335 zcmY*X4N#JI7=Ib|k{`{erf8bRWzbp^A;nK@osG=K@?)oF14IXR^QM`*Nygx$NjC4a zvolC1n&)Qb-PChsttlo_G8|i*oouZ+rih9b3o$<5cdy_rd+z@K=br!n`S{)Q`&~T2 zpl|UD^#cH4OZw5YEW}5yoy{O}S5#H40Dupap7u@-|0@m~$3`9j81C?O*e%khk4mN# z(?gYT;_jQ?cTPtQTAm_`YiOyfo0;lmg_cbZ^{BdnyhVu)m%YMf*q;l-4yy^iTloxP z4GRp;wp7trc{j$B#Oa(Il}58xMK;?*^nKWBlFF{v)?T_DKc;W_V&nAOeW)se&#^~8Ab~7 z^7C*^#aWHn`Z#yHEZGYWH+1d=&H3Y_9vFt)&bF;Kt7!_(?qb03b3+~Fc&axm9_#1p z%Wy->&W2u=0-NJ}{%Ai4f|9P}kYC(e3HstDS_W3$=o7{*c3w^=l$`rdA(@+W2A zrweC50v!WJMI8Z|G#YpyJX~_)%VQD*C|TfkH0d?c=z!_r&x8j-)RmR}mJKy)=3!o)+k)+0Aq^!I*&+`no z7z359cPm3mPbuz25{Z0PMn*}^@G$d@H8wq4!YBFc`MPtZ>;1Mndx<2V#}NKuYXF%{ z4oDTc*fzU`pfpYOhD=OMaAh(a58tw0r9m}jWjWO9ZcKba{3b*JO0)49Ylo(%qy)$O zfv+;V?Eanw#l^)*sAYeVWGz?2=~M(bB6|GqD3Zo7JG+S{5d7SCMs*DQAT}0^$;3+R z6?3HGVje}{UR}N*mzPdC10!aSz)1`dh1pk6Va0tkv47@O>n!&x)_@cQ%I!EetvQ~b-Nc& zBDSMIXw-&#>kVeL(Z0K~jx;^%>rC$%FZ zBi?Y-1e`3`5H0{!c^kq-pelbucp6AK@KR@o%YmT{p*V>h`PR!{aZ==)WG?!Zj9?W@ zAuP0+^(o2=ff4iEg#T$32dhR$@eW2k1EWib_tEKeIIWy!wXZ%&Dnyu#N2Ct3PJD#i zFnqrGbuV~MF`{{Haq%pN!`U`xG!EuuXD%b#^j9kB4Ihgj$5{+FW}AEGedxurX#&wx yEOH^vf3gW)>lm(uv4U#= literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/mail_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/mail_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3989617de6b85440f0643ddcfa2de362570fbb27 GIT binary patch literal 658 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV2bo~aSW-Lla#OkB*pOm{~`%S zFrBog;^n7uH#fIF`}%(q*36ta^Cvq*;^&u-%Iy;;Dl%JJTQe&wE605L|NsAv+|-nm zAOHSZAO87S+yY`$($CM|^$+*U+e_5_|9AGl*|WXj%08c`>&Hv{`}ghRA4WE$8)z=C1-NW-M@ZKxhjF7cO>P&szc5y@-aAY zFduv-^Z$R!MU7b|4?O(V%&pbEYirEE@vo`z3atq)E(gq_4l#iYw>bwi+!1K_*QKxa zJC{Cq!gHwROZb5Ub7p!AO;X^zU1A>k^~3#by((qXRnElNfvwOvvyqppaLV4%dV2 zIy0mr8vd56+-R?#?A_<9K6~-%_TAhLE*I{Gh%y*Er!Ct5`W?`$N6b)d5bJp5CMr(c z@qgWmrX%M*c+Ri1n&BUQ1{e%81qIg!hccw7O)4n=c5hB`MD{}MI01OOq zqt@^8B34pLOTF@1F5g_byOSfw*qFiNkQu|wpY!7qLJP}wLIV2|(2Wj2zp?6zz1<&h z(EE(tFR8RGW*{#~d!FC3d%yUqu9=Csd?1%4{rvIq@cO6PVH*U!w%uUR=YOvcGz27( v0tD#^2?>;8`!ScW`2gx%tZ1+_RU!gmX6~y;+^>bP0l+XkKAj=q% literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/mail_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/mail_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..b6dc2a09fe7bf2c393827c2bf46a4bb922e406c2 GIT binary patch literal 981 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V4maY;uumfCn;fpAyAOv|Nljn zOel2Ho}#a}%H7!5`t0lf2i+}5OM4~{QJM7f<74*rwp~)p;^N}W%F4>2Jpcaxw?Di+ z|Gq@tojpex!RD+v!^q2EAkbpqbZ&nH&mW&POsh_rX}x>r9k-EpDm%!=C1)5pfhw3c zCI`H_pT#O8{84bi@=McHa-40SduDW>0xOzw_#o#22c9Di8|A;>U%tM{)xtC-;gZmRhP<~;u(@EfA>}1eisy4@|~S|!&z34)|d$!c^MRV4l7+*_}_kpwMS4V zFDKjkZP%wwc(QPJV5kD8=k+i8lUOE|cjw-46FS4Qt%Vt+Eo9O`P6kH~=H@x}*&F_E zI$|X9sP0?KUv-~^PghyboGHG1-`nND-G!@m`?v&zp75C=>9J_{cJCr%aHxb_*eJ+g z$Z^EsW9Rz+ObfXt88<372bNR#b`FY%(G35E@oU)S`UO8F*KYOdrI`taSE zGm@*dc6+-pB%~exxA*%ApOCM9hQ>AE2uhg*3}^$M11&F;ayC8r&t2Q_R>gUGkVdV8 z(}HaK$WYfbqvuO@*FT?eQ@iv#zs!Rjl@p!+yWJP7=!<8)4 zj1vX_|NmdlCMPFXA)}xkERm3wmiFMmgM=R+9x~f>0CfNzob>an^rK(*_tzU26cri$ z`SVjadzL!efk{7hm%o>&`}5=Ahu7crL3snL_U~)+!{6WEmppRxsN}xd-)`F;o|xw0 z;bE|+{{Os(-`C&gfh&A&&aAJm&unaL%*@TreN^lK1CV?8{Cs;!sFE}1&i(uP__%-A ys+m1378W<^fiVxVBPAu}$&%KG1`uWFIggp)zMTl?CKZ_^ki4g>pUXO@geCynJGKk} literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/mail_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/mail_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..7b37eff98470f7e3550d606fdc7c8fbbbe2fcfeb GIT binary patch literal 1356 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVunK#+IEGZrNlK7N017hv|1VX* zf|X86Nk~Z8QS|jzxtkkXpMCwmOJ|eP(w@m%-HMt6(V3J8RPp2EWA^rK)6|&R+1X=t z{sVc3uV!DjlmG&Vsx9XX8G+6?ykXkU?YC#Mb8C2E`z<~o0L)M(#$jji!!LpH4ud(IdZWSjF?nkpL%pb5T zbk00@=7i5XzViR3>$P^x?no$~$Z~)kWNgo+jhqJpI2bMpU+VgupSe__&R6hKo6m=J zJGd9DvUn~T5L#HC_RQGHrS9NvZXo6U3wXyO0=Qzj|$F*tA>W|QLi|6hsC zm!b6Yb^bMxUXAaLy>kkE`0j+y8J;se<$pizTBYT}V(!wy1h%rtg>e?MgruZoMP;RA z-2S?=AO8QZXUogWTO`{kV-&xyCb8o8H{Irr4vss2fc`WxFg7;+(`E(ngj zM-M&z-F4}Ae7>#2QJ2%^$#qI*Ej0|kS&zwn} z-yjcia>*oM5E*hX_X>o%IG_Bt`XG}g~llaf;uMx_$tMS_s4mNBjaDj|;r9=Rf0kc==BzK~3|< z)cX<^lNapPKQJ#JNK`igxU`+e4Jf9D7b{uDjo}Et+zu@(q6s*i|v0xHRNAprxiT^MU-I|H>`%&-geLz1wv5>efZq zne#tthKKHw7F1L!D1SDGVa--x-1e+W>N$At_j6;09dbV)UYl}|(?OBPS-#1u`lZG@ z`&J8Y{?_~5>`$AyTb{H&2`k`mInr!z{BrN&Rr_}aajiNvXR;w1L$>ajH)mdFZM}BF z=g!=y*TP;dKi&!FfelQ#WXQ#!$m4SHzJ#Px*PZ`faUM`}j8|x-sCm?FW^i!%vC3S}TBSDWZtgqPn@!+|cGB#s|NHCchp(^0D-Jg6 z`YJF-NF4}w`1|MQy2Ty^OiCKtqcT9+-bPK zzs?XM(^SoPGxLPWrd|oXA4mrO7C*ed{=Y;;Wo2iP-I<2^|NjjC{Q3*CSWrZuVqeKi zBhN*p%8Z7F7oS7SIwX}98yow7@18vYN4DkOJ{Axb*0xX%>?|k2ijR+4f6p?_4y*g| zVWRx(gG@|+X@kkpKVw{(kiT|NnT1 ZdS(VI{=Qv?ANn4F_@1tQF6*2UngEGa<(2>d literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/monitor_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/monitor_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c0f85fa59918902474603fe6ac9943e99ffb7b GIT binary patch literal 691 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V5;(TaSW-Lla#Q)5Gcs-|NkOO zCNQ03Q~T`9WBvGjr!E{Skdu3-4v|j!`RVEEo=Jb;?Un;UuP@Y*vPEDv#azq zXJ$G?;!xJ_&(F`_4PO(n^VQ*Y{u&nFgoFeE0f8SPf`W2tnwmR>WBI_QANs(ktgL)| zj%9K9>60fvNlCmAHks4e+4=D0<>fWp;(AeM4;*NCr~olFDG_K&Qc6lna!Se*V1x>R z@UKr#KhJk==M#KfVId$c{{QTuLyJBEgQ5IC5PSpT`8+&4{~5uyF*7v#+DV~<6Ha2(sA<{`dKRsRDvuV;Jha2Y$zTc~rgbF7nBqTg|@F1b$ z?=RC>U2##-RG>ftO!CM7`Hd4NPHgP#>|Do}kdl&;02E;a%KrbK^pn4o!PwaNuIz{Z z|LZ|60}3`-Cnz{Q`2YVu57dO8=MNk>aO8-~cY%bYq@*7}9z;Uwg8+olr0$fKmevN; za`|jggc8ILaM`4v|Nq-F3kwV1l?9q|1j#0l^=BJWoY~l*R!e6a+rAo-;eJ= zeNgW2=lq9(=D(cAoB(!O{r^9S5X+N(8UvMne$Ee7`s?p+^H^Osw*B@0)1c04XJBSF zNxZ;#!0FHV`SvhxNp)yAltENDc{2b1_jhrnhC=l>Bo#kDKi5Bee}BDXL}cVkDc1Ub ze-eQf=|e3N6nId-t>!0}=B^t(Y%VS?^B`fWbn^6MHQ#^#e|}cqlT}gqQ{vO7qE0h$ zh(8pMGS>h5m)gbp7~U`FC~{K5gfh|LJKM;n47Z@&5hw zJ9g~&;aBqtqU?}3Qx6cxbc^f9=_)H9UcGp+^OmPRK0Z7^XFreMS@cv37?_G|Y;F5@ zTwwy+*>lB^tHD5k_2S$EVz)YGL|6P*&RM7IaYSiS{?Z65^@^)Cj0}7{2RP1XE?s$T zv8zb8#(qYBOa1A)*YExAdr9x*lq+Z6%st18oIGL46h<>Mw4M62TK&VUSs+(>y85}S Ib4q9e0MN5oQUCw| literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/move_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/move_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..ec310dacae62caefd58f5bcfb702516625779b97 GIT binary patch literal 767 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU^?dM;uumfCn@0o_B&dG6ea z`MqR`%HoKKh&ZLy>|hOt9K`iw|JD6Jc=&%j&{%$E5Lpl6g2emQ$w7>D5`XaELB)r6 zcdgrimL5KucW>8O5RZ+IuaEu3D@KT_1R(hF`Fa13tE;ce#qX_pYv}Xl%goIM;&beZ zzuEi9EPHo;zWpN}AONZdx;E$3LO})t4wi$nHC{9x%KWgBK}T3re0vgqLrCVki^d-x zz57&rzGY{72xkG%2B7bL{`i>u<8JkL=8`R2CF1s09WD5C$H z!0~?h!%*kgl>a+qU1@3QsHo_;r?H#w-rnl-A3j`M{2gL@($C+|&;QTAzt50^i_4(q z*B4G#L3w$3W*`Xr2onDD_w#dmh|dDU!cN(h{yJ0S=El~h9lm~{#+GfHQb7K-DEuVS zwWDvF+2O0%*Co#Q_-=yOo^oO%BZGhd^8o{=RoeyJu1c$GDwro`Q7d;4B>p=-{h*I+N&T-eCTpuppDu|FZquzTmW+*gOcq(5ijzsGPQ=JvNv z$* zPe%vGbeAxGu=g9&zMVh*VKt*q!Rfu72X2I!Wv$+J%558~%?F6N0zdx! zZ9me;%q}*^uJ%@}r{~1R)~Qn;UOOAjvuxQiYgri?Aqz{(I0aa0GGJhPcWN*FDNM#f!pdgP8HoCQ-am#pw!5k%&{yZEE z78sZUBLk~(iprxf;y`(Hv}4E^RHm#WR9mo>$fGTVmOlUM|I_Uz_uQO&zVrIdsrxwT zBoXg}haiX;{{bTveaYDMa6_fC7@4mC$1I;!?tR}Vzxv+7=3}4Z0EDnOUH(6$6 zb17o96@_4_#i6C^#?Hf0a=D+gvyEJ2vpEywa;D!rN^qdWxlW;>Q`IF}1&ukv z!^LVW4ZZ}e0%j{!Do(`<6b0WIUHn?`^(4V@tAIS_a6Pd#ArrDX!k$P7`(IXiSuE;qLVY$svd>l=G8$$wyq%nQ z-(c35doGUhE4_J}mWIO=ir7zIR78*pMC?f3N{GA;^qZ6@L*z>;wTete!0PZ-`@>ct zOJpf5F4np_yiIy__x6uzT_S}DK*1f;uDe>g310j2KP_vV`#Cm7l%c3%qdY4pCMGB@ z&Xtgn>a3x2?&~yvSxZneX14%9mkenYWCXD%p7KP1RjLC3#=J4JO|QN&{quUnvBJwm z3Aq=4piyZw8rQ6M{pffwjzo&6_xRq&&CTE6-wi!ABfA>fD9^A~+t=4fas>F4&1ReI z)*+MG(@WZaxBs_`Xb``5c+Rndy$x^Ufv)-6%mw*a$<1X$w~S6863aQIrN-xkCZa`U z*>uan$&Ihmx8Rwlyl zaw^}-JadMHSPU~J)7F7nPAMmaX|!8OHCly;W<%_^mjM8Tyu3UDO5%GdlDRo#$GpAD zJl)!wZR2vwvR52LFr@=TDA2=o{tZIfvk?ysz1C9~8Nzo z57wI=Ulokuh8^us9P+^BKJ6oQFhC3SjUXn=MN#4=rmIv2f?5#M9SyonhO~f_mWz|;F zURd2fQ>2;zdf?WU62aB93C|;XqaHtX!LbvR%uo?$OZ*8^&j!>z}Ua#jQ z%?|9VphAp!xUS*r$fg5#W*O~a`KJqgCK9Mkg9CRt2CI8YD*tHW*^u6#FNn7;^_J!K vLU;HHb7tt*&FF`b`K)^ZOA*xQ(LM5T(C_)_2E2=ZJr+JbE{V~1f?f4LE?IVY literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/move_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/move_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..cf9377aa2d8f806a50c530580e33cfaf88397764 GIT binary patch literal 1767 zcmYjRX;c$e6iy&4fj~@&1ymp`l~So8a4Lex8c?WOMHFd~giztsQZZpMN+5^|vJ_lE zYL5z3(Q1_llqwiP3}7V$ka9#~fDn;IXdtYUkYzeU{Ly#Lyg6^~ckg%Ko$ua){rh%V zm~AjaAP^SeyUCHzn*cwi#?YR6=FAcTVO$$d4vJ#lpiv1{EKoPBdeQw|O3Dy-c|{G( z^}PSp5JG~WlX;dJvI$@RD6QO?sRP9gNgyY-WktL3dIS;S#0}sS1W5vkM|lfc$&(Zp9|Jw6bD^kWE1SK5?`POB zSC_;fbiDfB^drj%WaR~9FQD#?dnlBh{h&25&gm^qZ>70}^^I?dmNFO&)9~;JPY-CF zWH4xlfU&=^c_0XS`DN;E$kc$tTw3~{7tq%&)+lL?FOYlo?2-Djl%Frj+IAVkE5SMB z;dE`>Gs~n@Iz7wzMe@f4Y;XFfeww7H^iN$0xIdx47frBPxjYj+X>LtyX<;l+C!{rj zAYF2H@2v3kAEm@t?$XN48_tn_)Eb@OB>xSEa+4!{+7ud?Lz$X+lj1q({yd-5t={a+ z?tLg3hzze4x#&k6Z9qEOab8DL|qQ!VDp=A^AhNL!a9Bd=g` za}72{*TzW}#?2o%>vPR@6%Z-B?UZKL>7t7lJ@U)$xD34t$uF&9ns4smL+j;BQ|$V% zurTg)P0bw}ole_D|FAIrC56YDm&s(}E(oHJl-5^mn?t~d$`d(EVKbpp68u78)5Q4)IFG{8;8kuu2UO$AA>6ZMJsR2tYpCg!F=- zAcn2e#Va8jTpu_K<@{|`-Anzey4?sRk@^c z;M%7=edws49W8S_)}ii&AG9UIr0+;-F=FYx%`Zjmp-YvVw=qyw^ycq3CVfQR(~-HSzqq?Il-lG~6wl;LTlID@pDSH6)66CRjWF zUXjSf&2>u`AG+Gf36al3e@_yLrc^DuMm(5&|GxeH$e>N+DZk8>8?x?aPXgrfe>Es0 zR0atWyFSU>3d7{&WFlL;dh971Ji7?Y1zajCFNdx^M+_k|Z6XG1k2Fn#ka*w%U5K=Q zTwnh#3Y_e9$V=+I<;BecX763SZ8*e$`#>Ku*bOZn9E|hz^@U}k?l@C>ooC@ z@U7b*McQWTG@S~#&!nyFu_#bEZQ-VgLu}L># z)DH&ZluL3iAtp^^YI3dL=vggoU#*aP+J*I8K|gZ!yVt=gNb>fj^7&%<%{M@J{XpP9?kU$p@a0gsOuQ^&GNSHRK@swe!6*l*Q?Y_=em;3n|gxA+R%g#z1sYYIozH$jAnL5D=jat8( zb}aaoty-Q?d|P< zU8ULU9mL4u;^Jh$!A}v_#2AkVLIw@Mqm&C(_7s^+e)`*Qf)%*E2pxWq1N1*)%jzUIw#)08k51&mn^c4;Q$uDQ7nF9x&i=J;**))be-!OD6XVKNj;mkbbakf$ANehK_{y{i~FW z4Zklfp7-|C_p_=&2SnxAtpcJG*Km7I`}0F}yQIMX>p@5k{2Klp)R4-V8rSqJ_DU2!qy!=Izww;rqe)%^eVcK5OO z_xDTgtNVHA01!YmOL707@P~uhJpbOBOINNudGPRATE+KwvWM5sHkXtD0*JDv-48B5 zKYxy$U#{x=`}_87|Nk2ve(-zydl{de9v+~n=|4U{=Re%uFORC{)z#J9PoAW(9zA+g z^54I|rwcxuR1{(UXZ&Y>@yAE1qJ@QqZNISFhFy}Q7e`d=t7FCPwyX_zA$n&&>g_V{@J)g3!`O4`-` zJM`h_X>k$Z8#iyp8yOhfSkNvBRQdmZlk|f1>!)wd{{GJO{=T}&KYo6Go*o`PU8&^g c4Twq13>){VT@$>)n-Ai9y85}Sb4q9e0FzjObN~PV literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/music_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/music_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..ae025d1bf21bc3fe7682e2aacade897404daf59b GIT binary patch literal 1339 zcmXw2ZA?>V7%fx^D;EU;DT=f*e+Z&fnhg;Lg>{Z@qHZOXA<|OOI5l*-XmylZt}qHX zEZIcTP$?Q?!}t;wg9hfkwXl(hRt650Xj>$^`d@@7oHcQmGde^YFADM_;1z&QGkv1~cjb zIb8Mx|D>cOx~JF)%S^ZmuwFk_5lw~`(*Qvb-d5R~LaRPa)rX_=E8mV!?ylddPaS)F z{ivw2rlt`MzfO^&kwgYhMu<=5Q!kmBOr#qF}DlMi~ zH>7XhehyPZd`(S|p%H*c76n}X&*>lV2D85A*|WmP@}J8CPK7;WR;V&ly;2|50GvLkB*npOezNB9LINoNO|vK5RHTQ4T+?2wNq)~#Y(}&kEBMa zx%U}GJR;Cs0e3>MeD7-Zj<0SAe?K6m{d?`j2L+HblHzf>N{6$~2JJ#5sj34cHS13g z6LawAY72%IbxC5aj5oiWARW5|e`q0zC$enX9XcIvgq;}afV;RRQLnVSXXzG?~m<6kA}f?c++6EAYfhA zvW31QLn+KsZkS-m=Nhl&s-mNa`(0m|)-EiF2%bvNJ*84Pr|g>=2L%ESkK2-3s@?nQ z$PbE4Utwm({l1&4TZ*AnxQsK#@!Px4zk1NQ{#SLq8q;euHlSiuu+zRV)xm{=+vy^D z6w{Z`^s+bbs1QKS?}JxYAT5-g^b>il&v;`THtY=Tkl@kHZEgLYV`*w`HgY(GnV8XI zwq?1&v2k&CT{AY5satOGY)InOuC7EbkH^dFK`*3#E&3z$%F>0YAXnR-?%Dpne%9vX zWEScsv9NZWh3>m@36G9`y+W;t+IwvNudEc9f2&THCr5(b6^Dn1yQJ0L&@wu$lil*I zkRGwzEGb(>*{3B8u~=M@Ai)dPicXw(9|05F_~Pln2Yjiz!F5+{XP1_q3`IUH6V(WNDYkwt6i`g2nJ$+00?2!7(>k~S4?&Q8ki@ANe z=+n(-=Xq!CyJPnYW3!0nBEBf;_#7@1;e2|wf?z{(0O&OKqg5+#{zQ%EU&1eT2--8G Gr~d~%yrD7x literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/music_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/music_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..2957f23bc2af734812ad525d7b44350c7547d32c GIT binary patch literal 1615 zcmX|BdsvcJ9L8`T%@8qLNT@(hGc!XQ-JDNS>K-+n)t)we))Yy^QX(Ch+7t+pE?ScH zWIFSf*=?n*(k@Q$GPQKNE=!*@!I@BF1zt#0;M@6x^~d*p=R4>3p5Oa>&-**acSMCc zIxKTQp-_(DVIkjuF9mrPLg39me0U0lf|iDdY~7VvwufCwHBO907%y+H$Y~bL{i8R} zIT1M=HTmWDrDa{o0DywwJyo@NO1Ut@GWC|PD6V71HVe$x#*O1H5RJ!!s8lKxg~Le$ zGIVK`TDy5fb(b9gY@C@eq)heKDY*!Mud|?WJRS`SjEjTztqO+@9XcfDSTihtWXBL% zo|Q+7LSVR6D*~Wn!kO9iueHT> zG%_RSi{H{FYu8~g7&Mven_F;a37SA4pj}*Co_HwKNGdB#yO9?d&ti?JMn*WYvuEQ~ zYBeW5k;-^c?{AAqd8t#%{SV%`+tna*#n>iEf`N5A29XMpZAc4VZ&GRcDzFvuY?je9 zLvPdcFesvv@*9_tO=(Nd;dNY_tH45`M(HjjUJ_s~8_ zZIunkAcQT6M$0?`PZpRzoE+(^U@$VXvdH@JiE_NlXRlg1I~y0*TAsh9+q+w-02skH zmSY6joC4#9SDQ@Pp=@?dV=AAo`}{jtE`axnD>)Rxqx-W%CA+2x!MS)fiVIQD91iDH zcl6Dk2R~_eZyuy;{Vl+h+cA-mkukxxXsw7DcKi)s9^<$L8f?_vn|nR(vMM TErx z5Cnxq84X%O8glEK2(azSL@u{o(bk48oJ0!tqtk=k z#YC|+%W`iAi^aSs4PWkcFH3u_vALYq23$b|lihlql9AbE2KpU2ecJi@{|?chYMEip zNo;mI=@W8b69E{EWgH*H4E@ON>FAK&r7W;ANmX2mC|;_(m-cKLIKw0tn#Gz#Pft&& zGDeJt;#=lMJDtwrMYl@MpRbov<}u;`QAtS&-#qJ>@&1+EH<8WmqEILbg#vX|6qqwB zp*y#TPz*TVm)RUPf39=Wy3}qMa8>m7_Ufl~OlZS~hQ2qm*5bHDYjGk9-oCN&hob8_ z_5*)Me{GVIRa_$;e?KOiH6$o4xvpEVk~&LI%8u046&msu5ni5h4=8WqYiPG%EKHP0Buo;CNXtk~?dq(xcA_{yHC>^^ z78DeC;Y7cW0DHQgFDU`mXwjj7TOc$#*BgSQ-eQL;t2#jJ{4?5TfYS_cNvGbRjh2GW zY>C*412-Lv#bSFRBUgM2wIkucTH?!gYu4O&hrzkART@nac#ifOV+QzNVKB8VOF{w(ZyZGTEQE z!5FSNXX_Jo{w>E`Ka@TEY=`{`pCkQ`yy8&maqo33rz?9YMY)9?yZqnQr1TbfG>`^w zyi3})&(t&dQ|ycAsw*iEH%kO3*5V9yn^s)d0&S=a3wlcEx+_#i0ggH&*#H0l literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/network_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/network_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4834aae3fa5796efaacd4950dfec3d60663d3ae0 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU_9&T;uumfCn@Cs^DF6D=eoN( zCGYGle(qEs->+z93RK7N|9{fK^oBWm_B5{SG(5aL|2|K_N=AtIp>zgAh>}G&Kr~40 z5!J$vmzK86+t*F{{rS21;rI9JC3aX?&cAW%)`>-{nZb$^+ou0HovJzrUvs zoIH8*!~g&FZT9v55<=M_x;dI}Z-0O1_rJ%xmGqh|EiK-!UbRZ&;18fA(19wKHZnRG z2rwM@&7&mi^~RoA^P-_g+{3gT5BQC*>^iVb?^&jchN?@;nJd*wbFb&xOI6HYUJKS~ zb7muNg91?J>EnVa{8^<%W{1R_pC9-7bvk#$^q}>h8Oq-)e4d)gDj+z|@Xxlhk@jF+ zNsSi2zqPK9-!EkV1S?i)81AY6Kd*73V3IY@0iMdQzeEpTe5@`30`qLE%b-5wXg1Bh zZddvFSFg!B0|7zNN+}^3o_u>9t6R<*@-jH^FmH_Br*cX@VY)}4l}!uNh8i}{6;)?=woPow-8K8}UJH3p zKqzG#oNvEh^56ge=MNk{eE7i0lP3?HK7IPbd-)^g`#U#43_K*sUjFXR-tT{p^Sd^w z85kH86cyYF4-5=Dq{a?*Us6g!!xZCBpFXjj5IWYz#*>w`il?WihsVdq2S@{P!1F)p z2?;;=zaIVn|G#A3-Cbu3zWrepX_mLEsaUvi-!%cSF)ev`r=s(DxfxH|F4MOR6OPy|=X@vb>2gH>h572PGe^!8>_4+rYC6jS zU?wZ!?yr9Q zK8-*Bm^B&y|M_?L!|(I*ZTss5OvKHv3#Y5AM<$(xcx%cPLq-M#9+r*bhZw%TXPMxv z{?EagH^nFO(BzxSZ43v6Bg{6fXSjJSW_RcrevqT4oO9%5VBlchSpAUUzfoeNYQ_PF z%i#yi1RX;Y^(RemDK|DwQM>ndf(+OTN}9ajfcgLbKTrMtf2}TzTa=nwPT22|(S-O> zNta~---8Da5)x8VQxlStlOH^K)MWkO{r&ww^%I|g6ag(&n!)k@&fe+J#@;{sUKECf~=%(BkutPfg?4OYlN$&=t#J(VPDw(O#P>c=E8#Xlh^)Exqjx8 z-;Q%WRze&s9!^p9?nn3?44y67wy$@0^?$GpNfRecGTN|h%aN5YUSHSedGjWR=fC2z zM_XiW3L2Ew|NoPEApINAQ9!SQ+>`Y4>ud4mDO*(hT$lULPyF%ov-;un@%ukS^}ORS zGc#-Bm$x@sv1;X`kncdlK&cC?=kIUx!;g>m7iv}g|0jERd;Wb1yP6*klbBgpStal7 zuW!Hp29%JHRX4Zq5Uu_3q4DAE?fE?G$(XZJtn?(RXbo70NBwu;=D`?@Z|*h6!87;^8_H6(DLd3-`~dz-~am? z3iZR!PhVH}%v{OI36!#e>dj@r+2X*o0jFR$zfYDUB!iE zm-M6wGZi?$vl<^ZW?RLja{kD@|h4lP@}_Uwnx&;8pbFZVM(al*sc00?ZVzx`1M22k^qDJs@I?;pN<2JvT- z%eULWpgDSdU2OHk=j-EzmZ_=n{QqxkFvq5{>EZSF_jwc#9()H%0nyv@qCqL(!P~c@ zYD!9*xWP_vGGt)emUp-8%dxZ4VQI_KcrINE;+d`&pT_aw`|(v`U^Rzk&D^thZ;tMn zv%i5#4;8$)kl41^z26AvtPKgl5Ob1}fL=)fg7lP>C&_7P(~=SsFQ%oYnwFK6#Jqj+ zBBJKspP%_XJw5LuBO`fd%$T7fAt@O-5tIpl37wgtT+g!c;=^sCAik%opUXO@geCx| Cf}v6X literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/no_sound_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/no_sound_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..01600a96f88e0bb461c904a267d8d2f065303287 GIT binary patch literal 1437 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 Awg3PC literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/picture_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/picture_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6d67fc6c3af84bdf3217dfe4f4414bf176f35ebc GIT binary patch literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU~2MoaSW-Lla!K>kg%il_qkSi z`??p#0-P2W7J92zu97eS0-$P!|NoN`fl7XSdpmpItXW#j%7U~08ygth*;Oi?Cy6Bg z{k=T1Iy?JDzJwn@<{Vy#l%x2M|Nrg%dV6|$BtVt}jY~Ph$je~BabSb$4b>f%J5t3R zSii9B{#4~47$~^HM=9?EBS@9a*@L_c0s^cTPqI}n)7hnZYZ0S;VbVGMnG6aq=Pzxp zUUbz{{EiB5)$%|h~z9iczu1mb{Y zc+uc|{r~@e9v>ec9{Y(r>|lezDu4ZWseE{M`FjZoNy&$^CYmZqe|dM;x~+e{-Jvi4 zAPz`MOiP>g|NHm*kFT!2e!@tAv!%6Fe)EP68vlQOer^UaDg_8qfhkBW%vcEMoB#js cLtMkm&|S#0ukfxhD5)@by85}Sb4q9e0H8rBzyJUM literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/picture_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/picture_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..cac6005345d384ae7c1d75ffde91a4ad8a58fddb GIT binary patch literal 1046 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V7}|=;uumfCn=?&DSG?+m>(Y> zx7#sKWngDN?rIt;$_!M<@c(~OBWKP3f3fkQp{ska?yZw1!Kd1EdH`!V?Ab==p zivIBbe?6NYAK#{!?yIZ*3!H|CJ4JkWFCX*i>+9=0`|JO!-3$l|3u6lm3>5hcHN465 z-|zkpa+Yn2UpLQW2V3aGsg$Cisp+|i_56JM_RWdU7{S7aG8xaX1~2z%KH;qV;eWlx zYkL!~|NqlZoIihb15cV9OpOjtWJE*&Px~xRbD2n8Gj51IITH=J7!-JpFh$*8@-M!2 zGP^7L!IjAh&I%7x7``9ZRA)HDwKsH)#H1O?8&xfy?+$#x3i3M8SNvz$>;M0C{qX?k zyXpt-l&t8y^CdmX(#UvAMZb#3iMt zx3kOp=yvfhfcxX%{QdO`Tr*}${xdc(FferbY-ZAIY-DI;;H=xQ@@N{wyE(le7YiKj zI{W{A|& z1iKvA-^4HMNr}E8vf#`5{hTYb-q}4DijR1Gs8nuB&A6F?eDcnYhKe8V8;bj_*ZN*%e82?K=JewMyUU~R@9*>Mult*nkerNot zE?QMkzKit$Fam&PM=*Rn2sB!?EA z_4VFVdQ&MBb@ E03ofy1ONa4 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/picture_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/picture_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b770c086e71243d2654258f869686ef1cadbdac1 GIT binary patch literal 1315 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVu)OkgaSW-LlawHl02E~S|3As) z*`0mG&kucnZ~rATQ&C<0xNE4WD6@n-MAmWIpKot>?_0Hsi}_Hf#ye%&VOis z`0efT02>alBB#Ow|NsA&w6L^Tk)SE}{LlaXL+lXUhtxg!K}?`Mhd3BhKD@fB-DY3^ zFCayco143N#taERYpAR=)BgJZ%T5&Kq%FA32+<(T)YH?$GilN!5z7ZZKR>UKg(`i` zkg`!Tc$wj!_GK^r3vjBKE&JE>CuR+w({^UC#w5qdM^`p>&g5L*%EA8k_)E#0GKfwk z38w%54$2&8S|xecDP`k-j@lhIEFe8V=P4<1{c{vCGCa68DLFZL!}iU|6DA0xCjddk zzelWx8=2cB>i+#|ebQ0yVhPcaGx;DVgQ5U)`w^u*S>N95R}+_SKeY0^L)%I9|Kc$X z^E}VH9KGRWmVaatv(45^Q2{D%)|>B4J}?auG)gk8_5Y0wK)~4WaC2l#jEwKqdN$6& zLbfR)&*T?hdc=WX()V54DSCC!89H_v$D&c+p_M8nYUE3Rv`!WF?{r`W;)YF^}Kp&@1)J^)m z{*=FJ)`i2)4#1n}F3Plzs$!EB-%$=Ou&SL`6@9{jW1!B)O(l zHtk+~&5$we$iB4}>!sbZIaue_hXj>Pdc&X(_Ha(WAzy=n0L${p0RfNMFR%;zk3Ti} z-KIDlkBlw%Z=R`Pxl`M#vM^n4>6XH;ewwTe9S6>c%`SdsBUQcjPO^@l&^tTjI+i%F zQHP|M>i_>sO-M;e`SJI+IWzZ_>0F<%p+_1#EEU&E*N}LV4E;;Vq(S5SE6@%=G)gB{rUfY{=@tG z>m~T$+VAuLgi8&%N(ohDf^>su1{yM`q_xI0NVmB~0Hm>>qZ*C(9%$+NH7?dM{v3KZI zL;n4Jh6YAPi>7>^0%n8!)!5w33|At_w1weBs|*iB$Ch&&1sN20ju`AdmHOW^nBnQ= zjf}G#^cQ@Km?=Sx#l zcrP54l#q~^XIELXaQEuV0+BpG)&Kt|IfkofXru^;37t7`=Fph~ht2@$Glziq$blnA zju;eP65(lP1S@Tl4v2}Wi*s{3_TcO4aGpPZYIu5jdU!zK|NsB#KmPx>KRkbbz2v@{ zpNB5k7k>J$?msW)#oM+WEKuzSjvr57uwcP~g8%ny+xFN0KlE|FeZ558-+zZc{Qj=r zrXRo0V8*POhBd#waJ~})>H#{B<=}471_c4vgVH(tQ&t_fTgvYAg!MP~9K(ipa@YSZ zP*(YP&NFr5R2LP&#@))CvLE02mh&4&+k^Ec{rUX7|Hs_j<>%*El}5Eqp4|QL>ud8H zhxqwiTwNvh)&4$}keBz(#WnIK#DPhB%KrXJwu`fq%*@ne1A;bH@9+nv3TjqNLdyR0 zf$sYAk`rR`&kqk5_sm+Qb@)EezrawHu()wk!f%d6W9a7AR@RugEiD#@7a#9Wg?J+A z=dZ8Yhu6pNf6!G^yH^s33wJR@zP-LaUJ|C@+gs_w=jYo$R1@Z&F>|IQ&~e8gQZ=VH z@-i53uxxbZ@-|Ws{oc_zPy;|x!^yA~ffE)&zzeinRvWy+|k z>I(M2?(+A>OO`E7x@uE>EoX;!{@q(){g9~q#Y|Nou%CDt8#cI|)s{<_0m(zB!g z8yg!JE53%f#_42l{r`V|zdiiBoBMLw8IuEP2iw2D*ZcGL_jl<{5@7wz41C|jZlzbu Qa0fZT)78&qol`;+0FQKUf&c&j literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/print_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/print_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb5be2736c99de88387a570c7110f968f3336ee GIT binary patch literal 1222 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VCnUAaSW-Llaz9R@zg2p^WLXV zNIaP2&gMVgX6J>gH}g7t`G9Kw|4%x&)YB*Cj)K8~`Hh{OoV><|Zl3Y+;pqWl=;5>I+c%8`I>Zm8Ub1zYw!+SAjs=HTq>>m@BLEhT4M z;Q9Ukzy0C;_5UUQ{r}H@+`j%#!VHVbSO3-h<>Ftwd*i^V1<{;x)=;#;K)~f-f7^xi ztv{{{o7~y0v|A*gv2kX+!7)qK!nH>k_1R7~TPd1tyJ>cB+3txhp=Z~ZGlLwJa^WB+ zgCWlmhp+J;lB@$yJbxgUnZQ!TzQhXE*W! z^)PR|T_4XXro$RvGn4g%`2-36WM$bZ@90_bK2E}Bik!Po-{@&qwmrxW(qnUGqo9L> z0P6+$oB~-7mKBa0m#YgZr3rYL6nwt^j<-><>ZUM5!S|%Q-{z%ACbKVf@;r08Y0mu< zw*MbKPh~T1o)n-J9}X2b|FU}x>~cam{(a*~>! zo@^jcSjahv$BkV^MusOSXcEu)dA8HRY9K+K^z+x()je&yq+$*(cIVgJ#K5*>iHhXB z`PGWR&;%ugpI={#AD(YtFCif*DG9BHye+e`lY^V50a!tMF@+opShoIh*UEFSy1nq-)|e~;P0>gxXdaGc10 zZ-4#y2WKiKJUoBfnuoo0l4RY#KPNx@J-0#7iP8WqvrVib%uZb{+`|l1c{H2^`=BVc>n(V0T4KIhKFh z<72*cs;aJRz|a7Px0sk%Tl)EUqb19h38a2_bF)}tiONw)3k!<}N#=QXQWAiAIKbL- zt}GO6P>^W2s6WHjr=&A$x~$4WS?j7zta8unH!_Ke8$`rDIC|Z3d#mxW#ZxXZUx^YF zTvmB-hG2vB^Z1IbVn1eiyj--EeXS`&RzU7|yFFktYtC=vZ7|?*Js7TVT6U@W59bM7 z>n9uV^$4kGt#@-j$yV;|Vsn5iAoTg1?-N>f*DtdDT>jvl$DuPBxx0-%Gf3?H%mnh7 zljgd)bLXD^^;^Bg$k@1h@B46&W{{8LHnaCZ{+%K{UPePP4Gb~=mzI*Pc QT7Hl+Pgg&ebxsLQ0GJ;q%K!iX literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/print_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/print_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c683fba7ac4137b4d38e94475d9210a2ed05fc6c GIT binary patch literal 1398 zcmX|B4OEh66#nEhLHLkUW}=lpkWzF0(GPhlQNs;eGb_(5&rX6)%hpLmYi7oeqLQn{ z%%f&G$(UOm^JkT{%0R3wr>PxnBf|vKB*}EHf`;+!1#I`6@4e@{_j&Jq?{n_G#}nc| zCE~sD5Cjq9*sL8u``JF63pjJ~^It>If=zL(=)}BpsT?u~7$Fq(<~iGS>I#Lt@%HTP zt0zu4MU*g)&5p$+?Y-q6xz+(o_5VtGLn4V5DScsgcPdP!y4$ro&{X_M+2;Ne$m)y- z{sx`{Pceu_l!9#p;g;D&Sr2#TVm1K`+e zj+MX;r1}N4ORE&TDHGS8JSlgetN?&cGdlrN=T^P`$fU3!)5#t;x3_g6N>rFAp*M`Jz9n)=)v)P3!G-+^OXGsQMr*a*Q9}#@dbRpOZDX=B3V;oa$BA@BL`r+n!H4WE}{_3gJz{T~-6 zzcqz+jxdE}tMy&?%tUBUs+20|Tn4>S{n(vk&EfGjZr_m@#^rL4xL$F$SD4Cbn|sx6 z*_)SlBVFRWz-vkHoq|Kk8f;!8tEH;Jjl<~-^E4-Z{A$cF%eGr|}QYWL`A z+P3ifU0rk@pRc}m@agS)s@~qeU4OF`3~2nR%`sv%-fP3cqRPrZ7)Yn_uPo^=yAl&6Vj%jVYet06=ObFJ7Wu))XJ>6~Ex-SfjdK)L z5BX&uI<(68Vv2b5?dyvMr4rQzC`1r*yPN1DYBKr43{P57Ma9_HNl8`o1N$ALPpQ@$ zm)2O5DyrzV7ruPjes(4H#?71dzuerztJka>)L*l06|jCZp_~bwXaY~8(dw5$JNtS& zq7#B0E`x~CoRU%CV35=O24# zZ@*Xf|KDB7SU#Yl|NoPejy1f$Uw@*YsEFh4?*9p=%}tzv5fYa1+bqolR&ppCtR(;LzRj)<4h;{F_sjFt)YS0U*xZp3*N?sT z>EU7ba5f--n3!~A>Ce~K*Pk=bzk5$fQ}LXlqT<01Z*QBo@ypv87#JBD?Wy=V>EW@j z()M%b&Si$^aWZ`H>8W=A{<`04%#Tl>I%VMD>2>Jo{k_%43;zGBZTtWKzww^B&utIi z%-p;mYKx=UgX{0_#{>mU;t_iEhzA7LtXWgA^Za~! z;(>z)KQb+2hiLrR)Y8&Y=kM=7d*{xd;%aJY$KK!Hx3Rmc%c$nppU#KJ&PMa>w7fa* z#4Je(2??0buFaV+p+LdJB;>)*&*D6{x98WdUb^z6hO+iyH5H8$A3i>IXLEEs`1!>~ zRWNeKxF4}hS*qvM8vl$4f&g2s`8=l5*ew&%wgzkc;<$~^1pch`@0PnY=j?`QM6 z>5V|Zh|pS4P>{jF%^f^p!jzO7ds4X%cc=T?=iJ|S_u!Q)B|$zuJ`aFShtW0p&f# yu{&n5>ea8guejH|+jo_H#w(Vn*ams9`OFL~@01M!Zl&0Q?DKT>b6Mw<&;$VRt&p(* literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/push_pin_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/push_pin_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba651b37efe2feacd51d76021bea3c55dce7851 GIT binary patch literal 1179 zcmYLI4=|f&91d|wD{)G%CtsVgOS!nNZBn*j4UXwdtkiCI%!W{GHZ9h5i4~uOp-Fm~ z?KV=H^lZx7Zs}sHoRLhziddEY_5<-TYEfd`69N_I}cSTW_bL>GQs1ON!Vsb+^_mg2Lf-vQ4U_R99* zfT#%3Mu3e~8ER}`QKeETwVT7C^ZzwXS!RuXnjmKq#-u2$2zfZ&!-pl^-E^Y2x3>Yu zLo^7YX*A&xNzI(!mhBs>XQ=paQgQ-sWAQS76~GoxRf^RiL?)9=#D@WgL5isIp_dp8 zJ+@>{t}!;KY@hP^OXMvfj6qQ}yjh26N}p0G6p2**HG@c@P`0Q#7|^s8_95(_(E~Mp ztV}j$v4q&xmnG;x{r5WOz50UQS!1d{ys>hEl<@(VD~?G|7Ypm_efqHlL>Fr6J|{uv zzr9XXM#K45%PgfzdSm#2tK{Ci-i2sb^FwPZ6d2f-(kGY8(ZVzjJl92Z@S8R&-WEIL z>-&s#@L<>Os}7d{&_jbCU%Qr_tcZsLCM!ugw=s>?r}*rP`O z?~T5|&D(o5^YrP%N@lWRQ}DvNQ*6Rrg0wKWgU#Jz)~K>{AkK zm%OI8O9g_J`T37FIOUeVZyVxeDO9lXe4oL=Ka$ba_lI8p1u`))NNj?f6h@$ z;rLB-4R1co5nx}Tk5pMyL|cB!y1x9fK^72AJ7d!H?xNFkzf6qY*5xSJ*VlJlp-_+m zgMvK#Bg?E$47ID$1;p5q$mOzaYfH7Lc|=K7>dLZbW@ZFJqsx7Lfv~!|x*|4KFT8vA zq|iK)#V#~yQmPvo%%jY5;$mkJqBafROii;5Ac26D2x;zgSzI@jE-P ztr@|O_pSm~aIhxX%isV2ki+9uR-cDq08&+%c4g%GJD{$vZkbM}+wQaXZ9{mxU=~XU zufLFk-OMCgQC{AIKZl18U69Hf8$BQhD#d?YM8d01eA&=1UX^Srp*KF3J9tSUyxdJ8 zvW1_Buk4E4b2t@ozu{Bz>%&{art9;zHTU+6{qwD#^V-AM56F!Oj28s}kw9Sdx0A!M QG>3+S<4JKp$MQt~0SWO(dH?_b literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/push_pin_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/push_pin_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..18e494f7c3391ed1bbaa4c8796b862808626b166 GIT binary patch literal 1669 zcmX|B2~ZPf6wU!bbU~z55{(8Bgz*3bN3cdRrg$(^aL`sAqlp1=v?w7Fj6hhz5e_L} zfrJQ})?+-V1dk#C%mP6{8DT0d=y;F?8KhJaKuO54+l6F&GjI2wxBI^Lz3VUB8@3)<{Rbqp^+C&To5%)|TV%@;!-v{V)I-orIn9JdET7dx!X5Ejn!0w&g5+8T%`hV6g!1?(P7S$po<9;yFfCA+FA^9{zi* z?=U07s9o4coae*6E*kXZ~is&gmpDaZYYc>4lQ4%mvcO*_YIpmnr(n8k^f+#tF z)u`|89SF6j)`bTV%MwU5I)PuaW~Ymx&@_)EdrsXQ1(Q9$?paa^NtY)Vxnx-u;-t@71pdz2>6AsBvLd+pjMo69Q3 z&Wq;h(Zw3fSt~^?v*qxBauB!~qev)|l{0=X)$mD}*aP17`G9$McXl2=JKq0^R=R2% z*NCDF4HlD4m;1|6Fe5D*|)cR(4OVV?O^2|>^zuMm3<2VGmUa&vPt znap;)NF)+7Ks1=u$U|P_8+4R#5z-N`dczB>n}HInbRj$*FR10bRpLdbuNRk>4?B7Z z>^RTyLEW16c8B=*@3CH zln-@Oxy(aPTI7RmSX8Z|y+c#`*^jLM*e>`QrTQ zYPjceb9hIXt&;8IxI`)Ayr}|y-FFjU)lg}!)G#e4F_FF{EX-ePQB6a2ELD4JS67#( zzkiqBYCf0ArP_VRa2Zlih)!s-9T!othAT_NE`-&?`>8Ek_=<`^vq_;K2dogwU+N0|R0R_x67vGN2q0?T<0 b^JqkzN5g2x?lb*A&DkS&L`T#yIobaMxfV@W literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/redo_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/redo_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b89710fbf3b88af512807d22726ea47b85cd7a GIT binary patch literal 741 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU|Qqp;uumfCn;e8NQ&YA|3wmv zD0GsG_>ZrzxBqy2y#IO4&tF$tCr+Hmtak3~*;?lqpDm5;?dhtUsvugO9M|99^U$7>nUX?lb=I5#>y?ptV-In15-{i<9GtnS1H{FW5}6secK-BF SoDupPB=70!=d#Wzp$P!FxNMUE literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/redo_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/redo_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..b6857ab398eea9568fbcdf04a693347da52d10db GIT binary patch literal 1113 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U{UaNaSW-Lla#Q)5Gcs-|NkOO zCKNj9i2Bdx=jA{4%iAy8Tl?Ma!SC{&$>jS~mXo^4h7|Mqry+jn_8gPMPTezxzJ5wU&8 zjtE(^VyLdJclYZzeE-!u`~UvBzrW@S{P^|t^?zyeynp-a{~wH-v3`Br?z+!^TD$K{ zN=Sgb19bDD4+r;FfB*jP*WcTok)9J9XU?42I8iWP!^nX*bw~MoJ7#wE<89~X+t2>+ z`Qzz5|35T3`iHj*g0&_&h5dN)@-pXq`})G53Dc8*{Qqx%7|40>gqY;W6}-3j`T6vW>}YUF>|KmmaQg|Kp!9e@cVmy+kE>v0}x;a>uriIczbK>$wf*^Z~p)P zoBZS3XLV*{V`FAvVd29-CrH-)|9AGli4!LdoIKfi)o6yqndSfg0hKXsY~Tdzx0!H| z^MHcL(NA{uoC|k3i@*3$CbICJT~PnG6n@3y4l)W#=c3-Po^nQlx%~Odx!0sV&ppwS zvSzEsPlcr|GZkNcPkVp6kslP2Nr}Kn-BI)NlnWj_?p)c)d3d@1e2H~2drv7S>eXGmdGh4kxpQSznLE3>{Qmy^{e4#G>M;A7 ze~(yqGuYeTd1~PO@9*#92Y}$is^u&Rx46nEW~3FE4aDe9aC8W!=N)51&2z;n&yf9S?!}c|ZUZ{tq5JNci#bu{tmy zn2jMmt@`nx@f9$uNbUosnq#+bpO&Bg5Tu-2OmB~do|>ATrsly9|Nd69iHV6-r2PRV zHjrj;Ja5mxpKx*tBtDZWKYUpDV)ga)l1fU4E?Zhy#68&j;OgmcruhAJ$riQGbSAy1 z2YTVmopWc-{ON9Ne5ec!=%kb%s;ZiWUZJk3vUZ0-sq@vVtec!G9oZqlhMv0#@tGNf WUoH|@?;*1Vq~Fuk&t;ucLK6U%+A4tn literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/redo_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/redo_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a98771fdcdcc29502efc644d4bdac634ab5ee2 GIT binary patch literal 1493 zcmah}drXs86mR9B$Ol+pQq8a^1s^Caq5+lAp(rC};HHa19W5;>I8iHD%A-&UiWX#* zF_)@fjZ@jusYPRk3T>slDG!6n1f*01#E!N+v@NvX-7RRg?2qjv-??Az&F^=9=iGCy zU{6ex%i`sWF&Kbz*z;c%Tf39@m z&IvJvS5L`7%ioW6C&|@vUNje=I~@I+T3SvN7ZeOR5lHH-xw*1m>n}OYajj~_@=yzo z_wFsb^Nf(N{Xup0i_FYSeCU=?{5NrN%ka=p)Y@hkYH};=6wAq6bn-M`AQ-CA3@_kJ7E6;EXT^n5UvX z6`LUrrd3xwP|Krc4>h(E2;sTJgL5{QEHqlSZSN-n-DvmqU)D)S8oKiXF6hSWzx& zS<4xIdtXnOFj-)cA~nzfd74oNqw2)6)OWo`j$RFb5xOa_Kr{)mK`azYe>{@6jib}K zdoCFqeEmAnG&SmWsJs-%xzym-)ZEFDh2G-!KB)sNpS9US_(tx75-|00nDNu^RnyTyt9A!fwhX0~y_`kf1V zb0Jh3WSKPz`K6_}1{~P}0PnZ&m41yXmCB&?s#gI3f-NR!TL))NGSp&8vrX@X8u)eP-EP87q0C z9SdTySPE~xv(kO@dfS*ly^wt5*5$Yb`3n%WEQetNfTFC772}Wf*R=R3NQVBtzHYHl zsNa-&vg+>LnnW5+RHsmohYcFvGo(W`$&6%L-Yd-Xp1ji-UteEkC*geLqB&xE{-q|a zejq0ei^bY5B$#V5@HPDprjQ@p-J@!2!fteJh+4>G-drh$vuOVFMQ}zfMhQEiUIF`z zX)-&zJIqU@=i39uLD%&30Ui%*knD_okNOc?c4M^{(Zj4dBj&5=!;s`zK6WaZ0jBOXqS zxuv^XS%Pn))?{d^=nX|BBTJX2l$VzyM%~MTO6!i83t1smEvZtG$#;#kpE|A!0L=fbh?Q;Kk$POrN{Sv#{Yn0>&?E?%F(2g8F zoT={ZeXkww%iGtTn6PMKbMxcQU9(o{fORD$0%d>v`MJ4g+B7w0VP)mR|NsBz zj5vAXz=!|#hp%Q|Pn7@yh)oc+e}9`ZtFyCv`uzv7Kmcq|&*_c43sZtLSM4TAS|o+_lWiIZ1a4NqJy8s^+Bd18=vsw|No<(M732t3>{*8 i-mt>WC*)0-JTn8&6=PYCzfEgEj`no*b6Mw<&;$TqqJo$J literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/remove_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/remove_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..3329c9c2d47ba86bd8c38ea3aba098b134a87fe3 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V4UUY;uumfCn;fpAyAOv|Nljn zOeE1sDG3P)J4%0_d;I?X{?h@M6a4(nsb{Uy+5|B!DG@0Bt6)kr8YSso{vOo|(a5kI#M;sdQtIg`Tc{F6*2UngDmD Bw+8?K literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/remove_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/remove_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b8806fde438d13f596fbd384d77ada2fc49d809f GIT binary patch literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVF#hv&aSW-LlawHl02E~S|6i(r zg(`GXNS*)>awSy|cXV7*rK z2@X?XxBGi4z1tca8yUgQfT;WZU7uN9oqg)sBmDpV{XKmE2%yF!fsFb7UOraWeVZ^u zhf^7^E#nzKh=Mg29eEiHI9N8co!KA5v3_<#Z8*2B!QHa(Pu2gXx`fWmD*)Q_|NoYA zhJs*aJV*CmeJ&9ha8ct#bIF;WyMN^xR!!ow0Gqt$oFULG0p^X;yISopOrEq?=N`u& zhLBsE-l|Ms5pCcH8RS%Wpq*d-#iNG*|NkGBg}7nQIY&VT2A*aExv%=uoDan4a2YX7 z?aI|}((xvs15)u*+1E>`z=;kmp{7OmtXK7Vo P1G2}{)z4*}Q$iB}S0vZR literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/right_arrow_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/right_arrow_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..15d0a1300253488b7bc6c8346c02931913ac96e1 GIT binary patch literal 627 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV6yUbaSW-Lla#OkB*pOmzfwou z-F=^b{OX;ZzrXhXyB=RTuyB%6%7N|q_fvlSsAzq6Z}0Y}x3}j@v_Z9G9N1s~Ut)=h zs$@$Gi)G&Zo!yBX5M4W~-u^oK{{H^e4~-id8yg+Hf+juuzyH6CdH%gypT52}m(R;v zx0eS9ASNaK{PnbZ)~s1l%1QA|w3#EBCdJ3Bic zzP`Sm=l;IhR2HZ~e|{Pto~|D+QTP8JFTX*_hyVZUK@K!FFfuaQuxXRgo%#qCy-PSWw@oJb6BC+O_}Z z&iV0_zrUAU@$u2o^*3%v*cTRloNG`CF;i)V(EggghYDVPN^RR+{{CNAR~L`NwKE3} z9DvGaG)$Oq;q~+L@im@)eq2)~O}f>m#}AbI|9_DLBba7paLYU;`@7@cOpq2&S3j3^ HP6M~-sW@l$s7Hl&% zN?J8(>cm8lLyz~)-oCBo?=R6jPMC&<7ENnwYi4nEbYJ+;sHA8`Hr%`YLhSth-~Mp@s>p)}6!i6vfB65uzE3-R zeIC>gNeKKu&?5|ic;P4G`F;%&<>7Or|w!O+tj_e zeKTq|gB>hv5)vLfdQwyN>r19)P|W)m4-R~IeO*;m{C@MyQVeN4=p z+MhpvK9uAIYgE!c@ci7|@AprhocQqi`goo-Yt}&g^zYA4fBk&@_(a8pcTZ$N14r?A z(|h~61I?drZGFw7AGha+q`-ss?Rgf=KmalBbQ3Uy4F3H1*!=L_-fA9T2>h26lX|AF zq_l~9b`&Hum6q>F`}y%N`{AvxuS>qWU;jbdMCC}lk57rZ-chKE)piLfDL=kG`1d#d rV&KGoj~+d;;02{jh%_uSz-VTMS)X|lbP0l+XkK`U9iJ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/right_arrow_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/right_arrow_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..2ad3725bf58517e95a429540bde5bc14ec281d48 GIT binary patch literal 1034 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFkkd^aSW-LlawHl02E~S|6i(r z1uwmbD=9Vg>5i(mzrL@&zOMfNzrVYUHLDoGdXg4RQ~vko=V3*K1Lq6B-}|e3-vese zqAun-pwh?x|NrL+nly>0iHS+3{QaG~pWfa!UnB$3y(o&~&+qU3jX>b&mzf5)ulEiaI)H3O`?as~i8(f(hcD z#Ds(di}HVmzVEO9Uleeekp~EjE(P%bo$+`_<>zbD*2nMvSx{X3)-{|NrlVm=f@rEL z8z0}Ny9Z93=m?Dob8BmSXwQ7SceeTVn!mrUw$Gj|eN+%)brQ&iAOGLWGqba^Gpnns z-{d>Mo|2j>0R$H7?jIERUVD>Cr4)mjh#FM8_C4k{@zVPX*tGYnX%z-$gshvUg zF2h#-Bt@7nfY$weEq-{u{eH>1zrR|IO@o;YjEs!#?5>~x@apMsdmbL%8jyj=-uU;I z{qXtu_L*6R#>U2n_f~(GjN4cB_3)iDSK6nyr|UBV0g~|_A6s9QVOT9ZK{q`yF>y!f zYq7)K;_K^f+`ReY!^e*YH$$A#Wc7gk@Nxh75*C^o9Uu#L?ARdzbP;Pgi?XsZv$VAI z;kVZ15^?(~ejdJg^XByV^W~Q+AjRH;N6+f&UR}xb?8-?`NGK>ON%-;cG5g{B`|BlV z%$OlzVPPS$?*5L0A0GYeo*x%CudbGpsB{{7?P;!>7)nH}u0MNzpw9zW-Alee!k`19*)cVlN~=fhuLrFr<} z?0&s`{`__S=^{2DfEquK`GRi!hX>&v1rzqKSnvLsVT;NZ%p%nVDfT9@DMVmSjc#M9N!Wt~$(69AS|(KrAA literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_add_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_add_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b9585fb1df2c86be1c06a9854f3254230d59f31c GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVAk<;aSW-Lla#OkB*pOmf0B!M z#rJoyZ-0N6U$n30@2Uepa1cZsK3nS?5Rfo)!h`_hT~!dpP0}CU-Zp>!n_q5SQc{YD zkdRo?gQpJ@6OxjWetdq;e|Y-(c*%SFtIvOU|Nnn^7uTo6n3$OA#9vU&+50M9e)`_t zFZcid-{0Tsa~^zufB(O{ZQY;$kCvXkzrXhPGoH)b5Jx4Xras+K^7GW~c7FMV89#n} zeEffX{Qe|~FAp9r{y$wWzVh^`Q>Q@AgczMv_2)<7)&Kwhx2B{l35@yr@v%Fbo}ONh z!{n(G(|-K_KmWqxRC8njx2+x$DuPbia)&F%fJWm%+GIcr4PTqzhAQM&yRy2KyEWNH5E}med2_I zyCJi(vNA~Wp%~OFVAa>x-C!Mg&t=gSymE;3pCxO@Ivr$ll1-7~BWD!XQXm%H1m z!eAu6`;}Wy=5K~SV4Y3RTc4kwUwvk-dA=yOvGMvHEiBCP^772eCKv4L{+#&m=Vx)7 zef|GBKR++7$y27>VZ6)^)|Zr$lJX=0h|_@BzV_FaL#^E6MeFbHNc{imYPRDHr9#7v z-?g+(xvyEf*80nrFZ2HW{{G&UnfY)(FcJM{1e?LkaQ|>y-}-3(b3iVGr>mdKI;Vst E0IQFzvH$=8 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_add_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_add_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..eb76846c97d2a90bfc06cfdcbf22878b2b78c1ff GIT binary patch literal 1303 zcmXw22~ZPf6kZI5TN32R0&-L)jB@2@2dQX)MoU^nZ9#~1Oo#}hGC~J|pkO#`1e8Jm zOVBuAozjt_5UnkgBf&&zl%p+7Nvj4TWtgZn#7ORB`-jkP=Izez|Gsy8@BQ@$(?0fc z4|Inh$cvUr{S3Tuc5_98=R(;o0|YrMXw>9%wt$r@Mkz+lG0aP^GB5TqM1dBYHQN(<&uQfTP>(eUuGyox+Pg%E@##T#_bhyHGlWB3t>BzKKQOJ32uB@xKvu_eT2 z9bZw+L~@%tcM~lLf?OXMkUQsuhxhtBt+6X6gkDgXCu)p%7fF0q?S3FBOZ?5P8w(|? zjMPWYM|8@Jr!AIGTQaZQ^FGkUyR0u?W2F!+rp9YcYQ>NqS)T4>d+l|haBLQiUNM5q z6+WxDeA;czujb~?GWGS*Vts6K=Aw4;`cN4%KX^|4{@p=v3~Dc!y5R?fV^F^j&kD~Z zpKIfzf2#VRcav^*TmLZ|1}fEms0+r1l`Atg(wZ+!RBURI)>ZvGI5am;S);R<00Tvu zKc3DNDi+Q>pZWeky-xN+W}l5Qz*faf6gaZ5&aRqDoKUFR=B_Hp=9?6O@$s=!F*R48 ztb3Frwvo8FIByA%2)0>_wHY(>BF-Vh!0Z@g|83T*D`6ZC|G&G|)X44Wac}4b-IEhJ zw%|Rjy}i+b%9pd-A|z}$JtISDSDU=@c7^b4v~s+;y1LpSILm0zw9bk^n)8UQ@kL5h zRFoi=+HSTO$qgI9xbh9)JPZZkXwkU(DnO!Uh~V=?vc%77TJ zq|gl_cuJEJa-Gx^)l=^@Y-(rP7dLPFlzx7n4?`sFsW4Rul^Nf2%EhkwzP9j95Yg4S zOyc)^c?D_e`m*F9W_#?3Urv+Yq0X0C9SO8=dy;JWf8NA5xbpv6nj3j_y3Vx}pFX~! z3RDGF4(p2<*1t9uZ%v@n1AZKim z3$i1Atl0e97HsoYm2O`_ZA43S#{IpNh@7BZn`r@1h(oX(Cev{0BrDNu&}>dXqfMS* z4&#C8V1natbbpsov*;qZo&7T$9TSsBCJ-#g!6rD8)nx8?(%v_qwVLCP@87@Q-q5iN zJ9mqxrl!O)nXJfaDnX~E-5KKXu-gd<>zwQr>$rFQR~`XJnYm2g%tMFrm@F2{@OH`L z&mGlHcsw2*5)#7YAU5K&!Qyr$MS`?zG#a!ZI5>`Z(h(!&770u;=8&=x92TMr&S z%)(&(x%q*)m-u`>PA-?@vgmYJFjK|dr{g1{Jy92M$*IS^AC&Xg$ zuK*8$$)r+gvF3kM1NBt6eR4-KE_SZ-)=k8EsgGz06j0(s5A rMD~5x1LF{r-ZMJx=L2|jc7r1c3S#xhjEM<`EB0^No;2#66lTqT&l`gO literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_add_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_add_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d5103444bc147625691ec3c5250a621d22d02e GIT binary patch literal 1742 zcmX9;4OCKR7{>6wn~Ek$xp0*IOdDYP9&cYW&v{DGo{kP;c)(OA`&$oWU~0D)Y@A5#jPvsez-}tDqYN#Fh4v3%?sF- z0|Ns9QzQavYXgCVgapP`7G(X#IP;I2tVvam5$7-VNV~gFex8~tx*#Z`2Y)>4WQXZ^ z%Z_AOFGilVWGXbm^u*X$E+&>+h@n!c?xsmqeI#&VNPHxBc6<|(NL;{dKY+oa(N%&c zuaOS-67hNSICJdZ-&)S-hRo3HgbEsEV_`_iIh_>>*)M#$IR9VGmQUMYbC_+%w;%2( z1d_-+lK~o*u(}@wx>~J^W~lpB6NFC_TRsx3aTvyUlV=qBABfJsAKe&-Zs4rnU1yar z$9mq_qHTENVMoh|86RNj8B4>%i^>}too8m^oXaaKX3s%)dLpt0A87%|ZD2`El;w2V@hw>uuRsUKZ+RzonpI zN^>HWWf}GOGTLO=nD?c@*j)i>gu_qDvha3`$}7#w5J7+pSLTj4u&pfrI@xOs*vk*b zQQvlp-|kqeY>C+ z^)B!opc|G5ii#Zo%xfR}+KKr@d<#LUy`9^5GU?$}{#U0E<)788!#!9M=C{TC_tPhB z>0j@AdGBgYSr%Lu5OhgR@Pz3h+k=geTTL!?qbK@q+Mfx?hv945efggjVuv&@hDU^- z@M#N!>l`BQ(0WH04+pq%x!kT(QenCz*$6?<&Qpkvldu7dnZtL89OzM8YJxVUnWL#a za<+4SmJoyR{hh>`P$*09m0UE=Yg$)P?jKppw7_i#_m@or?bz6P3n<&^k3yk&5*FmE zbb;4+u)&P383W))sZ;`3GBeX=2vj&~+wSS(=Rde$?EcC>I@*Z`D;Tz!Kma#g%C}mI z1y`0nY;Goqm~$o3De-5q34lFLuKGuRSTngg!u5~d{wqo9?_4}Nh?ye^uIxrk$iu`l z71e$Dt=^Ws{=XOd@4C@6X!mklhC*#`K0at_yRw>;QpM+I8m)`rhwAn3-{01=EXHW{ zLTYL%0RKGdztV>Zrb4`|ILWOnp^77&pd1J$vR?FK8 zfuLzsE7DO$F~`PFF&LuUnUOf-NM|Y0`e9a(7$1KFoYDvb`pW{OJv}|r&dyG~9$dqt ztLm&JmoG1y&}wrpJaEwKxM6GF>E@jNNBe36Yehf*{0RV4q#I3hAu>3V?gy1}xm^1E z`EzMkR~N%P{}E3YDQ1n-ce;Br7Wm2n`JdY&$$e0aYD|o@K6@&{_N@X$*KdQRA8Us%exqf;uoCnWF0vs4Q=ggUV`%_X5?doDW zFd|+PyxJLv_!*t~i(iX>`VkpVVjF^fsi`WxxO6hUD2%%67>UCu6r|S$yHMIsmoGP) z!M=I<>4!J_R`2WGCY<`_0&dH^1Dvq?7~^ zArYa32alhoCL|@L{rLQx|M2wn@e=p;|32_x{=@&)uB<-|^z_#4HK>JZ&fZt?^3!*A ze))g@|Nj17pY!1R`}_ap?W(@~f3)=U{r$DSpYdGghBzuAHTCI^lAot;1FcHB+QIkE zzT(IKOHZ})BO@a%C4c~8WKz|iAB9)<*Z*&Ql9JlNWnvjA*;fDmAGdAYpB-I|jg5>D z)2hDy^3{-+=Rf@a|9{DU|NeRl02%We`}^A;UVUx8kOv5$=2d=t)Y{g#Pww#g`27-g zwZD#h`29V9jahL~kx>BZCk9KRyUHH#YwBV*>(+@|42|c^MRdj_uG1zLs+G zP2kG@$440=KHUm^?xa33mvPoieTCazi@5i$?o+V^J4NNvMo|Vu4wr-f`x16fK67p( zLuZa72Txws4F5}o^2O=*I#?TS#_w45BJT`OL&wo`d)_5`SuyZ~e9`p0_4)bv)o13K z=ZkV18?WEd!on;sFVC!e<)*xST}s8jKbD8*@2|I4S66NI^zwSw@RAv9Wl~B?%98{j zP6J~5+Fx4^wQ`FWt-rq`@&Bu<*^V=m3Jo`Y*U~!WzGm%O>n~rv%=`EI`+Hkv=EMEK eNc|6qab|`Sb@}#ND&tOqJnrf0=d#Wzp$P!{gNYOX literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_remove_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_remove_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c882c2ecd4d01fb4679a3012a4c2f69d88c31d9b GIT binary patch literal 1242 zcmXX_4NOy46n;>J0_9K8wk#P`5SL{GTIbZEcCg|kia~=QYT)%1=z^Ja_|sz1XGhrb>6RzgV7p$fs2l>*_C5hY-%0;~d z>X;iMr>g#~J%2RJPcHu~-Z-kv zyUWVTyZL#a!3cs}R9)gb7vEeRo844Z$)5?J0T}KV&ENlL>Uyc#QhnU^-@~gUJ+0(a z#D@3$`H)i!t`k8N9A#x?WoZw$L@5*s1~5g^3rsJ0JEb`I*tWR1IQ&8)mtiy>;AQ{| zNQjM(8FUb%5y@MMi(BhLm|%)H1P~x=Zf>4lYI;c<+&UQT>tX<}YHKr|biHFH=Z1wT zK{;4mF-R%+{IGFhOFzDlob6V4T_%UOAn#bPO|%)_d$gXnZRJ|MO- z=ANLo4I9^WT$ahE(*Zq6wi(#5PzDw1(;Wn}JZWnA_YwjM`2@`s~9>a0mW;Jt_nc_JPA#{?Q z?b}Uf!3M6}9qCt^{R;ej*aiJK*&S0j|r?C&~?jXWNYq1W@6Uau!& zQ>RL$ntph7idJPB?`b}t9 zW73frG4}WRR+J>_k02HNii@gmYp(V5i0&JW{br-l`3MY~4mddu9Q9r3l$2I-d8ltO ehadQofKF4O*b~~HEELU{@12{ohj%R-mj4d`QgLSh literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_remove_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/round_remove_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..05285c49f26a607240e5de80d9c3c30659784ca7 GIT binary patch literal 1650 zcmYjRc~BE)91XX?${`R5jRuiRQ8_H62qc0aW&i>400)L7L>b%B#t4{l1v!ET3YKUD zp>zaBiqvTEXdxs(pn`x{MTzA~K)Fi-1V~88c9V3b{bTpr`S$(ZzTbPlZ?8oi4c%;F zX99!4Hsg*2AA?qV^|i?mx?f69m%?C%zPRAP*_NIZVB-!GG5&vO-6@r_+@w&CU`{JSac+M4OVY1VXWgQJo z`%Dg&rn-tvSCV=LS&0$B!TE^b`~pO5Z0x4>>HaD#@ck(F40U;OuO1q`hVYF;py2Sk z%-;s|wB^^iS>bFSE~IUKWokz~!la@N*6dqU2?WRiN7`R?Eif-}m?LYlh%Zx9#7` zYkQbH><{ZwaEwRmW+M$%stpC${r(~7p1@UZWA4-fgUm6DJ*OUXvX(yY3V~PWxkUb? z;$?n$J)~A!J!Gt5BL+U0S4)=bCw%`f zQdEVd`P?qO6NnQHz#xkNHrorR!e;r%r86<#u#pT zJn(?%07O<{zB>pv(x4jpJU7EU0KLFR_VFe<7OJ|XM!$lA@Ox*J@*w#mLy)BthG0~&SqKHj!l}vESED@k z&=$uH_)ro!b`g`w3=9b|c(haCD?p6$Xzu1#+Ta*>cEF*@?1Tf`uPeq1rF!;0rrk}? z*e?z2&!HoNi*&uL_A9o)$ZKu&*D*J1&}>t+B*tw|GpLVtyKxYeDeS~mS2sj3yfD4fFH!yC|)!L|&8(1i?@Wto@=k8cmaU z5=kaso{CJ1za|#(3rW7ZBRWMzMF1~*gQR|EY^Akb0~UVylBE>!Lv1WA;dCAiJQlFE z^+8TqSs7GW3~)G{VgluV+!j_g0V}fZ7@NRA9Xe!>mxrfkbc+WO@)nF3f4!!7h5tJ#g)2>|bK)nBjc#E$ zoL8n|_2#UZaD1FdU7h#kLnlXUXkgH8s-9G}6Upf@G4JU{<|q&4`pOLvNIOz?aIX>s zY4k*1wx>T;meV#c@J#0uL5mN*^Y19=Bcdg`i!l9FG48hNhCvKvn=qB=W6)7`Go(%K5ErZEX^X=nx%}m9@0A zlyc~@y|(DwB!x`oP#4ETWaFJT&?@;dGve^!a?#u%3xLdZ{xsFl&;Z28#{=dljJmZM zmOvmNo0;9(Iz6kE+Fq_cSqo27KCw?!AS*ca^}7KmudlDQ ztE-EwSlvb!W4W|jx2~I%G8n^GA_6p0+T+GEK~(~AW%fhH!bme~uZznodnc!EiFgdF z@kl9OHma>V1BHes5D4n<@I<24?ds5CTL#0LMW@r7$P@}uhE)G@A=@2dKaaFzptGmm zB-|`UVef9W-a@jlgr60PM1i=UdwY9K) literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/rss_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/rss_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9f4984a54ab192d5449af8e1f8405f17d95572 GIT binary patch literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU>5XraSW-Lla#OkB*pOme^QI# zJiF>`|K8p%XKXPsFgE@#An@S6qOPjwi30}?K-DAwLB*#pFMqu@&-?fP*VoteP7h8` zU;lso{T)C5|Lhk3EGZ!&0a06W#*vf3frt6v*Y|p&LK&K0W(F51CooKSRc7va>F&n4 zyML=03$Nt)095_|f6DodybKB)t_Q`1FT7HJw_m|jHNc`_`$64?S9WP^4Js;z#x5)~ zf12Jgzgo*E2i6jE{vhW82M&e}0XFe`1;5un=keOVl$+(#fp@3QybliD`Mrzd?qBA< znT+~ilKVS#>#s*}UA&0|7{W)ezO|jqRYccOQ$Ql$8Q=Z@Oong-BqW7t30)in^&!{Nf zsNQ^S(W)1DcVvx!H}iuutDG_9WpLzRIQZ71L5%f>c`Hj%%Ow3emNW8u63cJKzUzDE z<^po*szY}JLw89VCqHBSzzEiOVWA+{z2@m3HKG>$pHvWkpyh_}%Y^j(>K1SGjGbL3 z%=B2as-S$AwC4=TNjtu8dM^71>{FYI2YDL;I1XI!JNQrdTeX9p$^*y8Ouliy*j_!G z(|sl-?L}Uh_}Bf5gakuGwSEdh!k^{fM&1JkKzHg-5Dfhmf4ulYps?^#w;z5CE>EnV z*M>~pYkv3anSf9i7GvkMNAG4x&g@+Gl{p4%p~_`P-UbIA*Ms3b8L-*ES9@`K7%}1e^N?XT3AwA+O!!K znL($Yo(|Wk`}gDE&;S4H+y4LmZ}=xYA>qgW_x6YD**xwTJ1qJ+yRGfm%0-J7y{iBJ rZ!Z(nh?JC+=AA7(AAq3_40dJ){pvF2rf-q)KrVx)tDnm{r-UW|FLiur literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/rss_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/rss_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..38e360241fb58f4b346aeded447a6370e6a0d1d9 GIT binary patch literal 1461 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 F0swO*7B>I@ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/save_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/save_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..3934b5c5ba5b9be5b369f4545e1ec3d2eeda0d40 GIT binary patch literal 901 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+VD|BJaSW-Lla#Q)5Gcs-|NkOO zCNQ1UVz@4L|HrvAJ3E^jCr*5L_4ITeF0M~JbLPbG@bLWaGWj#Idb68p{BzYJ_pX6IisMU z0G28Ed@Yx6h6Pwt)9erb?GG*O>FMG5|Nnn`@+8JdauDMVWij^ncd?#$^-pmlBUr6d z#E19tZOiKa|C^Y~xG55%tSS0KzmxofO*~*Fha_Eicm(7pBx`I+hHBdMK)#L5&CP9* zt|Of{ zh{i*+e3mX*;$b8s`^UM986uW+=oyn2W04Ao`~N@C3E$t{P5$xwyZ)?W|22U0dtmtS z@WjN#@JLBXX}n5+=qkCik(WV%hxwp>!qhkWrKa3a+~Uz8`EH+YuCQQ;XtnsvV`h^k z9+@POe5ty6&$~)?kl8g5Jx3hel}@Q__%9;)YJQWL6k9>*zr3v3@0P8aQLHHK?cpX= zJ^PHKi_P8M8nBB(E*bJ2P!Krc@VeoD{nQSR4cm_{bw0&y)0*#K^=7YRazN;fw6))} zp4E7$&+MGy;pG11UMELRaOjq6b*JmVCfJ;H(866GpzmZy4IBOPymnPUi(865^bL+ z7k~c^c3o0RO3D)uP6HCnksiDsfC+OyFaqyGQpKWal@<^dGsCOAd2D7qKK`H>^>p=f JS?83{1OUtvjV}NI literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/save_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/save_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e619e231f81e180a3ea4f8c8975dc7800ac42622 GIT binary patch literal 1134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVu$X$fIEGZrNlK7N017hv|1VX* z0;ZE%4A;f&{`dF&{rxg8xQ-lg(cJdr>gwwnHGF)1>RGF_Ht_%fL`za5=f9ty+nxQx z*Ny?A! z@8wc23gs0n_|zI^w_zKOl5*Q$<{uj;CO#yY`-Ar7oL z=aM1c0Rs-_i~5D93(WPn#AGj-cwG_YKXL6gM?KFB$(f$z!h-i}cPx(T=e~L*TL01R zBT?cGmnPand~uTX|G&S^olIe2VQs*`JIpI8B9a0MxgY=DT3X}};-5MbW>$o!380%uOMi~Cm(Pp<3byH0)QcX7$w`#x&^Y^$@+ zqx3s$6Qw69aH=>8HUBxOV)I=WWWxXdP3;XcX1q8zT|fSpe(bgyVRdo!*-Khj4xgT` zFZu7!&%+-edV2ewpPOqP zs2#p8DlIALkea&s=>>}yA68heaD2kdnXH*}{#Swg@RE0hKd{@XhW7ymprclWKjzrT*2 za$r`_()zV->C&4YfRU6B&10Z=N^F_3y$6_NeOSH(asL6P`5(Xt`Ckt)dC}zB9T2t5 Y4C$g*|NUUuTndu$boFyt=akR{0MbqcsQ>@~ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/scissors_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/scissors_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1280ae85e0c2df38ffa9dbb79b029ca2789f7807 GIT binary patch literal 963 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/scissors_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/scissors_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f8091a286ae4fbb8554e7d81316c6618d579c08a GIT binary patch literal 2251 zcmX|D3pms3A6Kg_%+ZO1S()kJiE5h1Etf?S|3aNYB&6c}&rx(SJHvi1S%fswuvn-6 zKT@59{s*}Xqq(MZklcl`y-hO6HOB=}#XQs-4vHe`FaIv=In3JuW<0gEaytRJ=R>)f0c5HQfQDDkfA zX>D!wPO}RP43x#owM11<{$}$`G{0^NZN7Wh&G&6%d;4KLffI!={=wbDGkAD(^q!%) zX?TLCfzs7v0tbSL?j9b*>YAF}uC8v9oKrPyXivPmdsM=c8`@kx2P(h6=KE$pLa3Sjj=wjN(;E4=ftuz)*X|7%b61Kc)g}P<3;9 zZ?ENBoE=pNuPlmS5>+OJ_W4Nu@bdCXN~@@NIxg#E5@1g3;uo0lpZ&0|wvLE*S4U|o z(!%4HJaS4JAenRq#*t_;()p25_{Qre66w4vujM%j5{!IZhvq-Mgze_WVckuevUzuv z=oqCAIyy|n2nQwbhx%9;k}pdj?z3)qS}2?=FSW9=Oy`$h?1O_jG&v`JWdZhNRmn8b z=w?=e5-_7wTU%S{l)kkm%}>HfDe18JHuHh44|1}zdxNWgoq@gCPI68( z@F7S2pokO+X+2Geq>gV0Tm7Q|{8x#A= zf-M7UsJV%`xw%dK?S~DGt)^8F2*lolfin8-#y#tGbbRUQ%$>XHC^OlD*}DgHpBLHH zU%%e3%q|rFYz-QW48+qg@QRI0nKlK!fk1?cS(R2TYi2Ps7%M`{nuPH#~d0G78XXC8`t2z+9WL}3o6Ap zK}%g?5udYoRc%&s=gys+@_r?WFLifnBp7a7-Hd1N21^$>Q;23(E~^YQ(^L@^ncpi{*gD4jecg ztHiyzK-~#aL_~=`#2+VCA+~csz;bGFvD@u?sbU73L?gz@mvaSg3+>UHHjT{L+1d`P9`y9I z5=tKQp$S0^r={{KU4)j_E7XY-CxWA+CC^qCaTem4S>j-Qtc~8#&TkccPKXil%_}P_ zEkSQ4IlBc=n*jG(BZnHM&359SN3ASuLHdT>4FB!^eg8IUb#?X5ZD!lH*Tk<_Bh1as zxn;qebp}pxHwdPt_A`7KA_19f63_P^!Cb2SCqlS48>3i7W}+t;-L-u?$BXS`nZjf; z<#Q7~Xm7UTnHO)~?BEuA@AI!21q8x<8RGQZzVompO4=rH14@G=TQ4kvYvh!4ep1W+ z>8iA@vi7qIjn)ub7F2)wI^$+&b=>5IXLk=UT}H=7F^>Wpnhgo2kgJPJ+&1g@h=>S6 zW@g4!(NHZ$nZ30f_Xgjt=5FmVw@(Lx=KAckGCt97#z>o0)Z>vv7{&m%Y8GSGzm;zc)q^ zmn8pW>gm~y!8yf+P-aI}lM4%XAh1|0Hxp}v>FPQ-0pRDf6r%tI-W$gOI`$=_G%*op z&kpzdp74yfc^dG|&3l85+S(34M3x=*U)vo0heBq@t&I_3E?-V5$}1=c+f;EYF)`73 zPXa9aG8AjQ#g<|?+MZ*IUJV>_^2`!|;b_()<;~`zxh4#>1|F!JL@X8uczC2$`jrK( zaNF9%ZEY_sn3fsX(H literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/script_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/script_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..74d7ee303d43c12e070bd34e6fce38f54b6ad2b5 GIT binary patch literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU|Qno;uumfCn?2&>HIv~`2Ww| z-ezE9YM43mXM4wn4_t+X8(n~k8UFuIYT?{h{eR!LudlEB8W|b!`1ttn^jMhG|NJ%e z;m60vd3bnyc)Yr}EFr3!R`0HS{Vh2#P*Bp5k#Wzq`@3q}AHJV|pXbdR86KZAXVRgD zHhI?k{^r{@xmkGqv-$S*Mt}bOo$VMKJJ&HLrsv`3=jW}U>KZ-&{r=wH*xM_*p7H;` z|LH$|epWx++C5zY1S%>j!K*A1z2fKQA$3+N4QI2|xbNe|Ud?JQ_gtnlD;{dft#xmK+U zXHK0u)zQzd&#`GL?_pMmF-eho)6Rb0o_`M%U~?1i{^I4?U-$Qr!Grhr_w&^M|CcHt zDw_J^8}C(^`pQo~I$bI%B$(CJ)tQZrje)K*W>yZe`uF#@`Qba2pC$Iy{yz5M`T6*^ z|2+Tel%%27B&MhT|MKl^w4I})W83-p_QnRl$Tm=#si3EKPC-lQ)PX~X4t;oYGng$- zE^dko6WHxZMkXdP`>MaowVCJNJ79X~(&7LA|4YX0sW`Y`&6*=0K0bDDb8hD|mXMbA zcQu3BlaiG5XueJAsdL=V&(HpU{DUpihRwx)%nUBrPnkDO>@Uz)(+vtCYMB`xPkv+N SpO`cS#P@Xdb6Mw<&;$U`$X1O2 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/script_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/script_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..f46d5769992cc86e3281a6d68f0dc26560ad007f GIT binary patch literal 973 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V4mXX;uumfCn@CsQ{4W_%m4rU z>}JX-I>L~a_Dp`#B%xfVrlzw%)eQgtC%H`j^XaMgkLLFNuoI_F8GQKoX;R9E^YQy7 z*2V5W_u=X1bhf;_IJQ#LsT@!ZPT^nv{cSfEW-d!zE`(NJ{?u z|Nry{kTgW`p$!jie}A8K=gu7!>2n7T9Qg3@u{v8>Sy|iv|No6QY}{m6^ZQ>cFT^2^ z;a~p#E|&}o<4Ig}V0-?32@_LO$s0FrNbIPrkeFvvsl^OdcgWx+P;|KVSX3#%2vND=!S(m|dH(MSd{`~tpyK&~snGbIC$Xb(W4(8KlkUcgsPKrxxcSA zc}L-6w!pUH;$q{Dt}dfLe}9W-L!F)!xjpai=JNOVJP+yq_&GW8^tD_b`??zSj34vu z>m`o3xJp)3Rw{}me1!Nksq){SohcQTKw?$_xC03>i%?G zWrEn8^z-9m_QUUiY09qt-;l_=dFJ6T@FfcUq z=GKIRO<%di&hV?8N|6Buck0G%+rGJ~si|!QCaC>D{6C)!2q1yL%#fiN{FVdQ&MBb@05Ck#vj6}9 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/script_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/script_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..fb4ab94b9434b9184bb2e181388a8ce2c26b49e9 GIT binary patch literal 1173 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVu*7(}IEGZrNlK7N017hv|1VX* z0;ZFWsQ>(RcJ{yL=i@~JP8+4AJ(Hg_NhsH;sp+hNAw=n+mks*y`&#TPeq^++S;NCD zudnYa_W#e%?uWO&zUGPFSCjVO*|XGu@Zin|4+6gR42_Kb{Qp1wAxPT55^l}=`}Hddi;IJEESZ^^4=?whFLC3hrNqDg z|IZ&dcI?=PzrXoSXUG6m|NozK@MS~({gjBvLa)gz`)YrmTd;EFL6D*YhYuhA@Z_bj zBvj#{%)|AoBF-N8@czC%TbY>|8!s>KisXHU2FAvRpE82YI`p>T|9?pfOUspyI_&HJ z8^!D?kv#YO$&(tUWM+thmkss*|1JD5-?rLq($b)yARZ9#@$upL|Nnowftk^fS&xAV zfzCQ4&2)oDg?+*7RvxIpOzsbvi_fy@COqJpP$jM;9bJ)T0!$0QRhI1AA|FJGFKERoKGnPT6_TVmrA|5ADNn>F{kO!TS+-f#;h{)tcEjZzVj;Fl~o88{hA{Ww)v1O z)BZZcKYxEue|UX;JlI=KPEIb7e9Q*5XU?4A*}pI+2kJD4%HQAl<(QT%W1S(#$H&(; zzXIw5U=oSnFAxZf;{yv8EO3~_EN4>z;xO>K-U);n@VFsfgU_Pohk+-bfUvN05yLwH zxXgW?|Ns6rXNw64D4b+8s1-1-dmI7^DsYGbQ&{4T+TUiLVuu;T#l@RDIyeqOwKiEN z+}!l^{QW(Z%8ZZy|NGjV`1qJFkA3|=g`1y1QQ6ViW%S|GCnKN_#q;$b)-_o_xcNC< zNb{s7&z?OtD$yN$X=mn~{P6pGep@^+Flv5%nfdT~{vAGu>YC|>e88-9HG-Cy_jl!B_}Nd*;^Gr+tj-DX|>&cMaZMeoQ`If#9g6I*A_ zj4b)r#2Wnl?Okz?X=g1OR literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/shield_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/shield_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..62a77bd9c52a494e059adb0a80942899858fa891 GIT binary patch literal 883 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV7BsfaSW-Llaz3PIq&|?&p*D+ zweJ78k`buj|No>zsvm!yon0p;CN@)l{{9nt>OL=%pKb+|14=SDGVJ>gQpfQ2-MiX< zfBy<`aB`ji@!!9DpZ4|ZS0@Dpd4~JIzkiwDzkhGV&c=2} zT3UJ{Q2GD=EC)C8HYf-J!v(}!eG=6qKPFbh%o_=3#u|3#~lyiZ+3(|b35fmR$%7p~-`+0g>HYuz zfBKK_@8u7lpKt#V$hglVZ(o-rAS$@`_<;ilAX;n=Z{$4Sz{7IzXyd2y|E-eS73y^k z&OLCG{|u{u;Q4#<+cus(qriE)#5}arOUXF$dlh3HP~-pqHfJ1p4=9MZ9Gt%DhtP^U zYCo8n#L6}wzbC=?nIR-pzIY;wr^g{PPmiWtmAfhP58uAU{(%|n3y>291RmT!eBeOA z@0XX;dF<=|rTqBw)A;ao{dkFewaqTtHV^*&Nv!zrK(V=j;eTym;YV2>Ab`5}(ni4s z1E71e*)QqRX`-308zBX@*-(P2FU~Fs*)HV6xla;|dMn;>|=gygP zXu?;BJClxxz0bbB*1GQJrBv?HQq#8Y@9hn2>OReI^bdcZl9JNGx+@Bz(#fo0A`ogTe~DWM4fpA4E- literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/shield_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/shield_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..4765c41878ce6b378df21f63d22ce5c90cbef174 GIT binary patch literal 1275 zcmXw23sjP47{)N>6pwk?f>Hg5(`8n8X_hksO@~hH$ZFHPpwY#Xm9ecebSa1^T9%rZ zgB-k+wVIukL+A0*5eQIcnbtgwI;AAuS{(zm1O)znpW^;=zW@K<^F81DJn#EG?}dZ| zG-t=p98oBgb4+yPx8RFgSq>QRe#H(mqEPmVn8@%$IrYp8qTNgBPqXuLq3kWy%^v{( zf-p(nPuw%;PKoO3j!QY#ZHw=$=49pvyVXsSqt&!Xvn*d0pQUgtMr1-sLs~UmrlpZ4 zidOY{y$$r5-$dcQ8SiBySTebF1DQ-l`}sMcot(-ZkDWJ+SS+T4!b%Rn0=m6J0geU! z*!7QJ-YI$f&|&<>E756MT3mIMXPvU-wfG#kiDP%sXLtq=94hZ_a=*gC~iTX_+ZSCl7q z7f}doJ!-U?cPl}o@Eq7OsDC$?BA{?#`LwOGg|r2Pi{MHn6E8Z?vX&48!NV34pNGIE zr$qFsjKUPTYRJOJ5de`BJ0w`iMNCThU#j=+H@Ex`817#}h2+ii(q)`*tl3IHb76~! zS0OZf9JgZ?lX|7w8AZgZ?oK}EM*2kel>OLDEx5`$6DuuD7Kl89JWqz1o;|IiE_jlt zZrSDkyy)Hw1R@9^?;FgWdL-^-6~ErOKiHlCn-;%N>NGO^zC5FxxYLK@cw*<845E)u z@Z<-v8mp0UOKv%wLucGyS551eajZLMTBozO-;=&y0Lo$`q>dk0Aw6ZT6n7_ z3uIhG;VdvM4OBqbbZOp^oO!J`zp*jfrA-9HfkGlA)YR0|cmm-?!z`KM56tM^=XOjf z%{L23hLsFv1LPkaU8)h*)}~!L?X!AFu{AzEKCZ2m(TmwVWj5%rpufkBur*ZKc~*nN z;qmmsxfMnLVCGn7ocY)J`+a(HZH$UPs7XmV!kahy7g9R216CQEAqvOe0$T~*&-QWQ zA(ml03=Y)%dPG-HhUr;=|g& zwRu;0-%62;msI2U6R<+;=5d5Ur%O< zY_?ULvcvw)=$$dP9K5yt*s&Y(i+@PzU4BBc% YqlmQiw91%mGb?dS)Pcym5gCR50e5(Ywg3PC literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/shield_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/shield_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f174f11009115da12013db80bb0c92130373f5 GIT binary patch literal 1789 zcmX|BdsI?+9=|9;=|vcwj^G0m$C+(30X=D?f`jysozZM^8(mW()3(q|JxV@M%14-w zYG$@LV}sRp>g;xu%u&}A6jaK5jN3MrW?;2qritSNA8_wp#4~@~d(ZjZ@8|pbJbvGw zYW1A``>;;s}C3l=+wC#Kc1FXI1@aS(x$iYmaOX z#&Y}uS|VMQT89nxoXJagKGRM#jVxLZ%*Wu}l_` zkWeWuEw!uH&%AsHwzai^0)YT5f}s;a=#7sWQ7FpDI_u#=&?RZQyBC*78j@}`BzEL< z9!}sjE@~0bZfLp8B_rq@2x){-(zdB%B zpZxo|3*mUc)6fZpY-fr5PVLRZxE(&(+6xy&RPK)L6k0E@7j<-Oi{6}@t6Sr&ir87ehkqeKT}@{A z4PM#FNrfTvPZM)mCFsd4NY+hGiZ0yuv=TZCe1X+hd9p-=G=`rLHm#}+>&7#}Q~UMm zTT^2#XF!!o)pB{@kIk`PXjY>=SzU#|pTlV~iY74VseD*j1ec{giXbBAT5y zdlv&Ncn!(-_Q~E~X<$Z^*n}9!oAG5s5@*A=Ka5+q*20$>7k&8&*cDd)1|TOKL*%p;}}tia=Ho zR1#w2;av`RdwW+LAATM{qtV)h(D|?8;@XTn1Y>w87 z#i)h|uOI)Lg>iQNo||nM79?C%1`r%<^a;vY4xuJ>BwM25##B@ub6i`{<11``ji{1J zr4#R;-39r#_;@rLJ$QQzYekMy{xdwB-YPOWB!VyAu@J^7cJ znHdmIW+oH1Z97+2S0^X@baa#R%g>u=!9$9S37d8ho_~u~8|SnnMG@@Sf@a_fV93L# zeoAMT?hBYm7uj%r}M%C>% zni@|~t0+9aVqOpC*6VaSp3tB}sqaS1UiWG=aZUl&6HS={9387&6bj}iF4TmTrT;xW zg7NqF7kVvO&UMtPg)ttFS3gW0BK{m&xE4aEdsSb$^nu~EV7-a?pZx>C{2Z1)$vC|{ zgHy3pg1$a3C}S0+@OZr9cW3Ez44F(W3(5T$&|bK{d?YF=r>?1KF^J!9jgB&kLZ;h7 z_50eOw6&fjrATt>;L;}et!B70{U^g{>VqlK{Ov+`tkgH`$y&P?%96+d%RpSR5X<>EG&!-2-@oZ|690% z8LaM*!GpiQ`ESbG)$!~q`Z{ZB1A~40njRizVc|o|Uw|A7w9ARJd3E@D+qz$GZi5~gH+9V6!|NFbQ{@)+L^n`>2sOpJ-KYd-@vu&DM^Oh+hZN4Yi{`~%Z z{^i5P?x!Vy0HP?#Y5I|;At{BGm6mPc>*K5q4Gat*G9ecZaxxh3FmJqFpV;iV^B>bp zhXutGTDGlFadh>!%4aKW0mVbYr;h#T0 zh2L@U@$t0*1I@UjgF`+fB%~t=;VI7M6(>AAy}i3H<=@{w|Hqe~m)9GopEvsR>+9@? zx3}l>$lKSY{P^}(`tWr9`I0_8y|NLJk?}@wUnL!p3gY46*pWk) zeraf6WMs5q<3__bH#bjLG&g5o2lO1!nTKYIgY>((xOjANbj#e{oiBeFXp7{&y1%DB z{5+j5QVIzyr5Q78YWB=MDl$6$!kQi=aRZ?bVW;Rw< zR^|p`b&=1GnPute&qHUM=hyAYz5Ok%jPKig9UUDuV6v$F0n}a&F`Su!@iLd0m`dpr O5Z}|)&t;ucLK6TK{7f$Z literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/sound_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/sound_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c175bef39e13afc395ea90553d7afc81826d869f GIT binary patch literal 1172 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V2Sp0aSW-Lla#PPpyvO-yFZVe zjn2=%zw@)iY#X4W|NoN~9r@5NZ=ZU<{zF0cijIy8-{0G(Y*@(%mQ<47Tm60Cw_9Il z|F^IG_2oYZ=*RB+BtP2IHVzx?~!pRcA)-m^!CSzKM683+#l{~vKS9im3* zWRrdUzYhDVKPjir%iH^gOqnVX5g~A^FcK<%3oL(sU-5SybMfgtYkEw&9`XRe|9^iE zui^*Wb13`Z_Wb*EfaW~<{P3}RzxVX@866zl#vb0@#s-FlNh^*%Wrmn`$iub%-ygyK z_5TmvGfqGMcYpQ!fAj9|uNU?3^ve44`+L7*SQy*thX&m9?5fQ`{`qs_5me`ggNu*% zPyhS>`+d)7@5znL&CH1meF_fK{(pFweCYRg`4|ZaiIhZy>etuv=cuS03FJvnNJ#k6 zuFNsvsp*xg694}HR{#9ul?#_^OVeznw zuLj2M|NkkyihK+A3TJA7d2>F|HTm)ODjk`}f-?U%E?_xsUN zZgp1HN;W?~za2mR|7Urd4zY334Mu)>+grasKlfJ;4Hab*6AO9VQ3#P!y3JVs?~maA z+UM_P&bO~WrJ<#f5aG9m87g}kD*OAKq@0|bq^71Oo0^*2npbe`FB*WlUe*2ncK6-y z@9)*_@2kK5^Xu#7M~-?=Pjzv1l~}TLsf2{&#%Q>ahh8<<*Z=FVultj7^Y-@qxq0{Y zoIP;x;JE`QkDgS}P&jbl?AfCQPfvxiMM^eB&UyHMe?7}ph+}{{-TUSBf!55Q+}CHu zY;A45?4ZjJo@MV|UQYkKbcqVLgruZ>QZUHv|NkF~64+b$_n2pp6VvLaOROIJZRh6< zUl+H#$(t7<|El5t|Nq7Xg@q4IXGE}PWUVm%^Z&p9vy+pTf8Mwf66}XwGB~jbzh+QV zQ)AQg)NBi1AOAZMYW|{~%o0FgVQDE*_wR>di!a>R`U)Lj=-bCt=I|weK+2)G_Ym`H zE*o+&7;vy04F2;!_%cWOL&;B!p8KyJTEpeBXjOr@n;_$)88hE=mb-gTXgSj|bMD$| zm{a@Z?Tu=FerkOP^u0vUo;`bb@0Iz_;SAaGhI@66*@Z_I%0%ESv^BU zcU4cF|I^5RhjrRB)6MD0^-${>Br{(oPhTIiF(@b`<-vmo2|qqR=Rf@Z{(i~2|NqV& zIC}KxhnJV#JKk?-5%A)u`F~Jhk$>^alzCjjcL~ zZ@c&y^i+E%oMJ6#*3RQPQE8vGcYV;SZ5<0%tvP7G-NErTbBA?u&r4wjfm zHH#h0IedJ5;ygS&VL;3SbcK1%w?8{SZ(iy3#K%oG-4A-`^Ftr=rs_G_(~I zE)lXHe}B(!ldo_B=UHI-P>PV|;^LZ@o{(VCpSI)2tE<_1F*}PwoqT<#f&!Tbm`INl z9QZD8&jIy=((1rdr%wGc($Ki@;q-NV{eD^db06N{w{HU_qnh8}c>C&sf$`z9dLk%W zf^66wdgkE4k4lD$j!r>NpN^~yUM?vip}_ebWc>a8_37YH^jC6%C||TAQcmDOzNWHr z?WY5c%{=k@YEl!@)7#q*@GHqcm3Zw}P*FK@==AN?pO2gr1{?C=`E!Utz$C)?iWO}0 zqNw9X&Rp4|bijVW>l+^*^Q@2Cp9V~b2WGlXgq9~)7f{rm(PS!byu3 zKVBcR@6+#t&FmoGrzE7LJUN)o4>mDonju$%fr#_uq|$;7;)U-o-q{;CyO4v(IOeaKpqD>DjyO{zN>P(;svyEv?$?v}|$=;LjVhSYp3pfFH8>5%Hjudl;p0|Nuw z{O8-vd|(U_Ka_Q#onL-aWMqWJkDos!EN@7nB zJ4kWU;_3SFSLfN3{`$SQ`uqR?KR>g(KAvx1|Ifba%ZvXfgO~5$U-NU7Sfo7IRVfz_ zaxy3gFduAsYaHdn#UYbY+if6w=J2;kW}X?`4$*0BFB5*>-T_wY)Y*DIe&33sf+B-I z|NhQ?`275Qp8R|JQh)sXtbVv(-d@7O;-=)i{r?l%@__1rPKh~V$jG3;!@OahNNj|| z2ZM`mXH2NOBfwbMbn4dRmRyg{4ra|nX&IOD_4W`Oe9jmOf;1dBca%}Cp~@xRWQ%n0 zG>wGE6^#FxJRLXf-p#mSja7Ev+)(z0t9@|@Ap;kmvp_PmQ3#EA@!4Ez2w0f8V33ybp0moL9x zxq9{6|NsB@MMXts@bK`+u(Go10%^&x(9o=3zklyPfByWp7cZXw0IF97>JwmOWMl>V i_K>9V5l~bEJoM4jueBUV3xHWWDpPl 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tag_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tag_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1cef10d1945570645d5a584f8bdd785f0fd03c0f GIT binary patch literal 966 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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/toolbox_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/toolbox_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..54646b69a4fc322a84984c2c1e1f6ad84e038f80 GIT binary patch literal 1121 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVuxNO?IEGZrNlK7N017hv|1VX* zf|pKGaho`Er)y0{#1EFp$VkSdEA@YVbS57DRmyvNdv2!65;3s$B*kM6>FL+o4lvX+ znwgm;O)>uS>udMJ_w(&tEP)Du7Ac)#oHJ(*mrsum&wTsZv>$(;^T%!V@$uoYxpRl- z%o!gSONdE8b@%txr&s*@V|nE>^aNG%V5C4yy4kD)x&Mw*B#_lE`E#Vv*zXl$@W~{2$DVGV9)jYytmwvFDoSu zTs_Htz--&aNeO8$-nVrq7>Dmwc_qfc4^j@au0cd5eqT*$Lh4`75RW}oU%MJRJ3AX& zStqsq|NHy+hu7Ej*#rdzcSzVBICSXHhmXoC6Cp0`xw4V>fB^@?L46rZq1hY$Tlq9N zYzw})V9f);bvqe9%51QP6?fc9Azj(uDqniK!=03c>KE8st^7l90=8YQ-nfdwonStQ& zeEWKdbMtIZA2@f;?*d~|QWDSmd-VwgrG;srD1iiQ)9Qc!-^({QHYzf!tFy;3O8`OK z{<^atet*xmnBUvmd+^k$E=M1qo)v3q-rV4{kOoIbll6o9|Lb}FOLm;@TC`}9%gV#7 z|CC$}!E#O(58m6i{V&nrmync{{P*`a_j6F%0Xo|H!Eb(#JHY6@d_@qH5by8*-|(3c zCU^UKK2W4S{m1wB@&{uaI1`eSlYe}Bt33x8bU@ueV{evGI**9$3 zWc269N7-}000l~elVCzpl2FCxXS|0$KR+*V<3@*e-$_<^yPA}W@84vZg@q>{*6QVP(_1?@|BK(yh? a{mcwI7dh)>*v+#Bsq=L8b6Mw<&;$UNGyo|8 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/trackback_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/trackback_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..15bf23a87d62015716bda53cfe64178e4d5a6f86 GIT binary patch literal 689 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV5;zRaSW-Lla#OkB*pOme^LSv z{P^~F_vf$D=J(@v)ja(VV$}WqcULm@?C$dS+4`~jKK;MB`ML3gql{oJJ|}nbGAQsc zJLu2TtlY#9#Bg$prf=(!t?Udh-u28l<>Ts8`u(GQ<(ezYwr=yvRqEfn8?4Rbicu@U4phUuDIo*@;|CyMHZ}) zJ@daBKqtn9qw&&}fJlK=j<{}4hlv^$NVCqFAm=jee02MWI2`1t?CC;R$; zDI2zJN=X4)3RDRU-lp9QX-azH4=1sMxglpZaxxh3uxzY8@$a$Rjo!PhOT=C^=Ly3VqIQAyzG&U&vYd`q{L*fC6dk(btX=7>;e`SkjJ z4jtVO5M$4Qjb%P)p0TLn|H>toT6a&l!hf9m0H@~+NtKJW`k9UO%`OuyQvqgMy~*;%6J5ZM0pi^7Q#r&1ahX{;+~H zmYm(ldB8w``9RJ?*G>OLDx2S4s_Orc#o{IJQC|=)`d-~?;&InmOC}x{oE!STbBWor zTMkkl{X4fU`BthAwz1^wK~4q*9u~*n>rb)$$u{Yn5OJ*VAM1D94M%IPpLi1e>|xBU zx@J3-D{~k)8q&_$sl=5tf-Fw@_2=j2oeLTm+8CXjnt0~h*P9(m`_bIq|Lx!J@8NEa zaea-Qot+@;7#G*~@c#aKBYru%Tit8Kz}6=H`uv=qU07JSO>xegIXwUW|35BJ|Lx7s zKj-J$TWe}+87jO^PD)A&2ntE~@#*R2%bU~BKRI0%B{^4x!z=C+vRw`nviv z(5~~eX!=z$qW_Hc}{k?s`)!)C# zG6O;Lx^;Za;^N|M&3f_sn4T9G7TZE%J?ZE7|Mu5Tq$DIH{AgEMw|w<#zGQjpI;PcP zX=!O~_5c4HM?^*$96ACt9_Sz?s}6&soX4d>MnWz8{ayd?{`&tL+Fk;~d83q5mmEZC z($9~N*$)GQRC315nSm-2l9G~je||JxWy+}nvL6bj4@kM05^c%jP$pc^H&Y~8xy7ekVQ^5O0I_XBDUoH}*t!(;VT z{0OJ0A6_4CFZu89@9sy<^7eHH4vR_y(*So@^NblYB>w&XfBwT~c9{Am_fNp2w_zDq z5+g7%9R_;eP)QPEZ(>5ipP#R<>z4tY-)3L`Z$d63H#hg;@9*y$K7v{{ae~19uP-hp z$5vKawgDaY=uFHH24!VsW>6q3cJG%|QBirPcp8%Ik~VJJrZwBL_}Vx9_!hGb=g<0_{q^VXU%o$o me}8`mwC$d;fq?JG|K7a2oO|Y;_iDGNB>8#= zdjkOAo4h4{C$dtU=7~rCMdjtQ0Dz+<$H(n1ZO%v|rXhy_3bRo55|t4m+KhwV$l&OnKxZ~+ARtND(B6O%Cq zK>_rlAAU2Ow_(9DDPc#?xgo?4uK8*ho>&dDW6OsY?G15A10iaI@6@gfM`L@Qha?#? z+h#pio&cu8LW^kTmW!9SW|8+~mR#?=l)YR(88zeTL9FZX0w@G*57gOFy}KdbBQiI1 zhQ8{kjz39!sc5Qd+%xU}!4j5EIq>9$EO_Lv7*|#XccKyk`+3{9`+Xs8Z}97#e3)8q z-Up40w%$<-9G}a6lBTC+aEZFUzCH?-I%GzgZ}nJ8o=zC{a24PdXj(V|wxUV#=ourw zurL;cVe*A>37NAG9M=WWX|x1C8+M9elvEhF11eWIH6LZ zF?2dTBKW;rgoM(6%%V02&cw~awd>}eWStoGVo-NFb(Wl=R781}P zi2dvciqGfc%gWZ)+?BNKu0s4ISAzTrG7ky?_qb?02KTqXuNZ|#Ne9lJzwbT&4sGA1 zoZGQ=P}bM%!_p9Lr3Rqmu@!2~C{Rd0mvmKPLw$s#E7uE;AD@2QSz>x-xKkln*>qJ$ zKwlp=sMmw}xeeex^kBEnzk7YWs&k1i#W zNX%tVOsQ&;XSGqy&z#E15Q!tB7YlNWfCv->OHRtt3)lh(-BsrQGrnQ2H&htq>xR^B z!8otry<^+9Z6lPI-?qL@+)>wzS11(b3H1LV0yx8JZ}jR%wU^THl@8mA-Weo;9T4s! zs+IXb3 z&!WFTC{${$-j$Hw{HfEiK>NJp;(IbVEh{U_X{EDM{)go9*{UDD|1bXZ)m*)N^{zh< z@g9%k@#a)EiAxJtijcn>ewiZJs~D zVl(58-xqKF&N#REiH}ioPov5b2cc;_6FNA)1y!y6zV+I#IlgpFqD6apL^5f@c_QU=1_6tl} z{=dGS&t_QokslNsFsng|@pRr!VJ9 zl<$#HtXZLUhr8G>$jZPtMR48bJO+EP>uoM>r~Y4iTNiFyY8O_W1wY{2(tkNq=~6?=+#mpa0ymXV2O;M@B?QNJ#u! zyn+>Mrc=>D`xs9q;Xm$BfkUsD_Eh~hHu&TEi3y@&#{>I~dO!Lffw({eoj6^R7?hQj z58JD3g^GMUWS?PC^Xm)ex(BbXuP^vE-@abr-~a#TKggfl4N($uVWA)c0|)a)`Nr4( zxRW-7+Ft0Hu*cFMb^>i^p{FIuE@czyhSiEnRjpI6XQ`^L5m=v#0MZ{%$-;Bh^uF0$O? zIG0OLgGgACl3N1z83rEb*YBHlGx;o?vi1AZl6t=H)p=_f1r&{3TLQYKY>3)l+jIJi endf_Os4+8G&6KH_DRo;E}9HYf1ZpFtH{$KQY*WD!DAg?XgB$5NX z6pze4V=1}!a@67}K0Ol!m^4+3&RvO`nY>}AX#J1B#qwYyLndzIJ>bB@bnwC7<6GzG z|8W)ZeyO3+cR1d{U)fktP~qp|&Al@#r%sr_a{KngE!wNN?(UV3fjDL&&}Rlb%&9ZY zPFDW+JrN*M5}_!<7$y3@e0}_beRHedFTL6pr0wA}^Mv9HuO**+7jN~R@wx5tb^bI1 zAwMOhzW(2E7XZyUu&4Yr?-$`;fj3XBocY<|sz#uygn-8nhUyRBA1wX;c~z-<=t;}T zK~+iFf`TqA@6OE;Hcswo+`V~fQ%Av;Z^ie(W~E%($jhL}!*Z}!Fw|mWL79-|U-RZC z7X;6XAGl)RfB7`4f^p_r!{;tSlWtUBu1;U;>hj=Sh-jKy&q2%km%p%s(m~3^g}e+7 z97nPycnE!y7bxVu)9r6?W0u-m(I4egUCQ6{H_TkPs-q)y(gxqOr1*otl=c7rp)(l) zt_Hp@8rs|0oq3*h)c-fo1-b_$^NP9X!2ka|JpcbEW`U9{P$-FUrkTN?~eU%eZ9oJ{q_7S z*%yeOzrVj;(ys0g$MpZ7pYtEyU;qC>Vn58%l&gw-2MjnIF78hQYM5 zCiRL>u?H&HviI(=7X0Xc?d&~iV`ZfkTDxW!^A-EKw48AX)qem9q7R?HNE*xSsr~F0 z=k49?7!WX_arW%ljWcJ?e0Y6*JkS3Be-eNEeJy_Y{r&xcAC~*imw0!7|M>+=*3{UW zs=EIE|NsB}#AgscB{`bS>Fo48aN&SL@&A8+OK)#~f8pQP*Xn7R?W`X@e%u=v5U^+A wvQ@WEpE|Yb|MTiUmQ=5FikqibkT` zMU<-05(TA#F(q7~)NmFQeGyO*`nVFH$dzQffwbNC=HLBi=Kpr)n|~(9*ZZIW)&dIv zfPvQ`+EMsT&@D-h{j6B#>NHErjcbWVd{jAhO(xcT@T#U>5V+jM#M@DMv4MpQj_-b68K(y}i?q&Q7jcDNvfYgLq`a3=*!*QmudE2fcz3L#d1rm6T>_ z^9RH(H+9$RzBv_npn73&@e1GcPyWSD>Q6WuRfS3Ys=J;9?THk{(@)nsU%!@Fc)l5zFXhAXKmpyB`*ISexxny3$c%#pkSry=|bxfM1z60jS z==9_)Ve!n}s{6Yrc_IgDhA^gj;q(Xi!ofIQL@YoCfhPL|_aJU3#OfQYa=X=IC-a+# z%8l85Txza(_Jo?}WH;kYBUl5EUu+IzM%1sWlH|YCk*NMRs&trgmA>Oz@}X|#OR8~) zl9btZ9=f)+wz?P$24`=+FNo>u?;mb#W){YbJZLku#o-)@%jNE`EiJJOQbMk>22C?S zP&1l6+{n747#J9+iSiE&j9gmKrv@DH@**cM&!Id(26~-G*sqbLX6_1Y_LaarkY@ig zg+yZVw?PX2ZmowYs=)9TPT6jzqg6zUt>}(`j~3x}142z5@j+;f@6v_``~60Bl8IVH ztoZw=gH5a~7IZ#)U3J^XLVV2dKQm*(8DLmwx27moU6~&@YI(qD#H*ET$FY|W7>eNjD{#iaE-bY( znOu|02*6!6ciLJ!BPPW^0*-ARNRbgSsK~><4$Ib4R7QspWlzr z*Pq9*+3b9H_Nk%OMY*bx1qCbNk8KD1{}lCaBW)5zh# oc)jBR_A513sJ!rpZ`ZsKK<#6v;*AeaZP%Rg^6;h!+?eVA0Du0iasU7T literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tune_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tune_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac2d16b4c9115aebf92fcac9df5801756f12bd5 GIT binary patch literal 834 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKVCM96aSW-Lla#OkB*pOmf6|}N z&-;HYcJH6QxAOP7&In%}oip|=t*vDzPM>6Df+*Qj{r%oO{rLS>nwpwM9}0?vQx8nn zkC%9NxBh^Fj>;COK{jQ7j?~M_=CbjXm9_o;{@(b{|Nrvq0z5rC8>dbcU9Bi@SC_J* z_Vqb_sQO>u-^(*gYil1qIaytjg{4)(#l=OkrPWp9#}8HsK3OZ4>jmH5M2aw5SXxNb z{rz{85$u?f^BZ{?6nI!RYEQ`fZ+dyDLdc#O4EYbHvP^xqY}Jk86MI*jIkSD?q!xCN z=Tg9m1(-K#->COZ=!n_pn#3R;r^TT4J7&w4Nk0~DXP?jlH1_|0n=^`n41pXD2h$Cv z9C%>x#ov)3ZN42)N3mAB7SRC*I_2X+w4K|{d< z4jc>zwUd~5=ku{1v5=K*l6a=L`~2SNGaX$71dW74Q`2t5Dm4|yov|yM{_faaL*rFl z@*rzNE^OpI;J^cP-=_ZyDt8p9M;O_aS}@6b-bgEFoFO@BLQA!N=+WwP@0ab~*sB7u z&*t<&PyjG*bWZwjx|=Dp;ltzH%B;2X8FG?mzf{ip zhxwqkT-UKb2PGU5G_tCu#XOR4kj(>aIFBuIPe|9}L>g@qs=xgJyx zI&hJv>)-7}HWueI{ijSfB+b9Obk)00{AYM385jdS#P`mxT)Fd1%KfLzV7o4Yyu-nA zkat3Xi|Cj8lI?aif)7r-OITt!?e<+c!81HFJ5|cQ=l@m-Wo?+LXxjg~5^P~oP*~ut z;%|2<+rrn!8UFeAcQ!D^Oai~tr6eRI zSX6zvaq04MfA;@BK2HAo|9?Htf5mG~LO1^Z=Lul!SS=wT@#E)Dd&w8C^EYqb-pvBm a$jrds*X;Z9TW>v(%i!ti=d#Wzp$Py*d2UDm literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tune_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tune_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..9e590d739584f1f72ca0ccc2b73e2a86b8bd53f2 GIT binary patch literal 1214 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+U}^PqaSW-Lla#Q)5Gcs-|NkOO zCNQ1!=kxRaAB&IsPupAh`C4aG+olZ${{_Uv?kVc4OLIV!?5TeL@80_OeO8*9ng#{M z#lc6L^yBv#+}ZuV!7;)kgAt<2rtZ;|df8lGHaR)DRT6y6^7eHpJ8GZ5;|EFuElm3L z|Gzx5wzhOAZ+b#P!h;775`O&sZO#sr{Qlma+1mP0)8_Q^kFL0Qy!-$Ef5Dk!$BupY z{yrY$51>oo7g*RdPCKUBL~fI-=4GoO7-(y zy;1UKxPBL2ii*A{k?gCKq{!)+qBgTr<<8uW1M$z9!G@eS{z9KgW%$-4RNbN{yI=i?3j{62r+!+-lDR}BhN4kxT@>zr#-IqBe)Gd+%uj)Lzx znA!OZEG#Vz|NQzn84}Vt7dG-9FyLUl7@s1R@IQ3L%mWJ-aC1nSXDX#OUEclrq)Vuy z%Ysz~#sY%7q|f}3KH>9buc2{4`I^%DCxRc>X~}>C)8r!15CtBFgVX0sIwmArY{2mQ zy@TV#6z1qWpNSg|&i~i-gJo;jF^Lsgd&}?4J#*x4C&#s@GnSf56VkR^6A(Pp^Skn7 zd|lj}3A`Zx_)Ik9Yfun4VD&>VZ-=0JTBXUprn3@d{}?RU3k;9&oA~a&sSgU**L(Fp z&oOrIsn~D){D|CRpH2ZLC8wSGS!-8ltu>ufEPuQL=tW>mPg*H>z<`HEyd^uN_e#C( zIhiYS0zHx@34Po7M{Aa3gYYM1h6zWazUMRCPEot->k<&^VP&<~9F)?4VcWPGlelVWTcroqYzrV8|UOzvd2cj+MXQ!CT3%#HJ|JyU$+uJv9 z+-S(Gudm;{bgAm$)#2+E3LB5I8+h0M|9AGo>+ku{w43zv>u2%9%l+p+=z0n?dY)Y^ z*L99!pu_%4K6&y)VxCQ9Q_!;m8+v+p4j*pkfB2_g-rfii<4K8WX}`XHeC%$<$H&)} ze}CV>%jSALIf`ayPMkP#;N;1ZAO8KVW|ND%cOL4*OINSnt^agIvn~DnJmWuqesaeJ z7#bNJG87gTW(HwnW8*ozkAbA|h7B7Ie7wKEUNUZ9&C!B~hg{i&lOM-IjY&yOHGTQ| z_3M2VA19sdpKl*2u|Se-=aE0>4;*OF`6utUz~DhcfB*a4%a$E`+11rm1k;w3By=G1 iL@+410wV-g)G#y5e&i@|vWw9SB<|_z=d#Wzp$P!t2|slJ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tune_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/tune_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..50866e21fca6176523da44af54f44977f638f3ec GIT binary patch literal 1571 zcmZuxdo+}382`+;42{c3OD0R{vXw9<31b-)QnY2LbsJ-vX`|K>CS=B)91#&|N?Wbc zg~@3X(r74i8l+rmnKUk|B;%6Jn9IB0nD)PY&-vc>yzhCQ-}8IE=lMN(`~AFhbxd_2 z2-5ZO_B;Te7RnE$3GZ=9NnapHW75Zy7{IthA)AolM+gAZ81?@>DVey-Kc3zJ#%~8< zmlN(aTCr1GQFFN>qyP5gf9>E+FC~zr? zxh#<=!wXGlCP>eh8nM-uV^J8gv5&I+3)TQg<_DNbX;)mCiYGCmS0Jc1d;p=cA;d3D zC6Y)-^wd&QFG|*68S*7vUP-n8@HdR5`3VOt<4v1Fx6xq&??*?EEY6PR7^s|=0B}WO zvDobNdV06v_Dn`ca-(R_eD!ao9IF z!J$IijU<|G+NDlQa3Sn_Rk#5so`C}ckRrh8u`CQUdh%R0TF0(&B$x%IkJp-U?lbz< z$E8Gy&G4hvS=E77bZh(pr(f>MyDZal-3*HlMIA4W`Fgx7uL=KbOhXAoEh6f$Y|-jD zfj7Ublz{3bsNGi&BU(!*XPh5P^6 zfAfJM2FgV_(huxuaMoYWd2csI7f#8ur)0+9AHy!q%j`3uA4Ybtd~yif0bx`{_0wEd z&B*!n=T6lPhh9t;2z`^y4KM-;%k*mDPX!fe6`Xzqru8!qMgxE%nV--f+T`Tqgf_Mb zqb|a~lgD;WGzlP)MAienz0^gy)FInH!sM__F8zwG9VYAZZNgi)ostEq19F*9^f{ak zL_{GE4(UhF83Ir__$qMM<739(-P=btDW-!Sp@nvF`RZI$z(P9E4(Q`2PE0cf5UeO4 zya#RFIz2HA1Hj&5jyB|mLR!kUoRM~qY{$%QZMVL@6ZOa|mKb!W=I4lMu|xNgnxA+& zH#eRua5EI@k~DmBQFbfMmF^+MI6cS~h3L`WxoF}5z*?=~mCkRk3)iZhZE_=}<$fQ= zY;xr?yzn^zqz30k>^cPA!!zVkg*NS3*a|HrLUbWV7g~#Mvl_pJhom;U%UG9;T0D%t zltnZ5xcG~kf-hHis*~DHkcspz{=3R|&a{L#HSWrSv%OjUrp1fPT|*&`@xx78GTMz} zQI}kj%UXMS^3t+Ovxvi7$XfAf!Y2Fk;6q$_WhHN0&bZOZLKy&8(%5Xa=&N`bt!i0{ zM6NZ$f|Wvv=N6i~z8?V!c_icOv>C7Rp*ZG`nCS0`2~aFTA)nA!6##blWX!YqVR!dv zodHYoH!RO0BZbTniL|sNbOE{a`HVuIe8&+HGTr!QO z=`SiPD?|VKu9>JEOO1=Ufje~co0+7b%)7_~3N9LnUEfH!`gBs6DN~_{P*FH}9;d@~ zL#bDHI2!?Ag^}j7vu;gW6rDsm*9k*}`$%ll6MR93pnJZvW{;;V`xwmtGbDe2yc7Rg zNLcPaN(7CjSeWdK+Ce0$F;bt=EjY1@y>oMOcFm{evx$2HrtDRAc6fVX%)(#x+3*mu zt>bW7GrkPehR=jRk=N#D`4I=D6W!*Tetv%0;ZIU=A&(OZT01-MVpYD%*;kHFoURyr zcmjL7rp6A1n!(rIzyEuKDYl?9F|!xQB>AGz=l*Di6GP;e{ryf?N=lBaCN6~<8Cf4e zrBW+!k+jK=csimbMIl%a1Eyv+K*OtJR&!gJDC9c%h#TVQWKY`7@;6#5;^tTJ`TVVL sK>*yJN~uyQ6hm%Ju^)Vcum8<+Bs7Wq&~c5oo}_&D+2!YX&z+q9FQ|a?{{R30 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/undo_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/undo_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..24e913706072366ecc24ae8d4ab355b0900ed1b0 GIT binary patch literal 718 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV4CXb;uumfCn;e8NQ&YA|3wmv zD0GsG_>Z5jr@vbrzFw{7-=Cwe?(hFE!^87mG9n^k9v2tK8!<7lRSAiSm7Qzkz#4r{ zZ{%$-5MXxjKV)>~sDX~F6T8SlWv;4|g;JM`{w~~FepN!4!Dg$T=6ju|X4TtOyo+3Z zSm@_#PJZ&|zdYE4q#f1o|9yRJo>y1@^V8Ko(&qVp|Nr{>x<2LsP*9=`s0QfHq@Q13 zi!0m9>mUCvZ!ffD=@JPG3k!*V|NeGAy#D|He`5}g55|9feeHhyZSL;wh{(vP_5c6< zWd>`tIlPhcfB}!|!S-&6C#*^5XUjg;RaxxzM=O?ZU22-K@wGiK|2kdTzpA6Spj@eG zRT7W$rK<0B40d46EC&yA0=);+yrU_PRrA29HwWW<`@|;Poz3#8Fs=9AbVIhZHWd{{ zfr(qfW(LpSy?>odV5V(8yUKrRlNxy!4 zWWN0U{e8*0KR*tB`1`xO?fw1z#x=jbbUwU#dOFXiqN2SU41Romex9GV^lMCbxcGnf ze!0JYzI+ruytn$h5Xb^hSbljae0jEcJ}CT7fB65uz6}^!hJXJ4p5EBnIy3R|v$Nfj z5)vg7n1e$?N}hL%>;FkVGh=6S>r_`+hyjTS34iw29_Kp~@c;XKpq|LzK(GAk>FJT4 z_*6wjrR?3kz13g$)&6#dB(6gf9Xi=^AeJw>!T?H-Kxe>`9y7!HmB!CL7AxNdiF>;G KxvXuyb>t z_O20wn0P4b;BS8UP4f12mkysjdsb0H!s@^b(GoQ><__y5~p`uf}d z-{0lu{P_Rh-rnppBiQXpHl@GL)EgQGwtatZ|3^SnH1gxOx4T(PLq*y6`1oq<(m|?$ zCNdwszyH6)yL-EjA2@cZ%GJ{|P&`%^Y(mOeL#_q`9@Y!}0tM@4vx@Gn(%^rwbkl9q z0MEL+r4^s0=Up>c+A`<)#(Q6NQrkNelpKTvKR$k^z*+A8{>U~xgU!yN>+?SVL-POs zq@N!jvmZV`-(K=ZMWrOmRu+kW|No!=@cn%}&vYP5{@lOs@8#R}^z@h_%RYOD=YwnXmN4=S;@Dqh3#rgeU~YeSX)$VKmuNJ=n4`S(cgEVeiY?p^ zSRuap_t*L`FbX6hA|f8>HSLs0`*GO4Un0(?{^R94hxT|yd9CViY;1h^{r&w%{_||k z?y7j1bnkFGKWoU<5J_N!A68IQJXi4h+gv3!wzgCrAb_Nnq@SF<%xY?CBHRf-uCI^h zDSv+_^~3k?pPxN`e4G2TmA3Y4Z=i->_xIQPTUWigF{}9bxtl9iuQcZ1;xdTYS#|aY z$ig*i*62f%!Y{t94_;qiAMtT}{(XtMzrTLI1}ZpnW0E$=B=+j+Xv4sbi^cWg5-R@x zvt^do=Rdr+`g^ei5J27Y>m$&kKs}Onb$?EL`1shp&40d~Va=~EoafSk;KG$FNzvQ$ z{!Rj>Z;uBj#CX=N(=%J7v`GEj9Lv)O&YwSD@c$sQIvWtc&HK!L80454GiE&Kk_3Vo zGiQP^$btjMkDpf1)m7b<@bFOg4joY5`ta$~m!F@XpMQOR{(b|Snhy@`z;K27E-@|b zXVI4%g>pVm|4T|p2)K&!^Yb6Rt{>0xA@abfQ@_4FJlw9?EvA3-$J^WHb_iE2;+$n& o{_f$cSFh$Hf*x1aM;B*icoFb#NB@-EK9H9@UHx3vIVCg!07sS})c^nh literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/undo_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/undo_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..617b87606263ea2ad0ee677a608cf76cb78e1dd4 GIT binary patch literal 1601 zcma)6dsLEV9R2_=z|nch6ilau5gEpc83b(rM@EG0f>&?TK-<9csjRF?0I)$vhJ{iyZh(onMEDSZAomkipR|HLTeYH+ z%7&0^qs!!bkwck!fcXnguy*a*in@k|HpTn*{Q{AgQdCgzVQGC5(u}#J2ced8R%J|$ zq>Xc!P<}>c1}-Br6GtYKao5Yr@HjYfAmcNQLF8~&R>>hU=BB4=01h{WM0(*2dRS08 zij4Dmf>EKo^|G(_00fOpjY3SwXee=*pPNxbC0-#=NapM$G_@#L&eVVGyn4ygLJdrW z<4M-|Y|F2GwM^!WF&o$Lp;`SdlcD;j4GLiz1;&4KqzT@+dMtc|tXhE2HgQlBx zGit9q77NI0Y;+M_^^J9tw`Z&T352}j`^8_P2m}Hjf*=f-$|^4}3f)G#pnUx@S&m6rL}Nn8F}3(b2^n;kKq#S;zz&;+Aw}?{o#ia-wJF4 z#cE3+dgW$k_ePoZ!AoJwCtM=}4l!e@gO(&Fc^5`oJ=k*|{VrP@xBEtTix3y9Hb{|P zX1u5?Fdd?!)j3qWEqJ?R!m~Ya(UkJ!~gj!2VVNS0}2<3*X3J_WEB*@yEkj4-0tpf&D7{#8$>ALYaY%ftQtS=~J$BcP^H?&?nS+$;Vl|ntDn~PC0_k zncbktBPA7{^vF^TrS)v#U#hz^pJ(l11@N2x$U=VY8Qt6yddw7)%9F~`|uc0_O22eLW zzKB1g9>BLVp&xig)2@ZC#tAwFxTxr;Kbult|28;1PT>j29lgE1+oGbzKHlDO4d0$) z=z&!cX%svZ^FPqy=k*xa5e3S<7{sHP(?}BPNmaHG^OyUh+;DzT%;;7X9 zPg15vBq~{DIa5Es^?Yt_?n1K)OGGgjxNn=)#k7RCIgc9~Ta#fFOM_LlpnhiAUcg%_ c{Heb=3J@+Y9rRn^z&7PYZjA}6-JHn&7Xp$6Bme*a literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/unlock_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/unlock_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..7df69c0d5b0d2cd74e0fff9b99df396db47a41d8 GIT binary patch literal 847 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU>5UqaSW-Llaz9R*}}r&hpvte z7Y`4Q5DN>7hy)PW)%^JI;7}_!x8EEK!-vQF<>eWHdjJ1Fw0ypzvhw3U_iBIt+h6_v z-~Zp=<^S!k`1tAn+S}#-^rQFvsdsWZRL2GcK=nWkNe7qSJa9na-ud(A58Svh%U+dY~+pGBa z`09Z8UqeH~&(qU%|L-ro{q4V?px|qWvyu*_HZ(OgF^h|fA8zNDmq_^c_v7Q^$7QX{ zME2DE?P{DoyWJ6JCd5gHG8veenGdhOzh7dWUG1p`nF#y3KRW|Ns0v{NeTWe2}MLzDi6;NT~Sr=H@T+{CjK%ROyYFpQYOD^)wa*aApEsx*Lkj!8EQzw<(=s|u{*{?rlv2AZTgA!A@yHHx2%Brq2Polbu&wYDe1J<1M z>+5TAc46f%iRQU;Wt(^Jwq|B$XFojOzFuNq&Cf#z&Ye5=;r)I4o)3^fNc#EvIsf5$ z6UXT2=(hd!|Be3q{LJq9=YG5oGfctf@A}M#>qC^CoSh{jA|fQ}{{QREVh|ID$|t3y z{P`$;Hl?<9f=RSPDAI}3bM@U@wcH!4sp>5~q+Z+G+^KW8Olhf8kRy0w3?G}I2Dfsq ZnHlcLxOSEv_y|f>44$rjF6*2UngEmOkyHQx literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/unlock_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/unlock_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..eb230391a8ca69f4c820bc422a6f83b9a2e8d12b GIT binary patch literal 1235 zcmXw2e^8ob97k}V@$foK3 zvGW{CZP#30PWxkbUb#RSVd}QrYKxnNVBIut@fr!Fsz1c^j~q%fK3Ot1w40n>D| zaSrZsEPO&HXV=fptXqdztYi=b#W)m&(tnY}#>NJ9Ivth4V8nq%Nli_q7!^Utx3fVq zgY@L_;_e?Lp};Pg%s3_ir&fNXnEfN3Mx%uW1_sFU^Yh_axm+Hp{dbFQ-hMEhe5hD< z6WOrFYdh`V=hn|k918=Z7z zdUdOePmfNU|JeNpE9zR+M~SvM19J^6=DP|e&yRkS?S9xck~x+Ceo6DGEu3?rZK^i` z2Zt3wEh3Rn|gQ zLF$7G^NYHo6Csd*xa>T5FbEtqPd6HwC5phJX=!N*aiL1RZ2vAb0Vto>#S$LK$jG38 zp|oBY9)A1k z(dxiJiL^RED`*|DfP4aeDuOz-Rz*k%)z%M5EG01s*}hF+`exp~-Fxpl@7#0mTXkCM zdM|Pi8G<0MlnwlJu)d2<4t@b(P7Jm6e!u{T1|>FY-Ez4A-krOXV$$YhT+)2&OO1gV6Uab~ASQ zCuxdfwHXN`n((FpQU|pQZ`q_c6UFYzJeh>&S3Vt@o~&1$Nhl6u`}$t!+Laj(nE(oc zX#T)ZsZ?8OX=wl!hYRFzIJEIz`KW37=|@#t8o8^xH*Y?h^B4sEbhZNXX(o7MygixJ44S_#MJY>ft21Cz-tI7SFGvRp<0> zyBy5!TI%a73C~O_4)aWbzFK{H-`>)P_p3-GnZs)SMx{~-5)%6R2L?2Xy1FL`8#h+#jT5~v5RVLmbOJmy z!<#NeFJ8O|8^?RZoyEpr?W0S%F>TvBLVb4JInLy9$2*I}hOg-{A3CjOad}=|9z>x~ zw3l*6Y5xBH3^$BO^BYE^(ZC>HYMp&e*Q)&@!gZg@CkNG@s4Z>lR;l&vKM|_R%1U>A zz`{VmtDMtsGEVTSfHG%=S^4?si}tp?ktdHH>ppP1 z%s#t>4zw69TB|eMIBxQBv)g~S)eE#4bnnXy-J1K9sO8?T?goa6PvetMh3;6jVo}_i zzI>?1Vu_{jC0Fk}ReOxh8P`TguhVesuE^AZV#ifuIOy4|}Os-B+s zkEPOZ9Gy;=4I!R&Bs2!7EDE`f8EuFca}K_uX`fsv2psP&)vjCiv*`#F>yA(!g}CwQ z>FKaise}dB%CdC^L)c$BWND?_pUCf*J4U$WwhvH6wfD}h*YEHMu&z&>S0r>fegknK zSfo53!N4{{>G$26Lt_J2V3fUmL-iT z6=-W(j1z&*THO*ik|7Vz8XXA2%q{nt z2Ll9ig~IQ426%Zn?BE~)==FN@BA0jJf4i{apchG>7akEriBKvjNvZsw5{1hD04{ok AYXATM literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/up_arrow_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/up_arrow_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..aec1d61a7c814e490840a625bc6a4a29b307f874 GIT binary patch literal 599 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV3PB6aSW-Llaz3PabNBKcQs#c zeSIIkKKB2=x4+BNV_pFjGW`F4Xx-1-=Fhdm*Vop6eRcJJ`1-iN`-{Hb`ksG(U!o}s zM9He3pPp*pkKb4IRh}&lNd5w7V{>EU<11rRQ&Y=%c=!Mie0cM- zxUFB_{-1%N*)xclDQ64?8w_|D4#@A|Iol@i>OQ+dgW<-2cLE2vfAA_T+Ew*F%iwup z&qwZaufMHhHTvAh4-OHB>H6_I|2;h|zUG{L;io6{C0~J#00mXS^Zoz-OB#e6eDW{p z6hth^QT)fx$Lx>$-`h(_Ts$&!=1j?b_5a&|!4KA9@Zk0J^*-_YYSMoE{LFrMfBpXl zkKVj_!!zHm{*VDwjmd-C;m6L;-)~@GXlV53?{9Ivb7#+<{qXW~IuA44nA_L$!Nw${ zxR^fp|NlSFeEVc6sO+oO?eFgyZrHqevDBZx)`!J);$YewqM}}%nQL8s;qZh;AaIOv hdZfKe0x0|cKQjZ9joY1P861@$#h$KyF6*2UngHwJC8z)Z literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/up_arrow_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/up_arrow_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7b7fa0a9eb71b90a57a652e7b35f6d00bb1e20 GIT binary patch literal 859 zcmXX^3rJI86rL@%l7*F&&cc~y4~TG+D4}*y*J=eC_5`Ipl9UownrJk4d+17oR`fzJ zMuJHs&6Fs~cDvVB4Rs?ZBr30)(DH$IZ07FRfA8PDyE}0HpTqZ^??2~1r~OFTfmNwl zsUneRmF}RXg1a+$Um@Ynsiu9jNF>hHX^M|EcbN=1Dg6Tj^}OHhmU1|Rxmhi7_IGUd z^&IIu{f=dRMk(*dS+Rh5LuT@cv+Dg46T6)ODH5e&_~8o@YsvGjr}jFh3L_70Bh12mUYWp~kr-I9TH| zo?4dBDN%y49}Sx~+^O@7SH58#>W201WY4BnWtpQW{>0(1mmaF%VyHZOujONCnhVc9+tMZDOlZYad;cxQtD5WW)X2G0SsClvH4WJOx7)<&Xi0mv~V3o+w%g$zMi1O4yz zJwHUhy{)cpy|roU(YmC9LW8&p0f?p7XjDq2(gLrM{1)}a z3~^0I1z`>(pW?0idinlUF)WIbH literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/up_arrow_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/up_arrow_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..a1380c60cd4d22fe1d5f4708904ea795a95870a0 GIT binary patch literal 1082 zcmYk5drVt(6vuDvgIBv!M4{+_ZWBffqq;@xh-GW)SU24eiL-N39?8gb0(OoPnsVpF zfw682BgNOo5@Y;h%2`>1eNfh0C17Q--!Zo9S!t?A(}T7>?G>g(@gn1H9#ZY{3+vb^*xMz1XI{Ci=% zE2H&O9x?!|dBPI(ja5zrP7}`^oTOpU+4REf=lqB^;lG<#%U&{jS;#Ya83R!^1C;dI zAwfiT`A?)-dc2d%3oH`_Wm9g3g7MA?AE0nu-XjrHjD-%4RbCx+t+zP`Tzw?lrSJO( zE>on=$YF;3r}IpJvZ#;EDQgx2cj4(h9U+`dT{?~s;Tqk3m$|{^tWZtLdaD@2x5gXL zXY$JCqB;F1|C{DOxukaA)SZqupe@@Ff>BqWU^UlbX(+SZWeza)zA43+ZLMZH0AF9X z0bz+E)cp)cRF>^Ofr{D=$dd~UlAI9s9%PDVH|k+563w$%_jU{;+R;M;Lu4_Z%7<#Jt7Bf!-ga$TTMav9xWF zz;QXE@BA)2R-B^&%7XXirN{xkj4Pt9c1S%q50&7vY{%P#|7PjH6xdI&Mj zCbWlNNw^|KEUTm`^2Av_%TQN+O^us4K^@DoA7*GA3SZm9y(|ICQUyxMg94;62RQ2p z507rb&Tm@x`2V3y!NJ7%v~U68JlV2@Q=;uJHAX^5$+^VO0_(&5XCE<=amcCvZL7;uW>D5PLfJj;sLSqU8NY#>8SV$k~lby6LxOqtU2s g(?;+qHIWy_$E1sA90i@T$>Dw7i@UU)n$n~H0=v!{Bo;BU#?!g zDy^cT!XyC%aeFE@K74j|Ht&49+Fc#%#DJRq|4%xy?B=OcuNbtoS2Jw-@&5jPdl~Dp zGmLjZ27{!X%pGE5_cF#BGXnuoQNylXRm{6AAd-&a0%Bri2|(cC=a&``9-jW=$4BAA zGmXaZrr+QY*YVj&cmCZpYxoL-;+@B`0vqQ~&0P>Hw zn10%h>i2es_x}Da8Mm+I=z;U+&lf!WW7#&_JU^)gYOukBJ3l}Br>3Op+0^~{!7r^X z-MpfMSlg_ zf8TIJae#k!b^z`E|DWZcAs2(90LuoEZU6pHyrt27)KF(SPtV@(ij-Wm5z(Aw-km?dNs#* z|Mi!9H=nVHR#v)EJ$a@J3&ZK2B9UXJACBjHeg(!S$WBMW1_K_J1Jwtf$a6N#QQ~Ga z4N(zcKElGEwj-_YuIHuAYrS*d+EndND?hHF$T?}kOa)G3XO{@-mzI{^Cc}(_rX45W?)^E`XKUH>wb`Np00i_>zopr0O<0VN&o-= literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/user_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/user_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c6e37d793c621d75974b249be60e37c5c03222 GIT binary patch literal 1521 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 Hjeh_Cei*JU literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/warning_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/warning_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3438ad27a60e12f2d6e0235afc398136f7e2607c GIT binary patch literal 774 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU^?sR;uumfCn;e8NQ&YA|3jT| z`)W-8zuNlxzJBb!PycUje*U^}B{M{>>)zh_`0BU6djHS2tN-`^>FMeJ&GYa6`~T_b z>Yq2RFhLYK)c^YW8dfRuY0*@H9J^Ul9PDF=V!U> z%F2r`G_&(doSSER`or7X=4_0Nb!=s2Wqs52HGKhRe%5g?Ck9S z6AvywKmULHj*6H6&(F6Hj9~<;awWoJ4c!;ro9+WvnYhs?H}^igUm z<_m4j{dUhI>0D*MVO)be$f-6b6on2b@VFklE+r6hLHWDD9PKktI6hANDRg~mHS>*o z**)#|q(WO&l$grZjsH(R!n&t8DNX(WFfjiA2incsV8Fw2KwMa*C@g`o|FFfImu3@; z+}`K!w7$1>o#p&u9%j!FQ58kwhwluGJ(^TPL_HRLZ<`z6-SHb3L;wFLSyn&GQRX){ zXFmM@KTrI=nnw0HQ>KV8D=RAl1^!F!tNYs}q^zT(!{gM%#FKt*&RIxMCGGtGU|(13 zPRql~{pU;k`~Sax(T6uTH_zx~<#KU#m6WroH~|SBo5O}&4F)1E2e(T*8vNb=Up0A4 zL9(KSLA3oZ+vi)uMb}FH)|QM`*eLWVUWGq-&WT5?U}xeJx<5Zowq3T8 jIdJxDE+|3&|If@Yf1T$sCwpHrP+WVu`njxgN@xNA>i2TK literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/warning_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/warning_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c88e1e4fd455be77fea2e11a7ccb694654297dde GIT binary patch literal 1141 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x}o+V6pLZaSW-Lla#Q)5Gcs-|G$#d z-kP6T|E^|V-ygrL=IQ^<>F2KtujYryaqX@Czwg_x-r4{6*ZlqU|MvF$|M~ZK{{H{; zbol4ai`)=J9smCPRIdAa>+AdX_v?S~Gso|%`C0$;)z<&^^?xs^E|CYTN>W<#;O*^l z**9U!f z*8ddhJI@0&3h3lR-Ey{7d%oZM%l`lWzrWpy2mb?sedVt&|L0nluYYXJ3{fTNVqgF7 zO6~W5dneCW!NDvnEPVLp=5)z(^K82pxw%Blc=&pIzSMmC`eQFa9s!x#nRjnj?caZY z*$b}Evn*y?tv}DU{vXKx{KA<~Lti!f&$nx@|NAS{*~w|n0%sRj7m0s=f2)6ac6N4D z&L^lrSqBfh_gA&Buu9&zc~kP=|Ns2Q4H|TgojG$xK~L}4hYt@IuL8O)VFw4q-VG0q zo}OMBzrSv(ps;Z2kH5doWr~Z64qa8~2KsNdW5fLUjg1p0K7M&QeeR2Aj9@)Z8y|ds zfB#YWyF0o9LP9A&fC12@SpV-&;*SpxneQ|KO>0&7fi ze0FF5{{_F_&$n+*$Bi&;2ca-``))19W!t=ZPQt zR>Sv8|JwsVH%*=kd9P-4E1% z+-~Z4p6CAha?cqTm%8?MeXD{(qrc~_Jt{Fb)6FI30OtpwNB;j$0=fFfpQqjb+IXe) zUc7o?R8Z{9hWI>yx=aL9C#rcC6t4LFYP1II3LQ$lJ^y;(V}Omh&J(%70O25s`2Hj+K9Fx8>H? zJ>OZ^&wTsDF{5o0T5`oWUz>g?o4b%R*V9XC)}$7*nCoZHd|(F$rA__6n%~>r-tOL4 v|NEeu=yPSp{QUDXAyzEfHWO5c07IOa;g7L#uYGY?C5Z3o>gTe~DWM4f2nIsk literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/warning_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/warning_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6103442a9ff72321f84277bd85b682c7127b75a5 GIT binary patch literal 1560 zcmXw33s4hR6ipyR#03UN8$MzP(@FtL0!%9^5(trxA}Awj0h16Rj6x-liUC4GC_z#> zK!XnAfDE?Qkr@>Qi&*l3RHy_*i$eWi2!w)wh6M5@$#x<1&g{OoZ_j(@o_p`R{G*An z&Q6|AFc{1^K8~0SjXrCSBNBQuii=lZFb8=&G3q$8iAr&&K#MRC^rR!!M_(@?%XrTE zDra0we$1KyJF-W{>vLRe|F#HAK#{J0I1Ln+u3EuWJsMQK6Y9Yk*~#Un!CPz~4~ua* z);#}kL5^peSI|h&8g%eg4#=^ZZXRwcf>012)i*`@woA1yZ13K^%%Y-6YE#n=z-(p# z_ejEPk^iH7H(Siw!+Mj}OOEGQ&1i44K|KvV%oztcM$H#Z+d|H=G$uZ^gu3k*ui#)=R`L{ zZyL=W$v5pplEg*J;G2gFdHk~eMom^FSO zc6Pe28NvbKP7)S>wKD%|fgK$DfowS-5Z6_;NRd-qem;B&sVJKRgavrsMI=vAd_h^U69na;MJccLaspZhc=C1g!y6Q&T_-o-@W&PaX9B z=8p{(sV?t?C0$WvEiK&U=H~UynmH;5v_5I8;lc$ZBC*2byu3RNlJ&eIXoJy_i^7tW zA`VD8ose)@F@BF6R;p9U@iz#Q&>ZL^5CEvy+64lhzKMc4)1ZHP@#-p`I+{J`9UzzfF-XK zF_}RjI2_J)80#fwy95VB_JSwc>v|43UMrt#{-Jvg(dk4u*SedM+wS5r;W}6PZsyBd zZRZtST^?)rzH=E4fc2uzAa0#0TkLg8I8sP& z>=R_kwtIVTBVT9R<2v$3igZClM5D2>@mPv#MdK~wpALn*lfrj zYTkcQtDI4~i&)0KrRCYA9s_h+00NZ9?2+p{FVm7Dy4*xD$QrPKKp+6}-uGO2RIE+4 zH7shni1lQGEan9I`v*)OG0sh@eE8zxB7i0JP?&nF#m^Q-D%2|O z3c4HprBKDFe`DpA@pwE+O)nBkrqm}OV2}=4?IUd1gxX*ii4S1!?Kh7a1Ua!NS^#xl z=Rsg>f?4Az&JormKhx6CPlvrfAwKvxf1W|Bt4PR56h>`b;aMU=Pz<1R?0Lxm)Iy-H z8D64GUmd%XR?RjWp2ht0@udTl_zoM-jjm>Q+sq!;t|pTecU|+=zT*!j67Lcy<^KVj C-3TB6 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/wrench_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/wrench_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..8616bac69dd5e125980aa78b1db3897da95a6881 GIT binary patch literal 801 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV0z){;uumfCn-gN;oqO1%KzT{ z{G6J9e_!#hzrW3y)!C2h#>UE)&aeS$`2RmiammkfcdOH9%$$)D5;8?HZg17u4=*k% zTc(%-<$($gb?4pPRr~kgVfX*_K-2!8o4fn}cX^8+e=jfh*E^8~RrI=vU*0||BRkW` zruJ9Q!-tFA?R|WDYJdLt@oi7l*Hg(aFQrObT3XsOK`cF#e&Brkeu=ujzm9%*^);JK zRP?D{o!vfL`?^09Zfwc?>?9c}xeaJy7exJ`%mbgF>%Wrt_dh)W2p&9pmb9bdVbZOw z+1I1Q_2Y^rPM#d>;}kQeaen`NMu-hZmi@f>`FUx1-u=ugSFR)^Bqb&N`1x7=@ZRe0 z5^}axXAT@XbY{VV1qVJnc<9XL=y=c?>JftnH#eu3ZeK7fa>h(ayShIoKD@nc-o`I) zXYl9G&&iFwy}b{Qo(|`UnKS2nY-}tK#5O0+Bg@avyLxv|>FPl5VBvK?UteF(1JsjZ zQTvOBSzBA1c|U`F^Q>97WZl`>rOnK?O^4XlwEMx!%gam6^X}zbxp*xtAu-YMV$G{7 znQaXW|NWGe7ju<}Gef+S1oU>rrze?rze<}+mzI*Nh zf1Y^W{rdX4^w+N?k`WV4?JEuxd^*C}cA$Y_&MZj@2??k=tLkq#i>FOfV-^+`KHSbP zFR`!g@2P_S|CrkzANMz4VPh+kl74*c%z*<3pc;Pt{49R>{{DK&eKkLsuGY+dc%<_& zkK;kdxyOzjt3Y12-76ZK?s;TMO=H4%7ILEHGP0_$$!TBpkmNZUCV*>(+nL0$IjP8l#f`F!Run+`sT*r_7W0k2v5Jkn3K%yZU!oUxqR!V~uMkyvp2_boTub0G`dS||S|D5yPbIyEU$+oR= z{(clc0)gPqjgQ?9-UZX;>kaO|_#12lg4bGZEN5peG2p|eby z4@lTZ9t*{sMWP?ikID)QAFfFZ0!$oF3)NZTq`_w4_|Wb0@2`0fNhFd+h2RVF@F|VO zHpY`A%Qx2C^m2izzl)2c!J|&>b#r+`1C_XV@nTKC3V|`q`8><~r%-aNzh%Q+Mg(iq z?wM|aUaU+0=~vu7QB^K}ywF9Evk_PGtYPE+V$-~#FETST=?IFhs6X`l2cDcQ9Gdoo z<5a!4?ttp+_Gj(t{g}C*Es1V2GXzfSgiKNBrL}~xm%dQ$KO?FvibGoqd?3J?wnKd) z2I`q@;z4u23IcUF$2ruIeAxtn(|mgLWrw~slt!Z&)$Q7LH;39KRxP*bq;e>+tjwG$ zG56NL?)`&*Ec?1b0k;SpPt|(8{sT0sI1k6d^6Un!1`0wN?hNrxNePyKB(^BO z{LMbqDQCm-4M?c6=JpfIz!Q=;nN0Que@^=X8p}HBXXG<{J=OF(BI=FqPy@E($cw8# zOJfRG<&a+0|P}&tnVihP}ZlDPQHT(PW=GwV(yTjTRh7 zBsh+ZE!+?;9w{ta$EtO#Yu<@v{uwBxEg4bTk@7(g!HbtOX{f@)Axw+Rb&6!(I!2*uj z%ssa}p~I=EsUI*LCaNvDD-Z~}6G}@VhjowG^pmauBY%5W5&nq6d?59hV+ zGwQh&uIc@tAO^uu4CEYj^VTgUz?GYN>JC7lbZgKaa}Nx^Sppl?YPB0)ZD7tNEb`sl z#s5bgKi`qu`#H>2^BW4lkT?cU@gD_p?0KS=rCN@7PeIiE4dtII)&-8P%doJH*Acw~qxA-`^Bg%sYnm*V#_%y>nXt*BrQ zA5z}4zEjSUtbH1(s948M>JIxvEg~LKWA{jrZ1Y7eV)2-kO(YDmBoU3Lzco$A#ofF$ JR=Fuv{2!AUvAO^N literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/wrench_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/wrench_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..29fa82b59340eae7660d2af7e55d1a7566526993 GIT binary patch literal 1826 zcmZ8i3s6#N6vi+`NAr;-gtPW0OCqI*k4?*b=Bzel`Dz0RW!joT&9oGdZN*HBeD-3) zEvlWe9Mj4+6ZA%c%xY;H3nxDg@+YAPzEhrlEUZr@<~Se- z!k9GZNRXJr!Lbn&Bxz|Gefm%tX_M##Tp$STw=4ZRO|Ty%m3u9^aiv`XL_4Ai=5Y`c z8P*#LUk`O(br1$~S{~a@8C*P$Ho^KuY+bLB+_Q71udC}D2eSZtDwRf~0k(AzROp0j z<`_&*l}Z`*N0No72Wi-aQInk zUU8WD=ZmAmw}uF~rKK+Oh7qg@HY%7p&3cQCk570V+{PEWDym5L7XLMHZhZXnjgP2F0O)GR9ZT1bR12sLJT_o>k*aMfn$PG)M{$(BdIjYF7d;a zAI|gB)6K1Rr z?1}FgjLpf(!S1WMfd$p`o~0-w?P{V@>2$iYvon>-U@+8bHQnMu@VL$~f4=jECzPbe zJ3}&W_O)vk1V+|)H8S1phdm^YyLxN6y@vG4jBD@jT=yM>QJM}cnhd=v!X)htwf0() z(QyoueWOPDamG|Y{?}D`2>k<;cuQFq%B?^t(u1-!@LaDbyIFhoc=3z|9l7U^tl}1#?AXR_ z+sa?J@jV?VVs`4J$r$L7$z-n5j*j|Z?CpJl*A3o?ZshExOGjPs_?OX^EK8nDXBoRm zvm<{&WKVwMt-ZhFx4708yiKb4AW+X4$!-y32G<&7{!uZMrizfgj;L%~YRN{7)%LLM zE-v4Z6Rtl`x{JMJ)nuvsa*(KLIB#J19~I zTrQVLfy$*oTjcXstjKM9_Uw^Onm-zd#nZd|PGNAM&_DA~aYMuE!jjed6)%)Z?3puX zus2nWEm~Ork>dX%(WzSp3bYR8$C_yZSZT!-4Q_=cB@QlC6h_X(@Qd1~Zf}STDwR5od=HR8 z0GV~9xS_(WP*CGNT6OixDf*X~TbYupu|h%Yg@D^(;o;{t#hmn02!nDbR;*c5Nmt;o z*y;HUNw?qx-`@_~5zbpCq})IB>uY&8L);~65OBF%OUr)_RCiyE?I6SmdKMB^Knn;2 zh1Q@u&{RcvaOi}2Wr@4GWp}^eX}=`0;mIOmMn;Cm*jR@4&G=ZqLP-=K0pNNwxC<>3 zePcie*(vL@Re@1b`!% zz`(#?SU0zWGp?C}(P-!Z)&OoOVKof4E`p2#B{?{Eh{4H;xHU+MBTbLtJf`&&0~)39 V;pIvCAEcQXqrzfBZ-!8R{s+x;hFt&v literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_in_16x16.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_in_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..8632b0c54714464e11165976d24c0e49321ba664 GIT binary patch literal 982 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKV4myg;uumfCn=?Ysha(Gg}nTI zCRSHhW;QmqHumrD<8N$A{oK;b{!M>R!pDB$%@bKbebt40DkTF0r1Vu%S6M*2yudlDuMMXvZ#Kgp=?XUlDv}tp( z!M{HrKc8LdJ>69T2xiQfA)yz$>&yWV&_D2>Ck<-E&ySzg4?p*xFZu7!&);t^E z2UNFJ)sqt~#m~+#SY(U>>>&NZeGT*-b-@(i2=Qs`?nL0&8QqHDEfg7w&=>?NS#h)J= zFYfvI`TK?q8#tn(A`A)&3yo|3eR>KC7GS~xg)9iCrKF@JB_upZXkn0Zb93VZns272 zre?Q7Y8tP!*@`!}x3B;G{r!EVnwpyXPR`E7j9~4|49yDu^?x6g#sawvp00i_>zopr E00Gs_rvLx| literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_in_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_in_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..c14a1846a0ba64e7f103749506175246fe745fa3 GIT binary patch literal 1780 zcmXw(2~bm47so@OVKD@X6x2vT$`Tqh1Sr@K_<~4LtOJOY2o(qzmQK~6d^HHsmlzwR zKn07U4Kx-;aS)3Zkyw!gs7+izfwBh^N+2jpB3lSq-gg7^KXc!Eb7$V~ocllLo`RUD zJ=RuRtPlu!agSn%FtTox$sl+i<$5eU@d$nafpxfN;DP}9Vrp`{;x?6l07m@tt@ zBuF$+ir}n1`l++HP;vM2Sbfwf!0;!m(Q+;=_x1uXAXOI4K6E77&<*5`3MJAUss&3V~7Iq-l zk*v+hNeAgJK0dBCqkXV)<=?CW>1x`**_6ArhTAWhTP)9!5jRN8{C_4SFZNd`M8rH!F4w9Sb zbh?dfY+Td$-SAS4!$iikot<6XR-pYrMMXuVN00b$?d@8hJGW~s7}}-c4I?E22==WA z{%(cj@Bho>yR3HhhBYhi-@CUzhI}x6Cp7vGo_L@XVlWtJz$n@uBNPJ(RXkQfX~FxR zn&>JH2bIl+b((e|(2eT5A2+tcz$L$kU!90pK^d>=eT6}Z2Z%pTZ#3Jdg-b1j)db!Tpm~*-Zx`Hv=X4Zw0 zAmi)$3ft=BI~tdZG^b|pH^&aYiU>dIe5CR51?@F^%bRU=EH{L(PCtTR+N_%Oh@t7` zT(EKW5WjdaPs&?ZE(RT)5)l#Mkm2ER3xZ)kqg!x2Phc<@<`sdS=31qKkgO{s$COY~ zQw_~D*d*E5A}5IV$$W2+o3R9+Lk7vYpK7Aq`G4?n+Y=v5eh`G!I%A?R6A*0hHE2ab zu?m)w9OAD+hby*1pd|0LGu$TlNpMK-rH_L;L+G;=Ol*HW?a#Liz+R{3EvQCYj}1RO z#)oAlH9Vf+S)n7r(4424!}@LPp+{ksXon>dX+pvw0qM-jg0`63WI&mr2AW|NOFP(* ziEe2*YYo~{xBPFO#_K`J%v9J|Zy=Rizy6Jj$EPccs?qkqBu&VPWW3JQA#uwd$>H zW~EXJ^{C`VRaLDU-g7=WdJj1?I=Y<2<#I<`*%#3Lw8K#PvGj4Aw>P@UY>oNzsrM!U z0Re^|o%_w{;g>pcf1&zZ8)tD3*W zf4VI!&3w%P8$=%>adqLmynMk)Q>JCDyS38h(_=VS*OS((0n=Q2kst<#iGVJF%mruW zgFc@_leQ3XcswyHE9;`u&g^WM8%TSw7TERkixgS!9rDnZ<=cbA zB9W)JC;o*{Boevo*wN{N!-<7YpFYhVfBqGizHgG&Tyq^>jaOcu{0$-L_XQUciFdD} zVyh{EKmeZaWHXrvQ!EzSURu3p^S@CrB`p56fnJc-5Fz<@xeSbv@5jf-HyQL=kqU+( z6b6GqMMT_MAGTFu^BAE{)@oXv{^F|A*51zkvaMsLY+@oKS3MiTE-RBCUn7S-WR|j6 ztj(RNR5_JOJ@1ahfD3mV$15l(h-9)@CLW@fV6ruz7>ju7m)RL7$kpsye8rPOabLyN g$Hm7lo346jiYPXNG}SrjMMiAo7g6EAg;CD^AMNLIqyPW_ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_in_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_in_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..9e640d429e821dfdc8750e652f58e2c276003bea GIT binary patch literal 2556 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 BtIhxb literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_out_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_out_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c3bafcc64830dc813e5cb690e1aa59daedd89f GIT binary patch literal 1698 zcmXw34OCKh8%HQi2kKe9siA4kgu;fbOb7Rm@ZjoPvE=Aeew~?|&C{zjK~@&$;J5zvp>=&+q>~ zmk_s;=(@%ggTWAEKi!dtzP%i=0*^j5+$akMgU^ZG5uH@jn8n_P+dncg_x0BUE{AnG zCzVQtC7{TZl*0utC+`z&W_^0W>zB&P=fwsmG#vxLmk%P`FdiPurN~Ea)C2v*syfS) zpH35UVDFCjIt+@bf~Xwz!{@6cP(URRe5Km@8$Z3gh;og zram9M^UKiIsB+`vlv%Gv0BqCKNTgSpv9TKpqtesI^$hXt|7LW}#T?yTCu`4FZ+*9Q zv571;i^Wnrq^1f5f|b&H_w1(M{{3F_q?SGW;fGJshKGl}A$b1n)R@i8Xio2%gNIF? z5?^26RS2-jKPnke5$nkRToK52j08Yd;@*^YE|=@Bnb2DAK!DeDJ&3udxVYm+X=$lX zBZ}$i>0_z`s^E=3Z+y_#cOGzGtG=icRNJZr|NFe+YDY)Zx_6fPy4BLMCn05Tb~rTt zCzbwLEre1KzC^JnL8?$FEU=ur8jokL&&lz|qro2(NtPv#6M9g z*|j}Oe7`^X!=r0cpdJ>3gIQT@ z#ANo9=}|Tp7uRRmoGA-zn!1>IBRH6mKh^<livE5Rqu6fwN+hymqH3%@929gN0${TpwwXb*P=X+cX)28DY|~HCGVJv!2{lE= zNf(*6zaiAa_>V=lEfAtQUDp&xzbp_?%aGX@gVkog@=}1nwx&U$xNLsbY8#?uieZk$ z{I3gj6Y}Ov2Gm(*niGEeHhh~y5R1!+K0ZE07l=!Y z4yUs?oGEwWJB*quS91J=HqO5_jLX9E)MD5^+OC%X7?_2Xm6d5I9`%mwx4n4Wq$0qEFAFhS(ZlmOUlUZhD{L)xtttKruIwaa=HKe?+^G> zC<HT*Vw;G=4@>3<+)(9=5by9=g4rjDltru!vxd8wO@8;%)XELw*Ehb!3I44N$ znr_?=+5MOF9;@D6^^J!oN2AjnE;7G~s;sY{%v=01=59qTkH_;KILMx4v)NVav2N%I z%cBU-ojVs>!Q(jv$sb6i($3=(%%07hfh0+hb=TWLp&Clsm(-k;oNU1@jD*8Px@7A> Sz2uC8HujUa9XDfGr~d-Q`Bgap literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_out_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/white/zoom_out_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6aefaf2495df285c511875fc9a0940825ab305 GIT binary patch literal 2481 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 GR{smkE{1Oa literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/address_book_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/address_book_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..390a8112161073af1758ef2bc5e06ca318c28eed GIT binary patch literal 1271 zcmYjR3rtg27%mnH+RH`*P2si{vtC6Tsfja4e;M^7)?dYW--I#173}_;7`@jmO zJ^&pPWujY*G0rmMz?j)mu0p|TeZ(=H+Sd7mIxgb8wfEAqTg#UH$$8|Q|NGAWI)Ce? zq79+*-kV3G(L%)qqRrGA;~OCiYIf9TyJ@sQqga&tiSnqtT&2N_YnP@=pB`3D2J9b3 z7)3d8C3TG4fFeeE5sSfMB{AdysS}3!TaWOG#6w}l+hG`{cxV8~%c-qWiQXu?nr=Q6 z>l$nr-&z8VS9+kqC43QQ4`gg;GFQ)hXb-PB5_A-zWENLS;j)za`qe0sZZv^iF(uhT z>i`K-(C#BYvaRN&S9;DY7#u)T%^04+3@(iIKj(uf$>vXUw|4DPcfU;2b~moo_MYO5 zq$6Z?D%vr;lfB~n3APu2;Dy2OAP23-Lsjddf_meejQHF(-rVszxd@tefcz8ep6_i zu#5XtYG*iVLIAH}_NrIq1Y2|fn0h{cU{b6`uW^E%4Yi>=85=qaqgLwmh?9{(_;oeg zXq_a!OWigVDK#4}F=JxbL2Q1_swJ1-SmnR>D;8)wYUW5?LV5ykIp+s z+XEW6!)|=8`mj4ja#$v~Z=CsVal+0x^yMG>*}elFZ|eAI0z@y1iul*#kP`^S#G3*7 z1x5f6D)EoX-1sv-ogT?;whhoWUf;A5WU;+71T&L4;tM`iAEMFBFjah%$edjHWMxa{ zR8q;lugAED~MP;n^?-gXWX^z zh}ScS0b8=`q=T-P^{~ji*78}h4_+ZUy9wksVtbvoj9Y1NxpxR7R;_4hN?5}7I~hFR z8cfxr!aYrJ>psR*l)8Y_t$&r#+~g;b`+kud$GPa&l0@)!7$X)gs|^V3^?HYW=I9JE z;SW@U@a0eAaR|{#;el#`*sWHpKWcW48OB6xtHpA8VDxsOko6bO63<#`rKWEZYIRY_@N6CdXGu<~^l6)Nu06J}B&~o!#e!av;AYNZ2I-3V; F{sAUPTIc`( literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/address_book_32x32.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/address_book_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..901ced56e28caf3b4548b4e7aaefa714aafd7c44 GIT binary patch literal 1748 zcmX|?4Ommv8^AAJ*!Z|ZP#pIbu%Q%4j5fl;r!q8O6DMngQY#7)Fxry}*DdoFlrpDu{LODQIV20m{fQ6e^Jm=#9kw3&oo;m|SQBKI&%Z+Kh z-lm=v_)DHkQheg2@ObxhIkced{P4`lDoxtRCO0_)MgU5i?*9G)44Zg*fEY0pYdqFH zQ!5Bxm=d+kD# z+-Jp+FTbaf&U&~qCn+WgJz<~pT&ipE8e5V&777(64!}hHap)Fvz;&dz05XZC-V^|S z^Qk(3q4eT0+R{^ubiOOrKOD+bVUvIDt6%--Thb1KrQ*B!(jfe*eops_zFIf6N2|3) zMoa^cS1}IYJ+VSz++I=J2{w5yG@+p0O7Rx$Z_P_Y`A0v^;ei`q3g{N#8&P(dt!ah(hEm5>&!?WZc z*+=nb1^d?RD*7dAN2FjMUXFE%e<8aYr-q$2rsV)o9(J)1_)K*>09^!&)&DDUvB z{wi}AwT-{XM{rP?+5BbJMFMKtTP7R&;=i(?hW$A$^R69ft$XL?2y1K`QQ`NP^gTo3 z2US^lW1(+mpml2dDP31VG-rQhm6Uz{efdvq3yz)I|MrdiAL3Bs)kWfe@M%D=aTWc=EmG8~kxxmc>;k6xdl+-+Uve zI`>9m=BNKL8O8aS257v;P0=StkpaYrYQT)yKI_QWiwR-qT=qZrqiOZ@LkDk>FRF1R z|KkL5B(u_br?61JvG|AHf7+vbgxMQcEpGDMK>{O!)EP0Fn(4RSGt2d(*@JVKLbAn3 zV6+6TtW)zmv_hIAim|HGIqQ0bJEyd&4oi&}3`bbu+}?Vg*2q0E`e(+EkC2 z_ZnQK$P_C_O8^FQi?of3F%$rt846sfR3=|fF%t62LhprS5Xi$7S{)P-s7U=+P0TbA zwR^mB6ak=Y&jgXmN-aCb=dvj8gVSy?w-^y4ptKW}VsvUQ_I^F%a>~aR zo1A5ceQqJ;?Dytq#Rx&;N8C?m?-l*o-ZAqi)7!-Q`xRn>evzV`A6Ol>QD!IaNhd{B z)AVkYiOAl(x&x-^JjOYmsWV@0U4~$Dru?)-!Ad}j;)J5wIEtF7iK)e~CM}-xgW*uE(hO{*RKy0&|^8QrAwEv!room5dy&u-bGaa_fe1R zb{ThjlIyEsuAnfvC?v;r@shCy&??nerOw4B)2nhU`^U7cHCE{U8bTd!t#>`k06bmb b`FMpPVRO*W2O`RsyZlUFxkh?gf>-_@3ot6J literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/alert_24x24.png b/oss/vtiger/trunk/modules/Mobile/resources/images/iconza/yellow/alert_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..35635899527a31a32527d8c39dd020c156a2c073 GIT binary patch literal 2094 zcmYLK2~<;O7XCvbS$HG?67r&iB_JSBNsJ5ifB|Hb#RaQ%KphEi!0Azu4lZ$|Y-+@% z;?^TDR-mniBTOaKc90e@fFQ*nAVok>l0YL%1WbhN@68L^_MUU!|K9um`+fJ`|Ni$s zAHQw0BV{QC0N@xC9rXz|!Zsz@V^772FarR@`IxAPUE*6QqH;d=6QF2{&u-M{W_?W zSjFS<8nTVol-*@Q=*Vc(*@Lc5PFHCVYLyp`bf>j^M4Gz7-R$AP!k+m2O%Z5;~+r%)?`hek&IVIQx- z344M;O(5tyWgVN7H5!EF&T#|&{{Dc$V1ka$P9T*^%PY!mC);>1LD5Aj!j2s~uW-3s z-uUIn~d}Rx_8FNmHwk( zUh;@nlq8c*KaH5`!Gb{xUQf&eopxS3^wQnb`)r(Hu~@;{ zwQE3QQSUqGhN0mq#MZ00dBF(4=?2BFljX z#|%&$o4709YdpKNk!3Vh_R)v{cf7!3kmDe$1B-5z-R z1OPujzs3C{5C|YXJ|2snxcKes>k9}=9DuyX1!&&502TuUOol6MWzhWZ<5)>46$;s( zRD@

    '; + session_unregister('image_type_error'); + } + $focus->id = $record; + $focus->retrieve_entity_info($record, $currentModule); +} +if($isduplicate == 'true') $focus->id = ''; + +// Identify this module as custom module. +$smarty->assign('CUSTOM_MODULE', true); + +$smarty->assign('APP', $app_strings); +$smarty->assign('MOD', $mod_strings); +$smarty->assign('MODULE', $currentModule); +// TODO: Update Single Module Instance name here. +$smarty->assign('SINGLE_MOD', getTranslatedString($currentModule)); +$smarty->assign('CATEGORY', $category); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('THEME', $theme); +$smarty->assign('ID', $focus->id); +$smarty->assign('MODE', $focus->mode); + +$recordName = array_values(getEntityName($currentModule, $focus->id)); +$recordName = $recordName[0]; +$smarty->assign('NAME', $recordName); +$smarty->assign('UPDATEINFO',updateInfo($focus->id)); + +$smarty->assign("CUSTOMFIELD", $cust_fld); + +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +//Added to display the Tax informations +$tax_details = getTaxDetailsForProduct($focus->id); + +for($i=0;$iid); +} +$smarty->assign("TAX_DETAILS", $tax_details); + +$price_details = getPriceDetailsForProduct($focus->id, $focus->unit_price, 'available_associated',$currentModule); +$smarty->assign("PRICE_DETAILS", $price_details); + +$smarty->assign('IS_REL_LIST',isPresentRelatedLists($currentModule)); + +$validationArray = split_validationdataArray(getDBValidationData($focus->tab_name, $tabid)); +$smarty->assign('VALIDATION_DATA_FIELDNAME',$validationArray['fieldname']); +$smarty->assign('VALIDATION_DATA_FIELDDATATYPE',$validationArray['datatype']); +$smarty->assign('VALIDATION_DATA_FIELDLABEL',$validationArray['fieldlabel']); + +$smarty->assign('EDIT_PERMISSION', isPermitted($currentModule, 'EditView', $record)); +$smarty->assign('CHECK', $tool_buttons); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +$smarty->assign('IS_REL_LIST', isPresentRelatedLists($currentModule)); +$smarty->assign('SinglePane_View', $singlepane_view); + +if($singlepane_view == 'true') { + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +if(isPermitted($currentModule, 'EditView', $record) == 'yes') + $smarty->assign('EDIT_DUPLICATE', 'permitted'); +if(isPermitted($currentModule, 'Delete', $record) == 'yes') + $smarty->assign('DELETE', 'permitted'); + +$smarty->assign('BLOCKS', getBlocks($currentModule,'detail_view','',$focus->column_fields)); + +// Gather the custom link information to display +include_once('vtlib/Vtiger/Link.php'); +$customlink_params = Array('MODULE'=>$currentModule, 'RECORD'=>$focus->id, 'ACTION'=>vtlib_purify($_REQUEST['action'])); +$smarty->assign('CUSTOM_LINKS', Vtiger_Link::getAllByType($tabid, 'DETAILVIEW', $customlink_params)); +// END + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("Inventory/InventoryDetailView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/DetailViewAjax.php b/oss/vtiger/trunk/modules/Products/DetailViewAjax.php new file mode 100644 index 00000000..43da8072 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/DetailViewAjax.php @@ -0,0 +1,39 @@ +retrieve_entity_info($crmid, $currentModule); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = 'edit'; + $modObj->save($currentModule); + if($modObj->id != '') + { + echo ':#:SUCCESS'; + }else + { + echo ':#:FAILURE'; + } + }else + { + echo ':#:FAILURE'; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/EditListPrice.php b/oss/vtiger/trunk/modules/Products/EditListPrice.php new file mode 100644 index 00000000..4cf8eb78 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/EditListPrice.php @@ -0,0 +1,65 @@ + + + + + + +
    '.$mod_strings["LBL_EDITLISTPRICE"].''.$app_strings[
    + + + + +
    + + + + + +
    '.$mod_strings["LBL_EDITLISTPRICE"].'
    +
    + + + + +
    + + +
    +
    '; + +echo $output; + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/EditView.php b/oss/vtiger/trunk/modules/Products/EditView.php new file mode 100644 index 00000000..539f871a --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/EditView.php @@ -0,0 +1,262 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if($record) { + $focus->id = $record; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($record, $currentModule); + $product_base_currency = getProductBaseCurrency($focus->id,$currentModule); +} else { + $product_base_currency = fetchCurrency($current_user->id); +} + +if($image_error=="true") +{ + $explode_decode_val=explode("&",$decode_val); + for($i=1;$icolumn_fields[$field_name_val]=$field_value; + } +} + +if($isduplicate == 'true') { + $focus->id = ''; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +//needed when creating a new product with a default vtiger_vendor name to passed +if (isset($_REQUEST['name']) && is_null($focus->name)) { + $focus->name = $_REQUEST['name']; + +} +if (isset($_REQUEST['vendorid']) && is_null($focus->vendorid)) { + $focus->vendorid = $_REQUEST['vendorid']; +} + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') { + $smarty->assign('BLOCKS', getBlocks($currentModule, $disp_view, $focus->mode, $focus->column_fields)); +} else { + $bas_block = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS'); + $adv_block = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'ADV'); + + $blocks['basicTab'] = $bas_block; + if(is_array($adv_block)) + $blocks['moreTab'] = $adv_block; + + $smarty->assign("BLOCKS",$blocks); + $smarty->assign("BLOCKS_COUNT",count($blocks)); +} + +$smarty->assign('OP_MODE',$disp_view); +$smarty->assign('APP', $app_strings); +$smarty->assign('MOD', $mod_strings); +$smarty->assign('MODULE', $currentModule); +// TODO: Update Single Module Instance name here. +$smarty->assign('SINGLE_MOD', getTranslatedString($currentModule)); +$smarty->assign('CATEGORY', $category); +$smarty->assign("THEME", $theme); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('ID', $focus->id); +$smarty->assign('MODE', $focus->mode); + +$smarty->assign('CHECK', Button_Check($currentModule)); +$smarty->assign('DUPLICATE', $isduplicate); + +if($focus->mode == 'edit') { + $recordName = array_values(getEntityName($currentModule, $focus->id)); + $recordName = $recordName[0]; + $smarty->assign('NAME', $recordName); + $smarty->assign('UPDATEINFO',updateInfo($focus->id)); +} + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if(isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset($_REQUEST['return_viewname'])) $smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +// In case you have a date field +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
    '. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +// Gather the help information associated with fields +$smarty->assign('FIELDHELPINFO', vtlib_getFieldHelpInfo($currentModule)); +// END + +if($focus->id != '') + $smarty->assign("ROWCOUNT", getImageCount($focus->id)); + +if(isset($cust_fld)) +{ + $smarty->assign("CUSTOMFIELD", $cust_fld); +} +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +//Tax handling (get the available taxes only) - starts +if($focus->mode == 'edit') +{ + $retrieve_taxes = true; + $productid = $focus->id; + $tax_details = getTaxDetailsForProduct($productid,'available_associated'); +} +elseif($_REQUEST['isDuplicate'] == 'true') +{ + $retrieve_taxes = true; + $productid = $_REQUEST['record']; + $tax_details = getTaxDetailsForProduct($productid,'available_associated'); +} +else + $tax_details = getAllTaxes('available'); + +for($i=0;$iassign("TAX_DETAILS", $tax_details); +//Tax handling - ends + +$unit_price = $focus->column_fields['unit_price']; +$price_details = getPriceDetailsForProduct($productid, $unit_price, 'available',$currentModule); +$smarty->assign("PRICE_DETAILS", $price_details); + +$base_currency = 'curname' . $product_base_currency; +$smarty->assign("BASE_CURRENCY", $base_currency); + +if(isset($focus->id) && $_REQUEST['isDuplicate'] != 'true') + $is_parent = $focus->isparent_check(); +else + $is_parent = 0; +$smarty->assign("IS_PARENT",$is_parent); + +if($_REQUEST['return_module']=='Products' && isset($_REQUEST['return_action'])){ + $return_name = getProductName($_REQUEST['return_id']); + $smarty->assign("RETURN_NAME", $return_name); +} + +if($errormessage==2) +{ + $msg =$mod_strings['LBL_MAXIMUM_LIMIT_ERROR']; + $errormessage ="".$msg."

    "; +} +else if($errormessage==3) +{ + $msg = $mod_strings['LBL_UPLOAD_ERROR']; + $errormessage ="".$msg."

    "; + +} +else if($errormessage=="image") +{ + $msg = $mod_strings['LBL_IMAGE_ERROR']; + $errormessage ="".$msg."

    "; +} +else if($errormessage =="invalid") +{ + $msg = $mod_strings['LBL_INVALID_IMAGE']; + $errormessage ="".$msg."

    "; +} +else +{ + $errormessage=""; +} +if($errormessage!="") +{ + $smarty->assign("ERROR_MESSAGE",$errormessage); +} + +// Added to set product active when creating a new product +$mode=$focus->mode; +if($mode != "edit" && $_REQUEST['isDuplicate'] != "true") + $smarty->assign("PROD_MODE", "create"); + + +if($focus->mode == 'edit') { + $smarty->display('Inventory/InventoryEditView.tpl'); +} else { + $smarty->display('Inventory/InventoryCreateView.tpl'); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/ExportRecords.php b/oss/vtiger/trunk/modules/Products/ExportRecords.php new file mode 100644 index 00000000..31029bc0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/ExportRecords.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Products/FindDuplicateRecords.php b/oss/vtiger/trunk/modules/Products/FindDuplicateRecords.php new file mode 100644 index 00000000..a1ff9757 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/FindDuplicateRecords.php @@ -0,0 +1,106 @@ +pquery($sql, array($id)); + DeleteEntity($req_module,$return_module,$focus,$id,""); + } + else { + $ids_list[] = $id; + } +} + if(count($ids_list) > 0) { + $ret = getEntityName($req_module,$ids_list); + if(count($ret) > 0) + { + $errormsg = implode(',',$ret); + } + echo "
    "; + echo "
    + + + + + + + + + +
    + $app_strings[LBL_DUP_PERMISSION] $req_module $errormsg
    + $app_strings[LBL_GO_BACK]
    +
    +
    "; + echo "
    "; + exit; + } +} + +include("include/saveMergeCriteria.php"); +$ret_arr=getDuplicateRecordsArr($req_module); + +$fld_values=$ret_arr[0]; +$total_num_group=count($fld_values); +$fld_name=$ret_arr[1]; +$ui_type=$ret_arr[2]; + +$smarty->assign("NAVIGATION",$ret_arr["navigation"]);//Added for page navigation +$smarty->assign("MODULE",$req_module); +$smarty->assign("NUM_GROUP",$total_num_group); +$smarty->assign("FIELD_NAMES",$fld_name); +$smarty->assign("CATEGORY",$parenttab); +$smarty->assign("ALL_VALUES",$fld_values); +if(isPermitted($req_module,'Delete','') == 'yes') + $button_del = $app_strings['LBL_MASS_DELETE']; +$smarty->assign("DELETE",$button_del); + +$smarty->assign("MOD", return_module_language($current_language,$req_module)); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MODE",'view'); +if(isset($_REQUEST['button_view'])) +{ + $smarty->assign("VIEW",'true'); +} +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("FindDuplicateAjax.tpl"); +else + $smarty->display('FindDuplicateDisplay.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/Import.php b/oss/vtiger/trunk/modules/Products/Import.php new file mode 100644 index 00000000..576068f5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/Import.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Products/InventoryPriceAjax.php b/oss/vtiger/trunk/modules/Products/InventoryPriceAjax.php new file mode 100644 index 00000000..453479f0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/InventoryPriceAjax.php @@ -0,0 +1,38 @@ + 0) { + $prices_for_products = getPricesForProducts($currencyid, $product_ids); + $prices_for_services = getPricesForProducts($currencyid, $product_ids, 'Services'); +} + +// To get the Price Values in the same order as the Products +for ($i=0;$i diff --git a/oss/vtiger/trunk/modules/Products/InventoryTaxAjax.php b/oss/vtiger/trunk/modules/Products/InventoryTaxAjax.php new file mode 100644 index 00000000..4c859ea8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/InventoryTaxAjax.php @@ -0,0 +1,68 @@ + + + '.$app_strings['LABEL_SET_TAX_FOR'].' : '.$product_total.' +   + + + '; + +$net_tax_total = 0.00; +for($i=0,$j=$i+1;$i % + + + '.$tax_label.' + + + + + '; +} + +$tax_div .= ''; + +if($associated_tax_count == 0) +{ + $tax_div .= '
    '.$mod_strings['LBL_NO_TAXES_ASSOCIATED'].'.
    '; +} + +$tax_div .= ''; + +echo $tax_div; + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/ListView.php b/oss/vtiger/trunk/modules/Products/ListView.php new file mode 100644 index 00000000..5a09af30 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/ListView.php @@ -0,0 +1,212 @@ +initSortbyField($currentModule); +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION['PRODUCTS_ORDER_BY'] = $order_by; +$_SESSION['PRODUCTS_SORT_ORDER'] = $sorder; + +$smarty = new vtigerCRM_Smarty(); + +$smarty->assign('MOD', $mod_strings); +$smarty->assign('APP', $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign('MODULE', $currentModule); +$smarty->assign('SINGLE_MOD', $currentModule); +$smarty->assign('CATEGORY', $category); +$smarty->assign('BUTTONS', $list_buttons); +$smarty->assign('CHECK', $tool_buttons); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); + +$smarty->assign('CHANGE_OWNER', getUserslist()); +$smarty->assign('CHANGE_GROUP_OWNER', getGroupslist()); + +// Enabling Module Search +$url_string = ''; +if($_REQUEST['query'] == 'true') { + list($where, $ustring) = split('#@@#', getWhereCondition($currentModule)); + $url_string .= "&query=true$ustring"; + $smarty->assign('SEARCH_URL', $url_string); +} + +// Custom View +$customView = new CustomView($currentModule); +$viewid = $customView->getViewId($currentModule); +$customview_html = $customView->getCustomViewCombo($viewid); +$viewinfo = $customView->getCustomViewByCvid($viewid); + +// Feature available from 5.1 +if(method_exists($customView, 'isPermittedChangeStatus')) { + // Approving or Denying status-public by the admin in CustomView + $statusdetails = $customView->isPermittedChangeStatus($viewinfo['status']); + + // To check if a user is able to edit/delete a CustomView + $edit_permit = $customView->isPermittedCustomView($viewid,'EditView',$currentModule); + $delete_permit = $customView->isPermittedCustomView($viewid,'Delete',$currentModule); + + $smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + $smarty->assign("CV_EDIT_PERMIT",$edit_permit); + $smarty->assign("CV_DELETE_PERMIT",$delete_permit); +} +// END + +$smarty->assign("VIEWID", $viewid); + +if($viewinfo['viewname'] == 'All') $smarty->assign('ALL', 'All'); + +if($viewid ==0) +{ + echo "
    "; + echo "
    + + + + + + + + + +
    $app_strings[LBL_PERMISSION]
    + $app_strings[LBL_GO_BACK]
    +
    +
    "; + echo "
    "; + exit; +} + +$listquery = getListQuery($currentModule); +$list_query= $customView->getModifiedCvListQuery($viewid, $listquery, $currentModule); + +if($where != '') { + $list_query = "$list_query AND $where"; +} + +// Sorting +if(!empty($order_by)) { + if($order_by == 'smownerid') $list_query .= ' ORDER BY user_name '.$sorder; + else { + $tablename = getTableNameForField($currentModule, $order_by); + $tablename = ($tablename != '')? ($tablename . '.') : ''; + $list_query .= ' ORDER BY ' . $tablename . $order_by . ' ' . $sorder; + } +} + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +$smarty->assign("CUSTOMVIEW_OPTION",$customview_html); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string, $currentModule, 'index', $viewid); +$smarty->assign("NAVIGATION", $navigationOutput); + +$listview_header = getListViewHeader($focus,$currentModule,$url_string,$sorder,$order_by,'',$customView); +$listview_entries = getListViewEntries($focus,$currentModule,$list_result,$navigation_array,'','','EditView','Delete',$customView); +$listview_header_search = getSearchListHeaderValues($focus,$currentModule,$url_string,$sorder,$order_by,'',$customView); + +$smarty->assign('LISTHEADER', $listview_header); +$smarty->assign('LISTENTITY', $listview_entries); +$smarty->assign('SEARCHLISTHEADER',$listview_header_search); + +// Module Search +$alphabetical = AlphabeticalSearch($currentModule,'index',$focus->def_basicsearch_col,'true','basic','','','','',$viewid); +$fieldnames = getAdvSearchfields($currentModule); +$criteria = getcriteria_options(); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("CRITERIA", $criteria); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR","The User does not have permission to delete ".$errormsg." ".$currentModule); +}else +{ + $smarty->assign("ERROR",""); +} +$url_string = '&smodule=PRODUCTS'; // assigning http url string + +if(isset($where) && $where != '') +{ + $list_query .= ' and '.$where; + + $_SESSION['export_where'] = $where; +} +else + unset($_SESSION['export_where']); + +$smarty->assign("SELECT_SCRIPT", $view_script); + +$smarty->assign("AVALABLE_FIELDS", getMergeFields($currentModule,"available_fields")); +$smarty->assign("FIELDS_TO_MERGE", getMergeFields($currentModule,"fileds_to_merge")); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display('ListView.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/ListViewPagging.php b/oss/vtiger/trunk/modules/Products/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/MassEdit.php b/oss/vtiger/trunk/modules/Products/MassEdit.php new file mode 100644 index 00000000..4a57ce1e --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/MassEdit.php @@ -0,0 +1,43 @@ +mode = ''; +$mode = 'mass_edit'; +$disp_view = getView($focus->mode); +$idstring = $_REQUEST['idstring']; + +$smarty = new vtigerCRM_Smarty; +$smarty->assign('MODULE',$currentModule); +$smarty->assign('APP',$app_strings); +$smarty->assign('THEME', $theme); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('IDS',$idstring); +$smarty->assign('MASS_EDIT','1'); +$smarty->assign('BLOCKS',getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("CATEGORY",getParentTab()); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/MassEditSave.php b/oss/vtiger/trunk/modules/Products/MassEditSave.php new file mode 100644 index 00000000..90fcd98c --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/MassEditSave.php @@ -0,0 +1,59 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Products/Popup.php b/oss/vtiger/trunk/modules/Products/Popup.php new file mode 100644 index 00000000..40aae3fa --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/Popup.php @@ -0,0 +1,11 @@ + diff --git a/oss/vtiger/trunk/modules/Products/ProcessDuplicates.php b/oss/vtiger/trunk/modules/Products/ProcessDuplicates.php new file mode 100644 index 00000000..bb5047fa --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/ProcessDuplicates.php @@ -0,0 +1,134 @@ +pquery("SELECT count(*) AS count FROM vtiger_crmentity WHERE crmid=? and deleted=0", array($merge_id)); + $count = $adb->query_result($result,0,'count'); + + if($count > 0) + { + // First, save the primary record + $focus->mode="edit"; + setObjectValuesFromRequest($focus); + $focus->save($module); + $rec_values=$focus->column_fields; + + // Remove the id of primary record from the list of records to be deleted. + $del_value=explode(",",$recordids,-1); + $offset = array_search($merge_id,$del_value); + unset($del_value[$offset]); + + // Transfer the related lists of the records to be deleted, to the primary record's related list + if(method_exists($focus, 'transferRelatedRecords')){ + $focus->transferRelatedRecords($module,$del_value,$merge_id); + } else { + transferRelatedRecords($module,$del_value,$merge_id); + } + + // Delete the records by id specified in the list + foreach($del_value as $value) + { + DeleteEntity($_REQUEST['module'],$_REQUEST['return_module'],$focus,$value,""); + } + } + + ?> + +assign("EDIT_DUPLICATE",""); + if($record_count == 2) { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + else { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[2]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[2]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + + $all_values_array=getRecordValues($exploded_id,$module); + $all_values=$all_values_array[0]; + $js_arr_val=$all_values_array[1]; + $fld_array=$all_values_array[2]; + $js_arr=implode(",",$js_arr_val); + + $imported_records = Array(); + $sql="select bean_id from vtiger_users_last_import where bean_type=? and deleted=0"; + $result = $adb->pquery($sql, array($module)); + $num_rows=$adb->num_rows($result); + $count=0; + for($i=0; $i<$num_rows;$i++) + { + foreach($exploded_id as $value) + if($value == $adb->query_result($result,$i,"bean_id")) + $count++; + array_push($imported_records,$adb->query_result($result,$i,"bean_id")); + } + + if ($record_count == $count) + $no_existing=1; + else + $no_existing=0; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("RECORD_COUNT",$record_count); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULENAME", $module); + $smarty->assign("PARENT_TAB", $parent_tab); + $smarty->assign("JS_ARRAY", $js_arr); + $smarty->assign("ID_ARRAY", $exploded_id); + $smarty->assign("IDSTRING",$idstring); + $smarty->assign("ALLVALUES", $all_values); + $smarty->assign("FIELD_ARRAY", $fld_array); + $smarty->assign("IMPORTED_RECORDS", $imported_records); + $smarty->assign("NO_EXISTING", $no_existing); + $smarty->display("MergeFields.tpl"); +} + +?> diff --git a/oss/vtiger/trunk/modules/Products/Products.js b/oss/vtiger/trunk/modules/Products/Products.js new file mode 100644 index 00000000..fba7143f --- /dev/null +++ b/oss/vtiger/trunk/modules/Products/Products.js @@ -0,0 +1,172 @@ +/*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************/ +document.write(""; +exit(); +?> diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/Settings.php b/oss/vtiger/trunk/modules/PurchaseOrder/Settings.php new file mode 100644 index 00000000..980dd078 --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/Settings.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/TagCloud.php b/oss/vtiger/trunk/modules/PurchaseOrder/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/UnifiedSearch.php b/oss/vtiger/trunk/modules/PurchaseOrder/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/index.php b/oss/vtiger/trunk/modules/PurchaseOrder/index.php new file mode 100644 index 00000000..f28f3a9b --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/index.php @@ -0,0 +1,53 @@ + diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/language/en_us.lang.php b/oss/vtiger/trunk/modules/PurchaseOrder/language/en_us.lang.php new file mode 100644 index 00000000..911742c7 --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/language/en_us.lang.php @@ -0,0 +1,203 @@ +'PurchaseOrder', +'LBL_RELATED_PRODUCTS'=>'Product Details', +'LBL_MODULE_TITLE'=>'Purchase Order: Home', +'LBL_SEARCH_FORM_TITLE'=>'Purchase Order Search', +'LBL_LIST_FORM_TITLE'=>'Purchase Order List', +'LBL_NEW_FORM_TITLE'=>'New Purchase Order', +'LBL_MEMBER_ORG_FORM_TITLE'=>'Member Organizations', + +'LBL_LIST_ACCOUNT_NAME'=>'Account Name', +'LBL_LIST_CITY'=>'City', +'LBL_LIST_WEBSITE'=>'Website', +'LBL_LIST_STATE'=>'State', +'LBL_LIST_PHONE'=>'Phone', +'LBL_LIST_EMAIL_ADDRESS'=>'Email Address', +'LBL_LIST_CONTACT_NAME'=>'Contact Name', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + +'LBL_ACCOUNT'=>'Account:', +'LBL_ACCOUNT_NAME'=>'Account Name:', +'LBL_PHONE'=>'Phone:', +'LBL_WEBSITE'=>'Website:', +'LBL_FAX'=>'Fax:', +'LBL_TICKER_SYMBOL'=>'Ticker Symbol:', +'LBL_OTHER_PHONE'=>'Other Phone:', +'LBL_ANY_PHONE'=>'Any Phone:', +'LBL_MEMBER_OF'=>'Member of:', +'LBL_EMAIL'=>'Email:', +'LBL_EMPLOYEES'=>'Employees:', +'LBL_OTHER_EMAIL_ADDRESS'=>'Other Email:', +'LBL_ANY_EMAIL'=>'Any Email:', +'LBL_OWNERSHIP'=>'Ownership:', +'LBL_RATING'=>'Rating:', +'LBL_INDUSTRY'=>'Industry:', +'LBL_SIC_CODE'=>'SIC Code:', +'LBL_TYPE'=>'Type:', +'LBL_ANNUAL_REVENUE'=>'Annual Revenue:', +'LBL_ADDRESS_INFORMATION'=>'Address Information', +'LBL_Quote_INFORMATION'=>'Account Information', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', +'LBL_BILLING_ADDRESS'=>'Billing Address:', +'LBL_SHIPPING_ADDRESS'=>'Shipping Address:', +'LBL_ANY_ADDRESS'=>'Any Address:', +'LBL_CITY'=>'City:', +'LBL_STATE'=>'State:', +'LBL_POSTAL_CODE'=>'Postal Code:', +'LBL_COUNTRY'=>'Country:', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', +'LBL_TERMS_INFORMATION'=>'Terms & Conditions', +'LBL_DESCRIPTION'=>'Description:', +'NTC_COPY_BILLING_ADDRESS'=>'Copy billing address to shipping address', +'NTC_COPY_SHIPPING_ADDRESS'=>'Copy shipping address to billing address', +'NTC_REMOVE_MEMBER_ORG_CONFIRMATION'=>'Are you sure you want to remove this record as a member organization?', +'LBL_DUPLICATE'=>'Potential Duplicate Accounts', +'MSG_DUPLICATE' => 'Creating this vtiger_account may vtiger_potentialy create a duplicate vtiger_account. You may either select an vtiger_account from the list below or you may click on Create New Account to continue creating a new vtiger_account with the previously entered data.', + +'LBL_INVITEE'=>'Contacts', +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", + +'LBL_SELECT_ACCOUNT'=>'Select Account', +'LBL_GENERAL_INFORMATION'=>'General Information', + +//for v4 release added +'LBL_NEW_POTENTIAL'=>'New Potential', +'LBL_POTENTIAL_TITLE'=>'Potentials', + +'LBL_NEW_TASK'=>'New Task', +'LBL_TASK_TITLE'=>'Tasks', +'LBL_NEW_CALL'=>'New Call', +'LBL_CALL_TITLE'=>'Calls', +'LBL_NEW_MEETING'=>'New Meeting', +'LBL_MEETING_TITLE'=>'Meetings', +'LBL_NEW_EMAIL'=>'New Email', +'LBL_EMAIL_TITLE'=>'Emails', +'LBL_NEW_CONTACT'=>'New Contact', +'LBL_CONTACT_TITLE'=>'Contacts', + +//Added vtiger_fields after RC1 - Release +'LBL_ALL'=>'All', +'LBL_PROSPECT'=>'Prospect', +'LBL_INVESTOR'=>'Investor', +'LBL_RESELLER'=>'Reseller', +'LBL_PARTNER'=>'Partner', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Account Tools', +//Added for 4GA +'Subject'=>'Subject', +'Quote Name'=>'Quote Name', +'Vendor Name'=>'Vendor Name', +'Requisition No'=>'Requisition No', +'Tracking Number'=>'Tracking Number', +'Contact Name'=>'Contact Name', +'Due Date'=>'Due Date', +'Carrier'=>'Carrier', +'Type'=>'Type', +'Sales Tax'=>'Sales Tax', +'Sales Commission'=>'Sales Commission', +'Excise Duty'=>'Excise Duty', +'Total'=>'Total', +'Product Name'=>'Product Name', +'Assigned To'=>'Assigned To', +'Billing Address'=>'Billing Address', +'Shipping Address'=>'Shipping Address', +'Billing City'=>'Billing City', +'Billing State'=>'Billing State', +'Billing Code'=>'Billing Postal Code', +'Billing Country'=>'Billing Country', +'Billing Po Box'=>'Billing PO Box', +'Shipping Po Box'=>'Shipping PO Box', +'Shipping City'=>'Shipping City', +'Shipping State'=>'Shipping State', +'Shipping Code'=>'Shipping Postal Code', +'Shipping Country'=>'Shipping Country', +'City'=>'City', +'State'=>'State', +'Code'=>'Code', +'Country'=>'Country', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Description'=>'Description', +'Potential Name'=>'Potential Name', +'Customer No'=>'Customer No', +'Purchase Order'=>'Purchase Order', +'Vendor Terms'=>'Vendor Terms', +'Pending'=>'Pending', +'Account Name'=>'Account Name', +'Terms & Conditions'=>'Terms & Conditions', +//Quote Info +'LBL_PO_INFORMATION'=>'Purchase Order Information', +'LBL_PO'=>'Purchase Order:', + + //Added for 4.2 GA +'LBL_SO_FORM_TITLE'=>'Sales', +'LBL_PO_FORM_TITLE'=>'Purchase', +'LBL_SUBJECT_TITLE'=>'Subject', +'LBL_VENDOR_NAME_TITLE'=>'Vendor Name', +'LBL_TRACKING_NO_TITLE'=>'Tracking No:', +'LBL_PO_SEARCH_TITLE'=>'Purchase Order Search', +'LBL_SO_SEARCH_TITLE'=>'Sales Order Search', +'LBL_QUOTE_NAME_TITLE'=>'Quote Name', +'Order No'=>'Order No', +'Status'=>'Status', +'PurchaseOrder'=>'Purchase Order', +'LBL_MY_TOP_PO'=>'My Top Open Purchase Orders', + +//Added for existing Picklist Entries + +'FedEx'=>'FedEx', +'UPS'=>'UPS', +'USPS'=>'USPS', +'DHL'=>'DHL', +'BlueDart'=>'BlueDart', + +'Created'=>'Created', +'Approved'=>'Approved', +'Delivered'=>'Delivered', +'Cancelled'=>'Cancelled', +'Received Shipment'=>'Received Shipment', + +//Added for Reports (5.0.4) +'Tax Type'=>'Tax Type', +'Discount Percent'=>'Discount Percent', +'Discount Amount'=>'Discount Amount', +'Terms & Conditions'=>'Terms & Conditions', +'Adjustment'=>'Adjustment', +'Sub Total'=>'Sub Total', +'S&H Amount'=>'S&H Amount', + +//Added after 5.0.4 GA +'PurchaseOrder No'=>'PurchaseOrder No', + +); + +?> diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/PurchaseOrder/language/zh_cn.lang.php new file mode 100644 index 00000000..52dafc5d --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/language/zh_cn.lang.php @@ -0,0 +1,188 @@ + '采购订单', + 'LBL_RELATED_PRODUCTS' => '产品细节', + 'LBL_MODULE_TITLE' => '采购订单:首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻采购订单', + 'LBL_LIST_FORM_TITLE' => '采购订单列表', + 'LBL_NEW_FORM_TITLE' => '新增采购订单', + 'LBL_MEMBER_ORG_FORM_TITLE' => '成员组织', + + 'LBL_LIST_ACCOUNT_NAME' => '客户名称', + 'LBL_LIST_CITY' => '乡镇市区', + 'LBL_LIST_WEBSITE' => '网站', + 'LBL_LIST_STATE' => '县市', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_EMAIL_ADDRESS' => '电子邮件', + 'LBL_LIST_CONTACT_NAME' => '联络人名称', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + +'LBL_ACCOUNT' => '客户:', + 'LBL_ACCOUNT_NAME' => '客户名称:', + 'LBL_PHONE' => '电话:', + 'LBL_WEBSITE' => '网站:', + 'LBL_FAX' => '传真:', + 'LBL_TICKER_SYMBOL' => '传票符号:', + 'LBL_OTHER_PHONE' => '其它电话:', + 'LBL_ANY_PHONE' => '其它电话:', + 'LBL_MEMBER_OF' => '群组:', + 'LBL_EMAIL' => '电子信箱:', + 'LBL_EMPLOYEES' => '员工人数:', + 'LBL_OTHER_EMAIL_ADDRESS' => '其它电子信箱:', + 'LBL_ANY_EMAIL' => '其它电子信箱:', + 'LBL_OWNERSHIP' => '负责人:', + 'LBL_RATING' => '评分:', + 'LBL_INDUSTRY' => '产业别:', + 'LBL_SIC_CODE' => '统一编号:', + 'LBL_TYPE' => '类型:', + 'LBL_ANNUAL_REVENUE' => '年收入:', + 'LBL_ADDRESS_INFORMATION' => '住址信息', + 'LBL_Quote_INFORMATION' => '客户信息', + 'LBL_CUSTOM_INFORMATION' => '自订信息', + 'LBL_BILLING_ADDRESS' => '发票住址:', + 'LBL_SHIPPING_ADDRESS' => '送货住址:', + 'LBL_ANY_ADDRESS' => '其它住址:', + 'LBL_CITY' => '乡镇市区:', + 'LBL_STATE' => '县市:', + 'LBL_POSTAL_CODE' => '邮政编码:', + 'LBL_COUNTRY' => '国家:', +'LBL_DESCRIPTION_INFORMATION' => '说明信息', + 'LBL_TERMS_INFORMATION' => '期限与条件', + 'LBL_DESCRIPTION' => '说明:', + 'NTC_COPY_BILLING_ADDRESS' => '复制发票地址到送货地址', + 'NTC_COPY_SHIPPING_ADDRESS' => '复制送货地址到送货发票地址', + 'NTC_REMOVE_MEMBER_ORG_CONFIRMATION' => '您确定要删除这笔数据?', + 'LBL_DUPLICATE' => '客户数据重复', + 'MSG_DUPLICATE' => '建立这个客户数据可能与现有数据重复,您可以选择将数据归属于下面其中一个项目中,或是点选建立新客户来透过刚刚输入的数据建立新项目。', + +'LBL_INVITEE' => '联络人', + 'ERR_DELETE_RECORD' => '必须指定数据编号才能删除客户。', + 'LBL_SELECT_ACCOUNT' => '选择客户', + 'LBL_GENERAL_INFORMATION' => '一般信息', + +//for v4 release added +'LBL_NEW_POTENTIAL' => '新潜在机会', + 'LBL_POTENTIAL_TITLE' => '潜在机会', + 'LBL_NEW_TASK' => '新任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => ' 安排电话联系', + 'LBL_CALL_TITLE' => '电话联系', + 'LBL_NEW_MEETING' => '新增会议', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '寄发电子邮件', + 'LBL_EMAIL_TITLE' => '电子邮件', + 'LBL_NEW_CONTACT' => '新增联络人', + 'LBL_CONTACT_TITLE' => '联络人', + +//Added vtiger_fields after RC1 - Release + 'LBL_ALL' => '全部', + 'LBL_PROSPECT' => '预期', + 'LBL_INVESTOR' => '投资者', + 'LBL_RESELLER' => '经销商', + 'LBL_PARTNER' => '合作伙伴', + +// Added for 4GA + 'LBL_TOOL_FORM_TITLE' => '客户管理工具', +//Added for 4GA + 'Subject' => '主旨', + 'Quote Name' => '报价单名称', + 'Vendor Name' => '厂商名称', + 'Requisition No' => '申请书编号', + 'Tracking Number' => '追踪编号', + 'Contact Name' => '联络人名称', + 'Due Date' => '到期日', + 'Carrier' => '货运商', + 'Type' => '类型', + 'Sales Tax' => '销售税额', + 'Sales Commission' => '销售佣金', + 'Excise Duty' => '货物税', + 'Total' => '总计', + 'Product Name' => '产品名称', + 'Assigned To' => '负责人', + 'Billing Address' => '付款住址', + 'Shipping Address' => '送货住址', + 'Billing City' => '[付款住址]乡镇市区', + 'Billing State' => '[付款住址]县市', + 'Billing Code' => '[付款住址]邮政编码', + 'Billing Country' => '[付款住址]国家', + 'Billing Po Box' => '[付款住址]采购订单信箱', + 'Shipping Po Box' => '[送货住址]采购订单信箱', + 'Shipping City' => '[送货住址]乡镇市区', + 'Shipping State' => '[送货住址]县市', + 'Shipping Code' => '[送货住址]邮政编码', + 'Shipping Country' => '[送货住址]国家', + 'City' => '乡镇市区', + 'State' => '县市', + 'Code' => '邮政编码', + 'Country' => '国家', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'Description' => '说明', + 'Potential Name' => '潜在机会名称', + 'Customer No' => '客户编号', + 'Purchase Order' => '采购订单', + 'Vendor Terms' => '厂商条件', + 'Pending' => '等待', + 'Account Name' => '客户名称', + 'Terms & Conditions' => '期限与条件', +//Quote Info + 'LBL_PO_INFORMATION' => '采购订单信息', + 'LBL_PO' => '采购订单:', + + //Added for 4.2 GA + 'LBL_SO_FORM_TITLE' => '业务', + 'LBL_PO_FORM_TITLE' => '采购', + 'LBL_SUBJECT_TITLE' => '主旨', + 'LBL_VENDOR_NAME_TITLE' => '厂商名称', + 'LBL_TRACKING_NO_TITLE' => '追踪编号', + 'LBL_PO_SEARCH_TITLE' => '搜寻采购订单', + 'LBL_SO_SEARCH_TITLE' => '搜寻销售订单', + 'LBL_QUOTE_NAME_TITLE' => '报价单名称', + 'Order Id' => '订单编号', + 'Status' => '状态', + 'PurchaseOrder' => '采购订单', + 'LBL_MY_TOP_PO' => '进行中的最佳采购订单', + +//Added for existing Picklist Entries + +'FedEx'=>'FedEx', +'UPS'=>'UPS', +'USPS'=>'USPS', +'DHL'=>'DHL', +'BlueDart'=>'BlueDart', + + 'Created' => '建立日期', + 'Approved' => '审核日期', + 'Delivered' => '递送日期', + 'Cancelled' => '取消日期', + 'Received Shipment' => '收件日期', +); + +?> diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/footer.php b/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/footer.php new file mode 100644 index 00000000..e5b2b016 --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/footer.php @@ -0,0 +1,35 @@ +addDescBlock($description, $app_strings["Description"], $descBlock); + +/* ************** End Description *********************** */ + + + +/* **************** Begin Terms ****************** */ +$termBlock=array("107",$top,"53", $num); +$pdf->addDescBlock($conditions, $app_strings["Terms & Conditions"], $termBlock); + +/* ************** End Terms *********************** */ + + +?> diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/header.php b/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/header.php new file mode 100644 index 00000000..00186cf4 --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/header.php @@ -0,0 +1,103 @@ +addImage( $logo_name, $imageBlock); + +// x,y,width +if($org_phone != '') + $phone ="\n".$app_strings["Phone"].":".$org_phone; +$companyBlockPositions=array( "10","23","62" ); +$companyText=$org_address."\n".$org_city.", ".$org_state." ".$org_code." ".$org_country." ".$phone."\n".$org_website; +$pdf->addTextBlock( $org_name, $companyText ,$companyBlockPositions ); + +// ************** End company information ******************* + + + +// ************* Begin Top-Right Header *************** +// title +$titleBlock=array("147","7"); +$pdf->title( $app_strings["PurchaseOrder"],"", $titleBlock ); + +$soBubble=array("168","17","12"); +$pdf->addBubbleBlock($reqno, $app_strings["Req. No."], $soBubble); + +$poBubble=array("114","17","12"); +$pdf->addBubbleBlock($trno, $app_strings["Tracking No."], $poBubble); + +// page number +$pageBubble=array("147","17",0); +$pdf->addBubbleBlock($page_num, $app_strings["Page"], $pageBubble); +// ************** End Top-Right Header ***************** + + + +// ************** Begin Addresses ************** +// shipping Address +$shipLocation = array("147","40","61"); +if(trim($ship_street)!='') + $shipText = $ship_street."\n"; +if(trim($ship_city) !='') + $shipText .= $ship_city.", "; +if(trim($ship_state)!='' || trim($ship_code)!= '') + $shipText .= $ship_state." ".$ship_code."\n"; + + $shipText .=$ship_country; +$pdf->addTextBlock( $app_strings["Shipping Address"].":", $shipText, $shipLocation ); + +// billing Address +$billPositions = array("10","51","61"); +if(trim($bill_street)!='') + $billText = $bill_street."\n"; +if(trim($bill_city) !='') + $billText .= $bill_city.", "; +if(trim($bill_state)!='' || trim($bill_code)!= '') + $billText .= $bill_state." ".$bill_code."\n"; + + $billText .=$bill_country; +$pdf->addTextBlock($app_strings["Billing Address"].":",$billText, $billPositions); +// ********** End Addresses ****************** + + + +/* ******** Begin Invoice Data ************************ */ +// issue date block +$issueBlock=array("80","37"); +$pdf->addRecBlock(getDisplayDate(date("Y-m-d")), $app_strings["Issue Date"],$issueBlock); + +// due date block +$dueBlock=array("81","52"); +$pdf->addRecBlock($valid_till, $app_strings["Due Date"],$dueBlock); + +// terms block +$termBlock=array("10","67"); +$pdf->addRecBlock($vendor_name, $app_strings["Vendor Name"], $termBlock); + +// Contact Name block +$conBlock=array("79","67"); +$pdf->addRecBlock($contact_name, $app_strings["Contact Name"],$conBlock); + + +// vtiger_invoice number block +$invBlock=array("145","65"); +$pdf->addRecBlock($po_no, $app_strings["PO Number"],$invBlock); + +/* ************ End Invoice Data ************************ */ + + + +?> diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/lastpage/body.php b/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/lastpage/body.php new file mode 100644 index 00000000..fc4720c1 --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/lastpage/body.php @@ -0,0 +1,62 @@ +watermark( $app_strings["Thank You"], $waterMarkPositions, $waterMarkRotate ); +$waterMarkPositions=array("30","130"); +$pdf->watermark( $app_strings["For Your Business"], $waterMarkPositions, $waterMarkRotate ); + +// blowing bubbles +$Bubble=array("10","80","170","4"); +$pdf->addBubble("", "", $Bubble); + +$Bubble=array("168","131","12"); +//$pdf->addBubbleBlock("Neat Look", "For A", $Bubble); +$Bubble=array("10","131","12"); +//$pdf->addBubbleBlock("The Corners", "Line Up", $Bubble); + + +/* ************* Begin Totals ************************** */ +$totalBlock=array("59","135"); +$names=array($app_strings["Subtotal"],$app_strings["Tax"],$app_strings["Adjustment"],$app_strings["Total"]); +$totals=array($price_subtotal,$price_salestax,$price_adjustment,$price_total); +$pdf->addTotalsRec($names,$totals,$totalBlock); +/* ************* End Totals *************************** */ + +// lets add an image :) +$imageBlock=array("15","95","8","8"); +$pdf->addImage( "sale.jpeg", $imageBlock); +$imageBlock=array("185","95","8","8"); +$pdf->addImage( "sale.jpeg", $imageBlock); + +// descriptions that change sizes! +$descc=count(explode("\n",$description)); +$condc=count(explode("\n",$conditions)); +if( (strlen($description) > 256) || (strlen($conditions) > 256) || $condc >6 || $descc > 6 ) + $num=255; +else + $num=150; + +/* **************** Begin Description ****************** */ +$descBlock=array("10","160","53", $num); +$pdf->addDescBlock($description, $app_strings["Description"], $descBlock); + + +$termBlock=array("107","160","53", $num); +$pdf->addDescBlock($conditions, $app_strings["Terms & Conditions"], $termBlock); + +/* ************** End Terms *********************** */ + + +?> diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/lastpage/footer.php b/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/lastpage/footer.php new file mode 100644 index 00000000..fbc268a3 --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/pdf_templates/lastpage/footer.php @@ -0,0 +1,60 @@ +drawLine($linePos); + $i = (($i+$width)+$pad)-1; +} + + +// company addy +if($org_phone != '') +$phone="\n".$app_strings["Phone"].": ".$org_phone; +if($org_fax != '') + $fax ="\n".$app_strings["Fax"].": ".$org_fax; +$companyBlockPositions=array( "10","220","60" ); +$companyText=$org_address."\n".$org_city.", ".$org_state." ".$org_code." ".$org_country." ".$phone." ".$fax."\n".$org_website ; +$pdf->addTextBlock( $org_name, $companyText ,$companyBlockPositions ); + + +// billing Address +$billPositions = array("85","235","60"); +if(trim($bill_street)!='') + $billText = $bill_street."\n"; +if(trim($bill_city) !='') + $billText .= $bill_city.", "; +if(trim($bill_state)!='' || trim($bill_code)!= '') + $billText .= $bill_state." ".$bill_code."\n"; + + $billText .=$bill_country; +$pdf->addTextBlock($app_strings["Billing Address"].":",$billText, $billPositions); + +// totals +$totalBlock=array("145","235","10", "110"); +$totalText=$app_strings["Subtotal"].": ".$price_subtotal."\n". + $app_strings["Tax"].": ".$price_salestax."\n". + $app_strings["Adjustment"].": ".$price_adjustment."\n". + $app_strings["Total"].": ".$price_total; +$pdf->addDescBlock($totalText, $app_strings["Total Due"], $totalBlock); + +$blurbBlock=array("10","265","150", "60"); +$blockText=$app_strings["Detach_Info"]; +$pdf->addDescBlock($blockText, $app_strings["Instructions"], $blurbBlock); + +?> diff --git a/oss/vtiger/trunk/modules/PurchaseOrder/updateRelations.php b/oss/vtiger/trunk/modules/PurchaseOrder/updateRelations.php new file mode 100644 index 00000000..b2fe9cbc --- /dev/null +++ b/oss/vtiger/trunk/modules/PurchaseOrder/updateRelations.php @@ -0,0 +1,47 @@ +pquery("insert into vtiger_senotesrel values (?,?)", array($forCRMRecord,$id)); + else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/CallRelatedList.php b/oss/vtiger/trunk/modules/Quotes/CallRelatedList.php new file mode 100644 index 00000000..abd73162 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/CallRelatedList.php @@ -0,0 +1,70 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['subject']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); + } + + global $mod_strings,$currentModule; + global $app_strings; + global $theme; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + if (isset($focus->name)) $smarty->assign("NAME", $focus->name); + $related_array=getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("CATEGORY",$category); + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $smarty->assign("ID",$focus->id); + $smarty->assign("MODULE",$currentmodule); + $smarty->assign("SINGLE_MOD",$app_strings['Quote']); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/CreatePDF.php b/oss/vtiger/trunk/modules/Quotes/CreatePDF.php new file mode 100644 index 00000000..de0223ab --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/CreatePDF.php @@ -0,0 +1,28 @@ +Output($filepath,'F'); //added file name to make it work in IE, also forces the download giving the user the option to save + +}else { + $pdf->Output('Quotes.pdf','D'); //added file name to make it work in IE, also forces the download giving the user the option to save + exit(); +} + +?> diff --git a/oss/vtiger/trunk/modules/Quotes/CustomView.php b/oss/vtiger/trunk/modules/Quotes/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Quotes/Delete.php b/oss/vtiger/trunk/modules/Quotes/Delete.php new file mode 100644 index 00000000..ca991da1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/Delete.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/DetailView.php b/oss/vtiger/trunk/modules/Quotes/DetailView.php new file mode 100644 index 00000000..02634d8d --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/DetailView.php @@ -0,0 +1,137 @@ +retrieve_entity_info($_REQUEST['record'],"Quotes"); + $focus->id = $_REQUEST['record']; + $focus->name=$focus->column_fields['subject']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("Quote detail view"); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); +else $smarty->assign("NAME", ""); + +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); + +$smarty->assign("CUSTOMFIELD", $cust_fld); +$smarty->assign("ID", vtlib_purify($_REQUEST['record'])); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign("SINGLE_MOD",'Quote'); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +if(isPermitted("Quotes","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + + +$smarty->assign("CREATEPDF","permitted"); + +if(isPermitted("SalesOrder","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("CONVERTSALESORDER","permitted"); + +if(isPermitted("Invoice","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("CONVERTINVOICE","permitted"); + +if(isPermitted("Quotes","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + + +$smarty->assign("CONVERTMODE",'quotetoinvoice'); +$smarty->assign("MODULE", $currentModule); + +//Get the associated Products and then display above Terms and Conditions +$smarty->assign("ASSOCIATED_PRODUCTS",getDetailAssociatedProducts('Quotes',$focus)); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + + $tabid = getTabid("Quotes"); + $validationData = getDBValidationData($focus->tab_name,$tabid); + $data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); + +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); + +if($singlepane_view == 'true') +{ + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +$smarty->assign("SinglePane_View", $singlepane_view); +$smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); +$smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("Inventory/InventoryDetailView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/DetailViewAjax.php b/oss/vtiger/trunk/modules/Quotes/DetailViewAjax.php new file mode 100644 index 00000000..f116e5c0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/DetailViewAjax.php @@ -0,0 +1,45 @@ +retrieve_entity_info($crmid,"Quotes"); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("Quotes"); + if($modObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/EditView.php b/oss/vtiger/trunk/modules/Quotes/EditView.php new file mode 100644 index 00000000..90a4a935 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/EditView.php @@ -0,0 +1,276 @@ +debug("Inside Quote EditView"); + +$focus = CRMEntity::getInstance($currentModule); +$smarty = new vtigerCRM_Smarty; +//added to fix the issue4600 +$searchurl = getBasic_Advance_SearchURL(); +$smarty->assign("SEARCH", $searchurl); +//4600 ends + +$currencyid=fetchCurrency($current_user->id); +$rate_symbol = getCurrencySymbolandCRate($currencyid); +$rate = $rate_symbol['rate']; + +if(isset($_REQUEST['record']) && $_REQUEST['record'] != ''){ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $log->debug("Mode is Edit. Quoteid is ".$focus->id); + $focus->retrieve_entity_info($_REQUEST['record'],"Quotes"); + $focus->name=$focus->column_fields['subject']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $smarty->assign("DUPLICATE_FROM", $focus->id); + $QUOTE_associated_prod = getAssociatedProducts("Quotes",$focus); + $log->debug("Mode is Duplicate. Quoteid to be duplicated is ".$focus->id); + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +if(isset($_REQUEST['potential_id']) && $_REQUEST['potential_id'] !=''){ + $focus->column_fields['potential_id'] = $_REQUEST['potential_id']; + $relatedInfo = getRelatedInfo($_REQUEST['potential_id']); + if(!empty($relatedInfo)){ + $setype = $relatedInfo["setype"]; + $relID = $relatedInfo["relID"]; + } + if($setype == 'Accounts'){ + $_REQUEST['account_id'] = $relID; + }elseif($setype == 'Contacts'){ + $_REQUEST['contact_id'] = $relID; + } + $log->debug("Quotes EditView: Potential Id from the request is ".$_REQUEST['potential_id']); + $associated_prod = getAssociatedProducts("Potentials",$focus,$focus->column_fields['potential_id']); +} + +if(isset($_REQUEST['product_id']) && $_REQUEST['product_id'] !=''){ + $focus->column_fields['product_id'] = $_REQUEST['product_id']; + $log->debug("Product Id from the request is ".$_REQUEST['product_id']); + $associated_prod = getAssociatedProducts("Products",$focus,$focus->column_fields['product_id']); + for ($i=1; $i<=count($associated_prod);$i++) { + $associated_prod_id = $associated_prod[$i]['hdnProductId'.$i]; + $associated_prod_prices = getPricesForProducts($currencyid,array($associated_prod_id),'Products'); + $associated_prod[$i]['listPrice'.$i] = $associated_prod_prices[$associated_prod_id]; + } + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); +} + +if(!empty($_REQUEST['parent_id']) && !empty($_REQUEST['return_module'])){ + if ($_REQUEST['return_module'] == 'Services') { + $focus->column_fields['product_id'] = $_REQUEST['parent_id']; + $log->debug("Service Id from the request is ".$_REQUEST['parent_id']); + $associated_prod = getAssociatedProducts("Services",$focus,$focus->column_fields['product_id']); + for ($i=1; $i<=count($associated_prod);$i++) { + $associated_prod_id = $associated_prod[$i]['hdnProductId'.$i]; + $associated_prod_prices = getPricesForProducts($currencyid,array($associated_prod_id),'Services'); + $associated_prod[$i]['listPrice'.$i] = $associated_prod_prices[$associated_prod_id]; + } + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + } +} + +// Get Account address if vtiger_account is given +if(isset($_REQUEST['account_id']) && $_REQUEST['account_id']!='' && $_REQUEST['record']==''){ + require_once('modules/Accounts/Accounts.php'); + $acct_focus = new Accounts(); + $acct_focus->retrieve_entity_info($_REQUEST['account_id'],"Accounts"); + $focus->column_fields['bill_city']=$acct_focus->column_fields['bill_city']; + $focus->column_fields['ship_city']=$acct_focus->column_fields['ship_city']; + //added to fix the issue 4526 + $focus->column_fields['bill_pobox']=$acct_focus->column_fields['bill_pobox']; + $focus->column_fields['ship_pobox']=$acct_focus->column_fields['ship_pobox']; + $focus->column_fields['bill_street']=$acct_focus->column_fields['bill_street']; + $focus->column_fields['ship_street']=$acct_focus->column_fields['ship_street']; + $focus->column_fields['bill_state']=$acct_focus->column_fields['bill_state']; + $focus->column_fields['ship_state']=$acct_focus->column_fields['ship_state']; + $focus->column_fields['bill_code']=$acct_focus->column_fields['bill_code']; + $focus->column_fields['ship_code']=$acct_focus->column_fields['ship_code']; + $focus->column_fields['bill_country']=$acct_focus->column_fields['bill_country']; + $focus->column_fields['ship_country']=$acct_focus->column_fields['ship_country']; + $log->debug("Accountid Id from the request is ".$_REQUEST['account_id']); +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$disp_view = getView($focus->mode); +$mode = $focus->mode; +if($disp_view == 'edit_view') + $smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +else +{ + $bas_block = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS'); + $adv_block = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'ADV'); + $blocks['basicTab'] = $bas_block; + if(is_array($adv_block )) + $blocks['moreTab'] = $adv_block; + + $smarty->assign("BLOCKS",$blocks); + $smarty->assign("BLOCKS_COUNT",count($blocks)); +} +$smarty->assign("OP_MODE",$disp_view); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Quote'); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$log->info("Quote view"); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + + +if (isset($focus->name)) $smarty->assign("NAME", $focus->name); +else $smarty->assign("NAME", ""); +if(isset($cust_fld)) +{ + + $log->debug("Custom Field is present"); + $smarty->assign("CUSTOMFIELD", $cust_fld); +} + + + +if($focus->mode == 'edit') +{ + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $associated_prod = getAssociatedProducts("Quotes",$focus);//getProductDetailsBlockInfo('edit','Quotes',$focus); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $focus->mode); + +} +elseif(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $smarty->assign("ASSOCIATEDPRODUCTS", $QUOTE_associated_prod); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + $smarty->assign("MODE", $focus->mode); + +} +elseif((isset($_REQUEST['potential_id']) && $_REQUEST['potential_id'] != '') || (isset($_REQUEST['product_id']) && $_REQUEST['product_id'] != '')) { + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $focus->mode); + + //this is to display the Product Details in first row when we create new PO from Product relatedlist + if($_REQUEST['return_module'] == 'Products') + { + $smarty->assign("PRODUCT_ID",vtlib_purify($_REQUEST['product_id'])); + $smarty->assign("PRODUCT_NAME",getProductName($_REQUEST['product_id'])); + $smarty->assign("UNIT_PRICE",vtlib_purify($_REQUEST['product_id'])); + $smarty->assign("QTY_IN_STOCK",getPrdQtyInStck($_REQUEST['product_id'])); + $smarty->assign("VAT_TAX",getProductTaxPercentage("VAT",$_REQUEST['product_id'])); + $smarty->assign("SALES_TAX",getProductTaxPercentage("Sales",$_REQUEST['product_id'])); + $smarty->assign("SERVICE_TAX",getProductTaxPercentage("Service",$_REQUEST['product_id'])); + } +} +else +{ + $smarty->assign("ROWCOUNT", '1'); +} + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +else $smarty->assign("RETURN_MODULE","Quotes"); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +else $smarty->assign("RETURN_ACTION","index"); +if(isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if(isset($_REQUEST['return_viewname'])) $smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path);$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); + +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +//in create new Quote, get all available product taxes and shipping & Handling taxes + +if($focus->mode != 'edit') +{ + $tax_details = getAllTaxes('available'); + $sh_tax_details = getAllTaxes('available','sh'); +} +else +{ + $tax_details = getAllTaxes('available','',$focus->mode,$focus->id); + $sh_tax_details = getAllTaxes('available','sh','edit',$focus->id); +} +$smarty->assign("GROUP_TAXES",$tax_details); +$smarty->assign("SH_TAXES",$sh_tax_details); + +$tabid = getTabid("Quotes"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$smarty->assign("MODULE", $module); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
    '. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +$smarty->assign("CURRENCIES_LIST", getAllCurrencies()); +if($focus->mode == 'edit' || $_REQUEST['isDuplicate'] == 'true') { + $inventory_cur_info = getInventoryCurrencyInfo('Quotes', $focus->id); + $smarty->assign("INV_CURRENCY_ID", $inventory_cur_info['currency_id']); +} else { + $smarty->assign("INV_CURRENCY_ID", $currencyid); +} + +if($focus->mode == 'edit') + $smarty->display("Inventory/InventoryEditView.tpl"); +else + $smarty->display('Inventory/InventoryCreateView.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/ListTopQuotes.php b/oss/vtiger/trunk/modules/Quotes/ListTopQuotes.php new file mode 100644 index 00000000..534e78fd --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/ListTopQuotes.php @@ -0,0 +1,137 @@ +$title,'Header'=>$listview_header,'Entries'=>$listview_entries) where as listview_header and listview_entries are arrays of header and entity values which are returned from function getListViewHeader and getListViewEntries + */ +function getTopQuotes($maxval,$calCnt) +{ + require_once("data/Tracker.php"); + require_once('modules/Quotes/Quotes.php'); + require_once('include/logging.php'); + require_once('include/ListView/ListView.php'); + require_once('include/utils/utils.php'); + require_once('modules/CustomView/CustomView.php'); + + global $app_strings,$current_language,$current_user; + $current_module_strings = return_module_language($current_language, 'Quotes'); + + global $list_max_entries_per_page,$adb,$theme,$mod_strings; + $log = LoggerManager::getLogger('quote_list'); + + $url_string = ''; + $sorder = ''; + $oCustomView = new CustomView("Quotes"); + $customviewcombo_html = $oCustomView->getCustomViewCombo(); + if(isset($_REQUEST['viewname']) == false || $_REQUEST['viewname']=='') + { + if($oCustomView->setdefaultviewid != "") + { + $viewid = $oCustomView->setdefaultviewid; + }else + { + $viewid = "0"; + } + } + + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + //Retreive the list from Database + //<<<<<<<<>>>>>>>> + $date_var = date('Y-m-d'); + + $where = " and vtiger_crmentity.smownerid=".$current_user->id." and vtiger_quotes.quotestage not in('Rejected','Accepted','".$current_module_strings['Rejected']."','".$current_module_strings['Accepted']."') and vtiger_quotes.validtill >= '".$date_var."'"; + //$where = ' and vtiger_crmentity.smownerid='.$current_user->id.' and vtiger_quotes.validtill >= \''.$date_var.'\''; + + + $query = getListQuery("Quotes",$where); + $query .=" ORDER BY total DESC"; + //<<<<<<<>>>>>>>> + + $query .= " LIMIT " . $adb->sql_escape_string($maxval); + + if($calCnt == 'calculateCnt') { + $list_result_rows = $adb->query(mkCountQuery($query)); + return $adb->query_result($list_result_rows, 0, 'count'); + } + + $list_result = $adb->query($query); + + //Retreiving the no of rows + $noofrows = $adb->num_rows($list_result); + + //Retreiving the start value from request + if(isset($_REQUEST['start']) && $_REQUEST['start'] != '') { + $start = vtlib_purify($_REQUEST['start']); + } else { + $start = 1; + } + + //Retreive the Navigation array + $navigation_array = getNavigationValues($start, $noofrows, $list_max_entries_per_page); + + if ($navigation_array['start'] == 1) + { + if($noofrows != 0) + $start_rec = $navigation_array['start']; + else + $start_rec = 0; + if($noofrows > $list_max_entries_per_page) + { + $end_rec = $navigation_array['start'] + $list_max_entries_per_page - 1; + } + else + { + $end_rec = $noofrows; + } + + } + else + { + if($navigation_array['next'] > $list_max_entries_per_page) + { + $start_rec = $navigation_array['next'] - $list_max_entries_per_page; + $end_rec = $navigation_array['next'] - 1; + } + else + { + $start_rec = $navigation_array['prev'] + $list_max_entries_per_page; + $end_rec = $noofrows; + } + } + + $focus = new Quotes(); + + + $title=array('TopOpenQuotes.gif',$current_module_strings['LBL_MY_TOP_QUOTE'],'home_mytopquote'); + //Retreive the List View Table Header + $listview_header = getListViewHeader($focus,"Quotes",$url_string,$sorder,$order_by,"HomePage",$oCustomView); + $header = Array($listview_header[1],$listview_header[3]); + + $listview_entries = getListViewEntries($focus,"Quotes",$list_result,$navigation_array,"HomePage","","EditView","Delete",$oCustomView); + foreach($listview_entries as $crmid=>$valuearray) + { + $entries[$crmid] = Array($valuearray[1],$valuearray[3]); + } + + $search_qry = "&query=true&Fields0=vtiger_crmentity.smownerid&Condition0=is&Srch_value0=".$current_user->column_fields['user_name']."&Fields1=vtiger_quotes.validtill&Condition1=grteq&Srch_value1=".$date_var."&Fields2=vtiger_quotes.quotestage&Condition2=isn&Srch_value2=Rejected&Fields3=vtiger_quotes.quotestage&Condition3=isn&Srch_value3=Accepted&searchtype=advance&search_cnt=4&matchtype=all"; + + $values=Array('ModuleName'=>'Quotes','Title'=>$title,'Header'=>$header,'Entries'=>$entries,'search_qry'=>$search_qry); + + if ( ($display_empty_home_blocks && $noofrows == 0 ) || ($noofrows>0) ) + return $values; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/ListView.php b/oss/vtiger/trunk/modules/Quotes/ListView.php new file mode 100644 index 00000000..980e2955 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/ListView.php @@ -0,0 +1,221 @@ +initSortbyField('Quotes'); +// END +$smarty = new vtigerCRM_Smarty; +$other_text = Array(); + +if(!$_SESSION['lvs'][$currentModule]) +{ + unset($_SESSION['lvs']); + $modObj = new ListViewSession(); + $modObj->sorder = $sorder; + $modObj->sortby = $order_by; + $_SESSION['lvs'][$currentModule] = get_object_vars($modObj); +} + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR","The User does not have permission to Change/Delete ".$errormsg." ".$currentModule); +}else +{ + $smarty->assign("ERROR",""); +} +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION['QUOTES_ORDER_BY'] = $order_by; +$_SESSION['QUOTES_SORT_ORDER'] = $sorder; +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> + +if(isset($_REQUEST['query']) && $_REQUEST['query'] == 'true') +{ + list($where, $ustring) = split("#@@#",getWhereCondition($currentModule)); + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); + +} + +//<<<>>>>>> +$oCustomView = new CustomView("Quotes"); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); + +//Added to handle approving or denying status-public by the admin in CustomView +$statusdetails = $oCustomView->isPermittedChangeStatus($viewnamedesc['status']); +$smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + +//To check if a user is able to edit/delete a customview +$edit_permit = $oCustomView->isPermittedCustomView($viewid,'EditView',$currentModule); +$delete_permit = $oCustomView->isPermittedCustomView($viewid,'Delete',$currentModule); +$smarty->assign("CV_EDIT_PERMIT",$edit_permit); +$smarty->assign("CV_DELETE_PERMIT",$delete_permit); + +//<<<<>>>> +$smarty->assign("CHANGE_OWNER",getUserslist()); +$smarty->assign("CHANGE_GROUP_OWNER",getGroupslist()); + +if(isPermitted('Quotes','Delete','') == 'yes') +{ + $other_text['del'] = $app_strings[LBL_MASS_DELETE]; +} +if(isPermitted('Quotes','EditView','') == 'yes') +{ + $other_text['mass_edit'] = $app_strings[LBL_MASS_EDIT]; + $other_text['c_owner'] = $app_strings[LBL_CHANGE_OWNER]; +} +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Quote'); +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("BUTTONS", $other_text); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +//Retreive the list from Database +//<<<<<<<<>>>>>>>> +if($viewid != "0") +{ + $listquery = getListQuery("Quotes"); + $query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"Quotes"); +}else +{ + $query = getListQuery("Quotes"); +} +//<<<<<<<>>>>>>>> + +if(isset($where) && $where != '') +{ + $query .= ' and '.$where; +} + +if(isset($order_by) && $order_by != '') +{ + if($order_by == 'smownerid') + { + $query .= " ORDER BY case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end ".$sorder; + } + else + { + $tablename = getTableNameForField('Quotes',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + + $query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; + } +} + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $query = fixPostgresQuery( $query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +//Retreive the List View Table Header +if($viewid !='') +$url_string .="&viewname=".$viewid; + +$listview_header = getListViewHeader($focus,"Quotes",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_header_search = getSearchListHeaderValues($focus,"Quotes",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER",$listview_header_search); + +$listview_entries = getListViewEntries($focus,"Quotes",$list_result,$navigation_array,"","","EditView","Delete",$oCustomView); +$smarty->assign("LISTENTITY", $listview_entries); +$smarty->assign("SELECT_SCRIPT", $view_script); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string,"Quotes","index",$viewid); +$alphabetical = AlphabeticalSearch($currentModule,'index','subject','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($module); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("BUTTONS", $other_text); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display("ListView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/ListViewPagging.php b/oss/vtiger/trunk/modules/Quotes/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/MassEdit.php b/oss/vtiger/trunk/modules/Quotes/MassEdit.php new file mode 100644 index 00000000..348dab37 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/MassEdit.php @@ -0,0 +1,45 @@ +mode = ''; +$mode = 'mass_edit'; +$disp_view = getView($focus->mode); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("IDS",$_REQUEST['idstring']); +$smarty->assign("MASS_EDIT","1"); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("APP",$app_strings); +$smarty->assign("CATEGORY",getParentTab()); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/MassEditSave.php b/oss/vtiger/trunk/modules/Quotes/MassEditSave.php new file mode 100644 index 00000000..0e1f2a6f --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/MassEditSave.php @@ -0,0 +1,67 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if($fieldname == 'assigned_user_id'){ + if($_REQUEST['assigntype'] == 'U') { + $value = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $value = $_REQUEST['assigned_group_id']; + } + } else { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + } + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/Popup.php b/oss/vtiger/trunk/modules/Quotes/Popup.php new file mode 100644 index 00000000..491b56b5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/Popup.php @@ -0,0 +1,17 @@ + diff --git a/oss/vtiger/trunk/modules/Quotes/Quotes.js b/oss/vtiger/trunk/modules/Quotes/Quotes.js new file mode 100644 index 00000000..69b1a42c --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/Quotes.js @@ -0,0 +1,52 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + +document.write(""; +exit(); +?> diff --git a/oss/vtiger/trunk/modules/Quotes/Settings.php b/oss/vtiger/trunk/modules/Quotes/Settings.php new file mode 100644 index 00000000..980dd078 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/Settings.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Quotes/TagCloud.php b/oss/vtiger/trunk/modules/Quotes/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Quotes/UnifiedSearch.php b/oss/vtiger/trunk/modules/Quotes/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Quotes/index.php b/oss/vtiger/trunk/modules/Quotes/index.php new file mode 100644 index 00000000..8ee35e33 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/index.php @@ -0,0 +1,54 @@ + + diff --git a/oss/vtiger/trunk/modules/Quotes/language/en_us.lang.php b/oss/vtiger/trunk/modules/Quotes/language/en_us.lang.php new file mode 100644 index 00000000..d2a18bb8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/language/en_us.lang.php @@ -0,0 +1,188 @@ +'Quotes', +'LBL_MODULE_TITLE'=>'Quotes: Home', +'LBL_SEARCH_FORM_TITLE'=>'Quotes Search', +'LBL_LIST_FORM_TITLE'=>'Quotes List', +'LBL_NEW_FORM_TITLE'=>'New Quote', +'LBL_MEMBER_ORG_FORM_TITLE'=>'Member Organizations', + +'LBL_LIST_ACCOUNT_NAME'=>'Account Name', +'LBL_RELATED_PRODUCTS'=>'Product Details', +'LBL_LIST_CITY'=>'City', +'LBL_LIST_WEBSITE'=>'Website', +'LBL_LIST_STATE'=>'State', +'LBL_LIST_PHONE'=>'Phone', +'LBL_LIST_EMAIL_ADDRESS'=>'Email Address', +'LBL_LIST_CONTACT_NAME'=>'Contact Name', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + +'LBL_ACCOUNT'=>'Account:', +'LBL_PHONE'=>'Phone:', +'LBL_WEBSITE'=>'Website:', +'LBL_FAX'=>'Fax:', +'LBL_TICKER_SYMBOL'=>'Ticker Symbol:', +'LBL_OTHER_PHONE'=>'Other Phone:', +'LBL_ANY_PHONE'=>'Any Phone:', +'LBL_MEMBER_OF'=>'Member of:', +'LBL_EMAIL'=>'Email:', +'LBL_EMPLOYEES'=>'Employees:', +'LBL_OTHER_EMAIL_ADDRESS'=>'Other Email:', +'LBL_ANY_EMAIL'=>'Any Email:', +'LBL_OWNERSHIP'=>'Ownership:', +'LBL_RATING'=>'Rating:', +'LBL_INDUSTRY'=>'Industry:', +'LBL_SIC_CODE'=>'SIC Code:', +'LBL_TYPE'=>'Type:', +'LBL_ANNUAL_REVENUE'=>'Annual Revenue:', +'LBL_ADDRESS_INFORMATION'=>'Address Information', +'LBL_Quote_INFORMATION'=>'Account Information', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', +'LBL_BILLING_ADDRESS'=>'Billing Address:', +'LBL_SHIPPING_ADDRESS'=>'Shipping Address:', +'LBL_ANY_ADDRESS'=>'Any Address:', +'LBL_CITY'=>'City:', +'LBL_STATE'=>'State:', +'LBL_POSTAL_CODE'=>'Postal Code:', +'LBL_COUNTRY'=>'Country:', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', +'LBL_DESCRIPTION'=>'Description:', +'NTC_COPY_BILLING_ADDRESS'=>'Copy billing address to shipping address', +'NTC_COPY_SHIPPING_ADDRESS'=>'Copy shipping address to billing address', +'NTC_REMOVE_MEMBER_ORG_CONFIRMATION'=>'Are you sure you want to remove this record as a member organization?', +'LBL_DUPLICATE'=>'Potential Duplicate Accounts', +'MSG_DUPLICATE' => 'Creating this vtiger_account may vtiger_potentialy create a duplicate vtiger_account. You may either select an vtiger_account from the list below or you may click on Create New Account to continue creating a new vtiger_account with the previously entered data.', + +'LBL_INVITEE'=>'Contacts', +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", + +'LBL_SELECT_ACCOUNT'=>'Select Account', +'LBL_GENERAL_INFORMATION'=>'General Information', + +//for v4 release added +'LBL_NEW_POTENTIAL'=>'New Potential', +'LBL_POTENTIAL_TITLE'=>'Potentials', + +'LBL_NEW_TASK'=>'New Task', +'LBL_TASK_TITLE'=>'Tasks', +'LBL_NEW_CALL'=>'New Call', +'LBL_CALL_TITLE'=>'Calls', +'LBL_NEW_MEETING'=>'New Meeting', +'LBL_MEETING_TITLE'=>'Meetings', +'LBL_NEW_EMAIL'=>'New Email', +'LBL_EMAIL_TITLE'=>'Emails', +'LBL_NEW_CONTACT'=>'New Contact', +'LBL_CONTACT_TITLE'=>'Contacts', + +//Added vtiger_fields after RC1 - Release +'LBL_ALL'=>'All', +'LBL_PROSPECT'=>'Prospect', +'LBL_INVESTOR'=>'Investor', +'LBL_RESELLER'=>'Reseller', +'LBL_PARTNER'=>'Partner', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Account Tools', +//Added for 4GA +'Subject'=>'Subject', +'Potential Name'=>'Potential Name', +'Quote Stage'=>'Quote Stage', +'Valid Till'=>'Valid Till', +'Team'=>'Team', +'Contact Name'=>'Contact Name', +'Currency'=>'Currency', +'Carrier'=>'Carrier', +'Sub Total'=>'Sub Total', +'Shipping'=>'Shipping', +'Inventory Manager'=>'Inventory Manager', +'Type'=>'Type', +'Tax'=>'Tax', +'Total'=>'Total', +'Product Name'=>'Product Name', +'Assigned To'=>'Assigned To', +'Billing Address'=>'Billing Address', +'Shipping Address'=>'Shipping Address', +'Billing City'=>'Billing City', +'Billing State'=>'Billing State', +'Billing Code'=>'Billing Postal Code', +'Billing Country'=>'Billing Country', +'Billing Po Box'=>'Billing PO Box', +'Shipping Po Box'=>'Shipping PO Box', +'Shipping City'=>'Shipping City', +'Shipping State'=>'Shipping State', +'Shipping Code'=>'Shipping Postal Code', +'Shipping Country'=>'Shipping Country', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Description'=>'Description', +'Account Name'=>'Account Name', +'Terms & Conditions'=>'Terms & Conditions', +//Quote Info +'LBL_QUOTE_INFORMATION'=>'Quote Information', +'LBL_TERMS_INFORMATION'=>'Terms & Conditions', +'LBL_QUOTE'=>'Quote:', + +//Added during 4.2 release +'LBL_SUBJECT'=>'Subject:', +'LBL_POTENTIAL_NAME'=>'Potential Name:', +'LBL_ACCOUNT_NAME'=>'Account Name:', +'LBL_QUOTE_STAGE'=>'Quote Stage:', +'LBL_MY_TOP_QUOTE'=>'My Top Open Quotes', +//'Quote ID'=>'Quote Id', +'Quote'=>'Quote', + +//Added for existing Picklist Entries + +'Created'=>'Created', +'Delivered'=>'Delivered', +'Reviewed'=>'Reviewed', +'Accepted'=>'Accepted', +'Rejected'=>'Rejected', + +'FedEx'=>'FedEx', +'UPS'=>'UPS', +'USPS'=>'USPS', +'DHL'=>'DHL', +'BlueDart'=>'BlueDart', +'Sales Tax'=>'Sales Tax', + +//Added for Reports (5.0.4) +'Tax Type'=>'Tax Type', +'Discount Percent'=>'Discount Percent', +'Discount Amount'=>'Discount Amount', +'Terms & Conditions'=>'Terms & Conditions', +'Adjustment'=>'Adjustment', +'S&H Amount'=>'S&H Amount', + +//Added after 5.0.4 GA +'Quote No'=>'Quote No', +); + +?> diff --git a/oss/vtiger/trunk/modules/Quotes/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Quotes/language/zh_cn.lang.php new file mode 100644 index 00000000..16a29bc3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/language/zh_cn.lang.php @@ -0,0 +1,178 @@ + '报价单', + 'LBL_MODULE_TITLE' => '报价单: 首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻报价单', + 'LBL_LIST_FORM_TITLE' => '报价单列表', + 'LBL_NEW_FORM_TITLE' => '新增报价单', + 'LBL_MEMBER_ORG_FORM_TITLE' => '会员所属单位', + + 'LBL_LIST_ACCOUNT_NAME' => '客户名称', + 'LBL_RELATED_PRODUCTS' => '在线清单', + 'LBL_LIST_CITY' => '乡镇市区', + 'LBL_LIST_WEBSITE' => '网站', + 'LBL_LIST_STATE' => '县市', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_EMAIL_ADDRESS' => '电子邮件地址', + 'LBL_LIST_CONTACT_NAME' => '联系人名称', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + +'LBL_ACCOUNT'=>'客户:', +'LBL_PHONE'=>'电话:', +'LBL_WEBSITE'=>'网站:', +'LBL_FAX'=>'传真:', +'LBL_TICKER_SYMBOL' => '传票符号:', + 'LBL_OTHER_PHONE' => '其它电话:', + 'LBL_ANY_PHONE' => '任一电话:', + 'LBL_MEMBER_OF' => '会员:', + 'LBL_EMAIL' => '电子邮件:', + 'LBL_EMPLOYEES' => '员工:', + 'LBL_OTHER_EMAIL_ADDRESS' => '其它电子邮件:', + 'LBL_ANY_EMAIL' => '任一电子邮件:', + 'LBL_OWNERSHIP' => '负责人:', + 'LBL_RATING' => '级别:', + 'LBL_INDUSTRY' => '企业:', + 'LBL_SIC_CODE' => '统一编号:', + 'LBL_TYPE' => '类型:', + 'LBL_ANNUAL_REVENUE' => '年收益:', + 'LBL_ADDRESS_INFORMATION' => '地址信息', + 'LBL_Quote_INFORMATION' => '客户信息', + 'LBL_CUSTOM_INFORMATION' => '客制信息', + 'LBL_BILLING_ADDRESS' => '发票地址:', + 'LBL_SHIPPING_ADDRESS' => '送货地址:', + 'LBL_ANY_ADDRESS' => '任一地址:', + 'LBL_CITY' => '乡镇市区:', + 'LBL_STATE' => '县市:', + 'LBL_POSTAL_CODE' => '邮政编码:', + 'LBL_COUNTRY' => '国家:', +'LBL_DESCRIPTION_INFORMATION' => '细节内容', + 'LBL_DESCRIPTION' => '描述:', + 'NTC_COPY_BILLING_ADDRESS' => '复制发票地址到送货地址', + 'NTC_COPY_SHIPPING_ADDRESS' => '复制送货地址到发票地址', + 'NTC_REMOVE_MEMBER_ORG_CONFIRMATION' => '你确定要移除这笔会员所属单位记录?', + 'LBL_DUPLICATE' => '潜在机会内容复制到客户', + 'MSG_DUPLICATE' => '建立这笔客户数据来自于潜在机会内容,您可以点选公司列表中的公司以复制建立新的公司,并且继承它的相关数据。', + + 'LBL_INVITEE' => '联系人', + 'ERR_DELETE_RECORD' => '要删除账号你必须指定一笔记录编号.', + + 'LBL_SELECT_ACCOUNT' => '选择客户', + 'LBL_GENERAL_INFORMATION' => '一般信息', + +//for v4 release added + 'LBL_NEW_POTENTIAL' => '新增潜在机会', + 'LBL_POTENTIAL_TITLE' => '潜在机会', + + 'LBL_NEW_TASK' => '新增任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => '新增电话记录', + 'LBL_CALL_TITLE' => '电话记录', + 'LBL_NEW_MEETING' => '新增会议记录', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '新增电子邮件', + 'LBL_EMAIL_TITLE' => '邮件', + 'LBL_NEW_CONTACT' => '新增联系人', + 'LBL_CONTACT_TITLE' => '联系人', + +//Added vtiger_fields after RC1 - Release + 'LBL_ALL' => '全部', + 'LBL_PROSPECT' => '期望', + 'LBL_INVESTOR' => '投资者', + 'LBL_RESELLER' => '转售人', + 'LBL_PARTNER' => '伙伴', + +// Added for 4GA + 'LBL_TOOL_FORM_TITLE' => '客户工具', +//Added for 4GA + 'Subject' => '标题', + 'Potential Name' => '潜在机会名称', + 'Quote Stage' => '报价单状态', + 'Valid Till' => '有效期至', + 'Team' => '团队', + 'Contact Name' => '联系人名称', + 'Currency' => '货币', + 'Carrier' => '承运单位', + 'Sub Total' => '小计', + 'Shipping' => '运费', + 'Inventory Manager' => '详细目录管理', + 'Type' => '类型', + 'Tax' => '税', + 'Total' => '总计', + 'Product Name' => '商品名称', + 'Assigned To' => '负责人', + 'Billing Address' => '发票地址', + 'Shipping Address' => '送货地址', + 'Billing City' => '[发票地址]乡镇市区', + 'Billing State' => '[发票地址]市(县)', + 'Billing Code' => '[发票地址]邮政编码', + 'Billing Country' => '[发票地址]省(市/自治区)', + 'Billing Po Box' => '[发票地址]采购订单信箱', + 'Shipping Po Box' => '[送货地址]采购订单信箱', + 'Shipping City' => '[送货地址]乡镇市区', + 'Shipping State' => '[送货地址]市(县)', + 'Shipping Code' => '[送货地址]邮政编码', + 'Shipping Country' => '[送货地址]省(市/自治区)', + 'Created Time' => '建档时间', + 'Modified Time' => '修改时间', + 'Description' => '描述', + 'Account Name' => '客户名称', + 'Terms & Conditions' => '期限与条件', +//Quote Info +'LBL_QUOTE_INFORMATION' => '报价单信息', + 'LBL_TERMS_INFORMATION' => '期限与条件', + 'LBL_QUOTE' => '报价单:', + +//Added during 4.2 release + 'LBL_SUBJECT' => '主旨:', + 'LBL_POTENTIAL_NAME' => '潜在机会名称:', + 'LBL_QUOTE_STAGE' => '报价策略:', + 'LBL_MY_TOP_QUOTE' => '我进行中的最佳报价单', + 'Quote ID' => '报价单编号', +//'Quote ID'=>'Quote Id', + 'Quote' => '报价单', + +//Added for existing Picklist Entries + +'Created' => '建立日期', + 'Delivered' => '递送日期', + 'Reviewed' => '已审阅', + 'Accepted' => '已接受', + 'Rejected' => '被拒绝', + 'FedEx' => 'FedEx', + 'UPS' => 'UPS', + 'USPS' => 'USPS', + 'DHL' => 'DHL', + 'BlueDart' => 'BlueDart', +'Sales Tax'=>'销售税', + + +); + +?> diff --git a/oss/vtiger/trunk/modules/Quotes/pdf_templates/footer.php b/oss/vtiger/trunk/modules/Quotes/pdf_templates/footer.php new file mode 100644 index 00000000..dc333d90 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/pdf_templates/footer.php @@ -0,0 +1,32 @@ +addDescBlock($description, $app_strings["Description"], $descBlock); + +/* ************** End Description *********************** */ + + + +/* **************** Begin Terms ****************** */ +$termBlock=array("107",$top,"53", $num); +$pdf->addDescBlock($conditions, $app_strings["Terms & Conditions"], $termBlock); + +/* ************** End Terms *********************** */ + + +?> diff --git a/oss/vtiger/trunk/modules/Quotes/pdf_templates/header.php b/oss/vtiger/trunk/modules/Quotes/pdf_templates/header.php new file mode 100644 index 00000000..4ad7fe95 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/pdf_templates/header.php @@ -0,0 +1,99 @@ +addImage( $logo_name, $imageBlock); + +// x,y,width +if($org_phone != '') + $phone ="\n".$app_strings["Phone"].":".$org_phone; +$companyBlockPositions=array( "10","23","62" ); +$companyText=$org_address."\n".$org_city.", ".$org_state." ".$org_code." ".$org_country." ".$phone."\n".$org_website; +$pdf->addTextBlock( $org_name, $companyText ,$companyBlockPositions ); + +// ************** End company information ******************* + + + +// ************* Begin Top-Right Header *************** +// Quote title +$titleBlock=array("163","7"); +$pdf->title( $app_strings["Quote"],"", $titleBlock ); + +// Account Number +$acctBubble=array("147","17","12"); +$pdf->addBubbleBlock($account_id, $app_strings["Account Number"], $acctBubble); + +// page number +$pageBubble=array("180","17",0); +$pdf->addBubbleBlock($page_num, $app_strings["Page"], $pageBubble); +// ************** End Top-Right Header ***************** + + + +// ************** Begin Addresses ************** +// shipping Address +$shipLocation = array("147","40","61"); +if(trim($ship_street)!='') + $shipText = $ship_street."\n"; +if(trim($ship_city) !='') + $shipText .= $ship_city.", "; +if(trim($ship_state)!='' || trim($ship_code)!= '') + $shipText .= $ship_state." ".$ship_code."\n"; + + $shipText .=$ship_country; +$pdf->addTextBlock( $app_strings["Shipping Address"].":", $shipText, $shipLocation ); + +// billing Address +$billPositions = array("10","51","61"); +if(trim($bill_street)!='') + $billText = $bill_street."\n"; +if(trim($bill_city) !='') + $billText .= $bill_city.", "; +if(trim($bill_state)!='' || trim($bill_code)!= '') + $billText .= $bill_state." ".$bill_code."\n"; + + $billText .=$bill_country; +$pdf->addTextBlock($app_strings["Billing Address"].":",$billText, $billPositions); +// ********** End Addresses ****************** + + + +/* ******** Begin Quote Data ************************ */ +// issue date block +$issueBlock=array("80","35"); +$pdf->addRecBlock(getDisplayDate(date("Y-m-d")), $app_strings["Issue Date"],$issueBlock); + +// valid till block +$dueBlock=array("80","50"); +$pdf->addRecBlock($valid_till, $app_strings["Valid Till"],$dueBlock); + +// customer name block +$termBlock=array("10","67"); +$pdf->addRecBlock($account_name, $app_strings["Customer Name"], $termBlock); + + +// Contact Name block +$conBlock=array("79","65"); +$pdf->addRecBlock($contact_name, $app_strings["Contact Name"],$conBlock); + + +// quote number block +$invBlock=array("147","65"); +$pdf->addRecBlock($quote_no, $app_strings["Quote Number"],$invBlock); + +/* ************ End Quote Data ************************ */ + + + +?> diff --git a/oss/vtiger/trunk/modules/Quotes/pdf_templates/lastpage/body.php b/oss/vtiger/trunk/modules/Quotes/pdf_templates/lastpage/body.php new file mode 100644 index 00000000..fc4720c1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/pdf_templates/lastpage/body.php @@ -0,0 +1,62 @@ +watermark( $app_strings["Thank You"], $waterMarkPositions, $waterMarkRotate ); +$waterMarkPositions=array("30","130"); +$pdf->watermark( $app_strings["For Your Business"], $waterMarkPositions, $waterMarkRotate ); + +// blowing bubbles +$Bubble=array("10","80","170","4"); +$pdf->addBubble("", "", $Bubble); + +$Bubble=array("168","131","12"); +//$pdf->addBubbleBlock("Neat Look", "For A", $Bubble); +$Bubble=array("10","131","12"); +//$pdf->addBubbleBlock("The Corners", "Line Up", $Bubble); + + +/* ************* Begin Totals ************************** */ +$totalBlock=array("59","135"); +$names=array($app_strings["Subtotal"],$app_strings["Tax"],$app_strings["Adjustment"],$app_strings["Total"]); +$totals=array($price_subtotal,$price_salestax,$price_adjustment,$price_total); +$pdf->addTotalsRec($names,$totals,$totalBlock); +/* ************* End Totals *************************** */ + +// lets add an image :) +$imageBlock=array("15","95","8","8"); +$pdf->addImage( "sale.jpeg", $imageBlock); +$imageBlock=array("185","95","8","8"); +$pdf->addImage( "sale.jpeg", $imageBlock); + +// descriptions that change sizes! +$descc=count(explode("\n",$description)); +$condc=count(explode("\n",$conditions)); +if( (strlen($description) > 256) || (strlen($conditions) > 256) || $condc >6 || $descc > 6 ) + $num=255; +else + $num=150; + +/* **************** Begin Description ****************** */ +$descBlock=array("10","160","53", $num); +$pdf->addDescBlock($description, $app_strings["Description"], $descBlock); + + +$termBlock=array("107","160","53", $num); +$pdf->addDescBlock($conditions, $app_strings["Terms & Conditions"], $termBlock); + +/* ************** End Terms *********************** */ + + +?> diff --git a/oss/vtiger/trunk/modules/Quotes/pdf_templates/lastpage/footer.php b/oss/vtiger/trunk/modules/Quotes/pdf_templates/lastpage/footer.php new file mode 100644 index 00000000..83ece8c5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/pdf_templates/lastpage/footer.php @@ -0,0 +1,61 @@ +drawLine($linePos); + $i = (($i+$width)+$pad)-1; +} + + +// company addy +if($org_phone != '') +$phone="\n".$app_strings["Phone"].": ".$org_phone; +if($org_fax != '') + $fax ="\n".$app_strings["Fax"].": ".$org_fax; +$companyBlockPositions=array( "10","220","60" ); +$companyText=$org_address."\n".$org_city.", ".$org_state." ".$org_code." ".$org_country." ".$phone." ".$fax."\n".$org_website ; +$pdf->addTextBlock( $org_name, $companyText ,$companyBlockPositions ); + + +// billing Address +$billPositions = array("85","235","60"); +if(trim($bill_street)!='') + $billText = $bill_street."\n"; +if(trim($bill_city) !='') + $billText .= $bill_city.", "; +if(trim($bill_state)!='' || trim($bill_code)!= '') + $billText .= $bill_state." ".$bill_code."\n"; + + $billText .=$bill_country; + +$pdf->addTextBlock($app_strings["Billing Address"].":",$billText, $billPositions); + +// totals +$totalBlock=array("145","235","10", "110"); +$totalText=$app_strings["Subtotal"].": ".$price_subtotal."\n". + $app_strings["Tax"].": ".$price_salestax."\n". + $app_strings["Adjustment"].": ".$price_adjustment."\n". + $app_strings["Total"].": ".$price_total; +$pdf->addDescBlock($totalText, $app_strings["Total Due"], $totalBlock); + +$blurbBlock=array("10","265","150", "60"); +$blockText=$app_strings["Detach_Info"]; +$pdf->addDescBlock($blockText, $app_strings["Instructions"], $blurbBlock); + +?> diff --git a/oss/vtiger/trunk/modules/Quotes/updateRelations.php b/oss/vtiger/trunk/modules/Quotes/updateRelations.php new file mode 100644 index 00000000..85798501 --- /dev/null +++ b/oss/vtiger/trunk/modules/Quotes/updateRelations.php @@ -0,0 +1,48 @@ +pquery("insert into vtiger_senotesrel values (?,?)", array($forCRMRecord,$id)); + else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/RecycleBin/EmptyRecyclebin.php b/oss/vtiger/trunk/modules/RecycleBin/EmptyRecyclebin.php new file mode 100644 index 00000000..c646d537 --- /dev/null +++ b/oss/vtiger/trunk/modules/RecycleBin/EmptyRecyclebin.php @@ -0,0 +1,24 @@ +query('DELETE FROM vtiger_crmentity WHERE deleted = 1'); +//TODO Related records for the module records deleted from vtiger_crmentity has to be deleted. +//It needs lookup in the related tables and needs to be removed if doesn't have a reference record in vtiger_crmentity + +$adb->query('DELETE FROM vtiger_relatedlists_rb'); + +$parenttab = getParentTab(); + +header("Location: index.php?module=RecycleBin&action=RecycleBinAjax&file=index&parenttab=$parenttab&mode=ajax"); +?> + diff --git a/oss/vtiger/trunk/modules/RecycleBin/ListView.php b/oss/vtiger/trunk/modules/RecycleBin/ListView.php new file mode 100644 index 00000000..aa6c1b88 --- /dev/null +++ b/oss/vtiger/trunk/modules/RecycleBin/ListView.php @@ -0,0 +1,224 @@ +id.".php"); + +$smarty = new vtigerCRM_Smarty; + +// Data from the below modules will not be allowed to restore +$skip_modules = array('Webmails'); +$skip_tab_ids = array(); + +for($i=0; $i 0) { + $sql .= ' AND tabid NOT IN ('. generateQuestionMarks($skip_tab_ids) .')'; +} +$sql .= ' ORDER BY name'; +$result =$adb->pquery($sql, array($skip_tab_ids)); +$noofrows = $adb->num_rows($result); + +$module_name =Array(); +$module_data =Array(); + +if($noofrows > 0) { + for($x=0,$y=0; $x<$noofrows;$x++) { + $tabid = $adb->query_result($result,$x,'tabid'); + if($is_admin || $profileGlobalPermission[2]==0 || $profileGlobalPermission[1]==0 || $profileTabsPermission[$tabid]==0) { + $mod_name = $adb->query_result($result,$x,"name"); + $module_name[$y] = $mod_name; + $y++; + } + } +} + +if(isset($_REQUEST['selected_module']) && $_REQUEST['selected_module'] != '') { + $select_module = vtlib_purify($_REQUEST['selected_module']); + if (!in_array($select_module, $module_name)) { + show_error_msg(); + } +} else { + if (count($module_name) > 0) { + $select_module = $module_name[0]; + } else { + show_error_msg('no_permitted_modules'); + } +} + +$url_string = ''; +if(isset($_REQUEST['query']) && $_REQUEST['query'] == 'true') +{ + list($where, $ustring) = split("#@@#",RBSearch($select_module)); + + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); + +} + +$focus = CRMEntity::getInstance($select_module); + +if(count($module_name) > 0) +{ + $cur_mod_view = new CustomView($select_module); + $viewid = $cur_mod_view->getViewId($select_module); + + $list_query = getListQuery($select_module, ''); + $list_query = $cur_mod_view->getModifiedCvListQuery($viewid,$list_query,$select_module); + $list_query = preg_replace("/vtiger_crmentity.deleted\s*=\s*0/i", 'vtiger_crmentity.deleted = 1', $list_query); + //Search criteria added to the list Query + if(isset($where) && $where != '') + { + $list_query .= ' AND '.$where; + } + $count_result = $adb->query( mkCountQuery($list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); + + $rb_listview_header = getListViewHeader($focus, $select_module, '','','','global',$cur_mod_view,'',true); + $listview_header_search=getSearchListHeaderValues($focus,$select_module,$url_string,$sorder,$order_by,"",$cur_mod_view); + $smarty->assign("SEARCHLISTHEADER", $listview_header_search); + + if(isset($_REQUEST['start']) && $_REQUEST['start'] != '') + $start = vtlib_purify($_REQUEST['start']); + else + $start = 1; + + $navigation_array = getNavigationValues($start, $noofrows, $list_max_entries_per_page); + + // Setting the record count string + //modified by rdhital + $start_rec = $navigation_array['start']; + $end_rec = $navigation_array['end_val']; + //By Raju Ends + + //limiting the query + if ($start_rec ==0) + $limit_start_rec = 0; + else + $limit_start_rec = $start_rec -1; + + if( $adb->dbType == "pgsql") + $list_result = $adb->query($list_query. " OFFSET ".$limit_start_rec." LIMIT ".$list_max_entries_per_page); + else + $list_result = $adb->query($list_query. " LIMIT ".$limit_start_rec.",".$list_max_entries_per_page); + + $record_string= $app_strings[LBL_SHOWING]." " .$start_rec." - ".$end_rec." " .$app_strings[LBL_LIST_OF] ." ".$noofrows; + + $navigationOutput = getTableHeaderNavigation($navigation_array, $url_string,"Recyclebin","index",""); + + $lvEntries = getListViewEntries($focus,$select_module,$list_result,$navigation_array,"","","","",$cur_mod_view,'','','',true); +} + +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("RECORD_COUNTS", $record_string); + +//to get the field name that mentions the module +$query = "select fieldname from vtiger_entityname where modulename =?"; +$module_fielaname = $adb->query_result($adb->pquery($query, array($select_module)),0,'fieldname'); + +if(strpos($module_fielaname,',')) +{ + $field_array = explode(',',$module_fielaname); + $index_field = $field_array[0]; +} +else +{ + $index_field = $module_fielaname; +} + +$alphabetical = AlphabeticalSearch($currentModule,'index',$index_field,'true','basic',"","","","",$viewid); + +$category = getParentTab();; + +$check_button = Button_Check($_REQUEST['module']); +$check_button['EditView'] = 'no'; +$smarty->assign("CHECK", $check_button); + +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NUMBER_MODULES",$noofrows); +$smarty->assign("MODULE_NAME",$module_name); +$smarty->assign("SELECTED_MODULE",$select_module); +$smarty->assign("MODULE_DATA",$rb_listview_header); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("CATEGORY",$category); +$smarty->assign("THEME",$theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", return_module_language($current_language,$select_module)); +$smarty->assign("lvEntries", $lvEntries); + +$smarty->assign("IS_ADMIN", $is_admin); + +if($_REQUEST['mode'] != 'ajax') { + $smarty->display(vtlib_getModuleTemplate($currentModule,'RecycleBin.tpl')); +} else { + $smarty->display(vtlib_getModuleTemplate($currentModule,'RecycleBinContents.tpl')); +} + +function show_error_msg($error_type='permission_denied') { + global $theme; + if ($error_type == 'permission_denied') { + echo ""; + echo "
    "; + echo "
    + + + + + + + + + +
    " + . getTranslatedString('LBL_PERMISSION') . "
    + " . getTranslatedString('LBL_GO_BACK') . "
    +
    +
    "; + echo "
    "; + die(); + } else if ($error_type == 'no_permitted_modules') { + echo ""; + echo "
    "; + echo "
    + + + + + + +
    " + . getTranslatedString('LBL_NO_PERMITTED_MODULES') . "
    +
    "; + echo "
    "; + die(); + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/RecycleBin/RecycleBin.js b/oss/vtiger/trunk/modules/RecycleBin/RecycleBin.js new file mode 100644 index 00000000..21d1d2d1 --- /dev/null +++ b/oss/vtiger/trunk/modules/RecycleBin/RecycleBin.js @@ -0,0 +1,199 @@ +/*+******************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + *********************************************************************************/ + +document.write("'; +$list_report_form->assign('DATE_FORMAT',$date_format); + +$list_report_form->assign('PRI_MODULE',$primarymodule); +$list_report_form->assign('SEC_MODULE',$secondarymodule); +$reportname = htmlspecialchars($reportname, ENT_COMPAT, $default_charset); +$list_report_form->assign('REPORT_NAME',$reportname); +$reportdescription = htmlspecialchars($reportdescription, ENT_COMPAT, $default_charset); +$list_report_form->assign('REPORT_DESC',$reportdescription); +$list_report_form->assign('FOLDERID',$folderid); +$list_report_form->assign("IMAGE_PATH", $image_path); +$list_report_form->assign("THEME_PATH", $theme_path); +if(isPermitted($primarymodule,'index') == "yes" && $permission==false) +{ + $list_report_form->display("ReportsStep1.tpl"); +} +else +{ + echo ""; + echo "
    "; + echo "
    + + + + + + + + + +
    ".$mod_strings['LBL_NO_PERMISSION']." ".$primarymodule." ".$secondarymodule."
    + $app_strings[LBL_GO_BACK]
    +
    "; + echo "
    "; +} +?> diff --git a/oss/vtiger/trunk/modules/Reports/PopulateReports.php b/oss/vtiger/trunk/modules/Reports/PopulateReports.php new file mode 100644 index 00000000..1b70f12d --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/PopulateReports.php @@ -0,0 +1,584 @@ +'Account and Contact Reports'), + Array('Lead Reports'=>'Lead Reports'), + Array('Potential Reports'=>'Potential Reports'), + Array('Activity Reports'=>'Activity Reports'), + Array('HelpDesk Reports'=>'HelpDesk Reports'), + Array('Product Reports'=>'Product Reports'), + Array('Quote Reports' =>'Quote Reports'), + Array('PurchaseOrder Reports'=>'PurchaseOrder Reports'), + Array('Invoice Reports'=>'Invoice Reports'), + Array('SalesOrder Reports'=>'SalesOrder Reports'), + Array('Campaign Reports'=>'Campaign Reports') + ); + +$reportmodules = Array(Array('primarymodule'=>'Contacts','secondarymodule'=>'Accounts'), + Array('primarymodule'=>'Contacts','secondarymodule'=>'Accounts'), + Array('primarymodule'=>'Contacts','secondarymodule'=>'Potentials'), + Array('primarymodule'=>'Leads','secondarymodule'=>''), + Array('primarymodule'=>'Leads','secondarymodule'=>''), + Array('primarymodule'=>'Potentials','secondarymodule'=>''), + Array('primarymodule'=>'Potentials','secondarymodule'=>''), + Array('primarymodule'=>'Calendar','secondarymodule'=>''), + Array('primarymodule'=>'Calendar','secondarymodule'=>''), + Array('primarymodule'=>'HelpDesk','secondarymodule'=>'Products'), + Array('primarymodule'=>'HelpDesk','secondarymodule'=>''), + Array('primarymodule'=>'HelpDesk','secondarymodule'=>''), + Array('primarymodule'=>'Products','secondarymodule'=>''), + Array('primarymodule'=>'Products','secondarymodule'=>'Contacts'), + Array('primarymodule'=>'Quotes','secondarymodule'=>''), + Array('primarymodule'=>'Quotes','secondarymodule'=>''), + Array('primarymodule'=>'PurchaseOrder','secondarymodule'=>'Contacts'), + Array('primarymodule'=>'PurchaseOrder','secondarymodule'=>''), + Array('primarymodule'=>'Invoice','secondarymodule'=>''), + Array('primarymodule'=>'SalesOrder','secondarymodule'=>''), + Array('primarymodule'=>'Campaigns','secondarymodule'=>'') + ); + +$selectcolumns = Array(Array('vtiger_contactdetails:firstname:Contacts_First_Name:firstname:V', + 'vtiger_contactdetails:lastname:Contacts_Last_Name:lastname:V', + 'vtiger_contactsubdetails:leadsource:Contacts_Lead_Source:leadsource:V', + 'vtiger_accountContacts:accountname:Contacts_Account_Name:account_id:V', + 'vtiger_account:industry:Accounts_industry:industry:V', + 'vtiger_contactdetails:email:Contacts_Email:email:E'), + + Array('vtiger_contactdetails:firstname:Contacts_First_Name:firstname:V', + 'vtiger_contactdetails:lastname:Contacts_Last_Name:lastname:V', + 'vtiger_contactsubdetails:leadsource:Contacts_Lead_Source:leadsource:V', + 'vtiger_accountContacts:accountname:Contacts_Account_Name:account_id:V', + 'vtiger_account:industry:Accounts_industry:industry:V', + 'vtiger_contactdetails:email:Contacts_Email:email:E'), + + Array('vtiger_contactdetails:firstname:Contacts_First_Name:firstname:V', + 'vtiger_contactdetails:lastname:Contacts_Last_Name:lastname:V', + 'vtiger_accountContacts:accountname:Contacts_Account_Name:account_id:V', + 'vtiger_contactdetails:email:Contacts_Email:email:E', + 'vtiger_potential:potentialname:Potentials_Potential_Name:potentialname:V', + 'vtiger_potential:sales_stage:Potentials_Sales_Stage:sales_stage:V'), + + Array('vtiger_leaddetails:firstname:Leads_First_Name:firstname:V', + 'vtiger_leaddetails:lastname:Leads_Last_Name:lastname:V', + 'vtiger_leaddetails:company:Leads_Company:company:V', + 'vtiger_leaddetails:email:Leads_Email:email:E', + 'vtiger_leaddetails:leadsource:Leads_Lead_Source:leadsource:V'), + + Array('vtiger_leaddetails:firstname:Leads_First_Name:firstname:V', + 'vtiger_leaddetails:lastname:Leads_Last_Name:lastname:V', + 'vtiger_leaddetails:company:Leads_Company:company:V', + 'vtiger_leaddetails:email:Leads_Email:email:E', + 'vtiger_leaddetails:leadsource:Leads_Lead_Source:leadsource:V', + 'vtiger_leaddetails:leadstatus:Leads_Lead_Status:leadstatus:V'), + + Array('vtiger_potential:potentialname:Potentials_Potential_Name:potentialname:V', + 'vtiger_potential:amount:Potentials_Amount:amount:N', + 'vtiger_potential:potentialtype:Potentials_Type:opportunity_type:V', + 'vtiger_potential:leadsource:Potentials_Lead_Source:leadsource:V', + 'vtiger_potential:sales_stage:Potentials_Sales_Stage:sales_stage:V'), + + Array('vtiger_potential:potentialname:Potentials_Potential_Name:potentialname:V', + 'vtiger_potential:amount:Potentials_Amount:amount:N', + 'vtiger_potential:potentialtype:Potentials_Type:opportunity_type:V', + 'vtiger_potential:leadsource:Potentials_Lead_Source:leadsource:V', + 'vtiger_potential:sales_stage:Potentials_Sales_Stage:sales_stage:V'), + + Array('vtiger_activity:subject:Calendar_Subject:subject:V', + 'vtiger_contactdetailsCalendar:lastname:Calendar_Contact_Name:contact_id:I', + 'vtiger_activity:status:Calendar_Status:taskstatus:V', + 'vtiger_activity:priority:Calendar_Priority:taskpriority:V', + 'vtiger_usersCalendar:user_name:Calendar_Assigned_To:assigned_user_id:V'), + + Array('vtiger_activity:subject:Calendar_Subject:subject:V', + 'vtiger_contactdetailsCalendar:lastname:Calendar_Contact_Name:contact_id:I', + 'vtiger_activity:status:Calendar_Status:taskstatus:V', + 'vtiger_activity:priority:Calendar_Priority:taskpriority:V', + 'vtiger_usersCalendar:user_name:Calendar_Assigned_To:assigned_user_id:V'), + + Array('vtiger_troubletickets:title:HelpDesk_Title:ticket_title:V', + 'vtiger_troubletickets:status:HelpDesk_Status:ticketstatus:V', + 'vtiger_products:productname:Products_Product_Name:productname:V', + 'vtiger_products:discontinued:Products_Product_Active:discontinued:V', + 'vtiger_products:productcategory:Products_Product_Category:productcategory:V', + 'vtiger_products:manufacturer:Products_Manufacturer:manufacturer:V'), + + Array('vtiger_troubletickets:title:HelpDesk_Title:ticket_title:V', + 'vtiger_troubletickets:priority:HelpDesk_Priority:ticketpriorities:V', + 'vtiger_troubletickets:severity:HelpDesk_Severity:ticketseverities:V', + 'vtiger_troubletickets:status:HelpDesk_Status:ticketstatus:V', + 'vtiger_troubletickets:category:HelpDesk_Category:ticketcategories:V', + 'vtiger_usersHelpDesk:user_name:HelpDesk_Assigned_To:assigned_user_id:V'), + + Array('vtiger_troubletickets:title:HelpDesk_Title:ticket_title:V', + 'vtiger_troubletickets:priority:HelpDesk_Priority:ticketpriorities:V', + 'vtiger_troubletickets:severity:HelpDesk_Severity:ticketseverities:V', + 'vtiger_troubletickets:status:HelpDesk_Status:ticketstatus:V', + 'vtiger_troubletickets:category:HelpDesk_Category:ticketcategories:V', + 'vtiger_usersHelpDesk:user_name:HelpDesk_Assigned_To:assigned_user_id:V'), + + Array('vtiger_products:productname:Products_Product_Name:productname:V', + 'vtiger_products:productcode:Products_Product_Code:productcode:V', + 'vtiger_products:discontinued:Products_Product_Active:discontinued:V', + 'vtiger_products:productcategory:Products_Product_Category:productcategory:V', + 'vtiger_products:website:Products_Website:website:V', + 'vtiger_vendorRelProducts:vendorname:Products_Vendor_Name:vendor_id:I', + 'vtiger_products:mfr_part_no:Products_Mfr_PartNo:mfr_part_no:V'), + + Array('vtiger_products:productname:Products_Product_Name:productname:V', + 'vtiger_products:manufacturer:Products_Manufacturer:manufacturer:V', + 'vtiger_products:productcategory:Products_Product_Category:productcategory:V', + 'vtiger_contactdetails:firstname:Contacts_First_Name:firstname:V', + 'vtiger_contactdetails:lastname:Contacts_Last_Name:lastname:V', + 'vtiger_contactsubdetails:leadsource:Contacts_Lead_Source:leadsource:V'), + + Array('vtiger_quotes:subject:Quotes_Subject:subject:V', + 'vtiger_potentialRelQuotes:potentialname:Quotes_Potential_Name:potential_id:I', + 'vtiger_quotes:quotestage:Quotes_Quote_Stage:quotestage:V', + 'vtiger_contactdetailsQuotes:lastname:Quotes_Contact_Name:contact_id:V', + 'vtiger_usersRel1:user_name:Quotes_Inventory_Manager:assigned_user_id1:I', + 'vtiger_accountQuotes:accountname:Quotes_Account_Name:account_id:I'), + + Array('vtiger_quotes:subject:Quotes_Subject:subject:V', + 'vtiger_potentialRelQuotes:potentialname:Quotes_Potential_Name:potential_id:I', + 'vtiger_quotes:quotestage:Quotes_Quote_Stage:quotestage:V', + 'vtiger_contactdetailsQuotes:lastname:Quotes_Contact_Name:contact_id:V', + 'vtiger_usersRel1:user_name:Quotes_Inventory_Manager:assigned_user_id1:I', + 'vtiger_accountQuotes:accountname:Quotes_Account_Name:account_id:I', + 'vtiger_quotes:carrier:Quotes_Carrier:carrier:V', + 'vtiger_quotes:shipping:Quotes_Shipping:shipping:V'), + + Array('vtiger_purchaseorder:subject:PurchaseOrder_Subject:subject:V', + 'vtiger_vendorRelPurchaseOrder:vendorname:PurchaseOrder_Vendor_Name:vendor_id:I', + 'vtiger_purchaseorder:tracking_no:PurchaseOrder_Tracking_Number:tracking_no:V', + 'vtiger_contactdetails:firstname:Contacts_First_Name:firstname:V', + 'vtiger_contactdetails:lastname:Contacts_Last_Name:lastname:V', + 'vtiger_contactsubdetails:leadsource:Contacts_Lead_Source:leadsource:V', + 'vtiger_contactdetails:email:Contacts_Email:email:E'), + + Array('vtiger_purchaseorder:subject:PurchaseOrder_Subject:subject:V', + 'vtiger_vendorRelPurchaseOrder:vendorname:PurchaseOrder_Vendor_Name:vendor_id:I', + 'vtiger_purchaseorder:requisition_no:PurchaseOrder_Requisition_No:requisition_no:V', + 'vtiger_purchaseorder:tracking_no:PurchaseOrder_Tracking_Number:tracking_no:V', + 'vtiger_contactdetailsPurchaseOrder:lastname:PurchaseOrder_Contact_Name:contact_id:I', + 'vtiger_purchaseorder:carrier:PurchaseOrder_Carrier:carrier:V', + 'vtiger_purchaseorder:salescommission:PurchaseOrder_Sales_Commission:salescommission:N', + 'vtiger_purchaseorder:exciseduty:PurchaseOrder_Excise_Duty:exciseduty:N', + 'vtiger_usersPurchaseOrder:user_name:PurchaseOrder_Assigned_To:assigned_user_id:V'), + + Array('vtiger_invoice:subject:Invoice_Subject:subject:V', + 'vtiger_invoice:salesorderid:Invoice_Sales_Order:salesorder_id:I', + 'vtiger_invoice:customerno:Invoice_Customer_No:customerno:V', + 'vtiger_invoice:exciseduty:Invoice_Excise_Duty:exciseduty:N', + 'vtiger_invoice:salescommission:Invoice_Sales_Commission:salescommission:N', + 'vtiger_accountInvoice:accountname:Invoice_Account_Name:account_id:I'), + + Array('vtiger_salesorder:subject:SalesOrder_Subject:subject:V', + 'vtiger_quotesSalesOrder:subject:SalesOrder_Quote_Name:quote_id:I', + 'vtiger_contactdetailsSalesOrder:lastname:SalesOrder_Contact_Name:contact_id:I', + 'vtiger_salesorder:duedate:SalesOrder_Due_Date:duedate:D', + 'vtiger_salesorder:carrier:SalesOrder_Carrier:carrier:V', + 'vtiger_salesorder:sostatus:SalesOrder_Status:sostatus:V', + 'vtiger_accountSalesOrder:accountname:SalesOrder_Account_Name:account_id:I', + 'vtiger_salesorder:salescommission:SalesOrder_Sales_Commission:salescommission:N', + 'vtiger_salesorder:exciseduty:SalesOrder_Excise_Duty:exciseduty:N', + 'vtiger_usersSalesOrder:user_name:SalesOrder_Assigned_To:assigned_user_id:V'), + + Array('vtiger_campaign:campaignname:Campaigns_Campaign_Name:campaignname:V', + 'vtiger_campaign:campaigntype:Campaigns_Campaign_Type:campaigntype:V', + 'vtiger_campaign:targetaudience:Campaigns_Target_Audience:targetaudience:V', + 'vtiger_campaign:budgetcost:Campaigns_Budget_Cost:budgetcost:I', + 'vtiger_campaign:actualcost:Campaigns_Actual_Cost:actualcost:I', + 'vtiger_campaign:expectedrevenue:Campaigns_Expected_Revenue:expectedrevenue:I', + 'vtiger_campaign:expectedsalescount:Campaigns_Expected_Sales_Count:expectedsalescount:N', + 'vtiger_campaign:actualsalescount:Campaigns_Actual_Sales_Count:actualsalescount:N', + 'vtiger_usersCampaigns:user_name:Campaigns_Assigned_To:assigned_user_id:V') + ); + +$reports = Array(Array('reportname'=>'Contacts by Accounts', + 'reportfolder'=>'Account and Contact Reports', + 'description'=>'Contacts related to Accounts', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>'0'), + + Array('reportname'=>'Contacts without Accounts', + 'reportfolder'=>'Account and Contact Reports', + 'description'=>'Contacts not related to Accounts', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>'1'), + + Array('reportname'=>'Contacts by Potentials', + 'reportfolder'=>'Account and Contact Reports', + 'description'=>'Contacts related to Potentials', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>'2'), + + Array('reportname'=>'Lead by Source', + 'reportfolder'=>'Lead Reports', + 'description'=>'Lead by Source', + 'reporttype'=>'summary', + 'sortid'=>'0','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'Lead Status Report', + 'reportfolder'=>'Lead Reports', + 'description'=>'Lead Status Report', + 'reporttype'=>'summary', + 'sortid'=>'1','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'Potential Pipeline', + 'reportfolder'=>'Potential Reports', + 'description'=>'Potential Pipeline', + 'reporttype'=>'summary', + 'sortid'=>'2','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'Closed Potentials', + 'reportfolder'=>'Potential Reports', + 'description'=>'Potential that have Won', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>'3'), + + Array('reportname'=>'Last Month Activities', + 'reportfolder'=>'Activity Reports', + 'description'=>'Last Month Activities', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'0','advfilterid'=>''), + + Array('reportname'=>'This Month Activities', + 'reportfolder'=>'Activity Reports', + 'description'=>'This Month Activities', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'1','advfilterid'=>''), + + Array('reportname'=>'Tickets by Products', + 'reportfolder'=>'HelpDesk Reports', + 'description'=>'Tickets related to Products', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'Tickets by Priority', + 'reportfolder'=>'HelpDesk Reports', + 'description'=>'Tickets by Priority', + 'reporttype'=>'summary', + 'sortid'=>'3','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'Open Tickets', + 'reportfolder'=>'HelpDesk Reports', + 'description'=>'Tickets that are Open', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>'4'), + + Array('reportname'=>'Product Details', + 'reportfolder'=>'Product Reports', + 'description'=>'Product Detailed Report', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'Products by Contacts', + 'reportfolder'=>'Product Reports', + 'description'=>'Products related to Contacts', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'Open Quotes', + 'reportfolder'=>'Quote Reports', + 'description'=>'Quotes that are Open', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>'5'), + + Array('reportname'=>'Quotes Detailed Report', + 'reportfolder'=>'Quote Reports', + 'description'=>'Quotes Detailed Report', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'PurchaseOrder by Contacts', + 'reportfolder'=>'PurchaseOrder Reports', + 'description'=>'PurchaseOrder related to Contacts', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'PurchaseOrder Detailed Report', + 'reportfolder'=>'PurchaseOrder Reports', + 'description'=>'PurchaseOrder Detailed Report', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'Invoice Detailed Report', + 'reportfolder'=>'Invoice Reports', + 'description'=>'Invoice Detailed Report', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'SalesOrder Detailed Report', + 'reportfolder'=>'SalesOrder Reports', + 'description'=>'SalesOrder Detailed Report', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>''), + + Array('reportname'=>'Campaign Expectations and Actuals', + 'reportfolder'=>'Campaign Reports', + 'description'=>'Campaign Expectations and Actuals', + 'reporttype'=>'tabular', + 'sortid'=>'','stdfilterid'=>'','advfilterid'=>'') + + ); + +$sortorder = Array( + Array( + Array('columnname'=>'vtiger_leaddetails:leadsource:Leads_Lead_Source:leadsource:V', + 'sortorder'=>'Ascending' + ) + ), + Array( + Array('columnname'=>'vtiger_leaddetails:leadstatus:Leads_Lead_Status:leadstatus:V', + 'sortorder'=>'Ascending' + ) + ), + Array( + Array('columnname'=>'vtiger_potential:sales_stage:Potentials_Sales_Stage:sales_stage:V', + 'sortorder'=>'Ascending' + ) + ), + Array( + Array('columnname'=>'vtiger_troubletickets:priority:HelpDesk_Priority:ticketpriorities:V', + 'sortorder'=>'Ascending' + ) + ) + ); + +$stdfilters = Array(Array('columnname'=>'vtiger_crmentity:modifiedtime:modifiedtime:Calendar_Modified_Time', + 'datefilter'=>'lastmonth', + 'startdate'=>'2005-05-01', + 'enddate'=>'2005-05-31'), + + Array('columnname'=>'vtiger_crmentity:modifiedtime:modifiedtime:Calendar_Modified_Time', + 'datefilter'=>'thismonth', + 'startdate'=>'2005-06-01', + 'enddate'=>'2005-06-30') + ); + +$advfilters = Array( + Array( + Array('columnname'=>'vtiger_accountContacts:accountname:Contacts_Account_Name:account_id:V', + 'comparator'=>'n', + 'value'=>'' + ) + ), + Array( + Array('columnname'=>'vtiger_accountContacts:accountname:Contacts_Account_Name:account_id:V', + 'comparator'=>'e', + 'value'=>'' + ) + ), + Array( + Array('columnname'=>'vtiger_potential:potentialname:Potentials_Potential_Name:potentialname:V', + 'comparator'=>'n', + 'value'=>'' + ) + ), + Array( + Array('columnname'=>'vtiger_potential:sales_stage:Potentials_Sales_Stage:sales_stage:V', + 'comparator'=>'e', + 'value'=>'Closed Won' + ) + ), + Array( + Array('columnname'=>'vtiger_troubletickets:status:HelpDesk_Status:ticketstatus:V', + 'comparator'=>'n', + 'value'=>'Closed' + ) + ), + Array( + Array('columnname'=>'vtiger_quotes:quotestage:Quotes_Quote_Stage:quotestage:V', + 'comparator'=>'n', + 'value'=>'Accepted' + ), + Array('columnname'=>'vtiger_quotes:quotestage:Quotes_Quote_Stage:quotestage:V', + 'comparator'=>'n', + 'value'=>'Rejected' + ) + ) + ); +//quotes:quotestage:Quotes_Quote_Stage:quotestage:V +foreach($rptfolder as $key=>$rptarray) +{ + foreach($rptarray as $foldername=>$folderdescription) + { + PopulateReportFolder($foldername,$folderdescription); + $reportid[$foldername] = $key+1; + } +} + +foreach($reports as $key=>$report) +{ + $queryid = insertSelectQuery(); + insertReports($queryid,$reportid[$report['reportfolder']],$report['reportname'],$report['description'],$report['reporttype']); + insertSelectColumns($queryid,$selectcolumns[$key]); + insertReportModules($queryid,$reportmodules[$key]['primarymodule'],$reportmodules[$key]['secondarymodule']); + + if(isset($stdfilters[$report['stdfilterid']])) + { + $i = $report['stdfilterid']; + insertStdFilter($queryid,$stdfilters[$i]['columnname'],$stdfilters[$i]['datefilter'],$stdfilters[$i]['startdate'],$stdfilters[$i]['enddate']); + } + + if(isset($advfilters[$report['advfilterid']])) + { + insertAdvFilter($queryid,$advfilters[$report['advfilterid']]); + } + + if($report['reporttype'] == "summary") + { + insertSortColumns($queryid,$sortorder[$report['sortid']]); + } +} +$adb->pquery("UPDATE vtiger_report SET sharingtype='Public'",array()); +/** Function to store the foldername and folderdescription to database + * This function accepts the given folder name and description + * ans store it in db as SAVED + */ + +function PopulateReportFolder($fldrname,$fldrdescription) +{ + global $adb; + $sql = "INSERT INTO vtiger_reportfolder (FOLDERNAME,DESCRIPTION,STATE) VALUES(?,?,?)"; + $params = array($fldrname, $fldrdescription, 'SAVED'); + $result = $adb->pquery($sql, $params); +} + +/** Function to add an entry in selestquery vtiger_table + * + */ + +function insertSelectQuery() +{ + global $adb; + $genQueryId = $adb->getUniqueID("vtiger_selectquery"); + if($genQueryId != "") + { + $iquerysql = "insert into vtiger_selectquery (QUERYID,STARTINDEX,NUMOFOBJECTS) values (?,?,?)"; + $iquerysqlresult = $adb->pquery($iquerysql, array($genQueryId,0,0)); + } + + return $genQueryId; +} + +/** Function to store the vtiger_field names selected for a vtiger_report to a database + * + * + */ + +function insertSelectColumns($queryid,$columnname) +{ + global $adb; + if($queryid != "") + { + for($i=0;$i < count($columnname);$i++) + { + $icolumnsql = "insert into vtiger_selectcolumn (QUERYID,COLUMNINDEX,COLUMNNAME) values (?,?,?)"; + $icolumnsqlresult = $adb->pquery($icolumnsql, array($queryid, $i, $columnname[$i])); + } + } +} + + +/** Function to store the vtiger_report details to database + * This function accepts queryid,folderid,reportname,description,reporttype + * as arguments and store the informations in vtiger_report vtiger_table + */ + +function insertReports($queryid,$folderid,$reportname,$description,$reporttype) +{ + global $adb; + if($queryid != "") + { + $ireportsql = "insert into vtiger_report (REPORTID,FOLDERID,REPORTNAME,DESCRIPTION,REPORTTYPE,QUERYID,STATE) values (?,?,?,?,?,?,?)"; + $ireportparams = array($queryid, $folderid, $reportname, $description, $reporttype, $queryid, 'SAVED'); + $ireportresult = $adb->pquery($ireportsql, $ireportparams); + } +} + +/** Function to store the vtiger_report modules to database + * This function accepts queryid,primary module and secondary module + * as arguments and store the informations in vtiger_reportmodules vtiger_table + */ + + +function insertReportModules($queryid,$primarymodule,$secondarymodule) +{ + global $adb; + if($queryid != "") + { + $ireportmodulesql = "insert into vtiger_reportmodules (REPORTMODULESID,PRIMARYMODULE,SECONDARYMODULES) values (?,?,?)"; + $ireportmoduleresult = $adb->pquery($ireportmodulesql, array($queryid, $primarymodule, $secondarymodule)); + } +} + + +/** Function to store the vtiger_report sortorder to database + * This function accepts queryid,sortlists + * as arguments and store the informations sort columns and + * and sortorder in vtiger_reportsortcol vtiger_table + */ + + +function insertSortColumns($queryid,$sortlists) +{ + global $adb; + if($queryid != "") + { + foreach($sortlists as $i=>$sort) + { + $sort_bysql = "insert into vtiger_reportsortcol (SORTCOLID,REPORTID,COLUMNNAME,SORTORDER) values (?,?,?,?)"; + $sort_byresult = $adb->pquery($sort_bysql, array(($i+1), $queryid, $sort['columnname'], $sort['sortorder'])); + } + } + +} + + +/** Function to store the vtiger_report sort date details to database + * This function accepts queryid,filtercolumn,datefilter,startdate,enddate + * as arguments and store the informations in vtiger_reportdatefilter vtiger_table + */ + + +function insertStdFilter($queryid,$filtercolumn,$datefilter,$startdate,$enddate) +{ + global $adb; + if($queryid != "") + { + $ireportmodulesql = "insert into vtiger_reportdatefilter (DATEFILTERID,DATECOLUMNNAME,DATEFILTER,STARTDATE,ENDDATE) values (?,?,?,?,?)"; + $ireportmoduleresult = $adb->pquery($ireportmodulesql, array($queryid, $filtercolumn, $datefilter, $startdate, $enddate)); + } + +} + +/** Function to store the vtiger_report conditions to database + * This function accepts queryid,filters + * as arguments and store the informations in vtiger_relcriteria vtiger_table + */ + + +function insertAdvFilter($queryid,$filters) +{ + global $adb; + if($queryid != "") + { + foreach($filters as $i=>$filter) + { + $irelcriteriasql = "insert into vtiger_relcriteria(QUERYID,COLUMNINDEX,COLUMNNAME,COMPARATOR,VALUE) values (?,?,?,?,?)"; + $irelcriteriaresult = $adb->pquery($irelcriteriasql, array($queryid,$i,$filter['columnname'],$filter['comparator'],$filter['value'])); + } + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Reports/PrintReport.php b/oss/vtiger/trunk/modules/Reports/PrintReport.php new file mode 100644 index 00000000..800885a8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/PrintReport.php @@ -0,0 +1,37 @@ +RunTimeFilter($filtercolumn,$filter,$startdate,$enddate); + +$arr_values = $oReportRun->GenerateReport("PRINT",$filterlist); +$total_report = $oReportRun->GenerateReport("PRINT_TOTAL",$filterlist); +$oPrint_smarty->assign("COUNT",$arr_values[1]); +$oPrint_smarty->assign("APP",$app_strings); +$oPrint_smarty->assign("MOD",$mod_strings); +$oPrint_smarty->assign("REPORT_NAME",$oReport->reportname); +$oPrint_smarty->assign("PRINT_CONTENTS",$arr_values[0]); +$oPrint_smarty->assign("TOTAL_HTML",$total_report); +$oPrint_smarty->display("PrintReport.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Reports/ReportColumns.php b/oss/vtiger/trunk/modules/Reports/ReportColumns.php new file mode 100644 index 00000000..05f72991 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/ReportColumns.php @@ -0,0 +1,158 @@ +assign("MOD", $mod_strings); +$report_column->assign("APP", $app_strings); +$report_column->assign("IMAGE_PATH",$image_path); +$report_column->assign("THEME_PATH",$theme_path); +if(isset($_REQUEST["record"]) && $_REQUEST['record']!='') +{ + $recordid = vtlib_purify($_REQUEST["record"]); + $oReport = new Reports($recordid); + $BLOCK1 = getPrimaryColumnsHTML($oReport->primodule); + + $oRep = new Reports(); + $secondarymodule = ''; + $secondarymodules =Array(); + if(!empty($oRep->related_modules[$oReport->primodule])) { + foreach($oRep->related_modules[$oReport->primodule] as $key=>$value){ + if(isset($_REQUEST["secondarymodule_".$value]))$secondarymodules []= $_REQUEST["secondarymodule_".$value]; + } + } + $secondarymodule = implode(":",$secondarymodules); + + $oReport->secmodule = $secondarymodule; + $BLOCK1 .= getSecondaryColumnsHTML($oReport->secmodule); + $BLOCK2 = $oReport->getSelectedColumnsList($recordid); + $report_column->assign("BLOCK1",$BLOCK1); + $report_column->assign("BLOCK2",$BLOCK2); +}else +{ + $primarymodule = vtlib_purify($_REQUEST["primarymodule"]); + $BLOCK1 = getPrimaryColumnsHTML($primarymodule); + $ogReport = new Reports(); + if(!empty($ogReport->related_modules[$primarymodule])) { + foreach($ogReport->related_modules[$primarymodule] as $key=>$value){ + $BLOCK1 .= getSecondaryColumnsHTML($_REQUEST["secondarymodule_".$value]); + } + } + + $report_column->assign("BLOCK1",$BLOCK1); + +} + +/** Function to formulate the vtiger_fields for the primary modules + * This function accepts the module name + * as arguments and generates the vtiger_fields for the primary module as + * a HTML Combo values + */ + +function getPrimaryColumnsHTML($module) +{ + global $ogReport; + global $app_list_strings; + global $app_strings; + global $current_language; + $id_added=false; + $mod_strings = return_module_language($current_language,$module); + $block_listed = array(); + foreach($ogReport->module_list[$module] as $key=>$value) + { + if(isset($ogReport->pri_module_columnslist[$module][$value]) && !$block_listed[$value]) + { + $block_listed[$value] = true; + $shtml .= ""; + if($id_added==false){ + $shtml .= ""; + $id_added=true; + } + foreach($ogReport->pri_module_columnslist[$module][$value] as $field=>$fieldlabel) + { + if(isset($mod_strings[$fieldlabel])) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + } + } + } + return $shtml; +} + +/** Function to formulate the vtiger_fields for the secondary modules + * This function accepts the module name + * as arguments and generates the vtiger_fields for the secondary module as + * a HTML Combo values + */ + + +function getSecondaryColumnsHTML($module) +{ + global $ogReport; + global $app_list_strings,$app_strings; + global $current_language; + + if($module != "") + { + $secmodule = explode(":",$module); + for($i=0;$i < count($secmodule) ;$i++) + { + $mod_strings = return_module_language($current_language,$secmodule[$i]); + if(vtlib_isModuleActive($secmodule[$i])){ + $block_listed = array(); + foreach($ogReport->module_list[$secmodule[$i]] as $key=>$value) + { + if(isset($ogReport->sec_module_columnslist[$secmodule[$i]][$value]) && !$block_listed[$value]) + { + $block_listed[$value] = true; + $shtml .= ""; + foreach($ogReport->sec_module_columnslist[$secmodule[$i]][$value] as $field=>$fieldlabel) + { + if(isset($mod_strings[$fieldlabel])) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + } + } + } + } + } + } + return $shtml; +} + +$report_column->display("ReportColumns.tpl"); +?> + diff --git a/oss/vtiger/trunk/modules/Reports/ReportColumnsTotal.php b/oss/vtiger/trunk/modules/Reports/ReportColumnsTotal.php new file mode 100644 index 00000000..add6a387 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/ReportColumnsTotal.php @@ -0,0 +1,75 @@ +assign("MOD", $mod_strings); +$report_column_tot->assign("APP", $app_strings); +$report_column_tot->assign("IMAGE_PATH",$image_path); + +if(isset($_REQUEST["record"]) && $_REQUEST['record']!='') +{ + $recordid = vtlib_purify($_REQUEST["record"]); + $oReport = new Reports($recordid); + $oRep = new Reports(); + $secondarymodule = ''; + $secondarymodules =Array(); + + if(!empty($oRep->related_modules[$oReport->primodule])) { + foreach($oRep->related_modules[$oReport->primodule] as $key=>$value){ + if(isset($_REQUEST["secondarymodule_".$value]))$secondarymodules []= vtlib_purify($_REQUEST["secondarymodule_".$value]); + } + } + $secondarymodule = implode(":",$secondarymodules); + $oReport->secmodule = $secondarymodule; + + $BLOCK1 = $oReport->sgetColumntoTotalSelected($oReport->primodule,$oReport->secmodule,$recordid); + $report_column_tot->assign("BLOCK1",$BLOCK1); + $report_column_tot->assign("RECORDID",$recordid); +}else +{ + $primarymodule = vtlib_purify($_REQUEST["primarymodule"]); + $oReport = new Reports(); + $secondarymodule = Array(); + if(!empty($ogReport->related_modules[$primarymodule])) { + foreach($ogReport->related_modules[$primarymodule] as $key=>$value){ + $secondarymodule[] = vtlib_purify($_REQUEST["secondarymodule_".$value]); + + } + } + $BLOCK1 = $oReport->sgetColumntoTotal($primarymodule,$secondarymodule); + $report_column_tot->assign("BLOCK1",$BLOCK1); +} +//added to avoid displaying "No data avaiable to total" when using related modules in report. +if(count($BLOCK1[0]) == 0 && count($BLOCK1[1])==0) + $report_column_tot->assign("ROWS_COUNT",0); +else + $report_column_tot->assign("ROWS_COUNT","-1"); + +$report_column_tot->display('ReportColumnsTotal.tpl'); +?> diff --git a/oss/vtiger/trunk/modules/Reports/ReportFilters.php b/oss/vtiger/trunk/modules/Reports/ReportFilters.php new file mode 100644 index 00000000..14feedc5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/ReportFilters.php @@ -0,0 +1,42 @@ +***************************/ + +require_once('Smarty_setup.php'); +require_once("data/Tracker.php"); +require_once('include/logging.php'); +require_once('include/utils/utils.php'); +require_once('modules/Reports/Reports.php'); + +global $app_strings; +global $app_list_strings; +global $mod_strings; +$current_module_strings = return_module_language($current_language, 'Reports'); +global $list_max_entries_per_page; +global $urlPrefix; + +$log = LoggerManager::getLogger('report_type'); +global $currentModule; +global $image_path; +global $theme; +global $current_user; + +$report_std_filter = new vtigerCRM_Smarty; +$report_std_filter->assign("MOD", $mod_strings); +$report_std_filter->assign("APP", $app_strings); +$report_std_filter->assign("IMAGE_PATH",$image_path); +$report_std_filter->assign("DATEFORMAT",$current_user->date_format); +$report_std_filter->assign("JS_DATEFORMAT",parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +include("modules/Reports/StandardFilter.php"); +include("modules/Reports/AdvancedFilter.php"); + +$report_std_filter->display('ReportFilters.tpl'); +?> diff --git a/oss/vtiger/trunk/modules/Reports/ReportGrouping.php b/oss/vtiger/trunk/modules/Reports/ReportGrouping.php new file mode 100644 index 00000000..6e2e8619 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/ReportGrouping.php @@ -0,0 +1,221 @@ +assign("MOD", $mod_strings); +$report_group->assign("APP", $app_strings); +$report_group->assign("IMAGE_PATH",$image_path); + +if(isset($_REQUEST["record"]) && $_REQUEST['record']!='') +{ + $reportid = vtlib_purify($_REQUEST["record"]); + $oReport = new Reports($reportid); + $list_array = $oReport->getSelctedSortingColumns($reportid); + + $oRep = new Reports(); + $secondarymodule = ''; + $secondarymodules =Array(); + + if(!empty($oRep->related_modules[$oReport->primodule])) { + foreach($oRep->related_modules[$oReport->primodule] as $key=>$value){ + if(isset($_REQUEST["secondarymodule_".$value]))$secondarymodules []= vtlib_purify($_REQUEST["secondarymodule_".$value]); + } + } + $secondarymodule = implode(":",$secondarymodules); + + if($secondarymodule!='') + $oReport->secmodule = $secondarymodule; + + $BLOCK1 = getPrimaryColumns_GroupingHTML($oReport->primodule,$list_array[0]); + $BLOCK1 .= getSecondaryColumns_GroupingHTML($oReport->secmodule,$list_array[0]); + $report_group->assign("BLOCK1",$BLOCK1); + + $BLOCK2 = getPrimaryColumns_GroupingHTML($oReport->primodule,$list_array[1]); + $BLOCK2 .= getSecondaryColumns_GroupingHTML($oReport->secmodule,$list_array[1]); + $report_group->assign("BLOCK2",$BLOCK2); + + $BLOCK3 = getPrimaryColumns_GroupingHTML($oReport->primodule,$list_array[2]); + $BLOCK3 .= getSecondaryColumns_GroupingHTML($oReport->secmodule,$list_array[2]); + $report_group->assign("BLOCK3",$BLOCK3); + + $sortorder = $oReport->ascdescorder; + +}else +{ + $primarymodule = vtlib_purify($_REQUEST["primarymodule"]); + $BLOCK1 = getPrimaryColumns_GroupingHTML($primarymodule); + $ogReport = new Reports(); + if(!empty($ogReport->related_modules[$primarymodule])) { + foreach($ogReport->related_modules[$primarymodule] as $key=>$value){ + $BLOCK1 .= getSecondaryColumns_GroupingHTML($_REQUEST["secondarymodule_".$value]); + } + } + $report_group->assign("BLOCK1",$BLOCK1); + $report_group->assign("BLOCK2",$BLOCK1); + $report_group->assign("BLOCK3",$BLOCK1); +} + + + /** Function to get the combo values for the Primary module Columns + * @ param $module(module name) :: Type String + * @ param $selected () :: Type String + * This function generates the combo values for the columns for the given module + * and return a HTML string + */ + +function getPrimaryColumns_GroupingHTML($module,$selected="") +{ + global $ogReport, $app_list_strings, $current_language; + $id_added=false; + $mod_strings = return_module_language($current_language,$module); + + $block_listed = array(); + $selected = decode_html($selected); + foreach($ogReport->module_list[$module] as $key=>$value) + { + if(isset($ogReport->pri_module_columnslist[$module][$value]) && !$block_listed[$value]) + { + $block_listed[$value] = true; + $shtml .= ""; + if($id_added==false){ + $is_selected =''; + if($selected == "vtiger_crmentity:crmid:".$module."_ID:crmid:I"){ + $is_selected = 'selected'; + } + $shtml .= ""; + $id_added=true; + } + foreach($ogReport->pri_module_columnslist[$module][$value] as $field=>$fieldlabel) + { + if(isset($mod_strings[$fieldlabel])) + { + if($selected == decode_html($field)) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + }else + { + if($selected == decode_html($field)) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + + } + } + } + } + return $shtml; +} + + /** Function to get the combo values for the Secondary module Columns + * @ param $module(module name) :: Type String + * @ param $selected () :: Type String + * This function generates the combo values for the columns for the given module + * and return a HTML string + */ +function getSecondaryColumns_GroupingHTML($module,$selected="") +{ + global $ogReport; + global $app_list_strings; + global $current_language; + + $selected = decode_html($selected); + if($module != "") + { + $secmodule = explode(":",$module); + for($i=0;$i < count($secmodule) ;$i++) + { + $mod_strings = return_module_language($current_language,$secmodule[$i]); + if(vtlib_isModuleActive($secmodule[$i])){ + $block_listed = array(); + foreach($ogReport->module_list[$secmodule[$i]] as $key=>$value) + { + if(isset($ogReport->sec_module_columnslist[$secmodule[$i]][$value]) && !$block_listed[$value]) { + $block_listed[$value] = true; + $shtml .= ""; + foreach($ogReport->sec_module_columnslist[$secmodule[$i]][$value] as $field=>$fieldlabel) + { + if(isset($mod_strings[$fieldlabel])) { + if($selected == decode_html($field)) { + $shtml .= ""; + } else { + $shtml .= ""; + } + } else { + if($selected == decode_html($field)) { + $shtml .= ""; + } else { + $shtml .= ""; + } + } + } + } + } + } + } + } + return $shtml; +} + +if($sortorder[0] != "Descending") +{ +$shtml = " + "; +}else +{ +$shtml = " + "; +} +$report_group->assign("ASCDESC1",$shtml); + +if($sortorder[1] != "Descending") +{ +$shtml = " + "; +}else +{ +$shtml = " + "; +} +$report_group->assign("ASCDESC2",$shtml); + +if($sortorder[2] != "Descending") +{ +$shtml = " + "; +}else +{ +$shtml = " + "; +} +$report_group->assign("ASCDESC3",$shtml); +$report_group->display("ReportGrouping.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Reports/ReportRun.php b/oss/vtiger/trunk/modules/Reports/ReportRun.php new file mode 100644 index 00000000..2341c7b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/ReportRun.php @@ -0,0 +1,2767 @@ +reportid = $reportid; + $this->primarymodule = $oReport->primodule; + $this->secondarymodule = $oReport->secmodule; + $this->reporttype = $oReport->reporttype; + $this->reportname = $oReport->reportname; + } + + /** Function to get the columns for the reportid + * This function accepts the $reportid + * This function returns $columnslist Array($tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname As Header value, + * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 As Header value, + * | + * $tablenamen:$columnnamen:$fieldlabeln:$fieldnamen:$typeofdatan=>$tablenamen.$columnnamen As Header value + * ) + * + */ + function getQueryColumnsList($reportid) + { + // Have we initialized information already? + if($this->_columnslist !== false) { + return $this->_columnslist; + } + + global $adb; + global $modules; + global $log,$current_user,$current_language; + $ssql = "select vtiger_selectcolumn.* from vtiger_report inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid"; + $ssql .= " left join vtiger_selectcolumn on vtiger_selectcolumn.queryid = vtiger_selectquery.queryid"; + $ssql .= " where vtiger_report.reportid = ?"; + $ssql .= " order by vtiger_selectcolumn.columnindex"; + $result = $adb->pquery($ssql, array($reportid)); + $permitted_fields = Array(); + + while($columnslistrow = $adb->fetch_array($result)) + { + $fieldname =""; + $fieldcolname = $columnslistrow["columnname"]; + list($tablename,$colname,$module_field,$fieldname,$single) = split(":",$fieldcolname); + list($module,$field) = split("_",$module_field); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + if(sizeof($permitted_fields) == 0 && $is_admin == false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1) + { + list($module,$field) = split("_",$module_field); + $permitted_fields = $this->getaccesfield($module); + } + $selectedfields = explode(":",$fieldcolname); + $querycolumns = $this->getEscapedColumns($selectedfields); + + $mod_strings = return_module_language($current_language,$module); + $fieldlabel = trim(str_replace($module," ",$selectedfields[2])); + $mod_arr=explode('_',$fieldlabel); + $mod = ($mod_arr[0] == '')?$module:$mod_arr[0]; + $fieldlabel = trim(str_replace("_"," ",$fieldlabel)); + //modified code to support i18n issue + $fld_arr = explode(" ",$fieldlabel); + $mod_lbl = getTranslatedString($fld_arr[0],$module); //module + array_shift($fld_arr); + $fld_lbl_str = implode(" ",$fld_arr); + $fld_lbl = getTranslatedString($fld_lbl_str,$module); //fieldlabel + $fieldlabel = $mod_lbl." ".$fld_lbl; + if(CheckFieldPermission($fieldname,$mod) != 'true' && $colname!="crmid") + { + continue; + } + else + { + $header_label = $selectedfields[2]; // Header label to be displayed in the reports table + // To check if the field in the report is a custom field + // and if yes, get the label of this custom field freshly from the vtiger_field as it would have been changed. + // Asha - Reference ticket : #4906 + + if($querycolumns == "") + { + if($selectedfields[4] == 'C') + { + $field_label_data = split("_",$selectedfields[2]); + $module= $field_label_data[0]; + if($module!=$this->primarymodule) + $columnslist[$fieldcolname] = "case when (".$selectedfields[0].".".$selectedfields[1]."='1')then 'yes' else case when (vtiger_crmentity$module.crmid !='') then 'no' else '-' end end as '$selectedfields[2]'"; + else + $columnslist[$fieldcolname] = "case when (".$selectedfields[0].".".$selectedfields[1]."='1')then 'yes' else case when (vtiger_crmentity.crmid !='') then 'no' else '-' end end as '$selectedfields[2]'"; + } + elseif($selectedfields[0] == 'vtiger_activity' && $selectedfields[1] == 'status') + { + $columnslist[$fieldcolname] = " case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end as Calendar_Status"; + } + elseif($selectedfields[0] == 'vtiger_activity' && $selectedfields[1] == 'date_start') + { + $columnslist[$fieldcolname] = "concat(vtiger_activity.date_start,' ',vtiger_activity.time_start) as Calendar_Start_Date_and_Time"; + } + elseif(stristr($selectedfields[0],"vtiger_users") && ($selectedfields[1] == 'user_name') && $module_field != 'Products_Handler' && $module_field!='Services_Owner') + { + $temp_module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]); + if($module!=$this->primarymodule){ + $condition = "and vtiger_crmentity".$module.".crmid!=''"; + } else { + $condition = "and vtiger_crmentity.crmid!=''"; + } + if($temp_module_from_tablename == $module) + $columnslist[$fieldcolname] = " case when (".$selectedfields[0].".user_name not like '' $condition) then ".$selectedfields[0].".user_name else vtiger_groups".$module.".groupname end as ".$module."_Assigned_To"; + else//Some Fields can't assigned to groups so case avoided (fields like inventory manager) + $columnslist[$fieldcolname] = $selectedfields[0].".user_name as '".$header_label."'"; + + } + elseif(stristr($selectedfields[0],"vtiger_users") && ($selectedfields[1] == 'user_name') && $module_field == 'Products_Handler')//Products cannot be assiged to group only to handler so group is not included + { + $columnslist[$fieldcolname] = $selectedfields[0].".user_name as ".$module."_Handler"; + } + elseif($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) + { + $columnslist[$fieldcolname] = "vtiger_crmentity.".$selectedfields[1]." AS '".$header_label."'"; + } + elseif($selectedfields[0] == 'vtiger_invoice' && $selectedfields[1] == 'salesorderid')//handled for salesorder fields in Invoice Module Reports + { + $columnslist[$fieldcolname] = 'vtiger_salesorderInvoice.subject AS "'.$selectedfields[2].'"'; + } + elseif($selectedfields[0] == 'vtiger_campaign' && $selectedfields[1] == 'product_id')//handled for product fields in Campaigns Module Reports + { + $columnslist[$fieldcolname] = 'vtiger_productsCampaigns.productname AS "'.$header_label.'"'; + } + elseif($selectedfields[0] == 'vtiger_products' && $selectedfields[1] == 'unit_price')//handled for product fields in Campaigns Module Reports + { + $columnslist[$fieldcolname] = 'concat('.$selectedfields[0].'.currency_id,"::",innerProduct.actual_unit_price) as "' . $header_label .'"'; + } + elseif(in_array($selectedfields[2], $this->append_currency_symbol_to_value)) { + $columnslist[$fieldcolname] = 'concat('.$selectedfields[0].'.currency_id,"::",'.$selectedfields[0].'.'.$selectedfields[1].') as "' . $header_label .'"'; + } + elseif($selectedfields[0] == 'vtiger_notes' && ($selectedfields[1] == 'filelocationtype' || $selectedfields[1] == 'filesize' || $selectedfields[1] == 'folderid' || $selectedfields[1]=='filestatus'))//handled for product fields in Campaigns Module Reports + { + if($selectedfields[1] == 'filelocationtype'){ + $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when 'I' then 'Internal' when 'E' then 'External' else '-' end as '$selectedfields[2]'"; + } else if($selectedfields[1] == 'folderid'){ + $columnslist[$fieldcolname] = "vtiger_attachmentsfolder.foldername as '$selectedfields[2]'"; + } elseif($selectedfields[1] == 'filestatus'){ + $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when '1' then 'yes' when '0' then 'no' else '-' end as '$selectedfields[2]'"; + } elseif($selectedfields[1] == 'filesize'){ + $columnslist[$fieldcolname] = "case ".$selectedfields[0].".".$selectedfields[1]." when '' then '-'else concat(".$selectedfields[0].".".$selectedfields[1]."/1024,' ','KB') end as '$selectedfields[2]'"; + } + }elseif(stristr($selectedfields[1],'cf_')==true && stripos($selectedfields[1],'cf_')==0) + { + $columnslist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1].' AS "'.$adb->sql_escape_string(decode_html($header_label)).'"'; + } + else + { + $columnslist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1].' AS "'.$header_label.'"'; + } + } + else + { + $columnslist[$fieldcolname] = $querycolumns; + } + } + } + // Save the information + $this->_columnslist = $columnslist; + + $log->info("ReportRun :: Successfully returned getQueryColumnsList".$reportid); + return $columnslist; + } + + /** Function to get field columns based on profile + * @ param $module : Type string + * returns permitted fields in array format + */ + function getaccesfield($module) + { + global $current_user; + global $adb; + $access_fields = Array(); + + $profileList = getCurrentUserProfileList(); + $query = "select vtiger_field.fieldname from vtiger_field inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid where"; + $params = array(); + if($module == "Calendar") + { + if (count($profileList) > 0) { + $query .= " vtiger_field.tabid in (9,16) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .") group by vtiger_field.fieldid order by block,sequence"; + array_push($params, $profileList); + } else { + $query .= " vtiger_field.tabid in (9,16) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 group by vtiger_field.fieldid order by block,sequence"; + } + } + else + { + array_push($params, $this->primarymodule, $this->secondarymodule); + if (count($profileList) > 0) { + $query .= " vtiger_field.tabid in (select tabid from vtiger_tab where vtiger_tab.name in (?,?)) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .") group by vtiger_field.fieldid order by block,sequence"; + array_push($params, $profileList); + } else { + $query .= " vtiger_field.tabid in (select tabid from vtiger_tab where vtiger_tab.name in (?,?)) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 group by vtiger_field.fieldid order by block,sequence"; + } + } + $result = $adb->pquery($query, $params); + + while($collistrow = $adb->fetch_array($result)) + { + $access_fields[] = $collistrow["fieldname"]; + } + //added to include ticketid for Reports module in select columnlist for all users + if($module == "HelpDesk") + $access_fields[] = "ticketid"; + return $access_fields; + } + + /** Function to get Escapedcolumns for the field in case of multiple parents + * @ param $selectedfields : Type Array + * returns the case query for the escaped columns + */ + function getEscapedColumns($selectedfields) + { + global $current_user,$adb; + $fieldname = $selectedfields[3]; + $tmp = split("_",$selectedfields[2]); + $module = $tmp[0]; + + if($fieldname == "parent_id" && ($module == "HelpDesk" || $module == "Calendar")) + { + if($module == "HelpDesk" && $selectedfields[0] == "vtiger_crmentityRelHelpDesk") + { + $querycolumn = "case vtiger_crmentityRelHelpDesk.setype when 'Accounts' then vtiger_accountRelHelpDesk.accountname when 'Contacts' then concat(vtiger_contactdetailsRelHelpDesk.lastname,' ',vtiger_contactdetailsRelHelpDesk.firstname) End"." '".$selectedfields[2]."', vtiger_crmentityRelHelpDesk.setype 'Entity_type'"; + return $querycolumn; + } + if($module == "Calendar") { + $querycolumn = "case vtiger_crmentityRelCalendar.setype when 'Accounts' then vtiger_accountRelCalendar.accountname when 'Leads' then concat(vtiger_leaddetailsRelCalendar.lastname,' ',vtiger_leaddetailsRelCalendar.firstname) when 'Potentials' then vtiger_potentialRelCalendar.potentialname when 'Quotes' then vtiger_quotesRelCalendar.subject when 'PurchaseOrder' then vtiger_purchaseorderRelCalendar.subject when 'Invoice' then vtiger_invoiceRelCalendar.subject when 'SalesOrder' then vtiger_salesorderRelCalendar.subject when 'HelpDesk' then vtiger_troubleticketsRelCalendar.title when 'Campaigns' then vtiger_campaignRelCalendar.campaignname End"." '".$selectedfields[2]."', vtiger_crmentityRelCalendar.setype 'Entity_type'"; + } + } elseif($fieldname == "contact_id" && strpos($selectedfields[2],"Contact_Name")) { + if(($this->primarymodule == 'PurchaseOrder' || $this->primarymodule == 'SalesOrder' || $this->primarymodule == 'Quotes' || $this->primarymodule == 'Invoice' || $this->primarymodule == 'Calendar') && $module==$this->primarymodule) { + if (getFieldVisibilityPermission("Contacts", $current_user->id, "firstname") == '0') + $querycolumn = " case when vtiger_crmentity.crmid!='' then concat(vtiger_contactdetails".$this->primarymodule.".lastname,' ',vtiger_contactdetails".$this->primarymodule.".firstname) else '-' end as ".$selectedfields[2]; + else + $querycolumn = " case when vtiger_crmentity.crmid!='' then vtiger_contactdetails".$this->primarymodule.".lastname else '-' end as ".$selectedfields[2]; + } + if(stristr($this->secondarymodule,$module) && ($module== 'Quotes' || $module== 'SalesOrder' || $module== 'PurchaseOrder' ||$module== 'Calendar' || $module == 'Invoice')) { + if (getFieldVisibilityPermission("Contacts", $current_user->id, "firstname") == '0') + $querycolumn = " case when vtiger_crmentity".$module.".crmid!='' then concat(vtiger_contactdetails".$module.".lastname,' ',vtiger_contactdetails".$module.".firstname) else '-' end as ".$selectedfields[2]; + else + $querycolumn = " case when vtiger_crmentity".$module.".crmid!='' then vtiger_contactdetails".$module.".lastname else '-' end as ".$selectedfields[2]; + } + } + else{ + if(stristr($selectedfields[0],"vtiger_crmentityRel")){ + $module = str_replace("vtiger_crmentityRel","",$selectedfields[0]); + $fields_query = $adb->pquery("SELECT vtiger_field.fieldname,vtiger_field.tablename,vtiger_field.fieldid from vtiger_field INNER JOIN vtiger_tab on vtiger_tab.name = ? WHERE vtiger_tab.tabid=vtiger_field.tabid and vtiger_field.fieldname=?",array($module,$selectedfields[3])); + + if($adb->num_rows($fields_query)>0){ + for($i=0;$i<$adb->num_rows($fields_query);$i++){ + $field_name = $selectedfields[3]; + $field_id = $adb->query_result($fields_query,$i,'fieldid'); + $tab_name = $selectedfields[1]; + $ui10_modules_query = $adb->pquery("SELECT relmodule FROM vtiger_fieldmodulerel WHERE fieldid=?",array($field_id)); + + if($adb->num_rows($ui10_modules_query)>0){ + $querycolumn = " case vtiger_crmentityRel$module.setype"; + for($j=0;$j<$adb->num_rows($ui10_modules_query);$j++){ + $rel_mod = $adb->query_result($ui10_modules_query,$j,'relmodule'); + $rel_obj = CRMEntity::getInstance($rel_mod); + vtlib_setup_modulevars($rel_mod, $rel_obj); + + $rel_tab_name = $rel_obj->table_name; + $link_field = $rel_tab_name."Rel".$module.".".$rel_obj->list_link_field; + + if($rel_mod=="Contacts" || $rel_mod=="Leads"){ + if(getFieldVisibilityPermission($rel_mod,$current_user->id,'firstname')==0){ + $link_field = "concat($link_field,' ',".$rel_tab_name."Rel$module.firstname)"; + } + } + $querycolumn.= " when '$rel_mod' then $link_field "; + } + $querycolumn .= "end as '".$selectedfields[2]."', vtiger_crmentityRel$module.setype as 'Entity_type'" ; + } + } + } + + } + } + return $querycolumn; + } + + /** Function to get selectedcolumns for the given reportid + * @ param $reportid : Type Integer + * returns the query of columnlist for the selected columns + */ + function getSelectedColumnsList($reportid) + { + + global $adb; + global $modules; + global $log; + + $ssql = "select vtiger_selectcolumn.* from vtiger_report inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid"; + $ssql .= " left join vtiger_selectcolumn on vtiger_selectcolumn.queryid = vtiger_selectquery.queryid where vtiger_report.reportid = ? "; + $ssql .= " order by vtiger_selectcolumn.columnindex"; + + $result = $adb->pquery($ssql, array($reportid)); + $noofrows = $adb->num_rows($result); + + if ($this->orderbylistsql != "") + { + $sSQL .= $this->orderbylistsql.", "; + } + + for($i=0; $i<$noofrows; $i++) + { + $fieldcolname = $adb->query_result($result,$i,"columnname"); + $ordercolumnsequal = true; + if($fieldcolname != "") + { + for($j=0;$jorderbylistcolumns);$j++) + { + if($this->orderbylistcolumns[$j] == $fieldcolname) + { + $ordercolumnsequal = false; + break; + }else + { + $ordercolumnsequal = true; + } + } + if($ordercolumnsequal) + { + $selectedfields = explode(":",$fieldcolname); + if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) + $selectedfields[0] = "vtiger_crmentity"; + $sSQLList[] = $selectedfields[0].".".$selectedfields[1]." '".$selectedfields[2]."'"; + } + } + } + $sSQL .= implode(",",$sSQLList); + + $log->info("ReportRun :: Successfully returned getSelectedColumnsList".$reportid); + return $sSQL; + } + + /** Function to get advanced comparator in query form for the given Comparator and value + * @ param $comparator : Type String + * @ param $value : Type String + * returns the check query for the comparator + */ + function getAdvComparator($comparator,$value,$datatype="") + { + + global $log,$adb,$default_charset,$ogReport; + $value=html_entity_decode(trim($value),ENT_QUOTES,$default_charset); + $value_len = strlen($value); + $is_field = false; + if($value[0]=='$' && $value[$value_len-1]=='$'){ + $temp = str_replace('$','',$value); + $is_field = true; + } + if($datatype=='C'){ + $value = str_replace("yes","1",str_replace("no","0",$value)); + } + + if($is_field==true){ + $value = $this->getFilterComparedField($temp); + } + if($comparator == "e") + { + if(trim($value) == "NULL") + { + $rtvalue = " is NULL"; + }elseif(trim($value) != "") + { + $rtvalue = " = ".$adb->quote($value); + }elseif(trim($value) == "" && $datatype == "V") + { + $rtvalue = " = ".$adb->quote($value); + }else + { + $rtvalue = " is NULL"; + } + } + if($comparator == "n") + { + if(trim($value) == "NULL") + { + $rtvalue = " is NOT NULL"; + }elseif(trim($value) != "") + { + $rtvalue = " <> ".$adb->quote($value); + }elseif(trim($value) == "" && $datatype == "V") + { + $rtvalue = " <> ".$adb->quote($value); + }else + { + $rtvalue = " is NOT NULL"; + } + } + if($comparator == "s") + { + $rtvalue = " like '". formatForSqlLike($value, 2,$is_field) ."'"; + } + if($comparator == "ew") + { + $rtvalue = " like '". formatForSqlLike($value, 1,$is_field) ."'"; + } + if($comparator == "c") + { + $rtvalue = " like '". formatForSqlLike($value,0,$is_field) ."'"; + } + if($comparator == "k") + { + $rtvalue = " not like '". formatForSqlLike($value,0,$is_field) ."'"; + } + if($comparator == "l") + { + $rtvalue = " < ".$adb->quote($value); + } + if($comparator == "g") + { + $rtvalue = " > ".$adb->quote($value); + } + if($comparator == "m") + { + $rtvalue = " <= ".$adb->quote($value); + } + if($comparator == "h") + { + $rtvalue = " >= ".$adb->quote($value); + } + if($is_field==true){ + $rtvalue = str_replace("'","",$rtvalue); + $rtvalue = str_replace("\\","",$rtvalue); + } + $log->info("ReportRun :: Successfully returned getAdvComparator"); + return $rtvalue; + } + + /** Function to get field that is to be compared in query form for the given Comparator and field + * @ param $field : field + * returns the value for the comparator + */ + function getFilterComparedField($field){ + global $adb,$ogReport; + $field = split('#',$field); + $module = $field[0]; + $fieldname = trim($field[1]); + $tabid = getTabId($module); + $field_query = $adb->pquery("SELECT tablename,columnname,typeofdata,fieldname,uitype FROM vtiger_field WHERE tabid = ? AND fieldname= ?",array($tabid,$fieldname)); + $fieldtablename = $adb->query_result($field_query,0,'tablename'); + $fieldcolname = $adb->query_result($field_query,0,'columnname'); + $typeofdata = $adb->query_result($field_query,0,'typeofdata'); + $fieldtypeofdata=ChangeTypeOfData_Filter($fieldtablename,$fieldcolname,$typeofdata[0]); + $uitype = $adb->query_result($field_query,0,'uitype'); + /*if($tr[0]==$ogReport->primodule) + $value = $adb->query_result($field_query,0,'tablename').".".$adb->query_result($field_query,0,'columnname'); + else + $value = $adb->query_result($field_query,0,'tablename').$tr[0].".".$adb->query_result($field_query,0,'columnname'); + */ + if($uitype == 68 || $uitype == 59) + { + $fieldtypeofdata = 'V'; + } + if($fieldtablename == "vtiger_crmentity") + { + $fieldtablename = $fieldtablename.$module; + } + if($fieldname == "assigned_user_id") + { + $fieldtablename = "vtiger_users".$module; + $fieldcolname = "user_name"; + } + if($fieldname == "account_id") + { + $fieldtablename = "vtiger_account".$module; + $fieldcolname = "accountname"; + } + if($fieldname == "contact_id") + { + $fieldtablename = "vtiger_contactdetails".$module; + $fieldcolname = "lastname"; + } + if($fieldname == "parent_id") + { + $fieldtablename = "vtiger_crmentityRel".$module; + $fieldcolname = "setype"; + } + if($fieldname == "vendor_id") + { + $fieldtablename = "vtiger_vendorRel".$module; + $fieldcolname = "vendorname"; + } + if($fieldname == "potential_id") + { + $fieldtablename = "vtiger_potentialRel".$module; + $fieldcolname = "potentialname"; + } + if($fieldname == "assigned_user_id1") + { + $fieldtablename = "vtiger_usersRel1"; + $fieldcolname = "user_name"; + } + if($fieldname == 'quote_id') + { + $fieldtablename = "vtiger_quotes".$module; + $fieldcolname = "subject"; + } + if($fieldname == 'product_id' && $fieldtablename == 'vtiger_troubletickets') + { + $fieldtablename = "vtiger_productsRel"; + $fieldcolname = "productname"; + } + if($fieldname == 'product_id' && $fieldtablename == 'vtiger_campaign') + { + $fieldtablename = "vtiger_productsCampaigns"; + $fieldcolname = "productname"; + } + if($fieldname == 'product_id' && $fieldtablename == 'vtiger_products') + { + $fieldtablename = "vtiger_productsProducts"; + $fieldcolname = "productname"; + } + if($fieldname == 'campaignid' && $module=='Potentials') + { + $fieldtablename = "vtiger_campaign".$module; + $fieldcolname = "campaignname"; + } + $value = $fieldtablename.".".$fieldcolname; + return $value; + } + /** Function to get the advanced filter columns for the reportid + * This function accepts the $reportid + * This function returns $columnslist Array($columnname => $tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname filtercriteria, + * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 filtercriteria, + * | + * $tablenamen:$columnnamen:$fieldlabeln:$fieldnamen:$typeofdatan=>$tablenamen.$columnnamen filtercriteria + * ) + * + */ + + + function getAdvFilterList($reportid) + { + // Have we initialized information already? + if($this->_advfilterlist !== false) { + return $this->_advfilterlist; + } + + global $adb; + global $modules; + global $log; + + $advfiltersql = "select vtiger_relcriteria.* from vtiger_report"; + $advfiltersql .= " inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid"; + $advfiltersql .= " left join vtiger_relcriteria on vtiger_relcriteria.queryid = vtiger_selectquery.queryid"; + $advfiltersql .= " where vtiger_report.reportid =?"; + $advfiltersql .= " order by vtiger_relcriteria.columnindex"; + + $result = $adb->pquery($advfiltersql, array($reportid)); + while($advfilterrow = $adb->fetch_array($result)) + { + $fieldcolname = $advfilterrow["columnname"]; + $comparator = $advfilterrow["comparator"]; + $value = $advfilterrow["value"]; + if($fieldcolname != "" && $comparator != "") + { + $selectedfields = explode(":",$fieldcolname); + //Added to handle yes or no for checkbox field in reports advance filters. -shahul + if($selectedfields[4] == 'C') + { + if(strcasecmp(trim($value),"yes")==0) + $value="1"; + if(strcasecmp(trim($value),"no")==0) + $value="0"; + } + $valuearray = explode(",",trim($value)); + $datatype = (isset($selectedfields[4])) ? $selectedfields[4] : ""; + if(isset($valuearray) && count($valuearray) > 1) + { + $advorsql = ""; + for($n=0;$ngetAdvComparator($comparator,trim($valuearray[$n]),$datatype); + } + elseif($selectedfields[0] == 'vtiger_crmentityRelCalendar' && $selectedfields[1]=='setype') + { + $advorsql[] = "(case vtiger_crmentityRelHelpDesk.setype when 'Accounts' then vtiger_accountRelHelpDesk.accountname else concat(vtiger_contactdetailsRelHelpDesk.lastname,' ',vtiger_contactdetailsRelHelpDesk.firstname) end) ". $this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype); + } + elseif(($selectedfields[0] == "vtiger_users".$this->primarymodule || $selectedfields[0] == "vtiger_users".$this->secondarymodule) && $selectedfields[1] == 'user_name') + { + $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]); + if($this->primarymodule == 'Products') + { + $advorsql[] = ($selectedfields[0].".user_name ".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype)); + }else + { + $advorsql[] = " ".$selectedfields[0].".user_name".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype)." or vtiger_groups".$module_from_tablename.".groupname ".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype); + } + } + elseif($selectedfields[1] == 'status')//when you use comma seperated values. + { + if($selectedfields[2] == 'Calendar_Status') + $advorsql[] = "(case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end)".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype); + elseif($selectedfields[2] == 'HelpDesk_Status') + $advorsql[] = "vtiger_troubletickets.status".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype); + } + elseif($selectedfields[1] == 'description')//when you use comma seperated values. + { + if($selectedfields[0]=='vtiger_crmentity'.$this->primarymodule) + $advorsql[] = "vtiger_crmentity.description".$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype); + else + $advorsql[] = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype); + }else + { + $advorsql[] = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($valuearray[$n]),$datatype); + } + } + //If negative logic filter ('not equal to', 'does not contain') is used, 'and' condition should be applied instead of 'or' + if($comparator == 'n' || $comparator == 'k') + $advorsqls = implode(" and ",$advorsql); + else + $advorsqls = implode(" or ",$advorsql); + $fieldvalue = " (".$advorsqls.") "; + } + + elseif(($selectedfields[0] == "vtiger_users".$this->primarymodule || $selectedfields[0] == "vtiger_users".$this->secondarymodule) && $selectedfields[1] == 'user_name') + { + $module_from_tablename = str_replace("vtiger_users","",$selectedfields[0]); + if($this->primarymodule == 'Products') + { + $fieldvalue = ($selectedfields[0].".user_name ".$this->getAdvComparator($comparator,trim($value),$datatype)); + }else + { + $fieldvalue = " case when (".$selectedfields[0].".user_name not like '') then ".$selectedfields[0].".user_name else vtiger_groups".$module_from_tablename.".groupname end ".$this->getAdvComparator($comparator,trim($value),$datatype); + } + } + elseif($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) + { + $fieldvalue = "vtiger_crmentity.".$selectedfields[1]." ".$this->getAdvComparator($comparator,trim($value),$datatype); + } + elseif($selectedfields[0] == 'vtiger_crmentityRelHelpDesk' && $selectedfields[1]=='setype') + { + $fieldvalue = "(vtiger_accountRelHelpDesk.accountname ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_contactdetailsRelHelpDesk.lastname ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_contactdetailsRelHelpDesk.firstname ".$this->getAdvComparator($comparator,trim($value),$datatype).")"; + + } + elseif($selectedfields[0] == 'vtiger_crmentityRelCalendar' && $selectedfields[1]=='setype') + { + $fieldvalue = "(vtiger_accountRelCalendar.accountname ".$this->getAdvComparator($comparator,trim($value),$datatype)." or concat(vtiger_leaddetailsRelCalendar.lastname,' ',vtiger_leaddetailsRelCalendar.firstname) ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_potentialRelCalendar.potentialname ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_invoiceRelCalendar.subject ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_quotesRelCalendar.subject ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_purchaseorderRelCalendar.subject ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_salesorderRelCalendar.subject ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_troubleticketsRelCalendar.title ".$this->getAdvComparator($comparator,trim($value),$datatype)." or vtiger_campaignRelCalendar.campaignname ".$this->getAdvComparator($comparator,trim($value),$datatype).")"; + } + // fix for the ticket#4016 -- when you use only one value in its field. + elseif($selectedfields[0] == "vtiger_activity" && $selectedfields[1] == 'status') + { + $fieldvalue = "(case when (vtiger_activity.status not like '') then vtiger_activity.status else vtiger_activity.eventstatus end)".$this->getAdvComparator($comparator,trim($value),$datatype); + } + //end fix + elseif($selectedfields[3] == "contact_id" && strpos($selectedfields[2],"Contact_Name")) + { + if($this->primarymodule == 'PurchaseOrder' || $this->primarymodule == 'SalesOrder' || $this->primarymodule == 'Quotes' || $this->primarymodule == 'Invoice' || $this->primarymodule == 'Calendar') + $fieldvalue = "concat(vtiger_contactdetails". $this->primarymodule .".lastname,' ',vtiger_contactdetails". $this->primarymodule .".firstname)".$this->getAdvComparator($comparator,trim($value),$datatype); + if($this->secondarymodule == 'Quotes' || $this->secondarymodule == 'Invoice') + $fieldvalue = "concat(vtiger_contactdetails". $this->secondarymodule .".lastname,' ',vtiger_contactdetails". $this->secondarymodule .".firstname)".$this->getAdvComparator($comparator,trim($value),$datatype); + } elseif($comparator == 'e' && (trim($value) == "NULL" || trim($value) == '')) { + $fieldvalue = "(".$selectedfields[0].".".$selectedfields[1]." IS NULL OR ".$selectedfields[0].".".$selectedfields[1]." = '')"; + } else { + $fieldvalue = $selectedfields[0].".".$selectedfields[1].$this->getAdvComparator($comparator,trim($value),$datatype); + } + if(isset($advfilterlist[$fieldcolname])) + $advfilterlist[$fieldcolname] = $advfilterlist[$fieldcolname].' and '.$fieldvalue; + else $advfilterlist[$fieldcolname] = $fieldvalue; + } + + } + // Save the information + $this->_advfilterlist = $advfilterlist; + + $log->info("ReportRun :: Successfully returned getAdvFilterList".$reportid); + return $advfilterlist; + } + + /** Function to get the Standard filter columns for the reportid + * This function accepts the $reportid datatype Integer + * This function returns $stdfilterlist Array($columnname => $tablename:$columnname:$fieldlabel:$fieldname:$typeofdata=>$tablename.$columnname filtercriteria, + * $tablename1:$columnname1:$fieldlabel1:$fieldname1:$typeofdata1=>$tablename1.$columnname1 filtercriteria, + * ) + * + */ + function getStdFilterList($reportid) + { + // Have we initialized information already? + if($this->_stdfilterlist !== false) { + return $this->_stdfilterlist; + } + + global $adb; + global $modules; + global $log; + + $stdfiltersql = "select vtiger_reportdatefilter.* from vtiger_report"; + $stdfiltersql .= " inner join vtiger_reportdatefilter on vtiger_report.reportid = vtiger_reportdatefilter.datefilterid"; + $stdfiltersql .= " where vtiger_report.reportid = ?"; + + $result = $adb->pquery($stdfiltersql, array($reportid)); + $stdfilterrow = $adb->fetch_array($result); + if(isset($stdfilterrow)) + { + $fieldcolname = $stdfilterrow["datecolumnname"]; + $datefilter = $stdfilterrow["datefilter"]; + $startdate = $stdfilterrow["startdate"]; + $enddate = $stdfilterrow["enddate"]; + + if($fieldcolname != "none") + { + $selectedfields = explode(":",$fieldcolname); + if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) + $selectedfields[0] = "vtiger_crmentity"; + if($datefilter == "custom") + { + if($startdate != "0000-00-00" && $enddate != "0000-00-00" && $selectedfields[0] != "" && $selectedfields[1] != "") + { + $stdfilterlist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." between '".$startdate." 00:00:00' and '".$enddate." 23:59:59'"; + } + }else + { + $startenddate = $this->getStandarFiltersStartAndEndDate($datefilter); + if($startenddate[0] != "" && $startenddate[1] != "" && $selectedfields[0] != "" && $selectedfields[1] != "") + { + $stdfilterlist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." between '".$startenddate[0]." 00:00:00' and '".$startenddate[1]." 23:59:59'"; + } + } + + } + } + // Save the information + $this->_stdfilterlist = $stdfilterlist; + + $log->info("ReportRun :: Successfully returned getStdFilterList".$reportid); + return $stdfilterlist; + } + + /** Function to get the RunTime filter columns for the given $filtercolumn,$filter,$startdate,$enddate + * @ param $filtercolumn : Type String + * @ param $filter : Type String + * @ param $startdate: Type String + * @ param $enddate : Type String + * This function returns $stdfilterlist Array($columnname => $tablename:$columnname:$fieldlabel=>$tablename.$columnname 'between' $startdate 'and' $enddate) + * + */ + function RunTimeFilter($filtercolumn,$filter,$startdate,$enddate) + { + if($filtercolumn != "none") + { + $selectedfields = explode(":",$filtercolumn); + if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) + $selectedfields[0] = "vtiger_crmentity"; + if($filter == "custom") + { + if($startdate != "" && $enddate != "" && $selectedfields[0] != "" && $selectedfields[1] != "") + { + $stdfilterlist[$filtercolumn] = $selectedfields[0].".".$selectedfields[1]." between '".$startdate." 00:00:00' and '".$enddate." 23:59:00'"; + } + }else + { + if($startdate != "" && $enddate != "") + { + $startenddate = $this->getStandarFiltersStartAndEndDate($filter); + if($startenddate[0] != "" && $startenddate[1] != "" && $selectedfields[0] != "" && $selectedfields[1] != "") + { + $stdfilterlist[$filtercolumn] = $selectedfields[0].".".$selectedfields[1]." between '".$startenddate[0]." 00:00:00' and '".$startenddate[1]." 23:59:00'"; + } + } + } + + } + return $stdfilterlist; + + } + + /** Function to get standardfilter for the given reportid + * @ param $reportid : Type Integer + * returns the query of columnlist for the selected columns + */ + + function getStandardCriterialSql($reportid) + { + global $adb; + global $modules; + global $log; + + $sreportstdfiltersql = "select vtiger_reportdatefilter.* from vtiger_report"; + $sreportstdfiltersql .= " inner join vtiger_reportdatefilter on vtiger_report.reportid = vtiger_reportdatefilter.datefilterid"; + $sreportstdfiltersql .= " where vtiger_report.reportid = ?"; + + $result = $adb->pquery($sreportstdfiltersql, array($reportid)); + $noofrows = $adb->num_rows($result); + + for($i=0; $i<$noofrows; $i++) + { + $fieldcolname = $adb->query_result($result,$i,"datecolumnname"); + $datefilter = $adb->query_result($result,$i,"datefilter"); + $startdate = $adb->query_result($result,$i,"startdate"); + $enddate = $adb->query_result($result,$i,"enddate"); + + if($fieldcolname != "none") + { + $selectedfields = explode(":",$fieldcolname); + if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) + $selectedfields[0] = "vtiger_crmentity"; + if($datefilter == "custom") + { + if($startdate != "0000-00-00" && $enddate != "0000-00-00" && $selectedfields[0] != "" && $selectedfields[1] != "") + { + $sSQL .= $selectedfields[0].".".$selectedfields[1]." between '".$startdate."' and '".$enddate."'"; + } + }else + { + $startenddate = $this->getStandarFiltersStartAndEndDate($datefilter); + if($startenddate[0] != "" && $startenddate[1] != "" && $selectedfields[0] != "" && $selectedfields[1] != "") + { + $sSQL .= $selectedfields[0].".".$selectedfields[1]." between '".$startenddate[0]."' and '".$startenddate[1]."'"; + } + } + } + } + $log->info("ReportRun :: Successfully returned getStandardCriterialSql".$reportid); + return $sSQL; + } + + /** Function to get standardfilter startdate and enddate for the given type + * @ param $type : Type String + * returns the $datevalue Array in the given format + * $datevalue = Array(0=>$startdate,1=>$enddate) + */ + + + function getStandarFiltersStartAndEndDate($type) + { + $today = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d"), date("Y"))); + $tomorrow = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+1, date("Y"))); + $yesterday = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-1, date("Y"))); + + $currentmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m"), "01", date("Y"))); + $currentmonth1 = date("Y-m-t"); + $lastmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")-1, "01", date("Y"))); + $lastmonth1 = date("Y-m-t", strtotime("-1 Month")); + $nextmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")+1, "01", date("Y"))); + $nextmonth1 = date("Y-m-t", strtotime("+1 Month")); + + $lastweek0 = date("Y-m-d",strtotime("-2 week Sunday")); + $lastweek1 = date("Y-m-d",strtotime("-1 week Saturday")); + + $thisweek0 = date("Y-m-d",strtotime("-1 week Sunday")); + $thisweek1 = date("Y-m-d",strtotime("this Saturday")); + + $nextweek0 = date("Y-m-d",strtotime("this Sunday")); + $nextweek1 = date("Y-m-d",strtotime("+1 week Saturday")); + + $next7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+6, date("Y"))); + $next30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+29, date("Y"))); + $next60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+59, date("Y"))); + $next90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+89, date("Y"))); + $next120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+119, date("Y"))); + + $last7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-6, date("Y"))); + $last30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-29, date("Y"))); + $last60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-59, date("Y"))); + $last90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-89, date("Y"))); + $last120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-119, date("Y"))); + + $currentFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y"))); + $currentFY1 = date("Y-m-t",mktime(0, 0, 0, "12", date("d"), date("Y"))); + $lastFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")-1)); + $lastFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")-1)); + $nextFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")+1)); + $nextFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")+1)); + + if(date("m") <= 3) + { + $cFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y"))); + $nFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y"))); + $pFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y")-1)); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")-1)); + }else if(date("m") > 3 and date("m") <= 6) + { + $pFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y"))); + $nFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y"))); + + }else if(date("m") > 6 and date("m") <= 9) + { + $nFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y"))); + $pFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y"))); + } + else if(date("m") > 9 and date("m") <= 12) + { + $nFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")+1)); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y")+1)); + $pFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y"))); + + } + + if($type == "today" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $today; + } + elseif($type == "yesterday" ) + { + + $datevalue[0] = $yesterday; + $datevalue[1] = $yesterday; + } + elseif($type == "tomorrow" ) + { + + $datevalue[0] = $tomorrow; + $datevalue[1] = $tomorrow; + } + elseif($type == "thisweek" ) + { + + $datevalue[0] = $thisweek0; + $datevalue[1] = $thisweek1; + } + elseif($type == "lastweek" ) + { + + $datevalue[0] = $lastweek0; + $datevalue[1] = $lastweek1; + } + elseif($type == "nextweek" ) + { + + $datevalue[0] = $nextweek0; + $datevalue[1] = $nextweek1; + } + elseif($type == "thismonth" ) + { + + $datevalue[0] =$currentmonth0; + $datevalue[1] = $currentmonth1; + } + + elseif($type == "lastmonth" ) + { + + $datevalue[0] = $lastmonth0; + $datevalue[1] = $lastmonth1; + } + elseif($type == "nextmonth" ) + { + + $datevalue[0] = $nextmonth0; + $datevalue[1] = $nextmonth1; + } + elseif($type == "next7days" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $next7days; + } + elseif($type == "next30days" ) + { + + $datevalue[0] =$today; + $datevalue[1] =$next30days; + } + elseif($type == "next60days" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $next60days; + } + elseif($type == "next90days" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $next90days; + } + elseif($type == "next120days" ) + { + + $datevalue[0] = $today; + $datevalue[1] = $next120days; + } + elseif($type == "last7days" ) + { + + $datevalue[0] = $last7days; + $datevalue[1] = $today; + } + elseif($type == "last30days" ) + { + + $datevalue[0] = $last30days; + $datevalue[1] = $today; + } + elseif($type == "last60days" ) + { + + $datevalue[0] = $last60days; + $datevalue[1] = $today; + } + else if($type == "last90days" ) + { + + $datevalue[0] = $last90days; + $datevalue[1] = $today; + } + elseif($type == "last120days" ) + { + + $datevalue[0] = $last120days; + $datevalue[1] = $today; + } + elseif($type == "thisfy" ) + { + + $datevalue[0] = $currentFY0; + $datevalue[1] = $currentFY1; + } + elseif($type == "prevfy" ) + { + + $datevalue[0] = $lastFY0; + $datevalue[1] = $lastFY1; + } + elseif($type == "nextfy" ) + { + + $datevalue[0] = $nextFY0; + $datevalue[1] = $nextFY1; + } + elseif($type == "nextfq" ) + { + + $datevalue[0] = $nFq; + $datevalue[1] = $nFq1; + } + elseif($type == "prevfq" ) + { + + $datevalue[0] = $pFq; + $datevalue[1] = $pFq1; + } + elseif($type == "thisfq" ) + { + $datevalue[0] = $cFq; + $datevalue[1] = $cFq1; + } + else + { + $datevalue[0] = ""; + $datevalue[1] = ""; + } + return $datevalue; + } + + /** Function to get getGroupingList for the given reportid + * @ param $reportid : Type Integer + * returns the $grouplist Array in the following format + * $grouplist = Array($tablename:$columnname:$fieldlabel:fieldname:typeofdata=>$tablename:$columnname $sorder, + * $tablename1:$columnname1:$fieldlabel1:fieldname1:typeofdata1=>$tablename1:$columnname1 $sorder, + * $tablename2:$columnname2:$fieldlabel2:fieldname2:typeofdata2=>$tablename2:$columnname2 $sorder) + * This function also sets the return value in the class variable $this->groupbylist + */ + + + function getGroupingList($reportid) + { + global $adb; + global $modules; + global $log; + + // Have we initialized information already? + if($this->_groupinglist !== false) { + return $this->_groupinglist; + } + + $sreportsortsql = "select vtiger_reportsortcol.* from vtiger_report"; + $sreportsortsql .= " inner join vtiger_reportsortcol on vtiger_report.reportid = vtiger_reportsortcol.reportid"; + $sreportsortsql .= " where vtiger_report.reportid =? AND vtiger_reportsortcol.columnname IN (SELECT columnname from vtiger_selectcolumn WHERE queryid=?) order by vtiger_reportsortcol.sortcolid"; + + $result = $adb->pquery($sreportsortsql, array($reportid,$reportid)); + + while($reportsortrow = $adb->fetch_array($result)) + { + $fieldcolname = $reportsortrow["columnname"]; + list($tablename,$colname,$module_field,$fieldname,$single) = split(":",$fieldcolname); + $sortorder = $reportsortrow["sortorder"]; + + if($sortorder == "Ascending") + { + $sortorder = "ASC"; + + }elseif($sortorder == "Descending") + { + $sortorder = "DESC"; + } + + if($fieldcolname != "none") + { + $selectedfields = explode(":",$fieldcolname); + if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) + $selectedfields[0] = "vtiger_crmentity"; + if(stripos($selectedfields[1],'cf_')==0 && stristr($selectedfields[1],'cf_')==true){ + $sqlvalue = "'".$adb->sql_escape_string(decode_html($selectedfields[2]))."' ".$sortorder; + } else { + $sqlvalue = "'".$selectedfields[2]."' ".$sortorder; + } + $grouplist[$fieldcolname] = $sqlvalue; + $temp = split("_",$selectedfields[2],2); + $module = $temp[0]; + if(CheckFieldPermission($fieldname,$module) == 'true') + { + $this->groupbylist[$fieldcolname] = $selectedfields[0].".".$selectedfields[1]." ".$selectedfields[2]; + } + } + } + // Save the information + $this->_groupinglist = $grouplist; + + $log->info("ReportRun :: Successfully returned getGroupingList".$reportid); + return $grouplist; + } + + /** function to get the selectedorderbylist for the given reportid + * @ param $reportid : type integer + * this returns the columns query for the sortorder columns + * this function also sets the return value in the class variable $this->orderbylistsql + */ + + + function getSelectedOrderbyList($reportid) + { + + global $adb; + global $modules; + global $log; + + $sreportsortsql = "select vtiger_reportsortcol.* from vtiger_report"; + $sreportsortsql .= " inner join vtiger_reportsortcol on vtiger_report.reportid = vtiger_reportsortcol.reportid"; + $sreportsortsql .= " where vtiger_report.reportid =? order by vtiger_reportsortcol.sortcolid"; + + $result = $adb->pquery($sreportsortsql, array($reportid)); + $noofrows = $adb->num_rows($result); + + for($i=0; $i<$noofrows; $i++) + { + $fieldcolname = $adb->query_result($result,$i,"columnname"); + $sortorder = $adb->query_result($result,$i,"sortorder"); + + if($sortorder == "Ascending") + { + $sortorder = "ASC"; + } + elseif($sortorder == "Descending") + { + $sortorder = "DESC"; + } + + if($fieldcolname != "none") + { + $this->orderbylistcolumns[] = $fieldcolname; + $n = $n + 1; + $selectedfields = explode(":",$fieldcolname); + if($n > 1) + { + $sSQL .= ", "; + $this->orderbylistsql .= ", "; + } + if($selectedfields[0] == "vtiger_crmentity".$this->primarymodule) + $selectedfields[0] = "vtiger_crmentity"; + $sSQL .= $selectedfields[0].".".$selectedfields[1]." ".$sortorder; + $this->orderbylistsql .= $selectedfields[0].".".$selectedfields[1]." ".$selectedfields[2]; + } + } + $log->info("ReportRun :: Successfully returned getSelectedOrderbyList".$reportid); + return $sSQL; + } + + /** function to get secondary Module for the given Primary module and secondary module + * @ param $module : type String + * @ param $secmodule : type String + * this returns join query for the given secondary module + */ + + function getRelatedModulesQuery($module,$secmodule) + { + global $log,$current_user; + $query = ''; + if($secmodule!=''){ + $secondarymodule = explode(":",$secmodule); + foreach($secondarymodule as $key=>$value) { + $foc = CRMEntity::getInstance($value); + $query .= $foc->generateReportsSecQuery($module,$value); + } + } + $log->info("ReportRun :: Successfully returned getRelatedModulesQuery".$secmodule); + return $query; + } + /** function to get report query for the given module + * @ param $module : type String + * this returns join query for the given module + */ + + function getReportsQuery($module) + { + global $log, $current_user; + $secondary_module ="'"; + $secondary_module .= str_replace(":","','",$this->secondarymodule); + $secondary_module .="'"; + + if($module == "Leads") + { + $query = "from vtiger_leaddetails + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_leaddetails.leadid + inner join vtiger_leadsubdetails on vtiger_leadsubdetails.leadsubscriptionid=vtiger_leaddetails.leadid + inner join vtiger_leadaddress on vtiger_leadaddress.leadaddressid=vtiger_leadsubdetails.leadsubscriptionid + inner join vtiger_leadscf on vtiger_leaddetails.leadid = vtiger_leadscf.leadid + left join vtiger_groups as vtiger_groupsLeads on vtiger_groupsLeads.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersLeads on vtiger_usersLeads.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0 and vtiger_leaddetails.converted=0"; + } + else if($module == "Accounts") + { + $query = "from vtiger_account + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_account.accountid + inner join vtiger_accountbillads on vtiger_account.accountid=vtiger_accountbillads.accountaddressid + inner join vtiger_accountshipads on vtiger_account.accountid=vtiger_accountshipads.accountaddressid + inner join vtiger_accountscf on vtiger_account.accountid = vtiger_accountscf.accountid + left join vtiger_groups as vtiger_groupsAccounts on vtiger_groupsAccounts.groupid = vtiger_crmentity.smownerid + left join vtiger_account as vtiger_accountAccounts on vtiger_accountAccounts.accountid = vtiger_account.parentid + left join vtiger_users as vtiger_usersAccounts on vtiger_usersAccounts.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0 "; + } + + else if($module == "Contacts") + { + $query = "from vtiger_contactdetails + inner join vtiger_crmentity on vtiger_crmentity.crmid = vtiger_contactdetails.contactid + inner join vtiger_contactaddress on vtiger_contactdetails.contactid = vtiger_contactaddress.contactaddressid + inner join vtiger_customerdetails on vtiger_customerdetails.customerid = vtiger_contactdetails.contactid + inner join vtiger_contactsubdetails on vtiger_contactdetails.contactid = vtiger_contactsubdetails.contactsubscriptionid + inner join vtiger_contactscf on vtiger_contactdetails.contactid = vtiger_contactscf.contactid + left join vtiger_groups vtiger_groupsContacts on vtiger_groupsContacts.groupid = vtiger_crmentity.smownerid + left join vtiger_contactdetails as vtiger_contactdetailsContacts on vtiger_contactdetailsContacts.contactid = vtiger_contactdetails.reportsto + left join vtiger_account as vtiger_accountContacts on vtiger_accountContacts.accountid = vtiger_contactdetails.accountid + left join vtiger_users as vtiger_usersContacts on vtiger_usersContacts.id = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0"; + } + + else if($module == "Potentials") + { + $query = "from vtiger_potential + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_potential.potentialid + inner join vtiger_potentialscf on vtiger_potentialscf.potentialid = vtiger_potential.potentialid + left join vtiger_account as vtiger_accountPotentials on vtiger_potential.related_to = vtiger_accountPotentials.accountid + left join vtiger_contactdetails as vtiger_contactdetailsPotentials on vtiger_potential.related_to = vtiger_contactdetailsPotentials.contactid + left join vtiger_campaign as vtiger_campaignPotentials on vtiger_potential.campaignid = vtiger_campaignPotentials.campaignid + left join vtiger_groups vtiger_groupsPotentials on vtiger_groupsPotentials.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersPotentials on vtiger_usersPotentials.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0 "; + } + + //For this Product - we can related Accounts, Contacts (Also Leads, Potentials) + else if($module == "Products") + { + $query = "from vtiger_products + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_products.productid + left join vtiger_productcf on vtiger_products.productid = vtiger_productcf.productid + left join vtiger_users as vtiger_usersProducts on vtiger_usersProducts.id = vtiger_products.handler + left join vtiger_vendor as vtiger_vendorRelProducts on vtiger_vendorRelProducts.vendorid = vtiger_products.vendor_id + LEFT JOIN ( + SELECT vtiger_products.productid, + (CASE WHEN (vtiger_products.currency_id = 1 ) THEN vtiger_products.unit_price + ELSE (vtiger_products.unit_price / vtiger_currency_info.conversion_rate) END + ) AS actual_unit_price + FROM vtiger_products + LEFT JOIN vtiger_currency_info ON vtiger_products.currency_id = vtiger_currency_info.id + LEFT JOIN vtiger_productcurrencyrel ON vtiger_products.productid = vtiger_productcurrencyrel.productid + AND vtiger_productcurrencyrel.currencyid = ". $current_user->currency_id . " + ) AS innerProduct ON innerProduct.productid = vtiger_products.productid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0"; + } + + else if($module == "HelpDesk") + { + $query = "from vtiger_troubletickets + inner join vtiger_crmentity + on vtiger_crmentity.crmid=vtiger_troubletickets.ticketid + inner join vtiger_ticketcf on vtiger_ticketcf.ticketid = vtiger_troubletickets.ticketid + left join vtiger_crmentity as vtiger_crmentityRelHelpDesk on vtiger_crmentityRelHelpDesk.crmid = vtiger_troubletickets.parent_id + left join vtiger_account as vtiger_accountRelHelpDesk on vtiger_accountRelHelpDesk.accountid=vtiger_crmentityRelHelpDesk.crmid + left join vtiger_contactdetails as vtiger_contactdetailsRelHelpDesk on vtiger_contactdetailsRelHelpDesk.contactid= vtiger_crmentityRelHelpDesk.crmid + left join vtiger_products as vtiger_productsRel on vtiger_productsRel.productid = vtiger_troubletickets.product_id + left join vtiger_groups as vtiger_groupsHelpDesk on vtiger_groupsHelpDesk.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersHelpDesk on vtiger_crmentity.smownerid=vtiger_usersHelpDesk.id + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_crmentity.smownerid=vtiger_users.id + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0 "; + } + + else if($module == "Calendar") + { + $query = "from vtiger_activity + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_activity.activityid + left join vtiger_activitycf on vtiger_activitycf.activityid = vtiger_crmentity.crmid + left join vtiger_cntactivityrel on vtiger_cntactivityrel.activityid= vtiger_activity.activityid + left join vtiger_contactdetails as vtiger_contactdetailsCalendar on vtiger_contactdetailsCalendar.contactid= vtiger_cntactivityrel.contactid + left join vtiger_groups as vtiger_groupsCalendar on vtiger_groupsCalendar.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersCalendar on vtiger_usersCalendar.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + left join vtiger_seactivityrel on vtiger_seactivityrel.activityid = vtiger_activity.activityid + left join vtiger_activity_reminder on vtiger_activity_reminder.activity_id = vtiger_activity.activityid + left join vtiger_recurringevents on vtiger_recurringevents.activityid = vtiger_activity.activityid + left join vtiger_crmentity as vtiger_crmentityRelCalendar on vtiger_crmentityRelCalendar.crmid = vtiger_seactivityrel.crmid + left join vtiger_account as vtiger_accountRelCalendar on vtiger_accountRelCalendar.accountid=vtiger_crmentityRelCalendar.crmid + left join vtiger_leaddetails as vtiger_leaddetailsRelCalendar on vtiger_leaddetailsRelCalendar.leadid = vtiger_crmentityRelCalendar.crmid + left join vtiger_potential as vtiger_potentialRelCalendar on vtiger_potentialRelCalendar.potentialid = vtiger_crmentityRelCalendar.crmid + left join vtiger_quotes as vtiger_quotesRelCalendar on vtiger_quotesRelCalendar.quoteid = vtiger_crmentityRelCalendar.crmid + left join vtiger_purchaseorder as vtiger_purchaseorderRelCalendar on vtiger_purchaseorderRelCalendar.purchaseorderid = vtiger_crmentityRelCalendar.crmid + left join vtiger_invoice as vtiger_invoiceRelCalendar on vtiger_invoiceRelCalendar.invoiceid = vtiger_crmentityRelCalendar.crmid + left join vtiger_salesorder as vtiger_salesorderRelCalendar on vtiger_salesorderRelCalendar.salesorderid = vtiger_crmentityRelCalendar.crmid + left join vtiger_troubletickets as vtiger_troubleticketsRelCalendar on vtiger_troubleticketsRelCalendar.ticketid = vtiger_crmentityRelCalendar.crmid + left join vtiger_campaign as vtiger_campaignRelCalendar on vtiger_campaignRelCalendar.campaignid = vtiger_crmentityRelCalendar.crmid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + WHERE vtiger_crmentity.deleted=0 and (vtiger_activity.activitytype != 'Emails')"; + } + + else if($module == "Quotes") + { + $query = "from vtiger_quotes + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_quotes.quoteid + inner join vtiger_quotesbillads on vtiger_quotes.quoteid=vtiger_quotesbillads.quotebilladdressid + inner join vtiger_quotesshipads on vtiger_quotes.quoteid=vtiger_quotesshipads.quoteshipaddressid + left join vtiger_quotescf on vtiger_quotes.quoteid = vtiger_quotescf.quoteid + left join vtiger_groups as vtiger_groupsQuotes on vtiger_groupsQuotes.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersQuotes on vtiger_usersQuotes.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersRel1 on vtiger_usersRel1.id = vtiger_quotes.inventorymanager + left join vtiger_potential as vtiger_potentialRelQuotes on vtiger_potentialRelQuotes.potentialid = vtiger_quotes.potentialid + left join vtiger_contactdetails as vtiger_contactdetailsQuotes on vtiger_contactdetailsQuotes.contactid = vtiger_quotes.contactid + left join vtiger_account as vtiger_accountQuotes on vtiger_accountQuotes.accountid = vtiger_quotes.accountid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0"; + } + + else if($module == "PurchaseOrder") + { + $query = "from vtiger_purchaseorder + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_purchaseorder.purchaseorderid + inner join vtiger_pobillads on vtiger_purchaseorder.purchaseorderid=vtiger_pobillads.pobilladdressid + inner join vtiger_poshipads on vtiger_purchaseorder.purchaseorderid=vtiger_poshipads.poshipaddressid + left join vtiger_purchaseordercf on vtiger_purchaseorder.purchaseorderid = vtiger_purchaseordercf.purchaseorderid + left join vtiger_groups as vtiger_groupsPurchaseOrder on vtiger_groupsPurchaseOrder.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersPurchaseOrder on vtiger_usersPurchaseOrder.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + left join vtiger_vendor as vtiger_vendorRelPurchaseOrder on vtiger_vendorRelPurchaseOrder.vendorid = vtiger_purchaseorder.vendorid + left join vtiger_contactdetails as vtiger_contactdetailsPurchaseOrder on vtiger_contactdetailsPurchaseOrder.contactid = vtiger_purchaseorder.contactid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0"; + } + + else if($module == "Invoice") + { + $query = "from vtiger_invoice + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_invoice.invoiceid + inner join vtiger_invoicebillads on vtiger_invoice.invoiceid=vtiger_invoicebillads.invoicebilladdressid + inner join vtiger_invoiceshipads on vtiger_invoice.invoiceid=vtiger_invoiceshipads.invoiceshipaddressid + left join vtiger_salesorder as vtiger_salesorderInvoice on vtiger_salesorderInvoice.salesorderid=vtiger_invoice.salesorderid + left join vtiger_invoicecf on vtiger_invoice.invoiceid = vtiger_invoicecf.invoiceid + left join vtiger_groups as vtiger_groupsInvoice on vtiger_groupsInvoice.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersInvoice on vtiger_usersInvoice.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + left join vtiger_account as vtiger_accountInvoice on vtiger_accountInvoice.accountid = vtiger_invoice.accountid + left join vtiger_contactdetails as vtiger_contactdetailsInvoice on vtiger_contactdetailsInvoice.contactid = vtiger_invoice.contactid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0"; + } + else if($module == "SalesOrder") + { + $query = "from vtiger_salesorder + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_salesorder.salesorderid + inner join vtiger_sobillads on vtiger_salesorder.salesorderid=vtiger_sobillads.sobilladdressid + inner join vtiger_soshipads on vtiger_salesorder.salesorderid=vtiger_soshipads.soshipaddressid + left join vtiger_salesordercf on vtiger_salesorder.salesorderid = vtiger_salesordercf.salesorderid + left join vtiger_contactdetails as vtiger_contactdetailsSalesOrder on vtiger_contactdetailsSalesOrder.contactid = vtiger_salesorder.contactid + left join vtiger_quotes as vtiger_quotesSalesOrder on vtiger_quotesSalesOrder.quoteid = vtiger_salesorder.quoteid + left join vtiger_account as vtiger_accountSalesOrder on vtiger_accountSalesOrder.accountid = vtiger_salesorder.accountid + left join vtiger_potential as vtiger_potentialRelSalesOrder on vtiger_potentialRelSalesOrder.potentialid = vtiger_salesorder.potentialid + left join vtiger_invoice_recurring_info on vtiger_invoice_recurring_info.salesorderid = vtiger_salesorder.salesorderid + left join vtiger_groups as vtiger_groupsSalesOrder on vtiger_groupsSalesOrder.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersSalesOrder on vtiger_usersSalesOrder.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0"; + + + } + else if($module == "Campaigns") + { + $query = "from vtiger_campaign + inner join vtiger_campaignscf as vtiger_campaignscf on vtiger_campaignscf.campaignid=vtiger_campaign.campaignid + inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_campaign.campaignid + left join vtiger_products as vtiger_productsCampaigns on vtiger_productsCampaigns.productid = vtiger_campaign.product_id + left join vtiger_groups as vtiger_groupsCampaigns on vtiger_groupsCampaigns.groupid = vtiger_crmentity.smownerid + left join vtiger_users as vtiger_usersCampaigns on vtiger_usersCampaigns.id = vtiger_crmentity.smownerid + left join vtiger_groups on vtiger_groups.groupid = vtiger_crmentity.smownerid + left join vtiger_users on vtiger_users.id = vtiger_crmentity.smownerid + ".$this->getRelatedModulesQuery($module,$this->secondarymodule)." + where vtiger_crmentity.deleted=0"; + } + + else { + if($module!=''){ + $focus = CRMEntity::getInstance($module); + $query = $focus->generateReportsQuery($module) + .$this->getRelatedModulesQuery($module,$this->secondarymodule) + ." WHERE vtiger_crmentity.deleted=0"; + } + } + $log->info("ReportRun :: Successfully returned getReportsQuery".$module); + + return $query; + } + + + /** function to get query for the given reportid,filterlist,type + * @ param $reportid : Type integer + * @ param $filterlist : Type Array + * @ param $module : Type String + * this returns join query for the report + */ + + function sGetSQLforReport($reportid,$filterlist,$type='') + { + global $log; + + $columnlist = $this->getQueryColumnsList($reportid); + $groupslist = $this->getGroupingList($reportid); + $stdfilterlist = $this->getStdFilterList($reportid); + $columnstotallist = $this->getColumnsTotal($reportid); + $advfilterlist = $this->getAdvFilterList($reportid); + $this->totallist = $columnstotallist; + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + $tab_id = getTabid($this->primarymodule); + //Fix for ticket #4915. + $selectlist = $columnlist; + //columns list + if(isset($selectlist)) + { + $selectedcolumns = implode(", ",$selectlist); + } + //groups list + if(isset($groupslist)) + { + $groupsquery = implode(", ",$groupslist); + } + + //standard list + if(isset($stdfilterlist)) + { + $stdfiltersql = implode(", ",$stdfilterlist); + } + if(isset($filterlist)) + { + $stdfiltersql = implode(", ",$filterlist); + } + //columns to total list + if(isset($columnstotallist)) + { + $columnstotalsql = implode(", ",$columnstotallist); + } + //advanced filterlist + if(isset($advfilterlist)) + { + $advfiltersql = implode(" and ",$advfilterlist); + } + if($stdfiltersql != "") + { + $wheresql = " and ".$stdfiltersql; + } + if($advfiltersql != "") + { + $wheresql .= " and ".$advfiltersql; + } + + $reportquery = $this->getReportsQuery($this->primarymodule); + + // If we don't have access to any columns, let us select one column and limit result to shown we have not results + // Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/4758 - Prasad + $allColumnsRestricted = false; + + if($type == 'COLUMNSTOTOTAL') + { + if($columnstotalsql != '') + { + $reportquery = "select ".$columnstotalsql." ".$reportquery." ".$wheresql; + } + }else + { + if($selectedcolumns == '') { + // Fix for: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/4758 - Prasad + + $selectedcolumns = "''"; // "''" to get blank column name + $allColumnsRestricted = true; + } + + $reportquery = "select ".$selectedcolumns." ".$reportquery." ".$wheresql; + } + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[$tab_id] == 3) + { + $sec_parameter=getListViewSecurityParameter($this->primarymodule); + $reportquery .= " ".$sec_parameter; + } + + $sec_modules = split(":",$this->secondarymodule); + foreach($sec_modules as $i=>$key){ + $table_id = getTabid($key); + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[$table_id] == 3) + { + $sec_parameter=getSecListViewSecurityParameter($key); + $reportquery .= " ".$sec_parameter; + } + } + + //if($tab_id == 9 || $tab_id == 16) + //$reportquery.=" group by vtiger_activity.activityid "; + + if(trim($groupsquery) != "" && empty($type)) + { + $reportquery .= " order by ".$groupsquery; + } + + // Prasad: No columns selected so limit the number of rows directly. + if($allColumnsRestricted) { + $reportquery .= " limit 0"; + } + + $log->info("ReportRun :: Successfully returned sGetSQLforReport".$reportid); + return $reportquery; + + } + + /** function to get the report output in HTML,PDF,TOTAL,PRINT,PRINTTOTAL formats depends on the argument $outputformat + * @ param $outputformat : Type String (valid parameters HTML,PDF,TOTAL,PRINT,PRINT_TOTAL) + * @ param $filterlist : Type Array + * This returns HTML Report if $outputformat is HTML + * Array for PDF if $outputformat is PDF + * HTML strings for TOTAL if $outputformat is TOTAL + * Array for PRINT if $outputformat is PRINT + * HTML strings for TOTAL fields if $outputformat is PRINTTOTAL + * HTML strings for + */ + + // Performance Optimization: Added parameter directOutput to avoid building big-string! + function GenerateReport($outputformat,$filterlist, $directOutput=false) + { + global $adb,$current_user,$php_max_execution_time; + global $modules,$app_strings; + global $mod_strings,$current_language; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + $modules_selected = array(); + $modules_selected[] = $this->primarymodule; + if(!empty($this->secondarymodule)){ + $sec_modules = split(":",$this->secondarymodule); + for($i=0;$ipquery("SELECT tabid, fieldlabel, uitype from vtiger_field WHERE uitype in (71,72,10)", array()); + if($currencyfieldres) { + foreach($currencyfieldres as $currencyfieldrow) { + $modprefixedlabel = getTabModuleName($currencyfieldrow['tabid']).' '.$currencyfieldrow['fieldlabel']; + $modprefixedlabel = str_replace(' ','_',$modprefixedlabel); + if($currencyfieldrow['uitype']!=10){ + if(!in_array($modprefixedlabel, $this->convert_currency) && !in_array($modprefixedlabel, $this->append_currency_symbol_to_value)) { + $this->convert_currency[] = $modprefixedlabel; + } + } else { + if(!in_array($modprefixedlabel, $this->ui10_fields)) { + $this->ui10_fields[] = $modprefixedlabel; + } + } + } + } + + + if($outputformat == "HTML") + { + $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist); + $result = $adb->query($sSQL); + $error_msg = $adb->database->ErrorMsg(); + if(!$result && $error_msg!=''){ + // Performance Optimization: If direct output is requried + if($directOutput) { + echo getTranslatedString('LBL_REPORT_GENERATION_FAILED', $currentModule) . "
    " . $error_msg; + $error_msg = false; + } + // END + return $error_msg; + } + + // Performance Optimization: If direct output is required + if($directOutput) { + echo ''; + } + // END + + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1) + $picklistarray = $this->getAccessPickListValues(); + if($result) + { + $y=$adb->num_fields($result); + $arrayHeaders = Array(); + for ($x=0; $x<$y; $x++) + { + $fld = $adb->field_name($result, $x); + if(in_array($this->getLstringforReportHeaders($fld->name), $arrayHeaders)) + { + $headerLabel = str_replace("_"," ",$fld->name); + $arrayHeaders[] = $headerLabel; + } + else + { + $headerLabel = str_replace($modules," ",$this->getLstringforReportHeaders($fld->name)); + $headerLabel = str_replace("_"," ",$this->getLstringforReportHeaders($fld->name)); + $arrayHeaders[] = $headerLabel; + } + /*STRING TRANSLATION starts */ + $mod_name = split(' ',$headerLabel,2); + $module =''; + if(in_array($mod_name[0],$modules_selected)){ + $module = getTranslatedString($mod_name[0],$mod_name[0]); + } + + if(!empty($this->secondarymodule)){ + if($module!=''){ + $headerLabel_tmp = $module." ".getTranslatedString($mod_name[1],$mod_name[0]); + } else { + $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]); + } + } else { + if($module!=''){ + $headerLabel_tmp = getTranslatedString($mod_name[1],$mod_name[0]); + } else { + $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]); + } + } + if($headerLabel == $headerLabel_tmp) $headerLabel = getTranslatedString($headerLabel_tmp); + else $headerLabel = $headerLabel_tmp; + /*STRING TRANSLATION ends */ + $header .= ""; + + // Performance Optimization: If direct output is required + if($directOutput) { + echo $header; + $header = ''; + } + // END + } + + // Performance Optimization: If direct output is required + if($directOutput) { + echo ''; + } + // END + + $noofrows = $adb->num_rows($result); + $custom_field_values = $adb->fetch_array($result); + $groupslist = $this->getGroupingList($this->reportid); + + $column_definitions = $adb->getFieldsDefinition($result); + + do + { + $arraylists = Array(); + if(count($groupslist) == 1) + { + $newvalue = $custom_field_values[0]; + }elseif(count($groupslist) == 2) + { + $newvalue = $custom_field_values[0]; + $snewvalue = $custom_field_values[1]; + }elseif(count($groupslist) == 3) + { + $newvalue = $custom_field_values[0]; + $snewvalue = $custom_field_values[1]; + $tnewvalue = $custom_field_values[2]; + } + if($newvalue == "") $newvalue = "-"; + + if($snewvalue == "") $snewvalue = "-"; + + if($tnewvalue == "") $tnewvalue = "-"; + + $valtemplate .= ""; + + // Performance Optimization + if($directOutput) { + echo $valtemplate; + $valtemplate = ''; + } + // END + + for ($i=0; $i<$y; $i++) + { + $fld = $adb->field_name($result, $i); + $fld_type = $column_definitions[$i]->type; + if (in_array($fld->name, $this->convert_currency)) { + if($custom_field_values[$i]!='') + $fieldvalue = convertFromMasterCurrency($custom_field_values[$i],$current_user->conv_rate); + else + $fieldvalue = getTranslatedString($custom_field_values[$i]); + } elseif(in_array($fld->name, $this->append_currency_symbol_to_value)) { + $curid_value = explode("::", $custom_field_values[$i]); + $currency_id = $curid_value[0]; + $currency_value = $curid_value[1]; + $cur_sym_rate = getCurrencySymbolandCRate($currency_id); + if($custom_field_values[$i]!='') + $fieldvalue = $cur_sym_rate['symbol']." ".$currency_value; + else + $fieldvalue = getTranslatedString($custom_field_values[$i]); + }elseif ($fld->name == "PurchaseOrder_Currency" || $fld->name == "SalesOrder_Currency" + || $fld->name == "Invoice_Currency" || $fld->name == "Quotes_Currency") { + if($custom_field_values[$i]!='') + $fieldvalue = getCurrencyName($custom_field_values[$i]); + else + $fieldvalue =getTranslatedString($custom_field_values[$i]); + }elseif (in_array($fld->name,$this->ui10_fields) && !empty($custom_field_values[$i])) { + $type = getSalesEntityType($custom_field_values[$i]); + $tmp =getEntityName($type,$custom_field_values[$i]); + foreach($tmp as $key=>$val){ + $fieldvalue = $val; + break; + } + } + else { + if($custom_field_values[$i]!='') + $fieldvalue = getTranslatedString($custom_field_values[$i]); + else + $fieldvalue = getTranslatedString($custom_field_values[$i]); + } + $fieldvalue = str_replace("<", "<", $fieldvalue); + $fieldvalue = str_replace(">", ">", $fieldvalue); + + //check for Roll based pick list + $temp_val= $fld->name; + if(is_array($picklistarray)) + if(array_key_exists($temp_val,$picklistarray)) + { + if(!in_array($custom_field_values[$i],$picklistarray[$fld->name]) && $custom_field_values[$i] != '') + $fieldvalue =$app_strings['LBL_NOT_ACCESSIBLE']; + + } + if(is_array($picklistarray[1])) + if(array_key_exists($temp_val,$picklistarray[1])) + { + $temp =explode(",",str_ireplace(' |##| ',',',$fieldvalue)); + $temp_val = Array(); + foreach($temp as $key =>$val) + { + if(!in_array(trim($val),$picklistarray[1][$fld->name]) && trim($val) != '') + { + $temp_val[]=$app_strings['LBL_NOT_ACCESSIBLE']; + } + else + $temp_val[]=$val; + } + $fieldvalue =(is_array($temp_val))?implode(", ",$temp_val):''; + } + + if($fieldvalue == "" ) + { + $fieldvalue = "-"; + } + else if(stristr($fieldvalue,"|##|")) + { + $fieldvalue = str_ireplace(' |##| ',', ',$fieldvalue); + } + else if($fld_type == "date" || $fld_type == "datetime") { + $fieldvalue = getDisplayDate($fieldvalue); + } + + if(($lastvalue == $fieldvalue) && $this->reporttype == "summary") + { + if($this->reporttype == "summary") + { + $valtemplate .= ""; + }else + { + $valtemplate .= ""; + } + }else if(($secondvalue === $fieldvalue) && $this->reporttype == "summary") + { + if($lastvalue === $newvalue) + { + $valtemplate .= ""; + }else + { + $valtemplate .= ""; + } + } + else if(($thirdvalue === $fieldvalue) && $this->reporttype == "summary") + { + if($secondvalue === $snewvalue) + { + $valtemplate .= ""; + }else + { + $valtemplate .= ""; + } + } + else + { + if($this->reporttype == "tabular") + { + $valtemplate .= ""; + }else + { + $valtemplate .= ""; + } + } + + // Performance Optimization: If direct output is required + if($directOutput) { + echo $valtemplate; + $valtemplate = ''; + } + // END + } + + $valtemplate .= ""; + + // Performance Optimization: If direct output is required + if($directOutput) { + echo $valtemplate; + $valtemplate = ''; + } + // END + + $lastvalue = $newvalue; + $secondvalue = $snewvalue; + $thirdvalue = $tnewvalue; + $arr_val[] = $arraylists; + set_time_limit($php_max_execution_time); + }while($custom_field_values = $adb->fetch_array($result)); + + // Performance Optimization + if($directOutput) { + echo "
    ".$headerLabel."
     ".$fieldvalue." ".$fieldvalue." ".$fieldvalue."".$fieldvalue."".$fieldvalue."
    "; + echo ""; + } else { + + $sHTML =' + '. + $header + .' + '. + $valtemplate + .' +
    '; + } + //<<<<<<<>>>>>>>>>>> + $return_data[] = $sHTML; + $return_data[] = $noofrows; + $return_data[] = $sSQL; + return $return_data; + } + }elseif($outputformat == "PDF") + { + + $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist); + $result = $adb->query($sSQL); + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1) + $picklistarray = $this->getAccessPickListValues(); + + if($result) + { + $y=$adb->num_fields($result); + $noofrows = $adb->num_rows($result); + $custom_field_values = $adb->fetch_array($result); + $column_definitions = $adb->getFieldsDefinition($result); + + do + { + $arraylists = Array(); + for ($i=0; $i<$y; $i++) + { + $fld = $adb->field_name($result, $i); + if (in_array($fld->name, $this->convert_currency)) { + $fieldvalue = convertFromMasterCurrency($custom_field_values[$i],$current_user->conv_rate); + } elseif(in_array($fld->name, $this->append_currency_symbol_to_value)) { + $curid_value = explode("::", $custom_field_values[$i]); + $currency_id = $curid_value[0]; + $currency_value = $curid_value[1]; + $cur_sym_rate = getCurrencySymbolandCRate($currency_id); + $fieldvalue = $cur_sym_rate['symbol']." ".$currency_value; + }elseif ($fld->name == "PurchaseOrder_Currency" || $fld->name == "SalesOrder_Currency" + || $fld->name == "Invoice_Currency" || $fld->name == "Quotes_Currency") { + $fieldvalue = getCurrencyName($custom_field_values[$i]); + }elseif (in_array($fld->name,$this->ui10_fields) && !empty($custom_field_values[$i])) { + $type = getSalesEntityType($custom_field_values[$i]); + $tmp =getEntityName($type,$custom_field_values[$i]); + foreach($tmp as $key=>$val){ + $fieldvalue = $val; + break; + } + }else { + $fieldvalue = getTranslatedString($custom_field_values[$i]); + } + $append_cur = str_replace($fld->name,"",decode_html($this->getLstringforReportHeaders($fld->name))); + $headerLabel = str_replace("_"," ",$fld->name); + /*STRING TRANSLATION starts */ + $mod_name = split(' ',$headerLabel,2); + $module =''; + if(in_array($mod_name[0],$modules_selected)) + $module = getTranslatedString($mod_name[0],$mod_name[0]); + + if(!empty($this->secondarymodule)){ + if($module!=''){ + $headerLabel_tmp = $module." ".getTranslatedString($mod_name[1],$mod_name[0]); + } else { + $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]); + } + } else { + if($module!=''){ + $headerLabel_tmp = getTranslatedString($mod_name[1],$mod_name[0]); + } else { + $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]); + } + } + if($headerLabel == $headerLabel_tmp) $headerLabel = getTranslatedString($headerLabel_tmp); + else $headerLabel = $headerLabel_tmp; + /*STRING TRANSLATION starts */ + if(trim($append_cur)!="") $headerLabel .= $append_cur; + + $fieldvalue = str_replace("<", "<", $fieldvalue); + $fieldvalue = str_replace(">", ">", $fieldvalue); + + // Check for role based pick list + $temp_val= $fld->name; + if(is_array($picklistarray)) + if(array_key_exists($temp_val,$picklistarray)) + { + if(!in_array($custom_field_values[$i],$picklistarray[$fld->name]) && $custom_field_values[$i] != '') + { + $fieldvalue =$app_strings['LBL_NOT_ACCESSIBLE']; + } + } + if(is_array($picklistarray[1])) + if(array_key_exists($temp_val,$picklistarray[1])) + { + $temp =explode(",",str_ireplace(' |##| ',',',$fieldvalue)); + $temp_val = Array(); + foreach($temp as $key =>$val) + { + if(!in_array(trim($val),$picklistarray[1][$fld->name]) && trim($val) != '') + { + $temp_val[]=$app_strings['LBL_NOT_ACCESSIBLE']; + } + else + $temp_val[]=$val; + } + $fieldvalue =(is_array($temp_val))?implode(", ",$temp_val):''; + } + + if($fieldvalue == "" ) + { + $fieldvalue = "-"; + } + else if(stristr($fieldvalue,"|##|")) + { + $fieldvalue = str_ireplace(' |##| ',', ',$fieldvalue); + } + else if($fld_type == "date" || $fld_type == "datetime") { + $fieldvalue = getDisplayDate($fieldvalue); + } + if(array_key_exists($this->getLstringforReportHeaders($fld->name), $arraylists)) + $arraylists[$headerLabel] = $fieldvalue; + else + $arraylists[$headerLabel] = $fieldvalue; + } + $arr_val[] = $arraylists; + set_time_limit($php_max_execution_time); + }while($custom_field_values = $adb->fetch_array($result)); + + return $arr_val; + } + }elseif($outputformat == "TOTALHTML") + { + $escapedchars = Array('_SUM','_AVG','_MIN','_MAX'); + $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist,"COLUMNSTOTOTAL"); + if(isset($this->totallist)) + { + if($sSQL != "") + { + $result = $adb->query($sSQL); + $y=$adb->num_fields($result); + $custom_field_values = $adb->fetch_array($result); + $coltotalhtml .= ""; + + // Performation Optimization: If Direct output is desired + if($directOutput) { + echo $coltotalhtml; + $coltotalhtml = ''; + } + // END + + foreach($this->totallist as $key=>$value) + { + $fieldlist = explode(":",$key); + $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid, uitype as uitype from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2])); + if($adb->num_rows($mod_query)>0){ + $module_name = getTabName($adb->query_result($mod_query,0,'tabid')); + $fieldlabel = trim(str_replace($escapedchars," ",$fieldlist[3])); + $fieldlabel = str_replace("_", " ", $fieldlabel); + if($module_name){ + $field = getTranslatedString($module_name)." ".getTranslatedString($fieldlabel,$module_name); + } else { + $field = getTranslatedString($module_name)." ".getTranslatedString($fieldlabel); + } + } + $uitype_arr[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $adb->query_result($mod_query,0,"uitype"); + $totclmnflds[str_replace($escapedchars," ",$module_name."_".$fieldlist[3])] = $field; + } + for($i =0;$i<$y;$i++) + { + $fld = $adb->field_name($result, $i); + $keyhdr[$fld->name] = $custom_field_values[$i]; + } + + foreach($totclmnflds as $key=>$value) + { + $coltotalhtml .= ''; + $col_header = trim(str_replace($modules," ",$value)); + $fld_name_1 = $this->primarymodule . "_" . trim($value); + $fld_name_2 = $this->secondarymodule . "_" . trim($value); + if($uitype_arr[$value]==71 || in_array($fld_name_1,$this->convert_currency) || in_array($fld_name_1,$this->append_currency_symbol_to_value) + || in_array($fld_name_2,$this->convert_currency) || in_array($fld_name_2,$this->append_currency_symbol_to_value)) { + $col_header .= " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")"; + $convert_price = true; + } else{ + $convert_price = false; + } + $coltotalhtml .= ''; + $value = trim($key); + $arraykey = $value.'_SUM'; + if(isset($keyhdr[$arraykey])) + { + if($convert_price) + $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate); + else + $conv_value = $keyhdr[$arraykey]; + $coltotalhtml .= ''; + }else + { + $coltotalhtml .= ''; + } + + $arraykey = $value.'_AVG'; + if(isset($keyhdr[$arraykey])) + { + if($convert_price) + $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate); + else + $conv_value = $keyhdr[$arraykey]; + $coltotalhtml .= ''; + }else + { + $coltotalhtml .= ''; + } + + $arraykey = $value.'_MIN'; + if(isset($keyhdr[$arraykey])) + { + if($convert_price) + $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate); + else + $conv_value = $keyhdr[$arraykey]; + $coltotalhtml .= ''; + }else + { + $coltotalhtml .= ''; + } + + $arraykey = $value.'_MAX'; + if(isset($keyhdr[$arraykey])) + { + if($convert_price) + $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate); + else + $conv_value = $keyhdr[$arraykey]; + $coltotalhtml .= ''; + }else + { + $coltotalhtml .= ''; + } + + $coltotalhtml .= ''; + + // Performation Optimization: If Direct output is desired + if($directOutput) { + echo $coltotalhtml; + $coltotalhtml = ''; + } + // END + } + + $coltotalhtml .= "
    ".$mod_strings[Totals]."".$mod_strings[SUM]."".$mod_strings[AVG]."".$mod_strings[MIN]."".$mod_strings[MAX]."
    '. $col_header .''.$conv_value.' '.$conv_value.' '.$conv_value.' '.$conv_value.' 
    "; + + // Performation Optimization: If Direct output is desired + if($directOutput) { + echo $coltotalhtml; + $coltotalhtml = ''; + } + // END + } + } + return $coltotalhtml; + }elseif($outputformat == "PRINT") + { + $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist); + $result = $adb->query($sSQL); + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1) + $picklistarray = $this->getAccessPickListValues(); + + if($result) + { + $y=$adb->num_fields($result); + $arrayHeaders = Array(); + for ($x=0; $x<$y; $x++) + { + $fld = $adb->field_name($result, $x); + if(in_array($this->getLstringforReportHeaders($fld->name), $arrayHeaders)) + { + $headerLabel = str_replace("_"," ",$fld->name); + $arrayHeaders[] = $headerLabel; + } + else + { + $headerLabel = str_replace($modules," ",$this->getLstringforReportHeaders($fld->name)); + $arrayHeaders[] = $headerLabel; + } + /*STRING TRANSLATION starts */ + $mod_name = split(' ',$headerLabel,2); + $module =''; + if(in_array($mod_name[0],$modules_selected)){ + $module = getTranslatedString($mod_name[0],$mod_name[0]); + } + + if(!empty($this->secondarymodule)){ + if($module!=''){ + $headerLabel_tmp = $module." ".getTranslatedString($mod_name[1],$mod_name[0]); + } else { + $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]); + } + } else { + if($module!=''){ + $headerLabel_tmp = getTranslatedString($mod_name[1],$mod_name[0]); + } else { + $headerLabel_tmp = getTranslatedString($mod_name[0]." ".$mod_name[1]); + } + } + if($headerLabel == $headerLabel_tmp) $headerLabel = getTranslatedString($headerLabel_tmp); + else $headerLabel = $headerLabel_tmp; + /*STRING TRANSLATION ends */ + $header .= "".$headerLabel.""; + } + $noofrows = $adb->num_rows($result); + $custom_field_values = $adb->fetch_array($result); + $groupslist = $this->getGroupingList($this->reportid); + + $column_definitions = $adb->getFieldsDefinition($result); + + do + { + $arraylists = Array(); + if(count($groupslist) == 1) + { + $newvalue = $custom_field_values[0]; + }elseif(count($groupslist) == 2) + { + $newvalue = $custom_field_values[0]; + $snewvalue = $custom_field_values[1]; + }elseif(count($groupslist) == 3) + { + $newvalue = $custom_field_values[0]; + $snewvalue = $custom_field_values[1]; + $tnewvalue = $custom_field_values[2]; + } + + if($newvalue == "") $newvalue = "-"; + + if($snewvalue == "") $snewvalue = "-"; + + if($tnewvalue == "") $tnewvalue = "-"; + + $valtemplate .= ""; + + for ($i=0; $i<$y; $i++) + { + $fld = $adb->field_name($result, $i); + if (in_array($fld->name, $this->convert_currency)) { + $fieldvalue = convertFromMasterCurrency($custom_field_values[$i],$current_user->conv_rate); + } elseif(in_array($fld->name, $this->append_currency_symbol_to_value)) { + $curid_value = explode("::", $custom_field_values[$i]); + $currency_id = $curid_value[0]; + $currency_value = $curid_value[1]; + $cur_sym_rate = getCurrencySymbolandCRate($currency_id); + $fieldvalue = $cur_sym_rate['symbol']." ".$currency_value; + }elseif ($fld->name == "PurchaseOrder_Currency" || $fld->name == "SalesOrder_Currency" + || $fld->name == "Invoice_Currency" || $fld->name == "Quotes_Currency") { + $fieldvalue = getCurrencyName($custom_field_values[$i]); + }elseif (in_array($fld->name,$this->ui10_fields) && !empty($custom_field_values[$i])) { + $type = getSalesEntityType($custom_field_values[$i]); + $tmp =getEntityName($type,$custom_field_values[$i]); + foreach($tmp as $key=>$val){ + $fieldvalue = $val; + break; + } + }else { + $fieldvalue = getTranslatedString($custom_field_values[$i]); + } + + $fieldvalue = str_replace("<", "<", $fieldvalue); + $fieldvalue = str_replace(">", ">", $fieldvalue); + + //Check For Role based pick list + $temp_val= $fld->name; + if(is_array($picklistarray)) + if(array_key_exists($temp_val,$picklistarray)) + { + if(!in_array($custom_field_values[$i],$picklistarray[$fld->name]) && $custom_field_values[$i] != '') + { + $fieldvalue =$app_strings['LBL_NOT_ACCESSIBLE']; + } + } + if(is_array($picklistarray[1])) + if(array_key_exists($temp_val,$picklistarray[1])) + { + + $temp =explode(",",str_ireplace(' |##| ',',',$fieldvalue)); + $temp_val = Array(); + foreach($temp as $key =>$val) + { + if(!in_array(trim($val),$picklistarray[1][$fld->name]) && trim($val) != '') + { + $temp_val[]=$app_strings['LBL_NOT_ACCESSIBLE']; + } + else + $temp_val[]=$val; + } + $fieldvalue =(is_array($temp_val))?implode(", ",$temp_val):''; + } + + + if($fieldvalue == "" ) + { + $fieldvalue = "-"; + } + else if(stristr($fieldvalue,"|##|")) + { + $fieldvalue = str_ireplace(' |##| ',', ',$fieldvalue); + } + else if($fld_type == "date" || $fld_type == "datetime") { + $fieldvalue = getDisplayDate($fieldvalue); + } + if(($lastvalue == $fieldvalue) && $this->reporttype == "summary") + { + if($this->reporttype == "summary") + { + $valtemplate .= " "; + }else + { + $valtemplate .= "".$fieldvalue.""; + } + }else if(($secondvalue == $fieldvalue) && $this->reporttype == "summary") + { + if($lastvalue == $newvalue) + { + $valtemplate .= " "; + }else + { + $valtemplate .= "".$fieldvalue.""; + } + } + else if(($thirdvalue == $fieldvalue) && $this->reporttype == "summary") + { + if($secondvalue == $snewvalue) + { + $valtemplate .= " "; + }else + { + $valtemplate .= "".$fieldvalue.""; + } + } + else + { + if($this->reporttype == "tabular") + { + $valtemplate .= "".$fieldvalue.""; + }else + { + $valtemplate .= "".$fieldvalue.""; + } + } + } + $valtemplate .= ""; + $lastvalue = $newvalue; + $secondvalue = $snewvalue; + $thirdvalue = $tnewvalue; + $arr_val[] = $arraylists; + set_time_limit($php_max_execution_time); + }while($custom_field_values = $adb->fetch_array($result)); + + $sHTML = ''.$header.''.$valtemplate; + $return_data[] = $sHTML; + $return_data[] = $noofrows; + return $return_data; + } + }elseif($outputformat == "PRINT_TOTAL") + { + $escapedchars = Array('_SUM','_AVG','_MIN','_MAX'); + $sSQL = $this->sGetSQLforReport($this->reportid,$filterlist,"COLUMNSTOTOTAL"); + if(isset($this->totallist)) + { + if($sSQL != "") + { + $result = $adb->query($sSQL); + $y=$adb->num_fields($result); + $custom_field_values = $adb->fetch_array($result); + + $coltotalhtml .= ''; + + foreach($this->totallist as $key=>$value) + { + $fieldlist = explode(":",$key); + $totclmnflds[str_replace($escapedchars," ",$fieldlist[3])] = str_replace($escapedchars," ",$fieldlist[3]); + } + + for($i =0;$i<$y;$i++) + { + $fld = $adb->field_name($result, $i); + $keyhdr[$fld->name] = $custom_field_values[$i]; + + } + foreach($totclmnflds as $key=>$value) + { + $coltotalhtml .= ''; + $col_header = getTranslatedString(trim(str_replace($modules," ",$value))); + $fld_name_1 = $this->primarymodule . "_" . trim($value); + $fld_name_2 = $this->secondarymodule . "_" . trim($value); + if(in_array($fld_name_1,$this->convert_currency) || in_array($fld_name_1,$this->append_currency_symbol_to_value) + || in_array($fld_name_2,$this->convert_currency) || in_array($fld_name_2,$this->append_currency_symbol_to_value)) { + $col_header .= " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")"; + $convert_price = true; + } else { + $convert_price = false; + } + $coltotalhtml .= ''; + + $arraykey = trim($value).'_SUM'; + if(isset($keyhdr[$arraykey])) + { + if($convert_price) + $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate); + else + $conv_value = $keyhdr[$arraykey]; + $coltotalhtml .= ''; + }else + { + $coltotalhtml .= ''; + } + + $arraykey = trim($value).'_AVG'; + if(isset($keyhdr[$arraykey])) + { + if($convert_price) + $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate); + else + $conv_value = $keyhdr[$arraykey]; + $coltotalhtml .= ''; + }else + { + $coltotalhtml .= ''; + } + + $arraykey = trim($value).'_MIN'; + if(isset($keyhdr[$arraykey])) + { + if($convert_price) + $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate); + else + $conv_value = $keyhdr[$arraykey]; + $coltotalhtml .= ''; + }else + { + $coltotalhtml .= ''; + } + + $arraykey = trim($value).'_MAX'; + if(isset($keyhdr[$arraykey])) + { + if($convert_price) + $conv_value = convertFromMasterCurrency($keyhdr[$arraykey],$current_user->conv_rate); + else + $conv_value = $keyhdr[$arraykey]; + $coltotalhtml .= ''; + }else + { + $coltotalhtml .= ''; + } + + $coltotalhtml .= ''; + } + + $coltotalhtml .= "
    '.$mod_strings[Totals].''.$mod_strings[SUM].''.$mod_strings[AVG].''.$mod_strings[MIN].''.$mod_strings[MAX].'
    '. $col_header .''.$conv_value.' '.$conv_value.' '.$conv_value.' '.$conv_value.' 
    "; + } + } + return $coltotalhtml; + } + } + + //<<<<<<>>>>>>>>> + function getColumnsTotal($reportid) + { + // Have we initialized it already? + if($this->_columnstotallist !== false) { + return $this->_columnstotallist; + } + + global $adb; + global $modules; + global $log, $current_user; + + $query = "select * from vtiger_reportmodules where reportmodulesid =?"; + $res = $adb->pquery($query , array($reportid)); + $modrow = $adb->fetch_array($res); + $premod = $modrow["primarymodule"]; + $secmod = $modrow["secondarymodules"]; + $coltotalsql = "select vtiger_reportsummary.* from vtiger_report"; + $coltotalsql .= " inner join vtiger_reportsummary on vtiger_report.reportid = vtiger_reportsummary.reportsummaryid"; + $coltotalsql .= " where vtiger_report.reportid =?"; + + $result = $adb->pquery($coltotalsql, array($reportid)); + + while($coltotalrow = $adb->fetch_array($result)) + { + $fieldcolname = $coltotalrow["columnname"]; + if($fieldcolname != "none") + { + $fieldlist = explode(":",$fieldcolname); + $field_tablename = $fieldlist[1]; + $field_columnname = $fieldlist[2]; + + $mod_query = $adb->pquery("SELECT distinct(tabid) as tabid from vtiger_field where tablename = ? and columnname=?",array($fieldlist[1],$fieldlist[2])); + if($adb->num_rows($mod_query)>0){ + $module_name = getTabName($adb->query_result($mod_query,0,'tabid')); + $fieldlabel = trim($fieldlist[3]); + if($module_name){ + $field_columnalias = $module_name."_".$fieldlist[3]; + } else { + $field_columnalias = $module_name."_".$fieldlist[3]; + } + } + + //$field_columnalias = $fieldlist[3]; + $field_permitted = false; + if(CheckColumnPermission($field_tablename,$field_columnname,$premod) != "false"){ + $field_permitted = true; + } else { + $mod = split(":",$secmod); + foreach($mod as $key){ + if(CheckColumnPermission($field_tablename,$field_columnname,$key) != "false"){ + $field_permitted=true; + } + } + } + if($field_permitted == true) + { + $field = $field_tablename.".".$field_columnname; + if($field_tablename == 'vtiger_products' && $field_columnname == 'unit_price') { + // Query needs to be rebuild to get the value in user preferred currency. [innerProduct and actual_unit_price are table and column alias.] + $field = " innerProduct.actual_unit_price"; + } + if($field_tablename == 'vtiger_service' && $field_columnname == 'unit_price') { + // Query needs to be rebuild to get the value in user preferred currency. [innerProduct and actual_unit_price are table and column alias.] + $field = " innerService.actual_unit_price"; + } + if(($field_tablename == 'vtiger_invoice' || $field_tablename == 'vtiger_quotes' || $field_tablename == 'vtiger_purchaseorder' || $field_tablename == 'vtiger_salesorder') + && ($field_columnname == 'total' || $field_columnname == 'subtotal' || $field_columnname == 'discount_amount' || $field_columnname == 's_h_amount')) { + $field = " $field_tablename.$field_columnname/$field_tablename.conversion_rate "; + } + if($fieldlist[4] == 2) + { + $stdfilterlist[$fieldcolname] = "sum($field) '".$field_columnalias."'"; + } + if($fieldlist[4] == 3) + { + //Fixed average calculation issue due to NULL values ie., when we use avg() function, NULL values will be ignored.to avoid this we use (sum/count) to find average. + //$stdfilterlist[$fieldcolname] = "avg(".$fieldlist[1].".".$fieldlist[2].") '".$fieldlist[3]."'"; + $stdfilterlist[$fieldcolname] = "(sum($field)/count(*)) '".$field_columnalias."'"; + } + if($fieldlist[4] == 4) + { + $stdfilterlist[$fieldcolname] = "min($field) '".$field_columnalias."'"; + } + if($fieldlist[4] == 5) + { + $stdfilterlist[$fieldcolname] = "max($field) '".$field_columnalias."'"; + } + } + } + } + // Save the information + $this->_columnstotallist = $stdfilterlist; + + $log->info("ReportRun :: Successfully returned getColumnsTotal".$reportid); + return $stdfilterlist; + } + //<<<<<>>>>>>>> + + + /** function to get query for the columns to total for the given reportid + * @ param $reportid : Type integer + * This returns columnstoTotal query for the reportid + */ + + function getColumnsToTotalColumns($reportid) + { + global $adb; + global $modules; + global $log; + + $sreportstdfiltersql = "select vtiger_reportsummary.* from vtiger_report"; + $sreportstdfiltersql .= " inner join vtiger_reportsummary on vtiger_report.reportid = vtiger_reportsummary.reportsummaryid"; + $sreportstdfiltersql .= " where vtiger_report.reportid =?"; + + $result = $adb->pquery($sreportstdfiltersql, array($reportid)); + $noofrows = $adb->num_rows($result); + + for($i=0; $i<$noofrows; $i++) + { + $fieldcolname = $adb->query_result($result,$i,"columnname"); + + if($fieldcolname != "none") + { + $fieldlist = explode(":",$fieldcolname); + if($fieldlist[4] == 2) + { + $sSQLList[] = "sum(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3]; + } + if($fieldlist[4] == 3) + { + $sSQLList[] = "avg(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3]; + } + if($fieldlist[4] == 4) + { + $sSQLList[] = "min(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3]; + } + if($fieldlist[4] == 5) + { + $sSQLList[] = "max(".$fieldlist[1].".".$fieldlist[2].") ".$fieldlist[3]; + } + } + } + if(isset($sSQLList)) + { + $sSQL = implode(",",$sSQLList); + } + $log->info("ReportRun :: Successfully returned getColumnsToTotalColumns".$reportid); + return $sSQL; + } + /** Function to convert the Report Header Names into i18n + * @param $fldname: Type Varchar + * Returns Language Converted Header Strings + **/ + function getLstringforReportHeaders($fldname) + { + global $modules,$current_language,$current_user,$app_strings; + $rep_header = ltrim(str_replace($modules," ",$fldname)); + $rep_header_temp = ereg_replace(" ","_",$rep_header); + $rep_module = ereg_replace('_'.$rep_header_temp,"",$fldname); + $temp_mod_strings = return_module_language($current_language,$rep_module); + // htmlentities should be decoded in field names (eg. &). Noticed for fields like 'Terms & Conditions', 'S&H Amount' + $rep_header = decode_html($rep_header); + $curr_symb = ""; + if(in_array($fldname, $this->convert_currency)) { + $curr_symb = " (".$app_strings['LBL_IN']." ".$current_user->currency_symbol.")"; + } + if($temp_mod_strings[$rep_header] != '') + { + $rep_header = $temp_mod_strings[$rep_header]; + } + $rep_header .=$curr_symb; + + return $rep_header; + } + + /** Function to get picklist value array based on profile + * * returns permitted fields in array format + **/ + + + function getAccessPickListValues() + { + global $adb; + global $current_user; + $id = array(getTabid($this->primarymodule)); + if($this->secondarymodule != '') + array_push($id, getTabid($this->secondarymodule)); + + $query = 'select fieldname,columnname,fieldid,fieldlabel,tabid,uitype from vtiger_field where tabid in('. generateQuestionMarks($id) .') and uitype in (15,33,55)'; //and columnname in (?)'; + $result = $adb->pquery($query, $id);//,$select_column)); + $roleid=$current_user->roleid; + $subrole = getRoleSubordinates($roleid); + if(count($subrole)> 0) + { + $roleids = $subrole; + array_push($roleids, $roleid); + } + else + { + $roleids = $roleid; + } + + $temp_status = Array(); + for($i=0;$i < $adb->num_rows($result);$i++) + { + $fieldname = $adb->query_result($result,$i,"fieldname"); + $fieldlabel = $adb->query_result($result,$i,"fieldlabel"); + $tabid = $adb->query_result($result,$i,"tabid"); + $uitype = $adb->query_result($result,$i,"uitype"); + + $fieldlabel1 = str_replace(" ","_",$fieldlabel); + $keyvalue = getTabModuleName($tabid)."_".$fieldlabel1; + $fieldvalues = Array(); + if (count($roleids) > 1) { + $mulsel="select distinct $fieldname from vtiger_$fieldname inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_$fieldname.picklist_valueid where roleid in (\"". implode($roleids,"\",\"") ."\") and picklistid in (select picklistid from vtiger_$fieldname) order by sortid asc"; + } else { + $mulsel="select distinct $fieldname from vtiger_$fieldname inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_$fieldname.picklist_valueid where roleid ='".$roleid."' and picklistid in (select picklistid from vtiger_$fieldname) order by sortid asc"; + } + if($fieldname != 'firstname') + $mulselresult = $adb->query($mulsel); + for($j=0;$j < $adb->num_rows($mulselresult);$j++) + { + $fldvalue = $adb->query_result($mulselresult,$j,$fieldname); + if(in_array($fldvalue,$fieldvalues)) continue; + $fieldvalues[] = $fldvalue; + } + $field_count = count($fieldvalues); + if( $uitype == 15 && $field_count > 0 && ($fieldname == 'taskstatus' || $fieldname == 'eventstatus')) + { + $temp_count =count($temp_status[$keyvalue]); + if($temp_count > 0) + { + for($t=0;$t < $field_count;$t++) + { + $temp_status[$keyvalue][($temp_count+$t)] = $fieldvalues[$t]; + } + $fieldvalues = $temp_status[$keyvalue]; + } + else + $temp_status[$keyvalue] = $fieldvalues; + } + + if($uitype == 33) + $fieldlists[1][$keyvalue] = $fieldvalues; + else if($uitype == 55 && $fieldname == 'salutationtype') + $fieldlists[$keyvalue] = $fieldvalues; + else if($uitype == 15) + $fieldlists[$keyvalue] = $fieldvalues; + } + return $fieldlists; + } + + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Reports/ReportSharing.php b/oss/vtiger/trunk/modules/Reports/ReportSharing.php new file mode 100644 index 00000000..17a9a606 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/ReportSharing.php @@ -0,0 +1,175 @@ +***************************/ + +require_once('Smarty_setup.php'); +require_once("data/Tracker.php"); +require_once('include/logging.php'); +require_once('include/utils/utils.php'); +require_once('modules/Reports/Reports.php'); + +global $app_strings; +global $app_list_strings; +global $mod_strings; +$current_module_strings = return_module_language($current_language, 'Reports'); +global $list_max_entries_per_page; +global $urlPrefix; + +$log = LoggerManager::getLogger('report_type'); +global $currentModule; +global $image_path; +global $theme; +global $current_user; + +$report_std_filter = new vtigerCRM_Smarty; +$report_std_filter->assign("MOD", $mod_strings); +$report_std_filter->assign("APP", $app_strings); +$report_std_filter->assign("IMAGE_PATH",$image_path); +$report_std_filter->assign("DATEFORMAT",$current_user->date_format); +$report_std_filter->assign("JS_DATEFORMAT",parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +$roleid = $current_user->column_fields['roleid']; +$user_array = getRoleAndSubordinateUsers($roleid); +$userIdStr = ""; +$userNameStr = ""; +$m=0; +foreach($user_array as $userid=>$username){ + + if($userid!=$current_user->id){ + if($m!=0){ + $userIdStr .= ","; + $userNameStr .= ","; + } + $userIdStr .="'".$userid."'"; + $userNameStr .="'".escape_single_quotes(decode_html($username))."'"; + $m++; + } +} + +require_once('include/utils/GetUserGroups.php'); +$userGroups = new GetUserGroups(); +$userGroups->getAllUserGroups($current_user->id); +$user_groups = $userGroups->user_groups; +$groupIdStr = ""; +$groupNameStr = ""; +$l=0; +foreach($user_groups as $i=>$grpid){ + $grp_details = getGroupDetails($grpid); + if($l!=0){ + $groupIdStr .= ","; + $groupNameStr .= ","; + } + $groupIdStr .= "'".$grp_details[0]."'"; + $groupNameStr .= "'".escape_single_quotes(decode_html($grp_details[1]))."'"; + $l++; +} +if(isset($_REQUEST["record"]) && $_REQUEST['record']!='') +{ + $reportid = vtlib_purify($_REQUEST["record"]); + $visiblecriteria=getVisibleCriteria($recordid); + $report_std_filter->assign("VISIBLECRITERIA", $visiblecriteria); + $member = getShareInfo($recordid); + $report_std_filter->assign("MEMBER", $member); +} else { + $visiblecriteria=getVisibleCriteria(); + $report_std_filter->assign("VISIBLECRITERIA", $visiblecriteria); +} +$report_std_filter->assign("GROUPNAMESTR", $groupNameStr); +$report_std_filter->assign("USERNAMESTR", $userNameStr); +$report_std_filter->assign("GROUPIDSTR", $groupIdStr); +$report_std_filter->assign("USERIDSTR", $userIdStr); + + +//include("modules/Reports/StandardFilter.php"); +//include("modules/Reports/AdvancedFilter.php"); + +$report_std_filter->display('ReportSharing.tpl'); + +/** Function to get visible criteria for a report + * This function accepts The reportid as an argument + * It returns a array of selected option of sharing along with other options + */ +function getVisibleCriteria($recordid='') +{ + global $mod_strings; + global $app_strings; + global $adb,$current_user; + //print_r("i am here");die; + $filter = array(); + $selcriteria = ""; + if($recordid!='') + { + $result = $adb->pquery("select sharingtype from vtiger_report where reportid=?",array($recordid)); + $selcriteria=$adb->query_result($result,0,"sharingtype"); + } + if($selcriteria == ""){ + $selcriteria = 'Public'; + } + $filter_result = $adb->query("select * from vtiger_reportfilters"); + $numrows = $adb->num_rows($filter_result); + for($j=0;$j<$numrows;$j++) + { + $filter_id = $adb->query_result($filter_result,$j,"filterid"); + $filtername = $adb->query_result($filter_result,$j,"name"); + $name=str_replace(' ','_',$filtername); + if($filtername == 'Private') { + $FilterKey='Private'; + $FilterValue=getTranslatedString('PRIVATE_FILTER'); + }elseif($filtername=='Shared') + { + $FilterKey='Shared'; + $FilterValue=getTranslatedString('SHARE_FILTER'); + }else{ + $FilterKey='Public'; + $FilterValue=getTranslatedString('PUBLIC_FILTER'); + } + if($FilterKey == $selcriteria) + { + $shtml['value'] = $FilterKey; + $shtml['text'] = $FilterValue; + $shtml['selected'] = "selected"; + }else + { + $shtml['value'] = $FilterKey; + $shtml['text'] = $FilterValue; + $shtml['selected'] = ""; + } + $filter[] = $shtml; + } + return $filter; +} + +function getShareInfo($recordid=''){ + global $adb; + $member_query = $adb->pquery("SELECT vtiger_reportsharing.setype,vtiger_users.id,vtiger_users.user_name FROM vtiger_reportsharing INNER JOIN vtiger_users on vtiger_users.id = vtiger_reportsharing.shareid WHERE vtiger_reportsharing.setype='users' AND vtiger_reportsharing.reportid = ?",array($recordid)); + $noofrows = $adb->num_rows($member_query); + if($noofrows > 0){ + for($i=0;$i<$noofrows;$i++){ + $userid = $adb->query_result($member_query,$i,'id'); + $username = $adb->query_result($member_query,$i,'user_name'); + $setype = $adb->query_result($member_query,$i,'setype'); + $member_data[] = Array('id'=>$setype."::".$userid,'name'=>$setype."::".$username); + } + } + + $member_query = $adb->pquery("SELECT vtiger_reportsharing.setype,vtiger_groups.groupid,vtiger_groups.groupname FROM vtiger_reportsharing INNER JOIN vtiger_groups on vtiger_groups.groupid = vtiger_reportsharing.shareid WHERE vtiger_reportsharing.setype='groups' AND vtiger_reportsharing.reportid = ?",array($recordid)); + $noofrows = $adb->num_rows($member_query); + if($noofrows > 0){ + for($i=0;$i<$noofrows;$i++){ + $grpid = $adb->query_result($member_query,$i,'groupid'); + $grpname = $adb->query_result($member_query,$i,'groupname'); + $setype = $adb->query_result($member_query,$i,'setype'); + $member_data[] = Array('id'=>$setype."::".$grpid,'name'=>$setype."::".$grpname); + } + } + return $member_data; +} + +?> diff --git a/oss/vtiger/trunk/modules/Reports/ReportType.php b/oss/vtiger/trunk/modules/Reports/ReportType.php new file mode 100644 index 00000000..940732d4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/ReportType.php @@ -0,0 +1,47 @@ +assign("MOD", $mod_strings); +$list_report_form->assign("APP", $app_strings); +$list_report_form->assign("IMAGE_PATH",$image_path); +if(isset($_REQUEST["record"]) && $_REQUEST['record']!='') +{ + $recordid = vtlib_purify($_REQUEST["record"]); + $oReport = new Reports($recordid); + $selectedreporttype = $oReport->reporttype; +}else +{ + $selectedreporttype = "tabular"; +} +$list_report_form->assign("REPORT_TYPE",$selectedreporttype); +$list_report_form->display("ReportsType.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Reports/Reports.js b/oss/vtiger/trunk/modules/Reports/Reports.js new file mode 100644 index 00000000..2be655c7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/Reports.js @@ -0,0 +1,794 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ +var typeofdata = new Array(); +typeofdata['V'] = ['e','n','s','ew','c','k']; +typeofdata['N'] = ['e','n','l','g','m','h']; +typeofdata['T'] = ['e','n','l','g','m','h']; +typeofdata['I'] = ['e','n','l','g','m','h']; +typeofdata['C'] = ['e','n']; +typeofdata['D'] = ['e','n','l','g','m','h']; +typeofdata['NN'] = ['e','n','l','g','m','h']; +typeofdata['E'] = ['e','n','s','ew','c','k']; + +var fLabels = new Array(); +fLabels['e'] = alert_arr.EQUALS; +fLabels['n'] = alert_arr.NOT_EQUALS_TO; +fLabels['s'] = alert_arr.STARTS_WITH; +fLabels['ew'] = alert_arr.ENDS_WITH; +fLabels['c'] = alert_arr.CONTAINS; +fLabels['k'] = alert_arr.DOES_NOT_CONTAINS; +fLabels['l'] = alert_arr.LESS_THAN; +fLabels['g'] = alert_arr.GREATER_THAN; +fLabels['m'] = alert_arr.LESS_OR_EQUALS; +fLabels['h'] = alert_arr.GREATER_OR_EQUALS; +var noneLabel; +var gcurrepfolderid=0; +function trimfValues(value) +{ + var string_array; + string_array = value.split(":"); + return string_array[4]; +} + +function updatefOptions(sel, opSelName) { + var selObj = document.getElementById(opSelName); + var fieldtype = null ; + + var currOption = selObj.options[selObj.selectedIndex]; + var currField = sel.options[sel.selectedIndex]; + + if(currField.value != null && currField.value.length != 0) + { + fieldtype = trimfValues(currField.value); + ops = typeofdata[fieldtype]; + var off = 0; + if(ops != null) + { + + var nMaxVal = selObj.length; + for(nLoop = 0; nLoop < nMaxVal; nLoop++) + { + selObj.remove(0); + } + selObj.options[0] = new Option ('None', ''); + if (currField.value == '') { + selObj.options[0].selected = true; + } + off = 1; + for (var i = 0; i < ops.length; i++) + { + var label = fLabels[ops[i]]; + if (label == null) continue; + var option = new Option (fLabels[ops[i]], ops[i]); + selObj.options[i + off] = option; + if (currOption != null && currOption.value == option.value) + { + option.selected = true; + } + } + } + }else + { + var nMaxVal = selObj.length; + for(nLoop = 0; nLoop < nMaxVal; nLoop++) + { + selObj.remove(0); + } + selObj.options[0] = new Option ('None', ''); + if (currField.value == '') { + selObj.options[0].selected = true; + } + } + +} + +// Setting cookies +function set_cookie ( name, value, exp_y, exp_m, exp_d, path, domain, secure ) +{ + var cookie_string = name + "=" + escape ( value ); + + if ( exp_y ) + { + var expires = new Date ( exp_y, exp_m, exp_d ); + cookie_string += "; expires=" + expires.toGMTString(); + } + + if ( path ) + cookie_string += "; path=" + escape ( path ); + + if ( domain ) + cookie_string += "; domain=" + escape ( domain ); + + if ( secure ) + cookie_string += "; secure"; + + document.cookie = cookie_string; +} + +// Retrieving cookies +function get_cookie ( cookie_name ) +{ + var results = document.cookie.match ( cookie_name + '=(.*?)(;|$)' ); + + if ( results ) + return ( unescape ( results[1] ) ); + else + return null; +} + + +// Delete cookies +function delete_cookie ( cookie_name ) +{ + var cookie_date = new Date ( ); // current date & time + cookie_date.setTime ( cookie_date.getTime() - 1 ); + document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString(); +} +function goToURL( url ) +{ + document.location.href = url; +} + +function invokeAction( actionName ) +{ + if( actionName == "newReport" ) + { + goToURL( "?module=Reports&action=NewReport0&return_module=Reports&return_action=index" ); + return; + } + goToURL( "/crm/ScheduleReport.do?step=showAllSchedules" ); +} +function verify_data(form) { + var isError = false; + var errorMessage = ""; + if (trim(form.folderName.value) == "") { + isError = true; + errorMessage += "\nFolder Name"; + } + // Here we decide whether to submit the form. + if (isError == true) { + alert(alert_arr.MISSING_FIELDS + errorMessage); + return false; + } + return true; +} + +function setObjects() +{ + availListObj=getObj("availList") + selectedColumnsObj=getObj("selectedColumns") + + moveupLinkObj=getObj("moveup_link") + moveupDisabledObj=getObj("moveup_disabled") + movedownLinkObj=getObj("movedown_link") + movedownDisabledObj=getObj("movedown_disabled") +} + +function addColumn() +{ + for (i=0;i -1) + { + for (i=0;i -1) { + for(var i = 0; i < oSel.options.length; ++i) { + if(oSel.options[i].selected == true && oSel.options[i].disabled == true) { + error_msg = error_msg + oSel.options[i].text+','; + error_str = true; + oSel.options[i].selected = false; + } + } + } + if(error_str) + { + error_msg = error_msg.substr(0,error_msg.length-1); + alert(alert_arr.NOT_ALLOWED_TO_EDIT_FIELDS+"\n"+error_msg); + return false; + } + else + return true; +} +function delColumn() +{ + if (selectedColumnsObj.options.selectedIndex > -1) + { + for (i=0;i < selectedColumnsObj.options.length;i++) + { + if(selectedColumnsObj.options[i].selected == true) + { + selectedColumnsObj.remove(i); + delColumn(); + } + } + } +} + +function formSelectColumnString() +{ + var selectedColStr = ""; + for (i=0;i0) + { + var prevpos=selectedColumnsObj.options.selectedIndex-1 + + if (browser_ie) + { + temp=selectedColumnsObj.options[prevpos].innerText + tempdisabled = selectedColumnsObj.options[prevpos].disabled; + selectedColumnsObj.options[prevpos].innerText=selectedColumnsObj.options[currpos].innerText + selectedColumnsObj.options[prevpos].disabled = false; + selectedColumnsObj.options[currpos].innerText=temp + selectedColumnsObj.options[currpos].disabled = tempdisabled; + } + else if (browser_nn4 || browser_nn6) + { + temp=selectedColumnsObj.options[prevpos].text + tempdisabled = selectedColumnsObj.options[prevpos].disabled; + selectedColumnsObj.options[prevpos].text=selectedColumnsObj.options[currpos].text + selectedColumnsObj.options[prevpos].disabled = false; + selectedColumnsObj.options[currpos].text=temp + selectedColumnsObj.options[currpos].disabled = tempdisabled; + } + temp=selectedColumnsObj.options[prevpos].value + selectedColumnsObj.options[prevpos].value=selectedColumnsObj.options[currpos].value + selectedColumnsObj.options[currpos].value=temp + selectedColumnsObj.options[prevpos].selected=true + selectedColumnsObj.options[currpos].selected=false + } + +} + +function moveDown() +{ + var currpos=selectedColumnsObj.options.selectedIndex + var tempdisabled= false; + for (i=0;i1) + { + moveupLinkObj.style.display=movedownLinkObj.style.display="none" + moveupDisabledObj.style.display=movedownDisabledObj.style.display="block" + } + else + { + moveupLinkObj.style.display=movedownLinkObj.style.display="block" + moveupDisabledObj.style.display=movedownDisabledObj.style.display="none" + } +} + + +function hideTabs() +{ + // Check the selected report type + var objreportType = document.forms.NewReport['reportType']; + if(objreportType[0].checked == true) objreportType = objreportType[0]; + else if(objreportType[1].checked == true) objreportType = objreportType[1]; + + if(objreportType.value == 'tabular') + { + divarray = new Array('step1','step2','step4','step5','step6'); + } + else + { + divarray = new Array('step1','step2','step3','step4','step5','step6'); + } +} + +function showSaveDialog() +{ + url = "index.php?module=Reports&action=SaveReport"; + window.open(url,"Save_Report","width=550,height=350,top=20,left=20;toolbar=no,status=no,menubar=no,directories=no,resizable=yes,scrollbar=no") +} + +function saveAndRunReport() +{ + if(selectedColumnsObj.options.length == 0) + { + alert(alert_arr.COLUMNS_CANNOT_BE_EMPTY); + return false; + } + formSelectedColumnString(); + formSelectColumnString(); + document.NewReport.submit(); +} + +function changeSteps1() +{ + if(getObj('step5').style.display != 'none') + { + var escapedOptions = new Array('account_id','contactid','contact_id','product_id','parent_id','campaignid','potential_id','assigned_user_id1','quote_id','accountname','salesorder_id','vendor_id','time_start','time_end','lastname'); + + for(var i=1;i < 6 ; i++) + { + var option_name="fcol"+i; + var option_value=getObj(option_name).value; + var option_object=getObj(option_name); + var comp_name="fop"+i; + var comp_value=getObj(comp_name).value; + var data_name="fval"+i; + var data_value=trim(getObj(data_name).value); + var collabel=''; + count=option_object.selectedIndex; + collabel=option_object.options[count].text + if(trim(option_value) != '') + { + if (!emptyCheck(comp_name,collabel+" Option","text")) + return false + } + else if(trim(data_value) != '') + { + if (!emptyCheck(option_name," Column ","text")) + return false + if (!emptyCheck(comp_name,collabel+" Option","text")) + return false + } + + if(trim(data_value) != '' && option_value != '' && comp_value != '') + { + var col=option_value.split(":"); + if(escapedOptions.indexOf(col[3]) == -1) + { + if(col[4] == 'T') + { + var datime = data_value.split(" "); + if(!re_dateValidate(datime[0],collabel+" (Current User Date Time Format)","OTH")) + return false + if(datime.length > 1) + if(!re_patternValidate(datime[1],collabel+" (Time)","TIMESECONDS")) + return false + } + else if(col[4] == 'D') + { + if(!dateValidate(data_name,collabel+" (Current User Date Format)","OTH")) + return false + }else if(col[4] == 'I') + { + if(!intValidate(data_name,collabel+" (Integer Criteria)"+i)) + return false + }else if(col[4] == 'N') + { + if (!numValidate(data_name,collabel+" (Number) ","any",true)) + return false + }else if(col[4] == 'E') + { + if (!patternValidate(data_name,collabel+" (Email Id)","EMAIL")) + return false + } + } + } + } + var date1=getObj("startdate") + var date2=getObj("enddate") + + //Added to handle yes or no for checkbox fields in reports advance filters. + for(var i=1;i<=5;i++) + { + value=trim(getObj("fval"+i).value); + option=getObj("fcol"+i).value; + if(option !="" && value !="") + { + arr=option.split(":"); + if(arr[4] == "C") + { + if(value == "1") + getObj("fval"+i).value='yes'; + else if(value =="0") + getObj("fval"+i).value='no'; + } + } + } + + + //# validation added for date field validation in final step of report creation + if ((date1.value != '') || (date2.value != '')) + { + + if(!dateValidate("startdate","Start Date","D")) + return false + + if(!dateValidate("enddate","End Date","D")) + return false + + if(! dateComparison("startdate",'Start Date',"enddate",'End Date','LE')) + return false; + } + + } if (getObj('step6').style.display != 'none') { + saveAndRunReport(); + } else { + for (i = 0; i < divarray.length; i++) { + if (getObj(divarray[i]).style.display != 'none') { + if (i == 1 && selectedColumnsObj.options.length == 0) { + alert(alert_arr.COLUMNS_CANNOT_BE_EMPTY); + return false; + } + if (divarray[i] == 'step5') { + document.getElementById("next").value = finish_text; + } + hide(divarray[i]); + show(divarray[i + 1]); + tableid = divarray[i] + 'label'; + newtableid = divarray[i + 1] + 'label'; + getObj(tableid).className = 'settingsTabList'; + getObj(newtableid).className = 'settingsTabSelected'; + document.getElementById('back_rep').disabled = false; + break; + } + + } + } +} +function changeStepsback1() +{ + if(getObj('step1').style.display != 'none') + { + document.NewReport.action.value='ReportsAjax'; + document.NewReport.file.value='NewReport0'; + document.NewReport.submit(); + }else + { + for(i = 0; i < divarray.length ;i++) + { + if(getObj(divarray[i]).style.display != 'none') + { + if(divarray[i] == 'step2' && !backwalk_flag) + { + document.getElementById('back_rep').disabled = true; + } + document.getElementById("next").value = next_text+'>'; + hide(divarray[i]); + show(divarray[i-1]); + tableid = divarray[i]+'label'; + newtableid = divarray[i-1]+'label'; + getObj(tableid).className = 'settingsTabList'; + getObj(newtableid).className = 'settingsTabSelected'; + break; + } + + } + } +} +function changeSteps() +{ + if(getObj('step1').style.display != 'none') + { + if (trim(document.NewRep.reportname.value) == "") + { + alert(alert_arr.MISSING_REPORT_NAME); + return false; + }else + { + new Ajax.Request( + 'index.php', + {queue: {position: 'end', scope: 'command'}, + method: 'post', + postBody: 'action=ReportsAjax&mode=ajax&file=CheckReport&module=Reports&check=reportCheck&reportName='+encodeURIComponent(document.NewRep.reportname.value), + onComplete: function(response) { + if(response.responseText!=0) + { + alert(alert_arr.REPORT_NAME_EXISTS); + return false; + } + else + { + hide('step1'); + show('step2'); + document.getElementById('back_rep').disabled = false; + getObj('step1label').className = 'settingsTabList'; + getObj('step2label').className = 'settingsTabSelected'; + } + + } + } + ); + + } + + } + else + { + document.NewRep.submit(); + } +} +function changeStepsback() +{ + hide('step2'); + show('step1'); + document.getElementById('back_rep').disabled = true; + getObj('step1label').className = 'settingsTabSelected'; + getObj('step2label').className = 'settingsTabList'; +} +function editReport(id) +{ + var arg = 'index.php?module=Reports&action=ReportsAjax&file=NewReport0&record='+id; + fnPopupWin(arg); +} +function CreateReport(module) +{ + var arg ='index.php?module=Reports&action=ReportsAjax&file=NewReport0&folder='+gcurrepfolderid+'&reportmodule='+module; + fnPopupWin(arg); +} +function fnPopupWin(winName){ + window.open(winName, "ReportWindow","width=790px,height=630px,scrollbars=yes"); +} +function re_dateValidate(fldval,fldLabel,type) { + if(re_patternValidate(fldval,fldLabel,"DATE")==false) + return false; + dateval=fldval.replace(/^\s+/g, '').replace(/\s+$/g, '') + + var dateelements=splitDateVal(dateval) + + dd=dateelements[0] + mm=dateelements[1] + yyyy=dateelements[2] + + if (dd<1 || dd>31 || mm<1 || mm>12 || yyyy<1 || yyyy<1000) { + alert(alert_arr.ENTER_VALID+fldLabel) + return false + } + + if ((mm==2) && (dd>29)) {//checking of no. of days in february month + alert(alert_arr.ENTER_VALID+fldLabel) + return false + } + + if ((mm==2) && (dd>28) && ((yyyy%4)!=0)) {//leap year checking + alert(alert_arr.ENTER_VALID+fldLabel) + return false + } + + switch (parseInt(mm)) { + case 2 : + case 4 : + case 6 : + case 9 : + case 11 : if (dd>30) { + alert(alert_arr.ENTER_VALID+fldLabel) + return false + } + } + + var currdate=new Date() + var chkdate=new Date() + + chkdate.setYear(yyyy) + chkdate.setMonth(mm-1) + chkdate.setDate(dd) + + if (type!="OTH") { + if (!compareDates(chkdate,fldLabel,currdate,"current date",type)) { + return false + } else return true; + } else return true; +} + +//Copied from general.js and altered some lines. becos we cant send vales to function present in general.js. it accept only field names. +function re_patternValidate(fldval,fldLabel,type) { + if (type.toUpperCase()=="DATE") {//DATE validation + + switch (userDateFormat) { + case "yyyy-mm-dd" : + var re = /^\d{4}(-)\d{1,2}\1\d{1,2}$/ + break; + case "mm-dd-yyyy" : + case "dd-mm-yyyy" : + var re = /^\d{1,2}(-)\d{1,2}\1\d{4}$/ + } + } + + + if (type.toUpperCase()=="TIMESECONDS") {//TIME validation + var re = new RegExp("^([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$"); + } + if (!re.test(fldval)) { + alert(alert_arr.ENTER_VALID + fldLabel) + return false + } + else return true +} + +//added to fix the ticket #5117 +function standardFilterDisplay() +{ + if(document.NewReport.stdDateFilterField.options.length <= 0 || (document.NewReport.stdDateFilterField.selectedIndex > -1 && document.NewReport.stdDateFilterField.options[document.NewReport.stdDateFilterField.selectedIndex].value == "Not Accessible")) + { + getObj('stdDateFilter').disabled = true; + getObj('startdate').disabled = true; getObj('enddate').disabled = true; + getObj('jscal_trigger_date_start').style.visibility="hidden"; + getObj('jscal_trigger_date_end').style.visibility="hidden"; + } + else + { + getObj('stdDateFilter').disabled = false; + getObj('startdate').disabled = false; + getObj('enddate').disabled = false; + getObj('jscal_trigger_date_start').style.visibility="visible"; + getObj('jscal_trigger_date_end').style.visibility="visible"; + } +} + + +function updateRelFieldOptions(sel, opSelName) { + var selObj = document.getElementById(opSelName); + var fieldtype = null ; + + var currOption = selObj.options[selObj.selectedIndex]; + var currField = sel.options[sel.selectedIndex]; + + if(currField.value != null && currField.value.length != 0) + { + fieldtype = trimfValues(currField.value); + ops = rel_fields[fieldtype]; + + var off = 0; + if(ops != null) + { + var nMaxVal = selObj.length; + for(nLoop = 0; nLoop < nMaxVal; nLoop++) + { + selObj.remove(0); + } + selObj.options[0] = new Option ('None', ''); + if (currField.value == '') { + selObj.options[0].selected = true; + } + off = 1; + for (var i = 0; i < ops.length; i++) + { + var field_array = ops[i].split("::"); + var label = field_array[1]; + var field = field_array[0]; + if (label == null) continue; + var option = new Option (label, field); + selObj.options[i + off] = option; + if (currOption != null && currOption.value == option.value) + { + option.selected = true; + } + } + } + }else + { + var nMaxVal = selObj.length; + for(nLoop = 0; nLoop < nMaxVal; nLoop++) + { + selObj.remove(0); + } + selObj.options[0] = new Option ('None', ''); + if (currField.value == '') { + selObj.options[0].selected = true; + } + } + +} + +function AddFieldToFilter(id, sel){ + if(trim(document.getElementById("fval"+id).value)==''){ + document.getElementById("fval"+id).value = document.getElementById("fval_"+id).value; + } else { + document.getElementById("fval"+id).value = document.getElementById("fval"+id).value+","+document.getElementById("fval_"+id).value; + } +} +function fnLoadRepValues(tab1,tab2,block1,block2){ + document.getElementById(block1).style.display='block'; + document.getElementById(block2).style.display='none'; + document.getElementById(tab1).className='dvtSelectedCell'; + document.getElementById(tab2).className='dvtUnSelectedCell'; +} diff --git a/oss/vtiger/trunk/modules/Reports/Reports.php b/oss/vtiger/trunk/modules/Reports/Reports.php new file mode 100644 index 00000000..02947316 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/Reports.php @@ -0,0 +1,1570 @@ +"equals", + "n"=>"not equal to", + "s"=>"starts with", + "ew"=>"ends with", + "c"=>"contains", + "k"=>"does not contain", + "l"=>"less than", + "g"=>"greater than", + "m"=>"less or equal", + "h"=>"greater or equal" + ); + +//$report_modules = Array('Faq','Rss','Portal','Recyclebin','Emails','Reports','Dashboard','Home','Activities' + // ); + +$old_related_modules = Array('Accounts'=>Array('Potentials','Contacts','Products','Quotes','Invoice'), + 'Contacts'=>Array('Accounts','Potentials','Quotes','PurchaseOrder'), + 'Potentials'=>Array('Accounts','Contacts','Quotes'), + 'Calendar'=>Array('Leads','Accounts','Contacts','Potentials'), + 'Products'=>Array('Accounts','Contacts'), + 'HelpDesk'=>Array('Products'), + 'Quotes'=>Array('Accounts','Contacts','Potentials'), + 'PurchaseOrder'=>Array('Contacts'), + 'Invoice'=>Array('Accounts'), + 'Campaigns'=>Array('Products'), + ); + +$related_modules =Array(); + +class Reports extends CRMEntity{ + + + + /** + * This class has the informations for Reports and inherits class CRMEntity and + * has the variables required to generate,save,restore vtiger_reports + * and also the required functions for the same + * Contributor(s): ______________________________________.. + */ + + + var $srptfldridjs; + + var $column_fields = Array(); + + var $sort_fields = Array(); + var $sort_values = Array(); + + var $id; + var $mode; + var $mcount; + + var $startdate; + var $enddate; + + var $ascdescorder; + + var $stdselectedfilter; + var $stdselectedcolumn; + + var $primodule; + var $secmodule; + var $columnssummary; + var $is_editable; + var $reporttype; + var $reportname; + var $reportdescription; + var $folderid; + var $module_blocks; + + var $pri_module_columnslist; + var $sec_module_columnslist; + + var $advft_column; + var $advft_option; + var $advft_value; + var $adv_rel_fields = Array(); + + var $module_list = Array(); + + /** Function to set primodule,secmodule,reporttype,reportname,reportdescription,folderid for given vtiger_reportid + * This function accepts the vtiger_reportid as argument + * It sets primodule,secmodule,reporttype,reportname,reportdescription,folderid for the given vtiger_reportid + */ + + function Reports($reportid="") + { + global $adb,$current_user,$theme,$mod_strings; + $this->initListOfModules(); + if($reportid != "") + { + // Lookup information in cache first + $cachedInfo = VTCacheUtils::lookupReport_Info($current_user->id, $reportid); + $subordinate_users = VTCacheUtils::lookupReport_SubordinateUsers($reportid); + + if($cachedInfo === false) { + $ssql = "select vtiger_reportmodules.*,vtiger_report.* from vtiger_report inner join vtiger_reportmodules on vtiger_report.reportid = vtiger_reportmodules.reportmodulesid"; + $ssql .= " where vtiger_report.reportid = ?"; + $params = array($reportid); + + require_once('include/utils/GetUserGroups.php'); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + $userGroups = new GetUserGroups(); + $userGroups->getAllUserGroups($current_user->id); + $user_groups = $userGroups->user_groups; + if(!empty($user_groups) && $is_admin==false){ + $user_group_query = " (shareid IN (".generateQuestionMarks($user_groups).") AND setype='groups') OR"; + array_push($params, $user_groups); + } + + $non_admin_query = " vtiger_report.reportid IN (SELECT reportid from vtiger_reportsharing WHERE $user_group_query (shareid=? AND setype='users'))"; + if($is_admin==false){ + $ssql .= " and ( (".$non_admin_query.") or vtiger_report.sharingtype='Public' or vtiger_report.owner = ? or vtiger_report.owner in(select vtiger_user2role.userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '".$current_user_parent_role_seq."::%'))"; + array_push($params, $current_user->id); + array_push($params, $current_user->id); + } + + $query = $adb->pquery("select userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '".$current_user_parent_role_seq."::%'",array()); + $subordinate_users = Array(); + for($i=0;$i<$adb->num_rows($query);$i++){ + $subordinate_users[] = $adb->query_result($query,$i,'userid'); + } + + // Update subordinate user information for re-use + VTCacheUtils::updateReport_SubordinateUsers($reportid, $subordinate_users); + + $result = $adb->pquery($ssql, $params); + if($result && $adb->num_rows($result)) { + $reportmodulesrow = $adb->fetch_array($result); + + // Update information in cache now + VTCacheUtils::updateReport_Info( + $current_user->id, $reportid, $reportmodulesrow["primarymodule"], + $reportmodulesrow["secondarymodules"], $reportmodulesrow["reporttype"], + $reportmodulesrow["reportname"], $reportmodulesrow["description"], + $reportmodulesrow["folderid"], $reportmodulesrow["owner"] + ); + } + + // Re-look at cache to maintain code-consistency below + $cachedInfo = VTCacheUtils::lookupReport_Info($current_user->id, $reportid); + } + + if($cachedInfo) { + $this->primodule = $cachedInfo["primarymodule"]; + $this->secmodule = $cachedInfo["secondarymodules"]; + $this->reporttype = $cachedInfo["reporttype"]; + $this->reportname = decode_html($cachedInfo["reportname"]); + $this->reportdescription = decode_html($cachedInfo["description"]); + $this->folderid = $cachedInfo["folderid"]; + if($is_admin==true || in_array($cachedInfo["owner"],$subordinate_users) || $cachedInfo["owner"]==$current_user->id) + $this->is_editable = 'true'; + else + $this->is_editable = 'false'; + } else { + if($_REQUEST['mode'] != 'ajax') + { + include('themes/'.$theme.'/header.php'); + } + echo "
    "; + echo "
    + + + + + + + + + +
    You are not allowed to View this Report
    + $app_strings[LBL_GO_BACK]
    +
    "; + echo "
    "; + break; + + } + } + } + + // Update the module list for listing columns for report creation. + function updateModuleList($module) { + global $adb; + if (!isset($module)) return; + require_once('include/utils/utils.php'); + $tabid = getTabid($module); + if ($module == 'Calendar') { + $tabid = array(9, 16); + } + $sql = "SELECT blockid, blocklabel FROM vtiger_blocks WHERE tabid IN (". generateQuestionMarks($tabid) .")"; + $res = $adb->pquery($sql, array($tabid)); + $noOfRows = $adb->num_rows($res); + if ($noOfRows <= 0) return; + for($index = 0; $index < $noOfRows; ++$index) { + $blockid = $adb->query_result($res,$index,'blockid'); + if(in_array($blockid, $this->module_list[$module])) continue; + $blockid_list[] = $blockid; + $blocklabel = $adb->query_result($res,$index,'blocklabel'); + $this->module_list[$module][$blocklabel] = $blockid; + } + } + + // Initializes the module list for listing columns for report creation. + function initListOfModules() { + global $adb, $current_user, $old_related_modules; + + $restricted_modules = array('Emails','Events','Webmails'); + $restricted_blocks = array('LBL_IMAGE_INFORMATION','LBL_COMMENTS','LBL_COMMENT_INFORMATION'); + + $this->module_id = array(); + $this->module_list = array(); + + // Prefetch module info to check active or not and also get list of tabs + $modulerows = vtlib_prefetchModuleActiveInfo(false); + + $cachedInfo = VTCacheUtils::lookupReport_ListofModuleInfos(); + + if($cachedInfo !== false) { + $this->module_list = $cachedInfo['module_list']; + $this->related_modules = $cachedInfo['related_modules']; + + } else { + + if($modulerows) { + foreach($modulerows as $resultrow) { + if($resultrow['presence'] == '1') continue; // skip disabled modules + if($resultrow['isentitytype'] != '1') continue; // skip extension modules + if(in_array($resultrow['name'], $restricted_modules)) { // skip restricted modules + continue; + } + if($resultrow['name']!='Calendar'){ + $this->module_id[$resultrow['tabid']] = $resultrow['name']; + } else { + $this->module_id[9] = $resultrow['name']; + $this->module_id[16] = $resultrow['name']; + + } + $this->module_list[$resultrow['name']] = array(); + } + + $moduleids = array_keys($this->module_id); + $reportblocks = + $adb->pquery("SELECT blockid, blocklabel, tabid FROM vtiger_blocks WHERE tabid IN (" .generateQuestionMarks($moduleids) .")", + array($moduleids)); + $prev_block_label = ''; + if($adb->num_rows($reportblocks)) { + while($resultrow = $adb->fetch_array($reportblocks)) { + $blockid = $resultrow['blockid']; + $blocklabel = $resultrow['blocklabel']; + $module = $this->module_id[$resultrow['tabid']]; + + if(in_array($blocklabel, $restricted_blocks) || + in_array($blockid, $this->module_list[$module]) || + isset($this->module_list[$module][getTranslatedString($blocklabel,$module)]) + ) { + continue; + } + + if(!empty($blocklabel)){ + if($module == 'Calendar' && $blocklabel == 'LBL_CUSTOM_INFORMATION') + $this->module_list[$module][$blockid] = getTranslatedString($blocklabel,$module); + else + $this->module_list[$module][$blockid] = getTranslatedString($blocklabel,$module); + $prev_block_label = $blocklabel; + } else { + $this->module_list[$module][$blockid] = getTranslatedString($prev_block_label,$module); + } + } + } + + $relatedmodules = $adb->pquery( + "SELECT vtiger_tab.name, vtiger_relatedlists.tabid FROM vtiger_tab + INNER JOIN vtiger_relatedlists on vtiger_tab.tabid=vtiger_relatedlists.related_tabid + WHERE vtiger_tab.isentitytype=1 + AND vtiger_tab.name NOT IN(".generateQuestionMarks($restricted_modules).") + AND vtiger_tab.presence=0 AND vtiger_relatedlists.label!='Activity History'", + array($restricted_modules) + ); + if($adb->num_rows($relatedmodules)) { + while($resultrow = $adb->fetch_array($relatedmodules)) { + $module = $this->module_id[$resultrow['tabid']]; + + if(!isset($this->related_modules[$module])) { + $this->related_modules[$module] = array(); + } + + if($module != $resultrow['name']) { + $this->related_modules[$module][] = $resultrow['name']; + } + + // To achieve Backward Compatability with Report relations + if(isset($old_related_modules[$module])){ + + $rel_mod = array(); + foreach($old_related_modules[$module] as $key=>$name){ + if(vtlib_isModuleActive($name) && isPermitted($name,'index','')){ + $rel_mod[] = $name; + } + } + if(!empty($rel_mod)){ + $this->related_modules[$module] = array_merge($this->related_modules[$module],$rel_mod); + $this->related_modules[$module] = array_unique($this->related_modules[$module]); + } + } + } + } + // Put the information in cache for re-use + VTCacheUtils::updateReport_ListofModuleInfos($this->module_list, $this->related_modules); + } + } + } + // END + + + /** Function to get the Listview of Reports + * This function accepts no argument + * This generate the Reports view page and returns a string + * contains HTML + */ + + function sgetRptFldr($mode='') + { + + global $adb,$log,$mod_strings; + $returndata = Array(); + $sql = "select * from vtiger_reportfolder order by folderid"; + $result = $adb->pquery($sql, array()); + $reportfldrow = $adb->fetch_array($result); + if($mode != '') + { + // Fetch detials of all reports of folder at once + $reportsInAllFolders = $this->sgetRptsforFldr(false); + + do + { + if($reportfldrow["state"] == $mode) + { + $details = Array(); + $details['state'] = $reportfldrow["state"]; + $details['id'] = $reportfldrow["folderid"]; + $details['name'] = ($mod_strings[$reportfldrow["foldername"]] == '' ) ? $reportfldrow["foldername"]:$mod_strings[$reportfldrow["foldername"]]; + $details['description'] = $reportfldrow["description"]; + $details['fname'] = popup_decode_html($details['name']); + $details['fdescription'] = popup_decode_html($reportfldrow["description"]); + $details['details'] = $reportsInAllFolders[$reportfldrow["folderid"]]; + $returndata[] = $details; + } + }while($reportfldrow = $adb->fetch_array($result)); + }else + { + do + { + $details = Array(); + $details['state'] = $reportfldrow["state"]; + $details['id'] = $reportfldrow["folderid"]; + $details['name'] = ($mod_strings[$reportfldrow["foldername"]] == '' ) ? $reportfldrow["foldername"]:$mod_strings[$reportfldrow["foldername"]]; + $details['description'] = $reportfldrow["description"]; + $details['fname'] = popup_decode_html($details['name']); + $details['fdescription'] = popup_decode_html($reportfldrow["description"]); + $returndata[] = $details; + }while($reportfldrow = $adb->fetch_array($result)); + } + + $log->info("Reports :: ListView->Successfully returned vtiger_report folder HTML"); + return $returndata; + } + + /** Function to get the Reports inside each modules + * This function accepts the folderid + * This Generates the Reports under each Reports module + * This Returns a HTML sring + */ + + function sgetRptsforFldr($rpt_fldr_id) + { + $srptdetails=""; + global $adb; + global $log; + global $mod_strings,$current_user; + $returndata = Array(); + + require_once('include/utils/UserInfoUtil.php'); + + $sql = "select vtiger_report.*, vtiger_reportmodules.*, vtiger_reportfolder.folderid from vtiger_report inner join vtiger_reportfolder on vtiger_reportfolder.folderid = vtiger_report.folderid"; + $sql .= " inner join vtiger_reportmodules on vtiger_reportmodules.reportmodulesid = vtiger_report.reportid"; + + $params = array(); + + // If information is required only for specific report folder? + if($rpt_fldr_id !== false) { + $sql .= " where vtiger_reportfolder.folderid=?"; + $params[] = $rpt_fldr_id; + } + + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require_once('include/utils/GetUserGroups.php'); + $userGroups = new GetUserGroups(); + $userGroups->getAllUserGroups($current_user->id); + $user_groups = $userGroups->user_groups; + if(!empty($user_groups) && $is_admin==false){ + $user_group_query = " (shareid IN (".generateQuestionMarks($user_groups).") AND setype='groups') OR"; + array_push($params, $user_groups); + } + + $non_admin_query = " vtiger_report.reportid IN (SELECT reportid from vtiger_reportsharing WHERE $user_group_query (shareid=? AND setype='users'))"; + if($is_admin==false){ + $sql .= " and ( (".$non_admin_query.") or vtiger_report.sharingtype='Public' or vtiger_report.owner = ? or vtiger_report.owner in(select vtiger_user2role.userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '".$current_user_parent_role_seq."::%'))"; + array_push($params, $current_user->id); + array_push($params, $current_user->id); + } + $query = $adb->pquery("select userid from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like '".$current_user_parent_role_seq."::%'",array()); + $subordinate_users = Array(); + for($i=0;$i<$adb->num_rows($query);$i++){ + $subordinate_users[] = $adb->query_result($query,$i,'userid'); + } + $result = $adb->pquery($sql, $params); + + $report = $adb->fetch_array($result); + if(count($report)>0) + { + do + { + $report_details = Array(); + $report_details ['customizable'] = $report["customizable"]; + $report_details ['reportid'] = $report["reportid"]; + $report_details ['primarymodule'] = $report["primarymodule"]; + $report_details ['secondarymodules'] = $report["secondarymodules"]; + $report_details ['state'] = $report["state"]; + $report_details ['description'] = $report["description"]; + $report_details ['reportname'] = $report["reportname"]; + $report_details ['sharingtype'] = $report["sharingtype"]; + if($is_admin==true || in_array($report["owner"],$subordinate_users) || $report["owner"]==$current_user->id) + $report_details ['editable'] = 'true'; + else + $report_details['editable'] = 'false'; + + if(isPermitted($report["primarymodule"],'index') == "yes") + $returndata [$report["folderid"]][] = $report_details; + }while($report = $adb->fetch_array($result)); + } + + if($rpt_fldr_id !== false) { + $returndata = $returndata[$rpt_fldr_id]; + } + + $log->info("Reports :: ListView->Successfully returned vtiger_report details HTML"); + return $returndata; + } + + /** Function to get the array of ids + * This function forms the array for the ExpandCollapse + * Javascript + * It returns the array of ids + * Array('1RptFldr','2RptFldr',........,'9RptFldr','10RptFldr') + */ + + function sgetJsRptFldr() + { + $srptfldr_js = "var ReportListArray=new Array(".$this->srptfldridjs.") + setExpandCollapse()"; + return $srptfldr_js; + } + + /** Function to set the Primary module vtiger_fields for the given Report + * This function sets the primary module columns for the given Report + * It accepts the Primary module as the argument and set the vtiger_fields of the module + * to the varialbe pri_module_columnslist and returns true if sucess + */ + + function getPriModuleColumnsList($module) + { + //$this->updateModuleList($module); + foreach($this->module_list[$module] as $key=>$value) + { + $temp = $this->getColumnsListbyBlock($module,$key); + if(!empty($ret_module_list[$module][$value])){ + if(!empty($temp)){ + $ret_module_list[$module][$value] = array_merge($ret_module_list[$module][$value],$temp); + } + } else { + $ret_module_list[$module][$value] = $this->getColumnsListbyBlock($module,$key); + } + } + $this->pri_module_columnslist = $ret_module_list; + return true; + } + + /** Function to set the Secondary module fileds for the given Report + * This function sets the secondary module columns for the given module + * It accepts the module as the argument and set the vtiger_fields of the module + * to the varialbe sec_module_columnslist and returns true if sucess + */ + + function getSecModuleColumnsList($module) + { + if($module != "") + { + $secmodule = explode(":",$module); + for($i=0;$i < count($secmodule) ;$i++) + { + //$this->updateModuleList($secmodule[$i]); + if($this->module_list[$secmodule[$i]]){ + foreach($this->module_list[$secmodule[$i]] as $key=>$value) + { + $temp = $this->getColumnsListbyBlock($secmodule[$i],$key); + if(!empty($ret_module_list[$secmodule[$i]][$value])){ + if(!empty($temp)){ + $ret_module_list[$secmodule[$i]][$value] = array_merge($ret_module_list[$secmodule[$i]][$value],$temp); + } + } else { + $ret_module_list[$secmodule[$i]][$value] = $this->getColumnsListbyBlock($secmodule[$i],$key); + } + } + $this->sec_module_columnslist[$secmodule[$i]] = $ret_module_list[$secmodule[$i]]; + } + } + } + return true; + } + + /** Function to get vtiger_fields for the given module and block + * This function gets the vtiger_fields for the given module + * It accepts the module and the block as arguments and + * returns the array column lists + * Array module_columnlist[ vtiger_fieldtablename:fieldcolname:module_fieldlabel1:fieldname:fieldtypeofdata]=fieldlabel + */ + + function getColumnsListbyBlock($module,$block) + { + global $adb; + global $log; + global $current_user; + + if(is_string($block)) $block = explode(",", $block); + + $tabid = getTabid($module); + if ($module == 'Calendar') { + $tabid = array('9','16'); + } + $params = array($tabid, $block); + + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + //Security Check + if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] ==0) + { + $sql = "select * from vtiger_field where vtiger_field.tabid in (". generateQuestionMarks($tabid) .") and vtiger_field.block in (". generateQuestionMarks($block) .") and vtiger_field.displaytype in (1,2,3) and vtiger_field.presence in (0,2) "; + + //fix for Ticket #4016 + if($module == "Calendar") + $sql.=" group by vtiger_field.fieldlabel order by sequence"; + else + $sql.=" order by sequence"; + } + else + { + + $profileList = getCurrentUserProfileList(); + $sql = "select * from vtiger_field inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid where vtiger_field.tabid in (". generateQuestionMarks($tabid) .") and vtiger_field.block in (". generateQuestionMarks($block) .") and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_field.presence in (0,2)"; + if (count($profileList) > 0) { + $sql .= " and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .")"; + array_push($params, $profileList); + } + + //fix for Ticket #4016 + if($module == "Calendar") + $sql.=" group by vtiger_field.fieldid,vtiger_field.fieldlabel order by sequence"; + else + $sql.=" group by vtiger_field.fieldid order by sequence"; + } + + $result = $adb->pquery($sql, $params); + $noofrows = $adb->num_rows($result); + for($i=0; $i<$noofrows; $i++) + { + $fieldtablename = $adb->query_result($result,$i,"tablename"); + $fieldcolname = $adb->query_result($result,$i,"columnname"); + $fieldname = $adb->query_result($result,$i,"fieldname"); + $fieldtype = $adb->query_result($result,$i,"typeofdata"); + $uitype = $adb->query_result($result,$i,"uitype"); + $fieldtype = explode("~",$fieldtype); + $fieldtypeofdata = $fieldtype[0]; + + //Here we Changing the displaytype of the field. So that its criteria will be displayed correctly in Reports Advance Filter. + $fieldtypeofdata=ChangeTypeOfData_Filter($fieldtablename,$fieldcolname,$fieldtypeofdata); + + if($uitype == 68 || $uitype == 59) + { + $fieldtypeofdata = 'V'; + } + if($fieldtablename == "vtiger_crmentity") + { + $fieldtablename = $fieldtablename.$module; + } + if($fieldname == "assigned_user_id") + { + $fieldtablename = "vtiger_users".$module; + $fieldcolname = "user_name"; + } + if($fieldname == "account_id") + { + $fieldtablename = "vtiger_account".$module; + $fieldcolname = "accountname"; + } + if($fieldname == "contact_id") + { + $fieldtablename = "vtiger_contactdetails".$module; + $fieldcolname = "lastname"; + } + if($fieldname == "parent_id") + { + $fieldtablename = "vtiger_crmentityRel".$module; + $fieldcolname = "setype"; + } + if($fieldname == "vendor_id") + { + $fieldtablename = "vtiger_vendorRel".$module; + $fieldcolname = "vendorname"; + } + if($fieldname == "potential_id") + { + $fieldtablename = "vtiger_potentialRel".$module; + $fieldcolname = "potentialname"; + } + if($fieldname == "assigned_user_id1") + { + $fieldtablename = "vtiger_usersRel1"; + $fieldcolname = "user_name"; + } + if($fieldname == 'quote_id') + { + $fieldtablename = "vtiger_quotes".$module; + $fieldcolname = "subject"; + } + + $product_id_tables = array( + "vtiger_troubletickets"=>"vtiger_productsRel", + "vtiger_campaign"=>"vtiger_productsCampaigns", + "vtiger_faq"=>"vtiger_productsFaq", + ); + if($fieldname == 'product_id' && isset($product_id_tables[$fieldtablename])) + { + $fieldtablename = $product_id_tables[$fieldtablename]; + $fieldcolname = "productname"; + } + if($fieldname == 'campaignid' && $module=='Potentials') + { + $fieldtablename = "vtiger_campaign".$module; + $fieldcolname = "campaignname"; + } + if($fieldname == 'currency_id' && $fieldtablename=='vtiger_pricebook') + { + $fieldtablename = "vtiger_currency_info".$module; + $fieldcolname = "currency_name"; + } + + $fieldlabel = $adb->query_result($result,$i,"fieldlabel"); + $fieldlabel1 = str_replace(" ","_",$fieldlabel); + $optionvalue = $fieldtablename.":".$fieldcolname.":".$module."_".$fieldlabel1.":".$fieldname.":".$fieldtypeofdata; + $this->adv_rel_fields[$fieldtypeofdata][] = '$'.$module.'#'.$fieldname.'$'."::".getTranslatedString($module,$module)." ".$fieldlabel; + //added to escape attachments fields in Reports as we have multiple attachments + if($module != 'HelpDesk' || $fieldname !='filename') + $module_columnlist[$optionvalue] = $fieldlabel; + } + $log->info("Reports :: FieldColumns->Successfully returned ColumnslistbyBlock".$module.$block); + return $module_columnlist; + } + + /** Function to set the standard filter vtiger_fields for the given vtiger_report + * This function gets the standard filter vtiger_fields for the given vtiger_report + * and set the values to the corresponding variables + * It accepts the repordid as argument + */ + + function getSelectedStandardCriteria($reportid) + { + global $adb; + $sSQL = "select vtiger_reportdatefilter.* from vtiger_reportdatefilter inner join vtiger_report on vtiger_report.reportid = vtiger_reportdatefilter.datefilterid where vtiger_report.reportid=?"; + $result = $adb->pquery($sSQL, array($reportid)); + $selectedstdfilter = $adb->fetch_array($result); + + $this->stdselectedcolumn = $selectedstdfilter["datecolumnname"]; + $this->stdselectedfilter = $selectedstdfilter["datefilter"]; + + if($selectedstdfilter["datefilter"] == "custom") + { + if($selectedstdfilter["startdate"] != "0000-00-00") + { + $this->startdate = $selectedstdfilter["startdate"]; + } + if($selectedstdfilter["enddate"] != "0000-00-00") + { + $this->enddate = $selectedstdfilter["enddate"]; + } + } + } + + /** Function to get the combo values for the standard filter + * This function get the combo values for the standard filter for the given vtiger_report + * and return a HTML string + */ + + function getSelectedStdFilterCriteria($selecteddatefilter = "") + { + global $mod_strings; + + $datefiltervalue = Array("custom","prevfy","thisfy","nextfy","prevfq","thisfq","nextfq", + "yesterday","today","tomorrow","lastweek","thisweek","nextweek","lastmonth","thismonth", + "nextmonth","last7days","last30days", "last60days","last90days","last120days", + "next30days","next60days","next90days","next120days" + ); + + $datefilterdisplay = Array("Custom","Previous FY", "Current FY","Next FY","Previous FQ","Current FQ","Next FQ","Yesterday", + "Today","Tomorrow","Last Week","Current Week","Next Week","Last Month","Current Month", + "Next Month","Last 7 Days","Last 30 Days","Last 60 Days","Last 90 Days","Last 120 Days", + "Next 7 Days","Next 30 Days","Next 60 Days","Next 90 Days","Next 120 Days" + ); + + for($i=0;$i".$mod_strings[$datefilterdisplay[$i]].""; + }else + { + $sshtml .= ""; + } + } + + return $sshtml; + } + + /** Function to get the selected standard filter columns + * This function returns the selected standard filter criteria + * which is selected for vtiger_reports as an array + * Array stdcriteria_list[fieldtablename:fieldcolname:module_fieldlabel1]=fieldlabel + */ + + function getStdCriteriaByModule($module) + { + global $adb; + global $log; + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + + $tabid = getTabid($module); + foreach($this->module_list[$module] as $key=>$blockid) + { + $blockids[] = $blockid; + } + $blockids = implode(",",$blockids); + + $params = array($tabid, $blockids); + if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0) + { + //uitype 6 and 23 added for start_date,EndDate,Expected Close Date + $sql = "select * from vtiger_field where vtiger_field.tabid=? and (vtiger_field.uitype =5 or vtiger_field.uitype = 6 or vtiger_field.uitype = 23 or vtiger_field.displaytype=2) and vtiger_field.block in (". generateQuestionMarks($block) .") and vtiger_field.presence in (0,2) order by vtiger_field.sequence"; + } + else + { + $profileList = getCurrentUserProfileList(); + $sql = "select * from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid where vtiger_field.tabid=? and (vtiger_field.uitype =5 or vtiger_field.displaytype=2) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_field.block in (". generateQuestionMarks($block) .") and vtiger_field.presence in (0,2)"; + if (count($profileList) > 0) { + $sql .= " and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .")"; + array_push($params, $profileList); + } + $sql .= " order by vtiger_field.sequence"; + } + + $result = $adb->pquery($sql, $params); + + while($criteriatyperow = $adb->fetch_array($result)) + { + $fieldtablename = $criteriatyperow["tablename"]; + $fieldcolname = $criteriatyperow["columnname"]; + $fieldlabel = $criteriatyperow["fieldlabel"]; + + if($fieldtablename == "vtiger_crmentity") + { + $fieldtablename = $fieldtablename.$module; + } + $fieldlabel1 = str_replace(" ","_",$fieldlabel); + $optionvalue = $fieldtablename.":".$fieldcolname.":".$module."_".$fieldlabel1; + $stdcriteria_list[$optionvalue] = $fieldlabel; + } + + $log->info("Reports :: StdfilterColumns->Successfully returned Stdfilter for".$module); + return $stdcriteria_list; + + } + + /** Function to form a javascript to determine the start date and end date for a standard filter + * This function is to form a javascript to determine + * the start date and End date from the value selected in the combo lists + */ + + function getCriteriaJS() + { + $today = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d"), date("Y"))); + $tomorrow = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+1, date("Y"))); + $yesterday = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-1, date("Y"))); + + $currentmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m"), "01", date("Y"))); + $currentmonth1 = date("Y-m-t"); + $lastmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")-1, "01", date("Y"))); + $lastmonth1 = date("Y-m-t", strtotime("-1 Month")); + $nextmonth0 = date("Y-m-d",mktime(0, 0, 0, date("m")+1, "01", date("Y"))); + $nextmonth1 = date("Y-m-t", strtotime("+1 Month")); + + $lastweek0 = date("Y-m-d",strtotime("-2 week Sunday")); + $lastweek1 = date("Y-m-d",strtotime("-1 week Saturday")); + + $thisweek0 = date("Y-m-d",strtotime("-1 week Sunday")); + $thisweek1 = date("Y-m-d",strtotime("this Saturday")); + + $nextweek0 = date("Y-m-d",strtotime("this Sunday")); + $nextweek1 = date("Y-m-d",strtotime("+1 week Saturday")); + + $next7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+6, date("Y"))); + $next30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+29, date("Y"))); + $next60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+59, date("Y"))); + $next90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+89, date("Y"))); + $next120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")+119, date("Y"))); + + $last7days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-6, date("Y"))); + $last30days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-29, date("Y"))); + $last60days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-59, date("Y"))); + $last90days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-89, date("Y"))); + $last120days = date("Y-m-d",mktime(0, 0, 0, date("m") , date("d")-119, date("Y"))); + + $currentFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y"))); + $currentFY1 = date("Y-m-t",mktime(0, 0, 0, "12", date("d"), date("Y"))); + $lastFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")-1)); + $lastFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")-1)); + $nextFY0 = date("Y-m-d",mktime(0, 0, 0, "01", "01", date("Y")+1)); + $nextFY1 = date("Y-m-t", mktime(0, 0, 0, "12", date("d"), date("Y")+1)); + + if(date("m") <= 3) + { + $cFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y"))); + $nFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y"))); + $pFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y")-1)); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y")-1)); + }else if(date("m") > 3 and date("m") <= 6) + { + $pFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y"))); + $nFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y"))); + + }else if(date("m") > 6 and date("m") <= 9) + { + $nFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y"))); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y"))); + $pFq = date("Y-m-d",mktime(0, 0, 0, "04","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "06","30",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y"))); + } + else if(date("m") > 9 and date("m") <= 12) + { + $nFq = date("Y-m-d",mktime(0, 0, 0, "01","01",date("Y")+1)); + $nFq1 = date("Y-m-d",mktime(0, 0, 0, "03","31",date("Y")+1)); + $pFq = date("Y-m-d",mktime(0, 0, 0, "07","01",date("Y"))); + $pFq1 = date("Y-m-d",mktime(0, 0, 0, "09","30",date("Y"))); + $cFq = date("Y-m-d",mktime(0, 0, 0, "10","01",date("Y"))); + $cFq1 = date("Y-m-d",mktime(0, 0, 0, "12","31",date("Y"))); + + } + + $sjsStr = ''; + + return $sjsStr; + } +function getEscapedColumns($selectedfields) + { + $fieldname = $selectedfields[3]; + if($fieldname == "parent_id") + { + if($this->primarymodule == "HelpDesk" && $selectedfields[0] == "vtiger_crmentityRelHelpDesk") + { + $querycolumn = "case vtiger_crmentityRelHelpDesk.setype when 'Accounts' then vtiger_accountRelHelpDesk.accountname when 'Contacts' then vtiger_contactdetailsRelHelpDesk.lastname End"." '".$selectedfields[2]."', vtiger_crmentityRelHelpDesk.setype 'Entity_type'"; + return $querycolumn; + } + if($this->primarymodule == "Products" || $this->secondarymodule == "Products") + { + $querycolumn = "case vtiger_crmentityRelProducts.setype when 'Accounts' then vtiger_accountRelProducts.accountname when 'Leads' then vtiger_leaddetailsRelProducts.lastname when 'Potentials' then vtiger_potentialRelProducts.potentialname End"." '".$selectedfields[2]."', vtiger_crmentityRelProducts.setype 'Entity_type'"; + } + if($this->primarymodule == "Calendar" || $this->secondarymodule == "Calendar") + { + $querycolumn = "case vtiger_crmentityRelCalendar.setype when 'Accounts' then vtiger_accountRelCalendar.accountname when 'Leads' then vtiger_leaddetailsRelCalendar.lastname when 'Potentials' then vtiger_potentialRelCalendar.potentialname when 'Quotes' then vtiger_quotesRelCalendar.subject when 'PurchaseOrder' then vtiger_purchaseorderRelCalendar.subject when 'Invoice' then vtiger_invoiceRelCalendar.subject End"." '".$selectedfields[2]."', vtiger_crmentityRelCalendar.setype 'Entity_type'"; + } + } + return $querycolumn; + } + function getaccesfield($module) + { + global $current_user; + global $adb; + $access_fields = Array(); + + $profileList = getCurrentUserProfileList(); + $query = "select vtiger_field.fieldname from vtiger_field inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid where"; + $params = array(); + if($module == "Calendar") + { + $query .= " vtiger_field.tabid in (9,16) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_field.presence in (0,2)"; + if (count($profileList) > 0) { + $query .= " and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .")"; + array_push($params, $profileList); + } + $query .= " group by vtiger_field.fieldid order by block,sequence"; + } + else + { + array_push($params, $this->primodule, $this->secmodule); + $query .= " vtiger_field.tabid in (select tabid from vtiger_tab where vtiger_tab.name in (?,?)) and vtiger_field.displaytype in (1,2,3) and vtiger_profile2field.visible=0 and vtiger_def_org_field.visible=0 and vtiger_field.presence in (0,2)"; + if (count($profileList) > 0) { + $query .= " and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .")"; + array_push($params, $profileList); + } + $query .= " group by vtiger_field.fieldid order by block,sequence"; + } + $result = $adb->pquery($query, $params); + + + while($collistrow = $adb->fetch_array($result)) + { + $access_fields[] = $collistrow["fieldname"]; + } + return $access_fields; + } + + /** Function to set the order of grouping and to find the columns responsible + * to the grouping + * This function accepts the vtiger_reportid as variable,sets the variable ascdescorder[] to the sort order and + * returns the array array_list which has the column responsible for the grouping + * Array array_list[0]=columnname + */ + + + function getSelctedSortingColumns($reportid) + { + + global $adb; + global $log; + + $sreportsortsql = "select vtiger_reportsortcol.* from vtiger_report"; + $sreportsortsql .= " inner join vtiger_reportsortcol on vtiger_report.reportid = vtiger_reportsortcol.reportid"; + $sreportsortsql .= " where vtiger_report.reportid =? order by vtiger_reportsortcol.sortcolid"; + + $result = $adb->pquery($sreportsortsql, array($reportid)); + $noofrows = $adb->num_rows($result); + + for($i=0; $i<$noofrows; $i++) + { + $fieldcolname = $adb->query_result($result,$i,"columnname"); + $sort_values = $adb->query_result($result,$i,"sortorder"); + $this->ascdescorder[] = $sort_values; + $array_list[] = $fieldcolname; + } + + $log->info("Reports :: Successfully returned getSelctedSortingColumns"); + return $array_list; + } + + /** Function to get the selected columns list for a selected vtiger_report + * This function accepts the vtiger_reportid as the argument and get the selected columns + * for the given vtiger_reportid and it forms a combo lists and returns + * HTML of the combo values + */ + + function getSelectedColumnsList($reportid) + { + global $adb; + global $modules; + global $log,$current_user; + + $ssql = "select vtiger_selectcolumn.* from vtiger_report inner join vtiger_selectquery on vtiger_selectquery.queryid = vtiger_report.queryid"; + $ssql .= " left join vtiger_selectcolumn on vtiger_selectcolumn.queryid = vtiger_selectquery.queryid"; + $ssql .= " where vtiger_report.reportid = ?"; + $ssql .= " order by vtiger_selectcolumn.columnindex"; + $result = $adb->pquery($ssql, array($reportid)); + $permitted_fields = Array(); + + $selected_mod = split(":",$this->secmodule); + array_push($selected_mod,$this->primodule); + + while($columnslistrow = $adb->fetch_array($result)) + { + $fieldname =""; + $fieldcolname = $columnslistrow["columnname"]; + + $selmod_field_disabled = true; + foreach($selected_mod as $smod){ + if((stripos($fieldcolname,":".$smod."_")>-1) && vtlib_isModuleActive($smod)){ + $selmod_field_disabled = false; + break; + } + } + if($selmod_field_disabled==false){ + list($tablename,$colname,$module_field,$fieldname,$single) = split(":",$fieldcolname); + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + list($module,$field) = split("_",$module_field); + if(sizeof($permitted_fields) == 0 && $is_admin == false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1) + { + $permitted_fields = $this->getaccesfield($module); + } + $querycolumns = $this->getEscapedColumns($selectedfields); + $fieldlabel = trim(str_replace($module," ",$module_field)); + $mod_arr=explode('_',$fieldlabel); + $mod = ($mod_arr[0] == '')?$module:$mod_arr[0]; + $fieldlabel = trim(str_replace("_"," ",$fieldlabel)); + //modified code to support i18n issue + $mod_lbl = getTranslatedString($mod,$module); //module + $fld_lbl = getTranslatedString($fieldlabel,$module); //fieldlabel + $fieldlabel = $mod_lbl." ".$fld_lbl; + if(CheckFieldPermission($fieldname,$mod) != 'true' && $colname!="crmid") + { + $shtml .= ""; + } + else + { + $shtml .= ""; + } + } + //end + } + $log->info("ReportRun :: Successfully returned getQueryColumnsList".$reportid); + return $shtml; + } + function getAdvancedFilterList($reportid) + { + global $adb; + global $modules; + global $log; + $ssql = 'select vtiger_relcriteria.* from vtiger_report inner join vtiger_relcriteria on vtiger_relcriteria.queryid = vtiger_report.queryid left join vtiger_selectquery on vtiger_relcriteria.queryid = vtiger_selectquery.queryid'; + $ssql.= " where vtiger_report.reportid = ? order by vtiger_relcriteria.columnindex"; + + $result = $adb->pquery($ssql, array($reportid)); + + while($relcriteriarow = $adb->fetch_array($result)) + { + $this->advft_column[] = $relcriteriarow["columnname"]; + $this->advft_option[] = $relcriteriarow["comparator"]; + $advfilterval = $relcriteriarow["value"]; + $col = explode(":",$relcriteriarow["columnname"]); + $temp_val = explode(",",$relcriteriarow["value"]); + if($col[4] == 'D' || ($col[4] == 'T' && $col[1] != 'time_start' && $col[1] != 'time_end') || ($col[4] == 'DT')) + { + $val = Array(); + for($x=0;$xadvft_value[] = $advfilterval; + } + $log->info("Reports :: Successfully returned getAdvancedFilterList"); + return true; + } + //<<<<<<<>>>>>>>>>>>>> + + /** Function to get the list of vtiger_report folders when Save and run the vtiger_report + * This function gets the vtiger_report folders from database and form + * a combo values of the folders and return + * HTML of the combo values + */ + + function sgetRptFldrSaveReport() + { + global $adb; + global $log; + + $sql = "select * from vtiger_reportfolder order by folderid"; + $result = $adb->pquery($sql, array()); + $reportfldrow = $adb->fetch_array($result); + $x = 0; + do + { + $shtml .= ""; + }while($reportfldrow = $adb->fetch_array($result)); + + $log->info("Reports :: Successfully returned sgetRptFldrSaveReport"); + return $shtml; + } + + /** Function to get the column to total vtiger_fields in Reports + * This function gets columns to total vtiger_field + * and generated the html for that vtiger_fields + * It returns the HTML of the vtiger_fields along with the check boxes + */ + + function sgetColumntoTotal($primarymodule,$secondarymodule) + { + $options = Array(); + $options []= $this->sgetColumnstoTotalHTML($primarymodule,0); + if(!empty($secondarymodule)) + { + //$secondarymodule = explode(":",$secondarymodule); + for($i=0;$i < count($secondarymodule) ;$i++) + { + $options []= $this->sgetColumnstoTotalHTML($secondarymodule[$i],($i+1)); + } + } + return $options; + } + + /** Function to get the selected columns of total vtiger_fields in Reports + * This function gets selected columns of total vtiger_field + * and generated the html for that vtiger_fields + * It returns the HTML of the vtiger_fields along with the check boxes + */ + + + function sgetColumntoTotalSelected($primarymodule,$secondarymodule,$reportid) + { + global $adb; + global $log; + $options = Array(); + if($reportid != "") + { + $ssql = "select vtiger_reportsummary.* from vtiger_reportsummary inner join vtiger_report on vtiger_report.reportid = vtiger_reportsummary.reportsummaryid where vtiger_report.reportid=?"; + $result = $adb->pquery($ssql, array($reportid)); + if($result) + { + $reportsummaryrow = $adb->fetch_array($result); + + do + { + $this->columnssummary[] = $reportsummaryrow["columnname"]; + + }while($reportsummaryrow = $adb->fetch_array($result)); + } + } + $options []= $this->sgetColumnstoTotalHTML($primarymodule,0); + if($secondarymodule != "") + { + $secondarymodule = explode(":",$secondarymodule); + for($i=0;$i < count($secondarymodule) ;$i++) + { + $options []= $this->sgetColumnstoTotalHTML($secondarymodule[$i],($i+1)); + } + } + + $log->info("Reports :: Successfully returned sgetColumntoTotalSelected"); + return $options; + + } + + /** Function to form the HTML for columns to total + * This function formulates the HTML format of the + * vtiger_fields along with four checkboxes + * It returns the HTML of the vtiger_fields along with the check boxes + */ + + + function sgetColumnstoTotalHTML($module) + { + //retreive the vtiger_tabid + global $adb; + global $log; + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + $tabid = getTabid($module); + $escapedchars = Array('_SUM','_AVG','_MIN','_MAX'); + $sparams = array($tabid); + if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] ==0) + { + $ssql = "select * from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid where vtiger_field.uitype != 50 and vtiger_field.tabid=? and vtiger_field.displaytype in (1,2,3) and vtiger_field.presence in (0,2) "; + } + else + { + $profileList = getCurrentUserProfileList(); + $ssql = "select * from vtiger_field inner join vtiger_tab on vtiger_tab.tabid = vtiger_field.tabid inner join vtiger_def_org_field on vtiger_def_org_field.fieldid=vtiger_field.fieldid inner join vtiger_profile2field on vtiger_profile2field.fieldid=vtiger_field.fieldid where vtiger_field.uitype != 50 and vtiger_field.tabid=? and vtiger_field.displaytype in (1,2,3) and vtiger_def_org_field.visible=0 and vtiger_profile2field.visible=0 and vtiger_field.presence in (0,2)"; + if (count($profileList) > 0) { + $ssql .= " and vtiger_profile2field.profileid in (". generateQuestionMarks($profileList) .")"; + array_push($sparams, $profileList); + } + } + + //Added to avoid display the Related fields (Account name,Vandor name,product name, etc) in Report Calculations(SUM,AVG..) + switch($tabid) + { + case 2://Potentials + //ie. Campaign name will not displayed in Potential's report calcullation + $ssql.= " and vtiger_field.fieldname not in ('campaignid')"; + break; + case 4://Contacts + $ssql.= " and vtiger_field.fieldname not in ('account_id')"; + break; + case 6://Accounts + $ssql.= " and vtiger_field.fieldname not in ('account_id')"; + break; + case 9://Calandar + $ssql.= " and vtiger_field.fieldname not in ('parent_id','contact_id')"; + break; + case 13://Trouble tickets(HelpDesk) + $ssql.= " and vtiger_field.fieldname not in ('parent_id','product_id')"; + break; + case 14://Products + $ssql.= " and vtiger_field.fieldname not in ('vendor_id','product_id')"; + break; + case 20://Quotes + $ssql.= " and vtiger_field.fieldname not in ('potential_id','assigned_user_id1','account_id')"; + break; + case 21://Purchase Order + $ssql.= " and vtiger_field.fieldname not in ('contact_id','vendor_id')"; + break; + case 22://SalesOrder + $ssql.= " and vtiger_field.fieldname not in ('potential_id','account_id','contact_id','quote_id')"; + break; + case 23://Invoice + $ssql.= " and vtiger_field.fieldname not in ('salesorder_id','contact_id','account_id')"; + break; + case 26://Campaings + $ssql.= " and vtiger_field.fieldname not in ('product_id')"; + break; + + } + + $ssql.= " order by sequence"; + + $result = $adb->pquery($ssql, $sparams); + $columntototalrow = $adb->fetch_array($result); + $options_list = Array(); + do + { + $typeofdata = explode("~",$columntototalrow["typeofdata"]); + + if($typeofdata[0] == "N" || $typeofdata[0] == "I") + { + $options = Array(); + if(isset($this->columnssummary)) + { + $selectedcolumn = ""; + $selectedcolumn1 = ""; + + for($i=0;$i < count($this->columnssummary) ;$i++) + { + $selectedcolumnarray = explode(":",$this->columnssummary[$i]); + $selectedcolumn = $selectedcolumnarray[1].":".$selectedcolumnarray[2].":". + str_replace($escapedchars,"",$selectedcolumnarray[3]); + + if ($selectedcolumn != $columntototalrow['tablename'].':'.$columntototalrow['columnname'].':'.str_replace(" ","_",$columntototalrow['fieldlabel'])) + { + $selectedcolumn = ""; + }else + { + $selectedcolumn1[$selectedcolumnarray[4]] = $this->columnssummary[$i]; + } + + } + if(isset($_REQUEST["record"]) && $_REQUEST["record"] != '') + { + $options['label'][] = getTranslatedString($columntototalrow['tablabel'],$columntototalrow['tablabel']).' -'.getTranslatedString($columntototalrow['fieldlabel'],$columntototalrow['tablabel']); + } + + $columntototalrow['fieldlabel'] = str_replace(" ","_",$columntototalrow['fieldlabel']); + $options []= getTranslatedString($columntototalrow['tablabel'],$columntototalrow['tablabel']).' - '.getTranslatedString($columntototalrow['fieldlabel'],$columntototalrow['tablabel']); + if($selectedcolumn1[2] == "cb:".$columntototalrow['tablename'].':'.$columntototalrow['columnname'].':'.$columntototalrow['fieldlabel']."_SUM:2") + { + $options []= ''; + }else + { + $options []= ''; + } + if($selectedcolumn1[3] == "cb:".$columntototalrow['tablename'].':'.$columntototalrow['columnname'].':'.$columntototalrow['fieldlabel']."_AVG:3") + { + $options []= ''; + }else + { + $options []= ''; + } + + if($selectedcolumn1[4] == "cb:".$columntototalrow['tablename'].':'.$columntototalrow['columnname'].':'.$columntototalrow['fieldlabel']."_MIN:4") + { + $options []= ''; + }else + { + $options []= ''; + } + + if($selectedcolumn1[5] == "cb:".$columntototalrow['tablename'].':'.$columntototalrow['columnname'].':'.$columntototalrow['fieldlabel']."_MAX:5") + { + $options []= ''; + }else + { + $options []= ''; + } + }else + { + $options []= getTranslatedString($columntototalrow['tablabel'],$columntototalrow['tablabel']).' - '.getTranslatedString($columntototalrow['fieldlabel'],$columntototalrow['tablabel']); + $options []= ''; + $options []= ''; + $options []= ''; + $options [] =''; + } + $options_list [] = $options; + } + }while($columntototalrow = $adb->fetch_array($result)); + + $log->info("Reports :: Successfully returned sgetColumnstoTotalHTML"); + return $options_list; + } +} + +/** Function to get the primary module list in vtiger_reports + * This function generates the list of primary modules in vtiger_reports + * and returns an array of permitted modules + */ + +function getReportsModuleList($focus) +{ + global $adb; + global $app_list_strings; + //global $report_modules; + global $mod_strings; + $modules = Array(); + foreach($focus->module_list as $key=>$value) + { + if(isPermitted($key,'index') == "yes") + { + $count_flag = 1; + $modules [$key] = getTranslatedString($key,$key); + } + } + return $modules; +} +/** Function to get the Related module list in vtiger_reports + * This function generates the list of secondary modules in vtiger_reports + * and returns the related module as an Array + */ + +function getReportRelatedModules($module,$focus) +{ + global $app_list_strings; + global $related_modules; + global $mod_strings; + $optionhtml = Array(); + if(vtlib_isModuleActive($module)){ + if(!empty($focus->related_modules[$module])) { + foreach($focus->related_modules[$module] as $rel_modules) + { + if(isPermitted($rel_modules,'index') == "yes") + { + $optionhtml []= $rel_modules; + } + } + } + } + + + return $optionhtml; +} + + +?> diff --git a/oss/vtiger/trunk/modules/Reports/ReportsAjax.php b/oss/vtiger/trunk/modules/Reports/ReportsAjax.php new file mode 100644 index 00000000..47722722 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/ReportsAjax.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Reports/Save.php b/oss/vtiger/trunk/modules/Reports/Save.php new file mode 100644 index 00000000..8c2a544b --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/Save.php @@ -0,0 +1,370 @@ +>>>>>>>> +$selectedcolumnstring = $_REQUEST["selectedColumnsString"]; +//<<<<<<>>>>>>>> + +//<<<<<<>>>>>>>> +$sort_by1 = vtlib_purify($_REQUEST["Group1"]); +$sort_order1 = vtlib_purify($_REQUEST["Sort1"]); +$sort_by2 = vtlib_purify($_REQUEST["Group2"]); +$sort_order2 = vtlib_purify($_REQUEST["Sort2"]); +$sort_by3 = vtlib_purify($_REQUEST["Group3"]); +$sort_order3 = vtlib_purify($_REQUEST["Sort3"]); +//<<<<<<>>>>>>>> +$selectedcolumns = explode(";",$selectedcolumnstring); +if(!in_array($sort_by1,$selectedcolumns)){ + $selectedcolumns[] = $sort_by1; +} +if(!in_array($sort_by2,$selectedcolumns)){ + $selectedcolumns[] = $sort_by2; +} +if(!in_array($sort_by3,$selectedcolumns)){ + $selectedcolumns[] = $sort_by3; +} +//<<<<<<>>>>>>>> +$pmodule = vtlib_purify($_REQUEST["primarymodule"]); +$smodule = vtlib_purify($_REQUEST["secondarymodule"]); +//<<<<<<>>>>>>>> + +//<<<<<<>>>>>>>> +$reportname = vtlib_purify($_REQUEST["reportName"]); +$reportdescription = vtlib_purify($_REQUEST["reportDesc"]); +$reporttype = vtlib_purify($_REQUEST["reportType"]); +$folderid = vtlib_purify($_REQUEST["folder"]); +//<<<<<<>>>>>>>> + +//<<<<<<>>>>>>>> +$stdDateFilterField = vtlib_purify($_REQUEST["stdDateFilterField"]); +$stdDateFilter = vtlib_purify($_REQUEST["stdDateFilter"]); +$startdate = getDBInsertDateValue($_REQUEST["startdate"]); +$enddate = getDBInsertDateValue($_REQUEST["enddate"]); +//<<<<<<>>>>>>>> + +//<<<<<<>>>>>>>> +$sharetype = vtlib_purify($_REQUEST["stdtypeFilter"]); +$shared_entities = vtlib_purify($_REQUEST["selectedColumnsStr"]); +//<<<<<<>>>>>>>> + +//<<<<<<>>>>>>>>> +$allKeys = array_keys($_REQUEST); +for ($i=0;$i>>>>>>>> + +//<<<<<<>>>>>>> +//$adv_filter_col = "kcol"; +//$allKeys = array_keys($HTTP_POST_VARS); +$allKeys = array_keys($_REQUEST); +for ($i=0;$i>>>>>>> +if($reportid == "") +{ + $genQueryId = $adb->getUniqueID("vtiger_selectquery"); + if($genQueryId != "") + { + $iquerysql = "insert into vtiger_selectquery (QUERYID,STARTINDEX,NUMOFOBJECTS) values (?,?,?)"; + $iquerysqlresult = $adb->pquery($iquerysql, array($genQueryId,0,0)); + $log->info("Reports :: Save->Successfully saved vtiger_selectquery"); + if($iquerysqlresult!=false) + { + //<<<>>>>>>> + if(!empty($selectedcolumns)) + { + for($i=0 ;$ipquery($icolumnsql, array($genQueryId,$i,$selectedcolumns[$i])); + } + } + } + if($shared_entities != "") + { + if($sharetype == "Shared") + { + $selectedcolumn = explode(";",$shared_entities); + for($i=0 ;$i< count($selectedcolumn) -1 ;$i++) + { + $temp = split("::",$selectedcolumn[$i]); + $icolumnsql = "insert into vtiger_reportsharing (reportid,shareid,setype) values (?,?,?)"; + $icolumnsqlresult = $adb->pquery($icolumnsql, array($genQueryId,$temp[1],$temp[0])); + } + } + } + $log->info("Reports :: Save->Successfully saved vtiger_selectcolumn"); + //<<<>>>>>>> + + if($genQueryId != "") + { + $ireportsql = "insert into vtiger_report (REPORTID,FOLDERID,REPORTNAME,DESCRIPTION,REPORTTYPE,QUERYID,STATE,OWNER,SHARINGTYPE) values (?,?,?,?,?,?,?,?,?)"; + $ireportparams = array($genQueryId, $folderid, $reportname, $reportdescription, $reporttype, $genQueryId,'CUSTOM',$current_user->id,$sharetype); + $ireportresult = $adb->pquery($ireportsql, $ireportparams); + $log->info("Reports :: Save->Successfully saved vtiger_report"); + if($ireportresult!=false) + { + //<<<>>>>>> + $ireportmodulesql = "insert into vtiger_reportmodules (REPORTMODULESID,PRIMARYMODULE,SECONDARYMODULES) values (?,?,?)"; + $ireportmoduleresult = $adb->pquery($ireportmodulesql, array($genQueryId, $pmodule, $smodule)); + $log->info("Reports :: Save->Successfully saved vtiger_reportmodules"); + //<<<>>>>>> + + //<<<>>>>>> + if($sort_by1 != "") + { + $sort_by1sql = "insert into vtiger_reportsortcol (SORTCOLID,REPORTID,COLUMNNAME,SORTORDER) values (?,?,?,?)"; + $sort_by1result = $adb->pquery($sort_by1sql, array(1, $genQueryId, $sort_by1, $sort_order1)); + } + if($sort_by2 != "") + { + $sort_by2sql = "insert into vtiger_reportsortcol (SORTCOLID,REPORTID,COLUMNNAME,SORTORDER) values (?,?,?,?)"; + $sort_by2result = $adb->pquery($sort_by2sql, array(2,$genQueryId,$sort_by2,$sort_order2)); + } + if($sort_by3 != "") + { + $sort_by3sql = "insert into vtiger_reportsortcol (SORTCOLID,REPORTID,COLUMNNAME,SORTORDER) values (?,?,?,?)"; + $sort_by3result = $adb->pquery($sort_by3sql, array(3,$genQueryId,$sort_by3,$sort_order3)); + } + $log->info("Reports :: Save->Successfully saved vtiger_reportsortcol"); + //<<<>>>>>> + + //<<<>>>>>> + $ireportmodulesql = "insert into vtiger_reportdatefilter (DATEFILTERID,DATECOLUMNNAME,DATEFILTER,STARTDATE,ENDDATE) values (?,?,?,?,?)"; + $ireportmoduleresult = $adb->pquery($ireportmodulesql, array($genQueryId, $stdDateFilterField, $stdDateFilter, $startdate, $enddate)); + $log->info("Reports :: Save->Successfully saved vtiger_reportdatefilter"); + //<<<>>>>>> + + //<<<>>>>>> + for ($i=0;$ipquery($ireportsummarysql, array($genQueryId, $i, $columnstototal[$i])); + } + $log->info("Reports :: Save->Successfully saved vtiger_reportsummary"); + //<<<>>>>>> + + //<<<>>>>>> + for ($i=0;$ipquery($irelcriteriasql, array($genQueryId, $i, $adv_filter_col[$i], $adv_filter_option[$i], $adv_filter_value[$i])); + } + $log->info("Reports :: Save->Successfully saved vtiger_relcriteria"); + //<<<>>>>>> + + }else + { + $errormessage = "Error Message
      +
    • Error while inserting the record +

    " ; + echo $errormessage; + die; + } + } + }else + { + $errormessage = "Error Message
      +
    • Error while inserting the record +

    " ; + echo $errormessage; + die; + } + echo ''; + } +}else +{ + if($reportid != "") + { + if(!empty($selectedcolumns)) + { + $idelcolumnsql = "delete from vtiger_selectcolumn where queryid=?"; + $idelcolumnsqlresult = $adb->pquery($idelcolumnsql, array($reportid)); + if($idelcolumnsqlresult != false) + { + for($i=0 ;$ipquery($icolumnsql, array($reportid,$i,$selectedcolumns[$i])); + } + } + } + } + $delsharesqlresult = $adb->pquery("DELETE FROM vtiger_reportsharing WHERE reportid=?", array($reportid)); + if($delsharesqlresult != false && $sharetype=="Shared" && $shared_entities!='') + { + $selectedcolumn = explode(";",$shared_entities); + for($i=0 ;$i< count($selectedcolumn) -1 ;$i++) + { + $temp = split("::",$selectedcolumn[$i]); + $icolumnsql = "INSERT INTO vtiger_reportsharing (reportid,shareid,setype) VALUES (?,?,?)"; + $icolumnsqlresult = $adb->pquery($icolumnsql, array($reportid,$temp[1],$temp[0])); + } + } + + //<<<>>>>>> + $ireportmodulesql = "UPDATE vtiger_reportmodules SET primarymodule=?,secondarymodules=? WHERE reportmodulesid=?"; + $ireportmoduleresult = $adb->pquery($ireportmodulesql, array($pmodule, $smodule,$reportid)); + $log->info("Reports :: Save->Successfully saved vtiger_reportmodules"); + //<<<>>>>>> + + $ireportsql = "update vtiger_report set REPORTNAME=?, DESCRIPTION=?, REPORTTYPE=?, SHARINGTYPE=? where REPORTID=?"; + $ireportparams = array($reportname, $reportdescription, $reporttype, $sharetype, $reportid); + $ireportresult = $adb->pquery($ireportsql, $ireportparams); + $log->info("Reports :: Save->Successfully saved vtiger_report"); + + $idelreportsortcolsql = "delete from vtiger_reportsortcol where reportid=?"; + $idelreportsortcolsqlresult = $adb->pquery($idelreportsortcolsql, array($reportid)); + $log->info("Reports :: Save->Successfully deleted vtiger_reportsortcol"); + + if($idelreportsortcolsqlresult!=false) + { + //<<<>>>>>> + if($sort_by1 != "") + { + $sort_by1sql = "insert into vtiger_reportsortcol (SORTCOLID,REPORTID,COLUMNNAME,SORTORDER) values (?,?,?,?)"; + $sort_by1result = $adb->pquery($sort_by1sql, array(1, $reportid, $sort_by1, $sort_order1)); + } + if($sort_by2 != "") + { + $sort_by2sql = "insert into vtiger_reportsortcol (SORTCOLID,REPORTID,COLUMNNAME,SORTORDER) values (?,?,?,?)"; + $sort_by2result = $adb->pquery($sort_by2sql, array(2, $reportid, $sort_by2, $sort_order2)); + } + if($sort_by3 != "") + { + $sort_by3sql = "insert into vtiger_reportsortcol (SORTCOLID,REPORTID,COLUMNNAME,SORTORDER) values (?,?,?,?)"; + $sort_by3result = $adb->pquery($sort_by3sql, array(3, $reportid, $sort_by3, $sort_order3)); + } + $log->info("Reports :: Save->Successfully saved vtiger_reportsortcol"); + //<<<>>>>>> + + $idelreportdatefiltersql = "delete from vtiger_reportdatefilter where datefilterid=?"; + $idelreportdatefiltersqlresult = $adb->pquery($idelreportdatefiltersql, array($reportid)); + + //<<<>>>>>> + $ireportmodulesql = "insert into vtiger_reportdatefilter (DATEFILTERID,DATECOLUMNNAME,DATEFILTER,STARTDATE,ENDDATE) values (?,?,?,?,?)"; + $ireportmoduleresult = $adb->pquery($ireportmodulesql, array($reportid, $stdDateFilterField, $stdDateFilter, $startdate, $enddate)); + $log->info("Reports :: Save->Successfully saved vtiger_reportdatefilter"); + //<<<>>>>>> + + //<<<>>>>>> + $idelreportsummarysql = "delete from vtiger_reportsummary where reportsummaryid=?"; + $idelreportsummarysqlresult = $adb->pquery($idelreportsummarysql, array($reportid)); + + for ($i=0;$ipquery($ireportsummarysql, array($reportid, $i, $columnstototal[$i])); + } + $log->info("Reports :: Save->Successfully saved vtiger_reportsummary"); + //<<<>>>>>> + + + //<<<>>>>>> + + $idelrelcriteriasql = "delete from vtiger_relcriteria where queryid=?"; + $idelrelcriteriasqlresult = $adb->pquery($idelrelcriteriasql, array($reportid)); + + for ($i=0;$iquote($adv_filter_value[$i]); + + $irelcriteriasql = "insert into vtiger_relcriteria(QUERYID,COLUMNINDEX,COLUMNNAME,COMPARATOR,VALUE) values (?,?,?,?,?)"; + $irelcriteriaresult = $adb->pquery($irelcriteriasql, array($reportid, $i, $adv_filter_col[$i], $adv_filter_option[$i], $adv_filter_value[$i])); + } + $log->info("Reports :: Save->Successfully saved vtiger_relcriteria"); + //<<<>>>>>> + + }else + { + $errormessage = "Error Message
      +
    • Error while inserting the record +

    " ; + echo $errormessage; + die; + } + }else + { + $errormessage = "Error Message
      +
    • Error while inserting the record +

    " ; + echo $errormessage; + die; + } + echo ''; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Reports/SaveAndRun.php b/oss/vtiger/trunk/modules/Reports/SaveAndRun.php new file mode 100644 index 00000000..7bd5361a --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/SaveAndRun.php @@ -0,0 +1,303 @@ +pquery($sql, array($reportid)); +$Report_ID = $adb->query_result($res,0,'reportid'); +$numOfRows = $adb->num_rows($res); +if($numOfRows > 0) +{ + $startdate = getDBInsertDateValue($_REQUEST["startdate"]);//Convert the user date format to DB date format + $enddate = getDBInsertDateValue($_REQUEST["enddate"]);//Convert the user date format to DB date format + + global $primarymodule,$secondarymodule,$orderbylistsql,$orderbylistcolumns,$ogReport; + //added to fix the ticket #5117 + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + + $ogReport = new Reports($reportid); + $primarymodule = $ogReport->primodule; + $restrictedmodules = array(); + if($ogReport->secmodule!='') + $rep_modules = split(":",$ogReport->secmodule); + else + $rep_modules = array(); + + array_push($rep_modules,$primarymodule); + $modules_permitted = true; + $modules_export_permitted = true; + foreach($rep_modules as $mod){ + if(isPermitted($mod,'index')!= "yes" || vtlib_isModuleActive($mod)==false){ + $modules_permitted = false; + $restrictedmodules[] = $mod; + } + if(isPermitted("$mod",'Export','')!='yes') + $modules_export_permitted = false; + } + + if(isPermitted($primarymodule,'index') == "yes" && $modules_permitted == true) + { + $oReportRun = new ReportRun($reportid); + $filterlist = $oReportRun->RunTimeFilter($filtercolumn,$filter,$startdate,$enddate); + + // Performance Optimization: Direct output of the report result + $list_report_form = new vtigerCRM_Smarty; + + //$sshtml = $oReportRun->GenerateReport("HTML",$filterlist); + //if(is_array($sshtml))$totalhtml = $oReportRun->GenerateReport("TOTALHTML",$filterlist); + + $sshtml = array(); + $totalhtml = ''; + $list_report_form->assign("DIRECT_OUTPUT", true); + $list_report_form->assign_by_ref("__REPORT_RUN_INSTANCE", $oReportRun); + $list_report_form->assign_by_ref("__REPORT_RUN_FILTER_LIST", $filterlist); + // END + + $ogReport->getSelectedStandardCriteria($reportid); + //commented to omit dashboards for vtiger_reports + //require_once('modules/Dashboard/ReportsCharts.php'); + //$image = get_graph_by_type('Report','Report',$primarymodule,'',$sshtml[2]); + //$list_report_form->assign("GRAPH", $image); + + $BLOCK1 = getPrimaryStdFilterHTML($ogReport->primodule,$ogReport->stdselectedcolumn); + $BLOCK1 .= getSecondaryStdFilterHTML($ogReport->secmodule,$ogReport->stdselectedcolumn); + // Check if selectedcolumn is found in the filters (Fix for ticket #4866) + $selectedcolumnvalue = '"'. decode_html($ogReport->stdselectedcolumn) . '"'; + if (!$is_admin && isset($ogReport->stdselectedcolumn) && strpos($BLOCK1, $selectedcolumnvalue) === false) { + $BLOCK1 .= ""; + } + $list_report_form->assign("BLOCK1",$BLOCK1); + $BLOCKJS = $ogReport->getCriteriaJS(); + $list_report_form->assign("BLOCKJS",$BLOCKJS); + + $BLOCKCRITERIA = $ogReport->getSelectedStdFilterCriteria($ogReport->stdselectedfilter); + $list_report_form->assign("BLOCKCRITERIA",$BLOCKCRITERIA); + if(isset($ogReport->startdate) && isset($ogReport->enddate)) + { + $list_report_form->assign("STARTDATE",getDisplayDate($ogReport->startdate)); + $list_report_form->assign("ENDDATE",getDisplayDate($ogReport->enddate)); + }else + { + $list_report_form->assign("STARTDATE",$ogReport->startdate); + $list_report_form->assign("ENDDATE",$ogReport->enddate); + } + $list_report_form->assign("MOD", $mod_strings); + $list_report_form->assign("APP", $app_strings); + $list_report_form->assign("IMAGE_PATH", $image_path); + $list_report_form->assign("REPORTID", $reportid); + $list_report_form->assign("IS_EDITABLE", $ogReport->is_editable); + + $list_report_form->assign("REPORTNAME", htmlspecialchars($ogReport->reportname,ENT_QUOTES,$default_charset)); + if(is_array($sshtml))$list_report_form->assign("REPORTHTML", $sshtml); + else $list_report_form->assign("ERROR_MSG", getTranslatedString('LBL_REPORT_GENERATION_FAILED', $currentModule) . "
    " . $sshtml); + $list_report_form->assign("REPORTTOTHTML", $totalhtml); + $list_report_form->assign("FOLDERID", $folderid); + $list_report_form->assign("DATEFORMAT",$current_user->date_format); + $list_report_form->assign("JS_DATEFORMAT",parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + if($modules_export_permitted==true){ + $list_report_form->assign("EXPORT_PERMITTED","YES"); + } else { + $list_report_form->assign("EXPORT_PERMITTED","NO"); + } + $rep_in_fldr = $ogReport->sgetRptsforFldr($folderid); + for($i=0;$iassign("REPINFOLDER", $reports_array); + include('themes/'.$theme.'/header.php'); + $list_report_form->display('ReportRun.tpl'); + } + else + { + $list_report_form->display('ReportRunContents.tpl'); + } + } + else + { + if($_REQUEST['mode'] != 'ajax') + { + include('themes/'.$theme.'/header.php'); + } + echo "
    "; + echo "
    + + + + + + + + + +
    ".$mod_strings['LBL_NO_ACCESS']." : ".implode(",",$restrictedmodules)."
    + $app_strings[LBL_GO_BACK]
    +
    "; + echo "
    "; + } +} +else +{ + echo ""; + echo "
    "; + echo "
    + + + + + + + + + +
    ".$mod_strings['LBL_REPORT_DELETED']."
    + $app_strings[LBL_GO_BACK]
    +
    "; + echo "
    "; +} + /** Function to get the StdfilterHTML strings for the given primary module + * @ param $module : Type String + * @ param $selected : Type String(optional) + * This Generates the HTML Combo strings for the standard filter for the given reports module + * This Returns a HTML sring + */ +function getPrimaryStdFilterHTML($module,$selected="") +{ + + global $app_list_strings; + global $ogReport; + global $current_language; + $ogReport->oCustomView=new CustomView(); + $result = $ogReport->oCustomView->getStdCriteriaByModule($module); + $mod_strings = return_module_language($current_language,$module); + if(isset($result)) + { + foreach($result as $key=>$value) + { + if(isset($mod_strings[$value])) + { + if($key == $selected) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + }else + { + if($key == $selected) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + } + } + } + + return $shtml; +} + + /** Function to get the StdfilterHTML strings for the given secondary module + * @ param $module : Type String + * @ param $selected : Type String(optional) + * This Generates the HTML Combo strings for the standard filter for the given reports module + * This Returns a HTML sring + */ +function getSecondaryStdFilterHTML($module,$selected="") +{ + global $app_list_strings; + global $ogReport; + global $current_language; + $ogReport->oCustomView=new CustomView(); + + if($module != "") + { + $secmodule = explode(":",$module); + for($i=0;$i < count($secmodule) ;$i++) + { + $result = $ogReport->oCustomView->getStdCriteriaByModule($secmodule[$i]); + $mod_strings = return_module_language($current_language,$secmodule[$i]); + if(isset($result)) + { + foreach($result as $key=>$value) + { + if(isset($mod_strings[$value])) + { + if($key == $selected) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + }else + { + if($key == $selected) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + } + } + } + + } + } + return $shtml; +} + /** Function to get the reports under a report folder + * @ param $folderid : Type Integer + * This Returns $reports_array in the following format + * $reports_array = array ($reportid=>$reportname,$reportid=>$reportname1,.............,$reportidn=>$reportname) + */ +function getReportsinFolder($folderid) +{ + global $adb; + $query = 'select reportid,reportname from vtiger_report where folderid=?'; + $result = $adb->pquery($query, array($folderid)); + $reports_array = Array(); + for($i=0;$i < $adb->num_rows($result);$i++) + { + $reportid = $adb->query_result($result,$i,'reportid'); + $reportname = $adb->query_result($result,$i,'reportname'); + $reports_array[$reportid] = $reportname; + } + if(count($reports_array) > 0) + return $reports_array; + else + return false; +} +?> diff --git a/oss/vtiger/trunk/modules/Reports/SaveReport.php b/oss/vtiger/trunk/modules/Reports/SaveReport.php new file mode 100644 index 00000000..9d6a5ee7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/SaveReport.php @@ -0,0 +1,43 @@ +assign("MOD", $mod_strings); +$save_report_form->assign("APP", $app_strings); +$save_report_form->assign("THEME_PATH",$theme); +$oReport = new Reports(); +$reportfolderhtml = $oReport->sgetRptFldrSaveReport(); +$save_report_form->assign("REPORT_FOLDER", $reportfolderhtml); +$save_report_form->parse("main"); +$save_report_form->out("main"); +?> diff --git a/oss/vtiger/trunk/modules/Reports/SaveReport0.php b/oss/vtiger/trunk/modules/Reports/SaveReport0.php new file mode 100644 index 00000000..8638f2a7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/SaveReport0.php @@ -0,0 +1,30 @@ +0) { + $secondarymodule_req = implode(":",$secondarymodule_req); +} + +if($primarymodule_req!="") +{ + header("Location: index.php?action=NewReport1&module=Reports&primarymodule=$primarymodule_req&secondarymodule=$secondarymodule_req"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Reports/SaveReportFolder.php b/oss/vtiger/trunk/modules/Reports/SaveReportFolder.php new file mode 100644 index 00000000..0e37a0a7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/SaveReportFolder.php @@ -0,0 +1,69 @@ +pquery($sql, $sql_params); + if($result!=false) + { + header("Location: index.php?action=ReportsAjax&file=ListView&mode=ajax&module=Reports"); + }else + { + include('themes/'.$theme.'/header.php'); + $errormessage = "Error Message
      +
    • Error while inserting the record +

    " ; + echo $errormessage; + } + } +}elseif($mode=="Edit") +{ + if($rfid != "") + { + $sql = "update vtiger_reportfolder set "; + $sql .= "FOLDERNAME=?, DESCRIPTION=? where folderid=?"; + $params = array(trim($foldername), $folderdesc, $rfid); + $result = $adb->pquery($sql, $params); + if($result!=false) + { + header("Location: index.php?action=ReportsAjax&file=ListView&mode=ajax&module=Reports"); + }else + { + include('themes/'.$theme.'/header.php'); + $errormessage = "Error Message
      +
    • Error while updating the record +

    " ; + echo $errormessage; + } + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Reports/StandardFilter.php b/oss/vtiger/trunk/modules/Reports/StandardFilter.php new file mode 100644 index 00000000..da40b25e --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/StandardFilter.php @@ -0,0 +1,170 @@ +related_modules[$primarymodule])) { + foreach($ogReport->related_modules[$primarymodule] as $key=>$value){ + $BLOCK1 .= getSecondaryStdFilterHTML($_REQUEST["secondarymodule_".$value]); + } + } + + $report_std_filter->assign("BLOCK1_STD",$BLOCK1); + $BLOCKJS = $oReport->getCriteriaJS(); + $report_std_filter->assign("BLOCKJS_STD",$BLOCKJS); + $BLOCKCRITERIA = $oReport->getSelectedStdFilterCriteria(); + $report_std_filter->assign("BLOCKCRITERIA_STD",$BLOCKCRITERIA); + +}elseif(isset($_REQUEST["record"]) == true) +{ + //added to fix the ticket #5117 + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + + $reportid = vtlib_purify($_REQUEST["record"]); + $oReport = new Reports($reportid); + $oReport->getSelectedStandardCriteria($reportid); + + $oRep = new Reports(); + $secondarymodule = ''; + $secondarymodules =Array(); + + if(!empty($oRep->related_modules[$oReport->primodule])) { + foreach($oRep->related_modules[$oReport->primodule] as $key=>$value){ + if(isset($_REQUEST["secondarymodule_".$value]))$secondarymodules []= $_REQUEST["secondarymodule_".$value]; + } + } + $secondarymodule = implode(":",$secondarymodules); + + if($secondarymodule!='') + $oReport->secmodule = $secondarymodule; + + $BLOCK1 = getPrimaryStdFilterHTML($oReport->primodule,$oReport->stdselectedcolumn); + $BLOCK1 .= getSecondaryStdFilterHTML($oReport->secmodule,$oReport->stdselectedcolumn); + //added to fix the ticket #5117 + $selectedcolumnvalue = '"'. $oReport->stdselectedcolumn . '"'; + if (!$is_admin && isset($oReport->stdselectedcolumn) && strpos($BLOCK1, $selectedcolumnvalue) === false) + $BLOCK1 .= ""; + + $report_std_filter->assign("BLOCK1_STD",$BLOCK1); + + $BLOCKJS = $oReport->getCriteriaJS(); + $report_std_filter->assign("BLOCKJS_STD",$BLOCKJS); + + $BLOCKCRITERIA = $oReport->getSelectedStdFilterCriteria($oReport->stdselectedfilter); + $report_std_filter->assign("BLOCKCRITERIA_STD",$BLOCKCRITERIA); + + if(isset($oReport->startdate) && isset($oReport->enddate)) + { + $report_std_filter->assign("STARTDATE_STD",getDisplayDate($oReport->startdate)); + $report_std_filter->assign("ENDDATE_STD",getDisplayDate($oReport->enddate)); + }else{ + $report_std_filter->assign("STARTDATE_STD",$oReport->startdate); + $report_std_filter->assign("ENDDATE_STD",$oReport->enddate); + } +} + + + /** Function to get the HTML strings for the primarymodule standard filters + * @ param $module : Type String + * @ param $selected : Type String(optional) + * This Returns a HTML combo srings + */ +function getPrimaryStdFilterHTML($module,$selected="") +{ + global $app_list_strings; + global $ogReport; + global $current_language; + $ogReport->oCustomView=new CustomView(); + $result = $ogReport->oCustomView->getStdCriteriaByModule($module); + $mod_strings = return_module_language($current_language,$module); + + if(isset($result)) + { + foreach($result as $key=>$value) + { + if(isset($mod_strings[$value])) + { + if($key == $selected) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + }else + { + if($key == $selected) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + } + } + } + + return $shtml; +} + + /** Function to get the HTML strings for the secondary standard filters + * @ param $module : Type String + * @ param $selected : Type String(optional) + * This Returns a HTML combo srings for the secondary modules + */ +function getSecondaryStdFilterHTML($module,$selected="") +{ + global $app_list_strings; + global $ogReport; + global $current_language; + $ogReport->oCustomView=new CustomView(); + if($module != "") + { + $secmodule = explode(":",$module); + for($i=0;$i < count($secmodule) ;$i++) + { + $result = $ogReport->oCustomView->getStdCriteriaByModule($secmodule[$i]); + $mod_strings = return_module_language($current_language,$secmodule[$i]); + if(isset($result)) + { + foreach($result as $key=>$value) + { + if(isset($mod_strings[$value])) + { + if($key == $selected) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + }else + { + if($key == $selected) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + } + } + } + + } + } + return $shtml; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Reports/index.php b/oss/vtiger/trunk/modules/Reports/index.php new file mode 100644 index 00000000..f82c203c --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/index.php @@ -0,0 +1,27 @@ + diff --git a/oss/vtiger/trunk/modules/Reports/language/en_us.lang.php b/oss/vtiger/trunk/modules/Reports/language/en_us.lang.php new file mode 100644 index 00000000..e0e70cae --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/language/en_us.lang.php @@ -0,0 +1,227 @@ +'Reports', +'LBL_MODULE_TITLE'=>'Reports: Home', +'LBL_CREATE_REPORT'=>'Create Report', +'LBL_CUSTOMIZE_REPORT'=>'Customize Report', +'LBL_REP_BUTTON'=>'Create New Report', +'LBL_REP_FOLDER_BUTTON'=>'Create New Report Folder', +'LBL_REP_FOLDER'=>'Report Folder', +'LBL_REP_FOLDER_DTLS'=>'Folder Details', +'LBL_REP_FOLDER_NAME'=>'Folder Name:', +'LBL_REP_FOLDER_DESC'=>'Folder Description:', +'LBL_NEW_REP0_HDR1'=>'Select a Module for which a new Report has to be created:', +'LBL_NEW_REP0_HDR2'=>'Select Related Module:', +'LBL_NEW_REP0_HDR3'=>'Note:', +'LBL_NEW_REP0_HDR4'=>'Report Module and related module once selected cannot be modified later', +'LBL_CONTINUE_BUTTON'=>'Continue', +'LBL_NEW_REP1_HDR1'=>'Provide the following report information', +'LBL_SELECT_COLUMNS'=>'Select Columns', +'LBL_SPECIFY_GROUPING'=>'Specify Grouping', +'LBL_COLUMNS_TO_TOTAL'=>'Choose Columns To Total', +'LBL_SPECIFY_CRITERIA'=>'Specify Criteria', +'LBL_SAVERUN_BUTTON'=>'Save And Run', +'LBL_TABULAT_REPORT'=>'Tabular Report', +'LBL_REPORT_TYPE_HDR1'=>'Tabular reports are the simplest and fastest way to get a listing of your data.', +'LBL_SUMMARY_REPORT'=>'Summary Report', +'LBL_REPORT_TYPE_HDR2'=>'Summary reports allow you to view your data along with subtotals and other summary information.', +'LBL_AVAILABLE_COLUMNS'=>'Available Columns:', +'LBL_SELECTED_COLUMNS'=>'Selected Columns:', +'LBL_ADD_BUTTON'=>'Add', +'LBL_COLUMNS'=>'Columns', +'LBL_COLUMNS_SUM'=>'Sum', +'LBL_COLUMNS_AVERAGE'=>'Average', +'LBL_COLUMNS_LOW_VALUE'=>'Lowest Value', +'LBL_COLUMNS_LARGE_VALUE'=>'Largest Value', +'LBL_NONE'=>'None', +'LBL_GROUPING_SORT'=>'Sort Order:', +'LBL_GROUPING_SUMMARIZE'=>'Summarize information by:', +'LBL_GROUPING_THEN_BY'=>'and then by:', +'LBL_GROUPING_FINALLY_BY'=>'and finally by:', +'LBL_ADVANCED_FILTER'=>'Advanced Filters', +'LBL_STANDARD_FILTER'=>'Standard Filters', +'LBL_SF_COLUMNS'=>'Column', +'LBL_SF_STARTDATE'=>'Start Date', +'LBL_SF_ENDDATE'=>'End Date', +'LBL_AF_HDR1'=>'Set the search conditions to further restrict the list.', +'LBL_AF_HDR2'=>'You can use "or" filters by entering multiple items in the third column.', +'LBL_AF_HDR3'=>'You can enter up to 10 items, separated by commas. For example: CA, NY, TX, FL searches for CA or NY or TX or FL.', +'LBL_FILTER_OPTIONS'=>'Filter Options', +'LBL_CUSTOMIZE_BUTTON'=>'Customize', +'LBL_EXPORTPDF_BUTTON'=>'Export To PDF', +'LBL_APPLYFILTER_BUTTON'=>'Apply Filter', +'LBL_GENERATED_REPORT'=>'Generated Report', +'LBL_GRAND_TOTAL'=>'Grand Total', + +//Added for 4.2 Patch I +'LBL_EXPORTXL_BUTTON'=>'Export To Excel', + +//Added for 5 Beta +'LBL_NO_PERMISSION'=>'Your profile dosen\'t allow you view the reports for one of the module(s)', +'LBL_SELECT_COLUMNS_TO_GENERATE_REPORTS'=>'Select columns to generate reports', +'LBL_AVAILABLE_FIELDS'=>'Available Fields', +'LBL_SELECTED_FIELDS'=>'Selected Fields', +'LBL_CALCULATIONS'=>'Calculations', +'LBL_SELECT_COLUMNS_TO_TOTAL'=>'Select columns to Total', +'LBL_SELECT_FILTERS_TO_STREAMLINE_REPORT_DATA'=>'Select Filters to Streamline Report Data', +'LBL_SELECT_FILTERS'=>'Filters', +'LBL_SELECT_COLUMNS_TO_GROUP_REPORTS'=>'Select columns to group reports', +'LBL_BACK_TO_REPORTS'=>'Back to Reports', +'LBL_SELECT_ANOTHER_REPORT'=>'Select Another Report', +'LBL_SELECT_COLUMN'=>'Select Column', +'LBL_SELECT_TIME'=>'Select Time', +'LBL_PRINT_REPORT'=>'Print Report', +'LBL_CLICK_HERE'=>'Click Here', +'LBL_TO_ADD_NEW_GROUP'=>'to add new folder', +'LBL_CREATE_NEW'=>'Create New', +'LBL_RELATIVE_MODULE'=>'Related Module', +'LBL_REPORT_TYPE'=>'Report Type', +'LBL_REPORT_DETAILS'=>'Report Details', +'LBL_TYPE_THE_NAME'=>'Type the Name', +'LBL_DESCRIPTION_FOR_REPORT'=>'Description for the report', +'LBL_REPORT_NAME'=>'Report Name', +'LBL_DESCRIPTION'=>'Description', +'LBL_TOOLS'=>'Tools', +'LBL_AND'=>'and', +'LBL_ADD_NEW_GROUP'=>'Add New Folder', +'LBL_REPORT_MODULE'=>'Report Module', +'LBL_SELECT_RELATIVE_MODULE_FOR_REPORT'=>'Select Related Module for Report', +'LBL_SELECT_REPORT_TYPE_BELOW'=>'Select Report type Below', +'LBL_TABULAR_FORMAT'=>'Tabular Format', +'LBL_TABULAR_REPORTS_ARE_SIMPLEST'=>'Tabular Reports are the simplest and fastest way of getting your data', +'LBL_SUMMARY_REPORT_VIEW_DATA_WITH_SUBTOTALS'=>'Summary reports allow you to view your data along with subtotals and other summary information', +'LBL_FILTERS'=>'Filters', +'LBL_MOVE_TO'=>'Move to', +'LBL_RENAME_FOLDER'=>'Rename Folder', +'LBL_DELETE_FOLDER'=>'Delete Folder', + +'Account and Contact Reports'=>'Account and Contact Reports', +'Lead Reports'=>'Lead Reports', +'Potential Reports'=>'Potential Reports', +'Activity Reports'=>'Activity Reports', +'HelpDesk Reports'=>'Trouble Tickets Reports', +'Product Reports'=>'Product Reports', +'Quote Reports'=>'Quote Reports', +'PurchaseOrder Reports'=>'PurchaseOrder Reports', +'SalesOrder Reports'=>'SalesOrder Reports', //Added for SO +'Invoice Reports'=>'Invoice Reports', +'Campaign Reports'=>'Campaign Reports', //Added for Campaigns +'Contacts by Accounts'=>'Contacts by Accounts', +'Contacts without Accounts'=>'Contacts without Accounts', +'Contacts by Potentials'=>'Contacts by Potentials', +'Contacts related to Accounts'=>'Contacts related to Accounts', +'Contacts not related to Accounts'=>'Contacts not related to Accounts', +'Contacts related to Potentials'=>'Contacts related to Potentials', +'Lead by Source'=>'Lead by Source', +'Lead Status Report'=>'Lead Status Report', +'Potential Pipeline'=>'Potential Pipeline', +'Closed Potentials'=>'Closed Potentials', +'Potential that have Won'=>'Potential that have Won', +'Tickets by Products'=>'Tickets by Products', +'Tickets by Priority'=>'Tickets by Priority', +'Open Tickets'=>'Open Tickets', +'Tickets related to Products'=>'Tickets related to Products', +'Tickets that are Open'=>'Tickets that are Open', +'Product Details'=>'Product Details', +'Products by Contacts'=>'Products by Contacts', +'Product Detailed Report'=>'Product Detailed Report', +'Products related to Contacts'=>'Products related to Contacts', +'Open Quotes'=>'Open Quotes', +'Quotes Detailed Report'=>'Quotes Detailed Report', +'Quotes that are Open'=>'Quotes that are Open', +'PurchaseOrder by Contacts'=>'PurchaseOrder by Contacts', +'PurchaseOrder Detailed Report'=>'PurchaseOrder Detailed Report', +'PurchaseOrder related to Contacts'=>'PurchaseOrder related to Contacts', +'Invoice Detailed Report'=>'Invoice Detailed Report', +'Last Month Activities'=>'Last Month Activities', +'This Month Activities'=>'This Month Activities', +'Campaign Expectations and Actuals'=>'Campaign Expectations and Actuals', //Added for Campaigns +'SalesOrder Detailed Report'=>'SalesOrder Detailed Report', //Added for SO + +'LBL_DELETE'=>'Delete', +'Create_Reports'=>'Create Reports', +'Create_New_Folder'=>'Create New Folder', +'Move_Reports'=>'Move Reports', +'Delete_Report'=>'Delete Report', + +'Custom'=>'Custom', +'Previous FY'=>'Previous FY', +'Current FY'=>'Current FY', +'Next FY'=>'Next FY', +'Previous FQ'=>'Previous FQ', +'Current FQ'=>'Current FQ', +'Next FQ'=>'Next FQ', +'Yesterday'=>'Yesterday', +'Today'=>'Today', +'Tomorrow'=>'Tomorrow', +'Last Week'=>'Last Week', +'Current Week'=>'Current Week', +'Next Week'=>'Next Week', +'Last Month'=>'Last Month', +'Current Month'=>'Current Month', +'Next Month'=>'Next Month', +'Last 7 Days'=>'Last 7 Days', +'Last 30 Days'=>'Last 30 Days', +'Last 60 Days'=>'Last 60 Days', +'Last 90 Days'=>'Last 90 Days', +'Last 120 Days'=>'Last 120 Days', +'Next 7 Days'=>'Next 7 Days', +'Next 30 Days'=>'Next 30 Days', +'Next 60 Days'=>'Next 60 Days', +'Next 90 Days'=>'Next 90 Days', +'Next 120 Days'=>'Next 120 Days', +'TITLE_VTIGERCRM_CREATE_REPORT' => 'vtiger CRM - Create Report', +'TITLE_VTIGERCRM_PRINT_REPORT' => 'vtiger - Print Report', +'NO_FILTER_SELECTED' => 'No filter Selected', + +'LBL_GENERATE_NOW'=>'Generate Now', +'Totals'=>'Field Names', +'SUM'=>'SUM', +'AVG'=>'AVG', +'MAX'=>'MAX', +'MIN'=>'MIN', +'LBL_CUSTOM_REPORTS'=>'Custom Reports', + +'ticketid'=>'Ticket Id', +'NO_COLUMN'=>'No Columns available to Total', + +// Added/Updated for vtiger CRM 5.0.4 +'LBL_REPORT_DELETED' => 'The report you are trying to view has been deleted.', + +//Added for Reports +'LBL_SHARING'=>'Sharing', +'SELECT_FILTER_TYPE'=>'Select Report Type', +'LBL_USERS'=>'Users', +'LBL_GROUPS'=>'Groups', +'LBL_SELECT_FIELDS'=>'Select Fields', +'LBL_MEMBERS'=>'Members', +'LBL_RELATED_FIELDS'=>'Related Fields', +'LBL_NO_ACCESS'=>' Access Denied for module(s) ', +'LBL_NOT_ACTIVE'=>' Access Denied for module(s) ', +'LBL_PERM_DENIED'=>' Permission Denied for Report(s): ', +'LBL_FLDR_NOT_EMPTY'=>'Folder you are trying to delete is not Empty, Move or Delete the Reports in it.', +'NO_REL_MODULES'=>'No Related Modules for the Selected Module', +) + +?> diff --git a/oss/vtiger/trunk/modules/Reports/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Reports/language/zh_cn.lang.php new file mode 100644 index 00000000..3c0fae4b --- /dev/null +++ b/oss/vtiger/trunk/modules/Reports/language/zh_cn.lang.php @@ -0,0 +1,229 @@ + '报表', + 'LBL_MODULE_TITLE' => '报表:首页', +'LBL_CREATE_REPORT' => '建立报表', + 'LBL_CUSTOMIZE_REPORT' => '自订报表', + 'LBL_REP_BUTTON' => '建立新报表', +'LBL_REP_FOLDER_BUTTON' => '建立新报表数据夹', + 'LBL_REP_FOLDER' => '报表数据夹', + 'LBL_REP_FOLDER_DTLS' => '数据夹信息', + 'LBL_REP_FOLDER_NAME' => '数据夹名称:', + 'LBL_REP_FOLDER_DESC' => '资料夹说明:', + 'LBL_NEW_REP0_HDR1' => '选择新报表的数据来自哪个模块:', + 'LBL_NEW_REP0_HDR2' => '选择相关模块:', + 'LBL_NEW_REP0_HDR3' => '摘要', + 'LBL_NEW_REP0_HDR4' => '报表使用的模块与相关模块一旦决定就无法再修改', + 'LBL_CONTINUE_BUTTON' => '继续', + 'LBL_NEW_REP1_HDR1' => '提供下面报表信息', + 'LBL_SELECT_COLUMNS' => '选择字段', + 'LBL_SPECIFY_GROUPING' => '指定群组', + 'LBL_COLUMNS_TO_TOTAL' => '选择总计字段', + 'LBL_SPECIFY_CRITERIA' => '指定规则', + 'LBL_SAVERUN_BUTTON' => '储存&执行', + 'LBL_TABULAT_REPORT' => '表格式报表', + 'LBL_REPORT_TYPE_HDR1' => '表格式报表是数据呈现最简单且最快速的形式', + 'LBL_SUMMARY_REPORT' => '摘要报表', + 'LBL_REPORT_TYPE_HDR2' => '摘要报表可以让您浏览数据的小计与其它摘要信息', + 'LBL_AVAILABLE_COLUMNS' => '可以使用的字段:', + 'LBL_SELECTED_COLUMNS' => '已经选择的字段:', + 'LBL_ADD_BUTTON' => '新增', + 'LBL_COLUMNS' => '字段', + 'LBL_COLUMNS_SUM' => '总计', + 'LBL_COLUMNS_AVERAGE' => '平均', + 'LBL_COLUMNS_LOW_VALUE' => '最小值', + 'LBL_COLUMNS_LARGE_VALUE' => '最大值', + 'LBL_NONE' => '无', + 'LBL_GROUPING_SORT' => '顺序:', + 'LBL_GROUPING_SUMMARIZE' => '摘要信息来源:', + 'LBL_GROUPING_THEN_BY' => '接着来自:', + 'LBL_GROUPING_FINALLY_BY' => '最后来自:', + 'LBL_ADVANCED_FILTER' => '进阶规则', + 'LBL_STANDARD_FILTER' => '标准规则', + 'LBL_SF_COLUMNS' => '字段', + 'LBL_SF_STARTDATE' => '开始日期', + 'LBL_SF_ENDDATE' => '结束日期', +'LBL_AF_HDR1' => '设定搜寻条件来缩小范围', + 'LBL_AF_HDR2' => '您可以再第三个字段输入多个项目来使用规则 "or"', + 'LBL_AF_HDR3' => '您最多可以输入10个项目,以逗号分隔。例如CA,NY,TX,FL会尝试搜寻CA或NY或TX或FL。', + 'LBL_FILTER_OPTIONS' => '规则选项', + 'LBL_CUSTOMIZE_BUTTON' => '自订', + 'LBL_EXPORTPDF_BUTTON' => '汇出成PDF', + 'LBL_APPLYFILTER_BUTTON' => '使用规则', + 'LBL_GENERATED_REPORT' => '产生报表', + 'LBL_GRAND_TOTAL' => '总计', + +//Added for 4.2 Patch I + 'LBL_EXPORTXL_BUTTON' => '汇出到 Excel', + +//Added for 5 Beta + 'LBL_NO_PERMISSION' => '您没有检视这个报表的权限', + 'LBL_SELECT_COLUMNS_TO_GENERATE_REPORTS' => '选择要产生报表的字段', + 'LBL_AVAILABLE_FIELDS' => '可用字段', + 'LBL_SELECTED_FIELDS' => '已选择字段', + 'LBL_CALCULATIONS' => '计算', + 'LBL_SELECT_COLUMNS_TO_TOTAL' => '选择字段总数', + 'LBL_SELECT_FILTERS_TO_STREAMLINE_REPORT_DATA' => '选择报表数据的过滤规则', + 'LBL_SELECT_FILTERS' => '规则', + 'LBL_SELECT_COLUMNS_TO_GROUP_REPORTS' => '选择汇整报表的字段', + 'LBL_BACK_TO_REPORTS' => '回到报表', + 'LBL_SELECT_ANOTHER_REPORT' => '选择另一个报表', + 'LBL_SELECT_COLUMN' => '选择字段', + 'LBL_SELECT_TIME' => '选择时间', + 'LBL_PRINT_REPORT' => '打印报表', + 'LBL_CLICK_HERE' => '点选这里', + 'LBL_TO_ADD_NEW_GROUP' => '新增集合', + 'LBL_CREATE_NEW' => '建立', + 'LBL_REPORT_DETAILS' => '报表细节', + 'LBL_RELATIVE_MODULE' => '关联模块', +'LBL_REPORT_TYPE'=>'报表类型', +'LBL_REPORT_DETAILS'=>'报表细节', + 'LBL_TYPE_THE_NAME' => '输入名称', + 'LBL_DESCRIPTION_FOR_REPORT' => '报表说明', + 'LBL_REPORT_NAME' => '报表名称', + 'LBL_DESCRIPTION' => '说明', + 'LBL_TOOLS' => '工具', + 'LBL_AND' => '且', + 'LBL_ADD_NEW_GROUP' => '新增群组', + 'LBL_REPORT_MODULE' => '报表模块', + 'LBL_SELECT_RELATIVE_MODULE_FOR_REPORT' => '选择要产生报表的相关模块', + 'LBL_SELECT_REPORT_TYPE_BELOW' => '选择下面的报表类型', + 'LBL_TABULAR_FORMAT' => '表格格式', + 'LBL_TABULAR_REPORTS_ARE_SIMPLEST' => '表格格式是最快速的报表产生方式', + 'LBL_SUMMARY_REPORT_VIEW_DATA_WITH_SUBTOTALS' => '摘要报表可以让您检视数据的小计等摘要信息', + 'LBL_FILTERS' => '规则', + 'LBL_MOVE_TO' => '移动到', + 'LBL_RENAME_FOLDER' => '资料夹改名', + 'LBL_DELETE_FOLDER' => '删除数据夹', + + 'Account and Contact Reports' => '客户与联络人报表', + 'Lead Reports' => '准客户报表', + 'Potential Reports' => '潜在机会报表', + 'Activity Reports' => '最近事项报表', + 'HelpDesk Reports' => '问题传票报表', + 'Product Reports' => '产品报表', + 'Quote Reports' => '报价单报表', + 'PurchaseOrder Reports' => '采购订单报表', +'SalesOrder Reports' => '销售订单报表', //Added for SO +'Invoice Reports' => '发票报表', + 'Campaign Reports' => '活动报表', //Added for Campaigns +'Contacts by Accounts' => '按客户显示联络人', + 'Contacts without Accounts' => '没有公司资料的联络人', + 'Contacts by Potentials' => '按潜在机会显示联络人', + 'Contacts related to Accounts' => '与客户有关的联络人', + 'Contacts not related to Accounts' => '与客户无关的联络人', + 'Contacts related to Potentials' => '与潜在机会有关的联络人', + 'Lead by Source' => '按来源显示准客户', + 'Lead Status Report' => '准客户状态报表', + 'Potential Pipeline' => '潜在机会圆饼图', + 'Closed Potentials' => '已结案潜在机会', + 'Potential that have Won' => '成功结案的潜在机会', + 'Tickets by Products' => '按产品显示传票', + 'Tickets by Priority' => '按优先级显示传票', + 'Open Tickets' => '待处理传票', +'Tickets related to Products' => '与产品有关的传票', + 'Tickets that are Open' => '待处理传票', + 'Product Details' => '产品细节', + 'Products by Contacts' => '按联络人显示产品', + 'Product Detailed Report' => '产品细节报表', + 'Products related to Contacts' => '与联络人有关的产品', + 'Open Quotes' => '进行中的报价', + 'Quotes Detailed Report' => '报价细节报表', + 'Quotes that are Open' => '进行中的报价', + 'PurchaseOrder by Contacts' => '按联络人显示采购订单', + 'PurchaseOrder Detailed Report' => '采购订单细节报表', + 'PurchaseOrder related to Contacts' => '与联络人有关的采购订单', + 'Invoice Detailed Report' => '发票细节报表', + 'Last Month Activities' => '上个月的工作状况', + 'This Month Activities' => '这个月的工作状况', + 'Campaign Expectations and Actuals' => '活动的预期与实际状况', //Added for Campaigns + 'SalesOrder Detailed Report' => '销售订单细节报表',//Added for SO + +'LBL_DELETE' => '删除', + 'Create_Reports' => '建立报表', + 'Create_New_Folder' => '建立新数据夹', + 'Move_Reports' => '移动报表', + 'Delete_Report' => '删除报表', + +'Custom' => '自订', + 'Previous FY' => '上一个财务年度', + 'Current FY' => '这个财务年度', + 'Next FY' => '下一个财务年度', + 'Previous FQ' => '上一季', + 'Current FQ' => '这一季', + 'Next FQ' => '下一季', + 'Yesterday' => '昨天', + 'Today' => '今天', + 'Tomorrow' => '明天', + 'Last Week' => '上星期', + 'Current Week' => '这星期', + 'Next Week' => '下星期', + 'Last Month' => '上个月', + 'Current Month' => '这个月', + 'Next Month' => '下个月', + 'Last 7 Days' => '过去7天', + 'Last 30 Days' => '过去30天', + 'Last 60 Days' => '过去60天', + 'Last 90 Days' => '过去90天', + 'Last 120 Days' => '过去120天', + 'Next 7 Days' => '未来7天', + 'Next 30 Days' => '未来30天', + 'Next 60 Days' => '未来60天', + 'Next 90 Days' => '未来90天', + 'Next 120 Days' => '未来120天', +'TITLE_VTIGERCRM_CREATE_REPORT' => 'vtiger CRM - 创建报告', +'TITLE_VTIGERCRM_PRINT_REPORT' => 'vtiger - 打印报告', +'NO_FILTER_SELECTED' => '没有过滤选择', + +'LBL_GENERATE_NOW' => '现在制作', +'Totals'=>'字段名', +'SUM' => '小计', + 'AVG' => '平均', + 'MAX' => '最大', + 'MIN' => '最小', + 'LBL_CUSTOM_REPORTS' => '自订报表', + +'ticketid'=>'传票ID', +'NO_COLUMN'=>'没有栏目提供', +// Added/Updated for vtiger CRM 5.0.4 +'LBL_REPORT_DELETED' => '您要查看的报告已删除。', + +//Added for Reports +'LBL_SHARING'=>'共享', +'SELECT_FILTER_TYPE'=>'选择报告类型', +'LBL_USERS'=>'用户', +'LBL_GROUPS'=>'组', +'LBL_SELECT_FIELDS'=>'选择字段', +'LBL_MEMBERS'=>'成员', +'LBL_RELATED_FIELDS'=>'相关字段', +'LBL_NO_ACCESS'=>' 拒绝访问模块 ', +'LBL_NOT_ACTIVE'=>' 拒绝访问模块 ', +'LBL_PERM_DENIED'=>' 许可被拒绝的报告: ', +'LBL_FLDR_NOT_EMPTY'=>'您正在试图删除文件夹非空,请首先移动或删除其中的的报告。', +'NO_REL_MODULES'=>'您选择的模块没有关相关模块', + +'Contacts_First_Name' =>'联系人的名', +) + +?> diff --git a/oss/vtiger/trunk/modules/Rss/Delete.php b/oss/vtiger/trunk/modules/Rss/Delete.php new file mode 100644 index 00000000..0d5460f6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/Delete.php @@ -0,0 +1,31 @@ +pquery($del_query, array($_REQUEST['record'])); + + //code added for returning back to the current view after delete from list view +header("Location: index.php?module=".vtlib_purify($_REQUEST['return_module'])."&action=RssAjax&file=ListView&directmode=ajax"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Rss/Forms.php b/oss/vtiger/trunk/modules/Rss/Forms.php new file mode 100644 index 00000000..13c990a2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/Forms.php @@ -0,0 +1,45 @@ +getAllRssFeeds(); +function get_rssfeeds_form() { +global $mod_strings; +global $app_strings; +global $app_list_strings; +global $image_path; + +$oRss = new vtigerRSS(); +$allrsshtml = $oRss->getRSSCategoryHTML(); +//$starred_rss_html = $oRss->getStarredRssFolder(); + +$the_form .= ''; + +$the_form .= $allrsshtml; + +$the_form .= "
    "; +return $the_form; +} + +?> diff --git a/oss/vtiger/trunk/modules/Rss/ListView.html b/oss/vtiger/trunk/modules/Rss/ListView.html new file mode 100644 index 00000000..7b6cf842 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/ListView.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + {RSSFEEDS_TITLE} +
    + {RSSFEEDS} +
    + {RSSDETAILS} +
    + + diff --git a/oss/vtiger/trunk/modules/Rss/ListView.php b/oss/vtiger/trunk/modules/Rss/ListView.php new file mode 100644 index 00000000..b3f23c1a --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/ListView.php @@ -0,0 +1,92 @@ +assign("MOD", $mod_strings); +$rss_form->assign("APP", $app_strings); +$rss_form->assign("THEME",$theme); +$rss_form->assign("IMAGE_PATH",$image_path); +$rss_form->assign("MODULE", $currentModule); +$rss_form->assign("CATEGORY", getParenttab()); + +//<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>// +//$url = 'http://forums/rss.php?name=forums&file=rss'; +//$url = 'http://forums/weblog_rss.php?w=202'; +if(isset($_REQUEST[record])) +{ + $recordid = vtlib_purify($_REQUEST['record']); + $url = $oRss->getRssUrlfromId($recordid); + if($oRss->setRSSUrl($url)) + { + $rss_html = $oRss->getSelectedRssHTML($recordid); + }else + { + $rss_html = "".$mod_strings['LBL_ERROR_MSG'].""; + } + $rss_form->assign("TITLE",gerRssTitle($recordid)); + $rss_form->assign("ID",$recordid); +}else +{ + $rss_form->assign("TITLE",gerRssTitle()); + $rss_html = $oRss->getStarredRssHTML(); + $query = "select rssid from vtiger_rss where starred=1"; + $result = $adb->pquery($query, array()); + $recordid = $adb->query_result($result,0,'rssid'); + $rss_form->assign("ID",$recordid); + $rss_form->assign("DEFAULT",'yes'); +} +if($currentModule == "Rss") +{ + require_once("modules/".$currentModule."/Forms.php"); + if (function_exists('get_rssfeeds_form')) + { + $rss_form->assign("RSSFEEDS", get_rssfeeds_form()); + } +} +$rss_form->assign("RSSDETAILS",$rss_html); +//<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>// +if(isset($_REQUEST['directmode']) && $_REQUEST['directmode'] == 'ajax') + $rss_form->display("RssFeeds.tpl"); +else + $rss_form->display("Rss.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Rss/Popup.html b/oss/vtiger/trunk/modules/Rss/Popup.html new file mode 100644 index 00000000..e538a25f --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/Popup.html @@ -0,0 +1,57 @@ + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    Add RSS Feed:
    RSS Feed URL:
    Choose Category: +
    Set as Starred
    + + + + +
    + +
    +

    + +
    + + diff --git a/oss/vtiger/trunk/modules/Rss/Popup.php b/oss/vtiger/trunk/modules/Rss/Popup.php new file mode 100644 index 00000000..c38da112 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/Popup.php @@ -0,0 +1,50 @@ +pquery($query, array()); + $query = 'update vtiger_rss set starred=1 where rssid =?'; + $adb->pquery($query, array($_REQUEST["record"])); + echo vtlib_purify($_REQUEST["record"]); +} +elseif(isset($_REQUEST["rssurl"])) +{ + $newRssUrl = str_replace('##amp##','&',$_REQUEST["rssurl"]); + $setstarred = 0; + $oRss = new vtigerRSS(); + if($oRss->setRSSUrl($newRssUrl)) + { + $result = $oRss->saveRSSUrl($newRssUrl,$setstarred); + if($result == false) + { + echo $mod_strings['UNABLE_TO_SAVE'] ; + }else + { + echo $result; + } + }else + { + echo $mod_strings['NOT_A_VALID']; + + } +} + +?> diff --git a/oss/vtiger/trunk/modules/Rss/Rss.js b/oss/vtiger/trunk/modules/Rss/Rss.js new file mode 100644 index 00000000..d9bf2ac8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/Rss.js @@ -0,0 +1,60 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. +* + ********************************************************************************/ + +function star(id, starred) +{ + location.href = "index.php?module=Rss&action=Star&record="+id+"&starred="+starred; + + var elem = document.getElementById("star-"+id); + if(elem.src.indexOf("onstar.gif") != -1) { + elem.src = "themes/images/offstar.gif"; + }else { + elem.src = "themes/images/onstar.gif"; + } +} +function getRequest() { + if ( !httpRequest ) { + httpRequest = new XMLHttpRequest(); + } + return httpRequest; + } +function makeRequest(targetUrl) { + var httpRequest = getRequest(); + httpRequest.open("GET", targetUrl, false, false, false); + httpRequest.send(""); + switch ( httpRequest.status ) { + case 200: + return httpRequest.responseText; + break; + default: + alert(alert_arr.PROBLEM_ACCESSSING_URL+targetUrl+alert_arr.CODE+httpRequest.status); + return null; + break; + } + } +function verify_data(form) { + var isError = false; + var errorMessage = ""; + if (trim(form.rssurl.value) == "") { + isError = true; + errorMessage += "\nRSS Feed URL"; + } + // Here we decide whether to submit the form. + if (isError == true) { + alert(alert_arr.MISSING_REQUIRED_FIELDS + errorMessage); + return false; + } + return true; +} +function display(url,id) +{ + document.getElementById('rsstitle').innerHTML = document.getElementById(id).innerHTML; + document.getElementById('mysite').src = url; +} diff --git a/oss/vtiger/trunk/modules/Rss/Rss.php b/oss/vtiger/trunk/modules/Rss/Rss.php new file mode 100644 index 00000000..9dfc2b58 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/Rss.php @@ -0,0 +1,464 @@ +rss = fetch_rss($url); + // Read in our sample feed file + //$data = @implode("",@file($url)); + // Tell feedParser to parse the data + $info = $this->rss->items; + + if(isset($info)) + { + $this->rss_object = $info; + }else + { + return false; + } + if(isset($this->rss)) + { + $this->rss_title = $this->rss->channel["title"]; + $this->rss_link = $this->rss->channel["link"]; + $this->rss_object = $info; + return true; + }else + { + return false; + } + + } + + /** Function to get the List of Rss feeds + * This Function accepts no arguments and returns the listview contents on Sucess + * returns "Sorry: It's not possible to reach RSS URL" if fails + */ + + function getListViewRSSHtml() + { + global $default_charset; + if(isset($this->rss_object)) + { + $i = 0; + foreach($this->rss_object as $key=>$item) + { + $stringConvert = function_exists(iconv) ? @iconv("UTF-8",$default_charset,$item[title]) : $item[title]; + $rss_title= ltrim(rtrim($stringConvert)); + + $i = $i + 1; + $shtml .= "".$rss_title."".$this->rss_title.""; + if($i == 10) + { + return $shtml; + } + } + + return $shtml; + + }else + { + $shtml = "".$mod_strings['LBL_REGRET_MSG'].""; + } + } + + /** Function to get the List of Rss feeds in the Customized Home page + * This Function accepts maximum entries as arguments and returns the listview contents on Success + * returns "Sorry: It's not possible to reach RSS URL" if fails + */ + function getListViewHomeRSSHtml($maxentries) + { + $return_value=Array(); + $return_more=Array(); + if(isset($this->rss_object)) + { + $y = 0; + + foreach($this->rss_object as $key=>$item) + { + $title =$item[title]; + $link = $item[link]; + + if($y == $maxentries) + { + $return_more=Array("Details"=>$return_value,"More"=>$this->rss_link); + return $return_more; + } + $y = $y + 1; + $return_value[]=Array($title,$link); + } + $return_more=Array("Details"=>$return_value,"More"=>$this->rss_link); + return $return_more; + + }else + { + return $return_more; + } + } + + /** Function to save the Rss Feeds + * This Function accepts the RssURl,Starred Status as arguments and + * returns true on sucess + * returns false if fails + */ + function saveRSSUrl($url,$makestarred=0) + { + global $adb; + + if ($url != "") + { + $rsstitle = $this->rss_title; + if($rsstitle == "") + { + $rsstitle = $url; + } + $genRssId = $adb->getUniqueID("vtiger_rss"); + $sSQL = "insert into vtiger_rss (RSSID,RSSURL,RSSTITLE,RSSTYPE,STARRED) values (?,?,?,?,?)"; + $sparams = array($genRssId, $url, $rsstitle, 0, $makestarred); + $result = $adb->pquery($sSQL, $sparams); + if($result) + { + return $genRssId; + }else + { + return false; + } + } + } + function getCRMRssFeeds() + { + global $adb; + global $image_path,$theme; + + $sSQL = "select * from vtiger_rss where rsstype=1"; + $result = $adb->pquery($sSQL, array()); + while($allrssrow = $adb->fetch_array($result)) + { + $shtml .= ""; + if($allrssrow["starred"] == 1) + { + $shtml .= " + "; + }else + { + $shtml .= " + "; + } + $shtml .= "".$allrssrow[rsstitle].""; + $shtml .= " "; + + } + return $shtml; + + } + + function getAllRssFeeds() + { + global $adb; + global $image_path; + + $sSQL = "select * from vtiger_rss where rsstype <> 1"; + $result = $adb->pquery($sSQL, array()); + while($allrssrow = $adb->fetch_array($result)) + { + $shtml .= ""; + if($allrssrow["starred"] == 1) + { + $shtml .= " + "; + }else + { + $shtml .= " + "; + } + $shtml .= "".$allrssrow[rsstitle]." "; + $shtml .= ""; + + } + + return $shtml; + } + + /** Function to get the rssurl for the given id + * This Function accepts the rssid as argument and returns the rssurl for that id + */ + function getRssUrlfromId($rssid) + { + global $adb; + + if($rssid != "") + { + $sSQL = "select * from vtiger_rss where rssid=?"; + $result = $adb->pquery($sSQL, array($rssid)); + $rssrow = $adb->fetch_array($result); + + if(count($rssrow) > 0) + { + $rssurl = $rssrow[rssurl]; + } + } + return $rssurl; + } + + function getRSSHeadings($rssid) + { + global $image_path; + global $adb; + + if($rssid != "") + { + $sSQL = "select * from vtiger_rss where rssid=?"; + $result = $adb->pquery($sSQL, array($rssid)); + $rssrow = $adb->fetch_array($result); + + if(count($rssrow) > 0) + { + $shtml = " + + + +
    "; + if($rssrow[starred] == 1) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + $shtml .= "rss_object[link]."\"> ".$rssrow[rsstitle]." +
    "; + + } + } + return $shtml; + } + + /** Function to get the StarredRSSFeeds lists + * This Function accepts no argument and returns the rss feeds of + * the starred Feeds as HTML strings + */ + function getTopStarredRSSFeeds() + { + global $adb; + global $image_path; + + $sSQL = "select * from vtiger_rss where starred=1"; + $result = $adb->pquery($sSQL, array()); + $shtml .= "Add New Rss"; + + while($allrssrow = $adb->fetch_array($result)) + { + $shtml .= ""; + $shtml .= " ".substr($allrssrow['rsstitle'],0,10)."..."; + } + return $shtml; + } + + /** Function to get the rssfeed lists for the starred Rss feeds + * This Function accepts no argument and returns the rss feeds of + * the starred Feeds as HTML strings + */ + function getStarredRssHTML() + { + global $adb; + global $image_path,$mod_strings; + + $sSQL = "select * from vtiger_rss where starred=1"; + $result = $adb->pquery($sSQL, array()); + while($allrssrow = $adb->fetch_array($result)) + { + if($this->setRSSUrl($allrssrow["rssurl"])) + { + $rss_html = $this->getListViewRSSHtml(); + } + $shtml .= $rss_html; + if(isset($this->rss_object)) + { + if(count($this->rss_object) > 10) + { + $shtml .= " + rss_link\">".$mod_strings['LBL_MORE']." + "; + } + } + $sreturnhtml[] = $shtml; + $shtml = ""; + } + + $recordcount = round((count($sreturnhtml))/2); + $j = $recordcount; + for($i=0;$i<$recordcount;$i++) + { + $starredhtml .= $sreturnhtml[$i].$sreturnhtml[$j]; + $j = $j + 1; + } + $starredhtml = " + + + + ".$starredhtml."
    ".$mod_strings['LBL_SUBJECT']."".$mod_strings['LBL_SENDER']."
    "; + + return $starredhtml; + + } + + /** Function to get the rssfeed lists for the given rssid + * This Function accepts the rssid as argument and returns the rss feeds as HTML strings + */ + function getSelectedRssHTML($rssid) + { + global $adb; + global $image_path, $mod_strings; + + $sSQL = "select * from vtiger_rss where rssid=?"; + $result = $adb->pquery($sSQL, array($rssid)); + while($allrssrow = $adb->fetch_array($result)) + { + if($this->setRSSUrl($allrssrow["rssurl"])) + { + $rss_html = $this->getListViewRSSHtml(); + } + $shtml .= $rss_html; + if(isset($this->rss_object)) + { + if(count($this->rss_object) > 10) + { + $shtml .= " + rss_link\">".$mod_strings['LBL_MORE']." + "; + } + } + $sreturnhtml[] = $shtml; + $shtml = ""; + } + + $recordcount = round((count($sreturnhtml))/2); + $j = $recordcount; + for($i=0;$i<$recordcount;$i++) + { + $starredhtml .= $sreturnhtml[$i].$sreturnhtml[$j]; + $j = $j + 1; + } + $starredhtml = " + + + + ".$starredhtml."
    ".$mod_strings['LBL_SUBJECT']."".$mod_strings['LBL_SENDER']."
    "; + + return $starredhtml; + + } + + /** Function to get the Rss Feeds by Category + * This Function accepts the RssCategory as argument + * and returns the html string for the Rss feeds lists + */ + function getRSSCategoryHTML() + { + global $adb; + global $image_path; + $shtml .= " + + ".$this->getRssFeedsbyCategory()."
    + + "; + + return $shtml; + } + + /** Function to get the Rss Feeds for the Given Category + * This Function accepts the RssCategory as argument + * and returns the html string for the Rss feeds lists + */ + function getRssFeedsbyCategory() + { + + global $adb; + global $image_path,$theme; + + $sSQL = "select * from vtiger_rss"; + $result = $adb->pquery($sSQL, array()); + while($allrssrow = $adb->fetch_array($result)) + { + $shtml .= ""; + $shtml .= ""; + if($allrssrow["starred"] == 1) + { + $shtml .= ""; + }else + { + $shtml .= ""; + } + $shtml .= ""; + $shtml .= "".$allrssrow[rsstitle]." "; + $shtml .= ""; + } + return $shtml; + + } + + // Function to delete an entity with given Id + function trash($module, $id) { + global $log, $adb; + + $del_query = 'DELETE FROM vtiger_rss WHERE rssid=?'; + $adb->pquery($del_query, array($id)); + } + +} + +/** Function to get the rsstitle for the given rssid + * This Function accepts the rssid as an optional argument and returns the title + * if no id is passed it will return the tittle of the starred rss + */ +function gerRssTitle($id='') +{ + global $adb; + if($id == '') { + $query = 'select * from vtiger_rss where starred=1'; + $params = array(); + } else { + $query = 'select * from vtiger_rss where rssid =?'; + $params = array($id); + } + $result = $adb->pquery($query, $params); + $title = $adb->query_result($result,0,'rsstitle'); + return $title; + +} + + + +?> diff --git a/oss/vtiger/trunk/modules/Rss/RssAjax.php b/oss/vtiger/trunk/modules/Rss/RssAjax.php new file mode 100644 index 00000000..74c430d8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/RssAjax.php @@ -0,0 +1,15 @@ + diff --git a/oss/vtiger/trunk/modules/Rss/Save.php b/oss/vtiger/trunk/modules/Rss/Save.php new file mode 100644 index 00000000..34eb5920 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/Save.php @@ -0,0 +1,24 @@ +setRSSUrl($newRssUrl)) { + if($oRss->saveRSSUrl($newRssUrl) == false) { + echo $mod_strings['UNABLE_TO_SAVE']; + } +} else { + echo $mod_strings['INVALID_RSS_URL']; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Rss/Star.php b/oss/vtiger/trunk/modules/Rss/Star.php new file mode 100644 index 00000000..04d05e56 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/Star.php @@ -0,0 +1,24 @@ +pquery($sSQL, array($starred, $recordid)); +} +header("Location: index.php?module=Rss&action=index"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Rss/index.php b/oss/vtiger/trunk/modules/Rss/index.php new file mode 100644 index 00000000..f26ed783 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/index.php @@ -0,0 +1,27 @@ + diff --git a/oss/vtiger/trunk/modules/Rss/language/en_us.lang.php b/oss/vtiger/trunk/modules/Rss/language/en_us.lang.php new file mode 100644 index 00000000..04f31957 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/language/en_us.lang.php @@ -0,0 +1,59 @@ +'RSS', +'LBL_MODULE_TITLE'=>'RSS: Home', + +'LBL_NEW_RSS_ENTRY'=>'New RSS News Feed URL:', +'LBL_SEARCH_RSS'=>'Search Title:', +'LBL_NEW_RSS_BUTTON'=>'Add', + +'LBL_STARRED_RSS'=>'Starred Feeds', +'LBL_POP_CRM_RSS'=>'Popular CRM Related Feeds', +'LBL_ALL_RSS_FEEDS'=>'All RSS Feeds', +'LBL_VTIGER_RSS_READER'=>'vtiger RSS Reader', + +'LBL_MORE'=>'More...', +'LBL_SUBJECT'=>'Subject', +'LBL_SENDER'=>'Sender', +'LBL_CATEGORY'=>'Category :', +'LBL_FEED'=>'Feed :', +'LBL_FEED_SOURCES'=> 'Feed Sources', +'LBL_ADD_RSS_FEED'=>'Add RSS Feed', +'LBL_DELETE_BUTTON'=>'Delete', +'LBL_SET_DEFAULT_BUTTON'=>'Set As Default', +'LBL_FEEDS_LIST'=>'Feeds list from :', +'LBL_ERROR_MSG'=>'No RSS Feeds are selected or Your Proxy Settings is not Proper', +'LBL_REGRET_MSG'=>'Sorry: It\'s not possible to reach RSS URL', + +'UNABLE_TO_SAVE'=>'Unable to save the RSS Feed URL', + +// Added/Updated for vtiger CRM 5.0.4 +'NOT_A_VALID'=>'Not a valid RSS Feed or Your Proxy Settings is not Proper', + +// Added after 5.0.4 GA +'INVALID_RSS_URL' => 'Not a valid RSS URL', +'UNABLE_TO_SAVE' => 'Unable to save the Url', + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Rss/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Rss/language/zh_cn.lang.php new file mode 100644 index 00000000..1706ea67 --- /dev/null +++ b/oss/vtiger/trunk/modules/Rss/language/zh_cn.lang.php @@ -0,0 +1,52 @@ + '新闻', + 'LBL_MODULE_TITLE' => '新闻:首页', + +'LBL_NEW_RSS_ENTRY' => '新闻RSS资料来源网址:', + 'LBL_SEARCH_RSS' => '标题搜寻:', + 'LBL_NEW_RSS_BUTTON' => '新增', + + 'LBL_STARRED_RSS' => '重要新闻', + 'LBL_POP_CRM_RSS' => 'CRM相关热门新闻', + 'LBL_ALL_RSS_FEEDS' => '所有他站新闻', +'LBL_VTIGER_RSS_READER'=>'vtiger RSS 读者', + +'LBL_MORE' => '更多...', + 'LBL_SUBJECT' => '主旨', + 'LBL_SENDER' => '寄件人', + 'LBL_CATEGORY' => '类别:', + 'LBL_FEED' => '资料来源:', +'LBL_FEED_SOURCES'=> 'Feed 来源', +'LBL_ADD_RSS_FEED' => '新增 RSS 资料来源', +'LBL_DELETE_BUTTON'=>'删除', +'LBL_SET_DEFAULT_BUTTON'=>'预设', +'LBL_FEEDS_LIST' => '资料来源:', + 'LBL_ERROR_MSG' => '没有选择 RSS 来源或是您的代理服务器设定有问题', + 'LBL_REGRET_MSG' => '抱歉:无法取得 RSS 网址', + +'UNABLE_TO_SAVE'=>'无法保存 RSS 资料地址', +'NOT_A_VALID'=>'不是一个有效的rss资料或你的代理服务器设置是不正确的', +); +?> diff --git a/oss/vtiger/trunk/modules/SalesOrder/CallRelatedList.php b/oss/vtiger/trunk/modules/SalesOrder/CallRelatedList.php new file mode 100644 index 00000000..b7a1f40d --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/CallRelatedList.php @@ -0,0 +1,71 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['subject']; + $log->debug("id is ".$focus->id); + $log->debug("name is ".$focus->name); + } + + global $mod_strings; + global $app_strings,$currentModule; + global $theme; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + if (isset($focus->name)) $smarty->assign("NAME", $focus->name); + $related_array=getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); + $smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + $smarty->assign("CATEGORY",$category); + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("ID",$focus->id); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $smarty->assign("MODULE",$currentmodule); + $smarty->assign("SINGLE_MOD",$mod_strings['SalesOrder']); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/CreateSOPDF.php b/oss/vtiger/trunk/modules/SalesOrder/CreateSOPDF.php new file mode 100644 index 00000000..66a6d3e2 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/CreateSOPDF.php @@ -0,0 +1,19 @@ +Output('SalesOrder.pdf','D'); //added file name to make it work in IE, also forces the download giving the user the option to save + +exit(); +?> diff --git a/oss/vtiger/trunk/modules/SalesOrder/CustomView.php b/oss/vtiger/trunk/modules/SalesOrder/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/SalesOrder/Delete.php b/oss/vtiger/trunk/modules/SalesOrder/Delete.php new file mode 100644 index 00000000..62227735 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/Delete.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/DetailView.php b/oss/vtiger/trunk/modules/SalesOrder/DetailView.php new file mode 100644 index 00000000..5f41c089 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/DetailView.php @@ -0,0 +1,132 @@ +retrieve_entity_info($_REQUEST['record'],"SalesOrder"); + $focus->id = $_REQUEST['record']; + $focus->name=$focus->column_fields['subject']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("SalesOrder detail view"); + +$smarty = new vtigerCRM_Smarty; + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +if (isset($focus->name)) +$smarty->assign("NAME", $focus->name); +else +$smarty->assign("NAME", ""); +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); + +$smarty->assign("CUSTOMFIELD", $cust_fld); +$smarty->assign("ID", vtlib_purify($_REQUEST['record'])); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign("SINGLE_MOD", 'SalesOrder'); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + + +if(isPermitted("SalesOrder","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + +$smarty->assign("CREATEPDF","permitted"); + +if(isPermitted("Invoice","EditView",$_REQUEST['record']) == 'yes') + $smarty->assign("CONVERTINVOICE","permitted"); + +if(isPermitted("SalesOrder","Delete",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + +$smarty->assign("MODULE", $currentModule); +$smarty->assign("CONVERTMODE",'sotoinvoice'); +//Get the associated Products and then display above Terms and Conditions +$smarty->assign("ASSOCIATED_PRODUCTS",getDetailAssociatedProducts('SalesOrder',$focus)); + + $tabid = getTabid("SalesOrder"); + $validationData = getDBValidationData($focus->tab_name,$tabid); + $data = split_validationdataArray($validationData); + + $smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); + $smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); + $smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); +$smarty->assign("TODO_PERMISSION",CheckFieldPermission('parent_id','Calendar')); +$smarty->assign("EVENT_PERMISSION",CheckFieldPermission('parent_id','Events')); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); + +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); + +if($singlepane_view == 'true') +{ + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +$smarty->assign("SinglePane_View", $singlepane_view); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("Inventory/InventoryDetailView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/DetailViewAjax.php b/oss/vtiger/trunk/modules/SalesOrder/DetailViewAjax.php new file mode 100644 index 00000000..92af26bf --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/DetailViewAjax.php @@ -0,0 +1,45 @@ +retrieve_entity_info($crmid,"SalesOrder"); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("SalesOrder"); + if($modObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/EditView.php b/oss/vtiger/trunk/modules/SalesOrder/EditView.php new file mode 100644 index 00000000..486fd71a --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/EditView.php @@ -0,0 +1,363 @@ +debug("Inside Sales Order EditView"); + +$focus = CRMEntity::getInstance($currentModule); +$smarty = new vtigerCRM_Smarty(); +//added to fix the issue4600 +$searchurl = getBasic_Advance_SearchURL(); +$smarty->assign("SEARCH", $searchurl); +//4600 ends + +$currencyid = fetchCurrency($current_user->id); +$rate_symbol = getCurrencySymbolandCRate($currencyid); +$rate = $rate_symbol['rate']; +if (isset ($_REQUEST['record']) && $_REQUEST['record'] != '') { + if (isset ($_REQUEST['convertmode']) && $_REQUEST['convertmode'] == 'quotetoso') { + $quoteid = $_REQUEST['record']; + $quote_focus = new Quotes(); + $quote_focus->id = $quoteid; + $quote_focus->retrieve_entity_info($quoteid, "Quotes"); + $focus = getConvertQuoteToSoObject($focus, $quote_focus, $quoteid); + $focus->id = $quoteid; + + // Reset the value w.r.t Quote Selected + $currencyid = $quote_focus->column_fields['currency_id']; + $rate = $quote_focus->column_fields['conversion_rate']; + + //Added to display the Quotes's associated vtiger_products -- when we create SO from Quotes DetailView + $associated_prod = getAssociatedProducts("Quotes", $quote_focus); + $smarty->assign("CONVERT_MODE", $_REQUEST['convertmode']); + $smarty->assign("QUOTE_ID", $quoteid); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $quote_focus->mode); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + + } + elseif (isset ($_REQUEST['convertmode']) && $_REQUEST['convertmode'] == 'update_quote_val') { + //Updating the Selected Quote Value in Edit Mode + foreach ($focus->column_fields as $fieldname => $val) { + if (isset ($_REQUEST[$fieldname])) { + $value = $_REQUEST[$fieldname]; + $focus->column_fields[$fieldname] = $value; + + } + + } + //Handling for dateformat in due_date vtiger_field + if ($focus->column_fields['duedate'] != '') { + $curr_due_date = $focus->column_fields['duedate']; + $focus->column_fields['duedate'] = getDBInsertDateValue($curr_due_date); + } + + $quoteid = $focus->column_fields['quote_id']; + $smarty->assign("QUOTE_ID", $focus->column_fields['quote_id']); + $quote_focus = new Quotes(); + $quote_focus->id = $quoteid; + $quote_focus->retrieve_entity_info($quoteid, "Quotes"); + $focus = getConvertQuoteToSoObject($focus, $quote_focus, $quoteid); + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->name = $focus->column_fields['subject']; + + // Reset the value w.r.t Quote Selected + $currencyid = $quote_focus->column_fields['currency_id']; + $rate = $quote_focus->column_fields['conversion_rate']; + + } else { + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'], "SalesOrder"); + $focus->name = $focus->column_fields['subject']; + } +} else { + if (isset ($_REQUEST['convertmode']) && $_REQUEST['convertmode'] == 'update_quote_val') { + //Updating the Select Quote Value in Create Mode + foreach ($focus->column_fields as $fieldname => $val) { + if (isset ($_REQUEST[$fieldname])) { + $value = $_REQUEST[$fieldname]; + $focus->column_fields[$fieldname] = $value; + } + + } + //Handling for dateformat in due_date vtiger_field + if ($focus->column_fields['duedate'] != '') { + $curr_due_date = $focus->column_fields['duedate']; + $focus->column_fields['duedate'] = getDBInsertDateValue($curr_due_date); + } + $quoteid = $focus->column_fields['quote_id']; + $quote_focus = new Quotes(); + $quote_focus->id = $quoteid; + $quote_focus->retrieve_entity_info($quoteid, "Quotes"); + $focus = getConvertQuoteToSoObject($focus, $quote_focus, $quoteid); + + // Reset the value w.r.t Quote Selected + $currencyid = $quote_focus->column_fields['currency_id']; + $rate = $quote_focus->column_fields['conversion_rate']; + + //Added to display the Quotes's associated vtiger_products -- when we select Quote in New SO page + if (isset ($_REQUEST['quote_id']) && $_REQUEST['quote_id'] != '') { + $associated_prod = getAssociatedProducts("Quotes", $quote_focus, $focus->column_fields['quote_id']); + } + + $smarty->assign("QUOTE_ID", $focus->column_fields['quote_id']); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $quote_focus->mode); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + } +} + +if (isset ($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $smarty->assign("DUPLICATE_FROM", $focus->id); + $SO_associated_prod = getAssociatedProducts("SalesOrder", $focus); + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +if (isset ($_REQUEST['potential_id']) && $_REQUEST['potential_id'] != '') { + $focus->column_fields['potential_id'] = $_REQUEST['potential_id']; + $relatedInfo = getRelatedInfo($_REQUEST['potential_id']); + if (!empty ($relatedInfo)) { + $setype = $relatedInfo["setype"]; + $relID = $relatedInfo["relID"]; + } + if ($setype == 'Accounts') { + $_REQUEST['account_id'] = $relID; + } + elseif ($setype == 'Contacts') { + $_REQUEST['contact_id'] = $relID; + } + $log->debug("Sales Order EditView: Potential Id from the request is " . $_REQUEST['potential_id']); + $associated_prod = getAssociatedProducts("Potentials", $focus, $focus->column_fields['potential_id']); +} + +if (isset ($_REQUEST['product_id']) && $_REQUEST['product_id'] != '') { + $focus->column_fields['product_id'] = $_REQUEST['product_id']; + $associated_prod = getAssociatedProducts("Products", $focus, $focus->column_fields['product_id']); + for ($i=1; $i<=count($associated_prod);$i++) { + $associated_prod_id = $associated_prod[$i]['hdnProductId'.$i]; + $associated_prod_prices = getPricesForProducts($currencyid,array($associated_prod_id),'Products'); + $associated_prod[$i]['listPrice'.$i] = $associated_prod_prices[$associated_prod_id]; + } + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); +} +if (!empty ($_REQUEST['parent_id']) && !empty ($_REQUEST['return_module'])) { + if ($_REQUEST['return_module'] == 'Services') { + $focus->column_fields['product_id'] = $_REQUEST['parent_id']; + $log->debug("Service Id from the request is " . $_REQUEST['parent_id']); + $associated_prod = getAssociatedProducts("Services", $focus, $focus->column_fields['product_id']); + for ($i=1; $i<=count($associated_prod);$i++) { + $associated_prod_id = $associated_prod[$i]['hdnProductId'.$i]; + $associated_prod_prices = getPricesForProducts($currencyid,array($associated_prod_id),'Services'); + $associated_prod[$i]['listPrice'.$i] = $associated_prod_prices[$associated_prod_id]; + } + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + } +} + +// Get Account address if vtiger_account is given +if ((isset ($_REQUEST['account_id'])) && ($_REQUEST['record'] == '') && ($_REQUEST['account_id'] != '') && ($_REQUEST['convertmode'] != 'update_quote_val')) { + require_once ('modules/Accounts/Accounts.php'); + $acct_focus = new Accounts(); + $acct_focus->retrieve_entity_info($_REQUEST['account_id'], "Accounts"); + $focus->column_fields['bill_city'] = $acct_focus->column_fields['bill_city']; + $focus->column_fields['ship_city'] = $acct_focus->column_fields['ship_city']; + //added to fix the issue 4526 + $focus->column_fields['bill_pobox'] = $acct_focus->column_fields['bill_pobox']; + $focus->column_fields['ship_pobox'] = $acct_focus->column_fields['ship_pobox']; + $focus->column_fields['bill_street'] = $acct_focus->column_fields['bill_street']; + $focus->column_fields['ship_street'] = $acct_focus->column_fields['ship_street']; + $focus->column_fields['bill_state'] = $acct_focus->column_fields['bill_state']; + $focus->column_fields['ship_state'] = $acct_focus->column_fields['ship_state']; + $focus->column_fields['bill_code'] = $acct_focus->column_fields['bill_code']; + $focus->column_fields['ship_code'] = $acct_focus->column_fields['ship_code']; + $focus->column_fields['bill_country'] = $acct_focus->column_fields['bill_country']; + $focus->column_fields['ship_country'] = $acct_focus->column_fields['ship_country']; + +} + +$theme_path = "themes/" . $theme . "/"; +$image_path = $theme_path . "images/"; + +$disp_view = getView($focus->mode); +$mode = $focus->mode; +if ($disp_view == 'edit_view') + $smarty->assign("BLOCKS", getBlocks($currentModule, $disp_view, $mode, $focus->column_fields)); +else { + $bas_block = getBlocks($currentModule, $disp_view, $mode, $focus->column_fields, 'BAS'); + $adv_block = getBlocks($currentModule, $disp_view, $mode, $focus->column_fields, 'ADV'); + + $blocks['basicTab'] = $bas_block; + if (is_array($adv_block)) + $blocks['moreTab'] = $adv_block; + + $smarty->assign("BLOCKS", $blocks); + $smarty->assign("BLOCKS_COUNT", count($blocks)); +} +$smarty->assign("OP_MODE", $disp_view); + +$smarty->assign("MODULE", $currentModule); +$smarty->assign("SINGLE_MOD", 'SalesOrder'); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$category = getParentTab(); +$smarty->assign("CATEGORY", $category); + +$log->info("Order view"); + +if (isset ($focus->name)) + $smarty->assign("NAME", $focus->name); +else + $smarty->assign("NAME", ""); + +if (isset ($_REQUEST['convertmode']) && ($_REQUEST['convertmode'] == 'quotetoso' || $_REQUEST['convertmode'] == 'update_quote_val')) { + $txtTax = (($quote_focus->column_fields['txtTax'] != '') ? $quote_focus->column_fields['txtTax'] : '0.000'); + $txtAdj = (($quote_focus->column_fields['txtAdjustment'] != '') ? $quote_focus->column_fields['txtAdjustment'] : '0.000'); + + $associated_prod = getAssociatedProducts("Quotes", $quote_focus); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $focus->mode); +} +elseif ($focus->mode == 'edit') { + $smarty->assign("UPDATEINFO", updateInfo($focus->id)); + $associated_prod = getAssociatedProducts("SalesOrder", $focus); + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $smarty->assign("MODE", $focus->mode); +} +elseif (isset ($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $smarty->assign("ASSOCIATEDPRODUCTS", $SO_associated_prod); + $smarty->assign("AVAILABLE_PRODUCTS", 'true'); + $smarty->assign("MODE", $focus->mode); +} +elseif ((isset ($_REQUEST['potential_id']) && $_REQUEST['potential_id'] != '') || (isset ($_REQUEST['product_id']) && $_REQUEST['product_id'] != '')) { + $smarty->assign("ASSOCIATEDPRODUCTS", $associated_prod); + $InvTotal = getInventoryTotal($_REQUEST['return_module'], $_REQUEST['return_id']); + $smarty->assign("MODE", $focus->mode); + + //this is to display the Product Details in first row when we create new PO from Product relatedlist + if ($_REQUEST['return_module'] == 'Products') { + $smarty->assign("PRODUCT_ID", vtlib_purify($_REQUEST['product_id'])); + $smarty->assign("PRODUCT_NAME", getProductName($_REQUEST['product_id'])); + $smarty->assign("UNIT_PRICE", vtlib_purify($_REQUEST['product_id'])); + $smarty->assign("QTY_IN_STOCK", getPrdQtyInStck($_REQUEST['product_id'])); + $smarty->assign("VAT_TAX", getProductTaxPercentage("VAT", $_REQUEST['product_id'])); + $smarty->assign("SALES_TAX", getProductTaxPercentage("Sales", $_REQUEST['product_id'])); + $smarty->assign("SERVICE_TAX", getProductTaxPercentage("Service", $_REQUEST['product_id'])); + } +} + +if (isset ($cust_fld)) { + $smarty->assign("CUSTOMFIELD", $cust_fld); +} + +if (isset ($_REQUEST['return_module'])) + $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +else + $smarty->assign("RETURN_MODULE", "SalesOrder"); +if (isset ($_REQUEST['return_action'])) + $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +else + $smarty->assign("RETURN_ACTION", "index"); +if (isset ($_REQUEST['return_id'])) + $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset ($_REQUEST['return_viewname'])) + $smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("MODULE", "SalesOrder"); +$smarty->assign("PRINT_URL", "phprint.php?jt=" . session_id() . $GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); + +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); + +//if create SO, get all available product taxes and shipping & Handling taxes + +if ($focus->mode != 'edit') { + $tax_details = getAllTaxes('available'); + $sh_tax_details = getAllTaxes('available', 'sh'); +} else { + $tax_details = getAllTaxes('available', '', $focus->mode, $focus->id); + $sh_tax_details = getAllTaxes('available', 'sh', 'edit', $focus->id); +} +$smarty->assign("GROUP_TAXES", $tax_details); +$smarty->assign("SH_TAXES", $sh_tax_details); + +$tabid = getTabid("SalesOrder"); +$validationData = getDBValidationData($focus->tab_name, $tabid); +$data = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME", $data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE", $data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL", $data['fieldlabel']); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1", array ( + $currentModule + )); + $mod_seq_prefix = $adb->query_result($mod_seq_string, 0, 'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string, 0, 'cur_id'); + if ($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix . $mod_seq_no)) + echo '
    ' . getTranslatedString('LBL_DUPLICATE') . ' ' . getTranslatedString($mod_seq_field['label']) . + ' - ' . getTranslatedString('LBL_CLICK') . ' ' . getTranslatedString('LBL_HERE') . ' ' . getTranslatedString('LBL_TO_CONFIGURE') . ' ' . getTranslatedString($mod_seq_field['label']) . ''; + else + $smarty->assign("MOD_SEQ_ID", $autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +$smarty->assign("CURRENCIES_LIST", getAllCurrencies()); +if ($focus->mode == 'edit' || $_REQUEST['isDuplicate'] == 'true') { + $inventory_cur_info = getInventoryCurrencyInfo('SalesOrder', $focus->id); + $smarty->assign("INV_CURRENCY_ID", $inventory_cur_info['currency_id']); +} else { + $smarty->assign("INV_CURRENCY_ID", $currencyid); +} + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); +if ($focus->mode == 'edit') + $smarty->display("Inventory/InventoryEditView.tpl"); +else + $smarty->display('Inventory/InventoryCreateView.tpl'); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/ListTopSalesOrder.php b/oss/vtiger/trunk/modules/SalesOrder/ListTopSalesOrder.php new file mode 100644 index 00000000..4382b121 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/ListTopSalesOrder.php @@ -0,0 +1,132 @@ +$title,'Header'=>$listview_header,'Entries'=>$listview_entries) where as listview_header and listview_entries are arrays of header and entity values which are returned from function getListViewHeader and getListViewEntries + */ +function getTopSalesOrder($maxval,$calCnt) +{ + require_once("data/Tracker.php"); + require_once('modules/SalesOrder/SalesOrder.php'); + require_once('include/logging.php'); + require_once('include/ListView/ListView.php'); + require_once('include/utils/utils.php'); + require_once('modules/CustomView/CustomView.php'); + + global $current_language,$current_user,$list_max_entries_per_page,$theme,$adb; + $current_module_strings = return_module_language($current_language, 'SalesOrder'); + + $log = LoggerManager::getLogger('so_list'); + + $url_string = ''; + $sorder = ''; + $oCustomView = new CustomView("SalesOrder"); + $customviewcombo_html = $oCustomView->getCustomViewCombo(); + if(isset($_REQUEST['viewname']) == false || $_REQUEST['viewname']=='') + { + if($oCustomView->setdefaultviewid != "") + { + $viewid = $oCustomView->setdefaultviewid; + }else + { + $viewid = "0"; + } + } + + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + //Retreive the list from Database + //<<<<<<<<>>>>>>>> + $date_var = date('Y-m-d'); + + $where = ' and vtiger_crmentity.smownerid='.$current_user->id.' and vtiger_salesorder.duedate >= \''.$date_var.'\''; + $query = getListQuery("SalesOrder",$where); + $query .=" ORDER BY total DESC"; + //<<<<<<<>>>>>>>> + + $query .= " LIMIT " . $adb->sql_escape_string($maxval); + + if($calCnt == 'calculateCnt') { + $list_result_rows = $adb->query(mkCountQuery($query)); + return $adb->query_result($list_result_rows, 0, 'count'); + } + + $list_result = $adb->query($query); + + //Retreiving the no of rows + $noofrows = $adb->num_rows($list_result); + + //Retreiving the start value from request + if(isset($_REQUEST['start']) && $_REQUEST['start'] != '') { + $start = vtlib_purify($_REQUEST['start']); + } else { + $start = 1; + } + + //Retreive the Navigation array + $navigation_array = getNavigationValues($start, $noofrows, $list_max_entries_per_page); + + if ($navigation_array['start'] == 1) + { + if($noofrows != 0) + $start_rec = $navigation_array['start']; + else + $start_rec = 0; + if($noofrows > $list_max_entries_per_page) + { + $end_rec = $navigation_array['start'] + $list_max_entries_per_page - 1; + } + else + { + $end_rec = $noofrows; + } + + } + else + { + if($navigation_array['next'] > $list_max_entries_per_page) + { + $start_rec = $navigation_array['next'] - $list_max_entries_per_page; + $end_rec = $navigation_array['next'] - 1; + } + else + { + $start_rec = $navigation_array['prev'] + $list_max_entries_per_page; + $end_rec = $noofrows; + } + } + + $focus = new SalesOrder(); + + //Retreive the List View Table Header + $title=array('myTopSalesOrders.gif',$current_module_strings['LBL_MY_TOP_SO'],'home_mytopso'); + $listview_header = getListViewHeader($focus,"SalesOrder",$url_string,$sorder,$order_by,"HomePage",$oCustomView); + $header = Array($listview_header[1],$listview_header[2]); + + $listview_entries = getListViewEntries($focus,"SalesOrder",$list_result,$navigation_array,"HomePage","","EditView","Delete",$oCustomView); + foreach($listview_entries as $crmid=>$valuearray) + { + $entries[$crmid] = Array($valuearray[1],$valuearray[2]); + } + + $search_qry = "&query=true&Fields0=vtiger_salesorder.duedate&Condition0=grteq&Srch_value0=".$date_var."&Fields1=vtiger_crmentity.smownerid&Condition1=is&Srch_value1=".$current_user->column_fields['user_name']."&searchtype=advance&search_cnt=2&matchtype=all"; + + $values=Array('ModuleName'=>'SalesOrder','Title'=>$title,'Header'=>$header,'Entries'=>$entries,'search_qry'=>$search_qry); + if ( ($display_empty_home_blocks && $noofrows == 0 ) || ($noofrows>0) ) + return $values; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/ListView.php b/oss/vtiger/trunk/modules/SalesOrder/ListView.php new file mode 100644 index 00000000..585e46c6 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/ListView.php @@ -0,0 +1,211 @@ +assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'SalesOrder'); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$focus = new SalesOrder(); +// Initialize sort by fields +$focus->initSortbyField('SalesOrder'); +// END +$other_text = Array(); +$url_string = ''; // assigning http url string + +if(!$_SESSION['lvs'][$currentModule]) +{ + unset($_SESSION['lvs']); + $modObj = new ListViewSession(); + $modObj->sorder = $sorder; + $modObj->sortby = $order_by; + $_SESSION['lvs'][$currentModule] = get_object_vars($modObj); +} + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR","The User does not have permission to Change/Delete ".$errormsg." ".$currentModule); +}else +{ + $smarty->assign("ERROR",""); +} +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION['SALESORDER_ORDER_BY'] = $order_by; +$_SESSION['SALESORDER_SORT_ORDER'] = $sorder; +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> + + +if(isset($_REQUEST['query']) && $_REQUEST['query'] != '' && $_REQUEST['query'] == 'true') +{ + + list($where, $ustring) = split("#@@#",getWhereCondition($currentModule)); + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); + +} + +//<<<>>>>>> +$oCustomView = new CustomView("SalesOrder"); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); + +//Added to handle approving or denying status-public by the admin in CustomView +$statusdetails = $oCustomView->isPermittedChangeStatus($viewnamedesc['status']); +$smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + +//To check if a user is able to edit/delete a customview +$edit_permit = $oCustomView->isPermittedCustomView($viewid,'EditView',$currentModule); +$delete_permit = $oCustomView->isPermittedCustomView($viewid,'Delete',$currentModule); +$smarty->assign("CV_EDIT_PERMIT",$edit_permit); +$smarty->assign("CV_DELETE_PERMIT",$delete_permit); + +//<<<<>>>> +$smarty->assign("CHANGE_OWNER",getUserslist()); +$smarty->assign("CHANGE_GROUP_OWNER",getGroupslist()); +// Buttons and View options +if(isPermitted('SalesOrder','Delete','') == 'yes') +{ + $other_text['del'] = $app_strings[LBL_MASS_DELETE]; +} +if(isPermitted('SalesOrder','EditView','') == 'yes') +{ + $other_text['mass_edit'] = $app_strings[LBL_MASS_EDIT]; + $other_text['c_owner'] = $app_strings[LBL_CHANGE_OWNER]; +} +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} + +//<<<<<<<<>>>>>>>> +if($viewid != "0") +{ + $listquery = getListQuery("SalesOrder"); + $list_query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"SalesOrder"); +}else +{ + $list_query = getListQuery("SalesOrder"); +} +//<<<<<<<>>>>>>>> + +if(isset($where) && $where != '') +{ + $list_query .= ' and '.$where; +} + +if(isset($order_by) && $order_by != '') +{ + if($order_by == 'smownerid') + { + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY user_name'; + $list_query .= ' ORDER BY user_name '.$sorder; + } + else + { + $tablename = getTableNameForField('SalesOrder',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY '.$tablename.$order_by; + $list_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; + } +} + +///Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +//Retreive the List View Table Header +if($viewid !='') +$url_string .="&viewname=".$viewid; + +$listview_header = getListViewHeader($focus,"SalesOrder",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_header_search=getSearchListHeaderValues($focus,"SalesOrder",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER", $listview_header_search); + +$listview_entries = getListViewEntries($focus,"SalesOrder",$list_result,$navigation_array,'','&return_module=SalesOrder&return_action=index','EditView','Delete',$oCustomView); +$smarty->assign("LISTENTITY", $listview_entries); +$smarty->assign("SELECT_SCRIPT", $view_script); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string,"SalesOrder",'index',$viewid); +$alphabetical = AlphabeticalSearch($currentModule,'index','subject','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($module); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$smarty->assign("BUTTONS", $other_text); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display("ListView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/ListViewPagging.php b/oss/vtiger/trunk/modules/SalesOrder/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/MassEdit.php b/oss/vtiger/trunk/modules/SalesOrder/MassEdit.php new file mode 100644 index 00000000..348dab37 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/MassEdit.php @@ -0,0 +1,45 @@ +mode = ''; +$mode = 'mass_edit'; +$disp_view = getView($focus->mode); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("IDS",$_REQUEST['idstring']); +$smarty->assign("MASS_EDIT","1"); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("APP",$app_strings); +$smarty->assign("CATEGORY",getParentTab()); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/MassEditSave.php b/oss/vtiger/trunk/modules/SalesOrder/MassEditSave.php new file mode 100644 index 00000000..0e1f2a6f --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/MassEditSave.php @@ -0,0 +1,67 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if($fieldname == 'assigned_user_id'){ + if($_REQUEST['assigntype'] == 'U') { + $value = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $value = $_REQUEST['assigned_group_id']; + } + } else { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + } + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/Popup.php b/oss/vtiger/trunk/modules/SalesOrder/Popup.php new file mode 100644 index 00000000..033da8e3 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/Popup.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/SalesOrder/RecurringInvoiceHandler.php b/oss/vtiger/trunk/modules/SalesOrder/RecurringInvoiceHandler.php new file mode 100644 index 00000000..939e45d4 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/RecurringInvoiceHandler.php @@ -0,0 +1,50 @@ +getModuleName(); + if ($moduleName == 'SalesOrder') { + $soId = $entityData->getId(); + $data = $entityData->getData(); + if($data['enable_recurring'] == 'on' || $data['enable_recurring'] == 1) { + $frequency = $data['recurring_frequency']; + $startPeriod = getDBInsertDateValue($data['start_period']); + $endPeriod = getDBInsertDateValue($data['end_period']); + $paymentDuration = $data['payment_duration']; + $invoiceStatus = $data['invoicestatus']; + if (isset($frequency) && $frequency != '' && $frequency != '--None--') { + $check_query = "SELECT * FROM vtiger_invoice_recurring_info WHERE salesorderid=?"; + $check_res = $adb->pquery($check_query, array($soId)); + $noofrows = $adb->num_rows($check_res); + if ($noofrows > 0) { + $row = $adb->query_result_rowdata($check_res, 0); + $query = "UPDATE vtiger_invoice_recurring_info SET recurring_frequency=?, start_period=?, end_period=?, payment_duration=?, invoice_status=? WHERE salesorderid=?"; + $params = array($frequency,$startPeriod,$endPeriod,$paymentDuration,$invoiceStatus,$soId); + } else { + $query = "INSERT INTO vtiger_invoice_recurring_info VALUES (?,?,?,?,?,?,?)"; + $params = array($soId,$frequency,$startPeriod,$endPeriod,$startPeriod,$paymentDuration,$invoiceStatus); + } + $adb->pquery($query, $params); + } + } else { + $query = "DELETE FROM vtiger_invoice_recurring_info WHERE salesorderid = ?"; + $adb->pquery($query, array($soId)); + } + } + } +} + + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/SalesOrder.js b/oss/vtiger/trunk/modules/SalesOrder/SalesOrder.js new file mode 100644 index 00000000..a50f9255 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/SalesOrder.js @@ -0,0 +1,49 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. +* + ********************************************************************************/ + +document.write(""; +exit(); +?> diff --git a/oss/vtiger/trunk/modules/SalesOrder/Settings.php b/oss/vtiger/trunk/modules/SalesOrder/Settings.php new file mode 100644 index 00000000..980dd078 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/Settings.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/SalesOrder/TagCloud.php b/oss/vtiger/trunk/modules/SalesOrder/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/SalesOrder/UnifiedSearch.php b/oss/vtiger/trunk/modules/SalesOrder/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/SalesOrder/index.php b/oss/vtiger/trunk/modules/SalesOrder/index.php new file mode 100644 index 00000000..9816c535 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/index.php @@ -0,0 +1,54 @@ + + diff --git a/oss/vtiger/trunk/modules/SalesOrder/language/en_us.lang.php b/oss/vtiger/trunk/modules/SalesOrder/language/en_us.lang.php new file mode 100644 index 00000000..fc2f7eb8 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/language/en_us.lang.php @@ -0,0 +1,209 @@ +'SalesOrder', +'LBL_SO_MODULE_NAME'=>'Sales Order', +'LBL_RELATED_PRODUCTS'=>'Product Details', +'LBL_MODULE_TITLE'=>'SalesOrder: Home', +'LBL_SEARCH_FORM_TITLE'=>'Orders Search', +'LBL_LIST_SO_FORM_TITLE'=>'Sales Order List', +'LBL_NEW_FORM_SO_TITLE'=>'New Sales Order', +'LBL_MEMBER_ORG_FORM_TITLE'=>'Member Organizations', + +'LBL_LIST_ACCOUNT_NAME'=>'Account Name', +'LBL_LIST_CITY'=>'City', +'LBL_LIST_WEBSITE'=>'Website', +'LBL_LIST_STATE'=>'State', +'LBL_LIST_PHONE'=>'Phone', +'LBL_LIST_EMAIL_ADDRESS'=>'Email Address', +'LBL_LIST_CONTACT_NAME'=>'Contact Name', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + +'LBL_ACCOUNT'=>'Account:', +'LBL_ACCOUNT_NAME'=>'Account Name:', +'LBL_PHONE'=>'Phone:', +'LBL_WEBSITE'=>'Website:', +'LBL_FAX'=>'Fax:', +'LBL_TICKER_SYMBOL'=>'Ticker Symbol:', +'LBL_OTHER_PHONE'=>'Other Phone:', +'LBL_ANY_PHONE'=>'Any Phone:', +'LBL_MEMBER_OF'=>'Member of:', +'LBL_EMAIL'=>'Email:', +'LBL_EMPLOYEES'=>'Employees:', +'LBL_OTHER_EMAIL_ADDRESS'=>'Other Email:', +'LBL_ANY_EMAIL'=>'Any Email:', +'LBL_OWNERSHIP'=>'Ownership:', +'LBL_RATING'=>'Rating:', +'LBL_INDUSTRY'=>'Industry:', +'LBL_SIC_CODE'=>'SIC Code:', +'LBL_TYPE'=>'Type:', +'LBL_ANNUAL_REVENUE'=>'Annual Revenue:', +'LBL_ADDRESS_INFORMATION'=>'Address Information', +'LBL_Quote_INFORMATION'=>'Account Information', +'LBL_CUSTOM_INFORMATION'=>'Custom Information', +'LBL_BILLING_ADDRESS'=>'Billing Address:', +'LBL_SHIPPING_ADDRESS'=>'Shipping Address:', +'LBL_ANY_ADDRESS'=>'Any Address:', +'LBL_CITY'=>'City:', +'LBL_STATE'=>'State:', +'LBL_POSTAL_CODE'=>'Postal Code:', +'LBL_COUNTRY'=>'Country:', +'LBL_DESCRIPTION_INFORMATION'=>'Description Information', +'LBL_TERMS_INFORMATION'=>'Terms & Conditions', +'LBL_DESCRIPTION'=>'Description:', +'NTC_COPY_BILLING_ADDRESS'=>'Copy billing address to shipping address', +'NTC_COPY_SHIPPING_ADDRESS'=>'Copy shipping address to billing address', +'NTC_REMOVE_MEMBER_ORG_CONFIRMATION'=>'Are you sure you want to remove this record as a member organization?', +'LBL_DUPLICATE'=>'Potential Duplicate Accounts', +'MSG_DUPLICATE' => 'Creating this vtiger_account may vtiger_potentialy create a duplicate vtiger_account. You may either select an vtiger_account from the list below or you may click on Create New Account to continue creating a new vtiger_account with the previously entered data.', + +'LBL_INVITEE'=>'Contacts', +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the vtiger_account.", + +'LBL_SELECT_ACCOUNT'=>'Select Account', +'LBL_GENERAL_INFORMATION'=>'General Information', + +//for v4 release added +'LBL_NEW_POTENTIAL'=>'New Potential', +'LBL_POTENTIAL_TITLE'=>'Potentials', + +'LBL_NEW_TASK'=>'New Task', +'LBL_TASK_TITLE'=>'Tasks', +'LBL_NEW_CALL'=>'New Call', +'LBL_CALL_TITLE'=>'Calls', +'LBL_NEW_MEETING'=>'New Meeting', +'LBL_MEETING_TITLE'=>'Meetings', +'LBL_NEW_EMAIL'=>'New Email', +'LBL_EMAIL_TITLE'=>'Emails', +'LBL_NEW_CONTACT'=>'New Contact', +'LBL_CONTACT_TITLE'=>'Contacts', + +//Added vtiger_fields after RC1 - Release +'LBL_ALL'=>'All', +'LBL_PROSPECT'=>'Prospect', +'LBL_INVESTOR'=>'Investor', +'LBL_RESELLER'=>'Reseller', +'LBL_PARTNER'=>'Partner', + +// Added for 4GA +'LBL_TOOL_FORM_TITLE'=>'Account Tools', +//Added for 4GA +'Subject'=>'Subject', +'Quote Name'=>'Quote Name', +'Vendor Name'=>'Vendor Name', +'Requisition No'=>'Requisition No', +'Tracking Number'=>'Tracking Number', +'Contact Name'=>'Contact Name', +'Due Date'=>'Due Date', +'Carrier'=>'Carrier', +'Type'=>'Type', +'Sales Tax'=>'Sales Tax', +'Sales Commission'=>'Sales Commission', +'Excise Duty'=>'Excise Duty', +'Total'=>'Total', +'Product Name'=>'Product Name', +'Assigned To'=>'Assigned To', +'Billing Address'=>'Billing Address', +'Shipping Address'=>'Shipping Address', +'Billing City'=>'Billing City', +'Billing State'=>'Billing State', +'Billing Code'=>'Billing Postal Code', +'Billing Country'=>'Billing Country', +'Billing Po Box'=>'Billing PO Box', +'Shipping Po Box'=>'Shipping PO Box', +'Shipping City'=>'Shipping City', +'Shipping State'=>'Shipping State', +'Shipping Code'=>'Shipping Postal Code', +'Shipping Country'=>'Shipping Country', +'City'=>'City', +'State'=>'State', +'Code'=>'Code', +'Country'=>'Country', +'Created Time'=>'Created Time', +'Modified Time'=>'Modified Time', +'Description'=>'Description', +'Potential Name'=>'Potential Name', +'Customer No'=>'Customer No', +'Purchase Order'=>'Purchase Order', +'Vendor Terms'=>'Vendor Terms', +'Pending'=>'Pending', +'Account Name'=>'Account Name', +'Terms & Conditions'=>'Terms & Conditions', +//Quote Info +'LBL_SO_INFORMATION'=>'Sales Order Information', +'LBL_SO'=>'Sales Order:', + + //Added for 5.0 GA +'LBL_SO_FORM_TITLE'=>'Sales', +'LBL_SUBJECT_TITLE'=>'Subject', +'LBL_VENDOR_NAME_TITLE'=>'Vendor Name', +'LBL_TRACKING_NO_TITLE'=>'Tracking No:', +'LBL_SO_SEARCH_TITLE'=>'Sales Order Search', +'LBL_QUOTE_NAME_TITLE'=>'Quote Name', +'Order No'=>'Order No', +'LBL_MY_TOP_SO'=>'My Top Open Sales Orders', +'Status'=>'Status', +'SalesOrder'=>'Sales Order', + +//Added for existing Picklist Entries + +'FedEx'=>'FedEx', +'UPS'=>'UPS', +'USPS'=>'USPS', +'DHL'=>'DHL', +'BlueDart'=>'BlueDart', + +'Created'=>'Created', +'Approved'=>'Approved', +'Delivered'=>'Delivered', +'Cancelled'=>'Cancelled', +'Adjustment'=>'Adjustment', +'Sub Total'=>'Sub Total', + +//Added for Reports (5.0.4) +'Tax Type'=>'Tax Type', +'Discount Percent'=>'Discount Percent', +'Discount Amount'=>'Discount Amount', +'Terms & Conditions'=>'Terms & Conditions', +'S&H Amount'=>'S&H Amount', + +//Added after 5.0.4 GA +'SalesOrder No'=>'SalesOrder No', + +'Recurring Invoice Information' => 'Recurring Invoice Information', +'Enable Recurring' => 'Enable Recurring', +'Frequency' => 'Frequency', +'Start Period' => 'Start Period', +'End Period' => 'End Period', +'Payment Duration' => 'Payment Duration', +'Invoice Status' => 'Invoice Status', + +); + +?> diff --git a/oss/vtiger/trunk/modules/SalesOrder/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/SalesOrder/language/zh_cn.lang.php new file mode 100644 index 00000000..89274f6f --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/language/zh_cn.lang.php @@ -0,0 +1,208 @@ + '销售订单', + 'LBL_SO_MODULE_NAME' => '销售订单', + 'LBL_RELATED_PRODUCTS' => '产品细节', + 'LBL_MODULE_TITLE' => '销售订单:首页', + 'LBL_SEARCH_FORM_TITLE' => '查找订单', + 'LBL_LIST_SO_FORM_TITLE' => '销售订单列表', + 'LBL_NEW_FORM_SO_TITLE' => '新增销售订单', + 'LBL_MEMBER_ORG_FORM_TITLE' => '成员组织', + +'LBL_LIST_ACCOUNT_NAME' => '客户名称', + 'LBL_LIST_CITY' => '乡镇市区', + 'LBL_LIST_WEBSITE' => '网站', + 'LBL_LIST_STATE' => '市(县)', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_EMAIL_ADDRESS' => '电子邮件', + 'LBL_LIST_CONTACT_NAME' => '联络人名称', + +//DON'T CONVERT THESE THEY ARE MAPPINGS +'db_name' => 'LBL_LIST_ACCOUNT_NAME', +'db_website' => 'LBL_LIST_WEBSITE', +'db_billing_address_city' => 'LBL_LIST_CITY', + +//END DON'T CONVERT + +'LBL_ACCOUNT' => '客户:', + 'LBL_ACCOUNT_NAME' => '客户名称:', + 'LBL_PHONE' => '电话:', + 'LBL_WEBSITE' => '网站:', + 'LBL_FAX' => '传真:', + 'LBL_TICKER_SYMBOL' => '传票符号:', + 'LBL_OTHER_PHONE' => '其它电话:', + 'LBL_ANY_PHONE' => '其它电话:', + 'LBL_MEMBER_OF' => '用户组:', + 'LBL_EMAIL' => '电子邮件:', + 'LBL_EMPLOYEES' => '员工人数:', + 'LBL_OTHER_EMAIL_ADDRESS' => '其它电子信箱:', + 'LBL_ANY_EMAIL' => '其它电子信箱:', + 'LBL_OWNERSHIP' => '负责人:', + 'LBL_RATING' => '评分:', + 'LBL_INDUSTRY' => '产业类别:', + 'LBL_SIC_CODE' => '统一编号:', + 'LBL_TYPE' => '类型:', + 'LBL_ANNUAL_REVENUE' => '年收入:', + 'LBL_ADDRESS_INFORMATION' => '住址信息', + 'LBL_Quote_INFORMATION' => '客户信息', + 'LBL_CUSTOM_INFORMATION' => '自订信息', + 'LBL_BILLING_ADDRESS' => '发票住址:', + 'LBL_SHIPPING_ADDRESS' => '送货住址:', + 'LBL_ANY_ADDRESS' => '其它住址:', + 'LBL_CITY' => '乡镇市区:', + 'LBL_STATE' => '市(县):', + 'LBL_POSTAL_CODE' => '邮政编码:', + 'LBL_COUNTRY' => '省(市/自治区):', + 'LBL_DESCRIPTION_INFORMATION' => '说明信息', + 'LBL_TERMS_INFORMATION' => '期限与条件', + 'LBL_DESCRIPTION' => '说明:', + 'NTC_COPY_BILLING_ADDRESS' => '复制发票地址到送货地址', + 'NTC_COPY_SHIPPING_ADDRESS' => '复制送货地址到送货发票地址', + 'NTC_REMOVE_MEMBER_ORG_CONFIRMATION' => '您确定要删除这笔数据?', + 'LBL_DUPLICATE' => '客户数据重复', + 'MSG_DUPLICATE' => '建立这个客户数据可能与现有数据重复,您可以选择将数据归属于下面其中一个项目中,或是点选建立新客户来透过刚刚输入的数据建立新项目。', + + 'LBL_INVITEE' => '联络人', + 'ERR_DELETE_RECORD' => '必须指定数据编号才能删除公司。', + + 'LBL_SELECT_ACCOUNT' => '选择客户', + 'LBL_GENERAL_INFORMATION' => '一般信息', + +//for v4 release added +'LBL_NEW_POTENTIAL' => '新潜在机会', + 'LBL_POTENTIAL_TITLE' => '潜在机会', + +'LBL_NEW_TASK' => '新任务', + 'LBL_TASK_TITLE' => '任务', + 'LBL_NEW_CALL' => ' 安排电话联系', + 'LBL_CALL_TITLE' => '电话联系', +'LBL_NEW_MEETING' => '新增会议', + 'LBL_MEETING_TITLE' => '会议', + 'LBL_NEW_EMAIL' => '寄发电子邮件', + 'LBL_EMAIL_TITLE' => '电子邮件', + 'LBL_NEW_CONTACT' => '新增联络人', + 'LBL_CONTACT_TITLE' => '联络人', + +//Added vtiger_fields after RC1 - Release + 'LBL_ALL' => '全部', + 'LBL_PROSPECT' => '预期', + 'LBL_INVESTOR' => '投资者', + 'LBL_RESELLER' => '经销商', + 'LBL_PARTNER' => '合作伙伴', + +// Added for 4GA + 'LBL_TOOL_FORM_TITLE' => '客户管理工具', +//Added for 4GA +'Subject' => '主旨', + 'Quote Name' => '报价单名称', + 'Vendor Name' => '厂商名称', + 'Requisition No' => '申请书编号', + 'Tracking Number' => '追踪编号', + 'Contact Name' => '联络人名称', + 'Due Date' => '预计交付日期', + 'Carrier' => '货运商', + 'Type' => '类型', + 'Sales Tax' => '销售税额', + 'Sales Commission' => '销售佣金', + 'Excise Duty' => '货物税', + 'Total' => '总计', + 'Product Name' => '产品名称', + 'Assigned To' => '负责人', +'Billing Address' => '付款住址', + 'Shipping Address' => '送货住址', + 'Billing City' => '[付款住址]乡镇市区', + 'Billing State' => '[付款住址]市(县)', + 'Billing Code' => '[付款住址]邮政编码', + 'Billing Country' => '[付款住址]省(市/自治区)', + 'Billing Po Box' => '[付款住址]采购订单信箱', + 'Shipping Po Box' => '[送货住址]采购订单信箱', + 'Shipping City' => '[送货住址]乡镇市区', + 'Shipping State' => '[送货住址]市(县)', + 'Shipping Code' => '[送货住址]邮政编码', + 'Shipping Country' => '[送货住址]省(市/自治区)', + 'City' => '乡镇市区', + 'State' => '市(县)', + 'Code' => '邮政编码', + 'Country' => '省(市/自治区)', + 'Created Time' => '建立时间', + 'Modified Time' => '修改时间', + 'Description' => '说明', + 'Potential Name' => '潜在机会名称', + 'Customer No' => '客户编号', + 'Purchase Order' => '采购订单', + 'Vendor Terms' => '厂商条件', + 'Pending' => '等待', + 'Account Name' => '客户名称', + 'Terms & Conditions' => '期限与条件', +//Quote Info + 'LBL_SO_INFORMATION' => '销售订单信息', + 'LBL_SO' => '销售订单:', + + //Added for 5.0 GA +'LBL_SO_FORM_TITLE' => '销售', + 'LBL_SUBJECT_TITLE' => '主旨', + 'LBL_VENDOR_NAME_TITLE' => '厂商名称', + 'LBL_TRACKING_NO_TITLE' => '追踪编号:', + 'LBL_SO_SEARCH_TITLE' => '查找销售订单', + 'LBL_QUOTE_NAME_TITLE' => '报价单名称', + 'Order No' => '订单编号', + 'LBL_MY_TOP_SO' => '我的执行中订单', + 'Status' => '订单状态', + 'SalesOrder' => '销售订单', + +//Added for existing Picklist Entries + +'FedEx'=>'FedEx', +'UPS'=>'UPS', +'USPS'=>'USPS', +'DHL'=>'DHL', +'BlueDart'=>'BlueDart', + + 'Created' => '已提交', + 'Approved' => '已审核', + 'Delivered' => '已交付', + 'Cancelled' => '已取消', +'Adjustment'=>'调整', +'Sub Total'=>'小计', +//Added for Reports (5.0.4) +'Tax Type'=>'税务类型', +'Discount Percent'=>'折扣百分比', +'Discount Amount'=>'折扣数额', +'Terms & Conditions'=>'条款及条件', +'S&H Amount'=>'S&H 金额', + +//Added after 5.0.4 GA +'SalesOrder No'=>'订单编号', + +'Recurring Invoice Information' => '周期性发票信息', +'Enable Recurring' => '启用周期', +'Frequency' => '频率', +'Start Period' => '启动期', +'End Period' => '结束期', +'Payment Duration' => '付款期限', +'Invoice Status' => '发票状态', + +); + +?> diff --git a/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/footer.php b/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/footer.php new file mode 100644 index 00000000..eaf16d3c --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/footer.php @@ -0,0 +1,35 @@ +addDescBlock($description, $app_strings["Description"], $descBlock); + +/* ************** End Description *********************** */ + + + +/* **************** Begin Terms ****************** */ +$termBlock=array("107",$top,"53", $num); +$pdf->addDescBlock($conditions, $app_strings["Terms & Conditions"], $termBlock); + +/* ************** End Terms *********************** */ + + +?> diff --git a/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/header.php b/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/header.php new file mode 100644 index 00000000..b7378235 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/header.php @@ -0,0 +1,106 @@ +addImage( $logo_name, $imageBlock); + +// x,y,width +if($org_phone != '') + $phone ="\n".$app_strings['Phone'].":".$org_phone; +$companyBlockPositions=array( "10","23","62" ); +$companyText=$org_address."\n".$org_city.", ".$org_state." ".$org_code." ".$org_country." ".$phone."\n".$org_website; +$pdf->addTextBlock( $org_name, $companyText ,$companyBlockPositions ); + +// ************** End company information ******************* + + + +// ************* Begin Top-Right Header *************** +// title +$titleBlock=array("140","7"); +$pdf->title( $app_strings['SalesOrder'],"", $titleBlock ); + +$soBubble=array("161","17","20"); +$pdf->addBubbleBlock($quote_name,$app_strings["Quote Name"], $soBubble); + +$poBubble=array("99","17","20"); +$pdf->addBubbleBlock($subject, $app_strings["Subject"], $poBubble); + +// page number +$pageBubble=array("140","17",0); +$pdf->addBubbleBlock($page_num, $app_strings["Page"], $pageBubble); +// ************** End Top-Right Header ***************** + + + +// ************** Begin Addresses ************** +// shipping Address +$shipLocation = array("147","40","61"); +if(trim($ship_street)!='') + $shipText = $ship_street."\n"; +if(trim($ship_city) !='') + $shipText .= $ship_city.", "; +if(trim($ship_state)!='' || trim($ship_code)!= '') + $shipText .= $ship_state." ".$ship_code."\n"; + + $shipText .=$ship_country; +$pdf->addTextBlock( $app_strings["Shipping Address"].':', $shipText, $shipLocation ); + +// billing Address +$billPositions = array("10","51","61"); +if(trim($bill_street)!='') + $billText = $bill_street."\n"; +if(trim($bill_city) !='') + $billText .= $bill_city.", "; +if(trim($bill_state)!='' || trim($bill_code)!= '') + $billText .= $bill_state." ".$bill_code."\n"; + + $billText .=$bill_country; +$pdf->addTextBlock($app_strings["Billing Address"].':',$billText, $billPositions); +// ********** End Addresses ****************** + + + +/* ******** Begin Invoice Data ************************ */ + +// issue date block +$issueBlock=array("80","37"); +//$pdf->addRecBlock(getDisplayDate(date("Y-m-d")), $app_strings["Issue Date"],$issueBlock); +$pdf->addRecBlock($create_time, $app_strings["Create Date"],$issueBlock); + +// due date block +$dueBlock=array("81","52"); +$pdf->addRecBlock($valid_till, $app_strings["Due Date"],$dueBlock); + +// terms block +$termBlock=array("10","67"); +$pdf->addRecBlock($account_name, $app_strings["Customer Name"], $termBlock); + +// Contact Name block +$conBlock=array("79","67"); +$pdf->addRecBlock($contact_name, $app_strings["Contact Name"],$conBlock); + + + +// vtiger_invoice number block +$invBlock=array("145","67"); +$pdf->addRecBlock($so_no, $app_strings["SO Number"],$invBlock); + +/* ************ End Invoice Data ************************ */ + + + +?> diff --git a/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/lastpage/body.php b/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/lastpage/body.php new file mode 100644 index 00000000..a5883a54 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/lastpage/body.php @@ -0,0 +1,62 @@ +watermark( $app_strings["Thank You"], $waterMarkPositions, $waterMarkRotate ); +$waterMarkPositions=array("30","130"); +$pdf->watermark( $app_strings["For Your Business"], $waterMarkPositions, $waterMarkRotate ); + +// blowing bubbles +$Bubble=array("10","80","170","4"); +$pdf->addBubble("", "", $Bubble); + +$Bubble=array("168","131","12"); +//$pdf->addBubbleBlock("Neat Look", "For A", $Bubble); +$Bubble=array("10","131","12"); +//$pdf->addBubbleBlock("The Corners", "Line Up", $Bubble); + + +/* ************* Begin Totals ************************** */ +$totalBlock=array("59","135"); +$names=array($app_strings["Subtotal"],$app_strings["Tax"],$app_strings["Adjustment"],$app_strings["Total"]); +$totals=array($price_subtotal,$price_salestax,$price_adjustment,$price_total); +$pdf->addTotalsRec($names,$totals,$totalBlock); +/* ************* End Totals *************************** */ + +// lets add an image :) +$imageBlock=array("15","95","8","8"); +$pdf->addImage( "sale.jpeg", $imageBlock); +$imageBlock=array("185","95","8","8"); +$pdf->addImage( "sale.jpeg", $imageBlock); + +// descriptions that change sizes! +$descc=count(explode("\n",$description)); +$condc=count(explode("\n",$conditions)); +if( (strlen($description) > 256) || (strlen($conditions) > 256) || $condc >6 || $descc > 6 ) + $num=255; +else + $num=150; + +/* **************** Begin Description ****************** */ +$descBlock=array("10","160","53", $num); +$pdf->addDescBlock($description, $app_strings["Description"], $descBlock); + + +$termBlock=array("107","160","53", $num); +$pdf->addDescBlock($conditions, $app_strings["Terms & Conditions"], $termBlock); + +/* ************** End Terms *********************** */ + + +?> diff --git a/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/lastpage/footer.php b/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/lastpage/footer.php new file mode 100644 index 00000000..629b2abe --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/pdf_templates/lastpage/footer.php @@ -0,0 +1,60 @@ +drawLine($linePos); + $i = (($i+$width)+$pad)-1; +} + + +// company addy +if($org_phone != '') +$phone="\n".$app_strings["Phone"].": ".$org_phone; +if($org_fax != '') + $fax ="\n".$app_strings["Fax"].": ".$org_fax; +$companyBlockPositions=array( "10","220","60" ); +$companyText=$org_address."\n".$org_city.", ".$org_state." ".$org_code." ".$org_country." ".$phone." ".$fax."\n".$org_website ; +$pdf->addTextBlock( $org_name, $companyText ,$companyBlockPositions ); + + +// billing Address +$billPositions = array("85","235","60"); +if(trim($bill_street)!='') + $billText = $bill_street."\n"; +if(trim($bill_city) !='') + $billText .= $bill_city.", "; +if(trim($bill_state)!='' || trim($bill_code)!= '') + $billText .= $bill_state." ".$bill_code."\n"; + + $billText .=$bill_country; +$pdf->addTextBlock($app_strings["Billing Address"].":",$billText, $billPositions); + +// totals +$totalBlock=array("145","235","10", "110"); +$totalText=$app_strings["Subtotal"].": ".$price_subtotal."\n". + $app_strings["Tax"].": ".$price_salestax."\n". + $app_strings["Adjustment"].": ".$price_adjustment."\n". + $app_strings["Total"].": ".$price_total; +$pdf->addDescBlock($totalText, $app_strings["Total Due"], $totalBlock); + +$blurbBlock=array("10","265","150", "60"); +$blockText=$app_strings["Detach_Info"]; +$pdf->addDescBlock($blockText, $app_strings["Instructions"], $blurbBlock); + +?> diff --git a/oss/vtiger/trunk/modules/SalesOrder/updateRelations.php b/oss/vtiger/trunk/modules/SalesOrder/updateRelations.php new file mode 100644 index 00000000..85798501 --- /dev/null +++ b/oss/vtiger/trunk/modules/SalesOrder/updateRelations.php @@ -0,0 +1,48 @@ +pquery("insert into vtiger_senotesrel values (?,?)", array($forCRMRecord,$id)); + else { + $focus->save_related_module($currentModule, $forCRMRecord, $dest_mod, $id); + } + } +} + +header("Location: index.php?action=$action&module=$currentModule&record=".$forCRMRecord."&parenttab=".$parenttab); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/CallRelatedList.php b/oss/vtiger/trunk/modules/ServiceContracts/CallRelatedList.php new file mode 100644 index 00000000..067128ec --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/CallRelatedList.php @@ -0,0 +1,72 @@ +retrieve_entity_info($record, $currentModule); + $focus->id = $record; + } + + $smarty = new vtigerCRM_Smarty; + + if($isduplicate == 'true') $focus->id = ''; + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + if(!$_SESSION['rlvs'][$currentModule]) unset($_SESSION['rlvs']); + + // Identify this module as custom module. + $smarty->assign('CUSTOM_MODULE', true); + + $smarty->assign('APP', $app_strings); + $smarty->assign('MOD', $mod_strings); + $smarty->assign('MODULE', $currentModule); + // TODO: Update Single Module Instance name here. + $smarty->assign('SINGLE_MOD', getTranslatedString($currentModule)); + $smarty->assign('CATEGORY', $category); + $smarty->assign('IMAGE_PATH', "themes/$theme/images/"); + $smarty->assign('THEME', $theme); + $smarty->assign('ID', $focus->id); + $smarty->assign('MODE', $focus->mode); + $smarty->assign('CHECK', $tool_buttons); + + $smarty->assign('NAME', $focus->column_fields[$focus->def_detailview_recname]); + $smarty->assign('UPDATEINFO',updateInfo($focus->id)); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $related_array = getRelatedLists($currentModule, $focus); + + $smarty->assign('RELATEDLISTS', $related_array); + $smarty->display('RelatedLists.tpl'); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/CustomView.php b/oss/vtiger/trunk/modules/ServiceContracts/CustomView.php new file mode 100644 index 00000000..aebb8b53 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/CustomView.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/ServiceContracts/Delete.php b/oss/vtiger/trunk/modules/ServiceContracts/Delete.php new file mode 100644 index 00000000..532347ba --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/Delete.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/DetailView.php b/oss/vtiger/trunk/modules/ServiceContracts/DetailView.php new file mode 100644 index 00000000..bc544933 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/DetailView.php @@ -0,0 +1,104 @@ +id = $record; + $focus->retrieve_entity_info($record, $currentModule); +} +if($isduplicate == 'true') $focus->id = ''; + +// Identify this module as custom module. +$smarty->assign('CUSTOM_MODULE', true); + +$smarty->assign('APP', $app_strings); +$smarty->assign('MOD', $mod_strings); +$smarty->assign('MODULE', $currentModule); +// TODO: Update Single Module Instance name here. +$smarty->assign('SINGLE_MOD', 'SINGLE_'.$currentModule); +$smarty->assign('CATEGORY', $category); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('THEME', $theme); +$smarty->assign('ID', $focus->id); +$smarty->assign('MODE', $focus->mode); + +$recordName = array_values(getEntityName($currentModule, $focus->id)); +$recordName = $recordName[0]; +$smarty->assign('NAME', $recordName); +$smarty->assign('UPDATEINFO',updateInfo($focus->id)); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign('IS_REL_LIST',isPresentRelatedLists($currentModule)); + +$validationArray = split_validationdataArray(getDBValidationData($focus->tab_name, $tabid)); +$smarty->assign('VALIDATION_DATA_FIELDNAME',$validationArray['fieldname']); +$smarty->assign('VALIDATION_DATA_FIELDDATATYPE',$validationArray['datatype']); +$smarty->assign('VALIDATION_DATA_FIELDLABEL',$validationArray['fieldlabel']); + +$smarty->assign('EDIT_PERMISSION', isPermitted($currentModule, 'EditView', $record)); +$smarty->assign('CHECK', $tool_buttons); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +$smarty->assign('IS_REL_LIST', isPresentRelatedLists($currentModule)); +$smarty->assign('SinglePane_View', $singlepane_view); + +if($singlepane_view == 'true') { + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +if(isPermitted($currentModule, 'EditView', $record) == 'yes') + $smarty->assign('EDIT_DUPLICATE', 'permitted'); +if(isPermitted($currentModule, 'Delete', $record) == 'yes') + $smarty->assign('DELETE', 'permitted'); + +$smarty->assign('BLOCKS', getBlocks($currentModule,'detail_view','',$focus->column_fields)); + +// Gather the custom link information to display +include_once('vtlib/Vtiger/Link.php'); +$customlink_params = Array('MODULE'=>$currentModule, 'RECORD'=>$focus->id, 'ACTION'=>vtlib_purify($_REQUEST['action'])); +$smarty->assign('CUSTOM_LINKS', Vtiger_Link::getAllByType($tabid, 'DETAILVIEW', $customlink_params)); +// END + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display('DetailView.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/DetailViewAjax.php b/oss/vtiger/trunk/modules/ServiceContracts/DetailViewAjax.php new file mode 100644 index 00000000..43da8072 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/DetailViewAjax.php @@ -0,0 +1,39 @@ +retrieve_entity_info($crmid, $currentModule); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = 'edit'; + $modObj->save($currentModule); + if($modObj->id != '') + { + echo ':#:SUCCESS'; + }else + { + echo ':#:FAILURE'; + } + }else + { + echo ':#:FAILURE'; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/EditView.php b/oss/vtiger/trunk/modules/ServiceContracts/EditView.php new file mode 100644 index 00000000..053b1f90 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/EditView.php @@ -0,0 +1,134 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if($record) { + $focus->id = $record; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($record, $currentModule); +} +if($isduplicate == 'true') { + $focus->id = ''; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} +if(!empty($_REQUEST['service_id'])) { + $serviceObj = CRMEntity::getInstance('Services'); + if(isRecordExists($_REQUEST['service_id'])) { + $serviceObj->retrieve_entity_info($_REQUEST['service_id'], 'Services'); + $focus->column_fields['tracking_unit'] = $serviceObj->column_fields['service_usageunit']; + } +} +if(!empty($_REQUEST['return_id']) && !empty($_REQUEST['return_module'])) { + $invModule = $_REQUEST['return_module']; + $inventoryObj = CRMEntity::getInstance($invModule); + $inventoryObj->retrieve_entity_info($_REQUEST['return_id'], $invModule); + if(empty($_REQUEST['sc_related_to'])) { + if(!empty($inventoryObj->column_fields['account_id'])) { + $focus->column_fields['sc_related_to_type'] = 'Accounts'; + $focus->column_fields['sc_related_to'] = $inventoryObj->column_fields['account_id']; + } else if(!empty($inventoryObj->column_fields['contact_id'])) { + $focus->column_fields['sc_related_to_type'] = 'Contacts'; + $focus->column_fields['sc_related_to'] = $inventoryObj->column_fields['contact_id']; + } + } +} + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') + $smarty->assign('BLOCKS', getBlocks($currentModule, $disp_view, $focus->mode, $focus->column_fields)); +else + $smarty->assign('BASBLOCKS', getBlocks($currentModule, $disp_view, $focus->mode, $focus->column_fields, 'BAS')); + +$smarty->assign('OP_MODE',$disp_view); +$smarty->assign('APP', $app_strings); +$smarty->assign('MOD', $mod_strings); +$smarty->assign('MODULE', $currentModule); +// TODO: Update Single Module Instance name here. +$smarty->assign('SINGLE_MOD', getTranslatedString('SINGLE_'.$currentModule)); +$smarty->assign('CATEGORY', $category); +$smarty->assign("THEME", $theme); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('ID', $focus->id); +$smarty->assign('MODE', $focus->mode); + +$smarty->assign('CHECK', Button_Check($currentModule)); +$smarty->assign('DUPLICATE', $isduplicate); + +if($focus->mode == 'edit' || $isduplicate) { + $recordName = array_values(getEntityName($currentModule, $record)); + $recordName = $recordName[0]; + $smarty->assign('NAME', $recordName); + $smarty->assign('UPDATEINFO',updateInfo($record)); +} + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if(isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset($_REQUEST['return_viewname'])) $smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +// In case you have a date field +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
    '. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +// Gather the help information associated with fields +$smarty->assign('FIELDHELPINFO', vtlib_getFieldHelpInfo($currentModule)); +// END + +if($focus->mode == 'edit') { + $smarty->display('salesEditView.tpl'); +} else { + $smarty->display('CreateView.tpl'); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/ExportRecords.php b/oss/vtiger/trunk/modules/ServiceContracts/ExportRecords.php new file mode 100644 index 00000000..31029bc0 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/ExportRecords.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/ServiceContracts/FindDuplicateRecords.php b/oss/vtiger/trunk/modules/ServiceContracts/FindDuplicateRecords.php new file mode 100644 index 00000000..b1a36b7b --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/FindDuplicateRecords.php @@ -0,0 +1,106 @@ +pquery($sql, array($id)); + DeleteEntity($req_module,$return_module,$focus,$id,""); + } + else { + $ids_list[] = $id; + } +} + if(count($ids_list) > 0) { + $ret = getEntityName($req_module,$ids_list); + if(count($ret) > 0) + { + $errormsg = implode(',',$ret); + } + echo "
    "; + echo "
    + + + + + + + + + +
    + $app_strings[LBL_DUP_PERMISSION] $req_module $errormsg
    + $app_strings[LBL_GO_BACK]
    +
    +
    "; + echo "
    "; + exit; + } +} + +include("include/saveMergeCriteria.php"); +$ret_arr=getDuplicateRecordsArr($req_module); + +$fld_values=$ret_arr[0]; +$total_num_group=count($fld_values); +$fld_name=$ret_arr[1]; +$ui_type=$ret_arr[2]; + +$smarty->assign("NAVIGATION",$ret_arr["navigation"]);//Added for page navigation +$smarty->assign("MODULE",$req_module); +$smarty->assign("NUM_GROUP",$total_num_group); +$smarty->assign("FIELD_NAMES",$fld_name); +$smarty->assign("CATEGORY",$parenttab); +$smarty->assign("ALL_VALUES",$fld_values); +if(isPermitted($req_module,'Delete','') == 'yes') + $button_del = $app_strings['LBL_MASS_DELETE']; +$smarty->assign("DELETE",$button_del); + +$smarty->assign("MOD", return_module_language($current_language,$req_module)); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MODE",'view'); +if(isset($_REQUEST['button_view'])) +{ + $smarty->assign("VIEW",'true'); +} +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("FindDuplicateAjax.tpl"); +else + $smarty->display('FindDuplicateDisplay.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/Import.php b/oss/vtiger/trunk/modules/ServiceContracts/Import.php new file mode 100644 index 00000000..576068f5 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/Import.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/ServiceContracts/ListView.php b/oss/vtiger/trunk/modules/ServiceContracts/ListView.php new file mode 100644 index 00000000..786255b5 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/ListView.php @@ -0,0 +1,189 @@ +initSortbyField($currentModule); +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION[$currentModule."_Order_by"] = $order_by; +$_SESSION[$currentModule."_Sort_Order"]=$sorder; + +$smarty = new vtigerCRM_Smarty(); + +// Identify this module as custom module. +$smarty->assign('CUSTOM_MODULE', true); + +$smarty->assign('MOD', $mod_strings); +$smarty->assign('APP', $app_strings); +$smarty->assign('MODULE', $currentModule); +$smarty->assign('SINGLE_MOD', getTranslatedString('SINGLE_'.$currentModule)); +$smarty->assign('CATEGORY', $category); +$smarty->assign('BUTTONS', $list_buttons); +$smarty->assign('CHECK', $tool_buttons); +$smarty->assign("THEME", $theme); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); + +$smarty->assign('CHANGE_OWNER', getUserslist()); +$smarty->assign('CHANGE_GROUP_OWNER', getGroupslist()); + +// Enabling Module Search +$url_string = ''; +if($_REQUEST['query'] == 'true') { + list($where, $ustring) = split('#@@#', getWhereCondition($currentModule)); + $url_string .= "&query=true$ustring"; + $smarty->assign('SEARCH_URL', $url_string); +} + +// Custom View +$customView = new CustomView($currentModule); +$viewid = $customView->getViewId($currentModule); +$customview_html = $customView->getCustomViewCombo($viewid); +$viewinfo = $customView->getCustomViewByCvid($viewid); + +// Feature available from 5.1 +if(method_exists($customView, 'isPermittedChangeStatus')) { + // Approving or Denying status-public by the admin in CustomView + $statusdetails = $customView->isPermittedChangeStatus($viewinfo['status']); + + // To check if a user is able to edit/delete a CustomView + $edit_permit = $customView->isPermittedCustomView($viewid,'EditView',$currentModule); + $delete_permit = $customView->isPermittedCustomView($viewid,'Delete',$currentModule); + + $smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + $smarty->assign("CV_EDIT_PERMIT",$edit_permit); + $smarty->assign("CV_DELETE_PERMIT",$delete_permit); +} +// END + +$smarty->assign("VIEWID", $viewid); + +if($viewinfo['viewname'] == 'All') $smarty->assign('ALL', 'All'); + +if($viewid ==0) +{ + echo "
    "; + echo "
    + + + + + + + + + +
    $app_strings[LBL_PERMISSION]
    + $app_strings[LBL_GO_BACK]
    +
    +
    "; + echo "
    "; + exit; +} + +$listquery = getListQuery($currentModule); +$list_query= $customView->getModifiedCvListQuery($viewid, $listquery, $currentModule); + +if($where != '') { + $list_query = "$list_query AND $where"; +} + +// Sorting +if(!empty($order_by)) { + if($order_by == 'smownerid') $list_query .= ' ORDER BY user_name '.$sorder; + else { + $tablename = getTableNameForField($currentModule, $order_by); + $tablename = ($tablename != '')? ($tablename . '.') : ''; + $list_query .= ' ORDER BY ' . $tablename . $order_by . ' ' . $sorder; + } +} + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +$smarty->assign("CUSTOMVIEW_OPTION",$customview_html); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string, $currentModule, 'index', $viewid); +$smarty->assign("NAVIGATION", $navigationOutput); + +$listview_header = getListViewHeader($focus,$currentModule,$url_string,$sorder,$order_by,'',$customView); +$listview_entries = getListViewEntries($focus,$currentModule,$list_result,$navigation_array,'','','EditView','Delete',$customView); +$listview_header_search = getSearchListHeaderValues($focus,$currentModule,$url_string,$sorder,$order_by,'',$customView); + +$smarty->assign('LISTHEADER', $listview_header); +$smarty->assign('LISTENTITY', $listview_entries); +$smarty->assign('SEARCHLISTHEADER',$listview_header_search); + +// Module Search +$alphabetical = AlphabeticalSearch($currentModule,'index',$focus->def_basicsearch_col,'true','basic','','','','',$viewid); +$fieldnames = getAdvSearchfields($currentModule); +$criteria = getcriteria_options(); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("CRITERIA", $criteria); + +$smarty->assign("AVALABLE_FIELDS", getMergeFields($currentModule,"available_fields")); +$smarty->assign("FIELDS_TO_MERGE", getMergeFields($currentModule,"fileds_to_merge")); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display('ListView.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/ListViewPagging.php b/oss/vtiger/trunk/modules/ServiceContracts/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/MassEdit.php b/oss/vtiger/trunk/modules/ServiceContracts/MassEdit.php new file mode 100644 index 00000000..b74d3e9c --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/MassEdit.php @@ -0,0 +1,44 @@ +mode = ''; +$mode = 'mass_edit'; + +$disp_view = getView($focus->mode); +$idstring = $_REQUEST['idstring']; + +$smarty = new vtigerCRM_Smarty; +$smarty->assign('MODULE',$currentModule); +$smarty->assign('APP',$app_strings); +$smarty->assign('THEME', $theme); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('IDS',$idstring); +$smarty->assign('MASS_EDIT','1'); +$smarty->assign('BLOCKS',getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'',$focus->non_mass_edit_fields)); +$smarty->assign("CATEGORY",getParentTab()); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/MassEditSave.php b/oss/vtiger/trunk/modules/ServiceContracts/MassEditSave.php new file mode 100644 index 00000000..61907925 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/MassEditSave.php @@ -0,0 +1,67 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) { + if($fieldname == 'assigned_user_id'){ + if($_REQUEST['assigntype'] == 'U') { + $value = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $value = $_REQUEST['assigned_group_id']; + } + } else { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + } + $focus->column_fields[$fieldname] = $value; + } + else { + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/Popup.php b/oss/vtiger/trunk/modules/ServiceContracts/Popup.php new file mode 100644 index 00000000..40aae3fa --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/Popup.php @@ -0,0 +1,11 @@ + diff --git a/oss/vtiger/trunk/modules/ServiceContracts/ProcessDuplicates.php b/oss/vtiger/trunk/modules/ServiceContracts/ProcessDuplicates.php new file mode 100644 index 00000000..bb5047fa --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/ProcessDuplicates.php @@ -0,0 +1,134 @@ +pquery("SELECT count(*) AS count FROM vtiger_crmentity WHERE crmid=? and deleted=0", array($merge_id)); + $count = $adb->query_result($result,0,'count'); + + if($count > 0) + { + // First, save the primary record + $focus->mode="edit"; + setObjectValuesFromRequest($focus); + $focus->save($module); + $rec_values=$focus->column_fields; + + // Remove the id of primary record from the list of records to be deleted. + $del_value=explode(",",$recordids,-1); + $offset = array_search($merge_id,$del_value); + unset($del_value[$offset]); + + // Transfer the related lists of the records to be deleted, to the primary record's related list + if(method_exists($focus, 'transferRelatedRecords')){ + $focus->transferRelatedRecords($module,$del_value,$merge_id); + } else { + transferRelatedRecords($module,$del_value,$merge_id); + } + + // Delete the records by id specified in the list + foreach($del_value as $value) + { + DeleteEntity($_REQUEST['module'],$_REQUEST['return_module'],$focus,$value,""); + } + } + + ?> + +assign("EDIT_DUPLICATE",""); + if($record_count == 2) { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + else { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[2]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[2]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + + $all_values_array=getRecordValues($exploded_id,$module); + $all_values=$all_values_array[0]; + $js_arr_val=$all_values_array[1]; + $fld_array=$all_values_array[2]; + $js_arr=implode(",",$js_arr_val); + + $imported_records = Array(); + $sql="select bean_id from vtiger_users_last_import where bean_type=? and deleted=0"; + $result = $adb->pquery($sql, array($module)); + $num_rows=$adb->num_rows($result); + $count=0; + for($i=0; $i<$num_rows;$i++) + { + foreach($exploded_id as $value) + if($value == $adb->query_result($result,$i,"bean_id")) + $count++; + array_push($imported_records,$adb->query_result($result,$i,"bean_id")); + } + + if ($record_count == $count) + $no_existing=1; + else + $no_existing=0; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("RECORD_COUNT",$record_count); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULENAME", $module); + $smarty->assign("PARENT_TAB", $parent_tab); + $smarty->assign("JS_ARRAY", $js_arr); + $smarty->assign("ID_ARRAY", $exploded_id); + $smarty->assign("IDSTRING",$idstring); + $smarty->assign("ALLVALUES", $all_values); + $smarty->assign("FIELD_ARRAY", $fld_array); + $smarty->assign("IMPORTED_RECORDS", $imported_records); + $smarty->assign("NO_EXISTING", $no_existing); + $smarty->display("MergeFields.tpl"); +} + +?> diff --git a/oss/vtiger/trunk/modules/ServiceContracts/QuickCreate.php b/oss/vtiger/trunk/modules/ServiceContracts/QuickCreate.php new file mode 100644 index 00000000..78fe10f6 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/QuickCreate.php @@ -0,0 +1,11 @@ + diff --git a/oss/vtiger/trunk/modules/ServiceContracts/Save.php b/oss/vtiger/trunk/modules/ServiceContracts/Save.php new file mode 100644 index 00000000..b595d9e1 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/Save.php @@ -0,0 +1,53 @@ +mode = $mode; +if($record)$focus->id = $record; + +if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} + +$focus->save($currentModule); +$return_id = $focus->id; + +$search = vtlib_purify($_REQUEST['search_url']); + +$parenttab = getParentTab(); +if($_REQUEST['return_module'] != '') { + $return_module = vtlib_purify($_REQUEST['return_module']); +} else { + $return_module = $currentModule; +} + +if($_REQUEST['return_action'] != '') { + $return_action = vtlib_purify($_REQUEST['return_action']); +} else { + $return_action = "DetailView"; +} + +if($_REQUEST['return_id'] != '') { + $return_id = vtlib_purify($_REQUEST['return_id']); +} + +header("Location: index.php?action=$return_action&module=$return_module&record=$return_id&parenttab=$parenttab&start=".vtlib_purify($_REQUEST['pagenumber']).$search); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/ServiceContracts.js b/oss/vtiger/trunk/modules/ServiceContracts/ServiceContracts.js new file mode 100644 index 00000000..3fd0758c --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/ServiceContracts.js @@ -0,0 +1,8 @@ +/*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************/ diff --git a/oss/vtiger/trunk/modules/ServiceContracts/ServiceContracts.php b/oss/vtiger/trunk/modules/ServiceContracts/ServiceContracts.php new file mode 100644 index 00000000..f22b52f4 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/ServiceContracts.php @@ -0,0 +1,608 @@ + 'crmid', + 'vtiger_servicecontracts' => 'servicecontractsid', + 'vtiger_servicecontractscf'=>'servicecontractsid'); + + /** + * Mandatory for Listing (Related listview) + */ + var $list_fields = Array ( + /* Format: Field Label => Array(tablename, columnname) */ + // tablename should not have prefix 'vtiger_' + 'Subject' => Array('servicecontracts', 'subject'), + 'Assigned To' => Array('crmentity','smownerid') + ); + var $list_fields_name = Array ( + /* Format: Field Label => fieldname */ + 'Subject' => 'subject', + 'Assigned To' => 'assigned_user_id' + ); + + // Make the field link to detail view + var $list_link_field = 'subject'; + + // For Popup listview and UI type support + var $search_fields = Array( + /* Format: Field Label => Array(tablename, columnname) */ + // tablename should not have prefix 'vtiger_' + 'Subject' => Array('servicecontracts', 'subject') + ); + var $search_fields_name = Array ( + /* Format: Field Label => fieldname */ + 'Subject' => 'subject' + ); + + // For Popup window record selection + var $popup_fields = Array ('subject'); + + // Placeholder for sort fields - All the fields will be initialized for Sorting through initSortFields + var $sortby_fields = Array(); + + // For Alphabetical search + var $def_basicsearch_col = 'subject'; + + // Column value to use on detail view record text display + var $def_detailview_recname = 'subject'; + + // Required Information for enabling Import feature + var $required_fields = Array ('assigned_user_id'=>1); + + // Used when enabling/disabling the mandatory fields for the module. + // Refers to vtiger_field.fieldname values. + var $mandatory_fields = Array('subject','assigned_user_id'); + + // Callback function list during Importing + var $special_functions = Array('set_import_assigned_user'); + + var $default_order_by = 'subject'; + var $default_sort_order='ASC'; + + function __construct() { + global $log; + $this->column_fields = getColumnFields('ServiceContracts'); + $this->db = new PearDatabase(); + $this->log = $log; + } + + function getSortOrder() { + global $currentModule; + + $sortorder = $this->default_sort_order; + if($_REQUEST['sorder']) $sortorder = $this->db->sql_escape_string($_REQUEST['sorder']); + else if($_SESSION[$currentModule.'_Sort_Order']) + $sortorder = $_SESSION[$currentModule.'_Sort_Order']; + + return $sortorder; + } + + function getOrderBy() { + global $currentModule; + + $use_default_order_by = ''; + if(PerformancePrefs::getBoolean('LISTVIEW_DEFAULT_SORTING', true)) { + $use_default_order_by = $this->default_order_by; + } + + $orderby = $use_default_order_by; + if($_REQUEST['order_by']) $orderby = $this->db->sql_escape_string($_REQUEST['order_by']); + else if($_SESSION[$currentModule.'_Order_By']) + $orderby = $_SESSION[$currentModule.'_Order_By']; + return $orderby; + } + + function save_module($module) { + } + + /** + * Return query to use based on given modulename, fieldname + * Useful to handle specific case handling for Popup + */ + function getQueryByModuleField($module, $fieldname, $srcrecord) { + // $srcrecord could be empty + } + + /** + * Get list view query. + */ + function getListQuery($module, $where='') { + $query = "SELECT vtiger_crmentity.*, $this->table_name.*"; + + // Select Custom Field Table Columns if present + if(!empty($this->customFieldTable)) $query .= ", " . $this->customFieldTable[0] . ".* "; + + $query .= " FROM $this->table_name"; + + $query .= " INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = $this->table_name.$this->table_index"; + + // Consider custom table join as well. + if(!empty($this->customFieldTable)) { + $query .= " INNER JOIN ".$this->customFieldTable[0]." ON ".$this->customFieldTable[0].'.'.$this->customFieldTable[1] . + " = $this->table_name.$this->table_index"; + } + $query .= " LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid"; + $query .= " LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid"; + + $linkedModulesQuery = $this->db->pquery("SELECT distinct fieldname, columnname, relmodule FROM vtiger_field" . + " INNER JOIN vtiger_fieldmodulerel ON vtiger_fieldmodulerel.fieldid = vtiger_field.fieldid" . + " WHERE uitype='10' AND vtiger_fieldmodulerel.module=?", array($module)); + $linkedFieldsCount = $this->db->num_rows($linkedModulesQuery); + + for($i=0; $i<$linkedFieldsCount; $i++) { + $related_module = $this->db->query_result($linkedModulesQuery, $i, 'relmodule'); + $fieldname = $this->db->query_result($linkedModulesQuery, $i, 'fieldname'); + $columnname = $this->db->query_result($linkedModulesQuery, $i, 'columnname'); + + $other = CRMEntity::getInstance($related_module); + vtlib_setup_modulevars($related_module, $other); + + $query .= " LEFT JOIN $other->table_name ON $other->table_name.$other->table_index = $this->table_name.$columnname"; + } + + $query .= " WHERE vtiger_crmentity.deleted = 0 ".$where; + $query .= $this->getListViewSecurityParameter($module); + return $query; + } + + /** + * Apply security restriction (sharing privilege) query part for List view. + */ + function getListViewSecurityParameter($module) { + global $current_user; + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + + $sec_query = ''; + $tabid = getTabid($module); + + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 + && $defaultOrgSharingPermission[$tabid] == 3) { + + $sec_query .= " AND (vtiger_crmentity.smownerid in($current_user->id) OR vtiger_crmentity.smownerid IN + ( + SELECT vtiger_user2role.userid FROM vtiger_user2role + INNER JOIN vtiger_users ON vtiger_users.id=vtiger_user2role.userid + INNER JOIN vtiger_role ON vtiger_role.roleid=vtiger_user2role.roleid + WHERE vtiger_role.parentrole LIKE '".$current_user_parent_role_seq."::%' + ) + OR vtiger_crmentity.smownerid IN + ( + SELECT shareduserid FROM vtiger_tmp_read_user_sharing_per + WHERE userid=".$current_user->id." AND tabid=".$tabid." + ) + OR + ("; + + // Build the query based on the group association of current user. + if(sizeof($current_user_groups) > 0) { + $sec_query .= " vtiger_groups.groupid IN (". implode(",", $current_user_groups) .") OR "; + } + $sec_query .= " vtiger_groups.groupid IN + ( + SELECT vtiger_tmp_read_group_sharing_per.sharedgroupid + FROM vtiger_tmp_read_group_sharing_per + WHERE userid=".$current_user->id." and tabid=".$tabid." + )"; + $sec_query .= ") + )"; + } + return $sec_query; + } + + /** + * Create query to export the records. + */ + function create_export_query($where) + { + global $current_user,$currentModule; + $thismodule = $_REQUEST['module']; + + include("include/utils/ExportUtils.php"); + + //To get the Permitted fields query and the permitted fields list + $sql = getPermittedFieldsQuery($thismodule, "detail_view"); + + $fields_list = getFieldsListFromQuery($sql); + + $query = "SELECT $fields_list, vtiger_users.user_name AS user_name + FROM vtiger_crmentity INNER JOIN $this->table_name ON vtiger_crmentity.crmid=$this->table_name.$this->table_index"; + + if(!empty($this->customFieldTable)) { + $query .= " INNER JOIN ".$this->customFieldTable[0]." ON ".$this->customFieldTable[0].'.'.$this->customFieldTable[1] . + " = $this->table_name.$this->table_index"; + } + + $query .= " LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid"; + $query .= " LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id and vtiger_users.status='Active'"; + + $linkedModulesQuery = $this->db->pquery("SELECT distinct fieldname, columnname, relmodule FROM vtiger_field" . + " INNER JOIN vtiger_fieldmodulerel ON vtiger_fieldmodulerel.fieldid = vtiger_field.fieldid" . + " WHERE uitype='10' AND vtiger_fieldmodulerel.module=?", array($thismodule)); + $linkedFieldsCount = $this->db->num_rows($linkedModulesQuery); + + for($i=0; $i<$linkedFieldsCount; $i++) { + $related_module = $this->db->query_result($linkedModulesQuery, $i, 'relmodule'); + $fieldname = $this->db->query_result($linkedModulesQuery, $i, 'fieldname'); + $columnname = $this->db->query_result($linkedModulesQuery, $i, 'columnname'); + + $other = CRMEntity::getInstance($related_module); + vtlib_setup_modulevars($related_module, $other); + + $query .= " LEFT JOIN $other->table_name ON $other->table_name.$other->table_index = $this->table_name.$columnname"; + } + + $where_auto = " vtiger_crmentity.deleted=0"; + + if($where != '') $query .= " WHERE ($where) AND $where_auto"; + else $query .= " WHERE $where_auto"; + + require('user_privileges/user_privileges_'.$current_user->id.'.php'); + require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); + + // Security Check for Field Access + if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 && $defaultOrgSharingPermission[7] == 3) + { + //Added security check to get the permitted records only + $query = $query." ".getListViewSecurityParameter($thismodule); + } + return $query; + } + + /** + * Initialize this instance for importing. + */ + function initImport($module) { + $this->db = new PearDatabase(); + $this->initImportableFields($module); + } + + /** + * Create list query to be shown at the last step of the import. + * Called From: modules/Import/UserLastImport.php + */ + function create_import_query($module) { + global $current_user; + $query = "SELECT vtiger_crmentity.crmid, case when (vtiger_users.user_name not like '') then vtiger_users.user_name else vtiger_groups.groupname end as user_name, $this->table_name.* FROM $this->table_name + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = $this->table_name.$this->table_index + LEFT JOIN vtiger_users_last_import ON vtiger_users_last_import.bean_id=vtiger_crmentity.crmid + LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid + WHERE vtiger_users_last_import.assigned_user_id='$current_user->id' + AND vtiger_users_last_import.bean_type='$module' + AND vtiger_users_last_import.deleted=0"; + return $query; + } + + /** + * Delete the last imported records. + */ + function undo_import($module, $user_id) { + global $adb; + $count = 0; + $query1 = "select bean_id from vtiger_users_last_import where assigned_user_id=? AND bean_type='$module' AND deleted=0"; + $result1 = $adb->pquery($query1, array($user_id)) or die("Error getting last import for undo: ".mysql_error()); + while ( $row1 = $adb->fetchByAssoc($result1)) + { + $query2 = "update vtiger_crmentity set deleted=1 where crmid=?"; + $result2 = $adb->pquery($query2, array($row1['bean_id'])) or die("Error undoing last import: ".mysql_error()); + $count++; + } + return $count; + } + + /** + * Function which will set the assigned user id for import record. + */ + function set_import_assigned_user() + { + global $current_user, $adb; + $record_user = $this->column_fields["assigned_user_id"]; + + if($record_user != $current_user->id){ + $sqlresult = $adb->pquery("select id from vtiger_users where id = ? union select groupid as id from vtiger_groups where groupid = ?", array($record_user, $record_user)); + if($this->db->num_rows($sqlresult)!= 1) { + $this->column_fields["assigned_user_id"] = $current_user->id; + } else { + $row = $adb->fetchByAssoc($sqlresult, -1, false); + if (isset($row['id']) && $row['id'] != -1) { + $this->column_fields["assigned_user_id"] = $row['id']; + } else { + $this->column_fields["assigned_user_id"] = $current_user->id; + } + } + } + } + + /** + * Function which will give the basic query to find duplicates + */ + function getDuplicatesQuery($module,$table_cols,$field_values,$ui_type_arr,$select_cols='') { + $select_clause = "SELECT ". $this->table_name .".".$this->table_index ." AS recordid, vtiger_users_last_import.deleted,".$table_cols; + + // Select Custom Field Table Columns if present + if(isset($this->customFieldTable)) $query .= ", " . $this->customFieldTable[0] . ".* "; + + $from_clause = " FROM $this->table_name"; + + $from_clause .= " INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = $this->table_name.$this->table_index"; + + // Consider custom table join as well. + if(isset($this->customFieldTable)) { + $from_clause .= " INNER JOIN ".$this->customFieldTable[0]." ON ".$this->customFieldTable[0].'.'.$this->customFieldTable[1] . + " = $this->table_name.$this->table_index"; + } + $from_clause .= " LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid + LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid"; + + $where_clause = " WHERE vtiger_crmentity.deleted = 0"; + $where_clause .= $this->getListViewSecurityParameter($module); + + if (isset($select_cols) && trim($select_cols) != '') { + $sub_query = "SELECT $select_cols FROM $this->table_name AS t " . + " INNER JOIN vtiger_crmentity AS crm ON crm.crmid = t.".$this->table_index; + // Consider custom table join as well. + if(isset($this->customFieldTable)) { + $sub_query .= " INNER JOIN ".$this->customFieldTable[0]." tcf ON tcf.".$this->customFieldTable[1]." = t.$this->table_index"; + } + $sub_query .= " WHERE crm.deleted=0 GROUP BY $select_cols HAVING COUNT(*)>1"; + } else { + $sub_query = "SELECT $table_cols $from_clause $where_clause GROUP BY $table_cols HAVING COUNT(*)>1"; + } + + $query = $select_clause . $from_clause . + " LEFT JOIN vtiger_users_last_import ON vtiger_users_last_import.bean_id=" . $this->table_name .".".$this->table_index . + " INNER JOIN (" . $sub_query . ") AS temp ON ".get_on_clause($field_values,$ui_type_arr,$module) . + $where_clause . + " ORDER BY $table_cols,". $this->table_name .".".$this->table_index ." ASC"; + + return $query; + } + + /** + * Invoked when special actions are performed on the module. + * @param String Module name + * @param String Event Type + */ + function vtlib_handler($moduleName, $eventType) { + + require_once('include/utils/utils.php'); + global $adb; + + if($eventType == 'module.postinstall') { + require_once('vtlib/Vtiger/Module.php'); + + $moduleInstance = Vtiger_Module::getInstance($moduleName); + + $accModuleInstance = Vtiger_Module::getInstance('Accounts'); + $accModuleInstance->setRelatedList($moduleInstance,'Service Contracts',array('add'),'get_dependents_list'); + + $conModuleInstance = Vtiger_Module::getInstance('Contacts'); + $conModuleInstance->setRelatedList($moduleInstance,'Service Contracts',array('add'),'get_dependents_list'); + + // Initialize module sequence for the module + $adb->pquery("INSERT into vtiger_modentity_num values(?,?,?,?,?,?)",array($adb->getUniqueId("vtiger_modentity_num"),$moduleName,'SERCON',1,1,1)); + + // Make the picklist value 'Complete' for status as non-editable + $adb->query("UPDATE vtiger_contract_status SET presence=0 WHERE contract_status='Complete'"); + + // Mark the module as Standard module + $adb->pquery('UPDATE vtiger_tab SET customized=0 WHERE name=?', array($moduleName)); + + } else if($eventType == 'module.disabled') { + $em = new VTEventsManager($adb); + $em->setHandlerInActive('ServiceContractsHandler'); + + } else if($eventType == 'module.enabled') { + $em = new VTEventsManager($adb); + $em->setHandlerActive('ServiceContractsHandler'); + + } else if($eventType == 'module.preuninstall') { + // TODO Handle actions when this module is about to be deleted. + } else if($eventType == 'module.preupdate') { + // TODO Handle actions before this module is updated. + } else if($eventType == 'module.postupdate') { + // TODO Handle actions after this module is updated. + } + } + + /** + * Handle saving related module information. + * NOTE: This function has been added to CRMEntity (base class). + * You can override the behavior by re-defining it here. + */ + function save_related_module($module, $crmid, $with_module, $with_crmid) { + parent::save_related_module($module, $crmid, $with_module, $with_crmid); + if ($with_module == 'HelpDesk') { + $this->updateHelpDeskRelatedTo($crmid,$with_crmid); + $this->updateServiceContractState($crmid); + } + } + + // Function to Update the parent_id of HelpDesk with sc_related_to of ServiceContracts if the parent_id is not set. + function updateHelpDeskRelatedTo($focusId, $entityIds) { + global $log; + $log->debug("Entering into function updateHelpDeskRelatedTo(".$entityIds.")."); + + if(!is_array($entityIds)) $entityIds = array($entityIds); + $selectTicketsQuery = "SELECT ticketid FROM vtiger_troubletickets WHERE (parent_id IS NULL OR parent_id = 0) AND ticketid IN (" . generateQuestionMarks($entityIds) .")"; + $selectTicketsResult = $this->db->pquery($selectTicketsQuery, array($entityIds)); + $noOfTickets = $this->db->num_rows($selectTicketsResult); + for($i=0; $i < $noOfTickets; ++$i) { + $ticketId = $this->db->query_result($selectTicketsResult,$i,'ticketid'); + $updateQuery = "UPDATE vtiger_troubletickets, vtiger_servicecontracts SET parent_id=vtiger_servicecontracts.sc_related_to" . + " WHERE vtiger_servicecontracts.sc_related_to IS NOT NULL AND vtiger_servicecontracts.sc_related_to != 0" . + " AND vtiger_servicecontracts.servicecontractsid = ? AND vtiger_troubletickets.ticketid = ?"; + $updateResult = $this->db->pquery($updateQuery, array($focusId, $ticketId)); + } + + $log->debug("Exit from function updateHelpDeskRelatedTo(".$entityIds.")"); + } + + // Function to Compute and Update the Used Units and Progress of the Service Contract based on all the related Trouble tickets. + function updateServiceContractState($focusId) { + $this->id = $focusId; + $this->retrieve_entity_info($focusId,'ServiceContracts'); + + $contractTicketsResult = $this->db->pquery("SELECT relcrmid FROM vtiger_crmentityrel WHERE module = 'ServiceContracts' AND crmid = ?" . + " AND relmodule = 'HelpDesk'", array($focusId)); + $noOfTickets = $this->db->num_rows($contractTicketsResult); + $ticketFocus = CRMEntity::getInstance('HelpDesk'); + $totalUsedUnits = 0; + for($i=0; $i < $noOfTickets; ++$i) { + $ticketId = $this->db->query_result($contractTicketsResult, $i, 'relcrmid'); + $ticketFocus->id = $ticketId; + $ticketFocus->retrieve_entity_info($ticketId, 'HelpDesk'); + if (strtolower($ticketFocus->column_fields['ticketstatus']) == 'closed') { + $totalUsedUnits += $this->computeUsedUnits($ticketFocus->column_fields); + } + } + $this->updateUsedUnits($totalUsedUnits); + + $this->calculateProgress(); + } + + // Function to Upate the Used Units of the Service Contract based on the given Ticket id. + function computeUsedUnits($ticketData, $operator='+') { + $trackingUnit = strtolower($this->column_fields['tracking_unit']); + $workingHoursPerDay = 24; + + $usedUnits = 0; + if ($trackingUnit == 'incidents') { + $usedUnits = 1; + } elseif ($trackingUnit == 'days') { + if(!empty($ticketData['days'])) { + $usedUnits = $ticketData['days']; + } elseif(!empty($ticketData['hours'])) { + $usedUnits = $ticketData['hours'] / $workingHoursPerDay; + } + } elseif ($trackingUnit == 'hours') { + if(!empty($ticketData['hours'])) { + $usedUnits = $ticketData['hours']; + } elseif(!empty($ticketData['days'])) { + $usedUnits = $ticketData['days'] * $workingHoursPerDay; + } + } + return $usedUnits; + } + + // Function to Upate the Used Units of the Service Contract. + function updateUsedUnits($usedUnits) { + $this->column_fields['used_units'] = $usedUnits; + $updateQuery = "UPDATE vtiger_servicecontracts SET used_units = $usedUnits WHERE servicecontractsid = ?"; + $this->db->pquery($updateQuery, array($this->id)); + } + + // Function to Calculate the End Date, Planned Duration, Actual Duration and Progress of a Service Contract + function calculateProgress() { + $updateCols = array(); + $updateParams = array(); + + $startDate = $this->column_fields['start_date']; + $dueDate = $this->column_fields['due_date']; + $endDate = $this->column_fields['end_date']; + + $usedUnits = $this->column_fields['used_units']; + $totalUnits = $this->column_fields['total_units']; + + $contractStatus = $this->column_fields['contract_status']; + + // Update the End date if the status is Complete or if the Used Units reaches/exceeds Total Units + // We need to do this first to make sure Actual duration is computed properly + if($contractStatus == 'Complete' || (!empty($usedUnits) && !empty($totalUnits) && $usedUnits >= $totalUnits)) { + if(empty($endDate)) { + $endDate = date('Y-m-d'); + $this->db->pquery('UPDATE vtiger_servicecontracts SET end_date=? WHERE servicecontractsid = ?', array(date('Y-m-d'), $this->id)); + } + } else { + $endDate = null; + $this->db->pquery('UPDATE vtiger_servicecontracts SET end_date=? WHERE servicecontractsid = ?', array(null, $this->id)); + } + + // Calculate the Planned Duration based on Due date and Start date. (in days) + if(!empty($dueDate) && !empty($startDate)) { + $plannedDurationUpdate = " planned_duration = (TO_DAYS(due_date)-TO_DAYS(start_date)+1)"; + } else { + $plannedDurationUpdate = " planned_duration = ''"; + } + array_push($updateCols, $plannedDurationUpdate); + + // Calculate the Actual Duration based on End date and Start date. (in days) + if(!empty($endDate) && !empty($startDate)) { + $actualDurationUpdate = "actual_duration = (TO_DAYS(end_date)-TO_DAYS(start_date)+1)"; + } else { + $actualDurationUpdate = "actual_duration = ''"; + } + array_push($updateCols, $actualDurationUpdate); + + // Update the Progress based on Used Units and Total Units (in percentage) + if(!empty($usedUnits) && !empty($totalUnits)) { + $progressUpdate = 'progress = ?'; + $progressUpdateParams = floatval(($usedUnits * 100) / $totalUnits); + } else { + $progressUpdate = 'progress = ?'; + $progressUpdateParams = null; + } + array_push($updateCols, $progressUpdate); + array_push($updateParams, $progressUpdateParams); + + if(count($updateCols) > 0) { + $updateQuery = 'UPDATE vtiger_servicecontracts SET '. implode(",", $updateCols) .' WHERE servicecontractsid = ?'; + array_push($updateParams, $this->id); + $this->db->pquery($updateQuery, $updateParams); + } + } + + /** + * Handle deleting related module information. + * NOTE: This function has been added to CRMEntity (base class). + * You can override the behavior by re-defining it here. + */ + function delete_related_module($module, $crmid, $with_module, $with_crmid) { + parent::delete_related_module($module, $crmid, $with_module, $with_crmid); + if ($with_module == 'HelpDesk') { + $this->updateServiceContractState($crmid); + } + } + + /** + * Handle getting related list information. + * NOTE: This function has been added to CRMEntity (base class). + * You can override the behavior by re-defining it here. + */ + //function get_related_list($id, $cur_tab_id, $rel_tab_id, $actions=false) { } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/ServiceContractsAjax.php b/oss/vtiger/trunk/modules/ServiceContracts/ServiceContractsAjax.php new file mode 100644 index 00000000..efae0a94 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/ServiceContractsAjax.php @@ -0,0 +1,11 @@ + diff --git a/oss/vtiger/trunk/modules/ServiceContracts/ServiceContractsHandler.php b/oss/vtiger/trunk/modules/ServiceContracts/ServiceContractsHandler.php new file mode 100644 index 00000000..b5c8b9f2 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/ServiceContractsHandler.php @@ -0,0 +1,101 @@ +getModuleName(); + if ($moduleName == 'HelpDesk') { + $ticketId = $entityData->getId(); + $oldStatus = ''; + if(!empty($ticketId)) { + $tktResult = $adb->pquery('SELECT status FROM vtiger_troubletickets WHERE ticketid = ?', array($ticketId)); + if($adb->num_rows($tktResult) > 0) { + $oldStatus = $adb->query_result($tktResult,0,'status'); + } + } + $entityData->oldStatus = $oldStatus; + } + if ($moduleName == 'ServiceContracts') { + $contractId = $entityData->getId(); + $oldTrackingUnit = ''; + if(!empty($contractId)) { + $contractResult = $adb->pquery('SELECT tracking_unit FROM vtiger_servicecontracts WHERE servicecontractsid = ?', array($contractId)); + if($adb->num_rows($contractResult) > 0) { + $oldTrackingUnit = $adb->query_result($contractResult,0,'tracking_unit'); + } + } + $entityData->oldTrackingUnit = $oldTrackingUnit; + } + } + + if($eventName == 'vtiger.entity.aftersave') { + + $moduleName = $entityData->getModuleName(); + + // Update Used Units for the Service Contract, everytime the status of a ticket related to the Service Contract changes + if ($moduleName == 'HelpDesk' && $_REQUEST['return_module'] != 'ServiceContracts') { + $ticketId = $entityData->getId(); + $data = $entityData->getData(); + if($data['ticketstatus'] != $entityData->oldStatus) { + if(strtolower($data['ticketstatus']) == 'closed' || strtolower($entityData->oldStatus) == 'closed') { + if (strtolower($entityData->oldStatus) == 'closed') { + $op = '-'; + } else { + $op = '+'; + } + $contract_tktresult = $adb->pquery("SELECT crmid FROM vtiger_crmentityrel WHERE module = 'ServiceContracts'" . + " AND relmodule = 'HelpDesk' AND relcrmid = ?", array($ticketId)); + $noOfContracts = $adb->num_rows($contract_tktresult); + if($noOfContracts > 0) { + for($i=0;$i<$noOfContracts;$i++) { + $contract_id = $adb->query_result($contract_tktresult,$i,'crmid'); + $scFocus = CRMEntity::getInstance('ServiceContracts'); + $scFocus->id = $contract_id; + $scFocus->retrieve_entity_info($contract_id,'ServiceContracts'); + + $prevUsedUnits = $scFocus->column_fields['used_units']; + if(empty($prevUsedUnits)) $prevUsedUnits = 0; + + $usedUnits = $scFocus->computeUsedUnits($data); + if ($op == '-') { + $totalUnits = $prevUsedUnits - $usedUnits; + } else { + $totalUnits = $prevUsedUnits + $usedUnits; + } + $scFocus->updateUsedUnits($totalUnits); + $scFocus->calculateProgress(); + } + } + } + } + } + + // Update the Planned Duration, Actual Duration, End Date and Progress based on other field values. + if ($moduleName == 'ServiceContracts') { + $contractId = $entityData->getId(); + $data = $entityData->getData(); + $scFocus = CRMEntity::getInstance('ServiceContracts'); + if($data['tracking_unit'] != $entityData->oldTrackingUnit) { // Need to recompute used_units based when tracking_unit changes. + $scFocus->updateServiceContractState($contractId); + } else { + $scFocus->id = $contractId; + $scFocus->retrieve_entity_info($contractId,'ServiceContracts'); + $scFocus->calculateProgress(); + } + } + } + } +} + +?> diff --git a/oss/vtiger/trunk/modules/ServiceContracts/Settings.php b/oss/vtiger/trunk/modules/ServiceContracts/Settings.php new file mode 100644 index 00000000..980dd078 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/Settings.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/ServiceContracts/TagCloud.php b/oss/vtiger/trunk/modules/ServiceContracts/TagCloud.php new file mode 100644 index 00000000..8343cd5b --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/TagCloud.php @@ -0,0 +1,11 @@ + diff --git a/oss/vtiger/trunk/modules/ServiceContracts/UnifiedSearch.php b/oss/vtiger/trunk/modules/ServiceContracts/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/ServiceContracts/index.php b/oss/vtiger/trunk/modules/ServiceContracts/index.php new file mode 100644 index 00000000..b7add8d8 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/index.php @@ -0,0 +1,15 @@ + diff --git a/oss/vtiger/trunk/modules/ServiceContracts/language/en_us.lang.php b/oss/vtiger/trunk/modules/ServiceContracts/language/en_us.lang.php new file mode 100644 index 00000000..823148e6 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/language/en_us.lang.php @@ -0,0 +1,59 @@ + 'Service Contracts', +'ServiceContracts' => 'Service Contracts', +'SINGLE_ServiceContracts' => 'Service Contract', +'LBL_SERVICE_CONTRACT_INFORMATION' => 'Service Contract Information', +'LBL_CUSTOM_INFORMATION' => 'Custom Information', + +'Contract No' => 'Contract No', +'Assigned To' => 'Assigned To', +'Created Time' => 'Created Time', +'Modified Time' => 'Modified Time', +'Start Date' => 'Start Date', +'Due Date' => 'Due Date', +'End Date' => 'End Date', +'Related to' => 'Related to', +'Tracking Unit' => 'Tracking Unit', +'Total Units' => 'Total Units', +'Used Units' => 'Used Units', +'Subject' => 'Subject', +'Progress'=> 'Progress (in %)', +'Type' => 'Type', +'Planned Duration' => 'Planned Duration (in Days)', +'Actual Duration' => 'Actual Duration (in Days)', +'Status' => 'Status', +'Priority' => 'Priority', + +'Undefined' => 'Undefined', +'In Planning' => 'In Planning', +'In Progress' => 'In Progress', +'On Hold' => 'On Hold', +'Complete' => 'Complete', +'Archived' => 'Archived', + +'Support' => 'Support', +'Services' => 'Services', +'Administrative' => 'Administrative', + +'Low'=>'Low', +'Normal'=>'Normal', +'High'=>'High', + +'None'=>'None', +'Hours'=>'Hours', +'Days'=>'Days', +'Incidents'=>'Incidents', + +); + +?> diff --git a/oss/vtiger/trunk/modules/ServiceContracts/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/ServiceContracts/language/zh_cn.lang.php new file mode 100644 index 00000000..cf29fac5 --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/language/zh_cn.lang.php @@ -0,0 +1,59 @@ + '服务合同', +'ServiceContracts' => '服务合同', +'SINGLE_ServiceContracts' => '服务合同', +'LBL_SERVICE_CONTRACT_INFORMATION' => '服务合同信息', +'LBL_CUSTOM_INFORMATION' => 'Custom Information', + +'Contract No' => 'Contract No', +'Assigned To' => 'Assigned To', +'Created Time' => 'Created Time', +'Modified Time' => 'Modified Time', +'Start Date' => 'Start Date', +'Due Date' => 'Due Date', +'End Date' => 'End Date', +'Related to' => 'Related to', +'Tracking Unit' => 'Tracking Unit', +'Total Units' => 'Total Units', +'Used Units' => 'Used Units', +'Subject' => 'Subject', +'Progress'=> 'Progress (in %)', +'Type' => 'Type', +'Planned Duration' => 'Planned Duration (in Days)', +'Actual Duration' => 'Actual Duration (in Days)', +'Status' => 'Status', +'Priority' => 'Priority', + +'Undefined' => 'Undefined', +'In Planning' => 'In Planning', +'In Progress' => 'In Progress', +'On Hold' => 'On Hold', +'Complete' => 'Complete', +'Archived' => 'Archived', + +'Support' => 'Support', +'Services' => 'Services', +'Administrative' => 'Administrative', + +'Low'=>'Low', +'Normal'=>'Normal', +'High'=>'High', + +'None'=>'None', +'Hours'=>'Hours', +'Days'=>'Days', +'Incidents'=>'Incidents', + +); + +?> diff --git a/oss/vtiger/trunk/modules/ServiceContracts/schema.xml b/oss/vtiger/trunk/modules/ServiceContracts/schema.xml new file mode 100644 index 00000000..0ce5433c --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/schema.xml @@ -0,0 +1,33 @@ + + + + + vtiger_servicecontracts + +
    + + vtiger_servicecontractscf + +
    +
    +
    diff --git a/oss/vtiger/trunk/modules/ServiceContracts/updateRelations.php b/oss/vtiger/trunk/modules/ServiceContracts/updateRelations.php new file mode 100644 index 00000000..9ee5399f --- /dev/null +++ b/oss/vtiger/trunk/modules/ServiceContracts/updateRelations.php @@ -0,0 +1,46 @@ +delete_related_module($currentModule, $forCRMRecord, $destinationModule, $ids); + } +} else { + if(!empty($_REQUEST['idlist'])) { + // Split the string of ids + $ids = explode (";",trim($idlist,";")); + } else if(!empty($_REQUEST['entityid'])){ + $ids = $_REQUEST['entityid']; + } + if(!empty($ids)) { + $focus->save_related_module($currentModule, $forCRMRecord, $destinationModule, $ids); + } +} +header("Location: index.php?module=$currentModule&record=$forCRMRecord&action=$action&parenttab=$parenttab"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/AddServiceToPriceBooks.php b/oss/vtiger/trunk/modules/Services/AddServiceToPriceBooks.php new file mode 100644 index 00000000..06f43edd --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/AddServiceToPriceBooks.php @@ -0,0 +1,168 @@ +id,'unit_price') != '0'){ + echo ""; + echo "
    "; + echo "
    + + + + + + + + + +
    $app_strings[LBL_UNIT_PRICE_NOT_PERMITTED]
    + $app_strings[LBL_GO_BACK]
    +
    "; + echo "
    "; + exit(); +} + +$smarty=new vtigerCRM_Smarty; + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("IMAGE_PATH",$image_path); + +$focus = new PriceBooks(); + +//Retreive the list of PriceBooks +$list_query = getListQuery("PriceBooks"); + +$list_query .= ' and vtiger_pricebook.active<>0 ORDER BY pricebookid DESC '; + +$list_result = $adb->query($list_query); +$num_rows = $adb->num_rows($list_result); + +$record_string= "Total No of PriceBooks : ".$num_rows; + +//Retreiving the array of already releated products +$sql1="select vtiger_crmentity.crmid, vtiger_pricebookproductrel.pricebookid,vtiger_service.unit_price + from vtiger_pricebookproductrel inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_pricebookproductrel.productid + inner join vtiger_service on vtiger_service.serviceid=vtiger_pricebookproductrel.productid + where vtiger_crmentity.deleted=0 and vtiger_pricebookproductrel.productid=?"; +$res1 = $adb->pquery($sql1, array($productid)); +$num_prod_rows = $adb->num_rows($res1); +$pbk_array = Array(); +for($i=0; $i<$num_prod_rows; $i++) +{ + $pbkid=$adb->query_result($res1,$i,"pricebookid"); + $pbk_array[$pbkid] = $pbkid; +} + +$pro_unit_price = getUnitPrice($productid, $currentModule); +$prod_price_details = getPriceDetailsForProduct($productid, $pro_unit_price, 'available', $currentModule); + +$prod_cur_price = array(); +for($i=0; $i + + '; + + //we should not display the Add to PriceBook button if there is no pricebooks to associate + if($num_rows != $num_prod_rows) + $other_text .=' '; + +$other_text .=''; +$other_text .=' + + '; + +$smarty->assign("PRICEBOOKLISTHEADER", get_form_header($current_module_strings['LBL_LIST_PRICEBOOK_FORM_TITLE'], $other_text, false )); + + +//List View Table Header +$list_header = ''; +$list_header .= ''; +$list_header .=''; +$list_header .= ''.$mod_strings['LBL_PRICEBOOK'].''; +$list_header .= ''.$app_strings['LBL_CURRENCY'].''; +$list_header .= ''.$mod_strings['LBL_PRODUCT_UNIT_PRICE'].''; +$list_header .= ''.$mod_strings['LBL_PB_LIST_PRICE'].''; +$list_header .= ''; + +$smarty->assign("LISTHEADER", $list_header); + +$list_body =''; +for($i=0; $i<$num_rows; $i++) +{ + $entity_id = $adb->query_result($list_result,$i,"crmid"); + if(! array_key_exists($entity_id, $pbk_array)) + { + $pk_currency_id = $adb->query_result($list_result,$i,"currency_id"); + $pk_currency_name = $adb->query_result($list_result,$i,"currency_name"); + $unit_price = $prod_cur_price[$pk_currency_id]; + $field_name = $entity_id."_listprice"; + $unit_price_array[]="'".$unit_price."'"; + $field_name_array[]="'".$field_name."'"; + + $list_body .= ''; + $list_body .= ''; + $list_body .= ''.$adb->query_result($list_result,$i,"bookname").''; + $list_body .= ''.$pk_currency_name.''; + $list_body .= ''.$unit_price.''; + + $list_body .=''; + if(isPermitted("PriceBooks","EditView","") == 'yes') + $list_body .= ''; + else + $list_body .= ''; + $list_body .= ''; + } + +} + +$smarty->assign("UNIT_PRICE_ARRAY",implode(",",$unit_price_array)); +$smarty->assign("FIELD_NAME_ARRAY",implode(",",$field_name_array)); + +if($order_by !='') + $url_string .="&order_by=".$order_by; +if($sorder !='') + $url_string .="&sorder=".$sorder; + +$smarty->assign("LISTENTITY", $list_body); +$smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +$smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +$smarty->assign("RETURN_ID", $productid); +$smarty->assign("CATEGORY", $parenttab); + +$smarty->display("AddProductToPriceBooks.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/AddServicesToPriceBook.php b/oss/vtiger/trunk/modules/Services/AddServicesToPriceBook.php new file mode 100644 index 00000000..4e41fce4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/AddServicesToPriceBook.php @@ -0,0 +1,185 @@ +id); +$parenttab = htmlspecialchars($_REQUEST['parenttab'],ENT_QUOTES,$default_charset); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +require_once($theme_path.'layout_utils.php'); + +if(getFieldVisibilityPermission('Services',$current_user->id,'unit_price') != '0'){ + echo ""; + echo "
    "; + echo "
    + + + + + + + + + +
    $app_strings[LBL_UNIT_PRICE_NOT_PERMITTED]
    + $app_strings[LBL_GO_BACK]
    +
    "; + echo "
    "; + exit(); +} + +$pricebookname = getPriceBookName($pricebook_id); + +$smarty= new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("IMAGE_PATH",$image_path); + +$focus = new Services(); + +if (isset($_REQUEST['order_by'])) + $order_by = $adb->sql_escape_string($_REQUEST['order_by']); + +$url_string = ''; // assigning http url string +$sorder = 'ASC'; // Default sort order +if(isset($_REQUEST['sorder']) && $_REQUEST['sorder'] != '') + $sorder = $adb->sql_escape_string($_REQUEST['sorder']); + + +//Retreive the list of Services +$list_query = getListQuery("Services"); + +if(isset($order_by) && $order_by != '') +{ + $list_query .= ' and vtiger_service.discontinued<>0 ORDER BY '.$order_by.' '.$sorder; +} + +$list_query .= " and vtiger_service.discontinued<>0 group by vtiger_crmentity.crmid"; +$list_result = $adb->query($list_query); +$num_rows = $adb->num_rows($list_result); + +$record_string= "Total No of Service Available : ".$num_rows; + +//Retreiving the array of already releated services +$sql1 = "select productid as serviceid from vtiger_pricebookproductrel + INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_pricebookproductrel.productid + WHERE vtiger_crmentity.setype='Services' AND vtiger_crmentity.deleted=0 AND pricebookid=?"; +$res1 = $adb->pquery($sql1, array($pricebook_id)); +$num_prod_rows = $adb->num_rows($res1); +$prod_array = Array(); +for($i=0; $i<$num_prod_rows; $i++) +{ + $prodid=$adb->query_result($res1,$i,"serviceid"); + $prod_array[$prodid] = $prodid; +} + + +//Buttons Add To PriceBook and Cancel +$other_text = ' + + + + '; + +$other_text .=' + +
      + + + + '; + + //we should not display the Add to PriceBook button if there is no services to associate + if($num_rows != $num_prod_rows && $num_rows > 0) + $other_text .=''; + +$other_text .=' 
    '; + +$smarty->assign("PRODUCTLISTHEADER", get_form_header($current_module_strings['LBL_LIST_FORM_TITLE'], $other_text, false )); + +//Retreive the List View Table Header + +$list_header = ''; +$list_header .= ''; +$list_header .=''; +$list_header .= ''.$mod_strings['LBL_LIST_SERVICE_NAME'].''; +if(getFieldVisibilityPermission('Services', $current_user->id, 'unit_price') == '0') + $list_header .= ''.$mod_strings['LBL_SERVICE_UNIT_PRICE'].''; +$list_header .= ''.$mod_strings['LBL_PB_LIST_PRICE'].''; +$list_header .= ''; + +$smarty->assign("LISTHEADER", $list_header); + + +//if the service is not associated already then we should display that services +$new_prod_array = array(); +$unit_price_array=array(); +$field_name_array=array(); +$entity_id_array =array(); +for($i=0; $i<$num_rows; $i++) +{ + $entity_id = $adb->query_result($list_result,$i,"crmid"); + if(! array_key_exists($entity_id, $prod_array)) + { + $new_prod_array[] = $entity_id; + } + $entity_id_array[$entity_id] = $i; +} +$prod_price_list = getPricesForProducts($currency_id, $new_prod_array, 'Services'); + +$list_body =''; +for($i=0; $iinfo("Services :: Showing the List of services to be added in price book"); + $entity_id = $new_prod_array[$i]; + + $list_body .= ''; + $unit_price = $prod_price_list[$entity_id]; + $field_name = $entity_id."_listprice"; + $unit_price_array[]="'".$unit_price."'"; + $field_name_array[]="'".$field_name."'"; + + $list_body .= ''; + $list_body .= ''.$adb->query_result($list_result,$entity_id_array[$entity_id],"servicename").''; + + if(getFieldVisibilityPermission('Services', $current_user->id, 'unit_price') == '0') + $list_body .= ''.$unit_price.''; + + $list_body .=''; + if(isPermitted("PriceBooks","EditView","") == 'yes') + $list_body .= ''; + else + $list_body .= ''; + $list_body .= ''; +} + +$smarty->assign("UNIT_PRICE_ARRAY",implode(",",$unit_price_array)); +$smarty->assign("FIELD_NAME_ARRAY",implode(",",$field_name_array)); + +if($order_by !='') + $url_string .="&order_by=".$order_by; +if($sorder !='') + $url_string .="&sorder=".$sorder; + +$smarty->assign("LISTENTITY", $list_body); +$smarty->assign("CATEGORY", $parenttab); + +$smarty->display("AddProductsToPriceBook.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/CallRelatedList.php b/oss/vtiger/trunk/modules/Services/CallRelatedList.php new file mode 100644 index 00000000..1cc367c4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/CallRelatedList.php @@ -0,0 +1,77 @@ +retrieve_entity_info($record, $currentModule); + $focus->id = $record; + $service_base_currency = getProductBaseCurrency($focus->id,$currentModule); + } else { + $service_base_currency = fetchCurrency($current_user->id); + } + + $smarty = new vtigerCRM_Smarty; + + if($isduplicate == 'true') $focus->id = ''; + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + if(!$_SESSION['rlvs'][$currentModule]) unset($_SESSION['rlvs']); + + // Identify this module as custom module. + $smarty->assign('CUSTOM_MODULE', true); + + $smarty->assign('APP', $app_strings); + $smarty->assign('MOD', $mod_strings); + $smarty->assign('MODULE', $currentModule); + // TODO: Update Single Module Instance name here. + $smarty->assign('SINGLE_MOD', getTranslatedString($currentModule)); + $smarty->assign('CATEGORY', $category); + $smarty->assign('IMAGE_PATH', "themes/$theme/images/"); + $smarty->assign('THEME', $theme); + $smarty->assign('ID', $focus->id); + $smarty->assign('MODE', $focus->mode); + $smarty->assign('CHECK', $tool_buttons); + + $smarty->assign('NAME', $focus->column_fields[$focus->def_detailview_recname]); + $smarty->assign('UPDATEINFO',updateInfo($focus->id)); + + $smarty->assign("CURRENCY_ID",$service_base_currency); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $related_array = getRelatedLists($currentModule, $focus); + + $smarty->assign('RELATEDLISTS', $related_array); + $smarty->display('RelatedLists.tpl'); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/CustomView.php b/oss/vtiger/trunk/modules/Services/CustomView.php new file mode 100644 index 00000000..aebb8b53 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/CustomView.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Services/Delete.php b/oss/vtiger/trunk/modules/Services/Delete.php new file mode 100644 index 00000000..83411bbd --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/Delete.php @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/DeletePriceBookServiceRel.php b/oss/vtiger/trunk/modules/Services/DeletePriceBookServiceRel.php new file mode 100644 index 00000000..e94aeb6a --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/DeletePriceBookServiceRel.php @@ -0,0 +1,29 @@ +info("Products :: Deleting Price Book - Delete from PriceBook RelatedList"); + $query = "delete from vtiger_pricebookproductrel where pricebookid=? and productid=?"; + $adb->pquery($query, array($return_id, $record)); +} else { + $log->info("Products :: Deleting Price Book"); + $query = "delete from vtiger_pricebookproductrel where pricebookid=? and productid=?"; + $adb->pquery($query, array($record, $return_id)); +} + +header("Location: index.php?module=".$return_module."&action=".$return_module."Ajax&file=$return_action&ajax=delpbprorel&record=".$return_id); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/DetailView.php b/oss/vtiger/trunk/modules/Services/DetailView.php new file mode 100644 index 00000000..5168b638 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/DetailView.php @@ -0,0 +1,116 @@ +id = $record; + $focus->retrieve_entity_info($record, $currentModule); +} +if($isduplicate == 'true') $focus->id = ''; + +// Identify this module as custom module. +$smarty->assign('CUSTOM_MODULE', true); + +$smarty->assign('APP', $app_strings); +$smarty->assign('MOD', $mod_strings); +$smarty->assign('MODULE', $currentModule); +// TODO: Update Single Module Instance name here. +$smarty->assign('SINGLE_MOD', 'SINGLE_'.$currentModule); +$smarty->assign('CATEGORY', $category); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('THEME', $theme); +$smarty->assign('ID', $focus->id); +$smarty->assign('MODE', $focus->mode); + +$recordName = array_values(getEntityName($currentModule, $focus->id)); +$recordName = $recordName[0]; +$smarty->assign('NAME', $recordName); +$smarty->assign('UPDATEINFO',updateInfo($focus->id)); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +//Added to display the Tax informations +$tax_details = getTaxDetailsForProduct($focus->id); + +for($i=0;$iid); +} +$smarty->assign("TAX_DETAILS", $tax_details); + +$price_details = getPriceDetailsForProduct($focus->id, $focus->unit_price, 'available_associated',$currentModule); +$smarty->assign("PRICE_DETAILS", $price_details); + +$smarty->assign('IS_REL_LIST',isPresentRelatedLists($currentModule)); + +$validationArray = split_validationdataArray(getDBValidationData($focus->tab_name, $tabid)); +$smarty->assign('VALIDATION_DATA_FIELDNAME',$validationArray['fieldname']); +$smarty->assign('VALIDATION_DATA_FIELDDATATYPE',$validationArray['datatype']); +$smarty->assign('VALIDATION_DATA_FIELDLABEL',$validationArray['fieldlabel']); + +$smarty->assign('EDIT_PERMISSION', isPermitted($currentModule, 'EditView', $record)); +$smarty->assign('CHECK', $tool_buttons); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} + +$smarty->assign('IS_REL_LIST', isPresentRelatedLists($currentModule)); +$smarty->assign('SinglePane_View', $singlepane_view); + +if($singlepane_view == 'true') { + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +if(isPermitted($currentModule, 'EditView', $record) == 'yes') + $smarty->assign('EDIT_DUPLICATE', 'permitted'); +if(isPermitted($currentModule, 'Delete', $record) == 'yes') + $smarty->assign('DELETE', 'permitted'); + +$smarty->assign('BLOCKS', getBlocks($currentModule,'detail_view','',$focus->column_fields)); + +// Gather the custom link information to display +include_once('vtlib/Vtiger/Link.php'); +$customlink_params = Array('MODULE'=>$currentModule, 'RECORD'=>$focus->id, 'ACTION'=>vtlib_purify($_REQUEST['action'])); +$smarty->assign('CUSTOM_LINKS', Vtiger_Link::getAllByType($tabid, 'DETAILVIEW', $customlink_params)); +// END + +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("Inventory/InventoryDetailView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/DetailViewAjax.php b/oss/vtiger/trunk/modules/Services/DetailViewAjax.php new file mode 100644 index 00000000..43da8072 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/DetailViewAjax.php @@ -0,0 +1,39 @@ +retrieve_entity_info($crmid, $currentModule); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = 'edit'; + $modObj->save($currentModule); + if($modObj->id != '') + { + echo ':#:SUCCESS'; + }else + { + echo ':#:FAILURE'; + } + }else + { + echo ':#:FAILURE'; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/EditListPrice.php b/oss/vtiger/trunk/modules/Services/EditListPrice.php new file mode 100644 index 00000000..6cb9eb75 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/EditListPrice.php @@ -0,0 +1,72 @@ + + + + + + + + + + + + +
    '.$mod_strings["LBL_EDITLISTPRICE"].''.$app_strings[
    + + + + +
    + + + + + +
    '.$mod_strings["LBL_EDITLISTPRICE"].'
    +
    + + + + +
    + + +
    + +'; + +echo $output; + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/EditView.php b/oss/vtiger/trunk/modules/Services/EditView.php new file mode 100644 index 00000000..fa582e25 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/EditView.php @@ -0,0 +1,182 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if($record) { + $focus->id = $record; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($record, $currentModule); + $service_base_currency = getProductBaseCurrency($focus->id,$currentModule); +} else { + $service_base_currency = fetchCurrency($current_user->id); +} + +if($isduplicate == 'true') { + $focus->id = ''; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +//needed when creating a new service with a default vtiger_vendor name to passed +if (isset($_REQUEST['name']) && is_null($focus->name)) { + $focus->name = $_REQUEST['name']; +} + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') { + $smarty->assign('BLOCKS', getBlocks($currentModule, $disp_view, $focus->mode, $focus->column_fields)); +} else { + $bas_block = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS'); + $adv_block = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'ADV'); + + $blocks['basicTab'] = $bas_block; + if(is_array($adv_block)) + $blocks['moreTab'] = $adv_block; + + $smarty->assign("BLOCKS",$blocks); + $smarty->assign("BLOCKS_COUNT",count($blocks)); +} + +$smarty->assign('OP_MODE',$disp_view); +$smarty->assign('APP', $app_strings); +$smarty->assign('MOD', $mod_strings); +$smarty->assign('MODULE', $currentModule); +// TODO: Update Single Module Instance name here. +$smarty->assign('SINGLE_MOD', getTranslatedString('SINGLE_'.$currentModule)); +$smarty->assign('CATEGORY', $category); +$smarty->assign("THEME", $theme); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('ID', $focus->id); +$smarty->assign('MODE', $focus->mode); + +$smarty->assign('CHECK', Button_Check($currentModule)); +$smarty->assign('DUPLICATE', $isduplicate); + +if($focus->mode == 'edit' || $isduplicate) { + $recordName = array_values(getEntityName($currentModule, $record)); + $recordName = $recordName[0]; + $smarty->assign('NAME', $recordName); + $smarty->assign('UPDATEINFO',updateInfo($record)); +} + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if(isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if (isset($_REQUEST['return_viewname'])) $smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +// In case you have a date field +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
    '. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + +// Gather the help information associated with fields +$smarty->assign('FIELDHELPINFO', vtlib_getFieldHelpInfo($currentModule)); +// END + +//Tax handling (get the available taxes only) - starts +if($focus->mode == 'edit') +{ + $retrieve_taxes = true; + $serviceid = $focus->id; + $tax_details = getTaxDetailsForProduct($serviceid,'available_associated'); +} +elseif($_REQUEST['isDuplicate'] == 'true') +{ + $retrieve_taxes = true; + $serviceid = $_REQUEST['record']; + $tax_details = getTaxDetailsForProduct($serviceid,'available_associated'); +} +else { + $tax_details = getAllTaxes('available'); + $smarty->assign("PROD_MODE", "create"); +} + +for($i=0;$iassign("TAX_DETAILS", $tax_details); +//Tax handling - ends + +$unit_price = $focus->column_fields['unit_price']; +$price_details = getPriceDetailsForProduct($serviceid, $unit_price, 'available',$currentModule); +$smarty->assign("PRICE_DETAILS", $price_details); + +$base_currency = 'curname' . $service_base_currency; +$smarty->assign("BASE_CURRENCY", $base_currency); + +if($focus->mode == 'edit') { + $smarty->display('Inventory/InventoryEditView.tpl'); +} else { + $smarty->display('Inventory/InventoryCreateView.tpl'); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/ExportRecords.php b/oss/vtiger/trunk/modules/Services/ExportRecords.php new file mode 100644 index 00000000..31029bc0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/ExportRecords.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Services/FindDuplicateRecords.php b/oss/vtiger/trunk/modules/Services/FindDuplicateRecords.php new file mode 100644 index 00000000..b1a36b7b --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/FindDuplicateRecords.php @@ -0,0 +1,106 @@ +pquery($sql, array($id)); + DeleteEntity($req_module,$return_module,$focus,$id,""); + } + else { + $ids_list[] = $id; + } +} + if(count($ids_list) > 0) { + $ret = getEntityName($req_module,$ids_list); + if(count($ret) > 0) + { + $errormsg = implode(',',$ret); + } + echo "
    "; + echo "
    + + + + + + + + + +
    + $app_strings[LBL_DUP_PERMISSION] $req_module $errormsg
    + $app_strings[LBL_GO_BACK]
    +
    +
    "; + echo "
    "; + exit; + } +} + +include("include/saveMergeCriteria.php"); +$ret_arr=getDuplicateRecordsArr($req_module); + +$fld_values=$ret_arr[0]; +$total_num_group=count($fld_values); +$fld_name=$ret_arr[1]; +$ui_type=$ret_arr[2]; + +$smarty->assign("NAVIGATION",$ret_arr["navigation"]);//Added for page navigation +$smarty->assign("MODULE",$req_module); +$smarty->assign("NUM_GROUP",$total_num_group); +$smarty->assign("FIELD_NAMES",$fld_name); +$smarty->assign("CATEGORY",$parenttab); +$smarty->assign("ALL_VALUES",$fld_values); +if(isPermitted($req_module,'Delete','') == 'yes') + $button_del = $app_strings['LBL_MASS_DELETE']; +$smarty->assign("DELETE",$button_del); + +$smarty->assign("MOD", return_module_language($current_language,$req_module)); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MODE",'view'); +if(isset($_REQUEST['button_view'])) +{ + $smarty->assign("VIEW",'true'); +} +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("FindDuplicateAjax.tpl"); +else + $smarty->display('FindDuplicateDisplay.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/Import.php b/oss/vtiger/trunk/modules/Services/Import.php new file mode 100644 index 00000000..576068f5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/Import.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Services/InventoryPriceAjax.php b/oss/vtiger/trunk/modules/Services/InventoryPriceAjax.php new file mode 100644 index 00000000..0da43c2b --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/InventoryPriceAjax.php @@ -0,0 +1,36 @@ + 0) { + $product_prices = getPricesForProducts($currencyid, $product_ids); +} + +// To get the Price Values in the same order as the Products +for ($i=0;$i diff --git a/oss/vtiger/trunk/modules/Services/InventoryTaxAjax.php b/oss/vtiger/trunk/modules/Services/InventoryTaxAjax.php new file mode 100644 index 00000000..8401ad8f --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/InventoryTaxAjax.php @@ -0,0 +1,68 @@ + + + '.$app_strings['LABEL_SET_TAX_FOR'].' : '.$product_total.' +   + + + '; + +$net_tax_total = 0.00; +for($i=0,$j=$i+1;$i % + + + '.$tax_label.' + + + + + '; +} + +$tax_div .= ''; + +if($associated_tax_count == 0) +{ + $tax_div .= '
    '.$mod_strings['LBL_NO_TAXES_ASSOCIATED'].'.
    '; +} + +$tax_div .= ''; + +echo $tax_div; + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/ListView.php b/oss/vtiger/trunk/modules/Services/ListView.php new file mode 100644 index 00000000..786255b5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/ListView.php @@ -0,0 +1,189 @@ +initSortbyField($currentModule); +$sorder = $focus->getSortOrder(); +$order_by = $focus->getOrderBy(); + +$_SESSION[$currentModule."_Order_by"] = $order_by; +$_SESSION[$currentModule."_Sort_Order"]=$sorder; + +$smarty = new vtigerCRM_Smarty(); + +// Identify this module as custom module. +$smarty->assign('CUSTOM_MODULE', true); + +$smarty->assign('MOD', $mod_strings); +$smarty->assign('APP', $app_strings); +$smarty->assign('MODULE', $currentModule); +$smarty->assign('SINGLE_MOD', getTranslatedString('SINGLE_'.$currentModule)); +$smarty->assign('CATEGORY', $category); +$smarty->assign('BUTTONS', $list_buttons); +$smarty->assign('CHECK', $tool_buttons); +$smarty->assign("THEME", $theme); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); + +$smarty->assign('CHANGE_OWNER', getUserslist()); +$smarty->assign('CHANGE_GROUP_OWNER', getGroupslist()); + +// Enabling Module Search +$url_string = ''; +if($_REQUEST['query'] == 'true') { + list($where, $ustring) = split('#@@#', getWhereCondition($currentModule)); + $url_string .= "&query=true$ustring"; + $smarty->assign('SEARCH_URL', $url_string); +} + +// Custom View +$customView = new CustomView($currentModule); +$viewid = $customView->getViewId($currentModule); +$customview_html = $customView->getCustomViewCombo($viewid); +$viewinfo = $customView->getCustomViewByCvid($viewid); + +// Feature available from 5.1 +if(method_exists($customView, 'isPermittedChangeStatus')) { + // Approving or Denying status-public by the admin in CustomView + $statusdetails = $customView->isPermittedChangeStatus($viewinfo['status']); + + // To check if a user is able to edit/delete a CustomView + $edit_permit = $customView->isPermittedCustomView($viewid,'EditView',$currentModule); + $delete_permit = $customView->isPermittedCustomView($viewid,'Delete',$currentModule); + + $smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + $smarty->assign("CV_EDIT_PERMIT",$edit_permit); + $smarty->assign("CV_DELETE_PERMIT",$delete_permit); +} +// END + +$smarty->assign("VIEWID", $viewid); + +if($viewinfo['viewname'] == 'All') $smarty->assign('ALL', 'All'); + +if($viewid ==0) +{ + echo "
    "; + echo "
    + + + + + + + + + +
    $app_strings[LBL_PERMISSION]
    + $app_strings[LBL_GO_BACK]
    +
    +
    "; + echo "
    "; + exit; +} + +$listquery = getListQuery($currentModule); +$list_query= $customView->getModifiedCvListQuery($viewid, $listquery, $currentModule); + +if($where != '') { + $list_query = "$list_query AND $where"; +} + +// Sorting +if(!empty($order_by)) { + if($order_by == 'smownerid') $list_query .= ' ORDER BY user_name '.$sorder; + else { + $tablename = getTableNameForField($currentModule, $order_by); + $tablename = ($tablename != '')? ($tablename . '.') : ''; + $list_query .= ' ORDER BY ' . $tablename . $order_by . ' ' . $sorder; + } +} + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +$smarty->assign("CUSTOMVIEW_OPTION",$customview_html); + +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string, $currentModule, 'index', $viewid); +$smarty->assign("NAVIGATION", $navigationOutput); + +$listview_header = getListViewHeader($focus,$currentModule,$url_string,$sorder,$order_by,'',$customView); +$listview_entries = getListViewEntries($focus,$currentModule,$list_result,$navigation_array,'','','EditView','Delete',$customView); +$listview_header_search = getSearchListHeaderValues($focus,$currentModule,$url_string,$sorder,$order_by,'',$customView); + +$smarty->assign('LISTHEADER', $listview_header); +$smarty->assign('LISTENTITY', $listview_entries); +$smarty->assign('SEARCHLISTHEADER',$listview_header_search); + +// Module Search +$alphabetical = AlphabeticalSearch($currentModule,'index',$focus->def_basicsearch_col,'true','basic','','','','',$viewid); +$fieldnames = getAdvSearchfields($currentModule); +$criteria = getcriteria_options(); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("CRITERIA", $criteria); + +$smarty->assign("AVALABLE_FIELDS", getMergeFields($currentModule,"available_fields")); +$smarty->assign("FIELDS_TO_MERGE", getMergeFields($currentModule,"fileds_to_merge")); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display('ListView.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/ListViewPagging.php b/oss/vtiger/trunk/modules/Services/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/MassEdit.php b/oss/vtiger/trunk/modules/Services/MassEdit.php new file mode 100644 index 00000000..7aad35e5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/MassEdit.php @@ -0,0 +1,44 @@ +mode = ''; +$mode = 'mass_edit'; + +$disp_view = getView($focus->mode); +$idstring = $_REQUEST['idstring']; + +$smarty = new vtigerCRM_Smarty; +$smarty->assign('MODULE',$currentModule); +$smarty->assign('APP',$app_strings); +$smarty->assign('THEME', $theme); +$smarty->assign('IMAGE_PATH', "themes/$theme/images/"); +$smarty->assign('IDS',$idstring); +$smarty->assign('MASS_EDIT','1'); +$smarty->assign('BLOCKS',getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'',$focus->non_mass_edit_fields)); +$smarty->assign("CATEGORY",getParentTab()); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/MassEditSave.php b/oss/vtiger/trunk/modules/Services/MassEditSave.php new file mode 100644 index 00000000..0e92858e --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/MassEditSave.php @@ -0,0 +1,58 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/Popup.php b/oss/vtiger/trunk/modules/Services/Popup.php new file mode 100644 index 00000000..40aae3fa --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/Popup.php @@ -0,0 +1,11 @@ + diff --git a/oss/vtiger/trunk/modules/Services/ProcessDuplicates.php b/oss/vtiger/trunk/modules/Services/ProcessDuplicates.php new file mode 100644 index 00000000..bb5047fa --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/ProcessDuplicates.php @@ -0,0 +1,134 @@ +pquery("SELECT count(*) AS count FROM vtiger_crmentity WHERE crmid=? and deleted=0", array($merge_id)); + $count = $adb->query_result($result,0,'count'); + + if($count > 0) + { + // First, save the primary record + $focus->mode="edit"; + setObjectValuesFromRequest($focus); + $focus->save($module); + $rec_values=$focus->column_fields; + + // Remove the id of primary record from the list of records to be deleted. + $del_value=explode(",",$recordids,-1); + $offset = array_search($merge_id,$del_value); + unset($del_value[$offset]); + + // Transfer the related lists of the records to be deleted, to the primary record's related list + if(method_exists($focus, 'transferRelatedRecords')){ + $focus->transferRelatedRecords($module,$del_value,$merge_id); + } else { + transferRelatedRecords($module,$del_value,$merge_id); + } + + // Delete the records by id specified in the list + foreach($del_value as $value) + { + DeleteEntity($_REQUEST['module'],$_REQUEST['return_module'],$focus,$value,""); + } + } + + ?> + +assign("EDIT_DUPLICATE",""); + if($record_count == 2) { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + else { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[2]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[2]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + + $all_values_array=getRecordValues($exploded_id,$module); + $all_values=$all_values_array[0]; + $js_arr_val=$all_values_array[1]; + $fld_array=$all_values_array[2]; + $js_arr=implode(",",$js_arr_val); + + $imported_records = Array(); + $sql="select bean_id from vtiger_users_last_import where bean_type=? and deleted=0"; + $result = $adb->pquery($sql, array($module)); + $num_rows=$adb->num_rows($result); + $count=0; + for($i=0; $i<$num_rows;$i++) + { + foreach($exploded_id as $value) + if($value == $adb->query_result($result,$i,"bean_id")) + $count++; + array_push($imported_records,$adb->query_result($result,$i,"bean_id")); + } + + if ($record_count == $count) + $no_existing=1; + else + $no_existing=0; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("RECORD_COUNT",$record_count); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULENAME", $module); + $smarty->assign("PARENT_TAB", $parent_tab); + $smarty->assign("JS_ARRAY", $js_arr); + $smarty->assign("ID_ARRAY", $exploded_id); + $smarty->assign("IDSTRING",$idstring); + $smarty->assign("ALLVALUES", $all_values); + $smarty->assign("FIELD_ARRAY", $fld_array); + $smarty->assign("IMPORTED_RECORDS", $imported_records); + $smarty->assign("NO_EXISTING", $no_existing); + $smarty->display("MergeFields.tpl"); +} + +?> diff --git a/oss/vtiger/trunk/modules/Services/QuickCreate.php b/oss/vtiger/trunk/modules/Services/QuickCreate.php new file mode 100644 index 00000000..78fe10f6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/QuickCreate.php @@ -0,0 +1,11 @@ + diff --git a/oss/vtiger/trunk/modules/Services/Save.php b/oss/vtiger/trunk/modules/Services/Save.php new file mode 100644 index 00000000..14e736d5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/Save.php @@ -0,0 +1,59 @@ +mode = $mode; +if($record)$focus->id = $record; + +$currencyid=fetchCurrency($current_user->id); +$rate_symbol = getCurrencySymbolandCRate($currencyid); +$rate = $rate_symbol['rate']; + +if($_REQUEST['assigntype'] == 'U') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} + +$focus->save($currentModule); +$return_id = $focus->id; + +$search = vtlib_purify($_REQUEST['search_url']); + +$parenttab = getParentTab(); +if($_REQUEST['return_module'] != '') { + $return_module = vtlib_purify($_REQUEST['return_module']); +} else { + $return_module = $currentModule; +} + +if($_REQUEST['return_action'] != '') { + $return_action = vtlib_purify($_REQUEST['return_action']); +} else { + $return_action = "DetailView"; +} + +if($_REQUEST['return_id'] != '') { + $return_id = vtlib_purify($_REQUEST['return_id']); +} + +if(isset($_REQUEST['activity_mode'])) $return_action .= '&activity_mode='.vtlib_purify($_REQUEST['activity_mode']); + +header("Location: index.php?action=$return_action&module=$return_module&record=$return_id&parenttab=$parenttab&start=".vtlib_purify($_REQUEST['pagenumber']).$search); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Services/Services.js b/oss/vtiger/trunk/modules/Services/Services.js new file mode 100644 index 00000000..3460f206 --- /dev/null +++ b/oss/vtiger/trunk/modules/Services/Services.js @@ -0,0 +1,341 @@ +/*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************/ +document.write(" +
    + + + + + + + + + + + + + '; + if($mode == 'edit') + $output .= ''; + else + $output .= ''; + + $output .= ' + '; + $output .='' . + '
    Edit BlockAdd Block
    ' . + ' + + + '; + + + } +} + + +if($mode == 'create') +{ + $sharPerCombo = ''; + $sharPerCombo .= ''; +} +elseif($mode == 'edit') +{ + $selected1=''; + $selected2=''; + if($shareInfo[7] == 0) + { + $selected1='selected'; + } + elseif($shareInfo[7] == 1) + { + $selected2='selected'; + } + + $sharPerCombo = ''; + $sharPerCombo .= ''; +} + + +$output.='
    + + + + + + + +
    + + '; + + $output .= ' + '; + $output .='
    + + ' . + '' . + '
    + + '; + + + + $output .= ' + +
    + + + + + + ' . + '' . + '' . + '' . + '
    Block name
    After +
    +
    + + + + +
    +   + +
    + +
    ' . +'' . +''; +echo $output; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/AddBlockField.php b/oss/vtiger/trunk/modules/Settings/AddBlockField.php new file mode 100644 index 00000000..20090840 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/AddBlockField.php @@ -0,0 +1,139 @@ +assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("FLD_MODULE", vtlib_purify($_REQUEST['fld_module'])); + +$output = ''; + +$combo_output = ''; + + + +$output .= '
    +
    + + + + + + + + + + + + + + '; + if($mode == 'edit') + $output .= ''; + else + $output .= ''; + + $output .= ' + '; + $output .='
    Edit Field'.getTranslatedString('LBL_MOVE_BLOCK_FIELD').vtlib_purify($_REQUEST['blockname']).'
    + + + +
    + + '; + if($mode != 'edit') + { + $output .= ''; + } + $output .= ' +
    + + +
    '.getTranslatedString('LBL_SELECT_FIELD_TO_MOVE').'
    COMBO_OUTPUT_CHANGE
    +
    + + + + +
    '; + $output .= ''; + $output .= '  + +
    + +
    '; + + +function InStrCount($String,$Find,$CaseSensitive = false) { + $i=0; + $x=0; + while (strlen($String)>=$i) { + unset($substring); + if ($CaseSensitive) { + $Find=strtolower($Find); + $String=strtolower($String); + } + $substring=substr($String,$i,strlen($Find)); + if ($substring==$Find) $x++; + $i++; + } + return $x; + } + +$sql="SELECT fieldid,fieldlabel,fieldname FROM vtiger_field WHERE tabid=? AND block != ? AND block NOT IN (SELECT blockid from vtiger_blocks where blocklabel='LBL_RELATED_PRODUCTS') AND displaytype in (1,2,4) and vtiger_field.presence in (0,2) ORDER BY fieldlabel ASC"; // added by projjwal on 22-11-2007 +$res= $adb->pquery($sql,array($_REQUEST['tabid'], $_REQUEST['blockid'])); + +$combo_output=''; + + +$output=str_replace('COMBO_OUTPUT_CHANGE',$combo_output,$output); + +echo $output; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/AddBlockFieldToDB.php b/oss/vtiger/trunk/modules/Settings/AddBlockFieldToDB.php new file mode 100644 index 00000000..9f64b3c3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/AddBlockFieldToDB.php @@ -0,0 +1,36 @@ +pquery($max_fieldsequence,array($blockid)); + $max_seq = $adb->query_result($res,0,'maxsequence'); + $max_seq = $max_seq+1; + foreach($_REQUEST['field_assignid'] as $field_id) { + if($field_id!='') { + $adb->pquery("update vtiger_field set block=?,sequence = ? WHERE fieldid= ?",array($blockid,$max_seq,$field_id)); + $max_seq++; + } + } +} + +header("Location:index.php?module=Settings&action=LayoutBlockList&fld_module=".$fldmodule."&parenttab=".$parenttab."&duplicate=".$dup_error); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/AddBlockToDB.php b/oss/vtiger/trunk/modules/Settings/AddBlockToDB.php new file mode 100644 index 00000000..b516379f --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/AddBlockToDB.php @@ -0,0 +1,57 @@ +pquery("SELECT blocklabel from vtiger_blocks WHERE tabid = ?",array($tabid)); +for($i=0;$i<$adb->num_rows($dup_check_query);$i++){ + $blklbl = $adb->query_result($dup_check_query,$i,'blocklabel'); + $blklbl = getTranslatedString($blklbl); + if($blklbl == $newblocklabel){ + $flag = 1; + break; + } +} +if($flag!=1) { + $sql_seq="select sequence from vtiger_blocks where blockid=?"; + $res_seq= $adb->pquery($sql_seq, array($after_block)); + $row_seq=$adb->fetch_array($res_seq); + $block_sequence=$row_seq['sequence']; + $newblock_sequence=$block_sequence+1; + + $sql_up="update vtiger_blocks set sequence=sequence+1 where tabid=? and sequence > ?"; + $adb->pquery($sql_up, array($tabid,$block_sequence)); + + $sql='select max(blockid) as max_id from vtiger_blocks'; + $res=$adb->query($sql); + $row=$adb->fetch_array($res); + $max_blockid=$row['max_id']+1; + + $sql="INSERT INTO vtiger_blocks (tabid, blockid, sequence, blocklabel) values (?,?,?,?)"; + $params = array($tabid,$max_blockid,$newblock_sequence,$newblocklabel); + $adb->pquery($sql,$params); +} else + $duplicate='yes'; + +header("Location:index.php?module=Settings&action=LayoutBlockList&fld_module=".$fldmodule."&duplicate=".$duplicate."&parenttab=".$parenttab."&mode".$mode); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/AddCustomFieldToDB.php b/oss/vtiger/trunk/modules/Settings/AddCustomFieldToDB.php new file mode 100644 index 00000000..e080ab9b --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/AddCustomFieldToDB.php @@ -0,0 +1,309 @@ +pquery($checkquery,$params); + +if($adb->num_rows($checkresult) > 0) { + + if(isset($_REQUEST['fldLength_'.$blockid])) { + $fldlength=$_REQUEST['fldLength_'.$blockid]; + } else { + $fldlength=''; + } + if(isset($_REQUEST['fldDecimal_'.$blockid])) { + $flddecimal=$_REQUEST['fldDecimal_'.$blockid]; + } else { + $flddecimal=''; + } + if(isset($_REQUEST['fldPickList_'.$blockid])) { + $fldPickList=$_REQUEST['fldPickList_'.$blockid]; + } else { + $fldPickList=''; + } + + header("Location:index.php?module=Settings&action=CustomFieldList&fld_module=".$fldmodule."&fldType=".$fldType."&fldlabel=".$fldlabel."&parenttab=".$parenttab."&duplicate=yes"); + +} else { + if($_REQUEST['fieldid'] == '') { + $max_fieldid = $adb->getUniqueID("vtiger_field"); + $columnName = 'cf_'.$max_fieldid; + $custfld_fieldid=$max_fieldid; + } else { + $max_fieldid = $_REQUEST['column']; + $columnName = $max_fieldid; + $custfld_fieldid= $_REQUEST['fieldid']; + } + + //Assigning the vtiger_table Name + $tableName =''; + if($fldmodule == 'HelpDesk') { + $tableName='vtiger_ticketcf'; + } elseif($fldmodule == 'Products') { + $tableName='vtiger_productcf'; + } elseif($fldmodule == 'Vendors') { + $tableName='vtiger_vendorcf'; + } elseif($fldmodule == 'PriceBooks') { + $tableName='vtiger_pricebookcf'; + } elseif($fldmodule == 'Calendar') { + $tableName='vtiger_activitycf'; + } elseif($fldmodule != '') { + include_once('data/CRMEntity.php'); + $focus = CRMEntity::getInstance($fldmodule); + if (isset($focus->customFieldTable)) { + $tableName=$focus->customFieldTable[0]; + } else { + $tableName= 'vtiger_'.strtolower($fldmodule).'cf'; + } + } + //Assigning the uitype + $fldlength=$_REQUEST['fldLength_'.$blockid]; + $uitype=''; + $fldPickList=''; + if(isset($_REQUEST['fldDecimal_'.$blockid]) && $_REQUEST['fldDecimal_'.$blockid] != '') + { + $decimal=$_REQUEST['fldDecimal_'.$blockid]; + } + else + { + $decimal=0; + } + $type=''; + $uichekdata=''; + if($fldType == 'Text') + { + $uichekdata='V~O~LE~'.$fldlength; + $uitype = 1; + $type = "C(".$fldlength.") default ()"; // adodb type + } + elseif($fldType == 'Number') + { + $uitype = 7; + + //this may sound ridiculous passing decimal but that is the way adodb wants + $dbfldlength = $fldlength + $decimal + 1; + + $type="N(".$dbfldlength.".".$decimal.")"; // adodb type + $uichekdata='N~O~'.$fldlength .','.$decimal; + } + elseif($fldType == 'Percent') + { + $uitype = 9; + $type="N(5.2)"; //adodb type + $uichekdata='N~O~2~2'; + } + elseif($fldType == 'Currency') + { + $uitype = 71; + $dbfldlength = $fldlength + $decimal + 1; + $type="N(".$dbfldlength.".".$decimal.")"; //adodb type + $uichekdata='N~O~'.$fldlength .','.$decimal; + } + elseif($fldType == 'Date') + { + $uichekdata='D~O'; + $uitype = 5; + $type = "D"; // adodb type + + } + elseif($fldType == 'Email') + { + $uitype = 13; + $type = "C(50) default () "; //adodb type + $uichekdata='E~O'; + } + elseif($fldType == 'Phone') + { + $uitype = 11; + $type = "C(30) default () "; //adodb type + + $uichekdata='V~O'; + } + elseif($fldType == 'Picklist') + { + $uitype = 15; + $type = "C(255) default () "; //adodb type + $uichekdata='V~O'; + } + elseif($fldType == 'URL') + { + $uitype = 17; + $type = "C(255) default () "; //adodb type + $uichekdata='V~O'; + } + elseif($fldType == 'Checkbox') + { + $uitype = 56; + $type = "C(3) default 0"; //adodb type + $uichekdata='C~O'; + } + elseif($fldType == 'TextArea') + { + $uitype = 21; + $type = "X"; //adodb type + $uichekdata='V~O'; + } + elseif($fldType == 'MultiSelectCombo') + { + $uitype = 33; + $type = "X"; //adodb type + $uichekdata='V~O'; + } + elseif($fldType == 'Skype') + { + $uitype = 85; + $type = "C(255) default () "; //adodb type + $uichekdata='V~O'; + } + // No Decimal Pleaces Handling + + //1. add the customfield vtiger_table to the vtiger_field vtiger_table as Block4 + //2. fetch the contents of the custom vtiger_field and show in the UI + + $custfld_sequece=$adb->getUniqueID("vtiger_customfield_sequence"); + + $blockid =''; + //get the blockid for this custom block + $blockid = getBlockId($tabid,'LBL_CUSTOM_INFORMATION'); + + if(is_numeric($blockid)) + { + if($mode == "edit" && $_REQUEST['fieldid'] != '') + { + $query = "update vtiger_field set fieldlabel=?, typeofdata=? where fieldid=?"; + $adb->pquery($query, array($fldlabel, $uichekdata, $_REQUEST['fieldid'])); + } + else if($_REQUEST['fieldid'] == '') + { + $query = "insert into vtiger_field (tabid,fieldid,columnname,tablename,generatedtype,uitype,fieldname,fieldlabel, + readonly,presence,selected,maximumlength,sequence,block,displaytype,typeofdata,quickcreate,quickcreatesequence,info_type) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + $qparams = array($tabid,$custfld_fieldid,$columnName,$tableName,2,$uitype,$columnName,$fldlabel,0,0,0,100,$custfld_sequece,$blockid,1,$uichekdata,1,0,'BAS'); + $adb->pquery($query, $qparams); + $adb->alterTable($tableName, $columnName." ".$type, "Add_Column"); + + //Inserting values into vtiger_profile2field vtiger_tables + $sql1 = "select * from vtiger_profile"; + $sql1_result = $adb->pquery($sql1, array()); + $sql1_num = $adb->num_rows($sql1_result); + for($i=0; $i<$sql1_num; $i++) + { + $profileid = $adb->query_result($sql1_result,$i,"profileid"); + $sql2 = "insert into vtiger_profile2field values(?,?,?,?,?)"; + $adb->pquery($sql2, array($profileid, $tabid, $custfld_fieldid, 0, 1)); + } + + //Inserting values into def_org vtiger_tables + $sql_def = "insert into vtiger_def_org_field values(?,?,?,?)"; + $adb->pquery($sql_def, array($tabid, $custfld_fieldid, 0, 1)); + + if($fldType == 'Picklist' || $fldType == 'MultiSelectCombo') + { + $columnName = $adb->sql_escape_string($columnName); + // Creating the PickList Table and Populating Values + if($_REQUEST['fieldid'] == '') + { + $qur = "CREATE TABLE vtiger_".$columnName." ( + ".$columnName."id int(19) NOT NULL auto_increment, + ".$columnName." varchar(200) NOT NULL, + presence int(1) NOT NULL default '1', + picklist_valueid int(19) NOT NULL default '0', + PRIMARY KEY (".$columnName."id) + )"; + $adb->pquery($qur, array()); + } + + //Adding a new picklist value in the picklist table + if($mode != 'edit') + { + $picklistid = $adb->getUniqueID("vtiger_picklist"); + $sql="insert into vtiger_picklist values(?,?)"; + $adb->pquery($sql, array($picklistid,$columnName)); + } + $roleid=$current_user->roleid; + $qry="select picklistid from vtiger_picklist where name=?"; + $picklistid = $adb->query_result($adb->pquery($qry, array($columnName)), 0,'picklistid'); + $pickArray = Array(); + $fldPickList = $_REQUEST['fldPickList_'.$blockid]; + $pickArray = explode("\n",$fldPickList); + $count = count($pickArray); + for($i = 0; $i < $count; $i++) + { + $pickArray[$i] = trim(from_html($pickArray[$i])); + if($pickArray[$i] != '') + { + $picklistcount=0; + $sql ="select $columnName from vtiger_$columnName"; + $numrow = $adb->num_rows($adb->pquery($sql, array())); + for($x=0;$x < $numrow ; $x++) + { + $picklistvalues = $adb->query_result($adb->pquery($sql, array()),$x,$columnName); + if($pickArray[$i] == $picklistvalues) + { + $picklistcount++; + } + } + if($picklistcount == 0) + { + $picklist_valueid = getUniquePicklistID(); + $query = "insert into vtiger_".$columnName." values(?,?,?,?)"; + $adb->pquery($query, array($adb->getUniqueID("vtiger_".$columnName),$pickArray[$i],1,$picklist_valueid)); + /*$sql="update vtiger_picklistvalues_seq set id = ?"; + $adb->pquery($sql, array(++$picklist_valueid));*/ + } + $sql = "select picklist_valueid from vtiger_$columnName where $columnName=?"; + $pick_valueid = $adb->query_result($adb->pquery($sql, array($pickArray[$i])),0,'picklist_valueid'); + $sql = "insert into vtiger_role2picklist select roleid,$pick_valueid,$picklistid,$i from vtiger_role"; + $adb->pquery($sql, array()); + } + } + } + //Inserting into LeadMapping table - Jaguar + if($fldmodule == 'Leads' && $_REQUEST['fieldid'] == '') + { + $sql_def = "insert into vtiger_convertleadmapping (leadfid) values(?)"; + $adb->pquery($sql_def, array($custfld_fieldid)); + } + } + } + header("Location:index.php?module=Settings&action=CustomFieldList&fld_module=".$fldmodule."&parenttab=".$parenttab); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/Announcements.php b/oss/vtiger/trunk/modules/Settings/Announcements.php new file mode 100644 index 00000000..59aeb2ee --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/Announcements.php @@ -0,0 +1,36 @@ +pquery($query, array($current_user->id)); +$announcement=$adb->query_result($result,0,'announcement'); +$title_prev=$adb->query_result($result,0,'title'); +$id=$adb->query_result($result,0,'creatorid'); + +$smarty = new vtigerCRM_Smarty; + +$smarty->assign("ANNOUNCE",$announcement); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); + +$smarty->display("Settings/Announcements.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/AuditTrail.php b/oss/vtiger/trunk/modules/Settings/AuditTrail.php new file mode 100644 index 00000000..6e149442 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/AuditTrail.php @@ -0,0 +1,126 @@ +log = LoggerManager::getLogger('audit_trial'); + $this->db = PearDatabase::getInstance(); + } + + var $sortby_fields = Array('module', 'action', 'actiondate', 'recordid'); + + // This is the list of vtiger_fields that are in the lists. + var $list_fields = Array( + 'Module'=>Array('vtiger_audit_trial'=>'module'), + 'Action'=>Array('vtiger_audit_trial'=>'action'), + 'Record'=>Array('vtiger_audit_trial'=>'recordid'), + 'Action Date'=>Array('vtiger_audit_trial'=>'actiondate'), + ); + + var $list_fields_name = Array( + 'Module'=>'module', + 'Action'=>'action', + 'Record'=>'recordid', + 'Action Date'=>'actiondate', + ); + + var $default_order_by = "actiondate"; + var $default_sort_order = 'DESC'; +/** + * Function to get the Headers of Audit Trail Information like Module, Action, RecordID, ActionDate. + * Returns Header Values like Module, Action etc in an array format. +**/ + + function getAuditTrailHeader() + { + global $log; + $log->debug("Entering getAuditTrailHeader() method ..."); + global $app_strings; + + $header_array = array($app_strings['LBL_MODULE'], $app_strings['LBL_ACTION'], $app_strings['LBL_RECORD_ID'], $app_strings['LBL_ACTION_DATE']); + + $log->debug("Exiting getAuditTrailHeader() method ..."); + return $header_array; + + } + +/** + * Function to get the Audit Trail Information values of the actions performed by a particular User. + * @param integer $userid - User's ID + * @param $navigation_array - Array values to navigate through the number of entries. + * @param $sortorder - DESC + * @param $orderby - actiondate + * Returns the audit trail entries in an array format. +**/ + function getAuditTrailEntries($userid, $navigation_array, $sorder='', $orderby='') + { + global $log; + $log->debug("Entering getAuditTrailEntries(".$userid.") method ..."); + global $adb, $current_user; + + if($sorder != '' && $order_by != '') + $list_query = "Select * from vtiger_audit_trial where userid =? order by ".$order_by." ".$sorder; + else + $list_query = "Select * from vtiger_audit_trial where userid =? order by ".$this->default_order_by." ".$this->default_sort_order; + + $result = $adb->pquery($list_query, array($userid)); + $entries_list = array(); + + if($navigation_array['end_val'] != 0) + { + for($i = $navigation_array['start']; $i <= $navigation_array['end_val']; $i++) + { + $entries = array(); + $userid = $adb->query_result($result, $i-1, 'userid'); + + $entries[] = getTranslatedString($adb->query_result($result, $i-1, 'module')); + $entries[] = $adb->query_result($result, $i-1, 'action'); + $entries[] = $adb->query_result($result, $i-1, 'recordid'); + $entries[] = getDisplayDate($adb->query_result($result, $i-1, 'actiondate')); + + $entries_list[] = $entries; + } + $log->debug("Exiting getAuditTrailEntries() method ..."); + return $entries_list; + } + } +} + + +?> diff --git a/oss/vtiger/trunk/modules/Settings/AuditTrailList.php b/oss/vtiger/trunk/modules/Settings/AuditTrailList.php new file mode 100644 index 00000000..67cf12f8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/AuditTrailList.php @@ -0,0 +1,42 @@ +assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("USERLIST",getUserslist()); + +if($audit_trail == 'true') + $server = 'enabled'; +else + $server = 'disabled'; + +$smarty->assign("AuditStatus", $server); + +$smarty->display('AuditTrailList.tpl'); + + +?> diff --git a/oss/vtiger/trunk/modules/Settings/BackupServerConfig.php b/oss/vtiger/trunk/modules/Settings/BackupServerConfig.php new file mode 100644 index 00000000..900b0e0d --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/BackupServerConfig.php @@ -0,0 +1,150 @@ +pquery($sql_del, array('ftp_backup')); +} + +$smarty = new vtigerCRM_Smarty; +if($_REQUEST['error'] != '') +{ + $smarty->assign("ERROR_MSG",''.vtlib_purify($_REQUEST["error"]).''); +} +if($_REQUEST['error1'] != '') +{ + $smarty->assign("ERROR_STR",''.vtlib_purify($_REQUEST["error1"]).''); +} +$sql="select * from vtiger_systems where server_type = ?"; +$result = $adb->pquery($sql, array('ftp_backup')); +$server = $adb->query_result($result,0,'server'); +$server_username = $adb->query_result($result,0,'server_username'); +$server_password = $adb->query_result($result,0,'server_password'); + +$result = $adb->pquery($sql, array('local_backup')); +$local_server = $adb->query_result($result,0,'server'); +$server_path = $adb->query_result($result,0,'server_path'); + +if(isset($_REQUEST['bkp_server_mode']) && $_REQUEST['bkp_server_mode'] != '') + $smarty->assign("BKP_SERVER_MODE",vtlib_purify($_REQUEST['bkp_server_mode'])); +else + $smarty->assign("BKP_SERVER_MODE",'view'); + +if(isset($_REQUEST['local_server_mode']) && $_REQUEST['local_server_mode'] != '') + $smarty->assign("LOCAL_SERVER_MODE",vtlib_purify($_REQUEST['local_server_mode'])); +else + $smarty->assign("LOCAL_SERVER_MODE",'view'); + +if(isset($_REQUEST['server'])) + $smarty->assign("FTPSERVER",vtlib_purify($_REQUEST['server'])); +else if (isset($server)) + $smarty->assign("FTPSERVER",$server); +if (isset($_REQUEST['server_user'])) + $smarty->assign("FTPUSER",vtlib_purify($_REQUEST['server_user'])); +else if (isset($server_username)) + $smarty->assign("FTPUSER",$server_username); +if (isset($_REQUEST['password'])) + $smarty->assign("FTPPASSWORD",vtlib_purify($_REQUEST['password'])); +else if (isset($server_password)) + $smarty->assign("FTPPASSWORD",$server_password); +if (isset($_REQUEST['path'])) + $smarty->assign("SERVER_BACKUP_PATH",vtlib_purify($_REQUEST['server_path'])); +else if (isset($server_path)) + $smarty->assign("SERVER_BACKUP_PATH",$server_path); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("CMOD", $mod_strings); + +require_once('user_privileges/enable_backup.php'); + +if($enable_local_backup == 'true') + $local_backup_status = 'enabled'; +else + $local_backup_status = 'disabled'; + +if($enable_ftp_backup == 'true') + $ftp_backup_status = 'enabled'; +else + $ftp_backup_status = 'disabled'; + +$smarty->assign("FTP_BACKUP_STATUS", $ftp_backup_status); +$smarty->assign("LOCAL_BACKUP_STATUS", $local_backup_status); + +require_once('include/logging.php'); +require_once('database/DatabaseConnection.php'); +require_once('modules/Users/LoginHistory.php'); +require_once('modules/Users/Users.php'); +require_once('config.php'); +require_once('include/db_backup/backup.php'); +require_once('include/db_backup/ftp.php'); +require_once('include/database/PearDatabase.php'); +require_once('user_privileges/enable_backup.php'); + +global $adb, $enable_backup; + +if((isset($_REQUEST['backupnow']))) +{ + define("dbserver", $dbconfig['db_hostname']); + define("dbuser", $dbconfig['db_username']); + define("dbpass", $dbconfig['db_password']); + define("dbname", $dbconfig['db_name']); + + $path_query = $adb->pquery("SELECT * FROM vtiger_systems WHERE server_type = ?",array('local_backup')); + $path = $adb->query_result($path_query,0,'server_path'); + $currenttime=date("Ymd_His"); + + if(is_dir($path) && is_writable($path)) + { + $fileName = $path.'/backup_'.$currenttime.'.zip'; + $createZip = new createDirZip; + + $createZip->addDirectory('user_privileges/'); + $createZip->get_files_from_folder('user_privileges/', 'user_privileges/'); + + $createZip->addDirectory('storage/'); + $createZip->get_files_from_folder('storage/', 'storage/'); + + $backup_DBFileName = "sqlbackup_".$currenttime.".sql"; + $dbdump = new DatabaseDump(dbserver, dbuser, dbpass); + $dumpfile = 'backup/'.$backup_DBFileName; + $dbdump->save(dbname, $dumpfile) ; + + $filedata = implode("", file('backup/'.$backup_DBFileName)); + $createZip->addFile($filedata,$backup_DBFileName); + + $fd = fopen ($fileName, 'wb'); + $out = fwrite ($fd, $createZip->getZippedfile()); + fclose ($fd); + + $smarty->assign("BACKUP_RESULT", ''. $fileName.''); + } + else + $smarty->assign("BACKUP_RESULT", 'Failed to backup'); +} + +if($_REQUEST['ajax'] == 'true' && $_REQUEST['server_type'] == 'ftp_backup') + $smarty->display("Settings/BackupServerContents.tpl"); +else + $smarty->display("Settings/BackupServer.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/CreateCustomField.php b/oss/vtiger/trunk/modules/Settings/CreateCustomField.php new file mode 100644 index 00000000..00612ace --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/CreateCustomField.php @@ -0,0 +1,218 @@ +'Text', + '1'=>'Number', + '2'=>'Percent', + '3'=>'Currency', + '4'=>'Date', + '5'=>'Email', + '6'=>'Phone', + '7'=>'Picklist', + '8'=>'URL', + '9'=>'Checkbox', + '11'=>'MultiSelectCombo', + '12'=>'Skype'); +if(isset($fieldid) && $fieldid!='') +{ + $mode='edit'; + $customfield_columnname=getCustomFieldData($tabid,$fieldid,'columnname'); + $customfield_typeofdata=getCustomFieldData($tabid,$fieldid,'typeofdata'); + $customfield_fieldlabel=getCustomFieldData($tabid,$fieldid,'fieldlabel'); + $customfield_typename=getCustomFieldTypeName($uitype); + $fieldtype_lengthvalue=getFldTypeandLengthValue($customfield_typename,$customfield_typeofdata); + list($fieldtype,$fieldlength,$decimalvalue)= explode(";",$fieldtype_lengthvalue); + $readonly = "readonly"; + if($fieldtype == '7' || $fieldtype == '11') + { + $query = "select * from vtiger_". $adb->sql_escape_string($customfield_columnname); + $result = $adb->pquery($query, array()); + $fldVal=''; + while($row = $adb->fetch_array($result)) + { + $fldVal .= $row[$customfield_columnname]; + $fldVal .= "\n"; + } + $smarty->assign("PICKLISTVALUE",$fldVal); + } + $selectedvalue = $typeVal[$fieldtype]; +} +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("FLD_MODULE", vtlib_purify($_REQUEST['fld_module'])); +if(isset($_REQUEST["duplicate"]) && $_REQUEST["duplicate"] == "yes") +{ + $error=$mod_strings['ERR_CUSTOM_FIELD_WITH_NAME']. $_REQUEST["fldlabel"] .$mod_strings['ERR_ALREADY_EXISTS'] . ' ' .$mod_strings['ERR_SPECIFY_DIFFERENT_LABEL']; + $smarty->assign("DUPLICATE_ERROR", $error); + $customfield_fieldlabel=vtlib_purify($_REQUEST["fldlabel"]); + $fieldlength=vtlib_purify($_REQUEST["fldlength"]); + $decimalvalue=vtlib_purify($_REQUEST["flddecimal"]); + $fldVal = vtlib_purify($_REQUEST["fldPickList"]); + $selectedvalue = $typeVal[$_REQUEST["fldType"]]; +} +elseif($fieldid == '') +{ + $selectedvalue = "0"; +} + +if($mode == 'edit') + $disable_str = 'disabled' ; +else + $disable_str = '' ; + +$output = ''; + +$combo_output = ''; +for($i=0;$i'.$cftextcombo[$i].''; + +} +$output .= '
    +
    + + + + + + + + + + + + + + '; + if($mode == 'edit') + $output .= ''; + else + $output .= ''; + + $output .= ' + '; + $output .='
    '.$mod_strings['LBL_EDIT_FIELD_TYPE'].' - '.$customfield_typename.''.$mod_strings['LBL_ADD_FIELD'].'
    + + + +
    + + '; + if($mode != 'edit') + { + $output .= ''; + } + $output .=' + +
    + + +
    '.$mod_strings['LBL_SELECT_FIELD_TYPE'].'
    +
    '.$combo_output.'
    +
    + + + + + '; + if($mode != 'edit') { + $output .= ' + + + + + + + + + + + '; + } + $output .= ' +
    '.$mod_strings['LBL_LABEL'].'
    '.$mod_strings['LBL_LENGTH'].'
    +
    +
    + + + + +
    +   + +
    + + +
    '; +echo $output; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/CreateSharingRule.php b/oss/vtiger/trunk/modules/Settings/CreateSharingRule.php new file mode 100644 index 00000000..efd75f27 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/CreateSharingRule.php @@ -0,0 +1,350 @@ +$rolename) + { + $combovalues .=''; + } + + foreach($roleDetails as $roleid=>$rolename) + { + $combovalues .=''; + } + + foreach($grpDetails as $groupid=>$groupname) + { + $combovalues .=''; + } + + $fromComboValues=$combovalues; + $toComboValues=$combovalues; + +} +elseif($mode == 'edit') +{ + + + //constructing the from combo values + $fromtype=$shareInfo[3]; + $fromid=$shareInfo[5]; + + + foreach($roleDetails as $roleid=>$rolename) + { + $selected=''; + + if($fromtype == 'roles') + { + if($roleid == $fromid) + { + $selected='selected'; + } + } + $fromComboValues .=''; + } + + foreach($roleDetails as $roleid=>$rolename) + { + + $selected=''; + if($fromtype == 'rs') + { + if($roleid == $fromid) + { + $selected='selected'; + } + } + + $fromComboValues .=''; + } + + foreach($grpDetails as $groupid=>$groupname) + { + $selected=''; + if($fromtype == 'groups') + { + if($groupid == $fromid) + { + $selected='selected'; + } + } + + + $fromComboValues .=''; + } + + //constructing the to combo values + $totype=$shareInfo[4]; + $toid=$shareInfo[6]; + + + foreach($roleDetails as $roleid=>$rolename) + { + $selected=''; + + if($totype == 'roles') + { + if($roleid == $toid) + { + $selected='selected'; + } + } + $toComboValues .=''; + } + + foreach($roleDetails as $roleid=>$rolename) + { + + $selected=''; + if($totype == 'rs') + { + if($roleid == $toid) + { + $selected='selected'; + } + } + + $toComboValues .=''; + } + + foreach($grpDetails as $groupid=>$groupname) + { + $selected=''; + if($totype == 'groups') + { + if($groupid == $toid) + { + $selected='selected'; + } + } + + + $toComboValues .=''; + } + +} + + + +$relatedmodule=''; +$relatedlistscombo=''; +$relatedModuleSharingArr=getRelatedSharingModules($tabid); +$size=sizeof($relatedModuleSharingArr); +if($size > 0) +{ + if($mode=='edit') + { + $relatedModuleSharingPerrArr=getRelatedModuleSharingPermission($shareid); + } + foreach($relatedModuleSharingArr as $reltabid=>$relmode_shareid) + { + $rel_module=getTabModuleName($reltabid); + $relatedmodule .=$rel_module.'###'; + } + foreach($relatedModuleSharingArr as $reltabid=>$relmode_shareid) + { + $ro_selected=''; + $rw_selected=''; + $rel_module=getTabModuleName($reltabid); + if($mode=='create') + { + $ro_selected='selected'; + } + elseif($mode=='edit') + { + $perr=$relatedModuleSharingPerrArr[$reltabid]; + if($perr == 0) + { + $ro_selected='selected'; + } + elseif($perr == 1) + { + $rw_selected='selected'; + } + } + + $relatedlistscombo.='
    '.$app_strings[$rel_module].' :'; + $relatedlistscombo.='
    +'; + +if($sharing_module == 'Accounts') +{ + $display_module = $app_strings['Accounts'].' & '.$app_strings['Contacts']; +} +else +{ + $display_module = $app_strings[$sharing_module]; +} +$output .= ''; +else + $output .=$mod_strings[LBL_ADD_CUSTOM_RULE].''; +$output .= ' + + +
    '.$display_module.' - '; +if($mode == 'edit') + $output .=$mod_strings[LBL_EDIT_CUSTOM_RULE].''.$app_strings[
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    '.$mod_strings[LBL_STEP].' 1 : '.$display_module.' '.$app_strings[LBL_LIST_OF].' ('.$mod_strings[LBL_SELECT_ENTITY].') 
    '; +//combovalues + + $output.=''; + $output.=' 
     
    '.$mod_strings[LBL_STEP].' 2 : '.$mod_strings[LBL_CAN_BE_ACCESSED_BY].' ('.$mod_strings[LBL_SELECT_ENTITY].')'.$mod_strings[LBL_PERMISSIONS].'
    + + + + + + + +
     
    '.$mod_strings[LBL_STEP].' 3 : '.$mod_strings[LBL_ACCESS_RIGHTS_FOR_MODULES].'  
    + '; + + $output .=$relatedlistscombo.'
    +
     
     
    '.$mod_strings[LBL_RULE_CONSTRUCTION].'
      +
      +
    +
    + + + + +
    +    +
    '; + +$output.=''; +echo $output; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/CurrencyDelete.php b/oss/vtiger/trunk/modules/Settings/CurrencyDelete.php new file mode 100644 index 00000000..1e57c5d4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/CurrencyDelete.php @@ -0,0 +1,25 @@ +pquery($sql, array($del_id)); + +header("Location: index.php?action=SettingsAjax&module=Settings&file=CurrencyListView&ajax=true"); + +?> + diff --git a/oss/vtiger/trunk/modules/Settings/CurrencyDeleteStep1.php b/oss/vtiger/trunk/modules/Settings/CurrencyDeleteStep1.php new file mode 100644 index 00000000..5bd8160a --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/CurrencyDeleteStep1.php @@ -0,0 +1,81 @@ +pquery($sql, array($delete_currency_id)); +$delete_currencyname = $adb->query_result($result,0,"currency_name"); + + +$output=''; +$output ='
    +
    + + + + + + + + +
    '.$mod_strings["LBL_DELETE_CURRENCY"].''.$app_strings[
    +
    + + + +
    + + + + + + + + + +
    '.$mod_strings['LBL_CURRDEL'].''.getTranslatedCurrencyString($delete_currencyname).'
    '.$mod_strings['LBL_TRANSCURR'].''; + + $output.='
    +
    + + + + +
    +
    +
    '; + +echo $output; +?> diff --git a/oss/vtiger/trunk/modules/Settings/CurrencyEditView.php b/oss/vtiger/trunk/modules/Settings/CurrencyEditView.php new file mode 100644 index 00000000..271318cd --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/CurrencyEditView.php @@ -0,0 +1,95 @@ +pquery($sql, array()); + // Check if the current currency status has to be disabled for the + $sql1 = "select * from vtiger_users where currency_id=?"; + $result1 = $adb->pquery($sql1, array($tempid)); + $noofrows = $adb->num_rows($result1); + if($noofrows != 0) + { + $disable_currency = "disabled"; + } else { + $disable_currency = ""; + } + + $other_currencies_list = array(); + while($currencyResult = $adb->fetch_array($result)) { + if ($currencyResult['id'] == $tempid) { + $smarty->assign("STATUS_DISABLE",$disable_currency); + $smarty->assign("CURRENCY_NAME",$currencyResult['currency_name']); + $smarty->assign("CURRENCY_CODE",$currencyResult['currency_code']); + $smarty->assign("CURRENCY_SYMBOL",decode_html($currencyResult['currency_symbol'])); + $smarty->assign("CONVERSION_RATE",$currencyResult['conversion_rate']); + $smarty->assign("CURRENCY_STATUS",$currencyResult['currency_status']); + $currency = $currencyResult['currency_name']; + if($currencyResult['currency_status'] == 'Active') + $smarty->assign("ACTSELECT","selected"); + else + $smarty->assign("INACTSELECT","selected"); + } elseif($currencyResult['currency_status'] == 'Active') { + $cur_id = $currencyResult['id']; + $other_currencies_list[$cur_id] = $currencyResult['currency_name']; + } + } + $smarty->assign("OTHER_CURRENCIES", $other_currencies_list); + $smarty->assign("ID",$tempid); +} + +$currencies_query = $adb->pquery("SELECT currency_name from vtiger_currency_info WHERE deleted=0",array()); +for($index = 0;$index<$adb->num_rows($currencies_query);$index++){ + $currencies_listed[] = decode_html($adb->query_result($currencies_query,$index,'currency_name')); +} + +$currencies_query = $adb->pquery("SELECT currency_name,currency_code,currency_symbol from vtiger_currencies",array()); +for($index = 0;$index<$adb->num_rows($currencies_query);$index++){ + $currencyname = decode_html($adb->query_result($currencies_query,$index,'currency_name')); + $currencycode = decode_html($adb->query_result($currencies_query,$index,'currency_code')); + $currencysymbol = decode_html($adb->query_result($currencies_query,$index,'currency_symbol')); + $currencies[$currencyname] = array($currencycode,$currencysymbol); +} + +$currencies_not_listed = array(); +foreach($currencies as $key=>$value){ + if(!in_array($key,$currencies_listed) || $key==$currency) + $currencies_not_listed[$key] = $value; +} + +require_once('include/Zend/Json.php'); +$smarty->assign("CURRENCIES_ARRAY", Zend_Json::encode($currencies_not_listed)); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("CURRENCIES", $currencies_not_listed); +$smarty->assign("PARENTTAB",getParentTab()); +$smarty->assign("MASTER_CURRENCY",$currency_name); +$smarty->assign("IMAGE_PATH",$image_path); + +if(isset($_REQUEST['detailview']) && $_REQUEST['detailview'] != '') + $smarty->display('CurrencyDetailView.tpl'); +else + $smarty->display("CurrencyEditView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/CurrencyListView.php b/oss/vtiger/trunk/modules/Settings/CurrencyListView.php new file mode 100644 index 00000000..004c2f84 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/CurrencyListView.php @@ -0,0 +1,53 @@ +pquery($sql, array()); + $temprow = $adb->fetch_array($result); + $cnt=1; + $currency = Array(); +do +{ + $currency_element = Array(); + $currency_element['name'] = $temprow["currency_name"]; + $currency_element['code'] = $temprow["currency_code"]; + $currency_element['symbol'] = $temprow["currency_symbol"]; + $currency_element['crate'] = $temprow["conversion_rate"]; + $currency_element['status'] = $temprow["currency_status"]; + if($temprow["defaultid"] != '-11') + { + $currency_element['name'] = ''.getTranslatedCurrencyString($temprow["currency_name"]).''; + $currency_element['tool']= ''.$app_strings['LBL_EDIT_BUTTON_LABEL'].' | '.$app_strings['LBL_DELETE_BUTTON_LABEL'].''; + } + else + $currency_element['tool']= ''; + $currency[] = $currency_element; + $cnt++; +}while($temprow = $adb->fetch_array($result)); +$smarty->assign("PARENTTAB",$parenttab); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MOD",$mod_strings); +$smarty->assign("CURRENCY_LIST",$currency); +if($_REQUEST['ajax'] !='') + $smarty->display("CurrencyListViewEntries.tpl"); +else + $smarty->display("CurrencyListView.tpl"); +?> + diff --git a/oss/vtiger/trunk/modules/Settings/CustomFieldList.php b/oss/vtiger/trunk/modules/Settings/CustomFieldList.php new file mode 100644 index 00000000..4fc2430a --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/CustomFieldList.php @@ -0,0 +1,187 @@ +assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("THEME", $theme); +$theme_path="themes/".$theme."/"; +$image_path="themes/images/"; +$smarty->assign("IMAGE_PATH", $image_path); +$module_array=getCustomFieldSupportedModules(); + +$cfimagecombo = Array($image_path."text.gif", +$image_path."number.gif", +$image_path."percent.gif", +$image_path."currency.gif", +$image_path."date.gif", +$image_path."email.gif", +$image_path."phone.gif", +$image_path."picklist.gif", +$image_path."url.gif", +$image_path."checkbox.gif", +$image_path."text.gif", +$image_path."picklist.gif"); + +$cftextcombo = Array($mod_strings['Text'], +$mod_strings['Number'], +$mod_strings['Percent'], +$mod_strings['Currency'], +$mod_strings['Date'], +$mod_strings['Email'], +$mod_strings['Phone'], +$mod_strings['PickList'], +$mod_strings['LBL_URL'], +$mod_strings['LBL_CHECK_BOX'], +$mod_strings['LBL_TEXT_AREA'], +$mod_strings['LBL_MULTISELECT_COMBO'] +); + + +$smarty->assign("MODULES",$module_array); +$smarty->assign("CFTEXTCOMBO",$cftextcombo); +$smarty->assign("CFIMAGECOMBO",$cfimagecombo); +if($_REQUEST['fld_module'] !='') + $fld_module = vtlib_purify($_REQUEST['fld_module']); +elseif($_REQUEST['formodule'] != ''){ + $fld_module = vtlib_purify($_REQUEST['formodule']); +} +else + $fld_module = 'Leads'; +$smarty->assign("MODULE",$fld_module); +$smarty->assign("CFENTRIES",getCFListEntries($fld_module)); +if(isset($_REQUEST["duplicate"]) && $_REQUEST["duplicate"] == "yes") +{ + $error=getTranslatedString('ERR_CUSTOM_FIELD_WITH_NAME','Settings'). vtlib_purify($_REQUEST["fldlabel"]) .getTranslatedString('ERR_ALREADY_EXISTS','Settings') . ' ' .getTranslatedString('ERR_SPECIFY_DIFFERENT_LABEL','Settings'); + $smarty->assign("DUPLICATE_ERROR", $error); +} + +if($_REQUEST['mode'] !='') + $mode = vtlib_purify($_REQUEST['mode']); +$smarty->assign("MODE", $mode); + +if($_REQUEST['ajax'] != 'true') + $smarty->display(vtlib_getModuleTemplate('Calendar','CustomFieldList.tpl')); +else + $smarty->display(vtlib_getModuleTemplate('Calendar','CustomFieldEntries.tpl')); + + /** + * Function to get customfield entries + * @param string $module - Module name + * return array $cflist - customfield entries + */ +function getCFListEntries($module) +{ + global $adb,$app_strings,$theme,$smarty,$log; + $tabid = getTabid($module); + if ($module == 'Calendar') { + $tabid = array(9, 16); + } + $theme_path="themes/".$theme."/"; + $image_path="themes/images/"; + $dbQuery = "select fieldid,columnname,fieldlabel,uitype,displaytype,block,vtiger_convertleadmapping.cfmid,tabid from vtiger_field left join vtiger_convertleadmapping on vtiger_convertleadmapping.leadfid = vtiger_field.fieldid where tabid in (". generateQuestionMarks($tabid) .") and vtiger_field.presence in (0,2) and generatedtype = 2 order by sequence"; + $result = $adb->pquery($dbQuery, array($tabid)); + $row = $adb->fetch_array($result); + $count=1; + $cflist=Array(); + if($row!='') + { + do + { + $cf_element=Array(); + $cf_element['no']=$count; + $cf_element['label']=getTranslatedString($row["fieldlabel"],$module); + $fld_type_name = getCustomFieldTypeName($row["uitype"]); + $cf_element['type']=$fld_type_name; + $cf_tab_id = $row["tabid"]; + if($module == 'Leads') + { + $mapping_details = getListLeadMapping($row["cfmid"]); + $cf_element[]= $mapping_details['accountlabel']; + $cf_element[]= $mapping_details['contactlabel']; + $cf_element[]= $mapping_details['potentiallabel']; + } + if($module == 'Calendar') + { + if ($cf_tab_id == '9') + $cf_element['activitytype'] = getTranslatedString('Task',$module); + else + $cf_element['activitytype'] = getTranslatedString('Event',$module); + } + if ($module == 'Calendar') { + $cf_element['tool']=' '.$app_strings['LBL_DELETE_BUTTON_LABEL'].''; + } + $cflist[] = $cf_element; + $count++; + }while($row = $adb->fetch_array($result)); + } + return $cflist; +} + +/** +* Function to Lead customfield Mapping entries +* @param integer $cfid - Lead customfield id +* return array $label - customfield mapping +*/ +function getListLeadMapping($cfid) +{ + global $adb; + $sql="select * from vtiger_convertleadmapping where cfmid =?"; + $result = $adb->pquery($sql, array($cfid)); + $noofrows = $adb->num_rows($result); + for($i =0;$i <$noofrows;$i++) + { + $leadid = $adb->query_result($result,$i,'leadfid'); + $accountid = $adb->query_result($result,$i,'accountfid'); + $contactid = $adb->query_result($result,$i,'contactfid'); + $potentialid = $adb->query_result($result,$i,'potentialfid'); + $cfmid = $adb->query_result($result,$i,'cfmid'); + + $sql2="select fieldlabel from vtiger_field where fieldid =?"; + $result2 = $adb->pquery($sql2, array($accountid)); + $accountfield = $adb->query_result($result2,0,'fieldlabel'); + $label['accountlabel'] = getTranslatedString($accountfield,'Accounts'); + + $sql3="select fieldlabel from vtiger_field where fieldid =?"; + $result3 = $adb->pquery($sql3, array($contactid)); + $contactfield = $adb->query_result($result3,0,'fieldlabel'); + $label['contactlabel'] = getTranslatedString($contactfield,'Contacts'); + $sql4="select fieldlabel from vtiger_field where fieldid =?"; + $result4 = $adb->pquery($sql4, array($potentialid)); + $potentialfield = $adb->query_result($result4,0,'fieldlabel'); + $label['potentiallabel'] = getTranslatedString($potentialfield,'Potentials'); + } + return $label; +} + +/* function to get the modules supports Custom Fields +*/ + +function getCustomFieldSupportedModules() +{ + global $adb; + // vtlib customization: Do not list disabled modules. + //$sql="select distinct vtiger_field.tabid,name from vtiger_field inner join vtiger_tab on vtiger_field.tabid=vtiger_tab.tabid where vtiger_field.tabid not in(9,10,16,15,8,29)"; + $sql="select distinct vtiger_field.tabid,name from vtiger_field inner join vtiger_tab on vtiger_field.tabid=vtiger_tab.tabid where vtiger_field.tabid not in(10,16,15,8,29) and vtiger_tab.presence != 1"; // 16 is still here as we do not want duplicates for Calendar - Both 9 and 16 point to Calendar itself + // END + $result = $adb->pquery($sql, array()); + while($moduleinfo=$adb->fetch_array($result)) + { + $modulelist[$moduleinfo['name']] = $moduleinfo['name']; + } + return $modulelist; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/CustomModEntityNo.php b/oss/vtiger/trunk/modules/Settings/CustomModEntityNo.php new file mode 100644 index 00000000..86e9c0c4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/CustomModEntityNo.php @@ -0,0 +1,115 @@ +"; + echo "
    + + + + + + +
    + $app_strings[LBL_NO_MODULES_TO_SELECT]
    +
    "; + echo ""; + exit; +} + +$modulesList = array_keys($module_array); + +$selectedModule = vtlib_purify($_REQUEST['selmodule']); +if($selectedModule == '') $selectedModule = $modulesList[0]; + +$mode = $_REQUEST['mode']; +if(in_array($selectedModule, $module_array)) { + $focus = CRMEntity::getInstance($selectedModule); +} +if($mode == 'UPDATESETTINGS') { + if(isset($focus)) { + + $status = $focus->setModuleSeqNumber('configure', $selectedModule, $recprefix, $recnumber); + if($status === false) { + $STATUSMSG = "".$mod_strings['LBL_UPDATE']." ".$mod_strings['LBL_FAILED']." $recprefix$recnum ".$mod_strings['LBL_IN_USE']; + } else { + $STATUSMSG = "".$mod_strings['LBL_UPDATE']." ".$mod_strings['LBL_DONE'].""; + } + } +} else if($mode == 'UPDATEBULKEXISTING') { + if(isset($focus)) { + $resultinfo = $focus->updateMissingSeqNumber($selectedModule); + + if(!empty($resultinfo)) { + $usefontcolor = 'green'; + if($resultinfo['totalrecords'] != $resultinfo['updatedrecords']) $usefontcolor = 'red'; + + $STATUSMSG = "" . + $mod_strings['LBL_TOTAL'] . $resultinfo['totalrecords'] . ", " . + $mod_strings['LBL_UPDATE'] . ' ' . $mod_strings['LBL_DONE'] . ':' . $resultinfo['updatedrecords'] . + ""; + } + $seqinfo = $focus->getModuleSeqInfo($selectedModule); + $recprefix = $seqinfo[0]; + $recnumber = $seqinfo[1]; + } +} else { + if(isset($focus)) { + $seqinfo = $focus->getModuleSeqInfo($selectedModule); + $recprefix = $seqinfo[0]; + $recnumber = $seqinfo[1]; + } +} + +$smarty = new vtigerCRM_Smarty; + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); + +$smarty->assign("MODULES",$module_array); +$smarty->assign("SELMODULE",$selectedModule); +$smarty->assign("MODNUM_PREFIX",$recprefix); +$smarty->assign("MODNUM", $recnumber); +$smarty->assign("STATUSMSG", $STATUSMSG); + +if($_REQUEST['ajax'] == 'true') $smarty->display('Settings/CustomModEntityNoInfo.tpl'); +else $smarty->display('Settings/CustomModEntityNo.tpl'); + +function getCRMSupportedModules() +{ + global $adb; + $sql="select tabid,name from vtiger_tab where isentitytype = 1 and presence = 0 and tabid in(select distinct tabid from vtiger_field where uitype='4')"; + $result = $adb->query($sql); + while($moduleinfo=$adb->fetch_array($result)) + { + $modulelist[$moduleinfo['name']] = $moduleinfo['name']; + } + return $modulelist; +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/DefModuleView.php b/oss/vtiger/trunk/modules/Settings/DefModuleView.php new file mode 100644 index 00000000..935cf576 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/DefModuleView.php @@ -0,0 +1,42 @@ +assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); + +if($singlepane_view == 'true') + $viewstatus = 'enabled'; +else + $viewstatus = 'disabled'; + +$smarty->assign("ViewStatus", $viewstatus); + +$smarty->display('DefModuleView.tpl'); + + +?> + diff --git a/oss/vtiger/trunk/modules/Settings/DefaultFieldPermissions.php b/oss/vtiger/trunk/modules/Settings/DefaultFieldPermissions.php new file mode 100644 index 00000000..b675976b --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/DefaultFieldPermissions.php @@ -0,0 +1,93 @@ +$mod_name) +{ + $fieldListResult = getDefOrgFieldList($fld_module); + $noofrows = $adb->num_rows($fieldListResult); + $language_strings = return_module_language($current_language,$fld_module); + $allfields[$fld_module] = getStdOutput($fieldListResult, $noofrows, $language_strings,$profileid); +} + +if($_REQUEST['fld_module'] != '') + $smarty->assign("DEF_MODULE",vtlib_purify($_REQUEST['fld_module'])); +else + $smarty->assign("DEF_MODULE",'Leads'); + +/** Function to get the field label/permission array to construct the default orgnization field UI for the specified profile + * @param $fieldListResult -- mysql query result that contains the field label and uitype:: Type array + * @param $lang_strings -- i18n language mod strings array:: Type array + * @param $profileid -- profile id:: Type integer + * @returns $standCustFld -- field label/permission array :: Type varchar + * + */ +function getStdOutput($fieldListResult, $noofrows, $lang_strings,$profileid) +{ + global $adb; + global $image_path,$theme; + $standCustFld = Array(); + for($i=0; $i<$noofrows; $i++) + { + $uitype = $adb->query_result($fieldListResult,$i,"uitype"); + $fieldlabel = $adb->query_result($fieldListResult,$i,"fieldlabel"); + $typeofdata = $adb->query_result($fieldListResult,$i,"typeofdata"); + $fieldtype = explode("~",$typeofdata); + if($lang_strings[$fieldlabel] !='') + $standCustFld []= $lang_strings[$fieldlabel]; + else + $standCustFld []= $fieldlabel; + + + if($adb->query_result($fieldListResult,$i,"visible") == 0 || ($uitype == 117 && $fieldtype[1] == "M")) + { + $visible =""; + } + else + { + $visible = ""; + } + $standCustFld []= $visible; + } + $standCustFld=array_chunk($standCustFld,2); + $standCustFld=array_chunk($standCustFld,4); + return $standCustFld; +} + +$smarty->assign("FIELD_INFO",$field_module); +$smarty->assign("FIELD_LISTS",$allfields); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MODE",'view'); + +$smarty->display("FieldAccess.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/DeleteCustomField.php b/oss/vtiger/trunk/modules/Settings/DeleteCustomField.php new file mode 100644 index 00000000..f6df0079 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/DeleteCustomField.php @@ -0,0 +1,93 @@ +pquery($query, array($id)); + +//Deleting from vtiger_profile2field table +$query='delete from vtiger_profile2field where fieldid=?'; +$adb->pquery($query, array($id)); + +//Deleting from vtiger_def_org_field table +$query='delete from vtiger_def_org_field where fieldid=?'; +$adb->pquery($query, array($id)); + +//Drop the column in the corresponding module table +$delete_module_tables = Array( + "Leads"=>"vtiger_leadscf", + "Accounts"=>"vtiger_accountscf", + "Contacts"=>"vtiger_contactscf", + "Potentials"=>"vtiger_potentialscf", + "HelpDesk"=>"vtiger_ticketcf", + "Products"=>"vtiger_productcf", + "Vendors"=>"vtiger_vendorcf", + "PriceBooks"=>"vtiger_pricebookcf", + "PurchaseOrder"=>"vtiger_purchaseordercf", + "SalesOrder"=>"vtiger_salesordercf", + "Quotes"=>"vtiger_quotescf", + "Invoice"=>"vtiger_invoicecf", + "Campaigns"=>"vtiger_campaignscf", + "Calendar"=>"vtiger_activitycf", + ); + +// vtlib customization: Hook added to allow action for custom modules too +$cftablename = $delete_module_tables[$fld_module]; +if(empty($cftablename)) { + include_once('data/CRMEntity.php'); + $focus = CRMEntity::getInstance($fld_module); + $cftablename = $focus->customFieldTable[0]; +} + +$dbquery = 'alter table '. $cftablename .' drop column '. $adb->sql_escape_string($colName); +$adb->pquery($dbquery, array()); + +//To remove customfield entry from vtiger_field table +$dbquery = 'delete from vtiger_field where tablename= ? and fieldname=?'; +$adb->pquery($dbquery, array($cftablename, $colName)); +//we have to remove the entries in customview and report related tables which have this field ($colName) +$adb->pquery("delete from vtiger_cvcolumnlist where columnname like ?", array('%'.$colName.'%')); +$adb->pquery("delete from vtiger_cvstdfilter where columnname like ?", array('%'.$colName.'%')); +$adb->pquery("delete from vtiger_cvadvfilter where columnname like ?", array('%'.$colName.'%')); +$adb->pquery("delete from vtiger_selectcolumn where columnname like ?", array('%'.$colName.'%')); +$adb->pquery("delete from vtiger_relcriteria where columnname like ?", array('%'.$colName.'%')); +$adb->pquery("delete from vtiger_reportsortcol where columnname like ?", array('%'.$colName.'%')); +$adb->pquery("delete from vtiger_reportdatefilter where datecolumnname like ?", array('%'.$colName.'%')); +$adb->pquery("delete from vtiger_reportsummary where columnname like ?", array('%'.$colName.'%')); + + +//Deleting from convert lead mapping vtiger_table- Jaguar +if($fld_module=="Leads") +{ + $deletequery = 'delete from vtiger_convertleadmapping where leadfid=?'; + $adb->pquery($deletequery, array($id)); +}elseif($fld_module=="Accounts" || $fld_module=="Contacts" || $fld_module=="Potentials") +{ + $map_del_id = array("Accounts"=>"accountfid","Contacts"=>"contactfid","Potentials"=>"potentialfid"); + $map_del_q = "update vtiger_convertleadmapping set ".$map_del_id[$fld_module]."=0 where ".$map_del_id[$fld_module]."=?"; + $adb->pquery($map_del_q, array($id)); +} + +//HANDLE HERE - we have to remove the table for other picklist type values which are text area and multiselect combo box +if($uitype == 15) +{ + $deltablequery = 'drop table vtiger_'.$adb->sql_escape_string($colName); + $adb->pquery($deltablequery, array()); +} + +header("Location:index.php?module=Settings&action=CustomFieldList&fld_module=".$fld_module."&parenttab=Settings"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/DeleteLeadCustomFieldMapping.php b/oss/vtiger/trunk/modules/Settings/DeleteLeadCustomFieldMapping.php new file mode 100644 index 00000000..9e784fb2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/DeleteLeadCustomFieldMapping.php @@ -0,0 +1,21 @@ +pquery($sql, array($id)); +} + +header("Location: index.php?module=Settings&action=ListLeadCustomFieldMapping&parenttab=Settings"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/DeleteMailAccount.php b/oss/vtiger/trunk/modules/Settings/DeleteMailAccount.php new file mode 100644 index 00000000..a79eebd0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/DeleteMailAccount.php @@ -0,0 +1,28 @@ +pquery($query, array($account_id)); + } +} + +header("Location:index.php?module=Settings&action=ListMailAccount"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/EditComboField.php b/oss/vtiger/trunk/modules/Settings/EditComboField.php new file mode 100644 index 00000000..63832b55 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/EditComboField.php @@ -0,0 +1,107 @@ +sql_escape_string($tableName); +$moduleName=vtlib_purify($_REQUEST["fld_module"]); +$uitype=vtlib_purify($_REQUEST["uitype"]); + +if(isset($_REQUEST['parentroleid']) && $_REQUEST['parentroleid'] != '') { + $roleid = vtlib_purify($_REQUEST['parentroleid']); +} else { + $roleid = vtlib_purify($_REQUEST["roleid"]); +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty = new vtigerCRM_Smarty; + +//Added to get the strings from language files if present +if($moduleName == 'Events') + $temp_module_strings = return_module_language($current_language, 'Calendar'); +else + $temp_module_strings = return_module_language($current_language, $moduleName); + +//To get the Editable Picklist Values +$query = "select * from vtiger_".$tableName." inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid=vtiger_$tableName.picklist_valueid where roleid=? and presence=1 order by sortid"; +$result = $adb->pquery($query, array($roleid)); +$fldVal=''; + +while($row = $adb->fetch_array($result)) +{ + if($temp_module_strings[$row[$tableName]] != '') + $fldVal .= $temp_module_strings[$row[$tableName]]; + else + $fldVal .= $row[$tableName]; + $fldVal .= "\n"; +} + +if(isset($_REQUEST['parentroleid']) && $_REQUEST['parentroleid']!= '') +{ + echo ''; + echo ''; + + echo ''; + $roleid = vtlib_purify($_REQUEST['parentroleid']); + die; +} + +//To get the Non Editable Picklist Entries +$qry = "select * from vtiger_".$tableName." inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid=vtiger_$tableName.picklist_valueid where roleid=? and presence=0 order by sortid"; +$res = $adb->pquery($qry, array($roleid)); +if($adb->num_rows($res) > 0) +{ + $nonedit_fldVal='
    '; + $c = 0; + while($row = $adb->fetch_array($res)) + { + if($c != 0) + $nonedit_fldVal .= "
    "; + if($temp_module_strings[$row[$tableName]] != '') + $nonedit_fldVal .= $temp_module_strings[$row[$tableName]]; + else + $nonedit_fldVal .= $row[$tableName]; + $c++; + } + $nonedit_fldVal .= "
    "; +} + +$query = 'select fieldlabel from vtiger_tab inner join vtiger_field on vtiger_tab.tabid=vtiger_field.tabid where vtiger_tab.name=? and fieldname=? and vtiger_field.presence in (0,2)'; +$fieldlabel = $adb->query_result($adb->pquery($query, array($moduleName, $tableName)),0,'fieldlabel'); + +if($nonedit_fldVal == '') + $smarty->assign("EDITABLE_MODE","edit"); +else + $smarty->assign("EDITABLE_MODE","nonedit"); +$smarty->assign("NON_EDITABLE_ENTRIES", $nonedit_fldVal); +$smarty->assign("ENTRIES",$fldVal); +$smarty->assign("MODULE",$moduleName); +$smarty->assign("FIELDNAME",$tableName); +//First look into app_strings and then mod_strings and if not available then original label will be displayed +$temp_label = getTranslatedString($fieldlabel); +$smarty->assign("FIELDLABEL",$temp_label); +$smarty->assign("UITYPE", $uitype); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("TEMP_MOD", $temp_module_strings); + +$smarty->display("Settings/EditPickList.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/EditCompanyDetails.php b/oss/vtiger/trunk/modules/Settings/EditCompanyDetails.php new file mode 100644 index 00000000..6d7ff632 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/EditCompanyDetails.php @@ -0,0 +1,88 @@ +assign("ERRORFLAG","".$mod_strings['LOGO_ERROR']."");; + break; + case 2: + $smarty->assign("ERRORFLAG","".$mod_strings['Error_Message']."
    • ".$mod_strings['Invalid_file']."
    • ".$mod_strings['File_has_no_data']."
    "); + break; + case 3: + $smarty->assign("ERRORFLAG","".$mod_strings['Sorry'].",".$mod_strings['uploaded_file_exceeds_maximum_limit'].".".$mod_strings['try_file_smaller'].""); + break; + case 4: + $smarty->assign("ERRORFLAG","".$mod_strings['Problems_in_upload'].". ".$mod_strings['Please_try_again']."
    "); + break; + default: + $smarty->assign("ERRORFLAG",""); + + } +} +global $adb; +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$sql="select * from vtiger_organizationdetails"; +$result = $adb->pquery($sql, array()); +$organization_name = str_replace('"','"',$adb->query_result($result,0,'organizationname')); +$organization_address= $adb->query_result($result,0,'address'); +$organization_city = $adb->query_result($result,0,'city'); +$organization_state = $adb->query_result($result,0,'state'); +$organization_code = $adb->query_result($result,0,'code'); +$organization_country = $adb->query_result($result,0,'country'); +$organization_phone = $adb->query_result($result,0,'phone'); +$organization_fax = $adb->query_result($result,0,'fax'); +$organization_website = $adb->query_result($result,0,'website'); +$organization_logoname = $adb->query_result($result,0,'logoname'); + + +if (isset($organization_name)) + $smarty->assign("ORGANIZATIONNAME",$organization_name); +if (isset($organization_address)) + $smarty->assign("ORGANIZATIONADDRESS",$organization_address); +if (isset($organization_city)) + $smarty->assign("ORGANIZATIONCITY",$organization_city); +if (isset($organization_state)) + $smarty->assign("ORGANIZATIONSTATE",$organization_state); +if (isset($organization_code)) + $smarty->assign("ORGANIZATIONCODE",$organization_code); +if (isset($organization_country)) + $smarty->assign("ORGANIZATIONCOUNTRY",$organization_country); +if (isset($organization_phone)) + $smarty->assign("ORGANIZATIONPHONE",$organization_phone); +if (isset($organization_fax)) + $smarty->assign("ORGANIZATIONFAX",$organization_fax); +if (isset($organization_website)) + $smarty->assign("ORGANIZATIONWEBSITE",$organization_website); +if ($organization_logoname == '') + $organization_logoname = vtlib_purify($_REQUEST['prev_name']); +if (isset($organization_logoname)) + $smarty->assign("ORGANIZATIONLOGONAME",$organization_logoname); + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->display('Settings/EditCompanyInfo.tpl'); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/EditDefOrgFieldLevelAccess.php b/oss/vtiger/trunk/modules/Settings/EditDefOrgFieldLevelAccess.php new file mode 100644 index 00000000..ef4ee6cb --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/EditDefOrgFieldLevelAccess.php @@ -0,0 +1,107 @@ +num_rows($fieldListResult); + $language_strings = return_module_language($current_language,$fld_module); + $allfields[$fld_module] = getStdOutput($fieldListResult, $noofrows, $language_strings,$profileid); +} +if($_REQUEST['fld_module'] != '') + $smarty->assign("DEF_MODULE",vtlib_purify($_REQUEST['fld_module'])); +else + $smarty->assign("DEF_MODULE",'Leads'); + +/** Function to get the field label/permission array to construct the default orgnization field UI for the specified profile + * @param $fieldListResult -- mysql query result that contains the field label and uitype:: Type array + * @param $mod_strings -- i18n language mod strings array:: Type array + * @param $profileid -- profile id:: Type integer + * @returns $standCustFld -- field label/permission array :: Type varchar + * + */ +function getStdOutput($fieldListResult, $noofrows, $lang_strings,$profileid) +{ + global $adb; + $standCustFld = Array(); + if(!isset($focus->mandatory_fields)) $focus->mandatory_fields = Array(); + for($i=0; $i<$noofrows; $i++) + { + $fieldname = $adb->query_result($fieldListResult,$i,"fieldname"); + $uitype = $adb->query_result($fieldListResult,$i,"uitype"); + $displaytype = $adb->query_result($fieldListResult,$i,"displaytype"); + $fieldlabel = $adb->query_result($fieldListResult,$i,"fieldlabel"); + $typeofdata = $adb->query_result($fieldListResult,$i,"typeofdata"); + $fieldtype = explode("~",$typeofdata); + $mandatory = ''; + $readonly = ''; + if($fieldtype[1] == 'M') + { + $mandatory = '*'; + $readonly = 'disabled'; + } + + if($lang_strings[$fieldlabel] !='') + $standCustFld []= $mandatory.' '.$lang_strings[$fieldlabel]; + else + $standCustFld []= $mandatory.' '.$fieldlabel; + if($adb->query_result($fieldListResult,$i,"visible") == 0 && $displaytype!=3) + { + if($fieldlabel == 'Activity Type') + { + $visible = "checked"; + $readonly = 'disabled'; + } + else + $visible = "checked"; + } + elseif($displaytype == 3) + { + $visible = "checked"; + $readonly = 'disabled'; + } + else + { + $visible = ""; + } + $standCustFld []= ''; + + } + $standCustFld=array_chunk($standCustFld,2); + $standCustFld=array_chunk($standCustFld,4); + return $standCustFld; +} + +$smarty->assign("FIELD_INFO",$field_module); +$smarty->assign("FIELD_LISTS",$allfields); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MODE",'edit'); +$smarty->display("FieldAccess.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/EditInventoryNotification.php b/oss/vtiger/trunk/modules/Settings/EditInventoryNotification.php new file mode 100644 index 00000000..c8758d0f --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/EditInventoryNotification.php @@ -0,0 +1,55 @@ +pquery($sql, array($id)); + if($adb->num_rows($result) ==1); + { + $label = $mod_strings[$adb->query_result($result,0,'notificationname')]; + $notification_subject = $adb->query_result($result,0,'notificationsubject'); + $notification_body = function_exists(iconv) ? iconv("UTF-8",$default_charset,$adb->query_result($result,0,'notificationbody')) : $adb->query_result($result,0,'notificationbody'); + $notification_id = $adb->query_result($result,0,'notificationid'); + + $notification = Array(); + $notification['label'] = $label; + $notification['subject'] = $notification_subject; + $notification['body'] = $notification_body; + $notification['id'] = $notification_id; + } + + $smarty->assign("NOTIFY_DETAILS",$notification); + $smarty->assign("MOD", return_module_language($current_language,'Settings')); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("APP", $app_strings); + $smarty->assign("CMOD", $mod_strings); + $smarty->display("Settings/EditInventoryNotify.tpl"); +} +else +{ + header("Location:index.php?module=Settings&action=listnotificationschedulers&directmode=ajax"); +} +?> diff --git a/oss/vtiger/trunk/modules/Settings/EditNotification.php b/oss/vtiger/trunk/modules/Settings/EditNotification.php new file mode 100644 index 00000000..e4afabcc --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/EditNotification.php @@ -0,0 +1,71 @@ +pquery($query, array($id)); + $selected_item=$adb->query_result($result,0,'templateid'); + + $sql="select * from vtiger_notificationscheduler where schedulednotificationid = ?"; + $result = $adb->pquery($sql, array($id)); + if($adb->num_rows($result) ==1); + { + $notification = Array(); + $notification['active'] = $adb->query_result($result,0,'active'); + $notification['subject'] = $adb->query_result($result,0,'notificationsubject'); + $notification['body'] = $adb->query_result($result,0,'notificationbody'); + $notification['name'] = $mod_strings[$adb->query_result($result,0,'label')]; + $notification['id'] = $adb->query_result($result,0,'schedulednotificationid'); + $notification['type'] = $adb->query_result($result,0,'type'); + } + + $smarty->assign("NOTIFY_DETAILS",$notification); + //Added to show the previous selected value when editing. assigning previously selected id + $smarty->assign("SEL_ID",$selected_item); +} + +//Get all the email template name and id and send it to tpl to generate the combo box + $query="select templateid,templatename from vtiger_emailtemplates"; + $result = $adb->pquery($query, array()); + + $values = Array(); + for($i=0;$i < $adb->num_rows($result);$i++) + { + $temp_id = $adb->query_result($result,$i,'templateid'); + $temp_name = $adb->query_result($result,$i,'templatename'); + $values[$temp_id]=$temp_name; + } + +$smarty->assign("VALUES",$values); + + + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("CMOD", $mod_strings); +$smarty->display("Settings/EditEmailNotification.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Settings/EmailConfig.php b/oss/vtiger/trunk/modules/Settings/EmailConfig.php new file mode 100644 index 00000000..9f0357a5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/EmailConfig.php @@ -0,0 +1,72 @@ +assign("ERROR_MSG",$mod_strings['LBL_TESTMAILSTATUS'].' '.$error_msg.''); +} + +global $adb; +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$sql="select * from vtiger_systems where server_type = ?"; +$result = $adb->pquery($sql, array('email')); +$mail_server = $adb->query_result($result,0,'server'); +$mail_server_username = $adb->query_result($result,0,'server_username'); +$mail_server_password = $adb->query_result($result,0,'server_password'); +$smtp_auth = $adb->query_result($result,0,'smtp_auth'); +if(isset($_REQUEST['server_name'])) + $smarty->assign("MAILSERVER",vtlib_purify($_REQUEST['server_name'])); +elseif(isset($mail_server)) + $smarty->assign("MAILSERVER",$mail_server); +if(isset($_REQUEST['server_user'])) + $smarty->assign("USERNAME",vtlib_purify($_REQUEST['server_user'])); +elseif(isset($mail_server_username)) + $smarty->assign("USERNAME",$mail_server_username); +if (isset($mail_server_password)) + $smarty->assign("PASSWORD",$mail_server_password); +if(isset($_REQUEST['auth_check'])) +{ + if($_REQUEST['auth_check'] == 'on') + $smarty->assign("SMTP_AUTH",'checked'); + else + $smarty->assign("SMTP_AUTH",''); +} +elseif (isset($smtp_auth)) +{ + if($smtp_auth == 'true') + $smarty->assign("SMTP_AUTH",'checked'); + else + $smarty->assign("SMTP_AUTH",''); +} + +if(isset($_REQUEST['emailconfig_mode']) && $_REQUEST['emailconfig_mode'] != '') + $smarty->assign("EMAILCONFIG_MODE",vtlib_purify($_REQUEST['emailconfig_mode'])); +else + $smarty->assign("EMAILCONFIG_MODE",'view'); + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->display("Settings/EmailConfig.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/Forms.php b/oss/vtiger/trunk/modules/Settings/Forms.php new file mode 100644 index 00000000..6a0b7093 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/Forms.php @@ -0,0 +1,268 @@ + + + + +EOQ; + +return $the_script; +} + +/** + * Create HTML form to enter a new record with the minimum necessary vtiger_fields. + * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc. + * All Rights Reserved. + * Contributor(s): ______________________________________.. + */ + +function get_new_record_form () { +global $mod_strings; +global $app_strings; +global $current_user; +global $adb;//for dynamic quickcreateform construction + + +$lbl_required_symbol = $app_strings['LBL_REQUIRED_SYMBOL']; +$lbl_first_name = $mod_strings['LBL_FIRST_NAME']; +$lbl_last_name = $mod_strings['LBL_LAST_NAME']; +$lbl_account_name = $mod_strings['LBL_ACCOUNT_NAME']; +$lbl_phone = $mod_strings['LBL_PHONE']; +$lbl_email_address = $mod_strings['LBL_EMAIL_ADDRESS']; +$lbl_save_button_title = $app_strings['LBL_SAVE_BUTTON_TITLE']; +$lbl_save_button_key = $app_strings['LBL_SAVE_BUTTON_KEY']; +$lbl_save_button_label = $app_strings['LBL_SAVE_BUTTON_LABEL']; +$user_id = $current_user->id; + +$qcreate_form = get_left_form_header($mod_strings['LBL_NEW_FORM_TITLE']); + + +$qcreate_get_field="select * from vtiger_field where tabid=4 and quickcreate=0 and vtiger_field.presence in (0,2) order by quickcreatesequence"; +$qcreate_get_result=$adb->pquery($qcreate_get_field, array()); +$qcreate_get_noofrows=$adb->num_rows($qcreate_get_result); + +$fieldName_array = Array();//for validation + +$qcreate_form.='
    '; +$qcreate_form.=''; +$qcreate_form.=''; +$qcreate_form.=''; +$qcreate_form.=''; +$qcreate_form.=''; +//$qcreate_form.=''; +//$qcreate_form.=''; + +$qcreate_form.=''; + +for($j=0;$j<$qcreate_get_noofrows;$j++) +{ + $qcreate_form.=''; + $fieldlabel=$adb->query_result($qcreate_get_result,$j,'fieldlabel'); + $uitype=$adb->query_result($qcreate_get_result,$j,'uitype'); + $tabid=$adb->query_result($qcreate_get_result,$j,'tabid'); + + $fieldname=$adb->query_result($qcreate_get_result,$j,'fieldname');//for validation + $typeofdata=$adb->query_result($qcreate_get_result,$j,'typeofdata');//for validation + $qcreate_form .= get_quickcreate_form($fieldlabel,$uitype,$fieldname,$tabid); + + + //to get validationdata + //start + $fldLabel_array = Array(); + $fldLabel_array[$fieldlabel] = $typeofdata; + $fieldName_array['QCK_'.$fieldname] = $fldLabel_array; + + //end + + $qcreate_form.=''; + +} + + +//for validation +$validationData = $fieldName_array; +$fieldName = ''; +$fieldLabel = ''; +$fldDataType = ''; + +$rows = count($validationData); +foreach($validationData as $fldName => $fldLabel_array) +{ + if($fieldName == '') + { + $fieldName="'".$fldName."'"; + } + else + { + $fieldName .= ",'".$fldName ."'"; + } + foreach($fldLabel_array as $fldLabel => $datatype) + { + if($fieldLabel == '') + { + + $fieldLabel = "'".$fldLabel ."'"; + } + else + { + $fieldLabel .= ",'".$fldLabel ."'"; + } + if($fldDataType == '') + { + $fldDataType = "'".$datatype ."'"; + } + else + { + $fldDataType .= ",'".$datatype ."'"; + } + } +} + +$qcreate_form.='
    '; + + +$qcreate_form.=''; +$qcreate_form.='
    '; +$qcreate_form.=''; + +$qcreate_form .= get_left_form_footer(); +return $qcreate_form; + + + + +} + +/*function get_new_record_form () { +global $mod_strings; +global $app_strings; +global $current_user; + +$lbl_required_symbol = $app_strings['LBL_REQUIRED_SYMBOL']; +$lbl_first_name = $mod_strings['LBL_FIRST_NAME']; +$lbl_last_name = $mod_strings['LBL_LAST_NAME']; +$lbl_phone = $mod_strings['LBL_PHONE']; +$lbl_email_address = $mod_strings['LBL_EMAIL_ADDRESS']; +$lbl_save_button_title = $app_strings['LBL_SAVE_BUTTON_TITLE']; +$lbl_save_button_key = $app_strings['LBL_SAVE_BUTTON_KEY']; +$lbl_save_button_label = $app_strings['LBL_SAVE_BUTTON_LABEL']; +$user_id = $current_user->id; + +$the_form = get_left_form_header($mod_strings['LBL_NEW_FORM_TITLE']); +$the_form .= << + + + + + + $lbl_first_name
    +
    + $lbl_required_symbol$lbl_last_name
    +
    + $lbl_phone
    +
    + $lbl_email_address
    +

    + + + +EOQ; +$the_form .= get_left_form_footer(); +$the_form .= get_validate_record_js(); + +return $the_form; +}*/ + +?> diff --git a/oss/vtiger/trunk/modules/Settings/GetFieldInfo.php b/oss/vtiger/trunk/modules/Settings/GetFieldInfo.php new file mode 100644 index 00000000..08bbdd0a --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/GetFieldInfo.php @@ -0,0 +1,62 @@ +' . + '
    + + + + + + + + + + + + +
    '.$label.'
    + + + + + + + + + + +
    + +  Mandatory Field +
    + +  Show +
    +   + +
    +
    '; + + echo $output; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/GroupDetailView.php b/oss/vtiger/trunk/modules/Settings/GroupDetailView.php new file mode 100644 index 00000000..7d91081e --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/GroupDetailView.php @@ -0,0 +1,158 @@ +assign("GROUPINFO", getStdOutput($groupInfoArr,$groupId, $mod_strings)); +$smarty->assign("GROUPID",$groupId); +$smarty->assign("GROUP_NAME",$groupInfoArr[0]); + + +/** Gives the group info and the group member info array + * @param $groupInfoArr -- Group Info Array got by calling getGroupInfo($groupId):: Type array + * @param $groupID -- group id::Type integer + * @param $mod_strings -- i18n mod strings array::Type array + * @returns $returndata:: Type array, Example array format given below + Array + ( + [0] => Array + ( + [groupname] => vtiger grp + [description] => + ) + + [1] => Array + ( + [Role] => Array + ( + [0] => Array + ( + [membername] => CEO + [memberid] => H2 + [membertype] => Role + [memberaction] => RoleDetailView + [actionparameter] => roleid + ) + + ) + + [Role and Subordinates] => Array + ( + [0] => Array + ( + [membername] => Vice President + [memberid] => H3 + [membertype] => Role and Subordinates + [memberaction] => RoleDetailView + [actionparameter] => roleid + ) + + ) + + [User] => Array + ( + [0] => Array + ( + [membername] => standarduser + [memberid] => 2 + [membertype] => User + [memberaction] => DetailView + [actionparameter] => record + ) + + ) + + ) + + ) + * + * + */ +function getStdOutput($groupInfoArr,$groupId, $mod_strings) +{ + global $adb; + $groupfields['groupname'] = $groupInfoArr[0]; + $groupfields['description'] = $groupInfoArr[1]; + + $row=1; + $groupMember = $groupInfoArr[2]; + $information = array(); + foreach($groupMember as $memberType=>$memberValue) + { + $memberinfo = array(); + foreach($memberValue as $memberId) + { + $groupmembers = array(); + if($memberType == 'roles') + { + $memberName=getRoleName($memberId); + $memberAction="RoleDetailView"; + $memberActionParameter="roleid"; + $memberDisplayType="Role"; + } + elseif($memberType == 'rs') + { + $memberName=getRoleName($memberId); + $memberAction="RoleDetailView"; + $memberActionParameter="roleid"; + $memberDisplayType="Role and Subordinates"; + } + elseif($memberType == 'groups') + { + $memberName=fetchGroupName($memberId); + $memberAction="GroupDetailView"; + $memberActionParameter="groupId"; + $memberDisplayType="Group"; + } + elseif($memberType == 'users') + { + $memberName=getUserName($memberId); + $memberAction="DetailView"; + $memberActionParameter="record"; + $memberDisplayType="User"; + } + $groupmembers ['membername'] = $memberName; + $groupmembers ['memberid'] = $memberId; + $groupmembers ['membertype'] = $memberDisplayType; + $groupmembers ['memberaction'] = $memberAction; + $groupmembers ['actionparameter'] = $memberActionParameter; + $row++; + $memberinfo [] = $groupmembers; + } + if(sizeof($memberinfo) >0) + $information[$memberDisplayType] = $memberinfo; + } + $returndata=array($groupfields,$information); + return $returndata; +} + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->display("GroupDetailview.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/LayoutBlockList.php b/oss/vtiger/trunk/modules/Settings/LayoutBlockList.php new file mode 100644 index 00000000..91bdb712 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/LayoutBlockList.php @@ -0,0 +1,1034 @@ +assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); + +if ($subMode == 'updateFieldProperties') + updateFieldProperties(); +elseif($subMode == 'deleteCustomField') + deleteCustomField(); +elseif($subMode == 'changeOrder') + changeFieldOrder(); +elseif($subMode == 'addBlock') + $duplicate = addblock(); +elseif($subMode == 'deleteCustomBlock') + deleteBlock(); +elseif($subMode == 'addCustomField') + $duplicate = addCustomField(); +elseif($subMode == 'movehiddenfields' || $subMode == 'showhiddenfields') + show_move_hiddenfields($subMode); +elseif($subMode == 'changeRelatedInfoOrder') + changeRelatedListOrder(); + +$smarty->assign("THEME", $theme); +$module_array=getCustomFieldSupportedModules(); + +$cfimagecombo = Array( + $image_path."text.gif", + $image_path."number.gif", + $image_path."percent.gif", + $image_path."currency.gif", + $image_path."date.gif", + $image_path."email.gif", + $image_path."phone.gif", + $image_path."picklist.gif", + $image_path."url.gif", + $image_path."checkbox.gif", + $image_path."text.gif", + $image_path."picklist.gif" + ); + +$cftextcombo = Array( + $mod_strings['Text'], + $mod_strings['Number'], + $mod_strings['Percent'], + $mod_strings['Currency'], + $mod_strings['Date'], + $mod_strings['Email'], + $mod_strings['Phone'], + $mod_strings['PickList'], + $mod_strings['LBL_URL'], + $mod_strings['LBL_CHECK_BOX'], + $mod_strings['LBL_TEXT_AREA'], + $mod_strings['LBL_MULTISELECT_COMBO'] + ); + + + +$smarty->assign("MODULES",$module_array); +$smarty->assign("CFTEXTCOMBO",$cftextcombo); +$smarty->assign("CFIMAGECOMBO",$cfimagecombo); + +if($_REQUEST['formodule'] !='') + $fld_module = vtlib_purify($_REQUEST['formodule']); +elseif($_REQUEST['fld_module'] != ''){ + $fld_module = vtlib_purify($_REQUEST['fld_module']); +}else + $fld_module = 'Accounts'; + +$block_array = getModuleBlocks($fld_module); + +$smarty->assign("BLOCKS",$block_array); +$smarty->assign("MODULE",$fld_module); +$smarty->assign("CFENTRIES",getFieldListEntries($fld_module)); +$smarty->assign("RELATEDLIST",getRelatedListInfo($fld_module)); + +if(isset($_REQUEST["duplicate"]) && $_REQUEST["duplicate"] == "yes" || $duplicate == 'yes') +{ + echo "ERROR"; + exit; +} +if($duplicate == 'LENGTH_ERROR'){ + echo "LENGTH_ERROR"; + exit; +} +if($_REQUEST['mode'] !='') + $mode = vtlib_purify($_REQUEST['mode']); + +$smarty->assign("MODE", $mode); + +if($_REQUEST['ajax'] != 'true'){ + $smarty->display('Settings/LayoutBlockList.tpl'); +} +elseif(($subMode == 'getRelatedInfoOrder' || $subMode == 'changeRelatedInfoOrder') && $_REQUEST['ajax'] == 'true'){ + $smarty->display('Settings/OrderRelatedList.tpl'); +} +else{ + $smarty->display('Settings/LayoutBlockEntries.tpl'); +} + + +function InStrCount($String,$Find,$CaseSensitive = false) { + global $log; + $i=0; + $x=0; + $substring = ''; + while (strlen($String)>=$i) { + unset($substring); + if ($CaseSensitive) { + $Find=strtolower($Find); + $String=strtolower($String); + } + $substring=substr($String,$i,strlen($Find)); + if ($substring==$Find) $x++; + $i++; + } + $log->debug("In InStrCount function".$String,$Find); + return $x; +} + + +/** +* Function to get customfield entries +* @param string $module - Module name +* return array $cflist - customfield entries +*/ +function getFieldListEntries($module) +{ + $tabid = getTabid($module); + global $adb, $smarty,$log; + global $theme; + $theme_path="themes/".$theme."/"; + $image_path="themes/images/"; + + $dbQuery = "select vtiger_blocks.*,vtiger_tab.presence as tabpresence from vtiger_blocks" . + " inner join vtiger_tab on vtiger_tab.tabid = vtiger_blocks.tabid" . + " where vtiger_blocks.tabid=? and vtiger_tab.presence = 0 order by sequence"; + $result = $adb->pquery($dbQuery, array($tabid)); + $row = $adb->fetch_array($result); + + $focus = CRMEntity::getInstance($module); + + $nonEditableUiTypes = array('4','70'); + + $cflist=Array(); + $i=0; + if($row!='') + { + do + { + if($row["blocklabel"] == 'LBL_CUSTOM_INFORMATION' ) + { + $smarty->assign("CUSTOMSECTIONID",$row["blockid"]); + } + if($row["blocklabel"] == 'LBL_RELATED_PRODUCTS' ) + { + $smarty->assign("RELPRODUCTSECTIONID",$row["blockid"]); + } + if($row["blocklabel"] == 'LBL_COMMENTS' || $row['blocklabel'] == 'LBL_COMMENT_INFORMATION' ) + { + $smarty->assign("COMMENTSECTIONID",$row["blockid"]); + } + if($row['blocklabel'] == 'LBL_TICKET_RESOLUTION'){ + $smarty->assign("SOLUTIONBLOCKID",$row["blockid"]); + } + if($row['blocklabel'] == ''){ + continue; + } + $cflist[$i]['tabpresence']= $row['tabpresence']; + $cflist[$i]['module'] = $module; + $cflist[$i]['blocklabel']=getTranslatedString($row["blocklabel"], $module); + $cflist[$i]['blockid']=$row["blockid"]; + $cflist[$i]['display_status']=$row["display_status"]; + $cflist[$i]['tabid']=$tabid; + $cflist[$i]['blockselect']=$row["blockid"]; + $cflist[$i]['sequence'] = $row["sequence"]; + $cflist[$i]['iscustom'] = $row["iscustom"]; + + if($module!='Invoices' && $module!='Quotes' && $module!='SalesOrder' && $module!='Invoice') + { + $sql_field="select * from vtiger_field where block=? and vtiger_field.displaytype IN (1,2,4) order by sequence"; + $sql_field_params = array($row["blockid"]); + }else + { + $sql_field="select * from vtiger_field where block=? and (vtiger_field.fieldlabel!='Total' and vtiger_field.fieldlabel!='Sub Total' and vtiger_field.fieldlabel!='Tax') and vtiger_field.displaytype IN (1,2,4) order by sequence"; + $sql_field_params = array($row["blockid"]); + } + + $result_field = $adb->pquery($sql_field,$sql_field_params); + $row_field= $adb->fetch_array($result_field); + if($row_field!='') + { + $cf_element=Array(); + $cf_hidden_element=Array(); + $count=0; + $hiddencount=0; + do + { + $fieldid = $row_field['fieldid']; + $presence = $row_field['presence']; + $fieldname = $row_field['fieldname']; + $customfieldflag=InStrCount($row_field['fieldname'],'cf_',true); + $quickcreate = $row_field['quickcreate']; + $massedit = $row_field['masseditable']; + $typeofdata = $row_field['typeofdata']; + $displaytype = $row_field['displaytype']; + $uitype = $row_field['uitype']; + $fld_type_name = getCustomFieldTypeName($row_field['uitype']); + + $fieldlabel = getTranslatedString($row_field['fieldlabel'], $module); + + $strictlyMandatory = false; + if(isset($focus->mandatory_fields) && (!empty($focus->mandatory_fields)) && in_array($fieldname, $focus->mandatory_fields)){ + $strictlyMandatory = true; + } elseif (in_array($uitype, $nonEditableUiTypes) || $displaytype == 2) { + $strictlyMandatory = true; + } + $visibility = getFieldInfo($fieldname,$typeofdata,$quickcreate,$massedit,$presence,$strictlyMandatory,$customfieldflag,$displaytype,$uitype); + + if ($presence == 0 || $presence == 2) { + $cf_element[$count]['fieldselect']=$fieldid; + $cf_element[$count]['blockid']=$row['blockid']; + $cf_element[$count]['tabid']=$tabid; + $cf_element[$count]['no']=$count; + $cf_element[$count]['label']=$fieldlabel; + $cf_element[$count]['fieldlabel'] = $row_field['fieldlabel']; + $cf_element[$count]['type']=$fld_type_name; + $cf_element[$count]['uitype']=$uitype; + $cf_element[$count]['columnname']=$row_field['columnname']; + $cf_element[$count] = array_merge($cf_element[$count], $visibility); + + $count++; + } else { + $cf_hidden_element[$hiddencount]['fieldselect']=$fieldid; + $cf_hidden_element[$hiddencount]['blockid']=$row['blockid']; + $cf_hidden_element[$hiddencount]['tabid']=$tabid; + $cf_hidden_element[$hiddencount]['no']=$hiddencount; + $cf_hidden_element[$hiddencount]['label']=$fieldlabel; + $cf_hidden_element[$hiddencount]['fieldlabel'] = $row_field['fieldlabel']; + $cf_hidden_element[$hiddencount]['type']=$fld_type_name; + $cf_hidden_element[$hiddencount]['uitype']=$uitype; + $cf_hidden_element[$hiddencount]['columnname']=$row_field['columnname']; + $cf_hidden_element[$hiddencount] = array_merge($cf_hidden_element[$hiddencount], $visibility); + + $hiddencount++; + } + } while($row_field = $adb->fetch_array($result_field)); + + $cflist[$i]['no']=$count; + $cflist[$i]['hidden_count'] = $hiddencount; + } + else + { + $cflist[$i]['no']= 0; + } + + $query_fields_not_in_block ='select fieldid,fieldlabel,block from vtiger_field ' . + 'inner join vtiger_blocks on vtiger_field.block=vtiger_blocks.blockid ' . + 'where vtiger_field.block != ? and vtiger_blocks.blocklabel not in ("LBL_TICKET_RESOLUTION","LBL_COMMENTS","LBL_COMMENT_INFORMATION") ' . + 'AND vtiger_field.tabid = ? and vtiger_field.displaytype IN (1,2,4) order by vtiger_field.sequence'; + + $params =array($row['blockid'],$tabid); + $fields = $adb->pquery($query_fields_not_in_block,$params); + $row_field= $adb->fetch_array($fields); + + if($row_field != ''){ + $movefields = array(); + $movefieldcount = 0; + do{ + $movefields[$movefieldcount]['fieldid'] = $row_field['fieldid']; + $movefields[$movefieldcount]['fieldlabel'] = getTranslatedString($row_field['fieldlabel'], $module); + $movefieldcount++; + }while($row_field = $adb->fetch_array($fields)); + $cflist[$i]['movefieldcount'] = $movefieldcount; + } + else{ + $cflist[$i]['movefieldcount'] = 0 ; + } + + $cflist[$i]['field']= $cf_element; + $cflist[$i]['hiddenfield']= $cf_hidden_element; + $cflist[$i]['movefield'] = $movefields; + + $cflist[$i]['hascustomtable'] = $focus->customFieldTable; + unset($cf_element); + unset($cf_hidden_element); + unset($movefields); + $i++; + } while($row = $adb->fetch_array($result)); + } + return $cflist; +} + +/** +* Function to Lead customfield Mapping entries +* @param integer $cfid - Lead customfield id +* return array $label - customfield mapping +*/ +function getListLeadMapping($cfid) +{ + global $adb; + $sql='select * from vtiger_convertleadmapping where cfmid = ?'; + $result = $adb->pquery($sql, array($cfid)); + $noofrows = $adb->num_rows($result); + for($i =0;$i <$noofrows;$i++) + { + $leadid = $adb->query_result($result,$i,'leadfid'); + $accountid = $adb->query_result($result,$i,'accountfid'); + $contactid = $adb->query_result($result,$i,'contactfid'); + $potentialid = $adb->query_result($result,$i,'potentialfid'); + $cfmid = $adb->query_result($result,$i,'cfmid'); + + $sql2="select fieldlabel from vtiger_field where fieldid = ? and vtiger_field.presence in (0,2)"; + $result2 = $adb->pquery($sql2, array($accountid)); + $accountfield = $adb->query_result($result2,0,'fieldlabel'); + $label['accountlabel'] = $accountfield; + + $sql3="select fieldlabel from vtiger_field where fieldid = ? and vtiger_field.presence in (0,2)"; + $result3 = $adb->pquery($sql3, array($contactid)); + $contactfield = $adb->query_result($result3,0,'fieldlabel'); + $label['contactlabel'] = $contactfield; + $sql4="select fieldlabel from vtiger_field where fieldid = ? and vtiger_field.presence in (0,2)"; + $result4 = $adb->pquery($sql4, array($potentialid)); + $potentialfield = $adb->query_result($result4,0,'fieldlabel'); + $label['potentiallabel'] = $potentialfield; + } + return $label; +} + +/* function to get the modules supports Custom Fields +*/ +function getCustomFieldSupportedModules() +{ + global $adb; + $sql="select distinct vtiger_field.tabid,name from vtiger_field inner join vtiger_tab on vtiger_field.tabid=vtiger_tab.tabid where vtiger_field.tabid not in(9,10,16,15,8,29)"; + $result = $adb->query($sql); + while($moduleinfo=$adb->fetch_array($result)) + { + $modulelist[$moduleinfo['name']] = $moduleinfo['name']; + } + return $modulelist; +} + + +function getModuleBlocks($module){ + global $adb; + $tabid = getTabid($module); + $blockquery = "select blocklabel,blockid from vtiger_blocks where tabid = ?"; + $blockres = $adb->pquery($blockquery,array($tabid)); + while($blockinfo = $adb->fetch_array($blockres)){ + $blocklist[$blockinfo['blockid']] = getTranslatedString($blockinfo['blocklabel'],$module); + } + return $blocklist; +} + +/** + * + */ +function changeFieldOrder(){ + global $adb,$log,$smarty; + if(!empty($_REQUEST['what_to_do'])){ + if($_REQUEST['what_to_do']=='block_down'){ + $sql="select * from vtiger_blocks where blockid=?"; + $result = $adb->pquery($sql, array($_REQUEST['blockid'])); + $row= $adb->fetch_array($result); + $current_sequence=$row[sequence]; + + $sql_next="select * from vtiger_blocks where sequence > ? and tabid=? limit 0,1"; + $result_next = $adb->pquery($sql_next, array($current_sequence,$_REQUEST[tabid])); + $row_next= $adb->fetch_array($result_next); + $next_sequence=$row_next[sequence]; + $next_id=$row_next[blockid]; + + + $sql_up_current="update vtiger_blocks set sequence=? where blockid=?"; + $result_up_current = $adb->pquery($sql_up_current, array($next_sequence,$_REQUEST['blockid'])); + + + $sql_up_next="update vtiger_blocks set sequence=? where blockid=?"; + $result_up_next = $adb->pquery($sql_up_next, array($current_sequence,$next_id)); + } + + if($_REQUEST['what_to_do']=='block_up'){ + $sql="select * from vtiger_blocks where blockid=?"; + $result = $adb->pquery($sql, array($_REQUEST['blockid'])); + $row= $adb->fetch_array($result); + $current_sequence=$row[sequence]; + + $sql_previous="select * from vtiger_blocks where sequence < ? and tabid=? order by sequence desc limit 0,1"; + $result_previous = $adb->pquery($sql_previous, array($current_sequence,$_REQUEST[tabid])); + $row_previous= $adb->fetch_array($result_previous); + $previous_sequence=$row_previous[sequence]; + $previous_id=$row_previous[blockid]; + + + $sql_up_current="update vtiger_blocks set sequence=? where blockid=?"; + $result_up_current = $adb->pquery($sql_up_current, array($previous_sequence,$_REQUEST['blockid'])); + + + $sql_up_previous="update vtiger_blocks set sequence=? where blockid=?"; + $result_up_previous = $adb->pquery($sql_up_previous, array($current_sequence,$previous_id)); + } + + if($_REQUEST['what_to_do']=='down' || $_REQUEST['what_to_do']=='Right'){ + $sql="select * from vtiger_field where fieldid=? and vtiger_field.presence in (0,2)"; + $result = $adb->pquery($sql, array($_REQUEST['fieldid'])); + $row= $adb->fetch_array($result); + $current_sequence=$row['sequence']; + if($_REQUEST['what_to_do']=='down'){ + $sql_next="select * from vtiger_field where sequence > ? and block = ? and vtiger_field.presence in (0,2) order by sequence limit 1,1"; + $sql_next_params = array($current_sequence, $_REQUEST['blockid']); + }else{ + $sql_next="select * from vtiger_field where sequence > ? and block = ? and vtiger_field.presence in (0,2) order by sequence limit 0,1"; + $sql_next_params = array($current_sequence, $_REQUEST['blockid']); + } + + $result_next = $adb->pquery($sql_next,$sql_next_params); + $row_next= $adb->fetch_array($result_next); + $next_sequence=$row_next['sequence']; + $next_id=$row_next['fieldid']; + + $sql_up_current="update vtiger_field set sequence=? where fieldid=?"; + $result_up_current = $adb->pquery($sql_up_current, array($next_sequence,$_REQUEST['fieldid'])); + + $sql_up_next="update vtiger_field set sequence=? where fieldid=?"; + $result_up_next = $adb->pquery($sql_up_next, array($current_sequence,$next_id)); + $smarty->assign("COLORID",vtlib_purify($_REQUEST['fieldid'])); + } + + if($_REQUEST['what_to_do']=='up' || $_REQUEST['what_to_do']=='Left'){ + $sql="select * from vtiger_field where fieldid=? and vtiger_field.presence in (0,2)"; + $result = $adb->pquery($sql, array($_REQUEST['fieldid'])); + $row= $adb->fetch_array($result); + $current_sequence=$row['sequence']; + + if($_REQUEST['what_to_do']=='up'){ + $sql_previous="select * from vtiger_field where sequence < ? and block=? and vtiger_field.presence in (0,2) order by sequence desc limit 1,1"; + $sql_prev_params = array($current_sequence,$_REQUEST['blockid']); + }else{ + $sql_previous="select * from vtiger_field where sequence < ? and block=? and vtiger_field.presence in (0,2) order by sequence desc limit 0,1"; + $sql_prev_params = array($current_sequence,$_REQUEST['blockid']); + } + + $result_previous = $adb->pquery($sql_previous,$sql_prev_params); + $row_previous= $adb->fetch_array($result_previous); + $previous_sequence=$row_previous['sequence']; + $previous_id=$row_previous['fieldid']; + + $sql_up_current="update vtiger_field set sequence=? where fieldid=?"; + $result_up_current = $adb->pquery($sql_up_current, array($previous_sequence,$_REQUEST['fieldid'])); + + $sql_up_previous="update vtiger_field set sequence=? where fieldid=?"; + $result_up_previous = $adb->pquery($sql_up_previous, array($current_sequence,$previous_id)); + $smarty->assign("COLORID",vtlib_purify($_REQUEST['fieldid'])); + } + + if($_REQUEST['what_to_do']=='show'){ + $sql_up_display="update vtiger_blocks set display_status='1' where blockid=?"; + $result_up_display = $adb->pquery($sql_up_display, array($_REQUEST['blockid'])); + } + + if($_REQUEST['what_to_do']=='hide'){ + $sql_up_display="update vtiger_blocks set display_status='0' where blockid=?"; + $result_up_display = $adb->pquery($sql_up_display, array($_REQUEST['blockid'])); + } + } +} +/** + * + */ +function getFieldInfo($fieldname,$typeofdata,$quickcreate,$massedit,$presence,$strictlyMandatory,$customfieldflag,$displaytype,$uitype){ + global $log; + + $fieldtype = explode("~",$typeofdata); + + if($strictlyMandatory){//fields without which the CRM Record will be inconsistent + $mandatory = '0'; + }elseif($fieldtype[1] == "M"){//fields which are made mandatory + $mandatory = '2'; + }else{ + $mandatory = '1'; //fields not mandatory + } + if ($uitype == 4 || $displaytype == 2) { + $mandatory = '3'; + } + + + $visibility = array(); + $visibility['mandatory'] = $mandatory; + $visibility['quickcreate'] = $quickcreate; + $visibility['presence'] = $presence; + $visibility['massedit'] = $massedit; + $visibility['displaytype'] = $displaytype; + $visibility['customfieldflag'] = $customfieldflag; + $visibility['fieldtype'] = $fieldtype[1]; + return $visibility; + } + +function updateFieldProperties(){ + + global $adb,$smarty,$log; + $fieldid = $_REQUEST['fieldid']; + $req_sql = "select * from vtiger_field where fieldid = ? and fieldname not in('salutationtype') and vtiger_field.presence in (0,2)"; + $req_result = $adb->pquery($req_sql, array($fieldid)); + + $typeofdata = $adb->query_result($req_result,0,'typeofdata'); + $tabid = $adb->query_result($req_result,0,'tabid'); + $fieldname = $adb->query_result($req_result,0,'fieldname'); + $uitype = $adb->query_result($req_result,0,'uitype'); + $oldfieldlabel = $adb->query_result($req_result,0,'fieldlabel'); + $tablename = $adb->query_result($req_result,0,'tablename'); + $columnname = $adb->query_result($req_result,0,'columnname'); + $oldquickcreate = $adb->query_result($req_result,0,'quickcreate'); + $oldmassedit = $adb->query_result($req_result,0,'masseditable'); + $oldpresence = $adb->query_result($req_result,0,'presence'); + + if(!empty($_REQUEST['fld_module'])){ + $fld_module = vtlib_purify($_REQUEST['fld_module']); + }else{ + $fld_module = getTabModuleName($tabid); + } + + $focus = CRMEntity::getInstance($fld_module); + + $fieldtype = explode("~",$typeofdata); + $mandatory_checked= $_REQUEST['ismandatory']; + $quickcreate_checked = $_REQUEST['quickcreate']; + $presence_check = $_REQUEST['isPresent']; + $massedit_check = $_REQUEST['massedit']; + + + if(isset($focus->mandatory_fields) && (!empty($focus->mandatory_fields)) && in_array($fieldname, $focus->mandatory_fields)){ + $fieldtype[1] = 'M'; + } elseif($mandatory_checked == 'true' || $mandatory_checked == ''){ + $fieldtype[1] = 'M'; + } else{ + $fieldtype[1] = 'O'; + } + $datatype = implode('~', $fieldtype); + $maxseq = ''; + if($oldquickcreate != 3){ + if(($quickcreate_checked == 'true' || $quickcreate_checked == '' )){ + $qcdata = 2; + $quickcreateseq_Query = 'select max(quickcreatesequence) as maxseq from vtiger_field where tabid = ?'; + $res = $adb->pquery($quickcreateseq_Query,array($tabid)); + $maxseq = $adb->query_result($res,0,'maxseq'); + + }else{ + $qcdata = 1; + } + } + if($oldpresence != 3){ + if($presence_check == 'true' || $presence_check == ''){ + $presence = 2; + }else{ + $presence = 1; + } + }else{ + $presence =1; + } + + if($oldmassedit != 3){ + if(($massedit_check == 'true' || $massedit_check == '')){ + $massedit = 1; + }else{ + $massedit = 2; + } + }else{ + $massedit=1; + } + + if(isset($focus->mandatory_fields) && (!empty($focus->mandatory_fields))){ + $fieldname_list = implode(',',$focus->mandatory_fields); + }else{ + $fieldname_list = ''; + } + + $mandatory_query = "update vtiger_field set typeofdata=? where fieldid=? and fieldname not in (?) AND displaytype != 2"; + $mandatory_params = array($datatype,$fieldid,$fieldname_list); + $adb->pquery($mandatory_query, $mandatory_params); + + if(!empty($qcdata)){ + $quickcreate_query = "update vtiger_field set quickcreate = ? ,quickcreatesequence = ? where fieldid = ? and quickcreate not in (0,3) AND displaytype != 2"; + $quickcreate_params = array($qcdata,$maxseq+1,$fieldid); + $adb->pquery($quickcreate_query,$quickcreate_params); + } + + $presence_query = "update vtiger_field set presence = ? where fieldid = ? and presence not in (0,3) and quickcreate != 0"; + $quickcreate_params = array($presence,$fieldid); + $adb->pquery($presence_query,$quickcreate_params); + + $massedit_query = "update vtiger_field set masseditable = ? where fieldid = ? and masseditable not in (0,3) AND displaytype != 2"; + $massedit_params = array($massedit,$fieldid); + $adb->pquery($massedit_query,$massedit_params); + +} + + + +function deleteCustomField(){ + global $adb; + + $fld_module = $_REQUEST["fld_module"]; + $id = $_REQUEST["fld_id"]; + $colName = $_REQUEST["colName"]; + $uitype = $_REQUEST["uitype"]; + + $fieldquery = 'select * from vtiger_field where fieldid = ?'; + $res = $adb->pquery($fieldquery,array($id)); + + $typeofdata = $adb->query_result($res,0,'typeofdata'); + $fieldname = $adb->query_result($res,0,'fieldname'); + $oldfieldlabel = $adb->query_result($res,0,'fieldlabel'); + $tablename = $adb->query_result($res,0,'tablename'); + $columnname = $adb->query_result($res,0,'columnname'); + $fieldtype = explode("~",$typeofdata); + + //Deleting the CustomField from the Custom Field Table + $query='delete from vtiger_field where fieldid = ? and vtiger_field.presence in (0,2)'; + $adb->pquery($query, array($id)); + + //Deleting from vtiger_profile2field table + $query='delete from vtiger_profile2field where fieldid=?'; + $adb->pquery($query, array($id)); + + //Deleting from vtiger_def_org_field table + $query='delete from vtiger_def_org_field where fieldid=?'; + $adb->pquery($query, array($id)); + + $focus = CRMEntity::getInstance($fld_module); + + $deletecolumnname =$tablename .":". $columnname .":".$fieldname.":".$fld_module. "_" .str_replace(" ","_",$oldfieldlabel).":".$fieldtype[0]; + $column_cvstdfilter = $tablename .":". $columnname .":".$fieldname.":".$fld_module. "_" .str_replace(" ","_",$oldfieldlabel); + $select_columnname = $tablename.":".$columnname .":".$fld_module. "_" . str_replace(" ","_",$oldfieldlabel).":".$fieldname.":".$fieldtype[0]; + $reportsummary_column = $tablename.":".$columnname.":".str_replace(" ","_",$oldfieldlabel); + + $dbquery = 'alter table '. $adb->sql_escape_string($focus->customFieldTable[0]).' drop column '. $adb->sql_escape_string($colName); + $adb->pquery($dbquery, array()); + + //To remove customfield entry from vtiger_field table + $dbquery = 'delete from vtiger_field where columnname= ? and fieldid=? and vtiger_field.presence in (0,2)'; + $adb->pquery($dbquery, array($colName, $id)); + //we have to remove the entries in customview and report related tables which have this field ($colName) + $adb->pquery("delete from vtiger_cvcolumnlist where columnname = ? ", array($deletecolumnname)); + $adb->pquery("delete from vtiger_cvstdfilter where columnname = ?", array($column_cvstdfilter)); + $adb->pquery("delete from vtiger_cvadvfilter where columnname = ?", array($deletecolumnname)); + $adb->pquery("delete from vtiger_selectcolumn where columnname = ?", array($select_columnname)); + $adb->pquery("delete from vtiger_relcriteria where columnname = ?", array($select_columnname)); + $adb->pquery("delete from vtiger_reportsortcol where columnname = ?", array($select_columnname)); + $adb->pquery("delete from vtiger_reportdatefilter where datecolumnname = ?", array($column_cvstdfilter)); + $adb->pquery("delete from vtiger_reportsummary where columnname like ?", array('%'.$reportsummary_column.'%')); + + + //Deleting from convert lead mapping vtiger_table- Jaguar + if($fld_module=="Leads") + { + $deletequery = 'delete from vtiger_convertleadmapping where leadfid=?'; + $adb->pquery($deletequery, array($id)); + }elseif($fld_module=="Accounts" || $fld_module=="Contacts" || $fld_module=="Potentials") + { + $map_del_id = array("Accounts"=>"accountfid","Contacts"=>"contactfid","Potentials"=>"potentialfid"); + $map_del_q = "update vtiger_convertleadmapping set ".$map_del_id[$fld_module]."=0 where ".$map_del_id[$fld_module]."=?"; + $adb->pquery($map_del_q, array($id)); + } + + //HANDLE HERE - we have to remove the table for other picklist type values which are text area and multiselect combo box + if($uitype == 15) + { + $deltablequery = 'drop table vtiger_'.$adb->sql_escape_string($colName); + $adb->pquery($deltablequery, array()); + } +} + + +function addblock(){ + + global $mod_strings,$log,$adb; + $fldmodule=$_REQUEST['fld_module']; + $mode=$_REQUEST['mode']; + + $newblocklabel = trim($_REQUEST['blocklabel']); + $after_block = $_REQUEST['after_blockid']; + + $tabid = getTabid($fldmodule); + $flag = 0; + $dup_check_query = $adb->pquery("SELECT blocklabel from vtiger_blocks WHERE tabid = ?",array($tabid)); + $norows = $adb->num_rows($dup_check_query); + for($i=0;$i<$norows;$i++){ + $blklbl = $adb->query_result($dup_check_query,$i,'blocklabel'); + $blklbltran = getTranslatedString($blklbl,$fldmodule); + if(strtolower($blklbltran) == strtolower($newblocklabel)){ + $flag = 1; + $duplicate='yes'; + return $duplicate; + } + } + $length = strlen($newblocklabel); + if($length > 50){ + $flag = 1; + $duplicate='LENGTH_ERROR'; + return $duplicate; + } + + if($flag!=1){ + $sql_seq="select sequence from vtiger_blocks where blockid=?"; + $res_seq= $adb->pquery($sql_seq, array($after_block)); + $row_seq=$adb->fetch_array($res_seq); + $block_sequence=$row_seq['sequence']; + $newblock_sequence=$block_sequence+1; + + $sql_up="update vtiger_blocks set sequence=sequence+1 where tabid=? and sequence > ?"; + $adb->pquery($sql_up, array($tabid,$block_sequence)); + + $max_blockid=$adb->getUniqueID('vtiger_blocks'); + $iscustom = 1; + $sql="INSERT INTO vtiger_blocks (tabid, blockid, sequence, blocklabel,iscustom) values (?,?,?,?,?)"; + $params = array($tabid,$max_blockid,$newblock_sequence,$newblocklabel,$iscustom); + $adb->pquery($sql,$params); + } + +} + +function deleteBlock(){ + global $adb; + $blockid = $_REQUEST['blockid']; + $deleteblock = 'delete from vtiger_blocks where blockid = ? and iscustom = 1'; + $res = $adb->pquery($deleteblock,array($blockid)); + +} + +function addCustomField(){ + +global $current_user,$log,$adb; + +$fldmodule=vtlib_purify($_REQUEST['fld_module']); +$fldlabel=vtlib_purify(trim($_REQUEST['fldLabel'])); +$fldType= vtlib_purify($_REQUEST['fieldType']); +$parenttab=vtlib_purify($_REQUEST['parenttab']); +$mode=vtlib_purify($_REQUEST['mode']); +$blockid = vtlib_purify($_REQUEST['blockid']); + +$tabid = getTabid($fldmodule); +if ($fldmodule == 'Calendar' && isset($_REQUEST['activity_type'])) { + $activitytype = $_REQUEST['activity_type']; + if ($activitytype == 'E') $tabid = '16'; + if ($activitytype == 'T') $tabid = '9'; +} +if(get_magic_quotes_gpc() == 1){ + $fldlabel = stripslashes($fldlabel); +} + +$dup_check_tab_id = $tabid; +if ($fldmodule == 'Calendar') + $dup_check_tab_id = array('9', '16'); +$checkquery="select * from vtiger_field where tabid in (". generateQuestionMarks($dup_check_tab_id) .") and fieldlabel=?"; +$params = array($dup_check_tab_id, $fldlabel); +$checkresult=$adb->pquery($checkquery,$params); + +if($adb->num_rows($checkresult) > 0 ) +{ + $duplicate = 'yes'; + return $duplicate ; +} +else{ + $max_fieldid = $adb->getUniqueID("vtiger_field"); + $columnName = 'cf_'.$max_fieldid; + $custfld_fieldid = $max_fieldid; + //Assigning the vtiger_table Name + if($fldmodule != '') { + $focus = CRMEntity::getInstance($fldmodule); + if (isset($focus->customFieldTable)) { + $tableName=$focus->customFieldTable[0]; + } else { + $tableName= 'vtiger_'.strtolower($fldmodule).'cf'; + } + } + //Assigning the uitype + $fldlength=$_REQUEST['fldLength']; + $uitype=''; + $fldPickList=''; + if(isset($_REQUEST['fldDecimal']) && $_REQUEST['fldDecimal'] != ''){ + $decimal=$_REQUEST['fldDecimal']; + }else{ + $decimal=0; + } + $type=''; + $uichekdata=''; + if($fldType == 'Text'){ + $uichekdata='V~O~LE~'.$fldlength; + $uitype = 1; + $type = "C(".$fldlength.") default ()"; // adodb type + }elseif($fldType == 'Number'){ + $uitype = 7; + //this may sound ridiculous passing decimal but that is the way adodb wants + $dbfldlength = $fldlength + $decimal + 1; + $type="N(".$dbfldlength.".".$decimal.")"; // adodb type + $uichekdata='N~O~'.$fldlength .','.$decimal; + }elseif($fldType == 'Percent'){ + $uitype = 9; + $type="N(5.2)"; //adodb type + $uichekdata='N~O~2~2'; + }elseif($fldType == 'Currency'){ + $uitype = 71; + $dbfldlength = $fldlength + $decimal + 1; + $type="N(".$dbfldlength.".".$decimal.")"; //adodb type + $uichekdata='N~O~'.$fldlength .','.$decimal; + }elseif($fldType == 'Date'){ + $uichekdata='D~O'; + $uitype = 5; + $type = "D"; // adodb type + }elseif($fldType == 'Email'){ + $uitype = 13; + $type = "C(50) default () "; //adodb type + $uichekdata='E~O'; + }elseif($fldType == 'Phone'){ + $uitype = 11; + $type = "C(30) default () "; //adodb type + $uichekdata='V~O'; + }elseif($fldType == 'Picklist'){ + $uitype = 15; + $type = "C(255) default () "; //adodb type + $uichekdata='V~O'; + }elseif($fldType == 'URL'){ + $uitype = 17; + $type = "C(255) default () "; //adodb type + $uichekdata='V~O'; + }elseif($fldType == 'Checkbox'){ + $uitype = 56; + $type = "C(3) default 0"; //adodb type + $uichekdata='C~O'; + }elseif($fldType == 'TextArea'){ + $uitype = 21; + $type = "X"; //adodb type + $uichekdata='V~O'; + }elseif($fldType == 'MultiSelectCombo'){ + $uitype = 33; + $type = "X"; //adodb type + $uichekdata='V~O'; + }elseif($fldType == 'Skype'){ + $uitype = 85; + $type = "C(255) default () "; //adodb type + $uichekdata='V~O'; + } + + if(is_numeric($blockid)){ + if($_REQUEST['fieldid'] == ''){ + $max_fieldsequence = "select max(sequence) as maxsequence from vtiger_field where block = ? "; + $res = $adb->pquery($max_fieldsequence,array($blockid)); + $max_seq = $adb->query_result($res,0,'maxsequence'); + if($fldmodule == 'Quotes' || $fldmodule == 'PurchaseOrder' || $fldmodule == 'SalesOrder' || $fldmodule == 'Invoice'){ + $quickcreate = 3; + }else{ + $quickcreate = 1; + } + $query = "insert into vtiger_field (tabid,fieldid,columnname,tablename,generatedtype,uitype,fieldname,fieldlabel,readonly,presence,selected,maximumlength,sequence,block,displaytype,typeofdata,quickcreate,quickcreatesequence,info_type,masseditable) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + $qparams = array($tabid,$custfld_fieldid,$columnName,$tableName,2,$uitype,$columnName,$fldlabel,0,2,0,100,$max_seq+1,$blockid,1,$uichekdata,$quickcreate,0,'BAS',1); + $adb->pquery($query, $qparams); + $adb->alterTable($tableName, $columnName." ".$type, "Add_Column"); + //Inserting values into vtiger_profile2field vtiger_tables + $sql1 = "select * from vtiger_profile"; + $sql1_result = $adb->pquery($sql1, array()); + $sql1_num = $adb->num_rows($sql1_result); + for($i=0; $i<$sql1_num; $i++){ + $profileid = $adb->query_result($sql1_result,$i,"profileid"); + $sql2 = "insert into vtiger_profile2field values(?,?,?,?,?)"; + $adb->pquery($sql2, array($profileid, $tabid, $custfld_fieldid, 0, 1)); + } + + //Inserting values into def_org vtiger_tables + $sql_def = "insert into vtiger_def_org_field values(?,?,?,?)"; + $adb->pquery($sql_def, array($tabid, $custfld_fieldid, 0, 1)); + + if($fldType == 'Picklist' || $fldType == 'MultiSelectCombo'){ + $columnName = $adb->sql_escape_string($columnName); + // Creating the PickList Table and Populating Values + if($_REQUEST['fieldid'] == ''){ + $qur = "CREATE TABLE vtiger_".$columnName." ( + ".$columnName."id int(19) NOT NULL auto_increment, + ".$columnName." varchar(200) NOT NULL, + presence int(1) NOT NULL default '1', + picklist_valueid int(19) NOT NULL default '0', + PRIMARY KEY (".$columnName."id) + )"; + $adb->pquery($qur, array()); + } + + //Adding a new picklist value in the picklist table + if($mode != 'edit'){ + $picklistid = $adb->getUniqueID("vtiger_picklist"); + $sql="insert into vtiger_picklist values(?,?)"; + $adb->pquery($sql, array($picklistid,$columnName)); + } + $roleid=$current_user->roleid; + $qry="select picklistid from vtiger_picklist where name=?"; + $picklistid = $adb->query_result($adb->pquery($qry, array($columnName)), 0,'picklistid'); + $pickArray = Array(); + $fldPickList = $_REQUEST['fldPickList']; + $pickArray = explode("\n",$fldPickList); + $count = count($pickArray); + for($i = 0; $i < $count; $i++) + { + $pickArray[$i] = trim(from_html($pickArray[$i])); + if($pickArray[$i] != '') + { + $picklistcount=0; + $sql ="select $columnName from vtiger_$columnName"; + $numrow = $adb->num_rows($adb->pquery($sql, array())); + for($x=0;$x < $numrow ; $x++) + { + $picklistvalues = $adb->query_result($adb->pquery($sql, array()),$x,$columnName); + if($pickArray[$i] == $picklistvalues) + { + $picklistcount++; + } + } + if($picklistcount == 0) + { + $picklist_valueid = getUniquePicklistID(); + $query = "insert into vtiger_".$columnName." values(?,?,?,?)"; + $adb->pquery($query, array($adb->getUniqueID("vtiger_".$columnName),$pickArray[$i],1,$picklist_valueid)); + /*$sql="update vtiger_picklistvalues_seq set id = ?"; + $adb->pquery($sql, array(++$picklist_valueid));*/ + } + $sql = "select picklist_valueid from vtiger_$columnName where $columnName=?"; + $pick_valueid = $adb->query_result($adb->pquery($sql, array($pickArray[$i])),0,'picklist_valueid'); + $sql = "insert into vtiger_role2picklist select roleid,$pick_valueid,$picklistid,$i from vtiger_role"; + $adb->pquery($sql, array()); + } + } + } + //Inserting into LeadMapping table - Jaguar + if($fldmodule == 'Leads' && $_REQUEST['fieldid'] == '') + { + $sql_def = "insert into vtiger_convertleadmapping (leadfid) values(?)"; + $adb->pquery($sql_def, array($custfld_fieldid)); + } + } + } +} +} + +function show_move_hiddenfields($submode){ + global $adb,$log; + $selected_fields = $_REQUEST['selected']; + $selected = trim($selected_fields,":"); + $sel_arr = array(); + $sel_arr = explode(":",$selected); + $sequence = $adb->pquery('select max(sequence) as maxseq from vtiger_field where block = ? and tabid = ?',array($_REQUEST['blockid'],$_REQUEST['tabid'])); + $max = $adb->query_result($sequence,0,'maxseq'); + $max_seq = $max + 1; + + if($submode == 'showhiddenfields'){ + for($i=0; $i< count($sel_arr);$i++){ + $res = $adb->pquery('update vtiger_field set presence = 2,sequence = ? where block = ? and fieldid = ?', array($max_seq,$_REQUEST['blockid'],$sel_arr[$i])); + $max_seq++; + } + } + else{ + for($i=0; $i< count($sel_arr);$i++){ + $res = $adb->pquery('update vtiger_field set sequence = ? , block = ? where fieldid = ?', array($max_seq,$_REQUEST['blockid'],$sel_arr[$i])); + $max_seq++; + } + } +} + +function getRelatedListInfo($module){ + global $adb; + $tabid = getTabid($module); + $related_query = 'select * from vtiger_relatedlists ' . + 'inner join vtiger_tab on vtiger_relatedlists.related_tabid = vtiger_tab.tabid and vtiger_tab.presence = 0 where vtiger_relatedlists.tabid = ? order by sequence'; + $relinfo = $adb->pquery($related_query,array($tabid)); + $noofrows = $adb->num_rows($relinfo); + for($i=0;$i<$noofrows;$i++){ + $res[$i]['name'] = $adb->query_result($relinfo,$i,'name'); + $res[$i]['sequence'] = $adb->query_result($relinfo,$i,'sequence'); + $label = $adb->query_result($relinfo,$i,'label'); + $relatedModule = getTabname($adb->query_result($relinfo,$i,'related_tabid')); + $res[$i]['label'] = getTranslatedString($label,$relatedModule); + $res[$i]['presence'] = $adb->query_result($relinfo,$i,'presence'); + $res[$i]['tabid'] = $tabid; + $res[$i]['id'] = $adb->query_result($relinfo,$i,'relation_id'); + } + return $res; +} + +function changeRelatedListOrder(){ + global $adb,$log; + $tabid = $_REQUEST['tabid']; + $what_todo = $_REQUEST['what_to_do']; + if(!empty($_REQUEST['what_to_do'])){ + if($_REQUEST['what_to_do'] == 'move_up'){ + $currentsequence = $_REQUEST['sequence']; + + $previous_relation = $adb->pquery('select relation_id,sequence from vtiger_relatedlists where sequence < ? and tabid = ? order by sequence desc limit 0,1',array($currentsequence,$tabid)); + $previous_sequence = $adb->query_result($previous_relation,0,'sequence'); + $previous_relationid = $adb->query_result($previous_relation,0,'relation_id'); + + $adb->pquery('update vtiger_relatedlists set sequence = ? where relation_id = ? and tabid = ?',array($previous_sequence,$_REQUEST['id'],$tabid)); + $adb->pquery('update vtiger_relatedlists set sequence = ? where tabid = ? and relation_id = ?',array($currentsequence,$tabid,$previous_relationid)); + }elseif($_REQUEST['what_to_do'] == 'move_down'){ + + $currentsequence = $_REQUEST['sequence']; + + $next_relation = $adb->pquery('select relation_id,sequence from vtiger_relatedlists where sequence > ? and tabid = ? order by sequence limit 0,1',array($currentsequence,$tabid)); + $next_sequence = $adb->query_result($next_relation,0,'sequence'); + $next_relationid = $adb->query_result($next_relation,0,'relation_id'); + + $adb->pquery('update vtiger_relatedlists set sequence = ? where relation_id = ? and tabid = ?',array($next_sequence,$_REQUEST['id'],$tabid)); + $adb->pquery('update vtiger_relatedlists set sequence = ? where tabid = ? and relation_id = ?',array($currentsequence,$tabid,$next_relationid)); + + } + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/LeadCustomFieldMapping.php b/oss/vtiger/trunk/modules/Settings/LeadCustomFieldMapping.php new file mode 100644 index 00000000..46731c6a --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/LeadCustomFieldMapping.php @@ -0,0 +1,151 @@ +assign("IMAGE_PATH", $image_path); + +/** + * Function to get Account custom fields + * @param integer $leadid - lead customfield id + * @param integer $accountid - account customfield id + * return array $accountcf - account customfield + */ +function getAccountCustomValues($leadid,$accountid) +{ + global $adb; + $accountcf=Array(); + $sql="select fieldid,fieldlabel,uitype,typeofdata from vtiger_field,vtiger_tab where vtiger_field.tabid=vtiger_tab.tabid and generatedtype=2 and vtiger_tab.name='Accounts' and vtiger_field.presence in (0,2)"; + $result = $adb->pquery($sql, array()); + $noofrows = $adb->num_rows($result); + + for($i=0;$i<$noofrows;$i++) + { + $account_field['fieldid']=$adb->query_result($result,$i,"fieldid"); + $account_field['fieldlabel']=getTranslatedString($adb->query_result($result,$i,"fieldlabel"),'Accounts'); + $account_field['typeofdata']=$adb->query_result($result,$i,"typeofdata"); + $account_field['fieldtype']=getCustomFieldTypeName($adb->query_result($result,$i,"uitype")); + if($account_field['fieldid']==$accountid) + $account_field['selected'] = "selected"; + else + $account_field['selected'] = ""; + $account_cfelement[]=$account_field; + } + $accountcf[$leadid.'_account']=$account_cfelement; + return $accountcf; +} + +/** + * Function to get contact custom fields + * @param integer $leadid - lead customfield id + * @param integer $contactid - contact customfield id + * return array $contactcf - contact customfield + */ +function getContactCustomValues($leadid,$contactid) +{ + global $adb; + $contactcf=Array(); + $sql="select fieldid,fieldlabel,uitype,typeofdata from vtiger_field,vtiger_tab where vtiger_field.tabid=vtiger_tab.tabid and generatedtype=2 and vtiger_tab.name='Contacts'and vtiger_field.presence in (0,2)"; + $result = $adb->pquery($sql, array()); + $noofrows = $adb->num_rows($result); + for($i=0; $i<$noofrows; $i++) + { + $contact_field['fieldid']=$adb->query_result($result,$i,"fieldid"); + $contact_field['fieldlabel']=getTranslatedString($adb->query_result($result,$i,"fieldlabel"),'Contacts'); + $contact_field['typeofdata']=$adb->query_result($result,$i,"typeofdata"); + $contact_field['fieldtype']=getCustomFieldTypeName($adb->query_result($result,$i,"uitype")); + + if($contact_field['fieldid']==$contactid) + $contact_field['selected']="selected"; + else + $contact_field['selected'] = ""; + $contact_cfelement[]=$contact_field; + } + $contactcf[$leadid.'_contact'] = $contact_cfelement; + return $contactcf; +} + +/** + * Function to get potential custom fields + * @param integer $leadid - lead customfield id + * @param integer $potentialid - potential customfield id + * return array $potentialcf - potential customfield + */ +function getPotentialCustomValues($leadid,$potentialid) +{ + global $adb; + $potentialcf=Array(); + $sql="select fieldid,fieldlabel,uitype,typeofdata from vtiger_field,vtiger_tab where vtiger_field.tabid=vtiger_tab.tabid and generatedtype=2 and vtiger_tab.name='Potentials' and vtiger_field.presence in (0,2)"; + $result = $adb->pquery($sql, array()); + $noofrows = $adb->num_rows($result); + for($i=0; $i<$noofrows; $i++) + { + $potential_field['fieldid']=$adb->query_result($result,$i,"fieldid"); + $potential_field['fieldlabel']=getTranslatedString($adb->query_result($result,$i,"fieldlabel"),'Potentials'); + $potential_field['typeofdata']=$adb->query_result($result,$i,"typeofdata"); + $potential_field['fieldtype']=getCustomFieldTypeName($adb->query_result($result,$i,"uitype")); + + if($potential_field['fieldid']==$potentialid) + $potential_field['selected']="selected"; + else + $potential_field['selected'] = ""; + $potential_cfelement[]=$potential_field; + } + $potentialcf[$leadid.'_potential']=$potential_cfelement; + return $potentialcf; +} + +/** + * Function to get leads mapping custom fields + * return array $leadcf - mapping custom fields + */ + +function customFieldMappings() +{ + global $adb; + + $convert_sql="select vtiger_convertleadmapping.*,uitype,fieldlabel,typeofdata from vtiger_convertleadmapping left join vtiger_field on vtiger_field.fieldid = vtiger_convertleadmapping.leadfid and vtiger_field.presence in (0,2)"; + $convert_result = $adb->pquery($convert_sql, array()); + + $no_rows = $adb->num_rows($convert_result); + for($j=0; $j<$no_rows; $j++) + { + $leadid = $adb->query_result($convert_result,$j,"leadfid"); + $accountid=$adb->query_result($convert_result,$j,"accountfid"); + $contactid=$adb->query_result($convert_result,$j,"contactfid"); + $potentialid=$adb->query_result($convert_result,$j,"potentialfid"); + $lead_field['sno'] = $j+1; + $lead_field['leadid'] = getTranslatedString($adb->query_result($convert_result,$j,"fieldlabel"),'Leads'); + $lead_field['typeofdata']=$adb->query_result($convert_result,$j,"typeofdata"); + $lead_field['fieldtype'] = getCustomFieldTypeName($adb->query_result($convert_result,$j,"uitype"));; + $lead_field['account'] = getAccountCustomValues($leadid,$accountid); + $lead_field['contact'] = getContactCustomValues($leadid,$contactid); + $lead_field['potential'] = getPotentialCustomValues($leadid,$potentialid); + $leadcf[]= $lead_field; + } + return $leadcf; +} +$module = 'Leads'; +$smarty->assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("CUSTOMFIELDMAPPING",customFieldMappings()); +$smarty->assign("MODULE",$module); +$smarty->display("CustomFieldMapping.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/ListLoginHistory.php b/oss/vtiger/trunk/modules/Settings/ListLoginHistory.php new file mode 100644 index 00000000..2bd44f0f --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ListLoginHistory.php @@ -0,0 +1,58 @@ +assign("CMOD", $mod_strings); +$smarty->assign("MOD", $current_module_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("USERLIST", $user_list); +$smarty->assign("CATEGORY",$category); + +$smarty->display("ListLoginHistory.tpl"); +?> + diff --git a/oss/vtiger/trunk/modules/Settings/ListMailAccount.php b/oss/vtiger/trunk/modules/Settings/ListMailAccount.php new file mode 100644 index 00000000..0193b733 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ListMailAccount.php @@ -0,0 +1,162 @@ +'; +echo get_module_title($mod_strings['LBL_MODULE_NAME'], $mod_strings['LBL_MODULE_NAME'].' : '.$mod_strings['LBL_ADD_MAIL_ACCOUNT'], true); +echo '

    '; + + +if($_REQUEST['problem']) +{ + echo 'Error in incoming mail server configuration! '; +} + +?> + +
    + + + + + + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + +fetch_array($result); + $rowcount = $adb->num_rows($result); +$edit="Edit "; +$del="Del "; +$bar=" | "; +$cnt=1; + +if($rowcount!=0) +{ +do +{ + + if ($cnt%2==0) + printf(''); + else + printf(''); + printf('','blank.gif'); + printf("",$temprow["display_name"]); + printf('','blank.gif'); + printf("",$temprow["mail_servername"]); + printf('','blank.gif'); + printf("",$temprow["mail_id"]); + + printf('','blank.gif'); + printf("",$temprow["mail_protocol"]); + + + printf('','blank.gif'); + printf("",$temprow["mail_username"]); + + printf('','blank.gif'); + if($temprow["set_default"]==1); + $DEFAULT="Selected"; + printf('',$temprow["account_id"]); + printf('','blank.gif'); + printf('',$temprow["account_id"]); + $cnt++; + printf(""); + $DEFAULT=''; +} +while($temprow = $adb->fetch_array($result)); +} +?> + +
           
     
      %s %s %s %s %s '.$mod_strings["Edit"].'
    + diff --git a/oss/vtiger/trunk/modules/Settings/ListModuleOwners.php b/oss/vtiger/trunk/modules/Settings/ListModuleOwners.php new file mode 100644 index 00000000..56076a21 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ListModuleOwners.php @@ -0,0 +1,144 @@ +pquery($sql, array($userid, $tabid)); + } + } + +} +elseif($_REQUEST['list_module_mode'] != '' && $_REQUEST['list_module_mode'] == 'edit') +{ + $user_array = get_user_array(false); + foreach($module_array as $val) + { + $user_combo = getUserCombo($user_array,$val); + + $user_list []= $val; + $user_list []= $user_combo; + + } + $user_list = array_chunk($user_list,2); +} + +$smarty = new vtigerCRM_Smarty; +if($_REQUEST['list_module_mode'] != 'edit') +{ + foreach($module_array as $val) + { + $user_list []= $val; + + //get the user array as a combo list + $user_id = getModuleOwner(getTabid($val)); + $user_name = getUserName($user_id); + + $user_list []= $user_id; + $user_list []= $user_name; + } + + $user_list = array_chunk($user_list,3); +} +$log->info("Settings Module Owners view"); + +$smarty->assign("MODULE_MODE",vtlib_purify($_REQUEST['list_module_mode'])); +$smarty->assign("USER_LIST", $user_list); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); + +if($_REQUEST['file_mode'] != 'ajax') + $smarty->display("Settings/ModuleOwners.tpl"); +else + $smarty->display("Settings/ModuleOwnersContents.tpl"); + + /** Function to get the module owner for the tabid + * @ param $tabid + * It gets the module owner for the given tabid from vtiger_moduleowners table + * returns the userid of the module owner for the given tabid + */ +function getModuleOwner($tabid) +{ + global $adb; + $sql = "select * from vtiger_moduleowners where tabid=?"; + $res = $adb->pquery($sql, array($tabid)); + $userid = $adb->query_result($res,0,'user_id'); + + return $userid; +} + /** Function to get the module List to which the owners can be assigned + * It gets the module list and returns in an array + */ +function getModuleNameList1() +{ + global $adb; + + // vtlib customization: Ignore disabled modules + //$sql = "select vtiger_moduleowners.*, vtiger_tab.name from vtiger_moduleowners inner join vtiger_tab on vtiger_moduleowners.tabid = vtiger_tab.tabid order by vtiger_tab.tabsequence"; + $sql = "select vtiger_moduleowners.*, vtiger_tab.name from vtiger_moduleowners inner join vtiger_tab on vtiger_moduleowners.tabid = vtiger_tab.tabid WHERE vtiger_tab.presence != 1 order by vtiger_tab.tabsequence"; + // END + $res = $adb->pquery($sql, array()); + $mod_array = Array(); + while($row = $adb->fetchByAssoc($res)) + { + array_push($mod_array,$row['name']); + } + return $mod_array; +} + /** Function to get combostrings of users + * @ $user_array : type Array + * @ $modulename : Type String + * returns the html string for module owners for the given module owners + */ + +function getUserCombo($user_array,$name) +{ + global $adb; + + $tabid = getTabid($name); + $sql = "select * from vtiger_moduleowners where tabid=?"; + $res = $adb->pquery($sql, array($tabid)); + $db_userid = $adb->query_result($res,0,'user_id'); + + //Form the user combo list for each module + $combo_name = "user_".strtolower($name); + $user_combo = ''; + + return $user_combo; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/ListProfiles.php b/oss/vtiger/trunk/modules/Settings/ListProfiles.php new file mode 100644 index 00000000..fa6d3563 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ListProfiles.php @@ -0,0 +1,73 @@ +pquery($sql, array()); +$noofrows = $adb->num_rows($profileListResult); +$list_entries = array($mod_strings['LBL_LIST_NO'],$mod_strings['LBL_LIST_TOOLS'],$mod_strings['LBL_NEW_PROFILE_NAME'],$mod_strings['LBL_DESCRIPTION']); + +/** gives the profile list info array + * @param $profileListResult -- profile list database result:: Type array + * @param $noofrows -- no of rows in the $profileListResult:: Type integer + * @param $mod_strings -- i18n mod_strings array:: Type array + * @returns $return_date -- profile list info array:: Type array + * + */ +function getStdOutput($profileListResult, $noofrows, $mod_strings) +{ + global $adb; + $return_data = array(); + for($i=0; $i<$noofrows; $i++) + { + $standCustFld = array(); + $profile_name = $adb->query_result($profileListResult,$i,"profilename"); + $profile_id = $adb->query_result($profileListResult,$i,"profileid"); + $description = $adb->query_result($profileListResult,$i,"description"); + global $current_user; + $current_profile = fetchUserProfileId($current_user->id); + if($profile_id != 1 && $profile_id != $current_profile) + $standCustFld['del_permission']='yes'; + else + $standCustFld['del_permission']='no'; + + $standCustFld['profileid']= $profile_id; + $standCustFld['profilename']= $profile_name; + $standCustFld['description']= $description; + $return_data[]=$standCustFld; + } + return $return_data; +} + +$smarty->assign("LIST_HEADER",$list_entries); +$smarty->assign("LIST_ENTRIES",getStdOutput($profileListResult, $noofrows, $mod_strings)); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("PROFILES", $standCustFld); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("COUNT",$noofrows); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); + +$smarty->display("UserProfileList.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner.php b/oss/vtiger/trunk/modules/Settings/MailScanner.php new file mode 100644 index 00000000..0a9db292 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner.php @@ -0,0 +1,47 @@ + + diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerEdit.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerEdit.php new file mode 100644 index 00000000..d6a06ee5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerEdit.php @@ -0,0 +1,31 @@ +assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH","themes/$theme/images/"); + +$scannername = $_REQUEST['scannername']; + +$scannerinfo = new Vtiger_MailScannerInfo($scannername); + +$smarty->assign("SCANNERINFO", $scannerinfo->getAsMap()); + +$smarty->display('MailScanner/MailScannerEdit.tpl'); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolder.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolder.php new file mode 100644 index 00000000..068d178d --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolder.php @@ -0,0 +1,31 @@ +assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH","themes/$theme/images/"); + +$scannername = $_REQUEST['scannername']; +$scannerinfo = new Vtiger_MailScannerInfo($scannername); + +$smarty->assign("SCANNERINFO", $scannerinfo->getAsMap()); +$smarty->assign("FOLDERINFO", $scannerinfo->getFolderInfo()); + +$smarty->display('MailScanner/MailScannerFolder.tpl'); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolderSave.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolderSave.php new file mode 100644 index 00000000..3d177869 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolderSave.php @@ -0,0 +1,28 @@ +$value) { + $matches = Array(); + if(preg_match("/folder_([0-9]+)/", $key, $matches)) { + $folderinfo[$value] = Array('folderid'=>$matches[1], 'enabled'=>1); + } +} +$scannerinfo->enableFoldersForScan($folderinfo); + +include('modules/Settings/MailScanner/MailScannerInfo.php'); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolderUpdate.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolderUpdate.php new file mode 100644 index 00000000..5319b493 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerFolderUpdate.php @@ -0,0 +1,39 @@ +assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH","themes/$theme/images/"); + +$scannername = $_REQUEST['scannername']; +$scannerinfo = new Vtiger_MailScannerInfo($scannername); + +$mailbox = new Vtiger_MailBox($scannerinfo); +$isconnected = $mailbox->connect(); +if($isconnected) { + $folders = $mailbox->getFolders(); + $scannerinfo->updateFolderInfo($folders); +} + +$smarty->assign("SCANNERINFO", $scannerinfo->getAsMap()); +$smarty->assign("FOLDERINFO", $scannerinfo->getFolderInfo()); + +$smarty->display('MailScanner/MailScannerFolder.tpl'); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerInfo.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerInfo.php new file mode 100644 index 00000000..d2543688 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerInfo.php @@ -0,0 +1,32 @@ +assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH","themes/$theme/images/"); + +$scannerinfo = new Vtiger_MailScannerInfo('DEFAULT'); + +$smarty->assign("SCANNERINFO", $scannerinfo->getAsMap()); +$smarty->assign("APP_KEY", $application_unique_key); + +$smarty->display('MailScanner/MailScannerInfo.tpl'); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRule.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRule.php new file mode 100644 index 00000000..8cf0ce2e --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRule.php @@ -0,0 +1,32 @@ +assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH","themes/$theme/images/"); + +$smarty->assign("SCANNERINFO", $scannerinfo->getAsMap()); +$smarty->assign("SCANNERRULES", $scannerinfo->rules); + +$smarty->display('MailScanner/MailScannerRule.tpl'); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleDelete.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleDelete.php new file mode 100644 index 00000000..f4f0fb48 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleDelete.php @@ -0,0 +1,20 @@ +delete(); + +include('modules/Settings/MailScanner/MailScannerRule.php'); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleEdit.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleEdit.php new file mode 100644 index 00000000..2ec62406 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleEdit.php @@ -0,0 +1,34 @@ +assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH","themes/$theme/images/"); + +$scannername = $_REQUEST['scannername']; +$scannerruleid= $_REQUEST['ruleid']; +$scannerinfo = new Vtiger_MailScannerInfo($scannername); +$scannerrule = new Vtiger_MailScannerRule($scannerruleid); + +$smarty->assign("SCANNERINFO", $scannerinfo->getAsMap()); +$smarty->assign("SCANNERRULE", $scannerrule); + +$smarty->display('MailScanner/MailScannerRuleEdit.tpl'); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleMove.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleMove.php new file mode 100644 index 00000000..0f081e7b --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleMove.php @@ -0,0 +1,26 @@ + diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleSave.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleSave.php new file mode 100644 index 00000000..dc785d96 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerRuleSave.php @@ -0,0 +1,40 @@ +scannerid = $scannerinfo->scannerid; +$scannerrule->fromaddress = $_REQUEST['rule_from']; +$scannerrule->toaddress = $_REQUEST['rule_to']; +$scannerrule->subjectop = $_REQUEST['rule_subjectop']; +$scannerrule->subject = $_REQUEST['rule_subject']; +$scannerrule->bodyop = $_REQUEST['rule_bodyop']; +$scannerrule->body = $_REQUEST['rule_body']; +$scannerrule->matchusing= $_REQUEST['rule_matchusing']; + +$scannerrule->update(); + +$scannerrule->updateAction($scanneractionid, $_REQUEST['rule_actiontext']); + +include('modules/Settings/MailScanner/MailScannerRule.php'); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerSave.php b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerSave.php new file mode 100644 index 00000000..716648c2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/MailScannerSave.php @@ -0,0 +1,75 @@ +scannername = trim($_REQUEST['mailboxinfo_scannername']); +$newscannerinfo->server = trim($_REQUEST['mailboxinfo_server']); +$newscannerinfo->protocol = trim($_REQUEST['mailboxinfo_protocol']); +$newscannerinfo->username = trim($_REQUEST['mailboxinfo_username']); +$newscannerinfo->password = trim($_REQUEST['mailboxinfo_password']); +$newscannerinfo->ssltype = trim($_REQUEST['mailboxinfo_ssltype']); +$newscannerinfo->sslmethod = trim($_REQUEST['mailboxinfo_sslmethod']); +$newscannerinfo->server = trim($_REQUEST['mailboxinfo_server']); +$newscannerinfo->searchfor = trim($_REQUEST['mailboxinfo_searchfor']); +$newscannerinfo->markas = trim($_REQUEST['mailboxinfo_markas']); +$newscannerinfo->isvalid =($_REQUEST['mailboxinfo_enable'] == 'true')? true : false; + +// Rescan all folders on next run? +$rescanfolder = ($_REQUEST['mailboxinfo_rescan_folders'] == 'true')? true : false; + +$isconnected = false; + +$scannerinfo = new Vtiger_MailScannerInfo('DEFAULT'); + +if(!$scannerinfo->compare($newscannerinfo)) { + $mailbox = new Vtiger_MailBox($newscannerinfo); + + $isconnected = $mailbox->connect(); + if($isconnected) $newscannerinfo->connecturl = $mailbox->_imapurl; + +} else { + $isconnected = true; + $scannerinfo->isvalid = $newscannerinfo->isvalid; // Copy new value + $newscannerinfo = $scannerinfo; +} + +if(!$isconnected) { + require_once('Smarty_setup.php'); + global $app_strings, $mod_strings, $currentModule, $theme, $current_language; + + $smarty = new vtigerCRM_Smarty; + $smarty->assign("MOD", return_module_language($current_language,'Settings')); + $smarty->assign("CMOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH","themes/$theme/images/"); + + $smarty->assign("SCANNERINFO", $newscannerinfo->getAsMap()); + $smarty->assign("CONNECTFAIL", "Connecting to mailbox failed!"); + $smarty->display('MailScanner/MailScannerEdit.tpl'); +} else { + + $mailServerChanged = $scannerinfo->update($newscannerinfo); + + $scannerinfo->updateAllFolderRescan($rescanfolder); + + // Update lastscan on all the available folders. + if($mailServerChanged && $mailbox) { + $folders = $mailbox->getFolders(); + foreach($folders as $folder) $scannerinfo->updateLastscan($folder); + } + + require('modules/Settings/MailScanner/MailScannerInfo.php'); +} +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailAttachmentMIME.php b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailAttachmentMIME.php new file mode 100644 index 00000000..0e7fa73c --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailAttachmentMIME.php @@ -0,0 +1,252 @@ +getType($filename); + } +} + +/** +Copyright (C) 2002 Jason Sheets . +All rights reserved. + +THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +**/ + +/** + Name: PHP MimeType Class + + Version: 1.0 + Date Released: 10/20/02 + + Description: This class allows a PHP script to determine the mime type + a file based on the file extension. This class is handy for PHP versions + without the benefit of other tools to determine the mime type. The class + defaults to octet-stream so if the file type is not recognized the user + is presented with a file download prompt. + + NOTES: The mime types for this version are based on Apache 1.3.27 + mime types may change or need to be added in the future, the mime types + are stored in an array so that an awk or other script can automatically + generate the code to make the array. + + Usage: + + First an instance of the mimetype class must be created, then the + getType method should be called with the filename. It will return + the mime type, an example follows. + + Example: + + $mimetype = new mimetype(); + print $mimetype->getType('acrobat.pdf'); + + Author: Jason Sheets + + License: This script is distributed under the BSD License, you are free + to use, or modify it however you like. If you find this script useful please + e-mail me. +**/ + +class mimetype { + function getType($filename) { + // get base name of the filename provided by user + $filename = basename($filename); + + // break file into parts seperated by . + $filename = explode('.', $filename); + + // take the last part of the file to get the file extension + $filename = $filename[count($filename)-1]; + + // find mime type + return $this->privFindType($filename); + } + + function privFindType($ext) { + // create mimetypes array + $mimetypes = $this->privBuildMimeArray(); + + // return mime type for extension + if (isset($mimetypes[$ext])) { + return $mimetypes[$ext]; + // if the extension wasn't found return octet-stream + } else { + return 'application/octet-stream'; + } + + } + + function privBuildMimeArray() { + return array( + "ez" => "application/andrew-inset", + "hqx" => "application/mac-binhex40", + "cpt" => "application/mac-compactpro", + "doc" => "application/msword", + "bin" => "application/octet-stream", + "dms" => "application/octet-stream", + "lha" => "application/octet-stream", + "lzh" => "application/octet-stream", + "exe" => "application/octet-stream", + "class" => "application/octet-stream", + "so" => "application/octet-stream", + "dll" => "application/octet-stream", + "oda" => "application/oda", + "pdf" => "application/pdf", + "ai" => "application/postscript", + "eps" => "application/postscript", + "ps" => "application/postscript", + "smi" => "application/smil", + "smil" => "application/smil", + "wbxml" => "application/vnd.wap.wbxml", + "wmlc" => "application/vnd.wap.wmlc", + "wmlsc" => "application/vnd.wap.wmlscriptc", + "bcpio" => "application/x-bcpio", + "vcd" => "application/x-cdlink", + "pgn" => "application/x-chess-pgn", + "cpio" => "application/x-cpio", + "csh" => "application/x-csh", + "dcr" => "application/x-director", + "dir" => "application/x-director", + "dxr" => "application/x-director", + "dvi" => "application/x-dvi", + "spl" => "application/x-futuresplash", + "gtar" => "application/x-gtar", + "hdf" => "application/x-hdf", + "js" => "application/x-javascript", + "skp" => "application/x-koan", + "skd" => "application/x-koan", + "skt" => "application/x-koan", + "skm" => "application/x-koan", + "latex" => "application/x-latex", + "nc" => "application/x-netcdf", + "cdf" => "application/x-netcdf", + "sh" => "application/x-sh", + "shar" => "application/x-shar", + "swf" => "application/x-shockwave-flash", + "sit" => "application/x-stuffit", + "sv4cpio" => "application/x-sv4cpio", + "sv4crc" => "application/x-sv4crc", + "tar" => "application/x-tar", + "tcl" => "application/x-tcl", + "tex" => "application/x-tex", + "texinfo" => "application/x-texinfo", + "texi" => "application/x-texinfo", + "t" => "application/x-troff", + "tr" => "application/x-troff", + "roff" => "application/x-troff", + "man" => "application/x-troff-man", + "me" => "application/x-troff-me", + "ms" => "application/x-troff-ms", + "ustar" => "application/x-ustar", + "src" => "application/x-wais-source", + "xhtml" => "application/xhtml+xml", + "xht" => "application/xhtml+xml", + "zip" => "application/zip", + "au" => "audio/basic", + "snd" => "audio/basic", + "mid" => "audio/midi", + "midi" => "audio/midi", + "kar" => "audio/midi", + "mpga" => "audio/mpeg", + "mp2" => "audio/mpeg", + "mp3" => "audio/mpeg", + "aif" => "audio/x-aiff", + "aiff" => "audio/x-aiff", + "aifc" => "audio/x-aiff", + "m3u" => "audio/x-mpegurl", + "ram" => "audio/x-pn-realaudio", + "rm" => "audio/x-pn-realaudio", + "rpm" => "audio/x-pn-realaudio-plugin", + "ra" => "audio/x-realaudio", + "wav" => "audio/x-wav", + "pdb" => "chemical/x-pdb", + "xyz" => "chemical/x-xyz", + "bmp" => "image/bmp", + "gif" => "image/gif", + "ief" => "image/ief", + "jpeg" => "image/jpeg", + "jpg" => "image/jpeg", + "jpe" => "image/jpeg", + "png" => "image/png", + "tiff" => "image/tiff", + "tif" => "image/tif", + "djvu" => "image/vnd.djvu", + "djv" => "image/vnd.djvu", + "wbmp" => "image/vnd.wap.wbmp", + "ras" => "image/x-cmu-raster", + "pnm" => "image/x-portable-anymap", + "pbm" => "image/x-portable-bitmap", + "pgm" => "image/x-portable-graymap", + "ppm" => "image/x-portable-pixmap", + "rgb" => "image/x-rgb", + "xbm" => "image/x-xbitmap", + "xpm" => "image/x-xpixmap", + "xwd" => "image/x-windowdump", + "igs" => "model/iges", + "iges" => "model/iges", + "msh" => "model/mesh", + "mesh" => "model/mesh", + "silo" => "model/mesh", + "wrl" => "model/vrml", + "vrml" => "model/vrml", + "css" => "text/css", + "html" => "text/html", + "htm" => "text/html", + "asc" => "text/plain", + "txt" => "text/plain", + "rtx" => "text/richtext", + "rtf" => "text/rtf", + "sgml" => "text/sgml", + "sgm" => "text/sgml", + "tsv" => "text/tab-seperated-values", + "wml" => "text/vnd.wap.wml", + "wmls" => "text/vnd.wap.wmlscript", + "etx" => "text/x-setext", + "xml" => "text/xml", + "xsl" => "text/xml", + "mpeg" => "video/mpeg", + "mpg" => "video/mpeg", + "mpe" => "video/mpeg", + "qt" => "video/quicktime", + "mov" => "video/quicktime", + "mxu" => "video/vnd.mpegurl", + "avi" => "video/x-msvideo", + "movie" => "video/x-sgi-movie", + "ice" => "x-conference-xcooltalk" + ); + } +} +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailBox.php b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailBox.php new file mode 100644 index 00000000..16687584 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailBox.php @@ -0,0 +1,222 @@ +debug)) { $log->debug($message); } + else if( ($force || $this->debug) ) echo "$message\n"; + } + + /** + * Constructor + */ + function __construct($scannerinfo) { + $this->_scannerinfo = $scannerinfo; + $this->_mailboxsettings = $scannerinfo->getAsMap(); + + if($this->_mailboxsettings[ssltype] == '') $this->_mailboxsettings[ssltype] = 'notls'; + if($this->_mailboxsettings[sslmethod]== '') $this->_mailboxsettings[sslmethod] = 'novalidate-cert'; + + if($this->_mailboxsettings[protocol] == 'pop3') { $port = '110'; } + else { + if($this->_mailboxsettings[ssltype] == 'tls' || + $this->_mailboxsettings[ssltype] == 'ssl') { + $port = '993'; + } + else $port = '143'; + } + $this->_mailboxsettings[port] = $port; + } + + /** + * Connect to mail box folder. + */ + function connect($folder='INBOX') { + $imap = false; + $mailboxsettings = $this->_mailboxsettings; + + $isconnected = false; + + // Connect using last successful url + if($mailboxsettings['connecturl']) { + $connecturl = $mailboxsettings['connecturl']; + $this->log("Trying to connect using connecturl $connecturl$folder", true); + $imap = @imap_open("$connecturl$folder", $mailboxsettings[username], $mailboxsettings[password]); + if($imap) { + $this->_imapurl = $connecturl; + $this->_imapfolder = $folder; + $isconnected = true; + + $this->log("Successfully connected", true); + } + } + + if(!$imap) { + $connectString = '{'. "$mailboxsettings[server]:$mailboxsettings[port]/$mailboxsettings[protocol]/$mailboxsettings[ssltype]/$mailboxsettings[sslmethod]" ."}"; + $connectStringShort = '{'. "$mailboxsettings[server]/$mailboxsettings[protocol]:$mailboxsettings[port]" ."}"; + + $this->log("Trying to connect using $connectString$folder", true); + if(!$imap = @imap_open("$connectString$folder", $mailboxsettings[username], $mailboxsettings[password])) { + $this->log("Connect failed using $connectString$folder, trying with $connectStringShort$folder...", true); + $imap = @imap_open("$connectStringShort$folder", $mailboxsettings[username], $mailboxsettings[password]); + if($imap) { + $this->_imapurl = $connectStringShort; + $this->_imapfolder = $folder; + $isconnected = true; + $this->log("Successfully connected", true); + } else { + $this->log("Connect failed using $connectStringShort$folder", true); + } + } else { + $this->_imapurl = $connectString; + $this->_imapfolder = $folder; + $isconnected = true; + $this->log("Successfully connected", true); + } + } + + $this->_imap = $imap; + return $isconnected; + } + + /** + * Open the mailbox folder. + * @param $folder Folder name to open + * @param $reopen set to true for re-opening folder if open (default=false) + * @return true if connected, false otherwise + */ + function open($folder, $reopen=false) { + /** Avoid re-opening of the box if not requested. */ + if(!$reopen && ($folder == $this->_imapfolder)) return true; + + if(!$this->_imap) return $this->connect($folder); + + $mailboxsettings = $this->_mailboxsettings; + + $isconnected = false; + $connectString = $this->_imapurl; + $this->log("Trying to open folder using $connectString$folder"); + $imap = @imap_open("$connectString$folder", $mailboxsettings[username], $mailboxsettings[password]); + if($imap) { + + // Perform cleanup task before re-initializing the connection + $this->close(); + + $this->_imapfolder = $folder; + $this->_imap = $imap; + $isconnected = true; + } + return $isconnected; + } + + /** + * Get the mails based on searchquery. + * @param $folder Folder in which mails to be read. + * @param $searchQuery IMAP query, (default false: fetches mails newer from lastscan) + * @return imap_search records or false + */ + function search($folder, $searchQuery=false) { + if(!$searchQuery) { + $lastscanOn = $this->_scannerinfo->getLastscan($folder); + $searchfor = $this->_scannerinfo->searchfor; + + if($searchfor && $lastscanOn) { + if($searchfor == 'ALL') { + $searchQuery = "SINCE $lastscanOn"; + } else { + $searchQuery = "$useSearchFor SINCE $lastscanOn"; + } + } else { + $searchQuery = $lastscanOn? "SINCE $lastscanOn" : "BEFORE ". date('d-M-Y'); + } + } + if($this->open($folder)) { + $this->log("Searching mailbox[$folder] using query: $searchQuery"); + return imap_search($this->_imap, $searchQuery); + } + return false; + } + + /** + * Get folder names (as list) for the given mailbox connection + */ + function getFolders() { + $folders = false; + if($this->_imap) { + $imapfolders = imap_list($this->_imap, $this->_imapurl, '*'); + if($imapfolders) { + foreach($imapfolders as $imapfolder) { + $folders[] = substr($imapfolder, strlen($this->_imapurl)); + } + } + } + return $folders; + } + + /** + * Fetch the email based on the messageid. + * @param $messageid messageid of the email + * @param $fetchbody set to false to defer fetching the body, (default: true) + */ + function getMessage($messageid, $fetchbody=true) { + return new Vtiger_MailRecord($this->_imap, $messageid, $fetchbody); + } + + /** + * Mark the message in the mailbox. + */ + function markMessage($messageid) { + $markas = $this->_scannerinfo->markas; + if($this->_imap && $markas) { + if(strtoupper($markas) == 'SEEN') $markas = "\\Seen"; + imap_setflag_full($this->_imap, $messageid, $markas); + } + } + + /** + * Close the open IMAP connection. + */ + function close() { + if($this->_needExpunge) { + imap_expunge($this->_imap); + } + $this->_needExpunge = false; + if($this->_imap) { + imap_close($this->_imap); + $this->_imap = false; + } + } +} + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailRecord.php b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailRecord.php new file mode 100644 index 00000000..23f745c9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailRecord.php @@ -0,0 +1,318 @@ +__toString(); + + global $log; + if($log && $this->debug) { $log->debug($message); } + else if($this->debug) { + echo var_export($message, true) . "\n"; + } + } + + /** + * String representation of the object. + */ + function __toString() { + $tostring = ''; + $tostring .= 'FROM: ['. implode(',', $this->_from) . ']'; + $tostring .= ',TO: [' . implode(',', $this->_to) . ']'; + if(!empty($this->_cc)) $tostring .= ',CC: [' . implode(',', $this->_cc) . ']'; + if(!empty($this->_bcc))$tostring .= ',BCC: [' . implode(',', $this->_bcc) . ']'; + $tostring .= ',DATE: ['. $this->_date . ']'; + $tostring .= ',SUBJECT: ['. $this->_subject . ']'; + return $tostring; + } + + /** + * Constructor. + */ + function __construct($imap, $messageid, $fetchbody=true) { + $this->__parseHeader($imap, $messageid); + if($fetchbody) $this->__parseBody($imap, $messageid); + } + + /** + * Get body content as Text. + */ + function getBodyText($striptags=true) { + $bodytext = $this->_body; + + if($this->_plainmessage) { + $bodytext = $this->_plainmessage; + } else if($this->_isbodyhtml) { + // TODO This conversion can added multiple lines if + // content is displayed directly on HTML page + $bodytext = preg_replace("/
    /", "\n", $bodytext); + $bodytext = strip_tags($bodytext); + } + return $bodytext; + } + + /** + * Get body content as HTML. + */ + function getBodyHTML() { + $bodyhtml = $this->_body; + if(!$this->_isbodyhtml) { + $bodyhtml = preg_replace( Array("/\r\n/", "/\n/"), Array('
    ','
    '), $bodyhtml ); + } + return $bodyhtml; + } + + /** + * Fetch the mail body from server. + */ + function fetchBody($imap, $messageid) { + if(!$this->_bodyparsed) $this->__parseBody($imap, $messageid); + } + + /** + * Parse the email id from the mail header text. + * @access private + */ + function __getEmailIdList($inarray) { + if(empty($inarray)) return Array(); + $emails = Array(); + foreach($inarray as $emailinfo) { + $emails[] = $emailinfo->mailbox . '@' . $emailinfo->host; + } + return $emails; + } + + /** + * Helper function to convert the encoding of input to target charset. + */ + static function __convert_encoding($input, $to, $from = false) { + if(function_exists('mb_convert_encoding')) { + if(!$from) $from = mb_detect_encoding($input); + + if(strtolower(trim($to)) == strtolower(trim($from))) { + return $input; + } else { + return mb_convert_encoding($input, $to, $from); + } + } + return $input; + } + + /** + * MIME decode function to parse IMAP header or mail information + */ + static function __mime_decode($input, &$words=null, $targetEncoding='UTF-8') { + if(is_null($words)) $words = array(); + $returnvalue = $input; + + if(preg_match_all('/=\?([^\?]+)\?([^\?]+)\?([^\?]+)\?=/', $input, $matches)) { + $totalmatches = count($matches[0]); + + for($index = 0; $index < $totalmatches; ++$index) { + $charset = $matches[1][$index]; + $encoding= strtoupper($matches[2][$index]); // B - base64 or Q - quoted printable + $data = $matches[3][$index]; + + if($encoding == 'B') { + $decodevalue = base64_decode($data); + } else if($encoding == 'Q') { + $decodevalue = quoted_printable_decode($data); + } + $value = self::__convert_encoding($decodevalue, $targetEncoding, $charset); + array_push($words, $value); + } + } + if(!empty($words)) { + $returnvalue = implode('', $words); + } + return $returnvalue; + } + + /** + * MIME encode function to prepare input to target charset supported by normal IMAP clients. + */ + static function __mime_encode($input, $encoding='Q', $charset='iso-8859-1') { + $returnvalue = $input; + $encoded = false; + + if(strtoupper($encoding) == 'B' ) { + $returnvalue = self::__convert_encoding($input, $charset); + $returnvalue = base64_encode($returnvalue); + $encoded = true; + } else { + $returnvalue = self::__convert_encoding($input, $charset); + if(function_exists('imap_qprint')) { + $returnvalue = imap_qprint($returnvalue); + $encoded = true; + } else { + // TODO: Handle case when imap_qprint is not available. + } + } + if($encoded) { + $returnvalue = "=?$charset?$encoding?$returnvalue?="; + } + return $returnvalue; + } + + /** + * Parse header of the email. + * @access private + */ + function __parseHeader($imap, $messageid) { + $this->_from = Array(); + $this->_to = Array(); + + $mailheader = imap_headerinfo($imap, $messageid); + + $this->_uniqueid = $mailheader->message_id; + + $this->_from = $this->__getEmailIdList($mailheader->from); + $this->_to = $this->__getEmailIdList($mailheader->to); + $this->_cc = $this->__getEmailIdList($mailheader->cc); + $this->_bcc = $this->__getEmailIdList($mailheader->bcc); + + $this->_date = $mailheader->udate; + + $this->_subject = self::__mime_decode($mailheader->subject); + if(!$this->_subject) $this->_subject = 'Untitled'; + } + // Modified: http://in2.php.net/manual/en/function.imap-fetchstructure.php#85685 + function __parseBody($imap, $messageid) { + $structure = imap_fetchstructure($imap, $messageid); + + $this->_plainmessage = ''; + $this->_htmlmessage = ''; + $this->_body = ''; + $this->_isbodyhtml = false; + + if($structure->parts) { /* multipart */ + foreach($structure->parts as $partno0=>$p) { + $this->__getpart($imap, $messageid, $p, $partno0+1); + } + } else { /* not multipart */ + $this->__getpart($imap, $messageid, $structure, 0); + } + + // Set the body (either plain or html content) + if($this->_htmlmessage != '') { + $this->_body = $this->_htmlmessage; + $this->_isbodyhtml = true; + } else { + $this->_body = $this->_plainmessage; + } + + if($this->_attachments) { + $this->log("Attachments: "); + $this->log(array_keys($this->_attachments)); + } + + $this->_bodyparsed = true; + } + // Modified: http://in2.php.net/manual/en/function.imap-fetchstructure.php#85685 + function __getpart($imap, $messageid, $p, $partno) { + // $partno = '1', '2', '2.1', '2.1.3', etc if multipart, 0 if not multipart + + // DECODE DATA + $data = ($partno)? + imap_fetchbody($imap,$messageid,$partno): // multipart + imap_body($imap,$messageid); // not multipart + + // Any part may be encoded, even plain text messages, so check everything. + if ($p->encoding==4) $data = quoted_printable_decode($data); + elseif ($p->encoding==3) $data = base64_decode($data); + // no need to decode 7-bit, 8-bit, or binary + + // PARAMETERS + // get all parameters, like charset, filenames of attachments, etc. + $params = array(); + if ($p->parameters) { + foreach ($p->parameters as $x) $params[ strtolower( $x->attribute ) ] = $x->value; + } + if ($p->dparameters) { + foreach ($p->dparameters as $x) $params[ strtolower( $x->attribute ) ] = $x->value; + } + + // ATTACHMENT + // Any part with a filename is an attachment, + // so an attached text file (type 0) is not mistaken as the message. + if ($params['filename'] || $params['name']) { + // filename may be given as 'Filename' or 'Name' or both + $filename = ($params['filename'])? $params['filename'] : $params['name']; + // filename may be encoded, so see imap_mime_header_decode() + if(!$this->_attachments) $this->_attachments = Array(); + $this->_attachments[$filename] = $data; // TODO: this is a problem if two files have same name + } + + // TEXT + elseif ($p->type==0 && $data) { + $this->_charset = $params['charset']; // assume all parts are same charset + $data = self::__convert_encoding($data, 'UTF-8', $this->_charset); + + // Messages may be split in different parts because of inline attachments, + // so append parts together with blank row. + if (strtolower($p->subtype)=='plain') $this->_plainmessage .= trim($data) ."\n\n"; + else $this->_htmlmessage .= $data ."

    "; + } + + // EMBEDDED MESSAGE + // Many bounce notifications embed the original message as type 2, + // but AOL uses type 1 (multipart), which is not handled here. + // There are no PHP functions to parse embedded messages, + // so this just appends the raw source to the main message. + elseif ($p->type==2 && $data) { + $this->_plainmessage .= trim($data) ."\n\n"; + } + + // SUBPART RECURSION + if ($p->parts) { + foreach ($p->parts as $partno0=>$p2) + $this->__getpart($imap,$messageid,$p2,$partno.'.'.($partno0+1)); // 1.2, 1.2.1, etc. + } + } +} +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScanner.php b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScanner.php new file mode 100644 index 00000000..2ad748fb --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScanner.php @@ -0,0 +1,412 @@ +debug) { $log->debug($message); } + else if($this->debug) echo "$message\n"; + } + + /** + * Constructor. + */ + function __construct($scannerinfo) { + $this->_scannerinfo = $scannerinfo; + } + + /** + * Get mailbox instance configured for the scan + */ + function getMailBox() { + if(!$this->_mailbox) { + $this->_mailbox = new Vtiger_MailBox($this->_scannerinfo); + $this->_mailbox->debug = $this->debug; + } + return $this->_mailbox; + } + + /** + * Start Scanning. + */ + function performScanNow() { + // Check if rules exists to proceed + $rules = $this->_scannerinfo->rules; + + if(empty($rules)) { + $this->log("No rules setup for scanner [". $this->_scannerinfo->scannername . "] SKIPING\n"); + return; + } + + // Build ignore folder list + $ignoreFolders = Array() + $this->_generalIgnoreFolders; + $folderinfoList = $this->_scannerinfo->getFolderInfo(); + foreach($folderinfoList as $foldername=>$folderinfo) { + if(!$folderinfo[enabled]) $ignoreFolders[] = $foldername; + } + + // Get mailbox instance to work with + $mailbox = $this->getMailBox(); + $mailbox->connect(); + + /** Loop through all the folders. */ + $folders = $mailbox->getFolders(); + + if($folders) $this->log("Folders found: " . implode(',', $folders) . "\n"); + + foreach($folders as $lookAtFolder) { + // Skip folder scanning? + if(in_array($lookAtFolder, $ignoreFolders)) { + $this->log("\nIgnoring Folder: $lookAtFolder\n"); + continue; + } + // If a new folder has been added we should avoid scanning it + if(!isset($folderinfoList[$lookAtFolder])) { + $this->log("\nSkipping New Folder: $lookAtFolder\n"); + continue; + } + + // Search for mail in the folder + $mailsearch = $mailbox->search($lookAtFolder); + $this->log($mailsearch? "Total Mails Found in [$lookAtFolder]: " . count($mailsearch) : "No Mails Found in [$lookAtFolder]"); + + // No emails? Continue with next folder + if(empty($mailsearch)) continue; + + // Loop through each of the email searched + foreach($mailsearch as $messageid) { + // Fetch only header part first, based on account lookup fetch the body. + $mailrecord = $mailbox->getMessage($messageid, false); + $mailrecord->debug = $mailbox->debug; + $mailrecord->log(); + + // If the email is already scanned & rescanning is not set, skip it + if($this->isMessageScanned($mailrecord, $lookAtFolder)) { + $this->log("\nMessage already scanned [$mailrecord->_subject], IGNORING...\n"); + unset($mailrecord); + continue; + } + + // Apply rules configured for the mailbox + $crmid = false; + foreach($rules as $mailscannerrule) { + $crmid = $this->applyRule($mailscannerrule, $mailrecord, $mailbox, $messageid); + if($crmid) { + break; // Rule was successfully applied and action taken + } + } + // Mark the email message as scanned + $this->markMessageScanned($mailrecord, $crmid); + $mailbox->markMessage($messageid); + + /** Free the resources consumed. */ + unset($mailrecord); + } + /* Update lastscan for this folder and reset rescan flag */ + // TODO: Update lastscan only if all the mail searched was parsed successfully? + $rescanFolderFlag = false; + $this->updateLastScan($lookAtFolder, $rescanFolderFlag); + } + // Close the mailbox at end + $mailbox->close(); + } + + /** + * Apply all the rules configured for a mailbox on the mailrecord. + */ + function applyRule($mailscannerrule, $mailrecord, $mailbox, $messageid) { + // If no actions are set, don't proceed + if(empty($mailscannerrule->actions)) return false; + + // Check if rule is defined for the body + $bodyrule = $mailscannerrule->hasBodyRule(); + + if($bodyrule) { + // We need the body part for rule evaluation + $mailrecord->fetchBody($mailbox->_imap, $messageid); + } + + // Apply rule to check if record matches the criteria + $matchresult = $mailscannerrule->applyAll($mailrecord, $bodyrule); + + // If record matches the conditions fetch body to take action. + $crmid = false; + if($matchresult) { + $mailrecord->fetchBody($mailbox->_imap, $messageid); + $crmid = $mailscannerrule->takeAction($this, $mailrecord, $matchresult); + } + // Return the CRMID + return $crmid; + } + + /** + * Mark the email as scanned. + */ + function markMessageScanned($mailrecord, $crmid=false) { + global $adb; + if($crmid === false) $crmid = null; + // TODO Make sure we have unique entry + $adb->pquery("INSERT INTO vtiger_mailscanner_ids(scannerid, messageid, crmid) VALUES(?,?,?)", + Array($this->_scannerinfo->scannerid, $mailrecord->_uniqueid, $crmid)); + } + + /** + * Check if email was scanned. + */ + function isMessageScanned($mailrecord, $lookAtFolder) { + global $adb; + $messages = $adb->pquery("SELECT * FROM vtiger_mailscanner_ids WHERE scannerid=? AND messageid=?", + Array($this->_scannerinfo->scannerid, $mailrecord->_uniqueid)); + + $folderRescan = $this->_scannerinfo->needRescan($lookAtFolder); + $isScanned = false; + + if($adb->num_rows($messages)) { + $isScanned = true; + + // If folder is scheduled for rescan and earlier message was not acted upon? + $relatedCRMId = $adb->query_result($messages, 0, 'crmid'); + + if($folderRescan && empty($relatedCRMId)) { + $adb->pquery("DELETE FROM vtiger_mailscanner_ids WHERE scannerid=? AND messageid=?", + Array($this->_scannerinfo->scannerid, $mailrecord->_uniqueid)); + $isScanned = false; + } + } + return $isScanned; + } + + /** + * Update last scan on the folder. + */ + function updateLastscan($folder) { + $this->_scannerinfo->updateLastscan($folder); + } + + /** + * Convert string to integer value. + * @param $strvalue + * @returns false if given contain non-digits, else integer value + */ + function __toInteger($strvalue) { + $ival = intval($strvalue); + $intvalstr = "$ival"; + if(strlen($strvalue) == strlen($intvalstr)) { + return $ival; + } + return false; + } + + /** Lookup functionality. */ + var $_cachedContactIds = Array(); + var $_cachedAccountIds = Array(); + var $_cachedTicketIds = Array(); + + var $_cachedAccounts = Array(); + var $_cachedContacts = Array(); + var $_cachedTickets = Array(); + + /** + * Lookup Contact record based on the email given. + */ + function LookupContact($email) { + global $adb; + if($this->_cachedContactIds[$email]) { + $this->log("Reusing Cached Contact Id for email: $email"); + return $this->_cachedContactIds[$email]; + } + $contactid = false; + $contactres = $adb->pquery("SELECT contactid FROM vtiger_contactdetails WHERE email=?", Array($email)); + if($adb->num_rows($contactres)) { + $contactid = $adb->query_result($contactres, 0, 'contactid'); + $crmres = $adb->pquery("SELECT deleted FROM vtiger_crmentity WHERE crmid=?", Array($contactid)); + if($adb->num_rows($crmres) && $adb->query_result($crmres, 0, 'deleted')) $contactid = false; + } + if($contactid) { + $this->log("Caching Contact Id found for email: $email"); + $this->_cachedContactIds[$email] = $contactid; + } else { + $this->log("No matching Contact found for email: $email"); + } + return $contactid; + } + /** + * Lookup Account record based on the email given. + */ + function LookupAccount($email) { + global $adb; + if($this->_cachedAccountIds[$email]) { + $this->log("Reusing Cached Account Id for email: $email"); + return $this->_cachedAccountIds[$email]; + } + + $accountid = false; + $accountres = $adb->pquery("SELECT accountid FROM vtiger_account WHERE email1=? OR email2=?", Array($email, $email)); + if($adb->num_rows($accountres)) { + $accountid = $adb->query_result($accountres, 0, 'accountid'); + $crmres = $adb->pquery("SELECT deleted FROM vtiger_crmentity WHERE crmid=?", Array($accountid)); + if($adb->num_rows($crmres) && $adb->query_result($crmres, 0, 'deleted')) $accountid = false; + } + if($accountid) { + $this->log("Caching Account Id found for email: $email"); + $this->_cachedAccountIds[$email] = $accountid; + } else { + $this->log("No matching Account found for email: $email"); + } + return $accountid; + } + /** + * Lookup Ticket record based on the subject or id given. + */ + function LookupTicket($subjectOrId) { + global $adb; + + $checkTicketId = $this->__toInteger($subjectOrId); + if(!$checkTicketId) { + $ticketres = $adb->pquery("SELECT ticketid FROM vtiger_troubletickets WHERE title = ?", Array($subjectOrId)); + if($adb->num_rows($ticketres)) $checkTicketId = $adb->query_result($ticketres, 0, 'ticketid'); + } + if(!$checkTicketId) return false; + + if($this->_cachedTicketIds[$checkTicketId]) { + $this->log("Reusing Cached Ticket Id for: $subjectOrId"); + return $this->_cachedTicketIds[$checkTicketId]; + } + + $ticketid = false; + if($checkTicketId) { + $crmres = $adb->pquery("SELECT setype, deleted FROM vtiger_crmentity WHERE crmid=?", Array($checkTicketId)); + if($adb->num_rows($crmres)) { + if($adb->query_result($crmres, 0, 'setype') == 'HelpDesk' && + $adb->query_result($crmres, 0, 'deleted') == '0') $ticketid = $checkTicketId; + } + } + if($ticketid) { + $this->log("Caching Ticket Id found for: $subjectOrId"); + $this->_cachedTicketIds[$checkTicketId] = $ticketid; + } else { + $this->log("No matching Ticket found for: $subjectOrId"); + } + return $ticketid; + } + + /** + * Get Account record information based on email. + */ + function GetAccountRecord($email) { + require_once('modules/Accounts/Accounts.php'); + $accountid = $this->LookupAccount($email); + $account_focus = false; + if($accountid) { + if($this->_cachedAccounts[$accountid]) { + $account_focus = $this->_cachedAccounts[$accountid]; + $this->log("Reusing Cached Account [" . $account_focus->column_fields[accountname] . "]"); + } else { + $account_focus = new Accounts(); + $account_focus->retrieve_entity_info($accountid, 'Accounts'); + $account_focus->id = $accountid; + + $this->log("Caching Account [" . $account_focus->column_fields[accountname] . "]"); + $this->_cachedAccounts[$accountid] = $account_focus; + } + } + return $account_focus; + } + /** + * Get Contact record information based on email. + */ + function GetContactRecord($email) { + require_once('modules/Contacts/Contacts.php'); + $contactid = $this->LookupContact($email); + $contact_focus = false; + if($contactid) { + if($this->_cachedContacts[$contactid]) { + $contact_focus = $this->_cachedContacts[$contactid]; + $this->log("Reusing Cached Contact [" . $contact_focus->column_fields[lastname] . + '-' . $contact_focus->column_fields[firstname] . "]"); + } else { + $contact_focus = new Contacts(); + $contact_focus->retrieve_entity_info($contactid, 'Contacts'); + $contact_focus->id = $contactid; + + $this->log("Caching Contact [" . $contact_focus->column_fields[lastname] . + '-' . $contact_focus->column_fields[firstname] . "]"); + $this->_cachedContacts[$contactid] = $contact_focus; + } + } + return $contact_focus; + } + + /** + * Lookup Contact or Account based on from email and with respect to given CRMID + */ + function LookupContactOrAccount($fromemail, $checkWithId=false) { + $recordid = $this->LookupContact($fromemail); + if($checkWithId && $recordid != $checkWithId) { + $recordid = $this->LookupAccount($fromemail); + if($checkWithId && $recordid != $checkWithId) $recordid = false; + } + return $recordid; + } + + /** + * Get Ticket record information based on subject or id. + */ + function GetTicketRecord($subjectOrId, $fromemail=false) { + require_once('modules/HelpDesk/HelpDesk.php'); + $ticketid = $this->LookupTicket($subjectOrId); + $ticket_focus = false; + if($ticketid) { + if($this->_cachedTickets[$ticketid]) { + $ticket_focus = $this->_cachedTickets[$ticketid]; + // Check the parentid association if specified. + if($fromemail && !$this->LookupContactOrAccount($fromemail, $ticket_focus->column_fields[parent_id])) { + $ticket_focus = false; + } + if($ticket_focus) { + $this->log("Reusing Cached Ticket [" . $ticket_focus->column_fields[ticket_title] ."]"); + } + } else { + $ticket_focus = new HelpDesk(); + $ticket_focus->retrieve_entity_info($ticketid, 'HelpDesk'); + $ticket_focus->id = $ticketid; + // Check the parentid association if specified. + if($fromemail && !$this->LookupContactOrAccount($fromemail, $ticket_focus->column_fields[parent_id])) { + $ticket_focus = false; + } + if($ticket_focus) { + $this->log("Caching Ticket [" . $ticket_focus->column_fields[ticket_title] . "]"); + $this->_cachedTickets[$ticketid] = $ticket_focus; + } + } + } + return $ticket_focus; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerAction.php b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerAction.php new file mode 100644 index 00000000..d03f475c --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerAction.php @@ -0,0 +1,359 @@ +debug) { $log->debug($message); } + else if($this->debug) echo "$message\n"; + } + + /** + * Constructor. + */ + function __construct($foractionid) { + $this->initialize($foractionid); + } + + /** + * Initialize this instance. + */ + function initialize($foractionid) { + global $adb; + $result = $adb->pquery("SELECT * FROM vtiger_mailscanner_actions WHERE actionid=? ORDER BY sequence", Array($foractionid)); + + if($adb->num_rows($result)) { + $this->actionid = $adb->query_result($result, 0, 'actionid'); + $this->scannerid = $adb->query_result($result, 0, 'scannerid'); + $this->actiontype = $adb->query_result($result, 0, 'actiontype'); + $this->module = $adb->query_result($result, 0, 'module'); + $this->lookup = $adb->query_result($result, 0, 'lookup'); + $this->actiontext = "$this->actiontype,$this->module,$this->lookup"; + } + } + + /** + * Create/Update the information of Action into database. + */ + function update($ruleid, $actiontext) { + global $adb; + + $inputparts = explode(',', $actiontext); + $this->actiontype = $inputparts[0]; // LINK, CREATE + $this->module = $inputparts[1]; // Module name + $this->lookup = $inputparts[2]; // FROM, TO + + $this->actiontext = $actiontext; + + if($this->actionid) { + $adb->pquery("UPDATE vtiger_mailscanner_actions SET scannerid=?, actiontype=?, module=?, lookup=? WHERE actionid=?", + Array($this->scannerid, $this->actiontype, $this->module, $this->lookup, $this->actionid)); + } else { + $this->sequence = $this->__nextsequence(); + $adb->pquery("INSERT INTO vtiger_mailscanner_actions(scannerid, actiontype, module, lookup, sequence) VALUES(?,?,?,?,?)", + Array($this->scannerid, $this->actiontype, $this->module, $this->lookup, $this->sequence)); + $this->actionid = $adb->database->Insert_ID(); + } + $checkmapping = $adb->pquery("SELECT COUNT(*) AS ruleaction_count FROM vtiger_mailscanner_ruleactions + WHERE ruleid=? AND actionid=?", Array($ruleid, $this->actionid)); + if($adb->num_rows($checkmapping) && !$adb->query_result($checkmapping, 0, 'ruleaction_count')) { + $adb->pquery("INSERT INTO vtiger_mailscanner_ruleactions(ruleid, actionid) VALUES(?,?)", + Array($ruleid, $this->actionid)); + } + } + + /** + * Delete the actions from tables. + */ + function delete() { + global $adb; + if($this->actionid) { + $adb->pquery("DELETE FROM vtiger_mailscanner_actions WHERE actionid=?", Array($this->actionid)); + $adb->pquery("DELETE FROM vtiger_mailscanner_ruleactions WHERE actionid=?", Array($this->actionid)); + } + } + + /** + * Get next sequence of Action to use. + */ + function __nextsequence() { + global $adb; + $seqres = $adb->pquery("SELECT max(sequence) AS max_sequence FROM vtiger_mailscanner_actions", Array()); + $maxsequence = 0; + if($adb->num_rows($seqres)) { + $maxsequence = $adb->query_result($seqres, 0, 'max_sequence'); + } + ++$maxsequence; + return $maxsequence; + } + + /** + * Apply the action on the mail record. + */ + function apply($mailscanner, $mailrecord, $mailscannerrule, $matchresult) { + $returnid = false; + if($this->actiontype == 'CREATE') { + if($this->module == 'HelpDesk') { + $returnid = $this->__CreateTicket($mailscanner, $mailrecord); + } + } else if($this->actiontype == 'LINK') { + $returnid = $this->__LinkToRecord($mailscanner, $mailrecord); + } else if($this->actiontype == 'UPDATE') { + if($this->module == 'HelpDesk') { + $returnid = $this->__UpdateTicket($mailscanner, $mailrecord, + $mailscannerrule->hasRegexMatch($matchresult)); + } + } + return $returnid; + } + + /** + * Update ticket action. + */ + function __UpdateTicket($mailscanner, $mailrecord, $regexMatchInfo) { + global $adb; + $returnid = false; + + $usesubject = false; + if($this->lookup == 'SUBJECT') { + // If regex match was performed on subject use the matched group + // to lookup the ticket record + if($regexMatchInfo) $usesubject = $regexMatchInfo['matches']; + else $usesubject = $mailrecord->_subject; + + // Get the ticket record that was created by SENDER earlier + $fromemail = $mailrecord->_from[0]; + + $linkfocus = $mailscanner->GetTicketRecord($usesubject, $fromemail); + $relatedid = $linkfocus->column_fields[parent_id]; + + // If matching ticket is found, update comment, attach email + if($linkfocus) { + $timestamp = $adb->formatDate(date('YmdHis'), true); + $adb->pquery("INSERT INTO vtiger_ticketcomments(ticketid, comments, ownerid, ownertype, createdtime) VALUES(?,?,?,?,?)", + Array($linkfocus->id, $mailrecord->getBodyText(), $relatedid, 'customer', $timestamp)); + // Set the ticket status to Open if its Closed + $adb->pquery("UPDATE vtiger_troubletickets set status=? WHERE ticketid=? AND status='Closed'", Array('Open', $linkfocus->id)); + + $returnid = $this->__CreateNewEmail($mailrecord, $this->module, $linkfocus); + + } else { + // TODO If matching ticket was not found, create ticket? + // $returnid = $this->__CreateTicket($mailscanner, $mailrecord); + } + } + return $returnid; + } + + /** + * Create ticket action. + */ + function __CreateTicket($mailscanner, $mailrecord) { + // Prepare data to create trouble ticket + $usetitle = $mailrecord->_subject; + $description = $mailrecord->getBodyText(); + + // There will be only on FROM address to email, so pick the first one + $fromemail = $mailrecord->_from[0]; + $linktoid = $mailscanner->LookupContact($fromemail); + if(!$linktoid) $linktoid = $mailscanner->LookupAccount($fromemail); + + /** Now Create Ticket **/ + global $current_user; + if(!$current_user) $current_user = new Users(); + $current_user->id = 1; + + // Create trouble ticket record + $ticket = new HelpDesk(); + $ticket->column_fields['ticket_title'] = $usetitle; + $ticket->column_fields['description'] = $description; + $ticket->column_fields['ticketstatus'] = 'Open'; + $ticket->column_fields['assigned_user_id'] = $current_user->id; + if($linktoid) $ticket->column_fields['parent_id'] = $linktoid; + $ticket->save('HelpDesk'); + + // Associate any attachement of the email to ticket + $this->__SaveAttachements($mailrecord, 'HelpDesk', $ticket); + + return $ticket->id; + } + + /** + * Add email to CRM record like Contacts/Accounts + */ + function __LinkToRecord($mailscanner, $mailrecord) { + $linkfocus = false; + + $useemail = false; + if($this->lookup == 'FROM') $useemail = $mailrecord->_from; + else if($this->lookup == 'TO') $useemail = $mailrecord->_to; + + if($this->module == 'Contacts') { + foreach($useemail as $email) { + $linkfocus = $mailscanner->GetContactRecord($email); + if($linkfocus) break; + } + } else if($this->module == 'Accounts') { + foreach($useemail as $email) { + $linkfocus = $mailscanner->GetAccountRecord($email); + if($linkfocus) break; + } + } + + $returnid = false; + if($linkfocus) { + $returnid = $this->__CreateNewEmail($mailrecord, $this->module, $linkfocus); + } + return $returnid; + } + + /** + * Create new Email record (and link to given record) including attachements + */ + function __CreateNewEmail($mailrecord, $module, $linkfocus) { + global $current_user, $adb; + if(!$current_user) $current_user = new Users(); + $current_user->id = 1; + + $focus = new Emails(); + $focus->column_fields['parent_type'] = $module; + $focus->column_fields['activitytype'] = 'Emails'; + $focus->column_fields['parent_id'] = "$linkfocus->id@-1|"; + $focus->column_fields['subject'] = $mailrecord->_subject; + + $focus->column_fields['description'] = $mailrecord->getBodyHTML(); + $focus->column_fields['assigned_user_id'] = $linkfocus->column_fields['assigned_user_id']; + $focus->column_fields["date_start"]= date('Y-m-d', $mailrecord->_date); + + $emailid = $focus->id; + $from=$mailrecord->_from[0]; + $to = $mailrecord->_to[0]; + $cc = (!empty($mailrecord->_cc))? implode(',', $mailrecord->_cc) : ''; + $bcc= (!empty($mailrecord->_bcc))? implode(',', $mailrecord->_bcc) : ''; + $flag=''; // 'SENT'/'SAVED' + //emails field were restructured and to,bcc and cc field are JSON arrays + $focus->column_fields['from_email'] = $from; + $focus->column_fields['saved_toid'] = $to; + $focus->column_fields['ccmail'] = $cc; + $focus->column_fields['bccmail'] = $bcc; + $focus->save('Emails'); + + $this->log("Created [$focus->id]: $mailrecord->_subject linked it to " . $linkfocus->id); + + // TODO: Handle attachments of the mail (inline/file) + $this->__SaveAttachements($mailrecord, 'Emails', $focus); + + return $emailid; + } + + /** + * Save attachments from the email and add it to the module record. + */ + function __SaveAttachements($mailrecord, $basemodule, $basefocus) { + global $adb; + + // If there is no attachments return + if(!$mailrecord->_attachments) return; + + $userid = $basefocus->column_fields['assigned_user_id']; + $setype = "$basemodule Attachment"; + + $date_var = $adb->formatDate(date('YmdHis'), true); + + foreach($mailrecord->_attachments as $filename=>$filecontent) { + $attachid = $adb->getUniqueId('vtiger_crmentity'); + $description = $filename; + $usetime = $adb->formatDate($date_var, true); + + $adb->pquery("INSERT INTO vtiger_crmentity(crmid, smcreatorid, smownerid, + modifiedby, setype, description, createdtime, modifiedtime, presence, deleted) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + Array($attachid, $userid, $userid, $userid, $setype, $description, $usetime, $usetime, 1, 0)); + + $issaved = $this->__SaveAttachmentFile($attachid, $filename, $filecontent); + if($issaved) { + // Create document record + $document = new Documents(); + $document->column_fields['notes_title'] = $filename; + $document->column_fields['filename'] = $filename; + $document->column_fields['filestatus'] = 1; + $document->column_fields['filelocationtype'] = 'I'; + $document->column_fields['folderid'] = 1; // Default Folder + $document->column_fields['assigned_user_id'] = $userid; + $document->save('Documents'); + + // Link file attached to document + $adb->pquery("INSERT INTO vtiger_seattachmentsrel(crmid, attachmentsid) VALUES(?,?)", + Array($document->id, $attachid)); + + // Link document to base record + $adb->pquery("INSERT INTO vtiger_senotesrel(crmid, notesid) VALUES(?,?)", + Array($basefocus->id, $document->id)); + } + } + } + + /** + * Save the attachment to the file + */ + function __SaveAttachmentFile($attachid, $filename, $filecontent) { + global $adb; + + $dirname = $this->STORAGE_FOLDER; + if(!is_dir($dirname)) mkdir($dirname); + + $description = $filename; + $filename = str_replace(' ', '-', $filename); + $saveasfile = "$dirname$attachid" . "_$filename"; + if(!file_exists($saveasfile)) { + + $this->log("Saved attachement as $saveasfile\n"); + + $fh = fopen($saveasfile, 'wb'); + fwrite($fh, $filecontent); + fclose($fh); + } + + $mimetype = MailAttachmentMIME::detect($saveasfile); + + $adb->pquery("INSERT INTO vtiger_attachments SET attachmentsid=?, name=?, description=?, type=?, path=?", + Array($attachid, $filename, $description, $mimetype, $dirname)); + + return true; + } +} +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerInfo.php b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerInfo.php new file mode 100644 index 00000000..df3a5a66 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerInfo.php @@ -0,0 +1,375 @@ +initialize($scannername); + } + + /** + * Encrypt/Decrypt input. + * @access private + */ + function __crypt($password, $encrypt=true) { + require_once('include/utils/encryption.php'); + $cryptobj = new Encryption(); + if($encrypt) return $cryptobj->encrypt(trim($password)); + else return $cryptobj->decrypt(trim($password)); + } + + /** + * Initialize this instance. + */ + function initialize($scannername) { + global $adb; + $result = $adb->pquery("SELECT * FROM vtiger_mailscanner WHERE scannername=?", Array($scannername)); + + if($adb->num_rows($result)) { + $this->scannerid = $adb->query_result($result, 0, 'scannerid'); + $this->scannername= $adb->query_result($result, 0, 'scannername'); + $this->server = $adb->query_result($result, 0, 'server'); + $this->protocol = $adb->query_result($result, 0, 'protocol'); + $this->username = $adb->query_result($result, 0, 'username'); + $this->password = $adb->query_result($result, 0, 'password'); + $this->password = $this->__crypt($this->password, false); + $this->ssltype = $adb->query_result($result, 0, 'ssltype'); + $this->sslmethod = $adb->query_result($result, 0, 'sslmethod'); + $this->connecturl = $adb->query_result($result, 0, 'connecturl'); + $this->searchfor = $adb->query_result($result, 0, 'searchfor'); + $this->markas = $adb->query_result($result, 0, 'markas'); + $this->isvalid = $adb->query_result($result, 0, 'isvalid'); + + $this->initializeFolderInfo(); + $this->initializeRules(); + } + } + + /** + * Initialize the folder details + */ + function initializeFolderInfo() { + global $adb; + if($this->scannerid) { + $this->lastscan = Array(); + $this->rescan = Array(); + $lastscanres = $adb->pquery("SELECT * FROM vtiger_mailscanner_folders WHERE scannerid=?",Array($this->scannerid)); + $lastscancount = $adb->num_rows($lastscanres); + if($lastscancount) { + for($lsindex = 0; $lsindex < $lastscancount; ++$lsindex) { + $folder = $adb->query_result($lastscanres, $lsindex, 'foldername'); + $scannedon =$adb->query_result($lastscanres, $lsindex, 'lastscan'); + $nextrescan =$adb->query_result($lastscanres, $lsindex, 'rescan'); + $this->lastscan[$folder] = $scannedon; + $this->rescan[$folder] = ($nextrescan == 0)? false : true; + } + } + } + } + + /** + * Delete lastscan details with this scanner + */ + function clearLastscan() { + global $adb; + $adb->pquery("DELETE FROM vtiger_mailscanner_folders WHERE scannerid=?", Array($this->scannerid)); + $this->lastscan = false; + } + + /** + * Update rescan flag on all folders + */ + function updateAllFolderRescan($rescanFlag=false) { + global $adb; + $useRescanFlag = $rescanFlag? 1 : 0; + $adb->pquery("UPDATE vtiger_mailscanner_folders set rescan=? WHERE scannerid=?", + Array($rescanFlag, $this->scannerid)); + if($this->rescan) { + foreach($this->rescan as $folderName=>$oldRescanFlag) { + $this->rescan[$folderName] = $rescanFlag; + } + } + } + + /** + * Update lastscan information on folder (or set for rescan next) + */ + function updateLastscan($folderName, $rescanFolder=false) { + global $adb; + + $scannedOn = date('d-M-Y'); + + $needRescan = $rescanFolder? 1 : 0; + + $folderInfo = $adb->pquery("SELECT folderid FROM vtiger_mailscanner_folders WHERE scannerid=? AND foldername=?", + Array($this->scannerid, $folderName)); + if($adb->num_rows($folderInfo)) { + $folderid = $adb->query_result($folderInfo, 0, 'folderid'); + $adb->pquery("UPDATE vtiger_mailscanner_folders SET lastscan=?, rescan=? WHERE folderid=?", + Array($scannedOn, $needRescan, $folderid)); + } else { + $enabledForScan = 1; // Enable folder for scan by default + $adb->pquery("INSERT INTO vtiger_mailscanner_folders(scannerid, foldername, lastscan, rescan, enabled) + VALUES(?,?,?,?,?)", Array($this->scannerid, $folderName, $scannedOn, $needRescan, $enabledForScan)); + } + if(!$this->lastscan) $this->lastscan = Array(); + $this->lastscan[$folderName] = $scannedOn; + + if(!$this->rescan) $this->rescan = Array(); + $this->rescan[$folderName] = $needRescan; + } + + /** + * Get lastscan of the folder. + */ + function getLastscan($folderName) { + if($this->lastscan) return $this->lastscan[$folderName]; + else return false; + } + + /** + * Does the folder need message rescan? + */ + function needRescan($folderName) { + if($this->rescan && isset($this->rescan[$folderName])) { + return $this->rescan[$folderName]; + } + // TODO Pick details of rescan flag of folder from database? + return false; + } + + /** + * Check if rescan is required atleast on a folder? + */ + function checkRescan() { + $rescanRequired = false; + if($this->rescan) { + foreach($this->rescan as $folderName=>$rescan) { + if($rescan) { + $rescanRequired = $folderName; + break; + } + } + } + return $rescanRequired; + } + + /** + * Get the folder information that has been scanned + */ + function getFolderInfo() { + $folderinfo = false; + if($this->scannerid) { + global $adb; + $fldres = $adb->pquery("SELECT * FROM vtiger_mailscanner_folders WHERE scannerid=?", Array($this->scannerid)); + $fldcount = $adb->num_rows($fldres); + if($fldcount) { + $folderinfo = Array(); + for($index = 0; $index < $fldcount; ++$index) { + $foldername = $adb->query_result($fldres, $index, 'foldername'); + $folderid = $adb->query_result($fldres, $index, 'folderid'); + $lastscan = $adb->query_result($fldres, $index, 'lastscan'); + $rescan = $adb->query_result($fldres, $index, 'rescan'); + $enabled = $adb->query_result($fldres, $index, 'enabled'); + $folderinfo[$foldername] = Array ('folderid'=>$folderid, 'lastscan'=>$lastscan, 'rescan'=> $rescan, 'enabled'=>$enabled); + } + } + } + return $folderinfo; + } + + /** + * Update the folder information with given folder names + */ + function updateFolderInfo($foldernames, $rescanFolder=false) { + if($this->scannerid && !empty($foldernames)) { + global $adb; + $qmarks = Array(); + foreach($foldernames as $foldername) { + $qmarks[] = '?'; + $this->updateLastscan($foldername, $rescanFolder); + } + // Delete the folder that is no longer present + $adb->pquery("DELETE FROM vtiger_mailscanner_folders WHERE scannerid=? AND foldername NOT IN + (". implode(',', $qmarks) . ")", Array($this->scannerid, $foldernames)); + } + } + + /** + * Enable only given folders for scanning + */ + function enableFoldersForScan($folderinfo) { + if($this->scannerid) { + global $adb; + $adb->pquery("UPDATE vtiger_mailscanner_folders set enabled=0 WHERE scannerid=?", Array($this->scannerid)); + foreach($folderinfo as $foldername=>$foldervalue) { + $folderid = $foldervalue[folderid]; + $enabled = $foldervalue[enabled]; + $adb->pquery("UPDATE vtiger_mailscanner_folders set enabled=? WHERE folderid=? AND scannerid=?", + Array($enabled,$folderid,$this->scannerid)); + } + } + } + + /** + * Initialize scanner rule information + */ + function initializeRules() { + global $adb; + if($this->scannerid) { + $this->rules = Array(); + $rulesres = $adb->pquery("SELECT * FROM vtiger_mailscanner_rules WHERE scannerid=? ORDER BY sequence",Array($this->scannerid)); + $rulescount = $adb->num_rows($rulesres); + if($rulescount) { + for($index = 0; $index < $rulescount; ++$index) { + $ruleid = $adb->query_result($rulesres, $index, 'ruleid'); + $scannerrule = new Vtiger_MailScannerRule($ruleid); + $scannerrule->debug = $this->debug; + $this->rules[] = $scannerrule; + } + } + } + } + + /** + * Get scanner information as map + */ + function getAsMap() { + $infomap = Array(); + $keys = Array('scannerid', 'scannername', 'server', 'protocol', 'username', 'password', 'ssltype', + 'sslmethod', 'connecturl', 'searchfor', 'markas', 'isvalid', 'rules'); + foreach($keys as $key) { + $infomap[$key] = $this->$key; + } + $infomap['requireRescan'] = $this->checkRescan(); + return $infomap; + } + + /** + * Compare this instance with give instance + */ + function compare($otherInstance) { + $checkkeys = Array('server', 'scannername', 'protocol', 'username', 'password', 'ssltype', 'sslmethod', 'searchfor', 'markas',); + foreach($checkkeys as $key) { + if($this->$key != $otherInstance->$key) return false; + } + return true; + } + + /** + * Create/Update the scanner information in database + */ + function update($otherInstance) { + $mailServerChanged = false; + + // Is there is change in server setup? + if($this->server != $otherInstance->server || $this->username != $otherInstance->username) { + $mailServerChanged = true; + $this->clearLastscan(); + // TODO How to handle lastscan info if server settings switches back in future? + } + + $this->server = $otherInstance->server; + $this->scannername= $otherInstance->scannername; + $this->protocol = $otherInstance->protocol; + $this->username = $otherInstance->username; + $this->password = $otherInstance->password; + $this->ssltype = $otherInstance->ssltype; + $this->sslmethod = $otherInstance->sslmethod; + $this->connecturl= $otherInstance->connecturl; + $this->searchfor = $otherInstance->searchfor; + $this->markas = $otherInstance->markas; + $this->isvalid = $otherInstance->isvalid; + + $useisvalid = ($this->isvalid)? 1 : 0; + + $usepassword = $this->__crypt($this->password); + + global $adb; + if($this->scannerid) { // This record exists in the database + $adb->pquery("UPDATE vtiger_mailscanner SET scannername=?,server=?,protocol=?,username=?,password=?,ssltype=?, + sslmethod=?,connecturl=?,searchfor=?,markas=?,isvalid=? WHERE scannerid=?", + Array($this->scannername,$this->server,$this->protocol, $this->username, $usepassword, $this->ssltype, + $this->sslmethod, $this->connecturl,$this->searchfor, $this->markas,$useisvalid, $this->scannerid)); + } else { + $adb->pquery("INSERT INTO vtiger_mailscanner(scannername,server,protocol,username,password,ssltype, + sslmethod,connecturl,searchfor,markas,isvalid) VALUES(?,?,?,?,?,?,?,?,?,?,?)", + Array($this->scannername,$this->server, $this->protocol, $this->username, $usepassword, + $this->ssltype, $this->sslmethod, $this->connecturl, $this->searchfor, $this->markas, $useisvalid)); + $this->scannerid = $adb->database->Insert_ID(); + } + + return $mailServerChanged; + } + + /** + * Delete the scanner information from database + */ + function delete() { + global $adb; + if($this->scannerid) { + $tables = Array( + 'vtiger_mailscanner', + 'vtiger_mailscanner_ids', + 'vtiger_mailscanner_folders', + 'vtiger_mailscanner_rules'); + foreach($tables as $table) { + $adb->pquery("DELETE FROM $table WHERE scannerid=?", + Array($this->scannerid)); + } + $adb->pquery("DELETE FROM vtiger_mailscanner_ruleactions + WHERE actionid in (SELECT actionid FROM vtiger_mailscanner_actions WHERE scannerid=?)", Array($this->scannerid)); + $adb->pquery("DELETE FROM vtiger_mailscanner_actions WHERE scannerid=?", Array($this->scannerid)); + } + } +} +?> diff --git a/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerRule.php b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerRule.php new file mode 100644 index 00000000..3f3d5b8e --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/MailScanner/core/MailScannerRule.php @@ -0,0 +1,396 @@ +debug) { $log->debug($message); } + else if($this->debug) echo "$message\n"; + } + + /** + * Constructor + */ + function __construct($forruleid) { + $this->initialize($forruleid); + } + + /** + * String representation of this instance + */ + function __toString() { + $tostring = ''; + $tostring .= "FROM $this->fromaddress, TO $this->toaddress"; + $tostring .= ",SUBJECT $this->subjectop $this->subject, BODY $this->bodyop $this->body, MATCH USING, $this->matchusing"; + return $tostring; + } + + /** + * Initialize this instance + */ + function initialize($forruleid) { + global $adb; + $result = $adb->pquery("SELECT * FROM vtiger_mailscanner_rules WHERE ruleid=? ORDER BY sequence", Array($forruleid)); + + if($adb->num_rows($result)) { + $this->ruleid = $adb->query_result($result, 0, 'ruleid'); + $this->scannerid = $adb->query_result($result, 0, 'scannerid'); + $this->fromaddress= $adb->query_result($result, 0, 'fromaddress'); + $this->toaddress = $adb->query_result($result, 0, 'toaddress'); + $this->subjectop = $adb->query_result($result, 0, 'subjectop'); + $this->subject = $adb->query_result($result, 0, 'subject'); + $this->bodyop = $adb->query_result($result, 0, 'bodyop'); + $this->body = $adb->query_result($result, 0, 'body'); + $this->sequence = $adb->query_result($result, 0, 'sequence'); + $this->matchusing = $adb->query_result($result, 0, 'matchusing'); + $this->isvalid = true; + $this->initializeActions(); + // At present we support only one action for a rule + if(!empty($this->actions)) $this->useaction = $this->actions[0]; + } + } + + /** + * Initialize the actions + */ + function initializeActions() { + global $adb; + if($this->ruleid) { + $this->actions = Array(); + $actionres = $adb->pquery("SELECT actionid FROM vtiger_mailscanner_ruleactions WHERE ruleid=?",Array($this->ruleid)); + $actioncount = $adb->num_rows($actionres); + if($actioncount) { + for($index = 0; $index < $actioncount; ++$index) { + $actionid = $adb->query_result($actionres, $index, 'actionid'); + $ruleaction = new Vtiger_MailScannerAction($actionid); + $ruleaction->debug = $this->debug; + $this->actions[] = $ruleaction; + } + } + } + } + + /** + * Is body rule defined? + */ + function hasBodyRule() { + return (!empty($this->bodyop)); + } + + /** + * Check if the rule criteria is matching + */ + function isMatching($matchfound1, $matchfound2=null) { + if($matchfound2 === null) return $matchfound1; + + if($this->matchusing== 'AND') return ($matchfound1 && $matchfound2); + if($this->matchusing== 'OR') return ($matchfound1 || $matchfound2); + return false; + } + + /** + * Apply all the criteria. + * @param $mailrecord + * @param $includingBody + * @returns false if not match is found or else all matching result found + */ + function applyAll($mailrecord, $includingBody=true) { + $matchresults = Array(); + $matchfound = null; + + if($this->hasACondition()) { + $subrules = Array('FROM', 'TO', 'SUBJECT', 'BODY'); + + foreach($subrules as $subrule) { + // Body rule could be defered later to improve performance + // in that case skip it. + if($subrule == 'BODY' && !$includingBody) continue; + + $checkmatch = $this->apply($subrule, $mailrecord); + $matchfound = $this->isMatching($checkmatch, $matchfound); + // Collect matching result array + if($matchfound && is_array($checkmatch)) $matchresults[] = $checkmatch; + if($matchfound && $this->matchusing == 'OR') break; + } + } else { + $matchfound = false; + if($this->matchusing == 'OR') { + $matchfound = true; + $matchresults[] = $this->__CreateMatchResult('BLANK','','',''); + } + } + return ($matchfound)? $matchresults : false; + } + + /** + * Check if at least one condition is set for this rule. + */ + function hasACondition() { + $hasFromAddress = $this->fromaddress? true: false; + $hasToAddress = $this->toaddress? true : false; + $hasSubjectOp = $this->subjectop? true : false; + $hasBodyOp = $this->bodyop? true : false; + return ($hasFromAddress || $hasToAddress || $hasSubjectOp || $hasBodyOp); + } + + /** + * Apply required condition on the mail record. + */ + function apply($subrule, $mailrecord) { + $matchfound = false; + if($this->isvalid) { + switch(strtoupper($subrule)) { + case 'FROM': + if($this->fromaddress) { + $matchfound = $this->find($subrule, 'Contains', $mailrecord->_from[0], $this->fromaddress); + } else { + $matchfound = $this->__CreateDefaultMatchResult($subrule); + } + break; + case 'TO': + if($this->toaddress) { + foreach($mailrecord->_to as $toemail) { + $matchfound = $this->find($subrule, 'Contains', $toemail, $this->toaddress); + if($matchfound) break; + } + } else { + $matchfound = $this->__CreateDefaultMatchResult($subrule); + } + break; + case 'SUBJECT': + if($this->subjectop) { + $matchfound = $this->find($subrule, $this->subjectop, $mailrecord->_subject, $this->subject); + } else { + $matchfound = $this->__CreateDefaultMatchResult($subrule); + } + break; + case 'BODY': + if($this->bodyop) { + $matchfound = $this->find($subrule, $this->bodyop, $mailrecord->_body, $this->body); + } else { + $matchfound = $this->__CreateDefaultMatchResult($subrule); + } + break; + } + } + return $matchfound; + } + + /** + * Find if the rule matches based on condition and parameters + */ + function find($subrule, $condition, $input, $searchfor) { + if(!$input) return false; + + $matchfound = false; + $matches = false; + + switch($condition) { + case 'Contains': + $matchfound = stripos($input, $searchfor); + $matchfound = ($matchfound !== FALSE); + $matches = $searchfor; + break; + case 'Not Contains': + $matchfound = stripos($input, $searchfor); + $matchfound = ($matchfound === FALSE); + $matches = $searchfor; + break; + case 'Equals': + $matchfound = strcasecmp($input, $searchfor); + $matchfound = ($matchfound === 0); + $matches = $searchfor; + break; + case 'Not Equals': + $matchfound = strcasecmp($input, $searchfor); + $matchfound = ($matchfound !== 0); + $matches = $searchfor; + break; + case 'Begins With': + $matchfound = stripos($input, $searchfor); + $matchfound = ($matchfound === 0); + $matches = $searchfor; + break; + case 'Ends With': + $matchfound = strripos($input, $searchfor); + $matchfound = ($matchfound === strlen($input)-strlen($searchfor)); + $matches = $searchfor; + break; + case 'Regex': + $regmatches = Array(); + $matchfound = false; + $searchfor = str_replace('/', '\/', $searchfor); + if(preg_match("/$searchfor/i", $input, $regmatches)) { + // Pick the last matching group + $matches = $regmatches[count($regmatches)-1]; + $matchfound = true; + } + break; + } + if($matchfound) $matchfound = $this->__CreateMatchResult($subrule, $condition, $searchfor, $matches); + return $matchfound; + } + + /** + * Create matching result for the subrule. + */ + function __CreateMatchResult($subrule, $condition, $searchfor, $matches) { + return Array( 'subrule' => $subrule, 'condition' => $condition, 'searchfor' => $searchfor, 'matches' => $matches); + } + + /** + * Create default success matching result + */ + function __CreateDefaultMatchResult($subrule) { + if($this->matchusing == 'OR') return false; + if($this->matchusing == 'AND') return $this->__CreateMatchResult($subrule, 'Contains', '', ''); + } + + /** + * Detect if the rule match result has Regex condition + * @param $matchresult result of apply obtained earlier + * @returns matchinfo if Regex match is found, false otherwise + */ + function hasRegexMatch($matchresult) { + foreach($matchresult as $matchinfo) { + $match_condition = $matchinfo['condition']; + $match_string = $matchinfo['matches']; + if($match_condition == 'Regex' && $match_string) + return $matchinfo; + } + return false; + } + + /** + * Swap (reset) sequence of two rules. + */ + static function resetSequence($ruleid1, $ruleid2) { + global $adb; + $ruleresult = $adb->pquery("SELECT ruleid, sequence FROM vtiger_mailscanner_rules WHERE ruleid = ? or ruleid = ?", + Array($ruleid1, $ruleid2)); + $rule_partinfo = Array(); + if($adb->num_rows($ruleresult) != 2) { + return false; + } else { + $rule_partinfo[$adb->query_result($ruleresult, 0, 'ruleid')] = $adb->query_result($ruleresult, 0, 'sequence'); + $rule_partinfo[$adb->query_result($ruleresult, 1, 'ruleid')] = $adb->query_result($ruleresult, 1, 'sequence'); + $adb->pquery("UPDATE vtiger_mailscanner_rules SET sequence = ? WHERE ruleid = ?", Array($rule_partinfo[$ruleid2], $ruleid1)); + $adb->pquery("UPDATE vtiger_mailscanner_rules SET sequence = ? WHERE ruleid = ?", Array($rule_partinfo[$ruleid1], $ruleid2)); + } + } + + /** + * Update rule information in database. + */ + function update() { + global $adb; + if($this->ruleid) { + $adb->pquery("UPDATE vtiger_mailscanner_rules SET scannerid=?,fromaddress=?,toaddress=?,subjectop=?,subject=?,bodyop=?,body=?,matchusing=? + WHERE ruleid=?", Array($this->scannerid, $this->fromaddress, $this->toaddress, $this->subjectop, $this->subject, + $this->bodyop, $this->body,$this->matchusing, $this->ruleid)); + } else { + $this->sequence = $this->__nextsequence(); + $adb->pquery("INSERT INTO vtiger_mailscanner_rules(scannerid,fromaddress,toaddress,subjectop,subject,bodyop,body,matchusing,sequence) + VALUES(?,?,?,?,?,?,?,?,?)", + Array($this->scannerid,$this->fromaddress,$this->toaddress,$this->subjectop,$this->subject, + $this->bodyop,$this->body,$this->matchusing,$this->sequence)); + $this->ruleid = $adb->database->Insert_ID(); + } + } + + /** + * Get next sequence to use + */ + function __nextsequence() { + global $adb; + $seqres = $adb->pquery("SELECT max(sequence) AS max_sequence FROM vtiger_mailscanner_rules", Array()); + $maxsequence = 0; + if($adb->num_rows($seqres)) { + $maxsequence = $adb->query_result($seqres, 0, 'max_sequence'); + } + ++$maxsequence; + return $maxsequence; + } + + /** + * Delete the rule and associated information. + */ + function delete() { + global $adb; + if($this->ruleid) { + $adb->pquery("DELETE FROM vtiger_mailscanner_ruleactions WHERE ruleid = ?", Array($this->ruleid)); + $adb->pquery("DELETE FROM vtiger_mailscanner_rules WHERE ruleid=?", Array($this->ruleid)); + } + } + + /** + * Update action linked to the rule. + */ + function updateAction($actionid, $actiontext) { + $action = $this->useaction; + + if($actionid != '' && $actiontext == '') { + if($action) $action->delete(); + } else { + if($actionid == '') { + $action = new Vtiger_MailScannerAction($actionid); + } + $action->scannerid = $this->scannerid; + $action->update($this->ruleid, $actiontext); + } + } + + /** + * Take action on mail record + */ + function takeAction($mailscanner, $mailrecord, $matchresult) { + if(empty($this->actions)) return false; + + $action = $this->useaction; // Action is limited to One right now + return $action->apply($mailscanner, $mailrecord, $this, $matchresult); + } +} +?> diff --git a/oss/vtiger/trunk/modules/Settings/ModifyPickList.php b/oss/vtiger/trunk/modules/Settings/ModifyPickList.php new file mode 100644 index 00000000..36673c52 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ModifyPickList.php @@ -0,0 +1,242 @@ +assign("IMAGE_PATH",$image_path); + + $fieldName=vtlib_purify($_REQUEST["fieldname"]); + $fieldLabel =vtlib_purify($_REQUEST["fieldlabel"]); + $moduleName=vtlib_purify($_REQUEST["fld_module"]); + $uitype=vtlib_purify($_REQUEST["uitype"]); + $mode=vtlib_purify($_REQUEST["mode"]); + + if($moduleName == 'Events') + $temp_module_strings = return_module_language($current_language, 'Calendar'); + else + $temp_module_strings = return_module_language($current_language, $moduleName); + + $sql = "select picklistid from vtiger_picklist where name=?"; + $result = $adb->pquery($sql, array($fieldName)); + $picklistid = $adb->query_result($result,0,"picklistid"); + + if($mode == 'addnew') + { + $newValues = $_REQUEST['newValues']; + $selectedRoles = $_REQUEST['selectedRoles']; + + $newPicklist = explode(",",$newValues); + $roleIds = explode(":",$selectedRoles); + + $tableName = $adb->sql_escape_string($fieldName); + foreach($newPicklist as $key => $val) + { + $val = urldecode($val); + $picklistvalue_id = getUniquePicklistID(); + $picklist_id = $adb->getUniqueID("vtiger_".$tableName); + + $query = "insert into vtiger_".$tableName." values(?,?,?,?)"; + $params = array($picklist_id, $val, 1, $picklistvalue_id); + $adb->pquery($query, $params); + + $num_roles = count($roleIds); + for($i=0;$i<$num_roles;$i++) { + $roleid = $roleIds[$i]; + + $sql ="select max(sortid)+1 as sortid from vtiger_role2picklist left join vtiger_$tableName on vtiger_$tableName.picklist_valueid=vtiger_role2picklist.picklistvalueid where roleid=? and picklistid=?"; + $sortid = $adb->query_result($adb->pquery($sql, array($roleid, $picklistid)),0,'sortid'); + if ($sortid == '') { + $sortid = 0; + } + + $sql = "insert into vtiger_role2picklist values(?,?,?,?)"; + $adb->pquery($sql, array($roleid, $picklistvalue_id, $picklistid, $sortid)); + } + } + echo ":#:SUCCESS"; + exit; + } + if($mode == 'replace') + { + $mode_type = $_REQUEST['mode_type']; + $replaceWith = addslashes($_REQUEST['replaceFields']); + if($replaceWith == '--None--') + { + $replaceWith=''; + } + $selectedFields = $_REQUEST['selectedFields']; + $unwantedPicklist = explode(',',$selectedFields); + + $selectedRoles = $_REQUEST['selectedRoles']; + $roleIds = explode(":",$selectedRoles); + + foreach($unwantedPicklist as $key => $val) + { + $qry="select tablename,columnname,uitype from vtiger_field where fieldname=?"; + $result = $adb->pquery($qry, array($fieldName)); + $num = $adb->num_rows($result); + $val = urldecode($val); + if($num > 0) + { + for($n=0;$n<$num;$n++) + { + $table_name = $adb->query_result($result,$n,'tablename'); + $column_name = $adb->query_result($result,$n,'columnname'); + if ($mode_type == 'delete') { + $update_picklist = "update $table_name set $column_name=? where $column_name=?"; + $adb->pquery($update_picklist, array($replaceWith, $val)); + + $dele_pick_val =" delete from vtiger_role2picklist where picklistvalueid in (select picklist_valueid from vtiger_$fieldName where $fieldName=?)"; + $adb->pquery($dele_pick_val, array($val)); + + $del_qry = "delete from vtiger_$fieldName where $fieldName=?"; + $adb->pquery($del_qry, array($val)); + } + if($mode_type == 'edit') { + $sel_qry = "select $fieldName from vtiger_$fieldName where $fieldName = ?"; + $cnt_res = $adb->pquery($sel_qry, array($replaceWith)); + if ($adb->num_rows($cnt_res) <= 0) { // Avoid inserting duplicate entries for the new picklist value + $picklistvalue_id = getUniquePicklistID(); + $picklist_id = $adb->getUniqueID("vtiger_$fieldName"); + $query = "insert into vtiger_$fieldName values(?,?,?,?)"; + $params = array($picklist_id, $replaceWith, 1, $picklistvalue_id); + $adb->pquery($query, $params); + + $old_query = "select * from vtiger_$fieldName where $fieldName=?"; + $old_res = $adb->pquery($old_query, array($val)); + $old_picklistvalue_id = $adb->query_result($old_res, 0, 'picklist_valueid'); + + $num_roles = count($roleIds); + for($i=0;$i<$num_roles;$i++) { + $roleid = $roleIds[$i]; + + $upd_qry = "update vtiger_role2picklist set picklistvalueid=? where picklistvalueid=? and picklistid=? and roleid=?"; + $adb->pquery($upd_qry, array($picklistvalue_id, $old_picklistvalue_id, $picklistid, $roleid)); + } + } + } + } + } + } + echo ":#:SUCCESS"; + exit; + + } + if(isset($fieldName)) + { + $fieldName = $adb->sql_escape_string($fieldName); + $sql="select $fieldName from vtiger_$fieldName where presence=1 and $fieldName <> '--None--'"; + $res = $adb->query($sql); + $RowCount = $adb->num_rows($res); + if($RowCount > 0) + { + for($i=0;$i<$RowCount;$i++) + { + $pick_val = $adb->query_result($res,$i,$fieldName); + if($temp_module_strings[$pick_val] != '') + { + $pick[]=$temp_module_strings[$pick_val]; + }else + { + $pick[]=$pick_val; + } + } + } + + $nonEdit ="select $fieldName from vtiger_$fieldName where presence=0"; + $res_ult = $adb->query($nonEdit); + $non_editNum = $adb->num_rows($res_ult); + if($non_editNum > 0) + { + for($l=0;$l<$non_editNum;$l++) + { + $non_val = $adb->query_result($res_ult,$l,$fieldName); + if($temp_module_strings[$non_val] != '') + { + $non_pick[]=$temp_module_strings[$non_val]; + } + else + { + $non_pick[]=$non_val; + } + } + } + if(is_array($non_pick)) + $smarty->assign('NONEDIT_FLAG','true'); + else + $smarty->assign('NONEDIT_FLAG','false'); + + + $smarty->assign('NONEDITPICKLIST',$non_pick); + + + if($mode == "transfer") + { + $option=''; + $selectedFields = $_REQUEST['selectedFields']; + $pick_arr = explode(",",$_REQUEST['selectedFields']); + foreach($pick_arr as $v) + { + $v = urldecode($v); + $pick_arr2[] = "'".addslashes($v)."'"; + } + $pick_str = implode(",",$pick_arr2); + $sql="select $fieldName from vtiger_$fieldName where $fieldName not in ($pick_str)"; + $res=$adb->query($sql); + $num_Rows = $adb->num_rows($res); + if($num_Rows > 0) + { + for($j=0;$j<$num_Rows;$j++) + { + $avail_entries = $adb->query_result($res,$j,$fieldName); + if($temp_module_strings[$avail_entries] != '') + { + $option .= ""; + }else + $option .= ""; + } + } + + + + $output=" + + + + +
    ".$mod_strings['LBL_PICKLIST_TRANSFER']."\"".$fieldLabel."\"
    ".$mod_strings['LBL_REPLACE_VALUE_WITH'].":
     
    "; + + $smarty->assign("OUTPUT",$output); + } + + $temp_label = getTranslatedString($fieldLabel); + $roleDetails=getAllRoleDetails(); + // Remove Organization from the list of roles (which is the first one in the list of roles) + array_shift($roleDetails); + $smarty->assign("FIELDNAME",$fieldName); + $smarty->assign("FIELDLABEL",$temp_label); + $smarty->assign("MODE",$mode); + $smarty->assign("MODULE",$moduleName); + $smarty->assign("PICKVAL",$pick); + $smarty->assign("ROLEDETAILS",$roleDetails); + $smarty->assign("MOD", return_module_language($current_language,'Settings')); + $smarty->assign("APP",$app_strings); + $smarty->display("Settings/ModifyPickList.tpl"); + } + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/ModuleManager.php b/oss/vtiger/trunk/modules/Settings/ModuleManager.php new file mode 100644 index 00000000..62e885ae --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ModuleManager.php @@ -0,0 +1,81 @@ +assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", "themes/$theme/images/"); + + $module_disable = $_REQUEST['module_disable']; + $module_name = $_REQUEST['module_name']; + $module_enable = $_REQUEST['module_enable']; + $module_type = $_REQUEST['module_type']; + + if($module_name != '') { + if($module_type == 'language') { + if($module_enable == 'true') vtlib_toggleLanguageAccess($module_name, true); + if($module_disable== 'true') vtlib_toggleLanguageAccess($module_name, false); + } else { + if($module_enable == 'true') vtlib_toggleModuleAccess($module_name, true); + if($module_disable== 'true') vtlib_toggleModuleAccess($module_name, false); + } + } + + // Check write permissions on the required directories + $dir_notwritable = Array(); + if(!vtlib_isDirWriteable('test/vtlib')) $dir_notwritable[] = 'test/vtlib'; + if(!vtlib_isDirWriteable('cron/modules')) $dir_notwritable[] = 'cron/modules'; + if(!vtlib_isDirWriteable('modules')) $dir_notwritable[] = 'modules'; + if(!vtlib_isDirWriteable('Smarty/templates/modules')) $dir_notwritable[] = 'Smarty/templates/modules'; + + $smarty->assign("DIR_NOTWRITABLE_LIST", $dir_notwritable); + // END + + $smarty->assign("TOGGLE_MODINFO", vtlib_getToggleModuleInfo()); + $smarty->assign("TOGGLE_LANGINFO", vtlib_getToggleLanguageInfo()); + + if($_REQUEST['mode'] !='') $mode = $_REQUEST['mode']; + $smarty->assign("MODE", vtlib_purify($mode)); + + if($_REQUEST['ajax'] != 'true') $smarty->display('Settings/ModuleManager/ModuleManager.tpl'); + else $smarty->display('Settings/ModuleManager/ModuleManagerAjax.tpl'); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/ModuleManager/Export.php b/oss/vtiger/trunk/modules/Settings/ModuleManager/Export.php new file mode 100644 index 00000000..e634390f --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ModuleManager/Export.php @@ -0,0 +1,19 @@ +export(Vtiger_Module::getInstance($module_export),'',"$module_export.zip",true); +exit; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/ModuleManager/Import.php b/oss/vtiger/trunk/modules/Settings/ModuleManager/Import.php new file mode 100644 index 00000000..a77cfb47 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ModuleManager/Import.php @@ -0,0 +1,89 @@ +assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", "themes/$theme/images/"); + +global $modulemanager_uploaddir; // Defined in modules/Settings/ModuleManager.php + +if($module_import_step == 'Step2') { + if(!is_dir($modulemanager_uploaddir)) mkdir($modulemanager_uploaddir); + $uploadfile = "usermodule_". time() . ".zip"; + $uploadfilename = "$modulemanager_uploaddir/$uploadfile"; + checkFileAccess($modulemanager_uploaddir); + + if(!move_uploaded_file($_FILES['module_zipfile']['tmp_name'], $uploadfilename)) { + $smarty->assign("MODULEIMPORT_FAILED", "true"); + } else { + $package = new Vtiger_Package(); + $moduleimport_name = $package->getModuleNameFromZip($uploadfilename); + + if($moduleimport_name == null) { + $smarty->assign("MODULEIMPORT_FAILED", "true"); + $smarty->assign("MODULEIMPORT_FILE_INVALID", "true"); + } else { + + if(!$package->isLanguageType()) { + $moduleInstance = Vtiger_Module::getInstance($moduleimport_name); + $moduleimport_exists=($moduleInstance)? "true" : "false"; + $moduleimport_dir_name="modules/$moduleimport_name"; + $moduleimport_dir_exists= (is_dir($moduleimport_dir_name)? "true" : "false"); + + $smarty->assign("MODULEIMPORT_EXISTS", $moduleimport_exists); + $smarty->assign("MODULEIMPORT_DIR", $moduleimport_dir_name); + $smarty->assign("MODULEIMPORT_DIR_EXISTS", $moduleimport_dir_exists); + } + + $moduleimport_dep_vtversion = $package->getDependentVtigerVersion(); + $moduleimport_license = $package->getLicense(); + + $smarty->assign("MODULEIMPORT_FILE", $uploadfile); + $smarty->assign("MODULEIMPORT_TYPE", $package->type()); + $smarty->assign("MODULEIMPORT_NAME", $moduleimport_name); + $smarty->assign("MODULEIMPORT_DEP_VTVERSION", $moduleimport_dep_vtversion); + $smarty->assign("MODULEIMPORT_LICENSE", $moduleimport_license); + } + } +} else if($module_import_step == 'Step3') { + $uploadfile = $_REQUEST['module_import_file']; + $uploadfilename = "$modulemanager_uploaddir/$uploadfile"; + checkFileAccess($uploadfilename); + + //$overwritedir = ($_REQUEST['module_dir_overwrite'] == 'true')? true : false; + $overwritedir = false; // Disallowing overwrites through Module Manager UI + + $importtype = $_REQUEST['module_import_type']; + if(strtolower($importtype) == 'language') { + $package = new Vtiger_Language(); + } else { + $package = new Vtiger_Package(); + } + $Vtiger_Utils_Log = true; + // NOTE: Import function will be called from Smarty to capture the log cleanly. + //$package->import($uploadfilename, $overwritedir); + //unlink($uploadfilename); + $smarty->assign("MODULEIMPORT_PACKAGE", $package); + $smarty->assign("MODULEIMPORT_DIR_OVERWRITE", $overwritedir); + $smarty->assign("MODULEIMPORT_PACKAGE_FILE", $uploadfilename); +} + +$smarty->display("Settings/ModuleManager/ModuleImport$module_import_step.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/ModuleManager/Update.php b/oss/vtiger/trunk/modules/Settings/ModuleManager/Update.php new file mode 100644 index 00000000..5a278830 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ModuleManager/Update.php @@ -0,0 +1,106 @@ +assign("MOD",$mod_strings); +$smarty->assign("APP",$app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", "themes/$theme/images/"); + +global $modulemanager_uploaddir; // Defined in modules/Settings/ModuleManager.php + +$target_modulename = $_REQUEST['target_modulename']; + +if($module_update_step == 'Step2') { + if(!is_dir($modulemanager_uploaddir)) mkdir($modulemanager_uploaddir); + $uploadfile = "usermodule_". time() . ".zip"; + $uploadfilename = "$modulemanager_uploaddir/$uploadfile"; + checkFileAccess($modulemanager_uploaddir); + + if(!move_uploaded_file($_FILES['module_zipfile']['tmp_name'], $uploadfilename)) { + $smarty->assign("MODULEUPDATE_FAILED", "true"); + } else { + $package = new Vtiger_Package(); + $moduleupdate_name = $package->getModuleNameFromZip($uploadfilename); + + if($moduleupdate_name == null) { + $smarty->assign("MODULEUPDATE_FAILED", "true"); + $smarty->assign("MODULEUPDATE_FILE_INVALID", "true"); + } else if(!$package->isLanguageType() && ($moduleupdate_name != $target_modulename)) { + $smarty->assign("MODULEUPDATE_FAILED", "true"); + $smarty->assign("MODULEUPDATE_NAME_MISMATCH", "true"); + } else if($package->isLanguageType() && (trim($package->xpath_value('prefix')) != $target_modulename)) { + $smarty->assign("MODULEUPDATE_FAILED", "true"); + $smarty->assign("MODULEUPDATE_NAME_MISMATCH", "true"); + } else { + + $moduleupdate_dep_vtversion = $package->getDependentVtigerVersion(); + $moduleupdate_license = $package->getLicense(); + $moduleupdate_version = $package->getVersion(); + + if(!$package->isLanguageType()) { + $moduleInstance = Vtiger_Module::getInstance($moduleupdate_name); + $moduleupdate_exists=($moduleInstance)? "true" : "false"; + $moduleupdate_dir_name="modules/$moduleupdate_name"; + $moduleupdate_dir_exists= (is_dir($moduleupdate_dir_name)? "true" : "false"); + + $smarty->assign("MODULEUPDATE_CUR_VERSION", ($moduleInstance? $moduleInstance->version : '')); + $smarty->assign("MODULEUPDATE_NOT_EXISTS", !($moduleupdate_exists)); + $smarty->assign("MODULEUPDATE_DIR", $moduleupdate_dir_name); + $smarty->assign("MODULEUPDATE_DIR_NOT_EXISTS", !($moduleupdate_dir_exists)); + + // If version is matching, dis-allow migration + if(version_compare($moduleupdate_version, $moduleInstance->version, '=')) { + $smarty->assign("MODULEUPDATE_FAILED", "true"); + $smarty->assign("MODULEUPDATE_SAME_VERSION", "true"); + } + } + + $smarty->assign("MODULEUPDATE_FILE", $uploadfile); + $smarty->assign("MODULEUPDATE_TYPE", $package->type()); + $smarty->assign("MODULEUPDATE_NAME", $moduleupdate_name); + $smarty->assign("MODULEUPDATE_DEP_VTVERSION", $moduleupdate_dep_vtversion); + $smarty->assign("MODULEUPDATE_VERSION", $moduleupdate_version); + $smarty->assign("MODULEUPDATE_LICENSE", $moduleupdate_license); + } + } +} else if($module_update_step == 'Step3') { + $uploadfile = $_REQUEST['module_import_file']; + $uploadfilename = "$modulemanager_uploaddir/$uploadfile"; + checkFileAccess($uploadfilename); + + //$overwritedir = ($_REQUEST['module_dir_overwrite'] == 'true')? true : false; + $overwritedir = false; // Disallowing overwrites through Module Manager UI + + $updatetype = $_REQUEST['module_update_type']; + if(strtolower($updatetype) == 'language') { + $package = new Vtiger_Language(); + } else { + $package = new Vtiger_Package(); + } + $Vtiger_Utils_Log = true; + // NOTE: Import function will be called from Smarty to capture the log cleanly. + //$package->update($moduleInstance, $uploadfilename); + //unlink($uploadfilename); + $smarty->assign("MODULEUPDATE_PACKAGE", $package); + $smarty->assign("MODULEUPDATE_TARGETINSTANCE", Vtiger_Module::getInstance($target_modulename)); + $smarty->assign("MODULEUPDATE_PACKAGE_FILE", $uploadfilename); +} + +$smarty->display("Settings/ModuleManager/ModuleUpdate$module_update_step.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/OrgSharingDetailView.php b/oss/vtiger/trunk/modules/Settings/OrgSharingDetailView.php new file mode 100644 index 00000000..3e406d5c --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/OrgSharingDetailView.php @@ -0,0 +1,163 @@ + $def_perr) +{ + + $entity_name = getTabname($tab_id); + if($tab_id == 6) + { + $cont_name = getTabname(4); + $entity_name .= ' & '.$cont_name; + } + + $entity_perr = getDefOrgShareActionName($def_perr); + + $access_privileges[] = $entity_name; + $access_privileges[] = $entity_perr; + if($entity_perr != 'Private') + $access_privileges[] = $mod_strings['LBL_USR_CAN_ACCESS'] .str_replace('Public:','',$mod_strings[$entity_perr]). $mod_strings['LBL_USR_OTHERS'] . $app_strings[$entity_name]; + else + $access_privileges[] = $mod_strings['LBL_USR_CANNOT_ACCESS'] . $app_strings[$entity_name]; + $row++; +} +$access_privileges=array_chunk($access_privileges,3); +$smarty->assign("DEFAULT_SHARING", $access_privileges); + +$custom_access = array(); +//Lead Sharing +$custom_access['Leads'] = getSharingRuleList('Leads'); + +//Account Sharing +$custom_access['Accounts'] = getSharingRuleList('Accounts'); + +//Potential Sharing +$custom_access['Potentials'] = getSharingRuleList('Potentials'); + +//HelpDesk Sharing +$custom_access['HelpDesk'] = getSharingRuleList('HelpDesk'); + +//Email Sharing +//$custom_access['Emails'] = getSharingRuleList('Emails'); + +//Campaign Sharing +$custom_access['Campaigns'] = getSharingRuleList('Campaigns'); + +//Quotes Sharing +$custom_access['Quotes'] = getSharingRuleList('Quotes'); + +//Purchase Order Sharing +$custom_access['PurchaseOrder'] = getSharingRuleList('PurchaseOrder'); + +//Sales Order Sharing +$custom_access['SalesOrder'] = getSharingRuleList('SalesOrder'); + +//Invoice Sharing +$custom_access['Invoice'] = getSharingRuleList('Invoice'); + +//Document Sharing +$custom_access['Documents'] = getSharingRuleList('Documents'); + +// Look up for modules for which sharing access is enabled. +// NOTE: Accounts and Contacts has been couple, so we need to elimiate Contacts also +$othermodules = getSharingModuleList(Array('Contacts')); +if(!empty($othermodules)) { + foreach($othermodules as $moduleresname) { + if(!isset($custom_access[$moduleresname])) { + $custom_access[$moduleresname] = getSharingRuleList($moduleresname); + } + } +} + +$smarty->assign("MODSHARING", $custom_access); + +/** returns the list of sharing rules for the specified module + * @param $module -- Module Name:: Type varchar + * @returns $access_permission -- sharing rules list info array:: Type array + * + */ +function getSharingRuleList($module) +{ + global $adb,$mod_strings; + + $tabid=getTabid($module); + $dataShareTableArray=getDataShareTableandColumnArray(); + + $i=1; + $access_permission = array(); + foreach($dataShareTableArray as $table_name => $colName) + { + + $colNameArr=explode("::",$colName); + $query = "select ".$table_name.".* from ".$table_name." inner join vtiger_datashare_module_rel on ".$table_name.".shareid=vtiger_datashare_module_rel.shareid where vtiger_datashare_module_rel.tabid=?"; + $result=$adb->pquery($query, array($tabid)); + $num_rows=$adb->num_rows($result); + + $share_colName=$colNameArr[0]; + $share_modType=getEntityTypeFromCol($share_colName); + + $to_colName=$colNameArr[1]; + $to_modType=getEntityTypeFromCol($to_colName); + + for($j=0;$j<$num_rows;$j++) + { + $shareid=$adb->query_result($result,$j,"shareid"); + $share_id=$adb->query_result($result,$j,$share_colName); + $to_id=$adb->query_result($result,$j,$to_colName); + $permission = $adb->query_result($result,$j,'permission'); + + $share_ent_disp = getEntityDisplayLink($share_modType,$share_id); + $to_ent_disp = getEntityDisplayLink($to_modType,$to_id); + + if($permission == 0) + { + $perr_out = $mod_strings['Read Only ']; + } + elseif($permission == 1) + { + $perr_out = $mod_strings['Read/Write']; + } + + $access_permission [] = $shareid; + $access_permission [] = $share_ent_disp; + $access_permission [] = $to_ent_disp; + $access_permission [] = $perr_out; + + $i++; + } + + } + if(is_array($access_permission)) + $access_permission = array_chunk($access_permission,4); + return $access_permission; +} +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); + +$smarty->display("OrgSharingDetailView.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Settings/OrganizationConfig.php b/oss/vtiger/trunk/modules/Settings/OrganizationConfig.php new file mode 100644 index 00000000..de7d6dcf --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/OrganizationConfig.php @@ -0,0 +1,95 @@ +pquery($sql, array()); +$organization_name = $adb->query_result($result,0,'organizationname'); +$organization_address= $adb->query_result($result,0,'address'); +$organization_city = $adb->query_result($result,0,'city'); +$organization_state = $adb->query_result($result,0,'state'); +$organization_code = $adb->query_result($result,0,'code'); +$organization_country = $adb->query_result($result,0,'country'); +$organization_phone = $adb->query_result($result,0,'phone'); +$organization_fax = $adb->query_result($result,0,'fax'); +$organization_website = $adb->query_result($result,0,'website'); +//Handle for allowed organation logo/logoname likes UTF-8 Character +$organization_logo = decode_html($adb->query_result($result,0,'logo')); +$organization_logoname = decode_html($adb->query_result($result,0,'logoname')); + +if (isset($organization_name)) + $smarty->assign("ORGANIZATIONNAME",$organization_name); +if (isset($organization_address)) + $smarty->assign("ORGANIZATIONADDRESS",$organization_address); +if (isset($organization_city)) + $smarty->assign("ORGANIZATIONCITY",$organization_city); +if (isset($organization_state)) + $smarty->assign("ORGANIZATIONSTATE",$organization_state); +if (isset($organization_code)) + $smarty->assign("ORGANIZATIONCODE",$organization_code); +if (isset($organization_country)) + $smarty->assign("ORGANIZATIONCOUNTRY",$organization_country); +if (isset($organization_phone)) + $smarty->assign("ORGANIZATIONPHONE",$organization_phone); +if (isset($organization_fax)) + $smarty->assign("ORGANIZATIONFAX",$organization_fax); +if (isset($organization_website)) + $smarty->assign("ORGANIZATIONWEBSITE",$organization_website); +if (isset($organization_logo)) + $smarty->assign("ORGANIZATIONLOGO",$organization_logo); + +$path = "test/logo"; +$dir_handle = @opendir($path) or die("Unable to open directory $path"); + +while ($file = readdir($dir_handle)) +{ + $filetyp =str_replace(".",'',strtolower(substr($file, -4))); + if($organization_logoname==$file) + { + if ($filetyp == 'jpeg' OR $filetyp == 'jpg' OR $filetyp == 'png') + { + if($file!="." && $file!="..") + { + + $organization_logopath= $path; + $logo_name=$file; + } + + } + } +} + + +if (isset($organization_logopath)) + $smarty->assign("ORGANIZATIONLOGOPATH",$path); +if (isset($organization_logoname)) + $smarty->assign("ORGANIZATIONLOGONAME",$logo_name); +closedir($dir_handle); + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->display('Settings/CompanyInfo.tpl'); +?> diff --git a/oss/vtiger/trunk/modules/Settings/OrganizationTermsandConditions.php b/oss/vtiger/trunk/modules/Settings/OrganizationTermsandConditions.php new file mode 100644 index 00000000..b2edd44c --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/OrganizationTermsandConditions.php @@ -0,0 +1,46 @@ +pquery($sql, array()); +$inventory_id = $adb->query_result($result,0,'id'); +$inventory_type = $adb->query_result($result,0,'type'); +$inventory_tandc = $adb->query_result($result,0,'tandc'); + +if(!isset($_REQUEST['inv_terms_mode'])) + $inventory_tandc = nl2br($inventory_tandc); + +if (isset($inventory_tandc)) + $smarty->assign("INV_TERMSANDCONDITIONS",$inventory_tandc); +if(isset($_REQUEST['inv_terms_mode']) && $_REQUEST['inv_terms_mode'] != '') + $smarty->assign("INV_TERMS_MODE",vtlib_purify($_REQUEST['inv_terms_mode'])); +else + $smarty->assign("INV_TERMS_MODE",'view'); + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->display("Settings/InventoryTerms.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/ProxyServerConfig.php b/oss/vtiger/trunk/modules/Settings/ProxyServerConfig.php new file mode 100644 index 00000000..717a787c --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ProxyServerConfig.php @@ -0,0 +1,61 @@ +assign("ERROR_MSG",''.$mod_strings[vtlib_purify($_REQUEST["error"])].''); + else + $smarty->assign("ERROR_MSG",''.vtlib_purify($_REQUEST["error"]).''); +} +$sql="select * from vtiger_systems where server_type = ?"; +$result = $adb->pquery($sql, array('proxy')); +$server = $adb->query_result($result,0,'server'); +$server_port = $adb->query_result($result,0,'server_port'); +$server_username = $adb->query_result($result,0,'server_username'); +$server_password = $adb->query_result($result,0,'server_password'); + +if(isset($_REQUEST['proxy_server_mode']) && $_REQUEST['proxy_server_mode'] != '') + $smarty->assign("PROXY_SERVER_MODE",vtlib_purify($_REQUEST['proxy_server_mode'])); +else + $smarty->assign("PROXY_SERVER_MODE",'view'); +if(isset($_REQUEST['server'])) + $smarty->assign("PROXYSERVER",vtlib_purify($_REQUEST['server'])); +elseif (isset($server)) + $smarty->assign("PROXYSERVER",$server); +if (isset($_REQUEST['port'])) + $smarty->assign("PROXYPORT",vtlib_purify($_REQUEST['port'])); +elseif (isset($server_port)) + $smarty->assign("PROXYPORT",$server_port); +if (isset($_REQUEST['server_user'])) + $smarty->assign("PROXYUSER",vtlib_purify($_REQUEST['server_user'])); +elseif (isset($server_username)) + $smarty->assign("PROXYUSER",$server_username); +if (isset($server_password)) + $smarty->assign("PROXYPASSWORD",$server_password); + + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->display("Settings/ProxyServer.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Settings/RoleDeleteStep1.php b/oss/vtiger/trunk/modules/Settings/RoleDeleteStep1.php new file mode 100644 index 00000000..0b49acbc --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/RoleDeleteStep1.php @@ -0,0 +1,36 @@ +assign("APP", $app_strings); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("CMOD", $mod_strings); +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("IMAGE_PATH",$image_path); + +$smarty->assign("ROLEID", $delete_role_id); +$smarty->assign("ROLENAME", $delete_role_name); +$opt = ''; +$smarty->assign("ROLEPOPUPBUTTON", $opt); +$smarty->display("DeleteRole.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/RoleDetailView.php b/oss/vtiger/trunk/modules/Settings/RoleDetailView.php new file mode 100644 index 00000000..5a8f403e --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/RoleDetailView.php @@ -0,0 +1,91 @@ +$profileName) + { + $profileinfo[]=$profileId; + $profileinfo[]=$profileName; + $profileList .= ''.$profileName.''; + } + $profileinfo=array_chunk($profileinfo,2); + + //Constructing the Users List + $userinfo = Array(); + foreach($roleUserArr as $userId=>$userName) + { + $userinfo[]= $userId; + $userinfo[]= $userName; + $userList .= ''.$userName.''; + } + $userinfo=array_chunk($userinfo,2); + + //Check for Current User + global $current_user; + $current_role = fetchUserRole($current_user->id); + $return_data = Array('profileinfo'=>$profileinfo,'userinfo'=>$userinfo); + return $return_data; +} + +if(isset($_REQUEST['roleid']) && $_REQUEST['roleid'] != '') +{ + $roleid= vtlib_purify($_REQUEST['roleid']); + $mode = vtlib_purify($_REQUEST['mode']); + $roleInfo=getRoleInformation($roleid); + $thisRoleDet=$roleInfo[$roleid]; + $rolename = $thisRoleDet[0]; + $parent = $thisRoleDet[3]; + //retreiving the vtiger_profileid + $roleRelatedProfiles=getRoleRelatedProfiles($roleid); + +} +$parentname=getRoleName($parent); +//Retreiving the Role Info +$roleInfoArr=getRoleInformation($roleid); +$rolename=$roleInfoArr[$roleid][0]; +$smarty->assign("ROLE_NAME",$rolename); +$smarty->assign("ROLEID",$roleid); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("ROLEINFO",getStdOutput($roleid)); +$smarty->assign("PARENTNAME",$parentname); + +$smarty->display("RoleDetailView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/Save.php b/oss/vtiger/trunk/modules/Settings/Save.php new file mode 100644 index 00000000..a4854cd1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/Save.php @@ -0,0 +1,173 @@ +query_result($adb->pquery($sql, array($server_type)),0,"id"); + +if($server_type == 'proxy') +{ + $action = 'ProxyServerConfig&proxy_server_mode=edit'; + if (!$sock =@fsockopen($server, $port, $errno, $errstr, 30)) + { + $error_str = 'error=Unable to connect "'.$server.':'.$port.'"'; + $db_update = false; + }else + { + $url = "http://www.google.co.in"; + $proxy_cont = ''; + $sock = fsockopen($server, $port); + if (!$sock) {return false;} + fputs($sock, "GET $url HTTP/1.0\r\nHost: $server\r\n"); + fputs($sock, "Proxy-Authorization: Basic " . base64_encode ("$server_username:$server_password") . "\r\n\r\n"); + while(!feof($sock)) {$proxy_cont .= fread($sock,4096);} + fclose($sock); + $proxy_cont = substr($proxy_cont, strpos($proxy_cont,"\r\n\r\n")+4); + + if(substr_count($proxy_cont, "Cache Access Denied") > 0) + { + $error_str = 'error=LBL_PROXY_AUTHENTICATION_REQUIRED'; + $db_update = false; + } + else + { + $action = 'ProxyServerConfig'; + } + } +} + +if($server_type == 'ftp_backup') +{ + $action = 'BackupServerConfig&bkp_server_mode=edit&server='.$server.'&server_user='.$server_username.'&password='.$server_password; + if(!function_exists('ftp_connect')){ + $error_str = 'error=FTP support is not enabled.'; + $db_update = false; + }else + { + $conn_id = @ftp_connect($server); + if(!$conn_id) + { + $error_str = 'error=Unable to connect "'.$server.'"'; + $db_update = false; + }else + { + if(!@ftp_login($conn_id, $server_username, $server_password)) + { + $error_str = 'error=Couldn\'t connect to "'.$server.'" as user "'.$server_username.'"'; + $db_update = false; + } + else + { + $action = 'BackupServerConfig'; + } + ftp_close($conn_id); + } + } +} +if($server_type == 'local_backup') +{ + $action = 'BackupServerConfig&local_server_mode=edit&server_path="'.$server_path.'"'; + if(!is_dir($server_path)){ + $error_str = 'error1=Folder doesnt Exist or Specified a path which is not a folder'; + $db_update = false; + }else + { + if(!is_writable($server_path)) + { + $error_str = 'error1=Access Denied to write to "'.$server_path.'"'; + $db_update = false; + }else + { + $action = 'BackupServerConfig'; + } + } +} +if($server_type == 'proxy' || $server_type == 'ftp_backup' || $server_type == 'local_backup') +{ + if($db_update) + { + if($id=='') { + $id = $adb->getUniqueID('vtiger_systems'); + $sql="insert into vtiger_systems values(?,?,?,?,?,?,?,?)"; + $params = array($id, $server, $port, $server_username, $server_password, $server_type, $smtp_auth,$server_path); + } + else { + $sql="update vtiger_systems set server = ?, server_username = ?, server_password = ?, smtp_auth= ?, server_type = ?, server_port= ?, server_path = ? where id = ?"; + $params = array($server, $server_username, $server_password, $smtp_auth, $server_type, $port, $server_path, $id); + } + $adb->pquery($sql, $params); + } +} +//Added code to send a test mail to the currently logged in user +if($server_type != 'ftp_backup' && $server_type != 'proxy' && $server_type != 'local_backup') +{ + require_once("modules/Emails/mail.php"); + global $current_user; + + $to_email = getUserEmailId('id',$current_user->id); + $from_email = $to_email; + $subject = 'Test mail about the mail server configuration.'; + $description = 'Dear '.$current_user->user_name.',

    This is a test mail sent to confirm if a mail is actually being sent through the smtp server that you have configured.
    Feel free to delete this mail.

    Thanks and Regards,
    Team vTiger

    '; + if($to_email != '') + { + $mail_status = send_mail('Users',$to_email,$current_user->user_name,$from_email,$subject,$description); + $mail_status_str = $to_email."=".$mail_status."&&&"; + } + else + { + $mail_status_str = "'".$to_email."'=0&&&"; + } + $error_str = getMailErrorString($mail_status_str); + $action = 'EmailConfig'; + if($mail_status != 1) { + $action = 'EmailConfig&emailconfig_mode=edit&server_name='. + vtlib_purify($_REQUEST['server']).'&server_user='. + vtlib_purify($_REQUEST['server_username']).'&auth_check='. + vtlib_purify($_REQUEST['smtp_auth']); + } + else{ + if($db_update) + { + if($id=='') { + $id = $adb->getUniqueID("vtiger_systems"); + $sql="insert into vtiger_systems values(?,?,?,?,?,?,?,?)"; + $params = array($id, $server, $port, $server_username, $server_password, $server_type, $smtp_auth, ''); + } else { + $sql="update vtiger_systems set server=?, server_username=?, server_password=?, smtp_auth=?, server_type=?, server_port=? where id=?"; + $params = array($server, $server_username, $server_password, $smtp_auth, $server_type, $port, $id); + } + $adb->pquery($sql, $params); + } + } +} +//While configuring Proxy settings, the submitted values will be retained when exception is thrown - dina +if($server_type == 'proxy' && $error_str != '') +{ + header("Location: index.php?module=Settings&parenttab=Settings&action=$action&server=$server&port=$port&server_username=$server_username&$error_str"); +} +else +{ + header("Location: index.php?module=Settings&parenttab=Settings&action=$action&$error_str"); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/SaveAuditTrail.php b/oss/vtiger/trunk/modules/Settings/SaveAuditTrail.php new file mode 100644 index 00000000..49b0acd1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SaveAuditTrail.php @@ -0,0 +1,44 @@ + diff --git a/oss/vtiger/trunk/modules/Settings/SaveCompany.php b/oss/vtiger/trunk/modules/Settings/SaveCompany.php new file mode 100644 index 00000000..637dfbf3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SaveCompany.php @@ -0,0 +1,41 @@ +pquery($sql, array($org_name)); +$org_name = $adb->query_result($result,0,'organizationname'); + +if($org_name=='') +{ + $sql="insert into vtiger_organizationdetails values(?,?,?,?,?,?,?,?,?)"; + $params = array($organization_name, $organization_address, $organization_city, $organization_state, $organization_code, $organization_country, $organization_phone, $organization_fax, $organization_website); +} +else +{ + $sql="update vtiger_organizationdetails set organizationname = ?, address = ?, city = ?, state = ?, code = ?, country = ?, phone = ?, fax = ?, website = ? where organizationname = ?"; + $params = array($organization_name, $organization_address, $organization_city, $organization_state, $organization_code, $organization_country, $organization_phone, $organization_fax, $organization_website, $org_name); +} +$adb->pquery($sql, $params); + +header("Location: index.php?module=Settings&action=OrganizationConfig"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/SaveConvertLead.php b/oss/vtiger/trunk/modules/Settings/SaveConvertLead.php new file mode 100644 index 00000000..a9928b3c --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SaveConvertLead.php @@ -0,0 +1,48 @@ +pquery($sql, array()); +$noofrows = $adb->num_rows($result); + +for($i=0;$i<$noofrows;$i++) +{ + $lead_id=$adb->query_result($result,$i,"fieldid"); + $account_id_name=$lead_id."_account"; + $contact_id_name=$lead_id."_contact"; + $potential_id_name=$lead_id."_potential"; + + $account_id_val=$_REQUEST[$account_id_name]; + $contact_id_val=$_REQUEST[$contact_id_name]; + $potential_id_val=$_REQUEST[$potential_id_name]; + + if($account_id_val=="None") + { + $account_id_val=0; + } + if($contact_id_val=="None") + { + $contact_id_val=0; + } + if($potential_id_val =="None") + { + $potential_id_val=0; + } + $update_sql="update vtiger_convertleadmapping set accountfid=?, contactfid=?, potentialfid=? where leadfid=?"; + $update_params = array($account_id_val, $contact_id_val, $potential_id_val, $lead_id); + $adb->pquery($update_sql, $update_params); +} +header("Location: index.php?action=CustomFieldList&module=Settings&parenttab=Settings"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/SaveCurrencyInfo.php b/oss/vtiger/trunk/modules/Settings/SaveCurrencyInfo.php new file mode 100644 index 00000000..8e4fd188 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SaveCurrencyInfo.php @@ -0,0 +1,43 @@ +pquery("select currency_status from vtiger_currency_info where id=?", array($_REQUEST['record'])); + $old_cur_status = $adb->query_result($cur_status_res,0,'currency_status'); + + if($currency_status != $old_cur_status && $currency_status == 'Inactive') { + $transfer_cur_id = $_REQUEST['transfer_currency_id']; + if($transfer_cur_id != null) transferCurrency($_REQUEST['record'], $transfer_cur_id); + } + + $sql = "update vtiger_currency_info set currency_name =?, currency_code =?, currency_symbol =?, conversion_rate =?,currency_status=? where id =?"; + $params = array($currency_name, $currency_code, $currency_symbol, $conversion_rate, $currency_status, $_REQUEST['record']); +} +else +{ + $sql = "insert into vtiger_currency_info values(?,?,?,?,?,?,?,?)"; + $params = array($db->getUniqueID("vtiger_currency_info"), $currency_name, $currency_code, $currency_symbol, $conversion_rate, $currency_status,'0','0'); +} +$adb->pquery($sql, $params); +$loc = "Location: index.php?module=Settings&action=CurrencyListView&parenttab=".vtlib_purify($_REQUEST['parenttab']); +header($loc); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/SaveEnableBackup.php b/oss/vtiger/trunk/modules/Settings/SaveEnableBackup.php new file mode 100644 index 00000000..72c26f94 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SaveEnableBackup.php @@ -0,0 +1,109 @@ +pquery("select * from vtiger_systems where server_type = ?", array('ftp_backup')); + $BackRowsCheck = $adb->num_rows($GetBackup); + + if($BackRowsCheck > 0) + echo "SUCCESS"; + else + echo "FAILURE"; + +} +if(isset($_REQUEST['enable_local_backup']) && $_REQUEST['enable_local_backup'] != '') +{ + global $root_directory; + $filename = $root_directory.'user_privileges/enable_backup.php'; + + $readhandle = @fopen($filename, "r+"); + + if($readhandle) + { + $buffer = ''; + $new_buffer = ''; + while(!feof($readhandle)) + { + $buffer = fgets($readhandle, 5200); + list($starter, $tmp) = explode(" = ", $buffer); + + if($starter == '$enable_local_backup' && stristr($tmp,'false')) + { + $new_buffer .= "\$enable_local_backup = 'true';\n"; + } + elseif($starter == '$enable_local_backup' && stristr($tmp,'true')) + { + $new_buffer .= "\$enable_local_backup = 'false';\n"; + } + else + $new_buffer .= $buffer; + } + fclose($readhandle); + } + + $handle = fopen($filename, "w"); + fputs($handle, $new_buffer); + fclose($handle); +} +elseif(isset($_REQUEST['GetBackupDetail']) && $_REQUEST['GetBackupDetail'] != '' && $_REQUEST['servertype'] == 'local_backup') +{ + require_once("include/database/PearDatabase.php"); + global $mod_strings,$adb; + + $GetBackup = $adb->pquery("select * from vtiger_systems where server_type = ?", array('local_backup')); + $BackRowsCheck = $adb->num_rows($GetBackup); + + if($BackRowsCheck > 0) + echo "SUCCESS"; + else + echo "FAILURE"; + +} +?> diff --git a/oss/vtiger/trunk/modules/Settings/SaveInventoryNotification.php b/oss/vtiger/trunk/modules/Settings/SaveInventoryNotification.php new file mode 100644 index 00000000..bc88fd40 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SaveInventoryNotification.php @@ -0,0 +1,23 @@ +pquery($query, $params); +} +$loc = "Location: index.php?action=SettingsAjax&file=listinventorynotifications&module=Settings&directmode=ajax"; +header($loc); +?> diff --git a/oss/vtiger/trunk/modules/Settings/SaveNotification.php b/oss/vtiger/trunk/modules/Settings/SaveNotification.php new file mode 100644 index 00000000..1a55954f --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SaveNotification.php @@ -0,0 +1,36 @@ +pquery($query, $params); + } + $loc = "Location: index.php?action=SettingsAjax&file=listnotificationschedulers&module=Settings&directmode=ajax"; + header($loc); +} +else +{ + echo ":#:FAILURE"; +} + +?> diff --git a/oss/vtiger/trunk/modules/Settings/SaveRole.php b/oss/vtiger/trunk/modules/Settings/SaveRole.php new file mode 100644 index 00000000..9e70b9af --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SaveRole.php @@ -0,0 +1,65 @@ +pquery($query, $params); + if($adb->num_rows($result) > 0) + { + echo $mod_strings['LBL_ROLENAME_EXIST']; + die; + }else + { + echo 'SUCCESS'; + die; + } + +} +$parentRoleId=$_REQUEST['parent']; +//Inserting values into Role Table +if(isset($_REQUEST['mode']) && $_REQUEST['mode'] == 'edit') +{ + $roleId = $_REQUEST['roleid']; + $selected_col_string = $_REQUEST['selectedColumnsString']; + $profile_array = explode(';',$selected_col_string); + updateRole($roleId,$rolename,$profile_array); + +} +elseif(isset($_REQUEST['mode']) && $_REQUEST['mode'] == 'create') +{ + $selected_col_string = $_REQUEST['selectedColumnsString']; + $profile_array = explode(';',$selected_col_string); + //Inserting into vtiger_role Table + $roleId = createRole($rolename,$parentRoleId,$profile_array); + if($roleId != '') + { + insertRole2Picklist($roleId,$parentRoleId); + } + +} + +$loc = "Location: index.php?action=listroles&module=Settings&parenttab=Settings"; +header($loc); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/SaveSharingRule.php b/oss/vtiger/trunk/modules/Settings/SaveSharingRule.php new file mode 100644 index 00000000..2de05b5d --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SaveSharingRule.php @@ -0,0 +1,57 @@ +$ds_rm_id) + { + $reltabname=getTabModuleName($reltabid); + $relSharePermission=$_REQUEST[$reltabname.'_accessopt']; + addRelatedModuleSharingPermission($shareId,$tabid,$reltabid,$relSharePermission); + } + +} +elseif($mode == 'edit') +{ + $shareId=$_REQUEST['shareId']; + updateSharingRule($shareId,$tabid,$share_entity_type,$to_entity_type,$share_entity_id,$to_entity_id,$module_sharing_access); + //Adding the Related ModulePermission Sharing + foreach($relatedShareModuleArr as $reltabid=>$ds_rm_id) + { + $reltabname=getTabModuleName($reltabid); + $relSharePermission=$_REQUEST[$reltabname.'_accessopt']; + updateRelatedModuleSharingPermission($shareId,$tabid,$reltabid,$relSharePermission); + } +} + +$loc = "Location: index.php?action=OrgSharingDetailView&module=Settings&parenttab=Settings"; +header($loc); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/Settings.js b/oss/vtiger/trunk/modules/Settings/Settings.js new file mode 100644 index 00000000..3fd0758c --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/Settings.js @@ -0,0 +1,8 @@ +/*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************/ diff --git a/oss/vtiger/trunk/modules/Settings/SettingsAjax.php b/oss/vtiger/trunk/modules/Settings/SettingsAjax.php new file mode 100644 index 00000000..9ea113cb --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/SettingsAjax.php @@ -0,0 +1,36 @@ +pquery($sql, array($current_user->id)); + if($adb->num_rows($is_announce) > 0) { + $query="update vtiger_announcement set announcement=?,time=?,title=? where creatorid=?"; + $params = array($announcement, $adb->formatDate($date_var, true), 'announcement', $current_user->id); + } else { + $query="insert into vtiger_announcement values (?,?,?,?)"; + $params = array($current_user->id,$announcement,'announcement',$adb->formatDate($date_var, true)); + } + $result=$adb->pquery($query, $params); + echo $announcement; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/ShowAuditTrail.php b/oss/vtiger/trunk/modules/Settings/ShowAuditTrail.php new file mode 100644 index 00000000..40cf1c24 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/ShowAuditTrail.php @@ -0,0 +1,79 @@ +pquery($qry, array($userid)); +$no_of_rows = $adb->num_rows($qry_result); + +//Retreiving the start value from request +if(isset($_REQUEST['start']) && $_REQUEST['start'] != '') { + $start = vtlib_purify($_REQUEST['start']); +} else + $start=1; + +//Retreive the Navigation array +$navigation_array = getNavigationValues($start, $no_of_rows, '100'); + +$start_rec = $navigation_array['start']; +$end_rec = $navigation_array['end_val']; +$record_string= $app_strings[LBL_SHOWING]." " .$start_rec." - ".$end_rec." " .$app_strings[LBL_LIST_OF] ." ".$no_of_rows; + +$navigationOutput = getTableHeaderNavigation($navigation_array, $url_string,"Settings","ShowAuditTrail",''); + +$smarty->assign("MOD", $current_module_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("THEME_PATH",$theme_path); +$smarty->assign("LIST_HEADER",$focus->getAuditTrailHeader()); +$smarty->assign("LIST_ENTRIES",$focus->getAuditTrailEntries($userid, $navigation_array, $sorder, $sortby)); +$smarty->assign("RECORD_COUNTS", $record_string); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("USERID", $userid); +$smarty->assign("CATEGORY",$category); + +if($_REQUEST['ajax'] !='') + $smarty->display("ShowAuditTrailContents.tpl"); +else + $smarty->display("ShowAuditTrail.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/TaxConfig.php b/oss/vtiger/trunk/modules/Settings/TaxConfig.php new file mode 100644 index 00000000..74da2ee1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/TaxConfig.php @@ -0,0 +1,243 @@ +assign("EDIT_MODE", 'true'); +} +elseif($_REQUEST['sh_edit_tax'] == 'true') +{ + $smarty->assign("SH_EDIT_MODE", 'true'); +} + +//To add tax +if($_REQUEST['add_tax_type'] == 'true') +{ + //Add the given tax name and value as a new tax type + echo addTaxType($_REQUEST['addTaxLabel'],$_REQUEST['addTaxValue']); + $getlist = true; +} +elseif($_REQUEST['sh_add_tax_type'] == 'true') +{ + echo addTaxType($_REQUEST['sh_addTaxLabel'],$_REQUEST['sh_addTaxValue'],'sh'); + $getlist = true; +} + +//To Disable ie., delete or enable +if(($_REQUEST['disable'] == 'true' || $_REQUEST['enable'] == 'true') && $_REQUEST['taxname'] != '') +{ + if($_REQUEST['disable'] == 'true') + changeDeleted($_REQUEST['taxname'],1); + else + changeDeleted($_REQUEST['taxname'],0); + $getlist = true; +} +elseif(($_REQUEST['sh_disable'] == 'true' || $_REQUEST['sh_enable'] == 'true') && $_REQUEST['sh_taxname'] != '') +{ + if($_REQUEST['sh_disable'] == 'true') + changeDeleted($_REQUEST['sh_taxname'],1,'sh'); + else + changeDeleted($_REQUEST['sh_taxname'],0,'sh'); + $getlist = true; +} + +//after done save or enable/disable or added new tax the list will be retrieved again from db +if($getlist) +{ + $tax_details = getAllTaxes(); + $sh_tax_details = getAllTaxes('all','sh'); +} + +$smarty->assign("TAX_COUNT", count($tax_details)); +$smarty->assign("SH_TAX_COUNT", count($sh_tax_details)); + +if(count($tax_details) == 0) + $smarty->assign("TAX_COUNT", 0); +if(count($sh_tax_details) == 0) + $smarty->assign("SH_TAX_COUNT", 0); + +$smarty->assign("TAX_VALUES", $tax_details); + +$smarty->assign("SH_TAX_VALUES", $sh_tax_details); + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("MOD", $mod_strings); +$smarty->display("Settings/TaxConfig.tpl"); + + +/** Function to update the list of Tax percentages for the passed tax types + * @param array $new_percentages - array of tax types and the values like [taxid]=new value ie., [1]=3.56, [2]=11.45 + * @param string $sh - sh or empty, if sh passed then update will be done in shipping and handling related table + * @return void + */ +function updateTaxPercentages($new_percentages, $sh='') +{ + global $adb, $log; + $log->debug("Entering into the function updateTaxPercentages"); + + foreach($new_percentages as $taxid => $new_val) + { + if($new_val != '') + { + if($sh != '' && $sh == 'sh') + $query = "update vtiger_shippingtaxinfo set percentage=? where taxid=?"; + else + $query = "update vtiger_inventorytaxinfo set percentage =? where taxid=?"; + $adb->pquery($query, array($new_val, $taxid)); + } + } + + $log->debug("Exiting from the function updateTaxPercentages"); +} + +/** Function to update the list of Tax Labels for the taxes + * @param array $new_labels - array of tax types and the values like [taxid]=new label ie., [1]=aa, [2]=bb + * @param string $sh - sh or empty, if sh passed then update will be done in shipping and handling related table + * @return void + */ +function updateTaxLabels($new_labels, $sh='') +{ + global $adb, $log; + $log->debug("Entering into the function updateTaxPercentages"); + + foreach($new_labels as $taxid => $new_val) + { + if($new_val != '') + { + if($sh != '' && $sh == 'sh') + $query = "update vtiger_shippingtaxinfo set taxlabel= ? where taxid=?"; + else + $query = "update vtiger_inventorytaxinfo set taxlabel = ? where taxid=?"; + $adb->pquery($query, array($new_val, $taxid)); + } + } + + $log->debug("Exiting from the function updateTaxPercentages"); +} +/** Function used to add the tax type which will do database alterations + * @param string $taxlabel - tax label name to be added + * @param string $taxvalue - tax value to be added + * @param string $sh - sh or empty , if sh passed then the tax will be added in shipping and handling related table + * @return void + */ +function addTaxType($taxlabel, $taxvalue, $sh='') +{ + global $adb, $log; + $log->debug("Entering into function addTaxType($taxlabel, $taxvalue, $sh)"); + + //First we will check whether the tax is already available or not + if($sh != '' && $sh == 'sh') + $check_query = "select taxlabel from vtiger_shippingtaxinfo where taxlabel=?"; + else + $check_query = "select taxlabel from vtiger_inventorytaxinfo where taxlabel=?"; + $check_res = $adb->pquery($check_query, array($taxlabel)); + + if($adb->num_rows($check_res) > 0) + return "This tax is already available"; + + //if the tax is not available then add this tax. + //Add this tax as a column in related table + if($sh != '' && $sh == 'sh') + { + $taxid = $adb->getUniqueID("vtiger_shippingtaxinfo"); + $taxname = "shtax".$taxid; + $query = "alter table vtiger_inventoryshippingrel add column $taxname decimal(7,3) default NULL"; + } + else + { + $taxid = $adb->getUniqueID("vtiger_inventorytaxinfo"); + $taxname = "tax".$taxid; + $query = "alter table vtiger_inventoryproductrel add column $taxname decimal(7,3) default NULL"; + } + $res = $adb->pquery($query, array()); + + //if the tax is added as a column then we should add this tax in the list of taxes + if($res) + { + if($sh != '' && $sh == 'sh') + $query1 = "insert into vtiger_shippingtaxinfo values(?,?,?,?,?)"; + else + $query1 = "insert into vtiger_inventorytaxinfo values(?,?,?,?,?)"; + + $params1 = array($taxid, $taxname, $taxlabel, $taxvalue, 0); + $res1 = $adb->pquery($query1, $params1); + } + + $log->debug("Exit from function addTaxType($taxlabel, $taxvalue)"); + if($res1) + return ''; + else + return "There may be some problem in adding the Tax type. Please try again"; +} + +/** Function used to Enable or Disable the tax type + * @param string $taxname - taxname to enable or disble + * @param int $deleted - 0 or 1 where 0 to enable and 1 to disable + * @param string $sh - sh or empty, if sh passed then the enable/disable will be done in shipping and handling tax table ie.,vtiger_shippingtaxinfo else this enable/disable will be done in Product tax table ie., in vtiger_inventorytaxinfo + * @return void + */ +function changeDeleted($taxname, $deleted, $sh='') +{ + global $log, $adb; + $log->debug("Entering into function changeDeleted($taxname, $deleted, $sh)"); + + if($sh == 'sh') + $adb->pquery("update vtiger_shippingtaxinfo set deleted=? where taxname=?", array($deleted, $taxname)); + else + $adb->pquery("update vtiger_inventorytaxinfo set deleted=? where taxname=?", array($deleted, $taxname)); + $log->debug("Exit from function changeDeleted($taxname, $deleted, $sh)"); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/UpdateComboValues.php b/oss/vtiger/trunk/modules/Settings/UpdateComboValues.php new file mode 100644 index 00000000..891a869e --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/UpdateComboValues.php @@ -0,0 +1,110 @@ +query_result($adb->pquery($sql, array($tableName)),0,'picklistid'); + +//Deleting the already existing values + +$qry="select roleid,picklistvalueid from vtiger_role2picklist left join vtiger_$tableName on vtiger_$tableName.picklist_valueid=vtiger_role2picklist.picklistvalueid where roleid=? and picklistid=? and presence=1"; +$res = $adb->pquery($qry, array($roleid, $picklistid)); +$num_row = $adb->num_rows($res); +for($s=0;$s < $num_row; $s++) +{ + $valid = $adb->query_result($res,$s,'picklistvalueid'); + $sql="delete from vtiger_role2picklist where roleid=? and picklistvalueid=?"; + $adb->pquery($sql, array($roleid, $valid)); +} + +$pickArray = explode("\n",$fldPickList); +$count = count($pickArray); + +$tabname=explode('cf_',$tableName); + +if($tabname[1]!='') + $custom=true; + +/* ticket2369 fixed */ +$columnName = $tableName; + for($i = 0; $i < $count; $i++) + { + $pickArray[$i] = trim(from_html($pickArray[$i])); + + //if UTF-8 character input given, when configuration is latin1, then avoid the entry which will cause mysql empty object exception in line 101 + $stringConvert = function_exists(iconv) ? @iconv("UTF-8",$default_charset,$pickArray[$i]) : $pickArray[$i]; + $pickArray[$i] = trim($stringConvert); + + if($pickArray[$i] != '') + { + $picklistcount=0; + //This uitype is for non-editable picklist + $sql ="select $tableName from vtiger_$tableName"; + $res = $adb->pquery($sql, array()); + $numrow = $adb->num_rows($res); + for($x=0;$x < $numrow ; $x++) + { + $picklistvalues = decode_html($adb->query_result($res,$x,$tableName)); + + // Fix For: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/5129 + global $current_language; + if($current_language != 'en_us') { + // Translate the value in database and compare with input. + if($fld_module == 'Events') $temp_module_strings = return_module_language($current_language, 'Calendar'); + else $temp_module_strings = return_module_language($current_language, $fld_module); + + $mod_picklistvalue = trim($temp_module_strings[$picklistvalues]); + if($mod_picklistvalue == $pickArray[$i]) { + $pickArray[$i] = $picklistvalues; + } + } + // End + + if($pickArray[$i] == $picklistvalues) + { + $picklistcount++; + } + + } + + if($picklistcount == 0) + { //Inserting a new pick list value to the corresponding picklist table + $picklistvalue_id = getUniquePicklistID(); + $picklist_id = $adb->getUniqueID("vtiger_".$tableName); + $query = "insert into vtiger_".$tableName." values(?,?,?,?)"; + $params = array($picklist_id, $pickArray[$i], 1, $picklistvalue_id); + + $adb->pquery($query, $params); + + } + $picklistcount =0; + $sql = "select picklist_valueid from vtiger_$tableName where $tableName=?"; + $pick_valueid = $adb->query_result($adb->pquery($sql, array($pickArray[$i])),0,'picklist_valueid'); + + //To get the max sortid for the non editable picklist and the inserting by increasing the sortid for editable values.... + $sql ="select max(sortid)+1 as sortid from vtiger_role2picklist left join vtiger_$tableName on vtiger_$tableName.picklist_valueid=vtiger_role2picklist.picklistvalueid where roleid=? and picklistid=? and presence=0"; + $sortid = $adb->query_result($adb->pquery($sql, array($roleid, $picklistid)),0,'sortid'); + + $sql = "insert into vtiger_role2picklist values(?,?,?,?)"; + $adb->pquery($sql, array($roleid, $pick_valueid, $picklistid, $sortid)); + } +} + +header("Location:index.php?action=SettingsAjax&module=Settings&directmode=ajax&file=PickList&fld_module=".$fld_module."&roleid=".$roleid); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/UpdateDefaultFieldLevelAccess.php b/oss/vtiger/trunk/modules/Settings/UpdateDefaultFieldLevelAccess.php new file mode 100644 index 00000000..fbf52328 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/UpdateDefaultFieldLevelAccess.php @@ -0,0 +1,53 @@ +$fld_name) +{ + $fieldListResult = getDefOrgFieldList($fld_module); + $noofrows = $adb->num_rows($fieldListResult); + for($i=0; $i<$noofrows; $i++) + { + $fieldid = $adb->query_result($fieldListResult,$i,"fieldid"); + $displaytype = $adb->query_result($fieldListResult,$i,"displaytype"); + $tab_id = $adb->query_result($fieldListResult,$i,"tabid"); + $visible = vtlib_purify($_REQUEST[$fieldid]); + if($visible == 'on') + { + $visible_value = 0; + } + else + { + $visible_value = 1; + } + //Updating the Mandatory vtiger_fields + $uitype = $adb->query_result($fieldListResult,$i,"uitype"); + $fieldname = $adb->query_result($fieldListResult,$i,"fieldname"); + $typeofdata = $adb->query_result($fieldListResult,$i,"typeofdata"); + $fieldtype = explode("~",$typeofdata); + if(($fieldname == "salutationtype" && $uitype == 55) || $fieldtype[1] == "M" || $uitype == 111 || $displaytype == 3|| $fieldname == "activitytype") + { + $visible_value = 0; + } + //Updating the database + $update_query = "update vtiger_def_org_field set visible=? where fieldid=? and tabid=?"; + $update_params = array($visible_value, $fieldid, $tab_id); + $adb->pquery($update_query, $update_params); + + } +} +$loc = "Location: index.php?action=DefaultFieldPermissions&module=Settings&parenttab=Settings&fld_module=".vtlib_purify($_REQUEST['fld_module']); +header($loc); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/add2db.php b/oss/vtiger/trunk/modules/Settings/add2db.php new file mode 100644 index 00000000..b71e6c3b --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/add2db.php @@ -0,0 +1,161 @@ +pquery($sql, array($org_name)); + $org_name = decode_html($adb->query_result($result,0,'organizationname')); + $org_logo = $adb->query_result($result,0,'logoname'); + + + if($org_name=='') + { + $sql="INSERT INTO vtiger_organizationdetails + (organizationname, address, city, state, code, country, phone, fax, website, logoname) values (?,?,?,?,?,?,?,?,?,?)"; + $params = array($organization_name, $organization_address, $organization_city, $organization_state, $organization_code, + $organization_country, $organization_phone, $organization_fax, $organization_website, $organization_logoname); + } + else + { + if($savelogo=="true") + { + $organization_logoname=$filename; + } + elseif($savelogo=="false" && $error_flag=="") + { + $savelogo="true"; + $organization_logoname=$_REQUEST['PREV_FILE']; + } + else + { + $organization_logoname=$_REQUEST['PREV_FILE']; + } + if($nologo_specified=="true") + { + $savelogo="true"; + $organization_logoname=$org_logo; + } + + $sql = "UPDATE vtiger_organizationdetails + SET organizationname = ?, address = ?, city = ?, state = ?, code = ?, country = ?, + phone = ?, fax = ?, website = ?, logoname = ? WHERE organizationname = ?"; + $params = array($organization_name, $organization_address, $organization_city, $organization_state, $organization_code, + $organization_country, $organization_phone, $organization_fax, $organization_website, decode_html($organization_logoname), $org_name); + } + $adb->pquery($sql, $params); + + if($savelogo=="true") + { + header("Location: index.php?parenttab=Settings&module=Settings&action=OrganizationConfig"); + } + elseif($savelogo=="false") + { + + header("Location: index.php?parenttab=Settings&module=Settings&action=EditCompanyDetails&flag=".$error_flag); + } + + + } +?> + diff --git a/oss/vtiger/trunk/modules/Settings/createemailtemplate.php b/oss/vtiger/trunk/modules/Settings/createemailtemplate.php new file mode 100644 index 00000000..0093e4f2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/createemailtemplate.php @@ -0,0 +1,44 @@ +assign("APP", $app_strings); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("THEME", $theme); +$smarty->assign("THEME_PATH", $theme_path); +$smarty->assign("UMOD", $mod_strings); +$smarty->assign("PARENTTAB", getParentTab()); +$smarty->assign("ALL_VARIABLES", $allOptions); + +$smarty->assign("MOD", $smod_strings); +$smarty->assign("MODULE", 'Settings'); + +$smarty->display("CreateEmailTemplate.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/createnewgroup.php b/oss/vtiger/trunk/modules/Settings/createnewgroup.php new file mode 100644 index 00000000..ac1ee9f1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/createnewgroup.php @@ -0,0 +1,161 @@ +parent_groups[]=$groupId; + $parGroups->getAllParentGroups($groupId); + $parentGroupArray=$parGroups->parent_groups; + + +} +else +{ + $mode = 'create'; + if(isset($_REQUEST['error']) && ($_REQUEST['error']=='true')) + { + $Err_msg = "
    ".$mod_strings['LBL_GROUP_NAME_ERROR']."
    "; + $groupInfo[] = vtlib_purify($_REQUEST['groupname']); + $groupInfo[] = vtlib_purify($_REQUEST['desc']); + } +} + + +//Constructing the Role Array +$roleDetails=getAllRoleDetails(); +$i=0; +$roleIdStr=""; +$roleNameStr=""; +$userIdStr=""; +$userNameStr=""; +$grpIdStr=""; +$grpNameStr=""; + +foreach($roleDetails as $roleId=>$roleInfo) +{ + if($i !=0) + { + if($i !=1) + { + $roleIdStr .= ", "; + $roleNameStr .= ", "; + } + + $roleName=$roleInfo[0]; + $roleIdStr .= "'".$roleId."'"; + $roleNameStr .= "'".addslashes(decode_html($roleName))."'"; + } + + $i++; +} + +//Constructing the User Array +$l=0; +$userDetails=getAllUserName(); +foreach($userDetails as $userId=>$userInfo) +{ + if($l !=0) + { + $userIdStr .= ", "; + $userNameStr .= ", "; + } + + $userIdStr .= "'".$userId."'"; + $userNameStr .= "'".$userInfo."'"; + + $l++; +} + +//Constructing the Group Array +$m=0; +$grpDetails=getAllGroupName(); +foreach($grpDetails as $grpId=>$grpName) +{ + if(! in_array($grpId,$parentGroupArray)) + { + if($m !=0) + { + $grpIdStr .= ", "; + $grpNameStr .= ", "; + } + + $grpIdStr .= "'".$grpId."'"; + $grpNameStr .= "'".addslashes(decode_html($grpName))."'"; + + $m++; + } +} +if($mode == 'edit') +{ + $member=array(); + $groupMemberArr=$groupInfo[2]; + foreach($groupMemberArr as $memberType=>$memberValue) + { + foreach($memberValue as $memberId) + { + if($memberType == 'groups') + { + $memberName=fetchGroupName($memberId); + $memberDisplay="Group::"; + } + elseif($memberType == 'roles') + { + $memberName=getRoleName($memberId); + $memberDisplay="Roles::"; + } + elseif($memberType == 'rs') + { + $memberName=getRoleName($memberId); + $memberDisplay="RoleAndSubordinates::"; + } + elseif($memberType == 'users') + { + $memberName=getUserName($memberId); + $memberDisplay="User::"; + } + $member[]=$memberType.'::'.$memberId; + $member[]=$memberDisplay.$memberName; + } + } + $smarty->assign("MEMBER", array_chunk($member,2)); +} +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("ROLEIDSTR",$roleIdStr); +$smarty->assign("ROLENAMESTR",$roleNameStr); +$smarty->assign("USERIDSTR",$userIdStr); +$smarty->assign("USERNAMESTR",$userNameStr); +$smarty->assign("GROUPIDSTR",$grpIdStr); +$smarty->assign("GROUPNAMESTR",$grpNameStr); +$smarty->assign("RETURN_ACTION",vtlib_purify($_REQUEST['returnaction'])); +$smarty->assign("GROUPID",$groupId); +$smarty->assign("MODE",$mode); +$smarty->assign("GROUPNAME",$groupInfo[0]); +$smarty->assign("DESCRIPTION",$groupInfo[1]); + +$smarty->display("GroupEditView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/createrole.php b/oss/vtiger/trunk/modules/Settings/createrole.php new file mode 100644 index 00000000..a63b1c62 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/createrole.php @@ -0,0 +1,72 @@ +assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("THEME", $theme); + +$parentname=getRoleName($parent); +$smarty->assign("RETURN_ACTION",vtlib_purify($_REQUEST['returnaction'])); +$smarty->assign("ROLEID",$roleid); +$smarty->assign("MODE",$mode); +$smarty->assign("PARENT",$parent); +$smarty->assign("PARENTNAME",$parentname); +$smarty->assign("ROLENAME",$rolename); + +$profile_entries=array(); +foreach($profDetails as $profId=>$profName) +{ + $profile_entries[]=$profId; + $profile_entries[]=$profName; +} +$profile_entries=array_chunk($profile_entries,2); +$smarty->assign("PROFILELISTS",$profile_entries); + +if($mode == 'edit') +{ + $selected_profiles = array(); + foreach($roleRelatedProfiles as $relProfId => $relProfName) + { + $selected_profiles[]=$relProfId; + $selected_profiles[]=$relProfName; + } + $selected_profiles=array_chunk($selected_profiles,2); + $smarty->assign("SELPROFILELISTS",$selected_profiles); +} + +$smarty->display("RoleEditView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/deleteemailtemplate.php b/oss/vtiger/trunk/modules/Settings/deleteemailtemplate.php new file mode 100644 index 00000000..4fb5504b --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/deleteemailtemplate.php @@ -0,0 +1,21 @@ +pquery($sql, array($id_array[$i])); +} + +header("Location:index.php?module=Settings&action=listemailtemplates"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/deletewordtemplate.php b/oss/vtiger/trunk/modules/Settings/deletewordtemplate.php new file mode 100644 index 00000000..3df8fe9a --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/deletewordtemplate.php @@ -0,0 +1,21 @@ +pquery($sql, array($id_array[$i])); +} + +header("Location:index.php?module=Settings&action=listwordtemplates&parenttab=Settings"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/detailviewemailtemplate.php b/oss/vtiger/trunk/modules/Settings/detailviewemailtemplate.php new file mode 100644 index 00000000..7fd22b3d --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/detailviewemailtemplate.php @@ -0,0 +1,61 @@ +info("Inside Email Template Detail View"); + +$smarty = new vtigerCRM_smarty; + +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("UMOD", $mod_strings); +$smod_strings = return_module_language($current_language,'Settings'); +$smarty->assign("MOD", $smod_strings); +$smarty->assign("MODULE", 'Settings'); +$smarty->assign("IMAGE_PATH", $image_path); + +if(isset($_REQUEST['templateid']) && $_REQUEST['templateid']!='') +{ + $log->info("The templateid is set"); + $tempid = $_REQUEST['templateid']; + $sql = "select * from vtiger_emailtemplates where templateid=?"; + $result = $adb->pquery($sql, array($tempid)); + $emailtemplateResult = $adb->fetch_array($result); +} +$smarty->assign("FOLDERNAME", $emailtemplateResult["foldername"]); + +$smarty->assign("TEMPLATENAME", $emailtemplateResult["templatename"]); +$smarty->assign("DESCRIPTION", $emailtemplateResult["description"]); +$smarty->assign("TEMPLATEID", $emailtemplateResult["templateid"]); + +$smarty->assign("SUBJECT", $emailtemplateResult["subject"]); +$smarty->assign("BODY", decode_html($emailtemplateResult["body"])); + +$smarty->display("DetailViewEmailTemplate.tpl"); + +?> + + + + + + diff --git a/oss/vtiger/trunk/modules/Settings/downloadfile.php b/oss/vtiger/trunk/modules/Settings/downloadfile.php new file mode 100644 index 00000000..ad77e54e --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/downloadfile.php @@ -0,0 +1,32 @@ +pquery($dbQuery, array()) or die("Couldn't get file list"); +if($adb->num_rows($result) == 1) +{ + $name = @$adb->query_result($result, 0, "logoname"); + $fileContent = @$adb->query_result($result, 0, "logo"); + $name = html_entity_decode($name, ENT_QUOTES, $default_charset); + header("Cache-Control: private"); + header("Content-Disposition: attachment; filename=$name"); + header("Content-Description: PHP Generated Data"); + echo base64_decode($fileContent); +} else { + echo $mod_strings['LBL.RECORD_NOEXIST']; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/editemailtemplate.php b/oss/vtiger/trunk/modules/Settings/editemailtemplate.php new file mode 100644 index 00000000..c9c73c1a --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/editemailtemplate.php @@ -0,0 +1,60 @@ +debug("the templateid is set to the value ".$templateid); +} +$sql = "select * from vtiger_emailtemplates where templateid=?"; +$result = $adb->pquery($sql, array($templateid)); +$emailtemplateResult = str_replace('"','"',$adb->fetch_array($result)); +$smod_strings = return_module_language($current_language,'Settings'); + +//To get Email Template variables -- Pavani +$allOptions=getEmailTemplateVariables(); +$smarty = new vtigerCRM_smarty; + +$smarty->assign("UMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme_path); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("MOD", $smod_strings); +$smarty->assign("FOLDERNAME", $emailtemplateResult["foldername"]); +$smarty->assign("TEMPLATENAME", $emailtemplateResult["templatename"]); +$smarty->assign("TEMPLATEID", $emailtemplateResult["templateid"]); +$smarty->assign("DESCRIPTION", $emailtemplateResult["description"]); +$smarty->assign("SUBJECT", $emailtemplateResult["subject"]); +$smarty->assign("BODY", $emailtemplateResult["body"]); +$smarty->assign("MODULE", 'Settings'); +$smarty->assign("PARENTTAB", getParentTab()); +$smarty->assign("EMODE", $mode); +$smarty->assign("ALL_VARIABLES", $allOptions); + +$smarty->display("CreateEmailTemplate.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/index.php b/oss/vtiger/trunk/modules/Settings/index.php new file mode 100644 index 00000000..bc449175 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/index.php @@ -0,0 +1,34 @@ +assign("APP", $app_strings); +$smarty->assign("MODULE", 'Settings'); +$smarty->assign("CATEGORY", 'Settings'); +$smarty->assign("MOD", $mod_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("IMAGES", "themes/images/"); +$smarty->assign("BLOCKS", getSettingsBlocks()); +$smarty->assign("FIELDS", getSettingsFields()); +$smarty->assign("NUMBER_OF_COLUMNS", 4); //this is the number of columns in the settings page + +$smarty->display("Settings.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Settings/language/en_us.lang.php b/oss/vtiger/trunk/modules/Settings/language/en_us.lang.php new file mode 100644 index 00000000..687fc2fe --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/language/en_us.lang.php @@ -0,0 +1,1204 @@ +'Settings', + +'LBL_MODULE_TITLE'=>'Settings: Home', + +'LBL_LIST_CONTACT_ROLE'=>'Role', + + + +'LBL_LIST_LAST_NAME'=>'Last Name', + +'LBL_FIRST_NAME'=>'First Name:', + +'LBL_LAST_NAME'=>'Last Name:', + +'LBL_PHONE'=>'Phone:', + +'LBL_EMAIL_ADDRESS'=>'Email', + +'LBL_TRANSCURR'=>'Transfer currency to', + +'LBL_CURRDEL'=>'Currency to be Deleted', + +'LBL_NEW_FORM_TITLE'=>'New Contact', + +'LBL_NEW_CURRENCY'=>'New Currency', + +'LBL_VIEWING'=>'Viewing', + +'LBL_CURRENCY_NAME'=>'Currency Name', + +'LBL_CURRENCY_CODE'=>'Currency Code', + +'LBL_CURRENCY_SYMBOL'=>'Symbol', + +'LBL_CURRENCY_CRATE'=>'Conversion Rate', + +'LBL_CURRENCY_STATUS'=>'Status', + +'LBL_CURRENCY_TOOL'=>'Tools', + +'LBL_CURRENCY_LIST'=>'Currencies List', + + +'NTC_DELETE_CONFIRMATION'=>'Are you sure you want to delete this record?', + +'LEADCUSTOMFIELDS'=>'Lead Custom Fields', + +'ACCOUNTCUSTOMFIELDS'=>'Account Custom Fields', + +'CONTACTCUSTOMFIELDS'=>'Contact Custom Fields', + +'OPPORTUNITYCUSTOMFIELDS'=>'Potential Custom Fields', + +'HELPDESKCUSTOMFIELDS'=>'Helpdesk Custom Fields', + +'PRODUCTCUSTOMFIELDS'=>'Product Custom Fields', + +'VENDORCUSTOMFIELDS'=>'Vendor Custom Fields', + +'PRICEBOOKCUSTOMFIELDS'=>'PriceBook Custom Fields', + +'POCUSTOMFIELDS'=>'Purchase Order Custom Fields', +'SOCUSTOMFIELDS'=>'Sales Order Custom Fields', +'QUOTESCUSTOMFIELDS'=>'Quotes Custom Fields', +'INVOICECUSTOMFIELDS'=>'Invoice Custom Fields', + +'EDITLEADPICKLISTVALUES'=>'Edit Lead Picklist ', + +'EDITACCOUNTPICKLISTVALUES'=>'Edit Account Picklist ', + +'EDITCONTACTPICKLISTVALUES'=>'Edit Contact Picklist ', + +'EDITOPPORTUNITYPICKLISTVALUES'=>'Edit Potential Picklist ', + +'EDITHELPDESKPICKLISTVALUES'=>'Edit HelpDesk Picklist ', + +'EDITPRODUCTPICKLISTVALUES'=>'Edit Product Picklist ', + +'EDITEVENTPICKLISTVALUES'=>'Edit Event Picklist ', + +'EDITTASKPICKLISTVALUES'=>'Edit Task Picklist ', + +'EDITRSSPICKLISTVALUES'=>'Edit Rss Picklist', +'EDITVENDORPICKLISTVALUES'=>'Edit Vendor Picklist', +'EDITPBPICKLISTVALUES'=>'Edit PriceBook Picklist', +'EDITPOPICKLISTVALUES'=>'Edit Purchase Order Picklist', +'EDITSOPICKLISTVALUES'=>'Edit Sales Order Picklist', +'EDITQUOTEPICKLISTVALUES'=>'Edit Quote Picklist', +'EDITINVOICEPICKLISTVALUES'=>'Edit Invoice Picklist', + + +// Added for Release vtigerCRM 3.2 PATCH 1.0 + +//Settings/index.php + + +'LBL_PICKLIST_FIELD_SETTINGS'=>'Picklist Field Settings:', + + + +//SETTINGS/CustomFieldList.php,ComboFieldList.php,CreateCustomField.php + +'Leads'=>'Lead', + +'Accounts'=>'Account', + +'Contacts'=>'Contact', + +'Potentials'=>'Potential', + +'HelpDesk'=>'HelpDesk', + +'Products'=>'Product', + +'Events'=>'Event', + +'Activities'=>'Task', + + + + + +'CustomFields'=>' Custom Fields', + +'NewCustomField'=>'New Custom Field', + +'NewCustomFieldAltC'=>'New Custom Field [Alt+c]:', + +'FieldName'=>'Field Name', + +'FieldType'=>'Field Type', + +'FieldLabel'=>'Field Label', + +'Delete'=>'Del', + +'NEW'=>'New', + +'CUSTOMFIELD'=>'Custom Field', + +'LBL_CUSTOM_FIELDS'=>'Custom Fields', + +'LBL_ADD_FIELD'=>'Create Custom Field', + +'LBL_CUSTM_MSG'=>'allows you to ....', + +'PicklistFields'=>' Picklist Fields', + + +'Edit'=>'Edit', + +'LBL_EDIT_FIELD_TYPE'=>'Edit Field Type', + +//Settings/CustomField.html + +'LBL_PROVIDE_FIELD_INFORMATION'=>'Provide Field Information: ', + +'LBL_SELECT_FIELD_TYPE'=>'Select Field Type: ', + +'LBL_PROVIDE_FIELD_DETAILS'=>'Provide Field Details: ', + +'LBL_LABEL'=>'Label: ', + +'LBL_LENGTH'=>'Length: ', + +'LBL_DECIMAL_PLACES'=>'Decimal Places: ', + +'LBL_PICK_LIST_VALUES'=>'Pick list Values: ', + + + +//Settings/EditComboField.php + +'EditPickListValues'=>'Picklist Edit ', + + + +//Settings/EditField.html + +'LBL_FIELD_INFORMATION'=>'Field Information:', + +'Values'=>'Values', + +'EnterListOfValues'=>'Please enter the list of values below. Each value should be in its own line.', + + + +//Settings/fieldtypes.php + +'Text'=>'Text', + +'Number'=>'Number', + +'Percent'=>'Percent', + +'Currency'=>'Currency', + +'Date'=>'Date', + +'Email'=>'Email', + +'Phone'=>'Phone', + +'PickList'=>'Pick List', + +'LBL_MULTISELECT_COMBO'=>'Multi-Select Combo Box', + +'Skype'=>'Skype', + + + +//added for patch2 + +'USERGROUPLIST'=>'Groups', + +'EMAILTEMPLATES'=>'E-mail Templates', + +'WORDINTEGRATION'=>'Mail Merge Templates', + +'LBL_MAIL_MERGE'=>'Mail Merge', + +'NOTIFICATIONSCHEDULERS'=>'Notification Schedulers', +//currency status +'LBL_ACTIVE'=>'Active', + +'LBL_INACTIVE'=>'Inactive', + +'LBL_NOTIFICATION'=>'Notification', +'LBL_DESCRIPTION'=>'Description', +'LBL_TOOL'=>'Tool', + + +//Added fields for Title Informations -- after 4 Beta + +'LBL_EMAIL_CONFIG'=>'Outgoing Mail Server Configuration', + +'LBL_WORD_INTEGRATION'=>'Word Integration:', + +'LBL_GROUP_SETTINGS'=>'Group Settings:', + +'LBL_TEMPLATE_SETTINGS'=>'Template Settings:', + +'LBL_NOTIFICATION_SETTINGS'=>'Notification Settings:', + +'LBL_EMAIL_SETTINGS'=>'Email Settings:', + +'LBL_SECURITY_SETTINGS'=>'Security Settings:', + + + +//Added fields after RC1 - Release + +'LBL_MAIL_SERVER_INFO'=>'Outgoing Mail Server Information', + +'LBL_OUTGOING_MAIL_SERVER'=>'Server Name', + +'LBL_OUTGOING_MAIL_SERVER_LOGIN_USER_NAME'=>'Outgoing Mail Server Login User Name', + +'LBL_OUTGOING_MAIL_SERVER_PASSWORD'=>'Outgoing Mail Server Password', + +'LBL_MAIL_SERVER_SMTP'=>'Mail Server Settings (SMTP)', + +'LBL_BACKUP_SERVER_CONFIG'=>'Backup Server Configuration', + +'LBL_SERVER_ADDRESS'=>'Server Address', + +'LBL_FTP_SERVER_NAME'=>'FTP Server Name', + +'LBL_FTP_USER_NAME'=>'FTP User Name', + +'LBL_FTP_PASSWORD'=>'FTP Password', + +'LBL_FTP'=>'FTP', + +'LBL_SYSTEM_CONFIG'=>'System Configuration', +'LBL_SYSTEM_INFO'=>'System Details', +'LBL_PROXY_SETTINGS'=>'Proxy Server', +'LBL_AUDIT_TRAIL'=>'Audit Trails', +'LBL_ENABLE_AUDIT_TRAIL'=>'Enable Audit Trail', +'LBL_USER_AUDIT'=>'Select User', +'LBL_VIEW_AUDIT_TRAIL'=>'View Audit Trail', +'LBL_AUDIT_TRAIL_DESC'=>'Display Audit Trail of Users who access CRM', +'LBL_NO_DATA'=>'No Data', + +'LBL_CURRENCY_CONFIGURATION'=>'- Currency Information', + +'LBL_CURRENCY_CONFIG'=>'Currency Configuration', + +'LBL_CURRENCY_INFO'=>'Currency Information', + +'LBL_CURRENCY_TITLE'=>'Currency', + +'LBL_CURRENCY_SETTINGS'=>'Currencies', + + +'LBL_USERNAME'=>'User Name', +'LBL_PASWRD'=>'Password', +'LBL_REQUIRES_AUTHENT'=>'Requires Authentication?', + +//Fields for Settings + +'LBL_USER_MANAGEMENT'=>'Users & Access Management', + +'LBL_USERS'=>'Users', + +'LBL_USERS_LIST'=>'Users List', +'LBL_GROUP_LIST'=>'Groups List', + +'LBL_CREATE_AND_MANAGE_USERS'=>'- Create and Manage Users (e.g., admin)', + + +'LBL_CREATE_AND_MANAGE_USER_ROLES'=>'- Create and Manage user roles (e.g., Administrator, Standard User, etc.)', + +'LBL_PROFILES'=>'Profiles', + +'LBL_PROFILES_LIST'=>'Profiles List', + +'LBL_CREATE_AND_MANAGE_USER_PROFILES'=>'- Create and Manage user profiles (e.g., CEO, Sales Manager, etc.)', + +'LBL_CREATE_AND_MANAGE_USER_GROUPS'=>'- Create and Manage user groups', + +'LBL_SHARING_ACCESS'=>'Sharing Access', + +'LBL_FIELDS_ACCESS'=>'Fields Access', + +'LBL_DEFAULT_ORGANIZATION_FIELDS'=>'Default Organization Fields Access', + +'LBL_SETTING_DEFAULT_ORGANIZATION_FIELDS'=>' - Setting Default Field Access within the Organization', + +'LBL_SETTING_DEFAULT_SHARING_ACCESS'=>'- Setting Default Sharing Access within the Organization', + +'LBL_FIELD_ACCESSIBILITY'=>'Field Accessibility', + +'LBL_SETTING_FIELD_ACCESSIBILITY'=>' - Setting Field Accessibility for each profiles', +//<<<<<<<>>>>> +'LBL_FIELD_ORDERING_DESC'=>' - Edit Field Order', + +'LBL_FIELD_ORDERING'=>'Edit Field Blocks', +//<<<<<<<<<>>>>>>>>>>>> +'LBL_LEAD_FIELD_ACCESS'=>'Lead Field Access', + +'LBL_ACCOUNT_FIELD_ACCESS'=>'Account Field Access', + +'LBL_CONTACT_FIELD_ACCESS'=>'Contact Field Access', + +'LBL_OPPORTUNITY_FIELD_ACCESS'=>'Potential Field Access', + +'LBL_HELPDESK_FIELD_ACCESS'=>'HelpDesk Field Access', + +'LBL_PRODUCT_FIELD_ACCESS'=>'Product Field Access', + +'LBL_NOTE_FIELD_ACCESS'=>'Document Field Access', + +'LBL_EMAIL_FIELD_ACCESS'=>'Email Field Access', + +'LBL_TASK_FIELD_ACCESS'=>'Task Field Access', + +'LBL_EVENT_FIELD_ACCESS'=>'Event Field Access', + +'LBL_DELETE_DEMO_DATA'=>'Delete Demo Data', + +'LBL_DELETE_DEMO_DATA_INFO'=>'- Delete the Demo Data which is created at the time of installation', + + + +'LBL_STUDIO'=>'Studio', + +'LBL_CUSTOM_FIELD_SETTINGS'=>'Custom Field Settings', + +'LBL_CREATE_AND_MANAGE_USER_DEFINED_FIELDS'=>'Manage your company-wide custom fields.', + +'LBL_SELECT_MODULE'=>'Select Module', + +'LBL_SELECT_CF_TEXT'=>'Select Module:', + + + +'LBL_PICKLIST_SETTINGS'=>'Picklist Settings', + +'LBL_EDIT_PICKLIST_VALUES'=>' - Edit values of Picklist fields', + +'LBL_EDIT'=>'Editing', + +'LBL_COMMUNICATION_TEMPLATES'=>'Communication Templates', + +'LBL_CREATE_EMAIL_TEMPLATES'=>'New Email Template', + +'LBL_UPLOAD_MSWORD_TEMPLATES'=>' - Upload MS Word Templates for Mail Merge', + +'LBL_SCHEDULE_EMAIL_NOTIFICATION'=>' - Schedule Email Notifications', + +'LBL_EXPAND_CLOSE_MENU'=>'Expand/Close Menu', + +'LBL_CONFIGURATION'=>'Configuration', + +'LBL_CONFIGURE_MAIL_SERVER'=>' - Configure Outgoing Mail Server', + +'LBL_BACKUP_SERVER_CONFIGURATION'=>'Backup Server Configuration', + +'LBL_BACKUP_SERVER_INFO'=>'Backup Server Information', + +'LBL_BACKUP_SERVER_SETTINGS'=>'Backup Server', + +'LBL_CONFIGURE_BACKUP_SERVER'=>' - Configure Backup Server', + +'LBL_SYSTEM_CONFIGURATION'=>' - System Configuration', + +'LBL_PROXY_SERVER_CONFIGURATION'=>'Proxy Server Configuration', + +'LBL_PROXY_SERVER_INFO'=>'Proxy Server Information', + +'LBL_PROXY_SERVER_SETTINGS'=>'Proxy Server', + +'LBL_CONFIGURE_PROXY_SERVER'=>' - Configure Proxy Server', + +'LBL_PROXY_PORT'=>'Port Number', + + + +//Field Types for custom fields + +'LBL_URL'=>'URL', + +'LBL_CHECK_BOX'=>'Checkbox', + + + +//PickList Settings + +'LBL_STANDARD_FIELDS'=>'Standard Fields', + +'LBL_LEAD_SOURCE'=>'Lead Source', + +'LBL_SALUTATION'=>'Salutation', + +'LBL_LEAD_STATUS'=>'Lead Status', + +'LBL_INDUSTRY'=>'Industry', + +'LBL_RATING'=>'Rating', + +'LBL_ACCOUNT_TYPE'=>'Account Type', + +'LBL_BUSINESS_TYPE'=>'Business Type', + +'LBL_CURRENCY_TYPE'=>'Currency Type', + +'LBL_SALES_STAGE'=>'Sales Stage', + +'LBL_PRIORITY'=>'Priority', + +'LBL_STATUS'=>'Status', + +'LBL_CATEGORY'=>'Ticket Category', + +'LBL_MANUFACTURER'=>'Manufacturer', + +'LBL_PRODUCT_CATEGORY'=>'Product Category', + +'LBL_RSS_CATEGORY'=>'Rss Category', + +//Added for Web based Email client integration (post 4.0.1 release) + +'LBL_ADD_MAIL_ACCOUNT'=>'Add Mail Account', +'LBL_NEW_MAIL_ACCOUNT_TITLE'=>'New Mail Account [Alt+M]', +'LBL_NEW_MAIL_ACCOUNT_KEY'=>'M', +'LBL_NEW_MAIL_ACCOUNT_LABEL'=>'New Mail Account', +'LBL_GENERAL_INFO'=>'General Information', +'LBL_DISPLAY_NAME'=>'Display Name', +'LBL_MAIL_PROTOCOL'=>'Mail Protocol', +'LBL_LIST_PASSWORD'=>'Password', +'LBL_MAIL_SERVER_NAME'=>'Mail Server Name or IP', +'LBL_MAIL_SERVER_SETTINGS'=>'Outgoing Server', +'LBL_INCOME_SERVER_SETTINGS'=>'Incoming Server', +'LBL_TEST_SETTINGS'=>'Test my account setting immediately', +'LBL_TEST_BUTTON_TITLE'=>'Test my account now! [Alt+T]', +'LBL_TEST_BUTTON_KEY'=>'T', +'LBL_TEST_BUTTON_LABEL'=>'Test my account now!', +'LBL_DEFAULT'=>'Default', +'LBL_IMAP2'=>'IMAP2', +'LBL_IMAP4'=>'IMAP4', +'LBL_POP'=>'POP', +'LBL_IMAP'=>'IMAP', +'LBL_MAIL_DISCLAIM'=>'Items marked with * are required
    Items marked with * * are not fully supported', +'LBL_SSL_OPTIONS'=>'SSL Options', +'LBL_TLS'=>'TLS', +'LBL_NO_TLS'=>'No TLS', +'LBL_CERT_VAL'=>'Certificate Validations', +'LBL_INT_MAILER'=>'Use Internal Mailer?', +'LBL_INT_MAILER_USE'=>'Yes', +'LBL_INT_MAILER_NOUSE'=>'No', +'LBL_VAL_SSL_CERT'=>'Validate SSL Cert', +'LBL_DONOT_VAL_SSL_CERT'=>'Do Not Validate SSL Cert', +'LBL_WEB_MAIL_CONFIG'=>'Web Mail Configuration', +'LBL_CONFIGURE_WEB_MAIL'=>' - Configure Web Mail', +'LBL_LIST_MAIL_ACCOUNT'=>' List Mail Account', +'LBL_USAGEUNIT'=>'Usage Unit', +'LBL_GLACCT'=>'GL Account', +'LBL_QUOTE_STAGE'=>'Quote Stage', +'LBL_CARRIER'=>'Carrier', +'LBL_TAXCLASS'=>'Tax Class', +'LBL_MY_DETAILS'=>'My Details', +'LBL_MY_MAIL_SERVER_DET'=>'My Incoming Mail Server Details', +'LBL_EMAIL_ID'=>'Email ID', +'LBL_NAME_EXAMPLE'=>'(example : John Fenner)', +'LBL_EMAIL_EXAMPLE'=>'(example : johnfenner@xyz.com)', +'LBL_REFRESH_TIMEOUT'=>'Refresh Timeout', +'LBL_1_MIN'=>'1 minute', +'LBL_2_MIN'=>'2 minutes', +'LBL_3_MIN'=>'3 minutes', +'LBL_4_MIN'=>'4 minutes', +'LBL_5_MIN'=>'5 minutes', +'LBL_EMAILS_PER_PAGE'=>'Email per Page', + +//Added for Organization Details (4.2 release) +'LBL_ORGANIZATION_NAME'=>'Company Name', +'LBL_ORGANIZATION_ADDRESS'=>'Address', +'LBL_ORGANIZATION_CITY'=>'City', +'LBL_ORGANIZATION_STATE'=>'State', +'LBL_ORGANIZATION_CODE'=>'Postal Code', +'LBL_ORGANIZATION_COUNTRY'=>'Country', +'LBL_ORGANIZATION_PHONE'=>'Phone', +'LBL_ORGANIZATION_FAX'=>'Fax', +'LBL_ORGANIZATION_WEBSITE'=>'Website', +'LBL_ORGANIZATION_DETAILS'=>'Company Information', +'LBL_SPECIFY_COMPANY_DETAILS'=>' - Specify Company Information', +'LBL_ORGANIZATION_LOGO'=>'Company Logo', +'LBL_UPLOAD'=>'Upload', +'LBL_FILENAME'=>'File Name', +'LBL_SETTINGS'=>'Settings', +'LBL_COMPANY_DETAILS'=>'Company Details', + +'LBL_SEVERITY'=>'Severity', +'LBL_FAQ_CATEGORY'=>'FAQ Category', +'LBL_VENDOR_FIELD_ACCESS'=>'Vendor Field Access', +'LBL_PB_FIELD_ACCESS'=>'PriceBook Field Access', +'LBL_QUOTE_FIELD_ACCESS'=>'Quote Field Access', +'LBL_PO_FIELD_ACCESS'=>'Purchase Order Field Access', +'LBL_SO_FIELD_ACCESS'=>'Sales Order Access', +'LBL_INVOICE_FIELD_ACCESS'=>'Invoice Field Access', +'INVENTORYNOTIFICATION'=>'Inventory Notifications', +'LBL_INVENTORY_NOTIFICATIONS'=>' - Edit Inventory Email Notifications', +'INVENTORYTERMSANDCONDITIONS'=>'Inventory : Terms & Conditions',//newly added for Inventory terms and conditions +'LBL_INVENTORY_TERMSANDCONDITIONS'=>' - Edit Terms & Conditions',//newly added +'LBL_TANDC_TEXT'=>'Terms & Conditions Text', +'LBL_INVENTORY_TANDC'=>'Inventory Terms & Conditions', + +'LBL_OTHER_SETTINGS'=>'Other Settings', +'LBL_SCROLL'=>'[Scroll to Top]', + +'LBL_INV_NOT_DESC'=>'The following is the list of notifications that are sent to the product handler regarding the demand and the current quantity in hand during the creation of a Quote, SalesOrder and Invoice.', + +'InvoiceNotification'=>'Product Stock Notification during Invoice Generation', +'InvoiceNotificationDescription'=>'When the product stock level goes below the re-order level, notification will be sent to the product handler', +'Vendor'=>'Vendor', +'PriceBook'=>'PriceBook', +'Quotes'=>'Quote', +'PurchaseOrder'=>'Purchase Order', +'SalesOrder'=>'SalesOrder', +'Invoice'=>'Invoice', + +//For Custom Fields +'LBL_LEAD_MAP_CUSTOM_FIELD'=>'Mapping Lead Custom Fields', +'leadCustomFieldDescription'=>'Map each of your organizations lead custom fields to each of your custom account +,contact, or potential fields. These mappings will be used when you convert leads', +'LBL_MAPPING_INFO'=>'Mapping Information', +'LBL_ACCOUNT_FIELD'=>'Account Custom Field', +'LBL_CONTACT_FIELD'=>'Contact Custom Field', +'LBL_POTENTIAL_FIELD'=>'Potential Custom Field', +'CUSTOMFIELDMAPPING'=>'Custom Field Mapping', +'LBL_FIELD_MAPPING'=>'Field Mapping', +'LBL_LEAD_FIELD'=>'Lead Custom Field', +//After 4.2 GA +'LBL_TEXT_AREA'=>'Text Area', +//for Edit ordering the blocks +'NOTESCUSTOMFIELDS'=>'Documents Custom Fields', + +//Added fields after 4.2 ptach 2 +'LBL_ASSIGN_MODULE_OWNERS'=>'Assign Module Owners', +'LBL_MODULE_OWNERS'=>'Module Owners', +'LBL_ASSIGN_MODULE_OWNERS_INFO'=>' - Assign Owners for each modules', +'LBL_MODULE'=>'CRM Module', +'LBL_OWNER'=>'Assigned Owner', +'LBL_MIGRATION'=>'Migration Wizard', +'LBL_MIGRATION_INFO'=>'Migrate your existing vtiger CRM data to latest version', + +//Added for 5 GA - Description of Settings UI + +'LBL_USER_DESCRIPTION'=>'Manage users who can access vtiger CRM', +'LBL_ROLE_DESCRIPTION'=>'Set up hierarchy of roles and assign to the users', +'LBL_PROFILE_DESCRIPTION'=>'Manage user-specific modules access to different Roles', +'LBL_GROUP_DESCRIPTION'=>'Manage different types of teams based on roles, users, and profiles', +'LBL_SHARING_ACCESS_DESCRIPTION'=>'Manage module sharing rules & custom sharing rules', +'LBL_SHARING_FIELDS_DESCRIPTION'=>'Define global field-level access in each module', +'LBL_MODULE_OWNERS_DESCRIPTION'=>'Assign Customer Support owners to CRM module', +'LBL_ANNOUNCEMENT_DESCRIPTION'=>'Manage company wide announcements', +'LBL_CUSTOM_FIELDS_DESCRIPTION'=>'Manage different types of user-defined fields', +'LBL_PICKLIST_DESCRIPTION'=>'Customize Picklist values in each module', +'LBL_EMAIL_TEMPLATE_DESCRIPTION'=>'Manage templates for E-Mail module', +'LBL_MAIL_MERGE_DESCRIPTION'=>'Manage templates for Mail Merging', +'LBL_NOTIF_SCHED_DESCRIPTION'=>'Manage Notifications that will alert in case of important actions', +'LBL_INV_NOTIF_DESCRIPTION'=>'Change Settings of Inventory related Notifications', +'LBL_INV_TANDC_DESCRIPTION'=>'Specify Terms and Conditions for quotes, orders, and invoices', +'LBL_COMPANY_DESCRIPTION'=>'Specify business address of company', +'LBL_MAIL_SERVER_DESCRIPTION'=>'Configure Outgoing Mail Server details', +'LBL_BACKUP_SERVER_DESCRIPTION'=>'Specify database backup server details', +'LBL_CURRENCY_DESCRIPTION'=>'Manage international currencies and exchange rates', +'LBL_TAX_DESCRIPTION'=>'Manage taxes and the corresponding tax rates', +'LBL_SYSTEM_DESCRIPTION'=>'View vtiger CRM Server details', +'LBL_PROXY_DESCRIPTION'=>'Configure proxies to access RSS feeds through Internet', +'LBL_AUDIT_DESCRIPTION'=>'Display data opertions performed by users', +'LBL_TAX_DESC'=>'Manage different types of tax rates for taxes, such as Sales Tax, VAT etc.,', +'LBL_COMPANY_DESC'=>'Specify business address of your company', +'LBL_SELECT_LOGO'=>'Select new logo:', +'LBL_INVEN_TANDC_DESC'=>'Specify text for the Terms & Conditions section of Quotes, Orders, and Invoices modules', +'LBL_MAIL_SERVER_DESC'=>'Configure your Outgoing Mail Server details', +'LBL_BACKUP_SERVER_DESC'=>'Manage your Backup Server', +'LBL_MODULES_AND_OWNERS'=>'Modules & Owners', +'LBL_GROUP_DESC'=>'Manage different types of user groups within your organization', +'LBL_MAIL_MERGE_DESC'=>'Manage Mail Merge templates used in CRM modules', + + +//Added fields after 5.0 Alpha +'LBL_REQUIRE_SMTP_AUTHENTICATION'=>'Require SMTP Authentication?', +'LBL_ANNOUNCEMENT'=>'Announcements', +'LBL_SETTING_ANNOUNCEMENT'=>'Announcement', +'LBL_ANNOUNCE_TEXT'=>'Announcement Text', +'LBL_UPDATE_BUTTON'=>'Update', +'LBL_ANNOUNCEMENT_INFO'=>'Type the announcement text below, and click the Update button.', +'LBL_ANNOUNCEMENT_DESC'=>'Change the text that appears in the announcement display on top of each page', +'LBL_EMAIL_CONTENTS'=>'Email Contents', +'LBL_SUBJECT'=>'Subject', +'LBL_MESSAGE'=>'Message', +'LBL_PICKLIST_EDITOR'=>'Picklist Editor', +'LBL_PICKLIST_AVAIL'=>'Picklists Available in', +'LBL_PICKLIST_AVAILINFO1'=>'The picklists available in', +'LBL_PICKLIST_AVAILINFO2'=>'are shown below. Click Edit to modify the contents of the list.', +'LBL_EDIT_PICKLIST'=>'Edit Pick List', +'LBL_PICKLIST_SAVEINFO'=>'Type the entries one - by - one below and click the Save button to save the list.', +'LBL_SELECT_CRM_MODULE'=>'Select CRM Module', +'LBL_TAX_SETTINGS'=>'Tax Calculations', +'LBL_INVENTORY_TAX_CONFIG'=>'Inventory Tax Configuration', +'LBL_CUSTOM_MAPP_INFO'=>'Only in Leads module you can map the fields with Accounts, Contacts, and Potentials.', +'LBL_MAPPING_OTHER_MODULES'=>'Mapping with other Modules', +'LBL_CUSTOM_FILED_IN'=>'Custom Fields in ', +'LBL_ROLE_HIERARCHY_TREE'=>'Roles & Hierarchy Tree', +'LBL_EDIT_FIELD_MAPPING'=>'Editing Field Mapping', +'LBL_LOGIN_HISTORY_DETAILS'=>'User Login History', +'LBL_LOGIN_HISTORY_DESCRIPTION'=>'Display login history of users', +'LBL_NON_EDITABLE_PICKLIST_ENTRIES'=>'Non Editable Picklist Entries', + +//Added for Tax settings +'LBL_PRODUCT_TAX_SETTINGS'=>'Product & Service Taxes', +'LBL_SHIPPING_HANDLING_TAX_SETTINGS'=>'Shipping & Handling Taxes', +'LBL_PROXY_SERVER_DESC'=>'Configure proxies to access RSS feeds through Internet', + +'LBL_NEW_CURRENCTY'=>'New Currency', +'LBL_BASE_CURRENCY'=>'Base Currency - ', +'LBL_DELETE_CURRENCY'=>'Delete Currency', + +//Added for singlepane view in modules + +'LBL_DEFAULT_DETAIL_VIEW'=>'Default Detail View', +'LBL_DEFAULT_MODULE_VIEW'=>'Default Module View', +'LBL_DEFAULT_MODULE_VIEW_DESC'=>'Set Default Detail View for All Modules', +'LBL_ENABLE_SINGLEPANE_VIEW'=>'Enable Singlepane View', + +'LBL_CLEAR_DATA'=>'Clear Data', +'LBL_ENABLE'=>'Enable', +'LBL_FAQ_FIELD_ACCESS'=>'Faq Field Access', +'LBL_ADD_TAX_BUTTON'=>'Add Tax', +'LBL_NO_TAXES_AVAILABLE'=>'No taxes available', +'LBL_PLEASE'=>'Please', +//Added while moving role file from User to Setting Module +'LBL_ROLES'=>'Roles', +'LBL_CREATE_NEW_ROLE'=>'Create New Role', +'LBL_PROPERTIES'=>'Properties of', +'LBL_NEW_ROLE'=>'New Role', +'LBL_ROLE_NAME'=>'Role Name', +'LBL_REPORTS_TO'=>'Reports to', +'LBL_PROFILE_M'=>'Profile', +'LBL_PROFILES_AVLBL'=>'Profiles Available', +'LBL_ASSIGN_PROFILES'=>'Assigned Profiles', +'LBL_MEMBER'=>'Members', +'LBL_DELETE_ROLE'=>'Delete Role', +'LBL_ROLE_TO_BE_DELETED'=>'Role to be Deleted', +'LBL_TRANSFER_USER_ROLE'=>'Transfer Users to Role', +'LBL_ASSOCIATED_PROFILES'=>'Associated Profiles :', +'LBL_ASSOCIATED_USERS'=>'Associated Users :', +//Added while moving email templates from Users to Settings +'LBL_EMAIL_TEMPLATES'=>'Email Templates', +'LBL_EMAIL_TEMPLATE_DESC'=>'Manage email templates used for Campaigns and Mass mailing', +'LBL_LIST_SELECT'=>'Select', +'LBL_EMAIL_TEMPLATE'=>'Email Template', +'LBL_TEMPLATE_TOOLS'=>'Tools', +'LBL_NEW_TEMPLATE' =>'New Template', +'LBL_FOLDER'=>'Folder', +'LBL_NAME'=>'Name', +'LBL_PERSONAL'=>'Personal', +'LBL_PUBLIC'=>'Public', +'LBL_ACCOUNT_FIELDS'=>'Account Fields', +'LBL_CONTACT_FIELDS'=>'Contact Fields', +'LBL_LEAD_FIELDS'=>'Lead Fields', +'LBL_USER_FIELDS'=>'User Fields', +'LNK_SAMPLE_EMAIL'=>'View Sample Email', +//Added while moving Mail Merge templates from Users to Settings +'LBL_TEMPLATE_FILE'=>'Template File', +'LBL_MODULENAMES'=>'Module', +'LBL_DOWNLOAD'=>'Download', +'LBL_ADD_TEMPLATE'=>'Add Template', +'LBL_WORD_TEMPLATES'=>'Mail Merge Templates', +//Added while moving Notification Schedulers from Users to Settings +'LBL_TASK_NOTIFICATION'=>'Delayed Task Notification', +'LBL_BIG_DEAL'=>'Big Deal Notification', +'LBL_PENDING_TICKETS'=>'Pending Tickets Notification', +'LBL_MANY_TICKETS'=>'Too many tickets Notification', +'LBL_START_NOTIFICATION'=>'Support Start Notification', +'LBL_ACTIVITY_NOTIFICATION'=>'Event Reminder Notification', + +'LBL_TASK_NOTIFICATION_DESCRITPION'=>'Notify when a task is delayed beyond 24 hrs', +'LBL_BIG_DEAL_DESCRIPTION'=>'Notify on completion of big deal', +'LBL_TICKETS_DESCRIPTION'=>'Notify for getting attention to status of tickets which are pending', +'LBL_MANY_TICKETS_DESCRIPTION'=>'Notify when a particular entity is allocated too many tickets, might reflect Service Level commitments', +'LBL_START_DESCRIPTION'=>'Notifiy stating the start of support/service', +'LBL_ACTIVITY_REMINDER_DESCRIPTION'=>'Notify before an event to occur based on the reminder set', +//Added while moving Inventory Notifications from Users to Settings +'QuoteNotificationDescription'=>'During quote generation if the product stock in warehouse is lesser than the quantity mentioned in quote then this notification will be sent to the product handler', +'SalesOrderNotificationDescription'=>'During sales order generation if the product stock in warehouse is lesser than the quantity mentioned in sales order then this notification will be sent to the product handler', +'Tools'=>'Tools', +'QuoteNotification'=>'Product Stock Notification during Quote Generation', +'SalesOrderNotification'=>'Product Stock Notification during Sales Order Generation', +'LBL_NOTE_DO_NOT_REMOVE_INFO'=>'Note: Donot remove or alter the values within { }', + +//Added while moving Profile file from User to Setting Module +'LBL_TOTAL'=>'Total :', +'LBL_NEW_PROFILE'=>'New Profile', +'LBL_LIST_NO'=>'#', +'LBL_NEW_PROFILE_NAME'=>'Profile Name', +'LBL_LIST_TOOLS'=>'Tools', +'LBL_PROFILE_MESG'=>'Viewing access privileges for', +'LBL_PROFILE_PRIVILEGES'=>'Profile Privileges', +'LBL_DEFINE_PRIV_FOR'=>' Define Privileges for ', +'LBL_USE_OPTION_TO_SET_PRIV'=>'Use the options below to set privileges', +'LBL_SUPER_USER_PRIV'=>'Global Privileges', +'LBL_SET_PRIV_FOR_EACH_MODULE'=>'Set Privileges for each Module ', +'LBL_FIELDS_AND_TOOLS_SETTINGS'=>'Fields & Tools Settings', +'LBL_VIEW_ALL'=>'View all', +'LBL_EDIT_ALL'=>'Edit all', +'LBL_ALLOW'=>'Allows', +'LBL_MESG_VIEW'=>'to view all information / modules of vtiger CRM', +'LBL_MESG_EDIT'=>'to edit all information / modules of vtiger CRM', +'LBL_TAB_MESG_OPTION'=>'modules to be shown', +'LBL_CREATE_EDIT'=>'Create/Edit', +'LBL_VIEW'=>'View', +'LBL_MANDATORY_MSG'=>'Mandatory Fields', +'LBL_DISABLE_FIELD_MSG'=>'Fields Disabled from Global Field Access Settings', +'LBL_DELETE'=>'Delete', + +'LBL_STEP_2_2'=>'Step 2 of 2', +'LBL_FINISH_BUTTON'=>'Finish', + +//Added while moving Groups file from User to Setting Module +'LBL_NEW_GROUP'=>'New Group', +'LBL_GROUPS'=>'Groups', +'LBL_GROUP_NAME'=>'Group Name', +'LBL_ROLES_SUBORDINATES'=>'Roles and Subordinates', +'LBL_MEMBER_AVLBL'=>'Available Entities & Members', +'LBL_MEMBER_SELECTED'=>'Selected Members', +'LBL_ENTITY'=>'Entity', +'LBL_OF'=>'of', +'LBL_CREATE_NEW_GROUP'=>'Create New Group', +'LBL_ADD_GROUP_BUTTON'=>'Add Group', +'LBL_GROUP_MESG1'=>'Groups are a flexible way to assign access rights, when complex access rights has to be defined. You can combine multiple entities like Roles, Users, profiles etc into a single group.', +'LBL_GROUP_MESG2'=>'To add, select the Entity members from left and click the ">>" button.', +'LBL_GROUP_MESG3'=>'To remove, select the group members from the right and click the "<<" button.', + +//Sharing Privileges +'LBL_GLOBAL_ACCESS_PRIVILEGES'=>'Organization-level Sharing Rules', +'LBL_RECALCULATE_BUTTON'=>'Recalculate', +'LBL_CHANGE'=>'Change', +'LBL_PRIVILEGES'=>'Privileges', +'LBL_CUSTOM_ACCESS_PRIVILEGES'=>'Custom Sharing Rules', +'LBL_ADD_PRIVILEGES_BUTTON'=>'Add Privileges', +'LBL_RULE_NO'=>'Rule No.', +'LBL_CAN_BE_ACCESSED'=>'can be accessed by', +'LBL_CUSTOM_ACCESS_MESG'=>'No Custom Access Rules defined .', +'LNK_CLICK_HERE'=>'Click here', +'LBL_CREATE_RULE_MESG'=>'to create a new Rule', +'LBL_RECALC_MSG'=>'Are you sure, you wish to Recalculate Sharing Access?', +'LBL_YES'=>'Yes', +'LBL_NO'=>'No', +'LBL_IN_PERMISSION'=>'in the permission', +'LBL_RELATED_MODULE_RIGHTS'=>'Related Module Rights', +'LBL_USR_CAN_ACCESS'=>'Users can ', +'LBL_USR_OTHERS'=>' other users ', +'LBL_USR_CANNOT_ACCESS'=>'Users cannot access other users ', + +'LBL_ORG_SHARING_PRIVILEGES'=>'Organisation Sharing Privileges', +'LBL_EDIT_PERMISSIONS'=>'Edit Permissions', +'LBL_SAVE_PERMISSIONS'=>'Save Permissions', +'LBL_READ_ONLY'=>'Public: Read Only', +'LBL_EDIT_CREATE_ONLY'=>'Public: Read, Create/Edit', +'LBL_READ_CREATE_EDIT_DEL'=>'Public: Read, Create/Edit, Delete', +'LBL_PRIVATE'=>'Private', + +'Public: Read Only'=>'Public: Read Only', +'Public: Read, Create/Edit'=>'Public: Read, Create/Edit', +'Public: Read, Create/Edit, Delete'=>'Public: Read, Create/Edit, Delete', +'Private'=>'Private', +'Hide Details'=>'Hide Details', +'Hide Details and Add Events'=>'Hide Details and Add Events', +'Show Details'=>'Show Details', +'Show Details and Add Events'=>'Show Details and Add Events', + +//Added for User Login History While moving from User to Settings +'LBL_LOGIN_HISTORY'=>'Login History', +//Sharing Access module moved to Setting +'Read/Write'=>'Read/Write', +'Read Only '=>'Read Only ', +'LBL_GROUP'=>'Group', +'LBL_ACCESS_RIGHTS_FOR_MODULES'=>'Access rights for relative modules', +'LBL_ADD_RULE'=>'Add Rule', +'LBL_ADD_CUSTOM_RULE'=>'Add Custom Privilege Rule', +'LBL_RULE_CONSTRUCTION'=>'Rule Construction Display', +'LBL_STEP'=>'Step', +'LBL_SELECT_ENTITY'=>'Select an entity below', +'LBL_CAN_BE_ACCESSED_BY'=>'Can be accessed by', +'LBL_PERMISSIONS'=>'Permissions', +'LBL_DOC_MSWORD'=>'File has to be a Document of type doc/msword', +'LBL_NODOC'=>'No doc File in this directory.Please try again!', + +//Added for error messages on Company Info. +'LOGO_ERROR'=>'Logo has to be an Image of type jpeg/png', +'Error_Message'=>'Error Message', +'Invalid_file'=>'Invalid file OR', +'File_has_no_data'=>'File has no data', +'Sorry'=>'Sorry', +'uploaded_file_exceeds_maximum_limit'=>'the uploaded file exceeds the maximum vtiger_filesize limit', +'try_file_smaller'=>'Please try a file smaller than 800000 bytes', +'Problems_in_upload'=>'Problems in file upload', +'Please_try_again'=>'Please try again!', +//5.0.3 fixes +'LBL_TESTMAILSTATUS'=>'Test Mail Status : ', +'LBL_CHECK_ASSIGNEDTO_MAILID'=>'Please check the assigned-to emailid', +'LBL_MAILSENDERROR'=>'Mail could not be sent to the admin user. Please check the admin emailid/Server settings', +'LBL_RECORD_NOEXIST'=>'Record not present', +'LBL_ENTER_PROFILE'=>'Enter Profile Name', +'LBL_ENABLE'=>'Enable', +'LBL_DISABLE'=>'Disable', +'LBL_PROXY'=>'proxy', +'LBL_FIELDS_TO_BE_SHOWN'=>'Fields to be shown', +//Added for alerts +'SPECIFY_FILE_TO_MERGE' => 'Please Specify a File to Merge', +'FILESIZE_EXCEEDS_INFO_CONFIG_INC' => 'Sorry, the uploaded file exceeds the maximum file size limit in config.inc.php. Please try a smaller file', +'FILESIZE_EXCEEDS_INFO_PHP_INI' => 'Sorry, the uploaded file exceeds the maximum file size limit in php.ini. Please try a smaller file', +'PROBLEMS_IN_FILEUPLOAD' => 'Problems in file upload. Please try again!', + +//Added fields for Invoice Number labels +'LBL_CUSTOMIZE_INVOICE_NUMBER'=>'Customize Invoice Number', +'LBL_CUSTOMIZE_INVOICE_NUMBER_DESCRIPTION'=>'Invoice Number Customization', +'LBL_CUSTOM_INVOICE_NUMBER_VIEW'=>'Invoice Number Customization', +'LBL_CUSTOMINVOICE_STRING'=>'Custom Invoice String', +'LBL_CUSTOMINVOICE_NUMBER'=>'Custom Invoice Number', +'LBL_INVOICE_NUMBER_PREVIEW'=>'Preview', +'LBL_INVOICE_NUMBER_BUTTON'=>'Update Invoice Number', +'LBL_PROXY_AUTHENTICATION_REQUIRED'=>'Proxy Authentication Required', +'LBL_ENABLE_FTP' => 'You must have FTP support enabled in php', + +//Added for Role Labels +'LBL_ADD_ROLE'=>'Add Role', +'LBL_EDIT_ROLE'=>'Edit Role', +'LBL_MOVE_ROLE'=>'Move Role', +'LBL_BACKUP_DESC'=>' The CRM system allows you to make a backup of the database to your FTP server. The CRM will take backup of all data whenever an admin user logs out. Make sure you have enough disk space available on your FTP server. The created backup file will be in the following format: "backup_date_time.sql".', + +// Added/Updated for vtiger CRM 5.0.4 +'LBL_SUPPORT_NOTICIATION'=>'Support End Notification before a week', +'LBL_SUPPORT_NOTICIATION_MONTH'=>'Support End Notification before a month' , +'LBL_SUPPORT_DESCRIPTION'=>'Notify before one week when support is about to end', +'LBL_SUPPORT_DESCRIPTION_MONTH'=>'Notify before one month when support is about to end', +'LBL_SELECT_ROLE'=>'Select Role', +'LBL_TEMPLATE'=>'Template', +'LBL_SELECT_EMAIL_TEMPLATE_FOR'=>'Select the Email Template for', + +'ERR_CUSTOM_FIELD_WITH_NAME'=>'Custom Field with the Name ', +'ERR_ALREADY_EXISTS'=>' already exists.', +'ERR_SPECIFY_DIFFERENT_LABEL'=>'Please specify a different Label', +'LBL_TOOLS_TO_BE_SHOWN'=>'Tools to be shown', +'LBL_PICKLIST_GLOBAL_CHANGE'=>'Global Change', +'LBL_PICKLIST_TRANSFER'=>'Transfering the values Of ', +'LBL_REPLACE_VALUE_WITH'=>'Replace value with ', +'LBL_EDIT_CUSTOM_RULE'=>'Edit Custom Privilege Rule', + +/*for global add/delete in picklist*/ +'DELETE_PICKLIST_VALUES'=>'Delete PickList Values', +'EDIT_PICKLIST_VALUE'=>'Edit PickList Value', +'ADD_PICKLIST_VALUES'=>'Add PickList Values', +'LBL_PICKLIST_ADDINFO'=>'Type the new entries one-by-one below', +'LBL_SELECT_ROLES'=> 'Select the Roles to which entries have to be added', +'LBL_EXISTING_PICKLIST_VALUES'=>'Existing Picklist Values', +'LBL_SELECT_PICKLIST'=>'Select picklist', + +// Added after 5.0.4 GA + +'LBL_GENERAL_FIELDS'=>'General Fields', + +'LBL_CANCEL_BUTTON'=>'Cancel', + +//Added fields for Inventory Number labels +'LBL_CUSTOMIZE_INVENTORY_NUMBER'=>'Customize Inventory Sequence', +'LBL_CUSTOMIZE_INVENTORY_NUMBER_DESCRIPTION'=>'Inventory Sequence Customization', +'LBL_CUSTOM_QUOTE_NUMBER_VIEW'=>'Quote Number Customization', +'LBL_CUSTOMQUOTE_STRING'=>'Custom Quote String', +'LBL_CUSTOMQUOTE_NUMBER'=>'Custom Quote Number', +'LBL_QUOTE_NUMBER_PREVIEW'=>'Preview', +'LBL_QUOTE_NUMBER_BUTTON'=>'Update Quote Number', +'LBL_CUSTOM_SO_NUMBER_VIEW'=>'SalesOrder Number Customization', +'LBL_CUSTOMSO_STRING'=>'Custom SalesOrder String', +'LBL_CUSTOMSO_NUMBER'=>'Custom SalesOrder Number', +'LBL_SO_NUMBER_PREVIEW'=>'Preview', +'LBL_SO_NUMBER_BUTTON'=>'Update SalesOrder Number', +'LBL_CUSTOM_PO_NUMBER_VIEW'=>'PurchaseOrder Number Customization', +'LBL_CUSTOMPO_STRING'=>'Custom PurchaseOrder String', +'LBL_CUSTOMPO_NUMBER'=>'Custom PurchaseOrder Number', +'LBL_PO_NUMBER_PREVIEW'=>'Preview', +'LBL_PO_NUMBER_BUTTON'=>'Update PurchaseOrder Number', + +// Added after 5.0.4 GA + +// Added for Multi-Currency Support +'LBL_TRANSFER_CURRENCY'=>'Transfer Currency', +'LBL_CURRENT_CURRENCY'=>'Current Currency', + +//Added for new backup labels +'LBL_LOCAL'=>'Local', +'LBL_BACKUP'=>'Backup', +'LBL_BACKUP_LOCATION'=>'Backup Location', + +'LBL_LAYOUT_EDITOR'=>'Layout Editor', +'LBL_LAYOUT_EDITOR_DESCRIPTION'=>'Designing and Modifying the layout in each of the modules', +'LBL_Show'=>'Show', +'LBL_Hide'=>'Hide', + +// vtlib customization: Language Stings +'VTLIB_LBL_MODULE_MANAGER'=>'Module Manager', +'VTLIB_LBL_MODULE_MANAGER_DESCRIPTION'=>'Manage module behavior inside vtiger CRM', +'VTLIB_LBL_MODULE_MANAGER_CUSTOMMOD'=>'Custom Modules', +'VTLIB_LBL_MODULE_MANAGER_STANDARDMOD'=>'Standard Modules', +'VTLIB_LBL_MODULE_MANAGER_NOMODULES'=>'No custom modules found! Create one or Import New ...', + +// vtmailscanner START +'LBL_MAIL_SCANNER'=>'Mail Scanner', +'LBL_MAIL_SCANNER_DESCRIPTION'=>'Configure mailbox for scanning', +'LBL_SCAN_NOW'=>'Scan Now', +'LBL_RULE'=>'Rule', +'LBL_SETUP'=>'Setup', +'LBL_CONFIGURE'=>'Configure', +'LBL_MAILBOX' => 'Mailbox', +'LBL_INFORMATION' => 'Information', +'LBL_SCANNER' => 'Scanner', +'LBL_SERVER' => 'Server', +'LBL_PROTOCOL'=> 'Protocol', +'LBL_PASSWORD'=> 'Password', +'LBL_TYPE' => 'Type', +'LBL_SSL' => 'SSL', +'LBL_METHOD'=> 'Method', +'LBL_VAL_SSL_CERT'=>'Validate SSL Certificate', +'LBL_DONOT_VAL_SSL_CERT'=>'Do Not Validate SSL Certificate', +'LBL_STATUS'=>'Status', +'LBL_ENABLE'=>'Enable', +'LBL_DISABLE'=>'Disable', +'LBL_CONNECT'=>'Connect', +'LBL_URL_CAPS'=>'URL', +'LBL_ENABLED'=>'Enabled', +'LBL_DISABLED'=>'Disabled', +'LBL_RULES'=>'Rules', +'LBL_FOR'=>'For', + +'LBL_FROM'=>'From', +'LBL_TO'=>'To', + +'LBL_ACTION'=>'Action', +'LBL_CREATE'=>'Create', +'LBL_TICKET'=>'Ticket', +'LBL_ADD'=>'Add', + +'LBL_CONTACT'=>'Contact', +'LBL_ACCOUNT'=>'Account', + +'LBL_FROM_CAPS'=>'FROM', +'LBL_TO_CAPS'=>'TO', +'LBL_TO_SMALL'=>'to', + +'LBL_CONTAINS'=>'Contains', +'LBL_EQUALS'=>'Equals', + +'LBL_BEGINS'=>'Begins', + +'LBL_REGEX'=>'Regex', +'LBL_ENDS'=>'Ends', +'LBL_BODY'=>'Body', + +'LBL_NOT'=>'Not', + +'LBL_ALL' => 'All', +'LBL_ANY'=>'Any', +'LBL_CONDITION'=>'Condition', +'LBL_ACTION'=>'Action', +'LBL_MOVE'=>'Move', +'LBL_UP'=>'Up', +'LBL_DOWN'=>'Down', +'LBL_PRIORITY'=>'Priority', +'LBL_UPDATE'=>'Update', +'LBL_SELECT'=>'Select', +'LBL_FOLDERS'=>'Folders', +'LBL_UNSELECT'=>'Unselect', +'LBL_MATCH'=>'Match', +'LBL_SCANNING'=>'Scanning', +'LBL_LOOKFOR'=>'Look for', +'LBL_UNREAD'=>'Unread', +'LBL_READ'=>'Read', +'LBL_AFTER_SCAN'=>'After scan', +'LBL_MESSAGES_FROM_LASTSCAN'=>'Messages from lastscan', +'LBL_MARK_MESSAGE_AS'=>'Mark message as', + +//Added for the workflow module +'LBL_LIST_WORKFLOWS'=>'Workflows', +'LBL_LIST_WORKFLOWS_DESCRIPTION' => 'Create and edit workflows for vtiger', +'LBL_TASK_TITLE'=>'Task Title', +'LBL_PARENT_WORKFLOW'=>'Parent Workflow', +'MSG_EXECUTE_TASK_DELAY'=>'Execute the task after some delay', +'LBL_AFTER'=>'After', +'LBL_BEFORE'=>'Before', +'LBL_TASK_OPERATIONS'=>'Task Operations', +'LBL_CREATE_TASK'=>'Create Task', +'LBL_CREATE_TASK_OF_TYPE'=>'Create a new task of type', +'LBL_SUMMARY'=>'Summary', +'LBL_WHEN_TO_RUN_WORKFLOW'=>'When to run the workflow', +'LBL_ONLY_ON_FIRST_SAVE'=>'Only on the first save', +'LBL_UNTIL_FIRST_TIME_CONDITION_TRUE'=>'Until the first time the condition is true', +'LBL_EVERYTIME_RECORD_SAVED'=>'Every time the the record is saved', +'LBL_CONDITIONS'=>'Conditions', +'LBL_NEW_CONDITION_BUTTON_LABEL'=>'New Condition', +'LBL_TASKS'=>'Tasks', +'LBL_NEW_TASK_BUTTON_LABEL'=>'New Task', +'LBL_TASK'=>'Task', +// END +//Added for vantage customization (Mandatory fields) -- Pavani +'LBL_MANDATORY_FIELDS'=>'Mandatory Fields', +'LBL_MANDATORY_FIELDS_DESCRIPTION'=>'Manage mandatory fields of all modules', +// Module Sequence Numbering +'LBL_CUSTOMIZE_MODENT_NUMBER'=>'Customize Record Numbering', +'LBL_CUSTOMIZE_MODENT_NUMBER_DESCRIPTION'=>'Module Entity Number customization', +// END + +//added for softphone integration +'LBL_SOFTPHONE_SERVER_SETTINGS'=>'SoftPhone Server Settings', +'LBL_SOFTPHONE_SERVER_SETTINGS_DESCRIPTION'=>'Configure your softphone here', +'ASTERISK_SERVER_IP'=>'Asterisk server IP ', +'ASTERISK_PORT'=>'Asterisk server port', +'ASTERISK_USERNAME'=>'Asterisk username', +'ASTERISK_PASSWORD'=>'Asterisk password', +'ASTERISK_SERVER_IP_TITLE'=>'The URL of the asterisk server', +'ASTERISK_PORT_TITLE'=>'The port where asterisk call manager API can connect to Asterisk (default 5038)', +'ASTERISK_USERNAME_TITLE'=>'The asterisk username (generally the admin username)', +'ASTERISK_PASSWORD_TITLE'=>'Password for the asterisk user', +'LBL_CANCEL_BUTTON'=>'Cancel', +'ASTERISK_VERSION' => 'Asterisk Version', +'ASTERISK_VERSION_TITLE'=>'Select your Asterisk version here; leave it as 1.4 if not sure', +'ASTERISK_CONFIGURATION'=>'Asterisk Configuration', +//softphone integration ends +'LBL_SELECT_FIELD_TO_MOVE' => 'Select Fields to move', +'VTLIB_LBL_SELECT_PACKAGE_FILE'=>'Select the Package File', +'VTLIB_LBL_FILE_LOCATION'=>'File location:', +'VTLIB_LBL_PACKAGE_FILE_HELP'=>'vtiger module is packaged as a zip file.', +'VTLIB_LBL_IMPORT_FAILURE'=>'Import Failure', +'VTLIB_LBL_INVALID_FILE'=>'Invalid file', +'VTLIB_LBL_INVALID_IMPORT_TRY_AGAIN'=>'provided for module import! Try Again.', +'VTLIB_LBL_UNABLE_TO_UPLOAD'=>'Unable to upload', +'VTLIB_LBL_UNABLE_TO_UPLOAD2'=>'the package on the server! Try Again.', +'VTLIB_LBL_VERIFY_IMPORT_DETAILS'=>'Verify Import Details', +'VTLIB_LBL_MODULE_NAME'=>'Module Name', +'VTLIB_LBL_MODULE_DIR'=>'Module Directory', +'VTLIB_LBL_REQ_VTIGER_VERSION'=>'Req. vtiger version', +'VTLIB_LBL_LICENSE'=>'License', +'VTLIB_LBL_LICENSE_ACCEPT_AGREEMENT'=>'I accept the license agreement.', +'VTLIB_LBL_PROCEED_WITH_IMPORT'=>'Do you want to proceed with the import?', +'VTLIB_LBL_IMPORTING_MODULE_START'=>'Importing Module ...', +'VTLIB_LBL_WARNING'=>'Warning', +'VTLIB_LBL_NOT_WRITEABLE'=>'not writeable', +'VTLIB_LBL_PACKAGE_VERSION'=>'Version', + +'LBL_UPGRADE'=>'Upgrade', +'VTLIB_LBL_UPDATE_FAILURE'=>'Upgrade Failure', +'VTLIB_LBL_MODULENAME_MISMATCH'=>'Module name mistmach', +'VTLIB_LBL_TRY_AGAIN'=>'Try Again', +'VTLIB_LBL_VERIFY_UPDATE_DETAILS'=>'Verify Upgrade Details', +'VTLIB_LBL_PROCEED_WITH_UPDATE'=>'Do you want to proceed with the upgrade?', +'VTLIB_LBL_UPDAING_MODULE_START'=>'Updating module...', +'VTLIB_LBL_EXISTS'=>'Exists', +'VTLIB_LBL_NOT_PRESENT'=>'Not Present', +'VTLIB_LBL_INST_VERSION'=>'Installed Version', +'VTLIB_LBL_MATCHES_PACKAGE_VERSION'=>'matches Package Version', +'VTLIB_LBL_CANNOT_UPGRADE'=>'Cannot updgrade!', +// END + +//User group fixes +'LBL_USERNAME_EXIST' => 'A User in the specified name Already Exists!', +'LBL_GROUPNAME_EXIST' => 'A Group in the specified name Already Exists!', +'LBL_ROLENAME_EXIST' => 'Role name already exists', + +//layout editor +'LBL_MOVE_FIELDS' => 'Move Fields', +'NO_HIDDEN_FIELDS' => 'No Hidden Fields', +'LBL_RELATED_LIST' => 'Related List', +'LBL_ADD_BLOCK' => 'Add Block', +'HIDDEN_FIELDS' => 'Hidden Fields', +'DOWN'=> 'Down', +'UP'=> 'Up', +'RIGHT' => 'Right', +'LEFT' => 'Left', +'LBL_EDIT_PROPERTIES' => 'Edit Properties', +'LBL_MANDATORY_FIELD' => 'Mandatory Field', +'LBL_ACTIVE' => 'Active', +'LBL_QUICK_CREATE' => 'Quick Create', +'LBL_MASS_EDIT' => 'Mass Edit', +'LBL_BLOCK_NAME' => 'Block name', +'AFTER' => 'After', +'ADD_BLOCK' => 'Add Block', +'ARRANGE_RELATEDLIST' => 'Arrange RelatedList', +'CUSTOMFIELD_MAPPING' => 'CustomField Mapping', +'LBL_MAPPED_FIELDS' => 'Mapped Fields', +'LEADS_CUSTOM_FIELD_MAPPING_DESCRIPTION' => 'Map Your Leads Customfields with Accounts,Contacts and Potentials', +'LEADS_CUSTOM_FIELD_MAPPING'=> 'Leads CustomField Mapping', +'LBL_CALENDER_CUSTOMFIELDS' => 'Calendar Custom Fields', +'LBL_CALENDER_CUSTOMFIELDS_DESCRIPTION' => 'You can Create Custom Fields for Calendar', +'LBL_GO_BACK'=>'Go Back', + +//Added fix for: 5418 +'LBL_USE_PREFIX' => 'Use Prefix', +'LBL_START_SEQ' => 'Start Sequence', +'LBL_MODULE_NUMBERING' => 'Module Numbering', +'LBL_FAILED' => 'Failed', +'LBL_DONE' => 'Done', +'LBL_IN_USE' => 'IN USE', +'LBL_MODULE_NUMBERING_FIX_MISSING' => 'Update Missing Record Sequence Now', + +//Added for: 5473 +'LBL_SHARING_ACCESS_HELPNOTE' => 'After making modifications, press Recalculate button to apply the changes.', + +//for customer portal extension module +'PORTAL_EXTENSION_DESCRIPTION'=>'Allows you to Configure Customer Portal Plugin', +'LBL_CUSTOMER_PORTAL'=> 'Customer Portal', + +//FieldFormulas +'LBL_FIELDFORMULAS' => 'Field Formulas', +'LBL_FIELDFORMULAS_DESCRIPTION' => 'Add custom equations to custom fields', +); +?> diff --git a/oss/vtiger/trunk/modules/Settings/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Settings/language/zh_cn.lang.php new file mode 100644 index 00000000..41c05cc1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/language/zh_cn.lang.php @@ -0,0 +1,1043 @@ + '设定', + 'LBL_MODULE_TITLE' => '设定: 首页', + 'LBL_LIST_CONTACT_ROLE' => '职位', + + + + 'LBL_LIST_LAST_NAME' => '姓氏', + 'LBL_FIRST_NAME' => '姓名:', + 'LBL_LAST_NAME' => '姓氏:', + 'LBL_PHONE' => '电话:', + 'LBL_EMAIL_ADDRESS' => '电子邮件', + + 'LBL_TRANSCURR' => '转换使用者货币为', + +'LBL_CURRDEL' => '要删除的货币', + 'LBL_NEW_FORM_TITLE' => '新增联系人', + 'LBL_NEW_CURRENCY' => '新货币', + 'LBL_VIEWING' => '检视中', + 'LBL_CURRENCY_NAME' => '货币名称', + 'LBL_CURRENCY_CODE' => '货币编码', + 'LBL_CURRENCY_SYMBOL' => '货币符号', + 'LBL_CURRENCY_CRATE' => '汇率', + 'LBL_CURRENCY_STATUS' => '状态', + 'LBL_CURRENCY_TOOL' => '工具', + 'LBL_CURRENCY_LIST' => '货币列表', + + + 'NTC_DELETE_CONFIRMATION' => '您确定要删除这笔记录?', + +'LEADCUSTOMFIELDS' => '潜在客户自订字段', + + 'ACCOUNTCUSTOMFIELDS' => '客户自订字段', + +'CONTACTCUSTOMFIELDS' => '联系人自订字段', + + 'OPPORTUNITYCUSTOMFIELDS' => '潜在机会自订字段', + +'HELPDESKCUSTOMFIELDS' => '服务台自订字段', + + 'PRODUCTCUSTOMFIELDS' => '业务类型自订字段', + + 'VENDORCUSTOMFIELDS' => '厂商自订字段', + + 'PRICEBOOKCUSTOMFIELDS' => '价目表自订字段', + +'POCUSTOMFIELDS' => '采购订单自订字段', +'SOCUSTOMFIELDS' => '销售订单自订字段', +'QUOTESCUSTOMFIELDS' => '报价单自订字段', +'INVOICECUSTOMFIELDS' => '发票自订字段', + + 'EDITLEADPICKLISTVALUES' => '编辑潜在客户列表 ', + 'EDITACCOUNTPICKLISTVALUES' => '编辑客户列表 ', + 'EDITCONTACTPICKLISTVALUES' => '编辑联系人列表 ', + 'EDITOPPORTUNITYPICKLISTVALUES' => '编辑潜在机会列表 ', + 'EDITHELPDESKPICKLISTVALUES' => '编辑服务台列表 ', + + 'EDITPRODUCTPICKLISTVALUES' => '编辑业务类型列表 ', + 'EDITEVENTPICKLISTVALUES' => '编辑事件列表 ', + 'EDITTASKPICKLISTVALUES' => '编辑任务列表 ', + 'EDITRSSPICKLISTVALUES' => '编辑RSS列表', + 'EDITVENDORPICKLISTVALUES' => '编辑厂商列表', + 'EDITPBPICKLISTVALUES' => '编辑价目表列表', + 'EDITPOPICKLISTVALUES' => '编辑采购订单列表', + 'EDITSOPICKLISTVALUES' => '编辑销售订单列表', + 'EDITQUOTEPICKLISTVALUES' => '编辑报价单列表', + 'EDITINVOICEPICKLISTVALUES' => '编辑发票列表', + + +// Added for Release vtigerCRM 3.2 PATCH 1.0 + +//Settings/index.php + + + 'LBL_PICKLIST_FIELD_SETTINGS' => '列表字段设定:', + + +//SETTINGS/CustomFieldList.php,ComboFieldList.php,CreateCustomField.php + + 'Leads' => '潜在客户', + 'Accounts' => '客户', + 'Contacts' => '联系人', + 'Potentials' => '潜在机会', + 'HelpDesk' => '服务台', + 'Products' => '业务类型', + 'Events' => '事件', + 'Activities' => '任务', + + + + + + 'CustomFields' => ' 自订字段', + + 'NewCustomField' => '新增自订字段', + 'NewCustomFieldAltC' => '新增自订字段 [Alt+c]:', + 'FieldName' => '文件名称', + 'FieldType' => '字段类型', + 'FieldLabel' => '字段标签', + 'Delete' => '删除', + 'NEW' => '新增', + 'CUSTOMFIELD' => '自订字段', + 'LBL_CUSTOM_FIELDS' => '自订字段', + 'LBL_ADD_FIELD' => '新增字段', + 'LBL_CUSTM_MSG' => '允许您...', + +'PicklistFields' => ' 选择列表字段', + 'Edit' => '编辑', + 'LBL_EDIT_FIELD_TYPE' => '编辑字段类型', + +//Settings/CustomField.html + +'LBL_PROVIDE_FIELD_INFORMATION' => '提供字段信息: ', + 'LBL_SELECT_FIELD_TYPE' => '选择字段类别: ', + 'LBL_PROVIDE_FIELD_DETAILS' => '提供字段细节: ', + 'LBL_LABEL' => '标签: ', + 'LBL_LENGTH' => '长度: ', + 'LBL_DECIMAL_PLACES' => '小数点: ', + 'LBL_PICK_LIST_VALUES' => '选择列表值: ', + + + +//Settings/EditComboField.php + + 'EditPickListValues' => '编辑选择列表 ', + + + +//Settings/EditField.html + +'LBL_FIELD_INFORMATION' => '字段信息:', + 'Values' => '值', + +'EnterListOfValues' => '请输入列表值.', + + +//Settings/fieldtypes.php + +'Text' => '文字', + 'Number' => '数值', + 'Percent' => '百分比', + 'Currency' => '货币', + 'Date' => '日期', + 'Email' => '电子邮件', + 'Phone' => '电话', + 'PickList' => '选择列表', + 'LBL_MULTISELECT_COMBO' => '多选区块', + 'Skype' => 'Skype', + + +//added for patch2 + + 'USERGROUPLIST' => '用户组', + + 'EMAILTEMPLATES' => '电子邮件模板', + 'WORDINTEGRATION' => '邮件合并模板', + 'LBL_MAIL_MERGE' => '邮件合并', + 'NOTIFICATIONSCHEDULERS' => '通知列表', +//currency status + 'LBL_ACTIVE' => '启用', + 'LBL_INACTIVE' => '停用', + 'LBL_NOTIFICATION' => '提醒', + 'LBL_DESCRIPTION' => '说明', + 'LBL_TOOL' => '工具', + + +//Added fields for Title Informations -- after 4 Beta + + 'LBL_EMAIL_CONFIG' => '电子邮件环境设定', + 'LBL_WORD_INTEGRATION' => '完成文字:', + 'LBL_GROUP_SETTINGS' => '用户组设定:', + 'LBL_TEMPLATE_SETTINGS' => '模板设定:', + 'LBL_NOTIFICATION_SETTINGS' => '通知设定:', + +'LBL_EMAIL_SETTINGS' => '电子邮件设定:', + 'LBL_SECURITY_SETTINGS' => '安全设定:', + + + +//Added fields after RC1 - Release + + 'LBL_MAIL_SERVER_INFO' => '邮件服务器信息', + 'LBL_OUTGOING_MAIL_SERVER' => '邮件服务器', + 'LBL_OUTGOING_MAIL_SERVER_LOGIN_USER_NAME' => '邮件服务器登入使用者名称', + 'LBL_OUTGOING_MAIL_SERVER_PASSWORD' => '邮件服务器登入密码', + 'LBL_MAIL_SERVER_SMTP' => '邮件服务器 (SMTP)', + 'LBL_BACKUP_SERVER_CONFIG' => '备份服务器环境设定', + 'LBL_SERVER_ADDRESS' => '服务器地址', + 'LBL_FTP_SERVER_NAME' => '档案服务器名称', + 'LBL_FTP_USER_NAME' => '档案服务器登入使用者名称', + 'LBL_FTP_PASSWORD' => '档案服务器登入密码', + 'LBL_FTP' => 'FTP', + 'LBL_SYSTEM_CONFIG' => '系统环境设定', + 'LBL_SYSTEM_INFO' => '系统信息', + 'LBL_PROXY_SETTINGS' => '代理服务器设定', + 'LBL_AUDIT_TRAIL' => '稽核追踪信息', + 'LBL_ENABLE_AUDIT_TRAIL' => '启用稽核追踪', + 'LBL_USER_AUDIT' => '选择使用者', + 'LBL_VIEW_AUDIT_TRAIL' => '检视稽核追踪', + 'LBL_AUDIT_TRAIL_DESC' => '显示存取 CRM 使用者的稽核追踪', + 'LBL_NO_DATA' => '没有资料', + 'LBL_CURRENCY_CONFIGURATION' => '- 货币信息', + 'LBL_CURRENCY_CONFIG' => '货币设定', + 'LBL_CURRENCY_INFO' => '货币信息', + 'LBL_CURRENCY_TITLE' => '货币', + 'LBL_CURRENCY_SETTINGS' => '货币设定', + 'LBL_USERNAME' => '账号', + 'LBL_PASWRD' => '密码', + 'LBL_REQUIRES_AUTHENT' => '需要验证?', + +//Fields for Settings + + 'LBL_USER_MANAGEMENT' => '使用者管理', + 'LBL_USERS' => '使用者', + 'LBL_USERS_LIST' => '使用者列表', + 'LBL_GROUP_LIST' => '用户组列表', + 'LBL_CREATE_AND_MANAGE_USERS' => '- 建立和管理使用者 (e.g., admin)', + 'LBL_CREATE_AND_MANAGE_USER_ROLES' => '- 建立和管理职位 (e.g., Administrator, Standard User, etc.)', + 'LBL_PROFILES' => '数据', + 'LBL_PROFILES_LIST' => '资料列表', + 'LBL_CREATE_AND_MANAGE_USER_PROFILES' => '- 建立和管理使用者数据 (e.g., CEO, Sales Manager, etc.)', + 'LBL_CREATE_AND_MANAGE_USER_GROUPS' => '- 建立和管理使用者用户组', + 'LBL_SHARING_ACCESS' => '分享权限', + 'LBL_FIELDS_ACCESS' => '字段权限', + 'LBL_DEFAULT_ORGANIZATION_FIELDS' => '预设组织单位字段存取', + 'LBL_SETTING_DEFAULT_ORGANIZATION_FIELDS' => '设定组织单位的字段存取默认值', + 'LBL_SETTING_DEFAULT_SHARING_ACCESS' => '- 设定组织单位的分享存取默认值', + 'LBL_FIELD_ACCESSIBILITY' => '影响字段', + 'LBL_SETTING_FIELD_ACCESSIBILITY' => ' - 设定不同的数据之影响字段', +//<<<<<<<>>>>> +'LBL_FIELD_ORDERING_DESC' => ' - 编辑字段顺序', + 'LBL_FIELD_ORDERING' => '编辑字段区块', +//<<<<<<<<<>>>>>>>>>>>> + 'LBL_LEAD_FIELD_ACCESS' => '潜在客户字段存取', + 'LBL_ACCOUNT_FIELD_ACCESS' => '客户字段存取', + 'LBL_CONTACT_FIELD_ACCESS' => '联系人字段存取', + 'LBL_OPPORTUNITY_FIELD_ACCESS' => '潜在机会字段存取', + 'LBL_HELPDESK_FIELD_ACCESS' => '服务台字段存取', + 'LBL_PRODUCT_FIELD_ACCESS' => '业务类型字段存取', + 'LBL_NOTE_FIELD_ACCESS' => '备忘录字段存取', + 'LBL_EMAIL_FIELD_ACCESS' => '电子邮件字段存取', + 'LBL_TASK_FIELD_ACCESS' => '任务字段存取', + 'LBL_EVENT_FIELD_ACCESS' => '事件字段存取', + 'LBL_DELETE_DEMO_DATA' => '删除模板数据', + 'LBL_DELETE_DEMO_DATA_INFO' => '- 删除在安装时所建立的模板数据', + 'LBL_STUDIO' => '作业区', + 'LBL_CUSTOM_FIELD_SETTINGS' => '自订字段设定', + 'LBL_CREATE_AND_MANAGE_USER_DEFINED_FIELDS' => '- 建立和管理使用者定义字段', + 'LBL_SELECT_MODULE' => '选择模块', + + 'LBL_SELECT_CF_TEXT' => '选择模块:', + 'LBL_PICKLIST_SETTINGS' => '选择列表设定', + 'LBL_EDIT_PICKLIST_VALUES' => ' - 编辑选择列表字段设定值', + 'LBL_EDIT' => '编辑中', + 'LBL_COMMUNICATION_TEMPLATES' => '沟通模板', + 'LBL_CREATE_EMAIL_TEMPLATES' => ' - 建立电子邮件模板', + 'LBL_UPLOAD_MSWORD_TEMPLATES' => ' - 上传 MS Word 模板供合并邮件使用', + 'LBL_SCHEDULE_EMAIL_NOTIFICATION' => ' - 电子邮件通知列表', + 'LBL_EXPAND_CLOSE_MENU' => '展开/关闭选单', + 'LBL_CONFIGURATION' => '环境列表', + 'LBL_CONFIGURE_MAIL_SERVER' => ' - 设定邮件服务器', + 'LBL_BACKUP_SERVER_CONFIGURATION' => '备份服务器环境设定', + 'LBL_BACKUP_SERVER_INFO' => '备份服务器信息', + 'LBL_BACKUP_SERVER_SETTINGS' => '备份服务器设定', + 'LBL_CONFIGURE_BACKUP_SERVER' => ' - 设定备份服务器', + 'LBL_SYSTEM_CONFIGURATION' => ' - 系统环境设定', + 'LBL_PROXY_SERVER_CONFIGURATION' => '代理服务器设定', + 'LBL_PROXY_SERVER_INFO' => '代理服务器信息', + 'LBL_PROXY_SERVER_SETTINGS' => '代理服务器设定', + 'LBL_CONFIGURE_PROXY_SERVER' => ' - 设定代理服务器', + 'LBL_PROXY_PORT' => '连接埠', + + + +//Field Types for custom fields + + 'LBL_URL' => '网址', + 'LBL_CHECK_BOX' => '复选框', + + + +//PickList Settings + +'LBL_STANDARD_FIELDS' => '标准字段', + 'LBL_LEAD_SOURCE' => '接触来源', + 'LBL_SALUTATION' => '问候', + 'LBL_LEAD_STATUS' => '潜在客户身份', + 'LBL_INDUSTRY' => '企业', + 'LBL_RATING' => '评价', + 'LBL_ACCOUNT_TYPE' => '客户类型', + 'LBL_BUSINESS_TYPE' => '商业类型', + 'LBL_CURRENCY_TYPE' => '货币类型', + 'LBL_SALES_STAGE' => '客服场景', + 'LBL_PRIORITY' => '前置', + 'LBL_STATUS' => '身份', + 'LBL_CATEGORY' => '分类', + 'LBL_MANUFACTURER' => '厂商', + 'LBL_PRODUCT_CATEGORY' => '业务类型分类', + 'LBL_RSS_CATEGORY' => 'Rss类别', + +//Added for Web based Email client integration (post 4.0.1 release) + + 'LBL_ADD_MAIL_ACCOUNT' => '新增邮件账号', + 'LBL_NEW_MAIL_ACCOUNT_TITLE' => '新增邮件账号 [Alt+M]', + 'LBL_NEW_MAIL_ACCOUNT_KEY' => 'M', + 'LBL_NEW_MAIL_ACCOUNT_LABEL' => '新增邮件账号', + 'LBL_GENERAL_INFO' => '一般信息', + 'LBL_DISPLAY_NAME' => '显示名称', + 'LBL_MAIL_PROTOCOL' => '邮件协定', + 'LBL_LIST_PASSWORD' => '密码', + 'LBL_MAIL_SERVER_NAME' => '邮件服务器名称', + 'LBL_MAIL_SERVER_SETTINGS' => '外寄服务器', + 'LBL_INCOME_SERVER_SETTINGS' => '收件服务器', + 'LBL_TEST_SETTINGS' => '立刻测试我的设定', + 'LBL_TEST_BUTTON_TITLE' => '测试我的设定![Alt+T]', + 'LBL_TEST_BUTTON_KEY' => 'T', + 'LBL_TEST_BUTTON_LABEL' => '测试我的设定!', + 'LBL_DEFAULT' => '预设', + 'LBL_IMAP2' => 'IMAP2', + 'LBL_IMAP4' => 'IMAP4', + 'LBL_POP' => 'POP', + 'LBL_IMAP' => 'IMAP', + 'LBL_MAIL_DISCLAIM' => '有 * 符号表示必填,有 * * 表示完全支持', + 'LBL_SSL_OPTIONS' => 'SSL 选项', + 'LBL_TLS' => 'TLS', + 'LBL_NO_TLS' => 'No TLS', + 'LBL_CERT_VAL' => '验证执照', + 'LBL_INT_MAILER' => '使用内部邮件服务器?', + 'LBL_INT_MAILER_USE' => '是', + 'LBL_INT_MAILER_NOUSE' => '否', + 'LBL_VAL_SSL_CERT' => '验证 SSL 执照', + 'LBL_DONOT_VAL_SSL_CERT' => '不去验证 SSL 执照', + 'LBL_WEB_MAIL_CONFIG' => '网页邮件设定', + 'LBL_CONFIGURE_WEB_MAIL' => ' - 设定网页邮件', + 'LBL_LIST_MAIL_ACCOUNT' => '邮件账号列表', + 'LBL_USAGEUNIT' => '使用单位', + 'LBL_GLACCT' => '会计科目', + 'LBL_QUOTE_STAGE' => '报价策略', + 'LBL_CARRIER' => '运送单位', + 'LBL_TAXCLASS' => '税别', + 'LBL_MY_DETAILS' => '我的细节', + 'LBL_MY_MAIL_SERVER_DET' => '我的邮件服务器细节', + 'LBL_EMAIL_ID' => '信箱代号', + 'LBL_NAME_EXAMPLE' => '(例: John Fenner)', + 'LBL_EMAIL_EXAMPLE' => '(例: johnfenner@mailserver.com)', + 'LBL_REFRESH_TIMEOUT' => '重新整理频率', + 'LBL_1_MIN' => '1 分钟', + 'LBL_2_MIN' => '2 分钟', + 'LBL_3_MIN' => '3 分钟', + 'LBL_4_MIN' => '4 分钟', + 'LBL_5_MIN' => '5 分钟', + 'LBL_EMAILS_PER_PAGE' => '每页显示邮件数量', + +//Added for Organization Details (4.2 release) + 'LBL_ORGANIZATION_NAME' => '公司名称', + 'LBL_ORGANIZATION_ADDRESS' => '街道巷弄', + 'LBL_ORGANIZATION_CITY' => '乡镇市区', + 'LBL_ORGANIZATION_STATE' => '市(县)', + 'LBL_ORGANIZATION_CODE' => '邮政编码', + 'LBL_ORGANIZATION_COUNTRY' => '省(市/自治区)', + 'LBL_ORGANIZATION_PHONE' => '电话', + 'LBL_ORGANIZATION_FAX' => '传真', + 'LBL_ORGANIZATION_WEBSITE' => '网站', + 'LBL_ORGANIZATION_DETAILS' => '公司信息', + 'LBL_SPECIFY_COMPANY_DETAILS' => ' - 指定公司信息', + 'LBL_ORGANIZATION_LOGO' => 'Logo 名称', + 'LBL_UPLOAD' => '上传', + 'LBL_FILENAME' => '文件名称', + 'LBL_SETTINGS' => '设定', + 'LBL_COMPANY_DETAILS' => '公司细节', + 'LBL_SEVERITY' => '俭朴', + 'LBL_FAQ_CATEGORY' => '常见问答类别', + 'LBL_VENDOR_FIELD_ACCESS' => '厂商字段存取权限', + 'LBL_PB_FIELD_ACCESS' => '价目表字段存取权限', + 'LBL_QUOTE_FIELD_ACCESS' => '报价单字段存取权限', + 'LBL_PO_FIELD_ACCESS' => '采购订单字段存取权限', + 'LBL_SO_FIELD_ACCESS' => '销售订单字段存取权限', + 'LBL_INVOICE_FIELD_ACCESS' => '发票字段存取权限', + 'INVENTORYNOTIFICATION' => '库存提醒通知', + 'LBL_INVENTORY_NOTIFICATIONS' => '编辑库存邮件通知', + 'INVENTORYTERMSANDCONDITIONS' => '库存期间与条件',//newly added for Inventory terms and conditions + 'LBL_INVENTORY_TERMSANDCONDITIONS' => ' - 编辑库存期间与条件',//newly added + 'LBL_TANDC_TEXT' => '期间与条件内容', + 'LBL_INVENTORY_TANDC' => '库存期间与条件', + 'LBL_OTHER_SETTINGS' => '其它设定', + 'LBL_SCROLL' => '[回到顶部]', + 'LBL_INV_NOT_DESC' => '下面是提醒通知的列表,用来在手动建立报价单、销售订单与发票时寄送给产品处理者,包括需求与目前数量等信息', + 'InvoiceNotification' => '在建立发票时提醒产品库存', + 'InvoiceNotificationDescription' => '当产品库存低于安全存量时,提醒通知会发送给产品处理者', + 'Vendor' => '厂商', + 'PriceBook' => '价目表', + 'Quotes' => '报价单', + 'PurchaseOrder' => '采购订单', + 'SalesOrder' => '销售订单', + 'Invoice' => '发票', + +//For Custom Fields + 'LBL_LEAD_MAP_CUSTOM_FIELD' => '对应潜在客户字段', + 'leadCustomFieldDescription' => '将您的组织潜在客户字段对应到客户、联系人或潜在机会字段,在转换潜在客户时会使用到这些对应。', + 'LBL_MAPPING_INFO' => '对应信息', + 'LBL_ACCOUNT_FIELD' => '客户字段', + 'LBL_CONTACT_FIELD' => '联系人字段', + 'LBL_POTENTIAL_FIELD' => '潜在机会字段', + 'CUSTOMFIELDMAPPING' => '自订字段对应', + 'LBL_FIELD_MAPPING' => '字段对应', + 'LBL_LEAD_FIELD' => '潜在客户字段', +//After 4.2 GA + 'LBL_TEXT_AREA' => '文字区域', +//for Edit ordering the blocks + 'NOTESCUSTOMFIELDS' => '自订记事字段', + +//Added fields after 4.2 ptach 2 +'LBL_ASSIGN_MODULE_OWNERS' => '指定模块拥有者', + 'LBL_MODULE_OWNERS' => '模块拥有者', + 'LBL_ASSIGN_MODULE_OWNERS_INFO' => ' - 指定每个模块的拥有者', + 'LBL_MODULE' => '模块', + 'LBL_OWNER' => '拥有者', + 'LBL_MIGRATION' => '从上一个版本升级', + 'LBL_MIGRATION_INFO' => ' - 从上一个版本升级', + +//Added for 5 GA - Description of Settings UI + +'LBL_USER_DESCRIPTION' => '管理CRM的使用者', + 'LBL_ROLE_DESCRIPTION' => '定义角色阶层并且指派给使用者', + 'LBL_PROFILE_DESCRIPTION' => '定义每个角色存取数据权限', + 'LBL_GROUP_DESCRIPTION' => '基于角色、使用者、数据等自定义用户组', + 'LBL_SHARING_ACCESS_DESCRIPTION' => '定义每个角色存取CRM 模块的权限', + 'LBL_SHARING_FIELDS_DESCRIPTION' => '在每个CRM模块显示或隐藏字段', + 'LBL_MODULE_OWNERS_DESCRIPTION' => '指派每个CRM模块的拥有者', + 'LBL_ANNOUNCEMENT_DESCRIPTION' => '编辑公告显示的文字', + 'LBL_CUSTOM_FIELDS_DESCRIPTION' => '建立与管理使用者自订字段', + 'LBL_PICKLIST_DESCRIPTION' => '管理所有CRM 模块下拉选单的内容', + 'LBL_EMAIL_TEMPLATE_DESCRIPTION' => '管理邮件模块的模板', + 'LBL_MAIL_MERGE_DESCRIPTION' => '管理邮件合并的模板', + 'LBL_NOTIF_SCHED_DESCRIPTION' => '管理重要操作的警示通知', + 'LBL_INV_NOTIF_DESCRIPTION' => '修改库存相关提醒的设定', + 'LBL_INV_TANDC_DESCRIPTION' => '管理期间与条件文字内容', + 'LBL_COMPANY_DESCRIPTION' => '管理公司数据', + 'LBL_MAIL_SERVER_DESCRIPTION' => '编辑寄件邮件服务器设定', + 'LBL_BACKUP_SERVER_DESCRIPTION' => '编辑备份服务器设定', + 'LBL_CURRENCY_DESCRIPTION' => '管理货币与汇率', + 'LBL_TAX_DESCRIPTION' => '管理税务', + 'LBL_SYSTEM_DESCRIPTION' => '显示系统设定', + 'LBL_PROXY_DESCRIPTION' => '编辑联机设定', + 'LBL_AUDIT_DESCRIPTION' => '显示稽核追踪设定', + 'LBL_TAX_DESC' => '管理税务设定', + 'LBL_COMPANY_DESC' => '公司的信息与联络方式', + 'LBL_SELECT_LOGO' => '选择新的代表图示:', + 'LBL_INVEN_TANDC_DESC' => '修改在库存模块中显示的期间与限制区域文字', + 'LBL_MAIL_SERVER_DESC' => '管理邮件服务器设定', + 'LBL_BACKUP_SERVER_DESC' => '管理备份服务器设定', + 'LBL_MODULES_AND_OWNERS' => '模块与拥有者', + 'LBL_GROUP_DESC' => '管理使用者用户组', + 'LBL_MAIL_MERGE_DESC' => '管理 CRM 模块使用的邮件合并样板', + + +//Added fields after 5.0 Alpha + 'LBL_REQUIRE_SMTP_AUTHENTICATION' => '使用 SMTP 认证?', + 'LBL_ANNOUNCEMENT' => '新闻', + 'LBL_SETTING_ANNOUNCEMENT' => '新闻', + 'LBL_ANNOUNCE_TEXT' => '公告文字', + 'LBL_UPDATE_BUTTON' => '更新', + 'LBL_ANNOUNCEMENT_INFO' => '请在下面输入新闻内容,完成后点选储存按钮。', + 'LBL_ANNOUNCEMENT_DESC' => '修改所有页面上方显示的公告文字', + 'LBL_EMAIL_CONTENTS' => '邮件内容', + 'LBL_SUBJECT' => '主旨', + 'LBL_MESSAGE' => '内容', + 'LBL_PICKLIST_EDITOR' => '选择清单编辑器', + 'LBL_PICKLIST_AVAIL' => '选择清单可用于', + 'LBL_PICKLIST_AVAILINFO1' => '这个选择清单可用于', + 'LBL_PICKLIST_AVAILINFO2' => '显示在下方,点选编辑来调整清单的内容。', + 'LBL_EDIT_PICKLIST' => '编辑选择清单', + 'LBL_PICKLIST_SAVEINFO' => '逐笔输入数据,接着点选储存按钮。', + 'LBL_SELECT_CRM_MODULE' => '选择 CRM 模块', + 'LBL_TAX_SETTINGS' => '税务设定', + 'LBL_INVENTORY_TAX_CONFIG' => '库存税率设定', + 'LBL_CUSTOM_MAPP_INFO' => '只有潜在客户模块支持对应其它模块字段', + 'LBL_MAPPING_OTHER_MODULES' => '对应其它模块', + 'LBL_CUSTOM_FILED_IN' => '自订字段于', + 'LBL_ROLE_HIERARCHY_TREE' => '角色与树状阶层', + 'LBL_EDIT_FIELD_MAPPING' => '编辑字段对应', + 'LBL_LOGIN_HISTORY_DETAILS' => '使用者登入记录', + 'LBL_LOGIN_HISTORY_DESCRIPTION' => '显示使用者的登入记录', + 'LBL_NON_EDITABLE_PICKLIST_ENTRIES' => '没有选择可以编辑的数据', + +//Added for Tax settings + 'LBL_PRODUCT_TAX_SETTINGS' => '产品与服务税率', + 'LBL_SHIPPING_HANDLING_TAX_SETTINGS' => '货运与处理税率', + 'LBL_PROXY_SERVER_DESC' => '设定存取 RSS 来源的代理服务器', + +'LBL_NEW_CURRENCTY' => '新增货币', + 'LBL_BASE_CURRENCY' => '基础货币 - ', + 'LBL_DELETE_CURRENCY' => '删除货币', + +//Added for singlepane view in modules + +'LBL_DEFAULT_DETAIL_VIEW' => '预设细节检视', + 'LBL_DEFAULT_MODULE_VIEW' => '预设模块检视', + 'LBL_DEFAULT_MODULE_VIEW_DESC' => '设定所有模块的预设细节检视', + 'LBL_ENABLE_SINGLEPANE_VIEW' => '启用单一检视', + + 'LBL_CLEAR_DATA' => '清除资料', + 'LBL_LENGTHALERT' => '抱歉,您不能够对应不同字符长度的字段,请修正。', + 'LBL_DECIMALALERT' => '抱歉,您不能够对应不同位数的数字,请修正。', + 'LBL_TYPEALERT_1' => '抱歉,您不能对应', +'LBL_WITH' => '于', + 'LBL_TYPEALERT_2' => '数据类型,请修正。', + 'LBL_ENABLE' => '启用', +'LBL_FAQ_FIELD_ACCESS' => '常见问答字段权限', + 'LBL_ADD_TAX_BUTTON' => '新增税额', +'LBL_NO_TAXES_AVAILABLE'=>'无税', +'LBL_PLEASE'=>'请', +//Added while moving role file from User to Setting Module + 'LBL_ROLES' => '职位', + 'LBL_CREATE_NEW_ROLE' => '建立新角色', + 'LBL_PROPERTIES' => '属性于', + 'LBL_NEW_ROLE' => '新角色', + 'LBL_ROLE_NAME' => '角色名称', + 'LBL_REPORTS_TO' => '汇报给', + 'LBL_PROFILE_M' => '资料', + 'LBL_PROFILES_AVLBL' => '可用资料', + 'LBL_ASSIGN_PROFILES' => '指定的数据', + 'LBL_MEMBER' => '成员', + 'LBL_DELETE_ROLE' => '删除角色', + 'LBL_ROLE_TO_BE_DELETED' => '要删除的角色', + 'LBL_TRANSFER_USER_ROLE' => '转换使用者到角色', + 'LBL_ASSOCIATED_PROFILES' => '相关资料:', + 'LBL_ASSOCIATED_USERS' => '相关使用者:', +//Added while moving email templates from Users to Settings + 'LBL_EMAIL_TEMPLATES' => '邮件样板', + 'LBL_EMAIL_TEMPLATE_DESC' => '管理在活动与大量邮件中使用的邮件样板', + 'LBL_LIST_SELECT' => '选择', + 'LBL_EMAIL_TEMPLATE' => '邮件样板', + 'LBL_TEMPLATE_TOOLS' => '工具', + 'LBL_NEW_TEMPLATE' => '新增样板', +'LBL_FOLDER' => '资料夹', + 'LBL_NAME' => '名称', + 'LBL_PERSONAL' => '个人', + 'LBL_PUBLIC' => '公开', + 'LBL_ACCOUNT_FIELDS' => '客户字段', + 'LBL_CONTACT_FIELDS' => '联系人字段', + 'LBL_LEAD_FIELDS' => '潜在客户字段', + 'LBL_USER_FIELDS' => '使用者字段', + 'LNK_SAMPLE_EMAIL' => '检视范例邮件', +//Added while moving Mail Merge templates from Users to Settings + 'LBL_TEMPLATE_FILE' => '样板档案', + 'LBL_MODULENAMES' => '模块', + 'LBL_DOWNLOAD' => '下载', + 'LBL_ADD_TEMPLATE' => '新增样板', + 'LBL_WORD_TEMPLATES' => '邮件合并样板', +//Added while moving Notification Schedulers from Users to Settings + 'LBL_TASK_NOTIFICATION' => '任务延迟提醒', + 'LBL_BIG_DEAL' => '高额订单提醒', + 'LBL_PENDING_TICKETS' => '等待中传票提醒', + 'LBL_MANY_TICKETS' => '问题过多提醒', + 'LBL_START_NOTIFICATION' => '支持开始提醒', + 'LBL_SUPPORT_NOTICIATION' => '支援结束提醒', +'LBL_SUPPORT_NOTICIATION_MONTH'=>'提前一个月提醒支援结束' , +'LBL_ACTIVITY_NOTIFICATION'=>'行程提醒', + +'LBL_TASK_NOTIFICATION_DESCRITPION' => '当一个任务延迟超过 24 小时提醒', + 'LBL_BIG_DEAL_DESCRIPTION' => '当高额订单成交时提醒', + 'LBL_TICKETS_DESCRIPTION' => '提醒注意等待处理的传票', + 'LBL_MANY_TICKETS_DESCRIPTION' => '当同一个人或单位接手太多传票时发出提醒,也许需要委托其它服务层级', + 'LBL_START_DESCRIPTION' => '在支持或服务开始时提醒', + 'LBL_SUPPORT_DESCRIPTION' => '在支持或服务快结束时提醒', +'LBL_SUPPORT_DESCRIPTION_MONTH'=>'在支持或服务快结束时(提前一个月)提醒', +'LBL_ACTIVITY_REMINDER_DESCRIPTION' => '在行程开始前,依据设定的时间发出提醒', +//Added while moving Inventory Notifications from Users to Settings +'QuoteNotificationDescription' => '在报价单产生时,如果库存数量低于报价单数量,系统会发出通知给产品处理单位', + 'SalesOrderNotificationDescription' => '在销售订单产生时,如果库存数量低于报价单数量,系统会发出通知给产品处理单位', + 'Tools' => '工具', + 'QuoteNotification' => '在报价单产生时发出产品库存提醒', + 'SalesOrderNotification' => '在销售订单产生时发出产品库存提醒', + 'LBL_NOTE_DO_NOT_REMOVE_INFO' => '注意:不要移除或取代 { } 中的数值', + +//Added while moving Profile file from User to Setting Module + 'LBL_TOTAL' => '总计:', + 'LBL_NEW_PROFILE' => '新增资料', + 'LBL_LIST_NO' => '#', + 'LBL_NEW_PROFILE_NAME' => '数据名称', + 'LBL_LIST_TOOLS' => '工具', + 'LBL_PROFILE_MESG' => '检视存取权限 - ', + 'LBL_PROFILE_PRIVILEGES' => '数据权限', + 'LBL_DEFINE_PRIV_FOR' => '定义权限 -', + 'LBL_USE_OPTION_TO_SET_PRIV' => '使用下面选项设定权限', + 'LBL_SUPER_USER_PRIV' => '全域权限', + 'LBL_SET_PRIV_FOR_EACH_MODULE' => '设定每个模块的权限', + 'LBL_FIELDS_AND_TOOLS_SETTINGS' => '字段与工具设定', + 'LBL_VIEW_ALL' => '检视全部', + 'LBL_EDIT_ALL' => '编辑全部', + 'LBL_ALLOW' => '允许', + 'LBL_MESG_VIEW' => '检视所有信息与模块', + 'LBL_MESG_EDIT' => '编辑所有信息与模块', + 'LBL_TAB_MESG_OPTION' => '要显示的模块', + 'LBL_CREATE_EDIT' => '建立/编辑', + 'LBL_VIEW' => '检视', + 'LBL_MANDATORY_MSG' => '必填字段', + 'LBL_DISABLE_FIELD_MSG' => '全域字段存取设定停用的字段', + 'LBL_STEP_2_2' => '步骤 2 / 2', + 'LBL_FINISH_BUTTON' => '完成', + +//Added while moving Groups file from User to Setting Module + 'LBL_NEW_GROUP' => '新增用户组', + 'LBL_GROUPS' => '用户组', + 'LBL_GROUP_NAME' => '用户组名称', + 'LBL_ROLES_SUBORDINATES' => '角色与下属', + 'LBL_MEMBER_AVLBL' => '可用资料与成员', + 'LBL_MEMBER_SELECTED' => '选择的成员', + 'LBL_ENTITY' => '资料', + 'LBL_OF' => '于', + 'LBL_CREATE_NEW_GROUP' => '建立新用户组', + 'LBL_ADD_GROUP_BUTTON' => '新增用户组', + 'LBL_GROUP_MESG1' => '用户组是比较具有弹性的存取权限指派方式,当需要定义复杂的存取全现实,您可以合并像是角色、使用者、数据等项目到单一用户组中。', + 'LBL_GROUP_MESG2' => '要新增数据时,从左边窗体选择项目后点选 ">>" 按钮。', + 'LBL_GROUP_MESG3' => '要移除数据时,从右边窗体选择项目后点选 "<<" 按钮。', + +//Sharing Privileges + 'LBL_GLOBAL_ACCESS_PRIVILEGES' => '组织层级共享角色', + 'LBL_RECALCULATE_BUTTON' => '重新计算', + 'LBL_CHANGE' => '修改', + 'LBL_PRIVILEGES' => '权限', + 'LBL_CUSTOM_ACCESS_PRIVILEGES' => '自订共享规则', + 'LBL_ADD_PRIVILEGES_BUTTON' => '新增权限', + 'LBL_RULE_NO' => '角色编号', + 'LBL_CAN_BE_ACCESSED' => '可以存取于', + 'LBL_CUSTOM_ACCESS_MESG' => '没有定义自订权限规则', + 'LNK_CLICK_HERE' => '点选这里', + 'LBL_CREATE_RULE_MESG' => '建立新规则', + 'LBL_RECALC_MSG' => '您确定要重新计算共享权限?', + 'LBL_YES' => '是', + 'LBL_NO' => '否', + 'LBL_IN_PERMISSION' => '在权限', + 'LBL_RELATED_MODULE_RIGHTS' => '相关模块权限', + 'LBL_USR_CAN_ACCESS' => '使用者可以', + 'LBL_USR_OTHERS' => '其它使用者', + 'LBL_USR_CANNOT_ACCESS' => '使用者不能存取其它使用者', + + 'LBL_ORG_SHARING_PRIVILEGES' => '组织共享权限', + 'LBL_EDIT_PERMISSIONS' => '编辑权限', + 'LBL_SAVE_PERMISSIONS' => '储存权限', + 'LBL_READ_ONLY' => '公开:只读', + 'LBL_EDIT_CREATE_ONLY' => '公开:读取、建立/编辑', + 'LBL_READ_CREATE_EDIT_DEL' => '公开:读取、建立/编辑、删除', + 'LBL_PRIVATE' => '个人', + + 'Public: Read Only' => '公开:只读', + 'Public: Read, Create/Edit' => '公开:读取、建立/编辑', + 'Public: Read, Create/Edit, Delete' => '公开:读取、建立/编辑、删除', + 'Private' => '个人', + 'Hide Details' => '隐藏细节', + 'Hide Details and Add Events' => '隐藏细节并且新增行程', + 'Show Details' => '显示细节', + 'Show Details and Add Events' => '显示细节并且新增行程', + +//Added for User Login History While moving from User to Settings + 'LBL_LOGIN_HISTORY' => '登入记录', +//Sharing Access module moved to Setting + 'Read/Write' => '读/写', + 'Read Only ' => '只读', + 'LBL_GROUP' => '用户组', + 'LBL_ACCESS_RIGHTS_FOR_MODULES' => '相关模块的存取权限', + 'LBL_ADD_RULE' => '新增规则', + 'LBL_ADD_CUSTOM_RULE' => '新增自订权限角色', + 'LBL_RULE_CONSTRUCTION' => '显示角色架构', + 'LBL_STEP' => '步骤', + 'LBL_SELECT_ENTITY' => '从下面选择一个数据', + 'LBL_CAN_BE_ACCESSED_BY' => '可以存取于', + 'LBL_PERMISSIONS' => '权限', + 'LBL_DOC_MSWORD' => '档案必须是 doc/msword 格式', + 'LBL_NODOC' => '数据夹中没有档案,请重试!', + +//Added for error messages on Company Info. +'LOGO_ERROR'=>'标识只能使用 jpeg/png格式', +'Error_Message'=>'错误信息', +'Invalid_file'=>'无效文件或', +'File_has_no_data'=>'档案已经没有数据', +'Sorry'=>'抱歉', +'uploaded_file_exceeds_maximum_limit'=>'上传文件的大小超过最高限额', +'try_file_smaller'=>'请尝试一个文件小于800000字节', +'Problems_in_upload'=>'上传出现问题', +'Please_try_again'=>'请重试!', +//5.0.3 fixes +'LBL_TESTMAILSTATUS'=>'测试邮件地位 : ', +'LBL_CHECK_ASSIGNEDTO_MAILID'=>'请检查指派的邮件ID', +'LBL_MAILSENDERROR'=>'电子邮件不能被发送到管理员用户。请检查管理员邮件帐号 /服务器设置', +'LBL_RECORD_NOEXIST'=>'记录不存在', +'LBL_ENTER_PROFILE'=>'输入配置名称', +'LBL_ENABLE'=>'开启', +'LBL_DISABLE'=>'关闭', +'LBL_PROXY'=>'代理', +'LBL_FIELDS_TO_BE_SHOWN'=>'各领域表现', +//Added for alerts +'SPECIFY_FILE_TO_MERGE' => '请注明文件合并', +'FILESIZE_EXCEEDS_INFO_CONFIG_INC' => '对不起,上传的文件超过了最大文件大小限制在config.inc.php 。请尽量为较小的文件', +'FILESIZE_EXCEEDS_INFO_PHP_INI' => '对不起,上传的文件超过了最大文件大小限制在php.ini。请尽量为较小的文件', +'PROBLEMS_IN_FILEUPLOAD' => '上传出现问题,请重试!', + +//Added fields for Invoice Number labels +'LBL_CUSTOMIZE_INVOICE_NUMBER'=>'自选发票数量', +'LBL_CUSTOMIZE_INVOICE_NUMBER_DESCRIPTION'=>'发票编号定制', +'LBL_CUSTOM_INVOICE_NUMBER_VIEW'=>'发票编号定制', +'LBL_CUSTOMINVOICE_STRING'=>'定制发票字符串', +'LBL_CUSTOMINVOICE_NUMBER'=>'定制发票字符串', +'LBL_INVOICE_NUMBER_PREVIEW'=>'预览', +'LBL_INVOICE_NUMBER_BUTTON'=>'更新发票数量', +'LBL_PROXY_AUTHENTICATION_REQUIRED'=>'代理认证要求', +'LBL_ENABLE_FTP' => '你一定要开通PHP中的ftp支持功能,', + +//Added for Role Labels +'LBL_ADD_ROLE'=>'添加职位', +'LBL_EDIT_ROLE'=>'编辑职位', +'LBL_MOVE_ROLE'=>'移除职位', +'LBL_BACKUP_DESC'=>' 客户关系管理系统允许你在ftp服务器上作一个备份的数据库,。每当一个管理员用户登录,客户关系管理将采取备份所有的数据,。要确定你的FTP服务器有足够的磁盘空间。创建备份文件的格式为: "backup-date-time.sql".', +// Added/Updated for vtiger CRM 5.0.4 +'LBL_SUPPORT_NOTICIATION'=>'支持结束前一个星期通知', +'LBL_SUPPORT_NOTICIATION_MONTH'=>'支持结束前一个月通知' , +'LBL_SUPPORT_DESCRIPTION'=>'支持即将结束,提前一个星期通知!', +'LBL_SUPPORT_DESCRIPTION_MONTH'=>'支持即将结束,提前一个月通知!', +'LBL_SELECT_ROLE'=>'选择职位', +'LBL_TEMPLATE'=>'模板', +'LBL_SELECT_EMAIL_TEMPLATE_FOR'=>'选择邮件模板', + +'ERR_CUSTOM_FIELD_WITH_NAME'=>'Custom Field with the Name ', +'ERR_ALREADY_EXISTS'=>' already exists.', +'ERR_SPECIFY_DIFFERENT_LABEL'=>'Please specify a different Label', +'LBL_TOOLS_TO_BE_SHOWN'=>'Tools to be shown', +'LBL_PICKLIST_GLOBAL_CHANGE'=>'Global Change', +'LBL_PICKLIST_TRANSFER'=>'Transfering the values Of ', +'LBL_REPLACE_VALUE_WITH'=>'Replace value with ', +'LBL_EDIT_CUSTOM_RULE'=>'Edit Custom Privilege Rule', + +/*for global add/delete in picklist*/ +'DELETE_PICKLIST_VALUES'=>'Delete PickList Values', +'EDIT_PICKLIST_VALUE'=>'Edit PickList Value', +'ADD_PICKLIST_VALUES'=>'Add PickList Values', +'LBL_PICKLIST_ADDINFO'=>'Type the new entries one-by-one below', +'LBL_SELECT_ROLES'=> 'Select the Roles to which entries have to be added', +'LBL_EXISTING_PICKLIST_VALUES'=>'Existing Picklist Values', +'LBL_SELECT_PICKLIST'=>'Select picklist', + +// Added after 5.0.4 GA + +'LBL_GENERAL_FIELDS'=>'General Fields', + +'LBL_CANCEL_BUTTON'=>'Cancel', + +//Added fields for Inventory Number labels +'LBL_CUSTOMIZE_INVENTORY_NUMBER'=>'Customize Inventory Sequence', +'LBL_CUSTOMIZE_INVENTORY_NUMBER_DESCRIPTION'=>'Inventory Sequence Customization', +'LBL_CUSTOM_QUOTE_NUMBER_VIEW'=>'Quote Number Customization', +'LBL_CUSTOMQUOTE_STRING'=>'Custom Quote String', +'LBL_CUSTOMQUOTE_NUMBER'=>'Custom Quote Number', +'LBL_QUOTE_NUMBER_PREVIEW'=>'Preview', +'LBL_QUOTE_NUMBER_BUTTON'=>'更新发票号码', +'LBL_CUSTOM_SO_NUMBER_VIEW'=>'SalesOrder Number Customization', +'LBL_CUSTOMSO_STRING'=>'Custom SalesOrder String', +'LBL_CUSTOMSO_NUMBER'=>'Custom SalesOrder Number', +'LBL_SO_NUMBER_PREVIEW'=>'Preview', +'LBL_SO_NUMBER_BUTTON'=>'更新订单号码', +'LBL_CUSTOM_PO_NUMBER_VIEW'=>'PurchaseOrder Number Customization', +'LBL_CUSTOMPO_STRING'=>'Custom PurchaseOrder String', +'LBL_CUSTOMPO_NUMBER'=>'Custom PurchaseOrder Number', +'LBL_PO_NUMBER_PREVIEW'=>'Preview', +'LBL_PO_NUMBER_BUTTON'=>'更新采购订单号码', + +// Added after 5.0.4 GA + +// Added for Multi-Currency Support +'LBL_TRANSFER_CURRENCY'=>'Transfer Currency', +'LBL_CURRENT_CURRENCY'=>'Current Currency', + +//Added for new backup labels +'LBL_LOCAL'=>'Local', +'LBL_BACKUP'=>'Backup', +'LBL_BACKUP_LOCATION'=>'Backup Location', + +'LBL_LAYOUT_EDITOR'=>'布局设计', +'LBL_LAYOUT_EDITOR_DESCRIPTION'=>'设计和修改各个模块的布局', +'LBL_Show'=>'显示', +'LBL_Hide'=>'隐藏', + +// vtlib customization: Language Stings +'VTLIB_LBL_MODULE_MANAGER'=>'模块管理', +'VTLIB_LBL_MODULE_MANAGER_DESCRIPTION'=>'管理系统内部模块是否显示及方式', +'VTLIB_LBL_MODULE_MANAGER_CUSTOMMOD'=>'定制模块', +'VTLIB_LBL_MODULE_MANAGER_STANDARDMOD'=>'标准模块', +'VTLIB_LBL_MODULE_MANAGER_NOMODULES'=>'没有发现定制模块! 创建一个块导入一个新模块 ...', + +// vtmailscanner START +'LBL_MAIL_SCANNER'=>'邮件扫描', +'LBL_MAIL_SCANNER_DESCRIPTION'=>'配置邮箱扫描', +'LBL_SCAN_NOW'=>'现在扫描', +'LBL_RULE'=>'规则', +'LBL_SETUP'=>'安装', +'LBL_CONFIGURE'=>'设置', +'LBL_MAILBOX' => '邮箱', +'LBL_INFORMATION' => '信息', +'LBL_SCANNER' => '扫描器', +'LBL_SERVER' => '服务器', +'LBL_PROTOCOL'=> '协议', +'LBL_PASSWORD'=> '密码', +'LBL_TYPE' => '类型', +'LBL_SSL' => 'SSL', +'LBL_METHOD'=> '方法', +'LBL_VAL_SSL_CERT'=>'验证SSL证书', +'LBL_DONOT_VAL_SSL_CERT'=>'不验证SSL证书', +'LBL_STATUS'=>'状态', +'LBL_ENABLE'=>'打开', +'LBL_DISABLE'=>'关闭', +'LBL_CONNECT'=>'链接', +'LBL_URL_CAPS'=>'URL', +'LBL_ENABLED'=>'Enabled', +'LBL_DISABLED'=>'Disabled', +'LBL_RULES'=>'规则', +'LBL_FOR'=>'-', + +'LBL_FROM'=>'From', +'LBL_TO'=>'To', + +'LBL_ACTION'=>'Action', +'LBL_CREATE'=>'Create', +'LBL_TICKET'=>'Ticket', +'LBL_ADD'=>'Add', + +'LBL_CONTACT'=>'Contact', +'LBL_ACCOUNT'=>'Account', + +'LBL_FROM_CAPS'=>'FROM', +'LBL_TO_CAPS'=>'TO', +'LBL_TO_SMALL'=>'to', + +'LBL_CONTAINS'=>'Contains', +'LBL_EQUALS'=>'Equals', + +'LBL_BEGINS'=>'Begins', + +'LBL_REGEX'=>'Regex', +'LBL_ENDS'=>'Ends', +'LBL_BODY'=>'Body', + +'LBL_NOT'=>'Not', + +'LBL_ALL' => 'All', +'LBL_ANY'=>'Any', +'LBL_CONDITION'=>'Condition', +'LBL_ACTION'=>'Action', +'LBL_MOVE'=>'Move', +'LBL_UP'=>'Up', +'LBL_DOWN'=>'Down', +'LBL_PRIORITY'=>'Priority', +'LBL_UPDATE'=>'更新', +'LBL_SELECT'=>'Select', +'LBL_FOLDERS'=>'Folders', +'LBL_UNSELECT'=>'Unselect', +'LBL_MATCH'=>'Match', +'LBL_SCANNING'=>'Scanning', +'LBL_LOOKFOR'=>'Look for', +'LBL_UNREAD'=>'未读', +'LBL_READ'=>'已读', +'LBL_AFTER_SCAN'=>'After scan', +'LBL_MESSAGES_FROM_LASTSCAN'=>'Messages from lastscan', +'LBL_MARK_MESSAGE_AS'=>'标记邮件为', + +//Added for the workflow module +'LBL_LIST_WORKFLOWS'=>'工作流', +'LBL_LIST_WORKFLOWS_DESCRIPTION' => '创建或修改工作流', +'LBL_TASK_TITLE'=>'任务标题', +'LBL_PARENT_WORKFLOW'=>'上一级工作流', +'MSG_EXECUTE_TASK_DELAY'=>'Execute the task after some delay', +'LBL_AFTER'=>'After', +'LBL_BEFORE'=>'Before', +'LBL_TASK_OPERATIONS'=>'Task Operations', +'LBL_CREATE_TASK'=>'Create Task', +'LBL_CREATE_TASK_OF_TYPE'=>'Create a new task of type', +'LBL_SUMMARY'=>'Summary', +'LBL_WHEN_TO_RUN_WORKFLOW'=>'When to run the workflow', +'LBL_ONLY_ON_FIRST_SAVE'=>'Only on the first save', +'LBL_UNTIL_FIRST_TIME_CONDITION_TRUE'=>'Until the first time the condition is true', +'LBL_EVERYTIME_RECORD_SAVED'=>'Every time the the record is saved', +'LBL_CONDITIONS'=>'Conditions', +'LBL_NEW_CONDITION_BUTTON_LABEL'=>'New Condition', +'LBL_TASKS'=>'Tasks', +'LBL_NEW_TASK_BUTTON_LABEL'=>'New Task', +'LBL_TASK'=>'Task', +// END +//Added for vantage customization (Mandatory fields) -- Pavani +'LBL_MANDATORY_FIELDS'=>'Mandatory Fields', +'LBL_MANDATORY_FIELDS_DESCRIPTION'=>'Manage mandatory fields of all modules', +// Module Sequence Numbering +'LBL_CUSTOMIZE_MODENT_NUMBER'=>'系统编号定制', +'LBL_CUSTOMIZE_MODENT_NUMBER_DESCRIPTION'=>'模块实体号码定制', +// END + +//added for softphone integration +'LBL_SOFTPHONE_SERVER_SETTINGS'=>'SoftPhone Server Settings', +'LBL_SOFTPHONE_SERVER_SETTINGS_DESCRIPTION'=>'Configure your softphone here', +'ASTERISK_SERVER_IP'=>'Asterisk server IP ', +'ASTERISK_PORT'=>'Asterisk server port', +'ASTERISK_USERNAME'=>'Asterisk username', +'ASTERISK_PASSWORD'=>'Asterisk password', +'ASTERISK_SERVER_IP_TITLE'=>'The URL of the asterisk server', +'ASTERISK_PORT_TITLE'=>'The port where asterisk call manager API can connect to Asterisk (default 5038)', +'ASTERISK_USERNAME_TITLE'=>'The asterisk username (generally the admin username)', +'ASTERISK_PASSWORD_TITLE'=>'Password for the asterisk user', +'LBL_CANCEL_BUTTON'=>'Cancel', +'ASTERISK_VERSION' => 'Asterisk Version', +'ASTERISK_VERSION_TITLE'=>'Select your Asterisk version here; leave it as 1.4 if not sure', +'ASTERISK_CONFIGURATION'=>'Asterisk Configuration', +//softphone integration ends +'LBL_SELECT_FIELD_TO_MOVE' => 'Select Fields to move', +'VTLIB_LBL_SELECT_PACKAGE_FILE'=>'选择一个打包文件', +'VTLIB_LBL_FILE_LOCATION'=>'文件位置:', +'VTLIB_LBL_PACKAGE_FILE_HELP'=>'要导入的系统模块必须为zip文件.', +'VTLIB_LBL_IMPORT_FAILURE'=>'导入失败', +'VTLIB_LBL_INVALID_FILE'=>'无效文件', +'VTLIB_LBL_INVALID_IMPORT_TRY_AGAIN'=>'provided for module import! Try Again.', +'VTLIB_LBL_UNABLE_TO_UPLOAD'=>'Unable to upload', +'VTLIB_LBL_UNABLE_TO_UPLOAD2'=>'the package on the server! Try Again.', +'VTLIB_LBL_VERIFY_IMPORT_DETAILS'=>'Verify Import Details', +'VTLIB_LBL_MODULE_NAME'=>'Module Name', +'VTLIB_LBL_MODULE_DIR'=>'Module Directory', +'VTLIB_LBL_REQ_VTIGER_VERSION'=>'Req. vtiger version', +'VTLIB_LBL_LICENSE'=>'License', +'VTLIB_LBL_LICENSE_ACCEPT_AGREEMENT'=>'I accept the license agreement.', +'VTLIB_LBL_PROCEED_WITH_IMPORT'=>'Do you want to proceed with the import?', +'VTLIB_LBL_IMPORTING_MODULE_START'=>'Importing Module ...', +'VTLIB_LBL_WARNING'=>'Warning', +'VTLIB_LBL_NOT_WRITEABLE'=>'not writeable', +'VTLIB_LBL_PACKAGE_VERSION'=>'Version', + +'LBL_UPGRADE'=>'Upgrade', +'VTLIB_LBL_UPDATE_FAILURE'=>'Upgrade Failure', +'VTLIB_LBL_MODULENAME_MISMATCH'=>'Module name mistmach', +'VTLIB_LBL_TRY_AGAIN'=>'Try Again', +'VTLIB_LBL_VERIFY_UPDATE_DETAILS'=>'Verify Upgrade Details', +'VTLIB_LBL_PROCEED_WITH_UPDATE'=>'Do you want to proceed with the upgrade?', +'VTLIB_LBL_UPDAING_MODULE_START'=>'Updating module...', +'VTLIB_LBL_EXISTS'=>'Exists', +'VTLIB_LBL_NOT_PRESENT'=>'Not Present', +'VTLIB_LBL_INST_VERSION'=>'Installed Version', +'VTLIB_LBL_MATCHES_PACKAGE_VERSION'=>'matches Package Version', +'VTLIB_LBL_CANNOT_UPGRADE'=>'Cannot updgrade!', +// END + +//User group fixes +'LBL_USERNAME_EXIST' => '指定名称的用户已经存在!', +'LBL_GROUPNAME_EXIST' => '指定名称的用户组已经存在!', +'LBL_ROLENAME_EXIST' => 'Role name already exists', + +//layout editor +'LBL_MOVE_FIELDS' => 'Move Fields', +'NO_HIDDEN_FIELDS' => 'No Hidden Fields', +'LBL_RELATED_LIST' => 'Related List', +'LBL_ADD_BLOCK' => 'Add Block', +'HIDDEN_FIELDS' => 'Hidden Fields', +'DOWN'=> 'Down', +'UP'=> 'Up', +'RIGHT' => 'Right', +'LEFT' => 'Left', +'LBL_EDIT_PROPERTIES' => 'Edit Properties', +'LBL_MANDATORY_FIELD' => 'Mandatory Field', +'LBL_ACTIVE' => 'Active', +'LBL_QUICK_CREATE' => 'Quick Create', +'LBL_MASS_EDIT' => 'Mass Edit', +'LBL_BLOCK_NAME' => 'Block name', +'AFTER' => 'After', +'ADD_BLOCK' => 'Add Block', +'ARRANGE_RELATEDLIST' => 'Arrange RelatedList', +'CUSTOMFIELD_MAPPING' => 'CustomField Mapping', +'LBL_MAPPED_FIELDS' => 'Mapped Fields', +'LEADS_CUSTOM_FIELD_MAPPING_DESCRIPTION' => 'Map Your Leads Customfields with Accounts,Contacts and Potentials', +'LEADS_CUSTOM_FIELD_MAPPING'=> 'Leads CustomField Mapping', +'LBL_CALENDER_CUSTOMFIELDS' => 'Calendar Custom Fields', +'LBL_CALENDER_CUSTOMFIELDS_DESCRIPTION' => 'You can Create Custom Fields for Calendar', +'LBL_GO_BACK'=>'Go Back', + +//Added fix for: 5418 +'LBL_USE_PREFIX' => '使用前缀', +'LBL_START_SEQ' => '起始数字', +'LBL_MODULE_NUMBERING' => '模块编号', +'LBL_FAILED' => '失败', +'LBL_DONE' => '执行完毕', +'LBL_IN_USE' => '使用中', +'LBL_MODULE_NUMBERING_FIX_MISSING' => '立刻更新丢失的编号', + +//Added for: 5473 +'LBL_SHARING_ACCESS_HELPNOTE' => '进行修改后,按重新计算按钮以应用更改.', + +//for customer portal extension module +'PORTAL_EXTENSION_DESCRIPTION'=>'允许您配置客户门户插件', +'LBL_CUSTOMER_PORTAL'=> '客户门户', + +//FieldFormulas +'LBL_FIELDFORMULAS' => '字段公式', +'LBL_FIELDFORMULAS_DESCRIPTION' => '为自定义字段添加公式 ', +); +?> diff --git a/oss/vtiger/trunk/modules/Settings/listemailtemplates.php b/oss/vtiger/trunk/modules/Settings/listemailtemplates.php new file mode 100644 index 00000000..d469cf7d --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/listemailtemplates.php @@ -0,0 +1,69 @@ +info("Inside Email Templates List View"); + + $sql = "select * from vtiger_emailtemplates order by templateid DESC"; + $result = $adb->pquery($sql, array()); + $temprow = $adb->fetch_array($result); + +$edit="Edit "; +$del="Del "; +$bar=" | "; +$cnt=1; + +require_once('include/utils/UserInfoUtil.php'); +global $app_strings; +global $app_list_strings; +global $mod_strings; +global $theme,$default_charset; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("UMOD", $mod_strings); +global $current_language; +$smod_strings = return_module_language($current_language,'Settings'); +$smarty->assign("APP", $app_strings); +$smarty->assign("MOD", $smod_strings); +$smarty->assign("MODULE", 'Settings'); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PARENTTAB", getParentTab()); + +$return_data=array(); +if ($temprow != null) +{ +do +{ + $templatearray=array(); + $templatearray['templatename'] = $temprow["templatename"]; + $templatearray['templateid'] = $temprow["templateid"]; + $templatearray['description'] = $temprow["description"]; + $templatearray['foldername'] = $temprow["foldername"]; + $return_data[]=$templatearray; + $cnt++; +}while($temprow = $adb->fetch_array($result)); +} + +$log->info("Exiting Email Templates List View"); + +$smarty->assign("TEMPLATES",$return_data); +$smarty->display("ListEmailTemplates.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/listgroups.php b/oss/vtiger/trunk/modules/Settings/listgroups.php new file mode 100644 index 00000000..2bd5a45f --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/listgroups.php @@ -0,0 +1,49 @@ +$groupInfo) +{ + + $standCustFld = array(); + $standCustFld['groupid']= $groupId; + $standCustFld['groupname']= $groupInfo[0]; + $standCustFld['description']= $groupInfo[1]; + $return_data[]=$standCustFld; + $cnt++; +} + +$smarty->assign("LIST_HEADER",$list_header); +$smarty->assign("LIST_ENTRIES",$return_data); +$smarty->assign("PROFILES", $standCustFld); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign('GRPCNT', count($return_data)); + +$smarty->display("ListGroup.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Settings/listinventorynotifications.php b/oss/vtiger/trunk/modules/Settings/listinventorynotifications.php new file mode 100644 index 00000000..efc21afb --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/listinventorynotifications.php @@ -0,0 +1,47 @@ +pquery($query, array()); +$num_rows = $adb->num_rows($result); +$output = Array(); +for($i=0; $i<$num_rows; $i++) +{ + $out = Array(); + $not_id = $adb->query_result($result,$i,'notificationid'); + $not_mod = $adb->query_result($result,$i,'notificationname'); + $not_des = $adb->query_result($result,$i,'label'); + $out ['notificationname'] = $mod_strings[$not_mod]; + $out ['label'] = $mod_strings[$not_des]; + $out ['id'] = $not_id; + $output [] = $out; +} +$smarty->assign("NOTIFICATION",$output); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); + +if($_REQUEST['directmode'] != '') + $smarty->display("Settings/InventoryNotifyContents.tpl"); +else + $smarty->display("Settings/InventoryNotify.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/listnotificationschedulers.php b/oss/vtiger/trunk/modules/Settings/listnotificationschedulers.php new file mode 100644 index 00000000..64c13401 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/listnotificationschedulers.php @@ -0,0 +1,52 @@ +pquery($query, array()); +if($adb->num_rows($result) >=1) +{ + $notifiy_array = Array(); + while($result_row = $adb->fetch_array($result)) + { + $result_data = Array(); + $result_data['active'] = $result_row['active']; + $result_data['schedulename'] = $mod_strings[$result_row['schedulednotificationname']]; + $result_data['id'] = $result_row['schedulednotificationid']; + + if($result_data['active'] != 1) + $result_data['active'] = $mod_strings['LBL_INACTIVE']; + else + $result_data['active'] = $mod_strings['LBL_ACTIVE']; + + $result_data['label'] = $mod_strings[$result_row['label']]; + $notifiy_array []= $result_data; + } + $smarty->assign("NOTIFICATION",$notifiy_array); +} + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +if($_REQUEST['directmode'] != '') + $smarty->display("Settings/EmailNotificationContents.tpl"); +else + $smarty->display("Settings/EmailNotification.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Settings/listroles.php b/oss/vtiger/trunk/modules/Settings/listroles.php new file mode 100644 index 00000000..e79c4680 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/listroles.php @@ -0,0 +1,174 @@ +pquery($hquery, array()); +$num_rows = $adb->num_rows($hr_res); +$hrarray= Array(); + +for($l=0; $l<$num_rows; $l++) +{ + $roleid = $adb->query_result($hr_res,$l,'roleid'); + $parent = $adb->query_result($hr_res,$l,'parentrole'); + $temp_list = explode('::',$parent); + $size = sizeof($temp_list); + $i=0; + $k= Array(); + $y=$hrarray; + if(sizeof($hrarray) == 0) + { + $hrarray[$temp_list[0]]= Array(); + } + else + { + while($i<$size-1) + { + $y=$y[$temp_list[$i]]; + $k[$temp_list[$i]] = $y; + $i++; + + } + $y[$roleid] = Array(); + $k[$roleid] = Array(); + + //Reversing the Array + $rev_temp_list=array_reverse($temp_list); + $j=0; + //Now adding this into the main array + foreach($rev_temp_list as $value) + { + if($j == $size-1) + { + $hrarray[$value]=$k[$value]; + } + else + { + $k[$rev_temp_list[$j+1]][$value]=$k[$value]; + } + $j++; + } + } + +} +//Constructing the Roledetails array +$role_det = getAllRoleDetails(); +$query = "select * from vtiger_role"; +$result = $adb->pquery($query, array()); +$num_rows=$adb->num_rows($result); + +$roleout =''; +$roleout .= indent($hrarray,$roleout,$role_det); + +/** recursive function to construct the role tree ui + * @param $hrarray -- Hierarchial role tree array with only the roleid:: Type array + * @param $roleout -- html string ouput of the constucted role tree ui:: Type varchar + * @param $role_det -- Roledetails array got from calling getAllRoleDetails():: Type array + * @returns $role_out -- html string ouput of the constucted role tree ui:: Type string + * + */ + +function indent($hrarray,$roleout,$role_det) +{ + global $theme,$mod_strings,$app_strings; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + foreach($hrarray as $roleid => $value) + { + + //retreiving the vtiger_role details + $role_det_arr=$role_det[$roleid]; + $roleid_arr=$role_det_arr[2]; + $rolename = $role_det_arr[0]; + $roledepth = $role_det_arr[1]; + $roleout .= '
      '; + $roleout .= '
    • '; + $roleout.= ''; + $roleout .= '
      '; + if(sizeof($value) >0 && $roledepth != 0) + { + $roleout.=''; + $roleout .= ''.$app_strings['LBL_EXPAND_COLLAPSE'].''; + } + else if($roledepth != 0){ + $roleout .= ''.$app_strings['LBL_EXPAND_COLLAPSE'].''; + } + else{ + $roleout .= ''.$app_strings['LBL_ROOT'].''; + } + if($roledepth == 0 ){ + $roleout .= ' '.$rolename.'
      '.$mod_strings['LBL_ADD_ROLE'].'
      '; + } + else{ + $roleout .= ' '.$rolename.''; + + $roleout.='
      + '.$mod_strings['LBL_ADD_ROLE'].' + '.$mod_strings['LBL_EDIT_ROLE'].''; + + if($roleid != 'H1' && $roleid != 'H2') + { + + $roleout .= ''.$mod_strings['LBL_DELETE_ROLE'].''; + } + + $roleout .=''.$mod_strings['LBL_MOVE_ROLE'].' +
      '; +// $roleout .= ' Add | Edit | Delete | View'; + + + } + $roleout .= '
    • '; + if(sizeof($value) > 0 ) + { + $roleout = indent($value,$roleout,$role_det); + } + + $roleout .= '
    '; + + } + + return $roleout; +} +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("ROLETREE", $roleout); + +if($_REQUEST['ajax'] == 'true') +{ + $smarty->display("RoleTree.tpl"); +} +else +{ + $smarty->display("ListRoles.tpl"); +} +?> diff --git a/oss/vtiger/trunk/modules/Settings/listwordtemplates.php b/oss/vtiger/trunk/modules/Settings/listwordtemplates.php new file mode 100644 index 00000000..56a4bd3d --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/listwordtemplates.php @@ -0,0 +1,58 @@ +pquery($sql, array()); + +$edit="Edit "; +$del="Del "; +$bar=" | "; +$cnt=1; + +$return_data = Array(); +$num_rows = $adb->num_rows($result); + + +for($i=0;$i < $num_rows; $i++) +{ + $wordtemplatearray=array(); + $wordtemplatearray['templateid'] = $adb->query_result($result,$i,'templateid'); + $wordtemplatearray['description'] = $adb->query_result($result,$i,'description'); + $wordtemplatearray['module'] = $adb->query_result($result,$i,'module'); + $wordtemplatearray['filename'] = $adb->query_result($result,$i,'filename'); + $wordtemplatearray['filetype'] = $adb->query_result($result,$i,'filetype'); + $wordtemplatearray['filesize'] = $adb->query_result($result,$i,'filesize'); + $return_data []= $wordtemplatearray; +} +require_once('include/utils/UserInfoUtil.php'); +global $app_strings; +global $mod_strings; +global $theme,$default_charset; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$smarty = new vtigerCRM_Smarty; +global $current_language; +$smod_strings = return_module_language($current_language,'Settings'); +$smarty->assign("MOD", $smod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("UMOD", $mod_strings); +$smarty->assign("PARENTTAB", getParentTab()); +$smarty->assign("IMAGE_PATH",$image_path); + +$smarty->assign("WORDTEMPLATES",$return_data); +$smarty->display("ListWordTemplates.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/mailmergedownloadfile.php b/oss/vtiger/trunk/modules/Settings/mailmergedownloadfile.php new file mode 100644 index 00000000..5228a474 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/mailmergedownloadfile.php @@ -0,0 +1,43 @@ +pquery($dbQuery, array($templateid)) or die("Couldn't get file list"); +if($adb->num_rows($result) == 1) +{ +$fileType = $adb->query_result($result, 0, "filetype"); +$name = $adb->query_result($result, 0, "filename"); +//echo 'filetype is ' .$fileType; +$fileContent = $adb->query_result($result, 0, "data"); +$size = $adb->query_result($result, 0, "filesize"); +$name = html_entity_decode($name, ENT_QUOTES, $default_charset); +header("Content-type: $fileType"); +//header("Content-length: $size"); +header("Cache-Control: private"); +header("Content-Disposition: attachment; filename=$name"); +header("Content-Description: PHP Generated Data"); +echo base64_decode($fileContent); +} +else +{ +echo "Record doesn't exist."; +} +?> + diff --git a/oss/vtiger/trunk/modules/Settings/profilePrivileges.php b/oss/vtiger/trunk/modules/Settings/profilePrivileges.php new file mode 100644 index 00000000..4d59c6de --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/profilePrivileges.php @@ -0,0 +1,767 @@ +assign("SELECTED_TAB", vtlib_purify($_REQUEST['selected_tab'])); +else + $smarty->assign("SELECTED_TAB", "global_privileges"); + +if(isset($_REQUEST['selected_module']) && $_REQUEST['selected_module']!='') + $smarty->assign("SELECTED_MODULE", vtlib_purify($_REQUEST['selected_module'])); +else + $smarty->assign("SELECTED_MODULE", "field_Leads"); + +$smarty->assign("PARENTPROFILEID", $parentProfileId); +$smarty->assign("RADIOBUTTON", vtlib_purify($_REQUEST['radiobutton'])); + +$secondaryModule=''; +$mode=''; +$output =''; +$output1 =''; +$smarty->assign("PROFILEID", $profileId); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("CMOD", $mod_strings); +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != '') + $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); + + +if(isset($_REQUEST['profile_name']) && $_REQUEST['profile_name'] != '' && $_REQUEST['mode'] == 'create') +{ + $profileName=$_REQUEST['profile_name']; + $smarty->assign("PROFILE_NAME", to_html($profileName)); +} +else +{ + $profileName=getProfileName($profileId); + $smarty->assign("PROFILE_NAME", $profileName); + +} + +//$smarty->assign("PROFILE_NAME", to_html($profileName)); + +if(isset($_REQUEST['profile_description']) && $_REQUEST['profile_description'] != '' && $_REQUEST['mode'] == 'create') + + $profileDescription = vtlib_purify($_REQUEST['profile_description']); +else +{ + if($profileId != null) + { + $profileDescription = getProfileDescription($profileId); + } +} + +$smarty->assign("PROFILE_DESCRIPTION", $profileDescription); + +if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != '') + $smarty->assign("MODE",vtlib_purify($_REQUEST['mode'])); + + +//Initially setting the secondary selected vtiger_tab +$mode=$_REQUEST['mode']; +if($mode == 'create') +{ + $smarty->assign("ACTION",'SaveProfile'); +} +elseif($mode == 'edit') +{ + $smarty->assign("ACTION",'UpdateProfileChanges'); +} + + +//Global Privileges + +if($mode == 'view') +{ + $global_per_arry = getProfileGlobalPermission($profileId); + $view_all_per = $global_per_arry[1]; + $edit_all_per = $global_per_arry[2]; + $privileges_global[]=getGlobalDisplayValue($view_all_per,1); + $privileges_global[]=getGlobalDisplayValue($edit_all_per,2); +} +elseif($mode == 'edit') +{ + $global_per_arry = getProfileGlobalPermission($profileId); + $view_all_per = $global_per_arry[1]; + $edit_all_per = $global_per_arry[2]; + $privileges_global[]=getGlobalDisplayOutput($view_all_per,1); + $privileges_global[]=getGlobalDisplayOutput($edit_all_per,2); +} +elseif($mode == 'create') +{ + if($parentProfileId != '') + { + $global_per_arry = getProfileGlobalPermission($parentProfileId); + $view_all_per = $global_per_arry[1]; + $edit_all_per = $global_per_arry[2]; + $privileges_global[]=getGlobalDisplayOutput($view_all_per,1); + $privileges_global[]=getGlobalDisplayOutput($edit_all_per,2); + } + else + { + $privileges_global[]=getGlobalDisplayOutput(0,1); + $privileges_global[]=getGlobalDisplayOutput(0,2); + } + +} + +$smarty->assign("GLOBAL_PRIV",$privileges_global); + +//standard privileges +if($mode == 'view') +{ + $act_perr_arry = getTabsActionPermission($profileId); + foreach($act_perr_arry as $tabid=>$action_array) + { + $stand = array(); + $entity_name = getTabname($tabid); + //Create/Edit Permission + $tab_create_per_id = $action_array['1']; + $tab_create_per = getDisplayValue($tab_create_per_id,$tabid,'1'); + //Delete Permission + $tab_delete_per_id = $action_array['2']; + $tab_delete_per = getDisplayValue($tab_delete_per_id,$tabid,'2'); + //View Permission + $tab_view_per_id = $action_array['4']; + $tab_view_per = getDisplayValue($tab_view_per_id,$tabid,'4'); + + $stand[]=$entity_name; + $stand[]=$tab_create_per; + $stand[]=$tab_delete_per; + $stand[]=$tab_view_per; + $privileges_stand[$tabid]=$stand; + } +} +if($mode == 'edit') +{ + $act_perr_arry = getTabsActionPermission($profileId); + foreach($act_perr_arry as $tabid=>$action_array) + { + $stand = array(); + $entity_name = getTabname($tabid); + //Create/Edit Permission + $tab_create_per_id = $action_array['1']; + $tab_create_per = getDisplayOutput($tab_create_per_id,$tabid,'1'); + //Delete Permission + $tab_delete_per_id = $action_array['2']; + $tab_delete_per = getDisplayOutput($tab_delete_per_id,$tabid,'2'); + //View Permission + $tab_view_per_id = $action_array['4']; + $tab_view_per = getDisplayOutput($tab_view_per_id,$tabid,'4'); + + $stand[]=$entity_name; + $stand[]=$tab_create_per; + $stand[]=$tab_delete_per; + $stand[]=$tab_view_per; + $privileges_stand[$tabid]=$stand; + } +} +if($mode == 'create') +{ + if($parentProfileId != '') + { + $act_perr_arry = getTabsActionPermission($parentProfileId); + foreach($act_perr_arry as $tabid=>$action_array) + { + $stand = array(); + $entity_name = getTabname($tabid); + //Create/Edit Permission + $tab_create_per_id = $action_array['1']; + $tab_create_per = getDisplayOutput($tab_create_per_id,$tabid,'1'); + //Delete Permission + $tab_delete_per_id = $action_array['2']; + $tab_delete_per = getDisplayOutput($tab_delete_per_id,$tabid,'2'); + //View Permission + $tab_view_per_id = $action_array['4']; + $tab_view_per = getDisplayOutput($tab_view_per_id,$tabid,'4'); + + $stand[]=$entity_name; + $stand[]=$tab_create_per; + $stand[]=$tab_delete_per; + $stand[]=$tab_view_per; + $privileges_stand[$tabid]=$stand; + } + } + else + { + $act_perr_arry = getTabsActionPermission(1); + foreach($act_perr_arry as $tabid=>$action_array) + { + $stand = array(); + $entity_name = getTabname($tabid); + //Create/Edit Permission + $tab_create_per_id = $action_array['1']; + $tab_create_per = getDisplayOutput(0,$tabid,'1'); + //Delete Permission + $tab_delete_per_id = $action_array['2']; + $tab_delete_per = getDisplayOutput(0,$tabid,'2'); + //View Permission + $tab_view_per_id = $action_array['4']; + $tab_view_per = getDisplayOutput(0,$tabid,'4'); + + $stand[]=$entity_name; + $stand[]=$tab_create_per; + $stand[]=$tab_delete_per; + $stand[]=$tab_view_per; + $privileges_stand[$tabid]=$stand; + } + } + +} +$smarty->assign("STANDARD_PRIV",$privileges_stand); + +//tab Privileges + +if($mode == 'view') +{ + $tab_perr_array = getTabsPermission($profileId); + $no_of_tabs = sizeof($tab_perr_array); + foreach($tab_perr_array as $tabid=>$tab_perr) + { + $tab=array(); + $entity_name = getTabname($tabid); + $tab_allow_per_id = $tab_perr_array[$tabid]; + $tab_allow_per = getDisplayValue($tab_allow_per_id,$tabid,''); + $tab[]=$entity_name; + $tab[]=$tab_allow_per; + $privileges_tab[$tabid]=$tab; + } +} +if($mode == 'edit') +{ + $tab_perr_array = getTabsPermission($profileId); + $no_of_tabs = sizeof($tab_perr_array); + foreach($tab_perr_array as $tabid=>$tab_perr) + { + $tab=array(); + $entity_name = getTabname($tabid); + $tab_allow_per_id = $tab_perr_array[$tabid]; + $tab_allow_per = getDisplayOutput($tab_allow_per_id,$tabid,''); + $tab[]=$entity_name; + $tab[]=$tab_allow_per; + $privileges_tab[$tabid]=$tab; + } +} +if($mode == 'create') +{ + if($parentProfileId != '') + { + $tab_perr_array = getTabsPermission($parentProfileId); + $no_of_tabs = sizeof($tab_perr_array); + foreach($tab_perr_array as $tabid=>$tab_perr) + { + $tab=array(); + $entity_name = getTabname($tabid); + $tab_allow_per_id = $tab_perr_array[$tabid]; + $tab_allow_per = getDisplayOutput($tab_allow_per_id,$tabid,''); + $tab[]=$entity_name; + $tab[]=$tab_allow_per; + $privileges_tab[$tabid]=$tab; + } + } + else + { + $tab_perr_array = getTabsPermission(1); + $no_of_tabs = sizeof($tab_perr_array); + foreach($tab_perr_array as $tabid=>$tab_perr) + { + $tab=array(); + $entity_name = getTabname($tabid); + $tab_allow_per_id = $tab_perr_array[$tabid]; + $tab_allow_per = getDisplayOutput(0,$tabid,''); + $tab[]=$entity_name; + $tab[]=$tab_allow_per; + $privileges_tab[$tabid]=$tab; + } + } + +} +$smarty->assign("TAB_PRIV",$privileges_tab); +//utilities privileges + +if($mode == 'view') +{ + $act_utility_arry = getTabsUtilityActionPermission($profileId); + foreach($act_utility_arry as $tabid=>$action_array) + { + $util=array(); + $entity_name = getTabname($tabid); + $no_of_actions=sizeof($action_array); + foreach($action_array as $action_id=>$act_per) + { + $action_name = getActionname($action_id); + $tab_util_act_per = $action_array[$action_id]; + $tab_util_per = getDisplayValue($tab_util_act_per,$tabid,$action_id); + $util[]=$action_name; + $util[]=$tab_util_per; + } + $util=array_chunk($util,2); + $util=array_chunk($util,3); + $privilege_util[$tabid] = $util; + } +} +elseif($mode == 'edit') +{ + $act_utility_arry = getTabsUtilityActionPermission($profileId); + foreach($act_utility_arry as $tabid=>$action_array) + { + $util=array(); + $entity_name = getTabname($tabid); + $no_of_actions=sizeof($action_array); + foreach($action_array as $action_id=>$act_per) + { + $action_name = getActionname($action_id); + $tab_util_act_per = $action_array[$action_id]; + $tab_util_per = getDisplayOutput($tab_util_act_per,$tabid,$action_id); + $util[]=$action_name; + $util[]=$tab_util_per; + } + $util=array_chunk($util,2); + $util=array_chunk($util,3); + $privilege_util[$tabid] = $util; + } +} +elseif($mode == 'create') +{ + if($parentProfileId != '') + { + $act_utility_arry = getTabsUtilityActionPermission($parentProfileId); + foreach($act_utility_arry as $tabid=>$action_array) + { + $util=array(); + $entity_name = getTabname($tabid); + $no_of_actions=sizeof($action_array); + foreach($action_array as $action_id=>$act_per) + { + $action_name = getActionname($action_id); + $tab_util_act_per = $action_array[$action_id]; + $tab_util_per = getDisplayOutput($tab_util_act_per,$tabid,$action_id); + $util[]=$action_name; + $util[]=$tab_util_per; + } + $util=array_chunk($util,2); + $util=array_chunk($util,3); + $privilege_util[$tabid] = $util; + } + } + else + { + $act_utility_arry = getTabsUtilityActionPermission(1); + foreach($act_utility_arry as $tabid=>$action_array) + { + $util=array(); + $entity_name = getTabname($tabid); + $no_of_actions=sizeof($action_array); + foreach($action_array as $action_id=>$act_per) + { + $action_name = getActionname($action_id); + $tab_util_act_per = $action_array[$action_id]; + $tab_util_per = getDisplayOutput(0,$tabid,$action_id); + $util[]=$action_name; + $util[]=$tab_util_per; + } + $util=array_chunk($util,2); + $util=array_chunk($util,3); + $privilege_util[$tabid] = $util; + } + + } + +} +$smarty->assign("UTILITIES_PRIV",$privilege_util); + +//Field privileges +$modArr=getFieldModuleAccessArray(); + + +$no_of_mod=sizeof($modArr); +for($i=0;$i<$no_of_mod; $i++) +{ + $fldModule=key($modArr); + $lang_str=$modArr[$fldModule]; + $privilege_fld[]=$fldModule; + next($modArr); +} +$smarty->assign("PRI_FIELD_LIST",$privilege_fld); +$smarty->assign("MODE",$mode); + +$disable_field_array = Array(); +$sql_disablefield = "select * from vtiger_def_org_field"; +$result = $adb->pquery($sql_disablefield, array()); +$noofrows=$adb->num_rows($result); +for($i=0; $i<$noofrows; $i++) +{ + $FieldId = $adb->query_result($result,$i,'fieldid'); + $Visible = $adb->query_result($result,$i,'visible'); + $disable_field_array[$FieldId] = $Visible; +} + +if($mode=='view') +{ + $fieldListResult = getProfile2AllFieldList($modArr,$profileId); + for($i=0; $i"; + } + else + { + $visible = ""; + } + if($disable_field_array[$fieldListResult[$module_name][$j][4]] == 1) + { + $visible = ""; + } + if($language_strings[$fieldListResult[$module_name][$j][0]] != '') + $field[]=$language_strings[$fieldListResult[$module_name][$j][0]]; + else + $field[]=$fieldListResult[$module_name][$j][0]; + $field[]=$visible; + $field_module[]=$field; + } + $privilege_field[$module_id] = array_chunk($field_module,3); + next($fieldListResult); + } +} +elseif($mode=='edit') +{ + $fieldListResult = getProfile2AllFieldList($modArr,$profileId); + for($i=0; $i'; + $field_module[]=$field; + } + $privilege_field[$module_id] = array_chunk($field_module,3); + next($fieldListResult); + } +} +elseif($mode=='create') +{ + if($parentProfileId != '') + { + $fieldListResult = getProfile2AllFieldList($modArr,$parentProfileId); + for($i=0; $i'; + $field_module[]=$field; + } + $privilege_field[$module_id] = array_chunk($field_module,3); + next($fieldListResult); + } + } + else + { + $fieldListResult = getProfile2AllFieldList($modArr,1); + for($i=0; $i'; + $field_module[]=$field; + } + $privilege_field[$module_id] = array_chunk($field_module,3); + next($fieldListResult); + } + } +} + +$smarty->assign("FIELD_PRIVILEGES",$privilege_field); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +if($mode == 'view') + $smarty->display("ProfileDetailView.tpl"); +else + $smarty->display("EditProfile.tpl"); + +/** returns html image code based on the input id + * @param $id -- Role Name:: Type varchar + * @returns $value -- html image code:: Type varcha:w + * + */ +function getGlobalDisplayValue($id,$actionid) +{ + global $image_path; + if($id == '') + { + $value = ' '; + } + elseif($id == 0) + { + $value = ''; + } + elseif($id == 1) + { + $value = ''; + } + else + { + $value = ' '; + } + + return $value; + +} + + +/** returns html check box code based on the input id + * @param $id -- Role Name:: Type varchar + * @returns $value -- html check box code:: Type varcha:w + * + */ +function getGlobalDisplayOutput($id,$actionid) +{ + if($actionid == '1') + { + $name = 'view_all'; + } + elseif($actionid == '2') + { + + $name = 'edit_all'; + } + + if($id == '' && $id != 0) + { + $value = ''; + } + elseif($id == 0) + { + $value = ''; + } + elseif($id == 1) + { + $value = ''; + } + return $value; + +} + + +/** returns html image code based on the input id + * @param $id -- Role Name:: Type varchar + * @returns $value -- html image code:: Type varcha:w + * + */ +function getDisplayValue($id) +{ + global $image_path; + + if($id == '') + { + $value = ' '; + } + elseif($id == 0) + { + $value = ''; + } + elseif($id == 1) + { + $value = ''; + } + else + { + $value = ' '; + } + return $value; + +} + + +/** returns html check box code based on the input id + * @param $id -- Role Name:: Type varchar + * @returns $value -- html check box code:: Type varcha:w + * + */ +function getDisplayOutput($id,$tabid,$actionid) +{ + if($actionid == '') + { + $name = $tabid.'_tab'; + $ckbox_id = 'tab_chk_com_'.$tabid; + $jsfn = 'hideTab('.$tabid.')'; + } + else + { + $temp_name = getActionname($actionid); + $name = $tabid.'_'.$temp_name; + $ckbox_id = 'tab_chk_'.$actionid.'_'.$tabid; + if($actionid == 1) + $jsfn = 'unSelectCreate('.$tabid.')'; + elseif($actionid == 4) + $jsfn = 'unSelectView('.$tabid.')'; + elseif($actionid == 2) + $jsfn = 'unSelectDelete('.$tabid.')'; + else + { + $ckbox_id = $tabid.'_field_util_'.$actionid; + $jsfn = 'javascript:'; + } + } + + + + if($id == '' && $id != 0) + { + $value = ''; + } + elseif($id == 0) + { + $value = ''; + } + elseif($id == 1) + { + $value = ''; + } + return $value; + +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/saveemailtemplate.php b/oss/vtiger/trunk/modules/Settings/saveemailtemplate.php new file mode 100644 index 00000000..a3b611b3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/saveemailtemplate.php @@ -0,0 +1,41 @@ +info("the templateid is set"); + $sql = "update vtiger_emailtemplates set foldername =?, templatename =?, subject =?, description =?, body =? where templateid =?"; + $params = array($folderName, $templateName, $subject, $description, $body, $templateid); + $adb->pquery($sql, $params); + + $log->info("about to invoke the detailviewemailtemplate file"); + header("Location:index.php?module=Settings&action=detailviewemailtemplate&parenttab=Settings&templateid=".$templateid); +} +else +{ + $templateid = $db->getUniqueID('vtiger_emailtemplates'); + $sql = "insert into vtiger_emailtemplates values (?,?,?,?,?,?,?)"; + $params = array($folderName, $templateName, $subject, $description, $body, 0, $templateid); + $adb->pquery($sql, $params); + + $log->info("added to the db the emailtemplate"); + header("Location:index.php?module=Settings&action=detailviewemailtemplate&parenttab=Settings&templateid=".$templateid); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/savetermsandconditions.php b/oss/vtiger/trunk/modules/Settings/savetermsandconditions.php new file mode 100644 index 00000000..2e228b8e --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/savetermsandconditions.php @@ -0,0 +1,33 @@ +pquery($sql, array($inv_type)); +$inv_id = $adb->query_result($result,0,'id'); +if($inv_id == '') +{ + $inv_id=$adb->getUniqueID('vtiger_inventory_tandc'); + $sql="insert into vtiger_inventory_tandc values(?,?,?)"; + $params = array($inv_id, $inv_type, $inv_tandc); +} +else +{ + $sql="update vtiger_inventory_tandc set type = ?, tandc = ? where id = ?"; + $params = array($inv_type, $inv_tandc, $inv_id); +} +$adb->pquery($sql, $params); + +header("Location: index.php?module=Settings&action=OrganizationTermsandConditions&parenttab=Settings"); +?> diff --git a/oss/vtiger/trunk/modules/Settings/savewordtemplate.php b/oss/vtiger/trunk/modules/Settings/savewordtemplate.php new file mode 100644 index 00000000..e334fd51 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/savewordtemplate.php @@ -0,0 +1,144 @@ +getUniqueID("vtiger_wordtemplates"); + if($genQueryId != '') { + if($result!=false && $savefile=="true") { + $module = vtlib_purify($_REQUEST['target_module']); + $sql = "INSERT INTO vtiger_wordtemplates "; + $sql .= "(templateid,module,date_entered,parent_type,data,description,filename,filesize,filetype) values (?,?,?,?,?,?,?,?,?)"; + $params = array($genQueryId, $module, $adb->formatDate($date_entered, true), $parent_type, $adb->getEmptyBlob(false), $strDescription, $filename, $filesize, $filetype); + $result = $adb->pquery($sql, $params); + + $result = $adb->updateBlob('vtiger_wordtemplates','data'," filename='". $adb->sql_escape_string($filename) ."'",$data); + deleteFile($uploaddir,$filename); + header("Location: index.php?action=listwordtemplates&module=Settings&parenttab=Settings"); + } elseif($savefile=="false") { + $module = vtlib_purify($_REQUEST['target_module']); + header("Location: index.php?action=upload&module=Settings&parenttab=Settings&flag=".$error_flag."&description=".$strDescription."&tempModule=".$module); + } else { + include('themes/'.$theme.'/header.php'); + $errormessage = "Error Message
      +
    • Invalid file OR +
    • File has no data +

    " ; + echo $errormessage; + deleteFile($uploaddir,$filename); + include "upload.php"; + } + } + } + //Added for Invaild file path + else + { + $module = vtlib_purify($_REQUEST['target_module']); + header("Location: index.php?action=upload&module=Settings&parenttab=Settings&flag=2&description=".$strDescription."&tempModule=".$module); + + } + +} +else +{ + $errorCode = $_FILES['binFile']['error']; + if($errorCode == 4) + { + include('themes/'.$theme.'/header.php'); + include "upload.php"; + // $errormessage = "Kindly give a valid file for upload!
    " ; + echo ""; + } + else if($errorCode == 2) + { + include('themes/'.$theme.'/header.php'); + include "upload.php"; + //$errormessage = "Sorry, the uploaded file exceeds the maximum filesize limit. Please try a smaller file
    "; + echo ""; + //echo $errormessage; + //echo $errorCode; + } + elseif($errorCode == 1) + { + include('themes/'.$theme.'/header.php'); + include "upload.php"; + echo ""; + } + else if($errorCode == 3) + { + include('themes/'.$theme.'/header.php'); + include "upload.php"; + echo ""; + + } + +} + +function deleteFile($dir,$filename) +{ + unlink($dir.$filename); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/upload.php b/oss/vtiger/trunk/modules/Settings/upload.php new file mode 100644 index 00000000..016bd4d2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Settings/upload.php @@ -0,0 +1,65 @@ +';print_r($_REQUEST);echo ''; +if(isset($_REQUEST['flag']) && $_REQUEST['flag'] != '') +{ + $flag = $_REQUEST['flag']; + switch($flag) + { + case 1: + $smarty->assign("ERRORFLAG","".$mod_strings['LBL_DOC_MSWORD']."
    "); + break; + case 2: + $smarty->assign("ERRORFLAG","".$mod_strings['LBL_NODOC']."
    "); + break; + default: + $smarty->assign("ERRORFLAG",""); + break; + } +} + +$tempModule=$_REQUEST['tempModule']; +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("UMOD", $mod_strings); +$smarty->assign("PARENTTAB", getParentTab()); +$smarty->assign("MAX_FILE_SIZE", $upload_maxsize); + +$template = Array( + "Leads"=>"LEADS_SELECTED", + "Accounts"=>"ACCOUNTS_SELECTED", + "Contacts"=>"CONTACTS_SELECTED", + "HelpDesk"=>"HELPDESK_SELECTED" + ); + +$smarty->assign($template[$tempModule],"selected"); + +$smarty->display('CreateWordTemplate.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Settings/vtigerCRM.CAB b/oss/vtiger/trunk/modules/Settings/vtigerCRM.CAB new file mode 100644 index 0000000000000000000000000000000000000000..0b569ecf26176acd6b8d0153bf7ada85deb4ff0c GIT binary patch literal 1165278 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

    V8Q$FVE9)H2Mger zgMaaO&)VufRw*Ag(|C(JwU;~10ofGTpD2TTe7U}Dwet)Tx9jc7eW-JwcA|SgG>4BD z-MKves#JowJ>IU|s7ZMe9oljzk4F9-itWsR!UXdN3(JlEz3#Z`gaT`*X}RFiRmYXF zODMP0do@NpTL5N3nH;?TTWn39FA{YY5vJ#nuy67saXxI~>I}5_YH; zH;Z3=Dr!o6*aqDNXkfh+RuF8pq{-wx_NEP_pbe7^q$5~g^){0RV^r&&;%kdMnA%!B zR!Z9^!F;_gm$q0I#Y5taCnBp)%hlCKL!z5gZLCJjB<6X77N#cJd{Yh#H3$(H0SPJD zV9N(BN2DaagWz8Sdx)LF%R4V|QLr#k^w-Yd3AECtkkauQanF6(Q;cFDG$Yb`zS>0l z)%34mF73exM@eXe`*xW%qFp(ii$(8)Xe`;9#-@@PMnCb&mILCcuAR|V@JM3o+b3oU zy&DW{MyblR-KV5;T{I)@2HMfoINR3n2wJ0TzS<~(+SgX_+J>G)bp|(qRKAhR9s_G5 zMx^LJ2v+$T5Y@pX%Q@RP=R@LnujQ=gob|++aV=*T=PV&k*|nTCoKsGm{A)RX=A1Fa z$+(vDI_C@`PRg~M&79MNIHqek)tn;`r{%e8I4d~kI~q|*RBLL!;~b-!$_IU4i@x7t z#3j2x1Mt^I+R(pEZoK(tU#nSMvI%6%Vb6{7!J7~HelvT_{e>1m;Flr9C99v{cGGLs zGzXW`u*p5$h5DhXg}j2lx1f;ajd+!)pGyUX2pvY~*(l9;m3A~rGe!2hAFbl4OK}jR zL!?p-XX9sZt6?(@rDElQzsJL^YGKAh(2#cJp@{3z?T{vX-yyQ8Gvtx!zWF(V=)i>ly%NX~*womO z$}4TQCXheaB3I`FupEFX3)y0a^5GGFekyIw*92G+r6E^S^w1i)nl@QTyp<|ktXODY z=D1v)7Apv`^dep_L>Va=sR6nHw^|YEO3c za|dXOhusC`?r|WK;NtZRnB>JZy7JKLb z70qN<9QIft^t~^v3w^65*=fr?_W&uz(`wRq!tMoDGwXF7Ot>vD>`M0XgM0snCwT)p z9OVyUluDZ)ju8aqp1rNyOnLDn84`^JbX2mpUM}oqDNGTUrk>*V#(Q+)Wow}$9+nT- zr7DZhqeR02JLLV!u5qyfnHVnM${;~i+Wc3rp z_{WLXh*SCcYHgF4%<{q2H`0>Ugk|m+o!l%ZGi*we=&xEu4vVKrJto_lf)mb-E8k$$ zJIT=O5~y8xw`@BXoX|3^+`K^tV)<$^ywqY7$eNu>TWy_XTVsPaHCFpn0Lf@9HULRW zQ^M?btD+XXo~(Ml>Ruufv6;Qm#;RY{8r{sQSruKIUw#fm<2Y1OEly+?ULtE`@_E=G zy{Gf{!~9*&-!u4o7QJtGEAkRh33c(DSf7#gy4>`O-bfXGxolY2N6tJ6su9 zDzyyqr8x#^ju93p6-_@lLal(R4uM`F&)MF} zt^C0HcWE}gOKo7%Y)xNncV>N8+ra5Li6>sA@q-0PQPZa&iObMQf3Z)Ab7vKbfeTzs znt~HdV7fj#%g&wzTWM&C z#Get3KVJEKkQRSpB>tFa{PFGLk7xH%j8o;W(bkQ!{Xv5O=S;wITfT%S@+swQP75@9 z`j-1hLwuphg0nixi7)>nadx0fr_f5R9p})Mn`HWNB(}$_@&(iU4JH)VfFHj?8W3u4 z`mboJ9l!v8-wgN%YC$HRM3p3T$KRpDUaXvKr5-bz() zkBy$U7x`;FBl&r|Nx4`C^YH91bfeatEEk1+^AiQPSX}MfgNZ>ElRBp>4!{@zu!I zQm`|k22LQO{YnffDL1fus&bL3UGCbJiuDhi?wg;6-s}sct;9tpDKC*F{DGQhlT|N- z4mcF&XoJ9aIqj`X3h}eRuS0wUG+XUDcV~x^e^r80tvbwtj_+h z0;D`E8={@t6g1O5S0YTBaU>ck0o`?Cd74D16WQTEQsw z&>6&A)EpgUQXlq_7G-cLnH1*N$R%J|7r9EglZKftQ=P;-fU-Ngxz)a&!}B=2n);!h z$p|)@Lq8#HMwGY`Dtd~xLGU9{JYhEW&!lPGaSkPY3>+b7m5&{~8pVI+fwX~VdIZ4^ z-Uz2R@KOGm@-)_4_RkHxoH~pd&XEr&bE&tF)8%;1!~(gG(m28TW7YH(_KK0MDXiB8 z9&ahqkQdM6sPB=mz_I~km!*69V3kk7N?lln(bQEQ=|<2=+YI*TRak-6ELH&7!V>v2 zsUTH(el#57+zV|>_xTU`K%lc%IWJ!xnaUp9!xxz*tt$`gp?$^)DD}^KH1D#~L}tcz znsw+RW#m473xm=+IZv~bs_D{WQ45*aRooaIYxd{mcsh{rSrainBSvdl48LUQZ156Z zz8-LcH;aR`_Z+z?IcWlK;)sxY4FAm&!C~SYVEDEw_x=PvX%=W z+3D_vx#dY#`j}z`%WjXTtOG!rFN58oxqacTSowYo+RTyLi#;MWxW~&6w|zBk6h#mN z1H61$GVoi5CdG0i8nG*#->TV_$THr`+fz$Ks!Uc6&(+d7znB=XbWf7<_0pXtOM|%|I?pk?mQ51D@OP z-%{LWZ((0U(00=9G8QYZjnH!y&u>myK9_fj{+UP-o~|u9djFFb%YBnpq*>DOXrRub!qe&`NZw3RVTCA&J&c-wn~LoQ^R6v^-qjloUp)c z$=RFtkh^!2UAg@eT8TV~t{A2CGk!YepO1mWjx3_Ij=R$A>R_6+$~`ZVavS_UT7Hl6 z)*m}!boB2WCqSm0oI<fNA~4!9Q^av7xwamNfw$-f z)ZsC_D$w~b)`djnt8vkLSca15&i@L&_f7A$HfFK_y z*GAql2*anrX4Gk4Oni5OS2323UkCaY83cF#=7MCMr;o2PS#Wnl{WixrF%Y$FG)Tsk zD8pC8339yr8L3D&UEk)jt&}bcp`5O9q;!(y-E|6I!*b=;wnO@n!Tb&}zFK{1i&Fa; zX3s7-r(5Px+kMi%lkn<>h$}v)vX!=xXH?RX7W&$q>Ib=tm}nk017{MGbIt{=p$wUUm7uc(-2e3m6v(lYYW0#dQB(L_{M0p<|( zYK)!c$*qg{eVs0Rrb?dElINskJ1f}~*`_!K!f|x)>8rP$w#&A&18pZG=t(;_<9fl; zWPe)NZf+^_-P&+lyO1w*GQTZIz33;xh!lBG9qZa$r*q#UZ>1^IpMJDf8j%9cohlck z61xYnySjA!=?86Hf`hbT)9DyNu1JTwyErSfSsNi=+qIi|qCah6o4VZbE*~b{+byzR z~05D6iKepL;$JG@xq27QBIMfkPj%K@OA=n*T%goL@_STDAW48fv(N?vIzs>xMDyXsyX!OEDb{<}X ze3@mCnR9{J5lFYE(jdJ3EQUAhKN?PNtO*1&nW%vx3|+$50zj_vQuWwtgXjcjQxVVn zT`ibd9QFRPjdV1UY^it0+0}nYQ2X(IPKB%IQZr zUG(pWSFaj0@5R$jBhoZ;P%cQ5Yf|XO^1|X)j(K|#HlMKGWYVzz;*50Kx!S02`%>X} zF_qc3C_^W%sf8N!{|W*-Sj?}?7ek*ly`v4jAB(vo;+>ZwcshFL^+lU2#e7ddRZ-QG z#bgeqVi6<=+OFfNNIK0U=t%Z7Aoas=n`_2CE9OQFiP0JPABwoi`|`7J=1b`w-vMQP zgyjdThG(+49e2?wULN*1XxWQ0c=yhm5Jnc7L~xYVQs<7hD{mp$iL!4O-8K6=aSol9I7Umjy1-U7+R^GxhTBx_`8}mpE0v0Yg`>e`&N;)zR z4!2H}c$pe_zVx#utjkx_20P7`-J-7qEzItHwvDjlhSeb4x;ioyrqc6W?y+h|$^tWtrA{RQCi0$l;W zY1YrveGwSYZ`_jbC=#-1Om8JNG_&mF(+cJ2>cj8Mw1+G1p(Oc>wC97N8>5~BvrByiZIJZPdrw!7>7>^Ox)>i8< zOt$1;alQFC?~I;rQ?R#Qdzku9IG+e-KT97kM8*(xZHJN3uATR6q?Uu2S1DPX(*FwG;y3X_h~@D0UZwL(8myHY z_+9FoN+Kp<0FEI>eLPAGG=&^s&)G@b2k-lj$jO&>BPJ6DiT*3!0+Zm0mwU2a@6wJc zUE*=&w0)+6{-4G_Qvu*`%A>MiC}i$MoEQwl;G9HpO&t~lb&lD0&Mdc(u2A|dhYeBL z1TPM8G8*y{b=vp5CzjK9A`25Un*+_B{&G**)511x<__Z#yYkSjv{w>3t4uzMWi-Bw zy}p@yg39Qle15In%&j(keX})7C;I6N4Z71T*^C|~uvheZ%P^HH-`~D^WsEae`H5=~ zic*%jH)wnR4QJn?ukFqT+vzwM-X}Yd`tm=BBr-D2C+P;Q(L{fQ>i@3Wf zy`Lg$e&JnIZZU8MwV{o`qFUvJ@!Ul1M{w^lt<-u7bracR{NR3N8n0ACaE_U0;*^IE zz+1AN29$>IYlNu?&&tD7$kQ8cB1O1@y9n>ozkj5(r+rFa#?;8ejl`VKncIljY%?1@ zU8u~;mihc69RJfgT8&H%HicSU@|fzLFqyT_2K*z5_ivqnE%gy+;7vOFEILe?6&?1IH}&sI)w`ZNnkKnL`Ic^kmny~?bU_+*k!+2kUl#tm>YUvfsm|w* zle(m>>T_yRI2G)ZUp*z$@V^@6LNyK zF+bfy-OXr!RJk8TV~>*B+Z|dX4>wR3Eu}6BWYB+yr!GY2e?%^(*8iD%`3UewM!-_~ z7QzuU_S`JA?UMVn-Xu)*4)#3mB1Qcp?4@1zcyMRVr{Yf`N2CSKge<=i6Z4M}!NW?$im-{Eh}rtuh&{ zEOEi8_~Q#=`5v+u7~9G(bVsy-=&!)EMC-AmT7U6=U~>sUb*Z7)u?Rv9#J&U)%uh~~ zY_BsH)y((EN`cYE8Q2`Y;v*q;V8=F9>{&nbc3fKCQWaC89D(g zf^hZHtBd<&c}QD-k6P5?`LAhg`&PQ@lFGm5_~|geekKOKJIo6__6QFyAJ%qZtw4jL zQ_aeiJdLo}A0eE})7%|Dox8tJ*1;C?rQt*8y9^F)ciiJLs1<1(90;cbSO!OKA`gY` zZyG$^be$afqgOSLPj z6X}$@yHmP>)j_c@?_PZat0|-VnB+(Oo<4fXEjx$hS@i!fp07`q*zv%{rF&@G^B8DX zzd||2qzTvJD<+V7IwudNo8VXJ+Ls>@#HCY$6G%%nDyyy98dCwhv`vCvBZt(Z6Ex4r z6_NVvP0bR0AcBAT0zzXn(n0<`iRGdv1LiaRqY2AJcY>qzx-`2@(9-B`<&|U73*_%# zLA6RtOO*E#jDky7TGC)xTJ=PnQ~4usr*FaC0tg}q6%N=;;1=?uLBjbEuS| zw1g7B`D$F{nS^#Rdm`o_ih01LleW;U9p&Ef^l9ny{NN*o^hvbl$E4gsy7zcTQ|mRv zG9nJRj#y5_o310yBVzaKh}A?)xQ@7vh;i2uHxjY+LL2e_06~HUR8v6!fI~~|y?b0# z)gJ%7_GW|;XPB{2Da}h!S!kK4foOrqEd@sqFmH%5BOn3}GpHvmY`_?Hqgh&ZRgYzM zIo(g1mV&6LnWi1hu49afZzn8-Yz@7i-i`~6 zY`sdjmxRAvB|J{TGgk>^5?-Y3|Nd;E+--`UDR;@#aOIyu_`wgyx|6*9oIA}st?{&Z zw)r%j$LZ69Civ}fOX)HcJ9Qg9wy0g2`yH9@7;L%D(**f-Df}b*)6jX}6~f{)pXB!V z1YP(L&)b?|KLr?K0}b~D8WIBysW7A(s;#l4)GUnUI|{w%gTUfg-da~eaco(`uhr2> zModdHjmnDHz&$|wOuh#f&Nt6X_+0?}!xTC|>bRAT`7wH#ciU(__VW1Hz{>tf5S3@r|MFs@-ikTYFN@8az`*?r1;cKs9b8j?jzfFU$>$Mdi>#&9y@ zBp(iv44ae32K9C)wZ$g2863;tym=M60{RV_=69i?_pi;HprLL3=C#mJDK9h3n#-2^uL)3%$;rU{X#)9=W6W z7b(Gno_g6)7*m~)A84k{;oM(PtdH1Ho|cFXg!ekMxpdlP{-RKRME+^j?uzr_@a7Ya zIpI5$W-ft-{5tLz49h1|AY?)pmOIfzYs-hrZ>3*$DEw`n&SFCUk^T$+)R);bRhIBa zr28>;c7fkVG*ublRgT%3-|@(ER@%VSNe59rd3b!DGTP4H*Y&EPHbmP_%{4ZYhQj@oKB%Hx-W(pIX| z${(<~)boHTXZZsTl+xGvMrB?ZU-AVxZfBi?ex!{0=i?`%TBjQxeb<2*?7kl*b*eg8qSs}A&cri3f4Kl2ayFa`Vkp-`rT z%U9=OY6T5R=c5xN94CXKlg>L6BbsHY$?6J7sZXhtibRZ)#v%N(PMtD>&V|#0?Ic!j zSiHHCPGSI3;up~Dp@k_`q!|}3DxX19HLizIISkDv(N6F26MiAj;jO!jhMGNOfBJ+o zFzafxw#4X!QZ^n3m(HkSE0@|(NqcnW#aVlli=`s(3+QmWB0>Rs*~>#d0% z?-^1`VRGD%#iyi43Z;;^A@I(Uq>9Xp&#D^5wfe?y@boDa7MBb~=h>5i(ktjQ`>;8>$zcp$94R&+siI zY1lP zC18a z^n;(&7us5~*iHsM*hHN>{9DjDX^-LU6m3w7(d5n!N746K66TsA#7)OKYzq2=<}aLf zZF38}W9l_zvXTy&G|pJF&wjf!P8YP-@b)c(!hH2}^v&gbj9PwTXNNm#Y-D&;li}^1 zCW-zJYA{Wdk51uVrz<;la&MYO80!m*joV`05a^mZspUcGa&-N*+ z#42|20J^du3HjQVX6_Mk2b656kGvPeoOdb9&~dv`HKN0;VR>cZfXI%NO3N?j(& zJutXuK22SXNe)@wjVZ2m9qvXv_wjCwwlGJXM7@u2lViH16$OD)A<=qxpQTMO_MtSKyxIA*(5dPwVD5a~*ZLD$le+Kssv zXk>9_Hx_rFJqUS|D~~yVU>kMrbS>RDPN=AIzo2u0dgG69mgH;IUad{=IAAKWU(#GP&0a*8t1;_ z(E)s*h?ZRUvAD(!Lw=P?wcYLv7LR)qZZ{xO;=&LlYcMfmo|1)yAgkH2&YL$;y`71+6u38zW zzY7p|D?E9YS4<=Q1TRIo>*L7A1uJP*`RxSSNNtaue%98VK5LgBTcI9tv>c$>P~tw+ z&YLJ4n?81Wi;ZU0a>=KEA2_{adrMNihpeJ==jbmC)m`iSjbjTrE04(HH?gZ*XYfy!nvSV@nfquDi0r$=}4%N+S9j*-o$C_)=Fs zn!&T7xfuhIF%LEE?mE7fIx_?MqB^w>&2>T6LAhRp9B`&+m8GAm9|Y5WEnP19%PCCE zdebp%lTNx$%G5}i;c*XWZG0yV?HfZ=^J!{#D>ka%C)+hu6Dq|VdFF5(Q_>-nPp+V1 zNkV*-`!}l3y>+Jdx$k|gK6gJTjdxy!OZ7dI!KXI+{N8vF+$s5 z`vYzCURWtd@+f_uz*=d_qb{%cPs4}$a@aeyN_`$3NkL3DP-s#z9oxHJ($dK^6aPe0 zs}3_c^0psC*?MwRQ;*F3%p}i6h;lAsqD*?D!~5~5<5qewQ!?IAOJ@b0SxwQP;M8z( zWy*79%2()hy3+Sm=cl1K^)aE{Ez1AUB#Vd1;m0r+3dYhFYpyn}y@!+>8P{YBGr5vu zOgZw}#BOwlO6-zwTaa@JRHLn{yHX?H`w==p($r1qMk`re?2>kS2r4?=)$4Qpu-4Yg zk)d(NMcYMZ9GuwbA{BZ4QRJQc;vQ7ZpW-eWs(ZcO;kM95XLT#)n2Hw0rEZ#S86Lk8 zdimWo>da36I;B#c1@9KAyQSuct+zB?8~32brd8c9?q=9=BK|XDHy8t$@-;N>ig5Y4Y4iYRiqTL#RiMKFZFI@gdAie(VzGI8 zo0OrGvfEvnsSPJJK?y@73IhNDPve=9Kw>4TJA_E z?|8B#NSP6FI}MN0j%?IUNaDtX8yq|7s^1i&lx=isLLChncY2HcuzLaBZYvtJJBCtBxg~gw506TW2x`D2-I=0u zrfOYDG8U}zMkghFNuOL<+`}8)e5X19uch|}f-;hJ`crgLy6jBVDVa__h3AbUo)n!4 zO~YNTlb7xy8!e<3DgI70j>-tv!~G4Lk4qtRS&B(cfdfZV_&ED-fdc^SOs<-B^!cGH zX`QLKzx+{+I=8xg8J|k?JHc*2-w&64=wXFFA>-6Mlo!)*QfZW%>Cn`Bb=07C^MQhj za>8!v#6EAN#WYDjmzeV7F7=oJnYGSPh3)3%9kh@bp{yjO(K-BOjO(}32Vm95{B2-iY)+{H(3c4_YAXY3^1?sv|KmgXN^(bhEv#ml(H?}6}W*RmNb!npg=BiUCUBh{yDLnn>>9qe z_I543OF6&b1{WIELH-$aE)6JuJ&nx4d|+{JjKk@#xZOc*Zn_;KIXD)IVdQCs3&9q2a#s=HZo2ADz5$c+ zV}2(la-xkpWT+kmoioO>fqOR$7Ie-SYTfs8hqpu0nsiB!j?;*Qi4i)oc3VnadVAHW z{2D3c_N00vUT0)1M^9UCXKC7=$rn%8+de^cOhia z7SWn0_BT|&4`DIG0^)HD$jU1l=(%lGhU(qu#_E#VBMqZM?V(c0CefzRX`CVS(qrb@ zZhRuMa0Ab@vb8i5kKSk492~dT70#};PP=&cmIf?(k)7zy=op9XUbyXVyOEM?3#MU&Ui(E}Hn}TxS#kmrz+<7Y zYc024K~W@%S!(Wa4_$rv1Ea=JQ}u6T`fNWJI$JzJSDWzzC{yVN?Bi`cCA7Kf zm#_>P0-viWXA{T<`5H^TDr}QsYuLXy)1BL9Oh!BEbwrwUi8m0y1mr4h7AG*o{D5sEBG`Fy>bUj!hPA?3c+V1bxf)_0)7( zP=oTpdWx4(w1u_qLGB>igOwLmTV*xbB?k$HnoZEjS%{7Dl25jNJ+CpNN&3usdRd;K zRY;hsJhIO1E-Y}N!~AMRhqvu0wsCwOh<{aKZslSYztJ=&x;3k2U*$bgwysVze0aPz zq-xtbTCdt7QpP05{b7r#6Kg|K##GnahQU~&Z9Yy0`#CaP7j-bYUOG%Q@D25LwbxO@ zrp{3ICv~{1=D1n&S5FL$7j1(}(KY=vx9?QkMHzVbvwkBFXMA zvp4iPN3WCClY+5oU}4E6{+0WA^}}`>W_I@L-NU&n&#fe+XB0^IGYI6k`^&5i{dpkK z-^AWTIzu&`Ac?)HzDnef;Mk*;I%4~x=YiAauf0y_ zX-*!XGM2*Q3Bt^9^x3ZTp?Sff4)xXqijR_W=vo&Oye@bc35R?)t0=}p>bYsm+GjKx zHaFa|b2NS9Z3`PsKM!UL8O_2OvuldQ<`Wi22b#_6nRLw&cc+DeZt7?0HBUiY9Mrru z=c6Z(Z7xmHlTZxXyIZ6oj)qW2edy9lFa0H2EY4xsTXfwm*3&bTL3EOTaimsh_(a{# zI;vj#xAI}WkEFc$Fzwn$w@Q72Yra9Z_^JF?Zyn2$w{PQ9aYtk@bL`PLI^wP0ndH|X zbj;B(RDoNzV`w%%ism$tTxLW#QzMjJTj?&wcBwK#S+kXYH*~>->idJLS4e+;D-{*3 zi0m0savy1-F7C4J7PrCP&k{Rha^>|NyExdn%Z>8A+h|dJ&o-Z@C|Iak=VY{Yn4FV! z%JX{VzKR)ISbAHIyrzmzv>$g?@$0TIvDDIpH;vDB$7&<#TJ2$4 zrMQakC+Er^PM~q6`3>5@T?xH%;`t7~oBJXel;^oK{#C0{ka5YK5fJU#NF z&ge`T#8(V=@J)_f&*_gxG)j(}cdPejAYbm~<4b$%QXU@+e-j27Gv&+kQBzi9w!hM` zq=hY(u!3n`CRJ$Yr6YX0s*u=9O>>Ksej1ro&+pS}k$1zFa`YK`d86~)EgbwTWosM1 zo77VcP=OQrsGA$?IY?(lbVx%Gbnn*W!5Vv4?-E)=kC5dx>4?i=TApOLDZd4TlETXX zxwr9M{w}jx|12+xXJB;1pm+DC-T>jF5K7*c>7U9KOxofCT5t^8{Z?cT=@=Q~rk(N7Acc;hsm z?^f6zr3fS$qZUL2m1~swZnqjKjbec|vO`()tmm_gYFjNWFC*nmpM^4Kh_pwUP)oTK zNl({4MVYZ2HgQd~cTsckNp%~&+f%fjf#5F)ntv_sB9Ge@N?(!NN6NxDYBhZ0bm&wa z`ZX!(d=u;7t0I$0y#p5$-_~h5ep;{Hep7LXtmEEATc}C4)ba(~4g}iT7>b#nE9pEs zz8rp+aQ!qLKl10axAALn)yWeA_!Lg5?MmtAmoCwEr<*&|TMRXH!oQ}~o)Nu||K3#G zUX(n|zIAzVmnsHYq>z*@9~@#V#WMOWw%~5V=6b`2Ri+M+CO1KDtgbFuzi}?%8yfcZ zpySTzvhu`g`dNYY!%FjiqU)Q#jNYd#ha~!lvWhI|I_kPIK(kHn&El z>zwIl>DAG2N;{nuYj+=0e`PB+={)MpYPxmyyu9^&j1&$vR!aVAzABvpr720vcjIU> z?$XSN6%3Bv^ph<~y7+iUQj1nfZ)yHT9+?K;3*a2(P`Z=K!6dh1c%*wbAf*!%Irc7c z7OdpQVtA!X&5@VH(DB2iNK|N*XURW&3%^dvQNPfXD`)Z73w&$j82WBi>#U{M^{NxO z8ZM&U%{x6i=5PKllqs%i^=5`I*Da@#XhTOu60bXyXBW^CIo0a3PxI|WzzdH0Bk zCizwbNiTQmR;$w{EV^If5uwMce(tUktK1_H1N5K=)&2a3=2Ew3=Q}iNpY6^-f8+Q7 z4dtxoEy>ak=#Yb; zt@;-|{`t>#Eai4OWf51k%6w0Fk8;(hEYs1I*4JCFb6kpCpqEYm#!Q0I`K1|+OE1xn zw^@5Ey|kZxbyP1$b4x9^lyBpPp4_mVkBu@=Q6=Nc&3PHqq6R8b`g+G*SMMJJr(N#PVFD=i9^{$D63qki)2B8%SyROLXa; zaO%lIIch);6d_M|LC4m60#jPLb-3$-lVi}{FGQk{A9mN}i`A!XL+XMZd&HQNhMGMP z*ChmDnbfDw;&wD};kytvAH_qb=GE;~a?m5XQrs{!N=@{CUFevYuME|{F4wVYjDo9S ze{m-rfHG9aL*IO2=^6S3CPOv#rAiD94rAJ5j@#1cD={;SG2hxoRG&6f)5Yx#vJqDO z$?5^sN>ASyi{v#H|INsAjd4$HbdBklkw?lERcR-sE+hpJ?|-pLefXYrczE+`XfVvy zojy`_8*1KzY=UwO|2uvcm4oZ(oN99Q5kqx2R?M}%QqpXns_LQn=;dKuc-t z^3%?-D^5d|p~_ItLOlz$1!@b_^H9%2ZG+kdwH<1^OGC%iSx`$*oATpGs%*6(nEK4f z+t=t%!8HOT3F+~O5h2G9YO*dMge&J>X-A|?h!ir0lmJOxa?mY@Yg2;!dGecxa^;@4 zboLzJ6z=@F^IMSPclBwHb@qTH^+A&QK#hPJp_Gs0=X!b6lY@Lg{f+3VWG2^!q@)?D zHxKV{qk2YMRlh!gSlNL8)M{%BBiFWxs>%K*cV&-;aGd=wtVgRTlq0tE>Q>wRo{Bfv zTk(pAQ^j*MX`<`XY@yNh&JgI+>}`%8gY4VA^>OJBv`ysf)%+!NjO#v&K7#+7HVL)? zt*FtW?M8Xli{9Q&zL{(3h$EKOwCy6c@xTeI!mgZ7HL#Y z_dyFAA2~?$N}MH;;p9=#!&%kkA-2#R^h@+gB>75WqZZoqqbBdr@>?K`knP|f3#Q2JkeorTS&iLkR!WysG{)@8Mc3sDZji{ z$DWY(Qva<DJ;?y8(%dK63G5+2=8~!fJ*hXRj35c!Fl<<+g-O2t1spWj@l3UJ&1L$q4aHL6#kFeJ(_Y&YO{9PL7Lp`Ecp$OZ%sd@ zOi+FIC*LU^-}gi1j+L3Jtud-)X$J|cUAB{wgUO4<8_0bOk(>HpqqG8b``@IRjLtEAU|Khq zF6nmJBKx@hHPCS>xU$Pfbe#CyD|s`NYS?AFd(gM4^ko_CtlhpJqNXmpE~qDe+&%ik z60vD4?k<2l&4|9Y}`@bA3?l;Af`9^jBB{Das9w`MvLbSHJUXy z7WVJY_mDjwJ;*h`8fu!6yu2CF_0t=hx(tCELb(lj+tg*4*BD90Bu08kPf};P#yOZY zQntocWk=R7Q%o1!fuh~ zF*U+=Mc$1f=2v#mCxWTQ+6T3+NjGRWP%zH!TU+SO?-xsdw-F>TjLJfjgAiEl5Ubo z>!{Zz#~rq{NPCJk4JUQ##Vxt;*5BP@YH1)$V>Nlv)MenO=mG(b8)Rm%fnKVs| zBIz`>@2R4n(sDNmWNu2(`~js4h2?0_X4sFCZ&ytOYJ_vJnn@L5j##%X1lDnTt>@$R z(l((pNmrYvb!Ka&(5O$Hp;%!@HM++4(>hZ$PJ`<)f3nqn>cPgKhN>856QvfHre|EE zG%YfsB9VTnM7=?VzC3p&3m;K6w}-?hklRb>l^r}i=S>@YKw0q z3+r6!j-{4ni4S{0EzOT2`mVL=MHCf%qV_vO5G$AFk=mZF@G4ibw&A2EYA5&anxJ(W zno{WF0M`7S*Z&KF{=0hoH*a^|-TXf_ryBWIx(yxLSLadBTWAH)Y8xTxP4z}g&P4BB z0Jg{+`Mp-E=vc_@MH9+(1~(;Zs0UJyu}XXL5ROqE`-Iwp{)J^)aaXwzet6@9EQhzh zRphv32AY0x-ss!h6Uku zYc4e!EmfatYPlvpuA%a5-53G=cXhq}Gv2d$ooGEy_yA;8vYmt5cNs16b808Nf$c`0 z@;lmM?C@}CZ8yj#VS`A$f8nY~LAF+vVF33EKZ@s95$$NhBV2tl&%N<_w7cO)jq8mF z2r!?JE+8F4>M{f*;tpRTf{}*qbRH(In$coT2|Q#uSiNWkYQj@?>^TVtiE)Iie) z9%1Dptc@id97|6b@js8b%RvG}$*I@wrmK^+&K^2wif`Cpgd+cT{;EVYb)i)9j{Vjc zen7F^Zdl)j?$2-2xQ)+!@7Fhxhw80`IQfR3&~@DUg4S0SlnCAUal7R zK$Ih5oJ#MY=aXLRTBuPM)70m=1{oG>F&iJr#hI#=dOGSOm+n-p zt*6$LYjiJ0#~w}G&c$naAJvL*mmk7Iq;%%E7cZy z;ZhgJ$$qZzdI{?d#19@^nkSsvx?Z&=4TY7AveMA0qACQ}{I(~ecwY1B=zYyA>ykCP zc;#QPBVCnJ4qdMMsPgn4-ZFZ-)SSB>!v~BykFf^E9RsOmen;~Rt$glr)glOkTV1LU zUv=qbTMVkyFttKeKTDO!W{`S~scCigvIW;^>27teu}ht?wr8@(pM9@atl1OHlB;5F zHq^{Ru<^dM!p-)Gc=WE3 z(MM{&F|68&n1fK!;F**)%)yi95lJl1z2`S9@3%hBkjts0Qbx2I-3D z*gzIPH=w$Zc6%NcZgAax`HFi>I7K)Dx?)XncvF|EuZkXg**9tJm4?+>5=?*pwCPb8J&h(5W?6)DDr_rM5f6Q zSxc_S77xcfVN_T4ZfsY!B(5tPII=4n9n+P~&eO4kd>wmko1Tp{gt2*B^z1IE2V6!b zgPWHdSqK;nBJD;twNhoQ2P^m;@@K(2pb2~fY~c3i^z5CPVQl;_2KGR)k*!S#V_U<* z*dI{$g05r2SXh1-I}bO@A%7Ws4|&^MBO6g_WOqUR%xYvmK>r8S4p3ELWaS_MWX#gB z?U%ce&D4+4E2% zut4|(cJoIfj+!ubs~E<1&quo9?xs8=JNLYvEnTT+2SIVJfz5^a39#<*FgE>j1G`}z zV_!;P>@w1Gs0ljIJku3xhk*2<9bZjQj!0kbwM5pVJvI2p7j8mK0#U$-{TZ##OvsfI`$iQc~lsiWHz#AKGv~HsKbE% ze)vQF??$-G@x1pBF!mn&UmT@pubkGgLrsirK%Bab*0c7hVXQ7j&sL;`u^Pl_*K8yE zai)>IkdORE+LH>5EDq(k8)fuw@G`}1|idT!IPUtzv&C}aCa1+$3NcrNCRMx_5d1A z+i{Aq@HvbXzAdn2MPY1WVHoQ(CyX7rSI<6>jLZx=cInuQP*WZ^GB?!Qq0R->(4PTq z(7V8KunhJ3J{MhbY-H~tFDem-Co&Ce1NZ=(0sXTK>{F=wpneS$aA=Z&^~^RfH}sQp z4D23oKlJ+`I|KbAaK9DiwO|0ut>AS$Dg;@!`SAMFt(yRjOEV{V;@012^Qz++1tp+#UO1K>ORWmJV-=2okjUvhw_PkQqPK@ zR)GOLv)-1UY1A>{A4|DaBy?r#A#(02!)qTc=m#-Yxv1$Ths zU?bx8$-FSOzch?ZK^%)wH|NJ;u2ipMJwehX)YE5mY}Io*_A2-uw1bhzt02_TJ?{ui zM853)3+-?&W7EL(KQs2lS{*A}r(=&oz60()LO2Sz9eOz{nEmmzj@U`lXg?F5ppI&us3WjyasFc$h}P#+pVGw6Xn>wb_8 z?nJ!S;rXG@8zDn~4PFCBA^Qqp&PA99)}UR1UWnrmkOqE&c?2i~OTlyCeJ}y^Mm(QD zzuX31Mg9H@yf7<_b%2M=VQg@57%Kp~!B3zKbv*+0pj%lOivqVSb_Ry3uD_R z>)8*vdKLsV93;%tvt!8PzMtsXW9@oY9u&s@4A-;F9;kQV_MUpytCybb2l@y-`yb3t zK{bJ>8}!T$@_WNAm;yH|VgEV$#3kqlXCO=~NZYPw(}5jG;O!lHwg?P0y{x=xyv>xpgJPCG! z&p=p%o@Ibn!H#&u@e8!oPw`xsFN1Tt;kF6+(5Pn*f2(6bhjgs=GmKwoGc#>QwiE0} znVvx2Jcaz*iu}`}pKa``XVIXhAJPN0^@^U|jqqMU*fUTj^TDjyVayJm9E33u45~&N z&|mz1K*u(tPZ{$J>JP@eb#QZkK^UvGgt3iK&k-oo%*)6xjF-pT^h|RRbrT!`_rv@< z>h+KgJu3lIkf!+)^z5q)JsSdkM_wL7neRo|H+`&UeO(X*)-hZ~_jGR44N27iH((+up6=?3;4 zcx8rx&CD~fsF?;fAs=qwH)pnirC1E?)Eoo5`!wb&NXuo!`?uCG_HmJcS?9uiiGgh{ zGq5R0ZzSqm5;z2XH1gO6g3y283AQ4hH$R9m0F;6gh;uOFFc#dr2=jym2KMwr1~%0S z*~13*#}We@d`!<4fcmEp7v%j&gmK587+c#A2k5s#9SJHs&_`bmV+~ir*dplX{TRmn z`TOVZpTB?p{=fcZsCT;j|N1Mf`@e_LB8zPArhoGKpTB?p{`vdo@1MVa{{H#<=kK4t zfBydY`{(bUzkmMzZ-2vH{eQQ=x8f-sTb?Jf^wKoodAR82bd0-)s!1G`u_y`;T-+|xf(496S3j_VYonSaf0Xd)$ zRDx>oBzP5U2K&MH;7@P}>HQ8ggG(S}hRDJ}Uoa311*1SRmSm<(ot`Jf7{055^pz!tC%d;`vdW$@Rv7-4|{U?t4YQ&`Z)gN@LSgPILygLh$G z0QFJe0&Bp_;62a)J_jekpFlHLWH*2zAO%bV#o%8+0xyAgK@&IuE&_cC+8-DUVnHg% z2D3pKSPYhfb>JPa3mgSMgNr~rPh|Z;PjCkq2{OQJun;)G8n6Mp4I02_;A^0OR?wvs z`2lVMw}TNN2}}aB!94H~SOJ~`uYh;JR>9=z)WBTkAYQS9e5Lb1U^PN?SuM15QT6~L2Ut- zLGXOoQT>717u*42!2{qyFc&NUkAY{vM({2;20y33Sx^u20dO3g1}&f+bhV;AfdODJ zhy^Ji8_Wjt!6TpzVYr~a2)dxpeGTe=K_fT>PJrJ*JJ433&4ar^Dwqo9gZq%KNuUHg z3RZz7kk^6dKzD?@5$bzjJJ=77f>WRcbg`kGfjdA9NCyvsxnK!c0oH@}!ESI2`~uoR zm>u;D3ZMEBe)OxV^Dtt6QG|4=7EPnD`eVA^xxn% zFbpJuiC{XI2Nr|J!Smo%@E+I>_JPCT2XGFE3q)oBeZgQb3XB6&ff-bS8n6ny2wnzn zf{(!g@GbZihzn6yz$WDHEl`Jm`+*5e0YzW|SO#7KF7Ouk7#svg!AWoyTm~VFL>2-1 zfhZ6IQb0Dy0~SyM9tL&bIq(X2A2fo`!M8vG=fD+U_!sINxCe{@8DJ);1T|na*Z@8N zyTC#49XJcxf#D(e2X}#ZkPT)7D|i$<0bT&Ff{(y{@Fh3_&VUP`19V%AvIDn(;ot!< z85DsE@Gz(aPl1=f8{ofSCpZX>fgi!|zzxEdp!~pK5Cf8d3FLx8un<%MCs+m6g15lO zU=R2Ld1dIY{U=lEc3Qz@V!D_G$yb3-5yTMU#2DE|?Q7^q2NA{2C{(# zR01b>0lWk zea#NCL+o?*E&Gyv!49({>^pXx9cA=$j7{uOmd92FIf53ljqDNDg&|ffhzYE}I8K-# zWC-bkNq9gQFT}7|Hj>4$QEW83kKNA_SUelU5}B5bWl1cVrLa_%#=5hv>;X28jc4gB zgH2#2Hj!nrEH;T{v&rm1HkD0d)7cC*ljXBntbm!Bh0S4wtcVq}xvYfEW2LN&m9zQG z$|{(R*;yr9z!tH8v4_}VwuC**s@PIi!7|*#;KLUS_Yd*V(P?P4*x5E_;u?&pu%PWgoK5>?5|7ZDSv^PuO<0gVnPJwv#oo zU2He|o}FMP*(vq|`;nbyKe03HXC^a+{lc2rS@tXYjs4F4U@h!Vc8;BA7g#I1$lBN? z_7}U%+SwJ>!Q6}qf*=Y(f=1{f1PdX8R_H2(3f%;qpcldfgJ2Z83)czP3*kZ!p{LMG zh!AcNZWMY8eT18YzCu5tzc4@uWj71A2$90A!fnFs!a(5;;Z7k+xJMW&L<_@&+t_d+ zPUyx)38RJkg!_ft*%%>F7%LdDx?V$g-jt!$PoszJJ_8pSC}k3C`=Ki3e$w? z!VDo#m?`87vxM0~fnXLaLKK@L6bge_kx(qm6-tD8La9(Dlne6(t56}>1iPSPdKShE z%*ZN*1;RpMFk2-2OL$0FEG!Wo79J6*gr&lxfVIpSNwyTT-KxEL#r6mJ!O6!c=Dc#C+mI9j|%94g)=G^s zCj_0iP54;&Lk_$7X*#iMSMlrD7+}#A>JweEUXv)Eu@IQ2yY8U@p>^_ z>@MbszYD2iqWHD&jSw&1FD8f|3Y&#tq9U9UeieQb#)|I<1)?mxBm|2g;;X_YVXa^h z=f=2&kH{YuL-XUvqe!1#pM43!7TnIToz)))4~SfWuaMk zLwHkY7qY}0ahy0%93u7=1@VwDLrl-g8IzMfV#r-%$B$>(6=v($l9KfNqEeQZS2-&` z!MbRC+3dNhVN6+BNs`r?lW$ecndX9`c`yxCjafFUYMWSAzDO0pFh1XAPB+g>%r7Y! zU-0+ROv~TNvusyO|4x!nz^t~}V>1CB>)qvP|BTm|3KCRF1)x|j0UhdQT z!|~*8MwtcC^@*mKtz|yL988} zP*8BSD8+0`8(T5KLUo{`lTBJ_W!YSFC(%T^*}5pL)MmC?@@IFp$~2dl^DDfvv1wVR zw2VnfnaK%>N%V|KX^E&@w*RB`qH=RusilljnljC^%d7<~(P~CzO-ou>Zq2e*QqiNO z!R^?x+4gznQd_>QsH~Ks)g|VaW|x+fEg*BUy>vF&QROBx{3Mp-S5zPf^K2VQ zGR<>}Dv*jSv$fJ}B}sOvwX-ZKCn;l6URGMhxS`%`3lw>i>z7^Y>Z-gAu<&GUfaI#2 z4Y2V&X_lHHiDhuL&<68ZbA`=Xw#YBQ^U#r$S$R%!V`_eBL5X>SC265~w%t}#I>%%! z%9CD2(wT?Y9eyWtaHuQNrgyh0YgO4Ro&xJhkDdu z9yP|JCRL&?c=Q?O1yoN|gI`BIg{q?_l$JI&FD++Qerj2TjisAyg;YxJj)mHEMIgd71~QPC-ISG zQc=05QIuBL@=Ir%lNMep^JMN&vO%IzE3IbKeT&IzE-=q7$%o=~N>0?ONZC+UF!X8x znGur-<-DoEpcZnVe^ufw;G8j6w?{6yss(b{Rc(;VvP-X)=37n3x+!JzW)+#eEzD!; z+`9ZiUte;qNbQ3>a!(`ln67Go9;vtS zsoW_aM$2szEEZIG->8a;j#g`@0=h;NAo2F>Fz{v`XzTChVaPPkLIm&ejSXBhyHfx# zck)7oG;u}=S(8&gd3_ChhE=YulLMrgYDlxyp<{O+n2A}W5Li6moR0LNU z102k)uz4axF(0$YX0Eu(=pP#s7x~6)XbTFw+Q1oB;-ciDg+49yh()#lV+Qq?9;0_W zhi;fpSL(A)x0eKH{f>PDKD0L9Q?u-|yjtJHCDEV5W6@5%lN_#(@#}q|kiqZ6Y&Bbu z)16J8kdwT#wInOAq(1F9v$-6>WXBYb7;T0s7c`Jlh;)^&5s5kY@%1mmo)Qxxqz5+@%`La7Xzo^7qkZdh7dsCJS zL1IanH+4Q^g7?8B@z1o$G@;yF>NjPX%|5$@6*RHy)YwoNI;G5Gri3LFTqE+&Km9WQ z%u|(hnu)^0c=TtTCas+XG$;27Qp}}hD~f*%O~fk#$_af~v`;t8r%PUl@S-~#{k9Vp zAhhVtMz3vIg}0`1ZL)6~%8i+3o89Wk#8eC)_7WR!wbx2A%1SGXthQ?{d|8z?)H~@< z8yeU|(}sE)VnE24ncIBUewV|1Aq?vj!mz&yVVFOJVSbmTekp0k1n4_Eg2`uDZnsel zQjN55N-N+~%B#%Y)tO)7U2mxp8lSH5=o5DK?Gyh^5PZ!RAnfd`76~N!d*DJp!N>@1wu%G2$d5$ljuHM%m$D2#XRCo)|V;JKz`3g_fdo3_` zKm`)O3uzs`00p*0h7Ga(@)Ti@m7IyAj zy@J3#C{X5WS%E@d1iV6@0M7Xw(BdcAUrd0beY#;jU0^5XHTrD>J29`(W1H#g7cx8b3z>h@FJ$^x_nH1K zBGcbRWXAXci|G_t3~GgU*jEk1e1>Zu6N9nL@0tug*Zv5^_#+VGe^7o=g;`w_cs7Y< zCzMtcO)ASSE%Hk$DvEr;m}hsM8U_f+r%#9gCY1$B3X0|hXt6M;pxO4{h&u0B1xSZ> z-pKNrEb6q-YplRJ-J`#%wPpTIYeW6ZT7B&tLK&nI&yZ&xMr+BEtmo9YnOY4@tr#*k{x$uIHkTzL}*ZD75pJuRDG@0SO3 z)tLVK<)w22_ow^?MODH(UnhNme={?o)UWpy4C&{UC(REurIfny9~cw zr&%?biz-sLA*#kz#%tXK#!fX}?Z!J_h2GO%0_uoI5>QXP65G|1@z=N+e~p`r&Tcy8 zrB@IbW0Fm(uw4})NUn+yNo-e3#$V%R{55U@Bh>jhouAP;{LW!_4!2X7lgk2jmII4) z&b0+PC$Ko@TwR!EYmtT4yS_kjtwlD^1Sr3tIM0Gck~i<35k-N<=%JlWoh(NT3ou#z zdh1oeSUZPfy(%DUKuG24UXH4_n&$;*(T(Q+Kjwjdpav}ffI~~voe6vtRi4L-q|y}* zF%6ERcua!?kRv1zGZ8^a(g`%AlO`P!k%)G>>m?<9(cKB4t8(9pILNUoCLAi!MGYVb zh#;=xwFC@~I3l7%jCg@C>j4h)d+$|ss%s%c-QD?2^7+>P{r~Si>Q%j0RS9$R5MHkj zr$;D4uOWG%fKQzvL+lnX#*i~LMzzXrs&fTP9lamcEqb-cpk~IXn0sS%Hzrffg=+$4 z@+z6#pi)CHnB|Tr)$|(0RjhyAAte}LYAEEI${Z0t71^>JWKyjPyTs^py6vLZb1HeZ zx~d0a40&`vH=-7f#*QgmP6;Bkw22$Z`730rqE|vnwXCY4*vORux(7gA0iVz1_e4Fo zs-=kww=2{VD-dRa?T_-k$3aE|)2l)u+;?eZiE3IpR%9c zVhLMiuN;vvpV6&%X5d*^1MEhRl`hxsDJ1L!VG35$0l${9s;ViY{pe{$T~k=k<(04_ z;$}r6A*H;EZkwqVb_<}oX_44=ysBfdq;pn8Dx+G!&7Z2MI@_(+6t;XToie@NP>&c#`cvY9y$f`=89pvZOtWmWpR7kA+ z^rBB16hHc+kWjm3qS+LZadI^Gmhm@&J`zDw`&s!^i&J(7=+NM4MUBy+M7Ookn7YbR zRbN@I>wPu1R*I4G6z$|KiCXBbO^d;1&viyzkt){gHix~K$)X}Ad|2fxbo+sw2z-}C zb7<2AQ;Otj?#2>4J1`~crh)jT{Qt0M`7>i|kQnc%D;%BRY+5qx0o%;EK3NEnL&T)mKy&g5F;p}S9*j;X$hdU-}bF5v7&YE!Qi>s52_PGpL{ zS)vBD7EIUoW7MDzpt_y;1x$=%bA;1Xt-lO7F=dUGr-r%vd{db-b}DnmOkK{{`N$bN z6F6hed}oC=hMbi$ALmX!nw>#3Ml=#tw17dc!kW}MiR*0FyqYchV^mesbu>TK#1d>-JlHx@sLch~_ z1Nyt*5EwewM1o)~sDr)<>;%R0Ok^?SO0WhTh5zNF;>lTX1N888iChJDJGh5{W~YfL z#U`?Ctcm27naE#en#i99$CKU}$ln@I9{*7y3r6yC)J_t~iqv?rdwu6$L{7fVkzHgh zEwHjzPlR`#5XlGN7+5q_B#d8duw>D~xE2aE#xcIytk9~cB^yS0bx3c3N>ZWC6CUBA_?9mk}Z@mBDwDlkxVKO$>>6n z)Vu&$DUvD$b#jU%YobUtfj!_mu-(hk=;#y4!Uq#cKgdi_0p|I59VZ4vaw@>XEe;|+ z_!P{a#BFQA%b*c7gR4U#ISZbQh~yJ6y-Fl+e~0#k%&r#6)1V$S0@GxX{1v23L3$wX z0g)v61#;p6o;Qv6!gZZVmj`(}k3&0s4t@Z1oSknh&~O(UFF)1doLDWA&LAFn9fE!g zoB*FK63I@;H^94K8uS{-ILs{nWa6i0+Duvn^aKownxlzg3=pHnbkc+!FchE`g+aB+|4@A_2%pK!z-l`@nke1lS?- z@ttzFNOpkzz;h4AIk*-q0uJ!6GVdDak&Dg4+0SA=1kD@xJiOpJJ`W#%2IuZ-J`c{V zZ<&XwE@STP3+kR1$#TfY;hzPP>SO0&8djT!S8Z&49)5P?|Ia)uw2O<27sZ6L=gyt$ zgm$KXZ=JR`{R`dnzYR1Zol8$)F8NrD&TaW$;5r5V9ee?vI*z&GOXTwn$_+Uhai)V8 zPl{wheIjdjXEX1|drzbNz!LBnY>l7;(zpY<0>Yr(z|JK7DDST<=%c|{Fcsl?K@I?a zJk7_?dX%jT+*hCG;Wt2E^0+{Dza_BwWhL%MQpcHyV-oINW}8@_o)6ltZw)n(?I^d# zp6_@&(mu&4v}YG)7v4(iu(?wL8LkMVAX6YG4~eADeF7POgFwnY63I<)_k!$sNdn1* zJpHafsv)~Ww*%VF7NkKX{f9p{=eztB^htpF^RYRBT^DO0dv!@5e+NCfCXjScYAdi6 zBb0e6Ef;50~+ zc(``>trs%rzw8hOuwxvK?+DkiV?48nIL^Z{PME{K*r9F_?ryMuBP6h+iG}RSj_uho z8OLoxN9OLtjuJa2;#ezOg5wK9XBPKTW=~>AGmg`QE;vpXda)FGv*TsV_jfG(<;;Br zb6?5Ic@=Z_WJg}A4lK+y?07AXhlM}jxLWAJ!V5yLp$Tk$eFAbP(C!n;?Fr-{Xa+xk zrwS5CW?=$30SX;F96d+&!cA!eH;qXkDP@9Cl1=N*f2=tmFT@uS_@QrxdgM@1aRz%k zROpk;hJhf2=Df4}lB<%|{5KXC=}lkk+EH>)uh%$ghNlg^D(UHzM4?~5>;71CO>n`N zg)RD>L&8h)Z)piXys&ZFgt7+nmJZPGZ2Z%-<$nL|m+v!gJSNn#o7tb8NH*V5? z^TOS@wpZC}w;1$k$+s?P=%6I6NJjd7`>oym{*W(5?AdQ#^C{wYI6fn7*6oekUv1I* z4m)%9r<%&7r!own6_^jAPBRi#J=|38nArhc4f1 zUbO=CDIHaq`bpvtdGS8;(pd;^PWpOR@Y5qZckMGTZldwsS^GBLAGi9&edgNdczyR9 z^rb_>ov!Y?*Zd!!AwBElVgF{(r`0Du_uWG+>9?D8Xl{;mzj?li>VmDKL4W7N$CdjI z?KAKAUf5Om>X|u?1(EcMZHPaQ#~)+RPn@bcws}cQ`bjU1@pjbZ_fW}9pI)ySaI$pZ z-Oy)n-BHwYoL=ufs`&VTH_#tVy#4O zd!1}|;FhM}&E0Qa@j3Kh&+KGF{yhx(zL)ba?;b|^o7Mg_=tqv$jhPc^FxR|F>$|gb z+L=XpKW=I;Px}bEYvdy}+xs>+mZCiAygaoAJ`q_dJe?Z>_5=i4EE<*d(=*f30@ z|HrCM@TIKnZqQQ=dYVCZ81yj){dt34Z_tIEJ+@R9T$QwX2lU}1g2Ik7kDmOtThgqr z>G^(*)Xty}@3E;{aM51#((b%Hx*Ul;pSl|K1cQFSe|C6g&j$0F4-U2n#2a+Mpnq~p zkCNq$4d%5eh`+1-@S_I3Fh4hIZ1Lbh>>`XG`mVa-mMwG>lU~=$a*Fc@TU-2dBHqCs z`c;J-5~8~HqPwPNRYd~Ms&Y4dO-rn-T3fD^&zs;}21Z4JHzpLCU z(|^GsBzx#JL$-Jkrpi?zTTnhr@8ocAi#t%|^;rCYh^1V%5c+~gig2N@flzC43d`ve z>%yu?wo;OvB?#;ZQeJ>=Zn`UFZgeQ_iPWS95p3>Cx@~rAP9P*}wp*#iM&E5~u{m&+ zi_kaubVl`?7*|M+CMRg$#psP_`>+!5^9N3V2@OB;RcSRyH?9lk961)cwB$$b?JdP|inaNkn;>bJD z4?!M*d;@X??3*AHAs>VM3ier$haiKH`yk681^8PbAA{@zc^dXkkUv14ek6|6z}^hm zOw)%v2>BXh6XYhy6Oc8K+W4{gd``tzg?h^)1Ci14RBkH>L=-aBX3y2a$mle`NAVyW zMwcfrncHpQmN2?7#IuUPua z!l$$${c~7F#AEf4fE7a`v~yS+&|^nH@11vJeXrji-v(X3KfV$A`S!=3h5dZ{Zf?Jq~V}(HH`J8;G&05Bnaommm z8iOITQym>b#Y%jdD^9?}aKkKnp`6S)$c z+GrvbU^Ey927)87Uu<1G{v%V&x_I)rj;y`udbkhd#o}lF#`td=;xGBw^o!!(boj#Y zJ#C0Tp_TZVZHWI~EAjicA^y|9vHn*a{%!H=e`EZtk6Z75yQ7HBwD)9KGY8+0abxO$ z8&gxW2c)H0;Y!a;ACQ`wm6~&7T3T9auJvA=A9km+*qUc&yDBOFcYiNe^8vhyHuWYe6#T3f(r2UkBo#w+Bh!&G8Z$a67l}m>`jZ;A<*j{~lagCXtok z4A>3(N8mfa_6w2Tdtm5o(r@1Xr}1AeLHgh)pv~81>J6!&o5RcKxU84&-T)YQ~Lsp*4KaiXQFhaAntf6_DVZ3<k#N}|T#4jRp4U}@ z3sR<#>ro=ABG{F%o8QBgv1Kx^zWVhd>W{Tr^uCMT&r}IQI$PV&Pt0*cV-I*_FI^j@ z(B)C=p8~+0ol@av*G%09%TcSbt!;isOw*TSLl4TK$kc3CMH}WdX^IpxuhIF8mNjFZ zMBWEqfGN12coG}{C)EALn_xc#z5$(PNbH{DddMKCnlAd$&fl$F^PcPJ2sR#u{ft6W}7wkxc-%Q8~<&PVw= zi6|hrPHOeOxEuV3f&x&o7UOgUFXtbiX8|X;;Xm7x<7*^hg8%iP>w1YS0;@omI*D8d zUIr84*VcSnOaDUcOVc-&_w5zGett2=YpuM-xHW3NudS5Ghu}-F;Ze+gk753NTq0M4 zfs~az+&q+ZEqDp+1>b_~T8Z3Q%l#jKz8>rZjo^tVB(e#ZYxtaTdTrarU&S6=@4!y5 z^1mc9>~$V*5Zd=3=C5kVN7nE(>2otGssG(uB{Cf>+}e7-4S|0dAmFYo5?Ql>r+>>< z-k%e<^8Wn$i|8x(52In8lSl)&AMUp1(^`63eQA2e@|@bx_VGZ&y^DAsfTI^F&%^NF z1a^W%FyVQg&vLb#d(?71hB9mgAA&>m66v=Q=K@IGERh-D4R8&@wl&|@(!Wr>X!^$T zZg~FJpC={RMOFTY!XBB>_u&=(f-@FVLoECnV6j=T)b&{U=Lae(WX}-3&Z;h#*&Es^ z^bb6+Ylo%H(J$$s?z6lqk=tLA_;bH)5*fLj*JA{$JN5k!Qh+O|AEX4F9=c33%iv&ZT#GIqquW{j;oz_s{k4 z%LSF-wMK~?2h9gCw?l7yPa3OCrlTuJzT7X zMLWX9oSoc9b}>(|UlrCw5x;QDB}<=4-5Lm^M3 z$n=zYbJU7X`A)US+y&u(UoCfUxc#dnHO<_*;3_dUu*msks%wn1Q0{B+%5}DyvS)dn zxvnCox1dBG-jiFJYn50YRwjUNu!U=F9yqTBEq0CbZGT+fdxLet8D8)FPKK>@bGfkdeZ=5^o(nY4vDYu2>%KN9k#g1@o|v-lOX%)UT=4n>f#^Zxn0$pYrMMtXCgQGPXGSv|L(JY zYW;S92)9@*T^p!nY4PUY%-Z+JQ9K<)$t@%0x|juzgMAj|ou&H44cJp)IJm$Ij(c_S zL2L@H(b9)7rS23#TU?Tt=bzf z71`=vx)=qM;Yz|?1Bnp7f_i&N=_d8?{e$rj`n;@*fiMxCh6_ly_Zn5scjgfWD&Yrc zPrMsnB^_4|?GL-(|XZ z;tIyUWqQ4L`IBepq61;%`*BGQjDsiPText!E>fWYW-nKHuX<7!ufzNB3G9WkCAzqG znaY0@_97S$_rM~U{#RW*23z3jB`UA0aZi9um<3Cr^9!{3VwKPSCslf*(a{4AaN>8> zJIej%ySWCY>!JdZp4ZKF!5<(mAzbjf;JFK_y8~h3#wyzJ!131wcO<_npa%r53qBkB z`Ox-Bz0SJeALnAnO$WIycn|h{@GZ#xz6kj$yf;_nvlRI{Yz6bCzo7j1{VF)z;_~D7s|xzW8i-k3w_goE{1<7L)JJRp0C6 zsez;AdD7Mzz9EBC(>(6{0<~x*sW9JNkeOdpT<99;ye)r>JUYUo-p44vL{E&2Y?+xB zk7KsWyf@2{l^m;SodY&Ee6*MQB<$N8`nhB-{%c?(y!j>l^dr?D=kHa|EC1fBo>#K* zn*dM2liPLi5nQxG7rVby;TxJ?sB{C{#Gh`kem87Cx#yrYUlAAn1801yi|3F_VI{n@ z=hz%>#}~|5u;2E%E*}0|jjiT)9>UFrr@lIIx#YXT5gE;i5`i$pF^6ds$AfOBuz@)wUNnhXRRq|X3ohw7P!?v$fJ2bDXuh%c- zBlUWp_|?#)QkD0zohR2WC(?fr=~Y6PeR`dJS8Mm_$K7{zqWi$>`;%ZXV&4v5A5!(yy00O+KyQePG{mHH z4Dl#D53At2K89$5-&r90N!r^%mW`K+%vEgPGuhGCf)>?0seWQf!@LMz(oABz$tYNm3$p(l>}d!a<~A~2!dGK&f%y{n zz2T?Oav=<=EwY=1n=qaGyES!w}Q1BuzN; zaziA+WEdD_h?%efeumyx7@`Okz)on@l{SGHuoeaoePi?9|o zO`0?flQs>9ni|M5MDrnxjYC4$%PWNY7%JgFrXkiRs`9PRQuS4prRwWW{K{b+e3^uV z=mCZZ%TnPRnqR1N1MAD5Zm@nWlTNPwhoR3ckoOCEwZi{uh=oDq^F)fur_B(hZ_*H@ z@1DV2hxm7dq*SgwSO+3gg>Ptnq0$Z1-=A)WZzZh#1-(4@KLm5(e(HQs zn##v#={w)j_Y(ZBhf$D|Zix5c8O#mMCscZVon?B#`aGT1@N%2)5fZYq;)iER8Izoq z=E(4``$))6i_dZ-B&Wt_B*&WmnK!1UNEw%$pyDMbBuJSapJpcEj~AC5W6BIiYJ65! ze64#%{J=OzmZR1_*or^QF*IK7^#6BLA$O^^N6K~Z-H>wadw--{+n$7!YvnVL;c`DB zQb*C)lKTI;jjj$Zr zO;+t@$NhY0EAzco>9z{l%xj2jm=1Cdy}X2H44;}q_bxTWp;8sU_%TClg-R$aHpCpz zh<^bLgVI}7xKjLgLKVE|;XVVOdsKSi#2Hd-rFVxR#=!DSL)PW61C8>brP`ua1b8FkLF>Nri6YaG%%=L&hzT|5U&SMC>VG{nVl`Nq)w z^TQ2>_z}VgS3&gm7v>Sj*Iqlhd_$#w zyt?qGAFS`{#iw?kp0ZTc>l;X;!VtGssC1SsGsI7z|IHAI@ZjGK(Q^fJr4{O#I&3A+ zt3TL88VrE}D^$F-=(G{u*$}$iQ}BNVUVwp8u2%8yw(4Wq22~%Q$hEz4yu|KaL)x$l z!e24ORq#FJ;MdT6L#2PBI+E!J>w9GNsn54%Jn<^+25Vp|Oj&P;h42zQyN+iS2EI$> z9tuZhN}6L}bo_8N@IJnuc_>DS@#$+x#zzlYVh zbi{L>Fii|enmIx7%9U(e{e7?UQ``MVUfbBfr_viUOlIQ!Iy$#!U997y} ztn@V(yFka>7}jU>85JRJcSh7%pHYE*D|OJA&)wXT*EsZF=Z+9_OI7_peS1W${w{ap z(EqzR5#rF}5%ubSHtx}lWZkDM$C||vBJ8jA%P|V~ks~$jX081Q^UT2L=$o}hR4(@_ z%C)Y3xgu9Jj_d2WcOt|E@732o3HPYzC@trjk+olD8$)?M`ZD6U<5kqYnv!2@!!G31+>E8}!KkjQ2#eJ3j3;L>l z@EY>1KA7We;wtC^8F4m|3qF_uuf^Cz3*1{lJInv#IMr_Rkz1iMPPwm)wTb`2cd^R< zIox(amE}J#My0zfMy0zIA_&_KdcZ&!4Y$E`c*aWS*S@!D6zlyHY+^t{-Rmni(I&p8 z&WFbIj*Iah9>>29i*2GCT))^>duGVpPMbIb``K_I$Z~$M$R@slpFoy#Gjc2JUSz9N z&KI%&3tor7a+YIX2o)g9*%UbzCcufxu>?JC%BeqIos0X4+UOqAdkE%$tiPiRZNi25 zHjwp~9v2fU^_22jxtBrnXr-E0%hA-nzJb_^%>AtZBFFwfgX*k)Rt?+Lp%EUZ3w;Gz~&@78uSX)&vyndab%&M~j-5-pvcF_u1)Z}x;Z z&53lH5pSuqiST_k(S$Jm{?ODiXV4>L{BGud^>66+O27HYU9j{J<4rYV0(fCO1iojD zCro;wYe;g2v&84hEOzDOI}083W9gRcE^&FS-@KA;sqt~CiE5CGs$kf$ ztafGW_XE`VM~NwRF&*TwJ|&r@#l;@4Po5EJ{`Om%tE9v^M*YN@yk5*-z8&fRB_NO6 z=k>^6JR4~pE?P3ujFsvcGcw>D0;_H&+r?iBH1U*A6JdFFaose#xCVI_EQOt53*+CJ)-h!w)L^R^${(*{v*pRHTdXRhUHVDNacO`en2 zw{?sAy-S?AHJ@%C_58Ifl%4)_)~-cu#?;MkN|61fAbqNW^ldlM)Ap^e-imy*82>?g z-rGIw{T-gI$Lt>m*_%CPH_tP<8F@DhnXBsa!+CZwt=ujyuCVI2;@I`?Ka)S$9w>vu zT%$#3@*8D3_e-DFo;#i3ZxQ{x2(wp{=YC$UweM1U29-Q>HN)!}lN@KpulTyDI8&~7 z`&xbToR4fRzja#jE@VgK9mo#y`yH~AJWCLHncP2*>@2^bB4s9VNO{(AKcxJA&;|LR z?19LKuw-{jb~EMG zR{VaJ>}$zBmh5fGUY6`>$sV=&s<~i1<;}3>deR(k?p!!#*UZ|>tW!1zF*5N>$DCrh z$(RnpXj+Ulvd7?;X{8-w)||3C%o>z#gUvW8<~f~%&Ak$_=KM7lTRJJG*2!ZaZIc$@ zl0mD);i_5YA+_a5=kB81{ceLPMIxn@C6JmXSY?rWG~ NGI)h%PrF?W1yYu9=8}P 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

    Q&NFVy{{oHj*{0Bg&KlE*&4ZewO)kSg3%jgDx9- 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Ⅿ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≷H@3E*$$J~uo8`di* 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 Tfe}bkTP^&EuZS?9r>-f_e2w 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]uxcNoJqC1uCfmd3+6E7p0GbEa zVb{T+8A9^u>2LuVMP>n}fQhJz@W#;-O@+iWGa#6`E1O~8qo{Ho`VZbSR*+#`K0PeDQW6f!7?{OvkHe{p z7$Ckoah%~7s2*&lW5>3|_!)1ir(CF=Grl|xGoL<*ZI5lI0}Czqvj_O{bFb7Cy`nZtpg-&&0xs23gzG(jOis}rQ{brNk65kh;;Ki#k9Q|s@K){7??1`s z%+3ZRv^j9(@Bu~y(6Zg=v>QJ^-bf~`?Q7_Hijsp{dPm~0la>S4>s|;KCJE>z5Hrf1 zT!eV#b10*(q3Sw6!yDKh?Pt~Sdxhyj>x7_8RkLzep_;v@O9&pplp41t*sl=$^ltoL zeczer{?i2$I0-d98k_vFwUP;Kf$@z-&cs@3kHGo=%u>}@zC7qrFKFG%?cp}D?p0)P z@2CP85#zBI_GN!Fd-_p?Lcr3@#Y$ZN(^jHy64ZV{t6!tvFSM$=%gyBh`NQXvr*2!j zZasxG?$9ua6h{NyXJrauN7*1~21lxXgFxL8Wh(9yWJ!dVMg-BH{DR&fHbwPiqsHZh zd{6qQo-_}BxKqQZtz1FpQM`^xbt9o);QKbcRP`GirmoUp!=oUA6q4U^0iuRqynq%U zr*UL5`55EFyUU`5~zUHUypg7$(F^TN)JFKUsz=h8B{3JC6OC1AX9tS2f za}_L`Wc=a>4)Q5~lMNZKkD`-KCwg#VgueBPR202Ri_uZZa(B9tJLmPHp671CnFCB? zLH2@KZ9^%UXV84WZ;To{$OwbNDJD^}%Ja;3b}x4yD`YvTxGbb@|Hn z>Yj&LfwpLr4Y&%_-9o~wFIbZNOWU15rxEQR1n4s9!CY7vr!2}iWs&jEXnYi?iiJb8pSr3R+NUG2fwwWve*njbEnM+{7NC6x{H##iFcc#}wfOr(KWN zuQy0d7#ut+*QYe0&+$5elv9vx_PZ#-hkGGLbY6+?=+b|H7^c}`?;>lsr!{7^z|hLf zGEYPKwxcD8Q-$xFEBX6_26 zG1J7Hh=-g;toMjL8}qH2cT$L0g7#VLC7R=EKa(EYA&4*#t$^#d_)PqRv*uDhYyLEX z)jS8~i|bHHwQS`xZ;;yjM)`V+tdc(LYq+dWAeGdj@{T9!iCnt0sAtC$$O~=-(&>Kr zNcw$OV)7H5JB#`f?1|<4&8%0>c-)qw>o65Qg%ADX4)ZD=KiGz#|f;pnhOW3vzI7i?A3L(iM zwhbXVQy$ueQ@E*QSD9V%nLS36DRr}m-<4+di`nW*R=rSb7^-UVq3`)6RvG1&k=HRY zwnO5*$fCBu%z7>LP9z~kNgMeAaeJ3coX_upl;+|1T`f_c z?-SKqMx!ec&SPfN!pzihzU}MQ)2T(Mx*7cY1rxoXPt)(P@ecgj)l&af>7@Yx5l zbuf^*mKSC%qynHIkYM>8%>}pe#$kG%9}nd~(Q9!c0*Q4X3gOtP)U=nEjMlfE;=&JZ zm#Xi-4kx=rAmqtA&6j_I+(B>l6U4<|1#w{qv68K6!_|uUtL#hVBUsVY3s@VzDsDH& zjL$cHfr_x2aLKM}7RBbr!7Z5rE#oC%B)E6^-3lMeuleIEhVy-lYY z5gb%sVQE*ykCk)WTR$#L){j(IIF&_IiV?bQRZ=eHyvxfiQYmJDMo3p*?NLO!nuT0#Wc9{!Ed} zD#I~SJxOFACD&7m!Ck9}4Oz|}d6Z{)j5FVMR_E6hmw=T4cs1(FD2sRF3@o1EaiybZ za4GI2GXZ8~ooyu~c!b9M-$;f;)5f4^_{sd8d)@$$qbIL>rz5y89!hKBQyRc~L)N`* zDv6n1*hFQ!wH7Zb3d6%8m1bN$N9-0K;4qW6vs%CpTEkhaf7t|6UY%UVr~H8N!bf%n z?xQ4%d9AreF2W8GNG#!d+5PB$(2@^1l6U1MKXX5@YnWapRAAq=gK{iJJU9dJ3RfCK z6JQ1kAF^ja3mXb%#ULl(v&KAY5SWg~hlV?0J8STw%hV`-<6gB-IRDPiD-P> z6^Zrd?>98KNH4&rfh14Ga7h9ejh=gK?yZT}u1T;Wy-|RP-w{UcA)$2@Z2f=dCbS}B z5yIwPQ|qdL#s%PGb*<4N#6Aa{|Rs6Xql-4My-`b429?7{lLUt4W)X zalweHQqbd85^sqT{}z28Tze?{HPB*qSl?KX@3;VXdh2tAcoP6Q=E=qcMdUDHrN(AM z>X_fH{s>X+FF2QRf;a;agv%Z3r??D$Y0qEAOw4C5HZ|$JXFjn7Nq)J_j5ak{!Xu5& z%HoapS%Hn`*~cJDP;Qg`E3DD-7r~gLA3m2ivi2!hZInhHG&37>CwD*d>mO~7S$Vb5 z)w>4uc#5RaTx!2KM(AwVp-jt7JMuMH(U3<|0U7bMfo$?NK8IpSag1kIM@N~?%Mj^i zle1u5amBM7UmDAA<10~smxq-p-Tjt;gYU+4M`-dh9y2cR3MW}Zg~Q-Jo}8g!2${+O zUNy4vxgD zl9HAj)sm;Qc<6Ii(e6Yk0|4s#%giob_5Yv%M*z3q1h-F8ZlGwo6H%kAmMhj_ zkT(`sF4sIa#R-iv4UJO{&7G;F>n>h!3NMM)rOBC@FaYK9-Xreb5bw&ROo9Ie1=A^D zB_6BjFrc>}^yddYql&bh?rpOztx=1?x~V2g<>PFRtH!%SR8IrxElj$J7oB9~Ud{-V zP5Pq(Wim|tUZt=qd{&{7f51*CGL|B7_i%P7>qv^2!~1FKc$kOLMTdAK3w*MNa}LeH zz8FT0V(DeAm~#4PE-Dox8Iy0yP0$DUmLg1<;C>27zu&>mVaQvurFR76bGH^g%3K=8 z5+0+{o?7^j;?H0ftp z!%_7vKYZFD2bSPNXZ7$g&80NpX8><;#@LU>*J3OzlCSJy4W|Z*$VV-G{+Qk*%r#KaiQ7{-+J#mA##X<;^n z5C?fP+icfAGQ-5(J&*GuhQ0gTJ-sw(D1mmN@@K9C2>Hk(xIsjHbC%?(Q%!siLr?4V zuy1BN=%};6KKizGBn}>R*hlMfZJ2?Y99gZD(rBVr6F!G+FOGOv zaeN?BYPs2|2>{|mzyW-moe(IOx?7GKZ}ZAvU&hIdNLmd#n5*@rChnq*Wb|$s-73mz zm&cW0q89TdXC=B%51RvvJP73KJ|Tey@lmaQO{N$cT|62NGaS{(bl}%&{B#h|Y64a+ z;?FQXcQ|v#=hB?j%gu8U06 zgWu%Z>0L;_VRl>t7GD#k6P6VQq$}XxPDU1_$D+&{1&E!wQ=RD!BOdp8dNAvRUas| zQ)LO65;a}gG;UCDvD^?qNbN$E)HJmVZl26>%;5KtB>oh?(Xz4Yk#>*942CR(xF)Syie(ZAh{E!X=9{r_$T&UdNHA(%r*!>vtRU`e?$|}@(CmYpY^^nj~ zg~^1C-}BLj0BrOYY31Gc2{fUw6rESFVsvQ7*lsfl1Xi-#?qOWdT_8l_($-brcfDym zbt6w63Ey?TzYp`)mW}i~m2K()G1Gm%|Jvt)_7=f!4_uixhzY*W_y6q^4EslKII57E z`6U_Fb0+`m&~d2E1!(+951(V$_6RpketogLkmN?=@kWew!^~V4!wA;pJlx^AH(8yG zYrR=An)wS*IF#F5TH|6I^7~a*(sJtwA^(ZF{0U!z9s#u1xBw5maBw3&{5*fyHc_BM zF~+ce-A?kuY2;dwDvKQDWjPQpgECf<)05Xgqr!e9sR7K^Ms12*O7|tq8Jv`0?Soz^RoT|%a zo;5Axm3=3%gUoq+Wx z&87ubeVDy=3D%*!TsYAF63-VKO|bgw+3M1S)-aqa0j^$fDYHhx!_`R-Fq(z1xJ1gpv`Psx zvRo4f7s8VW=Nzvr;>NKUi_2_<6l-=Z^{ZPvg-S8siPyPzwk}79snCa;EQ{S`Y~>oZ zWR+__d#@2t`=kh4BDwZACbL*(O=}W38hGq_hvPP?+eU7GZKxssy-aADKASQkiTf>NS>jA^PqmXp&HzzzQKvh*LZQ0ryc$?qn#nHC&lF9(fM z>cv*_m!jN)R>G9rYuW&P+C>Byb5o-WxN6BU)HSA@xgiuPnO19-|}A zB)7gCJD?27Nf$`VBjHh(yY~j_HST3~qI>85-hEoj5au#yIMXpx?UP0v{$xo+?UO_2 zHhqZEn}B3bleK$X$y00@Olw^Qh!Ss$59uxuJcc)JmPTrqB?V6kh5S0_KC*juv^D+y5 zX8_120OkuMCy0^IKneY@PWCz>s@M6Oqek0w3wVw?Oc=> z769(T6lMBqnC|p7V_PtJ$UhteNXP?rpEh?N`5{-NZ3!rUku zp9f&gECG;$xyvSCf%U~A)})+DNUt{{DwwloQVn_PR?BQVIT&vJHm-SN02TDw;>RlK z-Pj2%02ykGz;)wjcZ=jqx(9DZQF@C6ywIvq%!(otDm!SWvYRM?-0sZb2jdG8#|e#` zS!Z36>wZ6Sr3Ne}x~bJGfqDgS1mGycrFbdNy84jcm6^tB{g|Q0t!AAW0h%1{-kJCo zR}_=ZeC6FSd+|Qt)!)&#L~9^HyC{}}+I_gP-B-dc-VD1qn}D|hbIe+XanreX*80YG zGew0H{fVMWwO%U${BN+=upGx@IF#CY<;HrYuwJRm+^k3BC~ETBalws^3G3d}#r84{ z;WDjW4a-!chDYTL$e6MtQ^aaTbXNueu`e)Ty{`;sU7^;|uhVzrfw| zr?K%>d6#Dtmf2P^1}zRqq_Ioh#2P(`?hT@OKEa|QmOh=NeuQ%$F;Zes56!ed`6@KJRc-lOf zet*j3{RypJ9M4JN0pg88zkN2G?B$FR10E*;yVMtD1Lu$FaRDU5-O;uJc=G zm^ZY06Cgi{{21D(eg%t^rvFsHd<$Ib01ei9Mr!2^z+fptJ^WuC z3VW2?1J^t4WHho_Vcf8YFQCMo(?B9}4WK(Qi0chQ?j97$V8?=Nq~7ImFrgUW&`gd3 z^vr_2gk}md&IXLOb>pT&Mv!d?@0Q7#jB=4EV9gu$nv(oK_!Gxt!- zD215~K?92NRf{c`=n`}gK4_do!2l+O$62zy?wzi(w5uO&`Pq)E_4_d5Dns(7$WX6<~1BeSZ)5-zb!E4H0G5Rgv)k!pK$CgDD>D=gvS2Vn7W z-9%b9N%;b-8Lxxwg_W3P86*S7>uc;)QZAy2!#?;_F31F^1#O;i2BR^~EwYTPB`DAz zFunzN5GDYt!W+ZomRU;5`Bvv#xZ<|BSyoJ}T3t>K0$!%bW(uz)?jODjy%VFzXmWqA z#x*=|K!Ui0#?_n??4kbFj=MomnDO}*`bGZmtERu~vKUardL7 z_N`lmt_ha{1mgC>Nm^9RZ|K~D8nL=nndK;~k?QQF8tc-XmLfC09bFc)t$2Ll;03eS zROaNp>ijL%{gs4dN45G=7WUX>t6{2O)oMVf7Pr<<^Jm;@+RyvhMbEX7sk*u>2eb*+ zB)fOkc+!8C0DY;uUGAUm#=UWfrQJIx0mGE;&x31gT_41C1wq(ortD;$ZHSlZBp0ga zfUZQnu!%zZZ4Q4Civ^f(2dnqE4plH&4UuwbJO%8%ZOK#7iUTyxGleS@vQ z$iu!oV9arG*Nu8qK}VvvS4wvEAped|;%Z|QD8~s_>(Nq%nl08+!xeb5khrAKARP|lOy@{0kk37?MB(`U?vGi;dzvjGqO zuR)9h8wd}hk!}$E21klyWp>p=zT}KVRhKte1pm)cN_G)KDtB_VftC`L1X?E#M7a&@ z%k%Bezj#?1$8cEL)_ z=?U+m5_mvb^+o|0vDH@X$y+INQ&-gP5w(_W!fKuyFH?rhW}`r5dt$~P;I7O?+|Z0I zX2&Yy;H{RoV{&XtvPbZ7h zrzTI{tM2nBw5jM&7Cr%M22?bBLW@KvWPofFP#v{tzJ<*MzILZpj+cDs+=mt~n2qaT zHgdWkO9H05&#Y|Yv*?F8?fna-5rF2SAQ7LT_678w?s3=M@KLJ|ETX}?aX-3_{H9K! z>Z#n>Am+Nte5ZBavzzaPzi;n-cJu4-_ZP{}o2~Ydn$=>mqzM%=!Ho_FW^!d| zR*x*hY<39Ex$n+C(&m_VXeGq}?S9qH!I~??*5>3IMpCF5yLdYD%TbMq)4y3Z3dy9= zSxAJo&567CrYj~YDJQ(5^PgYw`0{^x#m52b73jN7_2_KsK2qcdJ^@wbcUrc(%K)Vy z*jO}f3m?!V)4J{M95Rh@-+N%bqd>D!l&JRW%SFNXe(n*8>?Rv+9-x``y;jPNAJIVQ zn2qY%@Y{_4w2ClGowssj;}%b0GK6ZX##P92Jh;a7CcCfG&tl@m){AUbjGx;-g28oveMkMMP=Nsnei?>(8Afwz3%J{F_K4XN*%dHW5 za$q=d;$Ir25#DAo(*T6_`){^sU{e5Hv?3mx4e;A+z^i<8)5)6zL}%Hata-QDtM-q% zoD+~gbJc^q^IH+xnr(i!hRD>KfM*;=KZgudWYzxxV~7le?@j=KLraal4}28W)i=Jo zGf9RpWCmCu;3`p;f(A9ZsEG@j0GmHT!iJCy2m$P?TbkPEMVJX#NgxiPOfG9}`_}fU zk9}&b7Tf;b>Z3KNeK1Qf;a?HaS`ey1X`Q%K1JbZS%)IBEJG%+ex4)Oqht15HJ9qBi zbI-Z=obO>@u#w;eTt#y{S)s=UQ6+hdzDT(Zo)E zl9E1}D8^UHt{s}P)fn>%-YKCs9s;3^zj6O%eOWVHXj#aG79aKO0Tf!!Sg-#ByLAS1 z>sam}QDgn0Mp|gulQ&#w;X_Ioetu?Oq+-+zby(dMQVaChtVdbIEBrao!KD^I z@3T5fnsd3-;zz0FfK{27mL2hkvLVCzG5?OtZ^Kr8Udll7D;`15JGe7djut1gF3{p4 zX)Ugx-A)IJCT8~t%74u=`olh)N5lO6TT?Ak!&c6Owg?{3Di9E7($HQ-9Ic~CJ4b)r z#0_}pQeEd58yJ^tv_4Q-3#IK0*YMp8>pzc>Dt3rsV@yu7pcG;Xs^N2HYB!>lBrvj? zz;ULcHEFqoI~AWB7j5N#bs8VL;~&c-4=mgKM+{9TrNGm_(hk+mmPMJ&)=MzDV`T%l z0ZqJ~#1PKwmF?5{0gsW)L>JT%(2+}wjs*#!VFB(yTF-S};(>J>FXIc?zKt`CL3EQR z|B#XRjm_jD(#2>?@scq=*JkCiG2drD%gA>Vfqrls>Ded?Pl~b)3!-MtO>kWpH6JO6 zGWb(d2)B1epNL(5}wRt8^VEp^ASJ1k!xHO&2?ULU7opaUesJyZq`iKCq{)0 z_eQ(t-s*Ef@)?kLRb6W*}Z$+|kF%vFt*KaX4EVg4c3(VT2c73cixhPgM zE3(L5v)IZZAu2f7go;EBi4O}{cLIvDu6P(M5%>0yhMaw_!7&+$l?)hhk@bboe{fa* zlrtc2+?sZL!T#j?NzND6#I z17iuG;RHyI>qXpQN>n&mAGlD3NWjKUj ziH3n6j+M%b!Z-q(AnQmjTPRy!pU+=wQZXPKh~*KG%NMgw>f3+Xe9oqjwvN^3wjS3W zG^XG|^&q^g-vcZrL!Srv;!^QY9vQLTh8W~t?S}pqZjzf}jlF@^>N}8MER^lWnO5aZ zM48$xIMCf!p|P{>jV&B-R0lMJA2L3uPvL?)p>1jB6gi)&jWQnbiU_EmOQ)U9Bs29K z;(hf)H}4*$ec|}DqsDrl_1iM!*tj!l+xi9=MGIWoH@JHZ9t}pU565#hw}|^Jfkbfa zSCIE9$~>~Xlv@wQy$B^Q2RHO#ie#E8Vs*I_@dc`P5wv+oQnsAr`@us^)-#=d{|NaQ z$+%NHU&Y9QV{haSUZqH3(?LSR0|F-Q><$q;xDXFsR17pl?k`qXf#A_NU1={K!^EvZ z9OQ0K@XuN%KGAz&(S&#R$K(o(j&_Fa%|E2H!-`t03Ws*A(lT3iBf`4Tl#2(1aVsbP zu+qL8VYEWIYY}ZP_K-+h=@L{zn*znFvv0Sw8GHsOL8~OdBjjw|Vlb53_$S=IL}*WE zjCqmkfs#KFeRq?wnJsqXfbp4VefH`lghF4ae-15|csGrsnwq`j$O@|VDiKMkP9UjRf>vCv-BzxbSl{k*0=2+G+PD~`(&FVp-+bujk+J!1 z)+h^o6~LA<(Pqd0rRh#6+z2|6!Acj)9+Nu?a$l3nSLl0FEA&4po+IDhLDS}DtM_v% z!}Nb$1}Fh5710xA*qSYKo`#WkG>=(GxH0^~m%7MxF6t$tGHJ89GFyk@96GiuTSk*L zxICz<#v@RcY@E4D>m_%32L0>+pFt-tn?Z7V1~tq}JLiS@{6UTm4I@N>ro=o#+d zf?P|_#cAQpAD9^hB=PZ?(W|HD#X}Ub&rdc+m6FZm7PRiEn$Bjmpu!?FV;sgp_Ev0t zt~IUKwu4=b87vbyCXjrVcNj@RlHYQ3Qa;N}fHasDo$YlsX0nA|kZ_{2bLl!4R`2L+ zA6}OsVmNpA4Y2ugYDQ*RRa1xD)DF71@H3xc5pBMnZ*;!G&6>$?0)4!Tn!MT_Hy1Vev~L(q2or$qhmVtq9JWlx zy94%1Z6s|5;xxS)rq5Ciz$OGr_q&65f+3V%l3fyWx(@ll@ zx6527J$KR?yA)RmXnNl^VTIRd^18Gc@W$!C+IDRI^kBSkBpZPms>sfOK+w1t2jfBz z=v~t|0yv)C#;s91+}Z^0K%Nyv;oITj=%q$0#2I!Vwl2^5(O+qo$C&4YJ zeF&0MnPe5fkNaE5Ev^pOMe(&M2L@&PU8vkN$;ghTTWe2I6RGTW(1g*VaDcpLvPlIP zaIrOufv#-HKy00rdF(B-{+x9ezSF5}?W4(;>@ORgN9GgcV<+b58Nx_By>}e!V*ia$ z!&kc5A=R~+9xm6su~xijxHD``u5?giqmH{AS~!LI^RV^s)wYdXzQTE7dD!}i^MbAp zWwHfnOF^dM?sP~V7AG);KuV<{tY=V_lTe3@VNQogS(0m9%3GUB!HCwe+sKy=od@mr zfEzhQa{TX(+T-R?5O9el?f2ldb#q#6?KZ>qXwwW^(8e2fQ)7l2Uo3&GQi<=YQW)JZlnAaSHjvvtW%X{o>tO-$-jSg?{=(GCF{*nT>b`u86h=uxq zHCsEEqA8eu74k6>al`g#WSZVI(8-t@NQwb{GEhVqC;FdU@5~bp;fQh(bWjfHTq%zN z*~~&O6oPE8l37Gz6(A}t$o80$1L8|Q%_n|$$sU3V(@Oe58P#r6-av!@#vAKu0yaC! zN~QjJg>qhOUZJFoW-d@}Np;N(Ti<>Mcuu!EUq8NVWyJa(WVT{hZdV!2dE_ZT>DNN~ z*^oYBeZxt2ITrdza(t*zk^iL-bIN5_Ea4gOWsoLWthj*Ohxx%NFy5h4?79D%*`uvG za44e-%^Sw;CJv?YsCt}1O`Dn8jW#y=hoRi%(|#b8ry2@`HZF&(cjJ_SLfGkt$m+dl zCfd4F1YCJ&JL+1jP1Lx~)!RphE46(aa3q*9kGMf}$*X>3c)Xf0g6& zjZ!y$mg5?EtuOe;{@)Vc=;4XKvKNOT2Cj4AF(EY|{B>%6VlMXNzi0zJam1d@!<;9iCv7Zo67-&<5Et(%RNcXL^M` z!mep_8phvNrFQgYq3!Gh{MbU(`Ixq~z^b0ZS5-&!pn9b@1j0C(nsKY<#_=S2tBy|Jm}i|S8J54A+63VcQW#i)?DEq3+`2h*yg19s z`-r|*_%DxlQroZee~o0dme3AIK41j+N60DcITMXO-UI z0gz2WFV9U~Pz0?c?lVs8J>yF0bRh9wq1J62rq;2p-aW3AV)q)ZQdQFp7(7?%ax<)D z$4M;muxq#?H~;vMB8TU$j}q*LwiN5dHhy{H{iUt@IC58{3G*rw@* zZEM$?O#?8bHkXrHIg70*j!x}yMQ0a-%qFiL$r@Lo6owY|LuzWdoURZ?MY1;TvTa90 z!h@+uOlz5G{pNirU*C$WI?f+O%c;PTNKvg^r_E)0Zt$!&3!7}eb{o3R@78Wo+MB%R zyUB5VygAxbbzitTvdHG)sz8b=Pc{r9U%zemrdR!LpDS>r2)LA%i~I!gBlKU$P%>3> zbXv(sMMk1cd>kG)f{y8T4BJr3vc5NdNFMzwS%k{`%oTlrtlK8?8GZnp2`1AcXhYYZ zm8Xy7=L(1_z}*+nE`#g!{aL65;pW?j2KN#(l#8Jy+RGNu2Cg=zzwDMgZ5A4HRg2943}#*j#WKlC)%N7 zMPK7OJv)HToJNla8qAM@$~ynXw?}?T&-0u(Wo1!V=iQo*Rrz6z3(abj6t1!TA+JXt z)nA6;11amo1K2R@#Mpc>e|Narj-bC>HDyF@{@Cauj3L%(baFq^P6AxIi9jQ!;>*~i zSH=USMwPKFLJF;c2XBO_UPo3&>;iVUjcvLYR9E#ztTA_0#agJIpLN51l5YZC$Hps+fVY-+sRFh`}`=>_~f5ES861e|u>L_aSX-|{*x zQ7EKNCb*%Ajvh{7Wmvb-&0C<`%p5Y#>0GvA<-Xn19nh&<81Y6P->*QImqaw#U?$+3uJ<8E6k2YC&L(fvF5(D;$- zpO40ZTZY->R_2;Th!})eK|a%+xR2=r0XtgMyg-Za{ph-gwTL2!X(|m)?XKDABCHoB zZo^Y|=%l%-mfanav6IXu@0DYM+_uwAHyrMbc6BhalqTQ?4Z17{+NyG`tX#hz4XewK z^Qt%+1}jF3R~+6dt60t!OQH}rJ`y%xbZZK%a=5U3%9qU5%;o8h)OIX#;U}au0~)QEGmR)Fa!64Ln@5Tv8}f0)+RBjj;!=RDZWp!98Zp{kB3|tR4qPr1+Hi56o1lu;_{=qu zxdx=zHM!C5Vs(;>Z?{r3(7+K^?g!=@09Gt6Vu$sKjhUseXytcr+%lh?5oH)S`H{K8nse~_yzOr=GvF5vaRoaC7+|I*SPAPh7~Npo5#?k z!P-9(xWr=!LSnr^m&n|$m+2C*{jBHd5)ovrpV1{sIo1#95`9yxZFGr7;#Lz~qD8;8 z7B8zbtAYNmvc67#7g+bw-$H8<{qGm>_iI{D~XjmELojW=Vo^rbK!5P$+h z(Q^Qb;Q90sxtjpsy9ufuyEFJ9)SfRWFrFSmmmAx741I2FbL);Yw4(VlZ1S+V>z8=5 zi%_3;{g!?SFM8Kr`rS#ti|Mz6e*Zwfd+7IF`aMd&h;(F+o5|6nw6VaKjOP$hbP#wX zF7b&R<1xHaF1W zfH?n$tOX#2pkwjRX3;oUjPq+(F%7XSYtb|4*`{Z9XCc-*2=eUimQN7$4!Xn^O^O_# zi?&gb-_K7@1Ejr{7idOBirZ5b_&GlO@o5^Jg0UZlI?x(=Va4JaLfd zTj&}$JXWp?VA6H+Eqv zdYn(hsY!76hr-tVPP$B@7CY1`huViQS3KSVPzxRE`$*kIstrnSl+IyU|gO2yi z|0e1JhiW<0pAfamp&oIlj}kTPQ1?632a!q$rtDCS^|C{aP}(I<+MhYpVxlg0sM{Rs z4Mbh#P}e$CFH!GzsLLJdAnuP-=mw;gI#i3O4?5HWhkAslYaHq%hx!MiZg8lgLw$~@ z8y)Ir8Jzk!Q8zo(qYm{uMBU<0cRSSkiMq|9{??(Qfm5KPt;~%lDY31Z^EgJ2o8;b` z@IaOVF4#<9NpmX>v-l^TI_u8sd2m2l@sus!L`Zp*Gn@IVxbNHBM_T|YLThX(;U7dt zi3oCnbq?VmClp#=cL=X@!UC(>A^e&XR$0Xk;omtyvu<_>+lau~$W;za<22$YSq^O# zrx9cMqL|Yba2j!#4;@+|rxB|;;L!Y>Mm(q8p{blk%;y=0h5-B#hYNkLcu0(oIPB;V zhlak^{bjPKXJhkVjwy+rlsf@^EYMzpu=xKt&1r00?NUoBZtAg-0h_&TZpC^3ts^sp z!>#-H^lzLKIL^hB*aBgOxj>LP_;K|49@qLwLomLGIBl$2?m{VP-vp47jLsR3pwz(# zshT~umxlx}?w5LSd3+8(<}#kc&$#+aALLNO*Jq~psPBC4zY}goRe7F9OA7+c#C=5MJjBX&h%Xb7vk>baZchA9B61F5^*F>fB60>| z9dL*`5jp>`UU3gi68ja-KCGu5;(Q`aNAbg6bJq>&VGgS59?b_f^m4e zl}9GgCdPX_z#!~b@OA4+C&^iw8X#6y&E|xYE{8$Pb_j=E4uhEC5Z-V(4B{$>@V{LS zgUEIWPq`chabXrGYFvS?&u6VMZ}r$+Uc$|C9uiXZd^bW%5>@)s*Q8$5K#bhC@> z!f7{NvaaQKF^pp430sk2w_?~TbERy^W3^Ib5j%r+1f;SM5|;hSFR2%QPO1e3xWzz< z?#GaTI5HVKuW<>RQ=TpVFL|i{B#*0y9NWGO(QKcI5 z7MV|AHcmNG_VO)A!}bd7t8?Dn=$EUjnYwz$m(Q$EWus?u?I0a;&3O8k;YljqtYM?tA>s&+l5Uqu%hjQrL3{QHM^J7+4TXQ`b*Hsoctzw>cXW z^(+e)i4+^hGk17lhBMIrKT1^~60^KvSUN(oBFuLFY-9S_#*G|Np3_^0==b+;J)EZJ z578IE?WY_Fx&$th{POlIwBxG02x!RU*i_5Yj7e+9jy8mhypu!uJ@EtE=2t6!n7Uf+ zTuHqfevrB zPwlsUFqFE`YUQb0lGG5Rs$1eT8~@FDr@uvZrykI>tR0>ipV@PY(le80_N_(E%uKP0 zYljjLs~AlQAV*>pLJ=RAb+KKT8dmY&Kbuxze*G+3ETI1QRyRp#7*xgj2G4K;dyJUw zE{qM-y005x-8mk`Wcb`ed!An_F+y$3&9iF2Q#Un{peULrVq0N zrhd-4$tGhHrS&n2r6c2(wG@sq>gm-*+|CY7fEdMf5-KGv%M!Esykrysiq#G<@Au8H zh@pjQCDZ#Vy1}sbVjJYZ+Xw(6z#lV=a0AJxS)R=fv3TtFScV}R727~T;fr5lFo2Nc zW+Wk0A|z)f4?QqEOhn6RtSbT=MYV$X!(RRAh(A+=7sf7soAxjt7JtAAH3TI5c&*%{R1HrDV_DzYyu&anNNol_j zY#J~tPwTn3)HZcePs)8HcOYPR2c>JI1F2f^@@>@9)H6g3OcOJswG#ZwWBp|vT%IYu&p=CDRL z(N=as`bs|-8~q{zOV0D7SwHZ>soaGMd7%Kr%VJzqhpkgtxD6^hCLFk{t+4OYkUG35 zY~AvdZ6oL^W{R=*FkhMHd;9R%BgN<{9-YDMUeVfSqrp-~;K{VfRgNneU*s~G~ zdl69guN2LP@9Afue}y`HZRR1rr!xxBMzJVlVK08`JI2E*#?u#g!7V|uD!e<*5s%=zwvE}yx z{|?E|B4l}q%I2GFaYD5A@*v`Z0uLOj58_AI{rz1niwefKV)ogC2W-)Yy>g*6RcP(V{hz^g5_U zm|V;YxQU|mKQQ`pm$Lo$^g3qAkJ}J4ef!T-#GXZtkyf>eVCR;yeF;74fdvZpi_v~R z4Xfy+xE(hxLMPxOxY#AFNrU`L^XbhKf+b^Z{4)YPw1-Zap}j^&P6Qap>Dc_ju(d3}VcenI&9uIqW|fC!PXu~kZn=PWCnC1K z7r90fUSt(&*evfyp3f?Bf$v}Bmy_Uf0GPud4k3gNIMueu8$anWJ`xDqX%N1BG*uMf zb!j-)jxU~5e$;_H?3A`R7CPv(TAy`lfU{*%$wCKttHsu+teAr(oztdcbGbKPaO>k( z%}l%*U<*cz!OGLh76fTC9yo=^xB6iOaXi-`!&LBF-*Q|_Ev{p+xih2eho~kBp>sAx z_={1Hz%~rDt!}Hd+bU0OKIujfylv$kR@v89F@0OP0KD2P7qvoI*^GT|<8=aaHFH?y zL9<-ar#Ur57*|+NL+4;X;%U=9x5?=2ZUoMzaj~$ zTL1%XIF>jbOVf1$3t7XBXSaJ?{OAc5e~{VnymrGsQan}JF5t*pF_Rxq2=x*|Cz|!A zmG+?7)W_#!kj@{JM?WMD7+V0fU*|08_;@F>;!-{P4O#}DBWdst=^(WEZ<$YY@IB<% ztk>Avfeu`Ge#6Z=f6X&A`QgVY8=w$2>osE@F|Dy?YI5^F^ahK6Z)_-Bvv`JY^mA`!j}<87UYS0MgS zBAEFtC>aI^wQ?ZK(dP$j?RJH1{+Lm{6nxtxpYtdA>bEo=tN*ap#dXwPAt*~Oi6k4 z8)Pq%M1gJJXHGPw?IXWZl}={>F7zW1)l3YvAgot~IJOw9LN0;^yF ze2;E?c0(TAJW4mYc7qRYbh`0^%|UXSlFL}M8poW zOJ?o4{P)=Yv9sfO=TklT85;Tve;CM-T@wQf5yQRNWmb84R zqEUrNfS^#ArK(va!r*@kRy4EJC&W!WcrZ)-z2sv`oh4iP|ANsHRT0i=%Ra}&^ni8q zY3RZa;~#r!tT%IDWWxJ3*6aK#uf}>2u8d|M2x+B$WeX$hYm9-?!c8-q99&)N)lVIZ zyp0c$1cRIahSc-dr*yu1sn3%Fbxqj%eL8&!n!nnOKC?O3`p+~qpHuU!?P*djC;6?1 zfrQ41S&p6y5{MC%KTn5Y9a2_+8%J3aC}!QHhRS#_JN|k;%3pFudA%fnT8S%&S%~Z< zYA*4h373#$rMbbRz7(b3(p-`-8hzGAXb@;4c(!yYr{!6ziIz8v=C>B}CiE{2>?^AB zX(NiN@-#6R*R##4T)r6HmVZeb+2F209FVx12a)T9*A3Ziv#LD)$B)sNylxi4Xt!wx zEQHEFQ-`H20=+Y3MSUj@6}r6o~i82zwB1sgi9Qe&OR$BRby24iSd5**qp{uJBsBvN#gHHWjTk zmG--o_5<;cL>Sfi7@cdcEesBq)Uc34aG#m^aY!z7foeSA3Yoy@kSp}ww2gO-6B@&JZwFJ7#rX$$#&bT?Gw2Qgn8mnR&2i9;{ z5{nbEKf)a;?d9Wz{lT+!?1Obxf#a=58q3)RKgO_alFixy^bQNF!h|UM4h*;tgCDFN z!Rl4v!>D<$2WVryLK|a*WYLC&w|+q16FjzV1`GT1515s5Y}QYmeC~mKj-}o?hWQxX z@QSQ|h|vA|H_#<;gD>X&Jw+e-0NNGieQf3g69jyi2A9||&KD1GzPKTe9YAolVn3w$ z>eJXv55n*qh|L<>xuFM%+4#+88FkCRBkq@$i`7CH-vFEE!WnelpPiUsA4K?s`qV z3Kgx17#Hn2WeYd(Eb#^pD+Zxu)XS~MwTF#Mil!mp;=?KvpAfp+aIqDp9O#cL`q-2& zem4vVPjJ7sIMIWnT)zeGp&*Y5Zz=6dJ;C?2ytZmJ{;4pfR_@=e=vOQ46{*M7o?xw{ z_dre_3}fU@$U7+_RSrxv+@BfpDX34O)k?UFrOoOO$%=OS`H+m3==zOUMzHi*Kg=ZK zRPr<;$g{AOgKT^j5(EBny4-FVE!L26*)&D;hH8;Gm8A3^ZgjUp>wZoN8!FDP3agIR=< zSJ`fke;C}mHiLoGevV@KX6d7G1!kes!O#FKd9a9KfZo_Vw_S1m?J02t&#pWz>_zyk z&^Zt{8wC^{Ldl}~r1Gdv$f}4w5v#V(AHlak6;#@fOxcaA1iC1vffk${;Ni895T4c!C|d&@C7Ssj7goR|nL8%9TWQ5$ zx@~jSSW^#~p()C)ZAlS#MScVSFjCO+SPv5)cQ!m`vx`H~ZO@en@j6;6r-?%#9NNTK zsE49_4b)lVoI`iC|4Y1y!GoFxK<#sK3tpL*&pIyrU-H^F?65uYrUNk=YdS^tr$LOC zrnJr{zk&H)7BTL}+Lu5q z#6m&CVUs=jN3yr>12&IQH!ybeR*EDD6_I~}E)A`}AlA{O;>?JDq6(K<5OcT~Sa~L0 zA?o+|I^pdGP{J+Slb%Yq!l25(6!R6P+Mp&q;f@WZ%Ctk$+{6itky}3iUo~g_gmc1m zA?)Y~@TGrO+UKcbf}L7`t?8O4PQn z$^oF1T|dC_81w#^-5E@3*SDrOpYvdDl=x`B)>{yhw+UVBmf(9@7COa_K&KiyRij{X zWwN823LzhRcDWwEoY7EyF`(6g(&uuMab95d_XC|jXM zAzrhx<$XF)yhnxU3>;Hes3w@<%@n5c|_#6#-Z9aMZBv`V!&7?PoFshNg`05VdgeZ3bQ@Pt0rRRzQ5<{EOL zD+4L(g_!sPf)02QYTn?mcobZFCrn>Tt^au$d&~N-59yRs}`Ad-i? zBTt?E-A>ZMN3ibvkQBE(BK?Bu`8HD0SotDgLn#!<{{hq4j;A19(9j#%gT79FDprTvyOut-$8e^fOL0 zrOML?sEPrL3C0WfxfQ zIdXah#~*u@Vw4%B;w_D4KTj~@T!-$;v10Jnpp2tI3MS*Kv8x6)a->V1|5N(a? z-l#D+Ny~l}PpI%-92sXv(HXJ@UuECNy_=T!9*QgmJY3ZURxPrJRN-vuv=P=V7$Vn3 z5xuWS)pMdnOFY1GYo(&FsAU)(QsPhfAvJLu-x7ybTjt=EEmoK>dY^;uTu?ul) z@(#DzG=OnO@fa~`t`W%}vj4k>owLNZtUrD*wC|0<*x2`|Hitlgh%z_mMj|ZmMskv} zeKW<*x~h4Zk@RU}jO5k&LojaQJ-H)GL^CsSKl?6uGc|dI5)pk2Cz!BQ!ctS7iIZVb zZ24$8YOa;c$?RBcjTHNiOoPTQNXhz@D2dd17cmb;T+M{Ww{JH+_Cx4dJH<}H5)a?T zM~gcS&wGY-Q*E^ya&lZ1uojK4xpbhf=oe=*jY{1UZ(bWJA@Rt$17PhC<>r^|KLCa&i`YwNi&#N%>2 zq0ke&%jn|HWL;tFSNb50|L;JRde_;`PMMbu?NAVfdH@%Ls!Su~Jb5biH3&M>2cKN8 z?Ap8<{+QX$=^_WsT$rvzwl#QyZ%hpLnw;T;_Gsbb6qZ}nxCkAJ?%c*j;76a)4Do68 z#zo*qf5%<~Zlot8z>(}VVztAJDBeUUd3jv40ml$3)CXk^vvNNat`>WJCYCbEVXAv6 zesOexa=GD)Th@6I=IHNG0ACW4N; zsU4wC!(4To&6_kxC9-pNCd#OLKyU>?cAs%!l&PQFv`VXrRSy~$M=0M#+0pj@sAT#t z*0W*+ZcvQM({_Wn45~~KA7Zshw%59^o-@A$M^rI75N?L$8l57=Pc$}2F71Jx88Big zgo|-u?54Z5#SJ;jf(Nu)j0=kL*l&qEx>+$Uj8R&DMk3@IDIqGatU0}QvV_ziEfYGi_>Y~#j@ycc(Xl5^r_4J}ar2Hv zs_?d1YjK9Vo11qiTTGf-m3`472{;9a*$2?L17nj$G4Qi~4ht`kcotNA z)4IevMn`t<8mMi4=oI?;!fZ~=iOuCEBCs%Wi_gY!DLlxV5VRi3DNya0K7fD|2Zo!9 zaNdQdNC<6-F{km=(fawfF4+henL+Hw*$({i*M717kIsK(+R*=LaQ}6Oj%gg^V%8ZU zrd9_^^f!SYv(C6RsckQ)bjHcaMlw5U=ByuWBuA_(!C+3)8k>!zm>8!L(@5rQS`9oRDQtv{#pdxwGOM}4NJ_APC9^e$(dOWuQmMy8RLRNC zZkGf)hzIECk(p_HLvkfPjxB`Qnpqu=SZ|-=p`<&S4kg}(M0lu~=)&^-zWKLMLg>2W zgy!d=i&Gi1(oC~VPW-2%!V`=zo#iG|&@?|KORsaJjL8m6w!>eVR5sbTWP`k{&18=e zX)BufqrN)}(P9PA)sHr)fg?*{G%jGvB%WG7$@C<=%_AJjVaFJFK97+(gZ)e;(`cby zt|6N}tL87X9E@RE=3F!z!T{ap%(>#_+Odol8g-!6SWh`h9=V-2d0TD$Zd?=4dHf49 zqM{FwL$A7&6$-Co*=fpT0LMwZhlUpifLmL;V3q3K%~7RsjML%QAjr4c7@mm@Ei+HT zto3u~*sW~&t`qskdgJ_;coL{=f0XlL7}fEfjIg!l9Uc-anL5UNfN~zRwS^cxVL*6^ zO4oz|G1&+4Pcm3QXi5q%Vj1a_8V_ERkX3A+s)p@#qLqv0XML^x2-tXzt&>m@dIjo@ zjg*DQUS(o>vB%gC7Ht@IB~Cji{;mC57~QrT?=hN1msV28k~Qooez{aMK1VzrHEey# zF4^<-zf;vt^;6aK(Ja%cmE9;>;*micQGA!JG`{9qQ4cadw>XuCEKUbg;fa=X7C*1y&x+I5ZDSe^Z3BgHWn79kW2NCbo2Ro?NRO>LLqP?iP>SOgR+ zz3?)3^0Ge-iD~Hb2oE`m2FMp6RG%>Vka~6| z%vz;&jdMzh$B_traQBtq2Pj53;0MWv`RDGu4EaDx`nXPPnpHvdupi_)Pm?WaIMn99c3j6y@)K%K()YjvErTt+~Fp0pS)gW(|fW~{4 zC8P1ra`Fe2_VfL_SHX&;33lZG2&(K%zy@v9tcS7YK^SPa&<7uE{GXt;#g>3jF6W25 zXp1DEB@(D4(0Vg-adeie*00{98M~UdfrjP=7>x|Zm=C`1ftVaezLX#lWDbciIM^o`VK^(0K_#7T5bKNNgR+s{hmV2QMTH^NvJ zJuGUkMiIyIC8b^Wp6{ZK<6jju`Sr|L=%^X;7d83x>{#fRQM2inX2|CteBZa8n(g}- z+vcrs1VJLSUK**b?QUlewU5o*CahQSB%iiV;#N*He{Zy#vEm|MOn|G}7(WNnVERFtpRh!nb<7)D&ytC8GHP6ys0$6* zOIZ_0yyxodH4-c(b^(v6DH%OVbr>eP>>r>N_3S;D?EW%$F*~YdysknCF{@vZ56L-e z>e@jk^BB_0RiZ;_!Y@T4#B%6R0nSxBs*+Q_UK%!*$TEb=0iiIAhyrDLx9%Z;G0| z`dpz_iAcV3q_gAQ_$B} zcJxsXH%|ZQ0G?-JQ)fUgqJ2&>_3g>{Z5YY$sHo{QND1{l*iEz74BEZ5giNvrvCaQ~ zy4)_myv8kD|9TO}0_7l>h@awTp%YjN=__a| z@ckLc#ZROGu6|7!p2jWS-PrZRn|KUV3)+nb5N2WEc$DQ}v|y>&<>wE~ir5CHW@`x?D5Z$-@eME{(D0!^wg zK9yVdtv?H?b&+)@g#37MjAEo!hwH5FZ=pqGtF5#?i}(Y_i*Q{#XNG!|t@mIw?k))f zL+Ym}8e3{}B8C!4AL^=o@P9{`RUV9m{t(8faBGs5g?2QQB?jzfO{bzPYlo=aK_`L- zSup}gM!Ur&0-X_>11!`Lv9a9`q6j_bb7u%{f7uE9 zE$J#Gl=N)gwOwMa+iBJYPmR;EHac_cu=PG@zdzXeK*XANKW{@F2JfjhmtUCW(Z}&l zhL2edmuxfB)cQRUG?12%2Dz}Ng}b1o%r242Q$dxCFk(;C4-$@I^g0Qy!`GldvAvU*ILo1T8o+ z?M4`4Kvs&l+lFSU+Oo9iU{IDyx<-%GH)9Ird$X6uh{0 zW^C52u-eooS)GU{y1h&hjs@!_SZnL$?$9}kmvPLT%pgVO0H)|pEJGjAX-p2pW(5TF zzzZJJN3kqcDGPg9x2YsD&4nU*7gi3y<--zO!dK9ewJ_!@4A!61WmbERO=62g;X^YQ zvW67Sx6n(k>6}ZSfJHACZQRgOwM=tkK!kVnMwSZ|Lj zhUBOcubvLKVGc76_t_0@Yb;M_u>x!YUBFfxg?R>!uz1^_rsDU^am(>bOW-HoBMH0X zz3MZI;l`wdmdj7CW?SDaKrV$YbK_0}dwAx-vAtX0?H<}T*fh3}oY+2u;*MDH6(LCqfcj})<8YcCAuzBW4{gcl;Og)&;$4s?qNn64l567=gZO(uWQ6Zm`U-!=7V%Dh9%!psjdYbAS=X9wkddKQ!p z28cEa(&renacH=qE#}=!?%-nB`p(UKMDPK$_cchqN9;`1*SZR~OP_Z9Mf_er!?Iqp2M3#l!$zMS*ll!+&%5027R_R11CVU;mQ&hzjvbKw zJX!6(wJv$k_)~u9 zuZ@Bv@EB5MROnx9Qw>r`!gj5VSJ@bu>S`WLCs@OIY5;H%1(Hn?_L{xkmSgYaO!elb;j zr_#UsmzACYmA=NQv^-SlL~hGRrhi* z{mCu;LUu%-)Y{QB9)+a_cSCk0Y)y7?3*D|2okVq212KDu2;&oTa(G@HvMpT4yE1Pq zJ^x`sBxAV;f!BRN5EK7k-E2SpH7<-`$;OP$@w$YtIbN_Wr?k~xf1)eXRn<1KEpuDW zHlb>6@PoByk?D0le)&I&I=aA-=`aLTwe_$~2M@eJXuSnpS*ebMIne8bS#6SI8Pi?A zT#rZXdR2SLOZUE#cN6Pq`&#y?wk+-1><;bf(z3#VwV8z{)_XjED@?-GQMl?V+@p`G z(El9RSGb3Zd#~bFyz=Pd*qg_C@kG1N&L|%PS_DI+a2&pyIkKZ|vNmPpacy#GSv4^5$Q)!}xSTGSL)><0uu~sVq5mncFW9M# zps%j=oIkc?B&-Hb?ui`AAEC$K1$KbN5vTa_(S7is(;grxHc7)8A^3vLI-uS+!O(4+ zR#v!2J3FIf)}%@MHlNJ%#Kn@WJ(t}U_Gm{Yb@*&$S4U#QKdJFJr%X_uZ{3})?@kf?{@TYh43K9%+CyX`n zpfF}H-UTaF^XNcFgVdH4w#HJ!NePvW+uQ+C$i6nEO}xkGLDg6&OS~260RG4NjKLe( zXSh=4>sgqljGYM_Ph~c$L5x`YOL#^y&!|mYYxIcdw;vOqq&H&AOAoU%iT%cxH?mIM zbN=Y?amv@s2n|VGC2_1GmPV|^qm7I*)#&g0QL}mw$_QCGx1%YmBl_ns!SGX* z2NVIy6m8uXH4&r(Qxn0=!FNF3`JD3yw8=f~jm`7B2n)d*Zm_GlA1r$2#}@lti>zsb z)Lh0MZzrCP*8(9qSoysK_U6l~U{5djcxfGmK;apEH1|+Mn8>p;`BCg4Ih${vg?4+TacKYdQn}CQ6D2# zrt_AT5c&Vb_N8vCW-KTNn;J5e9$ zlq)+c#~C!JjHdLi$u~HJKS0} z=73BwG1~9xKZ=nNaC2l6WR4NxFqER#%;|^3kS!D^_x$@%3M_CgPF7=&jOez0+SOSA zWdfnBKF~q*f4<&OttE&!eiT&cCAP7gs!AATgt3Zll~z3WH7 zZ^>H0=*o+-qNrgL#YReZ9&iGhSN+Nsw3Lem&ue>ozXw;Vk@eZ*mcaCQ8d)rqaC`&f#z3;@-a?liNK@-5(Onw~c)nRzS zXJ$4?W|e3eH#pLLeM-CVowzy-?~t~jUFE#xg9gPp;xpZ5wFrYYFA=~Y3S=J)zCT`1 z+D0x-FO1d+WXO(kyC0?@?h(OrA2m*`wPNP~0W^YzR((bQfI~~=y$x7Y*R?QwX666~ z7?@E3QBg@86A~mL8BNrY2ntAy(HW4z#NXa)DV^Hh6wi?)MTHEc%$!WLUrn1f$-SW_ z_j+&ta&OYsG*M@m1pG}z+XzJs=J(Lih=2U}!@O&)ea?ku$ISRK8ti0a=w+BmcN2thj4X^91`j6pI4!5-54&!F#O{~5Uh zQ~TFjQVi_wjN!O?m<+6}%JCgl&0F>hJSI(9{}#ushNX=B`RX9f0sRFS^_H!tMU#4# zyxF7QjUsUnRY1@S?XID!Ldal!7*8kR)_bON?3>S&SKuZ9+8*6wgLf)s`DSjCjcoHVvdM={La6qJ0FjF-PDgo5k0#c(9B8Zo@N)xTa&!sq&@cq~XV)A^9b zISxT$9WYqtc!zsuCx{;E4Jvyd5j+cd&v%TEq0aK~Vduj8b5|_P%_UV2u1w3X%d7G9 z+5UX0B#XB}zWZj>ofQpu7G9S(8s#6L#gq6ApK+7Bb{o%$Mb2{Hcg*4C+xXRMAcsW1 zXnk@XV3jHV&SpeNh1L9NdJurjrIQP{3CcHckma{|78-$800KyoXKo8M@1{{TgK82= z#mrsdGUcBc{b~YhFQuGDwY%hk47*&AZdaaCk*J2l|D4Liu^iW2HSV<^RLQJ| zdpQ*$@&({A`ywn+Y^@thN|g^O9aC^-@tf@q#h9mlVp6=)J%*IgK{=JOn1zVhAMM0T z;Hutd-0op{i||tKYsOo*pWlgB<#i17jRHQCuPT{*)lVaTNpzp4AXdunsWFpDgy@{r{%{Lv`L3bB^cc+oaK%FGHLn$%;=7vF&p6*<40_2 zz)+Di*uSO@_HUEL;@=GkVS?h{Tdx4#owInzn?)!xS-dmq{OKAtS6_kqaU zo8W#I{EouUTWpxt-n7WD6f$0h+5SE%TjWbkAAUz)>D}k4^`DEv+#ZDoNW<^yD}(zy zvTJ(gaTr@h=52w?4EW82-#qvg!fy%umc#E`PI@mH(9SS6Jf99%n4F(afh)+s&x2sR z%?wu~TtSF_UVtlz!Ow#zy^SCFURe9o!QUqMy$HWwIiuc7u>rV_dJptG@*PCOM!dIC z`YyJM)_6ef7w^Vd7=$rexy35WVe)oa!#orY4 zcP{f58E;(t&7#?HBF2=}%Wc=AIi_vP{gH+9h&42=d)G$K31+tryZfclE8{}gu-B$~$jqvyJnpk&Brn=h2Rq-dZuD`_q zoiTENe(D|?JonJ(thb({BB8LQjpt}^?Y!p}LN((9R^g_GH@UCH24P!SIZoKGEjm9{~COK~=TV*d^X2Cm|~?&RM3BI27Ar^-vx$p{zp5>7`j8IGqTb z-pe>GQ$FI@RMHmR1ju)p^3I5)?G*mN^jq33c3i*(t?mzK!GVe=ul@bNcp!Mx`#@oqs~ljmq!HPXzY__ zG%o?3%0O}r|Cu6fO=@06tuBr&QwAPoIGW_W?*TM%A} z-z)oH_FMg4$Pum9yHNrb`ddg#JkFc2V0Ne2-f%#4FpzXEv7$2u>{GNC}m4 z4Nb!EKPfY=;L-~9Dtv_JL?-CCzse2Wsj5%DyiZG9=~Vt$hMy;VWW0v>pzX@W1t{R* zdJQ!u9Vp^ePt`OgS8NwIjm1?9)Y8a9*(iC1Jf`2CGMr`=??Ih4E$dL{a$esT5G3rB zq%ya5h3tI+UdrqX=%ivffVvT({u*gUFebXS{u=2;vX%MwMCnB`F*=$1P&i~7p%Q^b z8pc(k1@xl6zYC*);b(!$62Gb}Q8ggJoAn(DL(%#U9FNI1&`g@Q3a?Wqe^7UI zu4M2n)qBU(U0o%{)Lp$-it|3EYv>Y_cA2I4hGY9MQnnPcFCP|WeMjBhI@di$y))1q zmpGvOzWqiRn-{%19;tc)R>V%lS*E>!2db(FQW$|)s@4(Y{s?4j)e3@SY7oib{xBcC zLk;fk*@**q7wd+?FuLEU1#tb@br=`2T>h1119_HK)#5r{;VaaL^I@@9RtAEzuIk-5=oy8U68t(mt1Ro`SJkx2A}Y^88_923c2EWxo?`ev z-BX;|a|E4R&SztP!c!rY%aL2s&#Ycq{~k6}5XMRi)Gpr+L*2>S&>Fzha2$CDIRev4 z?cvmJ6^@6#(3)wvWg>Pq=ECd>v&|}8X-y%eQYj!z!I3tTVW{aW&8~EoMpy=t<#3-QPlqgNFum5++Sy5SUf<0pZj?QEOsgQ{$km zk7zF<>cdB?EU)gYsY-`G${lpFp-`2A5DpkaZ;~PfepX4r7PgGr*{)cwGjC$_Da#~lIc9BYE8 zXCnKQm1r7-#Auy125p!igSHriAo{KJp>6s0-5{j4<)@HFa74PZf^{)@fHH;rme7d< zAcB?>*P+Y9Tt6Tu5!;Rk+ZLztbEdmuY*$414yR^JLtO{7iOZ~f^CTfvL_t-17_};< z28<9ztqVmbMezX>2Ay{jZ&yrLC>Oani#>-gtIxUY`MmZ#n>~N5J?FFM54Gn)_Pmch zJC)zF8)61MC8&DDqWf$KiilNpJWL|@X5%zwMN~YI!8J+obuqo>vzYFgwGJd_TQ9r~ z=%g5N{>_Aq(^`vpt}PZ@q-jlzXNv%Bi1Kx-r9OZ}(7R8;IGO^Z{cemrJg3%DY-+f{ zWS|l}Bmxf&mj&OGeElE?LZW9047xK+wM=g&5S|$_g(7YHH$Sm=J><^Vt-G7!tOtEIFQ|PcL`D=^ptmLC=+j!Kag7kgE8*zslF7y%=@qv zfWXIZ_XytcO?DphDPH7$pSSha{!X6k2RiFH)>^*8bDVExz0B96b>{NMbI_>uFmU$a zmRW-QJ{=(9_Fu7wkCSL3-dzzXcq%j9d&oVY2Pv+YH|B@ZabqM6?}d<&fnxAd*Hp|G zxo;S1J*a2K&Dqw{UI+wkETkpoHcrxLl>!@?6fQ4LQ zo-GCjBtJ8J`urwOpA>*-*)|-EMv2aCl;+3f%3O1rG|`esJ}gX5Eiig^6cSwIc`6H=`{~_!(Q+5 z$($k7a7=oo8H=+kD=)C>#^57IN91y}F~+vt+-C*&x=>oI+I|B+J`n$KipWDl$+nnU zfFZnYK8o9Tr!H;}NwTADHCv3*a@47h}CbQ*v>>_88+e zH>DM;bkcqe%(upJ#gt`!sB9P)NxedT6K=FEw^*2=RKw3lmcX)v{4&LO;3K|nFkX7M z;ecc)3E_y&w-$#v>oNG0Ep@27!S$k7KU zUSd}j%TpIV?3pU{dIjKib>lH90hw72%!tc?fg-@WTkfp?6zkgO#=7!id{eS)D$XzP zn6ORY7Vh$U)`cm^5aQJ{yjabZ=zrsvR6nbUUb zptH)t$^s8`2n=LHPz>!f17cs^~P|VJgnm8Vn*eQ=WA&?cA`8N{KuwDGMXY??A-;)j@@;`l zXF-T{x9DN`I6~5eh9amac}QN}Q|`&Z`Y2E7*yhu#@DMV3W+Bis3!kjVToXL0yYM;n zSM>J{B-lN1RGsI{dJEv<1m$^*zA{1i>1YIixhHCptp<#)urH$&>TC@MKIMJC+y$)$ z>sI*+R6N(aR0p-bD^lxNsPq``Pqzb(uwAS16>l+a*+Y$w!UQ9@!+iB#Ts_!#QVoAf zu_<20-O(Sv3V*4pJ~skzI84GCq6Z6A(lucx)$-VcQI!~$w_>omG`tTCNoMv)Lg(~d z^hR%t1pbPE*CkVPK8J&zmZI7t@-eHf<#5AH(l+_;EbX>-eaDdc*dLQQZovLv2D$uoEl36Dv(sMt)p3$YMVt z4>!LX#@R~Fc^N9mW`ig|nm!>r@i3WCcq;CncAKQ(qg-3PhkwazMVJhTSQnxH}9(exEQ@tyR=|gsZ}Z z9P+)LT6HICXC+-w(a$Dt0~2YEL1f)QCRCyJ3dP(L z@&ollm>_)~olCUQ3iiL9Xhg5c>(Tc0_h|O@)2lGZ4%yc>``H+%t}(-Ov@I7|L80wL z{aJL|+P(cHKah<~}p_b#DadcE@X*VKEGZG11&J<3Dw!Fii< zhSNwyav9`K-*cATwA*T{S`IlGI?I%8$0+R2+bGfOosHR}y3>!jWB7$@NSi%~(!Ja% z_ao>k2vLWYsR5ud0lGkyIa9}7dTrlK$UrSHd$7s~PatJ=lHfOrDuV@Vns;soG*g7+ z*4TxFZNK!I@}CP;yAjlg;2Q`wuVWiPg8W1Y#;!?lT@I(B+%5OYDU>BtGeDQcrED4vaJZ?)6}&U!BDcOpslDEp8Rb^m$&Hb z1*eL7Pf7zPA00UP-QH8Hl~YB^$;nT|GrOV!DW3W_8hlv&__u0De3WBPYSokR(T+Va z&T-M4*_pLx}@2U^JU)2gn=TAaqb~eP)CT%AguwYh!V!u z4SrKhsv9hdB!A^C3Cl-I>IQSAc(}zIv43{Dq$}|zW92dJN$FIjs1Gcnp#fp=wO2Tm zRLv=3bd!6RX#NrD@&;1lnJeUCz65&o1UZe~C%(-?w)ds@R$j<$EfjQkbjCIJK#mmK zYRK{ZKu6xTTgSL`6%;TGUPx7QnCKtAMnoIC&GlsIhOe6=dB^ z5c&B2)1lb@)3&c__3~Hc70P3%1V6Gn7yilZKrkXA@)|ifqRpb(3+EnevHVDjZ8K8$ zvp~)4P_yOOYo7{}1=TU=FW43SjMVZ)dzn+w6%%$QHe5m2dcZbddN}}cT&>j>+>v{&Kp|{lILJ+@eoJjsm@VWuDr>%p_uTPg?iQ!RHwUirFKZ2PDZ&YTIxvqT^zFJ zy9bKIx$c2VDV_8`>J}GnaP<%^Sp=t0ux9wkY2ViYRlKh5e&HsW>ar!EQeG&9Vd38E z(OYAY@e+6PreH3bV%%^MX9AcAlswXZ8HXhXWiHsVd`oCpnh$L&y3Y*3+uKm;Sz;-)SHOJUL?=@%x1>X>ZKNKb?o|F7 zhkM}2CQ2~}r2F7I&w(szfsZGV!zW84cgS_Aqr$GdP9gg(__eGE+LdC=V~3@VQ(X;_ zd8Ij?*sdkxRm6+zKcWy6_B@FSiWKPN8Sl`U&`;qTP1$AkJZ%({F=@{>m?h&M<3l`t zdb{*u5Uz9Fare#8L$E?xyZ&j7+M0RYe|_H0K$32&BFt9LnBwhR63(+;^m zIUhK~CmuvCU^1rkw?m5i4Bvjn{Yn35czX|?gY?O@(eOZz!Hwqt-ncm-2Fn;CxUvq` zExBrjb=QGS-nSAwR?V-IdZSxl_|zycJV8Wa_n>tKG-}wF}7xkm}F~{@-WGr zc|A0fY6XnnNIc{bLeuk5Q7W4AkU$zwSb`x$jLBwT$bC@nF=K|%bHqFIaH9~h;Yqra z<@sr7ik9b>?gKnz8leth+yOH^EvFqeocM(LGgG;taNv^|sH{MVC7HlXNv3-5KJ%&j zfSx^D=yNpV;hr?Nqvg8uGM#f;{J@$NZPgur#78fd0;%J{R z#a;%hqHt=1y4li~FPKGx`;H;F5%A_3-0*nQ4>x+eIp45?Qa;8C8r*}1nrv8PzE%5+ z8acV{h%qz?E}vhkJ0gU}$Z2(7^w)jBd(uL22)*PgxixVG~Y+6c5 zzQ-in3q2J)TLK}t?uh;tDUj`@x(^JVw9zTcfQyCjn*+c5;Wt{I{A_^59xijrz3wlj zR_qc`14w=@4E1w5AX#ZV6(4tgpElRCS}2!08DjTzB6cj|AQVJ2p18I|Ex-QUmfBaD|wU&AW; z8ra(VYZviTDkAg0En?&UOd}M3jSO!GoLzcT!$f);W~MK*_QANIhXwU!Bgk_VJdEn; z9uRfN&pA?XzNrxp%cGB?)S;ZyN9JrStUkb94TtLoKe!eSZ=MJ%ic9i-`KZT)emCT_ zP{H>+%RC~Y^3;jEd_1JL9)q!Zio4rnG}jLrFhCWMOxZklH{NFl8X$i$wy{q_9)Y*^ z9^??@r;G+z64WnYzCpNE-riFJNg2|S#$#dv78TVJP$6Kaf)7D1FbyZT%!)Ady#+!EYKX|`ijh%Vv;LUS$&b74iebX8G>L?#@1oxP7Y4Xc$&yX>XVtI;70@Px=Gc(a~#8jB_8<;SDCY zpIO?_A$C{RueYR~4>yLzn7SpF@pU*~p(v>QVu(!2EbLP?53`3Nm(nmYHSiU7E_3}C z&KrYmS#rZ5}f1D;i>MB4-`&*!7797`0zc_??@tvuN1z(P{1Squ2Y7 zP75R+^^_YsziTw@3q+GKdDr`>&==5&30*m}p|5qV7G8o$Lo~niaW{j2DEtyUz}SU2 zB`O4`p7_qMI+fEGPIbT&bi>XNCPWp$)+;k;y#mV>hw=kX`^fOKG?s!0I)>KgXN~fE zxJE@&EjwR{0+wkmNzW^MwU(KteM>C4o&|zuF>l&iXu02`Cs7_mUfS0yBn?uh+%FGA zA5XT{v%t7UZW&&LXuk1uNJ^!=G*))ngSP<>)duWSYHq8KSDiQHE3;I-6aPTdc=Ib}G(Hp3(pv zRos4bPWuu3F{@=6p{!&mOV}i21MidITY{?qS7ZNQ`a9fz;i3zNf6cE!XLHK4W|H~M zM{?2*cy_=|Y6IMqhCgavzZcCuK2le3s4vF-?Y-;J$q>z3?x`QbJj6TdhmcmBQa^;G zVp{zWl8VWwM~<~C)yJ9Bb1Ppzl(`Q^+<=_aK!u%7XZt{;*?dfHH z4>AC=N14-=uKYeedP8@NlJ-X`3+@h+>lh)^Y~z$n;Z&@wXC?tdg3@_RLuTD>b6k|Kcg^P7{VoDRnUs+`t(^_a5%XY9r$>=Q(&tsS? zsEbVTTm}bf>Fva9sp{MC$t2ZLAyN>T#$mgXV6jqFXT+d5KoC}Tpj$``L|k1-SL5^* z=<+bvnp8D9guhbe7vm5!EwJXXpgfCe5WpH7Wp)95g-*2w#-=5fB;YtXQUjPq;5lhT z4LGbpy1mq;Q~v#7(u|-P@)~lOL+Qp$hMH@p1s)q^Po{X80jOZ@^9Z}Qx9qI33E~ov z!;13;g1Ecm9voLa);(ycNm7=P5k(RixYZBh5iHfI^@9iD3W@hqqCkntbb3f*4=6ax z#w$A@?=_xL3TY*~6FQPV0#zo_bHr?MRDb>k_UEUeKPz9mKR-6WhuKmC6&)?Ac z^V4d7R{p#GtS?g(QuvMN&-(wZ{aKIwdF+J$HT@Z;ugbh|Sc<7k^h5U|7ax#$$5iGO zaMh1h<~`2Ul))$c7)ZLDZetpnqK?;ThVgNgNDpMG%rgjNrC7iKrc+!x2Yq>^N_v{g zDItq7c+soDD1&1wqEuXouKAKxbus5bIJ<}J z2!#?cy+kyXXln^3y)&_VH#S~yI!a2FjR)kTQf5DplUz-4NH9i<+=Aw8mhCa9KMXPn ze!sS!m0QFFO73?1^MiCJ#Bh;KxJY}7<h~0?pSn06YJ{y}WC9$~ZZo;R?DYU9IRs~#SUbI0jU=3D*VB3!50+N$+(8#~~OrM?(IXydxxWkAbSy*(Jv`kLL9rOxl&TuOF zhmozooSQRM_x{USmP`we`e*CNETOXBXO#_Q!2LJjzFGCls&JBtYTa$D5b1W!Rcu0q za%8-^>NYjD428p5GqY_FYVfmy6Y_hZk6e^fn70_u4C>(hOw_!^CR&fV;=N}1V&Ds2 z`Ld4uLbi zBs!HGHmouOcxfE05=~A;Nz+sdo!FCtqwSrY6}~4-&DaavU-a5~YjS|&*U5RO{kp50*nTu^QC% zpV=_TBCIRh*^`QbjQ!xq*X`Kf;Z=CAv^mm>)Ik^L#A=7`}IP+xE0NjUWFl+;1 zcaOq8s$y@7J(<)C_poqzWdmR@^t`eOPq1jDrj#aL_ep|p54Pazuh;#+sDmY_WcF=- z=JnT4t@iq;0N*RfbeWxH;9ZzZPEel|sOA!qqsQw+0oAu-n*F>1y}Cy!E^+bKVYZoJJoTjqw}jEU6f$go_~N$ zyMFx-^p?L3fAd9w@emheSKY~&6yOuSzFQ&3tH_}^75jAHmYHULeR5>2D~E$J>-JD% zY}FDI4g?bpi2BZM^?i12u$bY8+FQZkH@Q)}jKN`&F(_rSXgEC>3@90OyK~>eZxbJJ z5}uCQ67gGkbXnI~OCDbtN%IXjGhgC3^v&zsKt|B%go`TE@f}I|__hvcSHQ@C3_Fqv zRd8W67)Q=T;A&){(#5Y)nmC4WM(*ea|HivR0=uiu#P`_g??@_vqPl7=Jl4PSz)M(W z&j5TRYT@p)Gu++t!2O2bzUozJ40P%A$ znjcoKa{h*zY>Z0oJUBX+{TiCamrDKy!H3I5PF{{=ITGG568GS6?k-F@NIV`I!6WgZ zJfbBVqmnxhjn2gq$wlLlksAp#4y2p)+K<=?bq zV^nhI;nBI&MRL)2WaL!@A1)VpSsux9Bz)dT+{44U-;ODViN_-&cqBd)gO+TJO71)| zI+v5zv|KbE8ToqzA1)Vpc|*fBj)cEB68Fe(?prYB2=VyA2p)+KWv!NMj7skOV013C zBe`fiGV)A<50{I)7$aGZgkQco0{4UA-2Z|p9}tfpj^L5_P~Op!jZw*+ACAstMF)Y#0}l zIw3*%1I!02T6hdEau(?Tn4t8#&VzP!qkTmLCOWOvl8iAqU`PBAs1iwb-b zS)>w)q{xS|JKUefxexK#hvbg>Pf?MPcnCL%ac0MTbC|gXpu$f}Qs86ee3VuxoHE3xwo^4NK%qa9xu zR8`V819bWS zO}`EPU)yi5{GEP#<^O2E{iEt47wNix`M;&>I!1L}<#`amf=WL6$ah`}c3xx)vSvHR z(~>7Q-2PHcImOg^m_kzNs`$j0Ye<3Y;=;%Av{Qmi~VpH$xLKW9Z%CI)^P_JWdPh`vI33XfD%9g-LfjgH7Cs@&;_Cc`THnfcSE zGdm2#!RQ`!sx!W+0grfhD$~!B(hOIENc1Y(^GR{q$w9Wf!ZF+?4Rlff8p?_JRMR0; zRoYr>^>QoPOJa?)O6|&me<4%ia^8`qT1}{Yn3K`;*Spc#MVH9PUr&B%_>!{mFxNU_Goyx#G*C8jy7zU&{Pa z<<7t2(W|64*LqZ;C8MGY+gv3;>v99zX_Kf$bXFSZ_tZ1?InzsFc zbwPTO>7_trA8rvmw4h9heKYD!4*r*_on{OgA8;to_C$40(Ip?n-s~KamAD*>ba9P- z7bo2gnPowdGpXY2nt;8OPN4O;jQ(-vMsa2&Hyq&3}#VWRd>W zc&vi;ucSKYUP3>?cecgsP(h(dZABb;93~;i^C<7h!5g`p_uTD! z7EAR#n(lkyMT#q&;*rdrM+Hy0(dyrKfjpz#17_1JEsNa&VcLns`5woB=c(&tY+L*3 z+d#}&{qoSIU&=-1806E|yD{r+^dWmA>~mstYEN3zvjb$-YOZg^>eROo-o@&V$X zx8O)jW#^=yF@iG*hgtyGCQp`l_ zs92|q^XTPdxc4}C&C!zL>IK_k@cm)vjWrSbstP#|+seJw9A+b{^_=eyW_VlgaJ}=n z`iHQh(js}0xe8mt5Ty5|GJ?JeEZB&gx(<5IVh>&9MYyNK+gdjnJT+)&lv0G@b5q2m z`VdmPzY-d|HoqpHkhj7tA>QMDIz239Q77{)&UDWSONsgLF4!CBrHd3_s+?y=8#dxs zqjY+Dd!J5QRw=Wc8ZTZws7jIAW4I#K5GsBz|oLVW>~WR=^Q$$b4)9R8}O;U@y^ zg%(kP>0EC(oW0+pukXRcz##7{)Cs|1D;3ooL2z1+WtW%(gGO20pYAK%Pxe;cF@}qt z+*TbY3vKy4_N@9rYQ2fg*edz%fy|wFBcWOCGpsVB43Zo&y-x}Y39kl&ugC@LPfW04kI0*6 zE$?mf4C)3XsM(Bab%R ztu~7f_N-*V_{^*;%Hy+-d&bidc^GmdDj^LL(mdZ+6KL>o9|+HR)GWryMOfMx`Mc_e zZ))hq$?8+wuaM0001C|6H)ON>e0m^k2z+TY3|aeZ?ULC&WZs;JE+c-S*w!xg%B?Ow z&~0RWv;qg@a4HT!wl-7ap=w_1 zz*xxWs}R~2;Z7On8Smq_`uIBesINc>bo1FQ^mQ2mICJRbULT)kL+g??mqe9l6D=v#dsI*PTb38^xmRrwXpg2eUrL>?II2Bv@}1YtlTqWhRKWKo z|2g{v%1ME%Mrg21tKYYzJ>7cDJD$wkFWN3`n$$E^)@5H(`+2p ztH0rx6z^Rw=<*wmiT$1;K9uAu655K`Yc8VoZuTWvFnr(y3RfYr;eDn}SGRgSb``kVGUp{U3$&-DUIxWX!RBkIn`Rs z3qv`yQu|M~9yV864?w~|;7h@K*f6*-WTHs=@f1}bf&=GFf{r!L$d> z!~dDy^=>qKinQ7JKd}yA>!0Lzck4?c2_O9_%8qBmi03|Q!MSoqeP}}*$6*ZR;tJDq zdvNN#hL(Y*ZU4zEJm#TSraW`cXBT$X7%ub$4N|N-tly$5Ry@=21Ml*PmKmN^7K_gq z^eqg_?S_v61A3p)YX|^kA%3sElzboGE*}ki!e<{P2U>pn@Y9lIzLf3F1HCYO*IF`t zztY#$m)8Q^j(ek1F^*Vf^YvZ|hB%%A?kKr;Xi-RG4LKa}#e#C6BdQuD5^uMUIvfhsaqvH#reHb%bM3PM|Ifw>_0YzwH=2_;EA(|@WROf=e$UXI+Q>d*MDAZQk+++zuILuwD6Vu?@a6mNW zhxob4k-!dzaZ#6H^}~!v5s4t7SXbQO*RIm*D_5_Dvg@F1Z!DCI;f|-V^9Y;Qqdvjf zMdRCos@aJc?Sj|Vr7k%SBVAO@05C1qb|Si1R+Yg3RRUgjR&h9T@7w^F<|?+HQ5fRjN1Y`ht2fCW+$&PCm}!%gP7q&)|1g zKZt9Xt#Q)iy2H9qI*Y6btD!-15EkkV8$yPYA;5GG*xd$$ZIfQ1e{nPuDJ{?6}K!kdq0sviO0KT8lFkfQ_N;isbhzu=ssg zprIvlJWa3s{?DkwjDtU7`Pl>VhseVxjVW)6w-uF_DTjtM$p%f#Gwfx`U91bsM?*YC z(cB-FKP0B7?e`epq&7-^8+G=;bM^;T|D|7Iytx)OuWH|eGkZTBE+Xf8X2Rl%Uo2gT zoJVN&dvu-x-ctad346v<7EG{W=iLKZd#h_^w0Fi39&(@@>*$2`4GhGPQzteu41F0; z!wO zO*37(2WNe2pF`QtR{m%-o1upOE>(6iASr2k;)dgIXFxam7CIkR2bY1z;w)84v5-Yn z2ugtt+R>0JFjmh3wb*+Zftqb-y=`jkTqeqVj=1Q?hWKdWYp%!Dc3r6*H=vY0Os+|h z`Od|o%#3|@>X;IsY&PRF{*rB z;+4dU?r^@83hyYF{9(V(d&aO=nI3e9GbN19pNoE+3>4|#Rrz1+tbs~q46)!PQTDtn zeFaOue&gnJ_gRcwlY(b&YTF?g2c^KG1!&Ar!yav8U*gxK*WE<_Pq(07Vqph-8fAwX zg2=a7*ILBoHulMFTc*gTDJo;EY43prp_sREiPa?JFMUK(up2k_wQ^i-M%~<5wd1|^ za7o?OIg+uJ%T@2i%R?wo-X{s+0u~A(5{4^#5D(9Ygpy;YfD3is*F9Cju zubtv0CSa7O)(G*N!#Evlh79b0XhmgU%E$5S_J}(ZxIj6|4KP^T_TIVuW7{hv!$1^RXyj znRZ99@*&0Z6}*L(!b;DByL4g>bkuy)zK;xlwS~4?;7!0A%LKM{t&8~F)Xw*2sqE~@yOF`WS#{pQ0logKq4_j2X4;i%@~+??kw7rrJhA^YJKJ>&j+vPb zrGcd`m3n1dd0gi{KzBoX4T$jJ6%1d&NfF9S`E36*iLV} z1V8l1Em>F@=DdkRfu_XJB5xu>=-vhd$#u3|DF(6o;D<4bN?K!cEAhO&)_iEWd}z7+ z(X9qZcXzC<3mMj!_8xCqVOZT-Xy$Pw;a93b4Wjiq`RHtbdJysq3MHVcX2Ndt$=``d zF5a$G{gj5Cotb)4{oLc?T`6rbn2Ko1!y}VTu8B(DmT4uvV1`ffFJ|YzC81H6mpyQ%lxw#WF8$YV%zk%so-wOEU3S# z0DkQUYCQTx=zp(b?0#6!#Pt07u2BoX=6M{|PyDAUjFRHgDL?;7B%r){^Z`cAZ{W1G z_XMZX&w^Jtl_@`ElQ6?-7IA}e*5Qj7SNb@{cuEp!^OJWdmw&=`{AMA99m*(DFjd6P zgkP!B3>3{Ofn5pyM2$<05Q>065%$ZovmVNcaeX9K(bw?5-sUdPpN&g@lhH zC|e_3hlEQJls-(j-tJn4pcsv?3JGT;=wg;ixB&_0An4<)2;mcU*IWc0RD0a>0|Eue-I~yaQ=$-&UC^#jrXyHa-2{y38jrtn1RVVcwd}FIKL&F8HBTw zaB>Ofr-U<;aAd;CAe^m)Gn;TW63#rr`4-{i6V6J)DI}a_gi}H|3khcl;XFtIiLDJoxy06MJ+hPZRQU8uE7tdAo+Zija3`$d3~8 ziyHDng#5CGd@mutsv&0*@@pFM7((8qA?ts1tNmK^Z^Y1{wBcrVO{;KWh?@*G)D4}| zu4GMTofN|yK^L74I7*5NgEb3w@hKJ1ZMo@cw-p5z2vZ2Ul9apKXm=HRfTw;J+c`5f z9uUX0awVv}$cOt>xDT0Hxhf67!#xFRqt!rSli*#f!$_{ul~(S%QApqYTSy!8;n$k4 z!wu7vQYB`4M6o+^k=#5R^@UEDzxr&!N_p0Q;Ca8Mh9Nqs3pZGjolvtoEG)d|KvgZm zOb8pxV2J}&bqF&fY-pMaYetw|In5?!+cmLBPQvUQ$`7`otwAlDR!fx)@JPta{$(4R zl_w*vXL2q5rBn>_zA`8$370_j(B&P48CuM-D>;-K0#U8F0J4~bkR%P_5K5JJmMH@^ zQ_ea@(@X^{P?O|TEXm^#diG*m>L;lNho8snYBjN84?d>WY25$j`M<$0ETis!KZ+5p zL|JbOGPwY11M7j^2`>X~rAJTaPOG5m{oh#W0O)bN^11`pULDcQv;sG>dJ+ec$e>10#`6v;40Ru0@ts7BLpsD zMernRO!1y#t#KWK$0;;7V553wAw<#Ph@I4+HSIt6REexXmB?6bW>0DdyllCI_avRf z8#~LzliH1PU0V!dAqKN=8_sX6PZii2q6Ie62Rp5O(A8f`PuEOps2`EX_=6N}yDK+xN2CXZwRg=?Y{Mw@?CL1lMg=@St2<6*+P z?XKkrs?!Lwkr2bzE8o=!XCR>yL5~j;=Ga~69Ih%p z2<5ib5sfJ7TIj^Gar1I(&GY7LHO|Ow(iI>`Iv1R0lP=2v7Ao0}o7mE&&}X-rzr~eu zu`%ye-D@?X!>&}w!&CJm^6*qWUml*St%Q?7ICsj!bM+*7c&;|d;r{^^U3>4wL;!$8 zORaqmTvS!|`1}JNFz`kNL&bkNnhBQcSg8Yre+IPF29O!af3@XklbY#!QoA77Fv{?p z&1x!S+byHNyH>Vs<<^!UBZ#%Fx?2k(rERrudRbU2pd#;g&b{x=45aOD-`{+=-23jI zbMHO(-?{gmd(OZqUy+|Nh6<9m$d-2NLAG)Qbj2Byk)M$tYpGv@4%hA{aU3Vwi^Pel z901nag^Fi%_&B<-fzB$OKF*v*y>b*UWZF(yqs42y$%==UU~+z|*6x zLt!6Vro%q|N>q6P>BdzLsyxO`u+-E0Bl0X0QGrFDRcZBlrk9>vZ-O+9J#W!p?nx&+F3ALXE}x`E2@X)K&DXQZ>w{) zR7uAnlqa#fiq5|Ecwgt6j8ZI6XIG++s_NQ7_JURP@(TRFuc9pjg?83qpm?f^EY!5C z{k^K6?@&s?_7VBYkd&;Srt;2UwGKfX{{X!_>_p$!FRb(8bKHvRiTpTHZxe;$x-X_=WP zml!z1{Q2ESg@&ckDzyKb{7KdcH0$sExw4u!{_=PKkzP<1IfU!hB4byhlPBlXc7>_g zt(8BHu+Lvf&ZiZ2Xu_erLFxVY5}NYPBSd6uz*}l$^v4s+bQHRrZinIWG37ZR+!no* z+hQUNP!p_|@kD_Nz6e0kA<8}X#6tKv2k`4!zvmg1djaR@m~E6tp7EZJ1Ss4j6A4pr zk<(5<vaX<@OQ(^&|EQ|7klgZ7&0v(CrY7Sb`<5inhjQ2w!50=TKiBn z9@g2lwG=;a=HQ08wq`*D9wqsiorMMB7vLr5 zlsQ%9)bo731hTt}r~qDLsdu^rt<)8fAm$TwKY0ve|F?_?eRZFMbN_Vs{;aMDC>xid0noWk6Cgxp48EW4IwyAi1{%c|3~$pj=n+i9&L| zc>H$?kNHxRDZYOYUNGfDCHD_TS01{My)2ZCF6>Jo3%HtN$#C3x{YTG~{2RY5?aA8}poavM=1vp9OM zLK4=Kqq(QgP}b+>n4OAi&AdTRmWWG6DH?RF->_a(-R?GuchRJ44k0T;>KdXkNoFfI zK>yv1enL_@6vHADmNvg3hvwloR5YB_xn^W1Ltq{90&&Uyl==RYNBoAJ&oNqD3{DM4`c?65nst+gCTf~}6Rsk~jg(dBS;CXgVdj0@bwamru-a68c;-+( z9hS}%pt9h@q2-f3^+bbJ3xCp5FU5?g_q575h*#mFE_Q8&?s8EP=xHFr`NaqKfggD< zaLkvA@Y%}gm=}%aHb&hdosYgn63@MYi&zyYx52G1$`@a_2lq0>=b#=dGh45zwrR2^ z^9;ea4Hi<)Y%CJ5xmT6}=SUG7D*VR!hEqW0BbqUG2FCzR83#0_-X?tmwV%n~X)6-X zugC0qD8|*4TO-M)lo}xkQ*G1QvZj>%o21KtbO*xeAd&viWfQ=>!*sXNVD>$m##>*9 z?Z}N0Qn78If(2re8+x|dQaO6sKD6zcwDb%5;K`TO*Bp^K*8x3$-pgb{HWJ!(gu+DG z2?4LZtjbLa$0sajgqbIX$Sy*>2}#)hh1?Wt18=mFVZm0uKz2X%gqe~)pLBV$Z--{o z@D3q$Eq3-6*l?}~hoU-}e7oVhKuBE!R=$vQS2$Er_Uwje$1q~5ON&R_N!a;eT6b%u z`9czbdJF;yRFa^8e7h+)gsK1{-UtJ-El}X#Itifgkl#xfgEFDWMpER$-DxW9;owj- zK&PgVYSfZ;(w3PpZ}$t2aVHd@-ed78 zB|J3%O}6`4Y{W(B)+1$U*2AS{>!I>7*27!IS`U?tR7l50>!H$>*2CpXt%tV6TMw5h zT_Becwitx#al(PVZ`iInwvqo8WD?U`5A%bC)Edac(qcWp{-!}_z_dv(qR%mF1N-Cw z;Q&4x>d#Vx_uGU458nuBovfEU)ob*e)T4ZJ!Ui|SpXDVCF5CCuJU0kedViLmdLetJ zKc(G2PwU?VL;G*S5&hAIKAqq2puaM9{FAc$9xC_R)!m13%g9xpX#Kd1ZTLc;A!dA~ z|Hi-I>T^`r+3Cb5?6V=3Iz#b{4P=(qsjTpr>FGZ%2tzR3VeG7#r&8W=T;RK@djzV#$ zR+Wf$rI_$Ca)+{b(E05ibS5c`qD!|1F>Ry5$dY15p^hmPjX8wRv!H63IlXDFdE`vI z-M=5GY`QqEMLN9W|1c$+&i*rkX_-xo$FT?o1)u4ps7l^(AL5$#F z{J9JUt(OO=+fn4*2~&jo4Z?@|F5eXYw3`}2qZ7{v^BCbDz72+kuSOp|m3VliZyvLv zF&y8{2=ffWcfz@bFGn8@C4T6GFQ(yN;6D0Q;$K(#?2M05^_d}m43+U{ww!ia5AI)- zqtW=T@vS%b)-#(o;5!PkXPY#1qjCh-@DA~@J!@?W$9pc|8?~+5D z3Eu2`Llib8R5RdP3*F5D|Hp_g_mQD71!B&@7i$ywni=aEK2yjwY;EpD28lxrA(L+r zDw#Rj@Rh0Iq$%+TOsEZ~OxA-whryT3{T)8vK@JvgBR|wZ`18OAvfJ8>D}uL?`^x3p zl0diR#vk&V-44TYZ6TCxUXcSgYfekOrOR?mI0qloV0&gJ%6d3+x}r2<3Ybh}VgQqc zMfOqIqB%kc8PTg3YEYvsiyCbcD$XUKqTM7OD55XP8yU(YSiM|h^YkRbkSt}lF97mg zHhXve>zR^@3qLDmD=y3^PawkoLsKAVCQ&xWClCz=q0y+2LH_!FSsm0zWkog=f7H{g>Ob=I%w)GerAMlu zdS~muP(SHo^_M8_R{g-@ZXmf$;f(u`^-uUVv{Fw>xZ+I)G-AtZx>NKvcNorzXEE)4+fw&+rWi@x$m&?FIfr8 ze^rUAuo7vJN~r2LOgI=wH^FSA-_SB**-1HvDCNALmh&#K_Mwu>5b~HT+?R;Xv+AiG zmL2Bbq5X;%c#g^x9!fM{5edS|A)eu8S~L^E&_Ysy5K-t!n~-{-o)~{wANC~Z^lC4N z$Dm(o)h^0b-iZsBsADT{Ar8HSn8P>dd^}bTyGA#_V0X;YVn><5K7@N13dcgce%256 zXzhUh#A0;Zy@z77q)TO5WTidQU`B%q3r$LucRx$3O#Bt0$sZ1=^aS?3_x*eWM9Bg) ziT;4Mg^$x$nk(s%@)Z2cs3iK?vJuNHxo(E~OxIFQG*rfhk9kT-_bi1v$UFW+TtrbN6_%EF2&?P}e1U}0WW#Bc$#)sd)1_w4V3t^!oqr@cOUEW^$%m zgj*B9&J@m2W>rfk5ht_tOCoMNTQ2vfYax6JUh&|OG3%MD zQyEb`Gl=uT#r^E|Yp8SoO(iCuoAJ2~zDepsFqicpZx&`Vb6!H`XavHi&Tt!e(~L>H z(dBa|L?Zr$pD5%-M;tceUIU*p<68a)P*KGT6bwm-ly_t3AV~L~_8a22ILQ@8Gvl9z zbdlL#+zWlD-X&b&5@Oj`j|ho{1^J@mtV%Kx<#;YxLqt$C={(=+aHTNwhsl#W%8yIc z{!#TO>3HF@5Xm<0X(ZRmy;~b~^%~8)gd^A6js@Rxtrw8SUk#mmVu4tFmL5L?uq>RT zV#p;G5w>A+!PsssKMH$tYg_rEt&K$LxV5cp8oR%-yH(#RbRxVi82(z$Ami4P=%QLp zif>rNf6=dm5Dt6Y2BH{fqIN%N#2GNNmLS{a#PPDM)nscbv>JYf=a4*Ou6Yul3IDG_ z{#rgA8Dgi(GJITvJjd`cM;hdUJf}(t@c$YK^PdE*ESGN_>FWMuM3?Vo!??4)gsn}Q z3TUv6Ot>WhRpeyc96Ls&-z!(PZcw{nS*W9{Occtw4(%xP_&zLe6*LK2CU z@|x$s7}WJbzKnbG#U<4mf;FmJz0KpCyg5S_o`#R_hO`J!)y!3T+R8DA_ah+o=h9OHRkre4jt^yzl& zN}-Wlp}VzWd_>#%&Yk&%^Z;B3b505%I(?UdXd7a*iL9LVbuMT&aC@CN{TdKc*i zVeD@M+{f<<-zNcZPDfw87Dx8aTffG2xv=P6Tw@fVR$ZWip%cGK%26v#dm zr4SVsshceE)~Kkkm3w+OS$AJl`-V@;k3-rRk0(CU;JNrGZiQFuywg z8-Ww!13wTr5&h0snct0J^*MY%QJ;hJtpY}!V*B4OlE+tRM8Ha#rQS>L(-XX>`B*xO zd1bb8DY;8g1XJALJ-7AjItc_)^8b9y&xsMvZcy+BbPKg*LtM% zTTi3TdUoUU>aDvflVk{a@G7^Z9?ncakEV@4(TX93T^#2I`k96h^MSh!WGh z?M^;@H+PW;fMCUd0e98>Y8vcq=a%D;^q%I5lnYZ~2%bOB_Z}0@aI+LW=)}kR;pWte ztfARF>nJJ^jRsYN${?Z8;AzA|@1v^x1-*an6m5T5HT1mL^H;em*O;%|JwR>x`E!$ zWP)8}Iqk4^IDKo$q4pR)NnO1$QX|kVQ^>(AqA-i1umMWzL;0pxP%I+Z*fn>kVGL(< z>x%NltQcCrIDJ!Bj-i6BT&yJ|7`Cs<;O=b~F0$J^RPFIZ;jbBgvA(})Vl|sraV~*R zLMf6>nxxzu06nIP$q|mg(43fYbnAH{-R+3biTga{Ov(5TS75gW1#nCebdG$oSft=$ zT&3IsHPaOhS3Hych_wlKAf=4ZoN>_FxN$2!hgAqN?+zLhbxY;o9iUmvedmtX- zlY<$7JoYXE)J}&`SZ2bt=1|L3x{7REZ$ek#FUk-*dFsqbr4=PQoPSArgh6Yfr7GESN5GiA3-uG{602w`-i zL-ao$p`Nc5^okr$H5Tf1as#28hg!_%;Os;t73`%X3dK)Y4Q}*S@)0GZUqjHho z5Sgx)>7qu_%AMgBzia2EM-k1+A>O48Z!c$i`n0g^>(lYWVRvDkOG@8?gg6dA=Ntqs`cbFjB~v^U6(gs|^~Cb&5AW6zOe^D{(7H z$^)Ch7d_ng7a49W?D_2C_7!-Cgm<;$yD!MN6|~g*Vtuef%pLe11^KB74htRDL(WaE z9}ISNpjR)OYVaGT5~&iE$GL3JbeWqzBQ*yapC9W9X}H1jx%m0~P-w}2O9}A*tYm=y zU2^K}NbJTn8>V0Rn3L@-Mrsi`!KDi6)&#wV##PS8r+d4$ z3&Fft5SQD{sMxISY2e_s~#sLD@q~2U{8Bd(Bex!Dl-29Yw1A zU?Rr>_cEPY!uvTFFwu^4Al`VY9H7W@1$4Lf0+OKJd=lA1MWjGzwXP2z_i8YEW&10Kmp>kKi_Y- z-Yz~GhBKW=uv8*DV0WcLz^C@pQFt0QtOLPME5aQr=|-e`aO6H_Zoc?jG2w{MqVNBT zqjt%^U!Cm~zBpnlYw!_7A6tp~>8c%CA!)-!R9IVij1ANa z;%+3jtqpv#U7SUiiaJ7o*YhQmNr)Sv66u4*Z+nP%&L!bJ0nq1RZf&ehr~VM3u*Xv%0NvP#p$$y$2igf-dmDNYbp4O{s!5t$9c zjwqr<;Y0c2rX_%}IC@4oL}(W522Z`gcSWwiz)re_|JH9n$>|zbg3-t(cWBHvB5WSiT4&MRUO*yUqkwPvi4F~Vz zKwXf;8BGm6y6#r;LNJw}s43$BcoC0qoR#3SVrh44zZo9;B4cUs$~;!KQMkh4Jyz(? zGjIulX%@5yY{$C%u%eM0-dfHg4gc43aN`Mgbvb=J@24|9J^5l1pJ=IX%f#1NY8LIE zN#CH-dsFvaKsX&2P&Am4Xs~be9Mg2oH4mwHfKheU!zWwufFT3#EtZ*6aQ9UKCE^o( ziM}~dB2;Eii*!~gxQWyc)zrZrpO49r5=R^$lWv)AYCXj6SMm-hMr#t5wyhWI@JZXJ zCx1)kYmRVG_bEj;X~;7|EUCyUry#yzzFDLMM$N82nXW=k*yEN18OKK)upH|?BQ$oO zDYhKVI4T@QDP;}kMq`yBw4pHqDhPuk@z?{2TO~~IY1M3C2SDy$HxzVagaq-}IG1i1 zR4Dm%8gx3IaSCNd_N`H#3xi5BWb|4u4 zi09|U%^!6&kKv7;3+84U!vIJ=4jeJyfV9?5J|01cC9j>AJy&T28?04JTMjT9$jYr- z>RHWDHVPN}W-bGM-K{Rq7DnUpG}|npG{&3P2H_q`^eoHK=M9A6n<_P{A5YTN=91QM)GPq*|w4i;Te_R)&u*Q za6N1Pd0vKE((*Gh-zkbap!j8shTU-kv_OZg#~rg&8q=YIsRyVhM&3Ud6)OLB({v29 zsDYT_1b-f5mp2;`_+NTuibQsY)F;bQ0>lF9@fQmL3BJ*m`cOOg?nC^Aj)Lp@*t(LN zp&{0Q{ScVf!CV2~W-#Z$-3X>5rmkc$e6IqxHkP_`;;0*q4b0`6IW>MjGync?Ke?HA zzIw@Kc9C{Q&ExQ0oy%0^F`*{fs_cG(Cn5&Vm5t4c?e$W0vr1+m5+^&{rrvOyx?=#z zOQjN}Sx-T;O6~z|+H`7Qo2CeAo8BC0Q@zq`rv^6L?<37NLXI@sj9b)ZOO(}S(}HUx z1E>eY-U#-cV5-4<2&P@Jp8yktCQ6J)ZT58~qT=pW+-N2<{hN)p8N0oW;t`r|Yr=r0 z>pXg1Mj@Q+4m``n)`O;#S_u9D*`b}}%_PCUR~=Qk4B}k6AFm_9-T+w4&+kY#i#YrM zmBq!shCGq8tU^D<;@GkV5o$Voo-u{yw84q)Ovun&Pb0wx8%Cniw)bNDU?lLzj1 zz+RL<-7^xX8_nK$GPfH}jI6*(0$ezf2j%C(0ETMRTrbPT#cd}WX{~(Zv+?p{>Q>`` zhH)PG$zv*O&yS3$xBHE$J+w`6mQ@3CoGb44Q*_x=198Z}MR^sI*hqEkUzf%)e5yBH5XfXDzSWnL& zEY)@t#VDJ-eMtk_tnNeTYCW(E*^!9+g>TvDU;=2+N=P7h?t~UV)iTOAgdm>hFrjDY zq5`P4%e;{y2;VeQaDT=@Ve5hDZA%&HfdQCL@4#%M5P#1$=sS?iOOyHMFr=5@Z3l0Z z5}*aZE0WJjl>0nN@lx6Vb%#p{sAbwATJvZ*N~gP^Pq}=07=2Ue=*#G`#gE|=p_R@1 z>G<0}us6Q)67+&``W+BUaJ&AWuwfOX+OSxuNCR9X5t)5U)}wfKexme>r&; zpNtTzV>yFSdZ~S43e*NjhBQlkN2?S=YPy^PrBjKw3w9dql3rNROO|#yf5?!M<^Yh z^N~?92C_9d_sjcb8HUBUW={{pO>+scu57J_yVbMmBy|3I^p5A@s}p*5r`;iz0gj5j z^~I(4!O-aR^PSScu3T*ni~vq2Xt24o{)L?xXONGn`{Qw)P#516X*N{A!zfd@G|kPp zO{C}hZ6_UevEpT%CQC=7glC)R(^4q5PTKuC?c%jBoF@m8Eo#}JYcLLHR}N&HLo+Tj zTDq)FF5eB@^#bE?_=`H71#TV5WX+nGCrcc5AK&BSJAHhwkN>xvpJr_;9pv)d6wfC* z#lJp(p3X&(1)blG4kvUY9HV}eKTVkZ%S?DoQo0eknBVqq2w?2uA20v~6(-1hkNDPu z=Vhq?naFGmpFYFZ%R_}su4au^1H;XRzOkNFj7EybFoS1RuZB#SIO2Q7GZ$eZgtr=OfE@!1ffVCvj)PU8DGCb{J*!$Zr1yAMi5j{XC9`kE!4y}r@*RTTl=*(c zk?fbq>zd*C|ILaEX>}zq@jWz@PJD$pQ@qlmE>w5mYO_-I_vx3teX6@6~ec!~&00f?Az+ajF``?zj&S z3dNS8pF6~OE8ff!{|CU|oxBv=#s>p3v=P;^9~{GaXW(h>IWt>{XW*eL@%pA4+Wk5B zN&g@f;|9Z4gN)UB7^}Ixc88QM*gBq0N{H6vT5oEGt9t4GZjvq-3O!**9-xB!;;5-^%D4*!_pB4LplUffB&P z_~r#a_4tuV5^rXtu~0&#u^~q(h20-^Gwl#t-S5E+U)37|?0 zfF$I|i9DvGs7F}XyARd;jyvRzu^w8=a~-YipM~xwIfWBm8wF$>mY^*H6AKak{G@>t z8H#=)btj$VOGbCZpcA%#4dfJHV=|)2u(SAVW zLn1K>Fb1H`c2bJH1PZN(xND#guxKp-1k@<2+~5-3$QH?jI2MIxr%b zs>`IqIGFBGN+ewYxL1I=GX#iO$n>ewK5^32|@KKCKWe^fYK_ACW6-g2oaQ_5J5(v2#BC!mv1&BJ*-kd(zgGJ z{DIwJnK7f;()TAq|D5BJEuG#ol>S*|1hNjY&=*4vgt9^!X0<}YtX655gZ~W;v;M!P zVOEm`xJX%mj{psGq*$S0TtAhD2~iqm^?#;eijjtyMF_fLrGA#ael*NKo(i}A{TF{o z!|aO$7hk+A4fE?S!bCtJA(28K^rvC&i+~wSh{#T9eAJ*Rhy;JH5HPD00%rA3AYg92 zs1Pu@7yA=1Z$=Rw8Ay1rRY!VNnqwG5E=aE{d1FLf$y~5!f*lWL519Rm-&`de!`@KB z-iR_*CH!8nUj$Pz68yk?1;#$AKTM2s6zo;$k#w(s{Wh30VDc`L?iD57lTqn@4e`!_ zdk@$PE|U)9V7eV6Bk6{M`${lZfyr0WJv<=YP$gYLRJwSGGhr0X1Kny|bRSjhFfK+> zm}p}j{cxbfM|<=Lnm^j;hxWI_DGaptD7I?$DDAK(%KT}>{|*0NM}-r2I1p-Wf{Gw@#Kp;5~V5xsJZ4n5h2LdChe>80o2uunD zGN^wvZ4n4e4+LgV|7hAG5XcP#@~D3_Z4n6M2Lc7uKbp1(1eON^E2#fU@*@Ps9f82l z1A#lKKhPS=Z}pl$;O;=cP5tjterwmQTNend4+QR|{u_YW;CM=51OlajKw01?{eU*1 zzpW2?0)fgv!28qSAZ=1DPzoaucq9;b^fI)Cu-p_yUf_EmA}8#~*7KCKXh&fOZ$7f) zY9uWln|RfL)93N~!js!`NFHcjJQZBUSLWya9UIj(s1Uyp;leEZ=rK@Bp7GT zwA#y%8^!-Mx$)ei{mG5T9;FAvKcF?fa%)4MXVPB;SKkK~~;piX%Qyi+)Onn28 z=uYtF+O}<5Z*ALeZQHi>*0yciwr$(q+u!}~uC6LoQ`0?@Op-}Wce>~M=0p?(T_kg+ z#OI@Wix88&&VkSL$H;B`E2jdcR=eQjlGsStEdPZ=Lxu`~KFcvrO=)uL-cX2YOXR`$ z!B)K3Q%KR!992c8#uUNOAXmz2-^*OFB{cfey$yP!)4fsib)|6HYs;uIA+S##nEmIg)CHxw@aA~`gql~N;^(5SgxKl%@2PaocDLC}LpWHYk*?AHvK{VMN zyZGz?I(77Q!W=_0G!TBjLN3P0w)~ZN zkymbqCzv*`{o6+e;Fw_`R`R=!Rr`36XmhtJG2%01)MZBCX3^iEI+gVv~b8t7wjiPWW91J#Qu4q4J;};qEh{V8 zIlc&U;mTrEWf`W(SAkiG1S=~hD{I;!UxZ1jjuLZ0u?g8zY(A!grNzC4#j(QA8&qGM zu6%22adBz!u)r5(Tdf!9EI40HSzAN#G2M9&)w!C|L3x>m%-721m8#E6WmTDmno>jd z`%c9t+otP|H!CZ)r3IUUZ_+QoRd{-OM0$D^E8p2mZb|%i=SK6&qVm$>s}B~=|51-v zT4cYLfg{lx&6T-%Kyk*Y+sQ2Y55CmsT=VB&ElJ^v!+0FlgCl9f|Kz}va0~iE=_lM0 zgCm_^sh^@KBfHwIbU{SQoDP3)oX;t2oD;SVlO6P9;pmDYWj5kK{~dAVkrN!hW)v)JoqeP8Mpf+llGeq5I>3o-^+|;vI9{Dg|aEx+baB zNF;T!?k`2Xjnj*V!(cEQCn&bRDkUq(Fw1gFe>y&6|nsjg)O*AMe)sbRn%FIr2nFWl!X=g%M9FEc}4m43=zn z*24p60G$+Iz#ICFCfYM>;R2sOx+HqH-G425J)6k0ucJcwP$#;fVj?C~^^Q(QrRD^@ z=#av$TX3|8Y71SNrRoM~7qnXXfD}JrwUfnz{tK6b06_urLRqTU}>@b5k4*MoTqMYYfTZLaO~JJocM$LKu%Z;AI5%6f<9tP*tPNKl*lUXfv@ zg$fMVZaTb^rNFn!3l3CK%6FNQw6j$k+)a+4F7>rS+4EFO*Z<6k&>H(bz{b@{6R-W4 zoYM?QSFORW4*+UwQeWbsfbREUUU_2u= zimlhtbG;;yR?T8);Mbx}*^i-gT7^s*h4CMz+}i!?qo{7<T5^HGt;PyPrp97ciYR{PHLmAQ6vlGpiupHz|w^5l$& zNJ78Jqru8?6Fl| z0h&4%h&+Y{G<=P-;ZDCa-3O9G*QLWQA37fJlJzhFZ5dndKqUq8o$^KTyo@$qNMlLS zsK>(|<54ht{aL4M`h~F)h4aELeA!wI$sT9Jf_Ho1b1PTG4*FoH-bRs?nQ%fq1z)8a^ce=XdUXB+FDseP7B3ZBTV(* zM0)Bu^z+8pg&f{tJ%fpmKaOKoyJjW*I_%lz9O?3mLad&1I;*P(v&3)2s)v0|UUJLV zr0WuS3o1k9jCM3vDM@E2klQd?n$>}rZ1*H~==BCNbL%yh0R3Wnx&JfkR(e7DKF^Sz zd+&DwNJa4KO6PZSU-eTM^i$Ny62pNldS4)9!l%@O)8vCqYhso4k-o8Ol=TZ+BBlDV zUfG!9A&)Y&is9(|YN02$^sYe%{O|lJyMkmc_+RI0p;XX))j_ZK{itYO1)$Zf@>_y4 zPB}{s$lRvS+Vry>!KPb{Q5MU*Fp`->$^sFoQA(6!QPL7I@B!0sm_CJwtA|sRpNb#_ z>41qz(BC&A7+$iumhnhv&Wi@Lvg@Y>ycnn1)mM+V0fW1eyeC{7vVHf)+!>(SIATZb zgo?&4Gn%tWqN704tCVW));tRJt9`P$qM^N?7y^v(#N4{IrGtj8!fz2nu<U(V z?o;LNU7hmj)FLuMqk6@cREixZQCf^vU)SSN4pdPOXWMMDV{o7OVZuT(Fks_jBo4I$ z1Spm`^OY_TRW1aSa?uWOan{L#sy|=EC)rZK~bIQ#RTTgrIbcVgdYSz088;@S<&tMn=sZ`(~j}Pe|9*)8iPxSjm(sg z>-9czF~#9bKs%0SK8x3A?XZf@l;G>kn9hXP6YN&Ox@y6V$ds^+*o4pxMI49w_gSc` zaD3fne;7U8j?qsqQ}{wwpcYj)mGXw-;pr9nZ?qdKD=d%D1#90f!kq;KAp`-51VY@D*fMk&if5ANYw797=eUSdJ+;bGsnF z2owR`3<8&=ezfF-DX&EQ_p2D|Sj9C=igyjJjv};8om~)z-a(a&A+-9aB95IEN%g*s z()XKbCTvt618eujTPqi}#yV|~SxhMX5$+ppQxEJbbm}orz2RJ9w^Tia*8Hax;$6x6 zh_TG<$}fUvnR@hhGze{og1$u@T0LV8cPOEZwL)W_eCTSQO_tHy)lkbm!3r z1S(qPts@4dBEh>{UzI{eZf7uwnb2!#RaW+A!2PWWIP#@C`7rqAhtS5U?fO-qEj!=d zvZ+yvLu55idEB38hx&mh@A?)JPC$mPNP^v@lrHF?&3L8=OqB4JSLk2zsvsyQ;T6`TY`-%5`XcN_F*bQE z#rzoziaBYlDq^h?I2pcJ88CoqN6VBTxP?>@5Nqta^1yoOTESsyJf{+R9bS5=vqsOo z7ar`r4e@l;eZE@6x7j*@B73*PVzqyTS`(kd5V!JudOZ{AnvdFk-9~6?ZhWo+XLnv> zg`_+WatPd-uSPkd3Avan&uma`!B_D%o369Q!Ez%_|6(7Ouj@Iayv4~D$YI7y&K(7J z@}h=jYvwAX3?N73xbqsH0MKFyaQBsD9=rmFSgfFpYnHx(=xWC9d!l@DrH6>5XnQ}=d498;v$p#0&Y9WD!O zJVSA6Z0!+XRLl$e+6>I=LR4Cr#-uYhs zQJW$X^FEi*HDEA<0ZRzDm4d4uhj%v$=u6aNK>Z2@TQcPByoLfB0Sz>H#K$Kw^}f5c_UCT*=iM{kMD403=X1(7$HU`=xld1<;g#l{ z_l0l3{W}<4_kHW;rSo&V!c!L-><0m+JEq(BGiUF!riXpo%W@}Y+vjBFrn{ww7sCny z3_h2h$CxpA=W1Vy-QSrM@0?4$Pc_h{-T>4n~IP!`P1wCv&57e;MU!;N(8i0#9Q^ssQgAq^0GrYr(f zgGfBLG=KOt&!BE$h&`2}{8 zb5GJ-XVrD8QJim;B7c*uN^g7kbiZJbsLm{nEkz<9rh&H#5T8$Zb8;#!&pCIAk=`(72h*@6IOy;Ir7uM7Cm25K zo6-bbIn)S=rftdjI_hMHB8{9fD+aT??gFET2c&ae3zk{b0`i*^%GoYhIG8k~M~qmq zq$`;kvV>Yzb+}w%ftjof8pEF@^EmBZ!ggz<+v=LN8|Uz;K6ID8T?NvcvA7f8KeME< zq%YWVZ$|@g5D-b@UGO%16^Q07Indm((8=>%m zjZaeGTwaH8$lUfQnO$DnH2O4B^4wwA*5Yk)lzz~-;oa~i%`xw{&bIzDZ*=O@6&)b@ zY9j<^&$1-B!(xxQ`tF|9ne`s0!x7V<-O@e%o8lH@&cr3ArOve9Yc0iYfo;2-gXv%| zeo%ZZD)q4(sooU-hiV#@QtnBMr4vt=DSd&><|>l!XO|Yc!}j03j$F=SvvD$O!$IuB zg(REoiAfh;!xPbRO2^()Yjpd{lOzKBT#s^xf-d3NVyh_K6B;Xn!pg9!HYj$Ggmv_? zIqnC;=f&T`IKHFD1z{JR{kr+I{!ObXso4%=-sZi+v4^BH()pFWz&o#@+MDGI_*W%) z;+!3TX|R7|X+B}z6n^zs>r{o0XH`e-=fgoB)yigB9_tQP^B>s{>k+Ys`4P}}H~Q4c zgOCe8$f>cK9}E@OboieynQWVUEOpr{A52qUUicghoq`ecz9WwR+_nGShZgLp_iT(N z7G^X-g16<}JP~>NBnYr=jy}1)6NKE#NH_~leBB9V?y^8orwuzs)9tBd+0_V82#9h` z)CHm0c=h?vh!3^B%7iCBpR*B0CW>8lQcOr8|EMBH(BGu43kErOc8gkbqzRU}N5ol* zPcoAnVBphd6Gu9#P zLJjX!26G3+geY-QZqL(Ue38tsBDk;^eL=IYISK=7A2vBr%z1n*dOlH9z_Hy*S+c#Wnf#a069I7IMggIs2cX9=PHGq1(r)6f&j%6Y77w|P3RU=;S z*pR42?2*3VCaq%bVe+9irAmZ zF-G%+R9{UkG~jXq3?4^F?gdF3)i*5PdXH$Ry_5e9dQA4aqdci)l>leb&Z~4hE?FmN zu8p(nZ>9|K&^$u!I5(+n8RG$K*94(6Nl*)spMDE+*r4A>anJ;F1Mi=5w|d%zLG1v| z_NdS^$4Vr+yI6$I_Ng`jbRtBwKPRO}pNgEzH!X8VRSB~8=aHM6BH)PX2j_WIxl2C* zIclETm(x+mv@YG!MIa$(t^yKoKUWY2AB-&VtaBN2Qbx*`&gDCz7@*xpT9%Uy?zUdAbg2dn1>K!(*7enEe%2meLJk=F^zWp^ z_JT?ZUyTRc{moKl?Zf7Ed`^u=r(TO(zGvpY^3?xCBx0!_%*B3U6-rMEgP@Tes8u35}&EUt}7gPhS=w0odtj(BdA#9yST297QV3~$*p5g@G8}8%4zHJ;lq!z`{8`_ z?PIv1XAT;dvOPs*2XD~*D@E_oAs32YqTO`STLHV_JG1CLd(kf)b^RofD@1n#X$=J# zXd}NCiv8cukd*^=obVln+wYUl7*QW37&2$U0$pwv8y2v=ZQ4yTOzQxq_Ob?ZW+1|9 zQ$2u)MI#u9&A!4f2tp*>FriR2{qm=AGsPL<>#(eE2OYB4f4Ld@+MNJFwp8IQ{S`N& z2s1%ws=lxlNR8OQn)+WQgb?B*u@1U`WzS>xs&RG!TF&{g zn)OAQEBH>Q$&^8WF0+w3Lx z(jFN9I_@P`$Z$^^tcKpl)@P)%YjUH)Pm$(FTSuCfMv3^RKO`XQ-Mr?HAIw|ZC;@>WKEDt#wP{hC2LG97iGy*O$1gXyL5Q`!Bk zP05x~R9^ZncX6@vZ~pniaL5qq29vM0;HI81=RM)#r>U^DwvhZh%*|HDiAEFN$k*z# zB5h3JN(>CV@bNK32GViv)D_0Jh*Si5Xv5oJ<3=`f8eSe}mGM@80FLo|-&;YQ;IZ@H zUgumVx1JD}qL!+HD)*CJC`4YM%*~6&kR*d*&eY9Q*UHm&_lwKmH4KiR&ksMTW~a#D z;)%kIdnjQea$vpdtx=*j#gYEShl!8gZEvWT@gcZ*#EihFnlja<%&c|Yyi{I)^nU z%_z6XR29k6zcjD=v1j%|Ek^V|`^X}Pq+*?wEjCdpNz_vR{|sqA=dV|P!U z7Y8>-wr=fk&ryPeT8Ti()z=|qX*)c4gF| zyx@95$9@x9kEySJXc!&v}c!~eaozHc7!zN&mUlGbd*S) z(u}aXTyD?#zq&o>z~3B&;6O~Cudh4T+LjiJbIvx|&Maq-aToJ={#sNi?56R2brmK0 z=P*$jhq2p^we-a&u9)PqI6geM1z%fnz?+rZ)+-0^Nzo6r|74{(XYB^}TX4SrMBQ9{ zsNA3#Jx^yG8GmeV)w~16p%LP&ypZZXV-$aqY{^p{!vv3;+gRFqS-ZyVQq!7&gFHDFZYKcU zcb1bW&i4eb{?mr3aJhNotPRe$YI%a{D};oLKUW{>#@*kv^@32*(R{s%J@0&Vb$%m1 zq8PPaTK%jo#1~R`EB?L&9_)JC#dH2AzZ>UV4-))|@RORjbjkOx%fl~y1#%U#tJ+ux zIAQt8{mOk;PA(>H-c!JhzxBDz`V)P9keNM^CpqQItn@~1 zG#k)brPz3sFzh&gcKBLLB-C%pAl2&sm^_9x2|VI>NPFvP;TXXI-R&Fh9BT`W2+h5$ zU#AX+120^L9$yj}Rv02t;P-=g_$P zVtGq;QcC?2MUnlu>XD&uIQzUqbpP>iOJHS??DRJ_1L~R3u;HTq7Ylk$%|0nY>I;f) zEp1t;(y(?K&JP>KMHCIkoD#+I2<%+WNu1{{(}{(|u7K)GT-ymkW)eU-=w`^kFYy6PE#i)h5 zfvlZVdW9s)Hhv5iu2?R0|H5&U(~CBPdefQSI}}>%U@vtbJ%zwT)-1PaF&k!LB`YTU zv{Tx%F!tH~7m+0VQ|nfs zqf?|yeQnohX~%fIHtxy|yg2jW;MV?>VCOY~$q^E+Bi#$ZG{rbyL=3nXp>6nQKiOL< zH#je-4!(gpJU4z!3Xp|f5C$yu-aJ2=%WBv0M$qprnB_oLJyLa$a(+m0@PocJ0yuTt)_qp7XVgz+#z{U50#KB4WA=7|O<)V5;bZ__{@Y=z^_;VvgftC>|b=!MDQ zZnQAq=j^KY+VgS1g-nU<_+JRHQ2;LKA)0|*^fv6O+@h_5c7rHK+k>O~qcFf8`v2ue zEd`zE8`y=s1#(060&wyF+U39i^A+`%5`Yp1ch{q91*QRe31o$9g5`lSK=$E-x(4=< z2ZQQGiGwk^rCrX0mv6@92FC-H^2bjMOd~*z0u(}7YEEL>6p82=wSA!$RufFOet9py zn#R-_LbrPlHxV>-ToN`T50W}={fuZC*YSTa#hk!;45T1#p&)18xTvPQ_r$G!bK;eh zRr_qXk}c^7D2F)f_nQc={Jj5@2<2PXwOJMy&D06SJ#k0P+OS180yHG0n_v+TEz@#j zR6NUBUIkOKb)qywwk{DIp;Y&gNc8i$CRs!*A2>tG;n;1#u%NAQWJmQ@ovGzI6kzV` zGbE;5xq>!-)L|m++CFh5n_h5~XEUUOygZU;b48OfW9w>fX=-U)!l{*n`K@`*S*DX8 zYW^Gm^q3HTcI%$`+|KO@+vpp*@+>)rkQuP|PqGWHCtmxYsm-n$_w9$d@lqcb!+~Kbfk0#X4W?!WyH4i;%tM~U>#EfZ9&2ChS zAlo9-Ugibqs$x=`&5D=Vu@on-ia&gMV%h7bj%!wNX{c6FG4$^r;zS!Vo64=G&R_rRY7ol7h?xz_*Y<0d%`REBtzOM-FwF!k!VI1H z!zU%@&IFDf*VM-&Nv6z8dRID9ZC1;7Li^XVP!jJx>Gz&Ojz6vkT5P*n)3|d{rw*as zK4N%|uHoc50Usxbu}ZO*pJCw@tib-ex=rl3+8(!RX&IjWGNT@+S|kIoM!Ql)MWg+Tsx&K*;jjf?;%2@lz&U2L8lt*XI5{?QMnl5Ky95HQ++J(Als}r zjbtTOS}a|kYRFM#p|Mc*OZ}Oeh8vpF=)J$9g#z=Dr#jiJIJLT zEJc5-n?2`QK(CHO=km}Nw&|Tnkfcw@ogy@Bs7=~WPUc9=9l1K)A^*b_$W*H+5r!LvHvX4NeeRAQOahnP? zgyF5zZdtp`Ii8g#J~q1_VGT=YHiV&Lr|3S7ejy>O+=Yv%V)3q|W~Y%|=q@^0W-R-m{CnuZtWfa+uoMpqAq0=wkatbX*Ssj3m~ zjj+B-bJTv7)E47Vv-LL=v!8fcO8GF2m~!CkxsOqeRP;+!>YtJV_o?gB&b|c>)zG!n zs0K8u4uDyEk^0>-ht?j^QnF$PFgkjT-NwOUGOAnr=!%Fv(Hz!gBC5zk1ersOhmZft zUWldhxr#!@UyrLcO%!1+-O$xQQR$P>&Vjsd<;5#dT18^ijCN2-V^wRBrmf(mkJd0O zSL5EYCqPL&q?2{;ZP>i{u-Fe+noslh3A0|uto=lPwGyF*@lnt5`=$2~o1^1KU zwR5S7oGIA#@NmtN56=0feqG#HP#=2MQYKq2jY2Jw~bvlSP#vR00n5zyW%wAC&;RwQkKQfI^oQ53T^KX7n2%7My~mO)t&Sg`|=B52=1 zhkK-aJ(60W*>NTrhv9o}NS^s9fwYN_r3&`^m&|!cu-SdgBGy<(cA8GRG_t5?4<+aq z667Fs}h-9_!Av$`%a|sJqCAx(}FGSFWGHxzF>Tt=*pX6*YBv z=q#uah#ym56aOjXUZFlTm^i-c*TI>#p>cKEpwly*e-6Sur0gUpNqR0>nj3+6J6Q1i z5)G)5S@X%dLP$iT=eH#zfv@MulyuOXmq^6aRVn6e?G11#M}hw9S9IRn6yM-QA=mNbqQI$FzB@H15N*kdAZI1UP`=zc`Y9TBa&AM7706b zkosp{IBlFJ6~@DKqcwwqh;^NU)Unc+Gg-+(UBN(4t@fj3N9yY{`a(hH6|xWdfRijz zD(H`js+hfTQ(8WOphiQn#K|1)Xahx|qk?8hdvkYu(I9Ci3Tc_YU|)<{Vc*I|tv!ik z3)<99zhtc6E4h+-;nx)jW2$Z*(5FdRgl#Fd#`3UsdN83*%$2a=65gjuDZ~7sQ+~Z9 zLrZfs(=hy;IFFIMG)BSQ&gBFLpC|v1wP8>**S1mi9Xgw%|EDi&nIRsGU!<6qV$2OmNFr^t}en!WZDJf;O=m z?8rCxKnaZs_$e2egvUA$NFIKje~p>r8?7Byd?%RY6yzyV;n^pXk2IpaFQ`mm@dx3t zC&&iZDlkBG6u#h-814KA*XtcNMsB|oI)9WI?T9bLHYb;x0$8^T;Dh72;gfQDpbqwA z))ejDE7E}@*}slnFxHS<{2j=SH|0VAD-jT0z7;1Xi=YdAcQw{wOMHQMG#7v+PYW{! zZx%M5zyH*%{6=Y_X@3sI3_oZ9L@WXxHYpUX=XtOt;+KiTBbQ z^lxrA{<}~qd}Dx3sIWw+LiU3~%yU1RI5_fiuIwz#IzPGDjp%l&**RDhy08-YdmW7N zg#h*G$wMABz!O2%$D18WQx3MwOD3h#H7k=07Wu-%SKuQ5Uyu$QY>XR7jDdhq8bNJ` zDrrV@rmbK@^qBb}rXiVlbCU>ZY|$|kFRl&1=iZX%P>2L z8&W>_LQqaGfik(y2nKM4@G2U|1Y+NQvkWv8QsQV@>01+Ythz<2{?*` zEZPL1_FP{GMte94a1iZhhP3Y>L-tfe`h^`kpE=<)o8ddlL+?}qLupbA9a4oKV08pO z5$}$Ipsmo@!Px*}#^UyQh2|?9yKLbfzMm#e#8_4{^3+~2^!=rxachp|hD%lBdjd3p zwXE{ZSVOLq-=J7eJ)gmsCd$_U>JGhvH}<|A&;IG3K``<4s3&p+8Dun|Rf-QGmZI3e zs*U_HV9zO6;-4e4bwA6MNIm3LFkawLKjUC&Q-3LbwpKJ0;6Jzi99s*=;~m2!1VqvedN121n0bI z(_ja^u)AdPfakpywQ$_<+W>!h1rSz1dV1X$Ko9*TYauFuF8Xx)I`rr{V8FKM7uxiI zMgfZW0iE?w)uFRNadV*`0|p4}lcdoDFM4V0nE!LJ;Qg9*NpHzcfx!J5HH#7Ta7IB| zfcew`e@EIUddvHYg99pr7e@)H1%1yCdK;Lui+JmK%k)aU3exN!+b2N4YS;yS5@^56 z#eka#0QxEbtPYC@C>O{VFs1kBw=+;OxUnRF;qM4BCqdW)nHcch_;J;tRQ*Hykat0E zvE0y|{AYRvZgDvdOfd}Y7*hd?1FYiUZ2(bwK?C$a-5|IDb%1IDWoyAN!AE*A`BHw9 zX(3ZViUa@hliK-f*1}YRS@zoYO63Au0ptJrkQ5k?&{3$Z2wI@U0UEtv$AI7vexAJ! zwNRfxmB7}!&b7E+aA5qCLQGkZbN~l^PXyQ~0d2c*2p|)^fqJ-ZXq`aYAUA-4*zKL(n>a8T{m{pdNkt2u)yjz{7rZ1h7W_L=5mW00OfB>3xQ~n73lHaNA(` zep$PgdhQ_hu)}_LdQ7Q+R=GH>eMENn>cH6`z5q3WFTG;BQn#>i_(PfybU zn96|w>R>)#KCs!qzJPywclt(h@o~WIX;0Z1@T5UBc1`3#JM|#dL9;<>95l|j%@bKP zJ)}KChG$jV{d`2|=L1>Nrwbm=5VaU=6X%QaoDiqt*$$L8StzAE0@!Bd3Z;rB3Z)7o ziy{k+&Q=yB=@)<>S$OEGQZ$QnB`ykerKaY=&IHcb=M(0U=MNHvFU|zHGUCq++M`4j zB3Yv7O2mrlP~=kPNfY^r&!p2uiOslSOSB{la~9ejktGZ4o#3)W{!%E#pAtsoW7NyD zd=G^)2tX_8dMt4hhtf6aHzJCq4%l4(v>>`J>{}H0DEAKC z#s4E>J16xz`6J~KA!){#H0SLE{&x14OH%9<#9JuzRM#mL>=eUWW@pa6J(*0A>Wf__ z-_;CATZYmJR$Js|erHrt=?u&xXTB_h8hBHyXx8%yGAfq(SMUn9;mwUVfh$??=Q3QYfX&&W_ zQ&UW4QT%1z;XOii-bYhVs?0xm4vLFkcOG+|fKoIf!N@#}L;{UcG9npFieyOAREoH8 zZ@z6_W1e%Kfl@~@ZaNXEC~sceyx0kzN22bLx!*%T$c$lVj=E8Gd}gYCJ)%i&aUmiC z`s7Z=#-5s-#Jr~uf_jiPBM#-A5lrUct?M%(9Lc^Tgefy(D+BTNjrq!_<69+6umi+2)_?m#ujJu$aV~pI#euC*(NW-;Lf$;A+oO(P`yW3*Usiv&; zykZp`wWoEWm#0`bo2>14b*brMn!z>V+)u%sJ>3C8r`!&XNMU75VHZ4kHm+yi=PhU@ zKSXlP>hA%YovfSG-D+F(%;mMupj|ZkR*87ck08AZOz~MU(qCU0&p6DXe$6Q38rHE%{{`>{a4$kA9?Y?O)K3e@j&| zdfUzuv7(!Db(AxnscFp}=_@3Ex$F}Rkk+*rB^GwsC_#7~mtDzKhO@(Iit3AqZEta^ zMtkl$w6BASK2yWwl#e%B9JZLWC&_r{ac- zm;Jeu;tv*5|5}1>GG?XJF@!^yK?4!pyq&3NNmI4c8>5_Rxs+657Ws-Q9W62KP`+~| za_)t5E@~_*TP!i1bqv=^B~yMI#9n4io-zoudqR&S$aQC}B2IPd`A~sS8j*Jg>Yw0E zt4tL=MHz8hf4WGwruD2e81($5@z36x`n|6xB83PJ?&_D#@m~+jq>2`zrp!R3>?_UH zN6?LeSxKhRQeuU-tC7x#b@ixw|3p&jwMw7AJ6y^Pex8E^a5R^zOyTqmn_2y_krC?Q zq49~Bdem&rJ4nKnT}W8~W|4auV)HrGkZ}=5>!5!6#?@h@y=a!g zzO|o(DwQP?L*|V+&7vl8OBvBDHV5%i!xRPd zaY4Z2U@qim-xt65`Ad9zCV;Q${l;OlHs;i~WF;iJ1FORrafbwJA>DlxA&Dvv6Qu+BGT9GyPA5^*{otmVN zO|b-Kn1it|z}OTAhpNb2*c4-KNi(XmNx8fVLqB+V=%)!}M06v=y<5kt34vOn1l zE?d${dZt)@tdBwYkyX^JhmU$qwBW6VLHkU!5Uq+y`%E;!tcsm`O>`ivhLe5^D68V8 z-vY*Jc!?ifF)E<0T`(ce1VNAvdj&khT&6Y+9W=vUr8X@EG{ao`w+5DBZ(NI+0;bKN zs%C~X4aF|!l_&b_GqHeEP1i z2_%7Nyot4vIqAsZi-MgnUu%u&wMDC`;h;TP&qLTpvC5((*G9Yct>hxW*fsdd#iyPv zwbs+R7P|Ic|O$U9ak_wT(YnCfWz7t@ZM$f&Dw0@}(v1x*DnBDO;x}k`CNl)*JgR z&R3@|m)cey3R=vUXs+Hz_>rj!_%)d2YX(vgV*S}7W)boN%omF97E_5p-V77SK(rB& zsOHsQy-&PWx>sEAdJ#SbUJg@kGH)_JwjSDdIJ;jmZ`x;;W0^-{1!F(K?=OxE;v9`Y zInQXWZ#q(Xe$Wv476`saNvX)`8 z2-|8_@#PAYJ{%?5WQDF_A1^c+YfQKHIO0bRW%XrjtQYza^xU}Hhv;UWLc zMJTE|wfY(@qMt>=8Y8)P<;tNLp3ghswv|QglvjijgSyMMD@&h;h{iHJDk?l@sKIHm z%!krr{go~6ex4~B{<`=XO8IE%R$ef!a+9hQ6YjltAuF0Fj6DDLa z-!KXGh!{&beB;nH6py3DD=dk{2L|rd$*nJ_VaG_kpY@xDJ)6@KRf5G7@)`m_1gf*s z;p0W6O&c_Q}d^Ny$&!^ZwkU z6Qd=^fbk6aAu9S_9v_^*uFSL3*COF^y9DNhh>MAFegS)lUk~YWUmlS4S*}N}3yCL# z=9t8Fv{l*kroje#V!h@@_fvn@+>U{SkE-uJ@=y0IjQGU5ckL!AI*rGoX0FY7nnx^< zh_rqmBL`dLy)+D32Bnam^gdu2Wuc3k(jBqwy*0f#-Qeg!Xjc}hOt5z*4EgdUlEvU& zJO`=JR#bp_U&k(qcMD!af|4A%n`{P(fR1heGFdHgh4X&_i$HY0DrKbM*F{OnAf2Nl zrR?U8JgjzI`+4^K{=4}ZsmV`2{2E__j)Xp$DB8v}Ybj(jol24Y5Jz~_(hCl5SlP2$ zHf~hfh}-M8e;+Pcm%=(h`;_x60~FVvsGaQh`=EkH^U#g<7fEC36y?(Oy(txjw#?|qC;~Kr?%hvMyGg_vQPN7Sl z-0s zn^yVCa8mk)#|t`bBe(d&S;eoUx0dLtb8I0R|8jXfp;mbF*n2NsY%-UZ)jAqV6{UR& zO;ghW-wJW)*(Xsla$cYt<@1P6<~V)+I-cEiqfSoA{5j=$-e!5;w_RTMe<|&h4M3BGe_m24K%jOApEh$-lR6l7$?xYU0^ z^t%C`7dmCvh67SllE#>TeoaVS8{HGZ|R-dJROkNpftK1 z+iY_p(FGS<<@bT5PeN=<##bNhRW=L18+ZC2KJLjb}7Cgz~ z8qG&K(VGrod?Y=JyD|7 z;i_H==$%P9$4H@9b|I9NE$10GjnW1D{sP=S(-8D~8tA#zIb!yFsOI_HjbC`5J={7m zsVA*K%Vx1{)HDu!(KOyTujo_fo#DTnSGbk^#Iwg+zvm@&t^N#VT}!LnU_W<*5J%2T zo!QF#$N#A4rLQY``fH1C%02PZGm<`m^gk^xl$SA=El$71d+3=yy~gxDrawUXUzo3& zw~5!x*Ue8aFMs-y^xbnKuyA<6Eyfn^TkzJW|II6ZSo{Zm?@jZW9bDz~+^%g_KG**t zC_Qg|7?i3m4NA#A3Hol(4WRUV>h+sujaxvU0o_9Lc2H{680c-F+d$tB`sekt#s@%u z21=g?c?y)~5p$q4X*&-}m3a=78f^yj+Kz2?(q~|HfNr8b=u+j{0!kJSIzZ_oBO6?*d~KlAPOYHyrM)-XXN{Zb z`6K9isa)-UdFTI5$;W5s%Lai)hFZ6y z;@oR+gXlLaxw8$NGsS6}Ten7MKmUx)wXD%u=enEAP%3(4Gmis=8<>)16Vhd*AKxYC zZbG#4dlJ%#ZA{ylx;XA;Tij+om*^&z+rd22m+xV;@bf$3@8YnJ!+s8j`J4#zqfAFx z{vp10mid!B_sIdItMi=K^_+f&^L(1=8IFID8<9%rstP>cns)iYi(;Ih}I1X+(50eYF+9=B8T)3(K%!F zadcd@y(IPfg+0`MB}C&2X;)A%5; z8`uZj2k5|OfX@Nn0j>ZGz*S)5qo#2S&LTp0VX&Hr#L|@hAONRyI@)c1nX`LI3U2gb*Ui2 z@q!8t$D}F@h*lHV5qt=)PM_uIP1Oh-Z*g*Q%+CM?soU+`doc8^X5Ix zn>+V@BYEDa*aJl=N>PeZl%f=+C`BnsQHoNOq7|{t!{qoNP)6#cAdg|Aj?w*#uXIi>rT6*iW^u5#4_f1Qq^*Cr<4O%~GE@y=|E18&_ zMC)Wwd%U2N$5`uGHcw7YqBT3{TsJ6ML>OIaUB^4iTH}ZCut%$$N8dAAzw*a^@o8$U zP*IBVr^>jqs~L^qJm4I_L5%$v`w%(^A_4e47|1b{hcVg(XoK=jgplt*2=!ZWc@QDg z58&fod|bulBF?jb#{yPitOT45=*Cz9cpO}>93hZzc~-j$fOg1_&$HS) zHqUD3C_*?sGS9l7EXFjhm&ElF2*Fun2wmW(_`Eh;zZGK(uGfU~AzZ%^@OY>nL!R_7*0iJXwjLVnD6lYl>b;cdmTKf@)RX&XKLx2I`v8=;d z%b&*iBt|sO%r)~43wr>60PhzATnpHR5sf!gj>g*=i2ocGwgX;5SmO&J8eeEFX~bb+ z7?4Fgi?I>6qaF}(Yycw~f2bUdyR!lP4hyUCaUVu6AbKuc#8?G*HMGm^u=?AD(TU5^ zxI;W|cUU-4+SQEKz!os(uzf~Lt@h?H4wYJV7%a7pX93Z(02z#_Qp?_bfSaHndjVIY z{=*o@XsLyfQfnMG;d}$mci{2aj?t1i<`ig-)8Y8`$iK+;m%>4IvnAiNUhOFQ zIn4C&(^@$9sMb2Cl^kbxIGy%mZ73ofXWsK1bHX;;taGyY>M~zXFkg?GcCHzHh~v#y z6d?&>o_TcPQSVrKRLPv9`WJBlc$@RTx5wt2Em`m_7PNg!`Ki;&!y#)d&?{Pv7qd$xL|^pU@)e)p#EMAn4P`=Rm(ey#qH!f?foAL&@Ri z$%M5wz1jM#K=gsW3Hmu2QBe16(3K_Vm({KF8W(gm2SFP^>p|;4Ye55`eo!B%3QB@{ zKr29eWZ&$pQ|21ypuv6A?A>QAr?eSX94!fVczyAUZ(ihek3IBsXj#uMU;g=Z z-t3wKOFla3?u!@gyWP9tfxY)HpL^_G-+%HU@7KFxzE3tUxM%ZizxM7@-|Bv2@`6)a zUVPL0!`->|--TZ}|C#%G&Pm;I{bgrJcYPJgwVs=L_wM(;{`vlWKYr|zBE7~ zzkhaQ^HN`>^TfvrPdGn(IsJ`q-}b>TzS{Tx-`srv8!Ofg{L9w4-A}|8eYowsvUMjq zHg3Li^C-O$M4-1 zLN5hlb%XNn7vJ^ZjSFu7gYnXvRqGagPLcYlz2MxoYjx!G8I*_AK+c*m;N1?EUoYyJkOs z?;R)X_Zc4J(cejrp79?)>G^Bp*2KdjsfO0`vhQA|Uvtasfzt!cw@+@}tZn^9UUc&{ zOO{jp3H7v}?h$W0|G^}2V6QUVR%>6pBmd!@-Nz`qBP-55Zs$L46y7;YW;Rs(=Ja>y zPcP_LEp`9>^Zi%++oQL2Kk_vFLGY>h+b{iv@5)~}tCn0aawgASyy}V9uU~S{m9}{Q zdoSL)Kfn8whko0(`iiaUuA1Bbs{Eo0*ZttY?e{!6J9_K#p}Px*xv0PGCz(x zVRDf_hA^M%KJ>Wh)Uy^IJQlCC(0h-CZ7*5)w*?c!k+aN)oU;qAF)_0DK@-=#_8LO> z)v;OV(dhi9Y60OR(UWcf^nTPuJ_6WrN;>s6AiMMr*E^OI;hgZJm(E#E#D?y;g59*7 z$Xs;o4KF;toY1z`kJP@u+}r+i%gIlk;H&xl2XBv@bfNFww^q)6V=U}DtX)LT2>tLd z_Y6<|CU8-?4tfjxz65tSj?=#V>bsF8cER0|%cnIc8l;=-~M!E@JDI+nS$? zKGOUm=$_U8drue^r6@%yN>PeZl%o94OY>ww!_y-3-!J8Oe~0Picz?^I%F#D1XrIb@ z_Z-4E!#`nsv(UF!mlLaqtKoG8ajCic*~R9*F=(Hc^B|4nIot356J4*;{7=qf^QX|5 z`b-ahM_xW&g3g%QHSR{@TDaPE=FTu^2c-1`+Tby4*0J`al1yAdpceUwg;2g6>fAtt z%$@gsbl5(3E6rW$(4I(t2f7~K!)?~S32LL)wNNs(?-2_#?UIA{aYqb~pPfyN6xKE#^++HgUIbo4MWGtK1%LHebrm=P&24;@9%s{Nwx%exa~f zI89hDTrX@8b_&l5F9=@>`-Kvb7Zvdw@lJ7zxK->H9~XCsyTw<tjWKJhbgwp1$3 zmzGM)BuZK@T`z5rx~0dZ9nzQ5eyK!0PrgvTM1Da2nf$Q)w)~F#zPwafrclaF%A?AF z@`ZAWx=Fo7-K_3ZpH*K_zf||DB^s|O+Bw=L?G|mbwo`jndqMkB+pm@Am*{uuAM5+{ z*+!|c)L3S0GHx+;8qXT&ON`Jgf|yN~l1s^D*+1@Q}n;mHYP1(gsdrI;<#84?UF+(mntN;Nt9G6D21dZsYQxNZBo0` zA$3Y!Qe5hh5>l^}l=`K#l#zy{VJRn#N#hbB+hn`!ke#wiE|)80x9pKaa*Nz5hvjy; zLypRwa!iiP3AtD9laq2zF35ypQ|wB)QlYpNQehRZ;!~;>zfz+Flv<@usaG15u+pJ) zDqTuUi7P!yuhOR^l??QKR>>(N%9t{)6qE^tP;IJRb*N6&rHX2`TB8QkTD4AXP=jhn zZBbj*u-c(U)lRiXO{hsVrS_|7HKPuwS#?kyQis(swV+O@PR*s2Yn57+CTgnY)qGmD z=GSVpfL5#3X(6peYt=fmsMe|VXbCN;rL=x6t!1>Uef^?G}vXZPqKZ8Pwq)OJ1wPYO`BAdt- zvW;vfJIO9GM#jk=GC}r|ePohMk!dnR=Ewr+rYfl_%1imEYO0p1qw1*!DoBN>CaQ&M zrNUH%YNOhz4k}7@Qe9Mxic>vQ0xfc@A&9yXg6QC*d?(+<$M`tk!zcJ&zK>7xDZZai z^BI1CAL57k96!S6c|x!WcEKSy1(#4RR0wXtBUB1i0x7V9D5yfU;1_CyfKV&c3H3sQ z5EL4PkkBNw2(3a`hzMyRCyt1DaTJewLb6GAJnqqm_ewsgTJlRZQb4Me>ZE$9L23jK z2*c=)!D!D;8|wuLjr6HeUMW|}q|C~qtjb=wTK3B|azL(?>*RX5K@Q4|;0H}|tzKtZ zJ*2nj9ePxc>2a`eULVuP!OC{S0aivfo^Ic2!w)tNfPF(olhJ0hgN2cOr`tAT41j$H zjU3pwU`!zU)UHo=>iKQ+akMqNgr8F`oX>d)51a1#>m1QrhTVu+izNTfXtGE zU}1u?Qx3{WxhW6WTBKBL?HbeGmZg!6r`xxe>Z6iWipo$~YLLoPqtqBh&^FphyXbPd zf_Bp$x{|JD128872wYMDBwo(VBcOqhu|e5H}WAq%t!b(zMV(D(_?xJ@{}z0lTm(*9|vzizGC?Z@(!=y1Mfh-VfjRx&@OZe zT|!KV3q3+Y=oR{eq>uuBDF_pS#V?3iL{SB1@rl)L7G0Gt3l<7V; zfxXNjIVG3rYhKgGkZ%QnSz5unrr0HF@=NR>!}J5Y41m9lNO|zL3F$~~L0(sFdYa{7 zVL5_Xrpx4+9?UfTa#kLahk$ICO2yqXJLo@MDRv(1;G;Fd^ULQ5%6k%=_i{@r+ z2RZ%l-cHIX=<&3ikq4mP2XW7j$a#4b_x}WD{pnViiT8s_qY_e@utg$Do6>ID<nS5+a4|f zzT0PdZ$FpjGTZ?6;$bewjhMbX#*Lf)926VzjI0$rCt}UZzN6Qy`OOUX17n5IY}%3I z1{6 zRx`S{vF$TP_#~TxD4#ate3l(#huC3=_jz`d9b?BK<`bNan*;MXve9cBl^I+r>X-)_!>RszyYrXGU@47@T(J?XP+LRgBLKPs}p{7W=CCN1;hswBwWJJ+Os`FiYZ|zxT&kWA=oSx^*U;gksv-j-%d%xe$ zXT58^c)HUXe)3spBmMUR`QQ7sn0HSrf3w|C&-b5i|D(z;Z)1RR<#kd zxg*S*UjH2nQ|Gy;mgVQqrUepc$i>E(#gW|=Mdhe1S{zAUVESERntT4&EogvV7Y`0w z;20$Qgs80?%?d*ueGGPZ$|@**y|yN{8r2v>-Q5r7I5^ngBkVCzTYOQl$Mf4{wtWyr zd92`shhc^~Kfh%bcl(E2w6q&?mCEk5ZcVqKhViVWlY4L2PWuJ@CFH1M!X7i#ebG&i zYOCjs#&gze_n>>kJr;IX*v%YxtM^<8DNQ_o4H-^;hrO`Rx{)66oql1f9Zp7&F=6wW z8r5&}I?yiiC0zF)IYN$+6XX<}=p3x5bl8h3%h$>^!*R*8*jR9vxORZW9l)kbNrbW-jO`&B`mrAj!Ugab-A;5-NXxeVYZfKdNq{jHRwT>(k*&z*nf{PX6Y zHUFIXXUsoe{@L=+m4BxE^W>i;{~Y;e$Ui^++40Yfe`fsi;-3}&oLsm=kas@(v*DkM z!dN9jD(5-n1n4BfB+-c^I*&xBkr0bSNW{+_5$ed#9K}l<5#Gp88~IryLKu zdA;Mcj@LO}<9L1JwT;&`UekCzb0oA&x>X7tEQNmY+9lF0kruhM4)HfgLH)te7j4iJ zeb5gh&1ce|afic*gq^zOWoFI0GXIShxcfZ9sniDcXJt zbD!*d)>H8U-^pt`o!~f+M#&1l)r4{)zs=l)oVXL&(8s{sX9u6Hk@9kSVO;KQ3JpdN zT&%d4RJ*uXH}K5hoKvs~T)qbsYyp2bfD|Kj3l!u4c@3a_5!`=q)PH%*|K|~Z@$r7~ z(|)7_ijVXo9Z)po7tQ!Z6TWx&jF*9%wC!3|eXqWh?Ps~HG>_#~c^%%2KgJguOO3PU zS4fVZy~A&AhzUObw_4qz?!?b2t5wmi(;91?wPY<7JU3pOq-AL9v~A$`lc4t)kb7ml zhF({1q|4y-=3w==`f6>dbI97wzMaP&df%Rnl z*+BLrn&btR&gQWNNZu^=0b3vJjc<{&rFeO?MJ-+*E#aae5_mh_jgRJY`4YaAuRt4Y z;h*z8d_Vt|e~&IW%j1lAqrTD5Pz(WHY;7bONk%VYfbod&IMRB&vC7zN{A|RT^^nI+ z%$8-n)kC7ug zT<;Jf?@Xfdgd!W7ke*~3S%_7iLu|PfR%|!9r#w`iC%+@F#Twj$b$3dRRca`;u)-QE zEwQ4yE8~<|STUa}KPy+$>*;N@1$~KT&`kOhjZ^EYR5jI9^#%27kbkW9lJ=^$TFb$= zT>+dio2_BhjaxzFrqLK(d$)0q(bY&c#uT)-$gmAE}AFJDj&R`FGhONd#;gmCKHh(KgnH`WUTrD%0gPaX8V;< zP@5hWWvymbf2*FIV9!U-wD8_no6!2HD(_MTs0*}5*mZmmzg8%syLen25VfsjG~*tt zs@=>@4&JvGBY8)44N)4PX%p>U-V?nK$4C?KPlKqOeLyAJr~3EdbPR~S2{%=pslKirR&&%J)$&>$O##i`2VY#MEzwqJambGZ{dLglDZLz1 zSu2ocI{P<^;cfXfMgt=OzW0nV7ao^m)Pbd?n^`ceqh@JLmnmk6>fsfc3U(Q9owTmD zKRv6zlRVR%WbI6Km6OMmyEqdTt|^qVrQ+ zX>yEo1|Qi_a+v%euTUaQ(IHCi@29`gXYm_uS9fFb;*gl#v|-vRZI>2ebN{u8==&0{ zBKBKpR*HW0b)CD(-3~s%FFYqE z`1iCMV**+uO_G&%YLXg{%pL>-E{s;!h;5=UQWW+iyAP5t9qg6sB)LywLU+2-q8N$e z^*WJ(q=B3xm!WvoJ%dX`bd?H|^nGBzZY4x&3gHaXCzz_EMtIE>WnBe)!bI8}^MbOI; zxf)V(Ht6BBawn~-_SV*G&Gjr+-)JE^T666TP-vFD8K32D`+&E;vtuOhtV%_$PhY03 z)t=fBZ5`jto14u=Yio#|g8Y_Fg!1hQ(h95WE2S6rC^NEAhoGS*T;rOQv*wkavxnu>|Lv98g#?Ux=3zcb0It4uR3Vn?(#(G#m*Mfnz(|zlJZn6gY^?a=m5hrg9i_#mUVdC2T7(yZh7lomKw;gy%6<<`6VLC867uJ_tE z1cFcJKR_F6TlBSTAg_$ouOodoiW-(;jk17v1hwLg&hO@?L=nh1ZO1B4s=K>~>B>72s334!3 z&QGc5lxdjX_vi-tIVIYB?S8$t9>@B!;d~;mV0>#`@-6{7C=fh*pbYFFo-~3Dv;)sq zP)7d2x~G_bf6q29yb^W7Y$Q~qWG9h^?pq+viZ(F2-PS(quvG=~l3+h!@3hM}i=F1~ z47?*xN@{xN2%rttlZYqiN;}1S(BlpK-&DN}li6KtJbZZ)vgdVknOU3;dFd9I1(!SF zSndbz7I&{3Je_Ss=sO>k&qf+E%eceHd$q5n)d8;_YcuHA zYQsy8!XV;kJ=&A*2HBscy|w<@GumC~>&5InwwWDZWBCML)IRB*=Bh@vS_|D zJ(%SIX)3s+CQ|nsAD!EVT zuXCT$zr;RqMEoYMvASBx)-dqZR%@@7WBp)Nv#&=t4n^DPPA|uHTf0eaFZXG8IvixV z*R$Dy;Mq|UsYC{l4EbHT7fqwRv^1@UzJ(3p&+-hhL>v;iqMpU9$E;_p@8KF0T|3ks zXCHHa_kPBSfcNO5RGw5J25CX+BZCu>uk+;h)FJF2>?eMuk!7wkYYSQ2A=-$2_HkQw z94FOz!pU?#boM#N9oco2r6Eu=R1q@_GtUL$Xp_acvv z%2z2Blxsvoz%@^){`qmZ6o`b-k5do9mdsWS+(s@&?9z#xP@)@s2Uld>dT# zwfIq7Wog!j)*kC`c6~Iz2T7%Ze>Nt zx&^M3VJ`(Q7taUw<3w3r@8b-Efepg9e;}tGct|6Mg=ng zQ!vZ?z&vR-6e(h|$iz2S&brM?0VfZ&CR*QFO~5dn?T28L+ieSOyv=zzcs;CC@C@-s z(U+f)Tyi%W>=m?8OXVawp%Sf6htZMrC1m(M`W-y$47~#R+*&=Uo>i~ZYH2rXOlzwp zYY%D9YWuXKTCNtS*U;dD9YG8PiwP4BYL6*jzV{_S?Y!mwr z%tBU2crpNhLrd(P2Xxd%`|cN9iRry#Fuh6|Ni&j05}nYzfawsr0nz0>FHmC8D$9XR?+dV=OuoCuJ|)O=5%2k$M$$9Lo6@J!XVTwQ!X5GesK(#TG z%S&Dm%sS~X2qY(IhuWKgy4np!xD6txEO(cO$W&%q@tFC@d}?O0BEaMA!Puv)>sBeyv1%K34ZD>cXU~9F3i1S&zlDMtcOj2l z6@LE5afE?naD_gCbviMLw{zA zE6Oe9ztQhDzbS1MDCipV&pzVsc!zM?vp2}I0H5_WJ&pmxT_s;B`PrX!^Y3Wob!cGv zalRwQ-?>NJ%3N!1G(9I%KiluAewuhx%#XhJfc$GN`vOGvwQ@=M5%u>GTf$bcee5aA zr}fgtYqzx!y{$e38oF1{Y7{a`8fA=1MonX&G0K==Og5%NAy30eUo##;$)+J@j+&>; zZ{X@YmIB|_z;0;|wLM8e?w*xlBp)e4Zjt+>uq?^7K(ft1vEAeY^bsA&#uoI_yNQgW@E~kuA za#{rt2_E-2k}vVl5&dln*!f>`=>HG&IRi@fRG(!mGm7#}{5%gwe|^)s=8oe9dp-~B zhXS9MBvgi$C5YR_o@5B}@I}Od3LjA$`gK4~P|B-BZGlfd4WH&PtEj1(snyjQYpt}U z+8R(>qP82v7NO?@i$&=bby2UOd-aWaB3SAu80tIyvVI*Z^%(4w8PpVMR5Xa88S{;{ zyf;|lrjZ9>?`ZMmD?_1SAwISYTtLq z4};x}T0@2GLMfr2I7Ymvltr%Vfz0tPoeH{MO83x%=-HR)bsEfauz-@;tPYsC7aPIG zuzRd1)U+o0-VAW2Vf;5E5}B>Qs^~&iA=^_uIIwica~wIExH}dc6wiverBYI?Gz3oa zODPK(PxhfUOCW+L%Dd$tr2r_PpR!w7p>9-N}E_UjcSv$FugF8 zs=XcwVq-=fqoL8yco$iEpK;h&$OoGf@Og?^<*d$D59>2)zjfJ4v5MLa?OFDEdmofP z$#%~JXcFw|NQh7XN?cFqDXbN~Kzn~JToMQz_bKt5cuBk>-VpDKkC2I9iosHV>heiN zkddoN8knK66oWq11^sEF^s%%?QpfMgL+p%~py(Cnh*?qhyQEAcH@tTn(wB@R6Ub6< z#A)&iDJ1unhszV>j}gBpCzS=?@K_q0db@7vSRX4h>`|6os_z`adjm@olXwLsh;-Vwt< z*&j$daaAQqSt1gPG$Y-~Y!V^omRrh`MgSKaMu&bv<(Q`Cmy$~Yhl}e+{>w@G*OYciFq`A^9=_lzI z=yDjLqy}k>8tsyf(>9X*sMjl`rQAby-1~?-xe&E!`F|{O{R(Lt6!@-GhO`G`&LIiN_Z~S+{y<(MZ;n#K3UW z-D;(xs;Sl0hH5jl3-a=M^?-Uty{}+ z*P=9{+1fcxMV^xk6UrB3bVRMsHZ9CwlX1)5nH$G+fD6( zfwo^9?2c=fN;lp%P#h&@cIRallCDUV(eKug<#JU}`eJ33GFx2;$8b>XLC4SqbSFJP z53^iaNv$H-VII7}SxwO!fNS5;r^D5r)*GM~_A}mbJD9$XD== zpt-eXUb`xyvWM;25bWL`n=U0v6-X=@2ijarj*-j6kH{+xU2Y)11#KK7&q2$7A)k{k z!RcgCB9&@N4c45+Gga%XjRLuRqWx1ls(qsc>2K(jkkytz6V5^rZtE#}O|W)Qm$OK5WKXW2`T%to90Iwr%dXbg*YN9{QvkE4(FUbMFSUk-AHL zr3+~94+;I<7}zTLwERdeqqG7WA5|3EmiD9XfPoVcg?ZRmHiz9}4_Icjqo~z~u65A* zYBRN!P_{3$Q<`6^rH2|3MoXyE@5ixgTMfa0_pB^%^}ipt^_&d$OnkK;Qed3+ZDF*K zHcEP5JRluMY%1g_DUHvVTd4u>yh8aN#9Cafr*?$eo>HS|1rYEC`Xjx?eukH+qcudG z_R!G+WwETJzy|X?a3OmQxV(c)k8^w8)yI)u@bD`N187D88D%ibeo&~+6q&P{O zDjpNR7bVox7-@^N1N}P;Eqjz4RK8PcA>Kvk(VNJ6%~404Xe=E_hatWuAh$1u4?RxL zK}mn11(?D(tIg_zm0CefyFgFl*%0)Hz&-N);Ik*F%_1P&a$1#FGgInmUQohM;DmSd zcl8;Fg9QC;<3nh{S$>hH-52%`+?d+C_;gLFsA4i7&WalV#(Mt&f7NOmZ}QhB?4R$ioRQO+tUO1PR$ zEv%MQMb%InfQq_;KgX*})Dvp5`a&&9o1$Fk5MO7s zyKZY0hJUW2n|e*XDSYxEWRvCkCjFHDt^Si9=JH81qX#nG5=7uh!xI@2SVraPfGj*1 zb-O`2D)m#IDT(TzskIgB&yKKD>?*s%wrR=QLqv25xbnXGKlE+-G3dgtda#kh$Zr(G zyRXIWv1z$uMIo+_seyJJAjFCB z;ut||yS9)0`;lspt!GrOK! z&yRNCXoDHXN5;o+b?bOBE6SQ{c{+u-^93e~Q^bqXRq3(hrCVLyYz&IpXC(&4^ZJLl z9w~=VK^UU$q|MkC)cYBBpHXPVK`pN?pk-(1;b4WH@M~L)%SK?{)k?mbAK}07Dy9rZ zyJA+ghFIBcYA>^o*sg~d9pcVIm@8}$ZVQW$MY75NlyfSE5~Cz5zbez!;j-Kt?lxS_4_-0U`rrTuPVKaMUd=&^ z;TlYMilw-Mm$V|YSOeCYb!WraLJ&YLZIH2&Z{uHcKMyud(`)uL=b3BF-R31ThgIIH zYc006qQ4JA#+n_dw+$hw=Z1r465+oyi$%oNVw^ZZ+#}u;-;ioR$pXYZL>h&@9*iuc z%5~*7@*>pkPT8YGD=qLzuY#_ARkEnX)!LwzAL&nYg|<%nS$nQ&;J*#}XZjAkpi$gd z1vWixY_WD(53M`)LsvsX+_BUd;HZOQlSQ)sTLhxq zq8+t7Ng^ySCUFOjWYl_CT+FBzxxAs~$ElwMt4b^`fmMmZ(iCXZlqh496Gd=9o~o4O@yI>GRA4xQfeGGbo_jFPo(PE~iigbU#{f=xlnJKBEN# z38qu1yHDdN@vwA4S_=KRMZ9t=wAgw1g%YgxRQsuAX*H1U9vZ;})&a^8tYy`@Ykjnx zsLM#b0&@R3LjPQ4t+NuWO;)0{!@6jVwcmrknPSgC zah+I(907W5u39uXs?Tp+l*QoQt`^iMdrBq=v(M+TCu>QnVyv`a5| z#vEozQ$US&HOHFM%@fE9eXT*3&$?@QMu)m{k|IG_qu>bc3O@_8#EtOc7totZOFg88 zQWJ8B=-|P(K>y>Eb%@C0%5!A+x~#0OBl}H4B%BG1GfoS2$0&=5mBiif#M8(!vWa}_ z?(J7hZi@dO3+f#!Pm!0&Bh&=74h!W?;8hc?WnlPFPi41me-%}!FZoIB08elO^f(5p z`LVuCUkmbmqKkof-5WyPc`!@iWD>cK8w7or&Gb?r#qP z`;E8P*&FRs(C_PRKL~SkX)U2A++Z@YX->3UV5Ve4v5DAHZ0pWG=q2_O2Z>`uk91fm ztyY8%%vO)9`N1I-kzwZ1&GZKSmA2ESBiF_2?;|7Z(@XKed^mdaL_UQ-;V<}XXy6&M zqSe6?>;d+7w*S=_OPD(r5hmsl3yB2p*k0_4+8i#9Mf@BWFN(={*UpH+Kt3NKJwU74 zWE7leU>@%MSHxLHZiu-0;~o0bzukRrfQ;W?abAsYFM)^oRr%vR@Ls=-Fy^8~XnC+* zW){w}vHYwklTqU_Y!3_3BD6YMGi|Q6Rx6DR*dKjqmbudW$qdYbUv3q(W&2b63wPdh zm`BbOV3;;=+P@0f#8v1~nWU`fsl}xzDNcG@8ZAwe=1EJX_0m4+E9ta!8Ik27Z@B9- zCP5XJlP}0=^qt2fuUtef<*un~C-;VDoG!1Gi!0@n4oY`i&jRH<*_1J(D{ zwdz0BJ8A_g(Au;iokf??+w?i@&4#o2Y#Cd_64)lTi^B}6&yD=N1h2{sWaavBlx=uN?(j|gb8z@Qp3^LXOj6dYY%1WyI%aodu2JUusE3cu z<>r2OC70hrQoEtU z8jDmaDYmjs9mC3Nca5sQ&Ccs(I`E$}%pKsOugt5U+e(%IzKBO29AnL~Zd%;svM_gS z=Z4@HJmSw{wA2Z?^j(s=KI9EGw^~}Qpem}V)=?X)-I4Jfb(A_0wSEq|{3CQZ2MyGH zJ@~*Dv_GgPk?y7kX%fxNMCL`$ZOb~bIG5snfomwE^@GCRK+o~P+h;OL7-fu#hG1yM zPhL34ya2rY=@jn76E8yG81p*u`P)TssdG?=4}8xKqp~ zZG^wQB;_InNkvkhv_xEvCCA7WQb?w9FZqo8K<=#cRE8^am6gg?kYZ7IrEcn2b*mag ztH2*^q^Icj@Vk#_5Yt%=))3d;9E#Y*T?a6n<)-1)^t<{~uv0#x zoKXeWUEOF1cN}jFH|7}2jIG8Y;}qzrDrdYl_wts!Gatl#sFM%)hwiB9O1_aF;1_sb z>y-7Qm4Z({5xs0nppH(4dCF%BaN#;(qp(dlESwO25bBH3Vhq^1n>ZBCzM1rv)K8iO z^<0izl!??vi@%5Vz5^!BCzq2uBD*dCL;oP(gQJ&}ZOR|-+=yxoIOX@$e?T7=se9Eg z)UVa=)Z6M~^|_iAv|5;!r3#!tEn1&8q3via9Y9CYIrK5DzzjBseZ7z_k{+n4yY4eQIW)e*{<{CwL zHPG){yf>6`5+85QF*m?-hrxLU?q&A@^KG+}?c44gl`wbyL~fz9&`ua6ED*M%{c?$g z#hU2vlf`B3DwZ-}khW4sDHiScne%tQuLM$#$ z6(5QXq;Ap@(CR@@bTzq-d`o^LpI6qZS!f5^g?6XCXg@lT4yD5pA!F%#^nE&o&H#ze zqaP!q?xiDHKCO^eOe=}}SpktE!qaHDf*Mfh`dVYHsn$YkgR2>%j|ZK80D}A@=Y6Jc z(|3VX4(ccLyoMJ_*NV4;)^+7Q&?52ZTMi!qf*Hprz*kS@Gx?YNg_+q3wcfC@Te+?L zR$;5SRmv)BRfNV#mTKviW!1DCE5a^d7q>k*!#&^P`qvBF#eL!f`I-C>IcBOlQ=OyE zNB>x+u2R>5fj6m%>JD{}dO$s-9#v1MXP_ehgFt-07u3t}{x_iF_ti(}KhMxcK{Sj; zKwI+A0w9zUG>Vp^mEbi3a}o?{qgT~~+IwjXZH2zok#?m$Xm1)%2T_NPprhzGI)P56 zQ|V0fxcPJus9+UcM-%8K=+h4Pl>_t;JxWi|GxQw2Krhp)pt?KsKJxctxSyBE;$bX; zSU{S0btHi1?!YF#L&1$iFZjO&(tynwOk#%J~km=*muN^jmjbh{21U8vX zWi#0vaL6K%$SStZWsyX-19WwO9b!k>33i5^Lk_qMuX=;sVfWc1_LyDM@93M&J?1}= zmxJsuJHpOk=RqwOu}j!dpovO$HJjMfHbA?z?0R-XWb7C)Z#%oA-PP`4_qOBhLAGO$ zut(YB>86KE+<_QwQga{#rkVhy0r&vOW63PjcglYm2s9*@TP)n#MG!(o-jL-^w zwxiHh=ppnL;?a8@VFaAkIAH?lW~wk#m;>EfgdVaA**QVjBqRzuggwFm;gE0?dHRfS zPPiak7OujZ-4X5!kA%k{p_f9C7$!!DIY7<@#3Et|F-j~4cCQACrlKL*Vl9{Ay~yx3 zvR4VEk4m=9JD&itDVul)A|@AK|*T+{=a&7V40oA5l4ul#Bt&TXy8@EHvyuM{J-lG;IEyTXt5mg1#Bk^@gV3XCuTyggN# zDa`?OFOrslyw^zy(k3Yp47~?Tct|=5E<6L0xB#}g3b%4cx-UJF9z&&HNwN0p}R9E!UFk!C`yl7`YW3Xh*rL+yg!|ULGVn@(6j9JWie< zM^OkMgi#OWd5u9spV-B?%tbUAsiusavAyIIn9DTT2G7BHft}m zYM{8)P~!7o4$-K@D}&A&gU@2kq2_z$5%U7vS_;U*vb8}wt1bR|5BRiI7HMlM(pFRi zW{(DTq`#Y&wn`%X+K99fm$cOosjDD9mrtf!@sPIOA#J5Y+WLmHnTKif z<&f*LBa=xB#<~#Z4{22e5UxYjQ zk^A{`9&Bbc^ZsF-8pnGzGMk(2&2DBNbFk?%-!=bX&N3I6%iVJ?cEST3GrxulxMu!n z`pxHNu$2}1_%8bEa;yA*)G*K9aL=s35Dc_qiabM}EzgrbhHGCbua!TA_uL|Hmv_ti z{@>BVRoLLD~-cYhDxt07%VWl{{PFc9Ms*0qj zimq5nO{K2VK#5kGDJ_+@N(ZHj(p~AL^iu{ZLzUsmNM)?@p7Q>0^Ef?8;huM)H5-&+ zh&c~vA}1mt(%r|6xu>Tzad&SEoXs`NJ)0y616u%y2WOSrAcC9ubjxB1#jpwb{w+ z>7KtCCwYHTtS#^PX{oBKr@F z?=i4*-^i|=`}K<-9N8r{a^R4Dk#YSZYkOlN`^I;Rt(q;{8>L_Ujo9(!29~^5zvSyL z=ULm56<i|4sq^e)SRi;>G7mJ2KJE)yl&a%%%05d4|2Ny(jHSEI(?PNGX{U^+nuR< z#s>B*^pn4+l>V7LN%`?7qde|>+y7MF%wbpFpnv_ks)J*P1=c4dfBNdWHoSUF zSMY78s@*yd?u_Tn+q}B=Ca>!tt)Ol9RvkEKU{{YP^%`(3Zi7c={^RSaR~;DJCmt_s zR6Oc{MvbcC%hMvJPP11(tXI4Kt7qu5ub$PY-LgiL*FW|)s#Bvy^Z#`{IHP2gjFM3@ zN=C^j86~4+l#G&5GD=3tC>bTAWR#4OQ8G$K$tW2mqhyqfl2KBNSi6evTIDLfp~b8C z@^!7^>r$zTZ(7+Zz83fj{N5jz;*=@sca)lb=dsuCjBo3AYFzU>$Cmk>7ajagM0dZF z*geHLSjX@59q4x^_w_rS>ieA{`2IHaJ5>t#ov-?*I95r&^Y8%v2LA7x^;4W1weY&P zQ=BJ5{7#2BzjLdz-x)O|#aWQw?|d)$oyBAQ&X4ha=Z!&rCuWx4S%bg5pqbxUzR~Zr z7~^+xDJjlM{Jp0o{7!3p#vG>KIn40+8vC6=$v->$8~GhW^gGYGq&SlgrZ`Var8s$Z z_?_J&Qk(+C{7&6Ye&~6mMd$PS zzPlXl``}o#PoDn7G56!=ckugiUZ1oi+Sj^!wC_D9+E;0W*Vn#)*Vks4*H;;@S+cNL!=iomplDy^EM8xaI$q!M)zQ8#`BERHM0}1$UfkM*DhB zkMgF>2gmx9-LaOm@1JPexoMJ2&z5W5Z-;bMs_pLH%Us#FAuZV5?-OmvPnE z+&bCmSS{HJ#@7mb9l>ix<9FR-k{yR7J4>4+JD=7|cHXzII?bBl|MX9G#x_oNuDqG- zJnEV3w5plxTuZp>)W_o;HQ7;fU3CWjpW?1PII8N5pTr#q5OAY79TD_eahy&JtVBc} zLRLZ`n#bm0BBSndvwO39+1-1$_mL%tbrrE>E@(Pps}(!(0V=j5IzEtUUBD3^qo8%B zILzp#*bcTL0cNO=j_L0^=WaIH7WI!#yE8w&$N9eRob!F(Id?a+A+W2Rb0pmx!o0nM z=`!Wd=}+T>>Exj!>2v@3Y5MT$BkAZ(gXtISBk9wakJdYQ%eHjQ!fol)qHXE$4fWp@rMi7qo0k=g-Kt;V^o5Lt54X#TW5dK-cmH4yE*&HuC0)7b^SdpYiB(Sd7Y5^mq-VuJX)|Hm~i;Q z>2DvX*wF)dPyLCNcPStzn|R){~kBK|JTRZZwm4E)U+h8 zvfiu6TnTyAgs=C!^|#)ycE4A#=}ySkKQ-x*k`@1as`5a^qd$RsjoEr|i|CL3`%!!F z1B19DfGiN$g?qt83dp#iT&6Id0s03;zj$4J4fz49fZU7Xo*8%tHZMUBc*!2{4T^hX z=ppprR?N9o_)8BWCUiRi?*MFoRgWMBkOMN$Lr?q*h=KUI#~?qB^#KFG(Bt3VxBu(= zf#)k(IA_@$?!=t9Pf5?*91i6KPe{3U?eH*t>y@!*Ul#kKdJTLmkORD*AYXtF*!gk6 z{vMj+7;^gs#(@D~Cy)c!arhnoVdpy^@A?y{ANnNnq0r~94yp<8>ws)!P`wLu3otN0 zsBQ(_nYUZqQ}^84=syYl*7BDR^YJ>TkB$G28Dr(@i^j?)i)Bg36TPRKHa>H(;(!qeNEQ z+~}`wDrj1-^3Az=^2931*5s~)B3ZhmYO1Bm33aU^#S}Ru{K#$|+0oaF6-~FJG09BH zVMXf3+zCCcj&hVORo4oBSDn$%v?AZ(H<$cUwxLKps$to3Lh81)Fxg09Ig#LoWOwBm zzm)45o12!k`&(BMzqEZNeOsODmo_&v_}iCp-rvxG*kj*^E~z&$ zb67D=-KbM!3yl^q6cbx#h3`g>_E0K)KA(GDhlh{f?tb!cM<2+#)P27@bbIkz;^m6f zAe)vSE!?97^pu_AIw5zeT0~E?Ml45;D%a|3{LD5LBY)a$oDn5bWm;%udS~y-aa1It zC-bsYG%k&dTWNeIu#LEaDu6OeR@1V^n3-0swTh9DwFr16qHvwU%$_(yPpA-?soPep zDz2j^1uwaLG{sCzAg3Vm`^Yp^8P5g70;<9>bSQsL7*c`Pagw8QLhyWAqD)&$U<`ep zma#@nNms2^WNrXnD)3fJEZ1a79O|&nh%&Jv##YNI+7?qSIYAAl8VNw*zBtgF#%!z^ z?HJRwD7K|V>GKbWG{Pr@T|CO7hN6VAIZ)Y>x(vkSIf)u!7R4cywO$tOGFZ1EYh>50 zYTQ@RqMSywI73pCvJq$DwF(QzG?q_BI0jkP

      %mXD6ZvQ|ZgKv|cPh^lsyD3fgq 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

       tag so that the entry to this function
      +   * is clear to the debugging user.  Call _closeDebugFunction() at the
      +   * end of the function to create a clean box round the function call.
      +   *
      +   * @author    Nigel Swinson 
      +   * @author    Sam   Blum    
      +   * @param     $functionName (string) the name of the function we are beginning to debug
      +   * @param     $bDebugFlag   (bool) TRUE if we are to draw a call stack, FALSE otherwise
      +   * @return                  (array)  the output from the microtime() function.
      +   * @see       _closeDebugFunction()
      +   */
      +  function _beginDebugFunction($functionName, $bDebugFlag) {
      +    if ($bDebugFlag) {
      +      $fileName = basename(__FILE__);
      +      static $color = array('green','blue','red','lime','fuchsia', 'aqua');
      +      static $colIndex = -1;
      +      $colIndex++;
      +      echo '
      '; + echo '
      ';
      +      echo 'Function Close '.$this->iDebugNextLinkNumber.'';
      +      echo "{$fileName} : {$functionName}";
      +      echo '
      '; + array_push($this->aDebugOpenLinks, $this->iDebugNextLinkNumber); + $this->iDebugNextLinkNumber++; + } + + if ($this->bClassProfiling) + $this->_ProfBegin($FunctionName); + + return TRUE; + } + + /** + * Called to end the debug run of a function. + * + * This method ends a
       block and reports the time since $aStartTime
      +   * is clear to the debugging user.
      +   *
      +   * @author    Nigel Swinson 
      +   * @param     $functionName (string) the name of the function we are beginning to debug
      +   * @param     $return_value (mixed) the return value from the function call that 
      +   *                                  we are debugging
      +   * @param     $bDebugFlag   (bool) TRUE if we are to draw a call stack, FALSE otherwise
      +   */
      +  function _closeDebugFunction($functionName, $returnValue = "", $bDebugFlag) {
      +    if ($bDebugFlag) {
      +      echo "
      "; + $iOpenLinkNumber = array_pop($this->aDebugOpenLinks); + echo 'Function Open '.$iOpenLinkNumber.''; + if (isSet($returnValue)) { + if (is_array($returnValue)) + echo "Return Value: ".print_r($returnValue)."\n"; + else if (is_numeric($returnValue)) + echo "Return Value: ".(string)$returnValue."\n"; + else if (is_bool($returnValue)) + echo "Return Value: ".($returnValue ? "TRUE" : "FALSE")."\n"; + else + echo "Return Value: \"".htmlspecialchars($returnValue)."\"\n"; + } + echo '
      '; + echo " \n
      "; + } + + if ($this->bClassProfiling) + $this->_ProfEnd($FunctionName); + + return TRUE; + } + + /** + * Profile begin call + */ + function _ProfBegin($sonFuncName) { + static $entryTmpl = array ( 'start' => array(), + 'recursiveCount' => 0, + 'totTime' => 0, + 'callCount' => 0 ); + $now = explode(' ', microtime()); + + if (empty($this->callStack)) { + $fatherFuncName = ''; + } + else { + $fatherFuncName = $this->callStack[sizeOf($this->callStack)-1]; + $fatherEntry = &$this->profile[$fatherFuncName]; + } + $this->callStack[] = $sonFuncName; + + if (!isSet($this->profile[$sonFuncName])) { + $this->profile[$sonFuncName] = $entryTmpl; + } + + $sonEntry = &$this->profile[$sonFuncName]; + $sonEntry['callCount']++; + // if we call the t's the same function let the time run, otherwise sum up + if ($fatherFuncName == $sonFuncName) { + $sonEntry['recursiveCount']++; + } + if (!empty($fatherFuncName)) { + $last = $fatherEntry['start']; + $fatherEntry['totTime'] += round( (($now[1] - $last[1]) + ($now[0] - $last[0]))*10000 ); + $fatherEntry['start'] = 0; + } + $sonEntry['start'] = explode(' ', microtime()); + } + + /** + * Profile end call + */ + function _ProfEnd($sonFuncName) { + $now = explode(' ', microtime()); + + array_pop($this->callStack); + if (empty($this->callStack)) { + $fatherFuncName = ''; + } + else { + $fatherFuncName = $this->callStack[sizeOf($this->callStack)-1]; + $fatherEntry = &$this->profile[$fatherFuncName]; + } + $sonEntry = &$this->profile[$sonFuncName]; + if (empty($sonEntry)) { + echo "ERROR in profEnd(): '$funcNam' not in list. Seams it was never started ;o)"; + } + + $last = $sonEntry['start']; + $sonEntry['totTime'] += round( (($now[1] - $last[1]) + ($now[0] - $last[0]))*10000 ); + $sonEntry['start'] = 0; + if (!empty($fatherEntry)) $fatherEntry['start'] = explode(' ', microtime()); + } + + /** + * Show profile gathered so far as HTML table + */ + function _ProfileToHtml() { + $sortArr = array(); + if (empty($this->profile)) return ''; + reset($this->profile); + while (list($funcName) = each($this->profile)) { + $sortArrKey[] = $this->profile[$funcName]['totTime']; + $sortArrVal[] = $funcName; + } + //echo '
      ';var_dump($sortArrVal);echo '
      '; + array_multisort ($sortArrKey, SORT_DESC, $sortArrVal ); + //echo '
      ';var_dump($sortArrVal);echo '
      '; + + $totTime = 0; + $size = sizeOf($sortArrVal); + for ($i=0; $i<$size; $i++) { + $funcName = &$sortArrVal[$i]; + $totTime += $this->profile[$funcName]['totTime']; + } + $out = ''; + $out .=''; + for ($i=0; $i<$size; $i++) { + $funcName = &$sortArrVal[$i]; + $row = &$this->profile[$funcName]; + $procent = round($row['totTime']*100/$totTime); + if ($procent>20) $bgc = '#ff8080'; + elseif ($procent>15) $bgc = '#ff9999'; + elseif ($procent>10) $bgc = '#ffcccc'; + elseif ($procent>5) $bgc = '#ffffcc'; + else $bgc = '#66ff99'; + + $out .=""; + $out .=''; + $out .=''; + } + $out .= '
      Function % Total [ms]# Call[ms] per Call# Recursive
      '. $funcName .''. $procent .'% '.''. $row['totTime']/10 .''. $row['callCount'] .''. round($row['totTime']/10/$row['callCount'],2) .''. $row['recursiveCount'].'
      Total Time [' . $totTime/10 .'ms]' ; + + echo $out; + return TRUE; + } + + /** + * Echo an XPath context for diagnostic purposes + * + * @param $context (array) An XPath context + */ + function _printContext($context) { + echo "{$context['nodePath']}({$context['pos']}/{$context['size']})"; + } + + /** + * This is a debug helper function. It dumps the node-tree as HTML + * + * *QUICK AND DIRTY*. Needs some polishing. + * + * @param $node (array) A node + * @param $indent (string) (optional, default=''). For internal recursive calls. + */ + function _treeDump($node, $indent = '') { + $out = ''; + + // Get rid of recursion + $parentName = empty($node['parentNode']) ? "SUPER ROOT" : $node['parentNode']['name']; + unset($node['parentNode']); + $node['parentNode'] = $parentName ; + + $out .= "NODE[{$node['name']}]\n"; + + foreach($node as $key => $val) { + if ($key === 'childNodes') continue; + if (is_Array($val)) { + $out .= $indent . " [{$key}]\n" . arrayToStr($val, $indent . ' '); + } else { + $out .= $indent . " [{$key}] => '{$val}' \n"; + } + } + + if (!empty($node['childNodes'])) { + $out .= $indent . " ['childNodes'] (Size = ".sizeOf($node['childNodes']).")\n"; + foreach($node['childNodes'] as $key => $childNode) { + $out .= $indent . " [$key] => " . $this->_treeDump($childNode, $indent . ' ') . "\n"; + } + } + + if (empty($indent)) { + return "
      " . htmlspecialchars($out) . "
      "; + } + return $out; + } +} // END OF CLASS XPathBase + + +/************************************************************************************************ +* =============================================================================================== +* X P a t h E n g i n e - Class +* =============================================================================================== +************************************************************************************************/ + +class XPathEngine extends XPathBase { + + // List of supported XPath axes. + // What a stupid idea from W3C to take axes name containing a '-' (dash) + // NOTE: We replace the '-' with '_' to avoid the conflict with the minus operator. + // We will then do the same on the users Xpath querys + // -sibling => _sibling + // -or- => _or_ + // + // This array contains a list of all valid axes that can be evaluated in an + // XPath query. + var $axes = array ( 'ancestor', 'ancestor_or_self', 'attribute', 'child', 'descendant', + 'descendant_or_self', 'following', 'following_sibling', + 'namespace', 'parent', 'preceding', 'preceding_sibling', 'self' + ); + + // List of supported XPath functions. + // What a stupid idea from W3C to take function name containing a '-' (dash) + // NOTE: We replace the '-' with '_' to avoid the conflict with the minus operator. + // We will then do the same on the users Xpath querys + // starts-with => starts_with + // substring-before => substring_before + // substring-after => substring_after + // string-length => string_length + // + // This array contains a list of all valid functions that can be evaluated + // in an XPath query. + var $functions = array ( 'last', 'position', 'count', 'id', 'name', + 'string', 'concat', 'starts_with', 'contains', 'substring_before', + 'substring_after', 'substring', 'string_length', 'normalize_space', 'translate', + 'boolean', 'not', 'true', 'false', 'lang', 'number', 'sum', 'floor', + 'ceiling', 'round', 'x_lower', 'x_upper', 'generate_id' ); + + // List of supported XPath operators. + // + // This array contains a list of all valid operators that can be evaluated + // in a predicate of an XPath query. The list is ordered by the + // precedence of the operators (lowest precedence first). + var $operators = array( ' or ', ' and ', '=', '!=', '<=', '<', '>=', '>', + '+', '-', '*', ' div ', ' mod ', ' | '); + + // List of literals from the xPath string. + var $axPathLiterals = array(); + + // The index and tree that is created during the analysis of an XML source. + var $nodeIndex = array(); + var $nodeRoot = array(); + var $emptyNode = array( + 'name' => '', // The tag name. E.g. In it would be 'FOO' + 'attributes' => array(), // The attributes of the tag E.g. In it would be array('bar'=>'aaa') + 'childNodes' => array(), // Array of pointers to child nodes. + 'textParts' => array(), // Array of text parts between the cilderen E.g. aabbccdd -> array('aa','bb','cc','dd') + 'parentNode' => NULL, // Pointer to parent node or NULL if this node is the 'super root' + //-- *!* Following vars are set by the indexer and is for optimisation only *!* + 'depth' => 0, // The tag depth (or tree level) starting with the root tag at 0. + 'pos' => 0, // Is the zero-based position this node has in the parents 'childNodes'-list. + 'contextPos' => 1, // Is the one-based position this node has by counting the siblings tags (tags with same name) + 'xpath' => '' // Is the abs. XPath to this node. + ); + var $_indexIsDirty = FALSE; + + + // These variable used during the parse XML source + var $nodeStack = array(); // The elements that we have still to close. + var $parseStackIndex = 0; // The current element of the nodeStack[] that we are adding to while + // parsing an XML source. Corresponds to the depth of the xml node. + // in our input data. + var $parseOptions = array(); // Used to set the PHP's XML parser options (see xml_parser_set_option) + var $parsedTextLocation = ''; // A reference to where we have to put char data collected during XML parsing + var $parsInCData = 0 ; // Is >0 when we are inside a CDATA section. + var $parseSkipWhiteCache = 0; // A cache of the skip whitespace parse option to speed up the parse. + + // This is the array of error strings, to keep consistency. + var $errorStrings = array( + 'AbsoluteXPathRequired' => "The supplied xPath '%s' does not *uniquely* describe a node in the xml document.", + 'NoNodeMatch' => "The supplied xPath-query '%s' does not match *any* node in the xml document.", + 'RootNodeAlreadyExists' => "An xml document may have only one root node." + ); + + /** + * Constructor + * + * Optionally you may call this constructor with the XML-filename to parse and the + * XML option vector. Each of the entries in the option vector will be passed to + * xml_parser_set_option(). + * + * A option vector sample: + * $xmlOpt = array(XML_OPTION_CASE_FOLDING => FALSE, + * XML_OPTION_SKIP_WHITE => TRUE); + * + * @param $userXmlOptions (array) (optional) Vector of (=>, + * =>, ...). See PHP's + * xml_parser_set_option() docu for a list of possible + * options. + * @see importFromFile(), importFromString(), setXmlOptions() + */ + function XPathEngine($userXmlOptions=array()) { + parent::XPathBase(); + // Default to not folding case + $this->parseOptions[XML_OPTION_CASE_FOLDING] = FALSE; + // And not skipping whitespace + $this->parseOptions[XML_OPTION_SKIP_WHITE] = FALSE; + + // Now merge in the overrides. + // Don't use PHP's array_merge! + if (is_array($userXmlOptions)) { + foreach($userXmlOptions as $key => $val) $this->parseOptions[$key] = $val; + } + } + + /** + * Resets the object so it's able to take a new xml sting/file + * + * Constructing objects is slow. If you can, reuse ones that you have used already + * by using this reset() function. + */ + function reset() { + parent::reset(); + $this->properties['xmlFile'] = ''; + $this->parseStackIndex = 0; + $this->parsedTextLocation = ''; + $this->parsInCData = 0; + $this->nodeIndex = array(); + $this->nodeRoot = array(); + $this->nodeStack = array(); + $this->aLiterals = array(); + $this->_indexIsDirty = FALSE; + } + + + //----------------------------------------------------------------------------------------- + // XPathEngine ------ Get / Set Stuff ------ + //----------------------------------------------------------------------------------------- + + /** + * Returns the property/ies you want. + * + * if $param is not given, all properties will be returned in a hash. + * + * @param $param (string) the property you want the value of, or NULL for all the properties + * @return (mixed) string OR hash of all params, or NULL on an unknown parameter. + */ + function getProperties($param=NULL) { + $this->properties['hasContent'] = !empty($this->nodeRoot); + $this->properties['caseFolding'] = $this->parseOptions[XML_OPTION_CASE_FOLDING]; + $this->properties['skipWhiteSpaces'] = $this->parseOptions[XML_OPTION_SKIP_WHITE]; + + if (empty($param)) return $this->properties; + + if (isSet($this->properties[$param])) { + return $this->properties[$param]; + } else { + return NULL; + } + } + + /** + * Set an xml_parser_set_option() + * + * @param $optionID (int) The option ID (e.g. XML_OPTION_SKIP_WHITE) + * @param $value (int) The option value. + * @see XML parser functions in PHP doc + */ + function setXmlOption($optionID, $value) { + if (!is_numeric($optionID)) return; + $this->parseOptions[$optionID] = $value; + } + + /** + * Sets a number of xml_parser_set_option()s + * + * @param $userXmlOptions (array) An array of parser options. + * @see setXmlOption + */ + function setXmlOptions($userXmlOptions=array()) { + if (!is_array($userXmlOptions)) return; + foreach($userXmlOptions as $key => $val) { + $this->setXmlOption($key, $val); + } + } + + /** + * Alternative way to control whether case-folding is enabled for this XML parser. + * + * Short cut to setXmlOptions(XML_OPTION_CASE_FOLDING, TRUE/FALSE) + * + * When it comes to XML, case-folding simply means uppercasing all tag- + * and attribute-names (NOT the content) if set to TRUE. Note if you + * have this option set, then your XPath queries will also be case folded + * for you. + * + * @param $onOff (bool) (default TRUE) + * @see XML parser functions in PHP doc + */ + function setCaseFolding($onOff=TRUE) { + $this->parseOptions[XML_OPTION_CASE_FOLDING] = $onOff; + } + + /** + * Alternative way to control whether skip-white-spaces is enabled for this XML parser. + * + * Short cut to setXmlOptions(XML_OPTION_SKIP_WHITE, TRUE/FALSE) + * + * When it comes to XML, skip-white-spaces will trim the tag content. + * An XML file with no whitespace will be faster to process, but will make + * your data less human readable when you come to write it out. + * + * Running with this option on will slow the class down, so if you want to + * speed up your XML, then run it through once skipping white-spaces, then + * write out the new version of your XML without whitespace, then use the + * new XML file with skip whitespaces turned off. + * + * @param $onOff (bool) (default TRUE) + * @see XML parser functions in PHP doc + */ + function setSkipWhiteSpaces($onOff=TRUE) { + $this->parseOptions[XML_OPTION_SKIP_WHITE] = $onOff; + } + + /** + * Get the node defined by the $absoluteXPath. + * + * @param $absoluteXPath (string) (optional, default is 'super-root') xpath to the node. + * @return (array) The node, or FALSE if the node wasn't found. + */ + function &getNode($absoluteXPath='') { + if ($absoluteXPath==='/') $absoluteXPath = ''; + if (!isSet($this->nodeIndex[$absoluteXPath])) return FALSE; + if ($this->_indexIsDirty) $this->reindexNodeTree(); + return $this->nodeIndex[$absoluteXPath]; + } + + /** + * Get a the content of a node text part or node attribute. + * + * If the absolute Xpath references an attribute (Xpath ends with @ or attribute::), + * then the text value of that node-attribute is returned. + * Otherwise the Xpath is referencing a text part of the node. This can be either a + * direct reference to a text part (Xpath ends with text()[]) or indirect reference + * (a simple abs. Xpath to a node). + * 1) Direct Reference (xpath ends with text()[]): + * If the 'part-number' is omitted, the first text-part is assumed; starting by 1. + * Negative numbers are allowed, where -1 is the last text-part a.s.o. + * 2) Indirect Reference (a simple abs. Xpath to a node): + * Default is to return the *whole text*; that is the concated text-parts of the matching + * node. (NOTE that only in this case you'll only get a copy and changes to the returned + * value wounld have no effect). Optionally you may pass a parameter + * $textPartNr to define the text-part you want; starting by 1. + * Negative numbers are allowed, where -1 is the last text-part a.s.o. + * + * NOTE I : The returned value can be fetched by reference + * E.g. $text =& wholeText(). If you wish to modify the text. + * NOTE II: text-part numbers out of range will return FALSE + * SIDENOTE:The function name is a suggestion from W3C in the XPath specification level 3. + * + * @param $absoluteXPath (string) xpath to the node (See above). + * @param $textPartNr (int) If referring to a node, specifies which text part + * to query. + * @return (&string) A *reference* to the text if the node that the other + * parameters describe or FALSE if the node is not found. + */ + function &wholeText($absoluteXPath, $textPartNr=NULL) { + $status = FALSE; + $text = NULL; + if ($this->_indexIsDirty) $this->reindexNodeTree(); + + do { // try-block + if (preg_match(";(.*)/(attribute::|@)([^/]*)$;U", $absoluteXPath, $matches)) { + $absoluteXPath = $matches[1]; + $attribute = $matches[3]; + if (!isSet($this->nodeIndex[$absoluteXPath]['attributes'][$attribute])) { + $this->_displayError("The $absoluteXPath/attribute::$attribute value isn't a node in this document.", __LINE__, __FILE__, FALSE); + break; // try-block + } + $text =& $this->nodeIndex[$absoluteXPath]['attributes'][$attribute]; + $status = TRUE; + break; // try-block + } + + // Xpath contains a 'text()'-function, thus goes right to a text node. If so interpret the Xpath. + if (preg_match(":(.*)/text\(\)(\[(.*)\])?$:U", $absoluteXPath, $matches)) { + $absoluteXPath = $matches[1]; + + if (!isSet($this->nodeIndex[$absoluteXPath])) { + $this->_displayError("The $absoluteXPath value isn't a node in this document.", __LINE__, __FILE__, FALSE); + break; // try-block + } + + // Get the amount of the text parts in the node. + $textPartSize = sizeOf($this->nodeIndex[$absoluteXPath]['textParts']); + + // default to the first text node if a text node was not specified + $textPartNr = isSet($matches[2]) ? substr($matches[2],1,-1) : 1; + + // Support negative indexes like -1 === last a.s.o. + if ($textPartNr < 0) $textPartNr = $textPartSize + $textPartNr +1; + if (($textPartNr <= 0) OR ($textPartNr > $textPartSize)) { + $this->_displayError("The $absoluteXPath/text()[$textPartNr] value isn't a NODE in this document.", __LINE__, __FILE__, FALSE); + break; // try-block + } + $text =& $this->nodeIndex[$absoluteXPath]['textParts'][$textPartNr - 1]; + $status = TRUE; + break; // try-block + } + + // At this point we have been given an xpath with neither a 'text()' nor 'attribute::' axis at the end + // So we assume a get to text is wanted and use the optioanl fallback parameters $textPartNr + + if (!isSet($this->nodeIndex[$absoluteXPath])) { + $this->_displayError("The $absoluteXPath value isn't a node in this document.", __LINE__, __FILE__, FALSE); + break; // try-block + } + + // Get the amount of the text parts in the node. + $textPartSize = sizeOf($this->nodeIndex[$absoluteXPath]['textParts']); + + // If $textPartNr == NULL we return a *copy* of the whole concated text-parts + if (is_null($textPartNr)) { + unset($text); + $text = implode('', $this->nodeIndex[$absoluteXPath]['textParts']); + $status = TRUE; + break; // try-block + } + + // Support negative indexes like -1 === last a.s.o. + if ($textPartNr < 0) $textPartNr = $textPartSize + $textPartNr +1; + if (($textPartNr <= 0) OR ($textPartNr > $textPartSize)) { + $this->_displayError("The $absoluteXPath has no text part at pos [$textPartNr] (Note: text parts start with 1).", __LINE__, __FILE__, FALSE); + break; // try-block + } + $text =& $this->nodeIndex[$absoluteXPath]['textParts'][$textPartNr -1]; + $status = TRUE; + } while (FALSE); // END try-block + + if (!$status) return FALSE; + return $text; + } + + /** + * Obtain the string value of an object + * + * http://www.w3.org/TR/xpath#dt-string-value + * + * "For every type of node, there is a way of determining a string-value for a node of that type. + * For some types of node, the string-value is part of the node; for other types of node, the + * string-value is computed from the string-value of descendant nodes." + * + * @param $node (node) The node we have to convert + * @return (string) The string value of the node. "" if the object has no evaluatable + * string value + */ + function _stringValue($node) { + // Decode the entitites and then add the resulting literal string into our array. + return $this->_addLiteral($this->decodeEntities($this->wholeText($node))); + } + + //----------------------------------------------------------------------------------------- + // XPathEngine ------ Export the XML Document ------ + //----------------------------------------------------------------------------------------- + + /** + * Returns the containing XML as marked up HTML with specified nodes hi-lighted + * + * @param $absoluteXPath (string) The address of the node you would like to export. + * If empty the whole document will be exported. + * @param $hilighXpathList (array) A list of nodes that you would like to highlight + * @return (mixed) The Xml document marked up as HTML so that it can + * be viewed in a browser, including any XML headers. + * FALSE on error. + * @see _export() + */ + function exportAsHtml($absoluteXPath='', $hilightXpathList=array()) { + $htmlString = $this->_export($absoluteXPath, $xmlHeader=NULL, $hilightXpathList); + if (!$htmlString) return FALSE; + return "
      \n" . $htmlString . "\n
      "; + } + + /** + * Given a context this function returns the containing XML + * + * @param $absoluteXPath (string) The address of the node you would like to export. + * If empty the whole document will be exported. + * @param $xmlHeader (array) The string that you would like to appear before + * the XML content. ie before the . If you + * do not specify this argument, the xmlHeader that was + * found in the parsed xml file will be used instead. + * @return (mixed) The Xml fragment/document, suitable for writing + * out to an .xml file or as part of a larger xml file, or + * FALSE on error. + * @see _export() + */ + function exportAsXml($absoluteXPath='', $xmlHeader=NULL) { + $this->hilightXpathList = NULL; + return $this->_export($absoluteXPath, $xmlHeader); + } + + /** + * Generates a XML string with the content of the current document and writes it to a file. + * + * Per default includes a tag at the start of the data too. + * + * @param $fileName (string) + * @param $absoluteXPath (string) The path to the parent node you want(see text above) + * @param $xmlHeader (array) The string that you would like to appear before + * the XML content. ie before the . If you + * do not specify this argument, the xmlHeader that was + * found in the parsed xml file will be used instead. + * @return (string) The returned string contains well-formed XML data + * or FALSE on error. + * @see exportAsXml(), exportAsHtml() + */ + function exportToFile($fileName, $absoluteXPath='', $xmlHeader=NULL) { + $status = FALSE; + do { // try-block + if (!($hFile = fopen($fileName, "wb"))) { // Did we open the file ok? + $errStr = "Failed to open the $fileName xml file."; + break; // try-block + } + + if ($this->properties['OS_supports_flock']) { + if (!flock($hFile, LOCK_EX + LOCK_NB)) { // Lock the file + $errStr = "Couldn't get an exclusive lock on the $fileName file."; + break; // try-block + } + } + if (!($xmlOut = $this->_export($absoluteXPath, $xmlHeader))) { + $errStr = "Export failed"; + break; // try-block + } + + $iBytesWritten = fwrite($hFile, $xmlOut); + if ($iBytesWritten != strlen($xmlOut)) { + $errStr = "Write error when writing back the $fileName file."; + break; // try-block + } + + // Flush and unlock the file + @fflush($hFile); + $status = TRUE; + } while(FALSE); + + @flock($hFile, LOCK_UN); + @fclose($hFile); + // Sanity check the produced file. + clearstatcache(); + if (filesize($fileName) < strlen($xmlOut)) { + $errStr = "Write error when writing back the $fileName file."; + $status = FALSE; + } + + if (!$status) $this->_displayError($errStr, __LINE__, __FILE__, FALSE); + return $status; + } + + /** + * Generates a XML string with the content of the current document. + * + * This is the start for extracting the XML-data from the node-tree. We do some preperations + * and then call _InternalExport() to fetch the main XML-data. You optionally may pass + * xpath to any node that will then be used as top node, to extract XML-parts of the + * document. Default is '', meaning to extract the whole document. + * + * You also may pass a 'xmlHeader' (usually something like that will + * overwrite any other 'xmlHeader', if there was one in the original source. If there + * wasn't one in the original source, and you still don't specify one, then it will + * use a default of + * Finaly, when exporting to HTML, you may pass a vector xPaths you want to hi-light. + * The hi-lighted tags and attributes will receive a nice color. + * + * NOTE I : The output can have 2 formats: + * a) If "skip white spaces" is/was set. (Not Recommended - slower) + * The output is formatted by adding indenting and carriage returns. + * b) If "skip white spaces" is/was *NOT* set. + * 'as is'. No formatting is done. The output should the same as the + * the original parsed XML source. + * + * @param $absoluteXPath (string) (optional, default is root) The node we choose as top-node + * @param $xmlHeader (string) (optional) content before (see text above) + * @param $hilightXpath (array) (optional) a vector of xPaths to nodes we wat to + * hi-light (see text above) + * @return (mixed) The xml string, or FALSE on error. + */ + function _export($absoluteXPath='', $xmlHeader=NULL, $hilightXpathList='') { + // Check whether a root node is given. + if (empty($absoluteXpath)) $absoluteXpath = ''; + if ($absoluteXpath == '/') $absoluteXpath = ''; + if ($this->_indexIsDirty) $this->reindexNodeTree(); + if (!isSet($this->nodeIndex[$absoluteXpath])) { + // If the $absoluteXpath was '' and it didn't exist, then the document is empty + // and we can safely return ''. + if ($absoluteXpath == '') return ''; + $this->_displayError("The given xpath '{$absoluteXpath}' isn't a node in this document.", __LINE__, __FILE__, FALSE); + return FALSE; + } + + $this->hilightXpathList = $hilightXpathList; + $this->indentStep = ' '; + $hilightIsActive = is_array($hilightXpathList); + if ($hilightIsActive) { + $this->indentStep = '    '; + } + + // Cache this now + $this->parseSkipWhiteCache = isSet($this->parseOptions[XML_OPTION_SKIP_WHITE]) ? $this->parseOptions[XML_OPTION_SKIP_WHITE] : FALSE; + + /////////////////////////////////////// + // Get the starting node and begin with the header + + // Get the start node. The super root is a special case. + $startNode = NULL; + if (empty($absoluteXPath)) { + $superRoot = $this->nodeIndex['']; + // If they didn't specify an xml header, use the one in the object + if (is_null($xmlHeader)) { + $xmlHeader = $this->parseSkipWhiteCache ? trim($superRoot['textParts'][0]) : $superRoot['textParts'][0]; + // If we still don't have an XML header, then use a suitable default + if (empty($xmlHeader)) { + $xmlHeader = ''; + } + } + + if (isSet($superRoot['childNodes'][0])) $startNode = $superRoot['childNodes'][0]; + } else { + $startNode = $this->nodeIndex[$absoluteXPath]; + } + + if (!empty($xmlHeader)) { + $xmlOut = $this->parseSkipWhiteCache ? $xmlHeader."\n" : $xmlHeader; + } else { + $xmlOut = ''; + } + + /////////////////////////////////////// + // Output the document. + + if (($xmlOut .= $this->_InternalExport($startNode)) === FALSE) { + return FALSE; + } + + /////////////////////////////////////// + + // Convert our markers to hi-lights. + if ($hilightIsActive) { + $from = array('<', '>', chr(2), chr(3)); + $to = array('<', '>', '', ''); + $xmlOut = str_replace($from, $to, $xmlOut); + } + return $xmlOut; + } + + /** + * Export the xml document starting at the named node. + * + * @param $node (node) The node we have to start exporting from + * @return (string) The string representation of the node. + */ + function _InternalExport($node) { + $ThisFunctionName = '_InternalExport'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + echo "Exporting node: ".$node['xpath']."
      \n"; + } + + //////////////////////////////// + + // Quick out. + if (empty($node)) return ''; + + // The output starts as empty. + $xmlOut = ''; + // This loop will output the text before the current child of a parent then the + // current child. Where the child is a short tag we output the child, then move + // onto the next child. Where the child is not a short tag, we output the open tag, + // then queue up on currentParentStack[] the child. + // + // When we run out of children, we then output the last text part, and close the + // 'parent' tag before popping the stack and carrying on. + // + // To illustrate, the numbers in this xml file indicate what is output on each + // pass of the while loop: + // + // 1 + // <1>2 + // <2>3 + // <3/>4 + // 5 + // <5/>6 + // + + // Although this is neater done using recursion, there's a 33% performance saving + // to be gained by using this stack mechanism. + + // Only add CR's if "skip white spaces" was set. Otherwise leave as is. + $CR = ($this->parseSkipWhiteCache) ? "\n" : ''; + $currentIndent = ''; + $hilightIsActive = is_array($this->hilightXpathList); + + // To keep track of where we are in the document we use a node stack. The node + // stack has the following parallel entries: + // 'Parent' => (array) A copy of the parent node that who's children we are + // exporting + // 'ChildIndex' => (array) The child index of the corresponding parent that we + // are currently exporting. + // 'Highlighted'=> (bool) If we are highlighting this node. Only relevant if + // the hilight is active. + + // Setup our node stack. The loop is designed to output children of a parent, + // not the parent itself, so we must put the parent on as the starting point. + $nodeStack['Parent'] = array($node['parentNode']); + // And add the childpos of our node in it's parent to our "child index stack". + $nodeStack['ChildIndex'] = array($node['pos']); + // We start at 0. + $nodeStackIndex = 0; + + // We have not to output text before/after our node, so blank it. We will recover it + // later + $OldPreceedingStringValue = $nodeStack['Parent'][0]['textParts'][$node['pos']]; + $OldPreceedingStringRef =& $nodeStack['Parent'][0]['textParts'][$node['pos']]; + $OldPreceedingStringRef = ""; + $currentXpath = ""; + + // While we still have data on our stack + while ($nodeStackIndex >= 0) { + // Count the children and get a copy of the current child. + $iChildCount = count($nodeStack['Parent'][$nodeStackIndex]['childNodes']); + $currentChild = $nodeStack['ChildIndex'][$nodeStackIndex]; + // Only do the auto indenting if the $parseSkipWhiteCache flag was set. + if ($this->parseSkipWhiteCache) + $currentIndent = str_repeat($this->indentStep, $nodeStackIndex); + + if ($bDebugThisFunction) + echo "Exporting child ".($currentChild+1)." of node {$nodeStack['Parent'][$nodeStackIndex]['xpath']}\n"; + + /////////////////////////////////////////// + // Add the text before our child. + + // Add the text part before the current child + $tmpTxt =& $nodeStack['Parent'][$nodeStackIndex]['textParts'][$currentChild]; + if (isSet($tmpTxt) AND ($tmpTxt!="")) { + // Only add CR indent if there were children + if ($iChildCount) + $xmlOut .= $CR.$currentIndent; + // Hilight if necessary. + $highlightStart = $highlightEnd = ''; + if ($hilightIsActive) { + $currentXpath = $nodeStack['Parent'][$nodeStackIndex]['xpath'].'/text()['.($currentChild+1).']'; + if (in_array($currentXpath, $this->hilightXpathList)) { + // Yes we hilight + $highlightStart = chr(2); + $highlightEnd = chr(3); + } + } + $xmlOut .= $highlightStart.$nodeStack['Parent'][$nodeStackIndex]['textParts'][$currentChild].$highlightEnd; + } + if ($iChildCount && $nodeStackIndex) $xmlOut .= $CR; + + /////////////////////////////////////////// + + // Are there any more children? + if ($iChildCount <= $currentChild) { + // Nope, so output the last text before the closing tag + $tmpTxt =& $nodeStack['Parent'][$nodeStackIndex]['textParts'][$currentChild+1]; + if (isSet($tmpTxt) AND ($tmpTxt!="")) { + // Hilight if necessary. + $highlightStart = $highlightEnd = ''; + if ($hilightIsActive) { + $currentXpath = $nodeStack['Parent'][$nodeStackIndex]['xpath'].'/text()['.($currentChild+2).']'; + if (in_array($currentXpath, $this->hilightXpathList)) { + // Yes we hilight + $highlightStart = chr(2); + $highlightEnd = chr(3); + } + } + $xmlOut .= $highlightStart + .$currentIndent.$nodeStack['Parent'][$nodeStackIndex]['textParts'][$currentChild+1].$CR + .$highlightEnd; + } + + // Now close this tag, as we are finished with this child. + + // Potentially output an (slightly smaller indent). + if ($this->parseSkipWhiteCache + && count($nodeStack['Parent'][$nodeStackIndex]['childNodes'])) { + $xmlOut .= str_repeat($this->indentStep, $nodeStackIndex - 1); + } + + // Check whether the xml-tag is to be hilighted. + $highlightStart = $highlightEnd = ''; + if ($hilightIsActive) { + $currentXpath = $nodeStack['Parent'][$nodeStackIndex]['xpath']; + if (in_array($currentXpath, $this->hilightXpathList)) { + // Yes we hilight + $highlightStart = chr(2); + $highlightEnd = chr(3); + } + } + $xmlOut .= $highlightStart + .'' + .$highlightEnd; + // Decrement the $nodeStackIndex to go back to the next unfinished parent. + $nodeStackIndex--; + + // If the index is 0 we are finished exporting the last node, as we may have been + // exporting an internal node. + if ($nodeStackIndex == 0) break; + + // Indicate to the parent that we are finished with this child. + $nodeStack['ChildIndex'][$nodeStackIndex]++; + + continue; + } + + /////////////////////////////////////////// + // Ok, there are children still to process. + + // Queue up the next child (I can copy because I won't modify and copying is faster.) + $nodeStack['Parent'][$nodeStackIndex + 1] = $nodeStack['Parent'][$nodeStackIndex]['childNodes'][$currentChild]; + + // Work out if it is a short child tag. + $iGrandChildCount = count($nodeStack['Parent'][$nodeStackIndex + 1]['childNodes']); + $shortGrandChild = (($iGrandChildCount == 0) AND (implode('',$nodeStack['Parent'][$nodeStackIndex + 1]['textParts'])=='')); + + /////////////////////////////////////////// + // Assemble the attribute string first. + $attrStr = ''; + foreach($nodeStack['Parent'][$nodeStackIndex + 1]['attributes'] as $key=>$val) { + // Should we hilight the attribute? + if ($hilightIsActive AND in_array($currentXpath.'/attribute::'.$key, $this->hilightXpathList)) { + $hiAttrStart = chr(2); + $hiAttrEnd = chr(3); + } else { + $hiAttrStart = $hiAttrEnd = ''; + } + $attrStr .= ' '.$hiAttrStart.$key.'="'.$val.'"'.$hiAttrEnd; + } + + /////////////////////////////////////////// + // Work out what goes before and after the tag content + + $beforeTagContent = $currentIndent; + if ($shortGrandChild) $afterTagContent = '/>'; + else $afterTagContent = '>'; + + // Check whether the xml-tag is to be hilighted. + if ($hilightIsActive) { + $currentXpath = $nodeStack['Parent'][$nodeStackIndex + 1]['xpath']; + if (in_array($currentXpath, $this->hilightXpathList)) { + // Yes we hilight + $beforeTagContent .= chr(2); + $afterTagContent .= chr(3); + } + } + $beforeTagContent .= '<'; +// if ($shortGrandChild) $afterTagContent .= $CR; + + /////////////////////////////////////////// + // Output the tag + + $xmlOut .= $beforeTagContent + .$nodeStack['Parent'][$nodeStackIndex + 1]['name'].$attrStr + .$afterTagContent; + + /////////////////////////////////////////// + // Carry on. + + // If it is a short tag, then we've already done this child, we just move to the next + if ($shortGrandChild) { + // Move to the next child, we need not go deeper in the tree. + $nodeStack['ChildIndex'][$nodeStackIndex]++; + // But if we are just exporting the one node we'd go no further. + if ($nodeStackIndex == 0) break; + } else { + // Else queue up the child going one deeper in the stack + $nodeStackIndex++; + // Start with it's first child + $nodeStack['ChildIndex'][$nodeStackIndex] = 0; + } + } + + $result = $xmlOut; + + // Repair what we "undid" + $OldPreceedingStringRef = $OldPreceedingStringValue; + + //////////////////////////////////////////// + + $this->_closeDebugFunction($ThisFunctionName, $result, $bDebugThisFunction); + + return $result; + } + + //----------------------------------------------------------------------------------------- + // XPathEngine ------ Import the XML Source ------ + //----------------------------------------------------------------------------------------- + + /** + * Reads a file or URL and parses the XML data. + * + * Parse the XML source and (upon success) store the information into an internal structure. + * + * @param $fileName (string) Path and name (or URL) of the file to be read and parsed. + * @return (bool) TRUE on success, FALSE on failure (check getLastError()) + * @see importFromString(), getLastError(), + */ + function importFromFile($fileName) { + $status = FALSE; + $errStr = ''; + do { // try-block + // Remember file name. Used in error output to know in which file it happend + $this->properties['xmlFile'] = $fileName; + // If we already have content, then complain. + if (!empty($this->nodeRoot)) { + $errStr = 'Called when this object already contains xml data. Use reset().'; + break; // try-block + } + // The the source is an url try to fetch it. + if (preg_match(';^http(s)?://;', $fileName)) { + // Read the content of the url...this is really prone to errors, and we don't really + // check for too many here...for now, suppressing both possible warnings...we need + // to check if we get a none xml page or something of that nature in the future + $xmlString = @implode('', @file($fileName)); + if (!empty($xmlString)) { + $status = TRUE; + } else { + $errStr = "The url '{$fileName}' could not be found or read."; + } + break; // try-block + } + + // Reaching this point we're dealing with a real file (not an url). Check if the file exists and is readable. + if (!is_readable($fileName)) { // Read the content from the file + $errStr = "File '{$fileName}' could not be found or read."; + break; // try-block + } + if (is_dir($fileName)) { + $errStr = "'{$fileName}' is a directory."; + break; // try-block + } + // Read the file + if (!($fp = @fopen($fileName, 'rb'))) { + $errStr = "Failed to open '{$fileName}' for read."; + break; // try-block + } + $xmlString = fread($fp, filesize($fileName)); + @fclose($fp); + + $status = TRUE; + } while (FALSE); + + if (!$status) { + $this->_displayError('In importFromFile(): '. $errStr, __LINE__, __FILE__, FALSE); + return FALSE; + } + return $this->importFromString($xmlString); + } + + /** + * Reads a string and parses the XML data. + * + * Parse the XML source and (upon success) store the information into an internal structure. + * If a parent xpath is given this means that XML data is to be *appended* to that parent. + * + * ### If a function uses setLastError(), then say in the function header that getLastError() is useful. + * + * @param $xmlString (string) Name of the string to be read and parsed. + * @param $absoluteParentPath (string) Node to append data too (see above) + * @return (bool) TRUE on success, FALSE on failure + * (check getLastError()) + */ + function importFromString($xmlString, $absoluteParentPath = '') { + $ThisFunctionName = 'importFromString'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + echo "Importing from string of length ".strlen($xmlString)." to node '$absoluteParentPath'\n
      "; + echo "Parser options:\n
      "; + print_r($this->parseOptions); + } + + $status = FALSE; + $errStr = ''; + do { // try-block + // If we already have content, then complain. + if (!empty($this->nodeRoot) AND empty($absoluteParentPath)) { + $errStr = 'Called when this object already contains xml data. Use reset() or pass the parent Xpath as 2ed param to where tie data will append.'; + break; // try-block + } + // Check whether content has been read. + if (empty($xmlString)) { + // Nothing to do!! + $status = TRUE; + // If we were importing to root, build a blank root. + if (empty($absoluteParentPath)) { + $this->_createSuperRoot(); + } + $this->reindexNodeTree(); +// $errStr = 'This xml document (string) was empty'; + break; // try-block + } else { + $xmlString = $this->_translateAmpersand($xmlString); + } + + // Restart our node index with a root entry. + $nodeStack = array(); + $this->parseStackIndex = 0; + + // If a parent xpath is given this means that XML data is to be *appended* to that parent. + if (!empty($absoluteParentPath)) { + // Check if parent exists + if (!isSet($this->nodeIndex[$absoluteParentPath])) { + $errStr = "You tried to append XML data to a parent '$absoluteParentPath' that does not exist."; + break; // try-block + } + // Add it as the starting point in our array. + $this->nodeStack[0] =& $this->nodeIndex[$absoluteParentPath]; + } else { + // Build a 'super-root' + $this->_createSuperRoot(); + // Put it in as the start of our node stack. + $this->nodeStack[0] =& $this->nodeRoot; + } + + // Point our text buffer reference at the next text part of the root + $this->parsedTextLocation =& $this->nodeStack[0]['textParts'][]; + $this->parsInCData = 0; + // We cache this now. + $this->parseSkipWhiteCache = isSet($this->parseOptions[XML_OPTION_SKIP_WHITE]) ? $this->parseOptions[XML_OPTION_SKIP_WHITE] : FALSE; + + // Create an XML parser. + $parser = xml_parser_create(); + // Set default XML parser options. + if (is_array($this->parseOptions)) { + foreach($this->parseOptions as $key => $val) { + xml_parser_set_option($parser, $key, $val); + } + } + + // Set the object and the element handlers for the XML parser. + xml_set_object($parser, $this); + xml_set_element_handler($parser, '_handleStartElement', '_handleEndElement'); + xml_set_character_data_handler($parser, '_handleCharacterData'); + xml_set_default_handler($parser, '_handleDefaultData'); + xml_set_processing_instruction_handler($parser, '_handlePI'); + + // Parse the XML source and on error generate an error message. + if (!xml_parse($parser, $xmlString, TRUE)) { + $source = empty($this->properties['xmlFile']) ? 'string' : 'file ' . basename($this->properties['xmlFile']) . "'"; + $errStr = "XML error in given {$source} on line ". + xml_get_current_line_number($parser). ' column '. xml_get_current_column_number($parser) . + '. Reason:'. xml_error_string(xml_get_error_code($parser)); + break; // try-block + } + + // Free the parser. + @xml_parser_free($parser); + // And we don't need this any more. + $this->nodeStack = array(); + + $this->reindexNodeTree(); + + if ($bDebugThisFunction) { + print_r(array_keys($this->nodeIndex)); + } + + $status = TRUE; + } while (FALSE); + + if (!$status) { + $this->_displayError('In importFromString(): '. $errStr, __LINE__, __FILE__, FALSE); + $bResult = FALSE; + } else { + $bResult = TRUE; + } + + //////////////////////////////////////////// + + $this->_closeDebugFunction($ThisFunctionName, $bResult, $bDebugThisFunction); + + return $bResult; + } + + + //----------------------------------------------------------------------------------------- + // XPathEngine ------ XML Handlers ------ + //----------------------------------------------------------------------------------------- + + /** + * Handles opening XML tags while parsing. + * + * While parsing a XML document for each opening tag this method is + * called. It'll add the tag found to the tree of document nodes. + * + * @param $parser (int) Handler for accessing the current XML parser. + * @param $name (string) Name of the opening tag found in the document. + * @param $attributes (array) Associative array containing a list of + * all attributes of the tag found in the document. + * @see _handleEndElement(), _handleCharacterData() + */ + function _handleStartElement($parser, $nodeName, $attributes) { + if (empty($nodeName)) { + $this->_displayError('XML error in file at line'. xml_get_current_line_number($parser) .'. Empty name.', __LINE__, __FILE__); + return; + } + + // Trim accumulated text if necessary. + if ($this->parseSkipWhiteCache) { + $iCount = count($this->nodeStack[$this->parseStackIndex]['textParts']); + $this->nodeStack[$this->parseStackIndex]['textParts'][$iCount-1] = rtrim($this->parsedTextLocation); + } + + if ($this->bDebugXmlParse) { + echo "
      " . htmlspecialchars("Start node: <".$nodeName . ">")."
      "; + echo "Appended to stack entry: $this->parseStackIndex
      \n"; + echo "Text part before element is: ".htmlspecialchars($this->parsedTextLocation); + /* + echo "
      ";
      +      $dataPartsCount = count($this->nodeStack[$this->parseStackIndex]['textParts']);
      +      for ($i = 0; $i < $dataPartsCount; $i++) {
      +        echo "$i:". htmlspecialchars($this->nodeStack[$this->parseStackIndex]['textParts'][$i])."\n";
      +      }
      +      echo "
      "; + */ + } + + // Add a node and set path to current. + if (!$this->_internalAppendChild($this->parseStackIndex, $nodeName)) { + $this->_displayError('Internal error during parse of XML file at line'. xml_get_current_line_number($parser) .'. Empty name.', __LINE__, __FILE__); + return; + } + + // We will have gone one deeper then in the stack. + $this->parseStackIndex++; + + // Point our parseTxtBuffer reference at the new node. + $this->parsedTextLocation =& $this->nodeStack[$this->parseStackIndex]['textParts'][0]; + + // Set the attributes. + if (!empty($attributes)) { + if ($this->bDebugXmlParse) { + echo 'Attributes:
      '; + print_r($attributes); + echo '
      '; + } + $this->nodeStack[$this->parseStackIndex]['attributes'] = $attributes; + } + } + + /** + * Handles closing XML tags while parsing. + * + * While parsing a XML document for each closing tag this method is called. + * + * @param $parser (int) Handler for accessing the current XML parser. + * @param $name (string) Name of the closing tag found in the document. + * @see _handleStartElement(), _handleCharacterData() + */ + function _handleEndElement($parser, $name) { + if (($this->parsedTextLocation=='') + && empty($this->nodeStack[$this->parseStackIndex]['textParts'])) { + // We reach this point when parsing a tag of format . The 'textParts'-array + // should stay empty and not have an empty string in it. + } else { + // Trim accumulated text if necessary. + if ($this->parseSkipWhiteCache) { + $iCount = count($this->nodeStack[$this->parseStackIndex]['textParts']); + $this->nodeStack[$this->parseStackIndex]['textParts'][$iCount-1] = rtrim($this->parsedTextLocation); + } + } + + if ($this->bDebugXmlParse) { + echo "Text part after element is: ".htmlspecialchars($this->parsedTextLocation)."
      \n"; + echo htmlspecialchars("Parent:<{$this->parseStackIndex}>, End-node: '".$this->parsedTextLocation) . "'
      Text nodes:
      \n";
      +      $dataPartsCount = count($this->nodeStack[$this->parseStackIndex]['textParts']);
      +      for ($i = 0; $i < $dataPartsCount; $i++) {
      +        echo "$i:". htmlspecialchars($this->nodeStack[$this->parseStackIndex]['textParts'][$i])."\n";
      +      }
      +      var_dump($this->nodeStack[$this->parseStackIndex]['textParts']);
      +      echo "
      \n"; + } + + // Jump back to the parent element. + $this->parseStackIndex--; + + // Set our reference for where we put any more whitespace + $this->parsedTextLocation =& $this->nodeStack[$this->parseStackIndex]['textParts'][]; + + // Note we leave the entry in the stack, as it will get blanked over by the next element + // at this level. The safe thing to do would be to remove it too, but in the interests + // of performance, we will not bother, as were it to be a problem, then it would be an + // internal bug anyway. + if ($this->parseStackIndex < 0) { + $this->_displayError('Internal error during parse of XML file at line'. xml_get_current_line_number($parser) .'. Empty name.', __LINE__, __FILE__); + return; + } + } + + /** + * Handles character data while parsing. + * + * While parsing a XML document for each character data this method + * is called. It'll add the character data to the document tree. + * + * @param $parser (int) Handler for accessing the current XML parser. + * @param $text (string) Character data found in the document. + * @see _handleStartElement(), _handleEndElement() + */ + function _handleCharacterData($parser, $text) { + + if ($this->parsInCData >0) $text = $this->_translateAmpersand($text, $reverse=TRUE); + + if ($this->bDebugXmlParse) echo "Handling character data: '".htmlspecialchars($text)."'
      "; + if ($this->parseSkipWhiteCache AND !empty($text) AND !$this->parsInCData) { + // Special case CR. CR always comes in a separate data. Trans. it to '' or ' '. + // If txtBuffer is already ending with a space use '' otherwise ' '. + $bufferHasEndingSpace = (empty($this->parsedTextLocation) OR substr($this->parsedTextLocation, -1) === ' ') ? TRUE : FALSE; + if ($text=="\n") { + $text = $bufferHasEndingSpace ? '' : ' '; + } else { + if ($bufferHasEndingSpace) { + $text = ltrim(preg_replace('/\s+/', ' ', $text)); + } else { + $text = preg_replace('/\s+/', ' ', $text); + } + } + if ($this->bDebugXmlParse) echo "'Skip white space' is ON. reduced to : '" .htmlspecialchars($text) . "'
      "; + } + $this->parsedTextLocation .= $text; + } + + /** + * Default handler for the XML parser. + * + * While parsing a XML document for string not caught by one of the other + * handler functions, we end up here. + * + * @param $parser (int) Handler for accessing the current XML parser. + * @param $text (string) Character data found in the document. + * @see _handleStartElement(), _handleEndElement() + */ + function _handleDefaultData($parser, $text) { + do { // try-block + if (!strcmp($text, 'parsInCData++; + } elseif (!strcmp($text, ']]>')) { + $this->parsInCData--; + if ($this->parsInCData < 0) $this->parsInCData = 0; + } + $this->parsedTextLocation .= $this->_translateAmpersand($text, $reverse=TRUE); + if ($this->bDebugXmlParse) echo "Default handler data: ".htmlspecialchars($text)."
      "; + break; // try-block + } while (FALSE); // END try-block + } + + /** + * Handles processing instruction (PI) + * + * A processing instruction has the following format: + * e.g. + * + * Currently I have no bether idea as to left it 'as is' and treat the PI data as normal + * text (and adding the surrounding PI-tags ). + * + * @param $parser (int) Handler for accessing the current XML parser. + * @param $target (string) Name of the PI target. E.g. XML, PHP, DTD, ... + * @param $data (string) Associative array containing a list of + * @see PHP's manual "xml_set_processing_instruction_handler" + */ + function _handlePI($parser, $target, $data) { + //echo("pi data=".$data."end"); exit; + $data = $this->_translateAmpersand($data, $reverse=TRUE); + $this->parsedTextLocation .= ""; + return TRUE; + } + + //----------------------------------------------------------------------------------------- + // XPathEngine ------ Node Tree Stuff ------ + //----------------------------------------------------------------------------------------- + + /** + * Creates a super root node. + */ + function _createSuperRoot() { + // Build a 'super-root' + $this->nodeRoot = $this->emptyNode; + $this->nodeRoot['name'] = ''; + $this->nodeRoot['parentNode'] = NULL; + $this->nodeIndex[''] =& $this->nodeRoot; + } + + /** + * Adds a new node to the XML document tree during xml parsing. + * + * This method adds a new node to the tree of nodes of the XML document + * being handled by this class. The new node is created according to the + * parameters passed to this method. This method is a much watered down + * version of appendChild(), used in parsing an xml file only. + * + * It is assumed that adding starts with root and progresses through the + * document in parse order. New nodes must have a corresponding parent. And + * once we have read the tag for the element we will never need to add + * any more data to that node. Otherwise the add will be ignored or fail. + * + * The function is faciliated by a nodeStack, which is an array of nodes that + * we have yet to close. + * + * @param $stackParentIndex (int) The index into the nodeStack[] of the parent + * node to which the new node should be added as + * a child. *READONLY* + * @param $nodeName (string) Name of the new node. *READONLY* + * @return (bool) TRUE if we successfully added a new child to + * the node stack at index $stackParentIndex + 1, + * FALSE on error. + */ + function _internalAppendChild($stackParentIndex, $nodeName) { + // This call is likely to be executed thousands of times, so every 0.01ms counts. + // If you want to debug this function, you'll have to comment the stuff back in + //$bDebugThisFunction = FALSE; + + /* + $ThisFunctionName = '_internalAppendChild'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + echo "Current Node (parent-index) and the child to append : '{$stackParentIndex}' + '{$nodeName}' \n
      "; + } + */ + ////////////////////////////////////// + + if (!isSet($this->nodeStack[$stackParentIndex])) { + $errStr = "Invalid parent. You tried to append the tag '{$nodeName}' to an non-existing parent in our node stack '{$stackParentIndex}'."; + $this->_displayError('In _internalAppendChild(): '. $errStr, __LINE__, __FILE__, FALSE); + + /* + $this->_closeDebugFunction($ThisFunctionName, FALSE, $bDebugThisFunction); + */ + + return FALSE; + } + + // Retrieve the parent node from the node stack. This is the last node at that + // depth that we have yet to close. This is where we should add the text/node. + $parentNode =& $this->nodeStack[$stackParentIndex]; + + // Brand new node please + $newChildNode = $this->emptyNode; + + // Save the vital information about the node. + $newChildNode['name'] = $nodeName; + $parentNode['childNodes'][] =& $newChildNode; + + // Add to our node stack + $this->nodeStack[$stackParentIndex + 1] =& $newChildNode; + + /* + if ($bDebugThisFunction) { + echo "The new node received index: '".($stackParentIndex + 1)."'\n"; + foreach($this->nodeStack as $key => $val) echo "$key => ".$val['name']."\n"; + } + $this->_closeDebugFunction($ThisFunctionName, TRUE, $bDebugThisFunction); + */ + + return TRUE; + } + + /** + * Update nodeIndex and every node of the node-tree. + * + * Call after you have finished any tree modifications other wise a match with + * an xPathQuery will produce wrong results. The $this->nodeIndex[] is recreated + * and every nodes optimization data is updated. The optimization data is all the + * data that is duplicate information, would just take longer to find. Child nodes + * with value NULL are removed from the tree. + * + * By default the modification functions in this component will automatically re-index + * the nodes in the tree. Sometimes this is not the behaver you want. To surpress the + * reindex, set the functions $autoReindex to FALSE and call reindexNodeTree() at the + * end of your changes. This sometimes leads to better code (and less CPU overhead). + * + * Sample: + * ======= + * Given the xml is .. | Goal is .. (Delete B[1] and B[3]) + * $xPathSet = $xPath->match('//B'); # Will result in array('/AAA[1]/B[1]', '/AAA[1]/B[2]', '/AAA[1]/B[3]'); + * Three ways to do it. + * 1) Top-Down (with auto reindexing) - Safe, Slow and you get easily mix up with the the changing node index + * removeChild('/AAA[1]/B[1]'); // B[1] removed, thus all B[n] become B[n-1] !! + * removeChild('/AAA[1]/B[2]'); // Now remove B[2] (That originaly was B[3]) + * 2) Bottom-Up (with auto reindexing) - Safe, Slow and the changing node index (caused by auto-reindex) can be ignored. + * for ($i=sizeOf($xPathSet)-1; $i>=0; $i--) { + * if ($i==1) continue; + * removeChild($xPathSet[$i]); + * } + * 3) // Top-down (with *NO* auto reindexing) - Fast, Safe as long as you call reindexNodeTree() + * foreach($xPathSet as $xPath) { + * // Specify no reindexing + * if ($xPath == $xPathSet[1]) continue; + * removeChild($xPath, $autoReindex=FALSE); + * // The object is now in a slightly inconsistent state. + * } + * // Finally do the reindex and the object is consistent again + * reindexNodeTree(); + * + * @return (bool) TRUE on success, FALSE otherwise. + * @see _recursiveReindexNodeTree() + */ + function reindexNodeTree() { + //return; + $this->_indexIsDirty = FALSE; + $this->nodeIndex = array(); + $this->nodeIndex[''] =& $this->nodeRoot; + // Quick out for when the tree has no data. + if (empty($this->nodeRoot)) return TRUE; + return $this->_recursiveReindexNodeTree(''); + } + + + /** + * Create the ids that are accessable through the generate-id() function + */ + function _generate_ids() { + // If we have generated them already, then bail. + if (isset($this->nodeIndex['']['generate_id'])) return; + + // keys generated are the string 'id0' . hexatridecimal-based (0..9,a-z) index + $aNodeIndexes = array_keys($this->nodeIndex); + $idNumber = 0; + foreach($aNodeIndexes as $index => $key) { +// $this->nodeIndex[$key]['generated_id'] = 'id' . base_convert($index,10,36); + // Skip attribute and text nodes. + // ### Currently don't support attribute and text nodes. + if (strstr($key, 'text()') !== FALSE) continue; + if (strstr($key, 'attribute::') !== FALSE) continue; + $this->nodeIndex[$key]['generated_id'] = 'idPhpXPath' . $idNumber; + + // Make the id's sequential so that we can test predictively. + $idNumber++; + } + } + + /** + * Here's where the work is done for reindexing (see reindexNodeTree) + * + * @param $absoluteParentPath (string) the xPath to the parent node + * @return (bool) TRUE on success, FALSE otherwise. + * @see reindexNodeTree() + */ + function _recursiveReindexNodeTree($absoluteParentPath) { + $parentNode =& $this->nodeIndex[$absoluteParentPath]; + + // Check for any 'dead' child nodes first and concate the text parts if found. + for ($iChildIndex=sizeOf($parentNode['childNodes'])-1; $iChildIndex>=0; $iChildIndex--) { + // Check if the child node still exits (it may have been removed). + if (!empty($parentNode['childNodes'][$iChildIndex])) continue; + // Child node was removed. We got to merge the text parts then. + $parentNode['textParts'][$iChildIndex] .= $parentNode['textParts'][$iChildIndex+1]; + array_splice($parentNode['textParts'], $iChildIndex+1, 1); + array_splice($parentNode['childNodes'], $iChildIndex, 1); + } + + // Now start a reindex. + $contextHash = array(); + $childSize = sizeOf($parentNode['childNodes']); + + // If there are no children, we have to treat this specially: + if ($childSize == 0) { + // Add a dummy text node. + $this->nodeIndex[$absoluteParentPath.'/text()[1]'] =& $parentNode; + } else { + for ($iChildIndex=0; $iChildIndex<$childSize; $iChildIndex++) { + $childNode =& $parentNode['childNodes'][$iChildIndex]; + // Make sure that there is a text-part in front of every node. (May be empty) + if (!isSet($parentNode['textParts'][$iChildIndex])) $parentNode['textParts'][$iChildIndex] = ''; + // Count the nodes with same name (to determine their context position) + $childName = $childNode['name']; + if (empty($contextHash[$childName])) { + $contextPos = $contextHash[$childName] = 1; + } else { + $contextPos = ++$contextHash[$childName]; + } + // Make the node-index hash + $newPath = $absoluteParentPath . '/' . $childName . '['.$contextPos.']'; + + // ### Note ultimately we will end up supporting text nodes as actual nodes. + + // Preceed with a dummy entry for the text node. + $this->nodeIndex[$absoluteParentPath.'/text()['.($childNode['pos']+1).']'] =& $childNode; + // Then the node itself + $this->nodeIndex[$newPath] =& $childNode; + + // Now some dummy nodes for each of the attribute nodes. + $iAttributeCount = sizeOf($childNode['attributes']); + if ($iAttributeCount > 0) { + $aAttributesNames = array_keys($childNode['attributes']); + for ($iAttributeIndex = 0; $iAttributeIndex < $iAttributeCount; $iAttributeIndex++) { + $attribute = $aAttributesNames[$iAttributeIndex]; + $newAttributeNode = $this->emptyNode; + $newAttributeNode['name'] = $attribute; + $newAttributeNode['textParts'] = array($childNode['attributes'][$attribute]); + $newAttributeNode['contextPos'] = $iAttributeIndex; + $newAttributeNode['xpath'] = "$newPath/attribute::$attribute"; + $newAttributeNode['parentNode'] =& $childNode; + $newAttributeNode['depth'] =& $parentNode['depth'] + 2; + // Insert the node as a master node, not a reference, otherwise there will be + // variable "bleeding". + $this->nodeIndex["$newPath/attribute::$attribute"] = $newAttributeNode; + } + } + + // Update the node info (optimisation) + $childNode['parentNode'] =& $parentNode; + $childNode['depth'] = $parentNode['depth'] + 1; + $childNode['pos'] = $iChildIndex; + $childNode['contextPos'] = $contextHash[$childName]; + $childNode['xpath'] = $newPath; + $this->_recursiveReindexNodeTree($newPath); + + // Follow with a dummy entry for the text node. + $this->nodeIndex[$absoluteParentPath.'/text()['.($childNode['pos']+2).']'] =& $childNode; + } + + // Make sure that their is a text-part after the last node. + if (!isSet($parentNode['textParts'][$iChildIndex])) $parentNode['textParts'][$iChildIndex] = ''; + } + + return TRUE; + } + + /** + * Clone a node and it's child nodes. + * + * NOTE: If the node has children you *MUST* use the reference operator! + * E.g. $clonedNode =& cloneNode($node); + * Otherwise the children will not point back to the parent, they will point + * back to your temporary variable instead. + * + * @param $node (mixed) Either a node (hash array) or an abs. Xpath to a node in + * the current doc + * @return (&array) A node and it's child nodes. + */ + function &cloneNode($node, $recursive=FALSE) { + if (is_string($node) AND isSet($this->nodeIndex[$node])) { + $node = $this->nodeIndex[$node]; + } + // Copy the text-parts () + $textParts = $node['textParts']; + $node['textParts'] = array(); + foreach ($textParts as $key => $val) { + $node['textParts'][] = $val; + } + + $childSize = sizeOf($node['childNodes']); + for ($i=0; $i<$childSize; $i++) { + $childNode =& $this->cloneNode($node['childNodes'][$i], TRUE); // copy child + $node['childNodes'][$i] =& $childNode; // reference the copy + $childNode['parentNode'] =& $node; // child references the parent. + } + + if (!$recursive) { + //$node['childNodes'][0]['parentNode'] = null; + //print "
      ";
      +      //var_dump($node);
      +    }
      +    return $node;
      +  }
      +  
      +  
      +/** Nice to have but __sleep() has a bug. 
      +    (2002-2 PHP V4.1. See bug #15350)
      +  
      +  /**
      +   * PHP cals this function when you call PHP's serialize. 
      +   *
      +   * It prevents cyclic referencing, which is why print_r() of an XPath object doesn't work.
      +   *
      +  function __sleep() {
      +    // Destroy recursive pointers
      +    $keys = array_keys($this->nodeIndex);
      +    $size = sizeOf($keys);
      +    for ($i=0; $i<$size; $i++) {
      +      unset($this->nodeIndex[$keys[$i]]['parentNode']);
      +    }
      +    unset($this->nodeIndex);
      +  }
      +  
      +  /**
      +   * PHP cals this function when you call PHP's unserialize. 
      +   *
      +   * It reindexes the node-tree
      +   *
      +  function __wakeup() {
      +    $this->reindexNodeTree();
      +  }
      +  
      +*/
      +  
      +  //-----------------------------------------------------------------------------------------
      +  // XPath            ------  XPath Query / Evaluation Handlers  ------                      
      +  //-----------------------------------------------------------------------------------------
      +  
      +  /**
      +   * Matches (evaluates) an XPath query
      +   *
      +   * This method tries to evaluate an XPath query by parsing it. A XML source must 
      +   * have been imported before this method is able to work.
      +   *
      +   * @param     $xPathQuery  (string) XPath query to be evaluated.
      +   * @param     $baseXPath   (string) (default is super-root) XPath query to a single document node, 
      +   *                                  from which the XPath query should  start evaluating.
      +   * @return                 (mixed)  The result of the XPath expression.  Either:
      +   *                                    node-set (an ordered collection of absolute references to nodes without duplicates) 
      +   *                                    boolean (true or false) 
      +   *                                    number (a floating-point number) 
      +   *                                    string (a sequence of UCS characters) 
      +   */
      +  function match($xPathQuery, $baseXPath='') {
      +    if ($this->_indexIsDirty) $this->reindexNodeTree();
      +    
      +    // Replace a double slashes, because they'll cause problems otherwise.
      +    static $slashes2descendant = array(
      +        '//@' => '/descendant_or_self::*/attribute::', 
      +        '//'  => '/descendant_or_self::node()/', 
      +        '/@'  => '/attribute::');
      +    // Stupid idea from W3C to take axes name containing a '-' (dash) !!!
      +    // We replace the '-' with '_' to avoid the conflict with the minus operator.
      +    static $dash2underscoreHash = array( 
      +        '-sibling'    => '_sibling', 
      +        '-or-'        => '_or_',
      +        'starts-with' => 'starts_with', 
      +        'substring-before' => 'substring_before',
      +        'substring-after'  => 'substring_after', 
      +        'string-length'    => 'string_length',
      +        'normalize-space'  => 'normalize_space',
      +        'x-lower'          => 'x_lower',
      +        'x-upper'          => 'x_upper',
      +        'generate-id'      => 'generate_id');
      +    
      +    if (empty($xPathQuery)) return array();
      +
      +    // Special case for when document is empty.
      +    if (empty($this->nodeRoot)) return array();
      +
      +    if (!isSet($this->nodeIndex[$baseXPath])) {
      +            $xPathSet = $this->_resolveXPathQuery($baseXPath,'match');
      +            if (sizeOf($xPathSet) !== 1) {
      +                $this->_displayError(sprintf($this->errorStrings['NoNodeMatch'], $xPathQuery), __LINE__, __FILE__, FALSE);
      +                return FALSE;
      +            }
      +            $baseXPath = $xPathSet[0];
      +    }
      +
      +    // We should possibly do a proper syntactical parse, but instead we will cheat and just
      +    // remove any literals that could make things very difficult for us, and replace them with
      +    // special tags.  Then we can treat the xPathQuery much more easily as JUST "syntax".  Provided 
      +    // there are no literals in the string, then we can guarentee that most of the operators and 
      +    // syntactical elements are indeed elements and not just part of a literal string.
      +    $processedxPathQuery = $this->_removeLiterals($xPathQuery);
      +    
      +    // Replace a double slashes, and '-' (dash) in axes names.
      +    $processedxPathQuery = strtr($processedxPathQuery, $slashes2descendant);
      +    $processedxPathQuery = strtr($processedxPathQuery, $dash2underscoreHash);
      +
      +    // Build the context
      +    $context = array('nodePath' => $baseXPath, 'pos' => 1, 'size' => 1);
      +
      +    // The primary syntactic construct in XPath is the expression.
      +    $result = $this->_evaluateExpr($processedxPathQuery, $context);
      +
      +    // We might have been returned a string.. If so convert back to a literal
      +    $literalString = $this->_asLiteral($result);
      +    if ($literalString != FALSE) return $literalString;
      +    else return $result;
      +  }
      +
      +  /**
      +   * Alias for the match function
      +   *
      +   * @see match()
      +   */
      +  function evaluate($xPathQuery, $baseXPath='') {
      +    return $this->match($xPathQuery, $baseXPath);
      +  }
      +
      +  /**
      +   * Parse out the literals of an XPath expression.
      +   *
      +   * Instead of doing a full lexical parse, we parse out the literal strings, and then
      +   * Treat the sections of the string either as parts of XPath or literal strings.  So
      +   * this function replaces each literal it finds with a literal reference, and then inserts
      +   * the reference into an array of strings that we can access.  The literals can be accessed
      +   * later from the literals associative array.
      +   *
      +   * Example:
      +   *  XPathExpr = /AAA[@CCC = "hello"]/BBB[DDD = 'world'] 
      +   *  =>  literals: array("hello", "world")
      +   *      return value: /AAA[@CCC = $1]/BBB[DDD = $2] 
      +   *
      +   * Note: This does not interfere with the VariableReference syntactical element, as these 
      +   * elements must not start with a number.
      +   *
      +   * @param  $xPathQuery  (string) XPath expression to be processed
      +   * @return              (string) The XPath expression without the literals.
      +   *                              
      +   */
      +  function _removeLiterals($xPathQuery) {
      +    // What comes first?  A " or a '?
      +    if (!preg_match(":^([^\"']*)([\"'].*)$:", $xPathQuery, $aMatches)) {
      +      // No " or ' means no more literals.
      +      return $xPathQuery;
      +    }
      +    
      +    $result = $aMatches[1];
      +    $remainder = $aMatches[2];
      +    // What kind of literal?
      +    if (preg_match(':^"([^"]*)"(.*)$:', $remainder, $aMatches)) {
      +      // A "" literal.
      +      $literal = $aMatches[1];
      +      $remainder = $aMatches[2];
      +    } else if (preg_match(":^'([^']*)'(.*)$:", $remainder, $aMatches)) {
      +      // A '' literal.
      +      $literal = $aMatches[1];
      +      $remainder = $aMatches[2];
      +    } else {
      +      $this->_displayError("The '$xPathQuery' argument began a literal, but did not close it.", __LINE__, __FILE__);
      +    }
      +
      +    // Store the literal
      +    $literalNumber = count($this->axPathLiterals);
      +    $this->axPathLiterals[$literalNumber] = $literal;
      +    $result .= '$'.$literalNumber;
      +    return $result.$this->_removeLiterals($remainder);
      +  }
      +
      +  /**
      +   * Returns the given string as a literal reference.
      +   *
      +   * @param $string (string) The string that we are processing
      +   * @return        (mixed)  The literal string.  FALSE if the string isn't a literal reference.
      +   */
      +  function _asLiteral($string) {
      +    if (empty($string)) return FALSE;
      +    if (empty($string[0])) return FALSE;
      +    if ($string[0] == '$') {
      +      $remainder = substr($string, 1);
      +      if (is_numeric($remainder)) {
      +        // We have a string reference then.
      +        $stringNumber = (int)$remainder;
      +        if ($stringNumber >= count($this->axPathLiterals)) {
      +            $this->_displayError("Internal error.  Found a string reference that we didn't set in xPathQuery: '$xPathQuery'.", __LINE__, __FILE__);
      +            return FALSE;
      +        }
      +        return $this->axPathLiterals[$stringNumber];
      +      }
      +    }
      +
      +    // It's not a reference then.
      +    return FALSE;
      +  }
      +  
      +  /**
      +   * Adds a literal to our array of literals
      +   *
      +   * In order to make sure we don't interpret literal strings as XPath expressions, we have to
      +   * encode literal strings so that we know that they are not XPaths.
      +   *
      +   * @param $string (string) The literal string that we need to store for future access
      +   * @return        (mixed)  A reference string to this literal.
      +   */
      +  function _addLiteral($string) {
      +    // Store the literal
      +    $literalNumber = count($this->axPathLiterals);
      +    $this->axPathLiterals[$literalNumber] = $string;
      +    $result = '$'.$literalNumber;
      +    return $result;
      +  }
      +
      +  /**
      +   * Look for operators in the expression
      +   *
      +   * Parses through the given expression looking for operators.  If found returns
      +   * the operands and the operator in the resulting array.
      +   *
      +   * @param  $xPathQuery  (string) XPath query to be evaluated.
      +   * @return              (array)  If an operator is found, it returns an array containing
      +   *                               information about the operator.  If no operator is found
      +   *                               then it returns an empty array.  If an operator is found,
      +   *                               but has invalid operands, it returns FALSE.
      +   *                               The resulting array has the following entries:
      +   *                                'operator' => The string version of operator that was found,
      +   *                                              trimmed for whitespace
      +   *                                'left operand' => The left operand, or empty if there was no
      +   *                                              left operand for this operator.
      +   *                                'right operand' => The right operand, or empty if there was no
      +   *                                              right operand for this operator.
      +   */
      +  function _GetOperator($xPathQuery) {
      +    $position = 0;
      +    $operator = '';
      +
      +    // The results of this function can easily be cached.
      +    static $aResultsCache = array();
      +    if (isset($aResultsCache[$xPathQuery])) {
      +      return $aResultsCache[$xPathQuery];
      +    }
      +
      +    // Run through all operators and try to find one.
      +    $opSize = sizeOf($this->operators);
      +    for ($i=0; $i<$opSize; $i++) {
      +      // Pick an operator to try.
      +      $operator = $this->operators[$i];
      +      // Quickcheck. If not present don't wast time searching 'the hard way'
      +      if (strpos($xPathQuery, $operator)===FALSE) continue;
      +      // Special check
      +      $position = $this->_searchString($xPathQuery, $operator);
      +      // Check whether a operator was found.
      +      if ($position <= 0 ) continue;
      +
      +      // Check whether it's the equal operator.
      +      if ($operator == '=') {
      +        // Also look for other operators containing the equal sign.
      +        switch ($xPathQuery[$position-1]) {
      +          case '<' : 
      +            $position--;
      +            $operator = '<=';
      +            break;
      +          case '>' : 
      +            $position--;
      +            $operator = '>=';
      +            break;
      +          case '!' : 
      +            $position--;
      +            $operator = '!=';
      +            break;
      +          default:
      +            // It's a pure = operator then.
      +        }
      +        break;
      +      }
      +
      +      if ($operator == '*') {
      +        // http://www.w3.org/TR/xpath#exprlex:
      +        // "If there is a preceding token and the preceding token is not one of @, ::, (, [, 
      +        // or an Operator, then a * must be recognized as a MultiplyOperator and an NCName must 
      +        // be recognized as an OperatorName."
      +
      +        // Get some substrings.
      +        $character = substr($xPathQuery, $position - 1, 1);
      +      
      +        // Check whether it's a multiply operator or a name test.
      +        if (strchr('/@:([', $character) != FALSE) {
      +          // Don't use the operator.
      +            $position = -1;
      +          continue;
      +        } else {
      +          // The operator is good.  Lets use it.
      +          break;
      +        }
      +      }
      +
      +      // Extremely annoyingly, we could have a node name like "for-each" and we should not
      +      // parse this as a "-" operator.  So if the first char of the right operator is alphabetic,
      +      // then this is NOT an interger operator.
      +      if (strchr('-+*', $operator) != FALSE) {
      +        $rightOperand = trim(substr($xPathQuery, $position + strlen($operator)));
      +        if (strlen($rightOperand) > 1) {
      +          if (preg_match(':^\D$:', $rightOperand[0])) {
      +            // Don't use the operator.
      +            $position = -1;
      +            continue;
      +          } else {
      +            // The operator is good.  Lets use it.
      +            break;
      +          }
      +        }
      +      }
      +
      +      // The operator must be good then :o)
      +      break;
      +
      +    } // end while each($this->operators)
      +
      +    // Did we find an operator?
      +    if ($position == -1) {
      +      $aResultsCache[$xPathQuery] = array();
      +      return array();
      +    }
      +
      +    /////////////////////////////////////////////
      +    // Get the operands
      +
      +    // Get the left and the right part of the expression.
      +    $leftOperand  = trim(substr($xPathQuery, 0, $position));
      +    $rightOperand = trim(substr($xPathQuery, $position + strlen($operator)));
      +  
      +    // Remove whitespaces.
      +    $leftOperand  = trim($leftOperand);
      +    $rightOperand = trim($rightOperand);
      +
      +    /////////////////////////////////////////////
      +    // Check the operands.
      +
      +    if ($leftOperand == '') {
      +      $aResultsCache[$xPathQuery] = FALSE;
      +      return FALSE;
      +    }
      +
      +    if ($rightOperand == '') {
      +      $aResultsCache[$xPathQuery] = FALSE;
      +      return FALSE;
      +    }
      +
      +    // Package up and return what we found.
      +    $aResult = array('operator' => $operator,
      +                'left operand' => $leftOperand,
      +                'right operand' => $rightOperand);
      +
      +    $aResultsCache[$xPathQuery] = $aResult;
      +
      +    return $aResult;
      +  }
      +
      +  /**
      +   * Evaluates an XPath PrimaryExpr
      +   *
      +   * http://www.w3.org/TR/xpath#section-Basics
      +   *
      +   *  [15]    PrimaryExpr    ::= VariableReference  
      +   *                             | '(' Expr ')'  
      +   *                             | Literal  
      +   *                             | Number  
      +   *                             | FunctionCall 
      +   *
      +   * @param  $xPathQuery  (string)   XPath query to be evaluated.
      +   * @param  $context     (array)    The context from which to evaluate
      +   * @param  $results     (mixed)    If the expression could be parsed and evaluated as one of these
      +   *                                 syntactical elements, then this will be either:
      +   *                                    - node-set (an ordered collection of nodes without duplicates) 
      +   *                                    - boolean (true or false) 
      +   *                                    - number (a floating-point number) 
      +   *                                    - string (a sequence of UCS characters) 
      +   * @return              (string)    An empty string if the query was successfully parsed and 
      +   *                                  evaluated, else a string containing the reason for failing.
      +   * @see    evaluate()
      +   */
      +  function _evaluatePrimaryExpr($xPathQuery, $context, &$result) {
      +    $ThisFunctionName = '_evaluatePrimaryExpr';
      +    $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions);
      +    $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction);
      +    if ($bDebugThisFunction) {
      +      echo "Path: $xPathQuery\n";
      +      echo "Context:";
      +      $this->_printContext($context);
      +      echo "\n";
      +    }
      +
      +    // Certain expressions will never be PrimaryExpr, so to speed up processing, cache the
      +    // results we do find from this function.
      +    static $aResultsCache = array();
      +    
      +    // Do while false loop
      +    $error = "";
      +    // If the result is independant of context, then we can cache the result and speed this function
      +    // up on future calls.
      +    $bCacheableResult = FALSE;
      +    do {
      +      if (isset($aResultsCache[$xPathQuery])) {
      +        $error = $aResultsCache[$xPathQuery]['Error'];
      +        $result = $aResultsCache[$xPathQuery]['Result'];
      +        break;
      +      }
      +
      +      // VariableReference 
      +      // ### Not supported.
      +
      +      // Is it a number?
      +      // | Number  
      +      if (is_numeric($xPathQuery)) {
      +        $result = doubleval($xPathQuery);
      +        $bCacheableResult = TRUE;
      +        break;
      +      }
      +
      +      // If it starts with $, and the remainder is a number, then it's a string.
      +      // | Literal  
      +      $literal = $this->_asLiteral($xPathQuery);
      +      if ($literal !== FALSE) {
      +        $result = $xPathQuery;
      +        $bCacheableResult = TRUE;
      +        break;
      +      }
      +
      +      // Is it a function?
      +      // | FunctionCall 
      +      {
      +        // Check whether it's all wrapped in a function.  will be like count(.*) where .* is anything
      +        // text() will try to be matched here, so just explicitly ignore it
      +        $regex = ":^([^\(\)\[\]/]*)\s*\((.*)\)$:U";
      +        if (preg_match($regex, $xPathQuery, $aMatch) && $xPathQuery != "text()") {
      +          $function = $aMatch[1];
      +          $data     = $aMatch[2];
      +          // It is possible that we will get "a() or b()" which will match as function "a" with
      +          // arguments ") or b(" which is clearly wrong... _bracketsCheck() should catch this.
      +          if ($this->_bracketsCheck($data)) {
      +            if (in_array($function, $this->functions)) {
      +              if ($bDebugThisFunction) echo "XPathExpr: $xPathQuery is a $function() function call:\n";
      +              $result = $this->_evaluateFunction($function, $data, $context);
      +              break;
      +            } 
      +          }
      +        }
      +      }
      +
      +      // Is it a bracketed expression?
      +      // | '(' Expr ')'  
      +      // If it is surrounded by () then trim the brackets
      +      $bBrackets = FALSE;
      +      if (preg_match(":^\((.*)\):", $xPathQuery, $aMatches)) {
      +        // Do not keep trimming off the () as we could have "(() and ())"
      +        $bBrackets = TRUE;
      +        $xPathQuery = $aMatches[1];
      +      }
      +
      +      if ($bBrackets) {
      +        // Must be a Expr then.
      +        $result = $this->_evaluateExpr($xPathQuery, $context);
      +        break;
      +      }
      +
      +      // Can't be a PrimaryExpr then.
      +      $error = "Expression is not a PrimaryExpr";
      +      $bCacheableResult = TRUE;
      +    } while (FALSE);
      +    //////////////////////////////////////////////    
      +
      +    // If possible, cache the result.
      +    if ($bCacheableResult) {
      +        $aResultsCache[$xPathQuery]['Error'] = $error;
      +        $aResultsCache[$xPathQuery]['Result'] = $result;
      +    }
      +
      +    $this->_closeDebugFunction($ThisFunctionName, array('result' => $result, 'error' => $error), $bDebugThisFunction);
      +
      +    // Return the result.
      +    return $error;
      +  }
      +
      +  /**
      +   * Evaluates an XPath Expr
      +   *
      +   * $this->evaluate() is the entry point and does some inits, while this 
      +   * function is called recursive internaly for every sub-xPath expresion we find.
      +   * It handles the following syntax, and calls evaluatePathExpr if it finds that none
      +   * of this grammer applies.
      +   *
      +   * http://www.w3.org/TR/xpath#section-Basics
      +   *
      +   * [14]    Expr               ::= OrExpr 
      +   * [21]    OrExpr             ::= AndExpr  
      +   *                                | OrExpr 'or' AndExpr  
      +   * [22]    AndExpr            ::= EqualityExpr  
      +   *                                | AndExpr 'and' EqualityExpr  
      +   * [23]    EqualityExpr       ::= RelationalExpr  
      +   *                                | EqualityExpr '=' RelationalExpr  
      +   *                                | EqualityExpr '!=' RelationalExpr  
      +   * [24]    RelationalExpr     ::= AdditiveExpr  
      +   *                                | RelationalExpr '<' AdditiveExpr  
      +   *                                | RelationalExpr '>' AdditiveExpr  
      +   *                                | RelationalExpr '<=' AdditiveExpr  
      +   *                                | RelationalExpr '>=' AdditiveExpr  
      +   * [25]    AdditiveExpr       ::= MultiplicativeExpr  
      +   *                                | AdditiveExpr '+' MultiplicativeExpr  
      +   *                                | AdditiveExpr '-' MultiplicativeExpr  
      +   * [26]    MultiplicativeExpr ::= UnaryExpr  
      +   *                                | MultiplicativeExpr MultiplyOperator UnaryExpr  
      +   *                                | MultiplicativeExpr 'div' UnaryExpr  
      +   *                                | MultiplicativeExpr 'mod' UnaryExpr  
      +   * [27]    UnaryExpr          ::= UnionExpr  
      +   *                                | '-' UnaryExpr 
      +   * [18]    UnionExpr          ::= PathExpr  
      +   *                                | UnionExpr '|' PathExpr 
      +   *
      +   * NOTE: The effect of the above grammar is that the order of precedence is 
      +   * (lowest precedence first): 
      +   * 1) or 
      +   * 2) and 
      +   * 3) =, != 
      +   * 4) <=, <, >=, > 
      +   * 5) +, -
      +   * 6) *, div, mod
      +   * 7) - (negate)
      +   * 8) |
      +   *
      +   * @param  $xPathQuery  (string)   XPath query to be evaluated.
      +   * @param  $context     (array)    An associative array the describes the context from which
      +   *                                 to evaluate the XPath Expr.  Contains three members:
      +   *                                  'nodePath' => The absolute XPath expression to the context node
      +   *                                  'size' => The context size
      +   *                                  'pos' => The context position
      +   * @return              (mixed)    The result of the XPath expression.  Either:
      +   *                                 node-set (an ordered collection of nodes without duplicates) 
      +   *                                 boolean (true or false) 
      +   *                                 number (a floating-point number) 
      +   *                                 string (a sequence of UCS characters) 
      +   * @see    evaluate()
      +   */
      +  function _evaluateExpr($xPathQuery, $context) {
      +    $ThisFunctionName = '_evaluateExpr';
      +    $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions);
      +    $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction);
      +    if ($bDebugThisFunction) {
      +      echo "Path: $xPathQuery\n";
      +      echo "Context:";
      +      $this->_printContext($context);
      +      echo "\n";    
      +    }
      +
      +    // Numpty check
      +    if (!isset($xPathQuery) || ($xPathQuery == '')) {
      +      $this->_displayError("The \$xPathQuery argument must have a value.", __LINE__, __FILE__);
      +      return FALSE;
      +    }
      +
      +    // At the top level we deal with booleans.  Only if the Expr is just an AdditiveExpr will 
      +    // the result not be a boolean.
      +    //
      +    //
      +    // Between these syntactical elements we get PathExprs.
      +
      +    // Do while false loop
      +    do {
      +      static $aKnownPathExprCache = array();
      +
      +      if (isset($aKnownPathExprCache[$xPathQuery])) {
      +        if ($bDebugThisFunction) echo "XPathExpr is a PathExpr\n";
      +        $result = $this->_evaluatePathExpr($xPathQuery, $context);
      +        break;
      +      }
      +
      +      // Check for operators first, as we could have "() op ()" and the PrimaryExpr will try to
      +      // say that that is an Expr called ") op ("
      +      // Set the default position and the type of the operator.
      +      $aOperatorInfo = $this->_GetOperator($xPathQuery);
      +
      +      // An expression can be one of these, and we should catch these "first" as they are most common
      +      if (empty($aOperatorInfo)) {
      +        $error = $this->_evaluatePrimaryExpr($xPathQuery, $context, $result);
      +        if (empty($error)) {
      +          // It could be parsed as a PrimaryExpr, so look no further :o)
      +          break;
      +        }
      +      }
      +
      +      // Check whether an operator was found.
      +      if (empty($aOperatorInfo)) {
      +        if ($bDebugThisFunction) echo "XPathExpr is a PathExpr\n";
      +        $aKnownPathExprCache[$xPathQuery] = TRUE;
      +        // No operator.  Means we have a PathExpr then.  Go to the next level.
      +        $result = $this->_evaluatePathExpr($xPathQuery, $context);
      +        break;
      +      } 
      +
      +      if ($bDebugThisFunction) { echo "\nFound and operator:"; print_r($aOperatorInfo); }//LEFT:[$leftOperand]  oper:[$operator]  RIGHT:[$rightOperand]";
      +
      +      $operator = $aOperatorInfo['operator'];
      +
      +      /////////////////////////////////////////////
      +      // Recursively process the operator
      +
      +      // Check the kind of operator.
      +      switch ($operator) {
      +        case ' or ': 
      +        case ' and ':
      +          $operatorType = 'Boolean';
      +          break;
      +        case '+': 
      +        case '-': 
      +        case '*':
      +        case ' div ':
      +        case ' mod ':
      +          $operatorType = 'Integer';
      +          break;
      +        case ' | ':
      +          $operatorType = 'NodeSet';
      +          break;
      +        case '<=':
      +        case '<': 
      +        case '>=':
      +        case '>':
      +        case '=': 
      +        case '!=':
      +          $operatorType = 'Multi';
      +          break;
      +        default:
      +            $this->_displayError("Internal error.  Default case of switch statement reached.", __LINE__, __FILE__);
      +      }
      +
      +      if ($bDebugThisFunction) echo "\nOperator is a [$operator]($operatorType operator)";
      +
      +      /////////////////////////////////////////////
      +      // Evaluate the operands
      +
      +      // Evaluate the left part.
      +      if ($bDebugThisFunction) echo "\nEvaluating LEFT:[{$aOperatorInfo['left operand']}]\n";
      +      $left = $this->_evaluateExpr($aOperatorInfo['left operand'], $context);
      +      if ($bDebugThisFunction) {echo "{$aOperatorInfo['left operand']} evals as:\n"; print_r($left); }
      +      
      +      // If it is a boolean operator, it's possible we don't need to evaluate the right part.
      +
      +      // Only evaluate the right part if we need to.
      +      $right = '';
      +      if ($operatorType == 'Boolean') {
      +        // Is the left part false?
      +        $left = $this->_handleFunction_boolean($left, $context);
      +        if (!$left and ($operator == ' and ')) {
      +          $result = FALSE;
      +          break;
      +        } else if ($left and ($operator == ' or ')) {
      +          $result = TRUE;
      +          break;
      +        }
      +      } 
      +
      +      // Evaluate the right part
      +      if ($bDebugThisFunction) echo "\nEvaluating RIGHT:[{$aOperatorInfo['right operand']}]\n";
      +      $right = $this->_evaluateExpr($aOperatorInfo['right operand'], $context);
      +      if ($bDebugThisFunction) {echo "{$aOperatorInfo['right operand']} evals as:\n"; print_r($right); echo "\n";}
      +
      +      /////////////////////////////////////////////
      +      // Combine the operands
      +
      +      // If necessary, work out how to treat the multi operators
      +      if ($operatorType != 'Multi') {
      +        $result = $this->_evaluateOperator($left, $operator, $right, $operatorType, $context);
      +      } else {
      +        // http://www.w3.org/TR/xpath#booleans
      +        // If both objects to be compared are node-sets, then the comparison will be true if and 
      +        // only if there is a node in the first node-set and a node in the second node-set such 
      +        // that the result of performing the comparison on the string-values of the two nodes is 
      +        // true. 
      +        // 
      +        // If one object to be compared is a node-set and the other is a number, then the 
      +        // comparison will be true if and only if there is a node in the node-set such that the 
      +        // result of performing the comparison on the number to be compared and on the result of 
      +        // converting the string-value of that node to a number using the number function is true. 
      +        //
      +        // If one object to be compared is a node-set and the other is a string, then the comparison 
      +        // will be true if and only if there is a node in the node-set such that the result of performing 
      +        // the comparison on the string-value of the node and the other string is true. 
      +        // 
      +        // If one object to be compared is a node-set and the other is a boolean, then the comparison 
      +        // will be true if and only if the result of performing the comparison on the boolean and on 
      +        // the result of converting the node-set to a boolean using the boolean function is true.
      +        if (is_array($left) || is_array($right)) {
      +          if ($bDebugThisFunction) echo "As one of the operands is an array, we will need to loop\n";
      +          if (is_array($left) && is_array($right)) {
      +            $operatorType = 'String';
      +          } elseif (is_numeric($left) || is_numeric($right)) {
      +            $operatorType = 'Integer';
      +          } elseif (is_bool($left)) {
      +            $operatorType = 'Boolean';
      +            $right = $this->_handleFunction_boolean($right, $context);
      +          } elseif (is_bool($right)) {
      +            $operatorType = 'Boolean';
      +            $left = $this->_handleFunction_boolean($left, $context);
      +          } else {
      +            $operatorType = 'String';
      +          }
      +          if ($bDebugThisFunction) echo "Equals operator is a $operatorType operator\n";
      +          // Turn both operands into arrays to simplify logic
      +          $aLeft = $left;
      +          $aRight = $right;
      +          if (!is_array($aLeft)) $aLeft = array($aLeft);
      +          if (!is_array($aRight)) $aRight = array($aRight);
      +          $result = FALSE;
      +          if (!empty($aLeft)) {
      +            foreach ($aLeft as $leftItem) {
      +              if (empty($aRight)) break;
      +              // If the item is from a node set, we should evaluate it's string-value
      +              if (is_array($left)) {
      +                if ($bDebugThisFunction) echo "\tObtaining string-value of LHS:$leftItem as it's from a nodeset\n";
      +                $leftItem = $this->_stringValue($leftItem);
      +              }
      +              foreach ($aRight as $rightItem) {
      +                // If the item is from a node set, we should evaluate it's string-value
      +                if (is_array($right)) {
      +                  if ($bDebugThisFunction) echo "\tObtaining string-value of RHS:$rightItem as it's from a nodeset\n";
      +                  $rightItem = $this->_stringValue($rightItem);
      +                }
      +
      +                if ($bDebugThisFunction) echo "\tEvaluating $leftItem $operator $rightItem\n";
      +                $result = $this->_evaluateOperator($leftItem, $operator, $rightItem, $operatorType, $context);
      +                if ($result === TRUE) break;
      +              }
      +              if ($result === TRUE) break;
      +            }
      +          }
      +        } 
      +        // When neither object to be compared is a node-set and the operator is = or !=, then the 
      +        // objects are compared by converting them to a common type as follows and then comparing 
      +        // them. 
      +        //
      +        // If at least one object to be compared is a boolean, then each object to be compared 
      +        // is converted to a boolean as if by applying the boolean function. 
      +        //
      +        // Otherwise, if at least one object to be compared is a number, then each object to be 
      +        // compared is converted to a number as if by applying the number function. 
      +        //
      +        // Otherwise, both objects to be compared are converted to strings as if by applying 
      +        // the string function. 
      +        //  
      +        // The = comparison will be true if and only if the objects are equal; the != comparison 
      +        // will be true if and only if the objects are not equal. Numbers are compared for equality 
      +        // according to IEEE 754 [IEEE 754]. Two booleans are equal if either both are true or 
      +        // both are false. Two strings are equal if and only if they consist of the same sequence 
      +        // of UCS characters.
      +        else {
      +          if (is_bool($left) || is_bool($right)) {
      +            $operatorType = 'Boolean';
      +          } elseif (is_numeric($left) || is_numeric($right)) {
      +            $operatorType = 'Integer';
      +          } else {
      +            $operatorType = 'String';
      +          }
      +          if ($bDebugThisFunction) echo "Equals operator is a $operatorType operator\n";
      +          $result = $this->_evaluateOperator($left, $operator, $right, $operatorType, $context);
      +        }
      +      }
      +
      +    } while (FALSE);
      +    //////////////////////////////////////////////
      +
      +    $this->_closeDebugFunction($ThisFunctionName, $result, $bDebugThisFunction);
      +
      +    // Return the result.
      +    return $result;
      +  }
      +
      +  /**
      +   * Evaluate the result of an operator whose operands have been evaluated
      +   *
      +   * If the operator type is not "NodeSet", then neither the left or right operators 
      +   * will be node sets, as the processing when one or other is an array is complex,
      +   * and should be handled by the caller.
      +   *
      +   * @param  $left          (mixed)   The left operand
      +   * @param  $right         (mixed)   The right operand
      +   * @param  $operator      (string)  The operator to use to combine the operands
      +   * @param  $operatorType  (string)  The type of the operator.  Either 'Boolean', 
      +   *                                  'Integer', 'String', or 'NodeSet'
      +   * @param  $context     (array)    The context from which to evaluate
      +   * @return              (mixed)    The result of the XPath expression.  Either:
      +   *                                 node-set (an ordered collection of nodes without duplicates) 
      +   *                                 boolean (true or false) 
      +   *                                 number (a floating-point number) 
      +   *                                 string (a sequence of UCS characters) 
      +   */
      +  function _evaluateOperator($left, $operator, $right, $operatorType, $context) {
      +    $ThisFunctionName = '_evaluateOperator';
      +    $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions);
      +    $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction);
      +    if ($bDebugThisFunction) {
      +      echo "left: $left\n";
      +      echo "right: $right\n";
      +      echo "operator: $operator\n";
      +      echo "operator type: $operatorType\n";
      +    }
      +
      +    // Do while false loop
      +    do {
      +      // Handle the operator depending on the operator type.
      +      switch ($operatorType) {
      +        case 'Boolean':
      +          {
      +            // Boolify the arguments.  (The left arg is already a bool)
      +            $right = $this->_handleFunction_boolean($right, $context);
      +            switch ($operator) {
      +              case '=': // Compare the two results.
      +                $result = (bool)($left == $right); 
      +                break;
      +              case ' or ': // Return the two results connected by an 'or'.
      +                $result = (bool)( $left or $right );
      +                break;
      +              case ' and ': // Return the two results connected by an 'and'.
      +                $result = (bool)( $left and $right );
      +                break;
      +              case '!=': // Check whether the two results are not equal.
      +                $result = (bool)( $left != $right );
      +                break;
      +              default:
      +                $this->_displayError("Internal error.  Default case of switch statement reached.", __LINE__, __FILE__);
      +            }
      +          }
      +          break;
      +        case 'Integer':
      +          {
      +            // Convert both left and right operands into numbers.
      +            if (empty($left) && ($operator == '-')) {
      +              // There may be no left operator if the op is '-'
      +              $left = 0;
      +            } else {
      +              $left = $this->_handleFunction_number($left, $context);
      +            }
      +            $right = $this->_handleFunction_number($right, $context);
      +            if ($bDebugThisFunction) echo "\nLeft is $left, Right is $right\n";
      +            switch ($operator) {
      +              case '=': // Compare the two results.
      +                $result = (bool)($left == $right); 
      +                break;
      +              case '!=': // Compare the two results.
      +                $result = (bool)($left != $right); 
      +                break;
      +              case '+': // Return the result by adding one result to the other.
      +                $result = $left + $right;
      +                break;
      +              case '-': // Return the result by decrease one result by the other.
      +                $result = $left - $right;
      +                break;
      +              case '*': // Return a multiplication of the two results.
      +                $result =  $left * $right;
      +                break;
      +              case ' div ': // Return a division of the two results.
      +                $result = $left / $right;
      +                break;
      +              case ' mod ': // Return a modulo division of the two results.
      +                $result = $left % $right;
      +                break;
      +              case '<=': // Compare the two results.
      +                $result = (bool)( $left <= $right );
      +                break;
      +              case '<': // Compare the two results.
      +                $result = (bool)( $left < $right );
      +                break;
      +              case '>=': // Compare the two results.
      +                $result = (bool)( $left >= $right );
      +                break;
      +              case '>': // Compare the two results.
      +                $result = (bool)( $left > $right );
      +                break;
      +              default:
      +                $this->_displayError("Internal error.  Default case of switch statement reached.", __LINE__, __FILE__);
      +            }
      +          }
      +          break;
      +        case 'NodeSet':
      +          // Add the nodes to the result set
      +          $result = array_merge($left, $right);
      +          // Remove duplicated nodes.
      +          $result = array_unique($result);
      +
      +          // Preserve doc order if there was more than one query.
      +          if (count($result) > 1) {
      +            $result = $this->_sortByDocOrder($result);
      +          }
      +          break;
      +        case 'String':
      +            $left = $this->_handleFunction_string($left, $context);
      +            $right = $this->_handleFunction_string($right, $context);
      +            if ($bDebugThisFunction) echo "\nLeft is $left, Right is $right\n";
      +            switch ($operator) {
      +              case '=': // Compare the two results.
      +                $result = (bool)($left == $right); 
      +                break;
      +              case '!=': // Compare the two results.
      +                $result = (bool)($left != $right); 
      +                break;
      +              default:
      +                $this->_displayError("Internal error.  Default case of switch statement reached.", __LINE__, __FILE__);
      +            }
      +          break;
      +        default:
      +          $this->_displayError("Internal error.  Default case of switch statement reached.", __LINE__, __FILE__);
      +      }
      +    } while (FALSE);
      +
      +    //////////////////////////////////////////////
      +
      +    $this->_closeDebugFunction($ThisFunctionName, $result, $bDebugThisFunction);
      +
      +    // Return the result.
      +    return $result;
      +  }
      +  
      +  /**
      +   * Evaluates an XPath PathExpr
      +   *
      +   * It handles the following syntax:
      +   *
      +   * http://www.w3.org/TR/xpath#node-sets
      +   * http://www.w3.org/TR/xpath#NT-LocationPath
      +   * http://www.w3.org/TR/xpath#path-abbrev
      +   * http://www.w3.org/TR/xpath#NT-Step
      +   *
      +   * [19]   PathExpr              ::= LocationPath  
      +   *                                  | FilterExpr  
      +   *                                  | FilterExpr '/' RelativeLocationPath  
      +   *                                  | FilterExpr '//' RelativeLocationPath
      +   * [20]   FilterExpr            ::= PrimaryExpr  
      +   *                                  | FilterExpr Predicate 
      +   * [1]    LocationPath          ::= RelativeLocationPath  
      +   *                                  | AbsoluteLocationPath  
      +   * [2]    AbsoluteLocationPath  ::= '/' RelativeLocationPath?  
      +   *                                  | AbbreviatedAbsoluteLocationPath
      +   * [3]    RelativeLocationPath  ::= Step  
      +   *                                  | RelativeLocationPath '/' Step  
      +   *                                  | AbbreviatedRelativeLocationPath
      +   * [4]    Step                  ::= AxisSpecifier NodeTest Predicate*  
      +   *                                  | AbbreviatedStep  
      +   * [5]    AxisSpecifier         ::= AxisName '::'  
      +   *                                  | AbbreviatedAxisSpecifier  
      +   * [10]   AbbreviatedAbsoluteLocationPath
      +   *                              ::= '//' RelativeLocationPath
      +   * [11]   AbbreviatedRelativeLocationPath
      +   *                              ::= RelativeLocationPath '//' Step
      +   * [12]   AbbreviatedStep       ::= '.'  
      +   *                                  | '..'  
      +   * [13]   AbbreviatedAxisSpecifier    
      +   *                              ::= '@'? 
      +   *
      +   * If you expand all the abbreviated versions, then the grammer simplifies to:
      +   *
      +   * [19]   PathExpr              ::= RelativeLocationPath  
      +   *                                  | '/' RelativeLocationPath?  
      +   *                                  | FilterExpr  
      +   *                                  | FilterExpr '/' RelativeLocationPath  
      +   * [20]   FilterExpr            ::= PrimaryExpr  
      +   *                                  | FilterExpr Predicate 
      +   * [3]    RelativeLocationPath  ::= Step  
      +   *                                  | RelativeLocationPath '/' Step  
      +   * [4]    Step                  ::= AxisName '::' NodeTest Predicate*  
      +   *
      +   * Conceptually you can say that we should split by '/' and try to treat the parts
      +   * as steps, and if that fails then try to treat it as a PrimaryExpr.  
      +   * 
      +   * @param  $PathExpr   (string) PathExpr syntactical element
      +   * @param  $context    (array)  The context from which to evaluate
      +   * @return             (mixed)  The result of the XPath expression.  Either:
      +   *                               node-set (an ordered collection of nodes without duplicates) 
      +   *                               boolean (true or false) 
      +   *                               number (a floating-point number) 
      +   *                               string (a sequence of UCS characters) 
      +   * @see    evaluate()
      +   */
      +  function _evaluatePathExpr($PathExpr, $context) {
      +    $ThisFunctionName = '_evaluatePathExpr';
      +    $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions);
      +    $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction);
      +    if ($bDebugThisFunction) {
      +      echo "PathExpr: $PathExpr\n";
      +      echo "Context:";
      +      $this->_printContext($context);
      +      echo "\n";
      +    }
      +    
      +    // Numpty check
      +    if (empty($PathExpr)) {
      +      $this->_displayError("The \$PathExpr argument must have a value.", __LINE__, __FILE__);
      +      return FALSE;
      +    }
      +    //////////////////////////////////////////////
      +
      +    // Parsing the expression into steps is a cachable operation as it doesn't depend on the context
      +    static $aResultsCache = array();
      +
      +    if (isset($aResultsCache[$PathExpr])) {
      +      $steps = $aResultsCache[$PathExpr];
      +    } else {
      +      // Note that we have used $this->slashes2descendant to simplify this logic, so the 
      +      // "Abbreviated" paths basically never exist as '//' never exists.
      +
      +      // mini syntax check
      +      if (!$this->_bracketsCheck($PathExpr)) {
      +        $this->_displayError('While parsing an XPath query, in the PathExpr "' .
      +        $PathExpr.
      +        '", there was an invalid number of brackets or a bracket mismatch.', __LINE__, __FILE__);
      +      }
      +      // Save the current path.
      +      $this->currentXpathQuery = $PathExpr;
      +      // Split the path at every slash *outside* a bracket.
      +      $steps = $this->_bracketExplode('/', $PathExpr);
      +      if ($bDebugThisFunction) { echo "
      Split the path '$PathExpr' at every slash *outside* a bracket.\n "; print_r($steps); } + // Check whether the first element is empty. + if (empty($steps[0])) { + // Remove the first and empty element. It's a starting '//'. + array_shift($steps); + } + $aResultsCache[$PathExpr] = $steps; + } + + // Start to evaluate the steps. + // ### Consider implementing an evaluateSteps() function that removes recursion from + // evaluateStep() + $result = $this->_evaluateStep($steps, $context); + + // Preserve doc order if there was more than one result + if (count($result) > 1) { + $result = $this->_sortByDocOrder($result); + } + ////////////////////////////////////////////// + + $this->_closeDebugFunction($ThisFunctionName, $result, $bDebugThisFunction); + + // Return the result. + return $result; + } + + /** + * Sort an xPathSet by doc order. + * + * @param $xPathSet (array) Array of full paths to nodes that need to be sorted + * @return (array) Array containing the same contents as $xPathSet, but + * with the contents in doc order + */ + function _sortByDocOrder($xPathSet) { + $ThisFunctionName = '_sortByDocOrder'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + echo "_sortByDocOrder(xPathSet:[".count($xPathSet)."])"; + echo "xPathSet:\n"; + print_r($xPathSet); + echo "
      \n"; + } + ////////////////////////////////////////////// + + $aResult = array(); + + // Spot some common shortcuts. + if (count($xPathSet) < 1) { + $aResult = $xPathSet; + } else { + // Build an array of doc-pos indexes. + $aDocPos = array(); + $nodeCount = count($this->nodeIndex); + $aPaths = array_keys($this->nodeIndex); + if ($bDebugThisFunction) { + echo "searching for path indices in array_keys(this->nodeIndex)...\n"; + //print_r($aPaths); + } + + // The last index we found. In general the elements will be in groups + // that are themselves in order. + $iLastIndex = 0; + foreach ($xPathSet as $path) { + // Cycle round the nodes, starting at the last index, looking for the path. + $foundNode = FALSE; + for ($iIndex = $iLastIndex; $iIndex < $nodeCount + $iLastIndex; $iIndex++) { + $iThisIndex = $iIndex % $nodeCount; + if (!strcmp($aPaths[$iThisIndex],$path)) { + // we have found the doc-position index of the path + $aDocPos[] = $iThisIndex; + $iLastIndex = $iThisIndex; + $foundNode = TRUE; + break; + } + } + if ($bDebugThisFunction) { + if (!$foundNode) + echo "Error: $path not found in \$this->nodeIndex\n"; + else + echo "Found node after ".($iIndex - $iLastIndex)." iterations\n"; + } + } + // Now count the number of doc pos we have and the number of results and + // confirm that we have the same number of each. + $iDocPosCount = count($aDocPos); + $iResultCount = count($xPathSet); + if ($iDocPosCount != $iResultCount) { + if ($bDebugThisFunction) { + echo "count(\$aDocPos)=$iDocPosCount; count(\$result)=$iResultCount\n"; + print_r(array_keys($this->nodeIndex)); + } + $this->_displayError('Results from _InternalEvaluate() are corrupt. '. + 'Do you need to call reindexNodeTree()?', __LINE__, __FILE__); + } + + // Now sort the indexes. + sort($aDocPos); + + // And now convert back to paths. + $iPathCount = count($aDocPos); + for ($iIndex = 0; $iIndex < $iPathCount; $iIndex++) { + $aResult[] = $aPaths[$aDocPos[$iIndex]]; + } + } + + // Our result from the function is this array. + $result = $aResult; + + ////////////////////////////////////////////// + + $this->_closeDebugFunction($ThisFunctionName, $result, $bDebugThisFunction); + + // Return the result. + return $result; + } + + /** + * Evaluate a step from a XPathQuery expression at a specific contextPath. + * + * Steps are the arguments of a XPathQuery when divided by a '/'. A contextPath is a + * absolute XPath (or vector of XPaths) to a starting node(s) from which the step should + * be evaluated. + * + * @param $steps (array) Vector containing the remaining steps of the current + * XPathQuery expression. + * @param $context (array) The context from which to evaluate + * @return (array) Vector of absolute XPath's as a result of the step + * evaluation. The results will not necessarily be in doc order + * @see _evaluatePathExpr() + */ + function _evaluateStep($steps, $context) { + $ThisFunctionName = '_evaluateStep'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + echo "Context:"; + $this->_printContext($context); + echo "\n"; + echo "Steps: "; + print_r($steps); + echo "
      \n"; + } + ////////////////////////////////////////////// + + $result = array(); // Create an empty array for saving the abs. XPath's found. + + $contextPaths = array(); // Create an array to save the new contexts. + $step = trim(array_shift($steps)); // Get this step. + if ($bDebugThisFunction) echo __LINE__.":Evaluating step $step\n"; + + $axis = $this->_getAxis($step); // Get the axis of the current step. + + // If there was no axis, then it must be a PrimaryExpr + if ($axis == FALSE) { + if ($bDebugThisFunction) echo __LINE__.":Step is not an axis but a PrimaryExpr\n"; + // ### This isn't correct, as the result of this function might not be a node set. + $error = $this->_evaluatePrimaryExpr($step, $context, $contextPaths); + if (!empty($error)) { + $this->_displayError("Expression failed to parse as PrimaryExpr because: $error" + , __LINE__, __FILE__, FALSE); + } + } else { + if ($bDebugThisFunction) { echo __LINE__.":Axis of step is:\n"; print_r($axis); echo "\n";} + $method = '_handleAxis_' . $axis['axis']; // Create the name of the method. + + // Check whether the axis handler is defined. If not display an error message. + if (!method_exists($this, $method)) { + $this->_displayError('While parsing an XPath query, the axis ' . + $axis['axis'] . ' could not be handled, because this version does not support this axis.', __LINE__, __FILE__); + } + if ($bDebugThisFunction) echo __LINE__.":Calling user method $method\n"; + + // Perform an axis action. + $contextPaths = $this->$method($axis, $context['nodePath']); + if ($bDebugThisFunction) { echo __LINE__.":We found these contexts from this step:\n"; print_r( $contextPaths ); echo "\n";} + } + + // Check whether there are predicates. + if (count($contextPaths) > 0 && count($axis['predicate']) > 0) { + if ($bDebugThisFunction) echo __LINE__.":Filtering contexts by predicate...\n"; + + // Check whether each node fits the predicates. + $contextPaths = $this->_checkPredicates($contextPaths, $axis['predicate']); + } + + // Check whether there are more steps left. + if (count($steps) > 0) { + if ($bDebugThisFunction) echo __LINE__.":Evaluating next step given the context of the first step...\n"; + + // Continue the evaluation of the next steps. + + // Run through the array. + $size = sizeOf($contextPaths); + for ($pos=0; $pos<$size; $pos++) { + // Build new context + $newContext = array('nodePath' => $contextPaths[$pos], 'size' => $size, 'pos' => $pos + 1); + if ($bDebugThisFunction) echo __LINE__.":Evaluating step for the {$contextPaths[$pos]} context...\n"; + // Call this method for this single path. + $xPathSetNew = $this->_evaluateStep($steps, $newContext); + if ($bDebugThisFunction) {echo "New results for this context:\n"; print_r($xPathSetNew);} + $result = array_merge($result, $xPathSetNew); + } + + // Remove duplicated nodes. + $result = array_unique($result); + } else { + $result = $contextPaths; // Save the found contexts. + } + + ////////////////////////////////////////////// + + $this->_closeDebugFunction($ThisFunctionName, $result, $bDebugThisFunction); + + // Return the result. + return $result; + } + + /** + * Checks whether a node matches predicates. + * + * This method checks whether a list of nodes passed to this method match + * a given list of predicates. + * + * @param $xPathSet (array) Array of full paths of all nodes to be tested. + * @param $predicates (array) Array of predicates to use. + * @return (array) Vector of absolute XPath's that match the given predicates. + * @see _evaluateStep() + */ + function _checkPredicates($xPathSet, $predicates) { + $ThisFunctionName = '_checkPredicates'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + echo "XPathSet:"; + print_r($xPathSet); + echo "Predicates:"; + print_r($predicates); + echo "
      "; + } + ////////////////////////////////////////////// + // Create an empty set of nodes. + $result = array(); + + // Run through all predicates. + $pSize = sizeOf($predicates); + for ($j=0; $j<$pSize; $j++) { + $predicate = $predicates[$j]; + if ($bDebugThisFunction) echo "Evaluating predicate \"$predicate\"\n"; + + // This will contain all the nodes that match this predicate + $aNewSet = array(); + + // Run through all nodes. + $contextSize = count($xPathSet); + for ($contextPos=0; $contextPos<$contextSize; $contextPos++) { + $xPath = $xPathSet[$contextPos]; + + // Build the context for this predicate + $context = array('nodePath' => $xPath, 'size' => $contextSize, 'pos' => $contextPos + 1); + + // Check whether the predicate is just an number. + if (preg_match('/^\d+$/', $predicate)) { + if ($bDebugThisFunction) echo "Taking short cut and calling _handleFunction_position() directly.\n"; + // Take a short cut. If it is just a position, then call + // _handleFunction_position() directly. 70% of the + // time this will be the case. ## N.S +// $check = (bool) ($predicate == $context['pos']); + $check = (bool) ($predicate == $this->_handleFunction_position('', $context)); + } else { + // Else do the predicate check the long and through way. + $check = $this->_evaluateExpr($predicate, $context); + } + if ($bDebugThisFunction) { + echo "Evaluating the predicate returned "; + var_dump($check); + echo "\n"; + } + + if (is_int($check)) { // Check whether it's an integer. + // Check whether it's the current position. + $check = (bool) ($check == $this->_handleFunction_position('', $context)); + } else { + $check = (bool) ($this->_handleFunction_boolean($check, $context)); +// if ($bDebugThisFunction) {echo $this->_handleFunction_string($check, $context);} + } + + if ($bDebugThisFunction) echo "Node $xPath matches predicate $predicate: " . (($check) ? "TRUE" : "FALSE") ."\n"; + + // Do we add it? + if ($check) $aNewSet[] = $xPath; + } + + // Use the newly filtered list. + $xPathSet = $aNewSet; + + if ($bDebugThisFunction) {echo "Node set now contains : "; print_r($xPathSet); } + } + + $result = $xPathSet; + + ////////////////////////////////////////////// + + $this->_closeDebugFunction($ThisFunctionName, $result, $bDebugThisFunction); + + // Return the array of nodes. + return $result; + } + + /** + * Evaluates an XPath function + * + * This method evaluates a given XPath function with its arguments on a + * specific node of the document. + * + * @param $function (string) Name of the function to be evaluated. + * @param $arguments (string) String containing the arguments being + * passed to the function. + * @param $context (array) The context from which to evaluate + * @return (mixed) This method returns the result of the evaluation of + * the function. Depending on the function the type of the + * return value can be different. + * @see evaluate() + */ + function _evaluateFunction($function, $arguments, $context) { + $ThisFunctionName = '_evaluateFunction'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + if (is_array($arguments)) { + echo "Arguments:\n"; + print_r($arguments); + } else { + echo "Arguments: $arguments\n"; + } + echo "Context:"; + $this->_printContext($context); + echo "\n"; + echo "
      \n"; + } + ///////////////////////////////////// + // Remove whitespaces. + $function = trim($function); + $arguments = trim($arguments); + // Create the name of the function handling function. + $method = '_handleFunction_'. $function; + + // Check whether the function handling function is available. + if (!method_exists($this, $method)) { + // Display an error message. + $this->_displayError("While parsing an XPath query, ". + "the function \"$function\" could not be handled, because this ". + "version does not support this function.", __LINE__, __FILE__); + } + if ($bDebugThisFunction) echo "Calling function $method($arguments)\n"; + + // Return the result of the function. + $result = $this->$method($arguments, $context); + + ////////////////////////////////////////////// + // Return the nodes found. + + $this->_closeDebugFunction($ThisFunctionName, $result, $bDebugThisFunction); + + // Return the result. + return $result; + } + + /** + * Checks whether a node matches a node-test. + * + * This method checks whether a node in the document matches a given node-test. + * A node test is something like text(), node(), or an element name. + * + * @param $contextPath (string) Full xpath of the node, which should be tested for + * matching the node-test. + * @param $nodeTest (string) String containing the node-test for the node. + * @return (boolean) This method returns TRUE if the node matches the + * node-test, otherwise FALSE. + * @see evaluate() + */ + function _checkNodeTest($contextPath, $nodeTest) { + // Empty node test means that it must match + if (empty($nodeTest)) return TRUE; + + if ($nodeTest == '*') { + // * matches all element nodes. + return (!preg_match(':/[^/]+\(\)\[\d+\]$:U', $contextPath)); + } + elseif (preg_match('/^[\w-:\.]+$/', $nodeTest)) { + // http://www.w3.org/TR/2000/REC-xml-20001006#NT-Name + // The real spec for what constitutes whitespace is quite elaborate, and + // we currently just hope that "\w" catches them all. In reality it should + // start with a letter too, not a number, but we've just left it simple. + // It's just a node name test. It should end with "/$nodeTest[x]" + return (preg_match('"/'.$nodeTest.'\[\d+\]$"', $contextPath)); + } + elseif (preg_match('/\(/U', $nodeTest)) { // Check whether it's a function. + // Get the type of function to use. + $function = $this->_prestr($nodeTest, '('); + // Check whether the node fits the method. + switch ($function) { + case 'node': // Add this node to the list of nodes. + return TRUE; + case 'text': // Check whether the node has some text. + $tmp = implode('', $this->nodeIndex[$contextPath]['textParts']); + if (!empty($tmp)) { + return TRUE; // Add this node to the list of nodes. + } + break; +/******** NOT supported (yet?) + case 'comment': // Check whether the node has some comment. + if (!empty($this->nodeIndex[$contextPath]['comment'])) { + return TRUE; // Add this node to the list of nodes. + } + break; + case 'processing-instruction': + $literal = $this->_afterstr($axis['node-test'], '('); // Get the literal argument. + $literal = substr($literal, 0, strlen($literal) - 1); // Cut the literal. + + // Check whether a literal was given. + if (!empty($literal)) { + // Check whether the node's processing instructions are matching the literals given. + if ($this->nodeIndex[$context]['processing-instructions'] == $literal) { + return TRUE; // Add this node to the node-set. + } + } else { + // Check whether the node has processing instructions. + if (!empty($this->nodeIndex[$contextPath]['processing-instructions'])) { + return TRUE; // Add this node to the node-set. + } + } + break; +***********/ + default: // Display an error message. + $this->_displayError('While parsing an XPath query there was an undefined function called "' . + str_replace($function, ''.$function.'', $this->currentXpathQuery) .'"', __LINE__, __FILE__); + } + } + else { // Display an error message. + $this->_displayError("While parsing the XPath query \"{$this->currentXpathQuery}\" ". + "an empty and therefore invalid node-test has been found.", __LINE__, __FILE__, FALSE); + } + + return FALSE; // Don't add this context. + } + + //----------------------------------------------------------------------------------------- + // XPath ------ XPath AXIS Handlers ------ + //----------------------------------------------------------------------------------------- + + /** + * Retrieves axis information from an XPath query step. + * + * This method tries to extract the name of the axis and its node-test + * from a given step of an XPath query at a given node. If it can't parse + * the step, then we treat it as a PrimaryExpr. + * + * [4] Step ::= AxisSpecifier NodeTest Predicate* + * | AbbreviatedStep + * [5] AxisSpecifier ::= AxisName '::' + * | AbbreviatedAxisSpecifier + * [12] AbbreviatedStep ::= '.' + * | '..' + * [13] AbbreviatedAxisSpecifier + * ::= '@'? + * + * [7] NodeTest ::= NameTest + * | NodeType '(' ')' + * | 'processing-instruction' '(' Literal ')' + * [37] NameTest ::= '*' + * | NCName ':' '*' + * | QName + * [38] NodeType ::= 'comment' + * | 'text' + * | 'processing-instruction' + * | 'node' + * + * @param $step (string) String containing a step of an XPath query. + * @return (array) Contains information about the axis found in the step, or FALSE + * if the string isn't a valid step. + * @see _evaluateStep() + */ + function _getAxis($step) { + // The results of this function are very cachable, as it is completely independant of context. + static $aResultsCache = array(); + + // Create an array to save the axis information. + $axis = array( + 'axis' => '', + 'node-test' => '', + 'predicate' => array() + ); + + $cacheKey = $step; + do { // parse block + $parseBlock = 1; + + if (isset($aResultsCache[$cacheKey])) { + return $aResultsCache[$cacheKey]; + } else { + // We have some danger of causing recursion here if we refuse to parse a step as having an + // axis, and demand it be treated as a PrimaryExpr. So if we are going to fail, make sure + // we record what we tried, so that we can catch to see if it comes straight back. + $guess = array( + 'axis' => 'child', + 'node-test' => $step, + 'predicate' => array()); + $aResultsCache[$cacheKey] = $guess; + } + + /////////////////////////////////////////////////// + // Spot the steps that won't come with an axis + + // Check whether the step is empty or only self. + if (empty($step) OR ($step == '.') OR ($step == 'current()')) { + // Set it to the default value. + $step = '.'; + $axis['axis'] = 'self'; + $axis['node-test'] = '*'; + break $parseBlock; + } + + if ($step == '..') { + // Select the parent axis. + $axis['axis'] = 'parent'; + $axis['node-test'] = '*'; + break $parseBlock; + } + + /////////////////////////////////////////////////// + // Pull off the predicates + + // Check whether there are predicates and add the predicate to the list + // of predicates without []. Get contents of every [] found. + $groups = $this->_getEndGroups($step); +//print_r($groups); + $groupCount = count($groups); + while (($groupCount > 0) && ($groups[$groupCount - 1][0] == '[')) { + // Remove the [] and add the predicate to the top of the list + $predicate = substr($groups[$groupCount - 1], 1, -1); + array_unshift($axis['predicate'], $predicate); + // Pop a group off the end of the list + array_pop($groups); + $groupCount--; + } + + // Finally stick the rest back together and this is the rest of our step + if ($groupCount > 0) { + $step = implode('', $groups); + } + + /////////////////////////////////////////////////// + // Pull off the axis + + // Check for abbreviated syntax + if ($step[0] == '@') { + // Use the attribute axis and select the attribute. + $axis['axis'] = 'attribute'; + $step = substr($step, 1); + } else { + // Check whether the axis is given in plain text. + if (preg_match("/^([^:]*)::(.*)$/", $step, $match)) { + // Split the step to extract axis and node-test. + $axis['axis'] = $match[1]; + $step = $match[2]; + } else { + // The default axis is child + $axis['axis'] = 'child'; + } + } + + /////////////////////////////////////////////////// + // Process the rest which will either a node test, or else this isn't a step. + + // Check whether is an abbreviated syntax. + if ($step == '*') { + // Use the child axis and select all children. + $axis['node-test'] = '*'; + break $parseBlock; + } + + // ### I'm pretty sure our current handling of cdata is a fudge, and we should + // really do this better, but leave this as is for now. + if ($step == "text()") { + // Handle the text node + $axis["node-test"] = "cdata"; + break $parseBlock; + } + + // There are a few node tests that we match verbatim. + if ($step == "node()" + || $step == "comment()" + || $step == "text()" + || $step == "processing-instruction") { + $axis["node-test"] = $step; + break $parseBlock; + } + + // processing-instruction() is allowed to take an argument, but if it does, the argument + // is a literal, which we will have parsed out to $[number]. + if (preg_match(":processing-instruction\(\$\d*\):", $step)) { + $axis["node-test"] = $step; + break $parseBlock; + } + + // The only remaining way this can be a step, is if the remaining string is a simple name + // or else a :* name. + // http://www.w3.org/TR/xpath#NT-NameTest + // NameTest ::= '*' + // | NCName ':' '*' + // | QName + // QName ::= (Prefix ':')? LocalPart + // Prefix ::= NCName + // LocalPart ::= NCName + // + // ie + // NameTest ::= '*' + // | NCName ':' '*' + // | (NCName ':')? NCName + // NCName ::= (Letter | '_') (NCNameChar)* + $NCName = "[a-zA-Z_][\w\.\-_]*"; + if (preg_match("/^$NCName:$NCName$/", $step) + || preg_match("/^$NCName:*$/", $step)) { + $axis['node-test'] = $step; + if (!empty($this->parseOptions[XML_OPTION_CASE_FOLDING])) { + // Case in-sensitive + $axis['node-test'] = strtoupper($axis['node-test']); + } + // Not currently recursing + $LastFailedStep = ''; + $LastFailedContext = ''; + break $parseBlock; + } + + // It's not a node then, we must treat it as a PrimaryExpr + // Check for recursion + if ($LastFailedStep == $step) { + $this->_displayError('Recursion detected while parsing an XPath query, in the step ' . + str_replace($step, ''.$step.'', $this->currentXpathQuery) + , __LINE__, __FILE__, FALSE); + $axis['node-test'] = $step; + } else { + $LastFailedStep = $step; + $axis = FALSE; + } + + } while(FALSE); // end parse block + + // Check whether it's a valid axis. + if ($axis !== FALSE) { + if (!in_array($axis['axis'], array_merge($this->axes, array('function')))) { + // Display an error message. + $this->_displayError('While parsing an XPath query, in the step ' . + str_replace($step, ''.$step.'', $this->currentXpathQuery) . + ' the invalid axis ' . $axis['axis'] . ' was found.', __LINE__, __FILE__, FALSE); + } + } + + // Cache the real axis information + $aResultsCache[$cacheKey] = $axis; + + // Return the axis information. + return $axis; + } + + + /** + * Handles the XPath child axis. + * + * This method handles the XPath child axis. It essentially filters out the + * children to match the name specified after the '/'. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should + * be processed. + * @return (array) A vector containing all nodes that were found, during + * the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_child($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set to hold the results of the child matches + if ($axis["node-test"] == "cdata") { + if (!isSet($this->nodeIndex[$contextPath]['textParts']) ) return ''; + $tSize = sizeOf($this->nodeIndex[$contextPath]['textParts']); + for ($i=1; $i<=$tSize; $i++) { + $xPathSet[] = $contextPath . '/text()['.$i.']'; + } + } + else { + // Get a list of all children. + $allChildren = $this->nodeIndex[$contextPath]['childNodes']; + + // Run through all children in the order they where set. + $cSize = sizeOf($allChildren); + for ($i=0; $i<$cSize; $i++) { + $childPath = $contextPath .'/'. $allChildren[$i]['name'] .'['. $allChildren[$i]['contextPos'] .']'; + $textChildPath = $contextPath.'/text()['.($i + 1).']'; + // Check the text node + if ($this->_checkNodeTest($textChildPath, $axis['node-test'])) { // node test check + $xPathSet[] = $textChildPath; // Add the child to the node-set. + } + // Check the actual node + if ($this->_checkNodeTest($childPath, $axis['node-test'])) { // node test check + $xPathSet[] = $childPath; // Add the child to the node-set. + } + } + + // Finally there will be one more text node to try + $textChildPath = $contextPath.'/text()['.($cSize + 1).']'; + // Check the text node + if ($this->_checkNodeTest($textChildPath, $axis['node-test'])) { // node test check + $xPathSet[] = $textChildPath; // Add the child to the node-set. + } + } + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath parent axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the + * evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_parent($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + // Check whether the parent matches the node-test. + $parentPath = $this->getParentXPath($contextPath); + if ($this->_checkNodeTest($parentPath, $axis['node-test'])) { + $xPathSet[] = $parentPath; // Add this node to the list of nodes. + } + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath attribute axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_attribute($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + // Check whether all nodes should be selected. + $nodeAttr = $this->nodeIndex[$contextPath]['attributes']; + if ($axis['node-test'] == '*' + || $axis['node-test'] == 'node()') { + foreach($nodeAttr as $key=>$dummy) { // Run through the attributes. + $xPathSet[] = $contextPath.'/attribute::'.$key; // Add this node to the node-set. + } + } + elseif (isset($nodeAttr[$axis['node-test']])) { + $xPathSet[] = $contextPath . '/attribute::'. $axis['node-test']; // Add this node to the node-set. + } + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath self axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_self($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + // Check whether the context match the node-test. + if ($this->_checkNodeTest($contextPath, $axis['node-test'])) { + $xPathSet[] = $contextPath; // Add this node to the node-set. + } + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath descendant axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_descendant($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + // Get a list of all children. + $allChildren = $this->nodeIndex[$contextPath]['childNodes']; + + // Run through all children in the order they where set. + $cSize = sizeOf($allChildren); + for ($i=0; $i<$cSize; $i++) { + $childPath = $allChildren[$i]['xpath']; + // Check whether the child matches the node-test. + if ($this->_checkNodeTest($childPath, $axis['node-test'])) { + $xPathSet[] = $childPath; // Add the child to the list of nodes. + } + // Recurse to the next level. + $xPathSet = array_merge($xPathSet, $this->_handleAxis_descendant($axis, $childPath)); + } + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath ancestor axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_ancestor($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + $parentPath = $this->getParentXPath($contextPath); // Get the parent of the current node. + + // Check whether the parent isn't super-root. + if (!empty($parentPath)) { + // Check whether the parent matches the node-test. + if ($this->_checkNodeTest($parentPath, $axis['node-test'])) { + $xPathSet[] = $parentPath; // Add the parent to the list of nodes. + } + // Handle all other ancestors. + $xPathSet = array_merge($this->_handleAxis_ancestor($axis, $parentPath), $xPathSet); + } + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath namespace axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_namespace($axis, $contextPath) { + $this->_displayError("The axis 'namespace is not suported'", __LINE__, __FILE__, FALSE); + } + + /** + * Handles the XPath following axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_following($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + do { // try-block + $node = $this->nodeIndex[$contextPath]; // Get the current node + $position = $node['pos']; // Get the current tree position. + $parent = $node['parentNode']; + // Check if there is a following sibling at all; if not end. + if ($position >= sizeOf($parent['childNodes'])) break; // try-block + // Build the starting abs. XPath + $startXPath = $parent['childNodes'][$position+1]['xpath']; + // Run through all nodes of the document. + $nodeKeys = array_keys($this->nodeIndex); + $nodeSize = sizeOf($nodeKeys); + for ($k=0; $k<$nodeSize; $k++) { + if ($nodeKeys[$k] == $startXPath) break; // Check whether this is the starting abs. XPath + } + for (; $k<$nodeSize; $k++) { + // Check whether the node fits the node-test. + if ($this->_checkNodeTest($nodeKeys[$k], $axis['node-test'])) { + $xPathSet[] = $nodeKeys[$k]; // Add the node to the list of nodes. + } + } + } while(FALSE); + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath preceding axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_preceding($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + // Run through all nodes of the document. + foreach ($this->nodeIndex as $xPath=>$dummy) { + if (empty($xPath)) continue; // skip super-Root + + // Check whether this is the context node. + if ($xPath == $contextPath) { + break; // After this we won't look for more nodes. + } + if (!strncmp($xPath, $contextPath, strLen($xPath))) { + continue; + } + // Check whether the node fits the node-test. + if ($this->_checkNodeTest($xPath, $axis['node-test'])) { + $xPathSet[] = $xPath; // Add the node to the list of nodes. + } + } + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath following-sibling axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_following_sibling($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + // Get all children from the parent. + $siblings = $this->_handleAxis_child($axis, $this->getParentXPath($contextPath)); + // Create a flag whether the context node was already found. + $found = FALSE; + + // Run through all siblings. + $size = sizeOf($siblings); + for ($i=0; $i<$size; $i++) { + $sibling = $siblings[$i]; + + // Check whether the context node was already found. + if ($found) { + // Check whether the sibling matches the node-test. + if ($this->_checkNodeTest($sibling, $axis['node-test'])) { + $xPathSet[] = $sibling; // Add the sibling to the list of nodes. + } + } + // Check if we reached *this* context node. + if ($sibling == $contextPath) { + $found = TRUE; // Continue looking for other siblings. + } + } + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath preceding-sibling axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_preceding_sibling($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + // Get all children from the parent. + $siblings = $this->_handleAxis_child($axis, $this->getParentXPath($contextPath)); + + // Run through all siblings. + $size = sizeOf($siblings); + for ($i=0; $i<$size; $i++) { + $sibling = $siblings[$i]; + // Check whether this is the context node. + if ($sibling == $contextPath) { + break; // Don't continue looking for other siblings. + } + // Check whether the sibling matches the node-test. + if ($this->_checkNodeTest($sibling, $axis['node-test'])) { + $xPathSet[] = $sibling; // Add the sibling to the list of nodes. + } + } + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath descendant-or-self axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_descendant_or_self($axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + // Read the nodes. + $xPathSet = array_merge( + $this->_handleAxis_self($axis, $contextPath), + $this->_handleAxis_descendant($axis, $contextPath) + ); + return $xPathSet; // Return the nodeset. + } + + /** + * Handles the XPath ancestor-or-self axis. + * + * This method handles the XPath ancestor-or-self axis. + * + * @param $axis (array) Array containing information about the axis. + * @param $contextPath (string) xpath to starting node from which the axis should be processed. + * @return (array) A vector containing all nodes that were found, during the evaluation of the axis. + * @see evaluate() + */ + function _handleAxis_ancestor_or_self ( $axis, $contextPath) { + $xPathSet = array(); // Create an empty node-set. + + // Read the nodes. + $xPathSet = array_merge( + $this->_handleAxis_ancestor($axis, $contextPath), + $this->_handleAxis_self($axis, $contextPath) + ); + return $xPathSet; // Return the nodeset. + } + + + //----------------------------------------------------------------------------------------- + // XPath ------ XPath FUNCTION Handlers ------ + //----------------------------------------------------------------------------------------- + + /** + * Handles the XPath function last. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_last($arguments, $context) { + return $context['size']; + } + + /** + * Handles the XPath function position. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_position($arguments, $context) { + return $context['pos']; + } + + /** + * Handles the XPath function count. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_count($arguments, $context) { + // Evaluate the argument of the method as an XPath and return the number of results. + return count($this->_evaluateExpr($arguments, $context)); + } + + /** + * Handles the XPath function id. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_id($arguments, $context) { + $arguments = trim($arguments); // Trim the arguments. + $arguments = explode(' ', $arguments); // Now split the arguments into an array. + // Create a list of nodes. + $resultXPaths = array(); + // Run through all nodes of the document. + $keys = array_keys($this->nodeIndex); + $kSize = $sizeOf($keys); + for ($i=0; $i<$kSize; $i++) { + if (empty($keys[$i])) continue; // skip super-Root + if (in_array($this->nodeIndex[$keys[$i]]['attributes']['id'], $arguments)) { + $resultXPaths[] = $context['nodePath']; // Add this node to the list of nodes. + } + } + return $resultXPaths; // Return the list of nodes. + } + + /** + * Handles the XPath function name. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_name($arguments, $context) { + // If the argument it omitted, it defaults to a node-set with the context node as its only member. + if (empty($arguments)) { + return $this->_addLiteral($this->nodeIndex[$context['nodePath']]['name']); + } + + // Evaluate the argument to get a node set. + $nodeSet = $this->_evaluateExpr($arguments, $context); + if (!is_array($nodeSet)) return ''; + if (count($nodeSet) < 1) return ''; + if (!isset($this->nodeIndex[$nodeSet[0]])) return ''; + // Return a reference to the name of the node. + return $this->_addLiteral($this->nodeIndex[$nodeSet[0]]['name']); + } + + /** + * Handles the XPath function string. + * + * http://www.w3.org/TR/xpath#section-String-Functions + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_string($arguments, $context) { + // Check what type of parameter is given + if (is_array($arguments)) { + // Get the value of the first result (which means we want to concat all the text...unless + // a specific text() node has been given, and it will switch off to substringData + if (!count($arguments)) $result = ''; + else { + $result = $this->_stringValue($arguments[0]); + if (($literal = $this->_asLiteral($result)) !== FALSE) { + $result = $literal; + } + } + } + // Is it a number string? + elseif (preg_match('/^[0-9]+(\.[0-9]+)?$/', $arguments) OR preg_match('/^\.[0-9]+$/', $arguments)) { + // ### Note no support for NaN and Infinity. + $number = doubleval($arguments); // Convert the digits to a number. + $result = strval($number); // Return the number. + } + elseif (is_bool($arguments)) { // Check whether it's TRUE or FALSE and return as string. + // ### Note that we used to return TRUE and FALSE which was incorrect according to the standard. + if ($arguments === TRUE) { + $result = 'true'; + } else { + $result = 'false'; + } + } + elseif (($literal = $this->_asLiteral($arguments)) !== FALSE) { + return $literal; + } + elseif (!empty($arguments)) { + // Spec says: + // "An object of a type other than the four basic types is converted to a string in a way that + // is dependent on that type." + // Use the argument as an XPath. + $result = $this->_evaluateExpr($arguments, $context); + if (is_string($result) && is_string($arguments) && (!strcmp($result, $arguments))) { + $this->_displayError("Loop detected in XPath expression. Probably an internal error :o/. _handleFunction_string($result)", __LINE__, __FILE__, FALSE); + return ''; + } else { + $result = $this->_handleFunction_string($result, $context); + } + } + else { + $result = ''; // Return an empty string. + } + return $result; + } + + /** + * Handles the XPath function concat. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_concat($arguments, $context) { + // Split the arguments. + $arguments = explode(',', $arguments); + // Run through each argument and evaluate it. + $size = sizeof($arguments); + for ($i=0; $i<$size; $i++) { + $arguments[$i] = trim($arguments[$i]); // Trim each argument. + // Evaluate it. + $arguments[$i] = $this->_handleFunction_string($arguments[$i], $context); + } + $arguments = implode('', $arguments); // Put the string together and return it. + return $this->_addLiteral($arguments); + } + + /** + * Handles the XPath function starts-with. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_starts_with($arguments, $context) { + // Get the arguments. + $first = trim($this->_prestr($arguments, ',')); + $second = trim($this->_afterstr($arguments, ',')); + // Evaluate each argument. + $first = $this->_handleFunction_string($first, $context); + $second = $this->_handleFunction_string($second, $context); + // Check whether the first string starts with the second one. + return (bool) ereg('^'.$second, $first); + } + + /** + * Handles the XPath function contains. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_contains($arguments, $context) { + // Get the arguments. + $first = trim($this->_prestr($arguments, ',')); + $second = trim($this->_afterstr($arguments, ',')); + //echo "Predicate: $arguments First: ".$first." Second: ".$second."\n"; + // Evaluate each argument. + $first = $this->_handleFunction_string($first, $context); + $second = $this->_handleFunction_string($second, $context); + //echo $second.": ".$first."\n"; + // If the search string is null, then the provided there is a value it will contain it as + // it is considered that all strings contain the empty string. ## N.S. + if ($second==='') return TRUE; + // Check whether the first string starts with the second one. + if (strpos($first, $second) === FALSE) { + return FALSE; + } else { + return TRUE; + } + } + + /** + * Handles the XPath function substring-before. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_substring_before($arguments, $context) { + // Get the arguments. + $first = trim($this->_prestr($arguments, ',')); + $second = trim($this->_afterstr($arguments, ',')); + // Evaluate each argument. + $first = $this->_handleFunction_string($first, $context); + $second = $this->_handleFunction_string($second, $context); + // Return the substring. + return $this->_addLiteral($this->_prestr(strval($first), strval($second))); + } + + /** + * Handles the XPath function substring-after. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_substring_after($arguments, $context) { + // Get the arguments. + $first = trim($this->_prestr($arguments, ',')); + $second = trim($this->_afterstr($arguments, ',')); + // Evaluate each argument. + $first = $this->_handleFunction_string($first, $context); + $second = $this->_handleFunction_string($second, $context); + // Return the substring. + return $this->_addLiteral($this->_afterstr(strval($first), strval($second))); + } + + /** + * Handles the XPath function substring. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_substring($arguments, $context) { + // Split the arguments. + $arguments = explode(",", $arguments); + $size = sizeOf($arguments); + for ($i=0; $i<$size; $i++) { // Run through all arguments. + $arguments[$i] = trim($arguments[$i]); // Trim the string. + // Evaluate each argument. + $arguments[$i] = $this->_handleFunction_string($arguments[$i], $context); + } + // Check whether a third argument was given and return the substring.. + if (!empty($arguments[2])) { + return $this->_addLiteral(substr(strval($arguments[0]), $arguments[1] - 1, $arguments[2])); + } else { + return $this->_addLiteral(substr(strval($arguments[0]), $arguments[1] - 1)); + } + } + + /** + * Handles the XPath function string-length. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_string_length($arguments, $context) { + $arguments = trim($arguments); // Trim the argument. + // Evaluate the argument. + $arguments = $this->_handleFunction_string($arguments, $context); + return strlen(strval($arguments)); // Return the length of the string. + } + + /** + * Handles the XPath function normalize-space. + * + * The normalize-space function returns the argument string with whitespace + * normalized by stripping leading and trailing whitespace and replacing sequences + * of whitespace characters by a single space. + * If the argument is omitted, it defaults to the context node converted to a string, + * in other words the string-value of the context node + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (stri)g trimed string + * @see evaluate() + */ + function _handleFunction_normalize_space($arguments, $context) { + if (empty($arguments)) { + $arguments = $this->getParentXPath($context['nodePath']).'/'.$this->nodeIndex[$context['nodePath']]['name'].'['.$this->nodeIndex[$context['nodePath']]['contextPos'].']'; + } else { + $arguments = $this->_handleFunction_string($arguments, $context); + } + $arguments = trim(preg_replace (";[[:space:]]+;s",' ',$arguments)); + return $this->_addLiteral($arguments); + } + + /** + * Handles the XPath function translate. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_translate($arguments, $context) { + $arguments = explode(',', $arguments); // Split the arguments. + $size = sizeOf($arguments); + for ($i=0; $i<$size; $i++) { // Run through all arguments. + $arguments[$i] = trim($arguments[$i]); // Trim the argument. + // Evaluate the argument. + $arguments[$i] = $this->_handleFunction_string($arguments[$i], $context); + } + // Return the translated string. + return $this->_addLiteral(strtr($arguments[0], $arguments[1], $arguments[2])); + } + + /** + * Handles the XPath function boolean. + * + * http://www.w3.org/TR/xpath#section-Boolean-Functions + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_boolean($arguments, $context) { + if (empty($arguments)) { + return FALSE; // Sorry, there were no arguments. + } + // a bool is dead obvious + elseif (is_bool($arguments)) { + return $arguments; + } + // a node-set is true if and only if it is non-empty + elseif (is_array($arguments)) { + return (count($arguments) > 0); + } + // a number is true if and only if it is neither positive or negative zero nor NaN + // (Straight out of the XPath spec.. makes no sense?????) + elseif (preg_match('/^[0-9]+(\.[0-9]+)?$/', $arguments) || preg_match('/^\.[0-9]+$/', $arguments)) { + $number = doubleval($arguments); // Convert the digits to a number. + // If number zero return FALSE else TRUE. + if ($number == 0) return FALSE; else return TRUE; + } + // a string is true if and only if its length is non-zero + elseif (($literal = $this->_asLiteral($arguments)) !== FALSE) { + return (strlen($literal) != 0); + } + // an object of a type other than the four basic types is converted to a boolean in a + // way that is dependent on that type + else { + // Spec says: + // "An object of a type other than the four basic types is converted to a number in a way + // that is dependent on that type" + // Try to evaluate the argument as an XPath. + $result = $this->_evaluateExpr($arguments, $context); + if (is_string($result) && is_string($arguments) && (!strcmp($result, $arguments))) { + $this->_displayError("Loop detected in XPath expression. Probably an internal error :o/. _handleFunction_boolean($result)", __LINE__, __FILE__, FALSE); + return FALSE; + } else { + return $this->_handleFunction_boolean($result, $context); + } + } + } + + /** + * Handles the XPath function not. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_not($arguments, $context) { + // Return the negative value of the content of the brackets. + $bArgResult = $this->_handleFunction_boolean($arguments, $context); +//echo "Before inversion: ".($bArgResult?"TRUE":"FALSE")."\n"; + return !$bArgResult; + } + + /** + * Handles the XPath function TRUE. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_true($arguments, $context) { + return TRUE; // Return TRUE. + } + + /** + * Handles the XPath function FALSE. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_false($arguments, $context) { + return FALSE; // Return FALSE. + } + + /** + * Handles the XPath function lang. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_lang($arguments, $context) { + $arguments = trim($arguments); // Trim the arguments. + $currentNode = $this->nodeIndex[$context['nodePath']]; + while (!empty($currentNode['name'])) { // Run through the ancestors. + // Check whether the node has an language attribute. + if (isSet($currentNode['attributes']['xml:lang'])) { + // Check whether it's the language, the user asks for; if so return TRUE else FALSE + return eregi('^'.$arguments, $currentNode['attributes']['xml:lang']); + } + $currentNode = $currentNode['parentNode']; // Move up to parent + } // End while + return FALSE; + } + + /** + * Handles the XPath function number. + * + * http://www.w3.org/TR/xpath#section-Number-Functions + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_number($arguments, $context) { + // Check the type of argument. + + // A string that is a number + if (is_numeric($arguments)) { + return doubleval($arguments); // Return the argument as a number. + } + // A bool + elseif (is_bool($arguments)) { // Return TRUE/FALSE as a number. + if ($arguments === TRUE) return 1; else return 0; + } + // A node set + elseif (is_array($arguments)) { + // Is converted to a string then handled like a string + $string = $this->_handleFunction_string($arguments, $context); + if (is_numeric($string)) + return doubleval($string); + } + elseif (($literal = $this->_asLiteral($arguments)) !== FALSE) { + if (is_numeric($literal)) { + return doubleval($literal); + } else { + // If we are to stick strictly to the spec, we should return NaN, but lets just + // leave PHP to see if can do some dynamic conversion. + return $literal; + } + } + else { + // Spec says: + // "An object of a type other than the four basic types is converted to a number in a way + // that is dependent on that type" + // Try to evaluate the argument as an XPath. + $result = $this->_evaluateExpr($arguments, $context); + if (is_string($result) && is_string($arguments) && (!strcmp($result, $arguments))) { + $this->_displayError("Loop detected in XPath expression. Probably an internal error :o/. _handleFunction_number($result)", __LINE__, __FILE__, FALSE); + return FALSE; + } else { + return $this->_handleFunction_number($result, $context); + } + } + } + + /** + * Handles the XPath function sum. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_sum($arguments, $context) { + $arguments = trim($arguments); // Trim the arguments. + // Evaluate the arguments as an XPath query. + $result = $this->_evaluateExpr($arguments, $context); + $sum = 0; // Create a variable to save the sum. + // The sum function expects a node set as an argument. + if (is_array($result)) { + // Run through all results. + $size = sizeOf($result); + for ($i=0; $i<$size; $i++) { + $value = $this->_stringValue($result[$i], $context); + if (($literal = $this->_asLiteral($value)) !== FALSE) { + $value = $literal; + } + $sum += doubleval($value); // Add it to the sum. + } + } + return $sum; // Return the sum. + } + + /** + * Handles the XPath function floor. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_floor($arguments, $context) { + if (!is_numeric($arguments)) { + $arguments = $this->_handleFunction_number($arguments, $context); + } + $arguments = doubleval($arguments); // Convert the arguments to a number. + return floor($arguments); // Return the result + } + + /** + * Handles the XPath function ceiling. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_ceiling($arguments, $context) { + if (!is_numeric($arguments)) { + $arguments = $this->_handleFunction_number($arguments, $context); + } + $arguments = doubleval($arguments); // Convert the arguments to a number. + return ceil($arguments); // Return the result + } + + /** + * Handles the XPath function round. + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_round($arguments, $context) { + if (!is_numeric($arguments)) { + $arguments = $this->_handleFunction_number($arguments, $context); + } + $arguments = doubleval($arguments); // Convert the arguments to a number. + return round($arguments); // Return the result + } + + //----------------------------------------------------------------------------------------- + // XPath ------ XPath Extension FUNCTION Handlers ------ + //----------------------------------------------------------------------------------------- + + /** + * Handles the XPath function x-lower. + * + * lower case a string. + * string x-lower(string) + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_x_lower($arguments, $context) { + // Evaluate the argument. + $string = $this->_handleFunction_string($arguments, $context); + // Return a reference to the lowercased string + return $this->_addLiteral(strtolower(strval($string))); + } + + /** + * Handles the XPath function x-upper. + * + * upper case a string. + * string x-upper(string) + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @see evaluate() + */ + function _handleFunction_x_upper($arguments, $context) { + // Evaluate the argument. + $string = $this->_handleFunction_string($arguments, $context); + // Return a reference to the lowercased string + return $this->_addLiteral(strtoupper(strval($string))); + } + + /** + * Handles the XPath function generate-id. + * + * Produce a unique id for the first node of the node set. + * + * Example usage, produces an index of all the nodes in an .xml document, where the content of each + * "section" is the exported node as XML. + * + * $aFunctions = $xPath->match('//'); + * + * foreach ($aFunctions as $Function) { + * $id = $xPath->match("generate-id($Function)"); + * echo "$Function
      "; + * } + * + * foreach ($aFunctions as $Function) { + * $id = $xPath->match("generate-id($Function)"); + * echo "

      $Function

      "; + * echo htmlspecialchars($xPath->exportAsXml($Function)); + * } + * + * @param $arguments (string) String containing the arguments that were passed to the function. + * @param $context (array) The context from which to evaluate the function + * @return (mixed) Depending on the type of function being processed + * @author Ricardo Garcia + * @see evaluate() + */ + function _handleFunction_generate_id($arguments, $context) { + // If the argument is omitted, it defaults to a node-set with the context node as its only member. + if (is_string($arguments) && empty($arguments)) { + // We need ids then + $this->_generate_ids(); + return $this->_addLiteral($this->nodeIndex[$context['nodePath']]['generated_id']); + } + + // Evaluate the argument to get a node set. + $nodeSet = $this->_evaluateExpr($arguments, $context); + + if (!is_array($nodeSet)) return ''; + if (count($nodeSet) < 1) return ''; + if (!isset($this->nodeIndex[$nodeSet[0]])) return ''; + // Return a reference to the name of the node. + // We need ids then + $this->_generate_ids(); + return $this->_addLiteral($this->nodeIndex[$nodeSet[0]]['generated_id']); + } + + //----------------------------------------------------------------------------------------- + // XPathEngine ------ Help Stuff ------ + //----------------------------------------------------------------------------------------- + + /** + * Decodes the character set entities in the given string. + * + * This function is given for convenience, as all text strings or attributes + * are going to come back to you with their entities still encoded. You can + * use this function to remove these entites. + * + * It makes use of the get_html_translation_table(HTML_ENTITIES) php library + * call, so is limited in the same ways. At the time of writing this seemed + * be restricted to iso-8859-1 + * + * ### Provide an option that will do this by default. + * + * @param $encodedData (mixed) The string or array that has entities you would like to remove + * @param $reverse (bool) If TRUE entities will be encoded rather than decoded, ie + * < to < rather than < to <. + * @return (mixed) The string or array returned with entities decoded. + */ + function decodeEntities($encodedData, $reverse=FALSE) { + static $aEncodeTbl; + static $aDecodeTbl; + // Get the translation entities, but we'll cache the result to enhance performance. + if (empty($aDecodeTbl)) { + // Get the translation entities. + $aEncodeTbl = get_html_translation_table(HTML_ENTITIES); + $aDecodeTbl = array_flip($aEncodeTbl); + } + + // If it's just a single string. + if (!is_array($encodedData)) { + if ($reverse) { + return strtr($encodedData, $aEncodeTbl); + } else { + return strtr($encodedData, $aDecodeTbl); + } + } + + $result = array(); + foreach($encodedData as $string) { + if ($reverse) { + $result[] = strtr($string, $aEncodeTbl); + } else { + $result[] = strtr($string, $aDecodeTbl); + } + } + + return $result; + } + + /** + * Compare two nodes to see if they are equal (point to the same node in the doc) + * + * 2 nodes are considered equal if the absolute XPath is equal. + * + * @param $node1 (mixed) Either an absolute XPath to an node OR a real tree-node (hash-array) + * @param $node2 (mixed) Either an absolute XPath to an node OR a real tree-node (hash-array) + * @return (bool) TRUE if equal (see text above), FALSE if not (and on error). + */ + function equalNodes($node1, $node2) { + $xPath_1 = is_string($node1) ? $node1 : $this->getNodePath($node1); + $xPath_2 = is_string($node2) ? $node2 : $this->getNodePath($node2); + return (strncasecmp ($xPath_1, $xPath_2, strLen($xPath_1)) == 0); + } + + /** + * Get the absolute XPath of a node that is in a document tree. + * + * @param $node (array) A real tree-node (hash-array) + * @return (string) The string path to the node or FALSE on error. + */ + function getNodePath($node) { + if (!empty($node['xpath'])) return $node['xpath']; + $pathInfo = array(); + do { + if (empty($node['name']) OR empty($node['parentNode'])) break; // End criteria + $pathInfo[] = array('name' => $node['name'], 'contextPos' => $node['contextPos']); + $node = $node['parentNode']; + } while (TRUE); + + $xPath = ''; + for ($i=sizeOf($pathInfo)-1; $i>=0; $i--) { + $xPath .= '/' . $pathInfo[$i]['name'] . '[' . $pathInfo[$i]['contextPos'] . ']'; + } + if (empty($xPath)) return FALSE; + return $xPath; + } + + /** + * Retrieves the absolute parent XPath query. + * + * The parents stored in the tree are only relative parents...but all the parent + * information is stored in the XPath query itself...so instead we use a function + * to extract the parent from the absolute Xpath query + * + * @param $childPath (string) String containing an absolute XPath query + * @return (string) returns the absolute XPath of the parent + */ + function getParentXPath($absoluteXPath) { + $lastSlashPos = strrpos($absoluteXPath, '/'); + if ($lastSlashPos == 0) { // it's already the root path + return ''; // 'super-root' + } else { + return (substr($absoluteXPath, 0, $lastSlashPos)); + } + } + + /** + * Returns TRUE if the given node has child nodes below it + * + * @param $absoluteXPath (string) full path of the potential parent node + * @return (bool) TRUE if this node exists and has a child, FALSE otherwise + */ + function hasChildNodes($absoluteXPath) { + if ($this->_indexIsDirty) $this->reindexNodeTree(); + return (bool) (isSet($this->nodeIndex[$absoluteXPath]) + AND sizeOf($this->nodeIndex[$absoluteXPath]['childNodes'])); + } + + /** + * Translate all ampersands to it's literal entities '&' and back. + * + * I wasn't aware of this problem at first but it's important to understand why we do this. + * At first you must know: + * a) PHP's XML parser *translates* all entities to the equivalent char E.g. < is returned as '<' + * b) PHP's XML parser (in V 4.1.0) has problems with most *literal* entities! The only one's that are + * recognized are &, < > and ". *ALL* others (like   © a.s.o.) cause an + * XML_ERROR_UNDEFINED_ENTITY error. I reported this as bug at http://bugs.php.net/bug.php?id=15092 + * (It turned out not to be a 'real' bug, but one of those nice W3C-spec things). + * + * Forget position b) now. It's just for info. Because the way we will solve a) will also solve b) too. + * + * THE PROBLEM + * To understand the problem, here a sample: + * Given is the following XML: " <   > " + * Try to parse it and PHP's XML parser will fail with a XML_ERROR_UNDEFINED_ENTITY becaus of + * the unknown litteral-entity ' '. (The numeric equivalent ' ' would work though). + * Next try is to use the numeric equivalent 160 for ' ', thus " <   > " + * The data we receive in the tag is " < > ". So we get the *translated entities* and + * NOT the 3 entities <   >. Thus, we will not even notice that there were entities at all! + * In *most* cases we're not able to tell if the data was given as entity or as 'normal' char. + * E.g. When receiving a quote or a single space were not able to tell if it was given as 'normal' char + * or as   or ". Thus we loose the entity-information of the XML-data! + * + * THE SOLUTION + * The better solution is to keep the data 'as is' by replacing the '&' before parsing begins. + * E.g. Taking the original input from above, this would result in " &lt; &nbsp; &gt; " + * The data we receive now for the tag is " <   > ". and that's what we want. + * + * The bad thing is, that a global replace will also replace data in section that are NOT translated by the + * PHP XML-parser. That is comments (), IP-sections (stuff between ) and CDATA-block too. + * So all data comming from those sections must be reversed. This is done during the XML parse phase. + * So: + * a) Replacement of all '&' in the XML-source. + * b) All data that is not char-data or in CDATA-block have to be reversed during the XML-parse phase. + * + * @param $xmlSource (string) The XML string + * @return (string) The XML string with translated ampersands. + */ + function _translateAmpersand($xmlSource, $reverse=FALSE) { + $PHP5 = (substr(phpversion(), 0, 1) == '5'); + if ($PHP5) { + //otherwise we receive &nbsp; instead of   + return $xmlSource; + } else { + return ($reverse ? str_replace('&', '&', $xmlSource) : str_replace('&', '&', $xmlSource)); + } + } + +} // END OF CLASS XPathEngine + + +/************************************************************************************************ +* =============================================================================================== +* X P a t h - Class +* =============================================================================================== +************************************************************************************************/ + +define('XPATH_QUERYHIT_ALL' , 1); +define('XPATH_QUERYHIT_FIRST' , 2); +define('XPATH_QUERYHIT_UNIQUE', 3); + +class XPath extends XPathEngine { + + /** + * Constructor of the class + * + * Optionally you may call this constructor with the XML-filename to parse and the + * XML option vector. A option vector sample: + * $xmlOpt = array(XML_OPTION_CASE_FOLDING => FALSE, XML_OPTION_SKIP_WHITE => TRUE); + * + * @param $userXmlOptions (array) (optional) Vector of (=>, =>, ...) + * @param $fileName (string) (optional) Filename of XML file to load from. + * It is recommended that you call importFromFile() + * instead as you will get an error code. If the + * import fails, the object will be set to FALSE. + * @see parent::XPathEngine() + */ + function XPath($fileName='', $userXmlOptions=array()) { + parent::XPathEngine($userXmlOptions); + $this->properties['modMatch'] = XPATH_QUERYHIT_ALL; + if ($fileName) { + if (!$this->importFromFile($fileName)) { + // Re-run the base constructor to "reset" the object. If the user has any sense, then + // they will have created the object, and then explicitly called importFromFile(), giving + // them the chance to catch and handle the error properly. + parent::XPathEngine($userXmlOptions); + } + } + } + + /** + * Resets the object so it's able to take a new xml sting/file + * + * Constructing objects is slow. If you can, reuse ones that you have used already + * by using this reset() function. + */ + function reset() { + parent::reset(); + $this->properties['modMatch'] = XPATH_QUERYHIT_ALL; + } + + //----------------------------------------------------------------------------------------- + // XPath ------ Get / Set Stuff ------ + //----------------------------------------------------------------------------------------- + + /** + * Resolves and xPathQuery array depending on the property['modMatch'] + * + * Most of the modification functions of XPath will also accept a xPathQuery (instead + * of an absolute Xpath). The only problem is that the query could match more the one + * node. The question is, if the none, the fist or all nodes are to be modified. + * The behaver can be set with setModMatch() + * + * @param $modMatch (int) One of the following: + * - XPATH_QUERYHIT_ALL (default) + * - XPATH_QUERYHIT_FIRST + * - XPATH_QUERYHIT_UNIQUE // If the query matches more then one node. + * @see _resolveXPathQuery() + */ + function setModMatch($modMatch = XPATH_QUERYHIT_ALL) { + switch($modMatch) { + case XPATH_QUERYHIT_UNIQUE : $this->properties['modMatch'] = XPATH_QUERYHIT_UNIQUE; break; + case XPATH_QUERYHIT_FIRST: $this->properties['modMatch'] = XPATH_QUERYHIT_FIRST; break; + default: $this->properties['modMatch'] = XPATH_QUERYHIT_ALL; + } + } + + //----------------------------------------------------------------------------------------- + // XPath ------ DOM Like Modification ------ + //----------------------------------------------------------------------------------------- + + //----------------------------------------------------------------------------------------- + // XPath ------ Child (Node) Set/Get ------ + //----------------------------------------------------------------------------------------- + + /** + * Retrieves the name(s) of a node or a group of document nodes. + * + * This method retrieves the names of a group of document nodes + * specified in the argument. So if the argument was '/A[1]/B[2]' then it + * would return 'B' if the node did exist in the tree. + * + * @param $xPathQuery (mixed) Array or single full document path(s) of the node(s), + * from which the names should be retrieved. + * @return (mixed) Array or single string of the names of the specified + * nodes, or just the individual name. If the node did + * not exist, then returns FALSE. + */ + function nodeName($xPathQuery) { + if (is_array($xPathQuery)) { + $xPathSet = $xPathQuery; + } else { + // Check for a valid xPathQuery + $xPathSet = $this->_resolveXPathQuery($xPathQuery,'nodeName'); + } + if (count($xPathSet) == 0) return FALSE; + // For each node, get it's name + $result = array(); + foreach($xPathSet as $xPath) { + $node = &$this->getNode($xPath); + if (!$node) { + // ### Fatal internal error?? + continue; + } + $result[] = $node['name']; + } + // If just a single string, return string + if (count($xPathSet) == 1) $result = $result[0]; + // Return result. + return $result; + } + + /** + * Removes a node from the XML document. + * + * This method removes a node from the tree of nodes of the XML document. If the node + * is a document node, all children of the node and its character data will be removed. + * If the node is an attribute node, only this attribute will be removed, the node to which + * the attribute belongs as well as its children will remain unmodified. + * + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) xpath to the node (See note above). + * @param $autoReindex (bool) (optional, default=TRUE) Reindex the document to reflect + * the changes. A performance helper. See reindexNodeTree() + * @return (bool) TRUE on success, FALSE on error; + * @see setModMatch(), reindexNodeTree() + */ + function removeChild($xPathQuery, $autoReindex=TRUE) { + $ThisFunctionName = 'removeChild'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + echo "Node: $xPathQuery\n"; + echo '
      '; + } + + $NULL = NULL; + $status = FALSE; + do { // try-block + // Check for a valid xPathQuery + $xPathSet = $this->_resolveXPathQuery($xPathQuery,'removeChild'); + if (sizeOf($xPathSet) === 0) { + $this->_displayError(sprintf($this->errorStrings['NoNodeMatch'], $xPathQuery), __LINE__, __FILE__, FALSE); + break; // try-block + } + $mustReindex = FALSE; + // Make chages from 'bottom-up'. In this manner the modifications will not affect itself. + for ($i=sizeOf($xPathSet)-1; $i>=0; $i--) { + $absoluteXPath = $xPathSet[$i]; + if (preg_match(';/attribute::;', $absoluteXPath)) { // Handle the case of an attribute node + $xPath = $this->_prestr($absoluteXPath, '/attribute::'); // Get the path to the attribute node's parent. + $attribute = $this->_afterstr($absoluteXPath, '/attribute::'); // Get the name of the attribute. + unSet($this->nodeIndex[$xPath]['attributes'][$attribute]); // Unset the attribute + if ($bDebugThisFunction) echo "We removed the attribute '$attribute' of node '$xPath'.\n"; + continue; + } + // Otherwise remove the node by setting it to NULL. It will be removed on the next reindexNodeTree() call. + $mustReindex = $autoReindex; + // Flag the index as dirty; it's not uptodate. A reindex will be forced (if dirty) when exporting the XML doc + $this->_indexIsDirty = TRUE; + + $theNode = $this->nodeIndex[$absoluteXPath]; + $theNode['parentNode']['childNodes'][$theNode['pos']] =& $NULL; + if ($bDebugThisFunction) echo "We removed the node '$absoluteXPath'.\n"; + } + // Reindex the node tree again + if ($mustReindex) $this->reindexNodeTree(); + $status = TRUE; + } while(FALSE); + + $this->_closeDebugFunction($ThisFunctionName, $status, $bDebugThisFunction); + + return $status; + } + + /** + * Replace a node with any data string. The $data is taken 1:1. + * + * This function will delete the node you define by $absoluteXPath (plus it's sub-nodes) and + * substitute it by the string $text. Often used to push in not well formed HTML. + * WARNING: + * The $data is taken 1:1. + * You are in charge that the data you enter is valid XML if you intend + * to export and import the content again. + * + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) xpath to the node (See note above). + * @param $data (string) String containing the content to be set. *READONLY* + * @param $autoReindex (bool) (optional, default=TRUE) Reindex the document to reflect + * the changes. A performance helper. See reindexNodeTree() + * @return (bool) TRUE on success, FALSE on error; + * @see setModMatch(), replaceChild(), reindexNodeTree() + */ + function replaceChildByData($xPathQuery, $data, $autoReindex=TRUE) { + $ThisFunctionName = 'replaceChildByData'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + echo "Node: $xPathQuery\n"; + } + + $NULL = NULL; + $status = FALSE; + do { // try-block + // Check for a valid xPathQuery + $xPathSet = $this->_resolveXPathQuery($xPathQuery,'replaceChildByData'); + if (sizeOf($xPathSet) === 0) { + $this->_displayError(sprintf($this->errorStrings['NoNodeMatch'], $xPathQuery), __LINE__, __FILE__, FALSE); + break; // try-block + } + $mustReindex = FALSE; + // Make chages from 'bottom-up'. In this manner the modifications will not affect itself. + for ($i=sizeOf($xPathSet)-1; $i>=0; $i--) { + $mustReindex = $autoReindex; + // Flag the index as dirty; it's not uptodate. A reindex will be forced (if dirty) when exporting the XML doc + $this->_indexIsDirty = TRUE; + + $absoluteXPath = $xPathSet[$i]; + $theNode = $this->nodeIndex[$absoluteXPath]; + $pos = $theNode['pos']; + $theNode['parentNode']['textParts'][$pos] .= $data; + $theNode['parentNode']['childNodes'][$pos] =& $NULL; + if ($bDebugThisFunction) echo "We replaced the node '$absoluteXPath' with data.\n"; + } + // Reindex the node tree again + if ($mustReindex) $this->reindexNodeTree(); + $status = TRUE; + } while(FALSE); + + $this->_closeDebugFunction($ThisFunctionName, ($status) ? 'Success' : '!!! FAILD !!!', $bDebugThisFunction); + + return $status; + } + + /** + * Replace the node(s) that matches the xQuery with the passed node (or passed node-tree) + * + * If the passed node is a string it's assumed to be XML and replaceChildByXml() + * will be called. + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) Xpath to the node being replaced. + * @param $node (mixed) String or Array (Usually a String) + * If string: Vaild XML. E.g. "" or " foo bar " + * If array: A Node (can be a whole sub-tree) (See comment in header) + * @param $autoReindex (bool) (optional, default=TRUE) Reindex the document to reflect + * the changes. A performance helper. See reindexNodeTree() + * @return (array) The last replaced $node (can be a whole sub-tree) + * @see reindexNodeTree() + */ + function &replaceChild($xPathQuery, $node, $autoReindex=TRUE) { + $NULL = NULL; + if (is_string($node)) { + if (empty($node)) { //--sam. Not sure how to react on an empty string - think it's an error. + return array(); + } else { + if (!($node = $this->_xml2Document($node))) return FALSE; + } + } + + // Special case if it's 'super root'. We then have to take the child node == top node + if (empty($node['parentNode'])) $node = $node['childNodes'][0]; + + $status = FALSE; + do { // try-block + // Check for a valid xPathQuery + $xPathSet = $this->_resolveXPathQuery($xPathQuery,'replaceChild'); + if (sizeOf($xPathSet) === 0) { + $this->_displayError(sprintf($this->errorStrings['NoNodeMatch'], $xPathQuery), __LINE__, __FILE__, FALSE); + break; // try-block + } + $mustReindex = FALSE; + + // Make chages from 'bottom-up'. In this manner the modifications will not affect itself. + for ($i=sizeOf($xPathSet)-1; $i>=0; $i--) { + $mustReindex = $autoReindex; + // Flag the index as dirty; it's not uptodate. A reindex will be forced (if dirty) when exporting the XML doc + $this->_indexIsDirty = TRUE; + + $absoluteXPath = $xPathSet[$i]; + $childNode =& $this->nodeIndex[$absoluteXPath]; + $parentNode =& $childNode['parentNode']; + $childNode['parentNode'] =& $NULL; + $childPos = $childNode['pos']; + $parentNode['childNodes'][$childPos] =& $this->cloneNode($node); + } + if ($mustReindex) $this->reindexNodeTree(); + $status = TRUE; + } while(FALSE); + + if (!$status) return FALSE; + return $childNode; + } + + /** + * Insert passed node (or passed node-tree) at the node(s) that matches the xQuery. + * + * With parameters you can define if the 'hit'-node is shifted to the right or left + * and if it's placed before of after the text-part. + * Per derfault the 'hit'-node is shifted to the right and the node takes the place + * the of the 'hit'-node. + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * E.g. Following is given: AAA[1] + * / \ + * ..BBB[1]..BBB[2] .. + * + * a) insertChild('/AAA[1]/BBB[2]', ) + * b) insertChild('/AAA[1]/BBB[2]', , $shiftRight=FALSE) + * c) insertChild('/AAA[1]/BBB[2]', , $shiftRight=FALSE, $afterText=FALSE) + * + * a) b) c) + * AAA[1] AAA[1] AAA[1] + * / | \ / | \ / | \ + * ..BBB[1]..CCC[1]BBB[2].. ..BBB[1]..BBB[2]..CCC[1] ..BBB[1]..BBB[2]CCC[1].. + * + * #### Do a complete review of the "(optional)" tag after several arguments. + * + * @param $xPathQuery (string) Xpath to the node to append. + * @param $node (mixed) String or Array (Usually a String) + * If string: Vaild XML. E.g. "" or " foo bar " + * If array: A Node (can be a whole sub-tree) (See comment in header) + * @param $shiftRight (bool) (optional, default=TRUE) Shift the target node to the right. + * @param $afterText (bool) (optional, default=TRUE) Insert after the text. + * @param $autoReindex (bool) (optional, default=TRUE) Reindex the document to reflect + * the changes. A performance helper. See reindexNodeTree() + * @return (mixed) FALSE on error (or no match). On success we return the path(s) to the newly + * appended nodes. That is: Array of paths if more then 1 node was added or + * a single path string if only one node was added. + * NOTE: If autoReindex is FALSE, then we can't return the *complete* path + * as the exact doc-pos isn't available without reindexing. In that case we leave + * out the last [docpos] in the path(s). ie we'd return /A[3]/B instead of /A[3]/B[2] + * @see appendChildByXml(), reindexNodeTree() + */ + function insertChild($xPathQuery, $node, $shiftRight=TRUE, $afterText=TRUE, $autoReindex=TRUE) { + if (is_string($node)) { + if (empty($node)) { //--sam. Not sure how to react on an empty string - think it's an error. + return FALSE; + } else { + if (!($node = $this->_xml2Document($node))) return FALSE; + } + } + + // Special case if it's 'super root'. We then have to take the child node == top node + if (empty($node['parentNode'])) $node = $node['childNodes'][0]; + + // Check for a valid xPathQuery + $xPathSet = $this->_resolveXPathQuery($xPathQuery,'insertChild'); + if (sizeOf($xPathSet) === 0) { + $this->_displayError(sprintf($this->errorStrings['NoNodeMatch'], $xPathQuery), __LINE__, __FILE__, FALSE); + return FALSE; + } + $mustReindex = FALSE; + $newNodes = array(); + $result = array(); + // Make chages from 'bottom-up'. In this manner the modifications will not affect itself. + for ($i=sizeOf($xPathSet)-1; $i>=0; $i--) { + $absoluteXPath = $xPathSet[$i]; + $childNode =& $this->nodeIndex[$absoluteXPath]; + $parentNode =& $childNode['parentNode']; + + // We can't insert at the super root or at the root. + if (empty($absoluteXPath) || (!$parentNode['parentNode'])) { + $this->_displayError(sprintf($this->errorStrings['RootNodeAlreadyExists']), __LINE__, __FILE__, FALSE); + return FALSE; + } + + $mustReindex = $autoReindex; + // Flag the index as dirty; it's not uptodate. A reindex will be forced (if dirty) when exporting the XML doc + $this->_indexIsDirty = TRUE; + + //Special case: It not possible to add siblings to the top node. + if (empty($parentNode['name'])) continue; + $newNode =& $this->cloneNode($node); + $pos = $shiftRight ? $childNode['pos'] : $childNode['pos']+1; + $parentNode['childNodes'] = array_merge( + array_slice($parentNode['childNodes'], 0, $pos), + array(&$newNode), + array_slice($parentNode['childNodes'], $pos) + ); + $pos += $afterText ? 1 : 0; + $parentNode['textParts'] = array_merge( + array_slice($parentNode['textParts'], 0, $pos), + array(''), + array_slice($parentNode['textParts'], $pos) + ); + + // We are going from bottom to top, but the user will want results from top to bottom. + if ($mustReindex) { + // We'll have to wait till after the reindex to get the full path to this new node. + $newNodes[] = &$newNode; + } else { + // If we are reindexing the tree later, then we can't return the user any + // useful results, so we just return them the count. + $newNodePath = $parentNode['xpath'].'/'.$newNode['name']; + array_unshift($result, $newNodePath); + } + } + if ($mustReindex) { + $this->reindexNodeTree(); + // Now we must fill in the result array. Because until now we did not + // know what contextpos our newly added entries had, just their pos within + // the siblings. + foreach ($newNodes as $newNode) { + array_unshift($result, $newNode['xpath']); + } + } + if (count($result) == 1) $result = $result[0]; + return $result; + } + + /** + * Appends a child to anothers children. + * + * If you intend to do a lot of appending, you should leave autoIndex as FALSE + * and then call reindexNodeTree() when you are finished all the appending. + * + * @param $xPathQuery (string) Xpath to the node to append to. + * @param $node (mixed) String or Array (Usually a String) + * If string: Vaild XML. E.g. "" or " foo bar " + * If array: A Node (can be a whole sub-tree) (See comment in header) + * @param $afterText (bool) (optional, default=FALSE) Insert after the text. + * @param $autoReindex (bool) (optional, default=TRUE) Reindex the document to reflect + * the changes. A performance helper. See reindexNodeTree() + * @return (mixed) FALSE on error (or no match). On success we return the path(s) to the newly + * appended nodes. That is: Array of paths if more then 1 node was added or + * a single path string if only one node was added. + * NOTE: If autoReindex is FALSE, then we can't return the *complete* path + * as the exact doc-pos isn't available without reindexing. In that case we leave + * out the last [docpos] in the path(s). ie we'd return /A[3]/B instead of /A[3]/B[2] + * @see insertChild(), reindexNodeTree() + */ + function appendChild($xPathQuery, $node, $afterText=FALSE, $autoReindex=TRUE) { + if (is_string($node)) { + if (empty($node)) { //--sam. Not sure how to react on an empty string - think it's an error. + return FALSE; + } else { + if (!($node = $this->_xml2Document($node))) return FALSE; + } + } + + // Special case if it's 'super root'. We then have to take the child node == top node + if (empty($node['parentNode'])) $node = $node['childNodes'][0]; + + // Check for a valid xPathQuery + $xPathSet = $this->_resolveXPathQueryForNodeMod($xPathQuery, 'appendChild'); + if (sizeOf($xPathSet) === 0) return FALSE; + + $mustReindex = FALSE; + $newNodes = array(); + $result = array(); + // Make chages from 'bottom-up'. In this manner the modifications will not affect itself. + for ($i=sizeOf($xPathSet)-1; $i>=0; $i--) { + $mustReindex = $autoReindex; + // Flag the index as dirty; it's not uptodate. A reindex will be forced (if dirty) when exporting the XML doc + $this->_indexIsDirty = TRUE; + + $absoluteXPath = $xPathSet[$i]; + $parentNode =& $this->nodeIndex[$absoluteXPath]; + $newNode =& $this->cloneNode($node); + $parentNode['childNodes'][] =& $newNode; + $pos = count($parentNode['textParts']); + $pos -= $afterText ? 0 : 1; + $parentNode['textParts'] = array_merge( + array_slice($parentNode['textParts'], 0, $pos), + array(''), + array_slice($parentNode['textParts'], $pos) + ); + // We are going from bottom to top, but the user will want results from top to bottom. + if ($mustReindex) { + // We'll have to wait till after the reindex to get the full path to this new node. + $newNodes[] = &$newNode; + } else { + // If we are reindexing the tree later, then we can't return the user any + // useful results, so we just return them the count. + array_unshift($result, "$absoluteXPath/{$newNode['name']}"); + } + } + if ($mustReindex) { + $this->reindexNodeTree(); + // Now we must fill in the result array. Because until now we did not + // know what contextpos our newly added entries had, just their pos within + // the siblings. + foreach ($newNodes as $newNode) { + array_unshift($result, $newNode['xpath']); + } + } + if (count($result) == 1) $result = $result[0]; + return $result; + } + + /** + * Inserts a node before the reference node with the same parent. + * + * If you intend to do a lot of appending, you should leave autoIndex as FALSE + * and then call reindexNodeTree() when you are finished all the appending. + * + * @param $xPathQuery (string) Xpath to the node to insert new node before + * @param $node (mixed) String or Array (Usually a String) + * If string: Vaild XML. E.g. "" or " foo bar " + * If array: A Node (can be a whole sub-tree) (See comment in header) + * @param $afterText (bool) (optional, default=FLASE) Insert after the text. + * @param $autoReindex (bool) (optional, default=TRUE) Reindex the document to reflect + * the changes. A performance helper. See reindexNodeTree() + * @return (mixed) FALSE on error (or no match). On success we return the path(s) to the newly + * appended nodes. That is: Array of paths if more then 1 node was added or + * a single path string if only one node was added. + * NOTE: If autoReindex is FALSE, then we can't return the *complete* path + * as the exact doc-pos isn't available without reindexing. In that case we leave + * out the last [docpos] in the path(s). ie we'd return /A[3]/B instead of /A[3]/B[2] + * @see reindexNodeTree() + */ + function insertBefore($xPathQuery, $node, $afterText=TRUE, $autoReindex=TRUE) { + return $this->insertChild($xPathQuery, $node, $shiftRight=TRUE, $afterText, $autoReindex); + } + + + //----------------------------------------------------------------------------------------- + // XPath ------ Attribute Set/Get ------ + //----------------------------------------------------------------------------------------- + + /** + * Retrieves a dedecated attribute value or a hash-array of all attributes of a node. + * + * The first param $absoluteXPath must be a valid xpath OR a xpath-query that results + * to *one* xpath. If the second param $attrName is not set, a hash-array of all attributes + * of that node is returned. + * + * Optionally you may pass an attrubute name in $attrName and the function will return the + * string value of that attribute. + * + * @param $absoluteXPath (string) Full xpath OR a xpath-query that results to *one* xpath. + * @param $attrName (string) (Optional) The name of the attribute. See above. + * @return (mixed) hash-array or a string of attributes depending if the + * parameter $attrName was set (see above). FALSE if the + * node or attribute couldn't be found. + * @see setAttribute(), removeAttribute() + */ + function getAttributes($absoluteXPath, $attrName=NULL) { + // Numpty check + if (!isSet($this->nodeIndex[$absoluteXPath])) { + $xPathSet = $this->_resolveXPathQuery($absoluteXPath,'getAttributes'); + if (empty($xPathSet)) return FALSE; + // only use the first entry + $absoluteXPath = $xPathSet[0]; + } + if (!empty($this->parseOptions[XML_OPTION_CASE_FOLDING])) { + // Case in-sensitive + $attrName = strtoupper($attrName); + } + + // Return the complete list or just the desired element + if (is_null($attrName)) { + return $this->nodeIndex[$absoluteXPath]['attributes']; + } elseif (isSet($this->nodeIndex[$absoluteXPath]['attributes'][$attrName])) { + return $this->nodeIndex[$absoluteXPath]['attributes'][$attrName]; + } + return FALSE; + } + + /** + * Set attributes of a node(s). + * + * This method sets a number single attributes. An existing attribute is overwritten (default) + * with the new value, but setting the last param to FALSE will prevent overwritten. + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) xpath to the node (See note above). + * @param $name (string) Attribute name. + * @param $value (string) Attribute value. + * @param $overwrite (bool) If the attribute is already set we overwrite it (see text above) + * @return (bool) TRUE on success, FALSE on failure. + * @see getAttributes(), removeAttribute() + */ + function setAttribute($xPathQuery, $name, $value, $overwrite=TRUE) { + return $this->setAttributes($xPathQuery, array($name => $value), $overwrite); + } + + /** + * Version of setAttribute() that sets multiple attributes to node(s). + * + * This method sets a number of attributes. Existing attributes are overwritten (default) + * with the new values, but setting the last param to FALSE will prevent overwritten. + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) xpath to the node (See note above). + * @param $attributes (array) associative array of attributes to set. + * @param $overwrite (bool) If the attributes are already set we overwrite them (see text above) + * @return (bool) TRUE on success, FALSE otherwise + * @see setAttribute(), getAttributes(), removeAttribute() + */ + function setAttributes($xPathQuery, $attributes, $overwrite=TRUE) { + $status = FALSE; + do { // try-block + // The attributes parameter should be an associative array. + if (!is_array($attributes)) break; // try-block + + // Check for a valid xPathQuery + $xPathSet = $this->_resolveXPathQuery($xPathQuery,'setAttributes'); + foreach($xPathSet as $absoluteXPath) { + // Add the attributes to the node. + $theNode =& $this->nodeIndex[$absoluteXPath]; + if (empty($theNode['attributes'])) { + $this->nodeIndex[$absoluteXPath]['attributes'] = $attributes; + } else { + $theNode['attributes'] = $overwrite ? array_merge($theNode['attributes'],$attributes) : array_merge($attributes, $theNode['attributes']); + } + } + $status = TRUE; + } while(FALSE); // END try-block + + return $status; + } + + /** + * Removes an attribute of a node(s). + * + * This method removes *ALL* attributres per default unless the second parameter $attrList is set. + * $attrList can be either a single attr-name as string OR a vector of attr-names as array. + * E.g. + * removeAttribute(); # will remove *ALL* attributes. + * removeAttribute(, 'A'); # will only remove attributes called 'A'. + * removeAttribute(, array('A_1','A_2')); # will remove attribute 'A_1' and 'A_2'. + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) xpath to the node (See note above). + * @param $attrList (mixed) (optional) if not set will delete *all* (see text above) + * @return (bool) TRUE on success, FALSE if the node couldn't be found + * @see getAttributes(), setAttribute() + */ + function removeAttribute($xPathQuery, $attrList=NULL) { + // Check for a valid xPathQuery + $xPathSet = $this->_resolveXPathQuery($xPathQuery, 'removeAttribute'); + + if (!empty($attrList) AND is_string($attrList)) $attrList = array($attrList); + if (!is_array($attrList)) return FALSE; + + foreach($xPathSet as $absoluteXPath) { + // If the attribute parameter wasn't set then remove all the attributes + if ($attrList[0] === NULL) { + $this->nodeIndex[$absoluteXPath]['attributes'] = array(); + continue; + } + // Remove all the elements in the array then. + foreach($attrList as $name) { + unset($this->nodeIndex[$absoluteXPath]['attributes'][$name]); + } + } + return TRUE; + } + + //----------------------------------------------------------------------------------------- + // XPath ------ Text Set/Get ------ + //----------------------------------------------------------------------------------------- + + /** + * Retrieve all the text from a node as a single string. + * + * Sample + * Given is: This is sometext + * Return of getData('/AA[1]') would be: " This is sometext " + * The first param $xPathQuery must be a valid xpath OR a xpath-query that + * results to *one* xpath. + * + * @param $xPathQuery (string) xpath to the node - resolves to *one* xpath. + * @return (mixed) The returned string (see above), FALSE if the node + * couldn't be found or is not unique. + * @see getDataParts() + */ + function getData($xPathQuery) { + $aDataParts = $this->getDataParts($xPathQuery); + if ($aDataParts === FALSE) return FALSE; + return implode('', $aDataParts); + } + + /** + * Retrieve all the text from a node as a vector of strings + * + * Where each element of the array was interrupted by a non-text child element. + * + * Sample + * Given is: This is sometext + * Return of getDataParts('/AA[1]') would be: array([0]=>' This ', [1]=>'is ', [2]=>' some', [3]=>'text '); + * The first param $absoluteXPath must be a valid xpath OR a xpath-query that results + * to *one* xpath. + * + * @param $xPathQuery (string) xpath to the node - resolves to *one* xpath. + * @return (mixed) The returned array (see above), or FALSE if node is not + * found or is not unique. + * @see getData() + */ + function getDataParts($xPathQuery) { + // Resolve xPath argument + $xPathSet = $this->_resolveXPathQuery($xPathQuery, 'getDataParts'); + if (1 !== ($setSize=count($xPathSet))) { + $this->_displayError(sprintf($this->errorStrings['AbsoluteXPathRequired'], $xPathQuery) . "Not unique xpath-query, matched {$setSize}-times.", __LINE__, __FILE__, FALSE); + return FALSE; + } + $absoluteXPath = $xPathSet[0]; + // Is it an attribute node? + if (preg_match(";(.*)/attribute::([^/]*)$;U", $xPathSet[0], $matches)) { + $absoluteXPath = $matches[1]; + $attribute = $matches[2]; + if (!isSet($this->nodeIndex[$absoluteXPath]['attributes'][$attribute])) { + $this->_displayError("The $absoluteXPath/attribute::$attribute value isn't a node in this document.", __LINE__, __FILE__, FALSE); + continue; + } + return array($this->nodeIndex[$absoluteXPath]['attributes'][$attribute]); + } else if (preg_match(":(.*)/text\(\)(\[(.*)\])?$:U", $xPathQuery, $matches)) { + $absoluteXPath = $matches[1]; + $textPartNr = $matches[2]; + return array($this->nodeIndex[$absoluteXPath]['textParts'][$textPartNr]); + } else { + return $this->nodeIndex[$absoluteXPath]['textParts']; + } + } + + /** + * Retrieves a sub string of a text-part OR attribute-value. + * + * This method retrieves the sub string of a specific text-part OR (if the + * $absoluteXPath references an attribute) the the sub string of the attribute value. + * If no 'direct referencing' is used (Xpath ends with text()[]), then + * the first text-part of the node ist returned (if exsiting). + * + * @param $absoluteXPath (string) Xpath to the node (See note above). + * @param $offset (int) (optional, default is 0) Starting offset. (Just like PHP's substr()) + * @param $count (number) (optional, default is ALL) Character count (Just like PHP's substr()) + * @return (mixed) The sub string, FALSE if not found or on error + * @see XPathEngine::wholeText(), PHP's substr() + */ + function substringData($absoluteXPath, $offset = 0, $count = NULL) { + if (!($text = $this->wholeText($absoluteXPath))) return FALSE; + if (is_null($count)) { + return substr($text, $offset); + } else { + return substr($text, $offset, $count); + } + } + + /** + * Replace a sub string of a text-part OR attribute-value. + * + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) xpath to the node (See note above). + * @param $replacement (string) The string to replace with. + * @param $offset (int) (optional, default is 0) Starting offset. (Just like PHP's substr_replace ()) + * @param $count (number) (optional, default is 0=ALL) Character count (Just like PHP's substr_replace()) + * @param $textPartNr (int) (optional) (see _getTextSet() ) + * @return (bool) The new string value on success, FALSE if not found or on error + * @see substringData() + */ + function replaceData($xPathQuery, $replacement, $offset = 0, $count = 0, $textPartNr=1) { + if (!($textSet = $this->_getTextSet($xPathQuery, $textPartNr))) return FALSE; + $tSize=sizeOf($textSet); + for ($i=0; $i<$tSize; $i++) { + if ($count) { + $textSet[$i] = substr_replace($textSet[$i], $replacement, $offset, $count); + } else { + $textSet[$i] = substr_replace($textSet[$i], $replacement, $offset); + } + } + return TRUE; + } + + /** + * Insert a sub string in a text-part OR attribute-value. + * + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) xpath to the node (See note above). + * @param $data (string) The string to replace with. + * @param $offset (int) (optional, default is 0) Offset at which to insert the data. + * @return (bool) The new string on success, FALSE if not found or on error + * @see replaceData() + */ + function insertData($xPathQuery, $data, $offset=0) { + return $this->replaceData($xPathQuery, $data, $offset, 0); + } + + /** + * Append text data to the end of the text for an attribute OR node text-part. + * + * This method adds content to a node. If it's an attribute node, then + * the value of the attribute will be set, otherwise the passed data will append to + * character data of the node text-part. Per default the first text-part is taken. + * + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) to the node(s) (See note above). + * @param $data (string) String containing the content to be added. + * @param $textPartNr (int) (optional, default is 1) (see _getTextSet()) + * @return (bool) TRUE on success, otherwise FALSE + * @see _getTextSet() + */ + function appendData($xPathQuery, $data, $textPartNr=1) { + if (!($textSet = $this->_getTextSet($xPathQuery, $textPartNr))) return FALSE; + $tSize=sizeOf($textSet); + for ($i=0; $i<$tSize; $i++) { + $textSet[$i] .= $data; + } + return TRUE; + } + + /** + * Delete the data of a node. + * + * This method deletes content of a node. If it's an attribute node, then + * the value of the attribute will be removed, otherwise the node text-part. + * will be deleted. Per default the first text-part is deleted. + * + * NOTE: When passing a xpath-query instead of an abs. Xpath. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) to the node(s) (See note above). + * @param $offset (int) (optional, default is 0) Starting offset. (Just like PHP's substr_replace()) + * @param $count (number) (optional, default is 0=ALL) Character count. (Just like PHP's substr_replace()) + * @param $textPartNr (int) (optional, default is 0) the text part to delete (see _getTextSet()) + * @return (bool) TRUE on success, otherwise FALSE + * @see _getTextSet() + */ + function deleteData($xPathQuery, $offset=0, $count=0, $textPartNr=1) { + if (!($textSet = $this->_getTextSet($xPathQuery, $textPartNr))) return FALSE; + $tSize=sizeOf($textSet); + for ($i=0; $i<$tSize; $i++) { + if (!$count) + $textSet[$i] = ""; + else + $textSet[$i] = substr_replace($textSet[$i],'', $offset, $count); + } + return TRUE; + } + + //----------------------------------------------------------------------------------------- + // XPath ------ Help Stuff ------ + //----------------------------------------------------------------------------------------- + + /** + * Parse the XML to a node-tree. A so called 'document' + * + * @param $xmlString (string) The string to turn into a document node. + * @return (&array) a node-tree + */ + function &_xml2Document($xmlString) { + $xmlOptions = array( + XML_OPTION_CASE_FOLDING => $this->getProperties('caseFolding'), + XML_OPTION_SKIP_WHITE => $this->getProperties('skipWhiteSpaces') + ); + $xmlParser =& new XPathEngine($xmlOptions); + $xmlParser->setVerbose($this->properties['verboseLevel']); + // Parse the XML string + if (!$xmlParser->importFromString($xmlString)) { + $this->_displayError($xmlParser->getLastError(), __LINE__, __FILE__, FALSE); + return FALSE; + } + return $xmlParser->getNode('/'); + } + + /** + * Get a reference-list to node text part(s) or node attribute(s). + * + * If the Xquery references an attribute(s) (Xquery ends with attribute::), + * then the text value of the node-attribute(s) is/are returned. + * Otherwise the Xquery is referencing to text part(s) of node(s). This can be either a + * direct reference to text part(s) (Xquery ends with text()[]) or indirect reference + * (a simple Xquery to node(s)). + * 1) Direct Reference (Xquery ends with text()[]): + * If the 'part-number' is omitted, the first text-part is assumed; starting by 1. + * Negative numbers are allowed, where -1 is the last text-part a.s.o. + * 2) Indirect Reference (a simple Xquery to node(s)): + * Default is to return the first text part(s). Optionally you may pass a parameter + * $textPartNr to define the text-part you want; starting by 1. + * Negative numbers are allowed, where -1 is the last text-part a.s.o. + * + * NOTE I : The returned vector is a set of references to the text parts / attributes. + * This is handy, if you wish to modify the contents. + * NOTE II: text-part numbers out of range will not be in the list + * NOTE III:Instead of an absolute xpath you may also pass a xpath-query. + * Depending on setModMatch() one, none or multiple nodes are affected. + * + * @param $xPathQuery (string) xpath to the node (See note above). + * @param $textPartNr (int) String containing the content to be set. + * @return (mixed) A vector of *references* to the text that match, or + * FALSE on error + * @see XPathEngine::wholeText() + */ + function _getTextSet($xPathQuery, $textPartNr=1) { + $ThisFunctionName = '_getTextSet'; + $bDebugThisFunction = in_array($ThisFunctionName, $this->aDebugFunctions); + $this->_beginDebugFunction($ThisFunctionName, $bDebugThisFunction); + if ($bDebugThisFunction) { + echo "Node: $xPathQuery\n"; + echo "Text Part Number: $textPartNr\n"; + echo "
      "; + } + + $status = FALSE; + $funcName = '_getTextSet'; + $textSet = array(); + + do { // try-block + // Check if it's a Xpath reference to an attribut(s). Xpath ends with attribute::) + if (preg_match(";(.*)/(attribute::|@)([^/]*)$;U", $xPathQuery, $matches)) { + $xPathQuery = $matches[1]; + $attribute = $matches[3]; + // Quick out + if (isSet($this->nodeIndex[$xPathQuery])) { + $xPathSet[] = $xPathQuery; + } else { + // Try to evaluate the absoluteXPath (since it seems to be an Xquery and not an abs. Xpath) + $xPathSet = $this->_resolveXPathQuery("$xPathQuery/attribute::$attribute", $funcName); + } + foreach($xPathSet as $absoluteXPath) { + preg_match(";(.*)/attribute::([^/]*)$;U", $xPathSet[0], $matches); + $absoluteXPath = $matches[1]; + $attribute = $matches[2]; + if (!isSet($this->nodeIndex[$absoluteXPath]['attributes'][$attribute])) { + $this->_displayError("The $absoluteXPath/attribute::$attribute value isn't a node in this document.", __LINE__, __FILE__, FALSE); + continue; + } + $textSet[] =& $this->nodes[$absoluteXPath]['attributes'][$attribute]; + } + $status = TRUE; + break; // try-block + } + + // Check if it's a Xpath reference direct to a text-part(s). (xpath ends with text()[]) + if (preg_match(":(.*)/text\(\)(\[(.*)\])?$:U", $xPathQuery, $matches)) { + $xPathQuery = $matches[1]; + // default to the first text node if a text node was not specified + $textPartNr = isSet($matches[2]) ? substr($matches[2],1,-1) : 1; + // Quick check + if (isSet($this->nodeIndex[$xPathQuery])) { + $xPathSet[] = $xPathQuery; + } else { + // Try to evaluate the absoluteXPath (since it seams to be an Xquery and not an abs. Xpath) + $xPathSet = $this->_resolveXPathQuery("$xPathQuery/text()[$textPartNr]", $funcName); + } + } + else { + // At this point we have been given an xpath with neither a 'text()' or 'attribute::' axis at the end + // So this means to get the text-part of the node. If parameter $textPartNr was not set, use the last + // text-part. + if (isSet($this->nodeIndex[$xPathQuery])) { + $xPathSet[] = $xPathQuery; + } else { + // Try to evaluate the absoluteXPath (since it seams to be an Xquery and not an abs. Xpath) + $xPathSet = $this->_resolveXPathQuery($xPathQuery, $funcName); + } + } + + if ($bDebugThisFunction) { + echo "Looking up paths for:\n"; + print_r($xPathSet); + } + + // Now fetch all text-parts that match. (May be 0,1 or many) + foreach($xPathSet as $absoluteXPath) { + unset($text); + if ($text =& $this->wholeText($absoluteXPath, $textPartNr)) { + $textSet[] =& $text; + } else { + // The node does not yet have any text, so we have to add a '' string so that + // if we insert or replace to it, then we'll actually have something to op on. + $this->nodeIndex[$absoluteXPath]['textParts'][$textPartNr-1] = ''; + $textSet[] =& $this->nodeIndex[$absoluteXPath]['textParts'][$textPartNr-1]; + } + } + + $status = TRUE; + } while (FALSE); // END try-block + + if (!$status) $result = FALSE; + else $result = $textSet; + + $this->_closeDebugFunction($ThisFunctionName, $result, $bDebugThisFunction); + + return $result; + } + + + /** + * Resolves an xPathQuery vector for a node op for modification + * + * It is possible to create a brand new object, and try to append and insert nodes + * into it, so this is a version of _resolveXPathQuery() that will autocreate the + * super root if it detects that it is not present and the $xPathQuery is empty. + * + * Also it demands that there be at least one node returned, and displays a suitable + * error message if the returned xPathSet does not contain any nodes. + * + * @param $xPathQuery (string) An xpath query targeting a single node. If empty() + * returns the root node and auto creates the root node + * if it doesn't exist. + * @param $function (string) The function in which this check was called + * @return (array) Vector of $absoluteXPath's (May be empty) + * @see _resolveXPathQuery() + */ + function _resolveXPathQueryForNodeMod($xPathQuery, $functionName) { + $xPathSet = array(); + if (empty($xPathQuery)) { + // You can append even if the root node doesn't exist. + if (!isset($this->nodeIndex[$xPathQuery])) $this->_createSuperRoot(); + $xPathSet[] = ''; + // However, you can only append to the super root, if there isn't already a root entry. + $rootNodes = $this->_resolveXPathQuery('/*','appendChild'); + if (count($rootNodes) !== 0) { + $this->_displayError(sprintf($this->errorStrings['RootNodeAlreadyExists']), __LINE__, __FILE__, FALSE); + return array(); + } + } else { + $xPathSet = $this->_resolveXPathQuery($xPathQuery,'appendChild'); + if (sizeOf($xPathSet) === 0) { + $this->_displayError(sprintf($this->errorStrings['NoNodeMatch'], $xPathQuery), __LINE__, __FILE__, FALSE); + return array(); + } + } + return $xPathSet; + } + + /** + * Resolves an xPathQuery vector depending on the property['modMatch'] + * + * To: + * - all matches, + * - the first + * - none (If the query matches more then one node.) + * see setModMatch() for details + * + * @param $xPathQuery (string) An xpath query targeting a single node. If empty() + * returns the root node (if it exists). + * @param $function (string) The function in which this check was called + * @return (array) Vector of $absoluteXPath's (May be empty) + * @see setModMatch() + */ + function _resolveXPathQuery($xPathQuery, $function) { + $xPathSet = array(); + do { // try-block + if (isSet($this->nodeIndex[$xPathQuery])) { + $xPathSet[] = $xPathQuery; + break; // try-block + } + if (empty($xPathQuery)) break; // try-block + if (substr($xPathQuery, -1) === '/') break; // If the xPathQuery ends with '/' then it cannot be a good query. + // If this xPathQuery is not absolute then attempt to evaluate it + $xPathSet = $this->match($xPathQuery); + + $resultSize = sizeOf($xPathSet); + switch($this->properties['modMatch']) { + case XPATH_QUERYHIT_UNIQUE : + if ($resultSize >1) { + $xPathSet = array(); + if ($this->properties['verboseLevel']) $this->_displayError("Canceled function '{$function}'. The query '{$xPathQuery}' mached {$resultSize} nodes and 'modMatch' is set to XPATH_QUERYHIT_UNIQUE.", __LINE__, __FILE__, FALSE); + } + break; + case XPATH_QUERYHIT_FIRST : + if ($resultSize >1) { + $xPathSet = array($xPathSet[0]); + if ($this->properties['verboseLevel']) $this->_displayError("Only modified first node in function '{$function}' because the query '{$xPathQuery}' mached {$resultSize} nodes and 'modMatch' is set to XPATH_QUERYHIT_FIRST.", __LINE__, __FILE__, FALSE); + } + break; + default: ; // DO NOTHING + } + } while (FALSE); + + if ($this->properties['verboseLevel'] >= 2) $this->_displayMessage("'{$xPathQuery}' parameter from '{$function}' returned the following nodes: ".(count($xPathSet)?implode('
      ', $xPathSet):'[none]'), __LINE__, __FILE__); + return $xPathSet; + } +} // END OF CLASS XPath + +// ----------------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------------------- + +/************************************************************************************************** +// Usage Sample: +// ------------- +// Following code will give you an idea how to work with PHP.XPath. It's a working sample +// to help you get started. :o) +// Take the comment tags away and run this file. +**************************************************************************************************/ + +/** + * Produces a short title line. + */ +function _title($title) { + echo "

      " . htmlspecialchars($title) . "
      \n"; +} + +$self = isSet($_SERVER) ? $_SERVER['PHP_SELF'] : $PHP_SELF; +if (basename($self) == 'XPath.class.php') { + // The sampe source: + $q = '?'; + $xmlSource = <<< EOD + <{$q}Process_Instruction test="© All right reserved" {$q}> + ,,1,, + ..1.. + + ..2.. + ..3.. ..4.. +EOD; + + // The sample code: + $xmlOptions = array(XML_OPTION_CASE_FOLDING => TRUE, XML_OPTION_SKIP_WHITE => TRUE); + $xPath =& new XPath(FALSE, $xmlOptions); + //$xPath->bDebugXmlParse = TRUE; + if (!$xPath->importFromString($xmlSource)) { echo $xPath->getLastError(); exit; } + + _title("Following was imported:"); + echo $xPath->exportAsHtml(); + + _title("Get some content"); + echo "Last text part in <AAA>: '" . $xPath->wholeText('/AAA[1]', -1) ."'
      \n"; + echo "All the text in <AAA>: '" . $xPath->wholeText('/AAA[1]') ."'
      \n"; + echo "The attibute value in <BBB> using getAttributes('/AAA[1]/BBB[1]', 'FOO'): '" . $xPath->getAttributes('/AAA[1]', 'FOO') ."'
      \n"; + echo "The attibute value in <BBB> using getData('/AAA[1]/@FOO'): '" . $xPath->getData('/AAA[1]/@FOO') ."'
      \n"; + + _title("Append some additional XML below /AAA/BBB:"); + $xPath->appendChild('/AAA[1]/BBB[1]', ' Step 1. Append new node ', $afterText=FALSE); + $xPath->appendChild('/AAA[1]/BBB[1]', ' Step 2. Append new node ', $afterText=TRUE); + $xPath->appendChild('/AAA[1]/BBB[1]', ' Step 3. Append new node ', $afterText=TRUE); + echo $xPath->exportAsHtml(); + + _title("Insert some additional XML below :"); + $xPath->reindexNodeTree(); + $xPath->insertChild('/AAA[1]/BBB[1]', ' Step 1. Insert new node ', $shiftRight=TRUE, $afterText=TRUE); + $xPath->insertChild('/AAA[1]/BBB[1]', ' Step 2. Insert new node ', $shiftRight=FALSE, $afterText=TRUE); + $xPath->insertChild('/AAA[1]/BBB[1]', ' Step 3. Insert new node ', $shiftRight=FALSE, $afterText=FALSE); + echo $xPath->exportAsHtml(); + + _title("Replace the last node with new XML data '<DDD> Replaced last BB </DDD>':"); + $xPath->reindexNodeTree(); + $xPath->replaceChild('/AAA[1]/BB[last()]', ' Replaced last BB ', $afterText=FALSE); + echo $xPath->exportAsHtml(); + + _title("Replace second node with normal text"); + $xPath->reindexNodeTree(); + $xPath->replaceChildByData('/AAA[1]/BB[2]', '"Some new text"'); + echo $xPath->exportAsHtml(); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/System/includes/class.Template.inc.php b/oss/vtiger/trunk/modules/System/includes/class.Template.inc.php new file mode 100644 index 00000000..6c7652d1 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/class.Template.inc.php @@ -0,0 +1,449 @@ + remove undefined variables + * 'comment' => replace undefined variables with comments + * 'keep' => keep undefined variables + */ + var $unknowns = 'remove'; + + /* 'yes' => halt, 'report' => report error, continue, 'no' => ignore error quietly */ + var $halt_on_error = 'yes'; + + /* last error message is retained here */ + var $last_error = ''; + + /***************************************************************************/ + /* public: Constructor. + * root: template directory. + * unknowns: how to handle unknown variables. + */ + function Template($root = '.', $unknowns = 'remove') + { + $this->set_root($root); + $this->set_unknowns($unknowns); + } + + /* public: setroot(pathname $root) + * root: new template directory. + */ + function set_root($root) + { + if (!is_dir($root)) + { + $this->halt("set_root: $root is not a directory."); + return false; + } + $this->root = $root; + return true; + } + + /* public: set_unknowns(enum $unknowns) + * unknowns: 'remove', 'comment', 'keep' + * + */ + function set_unknowns($unknowns = 'keep') + { + $this->unknowns = $unknowns; + } + + /* public: set_file(array $filelist) + * filelist: array of handle, filename pairs. + * + * public: set_file(string $handle, string $filename) + * handle: handle for a filename, + * filename: name of template file + */ + function set_file($handle, $filename = '') + { + if (!is_array($handle)) + { + if ($filename == '') + { + $this->halt("set_file: For handle $handle filename is empty."); + return false; + } + $this->file[$handle] = $this->filename($filename); + } + else + { + reset($handle); + while(list($h, $f) = each($handle)) + { + $this->file[$h] = $this->filename($f); + } + } + } + + /* public: set_block(string $parent, string $handle, string $name = '') + * extract the template $handle from $parent, + * place variable {$name} instead. + */ + function set_block($parent, $handle, $name = '') + { + if (!$this->loadfile($parent)) + { + $this->halt("subst: unable to load $parent."); + return false; + } + if ($name == '') + { + $name = $handle; + } + $str = $this->get_var($parent); + $reg = "/(.*)\n\s*/sm"; + preg_match_all($reg, $str, $m); + $str = preg_replace($reg, '{' . "$name}", $str); + $this->set_var($handle, $m[1][0]); + $this->set_var($parent, $str); + } + + /* public: set_var(array $values) + * values: array of variable name, value pairs. + * + * public: set_var(string $varname, string $value) + * varname: name of a variable that is to be defined + * value: value of that variable + */ + function set_var($varname, $value = '') + { + if (!is_array($varname)) + { + if (!empty($varname)) + { + if ($this->debug) + { + print "scalar: set *$varname* to *$value*
      \n"; + } + $this->varkeys[$varname] = $this->varname($varname); + $this->varvals[$varname] = str_replace('phpGroupWare','eGroupWare',$value); + } + } + else + { + reset($varname); + while(list($k, $v) = each($varname)) + { + if (!empty($k)) + { + if ($this->debug) + { + print "array: set *$k* to *$v*
      \n"; + } + $this->varkeys[$k] = $this->varname($k); + $this->varvals[$k] = str_replace('phpGroupWare','eGroupWare',$v); + } + } + } + } + + /* public: subst(string $handle) + * handle: handle of template where variables are to be substituted. + */ + function subst($handle) + { + if (!$this->loadfile($handle)) + { + $this->halt("subst: unable to load $handle."); + return false; + } + + $str = $this->get_var($handle); + reset($this->varkeys); + while (list($k, $v) = each($this->varkeys)) + { + $str = str_replace($v, $this->varvals[$k], $str); + } + return $str; + } + + /* public: psubst(string $handle) + * handle: handle of template where variables are to be substituted. + */ + function psubst($handle) + { + print $this->subst($handle); + return false; + } + + /* public: parse(string $target, string $handle, boolean append) + * public: parse(string $target, array $handle, boolean append) + * target: handle of variable to generate + * handle: handle of template to substitute + * append: append to target handle + */ + function parse($target, $handle, $append = false) + { + if (!is_array($handle)) + { + $str = $this->subst($handle); + if ($append) + { + $this->set_var($target, $this->get_var($target) . $str); + } + else + { + $this->set_var($target, $str); + } + } + else + { + reset($handle); + while(list($i, $h) = each($handle)) + { + $str = $this->subst($h); + $this->set_var($target, $str); + } + } + return $str; + } + + function pparse($target, $handle, $append = false) + { + print $this->parse($target, $handle, $append); + return false; + } + + /* This is short for finish parse */ + function fp($target, $handle, $append = False) + { + return $this->finish($this->parse($target, $handle, $append)); + } + + /* This is a short cut for print finish parse */ + function pfp($target, $handle, $append = False) + { + echo $this->finish($this->parse($target, $handle, $append)); + } + + /* public: get_vars() + */ + function get_vars() + { + reset($this->varkeys); + while(list($k, $v) = each($this->varkeys)) + { + $result[$k] = $this->varvals[$k]; + } + return $result; + } + + /* public: get_var(string varname) + * varname: name of variable. + * + * public: get_var(array varname) + * varname: array of variable names + */ + function get_var($varname) + { + if (!is_array($varname)) + { + return $this->varvals[$varname]; + } + else + { + reset($varname); + while(list($k, $v) = each($varname)) + { + $result[$k] = $this->varvals[$k]; + } + return $result; + } + } + + /* public: get_undefined($handle) + * handle: handle of a template. + */ + function get_undefined($handle) + { + if (!$this->loadfile($handle)) + { + $this->halt("get_undefined: unable to load $handle."); + return false; + } + + preg_match_all("/\{([^}]+)\}/", $this->get_var($handle), $m); + $m = $m[1]; + if (!is_array($m)) + { + return false; + } + reset($m); + while(list($k, $v) = each($m)) + { + if (!isset($this->varkeys[$v])) + { + $result[$v] = $v; + } + } + + if (count($result)) + { + return $result; + } + else + { + return false; + } + } + + /* public: finish(string $str) + * str: string to finish. + */ + function finish($str) + { + switch ($this->unknowns) + { + case 'keep': + break; + case 'remove': + $str = preg_replace('/{[^ \t\r\n}]+}/', '', $str); + break; + case 'comment': + $str = preg_replace('/{([^ \t\r\n}]+)}/', "", $str); + break; + } + + return $str; + } + + /* public: p(string $varname) + * varname: name of variable to print. + */ + function p($varname) + { + print $this->finish($this->get_var($varname)); + } + + function get($varname) + { + return $this->finish($this->get_var($varname)); + } + + /***************************************************************************/ + /* private: filename($filename) + * filename: name to be completed. + */ + function filename($filename,$root='',$time=1) + { + if($root=='') + { + $root=$this->root; + } + if (substr($filename, 0, 1) != '/') + { + $new_filename = $root.'/'.$filename; + } + else + { + $new_filename = $filename; + } + + if (!file_exists($new_filename)) + { + if($time==2) + { + $this->halt("filename: file $new_filename does not exist."); + } + else + { + $new_root = str_replace($GLOBALS['egw_info']['server']['template_set'],'default',$root); + $new_filename = $this->filename(str_replace($root.'/','',$new_filename),$new_root,2); + } + } + return $new_filename; + } + + /* private: varname($varname) + * varname: name of a replacement variable to be protected. + */ + function varname($varname) + { + return '{'.$varname.'}'; + } + + /* private: loadfile(string $handle) + * handle: load file defined by handle, if it is not loaded yet. + */ + function loadfile($handle) + { + if (isset($this->varkeys[$handle]) and !empty($this->varvals[$handle])) + { + return true; + } + if (!isset($this->file[$handle])) + { + $this->halt("loadfile: $handle is not a valid handle."); + return false; + } + $filename = $this->file[$handle]; + + $str = implode('', @file($filename)); + if (empty($str)) + { + $this->halt("loadfile: While loading $handle, $filename does not exist or is empty."); + return false; + } + + $this->set_var($handle, $str); + return true; + } + + /***************************************************************************/ + /* public: halt(string $msg) + * msg: error message to show. + */ + function halt($msg) + { + $this->last_error = $msg; + + if ($this->halt_on_error != 'no') + { + $this->haltmsg($msg); + } + + if ($this->halt_on_error == 'yes') + { + echo('Halted.'); + } + + exit; + } + + /* public, override: haltmsg($msg) + * msg: error message to show. + */ + function haltmsg($msg) + { + printf("Template Error: %s
      \n", $msg); + } + } diff --git a/oss/vtiger/trunk/modules/System/includes/class.error.inc.php b/oss/vtiger/trunk/modules/System/includes/class.error.inc.php new file mode 100644 index 00000000..5e8175b7 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/class.error.inc.php @@ -0,0 +1,107 @@ +arrErrorList[$this->errors]['command'] = $strCommand; + $this->arrErrorList[$this->errors]['message'] = $strMessage; + $this->arrErrorList[$this->errors]['line'] = $intLine; + $this->arrErrorList[$this->errors]['file'] = basename( $strFile ); + $this->errors++; + } + + /** + * + * ErrorsAsHTML() + * + * @param - + * + * @return string string which contains a HTML table which can be used to echo out the errors + * + **/ + function ErrorsAsHTML() { + $strHTMLString = ""; + $strWARNString = ""; + $strHTMLhead = "\n" + . " \n" + . " \n" + . " \n" + . " \n" + . " \n" + . " \n"; + $strHTMLfoot = "
      FileLineCommandMessage
      "; + + if( $this->errors > 0 ) { + foreach( $this->arrErrorList as $arrLine ) { + if( $arrLine['command'] == "WARN" ) { + $strWARNString .= "WARNING: " . htmlspecialchars( $arrLine['message'] ) . "
      \n"; + } else { + $strHTMLString .= " \n" + . " " . htmlspecialchars( $arrLine['file'] ) . "\n" + . " " . $arrLine['line'] . "\n" + . " " . htmlspecialchars( $arrLine['command'] ) . "\n" + . " " . htmlspecialchars( $arrLine['message'] ) . "\n" + . " \n"; + } + } + } + + if( !empty( $strHTMLString ) ) { + $strHTMLString = $strWARNString . $strHTMLhead . $strHTMLString . $strHTMLfoot; + } else { + $strHTMLString = $strWARNString; + } + + return $strHTMLString; + } + + /** + * + * ErrorsExist() + * + * @param - + * + * @return true there are errors logged + * false no errors logged + * + **/ + function ErrorsExist() { + if( $this->errors > 0 ) { + return true; + } else { + return false; + } + } +} +?> diff --git a/oss/vtiger/trunk/modules/System/includes/common_functions.php b/oss/vtiger/trunk/modules/System/includes/common_functions.php new file mode 100644 index 00000000..50412f90 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/common_functions.php @@ -0,0 +1,350 @@ +\n\n"; +} +// usefull during development +error_reporting(E_ALL | E_NOTICE); +// print out the bar graph +// $value as full percentages +// $maximim as current maximum +// $b as scale factor +// $type as filesystem type +function create_bargraph ($value, $maximum, $b, $type = "") +{ + global $webpath; + + $textdir = direction(); + + $imgpath = 'modules/System/templates/' . TEMPLATE_SET . '/images/'; + $maximum == 0 ? $barwidth = 0 : $barwidth = round((100 / $maximum) * $value) * $b; + $red = 90 * $b; + $yellow = 75 * $b; + + if (!file_exists("/modules/System/templates/" . TEMPLATE_SET . "/images/nobar_left.gif")) { + if ($barwidth == 0) { + return '' + . '' + . ''; + } elseif (file_exists("/modules/System/templates/" . TEMPLATE_SET . "/images/yellowbar_left.gif") && $barwidth > $yellow && $barwidth < $red) { + return '' + . '' + . ''; + } elseif (($barwidth < $red) || ($type == "iso9660") || ($type == "CDFS")) { + return '' + . '' + . ''; + } else { + return '' + . '' + . ''; + } + } else { + if ($barwidth == 0) { + return '' + . '' + . ''; + } elseif (file_exists("/modules/System/templates/" . TEMPLATE_SET . "/images/yellowbar_left.gif") && $barwidth > $yellow && $barwidth < $red) { + return '' + . '' + . '' + . ''; + } elseif (($barwidth < $red) || $type == "iso9660" || ($type == "CDFS")) { + return '' + . '' + . '' + . ''; + } elseif ($barwidth == (100 * $b)) { + return '' + . '' + . ''; + } else { + return '' + . '' + . '' + . ''; + } + } +} + +function create_bargraph_grad( $value, $maximum, $b, $type = "" ) { + global $webpath; + + $maximum == 0 ? $barwidth = 0 : $barwidth = round((100 / $maximum) * $value); + $startColor = '0ef424'; // green + $endColor = 'ee200a'; // red + if ($barwidth > 100) { + $barwidth = 0; + } + + return ''; +} + +function direction() { + global $text_dir; + + if(!isset($text_dir) || $text_dir == "ltr") { + $result['direction'] = "ltr"; + $result['left'] = "left"; + $result['right'] = "right"; + } else { + $result['direction'] = "rtl"; + $result['left'] = "right"; + $result['right'] = "left"; + } + + return $result; +} + +// Find a system program. Do path checking +function find_program ($program) +{ + global $addpaths; + + $path = array('/bin', '/sbin', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin'); + + if( isset($addpaths) && is_array($addpaths) ) { + $path = array_merge( $path, $addpaths ); + } + + if (function_exists("is_executable")) { + while ($this_path = current($path)) { + if (is_executable("$this_path/$program")) { + return "$this_path/$program"; + } + next($path); + } + } else { + return strpos($program, '.exe'); + } ; + + return; +} +// Execute a system program. return a trim()'d result. +// does very crude pipe checking. you need ' | ' for it to work +// ie $program = execute_program('netstat', '-anp | grep LIST'); +// NOT $program = execute_program('netstat', '-anp|grep LIST'); +function execute_program ($programname, $args = '', $booErrorRep = true ) +{ + global $error; + $buffer = ''; + $program = find_program($programname); + + if (!$program) { + if( $booErrorRep ) { + $error->addError( 'find_program(' . $programname . ')', 'program not found on the machine', __LINE__, __FILE__); + } + return; + } + + // see if we've gotten a |, if we have we need to do patch checking on the cmd + if ($args) { + $args_list = split(' ', $args); + for ($i = 0; $i < count($args_list); $i++) { + if ($args_list[$i] == '|') { + $cmd = $args_list[$i + 1]; + $new_cmd = find_program($cmd); + $args = ereg_replace("\| $cmd", "| $new_cmd", $args); + } + } + } + // we've finally got a good cmd line.. execute it + if ($fp = popen("($program $args > /dev/null) 3>&1 1>&2 2>&3", 'r')) { + while (!feof($fp)) { + $buffer .= fgets($fp, 4096); + } + pclose($fp); + $buffer = trim($buffer); + if (!empty($buffer)) { + if( $booErrorRep ) { + $error->addError( $program, $buffer, __LINE__, __FILE__); + } + } + } + if ($fp = popen("$program $args", 'r')) { + $buffer = ""; + while (!feof($fp)) { + $buffer .= fgets($fp, 4096); + } + pclose($fp); + } + $buffer = trim($buffer); + return $buffer; +} + +// A helper function, when passed a number representing KB, +// and optionally the number of decimal places required, +// it returns a formated number string, with unit identifier. +function format_bytesize ($kbytes, $dec_places = 2) +{ + global $text; + $spacer = ' '; + if ($kbytes > 1048576) { + $result = sprintf('%.' . $dec_places . 'f', $kbytes / 1048576); + $result .= $spacer . $text['gb']; + } elseif ($kbytes > 1024) { + $result = sprintf('%.' . $dec_places . 'f', $kbytes / 1024); + $result .= $spacer . $text['mb']; + } else { + $result = sprintf('%.' . $dec_places . 'f', $kbytes); + $result .= $spacer . $text['kb']; + } + return $result; +} + +function get_gif_image_height($image) +{ + // gives the height of the given GIF image, by reading it's LSD (Logical Screen Discriptor) + // by Edwin Meester aka MillenniumV3 + // Header: 3bytes Discription + // 3bytes Version + // LSD: 2bytes Logical Screen Width + // 2bytes Logical Screen Height + // 1bit Global Color Table Flag + // 3bits Color Resolution + // 1bit Sort Flag + // 3bits Size of Global Color Table + // 1byte Background Color Index + // 1byte Pixel Aspect Ratio + // Open Image + $fp = fopen($image, 'rb'); + // read Header + LSD + $header_and_lsd = fread($fp, 13); + fclose($fp); + // calc Height from Logical Screen Height bytes + $result = ord($header_and_lsd{8}) + ord($header_and_lsd{9}) * 255; + return $result; +} + +// Check if a string exist in the global $hide_mounts. +// Return true if this is the case. +function hide_mount($mount) { + global $hide_mounts; + if (isset($hide_mounts) && is_array($hide_mounts) && in_array($mount, $hide_mounts)) { + return true; + } + else { + return false; + } +} + +function uptime($timestamp) { + global $text; + $uptime = ''; + + $min = $timestamp / 60; + $hours = $min / 60; + $days = floor($hours / 24); + $hours = floor($hours - ($days * 24)); + $min = floor($min - ($days * 60 * 24) - ($hours * 60)); + + if ($days != 0) { + $uptime .= $days. " " . $text['days'] . " "; + } + + if ($hours != 0) { + $uptime .= $hours . " " . $text['hours'] . " "; + } + + $uptime .= $min . " " . $text['minutes']; + return $uptime; +} + +//Replace some chars which are not valid in xml with iso-8859-1 encoding +function replace_specialchars(&$xmlstring) { + $xmlstring = str_replace( chr(174), "(R)", $xmlstring ); + $xmlstring = str_replace( chr(169), "(C)", $xmlstring ); +} + +// find duplicate entrys and count them, show this value befor the duplicated name +function finddups( $arrInput ) { + $result = array(); + //Pinaki: Fix for ticket #4462 + if($arrInput!=null) + { + $buffer = array_count_values($arrInput); + foreach ($buffer as $key => $value) { + if( $value > 1 ) { + $result[] = "(" . $value . "x) " . $key; + } else { + $result[] = $key; + } + } + } + return $result; +} + +function rfts( $strFileName, $intLines = 0, $intBytes = 4096, $booErrorRep = true ) { + global $error; + $strFile = ""; + $intCurLine = 1; + + if( file_exists( $strFileName ) ) { + if( $fd = fopen( $strFileName, 'r' ) ) { + while( !feof( $fd ) ) { + $strFile .= fgets( $fd, $intBytes ); + if( $intLines <= $intCurLine && $intLines != 0 ) { + break; + } else { + $intCurLine++; + } + } + fclose( $fd ); + } else { + if( $booErrorRep ) { + $error->addError( 'fopen(' . $strFileName . ')', 'file can not read by phpsysinfo', __LINE__, __FILE__ ); + } + return "ERROR"; + } + } else { + if( $booErrorRep ) { + $error->addError( 'file_exists(' . $strFileName . ')', 'the file does not exist on your machine', __LINE__, __FILE__ ); + } + return "ERROR"; + } + + return $strFile; +} + +function gdc( $strPath, $booErrorRep = true ) { + global $error; + $arrDirectoryContent = array(); + + if( is_dir( $strPath ) ) { + if( $handle = opendir( $strPath ) ) { + while( ( $strFile = readdir( $handle ) ) !== false ) { + if( $strFile != "." && $strFile != ".." && $strFile != "CVS" ) { + $arrDirectoryContent[] = $strFile; + } + } + closedir( $handle ); + } else { + if( $booErrorRep ) { + $error->addError( 'opendir(' . $strPath . ')', 'directory can not be read by phpsysinfo', __LINE__, __FILE__ ); + } + } + } else { + if( $booErrorRep ) { + $error->addError( 'is_dir(' . $strPath . ')', 'directory does not exist on your machine', __LINE__, __FILE__ ); + } + } + + return $arrDirectoryContent; +} +?> diff --git a/oss/vtiger/trunk/modules/System/includes/lang/ar_utf8.php b/oss/vtiger/trunk/modules/System/includes/lang/ar_utf8.php new file mode 100644 index 00000000..ee5ebb3f --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/ar_utf8.php @@ -0,0 +1,110 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/bg.php b/oss/vtiger/trunk/modules/System/includes/lang/bg.php new file mode 100644 index 00000000..be43bfea --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/bg.php @@ -0,0 +1,108 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/big5.php b/oss/vtiger/trunk/modules/System/includes/lang/big5.php new file mode 100644 index 00000000..6ae8607e --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/big5.php @@ -0,0 +1,107 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/br.php b/oss/vtiger/trunk/modules/System/includes/lang/br.php new file mode 100644 index 00000000..ab186f6b --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/br.php @@ -0,0 +1,105 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/ca.php b/oss/vtiger/trunk/modules/System/includes/lang/ca.php new file mode 100644 index 00000000..b2b1267e --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/ca.php @@ -0,0 +1,107 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/cn.php b/oss/vtiger/trunk/modules/System/includes/lang/cn.php new file mode 100644 index 00000000..26453a87 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/cn.php @@ -0,0 +1,105 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/cs.php b/oss/vtiger/trunk/modules/System/includes/lang/cs.php new file mode 100644 index 00000000..634c74df --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/cs.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/ct.php b/oss/vtiger/trunk/modules/System/includes/lang/ct.php new file mode 100644 index 00000000..5cae788c --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/ct.php @@ -0,0 +1,103 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/da.php b/oss/vtiger/trunk/modules/System/includes/lang/da.php new file mode 100644 index 00000000..ab6786d4 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/da.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/de.php b/oss/vtiger/trunk/modules/System/includes/lang/de.php new file mode 100644 index 00000000..65be011c --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/de.php @@ -0,0 +1,104 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/en.php b/oss/vtiger/trunk/modules/System/includes/lang/en.php new file mode 100644 index 00000000..4735269c --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/en.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/es.php b/oss/vtiger/trunk/modules/System/includes/lang/es.php new file mode 100644 index 00000000..0bb4e943 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/es.php @@ -0,0 +1,104 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/et.php b/oss/vtiger/trunk/modules/System/includes/lang/et.php new file mode 100644 index 00000000..e491d9a3 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/et.php @@ -0,0 +1,104 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/eu.php b/oss/vtiger/trunk/modules/System/includes/lang/eu.php new file mode 100644 index 00000000..e7680ef5 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/eu.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/fi.php b/oss/vtiger/trunk/modules/System/includes/lang/fi.php new file mode 100644 index 00000000..2544ecc4 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/fi.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/fr.php b/oss/vtiger/trunk/modules/System/includes/lang/fr.php new file mode 100644 index 00000000..01ccf9b4 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/fr.php @@ -0,0 +1,102 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/gr.php b/oss/vtiger/trunk/modules/System/includes/lang/gr.php new file mode 100644 index 00000000..ecb9ea8f --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/gr.php @@ -0,0 +1,108 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/he.php b/oss/vtiger/trunk/modules/System/includes/lang/he.php new file mode 100644 index 00000000..fd52cc58 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/he.php @@ -0,0 +1,107 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/hu.php b/oss/vtiger/trunk/modules/System/includes/lang/hu.php new file mode 100644 index 00000000..5cb501fc --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/hu.php @@ -0,0 +1,108 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/id.php b/oss/vtiger/trunk/modules/System/includes/lang/id.php new file mode 100644 index 00000000..23f8da18 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/id.php @@ -0,0 +1,107 @@ + + +$text['title'] = 'Informasi Sistem'; + +$text['vitals'] = 'Informasi Utama'; +$text['hostname'] = 'Hostname Resmi'; +$text['ip'] = 'IP Penerima'; +$text['kversion'] = 'Versi Kernel'; +$text['dversion'] = 'Distro Name'; +$text['uptime'] = 'Aktif Selama'; +$text['users'] = 'Pengguna Saat Ini'; +$text['loadavg'] = 'Beban Rata-rata'; + +$text['hardware'] = 'Informasi Perangkat Keras'; +$text['numcpu'] = 'Prosesor'; +$text['cpumodel'] = 'Model'; +$text['cpuspeed'] = 'CPU Speed'; +$text['busspeed'] = 'BUS Speed'; +$text['cache'] = 'Ukuran Cache'; +$text['bogomips'] = 'Sistem Bogomips'; + +$text['pci'] = 'Perangkat PCI'; +$text['ide'] = 'Perangkat IDE'; +$text['scsi'] = 'Perangkat SCSI'; +$text['usb'] = 'Perangkat USB'; + +$text['netusage'] = 'Status Penggunaan Jaringan'; +$text['device'] = 'Perangkat'; +$text['received'] = 'Diterima'; +$text['sent'] = 'Dikirim'; +$text['errors'] = 'Rusak/Drop'; + +$text['connections'] = 'Koneksi Jaringan Aktif'; + +$text['memusage'] = 'Status Penggunaan Memori'; +$text['phymem'] = 'Memori Fisik'; +$text['swap'] = 'Swap HardDisk'; + +$text['fs'] = 'Status Penggunaan Media Penyimpanan dan Filesystem'; +$text['mount'] = 'Titik Mount'; +$text['partition'] = 'Partisi'; + +$text['percent'] = 'Digunakan (Persen)'; +$text['type'] = 'Tipe'; +$text['free'] = 'Bebas'; +$text['used'] = 'Digunakan'; +$text['size'] = 'Ukuran'; +$text['totals'] = 'Total'; + +$text['kb'] = 'KB'; +$text['mb'] = 'MB'; +$text['gb'] = 'GB'; + +$text['none'] = 'tidak ditemukan'; + +$text['capacity'] = 'Kapasitas'; + +$text['template'] = 'Template'; +$text['language'] = 'Bahasa'; +$text['submit'] = 'Gunakan'; +$text['created'] = 'Dibangun menggunakan'; +$text['locale'] = 'en_US'; +$text['gen_time'] = 'on %b %d, %Y at %I:%M %p'; + +$text['days'] = 'hari'; +$text['hours'] = 'jam'; +$text['minutes'] = 'menit'; + +$text['temperature'] = 'Temperature'; +$text['voltage'] = 'Voltage'; +$text['fans'] = 'Fans'; +$text['s_value'] = 'Value'; +$text['s_min'] = 'Min'; +$text['s_max'] = 'Max'; +$text['s_div'] = 'Div'; +$text['hysteresis'] = 'Hysteresis'; +$text['s_limit'] = 'Limit'; +$text['s_label'] = 'Label'; +$text['degree_mark'] = 'ºC'; +$text['voltage_mark'] = 'V'; +$text['rpm_mark'] = 'RPM'; + +$text['app'] = 'Kernel + applications'; +$text['buffers'] = 'Buffers'; +$text['cached'] = 'Cached'; + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/lang/index.html b/oss/vtiger/trunk/modules/System/includes/lang/index.html new file mode 100644 index 00000000..e69de29b diff --git a/oss/vtiger/trunk/modules/System/includes/lang/is.php b/oss/vtiger/trunk/modules/System/includes/lang/is.php new file mode 100644 index 00000000..b3eb8fa6 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/is.php @@ -0,0 +1,104 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/it.php b/oss/vtiger/trunk/modules/System/includes/lang/it.php new file mode 100644 index 00000000..37c2ccc4 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/it.php @@ -0,0 +1,104 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/ja.php b/oss/vtiger/trunk/modules/System/includes/lang/ja.php new file mode 100644 index 00000000..ed1055e8 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/ja.php @@ -0,0 +1,3 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/jp.php b/oss/vtiger/trunk/modules/System/includes/lang/jp.php new file mode 100644 index 00000000..da282ad9 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/jp.php @@ -0,0 +1,105 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/ko.php b/oss/vtiger/trunk/modules/System/includes/lang/ko.php new file mode 100644 index 00000000..3f2720d6 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/ko.php @@ -0,0 +1,107 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/lt.php b/oss/vtiger/trunk/modules/System/includes/lang/lt.php new file mode 100644 index 00000000..66840461 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/lt.php @@ -0,0 +1,109 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/lv.php b/oss/vtiger/trunk/modules/System/includes/lang/lv.php new file mode 100644 index 00000000..896ef451 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/lv.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/nl.php b/oss/vtiger/trunk/modules/System/includes/lang/nl.php new file mode 100644 index 00000000..7e19a2ee --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/nl.php @@ -0,0 +1,110 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/no.php b/oss/vtiger/trunk/modules/System/includes/lang/no.php new file mode 100644 index 00000000..0fbb10cb --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/no.php @@ -0,0 +1,104 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/pl.php b/oss/vtiger/trunk/modules/System/includes/lang/pl.php new file mode 100644 index 00000000..70a8a171 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/pl.php @@ -0,0 +1,107 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/pt-br.php b/oss/vtiger/trunk/modules/System/includes/lang/pt-br.php new file mode 100644 index 00000000..d3fc490b --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/pt-br.php @@ -0,0 +1,110 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/pt.php b/oss/vtiger/trunk/modules/System/includes/lang/pt.php new file mode 100644 index 00000000..14d19364 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/pt.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/ro.php b/oss/vtiger/trunk/modules/System/includes/lang/ro.php new file mode 100644 index 00000000..d01863af --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/ro.php @@ -0,0 +1,105 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/ru.php b/oss/vtiger/trunk/modules/System/includes/lang/ru.php new file mode 100644 index 00000000..e67dea6f --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/ru.php @@ -0,0 +1,108 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/sk.php b/oss/vtiger/trunk/modules/System/includes/lang/sk.php new file mode 100644 index 00000000..4658434d --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/sk.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/sv.php b/oss/vtiger/trunk/modules/System/includes/lang/sv.php new file mode 100644 index 00000000..250c5b69 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/sv.php @@ -0,0 +1,107 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/tr.php b/oss/vtiger/trunk/modules/System/includes/lang/tr.php new file mode 100644 index 00000000..5421c772 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/tr.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/lang/tw.php b/oss/vtiger/trunk/modules/System/includes/lang/tw.php new file mode 100644 index 00000000..0a50ba6f --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/lang/tw.php @@ -0,0 +1,106 @@ + diff --git a/oss/vtiger/trunk/modules/System/includes/mb/class.healthd.inc.php b/oss/vtiger/trunk/modules/System/includes/mb/class.healthd.inc.php new file mode 100644 index 00000000..8e7ef730 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/mb/class.healthd.inc.php @@ -0,0 +1,119 @@ +lines)) { + $this->lines = execute_program('healthdc', '-t'); + } + + $ar_buf = preg_split("/\t+/", $this->lines); + + $results[0]['label'] = 'temp1'; + $results[0]['value'] = $ar_buf[1]; + $results[0]['limit'] = '70.0'; + $results[0]['percent'] = $results[0]['value'] * 100 / $results[0]['limit']; + $results[1]['label'] = 'temp2'; + $results[1]['value'] = $ar_buf[2]; + $results[1]['limit'] = '70.0'; + $results[1]['percent'] = $results[1]['value'] * 100 / $results[1]['limit']; + $results[2]['label'] = 'temp3'; + $results[2]['value'] = $ar_buf[3]; + $results[2]['limit'] = '70.0'; + $results[2]['percent'] = $results[2]['value'] * 100 / $results[2]['limit']; + return $results; + } + + function fans() { + $ar_buf = array(); + $results = array(); + + if (!isset($this->lines)) { + $this->lines = execute_program('healthdc', '-t'); + } + + $ar_buf = preg_split("/\t+/", $this->lines); + + $results[0]['label'] = 'fan1'; + $results[0]['value'] = $ar_buf[4]; + $results[0]['min'] = '3000'; + $results[0]['div'] = '2'; + $results[1]['label'] = 'fan2'; + $results[1]['value'] = $ar_buf[5]; + $results[1]['min'] = '3000'; + $results[1]['div'] = '2'; + $results[2]['label'] = 'fan3'; + $results[2]['value'] = $ar_buf[6]; + $results[2]['min'] = '3000'; + $results[2]['div'] = '2'; + + return $results; + } + + function voltage() { + $ar_buf = array(); + $results = array(); + + if (!isset($this->lines)) { + $this->lines = execute_program('healthdc', '-t'); + } + + $ar_buf = preg_split("/\t+/", $this->lines); + + $results[0]['label'] = 'Vcore1'; + $results[0]['value'] = $ar_buf[7]; + $results[0]['min'] = '0.00'; + $results[0]['max'] = '0.00'; + $results[1]['label'] = 'Vcore2'; + $results[1]['value'] = $ar_buf[8]; + $results[1]['min'] = '0.00'; + $results[1]['max'] = '0.00'; + $results[2]['label'] = '3volt'; + $results[2]['value'] = $ar_buf[9]; + $results[2]['min'] = '0.00'; + $results[2]['max'] = '0.00'; + $results[3]['label'] = '+5Volt'; + $results[3]['value'] = $ar_buf[10]; + $results[3]['min'] = '0.00'; + $results[3]['max'] = '0.00'; + $results[4]['label'] = '+12Volt'; + $results[4]['value'] = $ar_buf[11]; + $results[4]['min'] = '0.00'; + $results[4]['max'] = '0.00'; + $results[5]['label'] = '-12Volt'; + $results[5]['value'] = $ar_buf[12]; + $results[5]['min'] = '0.00'; + $results[5]['max'] = '0.00'; + $results[6]['label'] = '-5Volt'; + $results[6]['value'] = $ar_buf[13]; + $results[6]['min'] = '0.00'; + $results[6]['max'] = '0.00'; + + return $results; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/mb/class.hwsensors.inc.php b/oss/vtiger/trunk/modules/System/includes/mb/class.hwsensors.inc.php new file mode 100644 index 00000000..4205c9e9 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/mb/class.hwsensors.inc.php @@ -0,0 +1,102 @@ +lines) ) { + $this->lines = execute_program('sysctl', '-w hw.sensors'); + } + + $lines = explode("\n", $this->lines); + + for ($i = 0, $j = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/[\s,]+/", $lines[$i]); + + if ($ar_buf[2] == 'temp') { + $results[$j]['label'] = $ar_buf[1]; + $results[$j]['value'] = $ar_buf[3]; + $results[$j]['limit'] = '70.0'; + $results[$j]['percent'] = $results[$j]['value'] * 100 / $results[$j]['limit']; + $j++; + } + } + + return $results; + } + + function fans() { + $ar_buf = array(); + $lines = array(); + $results = array(); + + if (!isset($this->lines) ) { + $this->lines = execute_program('sysctl', '-w hw.sensors'); + } + + $lines = explode("\n", $this->lines); + + for ($i = 0, $j = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/[\s,]+/", $lines[$i]); + + if ($ar_buf[2] == 'fanrpm') { + $results[$j]['label'] = $ar_buf[1]; + $results[$j]['value'] = $ar_buf[3]; + $j++; + } + } + + return $results; + } + + function voltage() { + $ar_buf = array(); + $lines = array(); + $results = array(); + + if (!isset($this->lines) ) { + $this->lines = execute_program('sysctl', '-w hw.sensors'); + } + + $lines = explode("\n", $this->lines); + + for ($i = 0, $j = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/[\s,]+/", $lines[$i]); + + if ($ar_buf[2] == 'volts_dc') { + $results[$j]['label'] = $ar_buf[1]; + $results[$j]['value'] = $ar_buf[3]; + $results[$j]['min'] = '0.00'; + $results[$j]['max'] = '0.00'; + $j++; + } + } + + return $results; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/mb/class.lmsensors.inc.php b/oss/vtiger/trunk/modules/System/includes/mb/class.lmsensors.inc.php new file mode 100644 index 00000000..7d057b17 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/mb/class.lmsensors.inc.php @@ -0,0 +1,176 @@ +lines = explode("\n", $lines); + } + + function temperature() { + $ar_buf = array(); + $results = array(); + + $sensors_value = $this->lines; + + foreach($sensors_value as $line) { + $data = array(); + if (ereg("(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)", $line, $data)) ; + elseif (ereg("(.*):(.*)\((.*)=(.*)\)(.*)", $line, $data)) ; + else (ereg("(.*):(.*)", $line, $data)); + if (count($data) > 1) { + $temp = substr(trim($data[2]), -1); + switch ($temp) { + case "C"; + case "F": + array_push($ar_buf, $line); + break; + } + } + } + + $i = 0; + foreach($ar_buf as $line) { + unset($data); + if (ereg("(.*):(.*).C[ ]*\((.*)=(.*).C,(.*)=(.*).C\)(.*)\)", $line, $data)) ; + elseif (ereg("(.*):(.*).C[ ]*\((.*)=(.*).C,(.*)=(.*).C\)(.*)", $line, $data)) ; + elseif (ereg("(.*):(.*).C[ ]*\((.*)=(.*).C\)(.*)", $line, $data)) ; + else (ereg("(.*):(.*).C", $line, $data)); + + $results[$i]['label'] = $data[1]; + $results[$i]['value'] = trim($data[2]); + if ( trim( $data[2] ) > trim( $data[6] ) ) { + $results[$i]['limit'] = "+75"; + $results[$i]['perce'] = "+75"; + } else { + $results[$i]['limit'] = isset($data[4]) ? trim($data[4]) : "+75"; + $results[$i]['perce'] = isset($data[6]) ? trim($data[6]) : "+75"; + } + if ($results[$i]['limit'] < $results[$i]['perce']) { + $results[$i]['limit'] = $results[$i]['perce']; + } + $i++; + } + + asort($results); + return array_values($results); + } + + function fans() { + $ar_buf = array(); + $results = array(); + + $sensors_value = $this->lines; + + foreach($sensors_value as $line) { + $data = array(); + if (ereg("(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)", $line, $data)); + elseif (ereg("(.*):(.*)\((.*)=(.*)\)(.*)", $line, $data)); + else ereg("(.*):(.*)", $line, $data); + + if (count($data) > 1) { + $temp = explode(" ", trim($data[2])); + if (count($temp) == 1) + $temp = explode("\xb0", trim($data[2])); + if(isset($temp[1])) { + switch ($temp[1]) { + case "RPM": + array_push($ar_buf, $line); + break; + } + } + } + } + + $i = 0; + foreach($ar_buf as $line) { + unset($data); + if (ereg("(.*):(.*) RPM \((.*)=(.*) RPM,(.*)=(.*)\)(.*)\)", $line, $data)); + elseif (ereg("(.*):(.*) RPM \((.*)=(.*) RPM,(.*)=(.*)\)(.*)", $line, $data)); + elseif (ereg("(.*):(.*) RPM \((.*)=(.*) RPM\)(.*)", $line, $data)); + else ereg("(.*):(.*) RPM", $line, $data); + + $results[$i]['label'] = trim($data[1]); + $results[$i]['value'] = trim($data[2]); + $results[$i]['min'] = isset($data[4]) ? trim($data[4]) : 0; + $results[$i]['div'] = isset($data[6]) ? trim($data[6]) : 0; + $i++; + } + + asort($results); + return array_values($results); + } + + function voltage() { + $ar_buf = array(); + $results = array(); + + $sensors_value = $this->lines; + + foreach($sensors_value as $line) { + $data = array(); + if (ereg("(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)", $line, $data)); + else ereg("(.*):(.*)", $line, $data); + + if (count($data) > 1) { + $temp = explode(" ", trim($data[2])); + if (count($temp) == 1) + $temp = explode("\xb0", trim($data[2])); + if (isset($temp[1])) { + switch ($temp[1]) { + case "V": + array_push($ar_buf, $line); + break; + } + } + } + } + + $i = 0; + foreach($ar_buf as $line) { + unset($data); + if (ereg("(.*):(.*) V \((.*)=(.*) V,(.*)=(.*) V\)(.*)\)", $line, $data)); + elseif (ereg("(.*):(.*) V \((.*)=(.*) V,(.*)=(.*) V\)(.*)", $line, $data)); + else ereg("(.*):(.*) V$", $line, $data); + if(isset($data[1])) { + $results[$i]['label'] = trim($data[1]); + $results[$i]['value'] = trim($data[2]); + $results[$i]['min'] = isset($data[4]) ? trim($data[4]) : 0; + $results[$i]['max'] = isset($data[6]) ? trim($data[6]) : 0; + $i++; + } + } + return $results; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/mb/class.mbm5.inc.php b/oss/vtiger/trunk/modules/System/includes/mb/class.mbm5.inc.php new file mode 100644 index 00000000..432b2970 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/mb/class.mbm5.inc.php @@ -0,0 +1,127 @@ +buf_label)) { + if ($fp = fopen('MBM5.csv', 'r')) { + $this->buf_label = split(';', fgets($fp)); + $this->buf_value = split(';', fgets($fp)); + fclose($fp); + } + } + + $results[0]['label'] = $this->buf_label[3]; + $results[0]['value'] = $this->buf_value[3]; + $results[0]['limit'] = '70.0'; + $results[0]['percent'] = $results[0]['value'] * 100 / $results[0]['limit']; + $results[1]['label'] = $this->buf_label[4]; + $results[1]['value'] = $this->buf_value[4]; + $results[1]['limit'] = '70.0'; + $results[1]['percent'] = $results[1]['value'] * 100 / $results[1]['limit']; + $results[2]['label'] = $this->buf_label[5]; + $results[2]['value'] = $this->buf_value[5]; + $results[2]['limit'] = '70.0'; + $results[2]['percent'] = $results[2]['value'] * 100 / $results[2]['limit']; + return $results; + } + + function fans() { + $results = array(); + + if (!isset($this->buf_label)) { + if ($fp = fopen('MBM5.csv', 'r')) { + $this->buf_label = split(';', fgets($fp)); + $this->buf_value = split(';', fgets($fp)); + fclose($fp); + } + } + + $results[0]['label'] = $this->buf_label[13]; + $results[0]['value'] = $this->buf_value[13]; + $results[0]['min'] = '3000'; + $results[0]['div'] = '2'; + $results[1]['label'] = $this->buf_label[14]; + $results[1]['value'] = $this->buf_value[14]; + $results[1]['min'] = '3000'; + $results[1]['div'] = '2'; + $results[2]['label'] = $this->buf_label[15]; + $results[2]['value'] = $this->buf_value[15]; + $results[2]['min'] = '3000'; + $results[2]['div'] = '2'; + + return $results; + } + + function voltage() { + $results = array(); + + if (!isset($this->buf_label)) { + if ($fp = fopen('MBM5.csv', 'r')) { + $this->buf_label = split(';', fgets($fp)); + $this->buf_value = split(';', fgets($fp)); + fclose($fp); + } + } + + $results[0]['label'] = $this->buf_label[6]; + $results[0]['value'] = $this->buf_value[6]; + $results[0]['min'] = '0.00'; + $results[0]['max'] = '0.00'; + $results[1]['label'] = $this->buf_label[7]; + $results[1]['value'] = $this->buf_value[7]; + $results[1]['min'] = '0.00'; + $results[1]['max'] = '0.00'; + $results[2]['label'] = $this->buf_label[8]; + $results[2]['value'] = $this->buf_value[8]; + $results[2]['min'] = '0.00'; + $results[2]['max'] = '0.00'; + $results[3]['label'] = $this->buf_label[9]; + $results[3]['value'] = $this->buf_value[9]; + $results[3]['min'] = '0.00'; + $results[3]['max'] = '0.00'; + $results[4]['label'] = $this->buf_label[10]; + $results[4]['value'] = $this->buf_value[10]; + $results[4]['min'] = '0.00'; + $results[4]['max'] = '0.00'; + $results[5]['label'] = $this->buf_label[11]; + $results[5]['value'] = $this->buf_value[11]; + $results[5]['min'] = '0.00'; + $results[5]['max'] = '0.00'; + $results[6]['label'] = $this->buf_label[12]; + $results[6]['value'] = $this->buf_value[12]; + $results[6]['min'] = '0.00'; + $results[6]['max'] = '0.00'; + + return $results; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/mb/class.mbmon.inc.php b/oss/vtiger/trunk/modules/System/includes/mb/class.mbmon.inc.php new file mode 100644 index 00000000..fa574574 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/mb/class.mbmon.inc.php @@ -0,0 +1,100 @@ +lines) ) { + $this->lines = explode("\n", execute_program('mbmon', '-c 1 -r')); + } + + $i = 0; + foreach($this->lines as $line) { + if (preg_match('/^(TEMP\d*)\s*:\s*(.*)$/D', $line, $data)) { + if ($data[2]<>'0') { + $results[$i]['label'] = $data[1]; + $results[$i]['limit'] = '70.0'; + if($data[2] > 250) { + $results[$i]['value'] = 0; + $results[$i]['percent'] = 0; + } else { + $results[$i]['value'] = $data[2]; + $results[$i]['percent'] = $results[$i]['value'] * 100 / $results[$i]['limit']; + } + $i++; + } + } + } + return $results; + } + + function fans() { + $results = array(); + + if (!isset($this->lines) ) { + $this->lines = explode("\n", execute_program('mbmon', '-c 1 -r')); + } + + $i = 0; + foreach($this->lines as $line) { + if (preg_match('/^(FAN\d*)\s*:\s*(.*)$/D', $line, $data)) { + if ($data[2]<>'0') { + $results[$i]['label'] = $data[1]; + $results[$i]['value'] = $data[2]; + $results[$i]['min'] = '3000'; + $results[$i]['div'] = '2'; + $i++; + } + } + } + return $results; + } + + function voltage() { + $results = array(); + + if (!isset($this->lines) ) { + $this->lines = explode("\n", execute_program('mbmon', '-c 1 -r')); + } + + $i = 0; + foreach($this->lines as $line) { + if (preg_match('/^(V.*)\s*:\s*(.*)$/D', $line, $data)) { + if ($data[2]<>'+0.00') { + $results[$i]['label'] = $data[1]; + $results[$i]['value'] = $data[2]; + $results[$i]['min'] = '0.00'; + $results[$i]['max'] = '0.00'; + $i++; + } + } + } + + return $results; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/mb/index.html b/oss/vtiger/trunk/modules/System/includes/mb/index.html new file mode 100644 index 00000000..e69de29b diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.BSD.common.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.BSD.common.inc.php new file mode 100644 index 00000000..8cd02f2b --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.BSD.common.inc.php @@ -0,0 +1,298 @@ +parser = new Parser(); + $this->parser->df_param = ""; + } + + // read /var/run/dmesg.boot, but only if we haven't already. + function read_dmesg () { + if (! $this->dmesg) { + $parts = explode("rebooting", rfts( '/var/run/dmesg.boot' ) ); + $this->dmesg = explode("\n", $parts[count($parts) - 1]); + } + return $this->dmesg; + } + + // grabs a key from sysctl(8) + function grab_key ($key) { + return execute_program('sysctl', "-n $key"); + } + // get our apache SERVER_NAME or vhost + function hostname () { + if (!($result = getenv('SERVER_NAME'))) { + $result = "N.A."; + } + return $result; + } + // get our canonical hostname + function chostname () { + return execute_program('hostname'); + } + // get the IP address of our canonical hostname + function ip_addr () { + if (!($result = getenv('SERVER_ADDR'))) { + $result = gethostbyname($this->chostname()); + } + return $result; + } + + function kernel () { + $s = $this->grab_key('kern.version'); + $a = explode(':', $s); + return $a[0] . $a[1] . ':' . $a[2]; + } + + function uptime () { + $result = $this->get_sys_ticks(); + + return $result; + } + + function users () { + return execute_program('who', '| wc -l'); + } + + function loadavg ($bar = false) { + $s = $this->grab_key('vm.loadavg'); + $s = ereg_replace('{ ', '', $s); + $s = ereg_replace(' }', '', $s); + $results['avg'] = explode(' ', $s); + + if ($bar) { + if ($fd = $this->grab_key('kern.cp_time')) { + // Find out the CPU load + // user + sys = load + // total = total + preg_match($this->cpu_regexp2, $fd, $res ); + $load = $res[2] + $res[3] + $res[4]; // cpu.user + cpu.sys + $total = $res[2] + $res[3] + $res[4] + $res[5]; // cpu.total + + // we need a second value, wait 1 second befor getting (< 1 second no good value will occour) + sleep(1); + $fd = $this->grab_key('kern.cp_time'); + preg_match($this->cpu_regexp2, $fd, $res ); + $load2 = $res[2] + $res[3] + $res[4]; + $total2 = $res[2] + $res[3] + $res[4] + $res[5]; + $results['cpupercent'] = (100*($load2 - $load)) / ($total2 - $total); + } + } + return $results; + } + + function cpu_info () { + $results = array(); + $ar_buf = array(); + + $results['model'] = $this->grab_key('hw.model'); + $results['cpus'] = $this->grab_key('hw.ncpu'); + + for ($i = 0, $max = count($this->read_dmesg()); $i < $max; $i++) { + $buf = $this->dmesg[$i]; + if (preg_match("/$this->cpu_regexp/", $buf, $ar_buf)) { + $results['cpuspeed'] = round($ar_buf[2]); + break; + } + } + return $results; + } + // get the scsi device information out of dmesg + function scsi () { + $results = array(); + $ar_buf = array(); + + for ($i = 0, $max = count($this->read_dmesg()); $i < $max; $i++) { + $buf = $this->dmesg[$i]; + + if (preg_match("/$this->scsi_regexp1/", $buf, $ar_buf)) { + $s = $ar_buf[1]; + $results[$s]['model'] = $ar_buf[2]; + $results[$s]['media'] = 'Hard Disk'; + } elseif (preg_match("/$this->scsi_regexp2/", $buf, $ar_buf)) { + $s = $ar_buf[1]; + $results[$s]['capacity'] = $ar_buf[2] * 2048 * 1.049; + } + } + // return array_values(array_unique($results)); + // 1. more useful to have device names + // 2. php 4.1.1 array_unique() deletes non-unique values. + asort($results); + return $results; + } + + // get the pci device information out of dmesg + function pci () { + $results = array(); + + if( !( is_array($results = $this->parser->parse_lspci()) || is_array($results = $this->parser->parse_pciconf() ))) { + for ($i = 0, $s = 0; $i < count($this->read_dmesg()); $i++) { + $buf = $this->dmesg[$i]; + if(!isset($this->pci_regexp1) && !isset($this->pci_regexp2)) { + $this->pci_regexp1 = '/(.*): <(.*)>(.*) pci[0-9]$/'; + $this->pci_regexp2 = '/(.*): <(.*)>.* at [.0-9]+ irq/'; + } + if (preg_match($this->pci_regexp1, $buf, $ar_buf)) { + $results[$s++] = $ar_buf[1] . ": " . $ar_buf[2]; + } elseif (preg_match($this->pci_regexp2, $buf, $ar_buf)) { + $results[$s++] = $ar_buf[1] . ": " . $ar_buf[2]; + } + } + asort($results); + } + return $results; + } + + // get the ide device information out of dmesg + function ide () { + $results = array(); + + $s = 0; + for ($i = 0, $max = count($this->read_dmesg()); $i < $max; $i++) { + $buf = $this->dmesg[$i]; + + if (preg_match('/^(ad[0-9]+): (.*)MB <(.*)> (.*) (.*)/', $buf, $ar_buf)) { + $s = $ar_buf[1]; + $results[$s]['model'] = $ar_buf[3]; + $results[$s]['media'] = 'Hard Disk'; + $results[$s]['capacity'] = $ar_buf[2] * 2048 * 1.049; + } elseif (preg_match('/^(acd[0-9]+): (.*) <(.*)> (.*)/', $buf, $ar_buf)) { + $s = $ar_buf[1]; + $results[$s]['model'] = $ar_buf[3]; + $results[$s]['media'] = 'CD-ROM'; + } + } + // return array_values(array_unique($results)); + // 1. more useful to have device names + // 2. php 4.1.1 array_unique() deletes non-unique values. + asort($results); + return $results; + } + + // place holder function until we add acual usb detection + function usb () { + return array(); + } + + function sbus () { + $results = array(); + $_results[0] = ""; + // TODO. Nothing here yet. Move along. + $results = $_results; + return $results; + } + + function memory () { + $s = $this->grab_key('hw.physmem'); + + if (PHP_OS == 'FreeBSD' || PHP_OS == 'OpenBSD') { + // vmstat on fbsd 4.4 or greater outputs kbytes not hw.pagesize + // I should probably add some version checking here, but for now + // we only support fbsd 4.4 + $pagesize = 1024; + } else { + $pagesize = $this->grab_key('hw.pagesize'); + } + + $results['ram'] = array(); + + $pstat = execute_program('vmstat'); + $lines = split("\n", $pstat); + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $lines[$i], 19); + if ($i == 2) { + if(PHP_OS == 'NetBSD') { + $results['ram']['free'] = $ar_buf[5]; + } else { + $results['ram']['free'] = $ar_buf[5] * $pagesize / 1024; + } + } + } + + $results['ram']['total'] = $s / 1024; + $results['ram']['shared'] = 0; + $results['ram']['buffers'] = 0; + $results['ram']['used'] = $results['ram']['total'] - $results['ram']['free']; + $results['ram']['cached'] = 0; + $results['ram']['t_used'] = $results['ram']['used']; + $results['ram']['t_free'] = $results['ram']['free']; + + $results['ram']['percent'] = round(($results['ram']['used'] * 100) / $results['ram']['total']); + + if (PHP_OS == 'OpenBSD' || PHP_OS == 'NetBSD') { + $pstat = execute_program('swapctl', '-l -k'); + } else { + $pstat = execute_program('swapinfo', '-k'); + } + + $lines = split("\n", $pstat); + + $results['swap']['total'] = 0; + $results['swap']['used'] = 0; + $results['swap']['free'] = 0; + + for ($i = 1, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $lines[$i], 6); + + if ($ar_buf[0] != 'Total') { + $results['swap']['total'] = $results['swap']['total'] + $ar_buf[1]; + $results['swap']['used'] = $results['swap']['used'] + $ar_buf[2]; + $results['swap']['free'] = $results['swap']['free'] + $ar_buf[3]; + + $results['devswap'][$i - 1] = array(); + $results['devswap'][$i - 1]['dev'] = $ar_buf[0]; + $results['devswap'][$i - 1]['total'] = $ar_buf[1]; + $results['devswap'][$i - 1]['used'] = $ar_buf[2]; + $results['devswap'][$i - 1]['free'] = ($results['devswap'][$i - 1]['total'] - $results['devswap'][$i - 1]['used']); + $results['devswap'][$i - 1]['percent'] = $ar_buf[2] > 0 ? round(($ar_buf[2] * 100) / $ar_buf[1]) : 0; + } + } + $results['swap']['percent'] = round(($results['swap']['used'] * 100) / $results['swap']['total']); + + if( is_callable( array( 'sysinfo', 'memory_additional' ) ) ) { + $results = $this->memory_additional( $results ); + } + return $results; + } + + function filesystems () { + return $this->parser->parse_filesystems(); + } + + function distro () { + $distro = execute_program('uname', '-s'); + $result = $distro; + return($result); + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.Darwin.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.Darwin.inc.php new file mode 100644 index 00000000..ef9f6f6f --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.Darwin.inc.php @@ -0,0 +1,237 @@ +addError("WARN", "The Darwin version of phpSysInfo is work in progress, some things currently don't work"); + +class sysinfo extends bsd_common { + var $cpu_regexp; + var $scsi_regexp; + // Our contstructor + // this function is run on the initialization of this class + function sysinfo () { + // $this->cpu_regexp = "CPU: (.*) \((.*)-MHz (.*)\)"; + // $this->scsi_regexp1 = "^(.*): <(.*)> .*SCSI.*device"; + $this->cpu_regexp2 = "/(.*) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/"; + } + + function grab_key ($key) { + $s = execute_program('sysctl', $key); + $s = ereg_replace($key . ': ', '', $s); + $s = ereg_replace($key . ' = ', '', $s); // fix Apple set keys + + return $s; + } + + function grab_ioreg ($key) { + $s = execute_program('ioreg', '-cls "' . $key . '" | grep "' . $key . '"'); //ioreg -cls "$key" | grep "$key" + $s = ereg_replace('\|', '', $s); + $s = ereg_replace('\+\-\o', '', $s); + $s = ereg_replace('[ ]+', '', $s); + $s = ereg_replace('<[^>]+>', '', $s); // remove possible XML conflicts + + return $s; + } + + function get_sys_ticks () { + $a = execute_program('sysctl', '-n kern.boottime'); // get boottime (value in seconds) + $sys_ticks = time() - $a; + + return $sys_ticks; + } + + function cpu_info () { + $results = array(); + // $results['model'] = $this->grab_key('hw.model'); // need to expand this somehow... + // $results['model'] = $this->grab_key('hw.machine'); + $results['model'] = ereg_replace('Processor type: ', '', execute_program('hostinfo', '| grep "Processor type"')); // get processor type + $results['cpus'] = $this->grab_key('hw.ncpu'); + $results['cpuspeed'] = round($this->grab_key('hw.cpufrequency') / 1000000); // return cpu speed - Mhz + $results['busspeed'] = round($this->grab_key('hw.busfrequency') / 1000000); // return bus speed - Mhz + $results['cache'] = round($this->grab_key('hw.l2cachesize') / 1024); // return l2 cache + + if (($this->grab_key('hw.model') == "PowerMac3,6") && ($results['cpus'] == "2")) { $results['model'] = 'Dual G4 - (PowerPC 7450)';} // is Dual G4 + if (($this->grab_key('hw.model') == "PowerMac7,2") && ($results['cpus'] == "2")) { $results['model'] = 'Dual G5 - (PowerPC 970)';} // is Dual G5 + + return $results; + } + // get the pci device information out of ioreg + function pci () { + $results = array(); + $s = $this->grab_ioreg('IOPCIDevice'); + + $lines = split("\n", $s); + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $lines[$i], 19); + $results[$i] = $ar_buf[0]; + } + asort($results); + return array_values(array_unique($results)); + } + // get the ide device information out of ioreg + function ide () { + $results = array(); + // ioreg | grep "Media " + $s = $this->grab_ioreg('IOATABlockStorageDevice'); + + $lines = split("\n", $s); + $j = 0; + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\/\//", $lines[$i], 19); + + if ($ar_buf[1] == 'class IOMedia' && preg_match('/Media/', $ar_buf[0])) { + $results[$j++]['model'] = $ar_buf[0]; + } + } + asort($results); + return array_values(array_unique($results)); + } + + function memory () { + $s = $this->grab_key('hw.memsize'); + + $results['ram'] = array(); + + $pstat = execute_program('vm_stat'); // use darwin's vm_stat + $lines = split("\n", $pstat); + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $lines[$i], 19); + + if ($i == 1) { + $results['ram']['free'] = $ar_buf[2] * 4; // calculate free memory from page sizes (each page = 4MB) + } + } + + $results['ram']['total'] = $s / 1024; + $results['ram']['shared'] = 0; + $results['ram']['buffers'] = 0; + $results['ram']['used'] = $results['ram']['total'] - $results['ram']['free']; + $results['ram']['cached'] = 0; + $results['ram']['t_used'] = $results['ram']['used']; + $results['ram']['t_free'] = $results['ram']['free']; + + $results['ram']['percent'] = round(($results['ram']['used'] * 100) / $results['ram']['total']); + // need to fix the swap info... + $pstat = execute_program('swapinfo', '-k'); + $lines = split("\n", $pstat); + + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $lines[$i], 6); + + if ($i == 0) { + $results['swap']['total'] = 0; + $results['swap']['used'] = 0; + $results['swap']['free'] = 0; + } else { + $results['swap']['total'] = $results['swap']['total'] + $ar_buf[1]; + $results['swap']['used'] = $results['swap']['used'] + $ar_buf[2]; + $results['swap']['free'] = $results['swap']['free'] + $ar_buf[3]; + } + } + $results['swap']['percent'] = round(($results['swap']['used'] * 100) / $results['swap']['total']); + + return $results; + } + + function network () { + $netstat = execute_program('netstat', '-nbdi | cut -c1-24,42- | grep Link'); + $lines = split("\n", $netstat); + $results = array(); + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $lines[$i]); + if (!empty($ar_buf[0])) { + $results[$ar_buf[0]] = array(); + + $results[$ar_buf[0]]['rx_bytes'] = $ar_buf[5]; + $results[$ar_buf[0]]['rx_packets'] = $ar_buf[3]; + $results[$ar_buf[0]]['rx_errs'] = $ar_buf[4]; + $results[$ar_buf[0]]['rx_drop'] = $ar_buf[10]; + + $results[$ar_buf[0]]['tx_bytes'] = $ar_buf[8]; + $results[$ar_buf[0]]['tx_packets'] = $ar_buf[6]; + $results[$ar_buf[0]]['tx_errs'] = $ar_buf[7]; + $results[$ar_buf[0]]['tx_drop'] = $ar_buf[10]; + + $results[$ar_buf[0]]['errs'] = $ar_buf[4] + $ar_buf[7]; + $results[$ar_buf[0]]['drop'] = $ar_buf[10]; + } + } + return $results; + } + + function filesystems () { + $df = execute_program('df', '-k'); + $mounts = split("\n", $df); + $fstype = array(); + + $s = execute_program('mount'); + $lines = explode("\n", $s); + + $i = 0; + while (list(, $line) = each($lines)) { + ereg('(.*) \((.*)\)', $line, $a); + + $m = explode(' ', $a[0]); + $fsdev[$m[0]] = $a[2]; + } + + for ($i = 1, $j = 0, $max = sizeof($mounts); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $mounts[$i], 6); + + switch ($ar_buf[0]) { + case 'automount': // skip the automount entries + case 'devfs': // skip the dev filesystem + case 'fdesc': // skip the fdesc + case 'procfs': // skip the proc filesystem + case '': // skip the vol filesystem + continue 2; + break; + } + if (hide_mount($ar_buf[5])) { + continue; + } + + $results[$j] = array(); + + $results[$j]['disk'] = $ar_buf[0]; + $results[$j]['size'] = $ar_buf[1]; + $results[$j]['used'] = $ar_buf[2]; + $results[$j]['free'] = $ar_buf[3]; + $results[$j]['percent'] = $ar_buf[4]; + $results[$j]['mount'] = $ar_buf[5]; + ($fstype[$ar_buf[5]]) ? $results[$j]['fstype'] = $fstype[$ar_buf[5]] : $results[$j]['fstype'] = $fsdev[$ar_buf[0]]; + $j++; + } + return $results; + } + + function distroicon () { + $result = 'Darwin.png'; + return($result); + } + +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.FreeBSD.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.FreeBSD.inc.php new file mode 100644 index 00000000..2d8013ff --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.FreeBSD.inc.php @@ -0,0 +1,108 @@ +bsd_common(); + $this->cpu_regexp = "CPU: (.*) \((.*)-MHz (.*)\)"; + $this->scsi_regexp1 = "^(.*): <(.*)> .*SCSI.*device"; + $this->scsi_regexp2 = "^(da[0-9]): (.*)MB "; + $this->cpu_regexp2 = "/(.*) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/"; + } + + function get_sys_ticks () { + $s = explode(' ', $this->grab_key('kern.boottime')); + $a = ereg_replace('{ ', '', $s[3]); + $sys_ticks = time() - $a; + return $sys_ticks; + } + + function network () { + $netstat = execute_program('netstat', '-nibd | grep Link'); + $lines = split("\n", $netstat); + $results = array(); + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $lines[$i]); + if (!empty($ar_buf[0])) { + $results[$ar_buf[0]] = array(); + + if (strlen($ar_buf[3]) < 15) { + $results[$ar_buf[0]]['rx_bytes'] = $ar_buf[5]; + $results[$ar_buf[0]]['rx_packets'] = $ar_buf[3]; + $results[$ar_buf[0]]['rx_errs'] = $ar_buf[4]; + $results[$ar_buf[0]]['rx_drop'] = $ar_buf[10]; + + $results[$ar_buf[0]]['tx_bytes'] = $ar_buf[8]; + $results[$ar_buf[0]]['tx_packets'] = $ar_buf[6]; + $results[$ar_buf[0]]['tx_errs'] = $ar_buf[7]; + $results[$ar_buf[0]]['tx_drop'] = $ar_buf[10]; + + $results[$ar_buf[0]]['errs'] = $ar_buf[4] + $ar_buf[7]; + $results[$ar_buf[0]]['drop'] = $ar_buf[10]; + } else { + $results[$ar_buf[0]]['rx_bytes'] = $ar_buf[6]; + $results[$ar_buf[0]]['rx_packets'] = $ar_buf[4]; + $results[$ar_buf[0]]['rx_errs'] = $ar_buf[5]; + $results[$ar_buf[0]]['rx_drop'] = $ar_buf[11]; + + $results[$ar_buf[0]]['tx_bytes'] = $ar_buf[9]; + $results[$ar_buf[0]]['tx_packets'] = $ar_buf[7]; + $results[$ar_buf[0]]['tx_errs'] = $ar_buf[8]; + $results[$ar_buf[0]]['tx_drop'] = $ar_buf[11]; + + $results[$ar_buf[0]]['errs'] = $ar_buf[5] + $ar_buf[8]; + $results[$ar_buf[0]]['drop'] = $ar_buf[11]; + } + } + } + return $results; + } + + function distroicon () { + $result = 'FreeBSD.png'; + return($result); + } + + function memory_additional($results) { + $pagesize = $this->grab_key("hw.pagesize"); + $results['ram']['cached'] = $this->grab_key("vm.stats.vm.v_cache_count") * $pagesize / 1024; + $results['ram']['cached_percent'] = round( $results['ram']['cached'] * 100 / $results['ram']['total']); + $results['ram']['app'] = $this->grab_key("vm.stats.vm.v_active_count") * $pagesize / 1024; + $results['ram']['app_percent'] = round( $results['ram']['app'] * 100 / $results['ram']['total']); + $results['ram']['buffers'] = $results['ram']['used'] - $results['ram']['app'] - $results['ram']['cached']; + $results['ram']['buffers_percent'] = round( $results['ram']['buffers'] * 100 / $results['ram']['total']); + return $results; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.HP-UX.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.HP-UX.inc.php new file mode 100644 index 00000000..4fae43dd --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.HP-UX.inc.php @@ -0,0 +1,421 @@ +chostname()); + } + return $result; + } + + function kernel () { + return execute_program('uname', '-srvm'); + } + + function uptime () { + $result = 0; + $ar_buf = array(); + + $buf = execute_program('uptime'); + if (preg_match("/up (\d+) days,\s*(\d+):(\d+),/", $buf, $ar_buf)) { + $min = $ar_buf[3]; + $hours = $ar_buf[2]; + $days = $ar_buf[1]; + $result = $days * 86400 + $hours * 3600 + $min * 60; + } + + return $result; + } + + function users () { + $who = split('=', execute_program('who', '-q')); + $result = $who[1]; + return $result; + } + + function loadavg ($bar = false) { + $ar_buf = array(); + + $buf = execute_program('uptime'); + + if (preg_match("/average: (.*), (.*), (.*)$/", $buf, $ar_buf)) { + $results['avg'] = array($ar_buf[1], $ar_buf[2], $ar_buf[3]); + } else { + $results['avg'] = array('N.A.', 'N.A.', 'N.A.'); + } + return $results; + } + + function cpu_info () { + $results = array(); + $ar_buf = array(); + + $bufr = rfts( '/proc/cpuinfo' ); + if( $bufr != "ERROR" ) { + $bufe = explode( "\n", $bufr ); + foreach( $bufe as $buf ) { + list($key, $value) = preg_split('/\s+:\s+/', trim($buf), 2); + // All of the tags here are highly architecture dependant. + // the only way I could reconstruct them for machines I don't + // have is to browse the kernel source. So if your arch isn't + // supported, tell me you want it written in. + switch ($key) { + case 'model name': + $results['model'] = $value; + break; + case 'cpu MHz': + $results['cpuspeed'] = sprintf('%.2f', $value); + break; + case 'cycle frequency [Hz]': // For Alpha arch - 2.2.x + $results['cpuspeed'] = sprintf('%.2f', $value / 1000000); + break; + case 'clock': // For PPC arch (damn borked POS) + $results['cpuspeed'] = sprintf('%.2f', $value); + break; + case 'cpu': // For PPC arch (damn borked POS) + $results['model'] = $value; + break; + case 'revision': // For PPC arch (damn borked POS) + $results['model'] .= ' ( rev: ' . $value . ')'; + break; + case 'cpu model': // For Alpha arch - 2.2.x + $results['model'] .= ' (' . $value . ')'; + break; + case 'cache size': + $results['cache'] = $value; + break; + case 'bogomips': + $results['bogomips'] += $value; + break; + case 'BogoMIPS': // For alpha arch - 2.2.x + $results['bogomips'] += $value; + break; + case 'BogoMips': // For sparc arch + $results['bogomips'] += $value; + break; + case 'cpus detected': // For Alpha arch - 2.2.x + $results['cpus'] += $value; + break; + case 'system type': // Alpha arch - 2.2.x + $results['model'] .= ', ' . $value . ' '; + break; + case 'platform string': // Alpha arch - 2.2.x + $results['model'] .= ' (' . $value . ')'; + break; + case 'processor': + $results['cpus'] += 1; + break; + } + } + fclose($fd); + } + + $keys = array_keys($results); + $keys2be = array('model', 'cpuspeed', 'cache', 'bogomips', 'cpus'); + + while ($ar_buf = each($keys2be)) { + if (! in_array($ar_buf[1], $keys)) { + $results[$ar_buf[1]] = 'N.A.'; + } + } + return $results; + } + + function pci () { + $results = array(); + + $bufr = rfts( '/proc/pci' ); + if( $bufr != "ERROR" ) { + $bufe = explode( "\n", $bufr ); + foreach( $bufe as $buf ) { + if (preg_match('/Bus/', $buf)) { + $device = true; + continue; + } + + if ($device) { + list($key, $value) = split(': ', $buf, 2); + + if (!preg_match('/bridge/i', $key) && !preg_match('/USB/i', $key)) { + $results[] = preg_replace('/\([^\)]+\)\.$/', '', trim($value)); + } + $device = false; + } + } + } + asort($results); + return $results; + } + + function ide () { + $results = array(); + + $bufd = gdc( '/proc/ide' ); + + foreach( $bufd as $file ) { + if (preg_match('/^hd/', $file)) { + $results[$file] = array(); + // Check if device is CD-ROM (CD-ROM capacity shows as 1024 GB) + $buf = rfts( "/proc/ide/" . $file . "/media", 1 ); + if( $buf != "ERROR" ) { + $results[$file]['media'] = trim( $buf ); + if ($results[$file]['media'] == 'disk') { + $results[$file]['media'] = 'Hard Disk'; + } + if ($results[$file]['media'] == 'cdrom') { + $results[$file]['media'] = 'CD-ROM'; + } + } + + $buf = rfts( "/proc/ide/" . $file . "/model", 1 ); + if( $buf != "ERROR" ) { + $results[$file]['model'] = trim( $buf ); + if (preg_match('/WDC/', $results[$file]['model'])) { + $results[$file]['manufacture'] = 'Western Digital'; + } elseif (preg_match('/IBM/', $results[$file]['model'])) { + $results[$file]['manufacture'] = 'IBM'; + } elseif (preg_match('/FUJITSU/', $results[$file]['model'])) { + $results[$file]['manufacture'] = 'Fujitsu'; + } else { + $results[$file]['manufacture'] = 'Unknown'; + } + } + + $buf = rfts( "/proc/ide/" . $file . "/capacity", 1 ); + if( $buf != "ERROR" ) { + $results[$file]['capacity'] = trim( $buf ); + if ($results[$file]['media'] == 'CD-ROM') { + unset($results[$file]['capacity']); + } + } + } + } + asort($results); + return $results; + } + + function scsi () { + $results = array(); + $dev_vendor = ''; + $dev_model = ''; + $dev_rev = ''; + $dev_type = ''; + $s = 1; + + $bufr = rfts( '/proc/scsi/scsi' ); + if( $bufr != "ERROR" ) { + $bufe = explode( "\n", $bufr ); + foreach( $bufe as $buf ) { + if (preg_match('/Vendor/', $buf)) { + preg_match('/Vendor: (.*) Model: (.*) Rev: (.*)/i', $buf, $dev); + list($key, $value) = split(': ', $buf, 2); + $dev_str = $value; + $get_type = 1; + continue; + } + + if ($get_type) { + preg_match('/Type:\s+(\S+)/i', $buf, $dev_type); + $results[$s]['model'] = "$dev[1] $dev[2] ($dev_type[1])"; + $results[$s]['media'] = "Hard Disk"; + $s++; + $get_type = 0; + } + } + } + asort($results); + return $results; + } + + function usb () { + $results = array(); + $devstring = 0; + $devnum = -1; + + $bufr = rfts( '/proc/bus/usb/devices' ); + if( $bufr != "ERROR" ) { + $bufe = explode( "\n", $bufr ); + foreach( $bufe as $buf ) { + if (preg_match('/^T/', $buf)) { + $devnum += 1; + } + if (preg_match('/^S/', $buf)) { + $devstring = 1; + } + + if ($devstring) { + list($key, $value) = split(': ', $buf, 2); + list($key, $value2) = split('=', $value, 2); + $results[$devnum] .= " " . trim($value2); + $devstring = 0; + } + } + } + return $results; + } + + function sbus () { + $results = array(); + $_results[0] = ""; + // TODO. Nothing here yet. Move along. + $results = $_results; + return $results; + } + + function network () { + $netstat = execute_program('netstat', '-ni | tail -n +2'); + $lines = split("\n", $netstat); + $results = array(); + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $lines[$i]); + if (!empty($ar_buf[0]) && !empty($ar_buf[3])) { + $results[$ar_buf[0]] = array(); + + $results[$ar_buf[0]]['rx_bytes'] = $ar_buf[4]; + $results[$ar_buf[0]]['rx_packets'] = $ar_buf[4]; + $results[$ar_buf[0]]['rx_errs'] = $ar_buf[5]; + $results[$ar_buf[0]]['rx_drop'] = $ar_buf[8]; + + $results[$ar_buf[0]]['tx_bytes'] = $ar_buf[6]; + $results[$ar_buf[0]]['tx_packets'] = $ar_buf[6]; + $results[$ar_buf[0]]['tx_errs'] = $ar_buf[7]; + $results[$ar_buf[0]]['tx_drop'] = $ar_buf[8]; + + $results[$ar_buf[0]]['errs'] = $ar_buf[5] + $ar_buf[7]; + $results[$ar_buf[0]]['drop'] = $ar_buf[8]; + } + } + return $results; + } + function memory () { + $results['ram'] = array(); + $results['swap'] = array(); + $results['devswap'] = array(); + + $bufr = rfts( '/proc/meminfo' ); + if( $bufr != "ERROR" ) { + $bufe = explode( "\n", $bufr ); + foreach( $bufe as $buf ) { + if (preg_match('/Mem:\s+(.*)$/', $buf, $ar_buf)) { + $ar_buf = preg_split('/\s+/', $ar_buf[1], 6); + + $results['ram']['total'] = $ar_buf[0] / 1024; + $results['ram']['used'] = $ar_buf[1] / 1024; + $results['ram']['free'] = $ar_buf[2] / 1024; + $results['ram']['shared'] = $ar_buf[3] / 1024; + $results['ram']['buffers'] = $ar_buf[4] / 1024; + $results['ram']['cached'] = $ar_buf[5] / 1024; + // I don't like this since buffers and cache really aren't + // 'used' per say, but I get too many emails about it. + $results['ram']['t_used'] = $results['ram']['used']; + $results['ram']['t_free'] = $results['ram']['total'] - $results['ram']['t_used']; + $results['ram']['percent'] = round(($results['ram']['t_used'] * 100) / $results['ram']['total']); + } + + if (preg_match('/Swap:\s+(.*)$/', $buf, $ar_buf)) { + $ar_buf = preg_split('/\s+/', $ar_buf[1], 3); + + $results['swap']['total'] = $ar_buf[0] / 1024; + $results['swap']['used'] = $ar_buf[1] / 1024; + $results['swap']['free'] = $ar_buf[2] / 1024; + $results['swap']['percent'] = round(($ar_buf[1] * 100) / $ar_buf[0]); + // Get info on individual swap files + $swaps = rfts( '/proc/swaps' ); + if( $swaps != "ERROR" ) { + $swapdevs = split("\n", $swaps); + + for ($i = 1, $max = (sizeof($swapdevs) - 1); $i < $max; $i++) { + $ar_buf = preg_split('/\s+/', $swapdevs[$i], 6); + $results['devswap'][$i - 1] = array(); + $results['devswap'][$i - 1]['dev'] = $ar_buf[0]; + $results['devswap'][$i - 1]['total'] = $ar_buf[2]; + $results['devswap'][$i - 1]['used'] = $ar_buf[3]; + $results['devswap'][$i - 1]['free'] = ($results['devswap'][$i - 1]['total'] - $results['devswap'][$i - 1]['used']); + $results['devswap'][$i - 1]['percent'] = round(($ar_buf[3] * 100) / $ar_buf[2]); + } + break; + } + } + } + } + return $results; + } + + function filesystems () { + $df = execute_program('df', '-kP'); + $mounts = split("\n", $df); + $fstype = array(); + + $s = execute_program('mount', '-v'); + $lines = explode("\n", $s); + + $i = 0; + while (list(, $line) = each($lines)) { + $a = split(' ', $line); + $fsdev[$a[0]] = $a[4]; + } + + for ($i = 1, $j = 0, $max = sizeof($mounts); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $mounts[$i], 6); + + if (hide_mount($ar_buf[5])) { + continue; + } + + $results[$j] = array(); + + $results[$j]['disk'] = $ar_buf[0]; + $results[$j]['size'] = $ar_buf[1]; + $results[$j]['used'] = $ar_buf[2]; + $results[$j]['free'] = $ar_buf[3]; + $results[$j]['percent'] = $ar_buf[4]; + $results[$j]['mount'] = $ar_buf[5]; + ($fstype[$ar_buf[5]]) ? $results[$j]['fstype'] = $fstype[$ar_buf[5]] : $results[$j]['fstype'] = $fsdev[$ar_buf[0]]; + $j++; + } + return $results; + } + + function distro () { + $result = 'HP-UX'; + return($result); + } + + function distroicon () { + $result = 'unknown.png'; + return($result); + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.Linux.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.Linux.inc.php new file mode 100644 index 00000000..8abc31fa --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.Linux.inc.php @@ -0,0 +1,528 @@ +parser = new Parser(); + $this->parser->df_param = 'P'; + + $list = @parse_ini_file(APP_ROOT . "/" . $this->inifile, true); + if (!$list) { + return; + } + foreach ($list as $section => $distribution) { + if (!isset($distribution["Files"])) { + continue; + } else { + foreach (explode(";", $distribution["Files"]) as $filename) { + if (file_exists($filename)) { + $buf = rfts( $filename ); + $this->icon = isset($distribution["Image"]) ? $distribution["Image"] : $this->icon; + $this->distro = isset($distribution["Name"]) ? $distribution["Name"] . " " . trim($buf) : trim($buf); + break 2; + } + } + } + } + } + + // get our apache SERVER_NAME or vhost + function vhostname () { + if (! ($result = getenv('SERVER_NAME'))) { + $result = 'N.A.'; + } + return $result; + } + // get our canonical hostname + function chostname () { + $result = rfts( '/proc/sys/kernel/hostname', 1 ); + if ( $result == "ERROR" ) { + $result = "N.A."; + } else { + $result = gethostbyaddr( gethostbyname( trim( $result ) ) ); + } + return $result; + } + // get the IP address of our canonical hostname + function ip_addr () { + if (!($result = getenv('SERVER_ADDR'))) { + $result = gethostbyname($this->chostname()); + } + return $result; + } + + function kernel () { + $buf = rfts( '/proc/version', 1 ); + if ( $buf == "ERROR" ) { + $result = "N.A."; + } else { + if (preg_match('/version (.*?) /', $buf, $ar_buf)) { + $result = $ar_buf[1]; + + if (preg_match('/SMP/', $buf)) { + $result .= ' (SMP)'; + } + } + } + return $result; + } + + function uptime () { + $buf = rfts( '/proc/uptime', 1 ); + $ar_buf = split( ' ', $buf ); + $result = trim( $ar_buf[0] ); + + return $result; + } + + function users () { + $who = split('=', execute_program('who', '-q')); + $result = $who[1]; + return $result; + } + + function loadavg ($bar = false) { + $buf = rfts( '/proc/loadavg' ); + if( $buf == "ERROR" ) { + $results['avg'] = array('N.A.', 'N.A.', 'N.A.'); + } else { + $results['avg'] = preg_split("/\s/", $buf, 4); + unset($results['avg'][3]); // don't need the extra values, only first three + } + if ($bar) { + $buf = rfts( '/proc/stat', 1 ); + if( $buf != "ERROR" ) { + sscanf($buf, "%*s %Ld %Ld %Ld %Ld", $ab, $ac, $ad, $ae); + // Find out the CPU load + // user + sys = load + // total = total + $load = $ab + $ac + $ad; // cpu.user + cpu.sys + $total = $ab + $ac + $ad + $ae; // cpu.total + + // we need a second value, wait 1 second befor getting (< 1 second no good value will occour) + sleep(1); + $buf = rfts( '/proc/stat', 1 ); + sscanf($buf, "%*s %Ld %Ld %Ld %Ld", $ab, $ac, $ad, $ae); + $load2 = $ab + $ac + $ad; + $total2 = $ab + $ac + $ad + $ae; + $results['cpupercent'] = (100*($load2 - $load)) / ($total2 - $total); + } + } + return $results; + } + + function cpu_info () { + $bufr = rfts( '/proc/cpuinfo' ); + + if ( $bufr != "ERROR" ) { + $bufe = explode("\n", $bufr); + + $results = array('cpus' => 0, 'bogomips' => 0); + $ar_buf = array(); + + foreach( $bufe as $buf ) { + if(trim($buf) != "") { + list($key, $value) = preg_split('/\s+:\s+/', trim($buf), 2); + // All of the tags here are highly architecture dependant. + // the only way I could reconstruct them for machines I don't + // have is to browse the kernel source. So if your arch isn't + // supported, tell me you want it written in. + switch ($key) { + case 'model name': + $results['model'] = $value; + break; + case 'cpu MHz': + $results['cpuspeed'] = sprintf('%.2f', $value); + break; + case 'cycle frequency [Hz]': // For Alpha arch - 2.2.x + $results['cpuspeed'] = sprintf('%.2f', $value / 1000000); + break; + case 'clock': // For PPC arch (damn borked POS) + $results['cpuspeed'] = sprintf('%.2f', $value); + break; + case 'cpu': // For PPC arch (damn borked POS) + $results['model'] = $value; + break; + case 'L2 cache': // More for PPC + $results['cache'] = $value; + break; + case 'revision': // For PPC arch (damn borked POS) + $results['model'] .= ' ( rev: ' . $value . ')'; + break; + case 'cpu model': // For Alpha arch - 2.2.x + $results['model'] .= ' (' . $value . ')'; + break; + case 'cache size': + $results['cache'] = $value; + break; + case 'bogomips': + $results['bogomips'] += $value; + break; + case 'BogoMIPS': // For alpha arch - 2.2.x + $results['bogomips'] += $value; + break; + case 'BogoMips': // For sparc arch + $results['bogomips'] += $value; + break; + case 'cpus detected': // For Alpha arch - 2.2.x + $results['cpus'] += $value; + break; + case 'system type': // Alpha arch - 2.2.x + $results['model'] .= ', ' . $value . ' '; + break; + case 'platform string': // Alpha arch - 2.2.x + $results['model'] .= ' (' . $value . ')'; + break; + case 'processor': + $results['cpus'] += 1; + break; + case 'Cpu0ClkTck': // Linux sparc64 + $results['cpuspeed'] = sprintf('%.2f', hexdec($value) / 1000000); + break; + case 'Cpu0Bogo': // Linux sparc64 & sparc32 + $results['bogomips'] = $value; + break; + case 'ncpus probed': // Linux sparc64 & sparc32 + $results['cpus'] = $value; + break; + } + } + } + } + + // sparc64 specific code follows + // This adds the ability to display the cache that a CPU has + // Originally made by Sven Blumenstein in 2004 + // Modified by Tom Weustink in 2004 + $sparclist = array('SUNW,UltraSPARC@0,0', 'SUNW,UltraSPARC-II@0,0', 'SUNW,UltraSPARC@1c,0', 'SUNW,UltraSPARC-IIi@1c,0', 'SUNW,UltraSPARC-II@1c,0'); + foreach ($sparclist as $name) { + $buf = rfts( '/proc/openprom/' . $name . '/ecache-size',1 , 32, false ); + if( $buf != "ERROR" ) { + $results['cache'] = base_convert($buf, 16, 10)/1024 . ' KB'; + } + } + // sparc64 specific code ends + + // XScale detection code + if ( $results['cpus'] == 0 ) { + foreach( $bufe as $buf ) { + if($buf != "\n") { + list($key, $value) = preg_split('/\s+:\s+/', trim($buf), 2); + switch($key) { + case 'Processor': + $results['cpus'] += 1; + $results['model'] = $value; + break; + case 'BogoMIPS': //BogoMIPS are not BogoMIPS on this CPU, it's the speed, no BogoMIPS available + $results['cpuspeed'] = $value; + break; + case 'I size': + $results['cache'] = $value; + break; + case 'D size': + $results['cache'] += $value; + break; + } + } + } + $results['cache'] = $results['cache'] / 1024 . " KB"; + } + + $keys = array_keys($results); + $keys2be = array('model', 'cpuspeed', 'cache', 'bogomips', 'cpus'); + + while ($ar_buf = each($keys2be)) { + if (! in_array($ar_buf[1], $keys)) { + $results[$ar_buf[1]] = 'N.A.'; + } + } + return $results; + } + + function pci () { + $results = array(); + + if( !$results = $this->parser->parse_lspci() ) { + $bufr = rfts( '/proc/pci' ); + + //Pinaki : Fix for ticket #4462 and #5147 + if(!is_null($bufr) && is_array($bufr)) { + + foreach( $bufr as $buf ) { + if (preg_match('/Bus/', $buf)) { + $device = true; + continue; + } + + if ($device) { + list($key, $value) = split(': ', $buf, 2); + + if (!preg_match('/bridge/i', $key) && !preg_match('/USB/i', $key)) { + $results[] = preg_replace('/\([^\)]+\)\.$/', '', trim($value)); + } + $device = false; + } + } + asort($results); + } + } + return $results; + } + + function ide () { + $results = array(); + $bufd = gdc( '/proc/ide' ); + //Pinaki: Fix for ticket #4462 + if(!is_null($bufd)){ + foreach( $bufd as $file ) { + if (preg_match('/^hd/', $file)) { + $results[$file] = array(); + $buf = rfts("/proc/ide/" . $file . "/media", 1 ); + if ( $buf != "ERROR" ) { + $results[$file]['media'] = trim($buf); + if ($results[$file]['media'] == 'disk') { + $results[$file]['media'] = 'Hard Disk'; + $buf = rfts( "/proc/ide/" . $file . "/capacity", 1, 4096, false); + if( $buf == "ERROR" ) { + $buf = rfts( "/sys/block/" . $file . "/size", 1, 4096, false); + } + if ( $buf != "ERROR" ) { + $results[$file]['capacity'] = trim( $buf ); + } + } elseif ($results[$file]['media'] == 'cdrom') { + $results[$file]['media'] = 'CD-ROM'; + unset($results[$file]['capacity']); + } + } + + $buf = rfts( "/proc/ide/" . $file . "/model", 1 ); + if ( $buf != "ERROR" ) { + $results[$file]['model'] = trim( $buf ); + if (preg_match('/WDC/', $results[$file]['model'])) { + $results[$file]['manufacture'] = 'Western Digital'; + } elseif (preg_match('/IBM/', $results[$file]['model'])) { + $results[$file]['manufacture'] = 'IBM'; + } elseif (preg_match('/FUJITSU/', $results[$file]['model'])) { + $results[$file]['manufacture'] = 'Fujitsu'; + } else { + $results[$file]['manufacture'] = 'Unknown'; + } + } + + } + } + + asort($results); + } + return $results; + } + + function scsi () { + $results = array(); + $dev_vendor = ''; + $dev_model = ''; + $dev_rev = ''; + $dev_type = ''; + $s = 1; + $get_type = 0; + + $bufr = execute_program('lsscsi', '-c', false); + if( is_null( $bufr )) { + $bufr = rfts( '/proc/scsi/scsi', 0, 4096, false ); + } + if ( $bufr != "ERROR" ) { + $bufe = explode("\n", $bufr); + foreach( $bufe as $buf ) { + if (preg_match('/Vendor/', $buf)) { + preg_match('/Vendor: (.*) Model: (.*) Rev: (.*)/i', $buf, $dev); + list($key, $value) = split(': ', $buf, 2); + $dev_str = $value; + $get_type = true; + continue; + } + + if ($get_type) { + preg_match('/Type:\s+(\S+)/i', $buf, $dev_type); + $results[$s]['model'] = "$dev[1] $dev[2] ($dev_type[1])"; + $results[$s]['media'] = "Hard Disk"; + $s++; + $get_type = false; + } + } + } + asort($results); + return $results; + } + + function usb () { + $results = array(); + $devnum = -1; + + $bufr = execute_program('lsusb', '', false); + if( is_null( $bufr )) { + $bufr = rfts( '/proc/bus/usb/devices' ); + if ( $bufr != "ERROR" ) { + $bufe = explode("\n", $bufr); + foreach( $bufe as $buf ) { + if (preg_match('/^T/', $buf)) { + $devnum += 1; + $results[$devnum] = ""; + } elseif (preg_match('/^S:/', $buf)) { + list($key, $value) = split(': ', $buf, 2); + list($key, $value2) = split('=', $value, 2); + if (trim($key) != "SerialNumber") { + $results[$devnum] .= " " . trim($value2); + $devstring = 0; + } + } + } + } + } else { + $bufe = explode( "\n", $bufr ); + foreach( $bufe as $buf ) { + $device = preg_split("/ /", $buf, 7); + if( isset( $device[6] ) && trim( $device[6] ) != "" ) { + $results[$devnum++] = trim( $device[6] ); + } + } + } + return $results; + } + + function sbus () { + $results = array(); + $_results[0] = ""; + // TODO. Nothing here yet. Move along. + $results = $_results; + return $results; + } + + function network () { + $results = array(); + + $bufr = rfts( '/proc/net/dev' ); + //Pinaki: Fix for ticket #4462 + if ( !is_null($bufr) && $bufr != "ERROR") { + $bufe = explode("\n", $bufr); + foreach( $bufe as $buf ) { + if (preg_match('/:/', $buf)) { + list($dev_name, $stats_list) = preg_split('/:/', $buf, 2); + $stats = preg_split('/\s+/', trim($stats_list)); + $results[$dev_name] = array(); + + $results[$dev_name]['rx_bytes'] = $stats[0]; + $results[$dev_name]['rx_packets'] = $stats[1]; + $results[$dev_name]['rx_errs'] = $stats[2]; + $results[$dev_name]['rx_drop'] = $stats[3]; + + $results[$dev_name]['tx_bytes'] = $stats[8]; + $results[$dev_name]['tx_packets'] = $stats[9]; + $results[$dev_name]['tx_errs'] = $stats[10]; + $results[$dev_name]['tx_drop'] = $stats[11]; + + $results[$dev_name]['errs'] = $stats[2] + $stats[10]; + $results[$dev_name]['drop'] = $stats[3] + $stats[11]; + } + } + } + return $results; + } + + function memory () { + $results['ram'] = array(); + $results['swap'] = array(); + $results['devswap'] = array(); + + $bufr = rfts( '/proc/meminfo' ); + if ( $bufr != "ERROR" ) { + $bufe = explode("\n", $bufr); + foreach( $bufe as $buf ) { + if (preg_match('/^MemTotal:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $results['ram']['total'] = $ar_buf[1]; + } else if (preg_match('/^MemFree:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $results['ram']['t_free'] = $ar_buf[1]; + } else if (preg_match('/^Cached:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $results['ram']['cached'] = $ar_buf[1]; + } else if (preg_match('/^Buffers:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $results['ram']['buffers'] = $ar_buf[1]; + } else if (preg_match('/^SwapTotal:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $results['swap']['total'] = $ar_buf[1]; + } else if (preg_match('/^SwapFree:\s+(.*)\s*kB/i', $buf, $ar_buf)) { + $results['swap']['free'] = $ar_buf[1]; + } + } + + $results['ram']['t_used'] = $results['ram']['total'] - $results['ram']['t_free']; + $results['ram']['percent'] = round(($results['ram']['t_used'] * 100) / $results['ram']['total']); + $results['swap']['used'] = $results['swap']['total'] - $results['swap']['free']; + $results['swap']['percent'] = round(($results['swap']['used'] * 100) / $results['swap']['total']); + + // values for splitting memory usage + if (isset($results['ram']['cached']) && isset($results['ram']['buffers'])) { + $results['ram']['app'] = $results['ram']['t_used'] - $results['ram']['cached'] - $results['ram']['buffers']; + $results['ram']['app_percent'] = round(($results['ram']['app'] * 100) / $results['ram']['total']); + $results['ram']['buffers_percent'] = round(($results['ram']['buffers'] * 100) / $results['ram']['total']); + $results['ram']['cached_percent'] = round(($results['ram']['cached'] * 100) / $results['ram']['total']); + } + + $bufr = rfts( '/proc/swaps' ); + //Pinaki: Fix for ticket #4462 + if ( !is_null($bufr) && $bufr != "ERROR") { + $swaps = explode("\n", $bufr); + for ($i = 1; $i < (sizeof($swaps)); $i++) { + if( trim( $swaps[$i] ) != "" ) { + $ar_buf = preg_split('/\s+/', $swaps[$i], 6); + $results['devswap'][$i - 1] = array(); + $results['devswap'][$i - 1]['dev'] = $ar_buf[0]; + $results['devswap'][$i - 1]['total'] = $ar_buf[2]; + $results['devswap'][$i - 1]['used'] = $ar_buf[3]; + $results['devswap'][$i - 1]['free'] = ($results['devswap'][$i - 1]['total'] - $results['devswap'][$i - 1]['used']); + $results['devswap'][$i - 1]['percent'] = round(($ar_buf[3] * 100) / $ar_buf[2]); + } + } + } + } + return $results; + } + + function filesystems () { + return $this->parser->parse_filesystems(); + } + + function distro () { + return $this->distro; + } + + function distroicon () { + return $this->icon; + } + +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.NetBSD.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.NetBSD.inc.php new file mode 100644 index 00000000..288ad9e1 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.NetBSD.inc.php @@ -0,0 +1,111 @@ +bsd_common(); + + $this->cpu_regexp = "^cpu(.*)\, (.*) MHz"; + $this->scsi_regexp1 = "^(.*) at scsibus.*: <(.*)> .*"; + $this->scsi_regexp2 = "^(da[0-9]): (.*)MB "; + $this->cpu_regexp2 = "/user = (.*), nice = (.*), sys = (.*), intr = (.*), idle = (.*)/"; + $this->pci_regexp1 = '/(.*) at pci[0-9] dev [0-9]* function [0-9]*: (.*)$/'; + $this->pci_regexp2 = '/"(.*)" (.*).* at [.0-9]+ irq/'; + } + + function get_sys_ticks () { + $a = $this->grab_key('kern.boottime'); + $sys_ticks = time() - $a; + return $sys_ticks; + } + + function network () { + $netstat_b = execute_program('netstat', '-nbdi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"'); + $netstat_n = execute_program('netstat', '-ndi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"'); + $lines_b = split("\n", $netstat_b); + $lines_n = split("\n", $netstat_n); + $results = array(); + for ($i = 0, $max = sizeof($lines_b); $i < $max; $i++) { + $ar_buf_b = preg_split("/\s+/", $lines_b[$i]); + $ar_buf_n = preg_split("/\s+/", $lines_n[$i]); + if (!empty($ar_buf_b[0]) && !empty($ar_buf_n[3])) { + $results[$ar_buf_b[0]] = array(); + + $results[$ar_buf_b[0]]['rx_bytes'] = $ar_buf_b[3]; + $results[$ar_buf_b[0]]['rx_packets'] = $ar_buf_n[3]; + $results[$ar_buf_b[0]]['rx_errs'] = $ar_buf_n[4]; + $results[$ar_buf_b[0]]['rx_drop'] = $ar_buf_n[8]; + + $results[$ar_buf_b[0]]['tx_bytes'] = $ar_buf_b[4]; + $results[$ar_buf_b[0]]['tx_packets'] = $ar_buf_n[5]; + $results[$ar_buf_b[0]]['tx_errs'] = $ar_buf_n[6]; + $results[$ar_buf_b[0]]['tx_drop'] = $ar_buf_n[8]; + + $results[$ar_buf_b[0]]['errs'] = $ar_buf_n[4] + $ar_buf_n[6]; + $results[$ar_buf_b[0]]['drop'] = $ar_buf_n[8]; + } + } + return $results; + } + + // get the ide device information out of dmesg + function ide () { + $results = array(); + + $s = 0; + for ($i = 0, $max = count($this->read_dmesg()); $i < $max; $i++) { + $buf = $this->dmesg[$i]; + if (preg_match('/^(.*) at (pciide|wdc|atabus|atapibus)[0-9] (.*): <(.*)>/', $buf, $ar_buf)) { + $s = $ar_buf[1]; + $results[$s]['model'] = $ar_buf[4]; + $results[$s]['media'] = 'Hard Disk'; + // now loop again and find the capacity + for ($j = 0, $max1 = count($this->read_dmesg()); $j < $max1; $j++) { + $buf_n = $this->dmesg[$j]; + if (preg_match("/^($s): (.*), (.*), (.*)MB, .*$/", $buf_n, $ar_buf_n)) { + $results[$s]['capacity'] = $ar_buf_n[4] * 2048 * 1.049; + } elseif (preg_match("/^($s): (.*) MB, (.*), (.*), .*$/", $buf_n, $ar_buf_n)) { + $results[$s]['capacity'] = $ar_buf_n[2] * 2048; + } + } + } + } + asort($results); + return $results; + } + + function distroicon () { + $result = 'NetBSD.png'; + return($result); + } + +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.OpenBSD.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.OpenBSD.inc.php new file mode 100644 index 00000000..c572bb6c --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.OpenBSD.inc.php @@ -0,0 +1,110 @@ +bsd_common(); + $this->cpu_regexp = "^cpu(.*) (.*) MHz"; + $this->scsi_regexp1 = "^(.*) at scsibus.*: <(.*)> .*"; + $this->scsi_regexp2 = "^(da[0-9]): (.*)MB "; + $this->cpu_regexp2 = "/(.*),(.*),(.*),(.*),(.*)/"; + $this->pci_regexp1 = '/(.*) at pci[0-9] .* "(.*)"/'; + $this->pci_regexp2 = '/"(.*)" (.*).* at [.0-9]+ irq/'; + } + + function get_sys_ticks () { + $a = $this->grab_key('kern.boottime'); + $sys_ticks = time() - $a; + return $sys_ticks; + } + + function network () { + $netstat_b = execute_program('netstat', '-nbdi | cut -c1-25,44- | grep Link | grep -v \'* \''); + $netstat_n = execute_program('netstat', '-ndi | cut -c1-25,44- | grep Link | grep -v \'* \''); + $lines_b = split("\n", $netstat_b); + $lines_n = split("\n", $netstat_n); + $results = array(); + for ($i = 0, $max = sizeof($lines_b); $i < $max; $i++) { + $ar_buf_b = preg_split("/\s+/", $lines_b[$i]); + $ar_buf_n = preg_split("/\s+/", $lines_n[$i]); + if (!empty($ar_buf_b[0]) && !empty($ar_buf_n[3])) { + $results[$ar_buf_b[0]] = array(); + + $results[$ar_buf_b[0]]['rx_bytes'] = $ar_buf_b[3]; + $results[$ar_buf_b[0]]['rx_packets'] = $ar_buf_n[3]; + $results[$ar_buf_b[0]]['rx_errs'] = $ar_buf_n[4]; + $results[$ar_buf_b[0]]['rx_drop'] = $ar_buf_n[8]; + + $results[$ar_buf_b[0]]['tx_bytes'] = $ar_buf_b[4]; + $results[$ar_buf_b[0]]['tx_packets'] = $ar_buf_n[5]; + $results[$ar_buf_b[0]]['tx_errs'] = $ar_buf_n[6]; + $results[$ar_buf_b[0]]['tx_drop'] = $ar_buf_n[8]; + + $results[$ar_buf_b[0]]['errs'] = $ar_buf_n[4] + $ar_buf_n[6]; + $results[$ar_buf_b[0]]['drop'] = $ar_buf_n[8]; + } + } + return $results; + } + // get the ide device information out of dmesg + function ide () { + $results = array(); + + $s = 0; + for ($i = 0, $max = count($this->read_dmesg()); $i < $max; $i++) { + $buf = $this->dmesg[$i]; + if (preg_match('/^(.*) at pciide[0-9] (.*): <(.*)>/', $buf, $ar_buf)) { + $s = $ar_buf[1]; + $results[$s]['model'] = $ar_buf[3]; + $results[$s]['media'] = 'Hard Disk'; + // now loop again and find the capacity + for ($j = 0, $max1 = count($this->read_dmesg()); $j < $max1; $j++) { + $buf_n = $this->dmesg[$j]; + if (preg_match("/^($s): (.*), (.*), (.*)MB, .*$/", $buf_n, $ar_buf_n)) { + $results[$s]['capacity'] = $ar_buf_n[4] * 2048 * 1.049;; + } + } + } + } + asort($results); + return $results; + } + + function distroicon () { + $result = 'OpenBSD.png'; + return($result); + } + +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.SunOS.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.SunOS.inc.php new file mode 100644 index 00000000..6e0b3746 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.SunOS.inc.php @@ -0,0 +1,238 @@ +addError("WARN", "The SunOS version of phpSysInfo is work in progress, some things currently don't work"); + +class sysinfo { + // Extract kernel values via kstat() interface + function kstat ($key) { + $m = execute_program('kstat', "-p d $key"); + list($key, $value) = split("\t", trim($m), 2); + return $value; + } + + function vhostname () { + if (! ($result = getenv('SERVER_NAME'))) { + $result = 'N.A.'; + } + return $result; + } + // get our canonical hostname + function chostname () { + if ($result = execute_program('uname', '-n')) { + $result = gethostbyaddr(gethostbyname($result)); + } else { + $result = 'N.A.'; + } + return $result; + } + // get the IP address of our canonical hostname + function ip_addr () { + if (!($result = getenv('SERVER_ADDR'))) { + $result = gethostbyname($this->chostname()); + } + return $result; + } + + function kernel () { + $os = execute_program('uname', '-s'); + $version = execute_program('uname', '-r'); + return $os . ' ' . $version; + } + + function uptime () { + $result = time() - $this->kstat('unix:0:system_misc:boot_time'); + + return $result; + } + + function users () { + $who = split('=', execute_program('who', '-q')); + $result = $who[1]; + return $result; + } + + function loadavg ($bar = false) { + $load1 = $this->kstat('unix:0:system_misc:avenrun_1min'); + $load5 = $this->kstat('unix:0:system_misc:avenrun_5min'); + $load15 = $this->kstat('unix:0:system_misc:avenrun_15min'); + $results['avg'] = array( round($load1/256, 2), round($load5/256, 2), round($load15/256, 2) ); + return $results; + } + + function cpu_info () { + $results = array(); + $ar_buf = array(); + + $results['model'] = execute_program('uname', '-i'); + $results['cpuspeed'] = $this->kstat('cpu_info:0:cpu_info0:clock_MHz'); + $results['cache'] = $this->kstat('cpu_info:0:cpu_info0:cpu_type'); + $results['cpus'] = $this->kstat('unix:0:system_misc:ncpus'); + + return $results; + } + + function pci () { + // FIXME + $results = array(); + return $results; + } + + function ide () { + // FIXME + $results = array(); + return $results; + } + + function scsi () { + // FIXME + $results = array(); + return $results; + } + + function usb () { + // FIXME + $results = array(); + return $results; + } + + function sbus () { + $results = array(); + $_results[0] = ""; + // TODO. Nothing here yet. Move along. + $results = $_results; + return $results; + } + + function network () { + $results = array(); + + $netstat = execute_program('netstat', '-ni | awk \'(NF ==10){print;}\''); + $lines = split("\n", $netstat); + $results = array(); + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + $ar_buf = preg_split("/\s+/", $lines[$i]); + if ((!empty($ar_buf[0])) && ($ar_buf[0] != 'Name')) { + $results[$ar_buf[0]] = array(); + + $results[$ar_buf[0]]['rx_bytes'] = 0; + $results[$ar_buf[0]]['rx_packets'] = $ar_buf[4]; + $results[$ar_buf[0]]['rx_errs'] = $ar_buf[5]; + $results[$ar_buf[0]]['rx_drop'] = 0; + + $results[$ar_buf[0]]['tx_bytes'] = 0; + $results[$ar_buf[0]]['tx_packets'] = $ar_buf[6]; + $results[$ar_buf[0]]['tx_errs'] = $ar_buf[7]; + $results[$ar_buf[0]]['tx_drop'] = 0; + + $results[$ar_buf[0]]['errs'] = $ar_buf[5] + $ar_buf[ + 7]; + $results[$ar_buf[0]]['drop'] = 0; + + preg_match('/^(\D+)(\d+)$/', $ar_buf[0], $intf); + $prefix = $intf[1] . ':' . $intf[2] . ':' . $intf[1] . $intf[2] . ':'; + $cnt = $this->kstat($prefix . 'drop'); + + if ($cnt > 0) { + $results[$ar_buf[0]]['rx_drop'] = $cnt; + } + $cnt = $this->kstat($prefix . 'obytes64'); + + if ($cnt > 0) { + $results[$ar_buf[0]]['tx_bytes'] = $cnt; + } + $cnt = $this->kstat($prefix . 'rbytes64'); + + if ($cnt > 0) { + $results[$ar_buf[0]]['rx_bytes'] = $cnt; + } + } + } + return $results; + } + + function memory () { + $results['devswap'] = array(); + + $results['ram'] = array(); + + $pagesize = $this->kstat('unix:0:seg_cache:slab_size'); + $results['ram']['total'] = $this->kstat('unix:0:system_pages:pagestotal') * $pagesize / 1024; + $results['ram']['used'] = $this->kstat('unix:0:system_pages:pageslocked') * $pagesize / 1024; + $results['ram']['free'] = $this->kstat('unix:0:system_pages:pagesfree') * $pagesize / 1024; + $results['ram']['shared'] = 0; + $results['ram']['buffers'] = 0; + $results['ram']['cached'] = 0; + + $results['ram']['t_used'] = $results['ram']['used'] - $results['ram']['cached'] - $results['ram']['buffers']; + $results['ram']['t_free'] = $results['ram']['total'] - $results['ram']['t_used']; + $results['ram']['percent'] = round(($results['ram']['used'] * 100) / $results['ram']['total']); + + $results['swap'] = array(); + $results['swap']['total'] = $this->kstat('unix:0:vminfo:swap_avail') / 1024 / 1024; + $results['swap']['used'] = $this->kstat('unix:0:vminfo:swap_alloc') / 1024 / 1024; + $results['swap']['free'] = $this->kstat('unix:0:vminfo:swap_free') / 1024 / 1024; + $results['swap']['percent'] = round(($ar_buf[1] * 100) / $ar_buf[0]); + $results['swap']['percent'] = round(($results['swap']['used'] * 100) / $results['swap']['total']); + return $results; + } + + function filesystems () { + $df = execute_program('df', '-k'); + $mounts = split("\n", $df); + + $dftypes = execute_program('df', '-n'); + $mounttypes = split("\n", $dftypes); + + for ($i = 1, $j = 0, $max = sizeof($mounts); $i < $max; $i++) { + $ar_buf = preg_split('/\s+/', $mounts[$i], 6); + $ty_buf = split(':', $mounttypes[$i-1], 2); + + if (hide_mount($ar_buf[5])) { + continue; + } + + $results[$j] = array(); + + $results[$j]['disk'] = $ar_buf[0]; + $results[$j]['size'] = $ar_buf[1]; + $results[$j]['used'] = $ar_buf[2]; + $results[$j]['free'] = $ar_buf[3]; + $results[$j]['percent'] = round(($results[$j]['used'] * 100) / $results[$j]['size']); + $results[$j]['mount'] = $ar_buf[5]; + $results[$j]['fstype'] = $ty_buf[1]; + $j++; + } + return $results; + } + + function distro () { + $result = 'SunOS'; + return($result); + } + + function distroicon () { + $result = 'SunOS.png'; + return($result); + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.WINNT.inc.bak.php b/oss/vtiger/trunk/modules/System/includes/os/class.WINNT.inc.bak.php new file mode 100644 index 00000000..91906a4f --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.WINNT.inc.bak.php @@ -0,0 +1,295 @@ +wmi = new COM("WinMgmts:\\\\."); + } + // get our apache SERVER_NAME or vhost + function vhostname () + { + if (! ($result = getenv('SERVER_NAME'))) { + $result = 'N.A.'; + } + return $result; + } + // get our canonical hostname + function chostname () + { + if (! ($result = getenv('SERVER_NAME'))) { + $result = 'N.A.'; + } + return $result; + } + // get the IP address of our canonical hostname + function ip_addr () + { + if (!($result = getenv('SERVER_ADDR'))) { + $result = 'N.A.'; + } + return $result; + } + + function kernel () + { + $objInstance = $this->wmi->InstancesOf("Win32_OperatingSystem"); + foreach ($objInstance as $obj) { + $result = $obj->Version; + if ($obj->ServicePackMajorVersion > 0) { + $result .= ' SP' . $obj->ServicePackMajorVersion; + } + } + return $result; + } + + function uptime () + { + $objInstance = $this->wmi->InstancesOf("Win32_OperatingSystem"); + foreach ($objInstance as $obj) { + $result = 0; + + $year = intval(substr($obj->LastBootUpTime, 0, 4)); + $month = intval(substr($obj->LastBootUpTime, 4, 2)); + $day = intval(substr($obj->LastBootUpTime, 6, 2)); + $hour = intval(substr($obj->LastBootUpTime, 8, 2)); + $minute = intval(substr($obj->LastBootUpTime, 10, 2)); + $seconds = intval(substr($obj->LastBootUpTime, 12, 2)); + + $boottime = mktime($hour, $minute, $seconds, $month, $day, $year); + + $diff_seconds = mktime() - $boottime; + + $result = $diff_seconds; + } + return $result; + } + + function users () + { + $objInstance = $this->wmi->InstancesOf("Win32_PerfRawData_TermService_TerminalServices"); + foreach ($objInstance as $obj) { + return $obj->TotalSessions; + } + } + + function loadavg () + { + $objInstance = $this->wmi->InstancesOf("Win32_Processor"); + + $cpuload = array(); + foreach ($objInstance as $obj) { + $cpuload[] = $obj->LoadPercentage; + } + // while + return $cpuload; + } + + function cpu_info () + { + $objInstance = $this->wmi->InstancesOf("Win32_Processor"); + + foreach ($objInstance as $obj) { + // still need bogomips (wtf are bogomips?) + $results['cpus'] = getenv('NUMBER_OF_PROCESSORS'); + $results['model'] = $obj->Name; + $results['cache'] = $obj->L2CacheSize; + $results['mhz'] = $obj->CurrentClockSpeed . "/" . $obj->ExtClock; + } + return $results; + } + + function pci () + { + $objInstance = $this->wmi->InstancesOf("Win32_PnPEntity"); + + $pci = array(); + foreach ($objInstance as $obj) { + if (substr($obj->PNPDeviceID, 0, 4) == "PCI\\") { + $pci[] = $obj->Name; + } + } // while + return $pci; + } + + function ide () + { + $objInstance = $this->wmi->InstancesOf("Win32_PnPEntity"); + + $ide = array(); + foreach ($objInstance as $obj) { + if (substr($obj->PNPDeviceID, 0, 4) == "IDE\\") { + $ide[]['model'] = $obj->Name; + } + } // while + return $ide; + } + + function scsi () + { + $objInstance = $this->wmi->InstancesOf("Win32_PnPEntity"); + + $scsi = array(); + foreach ($objInstance as $obj) { + if (substr($obj->PNPDeviceID, 0, 5) == "SCSI\\") { + $scsi[] = $obj->Name; + } + } // while + return $scsi; + } + + function usb () + { + $objInstance = $this->wmi->InstancesOf("Win32_PnPEntity"); + + $usb = array(); + foreach ($objInstance as $obj) { + if (substr($obj->PNPDeviceID, 0, 4) == "USB\\") { + $usb[] = $obj->Name; + } + } // while + return $usb; + } + + function sbus () + { + $objInstance = $this->wmi->InstancesOf("Win32_PnPEntity"); + + $sbus = array(); + foreach ($objInstance as $obj) { + if (substr($obj->PNPDeviceID, 0, 5) == "SBUS\\") { + $sbus[] = $obj->Name; + } + } // while + return $sbus; + } + + function network () + { + /** + * need this for documentation in case i find some better net stats + * $results[$dev_name]['rx_bytes'] = $stats[0]; + * $results[$dev_name]['rx_packets'] = $stats[1]; + * $results[$dev_name]['rx_errs'] = $stats[2]; + * $results[$dev_name]['rx_drop'] = $stats[3]; + * + * $results[$dev_name]['tx_bytes'] = $stats[8]; + * $results[$dev_name]['tx_packets'] = $stats[9]; + * $results[$dev_name]['tx_errs'] = $stats[10]; + * $results[$dev_name]['tx_drop'] = $stats[11]; + * + * $results[$dev_name]['errs'] = $stats[2] + $stats[10]; + * $results[$dev_name]['drop'] = $stats[3] + $stats[11]; + */ + + $objInstance = $this->wmi->InstancesOf("Win32_PerfRawData_Tcpip_NetworkInterface"); + + $results = array(); + foreach ($objInstance as $obj) { + $results[$obj->Name]['errs'] = $obj->PacketsReceivedErrors; + $results[$obj->Name]['drop'] = $obj->PacketsReceivedDiscarded; + } // while + return $results; + } + + function memory () + { + $objInstance = $this->wmi->InstancesOf("Win32_LogicalMemoryConfiguration"); + foreach ($objInstance as $obj) { + $results['ram']['total'] = $obj->TotalPhysicalMemory; + } + $objInstance = $this->wmi->InstancesOf("Win32_PerfRawData_PerfOS_Memory"); + foreach ($objInstance as $obj) { + $results['ram']['free'] = $obj->AvailableKBytes; + } + $results['ram']['used'] = $results['ram']['total'] - $results['ram']['free']; + $results['ram']['t_used'] = $results['ram']['used']; + $results['ram']['t_free'] = $results['ram']['total'] - $results['ram']['t_used']; + $results['ram']['percent'] = round(($results['ram']['t_used'] * 100) / $results['ram']['total']); + + $results['swap']['total'] = 0; + $results['swap']['used'] = 0; + $results['swap']['free'] = 0; + + $objInstance = $this->wmi->InstancesOf("Win32_PageFileUsage"); + + $k = 0; + foreach ($objInstance as $obj) { + $results['devswap'][$k]['dev'] = $obj->Name; + $results['devswap'][$k]['total'] = $obj->AllocatedBaseSize * 1024; + $results['devswap'][$k]['used'] = $obj->CurrentUsage * 1024; + $results['devswap'][$k]['free'] = ($obj->AllocatedBaseSize - $obj->CurrentUsage) * 1024; + $results['devswap'][$k]['percent'] = $obj->CurrentUsage / $obj->AllocatedBaseSize; + + $results['swap']['total'] += $results['devswap'][$k]['total']; + $results['swap']['used'] += $results['devswap'][$k]['used']; + $results['swap']['free'] += $results['devswap'][$k]['free']; + $k += 1; + } + + $results['swap']['percent'] = round($results['swap']['used'] / $results['swap']['total'] * 100); + + return $results; + } + + function filesystems () + { + $objInstance = $this->wmi->InstancesOf("Win32_LogicalDisk"); + + $k = 0; + foreach ($objInstance as $obj) { + $results[$k]['mount'] = $obj->Name; + $results[$k]['size'] = $obj->Size / 1024; + $results[$k]['used'] = ($obj->Size - $obj->FreeSpace) / 1024; + $results[$k]['free'] = $obj->FreeSpace / 1024; + $results[$k]['percent'] = round($results[$k]['used'] / $results[$k]['size'] * 100); + $results[$k]['fstype'] = $obj->FileSystem; + + $typearray = array("Unknown", "No Root Directory", "Removeable Disk", + "Local Disk", "Network Drive", "Compact Disc", "RAM Disk"); + $floppyarray = array("Unknown", "5 1/4 in.", "3 1/2 in.", "3 1/2 in.", + "3 1/2 in.", "3 1/2 in.", "5 1/4 in.", "5 1/4 in.", "5 1/4 in.", + "5 1/4 in.", "5 1/4 in.", "Other", "HD", "3 1/2 in.", "3 1/2 in.", + "5 1/4 in.", "5 1/4 in.", "3 1/2 in.", "3 1/2 in.", "5 1/4 in.", + "3 1/2 in.", "3 1/2 in.", "8 in."); + + $results[$k]['disk'] = $typearray[$obj->DriveType]; + if ($obj->DriveType == 2) $results[$k]['disk'] .= " (" . $floppyarray[$obj->MediaType] . ")"; + $k += 1; + } + + return $results; + } + + function distro () + { + $objInstance = $this->wmi->InstancesOf("Win32_OperatingSystem"); + foreach ($objInstance as $obj) { + return $obj->Caption; + } + } + + function distroicon () + { + return 'xp.gif'; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.WINNT.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.WINNT.inc.php new file mode 100644 index 00000000..330e3391 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.WINNT.inc.php @@ -0,0 +1,315 @@ +wmi = $objLocator->ConnectServer(); + } else{ + $this->wmi = $objLocator->ConnectServer($strHostname, "rootcimv2", "$strHostname\$strUser", $strPassword); + } + } + + // private function for getting a list of values in the specified context, optionally filter this list, based on the list from second parameter + function _GetWMI($strClass, $strValue = array() ) { + $objWEBM = $this->wmi->Get($strClass); + + if( PHP_VERSION < 5 ) { + $objProp = $objWEBM->Properties_; + $arrProp = $objProp->Next($objProp->Count); + $objWEBMCol = $objWEBM->Instances_(); + $arrWEBMCol = $objWEBMCol->Next($objWEBMCol->Count); + } else { + $arrProp = $objWEBM->Properties_; + $arrWEBMCol = $objWEBM->Instances_(); + } + + foreach($arrWEBMCol as $objItem) + { + @reset($arrProp); + $arrInstance = array(); + foreach($arrProp as $propItem) + { + eval("\$value = \$objItem->" .$propItem->Name .";"); + if( empty( $strValue ) ) { + $arrInstance[$propItem->Name] = trim($value); + } else { + if( in_array( $propItem->Name, $strValue ) ) { + $arrInstance[$propItem->Name] = trim($value); + } + } + } + $arrData[] = $arrInstance; + } + return $arrData; + } + + // private function for getting different device types from the system + function _devicelist ( $strType ) { + if( empty( $this->wmidevices ) ) { + $this->wmidevices = $this->_GetWMI( "Win32_PnPEntity", array( "Name", "PNPDeviceID" ) ); + } + + $list = array(); + foreach ( $this->wmidevices as $device ) { + if ( substr( $device["PNPDeviceID"], 0, strpos( $device["PNPDeviceID"], "\\" ) + 1 ) == ( $strType . "\\" ) ) { + $list[] = $device["Name"]; + } + } + + return $list; + } + + // get our canonical hostname + function chostname () + { + $buffer = $this->_GetWMI( "Win32_ComputerSystem", array( "Name" ) ); + $result = $buffer[0]["Name"]; + return gethostbyaddr(gethostbyname($result)); + } + + // get the IP address of our canonical hostname + function ip_addr () + { + $buffer = $this->_GetWMI( "Win32_ComputerSystem", array( "Name" ) ); + $result = $buffer[0]["Name"]; + return gethostbyname($result); + } + + function kernel () + { + $buffer = $this->_GetWMI( "Win32_OperatingSystem", array( "Version", "ServicePackMajorVersion" ) ); + $result = $buffer[0]["Version"]; + if( $buffer[0]["ServicePackMajorVersion"] > 0 ) { + $result .= " SP" . $buffer[0]["ServicePackMajorVersion"]; + } + return $result; + } + + // get the time the system is running + function uptime () + { + $result = 0; + $buffer = $this->_GetWMI( "Win32_OperatingSystem", array( "LastBootUpTime" ) ); + + $year = intval(substr($buffer[0]["LastBootUpTime"], 0, 4)); + $month = intval(substr($buffer[0]["LastBootUpTime"], 4, 2)); + $day = intval(substr($buffer[0]["LastBootUpTime"], 6, 2)); + $hour = intval(substr($buffer[0]["LastBootUpTime"], 8, 2)); + $minute = intval(substr($buffer[0]["LastBootUpTime"], 10, 2)); + $seconds = intval(substr($buffer[0]["LastBootUpTime"], 12, 2)); + + $hour -= date("Z") / 60 / 60; // GMT-Offset + + $boottime = mktime($hour, $minute, $seconds, $month, $day, $year); + + $result = mktime() - $boottime; + + return $result; + } + + // count the users, which are logged in + function users () + { + if( !stristr( $this->kernel(), "2000 P" ) ) return "N.A."; + $buffer = $this->_GetWMI( "Win32_PerfRawData_TermService_TerminalServices", array( "TotalSessions" ) ); + return $buffer[0]["TotalSessions"]; + } + + // get the load of the processors + function loadavg ($bar = false) + { + $buffer = $this->_GetWMI( "Win32_Processor", array( "LoadPercentage" ) ); + $cpuload = array(); + for( $i = 0; $i < count( $buffer ); $i++ ) { + $cpuload['avg'][] = $buffer[$i]["LoadPercentage"]; + } + if ($bar) { + $cpuload['cpupercent'] = array_sum( $cpuload['avg'] ) / count( $buffer ); + } + return $cpuload; + } + + // get some informations about the cpu's + function cpu_info () + { + $buffer = $this->_GetWMI( "Win32_Processor", array( "Name", "L2CacheSize", "CurrentClockSpeed", "ExtClock" ) ); + $results["cpus"] = 0; + foreach ($buffer as $cpu) { + $results["cpus"]++; + $results["model"] = $cpu["Name"]; + $results["cache"] = $cpu["L2CacheSize"]; + $results["cpuspeed"] = $cpu["CurrentClockSpeed"]; + $results["busspeed"] = $cpu["ExtClock"]; + } + return $results; + } + + // get the pci devices from the system + function pci () + { + $pci = $this->_devicelist( "PCI" ); + return $pci; + } + + // get the ide devices from the system + function ide () + { + $buffer = $this->_devicelist( "IDE" ); + $ide = array(); + foreach ( $buffer as $device ) { + $ide[]['model'] = $device; + } + return $ide; + } + + // get the scsi devices from the system + function scsi () + { + $scsi = $this->_devicelist( "SCSI" ); + return $scsi; + } + + // get the usb devices from the system + function usb () + { + $usb = $this->_devicelist( "USB" ); + return $usb; + } + + // get the sbus devices from the system - currently not called + function sbus () + { + $sbus = $this->_devicelist( "SBUS" ); + return $sbus; + } + + // get the netowrk devices and rx/tx bytes + function network () + { + $buffer = $this->_GetWMI( "Win32_PerfRawData_Tcpip_NetworkInterface" ); + $results = array(); + foreach ( $buffer as $device ) { + $dev_name = $device["Name"]; + // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_perfrawdata_tcpip_networkinterface.asp + $results[$dev_name]['rx_bytes'] = $device["BytesReceivedPersec"]; + $results[$dev_name]['rx_packets'] = $device["PacketsReceivedPersec"]; + $results[$dev_name]['rx_errs'] = $device["PacketsReceivedErrors"]; + $results[$dev_name]['rx_drop'] = $device["PacketsReceivedDiscarded"]; + + $results[$dev_name]['tx_bytes'] = $device["BytesSentPersec"]; + $results[$dev_name]['tx_packets'] = $device["PacketsSentPersec"]; + + $results[$dev_name]['errs'] = $device["PacketsReceivedErrors"]; + $results[$dev_name]['drop'] = $device["PacketsReceivedDiscarded"]; + } + return $results; + } + + function memory () + { + $buffer = $this->_GetWMI( "Win32_LogicalMemoryConfiguration", array( "TotalPhysicalMemory" ) ); + $results['ram']['total'] = $buffer[0]["TotalPhysicalMemory"]; + + $buffer = $this->_GetWMI( "Win32_PerfRawData_PerfOS_Memory", array( "AvailableKBytes" ) ); + $results['ram']['free'] = $buffer[0]["AvailableKBytes"]; + + $results['ram']['used'] = $results['ram']['total'] - $results['ram']['free']; + $results['ram']['t_used'] = $results['ram']['used']; + $results['ram']['t_free'] = $results['ram']['total'] - $results['ram']['t_used']; + $results['ram']['percent'] = ceil( ( $results['ram']['t_used'] * 100 ) / $results['ram']['total'] ); + $results['swap']['total'] = 0; + $results['swap']['used'] = 0; + $results['swap']['free'] = 0; + + $buffer = $this->_GetWMI( "Win32_PageFileUsage" ); // no need to filter, using nearly everything from output + $k = 0; + foreach ($buffer as $swapdevice) { + $results['devswap'][$k]['dev'] = $swapdevice["Name"]; + $results['devswap'][$k]['total'] = $swapdevice["AllocatedBaseSize"] * 1024; + $results['devswap'][$k]['used'] = $swapdevice["CurrentUsage"] * 1024; + $results['devswap'][$k]['free'] = ( $swapdevice["AllocatedBaseSize"] - $swapdevice["CurrentUsage"] ) * 1024; + $results['devswap'][$k]['percent'] = ceil( $swapdevice["CurrentUsage"] / $swapdevice["AllocatedBaseSize"] ); + + $results['swap']['total'] += $results['devswap'][$k]['total']; + $results['swap']['used'] += $results['devswap'][$k]['used']; + $results['swap']['free'] += $results['devswap'][$k]['free']; + $k += 1; + } + $results['swap']['percent'] = ceil( $results['swap']['used'] / $results['swap']['total'] * 100 ); + return $results; + } + + // get the filesystem informations + function filesystems () + { + $typearray = array("Unknown", "No Root Directory", "Removeable Disk", + "Local Disk", "Network Drive", "Compact Disc", "RAM Disk"); + $floppyarray = array("Unknown", "5 1/4 in.", "3 1/2 in.", "3 1/2 in.", + "3 1/2 in.", "3 1/2 in.", "5 1/4 in.", "5 1/4 in.", "5 1/4 in.", + "5 1/4 in.", "5 1/4 in.", "Other", "HD", "3 1/2 in.", "3 1/2 in.", + "5 1/4 in.", "5 1/4 in.", "3 1/2 in.", "3 1/2 in.", "5 1/4 in.", + "3 1/2 in.", "3 1/2 in.", "8 in."); + + $buffer = $this->_GetWMI( "Win32_LogicalDisk" , array( "Name", "Size", "FreeSpace", "FileSystem", "DriveType", "MediaType" ) ); + + $k = 0; + foreach ( $buffer as $filesystem ) { + if ( hide_mount( $filesystem["Name"] ) ) { + continue; + } + $results[$k]['mount'] = $filesystem["Name"]; + $results[$k]['size'] = $filesystem["Size"] / 1024; + $results[$k]['used'] = ( $filesystem["Size"] - $filesystem["FreeSpace"] ) / 1024; + $results[$k]['free'] = $filesystem["FreeSpace"] / 1024; + @$results[$k]['percent'] = ceil( $results[$k]['used'] / $results[$k]['size'] * 100 ); // silence this line, nobody is having a floppy in the drive everytime + $results[$k]['fstype'] = $filesystem["FileSystem"]; + $results[$k]['disk'] = $typearray[$filesystem["DriveType"]]; + if ( $filesystem["DriveType"] == 2 ) $results[$k]['disk'] .= " (" . $floppyarray[$filesystem["MediaType"]] . ")"; + $k += 1; + } + return $results; + } + + function distro () + { + $buffer = $this->_GetWMI( "Win32_OperatingSystem", array( "Caption" ) ); + return $buffer[0]["Caption"]; + } + + function distroicon () + { + return 'xp.gif'; + } +} + +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/class.parseProgs.inc.php b/oss/vtiger/trunk/modules/System/includes/os/class.parseProgs.inc.php new file mode 100644 index 00000000..2f6ae78b --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/os/class.parseProgs.inc.php @@ -0,0 +1,133 @@ +debug)) { + $lines = split("\n", $_results); + for ($i = 0, $max = sizeof($lines); $i < $max; $i++) { + list($addr, $name) = explode(' ', trim($lines[$i]), 2); + //if (!preg_match('/bridge/i', $name) && !preg_match('/USB/i', $name)) { + // remove all the version strings + $name = preg_replace('/\(.*\)/', '', $name); + // is addr really usefull for this??? i think it's not + // $results[] = $addr . ' ' . $name; + $results[] = $name; + //} + } + } + + if( empty( $results ) ) { + return false; + } else { + asort( $results ); + return $results; + } + } + + function parse_pciconf() { + + $results = array(); + + if($buf = execute_program("pciconf", "-lv", $this->debug)) { + $buf = explode("\n", $buf); $s = 0; + foreach($buf as $line) { + if (preg_match("/(.*) = '(.*)'/", $line, $strings)) { + if (trim($strings[1]) == "vendor") { + $results[$s] = trim($strings[2]); + } elseif (trim($strings[1]) == "device") { + $results[$s] .= " - " . trim($strings[2]); + $s++; + } + } + } + } + + if( empty( $results ) ) { + return false; + } else { + asort( $results ); + return $results; + } + } + + function parse_filesystems() { + + global $show_bind, $show_inodes; + + $j = 0; + + $df = execute_program('df', '-k' . $this->df_param ); + $df = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); + + if( $show_inodes ) { + $df2 = execute_program('df', '-i' . $this->df_param ); + $df2 = preg_split("/\n/", $df2, -1, PREG_SPLIT_NO_EMPTY); + } + + $mount = execute_program('mount'); + $mount = preg_split("/\n/", $mount, -1, PREG_SPLIT_NO_EMPTY); + + foreach( $df as $df_line) { + $df_buf1 = preg_split("/(\%\s)/", $df_line, 2); + if( count($df_buf1) != 2) { + continue; + } + + preg_match("/(.*)(\s+)(([0-9]+)(\s+)([0-9]+)(\s+)([0-9]+)(\s+)([0-9]+)$)/", $df_buf1[0], $df_buf2); + $df_buf = array($df_buf2[1], $df_buf2[4], $df_buf2[6], $df_buf2[8], $df_buf2[10], $df_buf1[1]); + + if( $show_inodes ) { + preg_match_all("/([0-9]+)%/", $df2[$j + 1], $inode_buf, PREG_SET_ORDER); + } + + if( count($df_buf) == 6 ) { + if( hide_mount( $df_buf[5] ) ) { + continue; + } + + $df_buf[0] = trim( str_replace("\$", "\\$", $df_buf[0] ) ); + $df_buf[5] = trim( $df_buf[5] ); + + $current = 0; + foreach( $mount as $mount_line ) { + $current++; + + if ( preg_match("#" . $df_buf[0] . " on " . $df_buf[5] . " type (.*) \((.*)\)#", $mount_line, $mount_buf) ) { + $mount_buf[1] .= "," . $mount_buf[2]; + } elseif ( !preg_match("#" . $df_buf[0] . "(.*) on " . $df_buf[5] . " \((.*)\)#", $mount_line, $mount_buf) ) { + continue; + } + + if ( $show_bind || !stristr($mount_buf[2], "bind")) { + $results[$j] = array(); + $results[$j]['disk'] = str_replace( "\\$", "\$", $df_buf[0] ); + $results[$j]['size'] = $df_buf[1]; + $results[$j]['used'] = $df_buf[2]; + $results[$j]['free'] = $df_buf[3]; + $results[$j]['percent'] = round(($results[$j]['used'] * 100) / $results[$j]['size']); + $results[$j]['mount'] = $df_buf[5]; + $results[$j]['fstype'] = substr( $mount_buf[1], 0, strpos( $mount_buf[1], "," ) ); + $results[$j]['options'] = substr( $mount_buf[1], strpos( $mount_buf[1], "," ) + 1, strlen( $mount_buf[1] ) ); + if( $show_inodes && isset($inode_buf[ count( $inode_buf ) - 1][1]) ) { + $results[$j]['inodes'] = $inode_buf[ count( $inode_buf ) - 1][1]; + } + $j++; + unset( $mount[$current - 1] ); + sort( $mount ); + break; + } + } + } + } + return $results; + } + +} +?> diff --git a/oss/vtiger/trunk/modules/System/includes/os/index.html b/oss/vtiger/trunk/modules/System/includes/os/index.html new file mode 100644 index 00000000..e69de29b diff --git a/oss/vtiger/trunk/modules/System/includes/system_footer.php b/oss/vtiger/trunk/modules/System/includes/system_footer.php new file mode 100644 index 00000000..fc33a5d1 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/includes/system_footer.php @@ -0,0 +1,107 @@ +"; + + $update_form = "\n" . "\t" . $text['template'] . ": \n" . "\t"; + $temp_relatedfield['fieldid'] = $related_fieldid; + $temp_relatedfield['fieldname'] = $related_fieldname; + $relatedFieldsArray[] = $temp_relatedfield; + } + + $relatedFieldsArray = array_chunk($relatedFieldsArray, 4); + return $relatedFieldsArray; +} + +/** + * function to get the module names + * @return - all module names other than Calendar and Events + */ +function moduleList() { + global $adb; + $sql = "select distinct vtiger_field.tabid,name from vtiger_field inner join vtiger_tab on vtiger_field.tabid=vtiger_tab.tabid where name not in ('Calendar','Events','Users')"; + $result = $adb->pquery($sql, array ()); + while ($moduleinfo = $adb->fetch_array($result)) { + $modulelist[$moduleinfo['name']] = getTranslatedString($moduleinfo['name']); + } + return $modulelist; +} + +/** + * this function determines if a given field has the related field already present in the tooltip + */ +function tooltip_exists($fieldid, $related_fieldid) { + global $adb; + $query = "select * from vtiger_quickview where fieldid=? and related_fieldid=?"; + $result = $adb->pquery($query, array ($fieldid,$related_fieldid)); + + if ($adb->num_rows($result) > 0) { + return true; + } else { + return false; + } +} + +/** + * function to return the tooltip information + * @param int $view - there can be multiple tooltips for a single module; this variable decides which is for which field + * @param int $tabid - tabid of the field for which the tooltip has to be fetched + * @param int $id - this is the crmid of the record + * returns the tooltip string + */ +function getToolTipText($view,$fieldname,$module,$value){ + global $adb,$app_strings; + $keys = array_keys($value[0]); + //getting the quickview list here + $fieldlabel = Array(); + $fieldid = getFieldid(getTabid($module), $fieldname); + $quickview = 'select fieldname,fieldlabel from vtiger_quickview inner join vtiger_field on vtiger_quickview.related_fieldid=vtiger_field.fieldid where vtiger_quickview.fieldid = ? and currentview= ? and vtiger_field.presence in (0,2) order by vtiger_quickview.sequence'; + $result = $adb->pquery($quickview,array($fieldid,$view)); + $count = $adb->num_rows($result); + + $text=''; + $fieldname = Array(); + for($i=0;$i<$count;$i++){ + $fieldname = $adb->query_result($result,$i,"fieldname"); + + if(in_array($fieldname, $keys)){ + $fieldlabel = $adb->query_result($result,$i,"fieldlabel"); + $label = getTranslatedString($fieldlabel); + $fieldvalue = $value[0][$fieldname]; + if(strlen($fieldvalue)>35){ + $fieldvalue = substr($fieldvalue,0,35).'...'; + } + $text[$label] = $fieldvalue; + } + } + return $text; +} + +/** + * this function accepts the tooltip text and returns it after formatting + * @param $text - the tooltip text which is to be formatted + * @param $format - the format in which tooltip has to be formatted; default value will be each entry in single line + */ +function getToolTip($text,$format = "default"){ + require_once('Smarty_setup.php'); + $smarty = new vtigerCRM_Smarty; + $tip = ""; + + if(trim($text) == ""){ + return $tip; + } + + $smarty->assign("TEXT",$text); + $tip = $smarty->fetch("modules/Tooltip/$format.tpl"); + return $tip; +} + +/** + * this function checks if tooltip exists for a given field or not + */ +function ToolTipExists($fieldname,$tabid){ + if(empty($fieldname) || empty($tabid)){ + return false; + }else{ + global $adb; + $sql = "select fieldid from vtiger_field where tabid = ? and fieldname = ? and vtiger_field.presence in (0,2)"; + $result = $adb->pquery($sql,array($tabid,$fieldname)); + $count = $adb->num_rows($result); + if($count > 0){ + $fieldid = $adb->query_result($result,0,'fieldid'); + + $sql = "select * from vtiger_quickview where fieldid = ?"; + $result = $adb->pquery($sql, array($fieldid)); + + if($adb->num_rows($result) > 0){ + return $fieldid; + }else{ + return false; + } + }else{ + return false; + } + } +} + +/** + * this function processes the given result and returns the value :: for now we are getting the values for the + * reference, owner fields, booleans and currency fields; other processing might be added later if required + * @param array $result - the webservices result object + * @param array $descObj - the webservices describe object + * @return array $result - the processes webservices result object + */ +function vttooltip_processResult($result, $descObj){ + global $current_user; + foreach($descObj['fields'] as $field){ + if($field['type']['name'] == 'reference'){ + $name = $field['name']; + $value = $result[0][$name]; + + if(!empty($value)){ + $result[0][$name] = vtws_getName($value,$current_user); + }else{ + $result[0][$name] = ''; + } + }elseif($field['type']['name'] == 'owner'){ + $name = $field['name']; + $value = $result[0][$name]; + list($info, $id) = explode("x",$value); + $result[0][$name] = getOwnerName($id); + }elseif($field['type']['name'] == 'boolean'){ + $name = $field['name']; + if($result[0][$name] == 1){ + $result[0][$name] = "on"; + }else{ + $result[0][$name] = "off"; + } + }elseif($field['type']['name'] == 'picklist'){ + $name = $field['name']; + $temp = ''; + foreach($field['type']['picklistValues'] as $value){ + if(strcmp($value['value'],$result[0][$name])== 0){ + $temp = $value['value']; + } + } + $result[0][$name] = $temp; + } + } + return $result; +} + + +/** + * this function returns the fields for a given module in a select dropdown format + * @param string $module - the module name + * @return the fields in a select dropdown if fields exist else a blank value + */ +function QuickViewFieldList($module){ + global $adb, $app_strings,$mod_strings; + + $tabid = getTabid($module); + + $query = "select * from vtiger_field where tabid = ? and columnname not like 'imagename' and uitype not in (61, 122) and vtiger_field.presence in (0,2)"; + $result = $adb->pquery($query,array($tabid)); + if($adb->num_rows($result)>0){ + $fieldlist = ''; + return $fieldlist; + }else{ + return ''; + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Tooltip/index.php b/oss/vtiger/trunk/modules/Tooltip/index.php new file mode 100644 index 00000000..0b11eea8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Tooltip/index.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Tooltip/language/en_us.lang.php b/oss/vtiger/trunk/modules/Tooltip/language/en_us.lang.php new file mode 100644 index 00000000..fe62bea2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Tooltip/language/en_us.lang.php @@ -0,0 +1,22 @@ + 'ToolTip', +'LBL_TOOLTIP_MANAGEMENT'=>'Tooltip Management', +'LBL_TOOLTIP_MANAGEMENT_DESCRIPTION'=>'Manage the tooltip information from here', +'LBL_FIELDS_IN'=>'Fields in', +'LBL_TOOLTIP_HELP_TEXT'=>'Select the fields that you would like to be displayed as tooltip', +'LBL_FIELD'=>'Field', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Tooltip/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Tooltip/language/zh_cn.lang.php new file mode 100644 index 00000000..1a531b92 --- /dev/null +++ b/oss/vtiger/trunk/modules/Tooltip/language/zh_cn.lang.php @@ -0,0 +1,22 @@ + '提示板', +'LBL_TOOLTIP_MANAGEMENT'=>'提示板管理', +'LBL_TOOLTIP_MANAGEMENT_DESCRIPTION'=>'从这里管理提示板工具', +'LBL_FIELDS_IN'=>'字段', +'LBL_TOOLTIP_HELP_TEXT'=>'选择字段,选中项将在提示板上显示', +'LBL_FIELD'=>'字段', + +); + +?> diff --git a/oss/vtiger/trunk/modules/Tooltip/schema.xml b/oss/vtiger/trunk/modules/Tooltip/schema.xml new file mode 100644 index 00000000..316b6b26 --- /dev/null +++ b/oss/vtiger/trunk/modules/Tooltip/schema.xml @@ -0,0 +1,16 @@ + + + + + vtiger_quickview + +
      +
      +
      diff --git a/oss/vtiger/trunk/modules/Users/AddMailAccount.php b/oss/vtiger/trunk/modules/Users/AddMailAccount.php new file mode 100644 index 00000000..ad404c0f --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/AddMailAccount.php @@ -0,0 +1,115 @@ +assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +if(isset($_REQUEST['record']) && $_REQUEST['record']!='') +{ + $sql = "select * from vtiger_mail_accounts where user_id=?"; + $result = $adb->pquery($sql, array($_REQUEST['record'])); + $rowcount = $adb->num_rows($result); + + if ($rowcount!=0) + { + while($temprow = $adb->fetchByAssoc($result)) + { + $smarty->assign("DISPLAYNAME", $temprow['display_name']); + $smarty->assign("ID", $temprow['user_id']); + $smarty->assign("EMAIL", $temprow['mail_id']); + $smarty->assign("ACCOUNTNAME", $temprow['account_name']); + $smarty->assign($temprow['mail_protocol'],$temprow['mail_protocol']); + $smarty->assign("SERVERUSERNAME", $temprow['mail_username']); + $smarty->assign("SERVERPASSWORD", $temprow['mail_password']); + $smarty->assign("SERVERNAME", $temprow['mail_servername']); + $smarty->assign("RECORD_ID", $temprow['account_id']); + $smarty->assign("BOX_REFRESH", $temprow['box_refresh']); + $smarty->assign("MAILS_PER_PAGE", $temprow['mails_per_page']); + $smarty->assign("EDIT", "TRUE"); + + if(strtolower($temprow['mail_protocol']) == "imap") + $smarty->assign("IMAP", "CHECKED"); + if(strtolower($temprow['mail_protocol']) == "imap2") + $smarty->assign("IMAP2", "CHECKED"); + if(strtolower($temprow['mail_protocol']) == "imap4") + $smarty->assign("IMAP4", "CHECKED"); + if(strtolower($temprow['mail_protocol']) == "imap4rev1") + $smarty->assign("IMAP4R1", "CHECKED"); + if(strtolower($temprow['mail_protocol']) == "pop3") + $smarty->assign("POP3", "CHECKED"); + + if(strtolower($temprow['ssltype']) == "notls") + $smarty->assign("NOTLS", "CHECKED"); + if(strtolower($temprow['ssltype']) == "tls") + $smarty->assign("TLS", "CHECKED"); + if(strtolower($temprow['ssltype']) == "ssl") + $smarty->assign("SSL", "CHECKED"); + if(strtolower($temprow['sslmeth']) == "validate-cert") + $smarty->assign("VALIDATECERT", "CHECKED"); + if(strtolower($temprow['sslmeth']) == "novalidate-cert") + $smarty->assign("NOVALIDATECERT", "CHECKED"); + + if($temprow['int_mailer'] == "1") + $smarty->assign("INT_MAILER_USE", "CHECKED"); + else + $smarty->assign("INT_MAILER_NOUSE", "CHECKED"); + if(strtolower($temprow['box_refresh']) == "60000") + $smarty->assign("BOX_OPT1", " SELECTED"); + if(strtolower($temprow['box_refresh']) == "120000") + $smarty->assign("BOX_OPT2", " SELECTED"); + if(strtolower($temprow['box_refresh']) == "180000") + $smarty->assign("BOX_OPT3", " SELECTED"); + if(strtolower($temprow['box_refresh']) == "240000") + $smarty->assign("BOX_OPT4", " SELECTED"); + if(strtolower($temprow['box_refresh']) == "300000") + $smarty->assign("BOX_OPT5", " SELECTED"); + } + } +} +$qry_res = $adb->pquery("select * from vtiger_mail_accounts where user_id=?", array($current_user->id)); +$count = $adb->num_rows($qry_res); +if($count > 0) + $field = '';//""; +else + $field = ''; +$smarty->assign('CHANGE_PW_BUTTON',$field); + +$return_module = vtlib_purify($_REQUEST['return_module']); +if(empty($return_module)) $return_module = 'Settings'; +else $return_module = htmlspecialchars($return_module, ENT_QUOTES, $default_charset); + +$return_action = vtlib_purify($_REQUEST['return_action']); +if(empty($return_action)) $return_action = 'index'; +else $return_action = htmlspecialchars($return_action, ENT_QUOTES, $default_charset); + +$smarty->assign("RETURN_MODULE",$return_module); +$smarty->assign("RETURN_ACTION",$return_action); +$smarty->assign("JAVASCRIPT", get_validate_record_js()); +$smarty->assign("USERID", $current_user->id); + +$smarty->display('AddMailAccount.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/Announcements.php b/oss/vtiger/trunk/modules/Users/Announcements.php new file mode 100644 index 00000000..59aeb2ee --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Announcements.php @@ -0,0 +1,36 @@ +pquery($query, array($current_user->id)); +$announcement=$adb->query_result($result,0,'announcement'); +$title_prev=$adb->query_result($result,0,'title'); +$id=$adb->query_result($result,0,'creatorid'); + +$smarty = new vtigerCRM_Smarty; + +$smarty->assign("ANNOUNCE",$announcement); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); + +$smarty->display("Settings/Announcements.tpl"); + +?> diff --git a/oss/vtiger/trunk/modules/Users/Authenticate.php b/oss/vtiger/trunk/modules/Users/Authenticate.php new file mode 100644 index 00000000..42fc5daf --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Authenticate.php @@ -0,0 +1,145 @@ +column_fields["user_name"] = to_html($_REQUEST['user_name']); +$user_password = vtlib_purify($_REQUEST['user_password']); + +$focus->load_user($user_password); + +if($focus->is_authenticated()) +{ + + //Inserting entries for audit trail during login + + if($audit_trail == 'true') + { + if($record == '') + $auditrecord = ''; + else + $auditrecord = $record; + + $date_var = $adb->formatDate(date('Y-m-d H:i:s'), true); + $query = "insert into vtiger_audit_trial values(?,?,?,?,?,?)"; + $params = array($adb->getUniqueID('vtiger_audit_trial'), $focus->id, 'Users','Authenticate','',$date_var); + $adb->pquery($query, $params); + } + + + // Recording the login info + $usip=$_SERVER['REMOTE_ADDR']; + $intime=date("Y/m/d H:i:s"); + require_once('modules/Users/LoginHistory.php'); + $loghistory=new LoginHistory(); + $Signin = $loghistory->user_login($focus->column_fields["user_name"],$usip,$intime); + + //Security related entries start + require_once('include/utils/UserInfoUtil.php'); + + createUserPrivilegesfile($focus->id); + + //Security related entries end + session_unregister('login_password'); + session_unregister('login_error'); + session_unregister('login_user_name'); + + $_SESSION['authenticated_user_id'] = $focus->id; + $_SESSION['app_unique_key'] = $application_unique_key; + + // store the user's theme in the session + if (isset($_REQUEST['login_theme'])) { + $authenticated_user_theme = $_REQUEST['login_theme']; + } + elseif (isset($_REQUEST['ck_login_theme'])) { + $authenticated_user_theme = $_REQUEST['ck_login_theme']; + } + else { + $authenticated_user_theme = $default_theme; + } + + // store the user's language in the session + if (isset($_REQUEST['login_language'])) { + $authenticated_user_language = $_REQUEST['login_language']; + } + elseif (isset($_REQUEST['ck_login_language'])) { + $authenticated_user_language = $_REQUEST['ck_login_language']; + } + else { + $authenticated_user_language = $default_language; + } + + // If this is the default user and the default user theme is set to reset, reset it to the default theme value on each login + if($reset_theme_on_default_user && $focus->user_name == $default_user_name) + { + $authenticated_user_theme = $default_theme; + } + if(isset($reset_language_on_default_user) && $reset_language_on_default_user && $focus->user_name == $default_user_name) + { + $authenticated_user_language = $default_language; + } + + $_SESSION['vtiger_authenticated_user_theme'] = $authenticated_user_theme; + $_SESSION['authenticated_user_language'] = $authenticated_user_language; + + $log->debug("authenticated_user_theme is $authenticated_user_theme"); + $log->debug("authenticated_user_language is $authenticated_user_language"); + $log->debug("authenticated_user_id is ". $focus->id); + $log->debug("app_unique_key is $application_unique_key"); + + +// Clear all uploaded import files for this user if it exists + + global $import_dir; + + $tmp_file_name = $import_dir. "IMPORT_".$focus->id; + + if (file_exists($tmp_file_name)) + { + unlink($tmp_file_name); + } + $arr = $_SESSION['lastpage']; + if(isset($_SESSION['lastpage'])) + header("Location: index.php?".$arr[0]); + else + header("Location: index.php"); +} +else +{ + $_SESSION['login_user_name'] = $focus->column_fields["user_name"]; + $_SESSION['login_password'] = $user_password; + $_SESSION['login_error'] = $mod_strings['ERR_INVALID_PASSWORD']; + + // go back to the login screen. + // create an error message for the user. + header("Location: index.php"); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/ChangePassword.php b/oss/vtiger/trunk/modules/Users/ChangePassword.php new file mode 100644 index 00000000..b7d81e15 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/ChangePassword.php @@ -0,0 +1,111 @@ + + + + + + + + + + + +"; + echo "\n"; + echo "\n"; + echo ""; + echo "\n"; +} +else echo ""; +?> + + + + + + + + + +
      ".$mod_strings['LBL_OLD_PASSWORD']."
      +
      + + + + + + + +
      ' accessKey='' class='crmbutton small save' LANGUAGE=javascript onclick='if (set_password(this.form)) window.close(); else return false;' type='submit' name='button' value=' '>' accessyKey='' class='crmbutton small cancel' LANGUAGE=javascript onclick='window.close()' type='submit' name='button' value=' '>
      + +
      + diff --git a/oss/vtiger/trunk/modules/Users/CreateProfile.php b/oss/vtiger/trunk/modules/Users/CreateProfile.php new file mode 100644 index 00000000..d0adb793 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/CreateProfile.php @@ -0,0 +1,68 @@ +pquery($query, array($profilename)); + + if($adb->num_rows($result) > 0) + { + echo $mod_strings['LBL_PROFILENAME_EXIST']; + die; + }else + { + echo 'SUCCESS'; + die; + } + +} + + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty = new vtigerCRM_Smarty; + +if(isset($_REQUEST['parent_profile']) && $_REQUEST['parent_profile'] != '') + $smarty->assign("PARENT_PROFILE",vtlib_purify($_REQUEST['parent_profile'])); +if(isset($_REQUEST['radio_button']) && $_REQUEST['radio_button'] != '') + $smarty->assign("RADIO_BUTTON",vtlib_purify($_REQUEST['radio_button'])); +if(isset($_REQUEST['profile_name']) && $_REQUEST['profile_name'] != '') + $smarty->assign("PROFILE_NAME",vtlib_purify($_REQUEST['profile_name'])); +if(isset($_REQUEST['profile_description']) && $_REQUEST['profile_description'] != '') + $smarty->assign("PROFILE_DESCRIPTION",vtlib_purify($_REQUEST['profile_description'])); +if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != '') + $smarty->assign("MODE",vtlib_purify($_REQUEST['mode'])); + +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); + +$sql = "select * from vtiger_profile"; +$result = $adb->pquery($sql, array()); +$profilelist = array(); +$temprow = $adb->fetch_array($result); +do +{ + $name=$temprow["profilename"]; + $profileid=$temprow["profileid"]; + $profilelist[] = array($name,$profileid); +}while($temprow = $adb->fetch_array($result)); +$smarty->assign("PROFILE_LISTS", $profilelist); +$smarty->display("CreateProfile.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/CreateUserPrivilegeFile.php b/oss/vtiger/trunk/modules/Users/CreateUserPrivilegeFile.php new file mode 100644 index 00000000..7e1551e4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/CreateUserPrivilegeFile.php @@ -0,0 +1,1780 @@ +retrieve_entity_info($userid,"Users"); + $userInfo=Array(); + $user_focus->column_fields["id"] = ''; + $user_focus->id = $userid; + foreach($user_focus->column_fields as $field=>$value_iter) + { + $userInfo[$field]= $user_focus->$field; + } + + if($user_focus->is_admin == 'on') + { + $newbuf .= "\$is_admin=true;\n"; + $newbuf .="\n"; + $newbuf .= "\$user_info=".constructSingleStringKeyValueArray($userInfo).";\n"; + $newbuf .= "\n"; + $newbuf .= "?>"; + fputs($handle, $newbuf); + fclose($handle); + return; + } + else + { + $newbuf .= "\$is_admin=false;\n"; + $newbuf .= "\n"; + + $globalPermissionArr=getCombinedUserGlobalPermissions($userid); + $tabsPermissionArr=getCombinedUserTabsPermissions($userid); + //$tabsPermissionArr=getCombinedUserTabsPermissions($userid); + $actionPermissionArr=getCombinedUserActionPermissions($userid); + $user_role=fetchUserRole($userid); + $user_role_info=getRoleInformation($user_role); + $user_role_parent=$user_role_info[$user_role][1]; + $userGroupFocus=new GetUserGroups(); + $userGroupFocus->getAllUserGroups($userid); + $subRoles=getRoleSubordinates($user_role); + $subRoleAndUsers=getSubordinateRoleAndUsers($user_role); + $def_org_share=getDefaultSharingAction(); + $parentRoles=getParentRole($user_role); + + + + + $newbuf .= "\$current_user_roles='".$user_role."';\n"; + $newbuf .= "\n"; + $newbuf .= "\$current_user_parent_role_seq='".$user_role_parent."';\n"; + $newbuf .= "\n"; + $newbuf .= "\$current_user_profiles=".constructSingleArray(getUserProfile($userid)).";\n"; + $newbuf .= "\n"; + $newbuf .= "\$profileGlobalPermission=".constructArray($globalPermissionArr).";\n"; + $newbuf .="\n"; + $newbuf .= "\$profileTabsPermission=".constructArray($tabsPermissionArr).";\n"; + $newbuf .="\n"; + $newbuf .= "\$profileActionPermission=".constructTwoDimensionalArray($actionPermissionArr).";\n"; + $newbuf .="\n"; + $newbuf .= "\$current_user_groups=".constructSingleArray($userGroupFocus->user_groups).";\n"; + $newbuf .="\n"; + $newbuf .= "\$subordinate_roles=".constructSingleCharArray($subRoles).";\n"; + $newbuf .="\n"; + $newbuf .= "\$parent_roles=".constructSingleCharArray($parentRoles).";\n"; + $newbuf .="\n"; + $newbuf .= "\$subordinate_roles_users=".constructTwoDimensionalCharIntSingleArray($subRoleAndUsers).";\n"; + $newbuf .="\n"; + $newbuf .= "\$user_info=".constructSingleStringKeyValueArray($userInfo).";\n"; + + $newbuf .= "?>"; + fputs($handle, $newbuf); + fclose($handle); + } + } +} + +/** Creates a file with all the organization default sharing permissions and custom sharing permissins specific for the specified user. In this file the information of the other users whose data is shared with the specified user is stored. + * @param $userid -- user id:: Type integer + * @returns sharing_privileges_userid file under the user_privileges directory + */ +function createUserSharingPrivilegesfile($userid) +{ + global $adb, $root_directory; + require('user_privileges/user_privileges_'.$userid.'.php'); + $handle=@fopen($root_directory.'user_privileges/sharing_privileges_'.$userid.'.php',"w+"); + +if($handle) + { + $newbuf=''; + $newbuf .="retrieve_entity_info($userid,"Users"); + if($user_focus->is_admin == 'on') + { + $newbuf .= "\n"; + $newbuf .= "?>"; + fputs($handle, $newbuf); + fclose($handle); + return; + } + else + { + //Constructig the Default Org Share Array + $def_org_share=getAllDefaultSharingAction(); + $newbuf .= "\$defaultOrgSharingPermission=".constructArray($def_org_share).";\n"; + $newbuf .= "\n"; + + //Constructing the Related Module Sharing Array + $relModSharArr=Array(); + $query ="select * from vtiger_datashare_relatedmodules"; + $result=$adb->pquery($query, array()); + $num_rows = $adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $parTabId=$adb->query_result($result,$i,'tabid'); + $relTabId=$adb->query_result($result,$i,'relatedto_tabid'); + if(is_array($relModSharArr[$relTabId])) + { + $temArr=$relModSharArr[$relTabId]; + $temArr[]=$parTabId; + } + else + { + $temArr=Array(); + $temArr[]=$parTabId; + } + $relModSharArr[$relTabId]=$temArr; + } + + $newbuf .= "\$related_module_share=".constructTwoDimensionalValueArray($relModSharArr).";\n\n"; + + //Constructing Lead Sharing Rules + $lead_share_per_array=getUserModuleSharingObjects("Leads",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $lead_share_read_per=$lead_share_per_array['read']; + $lead_share_write_per=$lead_share_per_array['write']; + $lead_sharingrule_members=$lead_share_per_array['sharingrules']; + + $newbuf .= "\$Leads_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($lead_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($lead_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Leads_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($lead_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($lead_share_write_per['GROUP']).");\n\n"; + + //Constructing the Lead Email Related Module Sharing Array + $lead_related_email=getRelatedModuleSharingArray("Leads","Emails",$lead_sharingrule_members,$lead_share_read_per,$lead_share_write_per,$def_org_share); + + $lead_email_share_read_per=$lead_related_email['read']; + $lead_email_share_write_per=$lead_related_email['write']; + + $newbuf .= "\$Leads_Emails_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($lead_email_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($lead_email_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Leads_Emails_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($lead_email_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($lead_email_share_write_per['GROUP']).");\n\n"; + + + + //Constructing Account Sharing Rules + $account_share_per_array=getUserModuleSharingObjects("Accounts",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $account_share_read_per=$account_share_per_array['read']; + $account_share_write_per=$account_share_per_array['write']; + $account_sharingrule_members=$account_share_per_array['sharingrules']; + /*echo '
      ';
      +			print_r($account_share_read_per['GROUP']);
      +			echo '
      ';*/ + $newbuf .= "\$Accounts_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($account_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($account_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Accounts_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($account_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($account_share_write_per['GROUP']).");\n\n"; + + //Constructing Contact Sharing Rules + $newbuf .= "\$Contacts_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($account_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($account_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Contacts_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($account_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($account_share_write_per['GROUP']).");\n\n"; + + + + + + //Constructing the Account Potential Related Module Sharing Array + $acct_related_pot=getRelatedModuleSharingArray("Accounts","Potentials",$account_sharingrule_members,$account_share_read_per,$account_share_write_per,$def_org_share); + + $acc_pot_share_read_per=$acct_related_pot['read']; + $acc_pot_share_write_per=$acct_related_pot['write']; + + $newbuf .= "\$Accounts_Potentials_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_pot_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_pot_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Accounts_Potentials_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_pot_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_pot_share_write_per['GROUP']).");\n\n"; + + //Constructing the Account Ticket Related Module Sharing Array + $acct_related_tkt=getRelatedModuleSharingArray("Accounts","HelpDesk",$account_sharingrule_members,$account_share_read_per,$account_share_write_per,$def_org_share); + + $acc_tkt_share_read_per=$acct_related_tkt['read']; + $acc_tkt_share_write_per=$acct_related_tkt['write']; + + $newbuf .= "\$Accounts_HelpDesk_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_tkt_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_tkt_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Accounts_HelpDesk_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_tkt_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_tkt_share_write_per['GROUP']).");\n\n"; + + //Constructing the Account Email Related Module Sharing Array + $acct_related_email=getRelatedModuleSharingArray("Accounts","Emails",$account_sharingrule_members,$account_share_read_per,$account_share_write_per,$def_org_share); + + $acc_email_share_read_per=$acct_related_email['read']; + $acc_email_share_write_per=$acct_related_email['write']; + + $newbuf .= "\$Accounts_Emails_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_email_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_email_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Accounts_Emails_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_email_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_email_share_write_per['GROUP']).");\n\n"; + + //Constructing the Account Quote Related Module Sharing Array + $acct_related_qt=getRelatedModuleSharingArray("Accounts","Quotes",$account_sharingrule_members,$account_share_read_per,$account_share_write_per,$def_org_share); + + $acc_qt_share_read_per=$acct_related_qt['read']; + $acc_qt_share_write_per=$acct_related_qt['write']; + + $newbuf .= "\$Accounts_Quotes_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_qt_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_qt_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Accounts_Quotes_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_qt_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_qt_share_write_per['GROUP']).");\n\n"; + + //Constructing the Account SalesOrder Related Module Sharing Array + $acct_related_so=getRelatedModuleSharingArray("Accounts","SalesOrder",$account_sharingrule_members,$account_share_read_per,$account_share_write_per,$def_org_share); + + $acc_so_share_read_per=$acct_related_so['read']; + $acc_so_share_write_per=$acct_related_so['write']; + + $newbuf .= "\$Accounts_SalesOrder_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_so_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_so_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Accounts_SalesOrder_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_so_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_so_share_write_per['GROUP']).");\n\n"; + + + //Constructing the Account Invoice Related Module Sharing Array + $acct_related_inv=getRelatedModuleSharingArray("Accounts","Invoice",$account_sharingrule_members,$account_share_read_per,$account_share_write_per,$def_org_share); + + $acc_inv_share_read_per=$acct_related_inv['read']; + $acc_inv_share_write_per=$acct_related_inv['write']; + + $newbuf .= "\$Accounts_Invoice_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_inv_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_inv_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Accounts_Invoice_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($acc_inv_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($acc_inv_share_write_per['GROUP']).");\n\n"; + + + //Constructing Potential Sharing Rules + $pot_share_per_array=getUserModuleSharingObjects("Potentials",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $pot_share_read_per=$pot_share_per_array['read']; + $pot_share_write_per=$pot_share_per_array['write']; + $pot_sharingrule_members=$pot_share_per_array['sharingrules']; + $newbuf .= "\$Potentials_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($pot_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalArray($pot_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Potentials_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($pot_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalArray($pot_share_write_per['GROUP']).");\n\n"; + + //Constructing the Potential Quotes Related Module Sharing Array + $pot_related_qt=getRelatedModuleSharingArray("Potentials","Quotes",$pot_sharingrule_members,$pot_share_read_per,$pot_share_write_per,$def_org_share); + + $pot_qt_share_read_per=$pot_related_qt['read']; + $pot_qt_share_write_per=$pot_related_qt['write']; + + $newbuf .= "\$Potentials_Quotes_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($pot_qt_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($pot_qt_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Potentials_Quotes_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($pot_qt_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($pot_qt_share_write_per['GROUP']).");\n\n"; + + //Constructing the Potential SalesOrder Related Module Sharing Array + $pot_related_inv=getRelatedModuleSharingArray("Potentials","SalesOrder",$pot_sharingrule_members,$pot_share_read_per,$pot_share_write_per,$def_org_share); + + + + $pot_inv_share_read_per=$pot_related_inv['read']; + $pot_inv_share_write_per=$pot_related_inv['write']; + + $newbuf .= "\$Potentials_SalesOrder_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($pot_inv_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($pot_inv_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Potentials_SalesOrder_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($pot_inv_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($pot_inv_share_write_per['GROUP']).");\n\n"; + + + + + //Constructing HelpDesk Sharing Rules + $hd_share_per_array=getUserModuleSharingObjects("HelpDesk",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $hd_share_read_per=$hd_share_per_array['read']; + $hd_share_write_per=$hd_share_per_array['write']; + $newbuf .= "\$HelpDesk_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($hd_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalArray($hd_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$HelpDesk_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($hd_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalArray($hd_share_write_per['GROUP']).");\n\n"; + + //Constructing Emails Sharing Rules + $email_share_per_array=getUserModuleSharingObjects("Emails",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $email_share_read_per=$email_share_per_array['read']; + $email_share_write_per=$email_share_per_array['write']; + $newbuf .= "\$Emails_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($email_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($email_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Emails_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($email_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($email_share_write_per['GROUP']).");\n\n"; + + //Constructing Campaigns Sharing Rules + $campaign_share_per_array=getUserModuleSharingObjects("Campaigns",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $campaign_share_read_per=$campaign_share_per_array['read']; + $campaign_share_write_per=$campaign_share_per_array['write']; + $newbuf .= "\$Campaigns_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($campaign_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($campaign_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Campaigns_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($campaign_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($campaign_share_write_per['GROUP']).");\n\n"; + + + //Constructing Quotes Sharing Rules + $quotes_share_per_array=getUserModuleSharingObjects("Quotes",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $quotes_share_read_per=$quotes_share_per_array['read']; + $quotes_share_write_per=$quotes_share_per_array['write']; + $quotes_sharingrule_members=$quotes_share_per_array['sharingrules']; + $newbuf .= "\$Quotes_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($quotes_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($quotes_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Quotes_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($quotes_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($quotes_share_write_per['GROUP']).");\n\n"; + + //Constructing the Quote SalesOrder Related Module Sharing Array + $qt_related_so=getRelatedModuleSharingArray("Quotes","SalesOrder",$quotes_sharingrule_members,$quotes_share_read_per,$quotes_share_write_per,$def_org_share); + + $qt_so_share_read_per=$qt_related_so['read']; + $qt_so_share_write_per=$qt_related_so['write']; + + $newbuf .= "\$Quotes_SalesOrder_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($qt_so_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($qt_so_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Quotes_SalesOrder_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($qt_so_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($qt_so_share_write_per['GROUP']).");\n\n"; + + + + + //Constructing Orders Sharing Rules + $po_share_per_array=getUserModuleSharingObjects("PurchaseOrder",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $po_share_read_per=$po_share_per_array['read']; + $po_share_write_per=$po_share_per_array['write']; + $newbuf .= "\$PurchaseOrder_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($po_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalArray($po_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$PurchaseOrder_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($po_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalArray($po_share_write_per['GROUP']).");\n\n"; + + //Constructing Sales Order Sharing Rules + $so_share_per_array=getUserModuleSharingObjects("SalesOrder",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $so_share_read_per=$so_share_per_array['read']; + $so_share_write_per=$so_share_per_array['write']; + $so_sharingrule_members=$so_share_per_array['sharingrules']; + $newbuf .= "\$SalesOrder_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($so_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($so_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$SalesOrder_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($so_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($so_share_write_per['GROUP']).");\n\n"; + + //Constructing the SalesOrder Invoice Related Module Sharing Array + $so_related_inv=getRelatedModuleSharingArray("SalesOrder","Invoice",$so_sharingrule_members,$so_share_read_per,$so_share_write_per,$def_org_share); + + $so_inv_share_read_per=$so_related_inv['read']; + $so_inv_share_write_per=$so_related_inv['write']; + + $newbuf .= "\$SalesOrder_Invoice_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($so_inv_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($so_inv_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$SalesOrder_Invoice_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($so_inv_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalValueArray($so_inv_share_write_per['GROUP']).");\n\n"; + + + + //Constructing Invoice Sharing Rules + $inv_share_per_array=getUserModuleSharingObjects("Invoice",$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + $inv_share_read_per=$inv_share_per_array['read']; + $inv_share_write_per=$inv_share_per_array['write']; + $newbuf .= "\$Invoice_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($inv_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimensionalArray($inv_share_read_per['GROUP']).");\n\n"; + $newbuf .= "\$Invoice_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIntSingleValueArray($inv_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensionalArray($inv_share_write_per['GROUP']).");\n\n"; + + // Writing Sharing Rules For Custom Modules. + // TODO: We are ignoring rules that has already been calculated above, it is good to add GENERIC logic here. + $custom_modules = getSharingModuleList( + Array('Leads', 'Accounts', 'Contacts', 'Potentials', 'HelpDesk', + 'Emails', 'Campaigns','Quotes', 'PurchaseOrder', 'SalesOrder', 'Invoice')); + + for($idx = 0; $idx < count($custom_modules); ++$idx) { + $module_name = $custom_modules[$idx]; + $mod_share_perm_array = getUserModuleSharingObjects($module_name,$userid, + $def_org_share,$current_user_roles,$parent_roles,$current_user_groups); + + $mod_share_read_perm = $mod_share_perm_array['read']; + $mod_share_write_perm= $mod_share_perm_array['write']; + $newbuf .= '$'.$module_name."_share_read_permission=array('ROLE'=>". + constructTwoDimensionalCharIntSingleValueArray($mod_share_read_perm['ROLE']).",'GROUP'=>". + constructTwoDimensionalArray($mod_share_read_perm['GROUP']).");\n\n"; + $newbuf .= '$'.$module_name."_share_write_permission=array('ROLE'=>". + constructTwoDimensionalCharIntSingleValueArray($mod_share_write_perm['ROLE']).",'GROUP'=>". + constructTwoDimensionalArray($mod_share_write_perm['GROUP']).");\n\n"; + } + // END + + $newbuf .= "?>"; + fputs($handle, $newbuf); + fclose($handle); + + //Populating Temp Tables + populateSharingtmptables($userid); + } + } +} + +/** Gives an array which contains the information for what all roles, groups and user data is to be shared with the spcified user for the specified module + + * @param $module -- module name:: Type varchar + * @param $userid -- user id:: Type integer + * @param $def_org_share -- default organization sharing permission array:: Type array + * @param $current_user_roles -- roleid:: Type varchar + * @param $parent_roles -- parent roles:: Type varchar + * @param $current_user_groups -- user id:: Type integer + * @returns $mod_share_permission -- array which contains the id of roles,group and users data shared with specifed user for the specified module + */ +function getUserModuleSharingObjects($module,$userid,$def_org_share,$current_user_roles,$parent_roles,$current_user_groups) +{ + global $adb; + + $mod_tabid=getTabid($module); + + $mod_share_permission; + $mod_share_read_permission=Array(); + $mod_share_write_permission=Array(); + $mod_share_read_permission['ROLE']=Array(); + $mod_share_write_permission['ROLE']=Array(); + $mod_share_read_permission['GROUP']=Array(); + $mod_share_write_permission['GROUP']=Array(); + + $share_id_members=Array(); + $share_id_groupmembers=Array(); + //If Sharing of leads is Private + if($def_org_share[$mod_tabid] == 3 || $def_org_share[$mod_tabid] == 0) + { + $role_read_per=Array(); + $role_write_per=Array(); + $rs_read_per=Array(); + $rs_write_per=Array(); + $grp_read_per=Array(); + $grp_write_per=Array(); + //Retreiving from vtiger_role to vtiger_role + $query="select vtiger_datashare_role2role.* from vtiger_datashare_role2role inner join vtiger_datashare_module_rel on vtiger_datashare_module_rel.shareid=vtiger_datashare_role2role.shareid where vtiger_datashare_module_rel.tabid=? and vtiger_datashare_role2role.to_roleid=?"; + $result=$adb->pquery($query, array($mod_tabid, $current_user_roles)); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $share_roleid=$adb->query_result($result,$i,'share_roleid'); + + $shareid=$adb->query_result($result,$i,'shareid'); + $share_id_role_members=Array(); + $share_id_roles=Array(); + $share_id_roles[]=$share_roleid; + $share_id_role_members['ROLE']=$share_id_roles; + $share_id_members[$shareid]=$share_id_role_members; + + $share_permission=$adb->query_result($result,$i,'permission'); + if($share_permission == 1) + { + if($def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + } + if(! array_key_exists($share_roleid,$role_write_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_write_per[$share_roleid]=$share_role_users; + } + } + elseif($share_permission == 0 && $def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + + } + + } + + + + //Retreiving from role to rs + $parRoleList = array(); + foreach($parent_roles as $par_role_id) + { + array_push($parRoleList, $par_role_id); + } + array_push($parRoleList, $current_user_roles); + $query="select vtiger_datashare_role2rs.* from vtiger_datashare_role2rs inner join vtiger_datashare_module_rel on vtiger_datashare_module_rel.shareid=vtiger_datashare_role2rs.shareid where vtiger_datashare_module_rel.tabid=? and vtiger_datashare_role2rs.to_roleandsubid in (". generateQuestionMarks($parRoleList) .")"; + $result=$adb->pquery($query, array($mod_tabid, $parRoleList)); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $share_roleid=$adb->query_result($result,$i,'share_roleid'); + + $shareid=$adb->query_result($result,$i,'shareid'); + $share_id_role_members=Array(); + $share_id_roles=Array(); + $share_id_roles[]=$share_roleid; + $share_id_role_members['ROLE']=$share_id_roles; + $share_id_members[$shareid]=$share_id_role_members; + + $share_permission=$adb->query_result($result,$i,'permission'); + if($share_permission == 1) + { + if($def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + } + if(! array_key_exists($share_roleid,$role_write_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_write_per[$share_roleid]=$share_role_users; + } + } + elseif($share_permission == 0 && $def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + + } + + } + + //Get roles from Role2Grp + $grpIterator=false; + $groupList = $current_user_groups; + + $query="select vtiger_datashare_role2group.* from vtiger_datashare_role2group inner join vtiger_datashare_module_rel on vtiger_datashare_module_rel.shareid=vtiger_datashare_role2group.shareid where vtiger_datashare_module_rel.tabid=?"; + $qparams = array($mod_tabid); + if (count($groupList) > 0) { + $query .= " and vtiger_datashare_role2group.to_groupid in (". generateQuestionMarks($groupList) .")"; + array_push($qparams, $groupList); + } + $result=$adb->pquery($query, $qparams); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $share_roleid=$adb->query_result($result,$i,'share_roleid'); + $shareid=$adb->query_result($result,$i,'shareid'); + $share_id_role_members=Array(); + $share_id_roles=Array(); + $share_id_roles[]=$share_roleid; + $share_id_role_members['ROLE']=$share_id_roles; + $share_id_members[$shareid]=$share_id_role_members; + + $share_permission=$adb->query_result($result,$i,'permission'); + if($share_permission == 1) + { + if($def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + } + if(! array_key_exists($share_roleid,$role_write_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_write_per[$share_roleid]=$share_role_users; + } + } + elseif($share_permission == 0 && $def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + + } + + } + + + + //Retreiving from rs to vtiger_role + $query="select vtiger_datashare_rs2role.* from vtiger_datashare_rs2role inner join vtiger_datashare_module_rel on vtiger_datashare_module_rel.shareid=vtiger_datashare_rs2role.shareid where vtiger_datashare_module_rel.tabid=? and vtiger_datashare_rs2role.to_roleid=?"; + $result=$adb->pquery($query, array($mod_tabid, $current_user_roles)); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $share_rsid=$adb->query_result($result,$i,'share_roleandsubid'); + $share_roleids=getRoleAndSubordinatesRoleIds($share_rsid); + $share_permission=$adb->query_result($result,$i,'permission'); + + $shareid=$adb->query_result($result,$i,'shareid'); + $share_id_role_members=Array(); + $share_id_roles=Array(); + foreach($share_roleids as $share_roleid) + { + $share_id_roles[]=$share_roleid; + + + if($share_permission == 1) + { + if($def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + } + if(! array_key_exists($share_roleid,$role_write_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_write_per[$share_roleid]=$share_role_users; + } + } + elseif($share_permission == 0 && $def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + + } + } + $share_id_role_members['ROLE']=$share_id_roles; + $share_id_members[$shareid]=$share_id_role_members; + + } + + + //Retreiving from rs to rs + $parRoleList = array(); + foreach($parent_roles as $par_role_id) + { + array_push($parRoleList, $par_role_id); + } + array_push($parRoleList, $current_user_roles); + $query="select vtiger_datashare_rs2rs.* from vtiger_datashare_rs2rs inner join vtiger_datashare_module_rel on vtiger_datashare_module_rel.shareid=vtiger_datashare_rs2rs.shareid where vtiger_datashare_module_rel.tabid=? and vtiger_datashare_rs2rs.to_roleandsubid in (". generateQuestionMarks($parRoleList) .")"; + $result=$adb->pquery($query, array($mod_tabid, $parRoleList)); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $share_rsid=$adb->query_result($result,$i,'share_roleandsubid'); + $share_roleids=getRoleAndSubordinatesRoleIds($share_rsid); + $share_permission=$adb->query_result($result,$i,'permission'); + + $shareid=$adb->query_result($result,$i,'shareid'); + $share_id_role_members=Array(); + $share_id_roles=Array(); + foreach($share_roleids as $share_roleid) + { + + $share_id_roles[]=$share_roleid; + + if($share_permission == 1) + { + if($def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + } + if(! array_key_exists($share_roleid,$role_write_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_write_per[$share_roleid]=$share_role_users; + } + } + elseif($share_permission == 0 && $def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + + } + } + $share_id_role_members['ROLE']=$share_id_roles; + $share_id_members[$shareid]=$share_id_role_members; + + } + + //Get roles from Rs2Grp + + $query="select vtiger_datashare_rs2grp.* from vtiger_datashare_rs2grp inner join vtiger_datashare_module_rel on vtiger_datashare_module_rel.shareid=vtiger_datashare_rs2grp.shareid where vtiger_datashare_module_rel.tabid=?"; + $qparams = array($mod_tabid); + if (count($groupList) > 0) { + $query .= " and vtiger_datashare_rs2grp.to_groupid in (". generateQuestionMarks($groupList) .")"; + array_push($qparams, $groupList); + } + $result=$adb->pquery($query, $qparams); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $share_rsid=$adb->query_result($result,$i,'share_roleandsubid'); + $share_roleids=getRoleAndSubordinatesRoleIds($share_rsid); + $share_permission=$adb->query_result($result,$i,'permission'); + + $shareid=$adb->query_result($result,$i,'shareid'); + $share_id_role_members=Array(); + $share_id_roles=Array(); + + foreach($share_roleids as $share_roleid) + { + + $share_id_roles[]=$share_roleid; + + if($share_permission == 1) + { + if($def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + } + if(! array_key_exists($share_roleid,$role_write_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_write_per[$share_roleid]=$share_role_users; + } + } + elseif($share_permission == 0 && $def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_roleid,$role_read_per)) + { + + $share_role_users=getRoleUserIds($share_roleid); + $role_read_per[$share_roleid]=$share_role_users; + } + + } + } + $share_id_role_members['ROLE']=$share_id_roles; + $share_id_members[$shareid]=$share_id_role_members; + + + + } + $mod_share_read_permission['ROLE']=$role_read_per; + $mod_share_write_permission['ROLE']=$role_write_per; + + //Retreiving from the grp2role sharing + $query="select vtiger_datashare_grp2role.* from vtiger_datashare_grp2role inner join vtiger_datashare_module_rel on vtiger_datashare_module_rel.shareid=vtiger_datashare_grp2role.shareid where vtiger_datashare_module_rel.tabid=? and vtiger_datashare_grp2role.to_roleid=?"; + $result=$adb->pquery($query, array($mod_tabid, $current_user_roles)); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $share_grpid=$adb->query_result($result,$i,'share_groupid'); + $share_permission=$adb->query_result($result,$i,'permission'); + + $shareid=$adb->query_result($result,$i,'shareid'); + $share_id_grp_members=Array(); + $share_id_grps=Array(); + $share_id_grps[]=$share_grpid; + + + if($share_permission == 1) + { + if($def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_grpid,$grp_read_per)) + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($share_grpid); + $share_grp_users=$focusGrpUsers->group_users; + $share_grp_subgroups=$focusGrpUsers->group_subgroups; + $grp_read_per[$share_grpid]=$share_grp_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_read_per)) + { + $grp_read_per[$subgrpid]=$subgrpusers; + } + if(! in_array($subgrpid,$share_id_grps)) + { + $share_id_grps[]=$subgrpid; + } + + } + } + } + if(! array_key_exists($share_grpid,$grp_write_per)) + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($share_grpid); + $share_grp_users=$focusGrpUsers->group_users; + $grp_write_per[$share_grpid]=$share_grp_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_write_per)) + { + $grp_write_per[$subgrpid]=$subgrpusers; + } + if(! in_array($subgrpid,$share_id_grps)) + { + $share_id_grps[]=$subgrpid; + } + + } + + } + } + elseif($share_permission == 0 && $def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_grpid,$grp_read_per)) + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($share_grpid); + $share_grp_users=$focusGrpUsers->group_users; + $grp_read_per[$share_grpid]=$share_grp_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_read_per)) + { + $grp_read_per[$subgrpid]=$subgrpusers; + } + if(! in_array($subgrpid,$share_id_grps)) + { + $share_id_grps[]=$subgrpid; + } + + } + } + + } + $share_id_grp_members['GROUP']=$share_id_grps; + $share_id_members[$shareid]=$share_id_grp_members; + + } + + //Retreiving from the grp2rs sharing + + $query="select vtiger_datashare_grp2rs.* from vtiger_datashare_grp2rs inner join vtiger_datashare_module_rel on vtiger_datashare_module_rel.shareid=vtiger_datashare_grp2rs.shareid where vtiger_datashare_module_rel.tabid=? and vtiger_datashare_grp2rs.to_roleandsubid in (". generateQuestionMarks($parRoleList) .")"; + $result=$adb->pquery($query, array($mod_tabid, $parRoleList)); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $share_grpid=$adb->query_result($result,$i,'share_groupid'); + $share_permission=$adb->query_result($result,$i,'permission'); + + $shareid=$adb->query_result($result,$i,'shareid'); + $share_id_grp_members=Array(); + $share_id_grps=Array(); + $share_id_grps[]=$share_grpid; + + + if($share_permission == 1) + { + if($def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_grpid,$grp_read_per)) + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($share_grpid); + $share_grp_users=$focusGrpUsers->group_users; + $grp_read_per[$share_grpid]=$share_grp_users; + + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_read_per)) + { + $grp_read_per[$subgrpid]=$subgrpusers; + } + if(! in_array($subgrpid,$share_id_grps)) + { + $share_id_grps[]=$subgrpid; + } + + } + } + } + if(! array_key_exists($share_grpid,$grp_write_per)) + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($share_grpid); + $share_grp_users=$focusGrpUsers->group_users; + $grp_write_per[$share_grpid]=$share_grp_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_write_per)) + { + $grp_write_per[$subgrpid]=$subgrpusers; + } + if(! in_array($subgrpid,$share_id_grps)) + { + $share_id_grps[]=$subgrpid; + } + + } + + } + } + elseif($share_permission == 0 && $def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_grpid,$grp_read_per)) + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($share_grpid); + $share_grp_users=$focusGrpUsers->group_users; + $grp_read_per[$share_grpid]=$share_grp_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_read_per)) + { + $grp_read_per[$subgrpid]=$subgrpusers; + } + if(! in_array($subgrpid,$share_id_grps)) + { + $share_id_grps[]=$subgrpid; + } + + } + } + + } + $share_id_grp_members['GROUP']=$share_id_grps; + $share_id_members[$shareid]=$share_id_grp_members; + + } + + //Retreiving from the grp2grp sharing + + $query="select vtiger_datashare_grp2grp.* from vtiger_datashare_grp2grp inner join vtiger_datashare_module_rel on vtiger_datashare_module_rel.shareid=vtiger_datashare_grp2grp.shareid where vtiger_datashare_module_rel.tabid=?"; + $qparams = array($mod_tabid); + if (count($groupList) > 0) { + $query .= " and vtiger_datashare_grp2grp.to_groupid in (". generateQuestionMarks($groupList) .")"; + array_push($qparams, $groupList); + } + $result=$adb->pquery($query, $qparams); + $num_rows=$adb->num_rows($result); + for($i=0;$i<$num_rows;$i++) + { + $share_grpid=$adb->query_result($result,$i,'share_groupid'); + $share_permission=$adb->query_result($result,$i,'permission'); + + $shareid=$adb->query_result($result,$i,'shareid'); + $share_id_grp_members=Array(); + $share_id_grps=Array(); + $share_id_grps[]=$share_grpid; + + if($share_permission == 1) + { + if($def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_grpid,$grp_read_per)) + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($share_grpid); + $share_grp_users=$focusGrpUsers->group_users; + $grp_read_per[$share_grpid]=$share_grp_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_read_per)) + { + $grp_read_per[$subgrpid]=$subgrpusers; + } + if(! in_array($subgrpid,$share_id_grps)) + { + $share_id_grps[]=$subgrpid; + } + + + } + } + } + if(! array_key_exists($share_grpid,$grp_write_per)) + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($share_grpid); + $share_grp_users=$focusGrpUsers->group_users; + $grp_write_per[$share_grpid]=$share_grp_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_write_per)) + { + $grp_write_per[$subgrpid]=$subgrpusers; + } + if(! in_array($subgrpid,$share_id_grps)) + { + $share_id_grps[]=$subgrpid; + } + + } + + } + } + elseif($share_permission == 0 && $def_org_share[$mod_tabid] == 3) + { + if(! array_key_exists($share_grpid,$grp_read_per)) + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($share_grpid); + $share_grp_users=$focusGrpUsers->group_users; + $grp_read_per[$share_grpid]=$share_grp_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_read_per)) + { + $grp_read_per[$subgrpid]=$subgrpusers; + } + if(! in_array($subgrpid,$share_id_grps)) + { + $share_id_grps[]=$subgrpid; + } + + } + } + + } + $share_id_grp_members['GROUP']=$share_id_grps; + $share_id_members[$shareid]=$share_id_grp_members; + + } + $mod_share_read_permission['GROUP']=$grp_read_per; + $mod_share_write_permission['GROUP']=$grp_write_per; + } + $mod_share_permission['read']=$mod_share_read_permission; + $mod_share_permission['write']=$mod_share_write_permission; + $mod_share_permission['sharingrules']=$share_id_members; + return $mod_share_permission; +} + +/** Gives an array which contains the information for what all roles, groups and user's related module data that is to be shared for the specified parent module and shared module + + * @param $par_mod -- parent module name:: Type varchar + * @param $share_mod -- shared module name:: Type varchar + * @param $userid -- user id:: Type integer + * @param $def_org_share -- default organization sharing permission array:: Type array + * @param $mod_sharingrule_members -- Sharing Rule Members array:: Type array + * @param $$mod_share_read_per -- Sharing Module Read Permission array:: Type array + * @param $$mod_share_write_per -- Sharing Module Write Permission array:: Type array + * @returns $related_mod_sharing_permission; -- array which contains the id of roles,group and users related module data to be shared + */ +function getRelatedModuleSharingArray($par_mod,$share_mod,$mod_sharingrule_members,$mod_share_read_per,$mod_share_write_per,$def_org_share) +{ + + global $adb; + $related_mod_sharing_permission=Array(); + $mod_share_read_permission=Array(); + $mod_share_write_permission=Array(); + + $mod_share_read_permission['ROLE']=Array(); + $mod_share_write_permission['ROLE']=Array(); + $mod_share_read_permission['GROUP']=Array(); + $mod_share_write_permission['GROUP']=Array(); + + $par_mod_id=getTabid($par_mod); + $share_mod_id=getTabid($share_mod); + + if($def_org_share[$share_mod_id] == 3 || $def_org_share[$share_mod_id] == 0) + { + + $role_read_per=Array(); + $role_write_per=Array(); + $grp_read_per=Array(); + $grp_write_per=Array(); + + + + foreach($mod_sharingrule_members as $sharingid => $sharingInfoArr) + { + $query = "select vtiger_datashare_relatedmodule_permission.* from vtiger_datashare_relatedmodule_permission inner join vtiger_datashare_relatedmodules on vtiger_datashare_relatedmodules.datashare_relatedmodule_id=vtiger_datashare_relatedmodule_permission.datashare_relatedmodule_id where vtiger_datashare_relatedmodule_permission.shareid=? and vtiger_datashare_relatedmodules.tabid=? and vtiger_datashare_relatedmodules.relatedto_tabid=?"; + $result=$adb->pquery($query, array($sharingid, $par_mod_id, $share_mod_id)); + $share_permission=$adb->query_result($result,0,'permission'); + + foreach($sharingInfoArr as $shareType => $shareEntArr) + { + foreach($shareEntArr as $key=>$shareEntId) + { + if($shareType == 'ROLE') + { + if($share_permission == 1) + { + if($def_org_share[$share_mod_id] == 3) + { + if(! array_key_exists($shareEntId,$role_read_per)) + { + if(array_key_exists($shareEntId,$mod_share_read_per['ROLE'])) + { + $share_role_users=$mod_share_read_per['ROLE'][$shareEntId]; + } + elseif(array_key_exists($shareEntId,$mod_share_write_per['ROLE'])) + { + $share_role_users=$mod_share_write_per['ROLE'][$shareEntId]; + } + else + { + + $share_role_users=getRoleUserIds($shareEntId); + } + + $role_read_per[$shareEntId]=$share_role_users; + + } + } + if(! array_key_exists($shareEntId,$role_write_per)) + { + if(array_key_exists($shareEntId,$mod_share_read_per['ROLE'])) + { + $share_role_users=$mod_share_read_per['ROLE'][$shareEntId]; + } + elseif(array_key_exists($shareEntId,$mod_share_write_per['ROLE'])) + { + $share_role_users=$mod_share_write_per['ROLE'][$shareEntId]; + } + else + { + + $share_role_users=getRoleUserIds($shareEntId); + + } + + $role_write_per[$shareEntId]=$share_role_users; + } + } + elseif($share_permission == 0 && $def_org_share[$share_mod_id] == 3) + { + if(! array_key_exists($shareEntId,$role_read_per)) + { + if(array_key_exists($shareEntId,$mod_share_read_per['ROLE'])) + { + $share_role_users=$mod_share_read_per['ROLE'][$shareEntId]; + } + elseif(array_key_exists($shareEntId,$mod_share_write_per['ROLE'])) + { + $share_role_users=$mod_share_write_per['ROLE'][$shareEntId]; + } + else + { + + $share_role_users=getRoleUserIds($shareEntId); + } + + $role_read_per[$shareEntId]=$share_role_users; + + } + + + } + + } + elseif($shareType == 'GROUP') + { + if($share_permission == 1) + { + if($def_org_share[$share_mod_id] == 3) + { + + if(! array_key_exists($shareEntId,$grp_read_per)) + { + if(array_key_exists($shareEntId,$mod_share_read_per['GROUP'])) + { + $share_grp_users=$mod_share_read_per['GROUP'][$shareEntId]; + } + elseif(array_key_exists($shareEntId,$mod_share_write_per['GROUP'])) + { + $share_grp_users=$mod_share_write_per['GROUP'][$shareEntId]; + } + else + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($shareEntId); + $share_grp_users=$focusGrpUsers->group_users; + + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_read_per)) + { + $grp_read_per[$subgrpid]=$subgrpusers; + } + + } + + } + + $grp_read_per[$shareEntId]=$share_grp_users; + + } + } + if(! array_key_exists($shareEntId,$grp_write_per)) + { + if(! array_key_exists($shareEntId,$grp_write_per)) + { + if(array_key_exists($shareEntId,$mod_share_read_per['GROUP'])) + { + $share_grp_users=$mod_share_read_per['GROUP'][$shareEntId]; + } + elseif(array_key_exists($shareEntId,$mod_share_write_per['GROUP'])) + { + $share_grp_users=$mod_share_write_per['GROUP'][$shareEntId]; + } + else + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($shareEntId); + $share_grp_users=$focusGrpUsers->group_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_write_per)) + { + $grp_write_per[$subgrpid]=$subgrpusers; + } + + } + + } + + $grp_write_per[$shareEntId]=$share_grp_users; + + } + } + } + elseif($share_permission == 0 && $def_org_share[$share_mod_id] == 3) + { + if(! array_key_exists($shareEntId,$grp_read_per)) + { + if(array_key_exists($shareEntId,$mod_share_read_per['GROUP'])) + { + $share_grp_users=$mod_share_read_per['GROUP'][$shareEntId]; + } + elseif(array_key_exists($shareEntId,$mod_share_write_per['GROUP'])) + { + $share_grp_users=$mod_share_write_per['GROUP'][$shareEntId]; + } + else + { + $focusGrpUsers = new GetGroupUsers(); + $focusGrpUsers->getAllUsersInGroup($shareEntId); + $share_grp_users=$focusGrpUsers->group_users; + foreach($focusGrpUsers->group_subgroups as $subgrpid=>$subgrpusers) + { + if(! array_key_exists($subgrpid,$grp_read_per)) + { + $grp_read_per[$subgrpid]=$subgrpusers; + } + + } + + } + + $grp_read_per[$shareEntId]=$share_grp_users; + + } + + + } + } + } + } + } + $mod_share_read_permission['ROLE']=$role_read_per; + $mod_share_write_permission['ROLE']=$role_write_per; + $mod_share_read_permission['GROUP']=$grp_read_per; + $mod_share_write_permission['GROUP']=$grp_write_per; + } + + $related_mod_sharing_permission['read']=$mod_share_read_permission; + $related_mod_sharing_permission['write']=$mod_share_write_permission; + return $related_mod_sharing_permission; + + +} + + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructArray($var) +{ + if (is_array($var)) + { + $code = 'array('; + foreach ($var as $key => $value) + { + $code .= "'".$key."'=>".$value.','; + } + $code .= ')'; + return $code; + } +} + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructSingleStringValueArray($var) +{ + + $size = sizeof($var); + $i=1; + if (is_array($var)) + { + $code = 'array('; + foreach ($var as $key => $value) + { + if($i<$size) + { + $code .= $key."=>'".$value."',"; + } + else + { + $code .= $key."=>'".$value."'"; + } + $i++; + } + $code .= ')'; + return $code; + } +} + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructSingleStringKeyAndValueArray($var) +{ + + $size = sizeof($var); + $i=1; + if (is_array($var)) + { + $code = 'array('; + foreach ($var as $key => $value) + { + if($i<$size) + { + $code .= "'".$key."'=>".$value.","; + } + else + { + $code .= "'".$key."'=>".$value; + } + $i++; + } + $code .= ')'; + return $code; + } +} + + + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructSingleStringKeyValueArray($var) { + global $adb; + $size = sizeof($var); + $i=1; + if (is_array($var)) { + $code = 'array('; + foreach ($var as $key => $value) { + //fix for signatue quote(') issue + $value=$adb->sql_escape_string($value); + if($i<$size) { + $code .= "'".$key."'=>'".$value."',"; + } else { + $code .= "'".$key."'=>'".$value."'"; + } + $i++; + } + $code .= ')'; + return $code; + } +} + + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructSingleArray($var) +{ + if (is_array($var)) + { + $code = 'array('; + foreach ($var as $value) + { + $code .= $value.','; + } + $code .= ')'; + return $code; + } +} + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructSingleCharArray($var) +{ + if (is_array($var)) + { + $code = "array("; + foreach ($var as $value) + { + $code .="'".$value."',"; + } + $code .= ")"; + return $code; + } +} + + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructTwoDimensionalArray($var) +{ + if (is_array($var)) + { + $code = 'array('; + foreach ($var as $key => $secarr) + { + $code .= $key.'=>array('; + foreach($secarr as $seckey => $secvalue) + { + $code .= $seckey.'=>'.$secvalue.','; + } + $code .= '),'; + } + $code .= ')'; + return $code; + } +} + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructTwoDimensionalValueArray($var) +{ + if (is_array($var)) + { + $code = 'array('; + foreach ($var as $key => $secarr) + { + $code .= $key.'=>array('; + foreach($secarr as $seckey => $secvalue) + { + $code .= $secvalue.','; + } + $code .= '),'; + } + $code .= ')'; + return $code; + } +} + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructTwoDimensionalCharIntSingleArray($var) +{ + if (is_array($var)) + { + $code = "array("; + foreach ($var as $key => $secarr) + { + $code .= "'".$key."'=>array("; + foreach($secarr as $seckey => $secvalue) + { + $code .= $seckey.","; + } + $code .= "),"; + } + $code .= ")"; + return $code; + } +} + +/** Converts the input array to a single string to facilitate the writing of the input array in a flat file + + * @param $var -- input array:: Type array + * @returns $code -- contains the whole array in a single string:: Type array + */ +function constructTwoDimensionalCharIntSingleValueArray($var) +{ + if (is_array($var)) + { + $code = "array("; + foreach ($var as $key => $secarr) + { + $code .= "'".$key."'=>array("; + foreach($secarr as $seckey => $secvalue) + { + $code .= $secvalue.","; + } + $code .= "),"; + } + $code .= ")"; + return $code; + } +} + + +/** Function to populate the read/wirte Sharing permissions data of user/groups for the specified user into the database + * @param $userid -- user id:: Type integer + */ + +function populateSharingtmptables($userid) +{ + global $adb; + require('user_privileges/sharing_privileges_'.$userid.'.php'); + //Deleting from the existing vtiger_tables + $table_arr=Array('vtiger_tmp_read_user_sharing_per', 'vtiger_tmp_write_user_sharing_per','vtiger_tmp_read_group_sharing_per','vtiger_tmp_write_group_sharing_per','vtiger_tmp_read_user_rel_sharing_per','vtiger_tmp_write_user_rel_sharing_per','vtiger_tmp_read_group_rel_sharing_per','vtiger_tmp_write_group_rel_sharing_per'); + foreach($table_arr as $tabname) + { + $query = "delete from ".$tabname." where userid=?"; + $adb->pquery($query, array($userid)); + } + + // Look up for modules for which sharing access is enabled. + $sharingArray = Array('Emails'); + $otherModules = getSharingModuleList(); + $sharingArray = array_merge($sharingArray, $otherModules); + + foreach($sharingArray as $module) + { + $module_sharing_read_permvar = $module.'_share_read_permission'; + $module_sharing_write_permvar = $module.'_share_write_permission'; + + populateSharingPrivileges('USER',$userid,$module,'read', $$module_sharing_read_permvar ); + populateSharingPrivileges('USER',$userid,$module,'write', $$module_sharing_write_permvar ); + populateSharingPrivileges('GROUP',$userid,$module,'read', $$module_sharing_read_permvar ); + populateSharingPrivileges('GROUP',$userid,$module,'write', $$module_sharing_write_permvar ); + } + //Populating Values into the temp related sharing tables + foreach($related_module_share as $rel_tab_id => $tabid_arr) + { + $rel_tab_name=getTabname($rel_tab_id); + foreach($tabid_arr as $taid) + { + $tab_name=getTabname($taid); + + $relmodule_sharing_read_permvar = $tab_name.'_'.$rel_tab_name.'_share_read_permission'; + $relmodule_sharing_write_permvar = $tab_name.'_'.$rel_tab_name.'_share_write_permission'; + + populateRelatedSharingPrivileges('USER',$userid,$tab_name,$rel_tab_name,'read', $$relmodule_sharing_read_permvar); + populateRelatedSharingPrivileges('USER',$userid,$tab_name,$rel_tab_name,'write', $$relmodule_sharing_write_permvar); + populateRelatedSharingPrivileges('GROUP',$userid,$tab_name,$rel_tab_name,'read', $$relmodule_sharing_read_permvar); + populateRelatedSharingPrivileges('GROUP',$userid,$tab_name,$rel_tab_name,'write', $$relmodule_sharing_write_permvar); + } + } +} + +/** Function to populate the read/wirte Sharing permissions data for the specified user into the database + * @param $userid -- user id:: Type integer + * @param $enttype -- can have the value of User or Group:: Type varchar + * @param $module -- module name:: Type varchar + * @param $pertype -- can have the value of read or write:: Type varchar + * @param $var_name_arr - Variable to use instead of including the sharing access again + */ +function populateSharingPrivileges($enttype,$userid,$module,$pertype, $var_name_arr=false) +{ + global $adb; + $tabid=getTabid($module); + + if(!$var_name_arr) { + require('user_privileges/sharing_privileges_'.$userid.'.php'); + } + + if($enttype=='USER') + { + if($pertype =='read') + { + $table_name='vtiger_tmp_read_user_sharing_per'; + $var_name=$module.'_share_read_permission'; + } + elseif($pertype == 'write') + { + $table_name='vtiger_tmp_write_user_sharing_per'; + $var_name=$module.'_share_write_permission'; + } + // Lookup for the variable if not set through function argument + if(!$var_name_arr) $var_name_arr=$$var_name; + $user_arr=Array(); + if(sizeof($var_name_arr['ROLE']) > 0) + { + foreach($var_name_arr['ROLE'] as $roleid=>$roleusers) + { + + foreach($roleusers as $user_id) + { + if(! in_array($user_id,$user_arr)) + { + $query="insert into ".$table_name." values(?,?,?)"; + $adb->pquery($query, array($userid, $tabid, $user_id)); + $user_arr[]=$user_id; + } + } + } + } + if(sizeof($var_name_arr['GROUP']) > 0) + { + foreach($var_name_arr['GROUP'] as $grpid=>$grpusers) + { + foreach($grpusers as $user_id) + { + if(! in_array($user_id,$user_arr)) + { + $query="insert into ".$table_name." values(?,?,?)"; + $adb->pquery($query, array($userid, $tabid, $user_id)); + $user_arr[]=$user_id; + } + } + } + } + + + } + elseif($enttype=='GROUP') + { + if($pertype =='read') + { + $table_name='vtiger_tmp_read_group_sharing_per'; + $var_name=$module.'_share_read_permission'; + } + elseif($pertype == 'write') + { + $table_name='vtiger_tmp_write_group_sharing_per'; + $var_name=$module.'_share_write_permission'; + } + // Lookup for the variable if not set through function argument + if(!$var_name_arr) $var_name_arr=$$var_name; + $grp_arr=Array(); + if(sizeof($var_name_arr['GROUP']) > 0) + { + + foreach($var_name_arr['GROUP'] as $grpid=>$grpusers) + { + if(! in_array($grpid,$grp_arr)) + { + $query="insert into ".$table_name." values(?,?,?)"; + $adb->pquery($query, array($userid, $tabid, $grpid)); + $grp_arr[]=$grpid; + } + } + } + + } + +} + + +/** Function to populate the read/wirte Sharing permissions related module data for the specified user into the database + * @param $userid -- user id:: Type integer + * @param $enttype -- can have the value of User or Group:: Type varchar + * @param $module -- module name:: Type varchar + * @param $relmodule -- related module name:: Type varchar + * @param $pertype -- can have the value of read or write:: Type varchar + * @param $var_name_arr - Variable to use instead of including the sharing access again + */ + +function populateRelatedSharingPrivileges($enttype,$userid,$module,$relmodule,$pertype, $var_name_arr=false) +{ + global $adb; + $tabid=getTabid($module); + $reltabid=getTabid($relmodule); + + if(!$var_name_arr) { + require('user_privileges/sharing_privileges_'.$userid.'.php'); + } + + if($enttype=='USER') + { + if($pertype =='read') + { + $table_name='vtiger_tmp_read_user_rel_sharing_per'; + $var_name=$module.'_'.$relmodule.'_share_read_permission'; + } + elseif($pertype == 'write') + { + $table_name='vtiger_tmp_write_user_rel_sharing_per'; + $var_name=$module.'_'.$relmodule.'_share_write_permission'; + } + // Lookup for the variable if not set through function argument + if(!$var_name_arr) $var_name_arr=$$var_name; + $user_arr=Array(); + if(sizeof($var_name_arr['ROLE']) > 0) + { + foreach($var_name_arr['ROLE'] as $roleid=>$roleusers) + { + + foreach($roleusers as $user_id) + { + if(! in_array($user_id,$user_arr)) + { + $query="insert into ".$table_name." values(?,?,?,?)"; + $adb->pquery($query, array($userid, $tabid, $reltabid, $user_id)); + $user_arr[]=$user_id; + } + } + } + } + if(sizeof($var_name_arr['GROUP']) > 0) + { + foreach($var_name_arr['GROUP'] as $grpid=>$grpusers) + { + foreach($grpusers as $user_id) + { + if(! in_array($user_id,$user_arr)) + { + $query="insert into ".$table_name." values(?,?,?,?)"; + $adb->pquery($query, array($userid, $tabid, $reltabid, $user_id)); + $user_arr[]=$user_id; + } + } + } + } + + + } + elseif($enttype=='GROUP') + { + if($pertype =='read') + { + $table_name='vtiger_tmp_read_group_rel_sharing_per'; + $var_name=$module.'_'.$relmodule.'_share_read_permission'; + } + elseif($pertype == 'write') + { + $table_name='vtiger_tmp_write_group_rel_sharing_per'; + $var_name=$module.'_'.$relmodule.'_share_write_permission'; + } + // Lookup for the variable if not set through function argument + if(!$var_name_arr) $var_name_arr=$$var_name; + $grp_arr=Array(); + if(sizeof($var_name_arr['GROUP']) > 0) + { + + foreach($var_name_arr['GROUP'] as $grpid=>$grpusers) + { + if(! in_array($grpid,$grp_arr)) + { + $query="insert into ".$table_name." values(?,?,?,?)"; + $adb->pquery($query, array($userid, $tabid, $reltabid, $grpid)); + $grp_arr[]=$grpid; + } + } + } + + } + +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/DefaultDataPopulator.php b/oss/vtiger/trunk/modules/Users/DefaultDataPopulator.php new file mode 100644 index 00000000..73da4be5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/DefaultDataPopulator.php @@ -0,0 +1,2541 @@ +log = LoggerManager::getLogger('DefaultDataPopulator'); + $this->db = PearDatabase::getInstance(); + } + + var $new_schema = true; + + /** Function to populate the default required data during installation + */ + function create_tables () { + global $app_strings; + + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (3,'Home',0,1,'Home',0,1,0)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (7,'Leads',0,4,'Leads',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (6,'Accounts',0,5,'Accounts',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (4,'Contacts',0,6,'Contacts',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (2,'Potentials',0,7,'Potentials',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (8,'Documents',0,9,'Documents',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (9,'Calendar',0,3,'Calendar',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (10,'Emails',0,10,'Emails',0,1,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (13,'HelpDesk',0,11,'HelpDesk',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (14,'Products',0,8,'Products',0,1,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (1,'Dashboard',0,12,'Dashboards',0,1,0)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (15,'Faq',0,14,'Faq',0,1,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (16,'Events',2,13,'Events',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (18,'Vendors',0,15,'Vendors',0,1,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (19,'PriceBooks',0,16,'PriceBooks',0,1,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (20,'Quotes',0,17,'Quotes',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (21,'PurchaseOrder',0,18,'PurchaseOrder',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (22,'SalesOrder',0,19,'SalesOrder',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (23,'Invoice',0,20,'Invoice',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (24,'Rss',0,21,'Rss',0,1,0)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (25,'Reports',0,22,'Reports',0,1,0)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (26,'Campaigns',0,23,'Campaigns',0,0,1)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (27,'Portal',0,24,'Portal',0,1,0)"); + $this->db->query("INSERT INTO vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) VALUES (28,'Webmails',0,25,'Webmails',0,1,1)"); + $this->db->query("insert into vtiger_tab(tabid,name,presence,tabsequence,tablabel,customized,ownedby,isentitytype) values (29,'Users',0,26,'Users',0,1,0)"); + + // Populate the vtiger_blocks vtiger_table + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",2,'LBL_OPPORTUNITY_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",2,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",2,'LBL_DESCRIPTION_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",4,'LBL_CONTACT_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",4,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",4,'LBL_CUSTOMER_PORTAL_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",4,'LBL_ADDRESS_INFORMATION',4,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",4,'LBL_DESCRIPTION_INFORMATION',5,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",6,'LBL_ACCOUNT_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",6,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",6,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",6,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",7,'LBL_LEAD_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",7,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",7,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",7,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",8,'LBL_NOTE_INFORMATION',1,0,0,0,0,0,1,0)"); + $fileblockid = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$fileblockid.",8,'LBL_FILE_INFORMATION',3,1,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",9,'LBL_TASK_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",9,'',2,1,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",10,'LBL_EMAIL_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",10,'',2,1,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",10,'',3,1,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",10,'',4,1,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",13,'LBL_TICKET_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",13,'',2,1,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",13,'LBL_CUSTOM_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",13,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",13,'LBL_TICKET_RESOLUTION',5,0,0,1,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",13,'LBL_COMMENTS',6,0,0,1,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",14,'LBL_PRODUCT_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",14,'LBL_PRICING_INFORMATION',2,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",14,'LBL_STOCK_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",14,'LBL_CUSTOM_INFORMATION',4,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",14,'LBL_IMAGE_INFORMATION',5,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",14,'LBL_DESCRIPTION_INFORMATION',6,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",15,'LBL_FAQ_INFORMATION',1,0,0,0,0,0,1,0)"); + //$this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",15,'',2,1,0,0,0,0,1,0)"); + //$this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",15,'',3,1,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",15,'LBL_COMMENT_INFORMATION',4,0,0,1,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",16,'LBL_EVENT_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",16,'',2,1,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",16,'',3,1,0,0,0,0,1,0)"); + $vendorbasicinfo = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$vendorbasicinfo.",18,'LBL_VENDOR_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",18,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $vendoraddressblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$vendoraddressblock.",18,'LBL_VENDOR_ADDRESS_INFORMATION',3,0,0,0,0,0,1,0)"); + $vendordescriptionblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$vendordescriptionblock.",18,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0,1,0)"); + $pricebookbasicblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$pricebookbasicblock.",19,'LBL_PRICEBOOK_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",19,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $pricebookdescription = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$pricebookdescription.",19,'LBL_DESCRIPTION_INFORMATION',3,0,0,0,0,0,1,0)"); + $quotesbasicblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$quotesbasicblock.",20,'LBL_QUOTE_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",20,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $quotesaddressblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$quotesaddressblock.",20,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",20,'LBL_RELATED_PRODUCTS',4,0,0,0,0,0,1,0)"); + $quotetermsblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$quotetermsblock.",20,'LBL_TERMS_INFORMATION',5,0,0,0,0,0,1,0)"); + $quotedescription = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$quotedescription.",20,'LBL_DESCRIPTION_INFORMATION',6,0,0,0,0,0,1,0)"); + $pobasicblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$pobasicblock.",21,'LBL_PO_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",21,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $poaddressblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$poaddressblock.",21,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",21,'LBL_RELATED_PRODUCTS',4,0,0,0,0,0,1,0)"); + $potermsblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$potermsblock.",21,'LBL_TERMS_INFORMATION',5,0,0,0,0,0,1,0)"); + $podescription = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$podescription.",21,'LBL_DESCRIPTION_INFORMATION',6,0,0,0,0,0,1,0)"); + $sobasicblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$sobasicblock .",22,'LBL_SO_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",22,'LBL_CUSTOM_INFORMATION',3,0,0,0,0,0,1,0)"); + $soaddressblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$soaddressblock.",22,'LBL_ADDRESS_INFORMATION',4,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",22,'LBL_RELATED_PRODUCTS',5,0,0,0,0,0,1,0)"); + $sotermsblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$sotermsblock.",22,'LBL_TERMS_INFORMATION',6,0,0,0,0,0,1,0)"); + $sodescription = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$sodescription.",22,'LBL_DESCRIPTION_INFORMATION',7,0,0,0,0,0,1,0)"); + $invoicebasicblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$invoicebasicblock.",23,'LBL_INVOICE_INFORMATION',1,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",23,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $invoiceaddressblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$invoiceaddressblock.",23,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",23,'LBL_RELATED_PRODUCTS',4,0,0,0,0,0,1,0)"); + $invoicetermsblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$invoicetermsblock.",23,'LBL_TERMS_INFORMATION',5,0,0,0,0,0,1,0)"); + $invoicedescription = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$invoicedescription.",23,'LBL_DESCRIPTION_INFORMATION',6,0,0,0,0,0,1,0)"); + $imageblockid = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$imageblockid.",4,'LBL_IMAGE_INFORMATION',6,0,0,0,0,0,1,0)"); + $campaignbasicblockid = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$campaignbasicblockid.",26,'LBL_CAMPAIGN_INFORMATION',1,0,0,0,0,0,1,0)"); + $campaigncustomblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$campaigncustomblock.",26,'LBL_CUSTOM_INFORMATION',2,0,0,0,0,0,1,0)"); + $campaignexpectedandactualsblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$campaignexpectedandactualsblock.",26,'LBL_EXPECTATIONS_AND_ACTUALS',3,0,0,0,0,0,1,0)"); + $userloginandroleblockid = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$userloginandroleblockid.",29,'LBL_USERLOGIN_ROLE',1,0,0,0,0,0,1,0)"); + $usermoreinfoblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$usermoreinfoblock.",29,'LBL_MORE_INFORMATION',2,0,0,0,0,0,1,0)"); + $useraddressblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$useraddressblock.",29,'LBL_ADDRESS_INFORMATION',3,0,0,0,0,0,1,0)"); + //Added an extra block for new UI Settings in Campaigns module + $campaidndescriptionblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$campaidndescriptionblock.",26,'LBL_DESCRIPTION_INFORMATION',4,0,0,0,0,0,1,0)"); + $userblockid = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$userblockid.",29,'LBL_USER_IMAGE_INFORMATION',4,0,0,0,0,0,1,0)"); //Added a New Block User Image Info in Users Module + $useradvanceblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$useradvanceblock .",29,'LBL_USER_ADV_OPTIONS',5,0,0,0,0,0,1,0)"); //Added a New Block User Image Info in Users Module + //Added block 'File Information' to Documents module + $desc_blockid = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$desc_blockid.",8,'LBL_DESCRIPTION',2,0,0,0,0,0,1,0)"); + //Added block for storing the Recurring Inovice Informaiton in SalesOrder + $sorecurringinvoiceblock = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("insert into vtiger_blocks values (".$sorecurringinvoiceblock.",22,'Recurring Invoice Information',2,0,0,0,0,0,1,0)"); + //Added to support custom fields for Calendar + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",9,'LBL_CUSTOM_INFORMATION',3,0,0,0,0,0,1,0)"); + $this->db->query("insert into vtiger_blocks values (".$this->db->getUniqueID('vtiger_blocks').",16,'LBL_CUSTOM_INFORMATION',4,0,0,0,0,0,1,0)"); + + //Account Details -- START + //Block9 + + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'accountname','vtiger_account',1,'2','accountname','Account Name',1,0,0,100,1,9,1,'V~M',0,1,'BAS',0)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'account_no','vtiger_account',1,'4','account_no','Account No',1,0,0,100,2,9,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'phone','vtiger_account',1,'11','phone','Phone',1,2,0,100,4,9,1,'V~O',2,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'website','vtiger_account',1,'17','website','Website',1,2,0,100,3,9,1,'V~O',2,3,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'fax','vtiger_account',1,'1','fax','Fax',1,2,0,100,6,9,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'tickersymbol','vtiger_account',1,'1','tickersymbol','Ticker Symbol',1,2,0,100,5,9,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'otherphone','vtiger_account',1,'11','otherphone','Other Phone',1,2,0,100,8,9,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'parentid','vtiger_account',1,'51','account_id','Member Of',1,2,0,100,7,9,1,'I~O',1,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'email1','vtiger_account',1,'13','email1','Email',1,2,0,100,10,9,1,'E~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'employees','vtiger_account',1,'7','employees','Employees',1,2,0,100,9,9,1,'I~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'email2','vtiger_account',1,'13','email2','Other Email',1,2,0,100,11,9,1,'E~O',1,null,'ADV',1)"); + + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'ownership','vtiger_account',1,'1','ownership','Ownership',1,2,0,100,12,9,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'rating','vtiger_account',1,'15','rating','Rating',1,2,0,100,14,9,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'industry','vtiger_account',1,'15','industry','industry',1,2,0,100,13,9,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'siccode','vtiger_account',1,'1','siccode','SIC Code',1,2,0,100,16,9,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'account_type','vtiger_account',1,'15','accounttype','Type',1,2,0,100,15,9,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'annualrevenue','vtiger_account',1,'71','annual_revenue','Annual Revenue',1,2,0,100,18,9,1,'I~O',1,null,'ADV',1)"); + //Added vtiger_field emailoptout for vtiger_accounts -- after 4.2 patch2 + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'emailoptout','vtiger_account',1,'56','emailoptout','Email Opt Out',1,2,0,100,17,9,1,'C~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'notify_owner','vtiger_account',1,56,'notify_owner','Notify Owner',1,2,0,10,20,9,1,'C~O',1,NULL,'ADV',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,19,9,1,'V~M',0,4,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,22,9,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,21,9,2,'T~O',3,null,'BAS',0)"); + + //Block 11 + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'bill_street','vtiger_accountbillads',1,'21','bill_street','Billing Address',1,2,0,100,1,11,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'ship_street','vtiger_accountshipads',1,'21','ship_street','Shipping Address',1,2,0,100,2,11,1,'V~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'bill_city','vtiger_accountbillads',1,'1','bill_city','Billing City',1,2,0,100,5,11,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'ship_city','vtiger_accountshipads',1,'1','ship_city','Shipping City',1,2,0,100,6,11,1,'V~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'bill_state','vtiger_accountbillads',1,'1','bill_state','Billing State',1,2,0,100,7,11,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'ship_state','vtiger_accountshipads',1,'1','ship_state','Shipping State',1,2,0,100,8,11,1,'V~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'bill_code','vtiger_accountbillads',1,'1','bill_code','Billing Code',1,2,0,100,9,11,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'ship_code','vtiger_accountshipads',1,'1','ship_code','Shipping Code',1,2,0,100,10,11,1,'V~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'bill_country','vtiger_accountbillads',1,'1','bill_country','Billing Country',1,2,0,100,11,11,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'ship_country','vtiger_accountshipads',1,'1','ship_country','Shipping Country',1,2,0,100,12,11,1,'V~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'bill_pobox','vtiger_accountbillads',1,'1','bill_pobox','Billing Po Box',1,2,0,100,3,11,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'ship_pobox','vtiger_accountshipads',1,'1','ship_pobox','Shipping Po Box',1,2,0,100,4,11,1,'V~O',1,null,'BAS',1)"); + + //Block12 + $this->db->query("insert into vtiger_field values (6,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,12,1,'V~O',1,null,'BAS',1)"); + + //Account Details -- END + + //Lead Details --- START + //Block13 -- Start + + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'salutation','vtiger_leaddetails',1,'55','salutationtype','Salutation',1,0,0,100,1,13,3,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'firstname','vtiger_leaddetails',1,'55','firstname','First Name',1,2,0,100,2,13,1,'V~O',2,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'lead_no','vtiger_leaddetails',1,'4','lead_no','Lead No',1,0,0,100,3,13,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'phone','vtiger_leadaddress',1,'11','phone','Phone',1,2,0,100,5,13,1,'V~O',2,4,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'lastname','vtiger_leaddetails',1,'255','lastname','Last Name',1,0,0,100,4,13,1,'V~M',0,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'mobile','vtiger_leadaddress',1,'1','mobile','Mobile',1,2,0,100,7,13,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'company','vtiger_leaddetails',1,'2','company','Company',1,2,0,100,6,13,1,'V~M',2,3,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'fax','vtiger_leadaddress',1,'1','fax','Fax',1,2,0,100,9,13,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'designation','vtiger_leaddetails',1,'1','designation','Designation',1,2,0,100,8,13,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'email','vtiger_leaddetails',1,'13','email','Email',1,2,0,100,11,13,1,'E~O',2,5,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'leadsource','vtiger_leaddetails',1,'15','leadsource','Lead Source',1,2,0,100,10,13,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'website','vtiger_leadsubdetails',1,'17','website','Website',1,2,0,100,13,13,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'industry','vtiger_leaddetails',1,'15','industry','Industry',1,2,0,100,12,13,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'leadstatus','vtiger_leaddetails',1,'15','leadstatus','Lead Status',1,2,0,100,15,13,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'annualrevenue','vtiger_leaddetails',1,'71','annualrevenue','Annual Revenue',1,2,0,100,14,13,1,'I~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'rating','vtiger_leaddetails',1,'15','rating','Rating',1,2,0,100,17,13,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'noofemployees','vtiger_leaddetails',1,'1','noofemployees','No Of Employees',1,2,0,100,16,13,1,'I~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,19,13,1,'V~M',0,6,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'yahooid','vtiger_leaddetails',1,'13','yahooid','Yahoo Id',1,2,0,100,18,13,1,'E~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,21,13,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,20,13,2,'T~O',3,null,'BAS',0)"); + //Block13 -- End + + //Block15 -- Start + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'lane','vtiger_leadaddress',1,'21','lane','Street',1,2,0,100,1,15,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'code','vtiger_leadaddress',1,'1','code','Postal Code',1,2,0,100,3,15,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'city','vtiger_leadaddress',1,'1','city','City',1,2,0,100,4,15,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'country','vtiger_leadaddress',1,'1','country','Country',1,2,0,100,5,15,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'state','vtiger_leadaddress',1,'1','state','State',1,2,0,100,6,15,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'pobox','vtiger_leadaddress',1,'1','pobox','Po Box',1,2,0,100,2,15,1,'V~O',1,null,'BAS',1)"); + //Block15 --End + + //Block16 -- Start + $this->db->query("insert into vtiger_field values (7,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,16,1,'V~O',1,null,'BAS',1)"); + //Block16 -- End + + //Lead Details -- END + + //Contact Details -- START + //Block4 -- Start + + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'salutation','vtiger_contactdetails',1,'55','salutationtype','Salutation',1,0,0,100,1,4,3,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'firstname','vtiger_contactdetails',1,'55','firstname','First Name',1,2,0,100,2,4,1,'V~O',2,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'contact_no','vtiger_contactdetails',1,'4','contact_no','Contact Id',1,0,0,100,3,4,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'phone','vtiger_contactdetails',1,'11','phone','Office Phone',1,2,0,100,5,4,1,'V~O',2,4,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'lastname','vtiger_contactdetails',1,'255','lastname','Last Name',1,0,0,100,4,4,1,'V~M',0,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'mobile','vtiger_contactdetails',1,'1','mobile','Mobile',1,2,0,100,7,4,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'accountid','vtiger_contactdetails',1,'51','account_id','Account Name',1,0,0,100,6,4,1,'I~O',2,3,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'homephone','vtiger_contactsubdetails',1,'11','homephone','Home Phone',1,2,0,100,9,4,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'leadsource','vtiger_contactsubdetails',1,'15','leadsource','Lead Source',1,2,0,100,8,4,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'otherphone','vtiger_contactsubdetails',1,'11','otherphone','Other Phone',1,2,0,100,11,4,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'title','vtiger_contactdetails',1,'1','title','Title',1,2,0,100,10,4,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'fax','vtiger_contactdetails',1,'1','fax','Fax',1,2,0,100,13,4,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'department','vtiger_contactdetails',1,'1','department','Department',1,2,0,100,12,4,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'birthday','vtiger_contactsubdetails',1,'5','birthday','Birthdate',1,2,0,100,16,4,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'email','vtiger_contactdetails',1,'13','email','Email',1,2,0,100,15,4,1,'E~O',2,5,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'reportsto','vtiger_contactdetails',1,'57','contact_id','Reports To',1,2,0,100,18,4,1,'V~O',1,null,'ADV',0)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'assistant','vtiger_contactsubdetails',1,'1','assistant','Assistant',1,2,0,100,17,4,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'yahooid','vtiger_contactdetails',1,'13','yahooid','Yahoo Id',1,2,0,100,20,4,1,'E~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'assistantphone','vtiger_contactsubdetails',1,'11','assistantphone','Assistant Phone',1,2,0,100,19,4,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'donotcall','vtiger_contactdetails',1,'56','donotcall','Do Not Call',1,2,0,100,22,4,1,'C~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'emailoptout','vtiger_contactdetails',1,'56','emailoptout','Email Opt Out',1,2,0,100,21,4,1,'C~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,24,4,1,'V~M',0,6,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'reference','vtiger_contactdetails',1,'56','reference','Reference',1,2,0,10,23,4,1,'C~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'notify_owner','vtiger_contactdetails',1,'56','notify_owner','Notify Owner',1,2,0,10,26,4,1,'C~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,25,4,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,27,4,2,'T~O',3,null,'BAS',0)"); + //Block4 -- End + + //Block6 - Begin Customer Portal + + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'portal','vtiger_customerdetails',1,'56','portal','Portal User',1,2,0,100,1,6,1,'C~O',1,null,'ADV',0)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'support_start_date','vtiger_customerdetails',1,'5','support_start_date','Support Start Date',1,2,0,100,2,6,1,'D~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'support_end_date','vtiger_customerdetails',1,'5','support_end_date','Support End Date',1,2,0,100,3,6,1,'D~O~OTH~GE~support_start_date~Support Start Date',1,null,'ADV',1)"); + + //Block6 - End Customer Portal + + //Block 7 -- Start + + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'mailingstreet','vtiger_contactaddress',1,'21','mailingstreet','Mailing Street',1,2,0,100,1,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'otherstreet','vtiger_contactaddress',1,'21','otherstreet','Other Street',1,2,0,100,2,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'mailingcity','vtiger_contactaddress',1,'1','mailingcity','Mailing City',1,2,0,100,5,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'othercity','vtiger_contactaddress',1,'1','othercity','Other City',1,2,0,100,6,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'mailingstate','vtiger_contactaddress',1,'1','mailingstate','Mailing State',1,2,0,100,7,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'otherstate','vtiger_contactaddress',1,'1','otherstate','Other State',1,2,0,100,8,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'mailingzip','vtiger_contactaddress',1,'1','mailingzip','Mailing Zip',1,2,0,100,9,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'otherzip','vtiger_contactaddress',1,'1','otherzip','Other Zip',1,2,0,100,10,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'mailingcountry','vtiger_contactaddress',1,'1','mailingcountry','Mailing Country',1,2,0,100,11,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'othercountry','vtiger_contactaddress',1,'1','othercountry','Other Country',1,2,0,100,12,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'mailingpobox','vtiger_contactaddress',1,'1','mailingpobox','Mailing Po Box',1,2,0,100,3,7,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'otherpobox','vtiger_contactaddress',1,'1','otherpobox','Other Po Box',1,2,0,100,4,7,1,'V~O',1,null,'BAS',1)"); + //Block7 -- End + + //ContactImageInformation + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'imagename','vtiger_contactdetails',1,'69','imagename','Contact Image',1,2,0,100,1,$imageblockid,1,'V~O',3,null,'ADV',0)"); + + + //Block8 -- Start + $this->db->query("insert into vtiger_field values (4,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,8,1,'V~O',1,null,'BAS',1)"); + //Block8 -- End + //Contact Details -- END + + //Potential Details -- START + //Block1 -- Start + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'potentialname','vtiger_potential',1,'2','potentialname','Potential Name',1,0,0,100,1,1,1,'V~M',0,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'potential_no','vtiger_potential',1,'4','potential_no','Potential No',1,0,0,100,2,1,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'amount','vtiger_potential',1,71,'amount','Amount',1,2,0,100,4,1,1,'N~O',2,5,'BAS',1)"); + //changed for b2c model + $fieldid = $this->db->getUniqueID("vtiger_field"); + $this->db->query("insert into vtiger_field values (2,$fieldid,'related_to','vtiger_potential',1,'10','related_to','Related To',1,0,0,100,3,1,1,'V~M',0,2,'BAS',1)"); + $this->db->query("insert into vtiger_fieldmodulerel (fieldid, module, relmodule, status, sequence) values ($fieldid, 'Potentials', 'Accounts', NULL, 0), ($fieldid, 'Potentials', 'Contacts', NULL, 1)"); + //b2c model changes end + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'closingdate','vtiger_potential',1,'23','closingdate','Expected Close Date',1,2,0,100,7,1,1,'D~M',2,3,'BAS',1)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'potentialtype','vtiger_potential',1,'15','opportunity_type','Type',1,2,0,100,6,1,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'nextstep','vtiger_potential',1,'1','nextstep','Next Step',1,2,0,100,9,1,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'leadsource','vtiger_potential',1,'15','leadsource','Lead Source',1,2,0,100,8,1,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'sales_stage','vtiger_potential',1,'15','sales_stage','Sales Stage',1,2,0,100,11,1,1,'V~M',2,4,'BAS',1)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,2,0,100,10,1,1,'V~M',0,6,'BAS',1)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'probability','vtiger_potential',1,'9','probability','Probability',1,2,0,100,13,1,1,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'campaignid','vtiger_potential',1,'58','campaignid','Campaign Source',1,2,0,100,12,1,1,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,15,1,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,14,1,2,'T~O',3,null,'BAS',0)"); + + //Block1 -- End + + //Block3 -- Start + $this->db->query("insert into vtiger_field values (2,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,3,1,'V~O',1,null,'BAS',1)"); + //Block3 -- End + //Potential Details -- END + + //campaign entries being added + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'campaignname','vtiger_campaign',1,'2','campaignname','Campaign Name',1,0,0,100,1,$campaignbasicblockid,1,'V~M',0,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'campaign_no','vtiger_campaign',1,'4','campaign_no','Campaign No',1,0,0,100,2,$campaignbasicblockid,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'campaigntype','vtiger_campaign',1,15,'campaigntype','Campaign Type',1,2,0,100,5,$campaignbasicblockid,1,'V~O',2,3,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'product_id','vtiger_campaign',1,59,'product_id','Product',1,2,0,100,6,$campaignbasicblockid,1,'I~O',2,5,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'campaignstatus','vtiger_campaign',1,15,'campaignstatus','Campaign Status',1,2,0,100,4,$campaignbasicblockid,1,'V~O',2,6,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'closingdate','vtiger_campaign',1,'23','closingdate','Expected Close Date',1,2,0,100,8,$campaignbasicblockid,1,'D~M',2,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,3,$campaignbasicblockid,1,'V~M',0,7,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'numsent','vtiger_campaign',1,'9','numsent','Num Sent',1,2,0,100,12,$campaignbasicblockid,1,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'sponsor','vtiger_campaign',1,'1','sponsor','Sponsor',1,2,0,100,9,$campaignbasicblockid,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'targetaudience','vtiger_campaign',1,'1','targetaudience','Target Audience',1,2,0,100,7,$campaignbasicblockid,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values(26,".$this->db->getUniqueID("vtiger_field").",'targetsize','vtiger_campaign',1,'1','targetsize','TargetSize',1,2,0,100,10,$campaignbasicblockid,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,11,$campaignbasicblockid,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,13,$campaignbasicblockid,2,'T~O',3,null,'BAS',0)"); + + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'expectedresponse','vtiger_campaign',1,'15','expectedresponse','Expected Response',1,2,0,100,3,$campaignexpectedandactualsblock,1,'V~O',2,4,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'expectedrevenue','vtiger_campaign',1,'1','expectedrevenue','Expected Revenue',1,2,0,100,4,$campaignexpectedandactualsblock,1,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'budgetcost','vtiger_campaign',1,'1','budgetcost','Budget Cost',1,2,0,100,1,$campaignexpectedandactualsblock,1,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'actualcost','vtiger_campaign',1,'1','actualcost','Actual Cost',1,2,0,100,2,$campaignexpectedandactualsblock,1,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values(26,".$this->db->getUniqueID("vtiger_field").",'expectedresponsecount','vtiger_campaign',1,'1','expectedresponsecount','Expected Response Count',1,2,0,100,7,$campaignexpectedandactualsblock,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values(26,".$this->db->getUniqueID("vtiger_field").",'expectedsalescount','vtiger_campaign',1,'1','expectedsalescount','Expected Sales Count',1,2,0,100,5,$campaignexpectedandactualsblock,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values(26,".$this->db->getUniqueID("vtiger_field").",'expectedroi','vtiger_campaign',1,'1','expectedroi','Expected ROI',1,2,0,100,9,$campaignexpectedandactualsblock,1,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values(26,".$this->db->getUniqueID("vtiger_field").",'actualresponsecount','vtiger_campaign',1,'1','actualresponsecount','Actual Response Count',1,2,0,100,8,$campaignexpectedandactualsblock,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values(26,".$this->db->getUniqueID("vtiger_field").",'actualsalescount','vtiger_campaign',1,'1','actualsalescount','Actual Sales Count',1,2,0,100,6,$campaignexpectedandactualsblock,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values(26,".$this->db->getUniqueID("vtiger_field").",'actualroi','vtiger_campaign',1,'1','actualroi','Actual ROI',1,2,0,100,10,$campaignexpectedandactualsblock,1,'N~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (26,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,$campaidndescriptionblock,1,'V~O',1,null,'BAS',1)"); + //Campaign entries end + + //Ticket Details -- START + //Block25 -- Start + + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'ticket_no','vtiger_troubletickets',1,'4','ticket_no','Ticket No',1,0,0,100,13,25,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,4,25,1,'V~M',0,4,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'parent_id','vtiger_troubletickets',1,'68','parent_id','Related To',1,0,0,100,2,25,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'priority','vtiger_troubletickets',1,'15','ticketpriorities','Priority',1,2,0,100,6,25,1,'V~O',2,3,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'product_id','vtiger_troubletickets',1,'59','product_id','Product Name',1,2,0,100,5,25,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'severity','vtiger_troubletickets',1,'15','ticketseverities','Severity',1,2,0,100,8,25,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'status','vtiger_troubletickets',1,'15','ticketstatus','Status',1,2,0,100,7,25,1,'V~M',1,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'category','vtiger_troubletickets',1,'15','ticketcategories','Category',1,2,0,100,10,25,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'update_log','vtiger_troubletickets',1,'19','update_log','Update History',1,0,0,100,11,25,3,'V~O',1,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'hours','vtiger_troubletickets',1,'1','hours','Hours',1,2,0,100,9,25,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'days','vtiger_troubletickets',1,'1','days','Days',1,2,0,100,10,25,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,9,25,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,12,25,2,'T~O',3,null,'BAS',0)"); + + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'title','vtiger_troubletickets',1,'22','ticket_title','Title',1,0,0,100,1,25,1,'V~M',0,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,28,1,'V~O',2,4,'BAS',1)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'solution','vtiger_troubletickets',1,'19','solution','Solution',1,0,0,100,1,29,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (13,".$this->db->getUniqueID("vtiger_field").",'comments','vtiger_ticketcomments',1,'19','comments','Add Comment',1,0,0,100,1,30,1,'V~O',3,null,'BAS',0)"); + + //Block25-30 -- End + //Ticket Details -- END + + //Product Details -- START + //Block31-36 -- Start + + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'productname','vtiger_products',1,'2','productname','Product Name',1,0,0,100,1,31,1,'V~M',0,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'product_no','vtiger_products',1,'4','product_no','Product No',1,0,0,100,2,31,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'productcode','vtiger_products',1,'1','productcode','Part Number',1,2,0,100,4,31,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'discontinued','vtiger_products',1,'56','discontinued','Product Active',1,2,0,100,3,31,1,'V~O',2,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'manufacturer','vtiger_products',1,'15','manufacturer','Manufacturer',1,2,0,100,6,31,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'productcategory','vtiger_products',1,'15','productcategory','Product Category',1,2,0,100,6,31,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'sales_start_date','vtiger_products',1,'5','sales_start_date','Sales Start Date',1,2,0,100,5,31,1,'D~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'sales_end_date','vtiger_products',1,'5','sales_end_date','Sales End Date',1,2,0,100,8,31,1,'D~O~OTH~GE~sales_start_date~Sales Start Date',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'start_date','vtiger_products',1,'5','start_date','Support Start Date',1,2,0,100,7,31,1,'D~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'expiry_date','vtiger_products',1,'5','expiry_date','Support Expiry Date',1,2,0,100,10,31,1,'D~O~OTH~GE~start_date~Start Date',1,null,'BAS',1)"); + + + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'website','vtiger_products',1,'17','website','Website',1,2,0,100,14,31,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'vendor_id','vtiger_products',1,'75','vendor_id','Vendor Name',1,2,0,100,13,31,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'mfr_part_no','vtiger_products',1,'1','mfr_part_no','Mfr PartNo',1,2,0,100,16,31,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'vendor_part_no','vtiger_products',1,'1','vendor_part_no','Vendor PartNo',1,2,0,100,15,31,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'serialno','vtiger_products',1,'1','serial_no','Serial No',1,2,0,100,18,31,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'productsheet','vtiger_products',1,'1','productsheet','Product Sheet',1,2,0,100,17,31,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'glacct','vtiger_products',1,'15','glacct','GL Account',1,2,0,100,20,31,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,19,31,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,21,31,2,'T~O',3,null,'BAS',0)"); + + + //Block32 Pricing Information + + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'unit_price','vtiger_products',1,'71','unit_price','Unit Price',1,2,0,100,1,32,1,'N~O',2,3,'BAS',0)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'commissionrate','vtiger_products',1,'9','commissionrate','Commission Rate',1,2,0,100,2,32,1,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'taxclass','vtiger_products',1,'83','taxclass','Tax Class',1,2,0,100,4,32,1,'V~O',3,null,'BAS',1)"); + + + //Block 33 stock info + + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'usageunit','vtiger_products',1,'15','usageunit','Usage Unit',1,2,0,100,1,33,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'qty_per_unit','vtiger_products',1,'1','qty_per_unit','Qty/Unit',1,2,0,100,2,33,1,'N~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'qtyinstock','vtiger_products',1,'1','qtyinstock','Qty In Stock',1,2,0,100,3,33,1,'NN~O',0,4,'ADV',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'reorderlevel','vtiger_products',1,'1','reorderlevel','Reorder Level',1,2,0,100,4,33,1,'I~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'handler','vtiger_products',1,'52','assigned_user_id','Handler',1,0,0,100,5,33,1,'I~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'qtyindemand','vtiger_products',1,'1','qtyindemand','Qty In Demand',1,2,0,100,6,33,1,'I~O',1,null,'ADV',1)"); + + //ProductImageInformation + + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'imagename','vtiger_products',1,'69','imagename','Product Image',1,2,0,100,1,35,1,'V~O',3,null,'ADV',1)"); + + //Block 36 Description Info + $this->db->query("insert into vtiger_field values (14,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,36,1,'V~O',1,null,'BAS',1)"); + + //Product Details -- END + + //Documents Details -- START + //Block17 -- Start + + $this->db->query("insert into vtiger_field values (8,".$this->db->getUniqueID("vtiger_field").",'title','vtiger_notes',1,'2','notes_title','Title',1,0,0,100,1,17,1,'V~M',0,1,'BAS',0)"); + $this->db->query("insert into vtiger_field values (8,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,5,17,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (8,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,6,17,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (8,".$this->db->getUniqueID("vtiger_field").",'filename','vtiger_notes',1,'28','filename','File Name',1,2,0,100,3,".$fileblockid.",1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (8,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,4,17,1,'V~M',0,3,'BAS',0)"); + $this->db->query("insert into vtiger_field values (8,".$this->db->getUniqueID("vtiger_field").",'notecontent','vtiger_notes',1,'19','notecontent','Note',1,2,0,100,1,$desc_blockid,1,'V~O',1,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values(8,".$this->db->getUniqueID("vtiger_field").",'filetype','vtiger_notes',1,1,'filetype','File Type',1,2,0,100,5,".$fileblockid.",2,'V~O',3,'','BAS',0)"); + $this->db->query("insert into vtiger_field values(8,".$this->db->getUniqueID("vtiger_field").",'filesize','vtiger_notes',1,1,'filesize','File Size',1,2,0,100,4,".$fileblockid.",2,'V~O',3,'','BAS',0)"); + $this->db->query("insert into vtiger_field values(8,".$this->db->getUniqueID("vtiger_field").",'filelocationtype','vtiger_notes',1,27,'filelocationtype','Download Type',1,0,0,100,1,".$fileblockid.",1,'V~O',1,'','BAS',0)"); + $this->db->query("insert into vtiger_field values(8,".$this->db->getUniqueID("vtiger_field").",'fileversion','vtiger_notes',1,1,'fileversion','Version',1,2,0,100,6,$fileblockid,1,'V~O',1,'','BAS',0)"); + $this->db->query("insert into vtiger_field values(8,".$this->db->getUniqueID("vtiger_field").",'filestatus','vtiger_notes',1,56,'filestatus','Active',1,2,0,100,2,".$fileblockid.",1,'V~O',1,'','BAS',0)"); + $this->db->query("insert into vtiger_field values(8,".$this->db->getUniqueID("vtiger_field").",'filedownloadcount','vtiger_notes',1,1,'filedownloadcount','Download Count',1,2,0,100,7,".$fileblockid.",2,'I~O',3,'','BAS',0)"); + $this->db->query("insert into vtiger_field values(8,".$this->db->getUniqueID("vtiger_field").",'folderid','vtiger_notes',1,26,'folderid','Folder Name',1,2,0,100,2,17,1,'V~O',2,2,'BAS',0)"); + + $this->db->query("insert into vtiger_field values (8,".$this->db->getUniqueID("vtiger_field").",'note_no','vtiger_notes',1,'4','note_no','Document No',1,0,0,100,3,17,1,'V~0',3,null,'BAS',0)"); + + //Block17 -- End + //Documents Details -- END + + //Email Details -- START + //Block21 -- Start + + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'date_start','vtiger_activity',1,'6','date_start','Date & Time Sent',1,0,0,100,1,21,1,'DT~M~time_start~Time Start',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'semodule','vtiger_activity',1,'2','parent_type','Sales Enity Module',1,0,0,100,2,21,3,'',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'activitytype','vtiger_activity',1,'2','activitytype','Activtiy Type',1,0,0,100,3,21,3,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'crmid','vtiger_seactivityrel',1,'357','parent_id','Related To',1,0,0,100,1,22,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,5,21,1,'V~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'subject','vtiger_activity',1,'2','subject','Subject',1,0,0,100,1,23,1,'V~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'name','vtiger_attachments',1,'61','filename','Attachment',1,0,0,100,2,23,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,0,0,100,1,24,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'time_start','vtiger_activity',1,'2','time_start','Time Start',1,0,0,100,9,23,1,'T~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,10,22,1,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (10,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,11,21,2,'T~O',3,null,'BAS',0)"); + $this->db->query("INSERT INTO vtiger_field VALUES (10,".$this->db->getUniqueID("vtiger_field").", 'access_count', 'vtiger_email_track', '1', '25', 'access_count', 'Access Count', '1', '0', '0', '100', '6', '21', '3', 'V~O', '1', NULL, 'BAS', 0)"); + + //Block21 -- End + //Email Details -- END + + //Task Details --START + //Block19 -- Start + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'subject','vtiger_activity',1,'2','subject','Subject',1,0,0,100,1,19,1,'V~M',0,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,2,19,1,'V~M',0,4,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'date_start','vtiger_activity',1,'6','date_start','Start Date & Time',1,0,0,100,3,19,1,'DT~M~time_start',0,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'time_start','vtiger_activity',1,'2','time_start','Time Start',1,0,0,100,4,19,3,'T~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'time_end','vtiger_activity',1,'2','time_end','End Time',1,0,0,100,4,19,3,'T~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'due_date','vtiger_activity',1,'23','due_date','Due Date',1,0,0,100,5,19,1,'D~M~OTH~GE~date_start~Start Date & Time',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'crmid','vtiger_seactivityrel',1,'66','parent_id','Related To',1,0,0,100,7,19,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'contactid','vtiger_cntactivityrel',1,'57','contact_id','Contact Name',1,0,0,100,8,19,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'status','vtiger_activity',1,'15','taskstatus','Status',1,0,0,100,8,19,1,'V~M',0,3,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'eventstatus','vtiger_activity',1,'15','eventstatus','Status',1,0,0,100,9,19,3,'V~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'priority','vtiger_activity',1,'15','taskpriority','Priority',1,0,0,100,10,19,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'sendnotification','vtiger_activity',1,'56','sendnotification','Send Notification',1,0,0,100,11,19,1,'C~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,14,19,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,15,19,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'activitytype','vtiger_activity',1,'15','activitytype','Activity Type',1,0,0,100,16,19,3,'V~O',1,null,'BAS',1)"); + $this->db->query("Insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'visibility','vtiger_activity',1,'16','visibility','Visibility',1,0,0,100,17,19,3,'V~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,0,0,100,1,20,1,'V~O',1,null,'BAS',1)"); + + + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'duration_hours','vtiger_activity',1,'63','duration_hours','Duration',1,0,0,100,17,19,3,'T~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'duration_minutes','vtiger_activity',1,'16','duration_minutes','Duration Minutes',1,0,0,100,18,19,3,'T~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'location','vtiger_activity',1,'1','location','Location',1,0,0,100,19,19,3,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'reminder_time','vtiger_activity_reminder',1,'30','reminder_time','Send Reminder',1,0,0,100,1,19,3,'I~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'recurringtype','vtiger_activity',1,'16','recurringtype','Recurrence',1,0,0,100,6,19,3,'O~O',1,null,'BAS',1)"); + + $this->db->query("Insert into vtiger_field values (9,".$this->db->getUniqueID("vtiger_field").",'notime','vtiger_activity',1,56,'notime','No Time',1,0,0,100,20,19,3,'C~O',1,null,'BAS',1)"); + //Block19 -- End + //Task Details -- END + + //Event Details --START + //Block41-43-- Start + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'subject','vtiger_activity',1,'2','subject','Subject',1,0,0,100,1,41,1,'V~M',0,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,2,41,1,'V~M',0,6,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'date_start','vtiger_activity',1,'6','date_start','Start Date & Time',1,0,0,100,3,41,1,'DT~M~time_start',0,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'time_start','vtiger_activity',1,'2','time_start','Time Start',1,0,0,100,4,41,3,'T~M',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'due_date','vtiger_activity',1,'23','due_date','End Date',1,0,0,100,5,41,1,'D~M~OTH~GE~date_start~Start Date & Time',0,5,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'time_end','vtiger_activity',1,'2','time_end','End Time',1,0,0,100,5,41,3,'T~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'recurringtype','vtiger_activity',1,'16','recurringtype','Recurrence',1,0,0,100,6,41,1,'O~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'duration_hours','vtiger_activity',1,'63','duration_hours','Duration',1,0,0,100,7,41,1,'I~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'duration_minutes','vtiger_activity',1,'16','duration_minutes','Duration Minutes',1,0,0,100,8,41,3,'O~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'crmid','vtiger_seactivityrel',1,'66','parent_id','Related To',1,0,0,100,9,41,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'eventstatus','vtiger_activity',1,'15','eventstatus','Status',1,0,0,100,10,41,1,'V~M',0,3,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'sendnotification','vtiger_activity',1,'56','sendnotification','Send Notification',1,0,0,100,11,41,1,'C~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'activitytype','vtiger_activity',1,'15','activitytype','Activity Type',1,0,0,100,12,41,1,'V~M',0,4,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'location','vtiger_activity',1,'1','location','Location',1,0,0,100,13,41,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,14,41,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,15,41,2,'T~O',3,null,'BAS',0)"); + $this->db->query("Insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'priority','vtiger_activity',1,15,'taskpriority','Priority',1,0,0,100,16,41,1,'V~O',1,null,'BAS',1)"); + $this->db->query("Insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'notime','vtiger_activity',1,56,'notime','No Time',1,0,0,100,17,41,1,'C~O',1,null,'BAS',1)"); + $this->db->query("Insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'visibility','vtiger_activity',1,'16','visibility','Visibility',1,0,0,100,18,41,1,'V~O',1,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,0,0,100,1,41,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'reminder_time','vtiger_activity_reminder',1,'30','reminder_time','Send Reminder',1,0,0,100,1,40,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (16,".$this->db->getUniqueID("vtiger_field").",'contactid','vtiger_cntactivityrel',1,'57','contact_id','Contact Name',1,0,0,100,1,19,1,'I~O',1,null,'BAS',1)"); + + //Block41-43 -- End + //Event Details -- END + + //Faq Details -- START + //Block37-40 -- Start + + $this->db->query("insert into vtiger_field values (15,".$this->db->getUniqueID("vtiger_field").",'product_id','vtiger_faq',1,'59','product_id','Product Name',1,2,0,100,1,37,1,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (15,".$this->db->getUniqueID("vtiger_field").",'faq_no','vtiger_faq',1,'4','faq_no','Faq No',1,0,0,100,2,37,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (15,".$this->db->getUniqueID("vtiger_field").",'category','vtiger_faq',1,'15','faqcategories','Category',1,2,0,100,4,37,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (15,".$this->db->getUniqueID("vtiger_field").",'status','vtiger_faq',1,'15','faqstatus','Status',1,2,0,100,3,37,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (15,".$this->db->getUniqueID("vtiger_field").",'question','vtiger_faq',1,'20','question','Question',1,2,0,100,7,37,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (15,".$this->db->getUniqueID("vtiger_field").",'answer','vtiger_faq',1,'20','faq_answer','Answer',1,2,0,100,8,37,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (15,".$this->db->getUniqueID("vtiger_field").",'comments','vtiger_faqcomments',1,'19','comments','Add Comment',1,0,0,100,1,38,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (15,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,5,37,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (15,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,6,37,2,'T~O',3,null,'BAS',0)"); + + + //Block37-40 -- End + //Ticket Details -- END + + //Vendor Details --START + //Block44-47 + + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'vendorname','vtiger_vendor',1,'2','vendorname','Vendor Name',1,0,0,100,1,$vendorbasicinfo,1,'V~M',0,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'vendor_no','vtiger_vendor',1,'4','vendor_no','Vendor No',1,0,0,100,2,$vendorbasicinfo,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'phone','vtiger_vendor',1,'1','phone','Phone',1,2,0,100,4,$vendorbasicinfo,1,'V~O',2,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'email','vtiger_vendor',1,'13','email','Email',1,2,0,100,3,$vendorbasicinfo,1,'E~O',2,3,'BAS',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'website','vtiger_vendor',1,'17','website','Website',1,2,0,100,6,$vendorbasicinfo,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'glacct','vtiger_vendor',1,'15','glacct','GL Account',1,2,0,100,5,$vendorbasicinfo,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'category','vtiger_vendor',1,'1','category','Category',1,2,0,100,8,$vendorbasicinfo,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,7,$vendorbasicinfo,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,9,$vendorbasicinfo,2,'T~O',3,null,'BAS',0)"); + + //Block 46 + + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'street','vtiger_vendor',1,'21','street','Street',1,2,0,100,1,$vendoraddressblock,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'pobox','vtiger_vendor',1,'1','pobox','Po Box',1,2,0,100,2,$vendoraddressblock,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'city','vtiger_vendor',1,'1','city','City',1,2,0,100,3,$vendoraddressblock,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'state','vtiger_vendor',1,'1','state','State',1,2,0,100,4,$vendoraddressblock,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'postalcode','vtiger_vendor',1,'1','postalcode','Postal Code',1,2,0,100,5,$vendoraddressblock,1,'V~O',1,null,'ADV',1)"); + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'country','vtiger_vendor',1,'1','country','Country',1,2,0,100,6,$vendoraddressblock,1,'V~O',1,null,'ADV',1)"); + + //Block 47 + + $this->db->query("insert into vtiger_field values (18,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,$vendordescriptionblock,1,'V~O',1,null,'ADV',1)"); + + //Vendor Details -- END + + //PriceBook Details Start + //Block48 + + $this->db->query("insert into vtiger_field values (19,".$this->db->getUniqueID("vtiger_field").",'bookname','vtiger_pricebook',1,'2','bookname','Price Book Name',1,0,0,100,1,$pricebookbasicblock,1,'V~M',0,1,'BAS',1)"); + $this->db->query("insert into vtiger_field values (19,".$this->db->getUniqueID("vtiger_field").",'pricebook_no','vtiger_pricebook',1,'4','pricebook_no','PriceBook No',1,0,0,100,3,$pricebookbasicblock,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (19,".$this->db->getUniqueID("vtiger_field").",'active','vtiger_pricebook',1,'56','active','Active',1,2,0,100,2,$pricebookbasicblock,1,'C~O',2,2,'BAS',1)"); + $this->db->query("insert into vtiger_field values (19,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,4,$pricebookbasicblock,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (19,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,5,$pricebookbasicblock,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (19,".$this->db->getUniqueID("vtiger_field").",'currency_id','vtiger_pricebook',1,'117','currency_id','Currency',1,0,0,100,5,$pricebookbasicblock,1,'I~M',0,3,'BAS',0)"); + //Block50 + + $this->db->query("insert into vtiger_field values (19,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,$pricebookdescription,1,'V~O',1,null,'BAS',1)"); + + //PriceBook Details End + + + //Quote Details -- START + //Block51 + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'quote_no','vtiger_quotes',1,'4','quote_no','Quote No',1,0,0,100,3,$quotesbasicblock,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'subject','vtiger_quotes',1,'2','subject','Subject',1,0,0,100,1,$quotesbasicblock,1,'V~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'potentialid','vtiger_quotes',1,'76','potential_id','Potential Name',1,2,0,100,2,$quotesbasicblock,1,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'quotestage','vtiger_quotes',1,'15','quotestage','Quote Stage',1,2,0,100,4,$quotesbasicblock,1,'V~M',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'validtill','vtiger_quotes',1,'5','validtill','Valid Till',1,2,0,100,5,$quotesbasicblock,1,'D~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'contactid','vtiger_quotes',1,'57','contact_id','Contact Name',1,2,0,100,6,$quotesbasicblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'carrier','vtiger_quotes',1,'15','carrier','Carrier',1,2,0,100,8,$quotesbasicblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'subtotal','vtiger_quotes',1,'1','hdnSubTotal','Sub Total',1,2,0,100,9,$quotesbasicblock,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'shipping','vtiger_quotes',1,'1','shipping','Shipping',1,2,0,100,10,$quotesbasicblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'inventorymanager','vtiger_quotes',1,'77','assigned_user_id1','Inventory Manager',1,2,0,100,11,$quotesbasicblock,1,'I~O',3,null,'BAS',1)"); + //$this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'tax','vtiger_quotes',1,'1','txtTax','Sales Tax',1,0,0,100,13,51,3,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'adjustment','vtiger_quotes',1,'1','txtAdjustment','Adjustment',1,2,0,100,20,$quotesbasicblock,3,'NN~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'total','vtiger_quotes',1,'1','hdnGrandTotal','Total',1,2,0,100,14,$quotesbasicblock,3,'N~O',3,null,'BAS',1)"); + //Added fields taxtype, discount percent, discount amount and S&H amount for Tax process + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'taxtype','vtiger_quotes',1,'16','hdnTaxType','Tax Type',1,2,0,100,14,$quotesbasicblock,3,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'discount_percent','vtiger_quotes',1,'1','hdnDiscountPercent','Discount Percent',1,2,0,100,14,$quotesbasicblock,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'discount_amount','vtiger_quotes',1,'1','hdnDiscountAmount','Discount Amount',1,2,0,100,14,$quotesbasicblock,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'s_h_amount','vtiger_quotes',1,'1','hdnS_H_Amount','S&H Amount',1,2,0,100,14,$quotesbasicblock,3,'N~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'accountid','vtiger_quotes',1,'73','account_id','Account Name',1,2,0,100,16,$quotesbasicblock,1,'I~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,17,$quotesbasicblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,18,$quotesbasicblock,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,19,$quotesbasicblock,2,'T~O',3,null,'BAS',0)"); + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'currency_id','vtiger_quotes',1,'117','currency_id','Currency',1,2,1,100,20,$quotesbasicblock,3,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'conversion_rate','vtiger_quotes',1,'1','conversion_rate','Conversion Rate',1,2,1,100,21,$quotesbasicblock,3,'N~O',3,null,'BAS',1)"); + + //Block 53 + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'bill_street','vtiger_quotesbillads',1,'24','bill_street','Billing Address',1,2,0,100,1,$quotesaddressblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'ship_street','vtiger_quotesshipads',1,'24','ship_street','Shipping Address',1,2,0,100,2,$quotesaddressblock,1,'V~M',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'bill_city','vtiger_quotesbillads',1,'1','bill_city','Billing City',1,2,0,100,5,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'ship_city','vtiger_quotesshipads',1,'1','ship_city','Shipping City',1,2,0,100,6,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'bill_state','vtiger_quotesbillads',1,'1','bill_state','Billing State',1,2,0,100,7,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'ship_state','vtiger_quotesshipads',1,'1','ship_state','Shipping State',1,2,0,100,8,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'bill_code','vtiger_quotesbillads',1,'1','bill_code','Billing Code',1,2,0,100,9,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'ship_code','vtiger_quotesshipads',1,'1','ship_code','Shipping Code',1,2,0,100,10,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'bill_country','vtiger_quotesbillads',1,'1','bill_country','Billing Country',1,2,0,100,11,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'ship_country','vtiger_quotesshipads',1,'1','ship_country','Shipping Country',1,2,0,100,12,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'bill_pobox','vtiger_quotesbillads',1,'1','bill_pobox','Billing Po Box',1,2,0,100,3,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'ship_pobox','vtiger_quotesshipads',1,'1','ship_pobox','Shipping Po Box',1,0,0,100,4,$quotesaddressblock,1,'V~O',3,null,'BAS',1)"); + //Block55 + + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,$quotedescription,1,'V~O',3,null,'ADV',1)"); + + //Block 56 + $this->db->query("insert into vtiger_field values (20,".$this->db->getUniqueID("vtiger_field").",'terms_conditions','vtiger_quotes',1,'19','terms_conditions','Terms & Conditions',1,2,0,100,1,$quotetermsblock,1,'V~O',3,null,'ADV',1)"); + + + //Quote Details -- END + + //Purchase Order Details -- START + //Block57 + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'purchaseorder_no','vtiger_purchaseorder',1,'4','purchaseorder_no','PurchaseOrder No',1,0,0,100,2,$pobasicblock,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'subject','vtiger_purchaseorder',1,'2','subject','Subject',1,0,0,100,1,$pobasicblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'vendorid','vtiger_purchaseorder',1,'81','vendor_id','Vendor Name',1,0,0,100,3,$pobasicblock,1,'I~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'requisition_no','vtiger_purchaseorder',1,'1','requisition_no','Requisition No',1,2,0,100,4,$pobasicblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'tracking_no','vtiger_purchaseorder',1,'1','tracking_no','Tracking Number',1,2,0,100,5,$pobasicblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'contactid','vtiger_purchaseorder',1,'57','contact_id','Contact Name',1,2,0,100,6,$pobasicblock,1,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'duedate','vtiger_purchaseorder',1,'5','duedate','Due Date',1,2,0,100,7,$pobasicblock,1,'D~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'carrier','vtiger_purchaseorder',1,'15','carrier','Carrier',1,2,0,100,8,$pobasicblock,1,'V~O',3,null,'BAS',1)"); + //$this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'salestax','vtiger_purchaseorder',1,'1','txtTax','Sales Tax',1,0,0,100,10,57,3,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'adjustment','vtiger_purchaseorder',1,'1','txtAdjustment','Adjustment',1,2,0,100,10,$pobasicblock,3,'NN~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'salescommission','vtiger_purchaseorder',1,'1','salescommission','Sales Commission',1,2,0,100,11,$pobasicblock,1,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'exciseduty','vtiger_purchaseorder',1,'1','exciseduty','Excise Duty',1,2,0,100,12,$pobasicblock,1,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'total','vtiger_purchaseorder',1,'1','hdnGrandTotal','Total',1,2,0,100,13,$pobasicblock,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'subtotal','vtiger_purchaseorder',1,'1','hdnSubTotal','Sub Total',1,2,0,100,14,$pobasicblock,3,'N~O',3,null,'BAS',1)"); + //Added fields taxtype, discount percent, discount amount and S&H amount for Tax process + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'taxtype','vtiger_purchaseorder',1,'16','hdnTaxType','Tax Type',1,2,0,100,14,$pobasicblock,3,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'discount_percent','vtiger_purchaseorder',1,'1','hdnDiscountPercent','Discount Percent',1,2,0,100,14,$pobasicblock,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'discount_amount','vtiger_purchaseorder',1,'1','hdnDiscountAmount','Discount Amount',1,0,0,100,14,$pobasicblock,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'s_h_amount','vtiger_purchaseorder',1,'1','hdnS_H_Amount','S&H Amount',1,2,0,100,14,$pobasicblock,3,'N~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'postatus','vtiger_purchaseorder',1,'15','postatus','Status',1,2,0,100,15,$pobasicblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,16,$pobasicblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,17,$pobasicblock,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,18,$pobasicblock,2,'T~O',3,null,'BAS',0)"); + + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'currency_id','vtiger_purchaseorder',1,'117','currency_id','Currency',1,2,1,100,19,$pobasicblock,3,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'conversion_rate','vtiger_purchaseorder',1,'1','conversion_rate','Conversion Rate',1,2,1,100,20,$pobasicblock,3,'N~O',3,null,'BAS',1)"); + + //Block 59 + + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'bill_street','vtiger_pobillads',1,'24','bill_street','Billing Address',1,2,0,100,1,$poaddressblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'ship_street','vtiger_poshipads',1,'24','ship_street','Shipping Address',1,2,0,100,2,$poaddressblock,1,'V~M',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'bill_city','vtiger_pobillads',1,'1','bill_city','Billing City',1,2,0,100,5,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'ship_city','vtiger_poshipads',1,'1','ship_city','Shipping City',1,2,0,100,6,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'bill_state','vtiger_pobillads',1,'1','bill_state','Billing State',1,2,0,100,7,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'ship_state','vtiger_poshipads',1,'1','ship_state','Shipping State',1,2,0,100,8,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'bill_code','vtiger_pobillads',1,'1','bill_code','Billing Code',1,2,0,100,9,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'ship_code','vtiger_poshipads',1,'1','ship_code','Shipping Code',1,2,0,100,10,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + + + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'bill_country','vtiger_pobillads',1,'1','bill_country','Billing Country',1,2,0,100,11,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'ship_country','vtiger_poshipads',1,'1','ship_country','Shipping Country',1,2,0,100,12,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'bill_pobox','vtiger_pobillads',1,'1','bill_pobox','Billing Po Box',1,2,0,100,3,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'ship_pobox','vtiger_poshipads',1,'1','ship_pobox','Shipping Po Box',1,2,0,100,4,$poaddressblock,1,'V~O',3,null,'BAS',1)"); + + //Block61 + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,$podescription,1,'V~O',3,null,'ADV',1)"); + + //Block62 + $this->db->query("insert into vtiger_field values (21,".$this->db->getUniqueID("vtiger_field").",'terms_conditions','vtiger_purchaseorder',1,'19','terms_conditions','Terms & Conditions',1,2,0,100,1,$potermsblock,1,'V~O',3,null,'ADV',1)"); + + //Purchase Order Details -- END + + //Sales Order Details -- START + //Block63 + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'salesorder_no','vtiger_salesorder',1,'4','salesorder_no','SalesOrder No',1,0,0,100,4,$sobasicblock ,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'subject','vtiger_salesorder',1,'2','subject','Subject',1,0,0,100,1,$sobasicblock ,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'potentialid','vtiger_salesorder',1,'76','potential_id','Potential Name',1,2,0,100,2,$sobasicblock ,1,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'customerno','vtiger_salesorder',1,'1','customerno','Customer No',1,2,0,100,3,$sobasicblock ,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'quoteid','vtiger_salesorder',1,'78','quote_id','Quote Name',1,2,0,100,5,$sobasicblock ,1,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'purchaseorder','vtiger_salesorder',1,'1','vtiger_purchaseorder','Purchase Order',1,2,0,100,5,$sobasicblock ,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'contactid','vtiger_salesorder',1,'57','contact_id','Contact Name',1,2,0,100,6,$sobasicblock ,1,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'duedate','vtiger_salesorder',1,'5','duedate','Due Date',1,2,0,100,8,$sobasicblock ,1,'D~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'carrier','vtiger_salesorder',1,'15','carrier','Carrier',1,2,0,100,9,$sobasicblock ,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'pending','vtiger_salesorder',1,'1','pending','Pending',1,2,0,100,10,$sobasicblock ,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'sostatus','vtiger_salesorder',1,'15','sostatus','Status',1,2,0,100,11,$sobasicblock ,1,'V~M',3,null,'BAS',1)"); + //$this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'salestax','vtiger_salesorder',1,'1','txtTax','Sales Tax',1,0,0,100,12,63,3,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'adjustment','vtiger_salesorder',1,'1','txtAdjustment','Adjustment',1,2,0,100,12,$sobasicblock ,3,'NN~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'salescommission','vtiger_salesorder',1,'1','salescommission','Sales Commission',1,2,0,100,13,$sobasicblock ,1,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'exciseduty','vtiger_salesorder',1,'1','exciseduty','Excise Duty',1,2,0,100,13,$sobasicblock ,1,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'total','vtiger_salesorder',1,'1','hdnGrandTotal','Total',1,2,0,100,14,$sobasicblock ,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'subtotal','vtiger_salesorder',1,'1','hdnSubTotal','Sub Total',1,2,0,100,15,$sobasicblock ,3,'N~O',3,null,'BAS',1)"); + //Added fields taxtype, discount percent, discount amount and S&H amount for Tax process + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'taxtype','vtiger_salesorder',1,'16','hdnTaxType','Tax Type',1,2,0,100,15,$sobasicblock ,3,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'discount_percent','vtiger_salesorder',1,'1','hdnDiscountPercent','Discount Percent',1,2,0,100,15,$sobasicblock ,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'discount_amount','vtiger_salesorder',1,'1','hdnDiscountAmount','Discount Amount',1,0,0,100,15,$sobasicblock ,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'s_h_amount','vtiger_salesorder',1,'1','hdnS_H_Amount','S&H Amount',1,2,0,100,15,$sobasicblock ,3,'N~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'accountid','vtiger_salesorder',1,'73','account_id','Account Name',1,2,0,100,16,$sobasicblock ,1,'I~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,17,$sobasicblock ,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,18,$sobasicblock ,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,19,$sobasicblock ,2,'T~O',3,null,'BAS',0)"); + + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'currency_id','vtiger_salesorder',1,'117','currency_id','Currency',1,2,1,100,20,$sobasicblock ,3,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'conversion_rate','vtiger_salesorder',1,'1','conversion_rate','Conversion Rate',1,2,1,100,21,$sobasicblock ,3,'N~O',3,null,'BAS',1)"); + + + //Block 65 + + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'bill_street','vtiger_sobillads',1,'24','bill_street','Billing Address',1,2,0,100,1,$soaddressblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'ship_street','vtiger_soshipads',1,'24','ship_street','Shipping Address',1,2,0,100,2,$soaddressblock,1,'V~M',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'bill_city','vtiger_sobillads',1,'1','bill_city','Billing City',1,2,0,100,5,$soaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'ship_city','vtiger_soshipads',1,'1','ship_city','Shipping City',1,2,0,100,6,$soaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'bill_state','vtiger_sobillads',1,'1','bill_state','Billing State',1,2,0,100,7,$soaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'ship_state','vtiger_soshipads',1,'1','ship_state','Shipping State',1,2,0,100,8,$soaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'bill_code','vtiger_sobillads',1,'1','bill_code','Billing Code',1,2,0,100,9,$soaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'ship_code','vtiger_soshipads',1,'1','ship_code','Shipping Code',1,2,0,100,10,$soaddressblock,1,'V~O',3,null,'BAS',1)"); + + + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'bill_country','vtiger_sobillads',1,'1','bill_country','Billing Country',1,2,0,100,11,$soaddressblock,3,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'ship_country','vtiger_soshipads',1,'1','ship_country','Shipping Country',1,2,0,100,12,$soaddressblock,3,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'bill_pobox','vtiger_sobillads',1,'1','bill_pobox','Billing Po Box',1,2,0,100,3,$soaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'ship_pobox','vtiger_soshipads',1,'1','ship_pobox','Shipping Po Box',1,2,0,100,4,$soaddressblock,1,'V~O',3,null,'BAS',1)"); + + //Block67 + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,$sodescription,1,'V~O',3,null,'ADV',1)"); + + //Block68 + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID("vtiger_field").",'terms_conditions','vtiger_salesorder',1,'19','terms_conditions','Terms & Conditions',1,2,0,100,1,$sotermsblock,1,'V~O',3,null,'ADV',1)"); + + // Add fields for the Recurring Information block - Block 86 + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID('vtiger_field').",'enable_recurring','vtiger_salesorder',1,'56','enable_recurring','Enable Recurring',1,0,0,100,1,$sorecurringinvoiceblock,1,'C~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID('vtiger_field').",'recurring_frequency','vtiger_invoice_recurring_info',1,'16','recurring_frequency','Frequency',1,0,0,100,2,$sorecurringinvoiceblock,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID('vtiger_field').",'start_period','vtiger_invoice_recurring_info',1,'5','start_period','Start Period',1,0,0,100,3,$sorecurringinvoiceblock,1,'D~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID('vtiger_field').",'end_period','vtiger_invoice_recurring_info',1,'5','end_period','End Period',1,0,0,100,4,$sorecurringinvoiceblock,1,'D~O~OTH~G~start_period~Start Period',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID('vtiger_field').",'payment_duration','vtiger_invoice_recurring_info',1,'16','payment_duration','Payment Duration',1,0,0,100,5,$sorecurringinvoiceblock,1,'V~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (22,".$this->db->getUniqueID('vtiger_field').",'invoice_status','vtiger_invoice_recurring_info',1,'15','invoicestatus','Invoice Status',1,0,0,100,6,$sorecurringinvoiceblock,1,'V~M',3,null,'BAS',0)"); + + //Sales Order Details -- END + + //Invoice Details -- START + //Block69 + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'subject','vtiger_invoice',1,'2','subject','Subject',1,0,0,100,1,$invoicebasicblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'salesorderid','vtiger_invoice',1,'80','salesorder_id','Sales Order',1,2,0,100,2,$invoicebasicblock,1,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'customerno','vtiger_invoice',1,'1','customerno','Customer No',1,2,0,100,3,$invoicebasicblock,1,'V~O',3,null,'BAS',1)"); + + + //to include contact name vtiger_field in Invoice-start + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'contactid','vtiger_invoice',1,'57','contact_id','Contact Name',1,2,0,100,4,$invoicebasicblock,1,'I~O',3,null,'BAS',1)"); + //end + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'invoicedate','vtiger_invoice',1,'5','invoicedate','Invoice Date',1,2,0,100,5,$invoicebasicblock,1,'D~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'duedate','vtiger_invoice',1,'5','duedate','Due Date',1,2,0,100,6,$invoicebasicblock,1,'D~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'purchaseorder','vtiger_invoice',1,'1','vtiger_purchaseorder','Purchase Order',1,2,0,100,8,$invoicebasicblock,1,'V~O',3,null,'BAS',1)"); + //$this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'salestax','vtiger_invoice',1,'1','txtTax','Sales Tax',1,0,0,100,9,69,3,'N~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'adjustment','vtiger_invoice',1,'1','txtAdjustment','Adjustment',1,2,0,100,9,$invoicebasicblock,3,'NN~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'salescommission','vtiger_invoice',1,'1','salescommission','Sales Commission',1,2,0,10,13,$invoicebasicblock,1,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'exciseduty','vtiger_invoice',1,'1','exciseduty','Excise Duty',1,2,0,100,11,$invoicebasicblock,1,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'subtotal','vtiger_invoice',1,'1','hdnSubTotal','Sub Total',1,2,0,100,12,$invoicebasicblock,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'total','vtiger_invoice',1,'1','hdnGrandTotal','Total',1,2,0,100,13,$invoicebasicblock,3,'N~O',3,null,'BAS',1)"); + //Added fields taxtype, discount percent, discount amount and S&H amount for Tax process + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'taxtype','vtiger_invoice',1,'16','hdnTaxType','Tax Type',1,2,0,100,13,$invoicebasicblock,3,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'discount_percent','vtiger_invoice',1,'1','hdnDiscountPercent','Discount Percent',1,2,0,100,13,$invoicebasicblock,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'discount_amount','vtiger_invoice',1,'1','hdnDiscountAmount','Discount Amount',1,2,0,100,13,$invoicebasicblock,3,'N~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'s_h_amount','vtiger_invoice',1,'1','hdnS_H_Amount','S&H Amount',1,2,0,100,14,57,3,'N~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'accountid','vtiger_invoice',1,'73','account_id','Account Name',1,2,0,100,14,$invoicebasicblock,1,'I~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'invoicestatus','vtiger_invoice',1,'15','invoicestatus','Status',1,2,0,100,15,$invoicebasicblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'smownerid','vtiger_crmentity',1,'53','assigned_user_id','Assigned To',1,0,0,100,16,$invoicebasicblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'createdtime','vtiger_crmentity',1,'70','createdtime','Created Time',1,0,0,100,17,$invoicebasicblock,2,'T~O',3,null,'BAS',0)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'modifiedtime','vtiger_crmentity',1,'70','modifiedtime','Modified Time',1,0,0,100,18,$invoicebasicblock,2,'T~O',3,null,'BAS',0)"); + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'currency_id','vtiger_invoice',1,'117','currency_id','Currency',1,2,1,100,19,$invoicebasicblock,3,'I~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'conversion_rate','vtiger_invoice',1,'1','conversion_rate','Conversion Rate',1,2,1,100,20,$invoicebasicblock,3,'N~O',3,null,'BAS',1)"); + + //Block 71 + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'bill_street','vtiger_invoicebillads',1,'24','bill_street','Billing Address',1,2,0,100,1,$invoiceaddressblock,1,'V~M',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'ship_street','vtiger_invoiceshipads',1,'24','ship_street','Shipping Address',1,2,0,100,2,$invoiceaddressblock,1,'V~M',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'bill_city','vtiger_invoicebillads',1,'1','bill_city','Billing City',1,2,0,100,5,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'ship_city','vtiger_invoiceshipads',1,'1','ship_city','Shipping City',1,2,0,100,6,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'bill_state','vtiger_invoicebillads',1,'1','bill_state','Billing State',1,2,0,100,7,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'ship_state','vtiger_invoiceshipads',1,'1','ship_state','Shipping State',1,2,0,100,8,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'bill_code','vtiger_invoicebillads',1,'1','bill_code','Billing Code',1,2,0,100,9,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'ship_code','vtiger_invoiceshipads',1,'1','ship_code','Shipping Code',1,2,0,100,10,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'bill_country','vtiger_invoicebillads',1,'1','bill_country','Billing Country',1,2,0,100,11,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'ship_country','vtiger_invoiceshipads',1,'1','ship_country','Shipping Country',1,2,0,100,12,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'bill_pobox','vtiger_invoicebillads',1,'1','bill_pobox','Billing Po Box',1,2,0,100,3,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'ship_pobox','vtiger_invoiceshipads',1,'1','ship_pobox','Shipping Po Box',1,2,0,100,4,$invoiceaddressblock,1,'V~O',3,null,'BAS',1)"); + + //Block73 + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_crmentity',1,'19','description','Description',1,2,0,100,1,$invoicedescription,1,'V~O',3,null,'ADV',1)"); + //Block74 + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'terms_conditions','vtiger_invoice',1,'19','terms_conditions','Terms & Conditions',1,2,0,100,1,$invoicetermsblock,1,'V~O',3,null,'ADV',1)"); + //Added for Custom invoice Number + $this->db->query("insert into vtiger_field values (23,".$this->db->getUniqueID("vtiger_field").",'invoice_no','vtiger_invoice',1,'4','invoice_no','Invoice No',1,0,0,100,3,$invoicebasicblock,1,'V~O',3,null,'BAS',0)"); + + //Invoice Details -- END + //users Details Starts Block 79,80,81 + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'user_name','vtiger_users',1,'106','user_name','User Name',1,0,0,11,1,$userloginandroleblockid,1,'V~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'is_admin','vtiger_users',1,'156','is_admin','Admin',1,0,0,3,2,$userloginandroleblockid,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'user_password','vtiger_users',1,'99','user_password','Password',1,0,0,30,3,$userloginandroleblockid,4,'P~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'confirm_password','vtiger_users',1,'99','confirm_password','Confirm Password',1,0,0,30,5,$userloginandroleblockid,4,'P~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'first_name','vtiger_users',1,'1','first_name','First Name',1,0,0,30,7,$userloginandroleblockid,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'last_name','vtiger_users',1,'2','last_name','Last Name',1,0,0,30,9,$userloginandroleblockid,1,'V~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'roleid','vtiger_user2role',1,'98','roleid','Role',1,0,0,200,11,$userloginandroleblockid,1,'V~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'email1','vtiger_users',1,'104','email1','Email',1,0,0,100,4,$userloginandroleblockid,1,'E~M',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'status','vtiger_users',1,'115','status','Status',1,0,0,100,6,$userloginandroleblockid,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'activity_view','vtiger_users',1,'16','activity_view','Default Activity View',1,0,0,100,12,$userloginandroleblockid,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'lead_view','vtiger_users',1,'16','lead_view','Default Lead View',1,0,0,100,10,$userloginandroleblockid,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'currency_id','vtiger_users',1,'116','currency_id','Currency',1,0,0,100,8,$userloginandroleblockid,1,'I~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'hour_format','vtiger_users',1,'116','hour_format','Calendar Hour Format',1,0,0,100,13,$userloginandroleblockid,3,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'end_hour','vtiger_users',1,'116','end_hour','Day ends at',1,0,0,100,15,$userloginandroleblockid,3,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'start_hour','vtiger_users',1,'116','start_hour','Day starts at',1,0,0,100,14,$userloginandroleblockid,3,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'title','vtiger_users',1,'1','title','Title',1,0,0,50,1,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'phone_work','vtiger_users',1,'1','phone_work','Office Phone',1,0,0,50,5,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'department','vtiger_users',1,'1','department','Department',1,0,0,50,3,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'phone_mobile','vtiger_users',1,'1','phone_mobile','Mobile',1,0,0,50,7,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'reports_to_id','vtiger_users',1,'101','reports_to_id','Reports To',1,0,0,50,8,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'phone_other','vtiger_users',1,'1','phone_other','Other Phone',1,0,0,50,11,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'email2','vtiger_users',1,'13','email2','Other Email',1,0,0,100,4,$usermoreinfoblock,1,'E~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'phone_fax','vtiger_users',1,'1','phone_fax','Fax',1,0,0,50,2,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'yahoo_id','vtiger_users',1,'13','yahoo_id','Yahoo id',1,0,0,100,6,$usermoreinfoblock,1,'E~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'phone_home','vtiger_users',1,'1','phone_home','Home Phone',1,0,0,50,9,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'date_format','vtiger_users',1,'16','date_format','Date Format',1,0,0,30,12,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'signature','vtiger_users',1,'21','signature','Signature',1,0,0,250,13,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'description','vtiger_users',1,'21','description','Documents',1,0,0,250,14,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'address_street','vtiger_users',1,'21','address_street','Street Address',1,0,0,250,1,$useraddressblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'address_city','vtiger_users',1,'1','address_city','City',1,0,0,100,3,$useraddressblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'address_state','vtiger_users',1,'1','address_state','State',1,0,0,100,5,$useraddressblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'address_postalcode','vtiger_users',1,'1','address_postalcode','Postal Code',1,0,0,100,4,$useraddressblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'address_country','vtiger_users',1,'1','address_country','Country',1,0,0,100,2,$useraddressblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values(29,".$this->db->getUniqueID("vtiger_field").",'accesskey','vtiger_users',1,3,'accesskey','Webservice Access Key',1,0,0,100,2,$useradvanceblock,2,'V~O',1,null,'BAS',1);"); + + //User Image Information + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'imagename','vtiger_users',1,'105','imagename','User Image',1,0,0,250,10,$userblockid,1,'V~O',1,null,'BAS',1)"); + //added for internl_mailer + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'internal_mailer','vtiger_users',1,'56','internal_mailer','INTERNAL_MAIL_COMPOSER',1,0,0,50,15,$usermoreinfoblock,1,'V~O',1,null,'BAS',1)"); + $this->db->query("insert into vtiger_field values (29,".$this->db->getUniqueID("vtiger_field").",'reminder_interval','vtiger_users',1,'16','reminder_interval','Reminder Interval',1,0,0,100,1,$useradvanceblock,1,'V~O',1,null,'BAS',1)"); + //user Details End + + // Updated Phone field uitype + $this->db->query("update vtiger_field set uitype='11' where fieldname='mobile' and tabid=".getTabid('Leads')); + $this->db->query("update vtiger_field set uitype='11' where fieldname='mobile' and tabid=".getTabid('Contacts')); + $this->db->query("update vtiger_field set uitype='11' where fieldname='fax' and tabid=".getTabid('Leads')); + $this->db->query("update vtiger_field set uitype='11' where fieldname='fax' and tabid=".getTabid('Contacts')); + $this->db->query("update vtiger_field set uitype='11' where fieldname='fax' and tabid=".getTabid('Accounts')); + + $tab_field_array = array( + 'Accounts'=>array('accountname'), + 'Contacts'=>array('imagename'), + 'Products'=>array('imagename','product_id'), + 'Invoice'=>array('invoice_no','salesorder_id'), + 'SalesOrder'=>array('quote_id','salesorder_no'), + 'PurchaseOrder'=>array('purchaseorder_no'), + 'Quotes'=>array('quote_no'), + 'HelpDesk'=>array('filename'), + ); + foreach($tab_field_array as $index=>$value){ + $tabid = getTabid($index); + $this->db->pquery("UPDATE vtiger_field SET masseditable=0 WHERE tabid=? AND fieldname IN (".generateQuestionMarks($value).")",array($tabid,$value)); + } + + //Emails field added here + $email_Tabid = getTabid('Emails'); + $blockid = $this->db->getUniqueID('vtiger_blocks'); + $this->db->query("INSERT INTO vtiger_field values($email_Tabid,".$this->db->getUniqueID("vtiger_field").",'from_email','vtiger_emaildetails',1,12,'from_email','From',1,2,0,100,1,$blockid,3,'V~M',3,NULL,'BAS',0)"); + $this->db->query("INSERT INTO vtiger_field values($email_Tabid,".$this->db->getUniqueID("vtiger_field").",'to_email','vtiger_emaildetails',1,8,'saved_toid','To',1,2,0,100,2,$blockid,1,'V~M',3,NULL,'BAS',0)"); + $this->db->query("INSERT INTO vtiger_field values($email_Tabid,".$this->db->getUniqueID("vtiger_field").",'cc_email','vtiger_emaildetails',1,8,'ccmail','CC',1,2,0,1000,3,$blockid,1,'V~O',3,NULL,'BAS',0)"); + $this->db->query("INSERT INTO vtiger_field values($email_Tabid,".$this->db->getUniqueID("vtiger_field").",'bcc_email','vtiger_emaildetails',1,8,'bccmail','BCC' ,1,2,0,1000,4,$blockid,1,'V~O',3,NULL,'BAS',0)"); + $this->db->query("INSERT INTO vtiger_field values($email_Tabid,".$this->db->getUniqueID("vtiger_field").",'idlists','vtiger_emaildetails',1,1,'parent_id','Parent ID' ,1,2,0,1000,5,$blockid,3,'V~O',3,NULL,'BAS',0)"); + $this->db->query("INSERT INTO vtiger_field values($email_Tabid,".$this->db->getUniqueID("vtiger_field").",'email_flag','vtiger_emaildetails',1,16,'email_flag','Email Flag' ,1,2,0,1000,6,$blockid,3,'V~O',3,NULL,'BAS',0)"); + //Emails fields ends + + //The Entity Name for the modules are maintained in this table + $this->db->query("insert into vtiger_entityname values(7,'Leads','vtiger_leaddetails','lastname,firstname','leadid','leadid')"); + $this->db->query("insert into vtiger_entityname values(6,'Accounts','vtiger_account','accountname','accountid','account_id')"); + $this->db->query("insert into vtiger_entityname values(4,'Contacts','vtiger_contactdetails','lastname,firstname','contactid','contact_id')"); + $this->db->query("insert into vtiger_entityname values(2,'Potentials','vtiger_potential','potentialname','potentialid','potential_id')"); + $this->db->query("insert into vtiger_entityname values(8,'Documents','vtiger_notes','title','notesid','notesid')"); + $this->db->query("insert into vtiger_entityname values(13,'HelpDesk','vtiger_troubletickets','title','ticketid','ticketid')"); + $this->db->query("insert into vtiger_entityname values(9,'Calendar','vtiger_activity','subject','activityid','activityid')"); + $this->db->query("insert into vtiger_entityname values(10,'Emails','vtiger_activity','subject','activityid','activityid')"); + $this->db->query("insert into vtiger_entityname values(14,'Products','vtiger_products','productname','productid','product_id')"); + $this->db->query("insert into vtiger_entityname values(29,'Users','vtiger_users','last_name,first_name','id','id')"); + $this->db->query("insert into vtiger_entityname values(23,'Invoice','vtiger_invoice','subject','invoiceid','invoiceid')"); + $this->db->query("insert into vtiger_entityname values(20,'Quotes','vtiger_quotes','subject','quoteid','quote_id')"); + $this->db->query("insert into vtiger_entityname values(21,'PurchaseOrder','vtiger_purchaseorder','subject','purchaseorderid','purchaseorderid')"); + $this->db->query("insert into vtiger_entityname values(22,'SalesOrder','vtiger_salesorder','subject','salesorderid','salesorder_id')"); + $this->db->query("insert into vtiger_entityname values(18,'Vendors','vtiger_vendor','vendorname','vendorid','vendor_id')"); + $this->db->query("insert into vtiger_entityname values(19,'PriceBooks','vtiger_pricebook','bookname','pricebookid','pricebookid')"); + $this->db->query("insert into vtiger_entityname values(26,'Campaigns','vtiger_campaign','campaignname','campaignid','campaignid')"); + $this->db->query("insert into vtiger_entityname values(15,'Faq','vtiger_faq','question','id','id')"); + // Insert End + + + //Inserting values into org share action mapping + $this->db->query("insert into vtiger_org_share_action_mapping values(0,'Public: Read Only')"); + $this->db->query("insert into vtiger_org_share_action_mapping values(1,'Public: Read, Create/Edit')"); + $this->db->query("insert into vtiger_org_share_action_mapping values(2,'Public: Read, Create/Edit, Delete')"); + $this->db->query("insert into vtiger_org_share_action_mapping values(3,'Private')"); + + $this->db->query("insert into vtiger_org_share_action_mapping values(4,'Hide Details')"); + $this->db->query("insert into vtiger_org_share_action_mapping values(5,'Hide Details and Add Events')"); + $this->db->query("insert into vtiger_org_share_action_mapping values(6,'Show Details')"); + $this->db->query("insert into vtiger_org_share_action_mapping values(7,'Show Details and Add Events')"); + + + //Inserting for all vtiger_tabs + $def_org_tabid= Array(2,4,6,7,8,9,10,13,16,20,21,22,23,26); + + foreach($def_org_tabid as $def_tabid) + { + $this->db->query("insert into vtiger_org_share_action2tab values(0,".$def_tabid.")"); + $this->db->query("insert into vtiger_org_share_action2tab values(1,".$def_tabid.")"); + $this->db->query("insert into vtiger_org_share_action2tab values(2,".$def_tabid.")"); + $this->db->query("insert into vtiger_org_share_action2tab values(3,".$def_tabid.")"); + } + + //Insert into default_org_sharingrule + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",2,2,0)"); + + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",4,2,2)"); + + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",6,2,0)"); + + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",7,2,0)"); + + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",9,3,1)"); + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",13,2,0)"); + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",16,3,2)"); + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",20,2,0)"); + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",21,2,0)"); + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",22,2,0)"); + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",23,2,0)"); + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",26,2,0)"); + $this->db->query("insert into vtiger_def_org_share values (".$this->db->getUniqueID('vtiger_def_org_share').",8,2,0)"); + + //Populating the DataShare Related Modules + + //Lead Related Module + + //Account Related Module + $this->db->query("insert into vtiger_datashare_relatedmodules values (".$this->db->getUniqueID('vtiger_datashare_relatedmodules').",6,2)"); + $this->db->query("insert into vtiger_datashare_relatedmodules values (".$this->db->getUniqueID('vtiger_datashare_relatedmodules').",6,13)"); + $this->db->query("insert into vtiger_datashare_relatedmodules values (".$this->db->getUniqueID('vtiger_datashare_relatedmodules').",6,20)"); + $this->db->query("insert into vtiger_datashare_relatedmodules values (".$this->db->getUniqueID('vtiger_datashare_relatedmodules').",6,22)"); + $this->db->query("insert into vtiger_datashare_relatedmodules values (".$this->db->getUniqueID('vtiger_datashare_relatedmodules').",6,23)"); + + //Potential Related Module + $this->db->query("insert into vtiger_datashare_relatedmodules values (".$this->db->getUniqueID('vtiger_datashare_relatedmodules').",2,20)"); + $this->db->query("insert into vtiger_datashare_relatedmodules values (".$this->db->getUniqueID('vtiger_datashare_relatedmodules').",2,22)"); + + //Quote Related Module + $this->db->query("insert into vtiger_datashare_relatedmodules values (".$this->db->getUniqueID('vtiger_datashare_relatedmodules').",20,22)"); + + //SO Related Module + $this->db->query("insert into vtiger_datashare_relatedmodules values (".$this->db->getUniqueID('vtiger_datashare_relatedmodules').",22,23)"); + + + + + // New Secutity End + + + //insert into the vtiger_notificationscheduler vtiger_table + + //insert into related list vtiger_table + //Inserting for vtiger_account related lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("Contacts").",'get_contacts',1,'Contacts',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("Potentials").",'get_opportunities',2,'Potentials',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("Quotes").",'get_quotes',3,'Quotes',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("SalesOrder").",'get_salesorder',4,'Sales Order',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("Invoice").",'get_invoices',5,'Invoice',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("Calendar").",'get_activities',6,'Activities',0,'add')"); + + //added for the ticket4109 + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("Emails").",'get_emails',7,'Emails',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("Calendar").",'get_history',8,'Activity History',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("Documents").",'get_attachments',9,'Documents',0,'add,select')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("HelpDesk").",'get_tickets',10,'HelpDesk',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Accounts").",".getTabid("Products").",'get_products',11,'Products',0,'select')"); + + //Inserting Lead Related Lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Leads").",".getTabid("Calendar").",'get_activities',1,'Activities',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Leads").",".getTabid("Emails").",'get_emails',2,'Emails',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Leads").",".getTabid("Calendar").",'get_history',3,'Activity History',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Leads").",".getTabid("Documents").",'get_attachments',4,'Documents',0,'add,select')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Leads").",".getTabid("Products").",'get_products',5,'Products',0,'select')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Leads").",".getTabid("Campaigns").",'get_campaigns',6,'Campaigns',0,'select')"); + + //Inserting for contact related lists + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("Potentials").",'get_opportunities',1,'Potentials',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("Calendar").",'get_activities',2,'Activities',0,'add')"); + + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("Emails").",'get_emails',3,'Emails',0,'add')"); + + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("HelpDesk").",'get_tickets',4,'HelpDesk',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("Quotes").",'get_quotes',5,'Quotes',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("PurchaseOrder").",'get_purchase_orders',6,'Purchase Order',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("SalesOrder").",'get_salesorder',7,'Sales Order',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("Products").",'get_products',8,'Products',0,'select')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("Calendar").",'get_history',9,'Activity History',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("Documents").",'get_attachments',10,'Documents',0,'add,select')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Contacts").",".getTabid("Campaigns").",'get_campaigns',11,'Campaigns',0,'select')"); + + $this->db->query("INSERT INTO vtiger_relatedlists VALUES(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid('Contacts').",".getTabid('Invoice').",'get_invoices',12,'Invoice',0, 'add')"); + + //Inserting Potential Related Lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Potentials").",".getTabid("Calendar").",'get_activities',1,'Activities',0,'add')"); + + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Potentials").",".getTabid("Contacts").",'get_contacts',2,'Contacts',0,'select')"); + + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Potentials").",".getTabid("Products").",'get_products',3,'Products',0,'select')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Potentials").",0,'get_stage_history',4,'Sales Stage History',0,'')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Potentials").",".getTabid("Documents").",'get_attachments',5,'Documents',0,'add,select')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Potentials").",".getTabid("Quotes").",'get_Quotes',6,'Quotes',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Potentials").",".getTabid("SalesOrder").",'get_salesorder',7,'Sales Order',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Potentials").",".getTabid("Calendar").",'get_history',8,'Activity History',0,'')"); + + //Inserting Product Related Lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("HelpDesk").",'get_tickets',1,'HelpDesk',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Documents").",'get_attachments',3,'Documents',0,'add,select')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Quotes").",'get_quotes',4,'Quotes',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("PurchaseOrder").",'get_purchase_orders',5,'Purchase Order',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("SalesOrder").",'get_salesorder',6,'Sales Order',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Invoice").",'get_invoices',7,'Invoice',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("PriceBooks").",'get_product_pricebooks',8,'PriceBooks',0,'add')"); + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Leads").",'get_leads',9,'Leads',0,'select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Accounts").",'get_accounts',10,'Accounts',0,'select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Contacts").",'get_contacts',11,'Contacts',0,'select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Potentials").",'get_opportunities',12,'Potentials',0,'select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Products").",'get_products',13,'Product Bundles',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Products").",".getTabid("Products").",'get_parent_products',14,'Parent Product',0,'')"); + + //Inserting Emails Related Lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Emails").",".getTabid("Contacts").",'get_contacts',1,'Contacts',0,'select,bulkmail')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Emails").",0,'get_users',2,'Users',0,'')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Emails").",".getTabid("Documents").",'get_attachments',3,'Documents',0,'add,select')"); + + //Inserting HelpDesk Related Lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("HelpDesk").",".getTabid("Calendar").",'get_activities',1,'Activities',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("HelpDesk").",".getTabid("Documents").",'get_attachments',2,'Documents',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("HelpDesk").",0,'get_ticket_history',3,'Ticket History',0,'')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("HelpDesk").",".getTabid("Calendar").",'get_history',4,'Activity History',0,'')"); + + //Inserting PriceBook Related Lists + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("PriceBooks").",14,'get_pricebook_products',2,'Products',0,'select')"); + + // Inserting Vendor Related Lists + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Vendors").",14,'get_products',1,'Products',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Vendors").",21,'get_purchase_orders',2,'Purchase Order',0,'add')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Vendors").",4,'get_contacts',3,'Contacts',0,'select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Vendors").",".getTabid("Emails").",'get_emails',4,'Emails',0,'add')"); + + // Inserting Quotes Related Lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Quotes").",".getTabid("SalesOrder").",'get_salesorder',1,'Sales Order',0,'')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Quotes").",9,'get_activities',2,'Activities',0,'add')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Quotes").",".getTabid("Documents").",'get_attachments',3,'Documents',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Quotes").",9,'get_history',4,'Activity History',0,'')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Quotes").",0,'get_quotestagehistory',5,'Quote Stage History',0,'')"); + + // Inserting Purchase order Related Lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("PurchaseOrder").",9,'get_activities',1,'Activities',0,'add')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("PurchaseOrder").",".getTabid("Documents").",'get_attachments',2,'Documents',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("PurchaseOrder").",".getTabid("Calendar").",'get_history',3,'Activity History',0,'')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("PurchaseOrder").",0,'get_postatushistory',4,'PurchaseOrder Status History',0,'')"); + + // Inserting Sales order Related Lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("SalesOrder").",9,'get_activities',1,'Activities',0,'add')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("SalesOrder").",".getTabid("Documents").",'get_attachments',2,'Documents',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("SalesOrder").",".getTabid("Invoice").",'get_invoices',3,'Invoice',0,'')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("SalesOrder").",".getTabid("Calendar").",'get_history',4,'Activity History',0,'')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("SalesOrder").",0,'get_sostatushistory',5,'SalesOrder Status History',0,'')"); + + // Inserting Invoice Related Lists + + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Invoice").",9,'get_activities',1,'Activities',0,'add')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Invoice").",".getTabid("Documents").",'get_attachments',2,'Documents',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Invoice").",".getTabid("Calendar").",'get_history',3,'Activity History',0,'')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Invoice").",0,'get_invoicestatushistory',4,'Invoice Status History',0,'')"); + + // Inserting Activities Related Lists + + $this->db->query("insert into vtiger_relatedlists values (".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Calendar").",0,'get_users',1,'Users',0,'')"); + $this->db->query("insert into vtiger_relatedlists values (".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Calendar").",4,'get_contacts',2,'Contacts',0,'')"); + + // Inserting Campaigns Related Lists + + $this->db->query("insert into vtiger_relatedlists values (".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Campaigns").",".getTabid("Contacts").",'get_contacts',1,'Contacts',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values (".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Campaigns").",".getTabid("Leads").",'get_leads',2,'Leads',0,'add,select')"); + $this->db->query("insert into vtiger_relatedlists values (".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Campaigns").",".getTabid("Potentials").",'get_opportunities',3,'Potentials',0,'add')"); + $this->db->query("insert into vtiger_relatedlists values(".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Campaigns").",9,'get_activities',4,'Activities',0,'add')"); + + // Inserting Faq's Related Lists + $this->db->query("insert into vtiger_relatedlists values (".$this->db->getUniqueID('vtiger_relatedlists').",".getTabid("Faq").",".getTabid("Documents").",'get_attachments',1,'Documents',0,'add,select')"); + + $this->db->query("insert into vtiger_notificationscheduler(schedulednotificationid,schedulednotificationname,active,notificationsubject,notificationbody,label) values (".$this->db->getUniqueID("vtiger_notificationscheduler").",'LBL_TASK_NOTIFICATION_DESCRITPION',1,'Task Delay Notification','Tasks delayed beyond 24 hrs ','LBL_TASK_NOTIFICATION')"); + $this->db->query("insert into vtiger_notificationscheduler(schedulednotificationid,schedulednotificationname,active,notificationsubject,notificationbody,label) values (".$this->db->getUniqueID("vtiger_notificationscheduler").",'LBL_BIG_DEAL_DESCRIPTION' ,1,'Big Deal notification','Success! A big deal has been won! ','LBL_BIG_DEAL')"); + $this->db->query("insert into vtiger_notificationscheduler(schedulednotificationid,schedulednotificationname,active,notificationsubject,notificationbody,label) values (".$this->db->getUniqueID("vtiger_notificationscheduler").",'LBL_TICKETS_DESCRIPTION',1,'Pending Tickets notification','Ticket pending please ','LBL_PENDING_TICKETS')"); + $this->db->query("insert into vtiger_notificationscheduler(schedulednotificationid,schedulednotificationname,active,notificationsubject,notificationbody,label) values (".$this->db->getUniqueID("vtiger_notificationscheduler").",'LBL_MANY_TICKETS_DESCRIPTION',1,'Too many tickets Notification','Too many tickets pending against this entity ','LBL_MANY_TICKETS')"); + $this->db->query("insert into vtiger_notificationscheduler(schedulednotificationid,schedulednotificationname,active,notificationsubject,notificationbody,label,type) values (".$this->db->getUniqueID("vtiger_notificationscheduler").",'LBL_START_DESCRIPTION' ,1,'Support Start Notification','10','LBL_START_NOTIFICATION','select')"); + $this->db->query("insert into vtiger_notificationscheduler(schedulednotificationid,schedulednotificationname,active,notificationsubject,notificationbody,label,type) values (".$this->db->getUniqueID("vtiger_notificationscheduler").",'LBL_SUPPORT_DESCRIPTION',1,'Support ending please','11','LBL_SUPPORT_NOTICIATION','select')"); + $this->db->query("insert into vtiger_notificationscheduler(schedulednotificationid,schedulednotificationname,active,notificationsubject,notificationbody,label,type) values (".$this->db->getUniqueID("vtiger_notificationscheduler").",'LBL_SUPPORT_DESCRIPTION_MONTH',1,'Support ending please','12','LBL_SUPPORT_NOTICIATION_MONTH','select')"); + $this->db->query("insert into vtiger_notificationscheduler(schedulednotificationid,schedulednotificationname,active,notificationsubject,notificationbody,label) values (".$this->db->getUniqueID("vtiger_notificationscheduler").",'LBL_ACTIVITY_REMINDER_DESCRIPTION' ,1,'Activity Reminder Notification','This is a reminder notification for the Activity','LBL_ACTIVITY_NOTIFICATION')"); + + //inserting actions for get_attachments + $folderid = $this->db->getUniqueID("vtiger_attachmentsfolder"); + $this->db->query("insert into vtiger_attachmentsfolder values(".$folderid.",'Default','This is a Default Folder',1,1)"); + + //Inserting Inventory Notifications + $invoice_body = 'Dear {HANDLER}, + +The current stock of {PRODUCTNAME} in our warehouse is {CURRENTSTOCK}. Kindly procure required number of units as the stock level is below reorder level {REORDERLEVELVALUE}. + +Please treat this information as Urgent as the invoice is already sent to the customer. + +Severity: Critical + +Thanks, +{CURRENTUSER}'; + + + $this->db->query("insert into vtiger_inventorynotification(notificationid,notificationname,notificationsubject,notificationbody,label) values (".$this->db->getUniqueID("vtiger_inventorynotification").",'InvoiceNotification','{PRODUCTNAME} Stock Level is Low','".$invoice_body." ','InvoiceNotificationDescription')"); + + $quote_body = 'Dear {HANDLER}, + +Quote is generated for {QUOTEQUANTITY} units of {PRODUCTNAME}. The current stock of {PRODUCTNAME} in our warehouse is {CURRENTSTOCK}. + +Severity: Minor + +Thanks, +{CURRENTUSER}'; + + + $this->db->query("insert into vtiger_inventorynotification(notificationid,notificationname,notificationsubject,notificationbody,label) values (".$this->db->getUniqueID("vtiger_inventorynotification").",'QuoteNotification','Quote given for {PRODUCTNAME}','".$quote_body." ','QuoteNotificationDescription')"); + + $so_body = 'Dear {HANDLER}, + +SalesOrder is generated for {SOQUANTITY} units of {PRODUCTNAME}. The current stock of {PRODUCTNAME} in our warehouse is {CURRENTSTOCK}. + +Please treat this information with priority as the sales order is already generated. + +Severity: Major + +Thanks, +{CURRENTUSER}'; + + + $this->db->query("insert into vtiger_inventorynotification(notificationid,notificationname,notificationsubject,notificationbody,label) values (".$this->db->getUniqueID("vtiger_inventorynotification").",'SalesOrderNotification','Sales Order generated for {PRODUCTNAME}','".$so_body." ','SalesOrderNotificationDescription')"); + +//insert into inventory terms and conditions table + + $inv_tandc_text=' + - Unless otherwise agreed in writing by the supplier all invoices are payable within thirty (30) days of the date of invoice, in the currency of the invoice, drawn on a bank based in India or by such other method as is agreed in advance by the Supplier. + + - All prices are not inclusive of VAT which shall be payable in addition by the Customer at the applicable rate.'; + + $this->db->query("insert into vtiger_inventory_tandc(id,type,tandc) values (".$this->db->getUniqueID("vtiger_inventory_tandc").", 'Inventory', '".$inv_tandc_text."')"); + +//insert into email template vtiger_table + + $body='Hello!
      +
      + On behalf of the vtiger team, I am pleased to announce the release of vtiger crm4.2 . This is a feature packed release including the mass email template handling, custom view feature, vtiger_reports feature and a host of other utilities. vtiger runs on all platforms.
      +
      + Notable Features of vtiger are :
      +
      + -Email Client Integration
      + -Trouble Ticket Integration
      + -Invoice Management Integration
      + -Reports Integration
      + -Portal Integration
      + -Enhanced Word Plugin Support
      + -Custom View Integration
      +
      + Known Issues:
      + -ABCD
      + -EFGH
      + -IJKL
      + -MNOP
      + -QRST'; + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Announcement for Release','Announcement for Release','Announcement of a release','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + + +$body='name
      +street,
      +city,
      +state,
      + zip)
      +
      + Dear
      +
      + Please check the following invoices that are yet to be paid by you:
      +
      + No. Date Amount
      + 1 1/1/01 $4000
      + 2 2/2//01 $5000
      + 3 3/3/01 $10000
      + 4 7/4/01 $23560
      +
      + Kindly let us know if there are any issues that you feel are pending to be discussed.
      + We will be more than happy to give you a call.
      + We would like to continue our business with you.'; + + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Pending Invoices','Invoices Pending','Payment Due','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + + + + +$body=' Dear
      +
      +Your proposal on the project XYZW has been reviewed by us
      +and is acceptable in its entirety.
      +
      +We are eagerly looking forward to this project
      +and are pleased about having the opportunity to work
      +together. We look forward to a long standing relationship
      +with your esteemed firm.
      +
      +I would like to take this opportunity to invite you
      +to a game of golf on Wednesday morning 9am at the
      +Cuff Links Ground. We will be waiting for you in the
      +Executive Lounge.
      +
      +Looking forward to seeing you there.'; + + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Acceptance Proposal','Acceptance Proposal','Acceptance of Proposal','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + +$body= ' The undersigned hereby acknowledges receipt and delivery of the goods.
      +The undersigned will release the payment subject to the goods being discovered not satisfactory.
      +
      +Signed under seal this '; + + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Goods received acknowledgement','Goods received acknowledgement','Acknowledged Receipt of Goods','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + + $body= ' Dear
      + We are in receipt of your order as contained in the
      + purchase order form.We consider this to be final and binding on both sides.
      +If there be any exceptions noted, we shall consider them
      +only if the objection is received within ten days of receipt of
      +this notice.
      +
      +Thank you for your patronage.'; + + + + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Accept Order','Accept Order','Acknowledgement/Acceptance of Order','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + + + +$body='Dear
      +
      +We are relocating our office to
      +11111,XYZDEF Cross,
      +UVWWX Circle
      +The telephone number for this new location is (101) 1212-1328.
      +
      +Our Manufacturing Division will continue operations
      +at 3250 Lovedale Square Avenue, in Frankfurt.
      +
      +We hope to keep in touch with you all.
      +Please update your addressbooks.'; + + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Address Change','Change of Address','Address Change','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + + +$body='Dear
      +
      +Thank you for extending us the opportunity to meet with
      +you and members of your staff.
      +
      +I know that John Doe serviced your account
      +for many years and made many friends at your firm. He has personally
      +discussed with me the deep relationship that he had with your firm.
      +While his presence will be missed, I can promise that we will
      +continue to provide the fine service that was accorded by
      +John to your firm.
      +
      +I was genuinely touched to receive such fine hospitality.
      +
      +Thank you once again.'; + + + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Follow Up','Follow Up','Follow Up of meeting','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + + +$body='Congratulations!
      +
      +The numbers are in and I am proud to inform you that our
      +total sales for the previous quarter
      +amounts to $100,000,00.00!. This is the first time
      +we have exceeded the target by almost 30%.
      +We have also beat the previous quarter record by a
      +whopping 75%!
      +
      +Let us meet at Smoking Joe for a drink in the evening!
      + +C you all there guys!'; + + + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Target Crossed!','Target Crossed!','Fantastic Sales Spree!','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + +$body='Dear
      +
      +Thank you for your confidence in our ability to serve you.
      +We are glad to be given the chance to serve you.I look
      +forward to establishing a long term partnership with you.
      +Consider me as a friend.
      +Should any need arise,please do give us a call.'; + + + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Thanks Note','Thanks Note','Note of thanks','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + +//Added for HTML Eemail templates.. +//for Customer Portal Login details +$body=' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + +
      + + + + + + + + + + + + + + +
      $logo$
      vtiger CRM
      The honest Open Source CRM
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Dear $contact_name$,
      Thank you very much for subscribing to the vtiger CRM - annual support service.
      Here is your self service portal login details:
      + + + + + + + + + + +

      User ID : $login_name$
      Password: $password$
      $URL$
      +
      NOTE: We suggest you to change your password after logging in first time.

      Help Documentation

      After logging in to vtiger Self-service Portal first time, you can access the vtiger CRM documents from the Documents tab. Following documents are available for your reference:
      +
        +
      • Installation Manual (Windows & Linux OS)
      • +
      • User & Administrator Manual
      • +
      • vtiger Customer Portal - User Manual
      • +
      • vtiger Outlook Plugin - User Manual
      • +
      • vtiger Office Plug-in - User Manual
      • +
      • vtiger Thunderbird Extension - User Manual
      • +
      • vtiger Web Forms - User Manual
      • +
      • vtiger Firefox Tool bar - User Manual
      • +
      +

      Knowledge Base

      Periodically we update frequently asked question based on our customer experiences. You can access the latest articles from the FAQ tab.

      vtiger CRM - Details

      Kindly let us know your current vtiger CRM version and system specification so that we can provide you necessary guidelines to enhance your vtiger CRM system performance. Based on your system specification we alert you about the latest security & upgrade patches.

      Thank you once again and wish you a wonderful experience with vtiger CRM.


      Best Regards
      $support_team$
      www.vtiger.com
      +
      +
      + + + + + + + + + + +
      Shree Narayana Complex, No 11 Sarathy Nagar, Vijaya Nagar , Velachery, Chennai - 600 042 India
      Telephone No: +91 - 44 - 4202 - 1990 Toll Free No: +1 877 788 4437
      Email Id: support@vtiger.com
      +
      +
      '; + + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Customer Login Details','Customer Portal Login Details','Send Portal login details to customer','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + +//for Support end notification before a week +$body=' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + +
      + + + + + + + + + + + + + + +
      $logo$
      vtiger CRM
      The honest Open Source CRM
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Dear $contacts-lastname$,
      This is just a notification mail regarding your support end.
      Priority: Urgent
      Your Support is going to expire on next week
      Please contact support@vtiger.com.





      Sincerly
      Support Team
      www.vtiger.com
      +
      +
      + + + + + + + + + + +
      Shree Narayana Complex, No 11 Sarathy Nagar, Vijaya Nagar , Velachery, Chennai - 600 042 India
      Telephone No: +91 - 44 - 4202 - 1990 Toll Free No: +1 877 788 4437
      Email Id: info@vtiger.com
      +
      +
      '; + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Support end notification before a week','VtigerCRM Support Notification','Send Notification mail to customer before a week of support end date','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + +//for Support end notification before a month +$body=' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + +
      + + + + + + + + + + + + + + +
      $logo$
      vtiger CRM
      The honest Open Source CRM
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Dear $contacts-lastname$,
      This is just a notification mail regarding your support end.
      Priority: Normal
      Your Support is going to expire on next month.
      Please contact support@vtiger.com





      Sincerly
      Support Team
      www.vtiger.com
      +
      +
      + + + + + + + + + + +
      Shree Narayana Complex, No 11 Sarathy Nagar, Vijaya Nagar , Velachery, Chennai - 600 042 India
      Telephone No: +91 - 44 - 4202 - 1990 Toll Free No: +1 877 788 4437
      Email Id: info@vtiger.com
      +
      +
      '; + $this->db->query("insert into vtiger_emailtemplates(foldername,templatename,subject,description,body,deleted,templateid) values ('Public','Support end notification before a month','VtigerCRM Support Notification','Send Notification mail to customer before a month of support end date','".$body."',0,".$this->db->getUniqueID('vtiger_emailtemplates').")"); + + + + //Insert into vtiger_organizationdetails vtiger_table + $this->db->query("insert into vtiger_organizationdetails(organizationname,address,city,state,country,code,phone,fax,website,logoname) values ('vtiger',' 40-41-42, Sivasundar Apartments, Flat D-II, Shastri Street, Velachery','Chennai','Tamil Nadu','India','600 042','+91-44-5202-1990','+91-44-5202-1990','www.vtiger.com','vtiger-crm-logo.jpg')"); + + + $this->db->query("insert into vtiger_actionmapping values(0,'Save',0)"); + $this->db->query("insert into vtiger_actionmapping values(1,'EditView',0)"); + $this->db->query("insert into vtiger_actionmapping values(2,'Delete',0)"); + $this->db->query("insert into vtiger_actionmapping values(3,'index',0)"); + $this->db->query("insert into vtiger_actionmapping values(4,'DetailView',0)"); + $this->db->query("insert into vtiger_actionmapping values(5,'Import',0)"); + $this->db->query("insert into vtiger_actionmapping values(6,'Export',0)"); + //$this->db->query("insert into vtiger_actionmapping values(7,'AddBusinessCard',0)"); + $this->db->query("insert into vtiger_actionmapping values(8,'Merge',0)"); + $this->db->query("insert into vtiger_actionmapping values(1,'VendorEditView',1)"); + $this->db->query("insert into vtiger_actionmapping values(4,'VendorDetailView',1)"); + $this->db->query("insert into vtiger_actionmapping values(0,'SaveVendor',1)"); + $this->db->query("insert into vtiger_actionmapping values(2,'DeleteVendor',1)"); + $this->db->query("insert into vtiger_actionmapping values(1,'PriceBookEditView',1)"); + $this->db->query("insert into vtiger_actionmapping values(4,'PriceBookDetailView',1)"); + $this->db->query("insert into vtiger_actionmapping values(0,'SavePriceBook',1)"); + $this->db->query("insert into vtiger_actionmapping values(2,'DeletePriceBook',1)"); + $this->db->query("insert into vtiger_actionmapping values(9,'ConvertLead',0)"); + $this->db->query("insert into vtiger_actionmapping values(1,'DetailViewAjax',1)"); + $this->db->query("insert into vtiger_actionmapping values(4,'TagCloud',1)"); + $this->db->query("insert into vtiger_actionmapping values(1,'QuickCreate',1)"); + $this->db->query("insert into vtiger_actionmapping values(3,'Popup',1)"); + $this->db->query("insert into vtiger_actionmapping values(10,'DuplicatesHandling',0)"); + + //Insert values for vtiger_moduleowners vtiger_table which contains the modules and their vtiger_users. default user id admin - after 4.2 patch 2 + $module_array = Array('Potentials','Contacts','Accounts','Leads','Documents','Calendar','Emails','HelpDesk','Products','Faq','Vendors','PriceBooks','Quotes','PurchaseOrder','SalesOrder','Invoice','Reports','Campaigns'); + foreach($module_array as $mod) + { + $this->db->query("insert into vtiger_moduleowners values(".getTabid($mod).",1)"); + } + //added by jeri for category view from db + $this->db->query("insert into vtiger_parenttab values (1,'My Home Page',1,0)"); + $this->db->query("insert into vtiger_parenttab values (2,'Marketing',2,0)"); + $this->db->query("insert into vtiger_parenttab values (3,'Sales',3,0)"); + $this->db->query("insert into vtiger_parenttab values (4,'Support',4,0)"); + $this->db->query("insert into vtiger_parenttab values (5,'Analytics',5,0)"); + $this->db->query("insert into vtiger_parenttab values (6,'Inventory',6,0)"); + $this->db->query("insert into vtiger_parenttab values (7,'Tools',7,0)"); + $this->db->query("insert into vtiger_parenttab values (8,'Settings',8,0)"); + + $this->db->query("insert into vtiger_parenttabrel values (1,9,2)"); + $this->db->query("insert into vtiger_parenttabrel values (1,28,4)"); + $this->db->query("insert into vtiger_parenttabrel values (1,3,1)"); + $this->db->query("insert into vtiger_parenttabrel values (3,7,1)"); + $this->db->query("insert into vtiger_parenttabrel values (3,6,2)"); + $this->db->query("insert into vtiger_parenttabrel values (3,4,3)"); + $this->db->query("insert into vtiger_parenttabrel values (3,2,4)"); + $this->db->query("insert into vtiger_parenttabrel values (3,20,5)"); + $this->db->query("insert into vtiger_parenttabrel values (3,22,6)"); + $this->db->query("insert into vtiger_parenttabrel values (3,23,7)"); + $this->db->query("insert into vtiger_parenttabrel values (3,19,8)"); + $this->db->query("insert into vtiger_parenttabrel values (3,8,9)"); + $this->db->query("insert into vtiger_parenttabrel values (4,13,1)"); + $this->db->query("insert into vtiger_parenttabrel values (4,15,2)"); + $this->db->query("insert into vtiger_parenttabrel values (4,6,3)"); + $this->db->query("insert into vtiger_parenttabrel values (4,4,4)"); + $this->db->query("insert into vtiger_parenttabrel values (4,8,5)"); + $this->db->query("insert into vtiger_parenttabrel values (5,1,2)"); + $this->db->query("insert into vtiger_parenttabrel values (5,25,1)"); + $this->db->query("insert into vtiger_parenttabrel values (6,14,1)"); + $this->db->query("insert into vtiger_parenttabrel values (6,18,2)"); + $this->db->query("insert into vtiger_parenttabrel values (6,19,3)"); + $this->db->query("insert into vtiger_parenttabrel values (6,21,4)"); + $this->db->query("insert into vtiger_parenttabrel values (6,22,5)"); + $this->db->query("insert into vtiger_parenttabrel values (6,20,6)"); + $this->db->query("insert into vtiger_parenttabrel values (6,23,7)"); + $this->db->query("insert into vtiger_parenttabrel values (7,24,1)"); + $this->db->query("insert into vtiger_parenttabrel values (7,27,2)"); + $this->db->query("insert into vtiger_parenttabrel values (7,8,3)"); + $this->db->query("insert into vtiger_parenttabrel values (2,26,1)"); + $this->db->query("insert into vtiger_parenttabrel values (2,6,2)"); + $this->db->query("insert into vtiger_parenttabrel values (2,4,3)"); + $this->db->query("insert into vtiger_parenttabrel values (2,28,4)"); + $this->db->query("insert into vtiger_parenttabrel values (4,28,7)"); + $this->db->query("insert into vtiger_parenttabrel values (2,7,5)"); + $this->db->query("insert into vtiger_parenttabrel values (2,9,6)"); + $this->db->query("insert into vtiger_parenttabrel values (4,9,8)"); + $this->db->query("insert into vtiger_parenttabrel values (2,8,8)"); + $this->db->query("insert into vtiger_parenttabrel values (3,9,11)"); + + //add settings page to database starts + $this->addEntriesForSettings(); + //add settings page to database end + + //Added to populate the default inventory tax informations + $vatid = $this->db->getUniqueID("vtiger_inventorytaxinfo"); + $salesid = $this->db->getUniqueID("vtiger_inventorytaxinfo"); + $serviceid = $this->db->getUniqueID("vtiger_inventorytaxinfo"); + $this->db->query("insert into vtiger_inventorytaxinfo values($vatid,'tax".$vatid."','VAT','4.50','0')"); + $this->db->query("insert into vtiger_inventorytaxinfo values($salesid,'tax".$salesid."','Sales','10.00','0')"); + $this->db->query("insert into vtiger_inventorytaxinfo values($serviceid,'tax".$serviceid."','Service','12.50','0')"); + //After added these taxes we should add these taxes as columns in vtiger_inventoryproductrel table + $this->db->query("alter table vtiger_inventoryproductrel add column tax$vatid decimal(7,3) default NULL"); + $this->db->query("alter table vtiger_inventoryproductrel add column tax$salesid decimal(7,3) default NULL"); + $this->db->query("alter table vtiger_inventoryproductrel add column tax$serviceid decimal(7,3) default NULL"); + + //Added to handle picklist uniqueid for the picklist values + //$this->db->query("insert into vtiger_picklistvalues_seq values(1)"); + + //Added to populate the default Shipping & Hanlding tax informations + $shvatid = $this->db->getUniqueID("vtiger_shippingtaxinfo"); + $shsalesid = $this->db->getUniqueID("vtiger_shippingtaxinfo"); + $shserviceid = $this->db->getUniqueID("vtiger_shippingtaxinfo"); + $this->db->query("insert into vtiger_shippingtaxinfo values($shvatid,'shtax".$shvatid."','VAT','4.50','0')"); + $this->db->query("insert into vtiger_shippingtaxinfo values($shsalesid,'shtax".$shsalesid."','Sales','10.00','0')"); + $this->db->query("insert into vtiger_shippingtaxinfo values($shserviceid,'shtax".$shserviceid."','Service','12.50','0')"); + //After added these taxes we should add these taxes as columns in vtiger_inventoryshippingrel table + $this->db->query("alter table vtiger_inventoryshippingrel add column shtax$shvatid decimal(7,3) default NULL"); + $this->db->query("alter table vtiger_inventoryshippingrel add column shtax$shsalesid decimal(7,3) default NULL"); + $this->db->query("alter table vtiger_inventoryshippingrel add column shtax$shserviceid decimal(7,3) default NULL"); + + //version file is included here because without including this file version cannot be get + include('vtigerversion.php'); + $this->db->query("insert into vtiger_version values(".$this->db->getUniqueID('vtiger_version').",'".$vtiger_current_version."','".$vtiger_current_version."')"); + + //Register default language English + require_once('vtlib/Vtiger/Language.php'); + $vtlanguage = new Vtiger_Language(); + $vtlanguage->register('en_us','US English','English',true,true,true); + + $this->insertUser2mergefields(0); + $this->insertUser2mergefields(1); + $this->db->query("update vtiger_user2mergefields set visible=1 where fieldid in(1,38,40,65,104,106,111,152,156,255)"); + $this->initWebservices(); + + /** + * Setup module sequence numbering. + */ + $modseq = array( + 'Leads' =>'LEA', + 'Accounts' =>'ACC', + 'Campaigns' =>'CAM', + 'Contacts' =>'CON', + 'Potentials'=>'POT', + 'HelpDesk' =>'TT', + 'Quotes' =>'QUO', + 'SalesOrder'=>'SO', + 'PurchaseOrder'=>'PO', + 'Invoice' =>'INV', + 'Products' =>'PRO', + 'Vendors' =>'VEN', + 'PriceBooks'=>'PB', + 'Faq' =>'FAQ', + 'Documents' =>'DOC' + ); + foreach($modseq as $modname => $prefix) { + $this->addInventoryRows( + array( + array('semodule'=>$modname, 'active'=>'1','prefix'=>$prefix,'startid'=>'1','curid'=>'1') + ) + ); + } + + // Adding Sharing Types for Reports + $this->db->query("insert into vtiger_reportfilters values(1,'Private')"); + $this->db->query("insert into vtiger_reportfilters values(2,'Public')"); + $this->db->query("insert into vtiger_reportfilters values(3,'Shared')"); + + require_once('modules/Utilities/Currencies.php'); + foreach($currencies as $key=>$value){ + $this->db->query("insert into vtiger_currencies values(".$this->db->getUniqueID("vtiger_currencies").",'$key','".$value[0]."','".$value[1]."')"); + } + + } + + //Added to insert the records in vtiger_user_mergefields + function insertUser2mergefields($userid){ + global $log, $adb; + $log->debug("Entering insertUser2mergefields(".$userid.") method ..."); + $log->info("in insertUser2mergefields ".$userid); + + //$this->db->database->SetFetchMode(ADODB_FETCH_ASSOC); + $tab_res = $adb->query("SELECT distinct tabid FROM vtiger_tab"); + $noOfTabs = $adb->num_rows($tab_res); + for($i=0;$i<$noOfTabs;$i++) { + $tab_id = $this->db->query_result($tab_res,$i,'tabid'); + $fld_result = getFieldsResultForMerge($tab_id); + if ($fld_result != null) { + $num_rows = $this->db->num_rows($fld_result); + for($j=0; $j<$num_rows; $j++) { + $field_id = $this->db->query_result($fld_result,$j,'fieldid'); + $data_type = explode("~",$this->db->query_result($fld_result,$j,'typeofdata')); + if($data_type[1] == 'M') { + $visible = 1; + $this->db->query("insert into vtiger_user2mergefields values ($userid, $tab_id, $field_id, $visible)"); + } + } + } + } + $log->debug("Exiting insertUser2mergefields method ..."); + } + + function initWebservices(){ + $this->vtws_addEntityInfo(); + $this->vtws_addOperationInfo(); + $this->vtws_addFieldTypeInformation(); + } + + function vtws_addOperationInfo(){ + $operationMeta = array( + "login"=>array( + "include"=>array( + "include/Webservices/Login.php" + ), + "handler"=>"vtws_login", + "params"=>array( + "username"=>"String", + "accessKey"=>"String" + ), + "prelogin"=>1, + "type"=>"POST" + ), + "retrieve"=>array( + "include"=>array( + "include/Webservices/Retrieve.php" + ), + "handler"=>"vtws_retrieve", + "params"=>array( + "id"=>"String" + ), + "prelogin"=>0, + "type"=>"GET" + ), + "create"=>array( + "include"=>array( + "include/Webservices/Create.php" + ), + "handler"=>"vtws_create", + "params"=>array( + "elementType"=>"String", + "element"=>"encoded" + ), + "prelogin"=>0, + "type"=>"POST" + ), + "update"=>array( + "include"=>array( + "include/Webservices/Update.php" + ), + "handler"=>"vtws_update", + "params"=>array( + "element"=>"encoded" + ), + "prelogin"=>0, + "type"=>"POST" + ), + "delete"=>array( + "include"=>array( + "include/Webservices/Delete.php" + ), + "handler"=>"vtws_delete", + "params"=>array( + "id"=>"String" + ), + "prelogin"=>0, + "type"=>"POST" + ), + "sync"=>array( + "include"=>array( + "include/Webservices/GetUpdates.php" + ), + "handler"=>"vtws_sync", + "params"=>array( + "modifiedTime"=>"DateTime", + "elementType"=>"String" + ), + "prelogin"=>0, + "type"=>"GET" + ), + "query"=>array( + "include"=>array( + "include/Webservices/Query.php" + ), + "handler"=>"vtws_query", + "params"=>array( + "query"=>"String" + ), + "prelogin"=>0, + "type"=>"GET" + ), + "logout"=>array( + "include"=>array( + "include/Webservices/Logout.php" + ), + "handler"=>"vtws_logout", + "params"=>array( + "sessionName"=>"String" + ), + "prelogin"=>0, + "type"=>"POST" + ), + "listtypes"=>array( + "include"=>array( + "include/Webservices/ModuleTypes.php" + ), + "handler"=>"vtws_listtypes", + "params"=>array(), + "prelogin"=>0, + "type"=>"GET" + ), + "getchallenge"=>array( + "include"=>array( + "include/Webservices/AuthToken.php" + ), + "handler"=>"vtws_getchallenge", + "params"=>array( + "username"=>"String" + ), + "prelogin"=>1, + "type"=>"GET" + ), + "describe"=>array( + "include"=>array( + "include/Webservices/DescribeObject.php" + ), + "handler"=>"vtws_describe", + "params"=>array( + "elementType"=>"String" + ), + "prelogin"=>0, + "type"=>"GET" + ), + "extendsession"=>array( + "include"=>array( + "include/Webservices/ExtendSession.php" + ), + "handler"=>"vtws_extendSession", + 'params'=>array(), + "prelogin"=>1, + "type"=>"POST" + ) + ); + $createOperationQuery = "insert into vtiger_ws_operation(operationid,name,handler_path,handler_method,type,prelogin) + values (?,?,?,?,?,?);"; + $createOperationParamsQuery = "insert into vtiger_ws_operation_parameters(operationid,name,type,sequence) + values (?,?,?,?);"; + foreach ($operationMeta as $operationName => $operationDetails) { + $operationId = $this->db->getUniqueID("vtiger_ws_operation"); + $result = $this->db->pquery($createOperationQuery,array($operationId,$operationName,$operationDetails['include'], + $operationDetails['handler'],$operationDetails['type'],$operationDetails['prelogin'])); + $params = $operationDetails['params']; + $sequence = 1; + foreach ($params as $paramName => $paramType) { + $result = $this->db->pquery($createOperationParamsQuery,array($operationId,$paramName,$paramType,$sequence++)); + } + } + } + + function vtws_addEntityInfo(){ + require_once 'include/Webservices/Utils.php'; + $names = vtws_getModuleNameList(); + $moduleHandler = array('file'=>'include/Webservices/VtigerModuleOperation.php', + 'class'=>'VtigerModuleOperation'); + + foreach ($names as $tab){ + if(in_array($tab,array('Rss','Webmails','Recyclebin'))){ + continue; + } + $entityId = $this->db->getUniqueID("vtiger_ws_entity"); + $this->db->pquery('insert into vtiger_ws_entity(id,name,handler_path,handler_class,ismodule) values (?,?,?,?,?)', + array($entityId,$tab,$moduleHandler['file'],$moduleHandler['class'],1)); + } + + $entityId = $this->db->getUniqueID("vtiger_ws_entity"); + $this->db->pquery('insert into vtiger_ws_entity(id,name,handler_path,handler_class,ismodule) values (?,?,?,?,?)', + array($entityId,'Events',$moduleHandler['file'],$moduleHandler['class'],1)); + + + $entityId = $this->db->getUniqueID("vtiger_ws_entity"); + $this->db->pquery('insert into vtiger_ws_entity(id,name,handler_path,handler_class,ismodule) values (?,?,?,?,?)', + array($entityId,'Users',$moduleHandler['file'],$moduleHandler['class'],1)); + + vtws_addDefaultActorTypeEntity('Groups',array('fieldNames'=>'groupname', + 'indexField'=>'groupid','tableName'=>'vtiger_groups')); + + require_once("include/Webservices/WebServiceError.php"); + require_once 'include/Webservices/VtigerWebserviceObject.php'; + $webserviceObject = VtigerWebserviceObject::fromName($this->db,'Groups'); + $this->db->pquery("insert into vtiger_ws_entity_tables(webservice_entity_id,table_name) values + (?,?)",array($webserviceObject->getEntityId(),'vtiger_groups')); + + vtws_addDefaultActorTypeEntity('Currency',array('fieldNames'=>'currency_name', + 'indexField'=>'id','tableName'=>'vtiger_currency_info')); + + $webserviceObject = VtigerWebserviceObject::fromName($this->db,'Currency'); + $this->db->pquery("insert into vtiger_ws_entity_tables(webservice_entity_id,table_name) values (?,?)", + array($webserviceObject->getEntityId(),'vtiger_currency_info')); + + vtws_addDefaultActorTypeEntity('DocumentFolders',array('fieldNames'=>'foldername', + 'indexField'=>'folderid','tableName'=>'vtiger_attachmentsfolder')); + $webserviceObject = VtigerWebserviceObject::fromName($this->db,'DocumentFolders'); + $this->db->pquery("insert into vtiger_ws_entity_tables(webservice_entity_id,table_name) values (?,?)", + array($webserviceObject->getEntityId(),'vtiger_attachmentsfolder')); + + } + + function vtws_addFieldTypeInformation(){ + $fieldTypeInfo = array('picklist'=>array(15,16),'text'=>array(19,20,21,24),'autogenerated'=>array(3),'phone'=>array(11), + 'multipicklist'=>array(33),'url'=>array(17),'skype'=>array(85),'boolean'=>array(56,156),'owner'=>array(53), + 'file'=>array(61,28)); + + foreach($fieldTypeInfo as $type=>$uitypes){ + foreach($uitypes as $uitype){ + $result = $this->db->pquery("insert into vtiger_ws_fieldtype(uitype,fieldtype) values(?,?)",array($uitype,$type)); + if(!is_object($result)){ + "Query for fieldtype details($uitype:uitype,$type:fieldtype)"; + } + } + } + + $this->vtws_addReferenceTypeInformation(); + } + + function vtws_addReferenceTypeInformation(){ + $referenceMapping = array("50"=>array("Accounts"),"51"=>array("Accounts"),"57"=>array("Contacts"), + "58"=>array("Campaigns"),"73"=>array("Accounts"),"75"=>array("Vendors"),"76"=>array("Potentials"), + "78"=>array("Quotes"),"80"=>array("SalesOrder"),"81"=>array("Vendors"),"101"=>array("Users"),"52"=>array("Users"), + "357"=>array("Contacts","Accounts","Leads","Users","Vendors"),"59"=>array("Products"), + "66"=>array("Leads","Accounts","Potentials","HelpDesk"),"77"=>array("Users"),"68"=>array("Contacts","Accounts"), + "117"=>array('Currency'),"116"=>array('Currency'),'26'=>array('DocumentFolders'),'10'=>array()); + + foreach($referenceMapping as $uitype=>$referenceArray){ + $success = true; + $result = $this->db->pquery("insert into vtiger_ws_fieldtype(uitype,fieldtype) values(?,?)",array($uitype,"reference")); + if(!is_object($result)){ + $success=false; + } + $result = $this->db->pquery("select * from vtiger_ws_fieldtype where uitype=?",array($uitype)); + $rowCount = $this->db->num_rows($result); + for($i=0;$i<$rowCount;$i++){ + $fieldTypeId = $this->db->query_result($result,$i,"fieldtypeid"); + foreach($referenceArray as $index=>$referenceType){ + $result = $this->db->pquery("insert into vtiger_ws_referencetype(fieldtypeid,type) values(?,?)",array($fieldTypeId,$referenceType)); + if(!is_object($result)){ + echo "failed for: $referenceType, uitype: $fieldTypeId"; + $success=false; + } + } + } + if(!$success){ + echo "Migration Query Failed"; + } + } + + $success = true; + $fieldTypeId = $this->db->getUniqueID("vtiger_ws_entity_fieldtype"); + $result = $this->db->pquery("insert into vtiger_ws_entity_fieldtype(fieldtypeid,table_name,field_name,fieldtype) values(?,?,?,?);", + array($fieldTypeId,'vtiger_attachmentsfolder','createdby',"reference")); + if(!is_object($result)){ + echo "failed fo init
      "; + $success=false; + } + $result = $this->db->pquery("insert into vtiger_ws_entity_referencetype(fieldtypeid,type) values(?,?)",array($fieldTypeId,'Users')); + if(!is_object($result)){ + echo "failed for: Users, fieldtypeid: $fieldTypeId"; + $success=false; + } + if(!$success){ + echo "Migration Query Failed"; + } + + } + + function addInventoryRows($paramArray){ + global $adb; + + $fieldCreateCount = 0; + + for($index = 0; $index < count($paramArray); ++$index) { + $criteria = $paramArray[$index]; + + $semodule = $criteria['semodule']; + + $modfocus = CRMEntity::getInstance($semodule); + $modfocus->setModuleSeqNumber('configure', $semodule, $criteria['prefix'], $criteria['startid']); + } + } + + /** + * this function adds the entries for settings page + * it assumes entries as were present on 10-12-208 + */ + function addEntriesForSettings(){ + global $adb; + + //icons for all fields + $icons = array("ico-users.gif", + "ico-roles.gif", + "ico-profile.gif", + "ico-groups.gif", + "shareaccess.gif", + "orgshar.gif", + "audit.gif", + "set-IcoLoginHistory.gif", + "vtlib_modmng.gif", + "picklist.gif", + "ViewTemplate.gif", + "mailmarge.gif", + "notification.gif", + "inventory.gif", + "company.gif", + "ogmailserver.gif", + "backupserver.gif", + "assign.gif", + "currency.gif", + "taxConfiguration.gif", + "system.gif", + "proxy.gif", + "announ.gif", + "set-IcoTwoTabConfig.gif", + "terms.gif", + "settingsInvNumber.gif", + "mailScanner.gif", + "settingsWorkflow.png"); + + //labels for blocks + $blocks = array('LBL_MODULE_MANAGER', + 'LBL_USER_MANAGEMENT', + 'LBL_STUDIO', + 'LBL_COMMUNICATION_TEMPLATES', + 'LBL_OTHER_SETTINGS'); + + //field names + $names = array('LBL_USERS', + 'LBL_ROLES', + 'LBL_PROFILES', + 'USERGROUPLIST', + 'LBL_SHARING_ACCESS', + 'LBL_FIELDS_ACCESS', + 'LBL_AUDIT_TRAIL', + 'LBL_LOGIN_HISTORY_DETAILS', + 'VTLIB_LBL_MODULE_MANAGER', + 'LBL_PICKLIST_EDITOR', + 'EMAILTEMPLATES', + 'LBL_MAIL_MERGE', + 'NOTIFICATIONSCHEDULERS', + 'INVENTORYNOTIFICATION', + 'LBL_COMPANY_DETAILS', + 'LBL_MAIL_SERVER_SETTINGS', + 'LBL_BACKUP_SERVER_SETTINGS', + 'LBL_ASSIGN_MODULE_OWNERS', + 'LBL_CURRENCY_SETTINGS', + 'LBL_TAX_SETTINGS', + 'LBL_SYSTEM_INFO', + 'LBL_PROXY_SETTINGS', + 'LBL_ANNOUNCEMENT', + 'LBL_DEFAULT_MODULE_VIEW', + 'INVENTORYTERMSANDCONDITIONS', + 'LBL_CUSTOMIZE_MODENT_NUMBER', + 'LBL_MAIL_SCANNER', + 'LBL_LIST_WORKFLOWS',); + + + $name_blocks = array('LBL_USERS'=>'LBL_USER_MANAGEMENT', + 'LBL_ROLES'=>'LBL_USER_MANAGEMENT', + 'LBL_PROFILES'=>'LBL_USER_MANAGEMENT', + 'USERGROUPLIST'=>'LBL_USER_MANAGEMENT', + 'LBL_SHARING_ACCESS'=>'LBL_USER_MANAGEMENT', + 'LBL_FIELDS_ACCESS'=>'LBL_USER_MANAGEMENT', + 'LBL_AUDIT_TRAIL'=>'LBL_USER_MANAGEMENT', + 'LBL_LOGIN_HISTORY_DETAILS'=>'LBL_USER_MANAGEMENT', + 'VTLIB_LBL_MODULE_MANAGER'=>'LBL_STUDIO', + 'LBL_PICKLIST_EDITOR'=>'LBL_STUDIO', + 'EMAILTEMPLATES'=>'LBL_COMMUNICATION_TEMPLATES', + 'LBL_MAIL_MERGE'=>'LBL_COMMUNICATION_TEMPLATES', + 'NOTIFICATIONSCHEDULERS'=>'LBL_COMMUNICATION_TEMPLATES', + 'INVENTORYNOTIFICATION'=>'LBL_COMMUNICATION_TEMPLATES', + 'LBL_COMPANY_DETAILS'=>'LBL_COMMUNICATION_TEMPLATES', + 'LBL_MAIL_SERVER_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_BACKUP_SERVER_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_ASSIGN_MODULE_OWNERS'=>'LBL_OTHER_SETTINGS', + 'LBL_CURRENCY_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_TAX_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_SYSTEM_INFO'=>'LBL_OTHER_SETTINGS', + 'LBL_PROXY_SETTINGS'=>'LBL_OTHER_SETTINGS', + 'LBL_ANNOUNCEMENT'=>'LBL_OTHER_SETTINGS', + 'LBL_DEFAULT_MODULE_VIEW'=>'LBL_OTHER_SETTINGS', + 'INVENTORYTERMSANDCONDITIONS'=>'LBL_OTHER_SETTINGS', + 'LBL_CUSTOMIZE_MODENT_NUMBER'=>'LBL_OTHER_SETTINGS', + 'LBL_MAIL_SCANNER'=>'LBL_OTHER_SETTINGS', + 'LBL_LIST_WORKFLOWS'=>'LBL_OTHER_SETTINGS',); + + + //description for fields + $description = array('LBL_USER_DESCRIPTION', + 'LBL_ROLE_DESCRIPTION', + 'LBL_PROFILE_DESCRIPTION', + 'LBL_GROUP_DESCRIPTION', + 'LBL_SHARING_ACCESS_DESCRIPTION', + 'LBL_SHARING_FIELDS_DESCRIPTION', + 'LBL_AUDIT_DESCRIPTION', + 'LBL_LOGIN_HISTORY_DESCRIPTION', + 'VTLIB_LBL_MODULE_MANAGER_DESCRIPTION', + 'LBL_PICKLIST_DESCRIPTION', + 'LBL_EMAIL_TEMPLATE_DESCRIPTION', + 'LBL_MAIL_MERGE_DESCRIPTION', + 'LBL_NOTIF_SCHED_DESCRIPTION', + 'LBL_INV_NOTIF_DESCRIPTION', + 'LBL_COMPANY_DESCRIPTION', + 'LBL_MAIL_SERVER_DESCRIPTION', + 'LBL_BACKUP_SERVER_DESCRIPTION', + 'LBL_MODULE_OWNERS_DESCRIPTION', + 'LBL_CURRENCY_DESCRIPTION', + 'LBL_TAX_DESCRIPTION', + 'LBL_SYSTEM_DESCRIPTION', + 'LBL_PROXY_DESCRIPTION', + 'LBL_ANNOUNCEMENT_DESCRIPTION', + 'LBL_DEFAULT_MODULE_VIEW_DESC', + 'LBL_INV_TANDC_DESCRIPTION', + 'LBL_CUSTOMIZE_MODENT_NUMBER_DESCRIPTION', + 'LBL_MAIL_SCANNER_DESCRIPTION', + 'LBL_LIST_WORKFLOWS_DESCRIPTION'); + + $links = array('index.php?module=Administration&action=index&parenttab=Settings', + 'index.php?module=Settings&action=listroles&parenttab=Settings', + 'index.php?module=Settings&action=ListProfiles&parenttab=Settings', + 'index.php?module=Settings&action=listgroups&parenttab=Settings', + 'index.php?module=Settings&action=OrgSharingDetailView&parenttab=Settings', + 'index.php?module=Settings&action=DefaultFieldPermissions&parenttab=Settings', + 'index.php?module=Settings&action=AuditTrailList&parenttab=Settings', + 'index.php?module=Settings&action=ListLoginHistory&parenttab=Settings', + 'index.php?module=Settings&action=ModuleManager&parenttab=Settings', + 'index.php?module=PickList&action=PickList&parenttab=Settings', + 'index.php?module=Settings&action=listemailtemplates&parenttab=Settings', + 'index.php?module=Settings&action=listwordtemplates&parenttab=Settings', + 'index.php?module=Settings&action=listnotificationschedulers&parenttab=Settings', + 'index.php?module=Settings&action=listinventorynotifications&parenttab=Settings', + 'index.php?module=Settings&action=OrganizationConfig&parenttab=Settings', + 'index.php?module=Settings&action=EmailConfig&parenttab=Settings', + 'index.php?module=Settings&action=BackupServerConfig&parenttab=Settings', + 'index.php?module=Settings&action=ListModuleOwners&parenttab=Settings', + 'index.php?module=Settings&action=CurrencyListView&parenttab=Settings', + 'index.php?module=Settings&action=TaxConfig&parenttab=Settings', + 'index.php?module=System&action=listsysconfig&parenttab=Settings', + 'index.php?module=Settings&action=ProxyServerConfig&parenttab=Settings', + 'index.php?module=Settings&action=Announcements&parenttab=Settings', + 'index.php?module=Settings&action=DefModuleView&parenttab=Settings', + 'index.php?module=Settings&action=OrganizationTermsandConditions&parenttab=Settings', + 'index.php?module=Settings&action=CustomModEntityNo&parenttab=Settings', + 'index.php?module=Settings&action=MailScanner&parenttab=Settings', + 'index.php?module=com_vtiger_workflow&action=workflowlist&parenttab=Settings',); + + //insert settings blocks + $count = count($blocks); + for($i=0; $i<$count; $i++){ + $adb->query("insert into vtiger_settings_blocks values (".$adb->getUniqueID('vtiger_settings_blocks').", '$blocks[$i]', $i+1)"); + } + + $count = count($icons); + //insert settings fields + for($i=0, $seq=1; $i<$count; $i++, $seq++){ + if($i==8 || $i==12 || $i==18){ + $seq = 1; + } + $adb->query("insert into vtiger_settings_field (fieldid, blockid, name, iconpath, description, linkto, sequence) values (".$adb->getUniqueID('vtiger_settings_field').", ".getSettingsBlockId($name_blocks[$names[$i]]).", '$names[$i]', '$icons[$i]', '$description[$i]', '$links[$i]', $seq)"); + } + + // for Workflow in settings page of every module + $module_manager_id = getSettingsBlockId('LBL_MODULE_MANAGER'); + $result = $adb->pquery("SELECT max(sequence) AS maxseq FROM vtiger_settings_field WHERE blockid = ?",array($module_manager_id)); + $maxseq = $adb->query_result($result,0,'maxseq'); + if($maxseq < 0 || $maxseq == NULL){ + $maxseq=1; + } + $adb->pquery("INSERT INTO vtiger_settings_field (fieldid, blockid, name, iconpath, description, linkto, sequence) VALUES (?,?,?,?,?,?,?)",array($adb->getUniqueID('vtiger_settings_field'), $module_manager_id, 'LBL_WORKFLOW_LIST', 'settingsWorkflow.png', 'LBL_AVAILABLE_WORKLIST_LIST', 'index.php?module=com_vtiger_workflow&action=workflowlist', $maxseq)); + + //hide the system details tab for now + $adb->query("update vtiger_settings_field set active=1 where name='LBL_SYSTEM_INFO'"); + } +} +?> diff --git a/oss/vtiger/trunk/modules/Users/Delete.php b/oss/vtiger/trunk/modules/Users/Delete.php new file mode 100644 index 00000000..18080c31 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Delete.php @@ -0,0 +1,18 @@ +pquery($sql, array($_REQUEST['record'], $_REQUEST['return_id'])); + +if($_REQUEST['return_module'] == 'Calendar') + $mode ='&activity_mode=Events'; + +header("Location: index.php?module=".vtlib_purify($_REQUEST['return_module'])."&action=".vtlib_purify($_REQUEST['return_action']).$mode."&record=".vtlib_purify($_REQUEST['return_id'])."&relmodule=".vtlib_purify($_REQUEST['module'])); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/DeleteGroup.php b/oss/vtiger/trunk/modules/Users/DeleteGroup.php new file mode 100644 index 00000000..ae1915df --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/DeleteGroup.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/DeleteProfile.php b/oss/vtiger/trunk/modules/Users/DeleteProfile.php new file mode 100644 index 00000000..79d44e67 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/DeleteProfile.php @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/DeleteRole.php b/oss/vtiger/trunk/modules/Users/DeleteRole.php new file mode 100644 index 00000000..4ec84d9d --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/DeleteRole.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/DeleteSharingRule.php b/oss/vtiger/trunk/modules/Users/DeleteSharingRule.php new file mode 100644 index 00000000..fa992271 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/DeleteSharingRule.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/DeleteUser.php b/oss/vtiger/trunk/modules/Users/DeleteUser.php new file mode 100644 index 00000000..b721dbdb --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/DeleteUser.php @@ -0,0 +1,77 @@ +pquery($sql1, array($tran_id, $del_id)); +$sql2 = "update vtiger_crmentity set smownerid=? where smownerid=?"; +$adb->pquery($sql2, array($tran_id, $del_id)); +$sql3 = "update vtiger_crmentity set modifiedby=? where modifiedby=?"; +$adb->pquery($sql3, array($tran_id, $del_id)); + +//deleting from vtiger_tracker +$sql4 = "delete from vtiger_tracker where user_id=?"; +$adb->pquery($sql4, array($del_id)); + +//updating created by in vtiger_lar +$sql5 = "update vtiger_lar set createdby=? where createdby=?"; +$adb->pquery($sql5, array($tran_id, $del_id)); + +//updating the vtiger_import_maps +$sql6 ="update vtiger_import_maps set assigned_user_id=? where assigned_user_id=?"; +$adb->pquery($sql6, array($tran_id, $del_id)); + +//update assigned_user_id in vtiger_files +$sql7 ="update vtiger_files set assigned_user_id=? where assigned_user_id=?"; +$adb->pquery($sql7, array($tran_id, $del_id)); + +//update assigned_user_id in vtiger_users_last_import +$sql8 = "update vtiger_users_last_import set assigned_user_id=? where assigned_user_id=?"; +$adb->pquery($sql8, array($tran_id, $del_id)); + +//updating handler in vtiger_products +$sql9 = "update vtiger_products set handler=? where handler=?"; +$adb->pquery($sql9, array($tran_id, $del_id)); + +//updating inventorymanager in vtiger_quotes +$sql10 = "update vtiger_quotes set inventorymanager=? where inventorymanager=?"; +$adb->pquery($sql10, array($tran_id, $del_id)); + +//updating reports_to_id in vtiger_users +$sql11 = "update vtiger_users set reports_to_id=? where reports_to_id=?"; +$adb->pquery($sql11, array($tran_id, $del_id)); + +//updating user_id in vtiger_moduleowners +$sql12 = "update vtiger_moduleowners set user_id=? where user_id=?"; +$adb->pquery($sql12, array($tran_id, $del_id)); + +//delete from vtiger_users to group vtiger_table +$sql13 = "delete from vtiger_user2role where userid=?"; +$adb->pquery($sql13, array($del_id)); + +//delete from vtiger_users to vtiger_role vtiger_table +$sql14 = "delete from vtiger_users2group where userid=?"; +$adb->pquery($sql14, array($del_id)); + + +//delete from user vtiger_table; +$sql15 = "delete from vtiger_users where id=?"; +$adb->pquery($sql15, array($del_id)); + +//if check to delete user from detail view +if(isset($_REQUEST["ajax_delete"]) && $_REQUEST["ajax_delete"] == 'false') + header("Location: index.php?action=ListView&module=Users"); +else + header("Location: index.php?action=UsersAjax&module=Users&file=ListView&ajax=true"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/DetailView.php b/oss/vtiger/trunk/modules/Users/DetailView.php new file mode 100644 index 00000000..75895a4c --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/DetailView.php @@ -0,0 +1,234 @@ +retrieve_entity_info($_REQUEST['record'],'Users'); + $focus->id = $_REQUEST['record']; +} +else +{ + + echo " + + "; +} + +if( $focus->user_name == "" ) +{ + + if(is_admin($current_user)) + { + echo " + + + + "; + + echo " + + + +
      + User does not exist. +
      + List Users +
      + "; + exit; + } + +} + + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +//the user might belong to multiple groups +$log->info("User detail view"); + +$category = getParenttab(); + +$smarty = new vtigerCRM_Smarty; + +$smarty->assign("UMOD", $mod_strings); +global $current_language; +$smod_strings = return_module_language($current_language, 'Settings'); +$smarty->assign("MOD", $smod_strings); + +$smarty->assign("APP", $app_strings); + +$oGetUserGroups = new GetUserGroups(); +$oGetUserGroups->getAllUserGroups($focus->id); +if(useInternalMailer() == 1) + $smarty->assign("INT_MAILER","true"); + +$smarty->assign("GROUP_COUNT",count($oGetUserGroups->user_groups)); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path);$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", $focus->id); +$smarty->assign("CATEGORY", $category); +if(isset($focus->imagename) && $focus->imagename!='') +{ + $imagestring="
      +
      +
      + + +
      +

      "; + //$smarty->assign("USER_IMAGE",$imagestring); +} + +if(isset($_REQUEST['modechk']) && $_REQUEST['modechk'] != '' ) +{ + $modepref = $_REQUEST['modechk']; +} + if($_REQUEST['modechk'] == 'prefview') + $parenttab = ''; + else + $parenttab = 'Settings'; + +$smarty->assign("PARENTTAB", $parenttab); + +if ((is_admin($current_user) || $_REQUEST['record'] == $current_user->id) + && isset($default_user_name) + && $default_user_name == $focus->user_name + && isset($lock_default_user_name) + && $lock_default_user_name == true ) { + $buttons = ""; + $smarty->assign('EDIT_BUTTON',$buttons); +} +elseif (is_admin($current_user) || $_REQUEST['record'] == $current_user->id) { + $buttons = ""; + $smarty->assign('EDIT_BUTTON',$buttons); + + $buttons = ""; + $smarty->assign('CHANGE_PW_BUTTON',$buttons); + + +} +if (is_admin($current_user)) +{ + $buttons = ""; + $smarty->assign('DUPLICATE_BUTTON',$buttons); + + //done so that only the admin user can see the customize tab button + if($_REQUEST['record'] != $current_user->id) + { + $buttons = "id')\" type='button' name='Delete' value=' ".$app_strings['LBL_DELETE_BUTTON_LABEL']." '>"; + $smarty->assign('DELETE_BUTTON',$buttons); + } + + if($_SESSION['authenticated_user_roleid'] == 'administrator') + { + $buttons = ""; + $smarty->assign('LISTROLES_BUTTON',$buttons); + } + +} + +if(is_admin($current_user)) + $smarty->assign("IS_ADMIN", true); +else + $smarty->assign("IS_ADMIN", false); + +$lead_tables = Array('vtiger_users','vtiger_user2role'); +$tabid = getTabid("Users"); +$validationData = getDBValidationData($lead_tables,$tabid); +$data = split_validationdataArray($validationData); + +if($current_user->id == $_REQUEST['record'] || is_admin($current_user) == true) +{ +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); +$smarty->assign("MODULE", 'Users'); +$smarty->assign("CURRENT_USERID", $current_user->id); +$smarty->assign("HOMEORDER",$focus->getHomeStuffOrder($focus->id)); +//Added to provide User based Tagcloud +$smarty->assign("TAGCLOUDVIEW",getTagCloudView($focus->id)); +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); +$smarty->assign("USERNAME",$focus->last_name.' '.$focus->first_name); +$smarty->assign("HOUR_FORMAT",$focus->hour_format); +$smarty->assign("START_HOUR",$focus->start_hour); + +//for check audittrail if it is enable or not +$smarty->assign("AUDITTRAIL",$audit_trail); + +$smarty->display("UserDetailView.tpl"); +} +else +{ + $output = ' + +
      +
      + + + + + + + + +
      + + + '.$app_strings["LBL_PERMISSION"].' + +
      + '.$app_strings["LBL_GO_BACK"].' +
      +
      +
      +
      '; + echo $output; +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/DetailViewAjax.php b/oss/vtiger/trunk/modules/Users/DetailViewAjax.php new file mode 100644 index 00000000..ee83c0ef --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/DetailViewAjax.php @@ -0,0 +1,49 @@ +retrieve_entity_info($crmid,"Users"); + $userObj->column_fields[$fieldname] = $fieldvalue; + if($fieldname == 'internal_mailer'){ + + if(isset($_SESSION['internal_mailer']) && $_SESSION['internal_mailer'] != $userObj->column_fields['internal_mailer']) + $_SESSION['internal_mailer'] = $userObj->column_fields['internal_mailer']; + } + $userObj->id = $crmid; + $userObj->mode = "edit"; + $userObj->save("Users"); + if($userObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/EditView.php b/oss/vtiger/trunk/modules/Users/EditView.php new file mode 100644 index 00000000..ddbc2440 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/EditView.php @@ -0,0 +1,125 @@ +assign("ID",vtlib_purify($_REQUEST['record'])); + $mode='edit'; + if (!is_admin($current_user) && $_REQUEST['record'] != $current_user->id) die ("Unauthorized access to user administration."); + $focus->retrieve_entity_info($_REQUEST['record'],'Users'); + $smarty->assign("USERNAME",$focus->last_name.' '.$focus->first_name); +}else +{ + $mode='create'; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + $focus->user_name = ""; + $mode='create'; + + //When duplicating the user the password fields should be empty + $focus->column_fields['user_password']=''; + $focus->column_fields['confirm_password']=''; +} + +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$log->info("User edit view"); + + +$smarty->assign("JAVASCRIPT", get_validate_record_js()); +$smarty->assign("UMOD", $mod_strings); +global $current_language; +$smod_strings = return_module_language($current_language,'Settings'); +$smarty->assign("MOD", $smod_strings); +$smarty->assign("CURRENT_USERID", $current_user->id); +$smarty->assign("APP", $app_strings); + +if (isset($_REQUEST['error_string'])) $smarty->assign("ERROR_STRING", "Error: ".vtlib_purify($_REQUEST['error_string']).""); +if (isset($_REQUEST['return_module'])) +{ + $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); + $RETURN_MODULE=vtlib_purify($_REQUEST['return_module']); +} +if (isset($_REQUEST['return_action'])) +{ + $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); + $RETURN_ACTION = vtlib_purify($_REQUEST['return_action']); +} +if ($_REQUEST['isDuplicate'] != 'true' && isset($_REQUEST['return_id'])) +{ + $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); + $RETURN_ID = vtlib_purify($_REQUEST['return_id']); +} +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path);$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$focus->mode = $mode; +$disp_view = getView($focus->mode); +$smarty->assign("IMAGENAME",$focus->imagename); +$smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("MODULE", 'Settings'); +$smarty->assign("MODE",$focus->mode); +$smarty->assign("HOUR_FORMAT",$focus->hour_format); +$smarty->assign("START_HOUR",$focus->start_hour); +if ($_REQUEST['Edit'] == ' Edit ') +{ + $smarty->assign("READONLY", "readonly"); + $smarty->assign("USERNAME_READONLY", "readonly"); + +} +if(isset($_REQUEST['record']) && $_REQUEST['isDuplicate'] != 'true') +{ + $smarty->assign("USERNAME_READONLY", "readonly"); +} + +$smarty->assign("HOMEORDER",$focus->getHomeStuffOrder($focus->id)); +//Added to provide User based Tagcloud +if($mode == 'create') $smarty->assign("TAGCLOUDVIEW","true"); // While creating user select tag cloud by default +else $smarty->assign("TAGCLOUDVIEW",getTagCloudView($focus->id)); + +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); +$smarty->assign("USER_MODE",$mode); +$smarty->assign('PARENTTAB', getParentTab()); + +$smarty->display('UserEditView.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/Error.php b/oss/vtiger/trunk/modules/Users/Error.php new file mode 100644 index 00000000..3efa01ce --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Error.php @@ -0,0 +1,26 @@ + +

      + +

      + +
      + diff --git a/oss/vtiger/trunk/modules/Users/Forms.php b/oss/vtiger/trunk/modules/Users/Forms.php new file mode 100644 index 00000000..b1a38042 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Forms.php @@ -0,0 +1,216 @@ +query($sql); + + $count = $adb->num_rows($result); + + if($count > 0){ + return "true"; + }else{ + return "false"; + } +} + +/** + * this function gets the asterisk extensions assigned in vtiger + */ +function getAsteriskExtensions(){ + global $adb, $current_user; + + $sql = "select * from vtiger_asteriskextensions where userid != ".$current_user->id; + $result = $adb->pquery($sql, array()); + $count = $adb->num_rows($result); + $data = array(); + + for($i=0;$i<$count;$i++){ + $user = $adb->query_result($result, $i, "userid"); + $extension = $adb->query_result($result, $i, "asterisk_extension"); + if(!empty($extension)){ + $data[$user] = $extension; + } + } + return $data; +} + +/** + * Create javascript to validate the data entered into a record. + * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc. + * All Rights Reserved. + * Contributor(s): ______________________________________.. + */ +function get_validate_record_js () { +global $mod_strings; +global $app_strings; + +$lbl_last_name = $mod_strings['LBL_LIST_LAST_NAME']; +$lbl_user_name = $mod_strings['LBL_LIST_USER_NAME']; +$lbl_role_name = $mod_strings['LBL_ROLE_NAME']; +$lbl_new_password = $mod_strings['LBL_LIST_PASSWORD']; +$lbl_confirm_new_password = $mod_strings['LBL_LIST_CONFIRM_PASSWORD']; +$lbl_user_email1 = $mod_strings['LBL_LIST_EMAIL']; +$err_missing_required_fields = $app_strings['ERR_MISSING_REQUIRED_FIELDS']; +$err_invalid_email_address = $app_strings['ERR_INVALID_EMAIL_ADDRESS']; +$err_invalid_yahoo_email_address = $app_strings['ERR_INVALID_YAHOO_EMAIL_ADDRESS']; +$lbl_user_image=$mod_strings['User Image']; +$the_emailid = $app_strings['THE_EMAILID']; +$email_field_is = $app_strings['EMAIL_FILED_IS'].$err_invalid_email_address; +$other_email_field_is = $app_strings['OTHER_EMAIL_FILED_IS'].$err_invalid_email_address; +$yahoo_email_field_is = $app_strings['YAHOO_EMAIL_FILED_IS'].$err_invalid_yahoo_email_address; +$lbl_asterisk_details_not_set = $app_strings['LBL_ASTERISK_SET_ERROR']; + +//check asteriskdetails start +$checkAsteriskDetails = checkAsteriskDetails(); +$extensions_list = implode(",",getAsteriskExtensions()); +//check asteriskdetails end + +$the_script = << + + + +EOQ; + +return $the_script; +} + +?> diff --git a/oss/vtiger/trunk/modules/Users/GroupDeleteStep1.php b/oss/vtiger/trunk/modules/Users/GroupDeleteStep1.php new file mode 100644 index 00000000..1c4b034e --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/GroupDeleteStep1.php @@ -0,0 +1,119 @@ + +
      + + + + + + + + +
      '.$mod_strings['LBL_DELETE_GROUP'].''.$app_strings[
      + + + + +
      + + + + + + + + + +
      '.$mod_strings['LBL_DELETE_GROUPNAME'].''.htmlentities($delete_group_name,ENT_QUOTES,$default_charset).'
      '.$mod_strings['LBL_TRANSFER_GROUP'].''; + global $adb; + $sql = "select groupid,groupname from vtiger_groups"; + $result = $adb->pquery($sql, array()); + $num_groups = $adb->num_rows($result); + + $sql1 = "select id,user_name from vtiger_users where deleted=0"; + $result1= $adb->pquery($sql1, array()); + $num_users = $adb->num_rows($result1); + + + $output.= ' User'; + if($num_groups > 1) + { + $output .= ' Group'; + } + + $output .= ''; + + $output .= ''; + + if($num_groups > 1) + { + $output .= ''; + } + + $output.='
      +
      + + + + +
      +
      +
      '; + +echo $output; +?> diff --git a/oss/vtiger/trunk/modules/Users/ListView.php b/oss/vtiger/trunk/modules/Users/ListView.php new file mode 100644 index 00000000..caf237c4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/ListView.php @@ -0,0 +1,103 @@ +is_admin != 'on') +{ + die("

      ".$app_strings['LBL_PERMISSION']." ".$app_strings['LBL_GO_BACK'].".
      "); +} + +$log = LoggerManager::getLogger('user_list'); + +global $mod_strings,$adb; +global $theme; +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +global $current_language; +$mod_strings = return_module_language($current_language,'Users'); +$category = getParentTab(); +$focus = new Users(); +$no_of_users=UserCount(); + +//Display the mail send status +$smarty = new vtigerCRM_Smarty; +if($_REQUEST['mail_error'] != '') +{ + require_once("modules/Emails/mail.php"); + $error_msg = strip_tags(parseEmailErrorString($_REQUEST['mail_error'])); + $error_msg = $app_strings['LBL_MAIL_NOT_SENT_TO_USER']. ' ' . vtlib_purify($_REQUEST['user']). '. ' .$app_strings['LBL_PLS_CHECK_EMAIL_N_SERVER']; + $smarty->assign("ERROR_MSG",$mod_strings['LBL_MAIL_SEND_STATUS'].' '.$error_msg.''); +} + +//Retreiving the start value from request +if(isset($_REQUEST['start']) && $_REQUEST['start'] != '') { + $start = vtlib_purify($_REQUEST['start']); +} elseif($_SESSION['user_pagestart'] != '') { + $start = $_SESSION['user_pagestart']; +} else + $start=1; + +$list_query = getListQuery("Users"); + + $userid = array(); + $userid_Query = "SELECT id,user_name FROM vtiger_users WHERE user_name IN ('admin')"; + $users = $adb->pquery($userid_Query,array()); + $norows = $adb->num_rows($users); + if($norows > 0){ + for($i=0;$i<$norows ;$i++){ + $id = $adb->query_result($users,$i,'id'); + $userid[$id] = $adb->query_result($users,$i,'user_name'); + } + } + $smarty->assign("USERNODELETE",$userid); +$_SESSION['user_pagestart'] = $start; +if($_REQUEST['sorder'] !='') + $sorder = $adb->sql_escape_string($_REQUEST['sorder']); +elseif($_SESSION['user_sorder'] != '') + $sorder = $adb->sql_escape_string($_SESSION['user_sorder']); +else + $sorder = 'ASC'; +$_SESSION['user_sorder'] = $sorder; +if($_REQUEST['order_by'] != '') + $order_by = $adb->sql_escape_string($_REQUEST['order_by']); +elseif($_SESSION['user_orderby'] != '') + $order_by = $adb->sql_escape_string($_SESSION['user_orderby']); +else + $order_by = 'last_name'; +$_SESSION['user_orderby'] = $orderby; +$list_query .= ' ORDER BY '.$order_by.' '.$sorder; +$list_result = $adb->query($list_query); +//Retreive the Navigation array +$navigation_array = getNavigationValues($start, $adb->num_rows($list_result), $no_of_users['user']); + +$navigationOutput = getTableHeaderNavigation($navigation_array, $url_string,"Administration","index",''); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("CURRENT_USERID", $current_user->id); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("CATEGORY",$category); +$smarty->assign("LIST_HEADER",getListViewHeader($focus,"Users",$url_string,$sorder,$order_by,"","")); +$smarty->assign("LIST_ENTRIES",getListViewEntries($focus,"Users",$list_result,$navigation_array,"","","EditView","Delete","")); +$smarty->assign("USER_COUNT",$no_of_users); +$smarty->assign("RECORD_COUNTS", $record_string); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("USER_IMAGES",getUserImageNames()); +if($_REQUEST['ajax'] !='') + $smarty->display("UserListViewContents.tpl"); +else + $smarty->display("UserListView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/Login.php b/oss/vtiger/trunk/modules/Users/Login.php new file mode 100644 index 00000000..9e16ce35 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Login.php @@ -0,0 +1,198 @@ + + + + + + +

      +
      + + + + +
      + + + + + + + + + + + +
      vtiger CRMThe honest Open Source CRM
      + + + + + +
      +
      + + + + + + + + + + + +
      <?php echo $app_strings['LBL_SIGN_IN']?>
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
       
      +

      +
      +
      +
      +
      diff --git a/oss/vtiger/trunk/modules/Users/LoginHistory.php b/oss/vtiger/trunk/modules/Users/LoginHistory.php new file mode 100644 index 00000000..e2a9b697 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/LoginHistory.php @@ -0,0 +1,211 @@ +log = LoggerManager::getLogger('loginhistory'); + $this->db = PearDatabase::getInstance(); + } + + var $sortby_fields = Array('user_name', 'user_ip', 'login_time', 'logout_time', 'status'); + + // This is the list of vtiger_fields that are in the lists. + var $list_fields = Array( + 'User Name'=>Array('vtiger_loginhistory'=>'user_name'), + 'User IP'=>Array('vtiger_loginhistory'=>'user_ip'), + 'Signin Time'=>Array('vtiger_loginhistory'=>'login_time'), + 'Signout Time'=>Array('vtiger_loginhistory'=>'logout_time'), + 'Status'=>Array('vtiger_loginhistory'=>'status'), + ); + + var $list_fields_name = Array( + 'User Name'=>'user_name', + 'User IP'=>'user_ip', + 'Signin Time'=>'login_time', + 'Signout Time'=>'logout_time', + 'Status'=>'status' + ); + var $default_order_by = "login_time"; + var $default_sort_order = 'DESC'; + +/** + * Function to get the Header values of Login History. + * Returns Header Values like UserName, IP, LoginTime etc in an array format. +**/ + function getHistoryListViewHeader() + { + global $log; + $log->debug("Entering getHistoryListViewHeader method ..."); + global $app_strings; + + $header_array = array($app_strings['LBL_LIST_USER_NAME'], $app_strings['LBL_LIST_USERIP'], $app_strings['LBL_LIST_SIGNIN'], $app_strings['LBL_LIST_SIGNOUT'], $app_strings['LBL_LIST_STATUS']); + + $log->debug("Exiting getHistoryListViewHeader method ..."); + return $header_array; + + } + +/** + * Function to get the Login History values of the User. + * @param $navigation_array - Array values to navigate through the number of entries. + * @param $sortorder - DESC + * @param $orderby - login_time + * Returns the login history entries in an array format. +**/ + function getHistoryListViewEntries($username, $navigation_array, $sorder='', $orderby='') + { + global $log; + $log->debug("Entering getHistoryListViewEntries() method ..."); + global $adb, $current_user; + + if($sorder != '' && $order_by != '') + $list_query = "Select * from vtiger_loginhistory where user_name=? order by ".$order_by." ".$sorder; + else + $list_query = "Select * from vtiger_loginhistory where user_name=? order by ".$this->default_order_by." ".$this->default_sort_order; + + $result = $adb->pquery($list_query, array($username)); + $entries_list = array(); + + if($navigation_array['end_val'] != 0) + { + for($i = $navigation_array['start']; $i <= $navigation_array['end_val']; $i++) + { + $entries = array(); + $loginid = $adb->query_result($result, $i-1, 'login_id'); + + $entries[] = $adb->query_result($result, $i-1, 'user_name'); + $entries[] = $adb->query_result($result, $i-1, 'user_ip'); + $entries[] = $adb->query_result($result, $i-1, 'login_time'); + $entries[] = $adb->query_result($result, $i-1, 'logout_time'); + $entries[] = $adb->query_result($result, $i-1, 'status'); + + $entries_list[] = $entries; + } + $log->debug("Exiting getHistoryListViewEntries() method ..."); + return $entries_list; + } + } + + /** Function that Records the Login info of the User + * @param ref variable $usname :: Type varchar + * @param ref variable $usip :: Type varchar + * @param ref variable $intime :: Type timestamp + * Returns the query result which contains the details of User Login Info + */ + function user_login(&$usname,&$usip,&$intime) + { + global $adb; + //Kiran: Setting logout time to '0000-00-00 00:00:00' instead of null + $query = "Insert into vtiger_loginhistory (user_name, user_ip, logout_time, login_time, status) values (?,?,?,?,?)"; + $params = array($usname,$usip,'0000-00-00 00:00:00', $this->db->formatDate($intime, true),'Signed in'); + $result = $adb->pquery($query, $params) + or die("MySQL error: ".mysql_error()); + + return $result; + } + + /** Function that Records the Logout info of the User + * @param ref variable $usname :: Type varchar + * @param ref variable $usip :: Type varchar + * @param ref variable $outime :: Type timestamp + * Returns the query result which contains the details of User Logout Info + */ + function user_logout(&$usname,&$usip,&$outtime) + { + global $adb; + $logid_qry = "SELECT max(login_id) AS login_id from vtiger_loginhistory where user_name=? and user_ip=?"; + $result = $adb->pquery($logid_qry, array($usname, $usip)); + $loginid = $adb->query_result($result,0,"login_id"); + if ($loginid == '') + { + return; + } + // update the user login info. + $query = "Update vtiger_loginhistory set logout_time =?, status=? where login_id = ?"; + $result = $adb->pquery($query, array($this->db->formatDate($outtime, true), 'Signed off', $loginid)) + or die("MySQL error: ".mysql_error()); + } + + /** Function to create list query + * @param reference variable - order by is passed when the query is executed + * @param reference variable - where condition is passed when the query is executed + * Returns Query. + */ + function create_list_query(&$order_by, &$where) + { + // Determine if the vtiger_account name is present in the where clause. + global $current_user, $adb; + $query = "SELECT user_name,user_ip, status, + ".$this->db->getDBDateString("login_time")." AS login_time, + ".$this->db->getDBDateString("logout_time")." AS logout_time + FROM ".$this->table_name; + if($where != "") + { + if(!is_admin($current_user)) + $where .=" AND user_name = '". $adb->sql_escape_string($current_user->user_name) ."'"; + $query .= " WHERE ($where)"; + } + else + { + if(!is_admin($current_user)) + $query .= " WHERE user_name = '". $adb->sql_escape_string($current_user->user_name) ."'"; + } + + if(!empty($order_by)) + $query .= " ORDER BY ". $adb->sql_escape_string($order_by); + + return $query; + } + +} + + + +?> diff --git a/oss/vtiger/trunk/modules/Users/Logout.php b/oss/vtiger/trunk/modules/Users/Logout.php new file mode 100644 index 00000000..2541b030 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Logout.php @@ -0,0 +1,129 @@ +pquery($query, array('ftp_backup')); + $num_rows = $adb->num_rows($result); + if($num_rows > 0) + { + $ftpserver = $adb->query_result($result,0,'server'); + $ftpuser = $adb->query_result($result,0,'server_username'); + $ftppassword = $adb->query_result($result,0,'server_password'); + } + + //Taking the Backup of DB + $currenttime=date("Ymd_His"); + if($ftpserver != '' && $ftpuser != '' && $ftppassword != '') + { + $createZip = new createDirZip; + $fileName = '/backup_'.$currenttime.'.zip'; + + $createZip->addDirectory('user_privileges/'); + $createZip->get_files_from_folder('user_privileges/', 'user_privileges/'); + + $createZip->addDirectory('storage/'); + $createZip->get_files_from_folder('storage/', 'storage/'); + + $backup_DBFileName = "sqlbackup_".$currenttime.".sql"; + $dbdump = new DatabaseDump(dbserver, dbuser, dbpass); + $dumpfile = 'backup/'.$backup_DBFileName; + $dbdump->save(dbname, $dumpfile) ; + + $filedata = implode("", file('backup/'.$backup_DBFileName)); + $createZip->addFile($filedata,$backup_DBFileName); + + $fd = fopen ($fileName, 'wb'); + $out = fwrite ($fd, $createZip->getZippedfile()); + fclose ($fd); + + $source_file=$fileName; + ftpBackupFile($source_file, $ftpserver, $ftpuser, $ftppassword); + if(file_exists($source_file)) unlink($source_file); + + } +} +if($enable_local_backup == 'true' && is_admin($current_user) == true) +{ + define("dbserver", $dbconfig['db_hostname']); + define("dbuser", $dbconfig['db_username']); + define("dbpass", $dbconfig['db_password']); + define("dbname", $dbconfig['db_name']); + + $path_query = $adb->pquery("SELECT * FROM vtiger_systems WHERE server_type = ?",array('local_backup')); + $path = $adb->query_result($path_query,0,'server_path'); + $currenttime=date("Ymd_His"); + + if(is_dir($path) && is_writable($path)) + { + $createZip = new createDirZip; + $fileName = $path.'/backup_'.$currenttime.'.zip'; + + $createZip->addDirectory('user_privileges/'); + $createZip->get_files_from_folder('user_privileges/', 'user_privileges/'); + + $createZip->addDirectory('storage/'); + $createZip->get_files_from_folder('storage/', 'storage/'); + + $backup_DBFileName = "sqlbackup_".$currenttime.".sql"; + $dbdump = new DatabaseDump(dbserver, dbuser, dbpass); + $dumpfile = 'backup/'.$backup_DBFileName; + $dbdump->save(dbname, $dumpfile) ; + + $filedata = implode("", file('backup/'.$backup_DBFileName)); + $createZip->addFile($filedata,$backup_DBFileName); + + $fd = fopen ($fileName, 'wb'); + $out = fwrite ($fd, $createZip->getZippedfile()); + fclose ($fd); + } +} +// Recording Logout Info + $usip=$_SERVER['REMOTE_ADDR']; + $outtime=date("Y/m/d H:i:s"); + $loghistory=new LoginHistory(); + $loghistory->user_logout($current_user->user_name,$usip,$outtime); + + +$local_log =& LoggerManager::getLogger('Logout'); + +// clear out the autthenticating flag +session_destroy(); + +define("IN_LOGIN", true); + +// go to the login screen. +header("Location: index.php?action=Login&module=Users"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/OrgSharingEditView.php b/oss/vtiger/trunk/modules/Users/OrgSharingEditView.php new file mode 100644 index 00000000..cbf1765b --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/OrgSharingEditView.php @@ -0,0 +1,73 @@ + $def_perr) +{ + $entity_name = getTabname($tab_id); + if($tab_id == 6) + { + $cont_name = getTabname(4); + $entity_name .= ' & '.$cont_name; + } + $defActionArr=getModuleSharingActionArray($tab_id); + + $entries[] = $entity_name; + + if($tab_id != 6) + { + $output = ''; + } + $entries[] = $tab_id; + + foreach($defActionArr as $shareActId=>$shareActName) + { + $selected=''; + if($shareActId == $def_perr) + { + $selected='selected'; + } + $output .= ''; + + } + + + $output .= ''; + $entries[] = $output; + $row++; +} + +$list_entries=array_chunk($entries,3); +$smarty->assign("ORGINFO",$list_entries); +$smarty->assign("MOD", return_module_language($current_language,'Settings')); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); + +$smarty->display("OrgSharingEditView.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Users/Popup.php b/oss/vtiger/trunk/modules/Users/Popup.php new file mode 100644 index 00000000..88877b45 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Popup.php @@ -0,0 +1,20 @@ + diff --git a/oss/vtiger/trunk/modules/Users/ProfileDeleteStep1.php b/oss/vtiger/trunk/modules/Users/ProfileDeleteStep1.php new file mode 100644 index 00000000..d9d717cb --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/ProfileDeleteStep1.php @@ -0,0 +1,75 @@ + +
      + + + + + + + + +
      '.$mod_strings["LBL_DELETE_PROFILE"].''.$app_strings[
      + + + + +
      + + + + + + + + + +
      '.$mod_strings["LBL_PROFILE_TO_BE_DELETED"].''.htmlentities($delete_prof_name,ENT_QUOTES,$default_charset).'
      '.$mod_strings["LBL_TRANSFER_ROLES_TO_PROFILE"].''; + $output.=''; + + $output.='
      +
      + + + + +
      + +
      +
      '; + +echo $output; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/RecalculateSharingRules.php b/oss/vtiger/trunk/modules/Users/RecalculateSharingRules.php new file mode 100644 index 00000000..bbf2ea7e --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/RecalculateSharingRules.php @@ -0,0 +1,18 @@ + diff --git a/oss/vtiger/trunk/modules/Users/RenameProfile.php b/oss/vtiger/trunk/modules/Users/RenameProfile.php new file mode 100644 index 00000000..3f18c6f1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/RenameProfile.php @@ -0,0 +1,25 @@ +pquery($query, array($profilename, $profileDesc, $profileid)); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/RoleDragDrop.php b/oss/vtiger/trunk/modules/Users/RoleDragDrop.php new file mode 100644 index 00000000..ec6f96d9 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/RoleDragDrop.php @@ -0,0 +1,64 @@ +pquery($query, array($toid)); +$parentRoleList=$adb->query_result($result,0,'parentrole'); +$replace_with=$parentRoleList; +$orgDepth=$adb->query_result($result,0,'depth'); + +//echo 'replace with is '.$replace_with; +//echo '
      org depth '.$orgDepth; +$parentRoles=explode('::',$parentRoleList); + +if(in_array($fromid,$parentRoles)) +{ + echo $mod_strings['ROLE_DRAG_ERR_MSG']; + die; +} + + +$roleInfo=getRoleAndSubordinatesInformation($fromid); + +$fromRoleInfo=$roleInfo[$fromid]; +$replaceToStringArr=explode('::'.$fromid,$fromRoleInfo[1]); +$replaceToString=$replaceToStringArr[0]; +//echo '
      to be replaced string '.$replaceToString; + + +$stdDepth=$fromRoleInfo['2']; +//echo '
      std depth '.$stdDepth; + +//Constructing the query +foreach($roleInfo as $mvRoleId=>$mvRoleInfo) +{ + $subPar=explode($replaceToString,$mvRoleInfo[1],2);//we have to spilit as two elements only + $mvParString=$replace_with.$subPar[1]; + $subDepth=$mvRoleInfo[2]; + $mvDepth=$orgDepth+(($subDepth-$stdDepth)+1); + $query="update vtiger_role set parentrole=?,depth=? where roleid=?"; + //echo $query; + $adb->pquery($query, array($mvParString, $mvDepth, $mvRoleId)); + + // Invalidate any cached information + VTCacheUtils::clearRoleSubordinates($roleId); +} + + + +header("Location: index.php?action=SettingsAjax&module=Settings&file=listroles&ajax=true"); +?> diff --git a/oss/vtiger/trunk/modules/Users/RolePopup.php b/oss/vtiger/trunk/modules/Users/RolePopup.php new file mode 100644 index 00000000..3ccb432f --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/RolePopup.php @@ -0,0 +1,160 @@ +pquery($hquery, array()); +$num_rows = $adb->num_rows($hr_res); +$hrarray= Array(); + +for($l=0; $l<$num_rows; $l++) +{ + $roleid = $adb->query_result($hr_res,$l,'roleid'); + $parent = $adb->query_result($hr_res,$l,'parentrole'); + $temp_list = explode('::',$parent); + $size = sizeof($temp_list); + $i=0; + $k= Array(); + $y=$hrarray; + if(sizeof($hrarray) == 0) + { + $hrarray[$temp_list[0]]= Array(); + } + else + { + while($i<$size-1) + { + $y=$y[$temp_list[$i]]; + $k[$temp_list[$i]] = $y; + $i++; + + } + $y[$roleid] = Array(); + $k[$roleid] = Array(); + + //Reversing the Array + $rev_temp_list=array_reverse($temp_list); + $j=0; + //Now adding this into the main array + foreach($rev_temp_list as $value) + { + if($j == $size-1) + { + $hrarray[$value]=$k[$value]; + } + else + { + $k[$rev_temp_list[$j+1]][$value]=$k[$value]; + } + $j++; + } + } + +} +//Constructing the Roledetails array +$role_det = getAllRoleDetails(); +$query = "select * from vtiger_role"; +$result = $adb->pquery($query, array()); +$num_rows=$adb->num_rows($result); +$mask_roleid=Array(); +$del_roleid=$_REQUEST['maskid']; +if($del_roleid != '' && strlen($del_roleid) >0) +{ + $mask_roleid= getRoleAndSubordinatesRoleIds($del_roleid); +} +$roleout =''; +$roleout .= indent($hrarray,$roleout,$role_det,$mask_roleid); + +/** recursive function to construct the role tree ui + * @param $hrarray -- Hierarchial role tree array with only the roleid:: Type array + * @param $roleout -- html string ouput of the constucted role tree ui:: Type varchar + * @param $role_det -- Roledetails array got from calling getAllRoleDetails():: Type array + * @param $mask_roleid -- role id to be masked from selecting in the tree:: Type integer + * @returns $role_out -- html string ouput of the constucted role tree ui:: Type string + * + */ +function indent($hrarray,$roleout,$role_det,$mask_roleid='') +{ + global $theme,$app_strings,$default_charset; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + foreach($hrarray as $roleid => $value) + { + + //retreiving the vtiger_role details + $role_det_arr=$role_det[$roleid]; + $roleid_arr=$role_det_arr[2]; + $rolename = htmlentities($role_det_arr[0],ENT_QUOTES,$default_charset); + $roledepth = $role_det_arr[1]; + $roleout .= '
        '; + $roleout .= '
      • '; + if(sizeof($value) >0 && $roledepth != 0) + { + $roleout .= ''.$app_strings['LBL_EXPAND_COLLAPSE'].''; + } + else if($roledepth != 0){ + $roleout .= ''.$app_strings['LBL_EXPAND_COLLAPSE'].''; + } + else + { + $roleout .= ''.$app_strings['LBL_ROOT'].''; + } + if($roledepth == 0 || in_array($roleid,$mask_roleid)) + { + $roleout .= ' '.$rolename.''; + } + else + { + $type =$_REQUEST['type']; + if($type == '') + { + $roleout .= ' '.$rolename.''; + } + else + { + $picklist_module = vtlib_purify($_REQUEST['picklistmodule']); + $picklist_fieldname = vtlib_purify($_REQUEST['pick_fieldname']); + $picklist_uitype = vtlib_purify($_REQUEST['pick_uitype']); + + $roleout .= ' '.$rolename.''; + } + } + $roleout .= '
      • '; + if(sizeof($value) > 0 ) + { + $roleout = indent($value,$roleout,$role_det,$mask_roleid); + } + + $roleout .= '
      '; + + } + + return $roleout; +} +$smarty->assign("THEME",$theme_path); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("ROLETREE", $roleout); +$smarty->display("RolePopup.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/Save.php b/oss/vtiger/trunk/modules/Users/Save.php new file mode 100644 index 00000000..fec64d23 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Save.php @@ -0,0 +1,221 @@ +pquery($user_query, array($user_name)); + $group_query = "SELECT groupname FROM vtiger_groups WHERE groupname =?"; + $group_result = $adb->pquery($group_query, array($user_name)); + + if($adb->num_rows($user_result) > 0) { + echo $mod_strings['LBL_USERNAME_EXIST']; + die; + } elseif($adb->num_rows($group_result) > 0) { + echo $mod_strings['LBL_GROUPNAME_EXIST']; + die; + } else { + echo 'SUCCESS'; + die; + } +} + +if (isset($_POST['record']) && !is_admin($current_user) && $_POST['record'] != $current_user->id) echo ("Unauthorized access to user administration."); +elseif (!isset($_POST['record']) && !is_admin($current_user)) echo ("Unauthorized access to user administration."); + +$focus = new Users(); +if(isset($_REQUEST["record"]) && $_REQUEST["record"] != '') +{ + $focus->mode='edit'; + $focus->id = $_REQUEST["record"]; +} +else +{ + $focus->mode=''; +} + + +if($_REQUEST['changepassword'] == 'true') +{ + $focus->retrieve_entity_info($_REQUEST['record'],'Users'); + $focus->id = $_REQUEST['record']; +if (isset($_POST['new_password'])) { + $new_pass = $_POST['new_password']; + $new_passwd = $_POST['new_password']; + $new_pass = md5($new_pass); + $old_pass = $_POST['old_password']; + $uname = $_POST['user_name']; + if (!$focus->change_password($_POST['old_password'], $_POST['new_password'])) { + + header("Location: index.php?action=Error&module=Users&error_string=".urlencode($focus->error_string)); + exit; +} +} + +} + + +//save user Image +if(! $_REQUEST['changepassword'] == 'true') +{ + if(strtolower($current_user->is_admin) == 'off' && $current_user->id != $focus->id) + { + $log->fatal("SECURITY:Non-Admin ". $current_user->id . " attempted to change settings for user:". $focus->id); + header("Location: index.php?module=Users&action=Logout"); + exit; + } + if(strtolower($current_user->is_admin) == 'off' && isset($_POST['is_admin']) && strtolower($_POST['is_admin']) == 'on') + { + $log->fatal("SECURITY:Non-Admin ". $current_user->id . " attempted to change is_admin settings for user:". $focus->id); + header("Location: index.php?module=Users&action=Logout"); + exit; + } + + if (!isset($_POST['is_admin'])) $_REQUEST["is_admin"] = 'off'; + //Code contributed by mike crowe for rearrange the home page and tab + if (!isset($_POST['deleted'])) $_REQUEST["deleted"] = '0'; + if (!isset($_POST['homeorder']) || $_POST['homeorder'] == "" ) $_REQUEST["homeorder"] = 'ILTI,QLTQ,ALVT,PLVT,CVLVT,HLT,OLV,GRT,OLTSO'; + if(isset($_REQUEST['internal_mailer']) && $_REQUEST['internal_mailer'] == 'on') + $focus->column_fields['internal_mailer'] = 1; + else + $focus->column_fields['internal_mailer'] = 0; + if(isset($_SESSION['internal_mailer']) && $_SESSION['internal_mailer'] != $focus->column_fields['internal_mailer']) + $_SESSION['internal_mailer'] = $focus->column_fields['internal_mailer']; + setObjectValuesFromRequest($focus); + + // Added for Reminder Popup support + $query_prev_interval = $adb->pquery("SELECT reminder_interval from vtiger_users where id=?",array($focus->id)); + $prev_reminder_interval = $adb->query_result($query_prev_interval,0,'reminder_interval'); + + $focus->saveentity("Users"); + //$focus->imagename = $image_upload_array['imagename']; + $focus->saveHomeStuffOrder($focus->id); + SaveTagCloudView($focus->id); + + // Added for Reminder Popup support + $focus->resetReminderInterval($prev_reminder_interval); + + $return_id = $focus->id; + +if (isset($_POST['user_name']) && isset($_POST['new_password'])) { + $new_pass = $_POST['new_password']; + $new_passwd = $_POST['new_password']; + $new_pass = md5($new_pass); + $uname = $_POST['user_name']; + if (!$focus->change_password($_POST['confirm_new_password'], $_POST['new_password'])) { + + header("Location: index.php?action=Error&module=Users&error_string=".urlencode($focus->error_string)); + exit; +} +} + +if(isset($focus->id) && $focus->id != '') +{ + + if(isset($_POST['user_role'])) + { + updateUser2RoleMapping($_POST['user_role'],$focus->id); + } + if(isset($_POST['group_name']) && $_POST['group_name'] != '') + { + updateUsers2GroupMapping($_POST['group_name'],$focus->id); + } +} +else +{ + if(isset($_POST['user_role'])) + { + insertUser2RoleMapping($_POST['user_role'],$focus->id); + } + if(isset($_POST['group_name'])) + { + insertUsers2GroupMapping($_POST['group_name'],$focus->id); + } +} + +//Creating the Privileges Flat File +require_once('modules/Users/CreateUserPrivilegeFile.php'); +createUserPrivilegesfile($focus->id); +createUserSharingPrivilegesfile($focus->id); + +} +if(isset($_POST['return_module']) && $_POST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "Users"; +if(isset($_POST['return_action']) && $_POST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_POST['return_id']) && $_POST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); +if(isset($_REQUEST['activity_mode'])) $activitymode = '&activity_mode='.vtlib_purify($_REQUEST['activity_mode']); +if(isset($_POST['parenttab'])) $parenttab = getParentTab(); + +$log->debug("Saved record with id of ".$return_id); + +//Asha: Added Check to see if the mode is User Creation and if yes, then sending the email notification to the User with Login details. +if($_REQUEST['mode'] == 'create') { + global $app_strings, $mod_strings, $default_charset; + require_once('modules/Emails/mail.php'); + $user_emailid = $focus->column_fields['email1']; + + $subject = $mod_strings['User Login Details']; + $email_body = $app_strings['MSG_DEAR']." ". $focus->column_fields['last_name'] .",

      "; + $email_body .= $app_strings['LBL_PLEASE_CLICK'] . " " + . $app_strings['LBL_HERE'] . " " . $mod_strings['LBL_TO_LOGIN'] . "

      "; + $email_body .= $mod_strings['LBL_USER_NAME'] . " : " . $focus->column_fields['user_name'] . "
      "; + $email_body .= $mod_strings['LBL_PASSWORD'] . " : " . $focus->column_fields['user_password'] . "
      "; + $email_body .= $mod_strings['LBL_ROLE_NAME'] . " : " . getRoleName($_POST['user_role']) . "
      "; + + $email_body .= "
      " . $app_strings['MSG_THANKS'] . "
      " . $current_user->user_name; + $email_body = htmlentities($email_body, ENT_QUOTES, $default_charset); + + $mail_status = send_mail('Users',$user_emailid,$HELPDESK_SUPPORT_NAME,$HELPDESK_SUPPORT_EMAIL_ID,$subject,$email_body); + + if($mail_status != 1) { + $mail_status_str = $user_emailid."=".$mail_status."&&&"; + $error_str = getMailErrorString($mail_status_str); + } +} +$location = "Location: index.php?action=".vtlib_purify($return_action)."&module=".vtlib_purify($return_module)."&record=".vtlib_purify($return_id); + +if($_REQUEST['modechk'] != 'prefview') { + $location .= "&parenttab=".vtlib_purify($parenttab); +} + +if ($error_str != '') { + $user = $focus->column_fields['user_name']; + $location .= "&user=$user&$error_str"; +} + +header($location); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/SaveDefModuleView.php b/oss/vtiger/trunk/modules/Users/SaveDefModuleView.php new file mode 100644 index 00000000..877f48fc --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/SaveDefModuleView.php @@ -0,0 +1,45 @@ + + diff --git a/oss/vtiger/trunk/modules/Users/SaveGroup.php b/oss/vtiger/trunk/modules/Users/SaveGroup.php new file mode 100644 index 00000000..48cc3435 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/SaveGroup.php @@ -0,0 +1,126 @@ +pquery($query, $params); + + $user_query = "SELECT user_name FROM vtiger_users WHERE user_name =?"; + $user_result = $adb->pquery($user_query, array($groupName)); + + if($adb->num_rows($result) > 0) { + echo $mod_strings['LBL_GROUPNAME_EXIST']; + die; + } elseif($adb->num_rows($user_result) > 0) { + echo $mod_strings['LBL_USERNAME_EXIST']; + die; + } else { + echo 'SUCCESS'; + die; + } +} + + +/** returns the group members in an formatted array + * @param $member_array -- member_array:: Type varchar + * @returns $groupMemberArray:: Type varchar + + $groupMemberArray['groups'] -- gives the array of sub groups members ; + $groupMemberArray['roles'] -- gives the array of roles present in the group ; + $groupMemberArray['rs'] -- gives the array of roles & subordinates present in the group ; + $groupMemberArray['users'] -- gives the array of roles & subordinates present in the group; + * + */ +function constructGroupMemberArray($member_array) +{ + global $adb; + + $groupMemberArray=Array(); + $roleArray=Array(); + $roleSubordinateArray=Array(); + $groupArray=Array(); + $userArray=Array(); + + foreach($member_array as $member) + { + $memSubArray=explode('::',$member); + if($memSubArray[0] == 'groups') + { + $groupArray[]=$memSubArray[1]; + } + if($memSubArray[0] == 'roles') + { + $roleArray[]=$memSubArray[1]; + } + if($memSubArray[0] == 'rs') + { + $roleSubordinateArray[]=$memSubArray[1]; + } + if($memSubArray[0] == 'users') + { + $userArray[]=$memSubArray[1]; + } + } + + $groupMemberArray['groups']=$groupArray; + $groupMemberArray['roles']=$roleArray; + $groupMemberArray['rs']=$roleSubordinateArray; + $groupMemberArray['users']=$userArray; + + return $groupMemberArray; + +} + + if(isset($_REQUEST['returnaction']) && $_REQUEST['returnaction'] != '') + { + $returnaction=$_REQUEST['returnaction'].'&roleid='.$_REQUEST['roleid']; + } + else + { + $returnaction='GroupDetailView'; + } + + //Inserting values into Role Table + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] == 'edit') + { + $groupId = $_REQUEST['groupId']; + $selected_col_string = $_REQUEST['selectedColumnsString']; + $member_array = explode(';',$selected_col_string); + $groupMemberArray=constructGroupMemberArray($member_array); + updateGroup($groupId,$groupName,$groupMemberArray,$description); + + $loc = "Location: index.php?action=".vtlib_purify($returnaction)."&module=Settings&parenttab=Settings&groupId=".vtlib_purify($groupId); + } + elseif(isset($_REQUEST['mode']) && $_REQUEST['mode'] == 'create') + { + $selected_col_string = $_REQUEST['selectedColumnsString']; + $member_array = explode(';',$selected_col_string); + $groupMemberArray=constructGroupMemberArray($member_array); + $groupId=createGroup($groupName,$groupMemberArray,$description); + $loc = "Location: index.php?action=".vtlib_purify($returnaction)."&parenttab=Settings&module=Settings&groupId=".vtlib_purify($groupId); + + } + + header($loc); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/SaveMailAccount.php b/oss/vtiger/trunk/modules/Users/SaveMailAccount.php new file mode 100644 index 00000000..1dd4cf70 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/SaveMailAccount.php @@ -0,0 +1,58 @@ +id; +$email=$_REQUEST['email']; +$account_name=$_REQUEST['account_name']; +$mailprotocol=$_REQUEST['mailprotocol']; +$server_username = $_REQUEST['server_username']; +$server_password = $_REQUEST['server_password']; +$mail_servername = $_REQUEST['mail_servername']; +$box_refresh = $_REQUEST['box_refresh']; +$mails_per_page = $_REQUEST['mails_per_page']; +$ssltype = $_REQUEST["ssltype"]; +$sslmeth = $_REQUEST["sslmeth"]; + +if($mails_per_page == '') $mails_per_page='0'; + +if(isset($_REQUEST['record']) && $_REQUEST['record']!='') { + $id=$_REQUEST['record']; +} + +$focus = new Users(); +$encrypted_password=$focus->changepassword($_REQUEST['server_password']); +if(isset($_REQUEST['edit']) && $_REQUEST['edit'] && $_REQUEST['record']!='') { + $sql="update vtiger_mail_accounts set display_name = ?, mail_id = ?, account_name = ?, mail_protocol = ?, mail_username = ?"; + $params = array($displayname, $email, $account_name, $mailprotocol, $server_username); + if($server_password != '*****') { + $sql.=", mail_password=?"; + array_push($params, $encrypted_password); + } + $sql.=", mail_servername=?, box_refresh=?, mails_per_page=?, ssltype=? , sslmeth=?, int_mailer=? where user_id = ?"; + array_push($params, $mail_servername, $box_refresh, $mails_per_page, $ssltype, $sslmeth, $_REQUEST["int_mailer"], $id); +} else { + $account_id = $adb->getUniqueID("vtiger_mail_accounts"); + $sql="insert into vtiger_mail_accounts(account_id, user_id, display_name, mail_id, account_name, mail_protocol, mail_username, mail_password, mail_servername, box_refresh, mails_per_page, ssltype, sslmeth, int_mailer, status, set_default) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + $params = array($account_id, $current_user->id, $displayname, $email, $account_name, $mailprotocol, $server_username, $encrypted_password, $mail_servername, $box_refresh, $mails_per_page, $ssltype, $sslmeth, $_REQUEST["int_mailer"],'1','0'); +} + +$adb->pquery($sql, $params); + +$return_module = vtlib_purify($_REQUEST['return_module']); +if(empty($return_module)) $return_module = 'Webmails'; + +$return_action = vtlib_purify($_REQUEST['return_action']); +if(empty($return_action)) $return_action = 'index'; + +header("Location:index.php?module=$return_module&action=$return_action&mailbox=INBOX&parenttab=My Home Page"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/SaveOrgSharing.php b/oss/vtiger/trunk/modules/Users/SaveOrgSharing.php new file mode 100644 index 00000000..4966a121 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/SaveOrgSharing.php @@ -0,0 +1,38 @@ +pquery($sql2, array()); +$num_rows = $adb->num_rows($result2); + +for($i=0; $i<$num_rows; $i++) { + $ruleid=$adb->query_result($result2,$i,'ruleid'); + $tabid=$adb->query_result($result2,$i,'tabid'); + $reqval = $tabid.'_per'; + $permission=$_REQUEST[$reqval]; + $sql7="update vtiger_def_org_share set permission=? where tabid=? and ruleid=?"; + $adb->pquery($sql7, array($permission, $tabid, $ruleid)); + + if($tabid == 6) { + $sql8="update vtiger_def_org_share set permission=? where tabid=4"; + $adb->pquery($sql8, array($permission)); + } + + if($tabid == 9) { + $sql8="update vtiger_def_org_share set permission=? where tabid=16"; + $adb->pquery($sql8, array($permission)); + } +} +$loc = "Location: index.php?action=OrgSharingDetailView&module=Settings&parenttab=Settings"; +header($loc); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/SaveProfile.php b/oss/vtiger/trunk/modules/Users/SaveProfile.php new file mode 100644 index 00000000..5e0f131e --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/SaveProfile.php @@ -0,0 +1,212 @@ +getUniqueID("vtiger_profile"); +//Inserting values into Profile Table +$sql1 = "insert into vtiger_profile(profileid, profilename, description) values(?,?,?)"; +$adb->pquery($sql1, array($profile_id,$profilename, $description)); + + //Retreiving the vtiger_profileid + $sql2 = "select max(profileid) as current_id from vtiger_profile"; + $result2 = $adb->pquery($sql2, array()); + $profileid = $adb->query_result($result2,0,'current_id'); + + + //Retreiving the vtiger_tabs permission array + // + + //Retreiving the first profileid + $prof_query="select profileid from vtiger_profile order by profileid ASC"; + $prof_result = $adb->pquery($prof_query, array()); + $first_prof_id = $adb->query_result($prof_result,0,'profileid'); + +$tab_perr_result = $adb->pquery("select * from vtiger_profile2tab where profileid=?", array($first_prof_id)); +$act_perr_result = $adb->pquery("select * from vtiger_profile2standardpermissions where profileid=?", array($first_prof_id)); +$act_utility_result = $adb->pquery("select * from vtiger_profile2utility where profileid=?", array($first_prof_id)); +$num_tab_per = $adb->num_rows($tab_perr_result); +$num_act_per = $adb->num_rows($act_perr_result); +$num_act_util_per = $adb->num_rows($act_utility_result); + + //Updating vtiger_profile2global permissons vtiger_table + $view_all_req=$_REQUEST['view_all']; + $view_all = getPermissionValue($view_all_req); + + $edit_all_req=$_REQUEST['edit_all']; + $edit_all = getPermissionValue($edit_all_req); + + + $sql4="insert into vtiger_profile2globalpermissions values(?,?,?)"; + $adb->pquery($sql4, array($profileid,1, $view_all)); + + $sql4="insert into vtiger_profile2globalpermissions values(?,?,?)"; + $adb->pquery($sql4, array($profileid,2, $edit_all)); + + + //profile2tab permissions + for($i=0; $i<$num_tab_per; $i++) + { + $tab_id = $adb->query_result($tab_perr_result,$i,"tabid"); + $request_var = $tab_id.'_tab'; + if($tab_id != 3 && $tab_id != 16) + { + $permission = $_REQUEST[$request_var]; + if($permission == 'on') + { + $permission_value = 0; + } + else + { + $permission_value = 1; + } + $sql4="insert into vtiger_profile2tab values(?,?,?)"; + $adb->pquery($sql4, array($profileid, $tab_id, $permission_value)); + + if($tab_id ==9) + { + $sql4="insert into vtiger_profile2tab values(?,?,?)"; + $adb->pquery($sql4, array($profileid,16, $permission_value)); + } + } + } + + //profile2standard permissions + for($i=0; $i<$num_act_per; $i++) + { + $tab_id = $adb->query_result($act_perr_result,$i,"tabid"); + $action_id = $adb->query_result($act_perr_result,$i,"operation"); + if($tab_id != 16) + { + $action_name = getActionname($action_id); + if($action_name == 'EditView' || $action_name == 'Delete' || $action_name == 'DetailView') + { + $request_var = $tab_id.'_'.$action_name; + } + elseif($action_name == 'Save') + { + $request_var = $tab_id.'_EditView'; + } + elseif($action_name == 'index') + { + $request_var = $tab_id.'_DetailView'; + } + + $permission = $_REQUEST[$request_var]; + if($permission == 'on') + { + $permission_value = 0; + } + else + { + $permission_value = 1; + } + + $sql7="insert into vtiger_profile2standardpermissions values(?,?,?,?)"; + $adb->pquery($sql7, array($profileid, $tab_id, $action_id, $permission_value)); + + if($tab_id ==9) + { + $sql7="insert into vtiger_profile2standardpermissions values(?,?,?,?)"; + $adb->pquery($sql7, array($profileid, 16, $action_id, $permission_value)); + } + } + } + + //Update Profile 2 utility + for($i=0; $i<$num_act_util_per; $i++) + { + $tab_id = $adb->query_result($act_utility_result,$i,"tabid"); + + $action_id = $adb->query_result($act_utility_result,$i,"activityid"); + $action_name = getActionname($action_id); + $request_var = $tab_id.'_'.$action_name; + + + $permission = $_REQUEST[$request_var]; + if($permission == 'on') + { + $permission_value = 0; + } + else + { + $permission_value = 1; + } + + $sql9="insert into vtiger_profile2utility values(?,?,?,?)"; + $adb->pquery($sql9, array($profileid, $tab_id, $action_id, $permission_value)); + + } + + + + $modArr=getFieldModuleAccessArray(); + + +foreach($modArr as $fld_module => $fld_label) +{ + $fieldListResult = getProfile2FieldList($fld_module, $first_prof_id); + $noofrows = $adb->num_rows($fieldListResult); + $tab_id = getTabid($fld_module); + for($i=0; $i<$noofrows; $i++) + { + $fieldid = $adb->query_result($fieldListResult,$i,"fieldid"); + $visible = $_REQUEST[$fieldid]; + if($visible == 'on') + { + $visible_value = 0; + } + else + { + $visible_value = 1; + } + //Updating the Mandatory vtiger_fields + $uitype = $adb->query_result($fieldListResult,$i,"uitype"); + $displaytype = $adb->query_result($fieldListResult,$i,"displaytype"); + $fieldname = $adb->query_result($fieldListResult,$i,"fieldname"); + $typeofdata = $adb->query_result($fieldListResult,$i,"typeofdata"); + $fieldtype = explode("~",$typeofdata); + if($fieldtype[1] == 'M') + { + $visible_value = 0; + } + //Updating the database + $sql11="insert into vtiger_profile2field values(?,?,?,?,?)"; + $adb->pquery($sql11, array($profileid, $tab_id, $fieldid, $visible_value,1)); + } +} + $loc = "Location: index.php?action=ListProfiles&module=Settings&mode=view&parenttab=Settings&profileid=".vtlib_purify($profileid)."&selected_tab=".vtlib_purify($def_tab)."&selected_module=".vtlib_purify($def_module); + header($loc); + + +/** returns value 0 if request permission is on else returns value 1 + * @param $req_per -- Request Permission:: Type varchar + * @returns $permission - can have value 0 or 1:: Type integer + * + */ +function getPermissionValue($req_per) +{ + if($req_per == 'on') + { + $permission_value = 0; + } + else + { + $permission_value = 1; + } + return $permission_value; +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/ShowHistory.html b/oss/vtiger/trunk/modules/Users/ShowHistory.html new file mode 100644 index 00000000..62568e4e --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/ShowHistory.html @@ -0,0 +1,53 @@ + + + + + + + + + +

      + + {MOD.LBL_LOGIN_HISTORY_BUTTON_LABEL} +

      + + +
      {START_LINK}  {PREVIOUS_LINK}   + {NEXT_LINK}  {END_LINK}   {START_RECORD} - {END_RECORD} {APP.LBL_LIST_OF} {ROW_COUNT}  
      + + + + + + + + + + + + + + + + + + + + +
       {APP.LBL_LIST_USER_NAME}{user_name_arrow} {APP.LBL_LIST_USERIP}{user_ip_arrow} {APP.LBL_LIST_SIGNIN}{login_time_arrow} {APP.LBL_LIST_SIGNOUT}{logout_time_arrow} {APP.LBL_LIST_STATUS}
      {LOGIN.USER_NAME}{LOGIN.USER_IP}{LOGIN.LOGIN_TIME}{LOGIN.LOGOUT_TIME}{LOGIN.STATUS}
      + +
      +
      + + diff --git a/oss/vtiger/trunk/modules/Users/ShowHistory.php b/oss/vtiger/trunk/modules/Users/ShowHistory.php new file mode 100644 index 00000000..a3524a53 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/ShowHistory.php @@ -0,0 +1,74 @@ +pquery($qry, array($username)); +$no_of_rows = $adb->num_rows($qry_result); + +//Retreiving the start value from request +if(isset($_REQUEST['start']) && $_REQUEST['start'] != '') { + $start = vtlib_purify($_REQUEST['start']); +} else { + $start=1; +} + +//Retreive the Navigation array +$navigation_array = getNavigationValues($start, $no_of_rows, '10'); + +$start_rec = $navigation_array['start']; +$end_rec = $navigation_array['end_val']; +$record_string= $app_strings[LBL_SHOWING]." " .$start_rec." - ".$end_rec." " .$app_strings[LBL_LIST_OF] ." ".$no_of_rows; + +$navigationOutput = getTableHeaderNavigation($navigation_array, $url_string,"Users","ShowHistory",''); + +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MOD", return_module_language($current_language, "Settings")); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("LIST_HEADER",$focus->getHistoryListViewHeader()); +$smarty->assign("LIST_ENTRIES",$focus->getHistoryListViewEntries($username, $navigation_array, $sorder, $sortby)); +$smarty->assign("RECORD_COUNTS", $record_string); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("CATEGORY",$category); + +$smarty->display("ShowHistoryContents.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/TemplateMerge.php b/oss/vtiger/trunk/modules/Users/TemplateMerge.php new file mode 100644 index 00000000..5d9363eb --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/TemplateMerge.php @@ -0,0 +1,30 @@ + +
      + + +
      + diff --git a/oss/vtiger/trunk/modules/Users/UpdateProfileChanges.php b/oss/vtiger/trunk/modules/Users/UpdateProfileChanges.php new file mode 100644 index 00000000..e7b15923 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/UpdateProfileChanges.php @@ -0,0 +1,204 @@ +pquery("select * from vtiger_profile2tab where profileid=?", array($profileid)); +$act_perr_result = $adb->pquery("select * from vtiger_profile2standardpermissions where profileid=?", array($profileid)); +$act_utility_result = $adb->pquery("select * from vtiger_profile2utility where profileid=?", array($profileid)); +$num_tab_per = $adb->num_rows($tab_perr_result); +$num_act_per = $adb->num_rows($act_perr_result); +$num_act_util_per = $adb->num_rows($act_utility_result); + + //Updating vtiger_profile2global permissons vtiger_table + $view_all_req=$_REQUEST['view_all']; + $view_all = getPermissionValue($view_all_req); + + $edit_all_req=$_REQUEST['edit_all']; + $edit_all = getPermissionValue($edit_all_req); + + $update_query = "update vtiger_profile2globalpermissions set globalactionpermission=? where globalactionid=1 and profileid=?"; + $adb->pquery($update_query, array($view_all, $profileid)); + $update_query = "update vtiger_profile2globalpermissions set globalactionpermission=? where globalactionid=2 and profileid=?"; + $adb->pquery($update_query, array($edit_all, $profileid)); + + + //profile2tab permissions + for($i=0; $i<$num_tab_per; $i++) + { + $tab_id = $adb->query_result($tab_perr_result,$i,"tabid"); + $request_var = $tab_id.'_tab'; + if($tab_id != 3 && $tab_id != 16) + { + $permission = $_REQUEST[$request_var]; + if($permission == 'on') + { + $permission_value = 0; + } + else + { + $permission_value = 1; + } + $update_query = "update vtiger_profile2tab set permissions=? where tabid=? and profileid=?"; + $adb->pquery($update_query, array($permission_value, $tab_id, $profileid)); + if($tab_id ==9) + { + $update_query = "update vtiger_profile2tab set permissions=? where tabid=16 and profileid=?"; + $adb->pquery($update_query, array($permission_value, $profileid)); + } + } + } + + //profile2standard permissions + for($i=0; $i<$num_act_per; $i++) + { + $tab_id = $adb->query_result($act_perr_result,$i,"tabid"); + if($tab_id != 16) + { + $action_id = $adb->query_result($act_perr_result,$i,"operation"); + $action_name = getActionname($action_id); + if($action_name == 'EditView' || $action_name == 'Delete' || $action_name == 'DetailView') + { + $request_var = $tab_id.'_'.$action_name; + } + elseif($action_name == 'Save') + { + $request_var = $tab_id.'_EditView'; + } + elseif($action_name == 'index') + { + $request_var = $tab_id.'_DetailView'; + } + + $permission = $_REQUEST[$request_var]; + if($permission == 'on') + { + $permission_value = 0; + } + else + { + $permission_value = 1; + } + $update_query = "update vtiger_profile2standardpermissions set permissions=? where tabid=? and Operation=? and profileid=?"; + $adb->pquery($update_query, array($permission_value, $tab_id, $action_id, $profileid)); + if($tab_id ==9) + { + $update_query = "update vtiger_profile2standardpermissions set permissions=? where tabid=16 and Operation=? and profileid=?"; + $adb->pquery($update_query, array($permission_value, $action_id, $profileid)); + } + + + + } + } + + //Update Profile 2 utility + for($i=0; $i<$num_act_util_per; $i++) + { + $tab_id = $adb->query_result($act_utility_result,$i,"tabid"); + + $action_id = $adb->query_result($act_utility_result,$i,"activityid"); + $action_name = getActionname($action_id); + $request_var = $tab_id.'_'.$action_name; + + + $permission = $_REQUEST[$request_var]; + if($permission == 'on') + { + $permission_value = 0; + } + else + { + $permission_value = 1; + } + + $update_query = "update vtiger_profile2utility set permission=? where tabid=? and activityid=? and profileid=?"; + $adb->pquery($update_query, array($permission_value, $tab_id, $action_id, $profileid)); + + + } + + + + $modArr=getFieldModuleAccessArray(); + +foreach($modArr as $fld_module => $fld_label) +{ + $fieldListResult = getProfile2FieldList($fld_module, $profileid); + $noofrows = $adb->num_rows($fieldListResult); + $tab_id = getTabid($fld_module); + for($i=0; $i<$noofrows; $i++) + { + $fieldid = $adb->query_result($fieldListResult,$i,"fieldid"); + $visible = $_REQUEST[$fieldid]; + if($visible == 'on') + { + $visible_value = 0; + } + else + { + $visible_value = 1; + } + //Updating the Mandatory vtiger_fields + $uitype = $adb->query_result($fieldListResult,$i,"uitype"); + $displaytype = $adb->query_result($fieldListResult,$i,"displaytype"); + $fieldname = $adb->query_result($fieldListResult,$i,"fieldname"); + $typeofdata = $adb->query_result($fieldListResult,$i,"typeofdata"); + $fieldtype = explode("~",$typeofdata); + if($fieldtype[1] == 'M') + { + $visible_value = 0; + } + //Updating the database + $update_query = "update vtiger_profile2field set visible=? where fieldid=? and profileid=? and tabid=?"; + $adb->pquery($update_query, array($visible_value, $fieldid, $profileid, $tab_id)); + + } +} + if($return_action == 'profilePrivileges' || $return_action == 'ListProfiles') + { + $loc = "Location: index.php?action=".$return_action."&module=Settings&mode=view&parenttab=Settings&profileid=".$profileid."&selected_tab=".$def_tab."&selected_module=".$def_module; + } + else + { + $loc = "Location: index.php?action=".$return_action."&module=Users&mode=view&parenttab=Settings&profileid=".$profileid."&selected_tab=".$def_tab."&selected_module=".$def_module; + } + header($loc); + + /** returns value 0 if request permission is on else returns value 1 + * @param $req_per -- Request Permission:: Type varchar + * @returns $permission - can have value 0 or 1:: Type integer + * + */ +function getPermissionValue($req_per) +{ + if($req_per == 'on') + { + $permission_value = 0; + } + else + { + $permission_value = 1; + } + return $permission_value; +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/UserDeleteStep1.php b/oss/vtiger/trunk/modules/Users/UserDeleteStep1.php new file mode 100644 index 00000000..bf1cf699 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/UserDeleteStep1.php @@ -0,0 +1,80 @@ + +
      + + + + + + + + +
      '.$mod_strings['LBL_DELETE'].' '.$mod_strings['LBL_USER'].''.$app_strings[
      + + + + +
      + + + + + + + + + + + +
      '.$mod_strings['LBL_DELETE_USER'].''.$delete_user_name.'
      '.$mod_strings['LBL_TRANSFER_USER'].''; + + $output.='
      +
      + + + + +
      +
      +
      '; + +echo $output; +?> diff --git a/oss/vtiger/trunk/modules/Users/UserGroups.php b/oss/vtiger/trunk/modules/Users/UserGroups.php new file mode 100644 index 00000000..676da8b6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/UserGroups.php @@ -0,0 +1,31 @@ +getAllUserGroups($user_id); +$user_group_info = Array(); +foreach($oGetUserGroups->user_groups as $groupid) +{ + $user_group_info[$groupid] = getGroupDetails($groupid); +} +$smarty->assign("IS_ADMIN",is_admin($current_user)); +$smarty->assign("GROUPLIST",$user_group_info); +$smarty->assign("UMOD", $mod_strings); +$smarty->display("UserGroups.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Users/Users.js b/oss/vtiger/trunk/modules/Users/Users.js new file mode 100644 index 00000000..8398d9ba --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/Users.js @@ -0,0 +1,320 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ + + + +document.write(" + + + + + + + + + + + + + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Akilan
      Anusha
      Asha
      Bharath
      Bharathi
      Dhananjay
      Dina
      Don
      Fenzik
      Gopal
      Jeri
      Kiran
      Mani
      Mickie
      Minnie
      Musavir
      Nitin
      Panchavarnam
      Pavani
      Philip
      Pinaki
      Prasad
      Preethi
      Puneeth
      Radiant
      Richie
      Sandeep
      Shahul
      Sidharth
      Sreenivas
      Srinivasan
      Tamilmani
      Vamsee
      Varma
      Vashni
       
      Aissa Belaid
      Allan Bush
      Brian Devendorf
      Brian Laughlin
      Davide Giarolo
      Dennis Grant
      Dhr. R.R. Gerbrands
      Dino Eberle
      Dirk Gorny
      Fathi Boudra
      Frank Piepiorra
      Jamie Jackson
      Jeff Kowalczyk
      Jens Gammelgaard
      Jens Hamisch
      Joao Oliveira
      Joel Rydbeck
      Josh Lee
      Ken Lyle
      Kim Haverblad
      Manilal K M
      Matjaz Slak
      Matthew Brichacek
      Michel Jacquemes
      Mike Crowe
      Mike Fedyk
      Neil
      Tim Smith
      Sergio A. Kessler
      Steve Fairchild
      Valmir Carlos Trindade
       
      -
      ADOdb
      Ajax Popup Chat
      Apache HTTP Server
      Attachments in E-mail Client
      Calculator
      Carousel Slideshow
      class_http
      ExcelReader
      FCKeditor
      FPDF
      freetag
      gdwin32
      Graph
      Image Crossfade Redux
      Image_Canvas
      Image_Color
      jscalendar
      log4php
      MagpieRSS
      Mailfeed
      MySQL
      nusoap
      NOCC
      PHP
      PHPMailer
      phpSysinfo
      Prototype
      script.oculo.us
      Smarty Template Engine
      SugarCRM (SPL 1.1.2)
      TCPDF
       
       
       
      +
      +
       
       
      + + + + + +
      +  |  +  |  +  |  + + + +
      +
      + + diff --git a/oss/vtiger/trunk/modules/Users/binaryfilelist.php b/oss/vtiger/trunk/modules/Users/binaryfilelist.php new file mode 100644 index 00000000..d3a957a8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/binaryfilelist.php @@ -0,0 +1,98 @@ +pquery($dbQuery, array()) or die("Couldn't get file list"); + +$list = ''; + +$list .= ''; +$list .=''; +$list .= ''; + +$list .= ''; + +$list .= ''; + +$list .= ''; + +$list .= ''; + +$list .= ''; + +$list .= ''; + +//$list .= ''; + +$i=1; +while($row = $adb->fetch_array($result)) +{ + + +if ($i%2==0) +$trowclass = 'evenListRow'; +else +$trowclass = 'oddListRow'; + $list .= ''; + + $list .= ''; + $list .= ''; + + $list .= ''; + + $list .= ''; +$i++; +} + + $list .= '
      '.$app_strings['LBL_OPERATION'].'
      '; +$list .= $app_strings['LBL_FILENAME'].''; +$list .= $mod_strings['LBL_MODULENAMES'].''; +$list .= $app_strings['LBL_UPD_DESC'].''; +$list .= $app_strings['LBL_TYPE'].''; +$list .= $app_strings['LBL_FILE'].'
      Del '; + + $list .= $row["filename"]; + + $list .= ''.$row["module"].''; + + $list .= $row["description"]; + + $list .= ''; + + $list .= $row["filetype"]; + + $list .= ''; + + $list .= ''; + + $list .= $app_strings['LBL_DOWNLOAD']; + + $list .= '
      '; + +return $list; +} +?> diff --git a/oss/vtiger/trunk/modules/Users/deletewordtemplate.php b/oss/vtiger/trunk/modules/Users/deletewordtemplate.php new file mode 100644 index 00000000..bf7aced2 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/deletewordtemplate.php @@ -0,0 +1,19 @@ +pquery($sql, array($id_array[$i])); +} +header("Location:index.php?module=Users&action=listwordtemplates&parenttab=Settings"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/downloadfile.php b/oss/vtiger/trunk/modules/Users/downloadfile.php new file mode 100644 index 00000000..222aa138 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/downloadfile.php @@ -0,0 +1,41 @@ +pquery($dbQuery, array($templateid)) or die("Couldn't get file list"); +if($adb->num_rows($result) == 1) +{ +$fileType = $adb->query_result($result, 0, "filetype"); +$name = $adb->query_result($result, 0, "filename"); +//echo 'filetype is ' .$fileType; +$fileContent = $adb->query_result($result, 0, "data"); +$size = $adb->query_result($result, 0, "filesize"); +$name = html_entity_decode($name, ENT_QUOTES, $default_charset); +header("Content-type: $fileType"); +//header("Content-length: $size"); +header("Cache-Control: private"); +header("Content-Disposition: attachment; filename=$name"); +header("Content-Description: PHP Generated Data"); +echo base64_decode($fileContent); +} +else +{ +echo "Record doesn't exist."; +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/getListOfRecords.php b/oss/vtiger/trunk/modules/Users/getListOfRecords.php new file mode 100644 index 00000000..f6db14a7 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/getListOfRecords.php @@ -0,0 +1,124 @@ +pquery("SELECT tablename,entityidfield, fieldname from vtiger_entityname WHERE modulename = ?",array($sModule)); +$table_name = $adb->query_result($query,0,'tablename'); +$field_name = $adb->query_result($query,0,'fieldname'); +$id_field = $adb->query_result($query,0,'entityidfield'); +$fieldname = split(",",$field_name); +$fields_array = array($sModule=>$fieldname); +$id_array = array($sModule=>$id_field); +$tables_array = array($sModule=>$table_name); + +$permittedFieldNameList = array(); +foreach ($fieldname as $fieldName) { + $checkForFieldAccess = $fieldName; + // Handling case where fieldname in vtiger_entityname mismatches fieldname in vtiger_field + if($sModule == 'HelpDesk' && $checkForFieldAccess == 'title') { + $checkForFieldAccess = 'ticket_title'; + } else if($sModule == 'Documents' && $checkForFieldAccess == 'title') { + $checkForFieldAccess = 'notes_title'; + } + // END + if(getFieldVisibilityPermission($sModule,$current_user->id, $checkForFieldAccess) == '0'){ + $permittedFieldNameList[] = $fieldName; + } +} + +$cv = new CustomView(); +$viewId = $cv->getViewId($sModule); +if(!empty($_SESSION[$sModule.'_DetailView_Navigation'.$viewId])){ + $recordNavigationInfo = Zend_Json::decode($_SESSION[$sModule.'_DetailView_Navigation'.$viewId]); + $recordList = array(); + $recordIndex = null; + $recordPageMapping = array(); + foreach ($recordNavigationInfo as $start=>$recordIdList){ + foreach ($recordIdList as $index=>$recordId) { + $recordList[] = $recordId; + $recordPageMapping[$recordId] = $start; + if($recordId == $iCurRecord){ + $recordIndex = count($recordList)-1; + } + } + } +}else{ + $recordList = array(); +} +$output = ' + + + +
      Jump to '.$app_strings[$sModule].':
      + +
      + +
      '; +$output .= '
      '; +$output .= ''; + +if(count($recordList) > 0){ + $displayRecordCount = 10; + $count = count($recordList); + $idListEndIndex = ($count < ($recordIndex+$displayRecordCount))? ($count+1) : ($recordIndex+$displayRecordCount+1); + $idListStartIndex = $recordIndex-$displayRecordCount; + if($idListStartIndex < 0){ + $idListStartIndex = 0; + } + $idsArray = array_slice($recordList,$idListStartIndex,($idListEndIndex - $idListStartIndex)); + + $selectColString = implode(',',$permittedFieldNameList).', '.$id_array[$sModule]; + $fieldQuery = "SELECT $selectColString from ".$tables_array[$sModule]." WHERE ".$id_array[$sModule]." IN (". generateQuestionMarks($idsArray) .")"; + + $fieldResult = $adb->pquery($fieldQuery,$idsArray); + $numOfRows = $adb->num_rows($fieldResult); + $recordNameMapping = array(); + for($i=0; $i<$numOfRows; ++$i) { + $recordId = $adb->query_result($fieldResult,$i,$id_array[$sModule]); + $fieldValue = ''; + foreach ($permittedFieldNameList as $fieldName) { + $fieldValue .= " ".$adb->query_result($fieldResult,$i,$fieldName); + } + $fieldValue = textlength_check($fieldValue); + $recordNameMapping[$recordId] = $fieldValue; + } + foreach ($idsArray as $id) { + if($id===$iCurRecord){ + $output .= ''; + }else{ + $output .= ''; + } + } +} +$output .= '
      '.$recordNameMapping[$id].'
      '.$recordNameMapping[$id].'
      '; +$output .= '
      '; + +echo $output; +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/language/en_us.lang.php b/oss/vtiger/trunk/modules/Users/language/en_us.lang.php new file mode 100644 index 00000000..ed6d0080 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/language/en_us.lang.php @@ -0,0 +1,682 @@ +'Users', +'LBL_MODULE_TITLE'=>'Users: Home', +'LBL_SEARCH_FORM_TITLE'=>'User Search', +'LBL_LIST_FORM_TITLE'=>'User List', +'LBL_NEW_FORM_TITLE'=>'New User', +'LBL_CREATE_NEW_USER'=>'Create New User', +'LBL_LOGIN'=>'Login', +'LBL_USER_ROLE'=>'Role', +'LBL_LIST_NAME'=>'Name', +'LBL_LIST_LAST_NAME'=>'Last Name', +'LBL_LIST_USER_NAME'=>'User Name', +'LBL_LIST_DEPARTMENT'=>'Department', +'LBL_LIST_EMAIL'=>'E-Mail', +'LBL_LIST_PRIMARY_PHONE'=>'Primary Phone', +'LBL_LIST_ADMIN'=>'Admin', +'LBL_LIST_CONFIRM_PASSWORD'=>'Confirm Password', +'LBL_LIST_USER_NAME_ROLE'=>'User ID , Name & Role', +'LBL_LIST_SELECT'=>'Select', +'LBL_LIST_PHONE'=>'Phone', +'LBL_LIST_NO'=>'#', + +'LBL_ADMINS'=>'Admins', +'LBL_STD_USERS'=>'Standard Users', + +'UserName'=>'UserName', +'Name'=>'Name', +'Tools'=>'Tools', + + +//added for patch2 +'LBL_GROUP'=>'Group', +'LBL_CURRENCY_NAME'=>'Currency', + +'LBL_NEW_USER_BUTTON_TITLE'=>'New User [Alt+N]', +'LBL_NEW_USER_BUTTON_LABEL'=>'New User', +'LBL_NEW_USER_BUTTON_KEY'=>'N', +'LBL_DATE_FORMAT'=>'Date Format', + +'LBL_ERROR'=>'Error:', +'LBL_PASSWORD'=>'Password', +'LBL_USER_NAME'=>'User Name', +'LBL_CRM_ID'=>'CRM ID', +'LBL_FIRST_NAME'=>'First Name', +'LBL_LAST_NAME'=>'Last Name', +'LBL_YAHOO_ID'=>'Yahoo ID', +'LBL_THEME'=>'Color Theme', +'LBL_LANGUAGE'=>'Language', +'LBL_ADMIN'=>'Admin', +'LBL_OFFICE_PHONE'=>'Office Phone', +'LBL_REPORTS_TO'=>'Reports to', +'LBL_OTHER_PHONE'=>'Other Phone', +'LBL_OTHER_EMAIL'=>'Other Email', +'LBL_DEPARTMENT'=>'Department', +'LBL_STATUS'=>'Status', +'LBL_TITLE'=>'Title', +'LBL_ANY_PHONE'=>'Any Phone:', +'LBL_ANY_EMAIL'=>'Any Email:', +'LBL_ADDRESS'=>'Street Address', +'LBL_CITY'=>'City', +'LBL_STATE'=>'State', +'LBL_POSTAL_CODE'=>'Postal Code', +'LBL_COUNTRY'=>'Country', +'LBL_USER_SETTINGS'=>'User Settings', +'LBL_USER_INFORMATION'=>'User Information', +'LBL_MOBILE_PHONE'=>'Mobile', +'LBL_OTHER'=>'Other', +'LBL_FAX'=>'Fax', +'LBL_EMAIL'=>'E-Mail Id', +'LBL_HOME_PHONE'=>'Home Phone', +'LBL_ADDRESS_INFORMATION'=>'User Address', +'LBL_CAL_HRFORMAT'=>'Calendar Time Format', +'LBL_CAL_DURATION'=>'Day starts at', +'LBL_PRIMARY_ADDRESS'=>'Primary Address:', + +'LBL_CHANGE_PASSWORD_BUTTON_TITLE'=>'Change Password [Alt+P]', +'LBL_CHANGE_PASSWORD_BUTTON_KEY'=>'P', +'LBL_CHANGE_PASSWORD_BUTTON_LABEL'=>'Change Password', +'LBL_LOGIN_BUTTON_TITLE'=>'Login [Alt+L]', +'LBL_LOGIN_BUTTON_KEY'=>'L', +'LBL_LOGIN_BUTTON_LABEL'=>'Login', +'LBL_LOGIN_HISTORY_BUTTON_TITLE'=>'Login History [Alt+H]', +'LBL_LOGIN_HISTORY_BUTTON_KEY'=>'H', +'LBL_LOGIN_HISTORY_BUTTON_LABEL'=>'Login History', +'LBL_LOGIN_HISTORY_TITLE'=>'Users: Login History', +'LBL_RESET_PREFERENCES'=>'Reset To Default Preferences', + +'LBL_CHANGE_PASSWORD'=>'Change Password', +'LBL_OLD_PASSWORD'=>'Old Password:', +'LBL_NEW_PASSWORD'=>'New Password:', +'LBL_CONFIRM_PASSWORD'=>'Confirm Password:', +'ERR_ENTER_OLD_PASSWORD'=>'Please enter your old password.', +'ERR_ENTER_NEW_PASSWORD'=>'Please enter your new password.', +'ERR_ENTER_CONFIRMATION_PASSWORD'=>'Please enter your password confirmation.', +'ERR_REENTER_PASSWORDS'=>'Please re-enter passwords. The \"new password\" and \"confirm password\" values do not match.', +'ERR_INVALID_PASSWORD'=>'You must specify a valid username and password.', +'ERR_PASSWORD_CHANGE_FAILED_1'=>'User password change failed for ', +'ERR_PASSWORD_CHANGE_FAILED_2'=>' failed. The new password must be set.', +'ERR_PASSWORD_INCORRECT_OLD'=>'Incorrect old password specified. Re-enter password information.', +'ERR_USER_NAME_EXISTS_1'=>'The user name ', +'ERR_USER_NAME_EXISTS_2'=>' already exists. Duplicate user names are not allowed.
      Change the user name to be unique.', +'ERR_LAST_ADMIN_1'=>'The user name ', +'ERR_LAST_ADMIN_2'=>' is the last Admin user. At least one user must be an Admin user.
      Check the Admin user setting.', + +'ERR_DELETE_RECORD'=>"A record number must be specified to delete the account.", + +// Additional Fields for i18n --- Release vtigerCRM 3.2 Patch 2 +// Users--listroles.php , createrole.php , ListPermissions.php , editpermissions.php + +'LBL_ROLES'=>'Roles', +'LBL_ROLES_SUBORDINATES'=>'Roles and Subordinates', + +'LBL_CREATE_NEW_ROLE'=>'Create New Role', +'LBL_INDICATES_REQUIRED_FIELD'=>'Indicates Required Field', +'LBL_NEW_ROLE'=>'New Role', +'LBL_PARENT_ROLE'=>'Parent Role', + +'LBL_LIST_ROLES'=>'List Roles', +'LBL_ENTITY_LEVEL_PERMISSIONS'=>'Entity Level Permissions', +'LBL_ENTITY'=>'Entity', +'LBL_CREATE_EDIT'=>'Create/Edit', +'LBL_DELETE'=>'Delete', +'LBL_LEADS'=>'Leads', +'LBL_ACCOUNTS'=>'Accounts', +'LBL_CONTACTS'=>'Contacts', +'LBL_OPPURTUNITIES'=>'Opportunities', +'LBL_TASKS'=>'Tasks', +'LBL_CASES'=>'Cases', +'LBL_EMAILS'=>'Email', +'LBL_NOTES'=>'Documents', +'LBL_MEETINGS'=>'Meetings', +'LBL_CALLS'=>'Calls', +'LBL_IMPORT_PERMISSIONS'=>'Import Permissions', +'LBL_IMPORT_LEADS'=>'Import Leads', +'LBL_IMPORT_ACCOUNTS'=>'Import Accounts', +'LBL_IMPORT_CONTACTS'=>'Import Contacts', +'LBL_IMPORT_OPPURTUNITIES'=>'Import Opportunities', + +'LBL_ROLE_DETAILS'=>'Role Details', +//added for vtigercrm4 rc +'LBL_FILE'=> 'File Name', +'LBL_FILE_TYPE'=>'File Type', +'LBL_UPLOAD'=>'Upload File', +'LBL_ATTACH_FILE'=>'Attach Mail Merge Template', +'LBL_EMAIL_TEMPLATES'=>'Email Templates', +'LBL_TEMPLATE_HEADER'=>'Template', +'LBL_TEMPLATE_DETAILS'=>'Template Details', +'LBL_EDIT_TEMPLATE'=>'Edit Template', +'LBL_TEMPLATE_FILE'=>'Template File', +'LBL_EMAIL_TEMPLATES_LIST'=>'Communication Templates > Email Templates', +'LBL_MAILMERGE_TEMPLATES_LIST'=>' > Communication Templates > Mail Merge Templates', +'LBL_MAILMERGE_TEMPLATES_ATTACHMENT' => '> Communication Templates > Attach Mail Merge Template', +'LBL_DOWNLOAD_NOW'=>'Download Now', +'LBL_DOWNLOAD'=>'Download', +'LBL_SELECT_MODULE'=>'Select Module', +'LBL_MERGE_FILE'=>'File : ', +'LBL_MERGE_MSG'=>'Select a module to assign this Template', +'LBL_MERGE_FIELDS'=>'Merge Fields', +'LBL_COPY_PASTE'=>'Copy & Paste', +'LNK_GO_TO_TOP'=>'Go to Page Top', +'LBL_COLON'=>':', +'LBL_EMAIL_TEMPLATE'=>'Email Template', +'LBL_NEW_TEMPLATE'=>'New Template', +'LBL_ADD_TEMPLATE'=>'Add Template', +'LBL_USE_MERGE_FIELDS_TO_EMAIL_CONTENT'=>'Use merge fields to personalize your email content.', +'LBL_AVAILABLE_MERGE_FIELDS'=>'Available Merge Fields', +'LBL_SELECT_FIELD_TYPE'=>'Select Field Type', +'LBL_SELECT_FIELD'=>'Select Field :', +'LBL_MERGE_FIELD_VALUE'=>'Copy Merge Field Value :', +'LBL_ACCOUNT_FIELDS'=>'Account Fields', +'LBL_CONTACT_FIELDS'=>'Contact Fields', +'LBL_LEAD_FIELDS'=>'Lead Fields', +'LBL_COPY_AND_PASTE_MERGE_FIELD'=>'Copy and paste the merge field value into your template below.', +'LBL_EMAIL_TEMPLATE_INFORMATION'=>'Communication Templates > Email Templates > Viewing', +'LBL_FOLDER'=>'Folder', +'LBL_PERSONAL'=>'Personal', +'LBL_PUBLIC'=>'Public', +'LBL_TEMPLATE_NAME'=>'Template Name:', +'LBL_SUBJECT'=>'Subject', +'LBL_BODY'=>'Email Body', +'LBL_TEMPLATE_TOOLS'=>'Tools', +'LBL_TEMPLATE_PUBLIC'=>'Public Access', +'LBL_TEMPLATE_PRIVATE'=>'Private Access', +'LBL_TEMPLATE_SUBJECT'=>'Email Subject', +'LBL_TEMPLATE_MESSAGE'=>'Email Message', +'LBL_VIEWING'=>'Viewing', +'LBL_PROPERTIES'=>'Properties of', + + + +// Added fields in createnewgroup.php +'LBL_CREATE_NEW_GROUP'=>'Create New Group', +'LBL_NEW_GROUP'=>'New Group', +'LBL_EDIT_GROUP'=>'Edit Group', +'LBL_GROUP_NAME'=>'Group Name', +'LBL_GROUP_DETAILS'=>'Group Details', +'LBL_MEMBER'=>'Members', +'LBL_MEMBER_AVLBL'=>'Available Entities & Members', +'LBL_MEMBER_SELECTED'=>'Selected Members', +'LBL_GROUP_MESG1'=>'Groups are a flexible way to assign access rights, when complex access rights has to be defined. You can combine multiple entities like Roles, Users, profiles etc into a single group.', +'LBL_GROUP_MESG2'=>'To add, select the Entity members from left and click the ">>" button.', +'LBL_GROUP_MESG3'=>'To remove, select the group members from the right and click the "<<" button.', + + +// Added fields in detailViewmailtemplate.html,listgroupmembers.php,listgroups.php +'LBL_DETAIL_VIEW_OF_EMAIL_TEMPLATE'=>'Detail View of Email Template', +'LBL_DETAIL_VIEW'=>'Detail View of', +'LBL_EDIT_VIEW'=>'Editing details of the user', +'LBL_EDITING'=>'Editing user', +'LBL_GROUP_MEMBERS_LIST'=>'Group members list', +'LBL_GROUPS'=>'Groups', +'LBL_MY_GROUPS'=>'My Groups', +'LBL_ADD_GROUP_BUTTON'=>'Add Group', +'LBL_WORD_TEMPLATES'=>'Mail Merge Templates', +'LBL_NEW_WORD_TEMPLATE'=>'New Template', +'LBL_EMAIL_TEMPLATE_DESC'=>'Manage email templates used for Campaigns and Mass mailing', +'LBL_NAME'=>'Name', + +// Added fields in TabCustomise.php,html and UpdateTab.php,html +'LBL_CUSTOMISE_TABS'=>'Customize Tabs', +'LBL_CHOOSE_TABS'=>'Choose Tabs', +'LBL_AVAILABLE_TABS'=>'Available Tabs', +'LBL_SELECTED_TABS'=>'Selected Tabs', +'LBL_USER'=>'User', +'LBL_TAB_MENU_UPDATED'=>'Tab Menu Updated! kindly go to ', +'LBL_TO_VIEW_CHANGES'=>' to view the changes', + +// Added to change homepage order +'LBL_CHANGE_HOMEPAGE_LABEL'=>'Homepage Order', +'LBL_CHANGE_HOMEPAGE_TITLE'=>'Homepage', + +// Added fields in binaryfilelist.php +'LBL_OERATION'=>'Operation', + +// Added fields in CreateProfile.php +'LBL_PROFILE_NAME'=>'Create New Profile:', +'LBL_NEW_PROFILE'=>'New Profile', +'LBL_NEW_PROFILE_NAME'=>'Profile Name', +'LBL_PARENT_PROFILE'=>'Parent Profile', +'LBL_BASIC_PROFILE_DETAILS'=>'Basic details of Profile', +'LBL_STEP_1_2'=>'Step 1 of 2', +'LBL_STEP_2_2'=>'Step 2 of 2', +'LBL_STEP'=>'Step', +'LBL_SELECT_BASE_PROFILE'=>'Select Base Profile', +'LBL_PROFILE_PRIVILEGES'=>'Profile Privileges', +'LBL_GLOBAL_PRIVILEGES'=>'Global Privileges', +'LBL_TAB_PRIVILEGES'=>'Tab Privileges', +'LBL_FIELD_PRIVILEGES'=>'Field Privileges', +'LBL_STANDARD_PRIVILEGES'=>'Standard Privileges', +'LBL_UTILITY_PRIVILEGES'=>'Utility Privileges', +'LBL_UTILITIES'=>'Utilities', +'LBL_BASE_PROFILE_MESG'=>'I would like to setup a base profile and edit privileges (Recommended)', +'LBL_BASE_PROFILE'=>'Base Profile:', +'LBL_OR'=>'OR', +'LBL_BASE_PROFILE_MESG_ADV'=>'I will choose the privileges from scratch (Advanced Users)', +'LBL_FOR'=>'for', +'LBL_GLOBAL_MESG_OPTION'=>'Select the options below to change global privileges', +'LBL_VIEW_ALL'=>'View all', +'LBL_EDIT_ALL'=>'Edit all', +'LBL_ALLOW'=>'Allows', +'LBL_MESG_VIEW'=>'to view all information / modules of vtiger CRM', +'LBL_MESG_EDIT'=>'to edit all information / modules of vtiger CRM', +'LBL_STD_MESG_OPTION'=>'Select the standard actions to be permitted', +'LBL_TAB_MESG_OPTION'=>'modules to be shown', +'LBL_UTILITY_MESG_OPTION'=>'Select the utility actions to be permitted', +'LBL_FIELD_MESG_OPTION'=>'Select the fields to be permitted', +'LBL_FINISH_BUTTON'=>'Finish', +'LBL_PROFILE_DETAIL_VIEW'=>'Detail View of Profile', +'LBL_PROFILE_MESG'=>'Viewing access privileges for', +'LBL_PROFILE_M'=>'Profile', +'LBL_DEFINE_PRIV_FOR'=>' Define Privileges for ', +'LBL_USE_OPTION_TO_SET_PRIV'=>'Use the options below to set privileges', +'LBL_SUPER_USER_PRIV'=>'Global Privileges', +'LBL_SET_PRIV_FOR_EACH_MODULE'=>'Set Privileges for each Module ', +'LBL_FIELDS_AND_TOOLS_SETTINGS'=>'Fields & Tools Settings', +'LBL_SHOW_FIELDS'=>'Show Fields', +'LBL_TOOLS_TO_BE_SHOWN'=>'Tools to be shown', +'LBL_WELCOME_PROFILE_CREATE'=>'Welcome to Privilege Profile Creator ', +'LBL_SELECT_CHOICE_NEW_PROFILE'=>'Select your choice of creating the new profile', +'LBL_ADD_CUSTOM_RULE'=>'Add Custom Privilege Rule', +'LBL_EDIT_CUSTOM_RULE'=>'Edit Custom Privilege Rule', +'LBL_CLOSE'=>'Close', +'LBL_SELECT_ENTITY'=>'Select an entity below', +'LBL_CAN_BE_ACCESSED_BY'=>'Can be accessed by', +'LBL_PERMISSIONS'=>'Permissions', +'LBL_ACCESS_RIGHTS_FOR_MODULES'=>'Access rights for relative modules', +'LBL_RULE_CONSTRUCTION'=>'Rule Construction Display', +'LBL_ADD_RULE'=>'Add Rule', +'LBL_RELATED_MODULE_RIGHTS'=>'Related Module Rights', +'LBL_IN_PERMISSION'=>'in the permission', + +//Added fields in createrole.php +'LBL_HDR_ROLE_NAME'=>'Create New Role:', +'LBL_TITLE_ROLE_NAME'=>'New Role', +'LBL_ROLE_NAME'=>'Role Name', +'LBL_ROLE_PROFILE_NAME'=>'Associate With Profile', +'LBL_SPECIFY_ROLE_NAME'=>'Specify a name for new role :', +'LBL_ASSIGN_PROFILE'=>'Assign Profile(s)', +'LBL_PROFILE_SELECT_TEXT'=>'Select the Profiles below and click on assign button', +'LBL_PROFILES_AVLBL'=>'Profiles Available', +'LBL_ASSIGN_PROFILES'=>'Assigned Profiles', +'LBL_REPORTS_TO_ROLE'=>'Reports to Role', +'LBL_ASSOCIATED_PROFILES'=>'Associated Profiles :', +'LBL_ASSOCIATED_USERS'=>'Associated Users :', + + +//Added fields in OrgSharingDetailsView.php +'LBL_ORG_SHARING_PRIVILEGES'=>'Organisation Sharing Privileges', +'LBL_EDIT_PERMISSIONS'=>'Edit Permissions', +'LBL_SAVE_PERMISSIONS'=>'Save Permissions', +'LBL_READ_ONLY'=>'Public: Read Only', +'LBL_EDIT_CREATE_ONLY'=>'Public: Read, Create/Edit', +'LBL_READ_CREATE_EDIT_DEL'=>'Public: Read, Create/Edit, Delete', +'LBL_PRIVATE'=>'Private', + +//Added fields in listnotificationschedulers.php +'LBL_HDR_EMAIL_SCHDS'=>'Users : Email Notifications', +'LBL_EMAIL_SCHDS_DESC'=>'The following is the list of notifications that are activated automatically when the corresponding event has happened.', +'LBL_ACTIVE'=>'Active', +'LBL_INACTIVE'=>'Inactive', +'LBL_NOTIFICATION'=>'Notification', +'LBL_DESCRIPTION'=>'Description', +'LBL_TASK_NOTIFICATION'=>'Delayed Task Notification', +'LBL_TASK_NOTIFICATION_DESCRITPION'=>'Notify when a task is delayed beyond 24 hrs', +'LBL_MANY_TICKETS'=>'Too many tickets Notification', +'LBL_MANY_TICKETS_DESCRIPTION'=>'Notify when a particular entity is allocated too many tickets, might reflect Service Level commitments', +'LBL_PENDING_TICKETS'=>'Pending Tickets Notification', +'LBL_TICKETS_DESCRIPTION'=>'Notify for getting attention to status of tickets which are pending', +'LBL_START_NOTIFICATION'=>'Support Start Notification', +'LBL_START_DESCRIPTION'=>'Notifiy stating the start of support/service', +'LBL_BIG_DEAL'=>'Big Deal Notification', +'LBL_BIG_DEAL_DESCRIPTION'=>'Notify on completion of big deal', +'LBL_SUPPORT_NOTICIATION'=>'Support End Notification', +'LBL_SUPPORT_DESCRIPTION'=>'Notify when support is about to end', +'LBL_BUTTON_UPDATE'=>'Update', +'LBL_MODULENAMES'=>'Module', + +//Added fields in ListFieldPermissions.html +'LBL_FIELD_PERMISSION_FIELD_NAME'=>'Field Name', +'LBL_FIELD_PERMISSION_VISIBLE'=>'Visible', +'LBL_FIELD_PERMISSIOM_TABLE_HEADER'=>'Standard Fields', +'LBL_FIELD_LEVEL_ACCESS'=>'Field Level Access', + +//Added fields after 4.0.1 +'LBL_SIGNATURE'=>'Signature', + +//Added for Event Reminder 4.2 Alpha release +'LBL_ACTIVITY_NOTIFICATION'=>'Event Reminder Notification', +'LBL_ACTIVITY_REMINDER_DESCRIPTION'=>'Notify before an event to occur based on the reminder set', +'LBL_MESSAGE'=>'Message', + +//Added for Global Privileges + +'Public: Read Only'=>'Public: Read Only', +'Public: Read, Create/Edit'=>'Public: Read, Create/Edit', +'Public: Read, Create/Edit, Delete'=>'Public: Read, Create/Edit, Delete', +'Private'=>'Private', +'Hide Details'=>'Hide Details', +'Hide Details and Add Events'=>'Hide Details and Add Events', +'Show Details'=>'Show Details', +'Show Details and Add Events'=>'Show Details and Add Events', + +'LBL_USR_CANNOT_ACCESS'=>'Users cannot access other users ', +'LBL_USR_CAN_ACCESS'=>'Users can ', +'LBL_USR_OTHERS'=>' other users ', + +'Read Only '=>'Read Only ', +'Read, Create/Edit, Delete '=>'Read, Create/Edit, Delete ', +'Read, Create/Edit '=>'Read, Create/Edit ', +'Read/Write'=>'Read/Write', +'LBL_GO_TO_TOP'=>'Go to Top', +'LNK_CLICK_HERE'=>'Click here', +'LBL_RULE_NO'=>'Rule No.', +'LBL_CAN_BE_ACCESSED'=>'can be accessed by', +'LBL_PRIVILEGES'=>'Privileges', +'LBL_OF'=>'of', + + + +//Added for 4.2GA support for mail server integration +'LBL_ADD_MAILSERVER_BUTTON_TITLE'=>'Add Mail Server', +'LBL_ADD_MAILSERVER_BUTTON_KEY'=>'M', +'LBL_ADD_MAILSERVER_BUTTON_LABEL'=>'Add Mail Server', + +'LBL_LIST_MAILSERVER_BUTTON_TITLE'=>'List Mail Server', +'LBL_LIST_MAILSERVER_BUTTON_KEY'=>'L', +'LBL_LIST_MAILSERVER_BUTTON_LABEL'=>'List Mail Server', +//added for inventory terms and conditions +'INV_TANDC'=>'Terms & Coditions', +'INV_TERMSANDCONDITIONS'=>'Inventory Terms & Coditions', +'LBL_INV_TERMSANDCONDITIONS'=>'Inventory Management', + + +'INVENTORYNOTIFICATION'=>'Inventory Notifications', +'LBL_INVENTORY_NOTIFICATIONS'=>'Edit Inventory Email Notifications', +'LBL_INV_NOT_DESC'=>'The following are the list of notifications that are sent to the product handler regarding the demand and the current quantity in hand during the creation of a Quote, SalesOrder and Invoice.', + +'InvoiceNotification'=>'Product Stock Notification during Invoice Generation', +'InvoiceNotificationDescription'=>'When the product stock level goes below the re-order level, notification will be sent to the product handler', + +'QuoteNotification'=>'Product Stock Notification during Quote Generation', +'QuoteNotificationDescription'=>'During quote generation if the product stock in warehouse is lesser than the quantity mentioned in quote then this notification will be sent to the product handler', + +'SalesOrderNotification'=>'Product Stock Notification during Sales Order Generation', +'SalesOrderNotificationDescription'=>'During sales order generation if the product stock in warehouse is lesser than the quantity mentioned in sales order then this notification will be sent to the product handler', + +//New addition for 4.2 GA +'LBL_USER_FIELDS'=>'User Fields', +'LBL_NOTE_DO_NOT_REMOVE_INFO'=>'Note: Donot remove or alter the values within { }', + +//Added for patch2 +'LBL_FILE_INFORMATION'=>'File Information', + +//Added after pathc2 +'LBL_LEAD_FIELD_ACCESS'=>'Lead Field Access', + +'LBL_ACCOUNT_FIELD_ACCESS'=>'Account Field Access', + +'LBL_CONTACT_FIELD_ACCESS'=>'Contact Field Access', + +'LBL_OPPORTUNITY_FIELD_ACCESS'=>'Potential Field Access', + +'LBL_HELPDESK_FIELD_ACCESS'=>'HelpDesk Field Access', + +'LBL_PRODUCT_FIELD_ACCESS'=>'Product Field Access', + +'LBL_NOTE_FIELD_ACCESS'=>'Document Field Access', + +'LBL_EMAIL_FIELD_ACCESS'=>'Email Field Access', + +'LBL_TASK_FIELD_ACCESS'=>'Task Field Access', + +'LBL_EVENT_FIELD_ACCESS'=>'Event Field Access', +'LBL_VENDOR_FIELD_ACCESS'=>'Vendor Field Access', +'LBL_PB_FIELD_ACCESS'=>'PriceBook Field Access', +'LBL_QUOTE_FIELD_ACCESS'=>'Quote Field Access', +'LBL_PO_FIELD_ACCESS'=>'Purchase Order Field Access', +'LBL_SO_FIELD_ACCESS'=>'Sales Order Access', +'LBL_INVOICE_FIELD_ACCESS'=>'Invoice Field Access', + +//given for calendar color for an user user +'LBL_COLOR'=>'Color in Calendar', +//added for activity view in home page +'LBL_ACTIVITY_VIEW'=>'Default Activity View', +//Added to change Home page order +'LBL_HOMEPAGE_ORDER_UPDATE'=>'Update Home Page Block Order', +'LBL_HOMEPAGE_ID'=>'Block Order', +'ERR_INVALID_USER'=>'Invalid access--Please call from My Accounts', +'ALVT'=>'Top Accounts', +'PLVT'=>'Top Potentials', +'QLTQ'=>'Top Quotes', +'CVLVT'=>'Key Metrics', +'HLT'=>'Top Trouble Tickets', +'OLV'=>'Upcoming & Pending Activities', +'GRT'=>'My Group Allocation', +'OLTSO'=>'Top Sales Orders', +'ILTI'=>'Top Invoices', +'HDB'=>'Home Page Dashboard', +'OLTPO'=>'Top Purchase Orders', +'LTFAQ'=>'My Recent FAQs', +'UA'=>'Upcoming Activities', +'PA'=>'Pending Activities', + +//Added for 5.0 alpha +'LBL_GROUP_NAME_ERROR'=>'Group Name already exists!', +'MNL'=>'My New Leads', +'LBL_LEAD_VIEW'=>'Default Leads View', +'LBL_TAG_CLOUD'=>'Tag Cloud', +'LBL_LIST_TOOLS'=>'Tools', +'LBL_STATISTICS'=>'Statistics', +'LBL_TOTAL'=>'Total :', +'LBL_OTHERS'=>'Others :', +'LBL_USERS'=>'User(s)', +'LBL_USER_LOGIN_ROLE'=>'User Login & Role', +'LBL_USER_MORE_INFN'=>'More Information', +'LBL_USER_ADDR_INFN'=>'Address Information', +'LBL_USER_IMAGE'=>'User Image', +'LBL_USR'=>'Users', + +'LBL_MY'=>'My', +'LBL_MY_DEFAULTS'=>'My Defaults', +'LBL_MY_DESG'=>'My Designation & Contact Details', +'LBL_MY_ADDR'=>'My Postal Address', +'LBL_MY_PHOTO'=>'My Photo', +'LBL_CHANGE_PHOTO'=>'Change Photo...', +'LBL_CHANGE'=>'Change', + + +//Added for Access Privileges + +'LBL_GLOBAL_FIELDS_MANAGER'=>'Global Fields Manager', +'LBL_GLOBAL_ACCESS_PRIVILEGES'=>'Organization-level Sharing Rules', +'LBL_CUSTOM_ACCESS_PRIVILEGES'=>'Custom Sharing Rules', +'LBL_BOTH'=>'Both', +'LBL_VIEW'=>'View', +'LBL_RECALCULATE_BUTTON'=>'Recalculate', +'LBL_ADD_PRIVILEGES_BUTTON'=>'Add Privileges', +'LBL_CUSTOM_ACCESS_MESG'=>'No Custom Access Rules defined .', +'LBL_CREATE_RULE_MESG'=>'to create a new Rule', +'LBL_SELECT_SCREEN'=>'Select the Screen / Module :', +'LBL_FIELDS_AVLBL'=>'Fields Available in', +'LBL_FIELDS_SELECT_DESELECT'=>'Fields to be shown', +'LBL_ROLE_TO_BE_DELETED'=>'Role to be Deleted', +'LBL_TRANSFER_USER_ROLE'=>'Transfer Users to Role', +'LBL_DELETE_ROLE'=>'Delete Role', +'LBL_MORE_INFORMATION'=>'More Information', +'LBL_USERLOGIN_ROLE'=>'User Login & Role', +'LBL_USER_IMAGE_INFORMATION'=>'User Photograph', + +//Added for 5.0 for all fields +'Role'=>'Role', +'Email'=>'Email', +'Admin'=>'Admin', +'User Name'=>'User Name', +'First Name'=>'First Name', +'Last Name'=>'Last Name', +'Status'=>'Status', +'Default Activity View'=>'Default Calendar View', +'Default Lead View'=>'Default Lead View', +'Currency'=>'Currency', +'Title'=>'Title', +'Office Phone'=>'Office Phone', +'Department'=>'Department', +'Mobile'=>'Mobile', +'Reports To'=>'Reports To', +'Other Phone'=>'Other Phone', +'Other Email'=>'Other Email', +'Fax'=>'Fax', +'Yahoo id'=>'Yahoo id', +'Home Phone'=>'Home Phone', +'User Image'=>'Upload Photograph', +'Date Format'=>'Date Format', +'Tag Cloud'=>'Tag Cloud', +'Signature'=>'Signature', +'Documents'=>'Notes', +'Street Address'=>'Street Address', +'City'=>'City', +'State'=>'State', +'Postal Code'=>'Postal Code', +'Country'=>'Country', +'Password'=>'Password', +'Confirm Password'=>'Confirm Password', +'LBL_SHOWN'=>'Shown', +'LBL_HIDDEN'=>'Hidden', +'LBL_SHOW'=>'Show', +'LBL_HIDE'=>'Hide', +'LBL_HOME_PAGE_COMP'=>'Home Page Components', +'LBL_LOGIN_HISTORY'=>'Login History', +'LBL_USERDETAIL_INFO'=>'Viewing details about the user', +'LBL_DELETE_GROUP'=>'Delete Group', +'LBL_DELETE_GROUPNAME'=>'Group to be Deleted', +'LBL_TRANSFER_GROUP'=>'Transfer Ownership to: ', +'LBL_DELETE_USER'=>'User to be Deleted', +'LBL_TRANSFER_USER'=>'Transfer Ownership to User', +'LBL_DELETE_PROFILE'=>'Delete Profile', +'LBL_TRANSFER_ROLES_TO_PROFILE'=>'Transfer Roles to Profile', +'LBL_PROFILE_TO_BE_DELETED'=>'Profile to be Deteted', + +//Added for disabling window Recalculate + +'LBL_RECALC_MSG'=>'Are you sure, you wish to Recalculate Sharing Access?', +'LBL_YES'=>'Yes', +'LBL_NO'=>'No', + +'LBL_MANDATORY_MSG'=>'Mandatory Fields', +'LBL_DISABLE_FIELD_MSG'=>'Fields Disabled from Global Field Access Settings', + +//Added for About Us + +'LBL_CONTACT_US'=>'Contact Us', +'LBL_READ_LICENSE'=>'Read License', +'LBL_VERSION'=>'Version', +'LBL_TEAM'=>'Team', +'LBL_CREDITS'=>'Credits', +'LBL_THIRD_PARTY'=>'Third Party Packages', +'LBL_COMMUNITY'=>'And vtiger Community', + +'LBL_ASSIGN_ROLE'=>'Assign Role', + +//Moved from Settings to here for Webmail client integration (for 5.0.3 release) + +'LBL_ADD_MAIL_ACCOUNT'=>'Add Mail Account', +'LBL_NEW_MAIL_ACCOUNT_TITLE'=>'New Mail Account [Alt+M]', +'LBL_NEW_MAIL_ACCOUNT_KEY'=>'M', +'LBL_NEW_MAIL_ACCOUNT_LABEL'=>'New Mail Account', +'LBL_GENERAL_INFO'=>'General Information', +'LBL_DISPLAY_NAME'=>'Display Name', +'LBL_MAIL_PROTOCOL'=>'Mail Protocol', +'LBL_LIST_PASSWORD'=>'Password', +'LBL_MAIL_SERVER_NAME'=>'Mail Server Name or IP', +'LBL_INCOME_SERVER_SETTINGS'=>'Incoming Server', +'LBL_TEST_SETTINGS'=>'Test my account setting immediately', +'LBL_TEST_BUTTON_TITLE'=>'Test my account now! [Alt+T]', +'LBL_TEST_BUTTON_KEY'=>'T', +'LBL_TEST_BUTTON_LABEL'=>'Test my account now!', +'LBL_DEFAULT'=>'Default', +'LBL_IMAP2'=>'IMAP2', +'LBL_IMAP4'=>'IMAP4', +'LBL_POP'=>'POP', +'LBL_IMAP'=>'IMAP', +'LBL_MAIL_DISCLAIM'=>'Items marked with * are required', +'LBL_SSL_OPTIONS'=>'SSL Options', +'LBL_TLS'=>'TLS', +'LBL_NO_TLS'=>'No TLS', +'LBL_CERT_VAL'=>'Certificate Validations', +'LBL_INT_MAILER'=>'Use Internal Mailer?', +'LBL_INT_MAILER_USE'=>'Yes', +'LBL_INT_MAILER_NOUSE'=>'No', +'LBL_VAL_SSL_CERT'=>'Validate SSL Cert', +'LBL_DONOT_VAL_SSL_CERT'=>'Do Not Validate SSL Cert', +'LBL_WEB_MAIL_CONFIG'=>'Web Mail Configuration', +'LBL_CONFIGURE_WEB_MAIL'=>' - Configure Web Mail', +'LBL_LIST_MAIL_ACCOUNT'=>' List Mail Account', +'LBL_MY_MAIL_SERVER_DET'=>'My Incoming Mail Server Details', +'LBL_MY_DETAILS'=>'My Details', +'LBL_EMAIL_ID'=>'Email ID', +'LBL_EMAIL_ADDRESS'=>'Email', +'LBL_NAME_EXAMPLE'=>'(example : John Fenner)', +'LBL_EMAIL_EXAMPLE'=>'(example : johnfenner@xyz.com)', +'LBL_REFRESH_TIMEOUT'=>'Refresh Timeout', +'LBL_1_MIN'=>'1 minute', +'LBL_2_MIN'=>'2 minutes', +'LBL_3_MIN'=>'3 minutes', +'LBL_4_MIN'=>'4 minutes', +'LBL_5_MIN'=>'5 minutes', +'LBL_EMAILS_PER_PAGE'=>'Email per Page', +// Added for 5.0.3 + +'LBL_ENTER_PROFILE'=>'Enter The Profile Name', +'TITLE_USER_DOCUMENT'=>'Untitled Document', +'TITLE_VTIGER_CRM_5'=>'vtiger CRM 5 - Free, Commercial grade Open Source CRM', +'ROLE_DRAG_ERR_MSG'=>'You cannot move a Parent Node under a Child Node', + +'LBL_NOTIFICATION_ACTIVITY'=>'Notification Activity', +'LBL_NOTIFICATION_EMAIL_INFO'=>'Notification Email Information', +'LBL_GOTO_LISTVIEW_BUTTON'=>'Goto ListView', + +// Added/Updated for vtiger CRM 5.0.4 + +'LBL_SSL' => 'SSL', +//Added to fix the issue #4081 +'LBL_USERNAME_EXIST' => 'A User with the specified name Already Exists!', +'LBL_UNAUTHORIZED_ACCESS' => 'Unauthorized access to user administration', +//Added to provide User based TagCloud +'LBL_TAGCLOUD_DISPLAY'=>'Tag Cloud Display', +'INTERNAL_MAIL_COMPOSER'=>'Internal Mail Composer', + +// Added for 5.0.4 to Support Email notication on User Creation +'User Login Details'=>'User Login Details', +'LBL_TO_LOGIN' => 'to Login', + +// Added after 5.0.4 GA + +'LBL_USER_ADV_OPTIONS'=>'User Advanced Options', +'Reminder Interval'=>'Reminder Interval', +'Webservice Access Key'=>'Access Key', + +//user-group fixes +'LBL_GROUPNAME_EXIST' => 'A Group with the specified name Already Exists!', +'LBL_PROFILENAME_EXIST' => 'A Profile with the specified name Already Exists!', +); + +?> diff --git a/oss/vtiger/trunk/modules/Users/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Users/language/zh_cn.lang.php new file mode 100644 index 00000000..66a47a55 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/language/zh_cn.lang.php @@ -0,0 +1,671 @@ + '用户', + 'LBL_MODULE_TITLE' => '用户: 首页', + 'LBL_SEARCH_FORM_TITLE' => '搜寻用户', + 'LBL_LIST_FORM_TITLE' => '用户列表', + 'LBL_NEW_FORM_TITLE' => '新增用户', + 'LBL_CREATE_NEW_USER' => '建立用户', + 'LBL_LOGIN' => '登入', + 'LBL_USER_ROLE' => '职位', + 'LBL_LIST_NAME' => '姓名', + 'LBL_LIST_LAST_NAME' => '名', + 'LBL_LIST_USER_NAME' => '用户名', + 'LBL_LIST_DEPARTMENT' => '部门', + 'LBL_LIST_EMAIL' => '电子邮件', + 'LBL_LIST_PRIMARY_PHONE' => '主要电话', + 'LBL_LIST_ADMIN' => '管理员', + 'LBL_LIST_CONFIRM_PASSWORD' => '确认密码', + 'LBL_LIST_USER_NAME_ROLE' => '账号、名称与角色', + 'LBL_LIST_SELECT' => '选择', + 'LBL_LIST_PHONE' => '电话', + 'LBL_LIST_NO' => '#', + +'LBL_ADMINS' => '管理', + 'LBL_STD_USERS' => '标准用户', + + 'UserName' => '账号', + 'Name' => '名称', + 'Tools' => '工具', + + +//added for patch2 + 'LBL_GROUP' => '群组', + 'LBL_CURRENCY_NAME' => '货币', + + 'LBL_NEW_USER_BUTTON_TITLE' => '新增用户 [Alt+N]', + 'LBL_NEW_USER_BUTTON_LABEL' => '新增用户', + 'LBL_NEW_USER_BUTTON_KEY' => 'N', + 'LBL_DATE_FORMAT' => '日期格式', + +'LBL_ERROR' => '错误:', + 'LBL_PASSWORD' => '密码:', + 'LBL_USER_NAME' => '用户名:', + 'LBL_CRM_ID' => 'CRM 代号', + 'LBL_FIRST_NAME' => '姓名:', + 'LBL_LAST_NAME' => '姓氏:', + 'LBL_YAHOO_ID' => 'Yahoo账号:', + 'LBL_THEME' => '样式:', + 'LBL_LANGUAGE' => '语言:', + 'LBL_ADMIN' => '管理员:', + 'LBL_OFFICE_PHONE' => '办公室电话:', + 'LBL_REPORTS_TO' => '报告给:', + 'LBL_OTHER_PHONE' => '其它:', + 'LBL_OTHER_EMAIL' => '其它电子邮件:', + 'LBL_DEPARTMENT' => '部门:', + 'LBL_STATUS' => '身份:', + 'LBL_TITLE' => '标题:', +'LBL_ANY_PHONE' => '其它电话:', + 'LBL_ANY_EMAIL' => '其它邮件:', + 'LBL_ADDRESS' => '地址:', + 'LBL_CITY' => '乡镇市区:', + 'LBL_STATE' => '市(县):', + 'LBL_POSTAL_CODE' => '邮政编码:', + 'LBL_COUNTRY' => '省(市/自治区):', + 'LBL_USER_SETTINGS' => '用户设定', + 'LBL_USER_INFORMATION' => '用户信息', + 'LBL_MOBILE_PHONE' => '手机:', + 'LBL_OTHER' => '其它:', + 'LBL_FAX' => '传真:', + 'LBL_EMAIL' => '电子邮件:', + 'LBL_HOME_PHONE' => '家用电话:', + 'LBL_ADDRESS_INFORMATION' => '地址信息', + 'LBL_CAL_HRFORMAT' => '行事历时间格式', + 'LBL_CAL_DURATION' => '一周开始日', + 'LBL_PRIMARY_ADDRESS' => '主要地址:', + +'LBL_CHANGE_PASSWORD_BUTTON_TITLE' => '变更密码 [Alt+P]', + 'LBL_CHANGE_PASSWORD_BUTTON_KEY' => 'P', + 'LBL_CHANGE_PASSWORD_BUTTON_LABEL' => '变更密码', + 'LBL_LOGIN_BUTTON_TITLE' => '登入 [Alt+L]', + 'LBL_LOGIN_BUTTON_KEY' => 'L', + 'LBL_LOGIN_BUTTON_LABEL' => '登入', + 'LBL_LOGIN_HISTORY_BUTTON_TITLE' => '登入记录 [Alt+H]', + 'LBL_LOGIN_HISTORY_BUTTON_KEY' => 'H', + 'LBL_LOGIN_HISTORY_BUTTON_LABEL' => '登入记录', + 'LBL_LOGIN_HISTORY_TITLE' => '用户: 登入记录', + 'LBL_RESET_PREFERENCES' => '重新设定默认值', + +'LBL_CHANGE_PASSWORD' => '变更密码', + 'LBL_OLD_PASSWORD' => '旧密码:', + 'LBL_NEW_PASSWORD' => '新密码:', + 'LBL_CONFIRM_PASSWORD' => '再确认新密码:', + 'ERR_ENTER_OLD_PASSWORD' => '请输入您的旧密码.', + 'ERR_ENTER_NEW_PASSWORD' => '请输入您的新密码.', + 'ERR_ENTER_CONFIRMATION_PASSWORD' => '请再次输入您的新密码.', + 'ERR_REENTER_PASSWORDS' => '请重新输入密码,新密码与再确认新密码的值不符.', + 'ERR_INVALID_PASSWORD' => '您必须正确输入用户名及密码.', + 'ERR_PASSWORD_CHANGE_FAILED_1' => '用户密码变更失败: ', + 'ERR_PASSWORD_CHANGE_FAILED_2' => ' 失败. 新密码必须要设定.', + 'ERR_PASSWORD_INCORRECT_OLD' => '不正确的旧密码: $this->user_name. 请再重新输入.', + 'ERR_USER_NAME_EXISTS_1' => '用户名 ', + 'ERR_USER_NAME_EXISTS_2' => ' 已经存在. 不予许用户名重复.
      请换一个不同的用户名.', + 'ERR_LAST_ADMIN_1' => '用户名 ', + 'ERR_LAST_ADMIN_2' => ' 最后一位用户成为管理员.
      请检查管理员设定.', + 'ERR_DELETE_RECORD' => '必须指定一笔记录编号才能删除客户', + +// Additional Fields for i18n --- Release vtigerCRM 3.2 Patch 2 +// Users--listroles.php , createrole.php , ListPermissions.php , editpermissions.php + + 'LBL_ROLES' => '职位', + 'LBL_ROLES_SUBORDINATES' => '角色与附属', + + 'LBL_CREATE_NEW_ROLE' => '建立新的职位', + 'LBL_INDICATES_REQUIRED_FIELD' => '指定必须字段', + 'LBL_NEW_ROLE' => '新增职位', + 'LBL_PARENT_ROLE' => '该职位的上司', + + 'LBL_LIST_ROLES' => '列出职位', + 'LBL_ENTITY_LEVEL_PERMISSIONS' => '实体层级权限', + 'LBL_ENTITY' => '实体', + 'LBL_CREATE_EDIT' => '建立/编辑', + 'LBL_DELETE' => '删除', + 'LBL_LEADS' => '潜在客户', + 'LBL_ACCOUNTS' => '客户', + 'LBL_CONTACTS' => '联络人', + 'LBL_OPPURTUNITIES' => '潜在案件', + 'LBL_TASKS' => '任务', + 'LBL_CASES' => '案件', + 'LBL_EMAILS' => '电子邮件', + 'LBL_NOTES' => '备忘录', + 'LBL_MEETINGS' => '会议', + 'LBL_CALLS' => '电话记录', + 'LBL_IMPORT_PERMISSIONS' => '汇入权限', + 'LBL_IMPORT_LEADS' => '汇入潜在客户', + 'LBL_IMPORT_ACCOUNTS' => '汇入客户', + 'LBL_IMPORT_CONTACTS' => '汇入联络人', + 'LBL_IMPORT_OPPURTUNITIES' => '汇入潜在案件', + + 'LBL_ROLE_DETAILS' => '职位细节', +//added for vtigercrm4 rc + 'LBL_FILE' => '文件名称', + 'LBL_FILE_TYPE' => '档案类型', + 'LBL_UPLOAD' => '上传档案', + 'LBL_ATTACH_FILE' => '附加邮件合并样版', + 'LBL_EMAIL_TEMPLATES' => '电子邮件样版', + 'LBL_TEMPLATE_HEADER' => '样板', + 'LBL_TEMPLATE_DETAILS' => '样板细节', + 'LBL_EDIT_TEMPLATE' => '编辑样板', + 'LBL_TEMPLATE_FILE' => '样板档案', + 'LBL_EMAIL_TEMPLATES_LIST' => '通讯样板 > 邮件样板', + 'LBL_MAILMERGE_TEMPLATES_LIST' => '> 通讯样板 > 邮件合并样板', + 'LBL_MAILMERGE_TEMPLATES_ATTACHMENT' => '> 通讯样板 > 附加邮件合并样板', + 'LBL_DOWNLOAD_NOW' => '现在下载', + 'LBL_DOWNLOAD' => '下载', + 'LBL_SELECT_MODULE' => '选择模块', + 'LBL_MERGE_FILE' => '档案:', + 'LBL_MERGE_MSG' => '选择要使用这个样板的模块', + 'LBL_MERGE_FIELDS' => '合并字段', + 'LBL_COPY_PASTE' => '复制与贴上', + 'LNK_GO_TO_TOP' => '回到页首', + 'LNK_SAMPLE_EMAIL' => '检视范例信件', + 'LBL_COLON' => ':', + 'LBL_EMAIL_TEMPLATE' => '电子邮件样版', + 'LBL_NEW_TEMPLATE' => '新增样版', + 'LBL_ADD_TEMPLATE' => '新增样板', + 'LBL_USE_MERGE_FIELDS_TO_EMAIL_CONTENT' => '使用您的个人化样版. 您可以新增替代文字去合并任何字段.', + 'LBL_AVAILABLE_MERGE_FIELDS' => '目前可以的合并字段', + 'LBL_SELECT_FIELD_TYPE' => '选择字段类别', + 'LBL_SELECT_FIELD' => '选择字段', + 'LBL_MERGE_FIELD_VALUE' => '复制合并字段值', + 'LBL_ACCOUNT_FIELDS' => '客户字段', + 'LBL_CONTACT_FIELDS' => '联络人字段', + 'LBL_LEAD_FIELDS' => '潜在客户字段', + 'LBL_COPY_AND_PASTE_MERGE_FIELD' => '复制并且贴上合并的字段值到您的样版里.', + 'LBL_EMAIL_TEMPLATE_INFORMATION' => '电子邮件样版信息:', + 'LBL_FOLDER' => '资料夹:', + 'LBL_PERSONAL' => '个人', + 'LBL_PUBLIC' => '公开', + 'LBL_TEMPLATE_NAME' => '样版名称:', + 'LBL_SUBJECT' => '标题', + 'LBL_BODY' => '电子邮件内容', + 'LBL_TEMPLATE_TOOLS' => '工具', + 'LBL_TEMPLATE_PUBLIC' => '公开', + 'LBL_TEMPLATE_PRIVATE' => '私人', + 'LBL_TEMPLATE_SUBJECT' => '邮件主旨', + 'LBL_TEMPLATE_MESSAGE' => '邮件内容', + 'LBL_VIEWING' => '检视中', + 'LBL_PROPERTIES' => '属性', + + + +// Added fields in createnewgroup.php +'LBL_CREATE_NEW_GROUP' => '建立新的群组', + 'LBL_NEW_GROUP' => '新增群组', + 'LBL_EDIT_GROUP' => '编辑寻组', + 'LBL_GROUP_NAME' => '群组名称', + 'LBL_GROUP_DETAILS' => '群组细节', + 'LBL_MEMBER' => '成员', + 'LBL_MEMBER_AVLBL' => '现有会员', + 'LBL_MEMBER_SELECTED' => '选择的会员', + 'LBL_DESCRIPTION' => '描述', + 'LBL_GROUP_MESG1' => '如果定义了比较复杂的存取权限,透过群组指派会比较有弹性。您可以透过群组合并多笔角色、用户与数据等。', + 'LBL_GROUP_MESG2' => '要新增时,选择左边的会员数据后点选 "》" 按钮', + 'LBL_GROUP_MESG3' => '要移除时,选择右边的会员数据后点选 "《" 按钮', + + +// Added fields in detailViewmailtemplate.html,listgroupmembers.php,listgroups.php + 'LBL_DETAIL_VIEW_OF_EMAIL_TEMPLATE' => '观看电子邮件样版细节', + 'LBL_DETAIL_VIEW' => '细节', + 'LBL_EDIT_VIEW' => '编辑', + 'LBL_EDITING' => '编辑用户', + + 'LBL_GROUP_MEMBERS_LIST' => '群组会员列表', + 'LBL_GROUPS' => '群组', + 'LBL_MY_GROUPS' => '我的群组', + 'LBL_ADD_GROUP_BUTTON' => '新增群组', + 'LBL_WORD_TEMPLATES' => '电子邮件合并样版', + 'LBL_NEW_WORD_TEMPLATE' => '新增样版', + 'LBL_EMAIL_TEMPLATE_DESC' => '管理活动与大量邮件使用的邮件样板', + 'LBL_NAME' => '名称:', + +// Added fields in TabCustomise.php,html and UpdateTab.php,html + 'LBL_CUSTOMISE_TABS' => '自订表格', + 'LBL_CHOOSE_TABS' => '选择表格', + 'LBL_AVAILABLE_TABS' => '现有表格', + 'LBL_SELECTED_TABS' => '已选表格', + 'LBL_USER' => '用户', + 'LBL_TAB_MENU_UPDATED' => '表格清单已更新! ', + 'LBL_TO_VIEW_CHANGES' => ' 观看相关的变更', + +// Added to change homepage order + 'LBL_CHANGE_HOMEPAGE_LABEL' => '网页顺序', + 'LBL_CHANGE_HOMEPAGE_TITLE' => '网页', + +// Added fields in binaryfilelist.php + 'LBL_OERATION' => '作业', + +// Added fields in CreateProfile.php + 'LBL_PROFILE_NAME' => '建立新的权限名称:', + 'LBL_NEW_PROFILE' => '新增权限名称', + 'LBL_NEW_PROFILE_NAME' => '权限名称', + 'LBL_PARENT_PROFILE' => '继承权限', + 'LBL_BASIC_PROFILE_DETAILS' => '权限基本细节', + 'LBL_STEP_1_2' => '步骤1之2', + 'LBL_STEP_2_2' => '步骤2之2', + 'LBL_STEP' => '步骤', + 'LBL_SELECT_BASE_PROFILE' => '选择基础权限', + 'LBL_PROFILE_PRIVILEGES' => '权限', + 'LBL_GLOBAL_PRIVILEGES' => '全域权限', + 'LBL_TAB_PRIVILEGES' => '标签权限', + 'LBL_FIELD_PRIVILEGES' => '字段权限', + 'LBL_STANDARD_PRIVILEGES' => '标准权限', + 'LBL_UTILITY_PRIVILEGES' => '工具权限', + 'LBL_UTILITIES' => '工具', + 'LBL_BASE_PROFILE_MESG' => '我要建立一个基础权限名称并且编辑权限 (建议)', + 'LBL_BASE_PROFILE' => '基础权限名称:', + 'LBL_OR' => '或', + 'LBL_BASE_PROFILE_MESG_ADV' => '我要重新选择权限 (进阶用户)', + 'LBL_FOR' => '于', + 'LBL_GLOBAL_MESG_OPTION' => '选择下面选项来修改全域权限', + 'LBL_VIEW_ALL' => '检视全部', + 'LBL_EDIT_ALL' => '编辑全部', + 'LBL_ALLOW' => '允许', + 'LBL_MESG_VIEW' => '检视所有信息 / 模块', + 'LBL_MESG_EDIT' => '编辑所有信息 / 模块', + 'LBL_STD_MESG_OPTION' => '选择允许的标准操作', + 'LBL_TAB_MESG_OPTION' => '选择允许的卷标/模块', + 'LBL_UTILITY_MESG_OPTION' => '选择允许的工具', + 'LBL_FIELD_MESG_OPTION' => '选择允许的字段', + 'LBL_FINISH_BUTTON' => '完成', + 'LBL_PROFILE_DETAIL_VIEW' => '权限细节', + 'LBL_PROFILE_MESG' => '检视存取权限于', + 'LBL_PROFILE_M' => '权限', + 'LBL_DEFINE_PRIV_FOR' => '定义权限于', + 'LBL_USE_OPTION_TO_SET_PRIV' => '使用下面选项设定权限', + 'LBL_SUPER_USER_PRIV' => '超级用户权限', + 'LBL_SET_PRIV_FOR_EACH_MODULE' => '设定每个模块的权限', + 'LBL_FIELDS_AND_TOOLS_SETTINGS' => '字段与工具设定', + 'LBL_SHOW_FIELDS' => '显示字段', + 'LBL_TOOLS_TO_BE_SHOWN' => '要显示的工具', + 'LBL_WELCOME_PROFILE_CREATE' => '欢迎使用权限资料精灵', + 'LBL_SELECT_CHOICE_NEW_PROFILE' => '选择您希望使用的项目来建立新的权限名称', + 'LBL_ADD_CUSTOM_RULE' => '新增自订权限规则', + 'LBL_EDIT_CUSTOM_RULE' => '编辑自订权限规则', + 'LBL_CLOSE' => '关闭', + 'LBL_SELECT_ENTITY' => '从下面选择一个项目', + 'LBL_CAN_BE_ACCESSED_BY' => '可以存取于', + 'LBL_PERMISSIONS' => '权限', + 'LBL_ACCESS_RIGHTS_FOR_MODULES' => '相关模块存取权限', + 'LBL_RULE_CONSTRUCTION' => '显示规则架构', + 'LBL_ADD_RULE' => '新增规则', + 'LBL_RELATED_MODULE_RIGHTS' => '相关模块权限', + 'LBL_IN_PERMISSION' => '在权限', + +//Added fields in createrole.php + 'LBL_HDR_ROLE_NAME' => '建立新的职位:', + 'LBL_TITLE_ROLE_NAME' => '新增职位', + 'LBL_ROLE_NAME' => '职位名称', + 'LBL_ROLE_PROFILE_NAME' => '结合权限名称', + 'LBL_SPECIFY_ROLE_NAME' => '指定新角色名称:', + 'LBL_ASSIGN_PROFILE' => '指定权限名称', + 'LBL_PROFILE_SELECT_TEXT' => '选择下面权限名称后点选指定按钮', + 'LBL_PROFILES_AVLBL' => '可用权限名称', + 'LBL_ASSIGN_PROFILES' => '指定的权限名称', + 'LBL_REPORTS_TO_ROLE' => '回报给角色', + 'LBL_ASSOCIATED_PROFILES' => '相关权限名称:', + 'LBL_ASSOCIATED_USERS' => '相关用户:', + + +//Added fields in OrgSharingDetailsView.php +'LBL_ORG_SHARING_PRIVILEGES' => '组织单位享有之特别权限', + 'LBL_EDIT_PERMISSIONS' => '编辑权限', + 'LBL_SAVE_PERMISSIONS' => '储存权限', + 'LBL_READ_ONLY' => '公众: 只能读', + 'LBL_EDIT_CREATE_ONLY' => '公众: 读, 建立/编辑', + 'LBL_READ_CREATE_EDIT_DEL' => '公众: 读, 建立/编辑, 删除', + 'LBL_PRIVATE' => '私人', + +//Added fields in listnotificationschedulers.php +'LBL_HDR_EMAIL_SCHDS' => '用户 : 电子邮件通知', + 'LBL_EMAIL_SCHDS_DESC' => '当相应事件已经发生时,下列是被自动开动的通知的目录.', + 'LBL_ACTIVE' => '启用', + 'LBL_INACTIVE' => '停用', + 'LBL_NOTIFICATION' => '通知', + 'LBL_DESCRIPTION'=>'描述', + 'LBL_TASK_NOTIFICATION' => '延迟任务通知', + 'LBL_TASK_NOTIFICATION_DESCRITPION' => '当任务延迟24小时后,执行通知', + 'LBL_MANY_TICKETS' => '当有太多的记事签时,执行通知', + 'LBL_MANY_TICKETS_DESCRIPTION' => '当同一个实体发出太多的记事签时,执行通知', + 'LBL_PENDING_TICKETS' => '未决定之记事签通知', + 'LBL_TICKETS_DESCRIPTION' => '通知注意,未决定之记事签', + 'LBL_START_NOTIFICATION' => '支持开始通知', + 'LBL_START_DESCRIPTION' => '声明通知 支持/服务', + 'LBL_BIG_DEAL' => '折扣通知', + 'LBL_BIG_DEAL_DESCRIPTION' => '重要交易,执行通知', + 'LBL_SUPPORT_NOTICIATION' => '支持结束通知', + 'LBL_SUPPORT_DESCRIPTION' => '当支持结束时,执行通知', + 'LBL_BUTTON_UPDATE' => '更新', + 'LBL_MODULENAMES' => '模块', + +//Added fields in ListFieldPermissions.html +'LBL_FIELD_PERMISSION_FIELD_NAME' => '字段名称', + 'LBL_FIELD_PERMISSION_VISIBLE' => '显示', + 'LBL_FIELD_PERMISSIOM_TABLE_HEADER' => '标准字段', + 'LBL_FIELD_LEVEL_ACCESS' => '字段层级存取', + +//Added fields after 4.0.1 + 'LBL_SIGNATURE' => '签名', + +//Added for Event Reminder 4.2 Alpha release +'LBL_ACTIVITY_NOTIFICATION' => '事件提醒通知', + 'LBL_ACTIVITY_REMINDER_DESCRIPTION' => '基于提醒设定在事件发生前通知', + 'LBL_MESSAGE' => '信件', + +//Added for Global Privileges + +'Public: Read Only' => '公开:只读', + 'Public: Read, Create/Edit' => '公开:读取、建立/编辑', + 'Public: Read, Create/Edit, Delete' => '公开:读取、建立/编辑、删除', + 'Private' => '私人', + 'Hide Details' => '隐藏细节', + 'Hide Details and Add Events' => '隐藏细节与新增事件', + 'Show Details' => '显示细节', + 'Show Details and Add Events' => '显示细节与新增事件', + +'LBL_USR_CANNOT_ACCESS' => '用户无法存取其它账号', + 'LBL_USR_CAN_ACCESS' => '用户可以', + 'LBL_USR_OTHERS' => '其它用户', + +'Read Only ' => '只读', + 'Read, Create/Edit, Delete ' => '读取、建立/编辑、删除', + 'Read, Create/Edit ' => '读取、建立/编辑', + 'Read/Write' => '读取/写入', + 'LBL_GO_TO_TOP' => '回到页首', + 'LNK_CLICK_HERE' => '点选这里', + 'LBL_RULE_NO' => '规则编号', + 'LBL_CAN_BE_ACCESSED' => '可以存取者', + 'LBL_PRIVILEGES' => '权限', + 'LBL_OF' => '于', + + +//Added for 4.2GA support for mail server integration +'LBL_ADD_MAILSERVER_BUTTON_TITLE' => '新增邮件服务器', + 'LBL_ADD_MAILSERVER_BUTTON_KEY' => 'M', + 'LBL_ADD_MAILSERVER_BUTTON_LABEL' => '新增邮件服务器', + +'LBL_LIST_MAILSERVER_BUTTON_TITLE' => '邮件服务器列表', + 'LBL_LIST_MAILSERVER_BUTTON_KEY' => 'L', + 'LBL_LIST_MAILSERVER_BUTTON_LABEL' => '邮件服务器列表', +//added for inventory terms and conditions +'INV_TANDC' => '期限与条款', + 'INV_TERMSANDCONDITIONS' => '库存期限与条款', + 'LBL_INV_TERMSANDCONDITIONS' => '库存管理', + + +'INVENTORYNOTIFICATION' => '库存通知', + 'LBL_INVENTORY_NOTIFICATIONS' => '编辑库存通知邮件', + 'LBL_INV_NOT_DESC' => '下面是提醒通知的列表,用来在手动建立报价单、销售订单与发票时寄送给产品处理者,包括需求与目前数量等信息', + + 'InvoiceNotification' => '在建立发票时提醒产品库存', + 'InvoiceNotificationDescription' => '当产品库存低于安全存量时,提醒通知会发送给产品处理者', + + 'QuoteNotification' => '在建立报价单时提醒产品库存', + 'QuoteNotificationDescription' => '在报价单产生时,如果仓库中的产品库存低于报价单中提到的数量,这个提醒通知就会发出给相关人员', + + 'SalesOrderNotification' => '在建立销售订单时提醒产品库存', + 'SalesOrderNotificationDescription' => '在销售订单产生时,如果仓库中的产品库存低于销售订单中提到的数量,这个提醒通知就会发出给相关人员', + +//New addition for 4.2 GA + 'LBL_USER_FIELDS' => '用户字段', + 'LBL_NOTE_DO_NOT_REMOVE_INFO' => '注意:不要移除或是取代大括号 { } 中的数值', + +//Added for patch2 + 'LBL_FILE_INFORMATION' => '档案信息', + +//Added after pathc2 + 'LBL_LEAD_FIELD_ACCESS' => '潜在客户字段权限', + 'LBL_ACCOUNT_FIELD_ACCESS' => '客户字段权限', + 'LBL_CONTACT_FIELD_ACCESS' => '联络人字段权限', + 'LBL_OPPORTUNITY_FIELD_ACCESS' => '潜在机会字段权限', + 'LBL_HELPDESK_FIELD_ACCESS' => '服务台字段权限', + 'LBL_PRODUCT_FIELD_ACCESS' => '产品字段权限', + 'LBL_NOTE_FIELD_ACCESS' => '记事字段权限', + 'LBL_EMAIL_FIELD_ACCESS' => '电子邮件字段权限', + 'LBL_TASK_FIELD_ACCESS' => '任务字段权限', + 'LBL_EVENT_FIELD_ACCESS' => '事件字段权限', + 'LBL_VENDOR_FIELD_ACCESS' => '厂商字段权限', + 'LBL_PB_FIELD_ACCESS' => '价目表字段权限', + 'LBL_QUOTE_FIELD_ACCESS' => '报价单字段权限', + 'LBL_PO_FIELD_ACCESS' => '采购订单字段权限', + 'LBL_SO_FIELD_ACCESS' => '销售订单字段权限', + 'LBL_INVOICE_FIELD_ACCESS' => '发票字段权限', + +//given for calendar color for an user user + 'LBL_COLOR' => '行事历颜色', +//added for activity view in home page + 'LBL_ACTIVITY_VIEW' => '预设活动检视', +//Added to change Home page order +'LBL_HOMEPAGE_ORDER_UPDATE' => '更新网页区块顺序', + 'LBL_HOMEPAGE_ID' => '区块顺序', + 'ERR_INVALID_USER' => '操作错误 -- 请透过我的客户功能存取', + 'ALVT' => '最佳客户', + 'PLVT' => '最佳潜在机会', + 'QLTQ' => '最佳报价单', + 'CVLVT' => '关键点', + 'HLT' => '服务台最佳传票', + 'OLV' => '最热门活动', + 'GRT' => '最佳群组任务', + 'OLTSO' => '最佳销售订单', + 'ILTI' => '最佳发票', + 'HDB' => '统计图表', + 'OLTPO' => '顶部订购单', + 'LTFAQ' => '我的常见问题', +'UA'=>'近期活动', +'PA'=>'尚待进行的活动', + +//Added for 5.0 alpha +'LBL_GROUP_NAME_ERROR' => '群组名称重复!', + 'MNL' => '我的新准客户', + 'LBL_LEAD_VIEW' => '预设准客户检视方式', + 'LBL_TAG_CLOUD' => '标签区', + 'LBL_LIST_TOOLS' => '工具', + 'LBL_STATISTICS' => '统计', + 'LBL_TOTAL' => '总计:', + 'LBL_OTHERS' => '其它:', + 'LBL_USERS' => '个用户', + 'LBL_USER_LOGIN_ROLE' => '用户账号与角色', + 'LBL_USER_MORE_INFN' => '更多信息', + 'LBL_USER_ADDR_INFN' => '住址信息', + 'LBL_USER_IMAGE' => '用户照片', + 'LBL_USR' => '用户', + + 'LBL_MY' => '我的', + 'LBL_MY_DEFAULTS' => '我的默认值', + 'LBL_MY_DESG' => '我的署名与联络信息', + 'LBL_MY_ADDR' => '我的邮政信箱', + 'LBL_MY_PHOTO' => '我的照片', + 'LBL_CHANGE_PHOTO' => '修改照片...', + 'LBL_CHANGE' => '修改', + + +//Added for Access Privileges + + 'LBL_GLOBAL_FIELDS_MANAGER' => '全域字段管理', + 'LBL_GLOBAL_ACCESS_PRIVILEGES' => '全域存取权限', + 'LBL_CUSTOM_ACCESS_PRIVILEGES' => '自订存取权限', + 'LBL_BOTH' => '两者', + 'LBL_VIEW' => '检视', + 'LBL_RECALCULATE_BUTTON' => '重新计算', + 'LBL_ADD_PRIVILEGES_BUTTON' => '新增权限', + 'LBL_CUSTOM_ACCESS_MESG' => '未定义自订存取规则。', + 'LBL_CREATE_RULE_MESG' => '建立新规则', + 'LBL_SELECT_SCREEN' => '选择画面/模块:', + 'LBL_FIELDS_AVLBL' => '字段可用于', + 'LBL_FIELDS_SELECT_DESELECT' => '选择或取消选择要显示的字段', + 'LBL_ROLE_TO_BE_DELETED' => '要删除的角色', + 'LBL_TRANSFER_USER_ROLE' => '转换用户为角色', + 'LBL_DELETE_ROLE' => '删除角色', + 'LBL_MORE_INFORMATION' => '更多信息', + 'LBL_USERLOGIN_ROLE' => '用户账号与角色', + 'LBL_USER_IMAGE_INFORMATION' => '照片', + +//Added for 5.0 for all fields +'Role' => '角色', + 'Email' => '信箱', + 'Admin' => '管理', + 'User Name' => '账号', + 'First Name' => '姓名', + 'Last Name' => '姓氏', + 'Status' => '状态', + 'Default Activity View' => '预设检视待办事项', + 'Default Lead View' => '预设检视准客户', + 'Currency' => '货币', + 'Title' => '职称', + 'Office Phone' => '公司电话', + 'Department' => '部门', + 'Mobile' => '手机', + 'Reports To' => '负责业务', + 'Other Phone' => '其它电话', + 'Other Email' => '其它信箱', + 'Fax' => '传真', + 'Yahoo id' => 'Yahoo账号', + 'Home Phone' => '家里电话', + 'User Image' => '照片', + 'Date Format' => '日期格式', + 'Tag Cloud' => '常用关键词', + 'Signature' => '签名', +'Documents'=>'文件', + 'Street Address' => '街道巷弄', + 'City' => '乡镇市区', + 'State' => '市(县)', + 'Postal Code' => '邮政编码', + 'Country' => '省(市/自治区)', + 'Password' => '密码', + 'Confirm Password' => '密码确认', + 'LBL_SHOWN' => '显示', + 'LBL_HIDDEN' => '隐藏', + 'LBL_SHOW' => '显示', + 'LBL_HIDE' => '隐藏', + 'LBL_HOME_PAGE_COMP' => '首页组件', + 'LBL_LOGIN_HISTORY' => '登入纪录', + 'LBL_USERDETAIL_INFO' => '检视用户细节', + 'LBL_DELETE_GROUP' => '删除群组', + 'LBL_DELETE_GROUPNAME' => '要删除的群组', + 'LBL_TRANSFER_GROUP' => '转换负责人为:', + 'LBL_DELETE_USER' => '要删除的用户', + 'LBL_TRANSFER_USER' => '转换负责人到用户', + 'LBL_DELETE_PROFILE' => '删除权限名称', + 'LBL_TRANSFER_ROLES_TO_PROFILE' => '转换角色的权限名称', + 'LBL_PROFILE_TO_BE_DELETED' => '要删除的权限名称', + +//Added for disabling window Recalculate + + 'LBL_RECALC_MSG' => '您确定要重新计算共享权限?', + 'LBL_YES' => '是', + 'LBL_NO' => '否', + + 'LBL_MANDATORY_MSG' => '必填字段', + 'LBL_DISABLE_FIELD_MSG' => '这个字段在全域字段存取设定中停用了', + +//Added for About Us + + 'LBL_CONTACT_US' => '联络我们', + 'LBL_READ_LICENSE' => '阅读授权', + 'LBL_VERSION' => '版本', + 'LBL_TEAM' => '团队', + 'LBL_CREDITS' => '贡献', + 'LBL_THIRD_PARTY' => '第三方程式', + 'LBL_COMMUNITY' => '以及 vtiger 社群', + + 'LBL_ASSIGN_ROLE' => '指定角色', + +//Moved from Settings to here for Webmail client integration (for 5.0.3 release) + + 'LBL_ADD_MAIL_ACCOUNT' => '新增邮件账号', + 'LBL_NEW_MAIL_ACCOUNT_TITLE' => '新增邮件账号 [Alt+M]', + 'LBL_NEW_MAIL_ACCOUNT_KEY' => 'M', + 'LBL_NEW_MAIL_ACCOUNT_LABEL' => '新增邮件账号', + 'LBL_GENERAL_INFO' => '一般信息', + 'LBL_DISPLAY_NAME' => '显示名称', + 'LBL_MAIL_PROTOCOL' => '邮件协定', + 'LBL_LIST_PASSWORD' => '密码', + 'LBL_MAIL_SERVER_NAME' => '邮件服务器名称', + 'LBL_INCOME_SERVER_SETTINGS' => '收件服务器', + 'LBL_TEST_SETTINGS' => '立刻测试我的设定', + 'LBL_TEST_BUTTON_TITLE' => '测试我的设定![Alt+T]', + 'LBL_TEST_BUTTON_KEY' => 'T', + 'LBL_TEST_BUTTON_LABEL' => '测试我的设定!', + 'LBL_DEFAULT' => '预设', + 'LBL_IMAP2' => 'IMAP2', + 'LBL_IMAP4' => 'IMAP4', + 'LBL_POP' => 'POP', + 'LBL_IMAP' => 'IMAP', + 'LBL_MAIL_DISCLAIM' => '有 * 符号表示必填,标示 * * 表示完全支持', + 'LBL_SSL_OPTIONS' => 'SSL 选项', + 'LBL_TLS' => 'TLS', + 'LBL_NO_TLS' => 'No TLS', + 'LBL_CERT_VAL' => '验证执照', + 'LBL_INT_MAILER' => '使用内部邮件服务器?', + 'LBL_INT_MAILER_USE' => '是', + 'LBL_INT_MAILER_NOUSE' => '否', + 'LBL_VAL_SSL_CERT' => '验证 SSL 执照', + 'LBL_DONOT_VAL_SSL_CERT' => '不去验证 SSL 执照', + 'LBL_WEB_MAIL_CONFIG' => '网页邮件设定', + 'LBL_CONFIGURE_WEB_MAIL' => ' - 设定网页邮件', + 'LBL_LIST_MAIL_ACCOUNT' => '邮件账号列表', + 'LBL_MY_MAIL_SERVER_DET' => '我的邮件服务器细节', + 'LBL_MY_DETAILS' => '我的细节', + 'LBL_EMAIL_ID' => '信箱代号', + 'LBL_EMAIL_ADDRESS' => '电子邮件', + 'LBL_NAME_EXAMPLE' => '(例: John Fenner)', + 'LBL_EMAIL_EXAMPLE' => '(例: johnfenner@mailserver.com)', + 'LBL_REFRESH_TIMEOUT' => '重新整理频率', + 'LBL_1_MIN' => '1 分钟', + 'LBL_2_MIN' => '2 分钟', + 'LBL_3_MIN' => '3 分钟', + 'LBL_4_MIN' => '4 分钟', + 'LBL_5_MIN' => '5 分钟', + 'LBL_EMAILS_PER_PAGE' => '每页显示邮件数量', +// Added for 5.0.3 + +'LBL_ENTER_PROFILE'=>'输入概况', +'TITLE_USER_DOCUMENT'=>'没有文件名', +'TITLE_VTIGER_CRM_5'=>'vtiger CRM 5 - Free, Commercial grade Open Source CRM', +'ROLE_DRAG_ERR_MSG'=>'You cannot move a Parent Node under a Child Node', + +'LBL_NOTIFICATION_ACTIVITY'=>'活动通知', +'LBL_NOTIFICATION_EMAIL_INFO'=>'通知电子邮件信息', +'LBL_GOTO_LISTVIEW_BUTTON'=>'转到列表', +// Added/Updated for vtiger CRM 5.0.4 +'LBL_SSL' => 'SSL', +//Added to fix the issue #4081 +'LBL_USERNAME_EXIST' => '指定名称的用户已经存在! ', +'LBL_UNAUTHORIZED_ACCESS' => '未经授权访问用户管理 ', +//Added to provide User based TagCloud +'LBL_TAGCLOUD_DISPLAY'=>'标签关闭展示', +'INTERNAL_MAIL_COMPOSER'=>'内部邮件作者', + +// Added for 5.0.4 to Support Email notication on User Creation +'User Login Details'=>'用户登录细节', +'LBL_TO_LOGIN' => '登录', +// Added after 5.0.4 GA + +'LBL_USER_ADV_OPTIONS'=>'用户扩展选项', +'Reminder Interval'=>'提醒区间 ', +'Webservice Access Key'=>'Access Key', + +//user-group fixes +'LBL_GROUPNAME_EXIST' => '指定名称的用户组已经存在!', +'LBL_PROFILENAME_EXIST' => '概况与指定名称已经存在! ', +); + +?> diff --git a/oss/vtiger/trunk/modules/Users/lookupemailtemplates.php b/oss/vtiger/trunk/modules/Users/lookupemailtemplates.php new file mode 100644 index 00000000..0dcff2ba --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/lookupemailtemplates.php @@ -0,0 +1,76 @@ + + + + + + <?php echo $mod_strings['LBL_EMAIL_TEMPLATES_LIST']; ?> + + + +
      +
      +
      + + + + + + +pquery($sql, array()); + $temprow = $adb->fetch_array($result); + +$cnt=1; + +require_once('include/utils/UserInfoUtil.php'); +require('user_privileges/user_privileges_'.$current_user->id.'.php'); +do +{ + $templatename = $temprow["templatename"]; + if($is_admin == false) + { + $folderName = $temprow['foldername']; + if($folderName != 'Personal') + { + printf(""; + printf("",$temprow["description"]); + } + } + else + { + printf(""; + printf("",$temprow["description"]); + } + $cnt++; + +}while($temprow = $adb->fetch_array($result)); +?> +
      +
      "); + echo "".$temprow["templatename"]."%s
      "); + echo "".$temprow["templatename"]."%s
      + + + diff --git a/oss/vtiger/trunk/modules/Users/massChangeStatus.php b/oss/vtiger/trunk/modules/Users/massChangeStatus.php new file mode 100644 index 00000000..11aebd50 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/massChangeStatus.php @@ -0,0 +1,139 @@ +'lead_status_dom'); +$comboFieldArray = getComboArray($comboFieldNames); + +?> + + + + +
      + + + + + + + +
      Status Information
      + + + + +
      Select New Status:
      +
      + + + + +
      + + +
      + + +
      +pquery("select * from vtiger_users", array()); + for($i=0;$i<$adb->num_rows($result);$i++) + { + $useridlist[$i]=$adb->query_result($result,$i,'id'); + $usernamelist[$useridlist[$i]]=$adb->query_result($result,$i,'user_name'); + } + +?> +
      + +
      + + + + + + + +
      Owner Information
      + + + + +
      Select New Owner:
      +
      + + + + +
      + + +
      + + +
      + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/massdelete.php b/oss/vtiger/trunk/modules/Users/massdelete.php new file mode 100644 index 00000000..a3b10a6c --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/massdelete.php @@ -0,0 +1,80 @@ + 0) { + $ret = getEntityName($returnmodule,$ids_list); + if(count($ret) > 0) + { + $errormsg = implode(',',$ret); + } +} + +if(isset($_REQUEST['smodule']) && ($_REQUEST['smodule']!='')) +{ + $smod = "&smodule=".vtlib_purify($_REQUEST['smodule']); +} +if(isset($_REQUEST['start']) && ($_REQUEST['start']!='')) +{ + $rstart = "&start=".vtlib_purify($_REQUEST['start']); +} +if($returnmodule == 'Emails') +{ + if(isset($_REQUEST['folderid']) && $_REQUEST['folderid'] != '') + { + $folderid = vtlib_purify($_REQUEST['folderid']); + }else + { + $folderid = 1; + } + header("Location: index.php?module=".$returnmodule."&action=".$returnmodule."Ajax&folderid=".$folderid."&ajax=delete".$rstart."&file=ListView&errormsg=".$errormsg.$url); +} +elseif($return_action == 'ActivityAjax') +{ + $subtab = vtlib_purify($_REQUEST['subtab']); + header("Location: index.php?module=".$returnmodule."&action=".$return_action."".$rstart."&view=".vtlib_purify($_REQUEST['view'])."&hour=".vtlib_purify($_REQUEST['hour'])."&day=".vtlib_purify($_REQUEST['day'])."&month=".vtlib_purify($_REQUEST['month'])."&year=".vtlib_purify($_REQUEST['year'])."&type=".vtlib_purify($_REQUEST['type'])."&viewOption=".vtlib_purify($_REQUEST['viewOption'])."&subtab=".$subtab.$url); +} + +elseif($returnmodule!='Faq') +{ + header("Location: index.php?module=".$returnmodule."&action=".$returnmodule."Ajax&ajax=delete".$rstart."&file=ListView&viewname=".$viewid."&errormsg=".$errormsg.$url); +} +else +{ + header("Location: index.php?module=".$returnmodule."&action=".$returnmodule."Ajax&ajax=delete".$rstart."&file=ListView&errormsg=".$errormsg.$url); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/notify_detail.php b/oss/vtiger/trunk/modules/Users/notify_detail.php new file mode 100644 index 00000000..137dbbee --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/notify_detail.php @@ -0,0 +1,69 @@ + + + + + + +<?php echo $mod_strings['TITLE_USER_DOCUMENT']; ?> + + + +
      + + + + +
      : +
      +
      + + + + + + + + + + + + + + + + + + + + + + +
      :
      :
      :
      : <?php echo $mod_strings['LBL_INACTIVE']; ?> + [Deactivate]
      :
      :
      + + + +
        + +  
      +
      + + diff --git a/oss/vtiger/trunk/modules/Users/populatetemplate.php b/oss/vtiger/trunk/modules/Users/populatetemplate.php new file mode 100644 index 00000000..68c6904e --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/populatetemplate.php @@ -0,0 +1,100 @@ +pquery($sql, array($_REQUEST["templateid"])); +$tempArray = $adb->fetch_array($tempresult); +$fileContent = $tempArray["body"]; + +checkFileAccess($root_directory.'/modules/Emails/templates/'.$_REQUEST["templatename"]); +$handle = fopen($root_directory.'/modules/Emails/templates/'.$_REQUEST["templatename"],"wb") ; +fwrite($handle,$fileContent,89999999); +fclose($handle); + +//create a file and write to it so that it can be used as the emailtemplateusage.php file + +if (is_file($root_directory.'/modules/Emails/templates/testemailtemplateusage.php')) { + $is_writable = is_writable($root_directory.'/modules/Emails/templates/testemailtemplateusage.php'); +} else { + $is_writable = is_writable('.'); +} + +$myString = "retrieve_entity_info($recordid,$module); + +$i=0; +$m=0; +$n=0; +$myString; + +//storing the columnname and the value pairs +foreach ($focus->column_fields as $columnName=>$value) { + $myString .= "$" .$module ."_" .$columnName.' = "'. $value."\";\n\n"; + $colName[$i] = $columnName; + $i++; + $j=$i; +} + +global $current_user; +global $adb; +$query = 'select * from vtiger_users where id= ?'; +$result = $adb->pquery($query, array($current_user->id)); +$res_row = $adb->fetchByAssoc($result); +foreach ($res_row as $columnName=>$value) { + $myString .='$users_' .$columnName.' = "'. $value."\";\n\n"; + $usercolName[$n] = $columnName; + $n++; + $m=$n; +} + +$myString .= "\$globals = \""; + +for($i=0;$i<$j-1;$i++) { + $myString .= "\\$" .$module ."_" .$colName[$i].", "; +} +for($n=0;$n<$m;$n++) { + $myString .= '\\$users_' .$usercolName[$n].", "; +} + +$myString .= "\\$" .$module ."_" .$colName[$i]; +$myString .="\"; \n\n"; + +$myString .= "?> \n"; +if ($is_writable && ($config_file = @ fopen($root_directory.'/modules/Emails/templates/testemailtemplateusage.php', "w"))) { + $log->debug("writing to the testemailtemplatuseage.php file"); + fputs($config_file, $myString, strlen($myString)); + fclose($config_file); +} +checkFileAccess($root_directory.'/modules/Emails/templates/'.$_REQUEST["templatename"]); +$templatename = $root_directory.'/modules/Emails/templates/'.$_REQUEST["templatename"]; +header("Location:index.php?module=Users&action=TemplateMerge&templatename=".$templatename); + +?> + diff --git a/oss/vtiger/trunk/modules/Users/updateLeadDBStatus.php b/oss/vtiger/trunk/modules/Users/updateLeadDBStatus.php new file mode 100644 index 00000000..649de193 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/updateLeadDBStatus.php @@ -0,0 +1,104 @@ +pquery($del_act,array($id, $id)); + if($_REQUEST['owner_type'] == 'User') { + $count_r = $adb->pquery("select * from vtiger_salesmanactivityrel where smid=? and activityid=?",array($idval, $id)); + if($adb->num_rows($count_r) == 0) { + $insert = "insert into vtiger_salesmanactivityrel values(?,?)"; + $result = $adb->pquery($insert, array($idval, $id)); + } + } + } + //Now we have to update the smownerid + $sql = "update vtiger_crmentity set modifiedby=?, smownerid=?, modifiedtime=? where crmid=?"; + $result = $adb->pquery($sql, array($current_user->id, $idval, $adb->formatDate($date_var, true), $id)); + } + else + { + $ids_list[] = $id; + } + } +} +elseif(isset($_REQUEST['leadval']) && $_REQUEST['leadval']!='') +{ + + foreach($storearray as $id) + { + if(isPermitted($return_module,'EditView',$id) == 'yes') + { + if($id != '') { + $sql = "update vtiger_leaddetails set leadstatus=? where leadid=?"; + $result = $adb->pquery($sql, array($leadstatusval, $id)); + $query = "update vtiger_crmentity set modifiedby=?, modifiedtime=? where crmid=?"; + $result1 = $adb->pquery($query, array($current_user->id, $adb->formatDate($date_var, true), $id)); + } + } + else + { + $ids_list[] = $id; + } + + } +} +if(count($ids_list) > 0) { + $ret_owner = getEntityName($return_module,$ids_list); + $errormsg = implode(',',$ret_owner); +} else { + $errormsg = ''; +} +if($return_action == 'ActivityAjax') { + $view = vtlib_purify($_REQUEST['view']); + $day = vtlib_purify($_REQUEST['day']); + $month = vtlib_purify($_REQUEST['month']); + $year = vtlib_purify($_REQUEST['year']); + $type = vtlib_purify($_REQUEST['type']); + $viewOption = vtlib_purify($_REQUEST['viewOption']); + $subtab = vtlib_purify($_REQUEST['subtab']); + + header("Location: index.php?module=$return_module&action=".$return_action."&type=".$type.$rstart."&view=".$view."&day=".$day."&month=".$month."&year=".$year."&viewOption=".$viewOption."&subtab=".$subtab.$url); +} else { + header("Location: index.php?module=$return_module&action=".$return_module."Ajax&file=ListView&ajax=changestate".$rstart."&viewname=".$viewid."&errormsg=".$errormsg.$url); +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Users/updateNotificationSchedulers.php b/oss/vtiger/trunk/modules/Users/updateNotificationSchedulers.php new file mode 100644 index 00000000..55a000e5 --- /dev/null +++ b/oss/vtiger/trunk/modules/Users/updateNotificationSchedulers.php @@ -0,0 +1,47 @@ +pquery($sql, array($flag, $i)); +} + +header("Location:index.php?module=Users&action=listnotificationschedulers"); + + + + + +?> diff --git a/oss/vtiger/trunk/modules/Utilities/Calculator.php b/oss/vtiger/trunk/modules/Utilities/Calculator.php new file mode 100644 index 00000000..54d87743 --- /dev/null +++ b/oss/vtiger/trunk/modules/Utilities/Calculator.php @@ -0,0 +1,30 @@ +assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGEPATH",$image_path); +$smarty->assign("CALC",get_calc($image_path)); +$smarty->display("Calculator.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Utilities/Clock.php b/oss/vtiger/trunk/modules/Utilities/Clock.php new file mode 100644 index 00000000..221bcca0 --- /dev/null +++ b/oss/vtiger/trunk/modules/Utilities/Clock.php @@ -0,0 +1,27 @@ +assign("THEME", $theme); +$smarty->assign("IMAGEPATH",$image_path); +$smarty->display("Clock.tpl"); +?> diff --git a/oss/vtiger/trunk/modules/Utilities/Currencies.php b/oss/vtiger/trunk/modules/Utilities/Currencies.php new file mode 100644 index 00000000..73f393b1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Utilities/Currencies.php @@ -0,0 +1,132 @@ + array('ALL' ,'Lek'), + 'Argentina, Pesos' => array('ARS' ,'$'), + 'Aruba, Guilders' => array('AWG' ,'ƒ'), + 'Australia, Dollars' => array('AUD' ,'$'), + 'Azerbaijan, New Manats' => array('AZN' ,'ман'), + 'Bahamas, Dollars' => array('BSD' ,'$'), + 'Bahrain, Dinar'=>array('BHD','BD'), + 'Barbados, Dollars' => array('BBD' ,'$'), + 'Belarus, Rubles' => array('BYR' ,'p.'), + 'Belize, Dollars' => array('BZD' ,'BZ$'), + 'Bermuda, Dollars' => array('BMD' ,'$'), + 'Bolivia, Bolivianos' => array('BOB' ,'$b'), + 'Convertible Marka' => array('BAM' ,'KM'), + 'Botswana, Pulas' => array('BWP' ,'P'), + 'Bulgaria, Leva' => array('BGN' ,'лв'), + 'Brazil, Reais' => array('BRL' ,'R$'), + 'Great Britain Pounds' => array('GBP' ,'£'), + 'Brunei Darussalam, Dollars' => array('BND' ,'$'), + 'Canada, Dollars'=>array('CAD','$'), + 'Cayman Islands, Dollars'=>array('KYD','$'), + 'Chile, Pesos'=>array('CLP','$'), + 'Colombia, Pesos'=>array('COP','$'), + 'Costa Rica, Colón'=>array('CRC','₡'), + 'Croatia, Kuna'=>array('HRK','kn'), + 'Cuba, Pesos'=>array('CUP','₱'), + 'Czech Republic, Koruny'=>array('CZK','Kč'), + 'Denmark, Kroner'=>array('DKK','kr'), + 'Dominican Republic, Pesos'=>array('DOP','RD$'), + 'East Caribbean, Dollars'=>array('XCD','$'), + 'Egypt, Pounds'=>array('EGP','£'), + 'El Salvador, Colones'=>array('SVC','$'), + 'England, Pounds'=>array('GBP','£'), + 'Estonia, Krooni'=>array('EEK','kr'), + 'Euro'=>array('EUR','€'), + 'Falkland Islands, Pounds'=>array('FKP','£'), + 'Fiji, Dollars'=>array('FJD','$'), + 'Ghana, Cedis'=>array('GHC','¢'), + 'Gibraltar, Pounds'=>array('GIP','£'), + 'Guatemala, Quetzales'=>array('GTQ','Q'), + 'Guernsey, Pounds'=>array('GGP','£'), + 'Guyana, Dollars'=>array('GYD','$'), + 'Honduras, Lempiras'=>array('HNL','L'), + 'LvHong Kong, Dollars '=>array('HKD','HK$'), + 'Hungary, Forint'=>array('HUF','Ft'), + 'Iceland, Krona'=>array('ISK','kr'), + 'India, Rupees'=>array('INR','₨'), + 'Indonesia, Rupiahs'=>array('IDR','Rp'), + 'Iran, Rials'=>array('IRR','﷼'), + 'Isle of Man, Pounds'=>array('IMP','£'), + 'Israel, New Shekels'=>array('ILS','₪'), + 'Jamaica, Dollars'=>array('JMD','J$'), + 'Japan, Yen'=>array('JPY','¥'), + 'Jersey, Pounds'=>array('JEP','£'), + 'Kazakhstan, Tenge'=>array('KZT','лв'), + 'Korea (North), Won'=>array('KPW','₩'), + 'Korea (South), Won'=>array('KRW','₩'), + 'Kyrgyzstan, Soms'=>array('KGS','лв'), + 'Laos, Kips'=>array('LAK','₭'), + 'Latvia, Lati'=>array('LVL','Ls'), + 'Lebanon, Pounds'=>array('LBP','£'), + 'Liberia, Dollars'=>array('LRD','$'), + 'Switzerland Francs'=>array('CHF','CHF'), + 'Lithuania, Litai'=>array('LTL','Lt'), + 'Macedonia, Denars'=>array('MKD','ден'), + 'Malaysia, Ringgits'=>array('MYR','RM'), + 'Mauritius, Rupees'=>array('MUR','₨'), + 'Mexico, Pesos'=>array('MXN','$'), + 'Mongolia, Tugriks'=>array('MNT','₮'), + 'Mozambique, Meticais'=>array('MZN','MT'), + 'Namibia, Dollars'=>array('NAD','$'), + 'Nepal, Rupees'=>array('NPR','₨'), + 'Netherlands Antilles, Guilders'=>array('ANG','ƒ'), + 'New Zealand, Dollars'=>array('NZD','$'), + 'Nicaragua, Cordobas'=>array('NIO','C$'), + 'Nigeria, Nairas'=>array('NGN','₦'), + 'North Korea, Won'=>array('KPW','₩'), + 'Norway, Krone'=>array('NOK','kr'), + 'Oman, Rials'=>array('OMR','﷼'), + 'Pakistan, Rupees'=>array('PKR','₨'), + 'Panama, Balboa'=>array('PAB','B/.'), + 'Paraguay, Guarani'=>array('PYG','Gs'), + 'Peru, Nuevos Soles'=>array('PEN','S/.'), + 'Philippines, Pesos'=>array('PHP','Php'), + 'Poland, Zlotych'=>array('PLN','zł'), + 'Romania, New Lei'=>array('RON','lei'), + 'Russia, Rubles'=>array('RUB','руб'), + 'Saint Helena, Pounds'=>array('SHP','£'), + 'Saudi Arabia, Riyals'=>array('SAR','﷼'), + 'Serbia, Dinars'=>array('RSD','Дин.'), + 'Seychelles, Rupees'=>array('SCR','₨'), + 'Singapore, Dollars'=>array('SGD','$'), + 'Solomon Islands, Dollars'=>array('SBD','$'), + 'Somalia, Shillings'=>array('SOS','S'), + 'South Africa, Rand'=>array('ZAR','R'), + 'South Korea, Won'=>array('KRW','₩'), + 'Sri Lanka, Rupees'=>array('LKR','₨'), + 'Sweden, Kronor'=>array('SEK','kr'), + 'Switzerland, Francs'=>array('CHF','CHF'), + 'Suriname, Dollars'=>array('SRD','$'), + 'Syria, Pounds'=>array('SYP','£'), + 'Taiwan, New Dollars'=>array('TWD','NT$'), + 'Thailand, Baht'=>array('THB','฿'), + 'Trinidad and Tobago, Dollars'=>array('TTD','TT$'), + 'Turkey, New Lira'=>array('TRY','YTL'), + 'Turkey, Liras'=>array('TRL','₤'), + 'Tuvalu, Dollars'=>array('TVD','$'), + 'Ukraine, Hryvnia'=>array('UAH','₴'), + 'United Kingdom, Pounds'=>array('GBP','£'), + 'USA, Dollars' => array('USD' ,'$'), + 'Uruguay, Pesos'=>array('UYU','$U'), + 'Uzbekistan, Sums'=>array('UZS','лв'), + 'Venezuela, Bolivares Fuertes'=>array('VEF','Bs'), + 'Vietnam, Dong'=>array('VND','₫'), + 'Zimbabwe Dollars'=>array('ZWD','Z$'), + ); +/* + 'China, Yuan Renminbi'=>array('SAR','﷼'), + 'Afghanistan, Afghanis'=>array('SAR','﷼'), + 'Cambodia, Riels'=>array('SAR','﷼'), +*/ +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Utilities/Merge.php b/oss/vtiger/trunk/modules/Utilities/Merge.php new file mode 100644 index 00000000..35890b4c --- /dev/null +++ b/oss/vtiger/trunk/modules/Utilities/Merge.php @@ -0,0 +1,88 @@ + + +pquery($sql, array($mergeFileName)); +$temparray = $adb->fetch_array($result); + +$fileContent = $temparray['data']; +$filename=html_entity_decode($temparray['filename'], ENT_QUOTES, $default_charset); +// Fix For: http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/2107 +$filename= $randomfilename . "_word.doc"; + +$filesize=$temparray['filesize']; +$wordtemplatedownloadpath =$_SERVER['DOCUMENT_ROOT'] ."/test/wordtemplatedownload/"; +checkFileAccess($wordtemplatedownloadpath); +$handle = fopen($wordtemplatedownloadpath .$filename,"wb") ; +fwrite($handle,base64_decode($fileContent),$filesize); +fclose($handle); + + +$query = "SELECT * FROM " .$adb->sql_escape_string($_REQUEST["module"]) ." WHERE id = ?"; +$result = $adb->pquery($query, array($_REQUEST['record'])); + +$y=$adb->num_fields($result); + +for ($x=0; $x<$y; $x++) +{ + $columnNames[$x] = "CONTACT_".strtoupper($adb->field_name($result, $x)); +} + +$columnValues = $adb->fetch_array($result); +for ($x=0; $x<$y; $x++) +{ + $columnValString[$x] = $columnValues[$x]; +} + +$columnString = implode(",",$columnNames); +$columnValString = implode(",",$columnValString); + +echo""; +?> + +/modules/Settings/vtigerVM.CAB#Version1,0,0,1" +id="objMMPage" classid="clsid:42C50C38-1984-4393-A736-890357E7112B" width=0 height=0> + + + + diff --git a/oss/vtiger/trunk/modules/Utilities/UtilitiesAjax.php b/oss/vtiger/trunk/modules/Utilities/UtilitiesAjax.php new file mode 100644 index 00000000..e12e4ba8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Utilities/UtilitiesAjax.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Utilities/language/en_us.lang.php b/oss/vtiger/trunk/modules/Utilities/language/en_us.lang.php new file mode 100644 index 00000000..57d771c3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Utilities/language/en_us.lang.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Utilities/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/Utilities/language/zh_cn.lang.php new file mode 100644 index 00000000..57d771c3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Utilities/language/zh_cn.lang.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Vendors/CallRelatedList.php b/oss/vtiger/trunk/modules/Vendors/CallRelatedList.php new file mode 100644 index 00000000..169f8061 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/CallRelatedList.php @@ -0,0 +1,75 @@ +retrieve_entity_info($RECORD,$currentmodule); + $focus->id = $RECORD; + $focus->name=$focus->column_fields['vendorname']; + $log->debug("Vendor id =".$focus->id); + $log->debug("Vendor name =".$focus->name); + } + if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') { + $focus->id = ""; + } + + $related_array=getRelatedLists($currentmodule,$focus); + + global $mod_strings; + global $app_strings; + global $theme, $currentModule; + $theme_path="themes/".$theme."/"; + $image_path=$theme_path."images/"; + + $smarty = new vtigerCRM_Smarty; + + $smarty->assign("CATEGORY",$category); + + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] != ' ') { + $smarty->assign("OP_MODE",vtlib_purify($_REQUEST['mode'])); + } + if(isset($focus->name)) + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("NAME", $focus->name); + $smarty->assign("ID",$focus->id); + + // Module Sequence Numbering + $mod_seq_field = getModuleSequenceField($currentModule); + if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; + } else { + $mod_seq_id = $focus->id; + } + $smarty->assign('MOD_SEQ_ID', $mod_seq_id); + // END + + $smarty->assign("MODULE",$currentModule); + $smarty->assign("SINGLE_MOD",$app_strings['Vendor']); + $smarty->assign("RELATEDLISTS", $related_array); + $smarty->assign("MOD",$mod_strings); + $smarty->assign("APP",$app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + + $check_button = Button_Check($module); + $smarty->assign("CHECK", $check_button); + $smarty->display("RelatedLists.tpl"); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/CustomView.php b/oss/vtiger/trunk/modules/Vendors/CustomView.php new file mode 100644 index 00000000..93231ed6 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/CustomView.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Vendors/Delete.php b/oss/vtiger/trunk/modules/Vendors/Delete.php new file mode 100644 index 00000000..a2ee6241 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/Delete.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/DetailView.php b/oss/vtiger/trunk/modules/Vendors/DetailView.php new file mode 100644 index 00000000..97d350ed --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/DetailView.php @@ -0,0 +1,105 @@ +retrieve_entity_info($_REQUEST['record'],"Vendors"); + $focus->id = $_REQUEST['record']; + $focus->name = $focus->column_fields['vendorname']; +} + +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; +} + +global $app_strings,$mod_strings,$theme,$currentModule,$singlepane_view; + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty = new vtigerCRM_Smarty; +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +if(isset($focus->name)) + $smarty->assign("NAME", $focus->name); + +$smarty->assign("BLOCKS", getBlocks($currentModule,"detail_view",'',$focus->column_fields)); + +$smarty->assign("CUSTOMFIELD", $cust_fld); + +if(isPermitted("Vendors","VendorEditView",$_REQUEST['record']) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); +if(isPermitted("Vendors","DeleteVendor",$_REQUEST['record']) == 'yes') + $smarty->assign("DELETE","permitted"); + + +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$smarty->assign("UPDATEINFO",updateInfo($focus->id)); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); +$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); +$smarty->assign("ID", vtlib_purify($_REQUEST['record'])); + +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if ($mod_seq_field != null) { + $mod_seq_id = $focus->column_fields[$mod_seq_field['name']]; +} else { + $mod_seq_id = $focus->id; +} +$smarty->assign('MOD_SEQ_ID', $mod_seq_id); +// END + +$smarty->assign("MODULE", $currentModule); +$smarty->assign("SINGLE_MOD", 'Vendor'); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); + +$tabid = getTabid("Vendors"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); +$smarty->assign("EDIT_PERMISSION",isPermitted($currentModule,'EditView',$_REQUEST['record'])); + +$smarty->assign("IS_REL_LIST",isPresentRelatedLists($currentModule)); + +if($singlepane_view == 'true') +{ + $related_array = getRelatedLists($currentModule,$focus); + $smarty->assign("RELATEDLISTS", $related_array); +} + +$smarty->assign("SinglePane_View", $singlepane_view); + +if(PerformancePrefs::getBoolean('DETAILVIEW_RECORD_NAVIGATION', true) && isset($_SESSION[$currentModule.'_listquery'])){ + $recordNavigationInfo = ListViewSession::getListViewNavigation($focus->id); + VT_detailViewNavigation($smarty,$recordNavigationInfo,$focus->id); +} +// Record Change Notification +$focus->markAsViewed($current_user->id); +// END + +$smarty->assign('DETAILVIEW_AJAX_EDIT', PerformancePrefs::getBoolean('DETAILVIEW_AJAX_EDIT', true)); + +$smarty->display("Inventory/InventoryDetailView.tpl"); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/DetailViewAjax.php b/oss/vtiger/trunk/modules/Vendors/DetailViewAjax.php new file mode 100644 index 00000000..5e738f39 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/DetailViewAjax.php @@ -0,0 +1,45 @@ +retrieve_entity_info($crmid,"Vendors"); + $modObj->column_fields[$fieldname] = $fieldvalue; + $modObj->id = $crmid; + $modObj->mode = "edit"; + $modObj->save("Vendors"); + if($modObj->id != "") + { + echo ":#:SUCCESS"; + }else + { + echo ":#:FAILURE"; + } + }else + { + echo ":#:FAILURE"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/EditView.php b/oss/vtiger/trunk/modules/Vendors/EditView.php new file mode 100644 index 00000000..d0a1d8df --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/EditView.php @@ -0,0 +1,127 @@ +assign("SEARCH", $searchurl); +//4600 ends + +if(isset($_REQUEST['record']) && $_REQUEST['record'] != '') +{ + $focus->id = $_REQUEST['record']; + $focus->mode = 'edit'; + $focus->retrieve_entity_info($_REQUEST['record'],"Vendors"); + $focus->name = $focus->column_fields['vendorname']; +} +if(isset($_REQUEST['isDuplicate']) && $_REQUEST['isDuplicate'] == 'true') +{ + $focus->id = ""; + $focus->mode = ''; +} +if(empty($_REQUEST['record']) && $focus->mode != 'edit'){ + setObjectValuesFromRequest($focus); +} + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; + +$disp_view = getView($focus->mode); +if($disp_view == 'edit_view') + $smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +else +{ + $bas_block = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'BAS'); + $adv_block = getBlocks($currentModule,$disp_view,$mode,$focus->column_fields,'ADV'); + + $blocks['basicTab'] = $bas_block; + if(is_array($adv_block )) + $blocks['moreTab'] = $adv_block; + + $smarty->assign("BLOCKS",$blocks); + $smarty->assign("BLOCKS_COUNT",count($blocks)); +} +$smarty->assign("OP_MODE",$disp_view); + +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Vendor'); + +$smarty->assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); + +$smarty->assign("ID", $focus->id); +if(isset($focus->name)) + $smarty->assign("NAME", $focus->name); + +if(isset($cust_fld)) +{ + $smarty->assign("CUSTOMFIELD", $cust_fld); +} + +$smarty->assign("CALENDAR_LANG", $app_strings['LBL_JSCALENDAR_LANG']); +$smarty->assign("CALENDAR_DATEFORMAT", parse_calendardate($app_strings['NTC_DATE_FORMAT'])); +if($focus->mode == 'edit') +{ + $smarty->assign("UPDATEINFO",updateInfo($focus->id)); + $smarty->assign("MODE", $focus->mode); +} + +if(isset($_REQUEST['return_module'])) $smarty->assign("RETURN_MODULE", vtlib_purify($_REQUEST['return_module'])); +if(isset($_REQUEST['return_action'])) $smarty->assign("RETURN_ACTION", vtlib_purify($_REQUEST['return_action'])); +if(isset($_REQUEST['return_id'])) $smarty->assign("RETURN_ID", vtlib_purify($_REQUEST['return_id'])); +if(isset($_REQUEST['return_viewname'])) $smarty->assign("RETURN_VIEWNAME", vtlib_purify($_REQUEST['return_viewname'])); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path);$smarty->assign("PRINT_URL", "phprint.php?jt=".session_id().$GLOBALS['request_string']); + +$tabid = getTabid("Vendors"); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$data = split_validationdataArray($validationData); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); +$smarty->assign("VALIDATION_DATA_FIELDNAME",$data['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$data['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$data['fieldlabel']); + +$check_button = Button_Check($module); +$smarty->assign("CHECK", $check_button); +$smarty->assign("DUPLICATE",vtlib_purify($_REQUEST['isDuplicate'])); + +global $adb; +// Module Sequence Numbering +$mod_seq_field = getModuleSequenceField($currentModule); +if($focus->mode != 'edit' && $mod_seq_field != null) { + $autostr = getTranslatedString('MSG_AUTO_GEN_ON_SAVE'); + $mod_seq_string = $adb->pquery("SELECT prefix, cur_id from vtiger_modentity_num where semodule = ? and active=1",array($currentModule)); + $mod_seq_prefix = $adb->query_result($mod_seq_string,0,'prefix'); + $mod_seq_no = $adb->query_result($mod_seq_string,0,'cur_id'); + if($adb->num_rows($mod_seq_string) == 0 || $focus->checkModuleSeqNumber($focus->table_name, $mod_seq_field['column'], $mod_seq_prefix.$mod_seq_no)) + echo '
      '. getTranslatedString('LBL_DUPLICATE'). ' '. getTranslatedString($mod_seq_field['label']) + .' - '. getTranslatedString('LBL_CLICK') .' '.getTranslatedString('LBL_HERE').' ' + . getTranslatedString('LBL_TO_CONFIGURE'). ' '. getTranslatedString($mod_seq_field['label']) .''; + else + $smarty->assign("MOD_SEQ_ID",$autostr); +} else { + $smarty->assign("MOD_SEQ_ID", $focus->column_fields[$mod_seq_field['name']]); +} +// END + + +if($focus->mode == 'edit') + $smarty->display('Inventory/InventoryEditView.tpl'); +else + $smarty->display('Inventory/InventoryCreateView.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/ExportRecords.php b/oss/vtiger/trunk/modules/Vendors/ExportRecords.php new file mode 100644 index 00000000..f2714fa3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/ExportRecords.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Vendors/FindDuplicateRecords.php b/oss/vtiger/trunk/modules/Vendors/FindDuplicateRecords.php new file mode 100644 index 00000000..74ad2c8d --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/FindDuplicateRecords.php @@ -0,0 +1,107 @@ +pquery($sql, array($id)); + DeleteEntity($req_module,$return_module,$focus,$id,""); + } + else { + $ids_list[] = $id; + } +} + if(count($ids_list) > 0) { + $ret = getEntityName($req_module,$ids_list); + if(count($ret) > 0) + { + $errormsg = implode(',',$ret); + } + echo "
      "; + echo "
      + + + + + + + + + +
      + $app_strings[LBL_DUP_PERMISSION] $req_module $errormsg
      + $app_strings[LBL_GO_BACK]
      +
      +
      "; + echo "
      "; + exit; + } +} + +include("include/saveMergeCriteria.php"); +$ret_arr=getDuplicateRecordsArr($req_module); + +$fld_values=$ret_arr[0]; +$total_num_group=count($fld_values); +$fld_name=$ret_arr[1]; +$ui_type=$ret_arr[2]; + +$smarty->assign("NAVIGATION",$ret_arr["navigation"]);//Added for page navigation +$smarty->assign("MODULE",$req_module); +$smarty->assign("NUM_GROUP",$total_num_group); +$smarty->assign("FIELD_NAMES",$fld_name); +$smarty->assign("CATEGORY",$parenttab); +$smarty->assign("ALL_VALUES",$fld_values); +if(isPermitted($req_module,'Delete','') == 'yes') + $button_del = $app_strings['LBL_MASS_DELETE']; +$smarty->assign("DELETE",$button_del); + +$smarty->assign("MOD", return_module_language($current_language,$req_module)); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("APP", $app_strings); +$smarty->assign("CMOD", $mod_strings); +$smarty->assign("MODE",'view'); +if(isset($_REQUEST['button_view'])) +{ + $smarty->assign("VIEW",'true'); +} +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("FindDuplicateAjax.tpl"); +else + $smarty->display('FindDuplicateDisplay.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/Import.php b/oss/vtiger/trunk/modules/Vendors/Import.php new file mode 100644 index 00000000..7a1102d4 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/Import.php @@ -0,0 +1,16 @@ + + diff --git a/oss/vtiger/trunk/modules/Vendors/ListView.php b/oss/vtiger/trunk/modules/Vendors/ListView.php new file mode 100644 index 00000000..3a059b46 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/ListView.php @@ -0,0 +1,237 @@ +assign("MOD", $mod_strings); +$smarty->assign("APP", $app_strings); +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH",$image_path); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("SINGLE_MOD",'Vendor'); +$category = getParentTab(); +$smarty->assign("CATEGORY",$category); + +$focus = new Vendors(); +// Initialize sort by fields +$focus->initSortbyField('Vendors'); +// END +$other_text = Array(); + +if(!$_SESSION['lvs'][$currentModule]) +{ + unset($_SESSION['lvs']); + $modObj = new ListViewSession(); + $modObj->sorder = $sorder; + $modObj->sortby = $order_by; + $_SESSION['lvs'][$currentModule] = get_object_vars($modObj); +} + +if($_REQUEST['errormsg'] != '') +{ + $errormsg = vtlib_purify($_REQUEST['errormsg']); + $smarty->assign("ERROR","The User does not have permission to delete ".$errormsg." ".$currentModule); +}else +{ + $smarty->assign("ERROR",""); +} +if (!isset($where)) $where = ""; + +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> +if($_REQUEST['order_by'] != '') + $order_by = $adb->sql_escape_string($_REQUEST['order_by']); +else + $order_by = (($_SESSION['VENDORS_ORDER_BY'] != '')?($_SESSION['VENDORS_ORDER_BY']):($focus->default_order_by)); + +if($_REQUEST['sorder'] != '') + $sorder = $adb->sql_escape_string($_REQUEST['sorder']); +else + $sorder = (($_SESSION['VENDORS_SORT_ORDER'] != '')?($_SESSION['VENDORS_SORT_ORDER']):($focus->default_sort_order)); + +$_SESSION['VENDORS_ORDER_BY'] = $order_by; +$_SESSION['VENDORS_SORT_ORDER'] = $sorder; +//<<<<<<<<<<<<<<<<<<< sorting - stored in session >>>>>>>>>>>>>>>>>>>> + +if(isset($_REQUEST['query']) && $_REQUEST['query'] != '' && $_REQUEST['query'] == 'true') +{ + list($where, $ustring) = split("#@@#",getWhereCondition($currentModule)); + // we have a query + $url_string .="&query=true".$ustring; + $log->info("Here is the where clause for the list view: $where"); + $smarty->assign("SEARCH_URL",$url_string); + +} + +//<<<>>>>>> +$oCustomView = new CustomView("Vendors"); +$viewid = $oCustomView->getViewId($currentModule); +$customviewcombo_html = $oCustomView->getCustomViewCombo($viewid); +$viewnamedesc = $oCustomView->getCustomViewByCvid($viewid); + +//Added to handle approving or denying status-public by the admin in CustomView +$statusdetails = $oCustomView->isPermittedChangeStatus($viewnamedesc['status']); +$smarty->assign("CUSTOMVIEW_PERMISSION",$statusdetails); + +//To check if a user is able to edit/delete a customview +$edit_permit = $oCustomView->isPermittedCustomView($viewid,'EditView',$currentModule); +$delete_permit = $oCustomView->isPermittedCustomView($viewid,'Delete',$currentModule); +$smarty->assign("CV_EDIT_PERMIT",$edit_permit); +$smarty->assign("CV_DELETE_PERMIT",$delete_permit); + +//<<<<>>>> + +// Buttons and View options +if(isPermitted('Vendors','DeleteVendor','') == 'yes') +{ + $other_text['del'] = $app_strings[LBL_MASS_DELETE]; +} +if(isPermitted('Vendors','EditView','') == 'yes') + $other_text['mass_edit'] = $app_strings[LBL_MASS_EDIT]; + +if($viewnamedesc['viewname'] == 'All') +{ + $smarty->assign("ALL", 'All'); +} +if($viewid ==0) +{ + echo "
      "; + echo "
      + + + + + + + + + +
      $app_strings[LBL_PERMISSION]
      + $app_strings[LBL_GO_BACK]
      +
      +
      "; + echo "
      "; + exit; +} + + +//Retreive the list from Database +//<<<<<<<<>>>>>>>> +if($viewid != "0") +{ + $listquery = getListQuery("Vendors"); + $list_query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,"Vendors"); +}else +{ + $list_query = getListQuery("Vendors"); +} +//<<<<<<<>>>>>>>> + +if(isset($where) && $where != '') +{ + $list_query .= ' and '.$where; + $_SESSION['export_where'] = $where; +} +else + unset($_SESSION['export_where']); + + +if(isset($order_by) && $order_by != '') +{ + $tablename = getTableNameForField('Vendors',$order_by); + $tablename = (($tablename != '')?($tablename."."):''); + + if( $adb->dbType == "pgsql") + $list_query .= ' GROUP BY '.$tablename.$order_by; + + $list_query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder; +} + +//Postgres 8 fixes +if( $adb->dbType == "pgsql") + $list_query = fixPostgresQuery( $list_query, $log, 0); + +if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true){ + $count_result = $adb->query( mkCountQuery( $list_query)); + $noofrows = $adb->query_result($count_result,0,"count"); +}else{ + $noofrows = null; +} + +$queryMode = (isset($_REQUEST['query']) && $_REQUEST['query'] == 'true'); +$start = ListViewSession::getRequestCurrentPage($currentModule, $list_query, $viewid, $queryMode); + +$navigation_array = VT_getSimpleNavigationValues($start,$list_max_entries_per_page,$noofrows); + +$limit_start_rec = ($start-1) * $list_max_entries_per_page; + +if( $adb->dbType == "pgsql") + $list_result = $adb->pquery($list_query. " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); +else + $list_result = $adb->pquery($list_query. " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); + +$recordListRangeMsg = getRecordRangeMessage($list_result, $limit_start_rec); +$smarty->assign('recordListRange',$recordListRangeMsg); + +//Retreive the List View Table Header +if($viewid !='') +$url_string .="&viewname=".$viewid; + +$listview_header = getListViewHeader($focus,"Vendors",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("LISTHEADER", $listview_header); + +$listview_header_search = getSearchListHeaderValues($focus,"Vendors",$url_string,$sorder,$order_by,"",$oCustomView); +$smarty->assign("SEARCHLISTHEADER",$listview_header_search); + +$listview_entries = getListViewEntries($focus,"Vendors",$list_result,$navigation_array,'','&return_module=Vendors&return_action=index','EditView','Delete',$oCustomView); +$smarty->assign("LISTENTITY", $listview_entries); + +$smarty->assign("AVALABLE_FIELDS", getMergeFields($currentModule,"available_fields")); +$smarty->assign("FIELDS_TO_MERGE", getMergeFields($currentModule,"fileds_to_merge")); + +//Added to select Multiple records in multiple pages +$smarty->assign("SELECTEDIDS", vtlib_purify($_REQUEST['selobjs'])); +$smarty->assign("ALLSELECTEDIDS", vtlib_purify($_REQUEST['allselobjs'])); +$smarty->assign("CURRENT_PAGE_BOXES", implode(array_keys($listview_entries),";")); + +$smarty->assign("CUSTOMVIEW_OPTION",$customviewcombo_html); +$smarty->assign("VIEWID", $viewid); +$navigationOutput = getTableHeaderSimpleNavigation($navigation_array, $url_string,"Vendors","index",$viewid); +$alphabetical = AlphabeticalSearch($currentModule,'index','vendorname','true','basic',"","","","",$viewid); +$fieldnames = getAdvSearchfields($currentModule); +$criteria = getcriteria_options(); +$smarty->assign("CRITERIA", $criteria); +$smarty->assign("FIELDNAMES", $fieldnames); +$smarty->assign("ALPHABETICAL", $alphabetical); +$smarty->assign("NAVIGATION", $navigationOutput); +$smarty->assign("RECORD_COUNTS", $record_string); +$smarty->assign("BUTTONS", $other_text); + +$check_button = Button_Check($currentModule); +$smarty->assign("CHECK", $check_button); + +$_SESSION[$currentModule.'_listquery'] = $list_query; + +if(isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') + $smarty->display("ListViewEntries.tpl"); +else + $smarty->display("ListView.tpl"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/ListViewPagging.php b/oss/vtiger/trunk/modules/Vendors/ListViewPagging.php new file mode 100644 index 00000000..333f1768 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/ListViewPagging.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/MassEdit.php b/oss/vtiger/trunk/modules/Vendors/MassEdit.php new file mode 100644 index 00000000..348dab37 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/MassEdit.php @@ -0,0 +1,45 @@ +mode = ''; +$mode = 'mass_edit'; +$disp_view = getView($focus->mode); + +$smarty = new vtigerCRM_Smarty; +$smarty->assign("BLOCKS",getBlocks($currentModule,$disp_view,$mode,$focus->column_fields)); +$smarty->assign("IDS",$_REQUEST['idstring']); +$smarty->assign("MASS_EDIT","1"); +$smarty->assign("MODULE",$currentModule); +$smarty->assign("APP",$app_strings); +$smarty->assign("CATEGORY",getParentTab()); + +$theme_path="themes/".$theme."/"; +$image_path=$theme_path."images/"; +$smarty->assign("THEME", $theme); +$smarty->assign("IMAGE_PATH", $image_path); + +// Field Validation Information +$tabid = getTabid($currentModule); +$validationData = getDBValidationData($focus->tab_name,$tabid); +$validationArray = split_validationdataArray($validationData); + +$smarty->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']); +$smarty->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']); +$smarty->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']); + +$smarty->display('MassEditForm.tpl'); + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/MassEditSave.php b/oss/vtiger/trunk/modules/Vendors/MassEditSave.php new file mode 100644 index 00000000..c587e5fc --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/MassEditSave.php @@ -0,0 +1,68 @@ +retrieve_entity_info($recordid, $currentModule); + $focus->mode = 'edit'; + $focus->id = $recordid; + foreach($focus->column_fields as $fieldname => $val) + { + if(isset($_REQUEST[$fieldname."_mass_edit_check"])) + { + if($fieldname == 'assigned_user_id'){ + if($_REQUEST['assigntype'] == 'U') { + $value = $_REQUEST['assigned_user_id']; + } elseif($_REQUEST['assigntype'] == 'T') { + $value = $_REQUEST['assigned_group_id']; + } + } else { + if(is_array($_REQUEST[$fieldname])) + $value = $_REQUEST[$fieldname]; + else + $value = trim($_REQUEST[$fieldname]); + } + $focus->column_fields[$fieldname] = $value; + } + else{ + $focus->column_fields[$fieldname] = decode_html($focus->column_fields[$fieldname]); + } + } + $focus->save($currentModule); + } + } +} + +$parenttab = getParentTab(); +header("Location: index.php?module=$return_module&action=$return_action&parenttab=$parenttab$rstart"); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/Popup.php b/oss/vtiger/trunk/modules/Vendors/Popup.php new file mode 100644 index 00000000..39b573a1 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/Popup.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/Vendors/ProcessDuplicates.php b/oss/vtiger/trunk/modules/Vendors/ProcessDuplicates.php new file mode 100644 index 00000000..bb5047fa --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/ProcessDuplicates.php @@ -0,0 +1,134 @@ +pquery("SELECT count(*) AS count FROM vtiger_crmentity WHERE crmid=? and deleted=0", array($merge_id)); + $count = $adb->query_result($result,0,'count'); + + if($count > 0) + { + // First, save the primary record + $focus->mode="edit"; + setObjectValuesFromRequest($focus); + $focus->save($module); + $rec_values=$focus->column_fields; + + // Remove the id of primary record from the list of records to be deleted. + $del_value=explode(",",$recordids,-1); + $offset = array_search($merge_id,$del_value); + unset($del_value[$offset]); + + // Transfer the related lists of the records to be deleted, to the primary record's related list + if(method_exists($focus, 'transferRelatedRecords')){ + $focus->transferRelatedRecords($module,$del_value,$merge_id); + } else { + transferRelatedRecords($module,$del_value,$merge_id); + } + + // Delete the records by id specified in the list + foreach($del_value as $value) + { + DeleteEntity($_REQUEST['module'],$_REQUEST['return_module'],$focus,$value,""); + } + } + + ?> + +assign("EDIT_DUPLICATE",""); + if($record_count == 2) { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + else { + if(isPermitted($currentModule,"EditView",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"EditView",$exploded_id[2]) == 'yes' + && isPermitted($currentModule,"Delete",$exploded_id[0]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[1]) == 'yes' && isPermitted($currentModule,"Delete",$exploded_id[2]) == 'yes') + $smarty->assign("EDIT_DUPLICATE","permitted"); + } + + $all_values_array=getRecordValues($exploded_id,$module); + $all_values=$all_values_array[0]; + $js_arr_val=$all_values_array[1]; + $fld_array=$all_values_array[2]; + $js_arr=implode(",",$js_arr_val); + + $imported_records = Array(); + $sql="select bean_id from vtiger_users_last_import where bean_type=? and deleted=0"; + $result = $adb->pquery($sql, array($module)); + $num_rows=$adb->num_rows($result); + $count=0; + for($i=0; $i<$num_rows;$i++) + { + foreach($exploded_id as $value) + if($value == $adb->query_result($result,$i,"bean_id")) + $count++; + array_push($imported_records,$adb->query_result($result,$i,"bean_id")); + } + + if ($record_count == $count) + $no_existing=1; + else + $no_existing=0; + + $smarty->assign("MOD", $mod_strings); + $smarty->assign("APP", $app_strings); + $smarty->assign("RECORD_COUNT",$record_count); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULENAME", $module); + $smarty->assign("PARENT_TAB", $parent_tab); + $smarty->assign("JS_ARRAY", $js_arr); + $smarty->assign("ID_ARRAY", $exploded_id); + $smarty->assign("IDSTRING",$idstring); + $smarty->assign("ALLVALUES", $all_values); + $smarty->assign("FIELD_ARRAY", $fld_array); + $smarty->assign("IMPORTED_RECORDS", $imported_records); + $smarty->assign("NO_EXISTING", $no_existing); + $smarty->display("MergeFields.tpl"); +} + +?> diff --git a/oss/vtiger/trunk/modules/Vendors/QuickCreate.php b/oss/vtiger/trunk/modules/Vendors/QuickCreate.php new file mode 100644 index 00000000..8d5998b8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/QuickCreate.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Vendors/Save.php b/oss/vtiger/trunk/modules/Vendors/Save.php new file mode 100644 index 00000000..694801b3 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/Save.php @@ -0,0 +1,53 @@ +column_fields['assigned_user_id'] = $_REQUEST['assigned_user_id']; +} elseif($_REQUEST['assigntype'] == 'T') { + $focus->column_fields['assigned_user_id'] = $_REQUEST['assigned_group_id']; +} +$focus->save("Vendors"); +$return_id = $focus->id; + +if(isset($_REQUEST['return_module']) && $_REQUEST['return_module'] != "") $return_module = vtlib_purify($_REQUEST['return_module']); +else $return_module = "Vendors"; +if(isset($_REQUEST['return_action']) && $_REQUEST['return_action'] != "") $return_action = vtlib_purify($_REQUEST['return_action']); +else $return_action = "DetailView"; +if(isset($_REQUEST['return_id']) && $_REQUEST['return_id'] != "") $return_id = vtlib_purify($_REQUEST['return_id']); + +//code added for returning back to the current view after edit from list view +if($_REQUEST['return_viewname'] == '') $return_viewname='0'; +if($_REQUEST['return_viewname'] != '')$return_viewname=vtlib_purify($_REQUEST['return_viewname']); + +header("Location: index.php?action=$return_action&module=$return_module&record=$return_id&viewname=$return_viewname&smodule=VENDOR&start=".vtlib_purify($_REQUEST['pagenumber']).$search); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/Settings.php b/oss/vtiger/trunk/modules/Vendors/Settings.php new file mode 100644 index 00000000..980dd078 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/Settings.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/Vendors/TagCloud.php b/oss/vtiger/trunk/modules/Vendors/TagCloud.php new file mode 100644 index 00000000..859b11ff --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/TagCloud.php @@ -0,0 +1,12 @@ + diff --git a/oss/vtiger/trunk/modules/Vendors/UnifiedSearch.php b/oss/vtiger/trunk/modules/Vendors/UnifiedSearch.php new file mode 100644 index 00000000..9a37320c --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/UnifiedSearch.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/Vendors/Vendors.js b/oss/vtiger/trunk/modules/Vendors/Vendors.js new file mode 100644 index 00000000..be3122d8 --- /dev/null +++ b/oss/vtiger/trunk/modules/Vendors/Vendors.js @@ -0,0 +1,72 @@ +/********************************************************************************* +** The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + * + ********************************************************************************/ +document.write(" + + is_admin)==='on'; + } + +/* function to check if the module has workflow + * @params :: $modulename - name of the module + */ + function checkModuleWorkflow($modulename){ + global $adb; + $tabid = getTabid($modulename); + $modules_not_supported = array('Documents','Calendar','Emails','Faq','Events','PBXManager','Users'); + $query = "SELECT name FROM vtiger_tab WHERE name not in (".generateQuestionMarks($modules_not_supported).") AND isentitytype=1 AND presence = 0 AND tabid = ?"; + $result = $adb->pquery($query,array($modules_not_supported,$tabid)); + $rows = $adb->num_rows($result); + if($rows > 0){ + return true; + }else{ + return false; + } + } +} + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/com_vtiger_workflowAjax.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/com_vtiger_workflowAjax.php new file mode 100644 index 00000000..067b69bf --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/com_vtiger_workflowAjax.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/deletetask.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/deletetask.php new file mode 100644 index 00000000..f8f29ecc --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/deletetask.php @@ -0,0 +1,45 @@ +name); + + if(!$util->checkAdminAccess()){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NOT_ADMIN']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NOT_ADMIN']); + return; + } + + $wm = new VTTaskManager($adb); + $wm->deleteTask($request['task_id']); + + if(isset($request["return_url"])){ + $returnUrl=$request["return_url"]; + }else{ + $returnUrl=$module->editWorkflowUrl($wf->id); + } + + ?> + + Return + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/deleteworkflow.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/deleteworkflow.php new file mode 100644 index 00000000..0e2770ef --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/deleteworkflow.php @@ -0,0 +1,44 @@ +name); + + if(!$util->checkAdminAccess()){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NOT_ADMIN']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NOT_ADMIN']); + return; + } + + $wm = new VTWorkflowManager($adb); + $wm->delete($request['workflow_id']); + + if(isset($request["return_url"])){ + $returnUrl=$request["return_url"]; + }else{ + $returnUrl=$module->listViewUrl($wf->id); + } + + ?> + + Return + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/edittask.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/edittask.php new file mode 100644 index 00000000..754b310f --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/edittask.php @@ -0,0 +1,115 @@ +name); + + if(!$util->checkAdminAccess()){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NOT_ADMIN']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NOT_ADMIN']); + return; + } + + $smarty = new vtigerCRM_Smarty(); + $tm = new VTTaskManager($adb); + $smarty->assign('edit',isset($request["task_id"])); + if(isset($request["task_id"])){ + $task = $tm->retrieveTask($request["task_id"]); + $workflowId=$task->workflowId; + }else{ + $workflowId = $request["workflow_id"]; + $taskClass = $request["task_type"]; + $task = $tm->createTask($taskClass, $workflowId); + } + + if($task==null){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NO_TASK']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NO_TASK']); + return; + } + + $wm = new VTWorkflowManager($adb); + $workflow = $wm->retrieve($workflowId); + if($workflow==null){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NO_WORKFLOW']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NO_WORKFLOW']); + return; + } + + + $smarty->assign("workflow", $workflow); + $smarty->assign("returnUrl", $request["return_url"]); + $smarty->assign("task", $task); + $smarty->assign("taskType", $taskClass); + $smarty->assign("saveType", $request['save_type']); + $taskClass = get_class($task); + $smarty->assign("taskTemplate", "{$module->name}/taskforms/$taskClass.tpl"); + $et = VTWSEntityType::usingGlobalCurrentUser($workflow->moduleName); + $smarty->assign("entityType", $et); + $smarty->assign('entityName', $workflow->moduleName); + $smarty->assign("fieldNames", $et->getFieldNames()); + + $dateFields = array(); + $fieldTypes = $et->getFieldTypes(); + $fieldLabels = $et->getFieldLabels(); + foreach($fieldTypes as $name => $type){ + if($type->type=='Date' || $type->type=='DateTime'){ + $dateFields[$name] = $fieldLabels[$name]; + } + } + + $smarty->assign('dateFields', $dateFields); + + + if($task->trigger!=null){ + $trigger = $task->trigger; + $days = $trigger['days']; + if ($days < 0){ + $days*=-1; + $direction = 'before'; + }else{ + $direction = 'after'; + } + $smarty->assign('trigger', array('days'=>$days, 'direction'=>$direction, + 'field'=>$trigger['field'])); + } + + + $smarty->assign("MOD", array_merge( + return_module_language($current_language,'Settings'), + return_module_language($current_language, $module->name))); + $smarty->assign("APP", $app_strings); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("THEME", $theme); + $smarty->assign("MODULE_NAME", $module->label); + $smarty->assign("PAGE_NAME", $mod['LBL_EDIT_TASK']); + $smarty->assign("PAGE_TITLE", $mod['LBL_EDIT_TASK_TITLE']); + + $smarty->assign("module", $module); + + $smarty->display("{$module->name}/EditTask.tpl"); + } + vtTaskEdit($adb, $_REQUEST, $current_language, $app_strings); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/editworkflow.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/editworkflow.php new file mode 100644 index 00000000..639a0098 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/editworkflow.php @@ -0,0 +1,86 @@ +name); + + + if(!$util->checkAdminAccess()){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NOT_ADMIN']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NOT_ADMIN']); + return; + } + + + $smarty = new vtigerCRM_Smarty(); + if($request['source']=='from_template'){ + $tm = new VTWorkflowTemplateManager($adb); + $template = $tm->retrieveTemplate($request['template_id']); + $workflow = $tm->createWorkflow($template); + }else{ + $wfs = new VTWorkflowManager($adb); + if(isset($request["workflow_id"])){ + $workflow = $wfs->retrieve($request["workflow_id"]); + }else{ + $moduleName=$request["module_name"]; + $workflow = $wfs->newWorkflow($moduleName); + } + } + + if($workflow==null){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NO_WORKFLOW']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NO_WORKFLOW']); + return; + } + $tm = new VTTaskManager($adb); + $tasks = $tm->getTasksForWorkflow($workflow->id); + $smarty->assign("tasks", $tasks); + $smarty->assign("taskTypes", $tm->getTaskTypes()); + $smarty->assign("newTaskReturnUrl", $requestUrl); + + $smarty->assign("returnUrl", $request["return_url"]); + $smarty->assign("APP", $app_strings); + $smarty->assign("MOD", array_merge( + return_module_language($current_language,'Settings'), + return_module_language($current_language, $module->name))); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH", $image_path); + $smarty->assign("MODULE_NAME", $module->label); + $smarty->assign("PAGE_NAME", $mod['LBL_EDIT_WORKFLOW']); + $smarty->assign("PAGE_TITLE", $mod['LBL_EDIT_WORKFLOW_TITLE']); + + $smarty->assign("workflow", $workflow); + $smarty->assign("saveType", isset($workflow->id)?"edit":"new"); + $smarty->assign("module", $module); + + $smarty->display("{$module->name}/EditWorkflow.tpl"); +} +vtWorkflowEdit($adb, $_REQUEST, $_SERVER["REQUEST_URI"], $current_language, $app_strings); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/entitymethodjson.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/entitymethodjson.php new file mode 100644 index 00000000..37f71729 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/entitymethodjson.php @@ -0,0 +1,21 @@ +methodsForModule($moduleName); + echo Zend_Json::encode($methodNames); +} + +vtEntityMethodJson($adb, $_REQUEST); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/errormessage.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/errormessage.php new file mode 100644 index 00000000..9459f0b3 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/errormessage.php @@ -0,0 +1,12 @@ + +

      Error

      + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/errorpage.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/errorpage.php new file mode 100644 index 00000000..10d1b854 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/errorpage.php @@ -0,0 +1,18 @@ + +

      Workflow engine error

      + + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/include.inc b/oss/vtiger/trunk/modules/com_vtiger_workflow/include.inc new file mode 100644 index 00000000..0c8ec5d2 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/include.inc @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/include_webservices.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/include_webservices.php new file mode 100644 index 00000000..78913350 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/include_webservices.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/language/en_us.lang.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/language/en_us.lang.php new file mode 100644 index 00000000..9eeb1bc6 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/language/en_us.lang.php @@ -0,0 +1,42 @@ + 'Send Email', +'VTEntityMethodTask' => 'Invoke Custom Function', +'VTCreateTodoTask' => 'Create Todo', +'VTCreateEventTask' => 'Create Event', +'LBL_EDIT_TASK'=>'Edit Task', +'LBL_EDIT_TASK_TITLE'=>'Edit an existing task or create a new one', +'LBL_EDIT_WORKFLOW'=>'Edit Workflow', +'LBL_EDIT_WORKFLOW_TITLE'=>'Edit an existing workflow or create a one', +'LBL_FROM_TEMPLATE'=>'From Template', +'LBL_NEW_WORKFLOW'=>'New Workflow', +'LBL_NEW_TEMPLATE'=>'Save as Template', +'LBL_CREATE_WORKFLOW_FOR'=>'Create a workflow for', +'LBL_FOR_MODULE'=>'For Module', +'LBL_FROM_TEMPLATE'=>'From Template', +'LBL_CHOOSE_A_TEMPLATE'=>'Choose a template', +'LBL_VALIDATION_MISSING_MANDATORY_FIELDS'=>'There are empty mandatory fields.', +'LBL_VALIDATION_INVALID_DATE_RANGE'=>'Start date/time is greater than the end date/time', +'LBL_ERROR_NO_WORKFLOW'=>'The workflow you requested does not exist', +'LBL_ERROR_NO_TASK'=>'The task you requested does not exist', +'LBL_ERROR_NOT_ADMIN'=>'You do not have access to this module as you are not an admin user', +'LBL_CREATE_WORKFLOW'=>'Create workflow', +'LBL_WORKFLOW_LIST'=>'Workflow List', +'LBL_AVAILABLE_WORKLIST_LIST'=>'Available Workflows', +'LBL_LOADING'=>'Loading...', +'LBL_VALIDATION_ERROR'=>'Validation Error', +'LBL_SELECT_OPTION_DOTDOTDOT'=>'Select Option...', +'LBL_WORKFLOW_NOTE_CRON_CONFIG'=>'NOTE: You should have Workflow cron script configured.', +'LBL_NO_TEMPLATES'=>'No Templates', +); + + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/language/zh_cn.lang.php new file mode 100644 index 00000000..60901316 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/language/zh_cn.lang.php @@ -0,0 +1,34 @@ + '发送邮件', +'VTEntityMethodTask' => '自定义函数', +'VTCreateTodoTask' => '创建待办事项', +'VTCreateEventTask' => '创建活动', +'LBL_EDIT_TASK'=>'编辑任务', +'LBL_EDIT_TASK_TITLE'=>'编辑现有的任务或者创建新任务', +'LBL_EDIT_WORKFLOW'=>'编辑工作流程', +'LBL_EDIT_WORKFLOW_TITLE'=>'编辑现有的工作流程或者创建新流程', +'LBL_FROM_TEMPLATE'=>'从模板', +'LBL_NEW_WORKFLOW'=>'新流程', +'LBL_NEW_TEMPLATE'=>'保存为模板', +'LBL_CREATE_WORKFLOW_FOR'=>'新的工作流程', +'LBL_FOR_MODULE'=>'的模块', +'LBL_FROM_TEMPLATE'=>'从模板', +'LBL_CHOOSE_A_TEMPLATE'=>'选择模板', +'LBL_VALIDATION_MISSING_MANDATORY_FIELDS'=>'有空必填。', +'LBL_VALIDATION_INVALID_DATE_RANGE'=>'开始的日期/时间大于结束日期/时间。', +'LBL_ERROR_NO_WORKFLOW'=>'你请求的工作流程不存在。 ', +'LBL_ERROR_NO_TASK'=>'你请求的任务不存在。', +'LBL_ERROR_NOT_ADMIN'=>'您没有访问此模块的权限。', +'LBL_CREATE_WORKFLOW'=>'创建工作流', +'LBL_WORKFLOW_LIST'=>'工作流列表', +'LBL_AVAILABLE_WORKLIST_LIST'=>'有效的工作流', +'LBL_LOADING'=>'下载...', +'LBL_VALIDATION_ERROR'=>'Validation Error', +'LBL_SELECT_OPTION_DOTDOTDOT'=>'选择项...', +'LBL_WORKFLOW_NOTE_CRON_CONFIG'=>'NOTE: You should have Workflow cron script configured.', +'LBL_NO_TEMPLATES'=>'没有模板', +); + + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/loadtemplates.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/loadtemplates.php new file mode 100644 index 00000000..3f258573 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/loadtemplates.php @@ -0,0 +1,26 @@ +loadTemplates($str); +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/modulefieldsjson.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/modulefieldsjson.php new file mode 100644 index 00000000..4fdd057d --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/modulefieldsjson.php @@ -0,0 +1,19 @@ +getFieldLabels()); + } + vtModuleTypeInfoJson($adb, $_REQUEST); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/add.png b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/add.png new file mode 100644 index 0000000000000000000000000000000000000000..f13429eee3856a60a4c8a643195c6cc17594dc97 GIT binary patch literal 763 zcmVxN#00001b5ch_0Itp) z=>Px$eNaqPMZ3GZNw^l4$cpy%_U7j1>g(!Xw@OyKC*k7ZuCA_1m`H}wUaanT+u_~h zlnE>JC;T1;L&BWWprlzLZ+1bs_%?Nn`#nHx!!+RQk9PjV% ze657Z$;pz}YB8t)*WcM}%r?!~(X7y_A(sKo`KBtM04$;aDUce2*-Rag0B4?YuhFjF zFM$D@$m5Q^Yiom{{Cv9 zbbr-Nnde~|f)d#4({s*1F_s;axt%qeBc$4jj>&n`{;AymvTd+rZQon$vuogf4FzY$Hys{4WhuHN~kw9s0y&=jlkKz)YQ~` z$YJ^U`TYF+`1tt!{r&p-`ttJf`}_O<|NnrC8ae;~00DGTPE!Ct=GbNc0004EOGiWi zhy@);00009a7bBm000XU000XU0RWnu7ytkO2XskIMF-gh76}^zdzr!80002$NklcMPYHJlBg4G~FrmU'+v['label']+''); + }); + select.attr('value', defaultValue); + } + + var validateDateRange = { + init: function(){ + + }, + validator: function(){ + var result; + var successResult = [true]; + var failureResult = [false, 'invalid_date_range_message', []]; + if(this.fieldValue('startDatefield') == this.fieldValue('endDatefield')){ + var startTime = this.fieldValue('startTime'); + var endTime = this.fieldValue('endTime'); + var startDays = parseInt(this.fieldValue('startDays'), 10); + var endDays = parseInt(this.fieldValue('endDays'), 10); + var startDirection = this.fieldValue('startDirection')=="After"?1:-1; + var endDirection = this.fieldValue('endDirection')=="After"?1:-1; + var dd = endDays*endDirection - startDays*startDirection; + if(dd<0){ + result = failureResult; + }else if(dd==0){ + if(parse12HoursTime(startTime)>=parse12HoursTime(startTime)){ + result = failureResult; + }else{ + result = successResult; + } + }else{ + result = successResult; + } + }else{ + result = successResult; + } + return result; + } + }; + + var vtinst = new VtigerWebservices("webservice.php"); + vtinst.extendSession(handleError(function(result){ + $(document).ready(function(){ + //Setup the validator + validator.addValidator('validateDateRange', validateDateRange); + validator.mandatoryFields.push('eventName'); + + vtinst.describeObject('Events', handleError(function(result){ + var fields = result['fields']; + var fieldsMap = index(fields, 'name'); + fillPicklist('event_status', fieldsMap['eventstatus'], eventStatus); + $('#event_status_busyicon').hide(); + $('#event_status').show(); + + fillPicklist('event_type', fieldsMap['activitytype'], eventType); + $('#event_type_busyicon').hide(); + $('#event_type').show(); + })); + }); + })); +} +VTCreateTodoTask(jQuery); \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/createtodotaskscript.js b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/createtodotaskscript.js new file mode 100644 index 00000000..5bd2af01 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/createtodotaskscript.js @@ -0,0 +1,63 @@ +function VTCreateTodoTask($){ + + var map = fn.map; + var dict = fn.dict; + var filter = fn.filter; + var reduceR = fn.reduceR; + var parallelExecuter = fn.parallelExecuter; + var contains = fn.contains; + var concat = fn.concat; + + function errorDialog(message){ + alert(message); + } + + function index(arr, field){ + return dict(map(function(e){return [e[field], e];}, arr)); + } + + function handleError(fn){ + return function(status, result){ + if(status){ + fn(result); + }else{ + errorDialog('Failure:'+result); + } + } + } + + var vtinst = new VtigerWebservices("webservice.php"); + vtinst.extendSession(handleError(function(result){ + $(document).ready(function(){ + //Setup the validator + validator.mandatoryFields.push('todo'); + + vtinst.describeObject('Calendar', handleError(function(result){ + var fields = result['fields']; + var fieldsMap = index(fields, 'name'); + var eventStatusType = fieldsMap['taskstatus']; + var eventStatusValues = eventStatusType['type']['picklistValues']; + + var taskPriorityType = fieldsMap['taskpriority']; + var taskPriorityValues = taskPriorityType['type']['picklistValues']; + + var status = $('#task_status'); + $.each(eventStatusValues, function(i, v){ + status.append(''); + }); + status.attr('value', taskStatus); + $('#task_status_busyicon').hide(); + $('#task_status').show(); + + var priority = $('#task_priority'); + $.each(taskPriorityValues, function(i, v){ + priority.append(''); + }); + priority.attr('value', taskPriority); + $('#task_priority_busyicon').hide(); + $('#task_priority').show(); + })); + }); + })); +} +VTCreateTodoTask(jQuery); \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/edittaskscript.js b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/edittaskscript.js new file mode 100644 index 00000000..e41c15a0 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/edittaskscript.js @@ -0,0 +1,51 @@ +function edittaskscript($){ + + function NumberBox(element){ + var elementId = element.attr("id"); + var boxId = '#'+elementId+'-number-box'; + var str = ""; + for(var i = 1; i <= 30; i++){ + str += ''+(i < 10? ("0"+i) : i)+' '; + if(!(i % 5)){ + str+="
      "; + } + } + element.after(''); + element.focus(function(){ + var pos = element.position(); + $(boxId).css('display', 'block'); + $(boxId).css({ + position: 'absolute', + top: (pos.top+25)+'px' + }); + }); + + element.blur(function(){ + setTimeout(function(){$(boxId).css('display', 'none');},500); + }); + + $('.box_cel').click(function(){ + element.attr('value', parseInt($(this).text())); + }); + } + + + + $(document).ready(function(){ + validator = new VTFieldValidator($('#new_task_form')); + validator.mandatoryFields = ['summary']; + $('.time_field').timepicker(); + NumberBox($('#select_date_days')); + //UI to set the date for executing the task. + $('#check_select_date').click(function(){ + if($(this).attr('checked')){ + $('#select_date').css('display', 'block'); + }else{ + $('#select_date').css('display', 'none'); + } + }); + $('#edittask_cancel_button').click(function(){ + window.location=returnUrl; + }); + }); +} \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/editworkflowscript.js b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/editworkflowscript.js new file mode 100644 index 00000000..70b2e778 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/editworkflowscript.js @@ -0,0 +1,499 @@ +/*+******************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ********************************************************************************/ + +function editworkflowscript($, conditions){ + var vtinst = new VtigerWebservices("webservice.php"); + var fieldValidator; + var desc = null; + + function id(v){ + return v; + } + + function map(fn, list){ + var out = []; + $.each(list, function(i, v){ + out[out.length]=fn(v); + }); + return out; + } + + function field(name){ + return function(object){ + if(typeof(object) != 'undefined') { + return object[name]; + } + }; + } + + function zip(){ + var out = []; + + var lengths = map(field('length'), arguments); + var min = reduceR(function(a,b){return a'+e.label+'';}, + opType['picklistValues']) + ); + value.replaceWith(''); + } + + function forInteger(opType, condno){ + var value = $(format("#save_condition_%s_value", condno)); + value.replaceWith(format('', condno)); + } + var functions = { + string:function(opType, condno){ + var value = $(format("#save_condition_%s_value", condno)); + value.replaceWith(format('', condno)); + }, + 'boolean': function(opType, condno){ + var value = $("#save_condition_"+condno+"_value"); + value.replaceWith( + ''); + }, + integer: forInteger, + picklist:forPicklist, + multipicklist:forPicklist + }; + var ret = functions[fieldType]; + if(ret==null){ + ret = functions['string']; + } + return ret; + } + + var format = fn.format; + + + function fillOptions(el,options){ + el.empty(); + $.each(options, function(k, v){ + el.append(''); + }); + } + + function resetFields(opType, condno){ + var ops = $("#save_condition_"+condno+"_operation"); + var selectedOperations = operations[opType.name]; + var l = dict(zip(selectedOperations, selectedOperations)); + fillOptions(ops, l); + defaultValue(opType.name)(opType, condno); + } + + + function removeCondition(condno){ + $(format("#save_condition_%s", condno)).remove(); + } + + //Convert user type into reference for consistency in describe objects + //This is done inplace + function referencify(desc){ + var fields = desc['fields']; + for(var i=0; i \ + \ + \ + \ + \ + \ + ' + ); + var fe = $("#save_condition_"+condno+"_fieldname"); + var i = 1; + fillOptions(fe, fieldLabels); + + + var fullFieldName = fe.attr("value"); + + resetFields(getFieldType(fullFieldName), condno); + + var re = $("#save_condition_"+condno+"_remove"); + re.bind("click", function(){ + removeCondition(condno); + }); + + fe.bind("change", function(){ + var select = $(this); + var condNo = select.attr("id").match(/save_condition_(\d+)_fieldname/)[1]; + var fullFieldName = $(this).attr('value'); + resetFields(getFieldType(fullFieldName), condNo); + }); + } + + var newTaskPopup = NewTaskPopup(); + $("#new_task").click(function(){ + newTaskPopup.show(); + }); + + var newTemplatePopup = NewTemplatePopup(); + $("#new_template").click(function(){ + newTemplatePopup.show(); + }); + + var condno=0; + if(conditions){ + $.each(conditions, function(i, condition){ + var fieldname = condition["fieldname"]; + addCondition(condno); + $(format("#save_condition_%s_fieldname", condno)).attr("value", fieldname); + resetFields(getFieldType(fieldname), condno); + $(format("#save_condition_%s_operation", condno)).attr("value", condition["operation"]); + $('#dump').html(condition["value"]); + var text = $('#dump').text(); + $(format("#save_condition_%s_value", condno)).attr("value", text); + condno+=1; + }); + } + + $("#save_conditions_add").bind("click", function(){ + addCondition(condno++); + }); + + $("#save_submit").bind("click", function(){ + var conditions = []; + $("#save_conditions").children().each(function(i){ + var fieldname = $(this).children(".fieldname").attr("value"); + var operation = $(this).children(".operation").attr("value"); + var value = $(this).children(".value").attr("value"); + var condition = {fieldname:fieldname, operation:operation, value:value}; + conditions[i]=condition; + }); + if(conditions.length==0){ + var out = ""; + }else{ + var out = JSON.stringify(conditions); + } + $("#save_conditions_json").attr("value", out); + }); + pageLoadingPopup.close(); + $('#save_conditions_add').show(); + })); + })); + })); + }); + +} \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/emailtaskscript.js b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/emailtaskscript.js new file mode 100644 index 00000000..d16ee655 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/emailtaskscript.js @@ -0,0 +1,240 @@ +/*+******************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ********************************************************************************/ + +function VTEmailTask($){ + var vtinst = new VtigerWebservices("webservice.php"); + var desc = null; + var accessibleModulesInfo = null; + + var map = fn.map; + var dict = fn.dict; + var filter = fn.filter; + var reduceR = fn.reduceR; + var parallelExecuter = fn.parallelExecuter; + var contains = fn.contains; + var concat = fn.concat; + + function diff(reflist, list) { + var out = []; + $.each(list, function(i, v) { + if(contains(reflist, v)) { + out.push(v); + } + }); + return out; + } + + //Display an error message. + function errorDialog(message){ + alert(message); + } + + //This is a wrapper to handle webservice errors. + function handleError(fn){ + return function(status, result){ + if(status){ + fn(result); + }else{ + errorDialog('Failure:'+result); + } + }; + } + + //Insert text at the cursor + function insertAtCursor(element, value){ + //http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript + if (document.selection) { + element.focus(); + var sel = document.selection.createRange(); + sel.text = value; + element.focus(); + }else if (element.selectionStart || element.selectionStart == '0') { + var startPos = element.selectionStart; + var endPos = element.selectionEnd; + var scrollTop = element.scrollTop; + element.value = element.value.substring(0, startPos) + + value + + element.value.substring(endPos, + element.value.length); + element.focus(); + element.selectionStart = startPos + value.length; + element.selectionEnd = startPos + value.length; + element.scrollTop = scrollTop; + } else { + element.value += value; + element.focus(); + } + } + + //Convert user type into reference for consistency in describe objects + //This is done inplace + function referencify(desc){ + var fields = desc['fields']; + for(var i=0; i' + v + ''); + }); + + } + + $(document).ready(function(){ + vtinst.extendSession(handleError(function(result){ + vtinst.listTypes(handleError(function(accessibleModules) { + accessibleModulesInfo = accessibleModules; + + getDescribeObjects(accessibleModules, moduleName, handleError(function(modules){ + fillSelectBox('task-fieldnames', modules, moduleName); + $('#task-fieldnames-busyicon').hide(); + $('#task-fieldnames').show(); + $('#task-fieldnames').change(function(){ + var textarea = $('#save_content').get(0); + var value = '$'+$(this).attr('value'); + insertAtCursor(textarea, value); + }); + + fillSelectBox('task-emailfields', modules, moduleName, + function(e){return e['type']['name']=='email';}); + $('#task-emailfields-busyicon').hide(); + $('#task-emailfields').show(); + $('#task-emailfields').change(function(){ + var input = $($('#save_recepient').get()); + var value = '$'+$(this).attr('value'); + input.attr("value", input.attr("value")+','+value); + }); + })); + + })); + + })); + //Setup the validator + validator.mandatoryFields.push('recepient'); + validator.mandatoryFields.push('subject'); + }); +} +vtEmailTask = VTEmailTask(jQuery); diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/fieldvalidator.js b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/fieldvalidator.js new file mode 100644 index 00000000..17768d10 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/fieldvalidator.js @@ -0,0 +1,88 @@ +function MessageBoxPopup(){ + function center(el){ + el.css({position: 'absolute'}); + el.width("400px"); + el.height("110px"); + placeAtCenter(el.get(0)); + } + + function close(){ + jQuery('#error_message_box').css('display', 'none'); + } + + function show(module){ + if(typeof('VtigerJS_DialogBox') != 'undefined') VtigerJS_DialogBox.unblock(); + jQuery('#error_message_box').css('display', 'block'); + center(jQuery('#error_message_box')); + } + + jQuery('#error_message_box_close').click(close); + jQuery('#error_message_box_cancel').click(close); + return { + close:close,show:show + }; +} + + +var validateMandatoryFields = { + init: function(){ + this.mandatoryFields = []; + }, + validator: function (){ + var emptyFields = []; + var result; + var mandatoryFields = this.mandatoryFields; + for(var i = 0; i < mandatoryFields.length; i++){ + var fieldName = mandatoryFields[i]; + if(this.fieldValue(fieldName)==""){ + emptyFields.push(fieldName); + } + } + if(emptyFields.length!=0){ + result = [false, 'empty_fields_message', emptyFields]; + }else{ + result = [true]; + } + return result; + } +}; + +var VTFieldValidatorPrototype = { + validate: function(){ + var isValid = true; + var validators = this.validators; + for(var i = 0; i < validators.length; i++){ + var validator = validators[i]; + var result = validator.call(this); + if(result[0]==false){ + jQuery('#'+result[1]).css('display', 'block'); + isValid = false; + } + } + if(!isValid){ + this.messageBoxPopup.show(); + } + return isValid; + }, + addValidator: function(name, validator){ + validator.init.call(this); + this.validators.push(validator.validator); + }, + fieldValue: function(fieldName){ + return this.form.find('[name='+fieldName+']').val(); + } +}; + +function VTFieldValidator(form){ + var _this = this; + _this.form = form; + _this.messageBoxPopup = MessageBoxPopup(); + form.submit(function(){ + return _this.validate(); + }); + _this.validators = []; + _this.addValidator('mandatoryFields', validateMandatoryFields); +} + +VTFieldValidator.prototype = VTFieldValidatorPrototype; + diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/functional.js b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/functional.js new file mode 100644 index 00000000..a5473a2b --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/functional.js @@ -0,0 +1,162 @@ +function functional($){ + return { + + /** + * Test: + * fn.format("Hello %s", "world") == "Hello world" + */ + format: function(){ + var i=1; + var fmtStr = arguments[0]; + var args = arguments; + return fmtStr.replace(/%s/g,function(){return args[i++];}) + }, + + addStylesheet: function(url){ + /*From: http://www.hunlock.com/blogs/Howto_Dynamically_Insert_Javascript_And_CSS*/ + var headID = document.getElementsByTagName("head")[0]; + var cssNode = document.createElement('link'); + cssNode.type = 'text/css'; + cssNode.rel = 'stylesheet'; + cssNode.href = url; + cssNode.media = 'screen'; + headID.appendChild(cssNode); + }, + + id: function(v){ + return v; + }, + + map: function(fn, list){ + var out = []; + $.each(list, function(i, v){ + out[out.length]=fn(v); + }); + return out; + }, + + field: function(name){ + return function(object){ + return object[name]; + } + }, + + zip: function(){ + var out = []; + + var lengths = map(field('length'), arguments); + var min = reduceR(function(a,b){return aarguments.length){ + nparams = arguments.length; + } + + var args = []; + for(var i=0;iH-x-hZHrP1EhSmCzoNS;+b*K+x~N3bfYYX>!51#VH{$q$FZee0bdlPbVa_=-R6?N@uVl${ zzWL@n^XWa8Ib8SY(?e4%=ENme|Jk!|1yd~MG{xh-j}4BS3~|JV@c(G~1P=?eCu zWC(UJ9HP=_qt)qOG!LrH4o)??SHxzb=b&TaQ3WJ`5qOLYLiw7|zyHV`8L zCWsN(&7C7^Y&%t8<{lKQkOo6yEMgw+s9=}FKA25(8&?`_oV2>s_-VI~*L%m*cp_bZ zOpOA`Y=s)T=aAH}X2FD|@HNKc*wuZxo2OO=0IH2P4k;D^fOM`*Z1+vrv2K?Nnli>C z(=1l(Gdg2gV5F@i-3qBJ8Fnoi1VEU&L_JtaW!pUozh{cfT!8M|lU5gRYb|1o3cD1V zg4Il)UTCme$vpZD3yhS>S5QCI`krP1p5t(9fdXsddBo=EzI|J3q1EYW+MgS+0079c zj8|!Gb!iq@4Ef-+naQvK5T8Gv6*@f$iL|~2M%pI$HbtrI$N~TbR?oM4g_^qaQ~`Zy zplX|NSmCr;i21)|iWm$(Ok%PuBa(_t0USGPYvf-u4#h+(Y9Leyt$C-dX~ zGz;8X2!i7{HY~ulLb2Q!S0a%rpxaklz~i!E<%Si43cF!4zfXT3ZaNuBouB z#X$zfD-p>8_g6yTI1W~`3Adv`O&kDn@9N`u)yUvt!iEDLxE)q1@Lr*Yo-`n?NE>2! z{GYYU+D;Y5yQ{OB3wYpl*^I$*07RB=3st;I7t!sj2ga1!j^()zd3SHlf>-!XsYEJ| zOs=BY`vU4&Ko=HZZyEQCRpLT$e>DUpn%izc><0Oz|2!z+kA3nk?atykVOfhqu2jdC zVnmO$AEav%XCC zE$O>Xj7&oy?5lM@81+^&r8dMcNbbBg>A?Jqmk=TA>?|;nF09@@L8*<^Ff~TA0!bvl z0!CmBR@U!vV)6PEHO{hvQUR|E0k4Y~(}neWobY?}PefT&1%UAMB!W|92&HIM1q>c? z7^&_9kqrwNt1fAN9myE1j&B2Am!Scq=Uc(VLuB;DJ|6i;x1&KkVw}V*7#!(KAs@c} zERG>z#R34Y%f|eqG6Xx}u<9Ng84<^E`0~@$f1UsTJ4L)Kx`MqZ{ik4s!J9YaGn-2$ cxl-Z&2F>rAKNwAn{{R3007*qoM6N<$f^BYEG5`Po literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/jquery-1.2.6.js b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/jquery-1.2.6.js new file mode 100644 index 00000000..88e661ee --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/resources/jquery-1.2.6.js @@ -0,0 +1,3549 @@ +(function(){ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ + +// Map over jQuery in case of overwrite +var _jQuery = window.jQuery, +// Map over the $ in case of overwrite + _$ = window.$; + +var jQuery = window.jQuery = window.$ = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); +}; + +// A simple way to check for HTML strings or ID strings +// (both of which we optimize for) +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/, + +// Is it a simple selector + isSimple = /^.[^:#\[\.]*$/, + +// Will speed up references to undefined, and allows munging its name. + undefined; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + return this; + } + // Handle HTML strings + if ( typeof selector == "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Make sure an element was located + if ( elem ){ + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + return jQuery( elem ); + } + selector = []; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); + + return this.setArray(jQuery.makeArray(selector)); + }, + + // The current version of jQuery being used + jquery: "1.2.6", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // The number of elements contained in the matched element set + length: 0, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + var ret = -1; + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( name.constructor == String ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text != "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) + // The elements to wrap the target around + jQuery( html, this[0].ownerDocument ) + .clone() + .insertBefore( this[0] ) + .map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }) + .append(this); + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, false, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, true, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + find: function( selector ) { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? + jQuery.unique( elems ) : + elems ); + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var clone = this.cloneNode(true), + container = document.createElement("div"); + container.appendChild(clone); + return jQuery.clean([container.innerHTML])[0]; + } else + return this.cloneNode(true); + }); + + // Need to set the expando to null on the cloned set if it exists + // removeData doesn't work here, IE removes it from the original as well + // this is primarily for IE but the data expando shouldn't be copied over in any browser + var clone = ret.find("*").andSelf().each(function(){ + if ( this[ expando ] != undefined ) + this[ expando ] = null; + }); + + // Copy the events from the original to the clone + if ( events === true ) + this.find("*").andSelf().each(function(i){ + if (this.nodeType == 3) + return; + var events = jQuery.data( this, "events" ); + + for ( var type in events ) + for ( var handler in events[ type ] ) + jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); + }); + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, this ) ); + }, + + not: function( selector ) { + if ( selector.constructor == String ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ) ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector == 'string' ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return this.is( "." + selector ); + }, + + val: function( value ) { + if ( value == undefined ) { + + if ( this.length ) { + var elem = this[0]; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value; + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + + // Everything else, we just grab the value + } else + return (this[0].value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if( value.constructor == Number ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( value.constructor == Array && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value == undefined ? + (this[0] ? + this[0].innerHTML : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + data: function( key, value ){ + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) + data = jQuery.data( this[0], key ); + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ + jQuery.data( this, key, value ); + }); + }, + + removeData: function( key ){ + return this.each(function(){ + jQuery.removeData( this, key ); + }); + }, + + domManip: function( args, table, reverse, callback ) { + var clone = this.length > 1, elems; + + return this.each(function(){ + if ( !elems ) { + elems = jQuery.clean( args, this.ownerDocument ); + + if ( reverse ) + elems.reverse(); + } + + var obj = this; + + if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) + obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); + + var scripts = jQuery( [] ); + + jQuery.each(elems, function(){ + var elem = clone ? + jQuery( this ).clone( true )[0] : + this; + + // execute all scripts after the elements have been injected + if ( jQuery.nodeName( elem, "script" ) ) + scripts = scripts.add( elem ); + else { + // Remove any inner scripts for later evaluation + if ( elem.nodeType == 1 ) + scripts = scripts.add( jQuery( "script", elem ).remove() ); + + // Inject the elements into the document + callback.call( obj, elem ); + } + }); + + scripts.each( evalScript ); + }); + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( target.constructor == Boolean ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target != "object" && typeof target != "function" ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy == "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +var expando = "jQuery" + now(), uuid = 0, windowData = {}, + // exclude the following css properties to add px + exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning this function. + isFunction: function( fn ) { + return !!fn && typeof fn != "string" && !fn.nodeName && + fn.constructor != Array && /^[\s[]?function/.test( fn + "" ); + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + data = jQuery.trim( data ); + + if ( data ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.browser.msie ) + script.text = data; + else + script.appendChild( document.createTextNode( data ) ); + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + cache: {}, + + data: function( elem, name, data ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // Compute a unique ID for the element + if ( !id ) + id = elem[ expando ] = ++uuid; + + // Only generate the data cache if we're + // trying to access or manipulate it + if ( name && !jQuery.cache[ id ] ) + jQuery.cache[ id ] = {}; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) + jQuery.cache[ id ][ name ] = data; + + // Return the named cache data, or the ID for the element + return name ? + jQuery.cache[ id ][ name ] : + id; + }, + + removeData: function( elem, name ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( jQuery.cache[ id ] ) { + // Remove the section of cache data + delete jQuery.cache[ id ][ name ]; + + // If we've removed all the data, remove the element's cache + name = ""; + + for ( name in jQuery.cache[ id ] ) + break; + + if ( !name ) + jQuery.removeData( elem ); + } + + // Otherwise, we want to remove all of the element's data + } else { + // Clean up the element expando + try { + delete elem[ expando ]; + } catch(e){ + // IE has trouble directly removing the expando + // but it's ok with using removeAttribute + if ( elem.removeAttribute ) + elem.removeAttribute( expando ); + } + + // Completely remove the data cache + delete jQuery.cache[ id ]; + } + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length == undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length == undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames != undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + var padding = 0, border = 0; + jQuery.each( which, function() { + padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + val -= Math.round(padding + border); + } + + if ( jQuery(elem).is(":visible") ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, val); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // A helper method for determining if an element's values are broken + function color( elem ) { + if ( !jQuery.browser.safari ) + return false; + + // defaultView is cached + var ret = defaultView.getComputedStyle( elem, null ); + return !ret || ret.getPropertyValue("color") == ""; + } + + // We need to handle opacity special in IE + if ( name == "opacity" && jQuery.browser.msie ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + // Opera sometimes will give the wrong display answer, this fixes it, see #2037 + if ( jQuery.browser.opera && name == "display" ) { + var save = style.outline; + style.outline = "0 solid black"; + style.outline = save; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle && !color( elem ) ) + ret = computedStyle.getPropertyValue( name ); + + // If the element isn't reporting its values properly in Safari + // then some display: none elements are involved + else { + var swap = [], stack = [], a = elem, i = 0; + + // Locate all of the parent display: none elements + for ( ; a && color(a); a = a.parentNode ) + stack.unshift(a); + + // Go through and make them visible, but in reverse + // (It would be better if we knew the exact display type that they had) + for ( ; i < stack.length; i++ ) + if ( color( stack[ i ] ) ) { + swap[ i ] = stack[ i ].style.display; + stack[ i ].style.display = "block"; + } + + // Since we flip the display style, we have to handle that + // one special, otherwise get the value + ret = name == "display" && swap[ stack.length - 1 ] != null ? + "none" : + ( computedStyle && computedStyle.getPropertyValue( name ) ) || ""; + + // Finally, revert the display styles back + for ( i = 0; i < swap.length; i++ ) + if ( swap[ i ] != null ) + stack[ i ].style.display = swap[ i ]; + } + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context ) { + var ret = []; + context = context || document; + // !context.createElement fails in IE with an error but returns typeof 'object' + if (typeof context.createElement == 'undefined') + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + jQuery.each(elems, function(i, elem){ + if ( !elem ) + return; + + if ( elem.constructor == Number ) + elem += ''; + + // Convert html string into DOM nodes + if ( typeof elem == "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div"); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "", "
      " ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and + Return + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/savetemplate.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/savetemplate.php new file mode 100644 index 00000000..4b5c489c --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/savetemplate.php @@ -0,0 +1,46 @@ +name); + + if(!$util->checkAdminAccess()){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NOT_ADMIN']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NOT_ADMIN']); + return; + } + + $title = $request['title']; + $workflowId = $request['workflow_id']; + $wfs = new VTworkflowManager($adb); + $workflow = $wfs->retrieve($workflowId); + $tm = new VTWorkflowTemplateManager($adb); + $tpl = $tm->newTemplate($title, $workflow); + $tm->saveTemplate($tpl); + $returnUrl = $request['return_url']; + ?> + + Return + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/saveworkflow.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/saveworkflow.php new file mode 100644 index 00000000..a4d49b4c --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/saveworkflow.php @@ -0,0 +1,68 @@ +name); + + if(!$util->checkAdminAccess()){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NOT_ADMIN']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NOT_ADMIN']); + return; + } + + $description = $request["description"]; + $moduleName = $request["module_name"]; + $conditions = $request["conditions"]; + $taskId = $request["task_id"]; + $saveType=$request["save_type"]; + $executionCondition = $request['execution_condition']; + $wm = new VTWorkflowManager($adb); + if($saveType=='new'){ + $wf = $wm->newWorkflow($moduleName); + $wf->description = $description; + $wf->test = $conditions; + $wf->taskId = $taskId; + $wf->executionConditionAsLabel($executionCondition); + $wm->save($wf); + }else if($saveType=='edit'){ + $wf = $wm->retrieve($request["workflow_id"]); + $wf->description = $description; + $wf->test = $conditions; + $wf->taskId = $taskId; + $wf->executionConditionAsLabel($executionCondition); + $wm->save($wf); + }else{ + throw new Exception(); + } + if(isset($request["return_url"])){ + $returnUrl=$request["return_url"]; + }else{ + $returnUrl=$module->editWorkflowUrl($wf->id); + } + ?> + + Return + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/sortfieldsjson.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/sortfieldsjson.php new file mode 100644 index 00000000..55e83270 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/sortfieldsjson.php @@ -0,0 +1,17 @@ +sortby_fields); + } + vtSortFieldsJson($_REQUEST); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/tasklist.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasklist.php new file mode 100644 index 00000000..de7ea0f2 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasklist.php @@ -0,0 +1,51 @@ +name); + + if(!$util->checkAdminAccess()){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NOT_ADMIN']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NOT_ADMIN']); + return; + } + + $smarty = new vtigerCRM_Smarty(); + $tm = new VTTaskManager($adb); + $smarty->assign("tasks", $tm->getTasks()); + $smarty->assign("moduleNames", array("Contacts", "Applications")); + $smarty->assign("taskTypes", array("VTEmailTask", "VTDummyTask")); + $smarty->assign("returnUrl", $requestUrl); + + $smarty->assign("MOD", return_module_language($current_language,'Settings')); + $smarty->assign("APP", $app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("MODULE_NAME", $module->label); + $smarty->assign("PAGE_NAME", 'Task List'); + $smarty->assign("PAGE_TITLE", 'List available tasks'); + $smarty->assign("moduleName", $moduleName); + $smarty->display("{$module->name}/ListTasks.tpl"); + } + vtDisplayTaskList($adb, $_SERVER["REQUEST_URI"], $current_language); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateEntityTask.inc b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateEntityTask.inc new file mode 100644 index 00000000..d12c03cc --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateEntityTask.inc @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateEventTask.inc b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateEventTask.inc new file mode 100644 index 00000000..0e01a70c --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateEventTask.inc @@ -0,0 +1,116 @@ +retrieveCurrentUserInfoFromFile(1); + global $current_user; + $this->originalUser = $current_user; + $current_user = $user; + return $user; + } + + public function doTask($entityData){ + global $adb, $current_user; + $userId = $entityData->get('assigned_user_id'); + if($userId===null){ + $userId = vtws_getWebserviceEntityId('Users', 1);; + } + + $startDate = $this->calculateDate($entityData, $this->startDays, + $this->startDirection, $this->startDatefield); + $endDate = $this->calculateDate($entityData, $this->endDays, + $this->endDirection, $this->endDatefield); + + $fields = array( + 'activitytype'=>$this->eventType, + 'description'=>$this->description, + 'subject'=>$this->eventName, + 'taskpriority'=>$this->priority, + 'eventstatus'=>$this->status, + 'assigned_user_id'=>$userId, + 'time_start'=>self::conv12to24hour($this->startTime), + 'date_start'=>$startDate, + 'time_end'=>self::conv12to24hour($this->endTime), + 'due_date'=>$endDate, + 'visibility'=>'all', + 'taskstatus'=>'', + 'duration_hours'=>'' + ); + + $moduleName = $entityData->getModuleName(); + $adminUser = $this->getAdmin(); + $id = $entityData->getId(); + if($moduleName=='Contacts'){ + $fields['contact_id'] = $id; + }else{ + $data = vtws_describe('Calendar', $adminUser); + $fieldInfo = $data['fields']; + foreach($fieldInfo as $field){ + if($field['name']=='parent_id'){ + $parentIdField = $field; + } + } + $refersTo = $parentIdField['type']['refersTo']; + + if(in_array($moduleName, $refersTo)){ + $fields['parent_id'] = $id; + } + } + + vtws_create('Events', $fields, $adminUser); + global $current_user; + $current_user = $this->originalUser; + } + + private function calculateDate($entityData, $days, $direction, $datefield){ + $baseDate = $entityData->get($datefield); + preg_match('/\d\d\d\d-\d\d-\d\d/', $baseDate, $match); + $baseDate = strtotime($match[0]); + $date = strftime('%Y-%m-%d', $baseDate+$days*24*60*60* + ($direction=='Before'?-1:1)); + return $date; + } + + static function conv12to24hour($timeStr){ + $arr = array(); + preg_match('/(\d{1,2}):(\d{1,2})(am|pm)/', $timeStr, $arr); + if($arr[3]=='am'){ + $hours = ((int)$arr[1]) % 12; + }else{ + $hours = ((int)$arr[1]) % 12 + 12; + } + return str_pad($hours, 2, '0', STR_PAD_LEFT).':'.str_pad($arr[2], 2, '0', STR_PAD_LEFT); + } +} +?> diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateTodoTask.inc b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateTodoTask.inc new file mode 100644 index 00000000..e52fbadc --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTCreateTodoTask.inc @@ -0,0 +1,99 @@ +retrieveCurrentUserInfoFromFile(1); + global $current_user; + $this->originalUser = $current_user; + $current_user = $user; + return $user; + } + + public function doTask($entityData){ + global $adb, $current_user; + $userId = $entityData->get('assigned_user_id'); + if($userId===null){ + $userId = vtws_getWebserviceEntityId('Users', 1);; + } + + $baseDate = $entityData->get($this->datefield); + preg_match('/\d\d\d\d-\d\d-\d\d/', $baseDate, $match); + $baseDate = strtotime($match[0]); + $date = strftime('%Y-%m-%d', $baseDate+$this->days*24*60*60*($this->directions=='Before'?-1:1)); + $fields = array( + 'activitytype'=>'Task', + 'description'=>$this->description, + 'subject'=>$this->todo, + 'taskpriority'=>$this->priority, + 'taskstatus'=>$this->status, + 'assigned_user_id'=>$userId, + 'time_start'=>self::conv12to24hour($this->time), + 'sendnotification'=>$this->sendNotification!=''?1:0, + 'date_start'=>$date, + 'due_date'=>$date, + 'visibility'=>'all', + 'eventstatus'=>'' + ); + $moduleName = $entityData->getModuleName(); + $adminUser = $this->getAdmin(); + $id = $entityData->getId(); + if($moduleName=='Contacts'){ + $fields['contact_id'] = $id; + }else{ + $data = vtws_describe('Calendar', $adminUser); + $fieldInfo = $data['fields']; + foreach($fieldInfo as $field){ + if($field['name']=='parent_id'){ + $parentIdField = $field; + } + } + $refersTo = $parentIdField['type']['refersTo']; + + if(in_array($moduleName, $refersTo)){ + $fields['parent_id'] = $id; + } + } + + vtws_create('Calendar', $fields, $adminUser); + global $current_user; + $current_user = $this->originalUser; + } + + static function conv12to24hour($timeStr){ + $arr = array(); + preg_match('/(\d{1,2}):(\d{1,2})(am|pm)/', $timeStr, $arr); + if($arr[3]=='am'){ + $hours = ((int)$arr[1]) % 12; + }else{ + $hours = ((int)$arr[1]) % 12 + 12; + } + return str_pad($hours, 2, '0', STR_PAD_LEFT).':'.str_pad($arr[2], 2, '0', STR_PAD_LEFT); + } +} +?> diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTDummyTask.inc b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTDummyTask.inc new file mode 100644 index 00000000..b936cd74 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTDummyTask.inc @@ -0,0 +1,19 @@ +statement; + echo "This is a dummy workflow task with $statement"; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTEmailTask.inc b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTEmailTask.inc new file mode 100644 index 00000000..a47e13e0 --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTEmailTask.inc @@ -0,0 +1,46 @@ +query("select user_name, email1, email2 from vtiger_users where id=1"); + $from_email = $adb->query_result($result,0,'email1'); + $from_name = $adb->query_result($result,0,'user_name'); + + $admin = $util->adminUser(); + $module = $entity->getModuleName(); + + $entityCache = new VTEntityCache($admin); + + $et = new VTSimpleTemplate($this->recepient); + $to_email = $et->render($entityCache, $entity->getId()); + + $st = new VTSimpleTemplate($this->subject); + $subject = $st->render($entityCache, $entity->getId()); + $ct = new VTSimpleTemplate($this->content); + $content = $ct->render($entityCache, $entity->getId()); + send_mail($module,$to_email,$from_name,$from_email,$subject,$content); + + $util->revertUser(); + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTEntityMethodTask.inc b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTEntityMethodTask.inc new file mode 100644 index 00000000..ad4d4fbd --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/tasks/VTEntityMethodTask.inc @@ -0,0 +1,22 @@ +executeMethod($entityData, $this->methodName); + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/templatesformodulejson.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/templatesformodulejson.php new file mode 100644 index 00000000..4bcbbf7d --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/templatesformodulejson.php @@ -0,0 +1,23 @@ +getTemplatesForModule($moduleName); + $arr = array(); + foreach($templates as $template){ + $arr[] = array("title"=>$template->title, 'id'=>$template->id); + } + echo Zend_Json::encode($arr); +} +vtTemplatesForModuleJson($adb, $_REQUEST); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/com_vtiger_workflow/workflowlist.php b/oss/vtiger/trunk/modules/com_vtiger_workflow/workflowlist.php new file mode 100644 index 00000000..9dd4e99b --- /dev/null +++ b/oss/vtiger/trunk/modules/com_vtiger_workflow/workflowlist.php @@ -0,0 +1,74 @@ +pquery($sql,array($modules_not_supported))); + $modules = array(); + foreach($it as $row){ + $modules[] = $row->name; + } + return $modules; +} + +function vtDisplayWorkflowList($adb, $request, $requestUrl, $app_strings, $current_language){ + global $theme; + $image_path = "themes/$theme/images/"; + + $module = new VTWorkflowApplication("workflowlist"); + $util = new VTWorkflowUtils(); + $mod = return_module_language($current_language, $module->name); + + if(!$util->checkAdminAccess()){ + $errorUrl = $module->errorPageUrl($mod['LBL_ERROR_NOT_ADMIN']); + $util->redirectTo($errorUrl, $mod['LBL_ERROR_NOT_ADMIN']); + return; + } + + $smarty = new vtigerCRM_Smarty(); + $wfs = new VTWorkflowManager($adb); + $smarty->assign("moduleNames", vtGetModules($adb)); + $smarty->assign("returnUrl", $requestUrl); + + $listModule = $request["list_module"]; + $smarty->assign("listModule", $listModule); + if($listModule==null || strtolower($listModule)=="all"){ + $smarty->assign("workflows", $wfs->getWorkflows()); + }else{ + $smarty->assign("workflows", $wfs->getWorkflowsForModule($listModule)); + } + + $smarty->assign("MOD",array_merge( + return_module_language($current_language,'Settings'), + return_module_language($current_language, $module->name))); + $smarty->assign("APP", $app_strings); + $smarty->assign("THEME", $theme); + $smarty->assign("IMAGE_PATH",$image_path); + $smarty->assign("MODULE_NAME", $module->label); + $smarty->assign("PAGE_NAME", $mod['LBL_WORKFLOW_LIST']); + $smarty->assign("PAGE_TITLE", $mod['LBL_AVAILABLE_WORKLIST_LIST']); + $smarty->assign("module", $module); + $smarty->display("{$module->name}/ListWorkflows.tpl"); +} +vtDisplayWorkflowList($adb, $_REQUEST, $_SERVER["REQUEST_URI"], $app_strings, $current_language); +?> diff --git a/oss/vtiger/trunk/modules/squirrelmail-1.4.4/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/squirrelmail-1.4.4/language/zh_cn.lang.php new file mode 100644 index 00000000..be181109 --- /dev/null +++ b/oss/vtiger/trunk/modules/squirrelmail-1.4.4/language/zh_cn.lang.php @@ -0,0 +1,49 @@ + 'WebMails', + 'LBL_EMAILS_TITLE' => 'Emails', + 'LBL_MODULE_TITLE' => 'WebMails:Home', + 'LNK_SELECT_ALL' => '全选', + 'LNK_UNSELECT_ALL' => '取消全选', + 'LNK_OPTIONS' => '选项', + 'LBL_VIEWING_MESSAGES' => '浏览信件', + 'LBL_TOTAL' => '总计', + 'LBL_WEBMAILS_LIST' => 'WebMails列表', + 'LBL_FETCH_MY_MAILS' => '接收外部信件', + 'LBL_ADD_TO_VTIGER_CRM' => '新增到CRM系统', + 'LBL_READ' => '已读', + 'LBL_UNREAD' => '未读', + 'LBL_DELETE' => '删除', + 'LBL_SUBJECT' => '主题', + 'LBL_DATE' => '日期', + 'LBL_FROM' => '发件人', + 'LNK_MESSAGE_LIST' => '信件列表', + 'LNK_DELETE' => '删除', + 'LNK_PREVIOUS' => '上一封', + 'LNK_NEXT' => '下一封', + 'LNK_REPLY' => '回复', + 'LNK_REPLY_ALL' => '回复所有', + 'LNK_VIEW_PRINTABLE_VERSION' => '查看打印版本', + 'LBL_ATTACHMENTS' => '附件', + 'LBL_TO' => '收件人', + 'LBL_CC' => '抄送', + 'LBL_BCC' => '密送', + 'LBL_TO_OR_CC' => '收件人或者抄送', + 'LBL_PRIORITY' => '优先级', + 'LNK_NEW' => '撰写', + 'LNK_DONE' => '完成', + 'LBL_OPTIONS' => '选项', + 'LBL_MESSAGE_HIGHLIGHTING' => '已选信件', + 'LBL_NO_HIGHLIGHTING_IS_DEFINED' => '没有选择信件', + 'LBL_IDENTIFYING_NAME' => '识别名称', + 'LBL_COLOR' => '颜色', + 'LBL_OTHER' => '其它', + 'LBL_MATCHES' => '匹配项目', + 'LBL_SUBMIT' => '提交', + 'LBL_EDIT' => '编辑', + 'LBL_UP' => '上', + 'LBL_DOWN' => '下', + 'LBL_MESSAGE_HIGHLIGHTING_INFO' => '基于上面条件,收到的信件在邮件列表中会使用不同的背景颜色。这有助于区分邮件发件人,特别是邮件列表。', + +); +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/uploads/add2db.php b/oss/vtiger/trunk/modules/uploads/add2db.php new file mode 100644 index 00000000..686938e0 --- /dev/null +++ b/oss/vtiger/trunk/modules/uploads/add2db.php @@ -0,0 +1,149 @@ +debug("DEBUG In add2db.php"); + + if(isset($_REQUEST['filename_hidden'])) { + $file = $_REQUEST['filename_hidden']; + } else { + $file = $_FILES['filename']['name']; + } + $binFile = sanitizeUploadFileName($file, $upload_badext); + $_FILES["filename"]["name"] = $binFile; + + //decide the file path where we should upload the file in the server + $upload_filepath = decideFilePath(); + + $current_id = $adb->getUniqueID("vtiger_crmentity"); + + if(move_uploaded_file($_FILES["filename"]["tmp_name"],$upload_filepath.$current_id."_".$_FILES["filename"]["name"])) + { + $filename = ltrim(basename(" ".$binFile)); //allowed filename like UTF-8 characters + $filetype= $_FILES['filename']['type']; + $filesize = $_FILES['filename']['size']; + + if($filesize != 0) + { + $desc = $_REQUEST['txtDescription']; + $subject = $_REQUEST['uploadsubject']; + $date_var = $adb->formatDate(date('Y-m-d H:i:s'), true); + $current_date = getdate(); + $current_date = $adb->formatDate(date('Y-m-d H:i:s'), true); + $query = "insert into vtiger_crmentity (crmid,smcreatorid,smownerid,setype,description,createdtime,modifiedtime) values(?,?,?,?,?,?,?)"; + $params = array($current_id, $current_user->id, $current_user->id, $_REQUEST['return_module'].' Attachment', $desc, $date_var, $current_date); + $result = $adb->pquery($query, $params); + + # Added by DG 26 Oct 2005 + # Attachments added to contacts are also added to their accounts + $log->debug("DEBUG return_module: ".$_REQUEST['return_module']); + if ($_REQUEST['return_module'] == 'Contacts') + { + $crmid = $_REQUEST['return_id']; + $query = 'select accountid from vtiger_contactdetails where contactid=?'; + $result = $adb->pquery($query, array($crmid)); + if($adb->num_rows($result) != 0) + { + $log->debug("DEBUG Returned a row"); + $associated_account = $adb->query_result($result,0,"accountid"); + # Now make sure that we haven't already got this attachment associated to this account + # Hmmm... if this works, should we NOT upload the attachment again, and just set the relation for the contact too? + $log->debug("DEBUG Associated Account: ".$associated_account); + $query = "select attachmentsid, name, path from vtiger_attachments where name=?"; + $result = $adb->pquery($query, array($filename)); + if($adb->num_rows($result) != 0) + { + $log->debug("DEBUG Matched a row"); + # Whoops! We matched the name. Is it the same size? + $fname = $adb->query_result($result,0,"name"); + $fpath = $adb->query_result($result,0,"path"); + $fid = $adb->query_result($result,0,"attachmentsid"); + $dg_size = filesize($fpath . "/".$fid."_". $fname); + //$dg_size = $adb->query_result($result,0,"attachmentsize"); + $log->debug("DEBUG: These should be the same size: ".$dg_size." ".$filesize); + if ($dg_size == $filesize) + { + # Yup, it is probably the same file + $associated_account = ''; + } + } + } + else + { + $associated_account = ''; + } + } + + $sql = "insert into vtiger_attachments(attachmentsid, name, description, type,path,subject) values(?,?,?,?,?,?)"; + $params = array($current_id, $filename, $desc, $filetype, $upload_filepath, $subject); + $result = $adb->pquery($sql, $params); + + + $sql1 = "insert into vtiger_seattachmentsrel values(?,?)"; + $params1 = array($crmid, $current_id); + $result = $adb->pquery($sql1, $params1); + + # Attachments added to contacts are also added to their accounts + if ($associated_account) + { + $log->debug("DEBUG: inserting into vtiger_seattachmentsrel from add2db 2"); + $sql1 = "insert into vtiger_seattachmentsrel values(?,?)"; + $params1 = array($associated_account, $current_id); + $result = $adb->pquery($sql1, $params1); + } + + echo ''; + } + else + { + $errormessage = "Error Message
        +
      • Invalid file OR +
      • File has no data +

      " ; + header("Location: index.php?module=uploads&action=uploadsAjax&msg=true&file=upload&errormessage=".$errormessage); + } + } + else + { + $errorCode = $_FILES['binFile']['error']; + $errormessage = ""; + + if($errorCode == 4) + { + $errormessage = "Kindly give a valid file for upload!
      " ; + } + else if($errorCode == 2) + { + $errormessage = "Sorry, the uploaded file exceeds the maximum filesize limit. Please try a file smaller than $upload_maxsize bytes
      "; + } + else if($errorCode == 6) + { + $errormessage = "Please configure upload_tmp_dir variable in php.ini file.
      " ; + } + else if($errorCode == 3 || $errorcode == '') + { + $errormessage = "Problems in file upload. Please try again!
      "; + } + + if($errormessage != '') + { + echo $errormessage; + include("upload.php"); + } + } + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/uploads/deleteattachments.php b/oss/vtiger/trunk/modules/uploads/deleteattachments.php new file mode 100644 index 00000000..df854041 --- /dev/null +++ b/oss/vtiger/trunk/modules/uploads/deleteattachments.php @@ -0,0 +1,23 @@ +pquery($sql, array($id)); + +$sql = "delete from vtiger_attachments where attachmentsid =?"; +$adb->pquery($sql, array($id)); + +header("Location:index.php?module=".vtlib_purify($_REQUEST['return_module'])."&action=".vtlib_purify($_REQUEST['return_action'])."&record=".vtlib_purify($_REQUEST['return_id'])."&parenttab=".getParentTab()); + + +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/uploads/downloadfile.php b/oss/vtiger/trunk/modules/uploads/downloadfile.php new file mode 100644 index 00000000..a65347d8 --- /dev/null +++ b/oss/vtiger/trunk/modules/uploads/downloadfile.php @@ -0,0 +1,57 @@ +pquery("SELECT deleted FROM vtiger_crmentity WHERE crmid=?", array($entityid)); +if(!empty($deletecheck) && $adb->query_result($deletecheck, 0, 'deleted') == 1) { + + echo $app_strings['LBL_RECORD_DELETE']; + +} else { + + $dbQuery = "SELECT * FROM vtiger_attachments WHERE attachmentsid = ?" ; + + $result = $adb->pquery($dbQuery, array($attachmentsid)) or die("Couldn't get file list"); + if($adb->num_rows($result) == 1) + { + $fileType = @$adb->query_result($result, 0, "type"); + $name = @$adb->query_result($result, 0, "name"); + $filepath = @$adb->query_result($result, 0, "path"); + $name = html_entity_decode($name, ENT_QUOTES, $default_charset); + $saved_filename = $attachmentsid."_".$name; + $disk_file_size = filesize($filepath.$saved_filename); + $filesize = $disk_file_size + ($disk_file_size % 1024); + $fileContent = fread(fopen($filepath.$saved_filename, "r"), $filesize); + + header("Content-type: $fileType"); + header("Content-length: $filesize"); + header("Cache-Control: private"); + header("Content-Disposition: attachment; filename=$name"); + header("Content-Description: PHP Generated Data"); + echo $fileContent; + } + else + { + echo $app_strings['LBL_RECORD_NOT_FOUND']; + } +} +?> \ No newline at end of file diff --git a/oss/vtiger/trunk/modules/uploads/language/en_us.lang.php b/oss/vtiger/trunk/modules/uploads/language/en_us.lang.php new file mode 100644 index 00000000..83c1083f --- /dev/null +++ b/oss/vtiger/trunk/modules/uploads/language/en_us.lang.php @@ -0,0 +1,35 @@ +'Attach File', +'LBL_ATTACH'=>'Attach', +'LBL_CANCEL'=>'Cancel', +'LBL_STEP_SELECT_FILE'=>'Step 1 : Select File', +'LBL_BROWSE_FILES'=>'Click the browse button and select the file to be attached', +'LBL_DESCRIPTION'=>'Step 2 : Write some description', +'LBL_OPTIONAL'=>'(optional)', +); + +?> diff --git a/oss/vtiger/trunk/modules/uploads/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/uploads/language/zh_cn.lang.php new file mode 100644 index 00000000..e5026769 --- /dev/null +++ b/oss/vtiger/trunk/modules/uploads/language/zh_cn.lang.php @@ -0,0 +1,35 @@ + '附件档案', +'LBL_ATTACH'=>'档案', +'LBL_CANCEL'=>'取消', + 'LBL_STEP_SELECT_FILE' => '步骤一:选择档案', + 'LBL_BROWSE_FILES' => '点选浏览器按钮并且选择要附加的档案', + 'LBL_DESCRIPTION' => '步骤二:填入一些描述', + 'LBL_OPTIONAL' => '(选择性输入)', +); + +?> diff --git a/oss/vtiger/trunk/modules/uploads/upload.php b/oss/vtiger/trunk/modules/uploads/upload.php new file mode 100644 index 00000000..a43de410 --- /dev/null +++ b/oss/vtiger/trunk/modules/uploads/upload.php @@ -0,0 +1,139 @@ + + + + + + + +
      + + + + + + + + + + +
      + + + + + +
       
      + + + + +
      + + + + + + + + + + + + + +
      +
      + +
      * 
      +   +
       
      + +
      +
      + + + + + +
      +  " class="crmbutton small save" onclick = "return titleValidation();" />   + " class="crmbutton small cancel" onclick="self.close();" /> +
      +
      +
      + + diff --git a/oss/vtiger/trunk/modules/uploads/uploadsAjax.php b/oss/vtiger/trunk/modules/uploads/uploadsAjax.php new file mode 100644 index 00000000..907b7657 --- /dev/null +++ b/oss/vtiger/trunk/modules/uploads/uploadsAjax.php @@ -0,0 +1,14 @@ + diff --git a/oss/vtiger/trunk/modules/vtmessages/language/zh_cn.lang.php b/oss/vtiger/trunk/modules/vtmessages/language/zh_cn.lang.php new file mode 100644 index 00000000..5d5022dd --- /dev/null +++ b/oss/vtiger/trunk/modules/vtmessages/language/zh_cn.lang.php @@ -0,0 +1,53 @@ + '留言板', +'LBL_VTMESSAGES_INFORMATION' => '留言信息', +'LBL_CUSTOM_INFORMATION' => '定制信息', +'SINGLE_RECORD'=>'留言', + +'Status'=>'状态', +'Message' => '留言', +'From' => '来源:', +'Related To'=>'关于:', +'Assigned To' => '留言', +'Created Time' => '创建时间', +'Modified Time' => '修改时间', +'Message by'=>'消息作者:', +'Tags'=>'标签', +'Topic ID'=>'主题ID', + +'LBL_SUBJECT'=>'主题', +'LBL_SUBJECT_EXAMPLE'=>' 如: 小组会议', +'LBL_RESET' => '重写', +'LBL_SEND' => '发送', +'LBL_REPLY' => '回复', +'LBL_TO'=> '到', +'LBL_AT'=> '在', +'LBL_SENDREPLY'=>'发送回复', +'LBL_MARKAS'=>'标记为', +'LBL_MESSAGENOW_TO'=>'留言给', +'LBL_SAYS'=>'说', +'LBL_YOU'=>'我', +'LBL_SAID'=>'说过', +'LBL_SELECTED_USERS'=>'选中用户', +'LBL_ATLEAST_SELECTONE_USER'=>'至少选择一个用户!', + +'LBL_VIEW'=>'查看', +'LBL_THREAD'=>'按线程', +'LBL_TOPIC'=>'按标题', + +'LBL_MAIL_SUBJECT_PREFIX'=>'留言板 - ', +'LBL_MAIL_GROUP_SALUTATION'=>'所有', +'LBL_MAIL_SUBJECT_NEW_SUFFIX_FORYOU'=>' 发出了一个信息.', +'LBL_MAIL_SUBJECT_REPLY_SUFFIX_FORYOU'=>' 发出了一个回复.', +); + +?>

      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 literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/SystemAjax.php b/oss/vtiger/trunk/modules/System/SystemAjax.php new file mode 100644 index 00000000..de74ef2f --- /dev/null +++ b/oss/vtiger/trunk/modules/System/SystemAjax.php @@ -0,0 +1,13 @@ + diff --git a/oss/vtiger/trunk/modules/System/config.php b/oss/vtiger/trunk/modules/System/config.php new file mode 100644 index 00000000..ff475243 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/config.php @@ -0,0 +1,96 @@ + diff --git a/oss/vtiger/trunk/modules/System/distros.ini b/oss/vtiger/trunk/modules/System/distros.ini new file mode 100644 index 00000000..890f71c3 --- /dev/null +++ b/oss/vtiger/trunk/modules/System/distros.ini @@ -0,0 +1,60 @@ +; linux-distros.ini - Defines known linux distros for phpSysInfo. +; http://phpsysinfo.sourceforge.net/ +; $Id: distros.ini,v 1.1 2005/11/22 14:30:28 bigmichi1 Exp $ +; + +[Debian] +Name = "Debian" +Image = "Debian.png" +Files = "/etc/debian_release;/etc/debian_version" + +[Suse] +Image = "Suse.png" +Files = "/etc/SuSE-release;/etc/UnitedLinux-release" + +[Mandrage] +Image = "Mandrake.png" +Files = "/etc/mandrake-release" + +[Gentoo] +Image = "Gentoo.png" +Files = "/etc/gentoo-release" + +[RedHat] +Image = "Redhat.png" +Files = "/etc/redhat-release;/etc/redhat_version" + +[Fedora] +Image = "Fedora.png" +Files = "/etc/fedora-release" + +[Slackware] +Image = "Slackware.png" +Files = "/etc/slackware-release;/etc/slackware-version" + +[Trustix] +Image = "Trustix.gif" +Files = "/etc/trustix-release;/etc/trustix-version" + +[FreeEOS] +Image = "free-eos.png" +Files = "/etc/eos-version" + +[Arch] +Image = "Arch.gif" +Files = "/etc/gentoo-release" + +[Cobalt] +Image = "Cobalt.png" +Files = "/etc/cobalt-release" + +[LinuxFromScratch] +Image = "lsf.png" +Files = "/etc/lfs-release" + +[Rubix] +Image = "Rubix.png" +Files = "/etc/rubix-version" + +[Ubunto] +Files = "/etc/lsb-release" diff --git a/oss/vtiger/trunk/modules/System/images/Arch.gif b/oss/vtiger/trunk/modules/System/images/Arch.gif new file mode 100644 index 0000000000000000000000000000000000000000..a643b2da666d932639f041d43475135490d82f74 GIT binary patch literal 576 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 Y|E|3-Pxb9Npa&T|UHx3vIVCg!0L~by7ytkO literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/images/Fedora.png b/oss/vtiger/trunk/modules/System/images/Fedora.png new file mode 100644 index 0000000000000000000000000000000000000000..b0aa8d094cb4596b5505ca563435a244126aa721 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ipR|!SUY6gZmL0)SaIMxaX ztku*!#=&t+LgJnP$2~=Xd)e9V-@pI<9|XQD3Vi?mecle$Z9u&|B|(0{U||TsAawuS zIiNUWlDE4Hzr-$vn?Md{fk$L9koEv$x0Bg+Km{V6E{-7@=eJ%|^gm)C!u~-|(Q!`X z%@du*!5P!cj8~-E`Xv}JH#Umg({mJ@R;F$kqwc9^K98++&zvUzmWRd{Om91Kc>H_! z_mltR?_T%nTK@2@*EhTGV0284Hzq%!Yx5-bUs=oz{Wqp06@FtiO|p!WDgBTmAnj6n z@t}pn^j~>T63(_AYn)cdzK8wQ1J5P$d?8}|Q3=21?7LmLvf`DcMUBF3Hec3AFLtpX zPkAM0-O^FKz5I&l7XL+;y|nKy-q)HEG$Z-Zqn*d(RxCTWxQwrA#@Wv&PKC|bwqe@T zRSPb7d5JB1tH-p8Y05sHT0g{ i&fTBC@Bd?7!}Q2c_(Qune+Dq17(8A5T-G@yGywoE48AM? literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/images/FreeBSD.png b/oss/vtiger/trunk/modules/System/images/FreeBSD.png new file mode 100644 index 0000000000000000000000000000000000000000..4c271fc542426d1e2adeba61e48b7e4c4e1b4437 GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvg8-ipS1vvw6J@15W%~P3{{R2~dmv_XS7`$36(|Yv3kGtL0mB33 zSV^E9W0JSK3%|rJhMPbRXMsm#F_88EW4Dvpc0dK?o-U3d8t0RL@H5B1Yu02F_!!G~ zVy9l4Ktw?G|Nk@hpWFF;AyfU#Z}-Xsf{M-BIsYW}X$lCLnPs(R{ycXhXT_3PFD^(LeFj?6Q!`j@Pr2X96_Z}_E+fp8x8I&ybceRWlPecjm3(?J=eI!Pe(}hr zDO0Y=t-Z6EUFpMr{l#5Dy>2hhT-qMc7%wAxu)JmQ@^GM89PTr?I-=g*V>kWspMAkX zEic3W_YSkVOtNOW{O*wKxBtwGXUw`7snVFw)8v&@K9NPQ!?LSn&R*{Ccm6jCgm-V- z{auiWr>XCll?M}RkDgMJ-S>x$a}GpId-QD5v}tT+UuH2k-=5j5r>FO>Z|dc9_tJkH z-Sz6--`(OdF?Yh=o|zT-d;Y`4@3uxQcpelJW0byZYV#HY4(YXj|9?O8Y0DRr6}qXJ iiRJ(ASu(RIFfwH6Ca&Z=Kd}TD7Yv@RelF{r5}E)(J^cd! literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/images/Gentoo.png b/oss/vtiger/trunk/modules/System/images/Gentoo.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0163055a77cf3833cf6e81d5f0e0a792592dc3 GIT binary patch literal 1891 zcmd^;`BM`H9>v449PNnJdbC|vscgMPp><2$*4m2Yaw!6>E3In>)YhULiXdk$NXS9R zAp|6W067Q}j*tWs8UdAXLjr^xKp@dTfCNZPLWn>%yZ=VteBb-b_t!V`5K)mK+ur%; z9RL8ZEi5!R+DYI4*~`tD!BnIO0B{3DU5dRJ^y!H^iR7fDn)^w$X~~R~yN&mf*=gyN zj7(Z?HZ?1UnVQ<1e!ndvt?k}Den!SX=EI)ste%|Amw7-@R@OjH?f?)t1O&=~APO`K zk)Mr$<>Fv@&LhC`N@2kA{M<@NPAwGJ49?}`1KHrbUQpgpA*dJveOw5_B0zWqgouO? z5#S0WxEui@gP{yKs0I$9L7^;kJ`DkFKo&5O1&wG}JqGp!Q_R3%m<6C_ID`X-v?HM{ zg>W_!#zDc`5HJA>E=0ox7z7Vp$j28o;ZQtW(I1aWC^$T`6x&21(MhB_5~&f3eg z#{@2wT2ougWHMPaI#(cQ;tPZzP&WiTSWqyCgmH2OIL(O-nsxrIbpt*l(D zqKwy2L@ZVxg)&a1j#DTKI$hD+(#7NTvDvcLR#hu!iqkqR5U8rF=V-L~ni^d-MNg^G z)9JdV##ttFp}u~Z#agVcwlL@>24n3>gOSC0)4(#b*=in7!{usQS{B)CJ%_Wz z8ag^&@%amUzFsIaw6vIbJflEh;`7Zyp{1k4HZmd?O9o`JVYz%jp_ovqMpZM)uCC>7 zk*>RYxwm)a`SVqgXtnEw?d8j@{(fU`uVrY+*x$cCIJhp6s3j7uSiB;W8B{aN5{YSS z%qo?dq*Aj)VwXzSCng+n`5T48tWsGN%8i*Bn_8_@Yg8J|luqZ&SGom_T5X-1vuZRp zjmDwX+H|_Lg$0|zu&&oT-n^MJo9B(jC973$vn?BqcB662Y_?mi8+NZx?@E+vbOnbpYmEJTy`?< z4`cBDYl5K0Q+qWt{eziw!A_6VjuOvj7h0|liSFdW_FNeA|7Hq!6O=9fsaOp5Mws}m<3?ftwp-=ida_O)mV4~W$@$FWLXedEQ9gh1~Tk?8!b-ELEdBjGQS zJPSWL9?>-B>YWNX;$vU(@O|vw?Q6V}TyOah9Sn(j&yx=t3HvPUGBDKhLBg2zZcCmT4-c2uF&B{!|5;qdB59e7|zEYO9(%cAxeDjv^&7&>AUB*a}6($`_6;D2-DbG zY-wnhV8HAOujO3q_SNO5CoFsKw#AtcYaS=(qP@1GzPz2ls*D|yo$8DUy9&PIA@V9C zgMW>M?Q${q#F00zxcYfbm9b)KkD^_xehtju&*jU$N6{ z05GT^{^#LI@y*i2X{cYX>+?JQiwXDK_w-*vJee4*SXADM%AZERI^JpbXS2P!i-94CEpM zh6l>Al0Z4eByV>Yeu-TSH-Q|^0*}aIAngIhZYQ(tfC>aWT^vI+&L{uqXOqwn{L!m7 zA*f&LgSv{m+6UQ1$(%68WrhoAq` z`)95WI~({FbV!xe_+9qBMHFpGoM(K!C+`$aIzopr08OsanE(I) literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/images/NetBSD.png b/oss/vtiger/trunk/modules/System/images/NetBSD.png new file mode 100644 index 0000000000000000000000000000000000000000..306ce773048509f14d43e5d5e2f8fd5b7cde01ba GIT binary patch literal 1478 zcmds${ZkcH7{?bByOQRui+Y7@1RaubEWtOfW(+&`Di8==NM!?gS(J1~v<{BS(Fy6G zlA9W>;>%_?aYxKnL_1cF%c$h0!?;P>+JqhxUlvDlai|t$bX)(8&V0`2`9429&rj#n z<;M|eO42S@}&1c8Wae_b;g{Y9I5+TF@oWUbQ5)4^1WZ6)Vp+ZB&hGCch zm=KtVGkItVz!V%KQ-r37Oo=xY*;KHps-~uzx^5EHG<4H6Ex=h2S_oLkF|v4MiM)le zrO1}5TDocx-6F&?h-Fze$Jqeb0NN1P&@r+RvU%Q?kS$5JEZd4=tCFp%w&tMOx?t@Ay#J_Or{c#Q$9IdHeFlT|T|7qjYHpcYg5EKv4s9R?JvHqujeP%>uX7-P5Ej|NR9cy0mXH7pv38T^4)<5nPE`4il zd2!Q`HBCkJeU-gdQN!NK{>k62T>sOJ$CrIEyUrb$IN=QC>#3i#c5LH}eb*j5oL#QC z?w193jQ5@Xq^2dY^Pld`-A(0p>aWa-8s(`Q_Ga0M{5oT^btlZT~cm#(7Ld+b>cTTmq&n6)!?@azM6{x>)x`jy(40lSWs>;%@eMqNg*9Vm1Q%`Fr+1KTvyjX~YCku}sgE&Urk^EuD+{XXZ+ndgUd zD(7dX4Ka_w5GT9q-&X;K!2GQIIgSOu0B``psgA+`#~gt>;7%9E zF`U2&XBz_o2ZF#!01^Wd2a*7ibigPKC>$sPC>o~$Xa;8}U}%h?aTb8ZfhB=ufOFso zo&gUI0u4M1JcoG*@G#(IFdq%uodZ1P;lb-5IAC56F7hA>m`?zo2dZCxC?r5ogpd!D z{LmP1h9@zM#Bq{JBx#yV&7=f@C|ow$>mj{fQgm2H`9xytJ5L3CM46us_=!M(3Iyn& zp9lu1V33ylbkToDlS``5+Wx!(mqR1tkAEUX(oR zR#;W0Rhdy02Ue3YO{Ps1Yz2@4hDvA(t;>|IFxQ$XqyaJjS%7Rn2rL~#8iq^^Aogd+=AbpjcLp^>IaYbx7)D%DacTXk-r?4GBQ$smhCHiHm>5Qz|l5RDL{YpkKM zw!tC?lSPP?Wlm8zRpoSz({;{pFgVlTEQ3Q17Kae0X}qTMx`V;%CU5AxVeqEOTNaOO z9wEmHrYTsKVA}#hj_@Glv5*%HA|m8N$d6C}p^&1;vZAV*rt5~`Fqllk91K~t4Aa4u zHKb@rHISww-9)C1EDPCaFx*9VCICc05ucs+U*rFqAkThyob#a~3g@P~p(5&u495&z zld(v2>Y&bmv<~kKfXK_4?pgWMPZ#f5Kffw>WLwU;7j}(bUUztPZv67!jx6Bwb{!tM z4c}e*%ebted!+b|m{0sunhsaJG5U>tYE0FvCzYP!n;XYf6=(DgEWNs3QR|w^LgJ>^ zkBcKJnqnG0FFzDBsWn_WZHbh7VDrlI_bx4&S3d(HOSI&rBjTWB)4jgV$o>Ai$;Wfn zetM@ibUj*3F7H3P)y6HixG^{s#Y=^=S5JN}xQ|K|4CxmDK=oM_lW{?s#L z%8j*r+*_4(qx#iRtFC1{A6w)OBoepsh1!US?lG>dWZ8qX8!S8BGbh+zeKBD~&Oe=z zUGJCwfNd?D`Eg+Vfk#H=Cm&vSf9{pLt*L(2&ivur)_e4Ofv08{U3Tp_pZ}_rB9np|mT5R9c6(3#=wv5kmeI5Vu#;&RNgO3f=w|~DjQE2ivwvc4= z*)=^0Do6k(2T~*!OzIgeV+pak^Kc2mrb@At!$Kvl!-cnL<;>v;*e`*U--z}I~ zFBZl%%sJWaL+r9G{{p>y^}YZA literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/images/Redhat.png b/oss/vtiger/trunk/modules/System/images/Redhat.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc749715e3d26fd61c8aab382dd89ca3e052ce2 GIT binary patch literal 470 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 bSsVZWCHjyabIpo}00000NkvXXu0mjfMZ8k~ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/images/Trustix.gif b/oss/vtiger/trunk/modules/System/images/Trustix.gif new file mode 100644 index 0000000000000000000000000000000000000000..6cdc3efdb42b82017539ea4ec452031f753133cb GIT binary patch literal 598 zcmZ?wbhEHbQubGw_8yf1v$jB@$EgcydR8d~&;^Gn%6liFm-PTrD znP%8oVU?O3udb%lSz`Bm2jA-xvP&9xR8$mds*AVIN!mR(dh6!3H8s@>7EIr`asAV$ zPu8zrS6y9MP>{c3`4TlXmAiNE96NSYUS2*ZC}`ru38|^6l@&$hgDvu4${ zZCkXpwId<|p6vI3v6Z*3Bz)`E&5IT-ShZ@!@#DufF6|WIXJKV#UOnCY$sUI}O&!WD7UAuPn_V$K43Vzzf z^Yxs^tzFTN*Gs?J#Pel0&$=ez-k#2F+cs)zsmD6=zT3w0W}Dcf!wCo1)$f@bvT{nw z^y$+#EU4T+FYwrgivL6d#ebsCMX8A;sVNHOnI#ztAsML(?w-B@42nNl7`Yhg8FUzc z02Ema?6Vr`o0=FHnVLJAm|0j@**crqIXF1ECNy#L@bd9buNM#$5*C>!Dkd%=DK%YM zMpjNn zyN9P&y|<6ApMOALP;f|SSbey!Z$xBNP;^Y}*SPqELmiUN%X(%SXIxq#xuwl_wte2e MJ&nTd0SXM(08R!5(EtDd literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/images/free-eos.png b/oss/vtiger/trunk/modules/System/images/free-eos.png new file mode 100644 index 0000000000000000000000000000000000000000..ade5c03a3c45c3dd9d656db9de33cd706e7f4878 GIT binary patch literal 1687 zcmV;I259+-P)CVG!HKO^g|S_Uuw0UnTD^yFwTF1RhjY4!a=4sofx&Wu#e2YpTf>Z6!ii$Zk7LS_Wsr%9mx-O4 zl$4&En}dX|fR3+^i>8Q)s)~)TjgGE_gs_8)w1kbhi;J^}jkJTCtA&xZhLO08m$r(N zyN{T@lZ&H~jjWlBp_rMel9IBMleUqTx0aW>l$^YonY5dny`P`Eot?dpqqUEuxR9i@ zl%TwjsJ4}=yqT}QmbA5;w7Z+TwVS%Qp`D+yiGr=6psS~-tf{M|roOMPu%WfTu&=VR zv9-OuzJry(h?BsNn81;l!Iq)HoTkH{sl%Y6!KS6dqN>EJtHhzTz^1Xurn;g%h}4!(aOr(!qMB$(A3D*-_g+T+gO z=+V*P*4E+H*5%RO<<;Hn+1cgP;p*At?cC+@-sl<^>hI+3^XcmG z?d|gJ?)32Q_VDrb_4W7l_4xSs`uqF+{{H>|0000000000ICLfr00009a7bBm0000; z0000;07l7cJ^%m%JxN4CR5;6H_(K3Npzyw4{quR{pFbb4EBM^{YYXSoY~Ifu27ms1 z!BBAH*KH!GD$mE6c-m4Ig7Hfwtd_B6G_3_-5<4B)T;Dl z>=c?>>}2#SR0MbhejzFN%)um3rIu5_eb(J6bLJjBY^zqmqx$al2dILdAHK*6RLh_J zG%s`dtXY?)#rq{rlBwcn~Rq+)5hFQ_U zR3-C#R_2Vel}lE;tzY6|l^g1FNT!HS+VB@h!PRCh6}>aJGUqN^{pv(7L;vYFE1U{L zO(*Kfu-pcl@Pe1A%H~SeS`idZ?XGW^-e%Ti>Ukmj-E+y%)ypH8m2^J$Iwv+Ik&3Zy}f z{IOD?RDNHWSJip(vPbtiduKm;Y3Y8iVnN7$xgwUfUmz=#jb#o5);RPDOG%bJ`gGk@ zQb_2SLtW58Iek{0Ck%hS$TA7oP4ntbYSG;nQlz(j@=M`byf( zS3wGX8i?{#$sF`f%CmA=arVL46)sM-DFH`hsu-8UV)M5VPnG;Z|B$Ig9#$Gwp7~Rw z{13@3;%Ddj4ps1(olT@d=5T^vWJ+92TuKBm!N^tftA2d{1FGP|?RV0ARciK!_nVoR zm?Z2!Y_C?u&&c}~DOLaC(37$6>gvpq(W_EpGWxLN1CoO8Tfa3hu}c>f0h4`k zp)^yWs1`=fYBzk!%_7Rk%)_dz$@KK+4GaYzfB(^0_KvOOG4qa}1>dn}-nW1L%>4Ri h=XYc=)ZC2)001T{kO0lF%Ul2e002ovPDHLkV1m1dujT*% literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/images/lfs.png b/oss/vtiger/trunk/modules/System/images/lfs.png new file mode 100644 index 0000000000000000000000000000000000000000..e59446004b2bd042170f4dbd202934659490bdd4 GIT binary patch literal 1818 zcmd^<`!^eS8pgkpCX&cS5Vwd*(o(cU>CkbR(nN)dTa?sw&~&DXbP{!Gh6Gz0G*!xw zh*FnXj!WIAMoQ6AW@xucyIFL)+jg}h2Q_+Ovf2GN_C4o$KkxIy^V@UYE5WQ27?e2* z0Dxio(L=Sg`mYdB?WQ+M?gIb?!6(@a0MQM zG6_Sn*lW3$L?!Q|P{}kh&YnuJK45Kofb3+4a?f_*J{`x?Y<_2RGE3t`pyA^io&*1RJR9A&@?e%E+)eLFb)&2^ziEFs> zvK!L!%E~h7K#l&xa)`V_sJvlWRb4qEH>vqSK3R(%s69S$6E~*-H)S<)g>0J-Z>O>EAK*5o4eyPQZae~OzwTe3rmfGJ{o`Tg)a2dq zshQ0M^yXvxsp-iNPqCYe)b$02-RIzg%5-NLGWU4)50%T)#rfqIOB#*ln~GQ_06IVr z$_mrk|K|Z=+q(O;??ERa-~?UMq`NVpHAtQxhp(mI|KvNB>;(WMok{m*yGZ32F2OZM>bHudarF7fAfE!_8#MWefIf5Jo?Qt$hSy|%y?~m}r3p#&mn2%b;lc)BpPbb-M<7!rt)+z?b45>8SJ^PiS8UdTR zM~-R;mnTOhpR+rAK6&GbQF`2P^C9DUk=Sw7w~9a4KwX$sxbgX$g52^B+-J(~_|*87 z_lq>AzV(s6oN%=C%DJRg-B~MFSN-(YbtnFJdOi@zGppO*@0RH;taThvp0(s!}`J6zNH|~fGy6T zPcN1J;-su?vGnj7O7}nGJJ^|Tkw4h);K6{I{K`QzqAJ&xhBDL@chJ{N>#pB6%T`X> zrbYKA&G$Y%j94&mK1(>|!irK=723QFXP;C=*5`1}!w3L)HsR95ppYt930}nC-Lk`RyoC-!v`Gxbg-(vs>eXUEqHhqStO#mi?Mep#5 G&-)L+gpMr$ literal 0 HcmV?d00001 diff --git a/oss/vtiger/trunk/modules/System/images/unknown.png b/oss/vtiger/trunk/modules/System/images/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..54dc5b47bc2336a06fc29f88cb85a170b39fb615 GIT binary patch literal 1300 zcmV+v1?&2WP) zSad^gZEa<4bO1zUb8B>Oa4mCbdSzrFX=8703OzkNJv}`=Jv}`=JqijaV<{jqFfcP9 zN?~htVjw4KX>Dy`V<#X}bY*F7WpXSa3TSk6a5^t9YH4k4VPh_Bb#rNBXklz@E@OHM z3S)9*VRU6=Aa`kWXdrZGWgtgMO;9WfXmoUNIxjDGcXuvlX>D*WZ*ph&d%$1-00aa{ zL_t(o!|j*PYaC@9#y{V8e(WZjZL-;<+m*m7Btfb)trA4AR80>aJP0{d@aRFoi~oUm zNU;i{7ZJsaSnwu@KMKWAMX8mVqFB>dnXaax|@loqoXMG}= zySl*f*FL1QRK&6pT>opCS6+RA-rjCfX`AB08p^UmmO6$&sy5sA^Cv+2&J89g>aTU&y2XD67QnWrt$ z9c&ocK$_Kn1Z~hFF?;!fLi-hVq}zG+xhKf>bh3P7m6IQTMs*Xc4jT~_(}198x&?mU zWD8)mn@65L$bmxx%+6fn-M2qtZPg*u)r)0X4Y?qqn%BTi*3nus^vED0!WW;PrnqpE zo@}0ko!oLWrCMOXZ$Xr1`nE_+r`rLz@be^{d$J^x?Y>6h{?j!{H7i2mEf8NwHEIB@ zJ3O-1oC4)0q(0 z16QrOyz}NsP!5X=B|7(Hu`DC7psvq=R$LH$jsquX2_cApXaO^cQ&r^l_F-8zN*O*_ z?b|mDaP4d6t^uUeX{P>|B0aPZBbI7gjoQh^^ISa7-S%j9b#{_WCbMO@H2@eM9_Fc| zzw^QS?_nC|J)ed>?P1x9mtKC6uCA^IJv1CjJ(BQGeiW_G$|Ac z6bc1WsnpH@Y9K0=3XbETwZ5l+gPIExi3GN7-Df@IO_q~2fWY8M1VChz(s&#fM+1qoGP#&uvDA{00}51)%w{u$6#~y^xDd;4)4Ia z>M!iRYi^(BEi&mozh1QV>iQb3?uB8u-|(y@KH6BkVbmWqN<*Z)_EsQ-fiMZwBOO7S z!61Vn7Q-wFvqLL47wwWQcPhav+&_U}T6Wz$g$=fiY>o znsnfFU=835;LQ@?2?!>HFh@1Cd*f~PHqp*&PF}YOgc6WqxIlYsRV!bA?AR_b&WJs% zAPVO`JsajQ!Xd*M43CU}ERU>!9H(<;4qzR1{e?cvTk_RUW$5t!tuTh(r|$ky7@DFeDx#|E z8u@Rb8$?H<>*h=hf(8-;%?mP7RAQKWgdh@4N6kRpWS$`S{~nsdIhtw#KqxR@s`(=v z02Bgd*q0?@-A&Y;Gas!<9GFviaE7OaV-FQ=-Q(Il^O}F~y^=uc&Dqn}B-*^;r7exoLE9GpQ1-z3jD1(e&Aw4d zP0U~0!GBY|ba_*>ZPnrLzWrlU>Ql92vt~t0{J+hmkGd*~Zw8L6vpSv0tkagwNq>7Y z{&n(l<-J5P-cqJC4 zrp~B;Ve>y#Ps(@EC6>Y^BNw}R?7JWPyJ!4;iOOikm=oP#^{;7sadO$hn7k|X^QxW+ z&x}-+*>eYCNvgiC3FfB!8N8IcogeI5e0|&M)~tK39x9tsd9^>9=@^-NG3D;(>ezXI zd^e~(nCyKwGdK0?J9}C^pV;#5a5vwWFn02e{`2{V`DBYnWPT}GlzQ7+JfS4#{ie3O zGmgHLoaZjwC~+U{imsT|(HnRrJxxkXpStnd*(21=g{Qj4mNS9Og40)$D?FWtE38@b z6W6Ql-j3E33Y)7e=?4xb3yvS!Uww%${%d#|yL{GYU&>uOW{2V*Md>@z({5Ldu|IUC zE}7xE+_iOI;(5r7pPHAu)iW@0M^nbVw}$%)fBm?!=$(cq`k9kI{5J7e0sF?9zKpl! zb8hKJb + * | Started around 2001-07, saved phpxml from near death and renamed to Php.XPath + * | Restructured XPath code to stay in line with XPath spec. + * | Sam Blum + * | Started around 2001-09 1st major restruct (V2.0) and testbench initiator. + * | 2nd (V3.0) major rewrite in 2002-02 + * | Daniel Allen + * | Started around 2001-10 working to make Php.XPath adhere to specs + * | Main Former Author: Michael P. Mehl + * | Inital creator of V 1.0. Stoped activities around 2001-03 + * +------------------------------------------------------------------------------------------------------+ + * | Code Structure: + * | --------------_ + * | The class is split into 3 main objects. To keep usability easy all 3 + * | objects are in this file (but may be split in 3 file in future). + * | +-------------+ + * | | XPathBase | XPathBase holds general and debugging functions. + * | +------+------+ + * | v + * | +-------------+ XPathEngine is the implementation of the W3C XPath spec. It contains the + * | | XPathEngine | XML-import (parser), -export and can handle xPathQueries. It's a fully + * | +------+------+ functional class but has no functions to modify the XML-document (see following). + * | v + * | +-------------+ + * | | XPath | XPath extends the functionality with actions to modify the XML-document. + * | +-------------+ We tryed to implement a DOM - like interface. + * +------------------------------------------------------------------------------------------------------+ + * | Usage: + * | ------ + * | Scroll to the end of this php file and you will find a short sample code to get you started + * +------------------------------------------------------------------------------------------------------+ + * | Glossary: + * | --------- + * | To understand how to use the functions and to pass the right parameters, read following: + * | + * | Document: (full node tree, XML-tree) + * | After a XML-source has been imported and parsed, it's stored as a tree of nodes sometimes + * | refered to as 'document'. + * | + * | AbsoluteXPath: (xPath, xPathSet) + * | A absolute XPath is a string. It 'points' to *one* node in the XML-document. We use the + * | term 'absolute' to emphasise that it is not an xPath-query (see xPathQuery). A valid xPath + * | has the form like '/AAA[1]/BBB[2]/CCC[1]'. Usually functions that require a node (see Node) + * | will also accept an abs. XPath. + * | + * | Node: (node, nodeSet, node-tree) + * | Some funtions require or return a node (or a whole node-tree). Nodes are only used with the + * | XPath-interface and have an internal structure. Every node in a XML document has a unique + * | corresponding abs. xPath. That's why public functions that accept a node, will usually also + * | accept a abs. xPath (a string) 'pointing' to an existing node (see absolutXPath). + * | + * | XPathQuery: (xquery, query) + * | A xPath-query is a string that is matched against the XML-document. The result of the match + * | is a xPathSet (vector of xPath's). It's always possible to pass a single absoluteXPath + * | instead of a xPath-query. A valid xPathQuery could look like this: + * | '//XXX/*[contains(., "foo")]/..' (See the link in 'What Is XPath' to learn more). + * | + * | + * +------------------------------------------------------------------------------------------------------+ + * | Internals: + * | ---------- + * | - The Node Tree + * | ------------- + * | A central role of the package is how the XML-data is stored. The whole data is in a node-tree. + * | A node can be seen as the equvalent to a tag in the XML soure with some extra info. + * | For instance the following XML + * | ****** + * | Would produce folowing node-tree: + * | 'super-root' <-- $nodeRoot (Very handy) + * | | + * | 'depth' 0 AAA[1] <-- top node. The 'textParts' of this node would be + * | / | \ 'textParts' => array('***','','**','*') + * | 'depth' 1 BBB[1] CCC[1] BBB[2] (NOTE: Is always size of child nodes+1) + * | - The Node + * | -------- + * | The node itself is an structure desiged mainly to be used in connection with the interface of PHP.XPath. + * | That means it's possible for functions to return a sub-node-tree that can be used as input of an other + * | PHP.XPath function. + * | + * | The main structure of a node is: + * | $node = array( + * | 'name' => '', # The tag name. E.g. In it would be 'FOO' + * | 'attributes' => array(), # The attributes of the tag E.g. In it would be array('bar'=>'aaa') + * | 'textParts' => array(), # Array of text parts surrounding the children E.g. aabbccdd -> array('aa','bb','cc','dd') + * | 'childNodes' => array(), # Array of refences (pointers) to child nodes. + * | + * | For optimisation reasions some additional data is stored in the node too: + * | 'parentNode' => NULL # Reference (pointer) to the parent node (or NULL if it's 'super root') + * | 'depth' => 0, # The tag depth (or tree level) starting with the root tag at 0. + * | 'pos' => 0, # Is the zero-based position this node has in the parent's 'childNodes'-list. + * | 'contextPos' => 1, # Is the one-based position this node has by counting the siblings tags (tags with same name) + * | 'xpath' => '' # Is the abs. XPath to this node. + * | 'generated_id'=> '' # The id returned for this node by generate-id() (attribute and text nodes not supported) + * | + * | - The NodeIndex + * | ------------- + * | Every node in the tree has an absolute XPath. E.g '/AAA[1]/BBB[2]' the $nodeIndex is a hash array + * | to all the nodes in the node-tree. The key used is the absolute XPath (a string). + * | + * +------------------------------------------------------------------------------------------------------+ + * | License: + * | -------- + * | The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); + * | you may not use this file except in compliance with the License. You may obtain a copy of the + * | License at http://www.mozilla.org/MPL/ + * | + * | Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY + * | OF ANY KIND, either express or implied. See the License for the specific language governing + * | rights and limitations under the License. + * | + * | The Original Code is . + * | + * | The Initial Developer of the Original Code is Michael P. Mehl. Portions created by Michael + * | P. Mehl are Copyright (C) 2001 Michael P. Mehl. All Rights Reserved. + * | + * | Contributor(s): N.Swinson / S.Blum / D.Allen + * | + * | Alternatively, the contents of this file may be used under the terms of either of the GNU + * | General Public License Version 2 or later (the "GPL"), or the GNU Lesser General Public + * | License Version 2.1 or later (the "LGPL"), in which case the provisions of the GPL or the + * | LGPL License are applicable instead of those above. If you wish to allow use of your version + * | of this file only under the terms of the GPL or the LGPL License and not to allow others to + * | use your version of this file under the MPL, indicate your decision by deleting the + * | provisions above and replace them with the notice and other provisions required by the + * | GPL or the LGPL License. If you do not delete the provisions above, a recipient may use + * | your version of this file under either the MPL, the GPL or the LGPL License. + * | + * +======================================================================================================+ + * + * @author S.Blum / N.Swinson / D.Allen / (P.Mehl) + * @link http://sourceforge.net/projects/phpxpath/ + * @version 3.5 + * @CVS $Id: XPath.class.php,v 1.9 2005/11/16 17:26:05 bigmichi1 Exp $ + */ + +// Include guard, protects file being included twice +$ConstantName = 'INCLUDED_'.strtoupper(__FILE__); +if (defined($ConstantName)) return; +define($ConstantName,1, TRUE); + +/************************************************************************************************ +* =============================================================================================== +* X P a t h B a s e - Class +* =============================================================================================== +************************************************************************************************/ +class XPathBase { + var $_lastError; + + // As debugging of the xml parse is spread across several functions, we need to make this a member. + var $bDebugXmlParse = FALSE; + + // do we want to do profiling? + var $bClassProfiling = FALSE; + + // Used to help navigate through the begin/end debug calls + var $iDebugNextLinkNumber = 1; + var $aDebugOpenLinks = array(); + var $aDebugFunctions = array( + //'_evaluatePrimaryExpr', + //'_evaluateExpr', + //'_evaluateStep', + //'_checkPredicates', + //'_evaluateFunction', + //'_evaluateOperator', + //'_evaluatePathExpr', + ); + + /** + * Constructor + */ + function XPathBase() { + # $this->bDebugXmlParse = TRUE; + $this->properties['verboseLevel'] = 1; // 0=silent, 1 and above produce verbose output (an echo to screen). + + if (!isSet($_ENV)) { // Note: $_ENV introduced in 4.1.0. In earlier versions, use $HTTP_ENV_VARS. + $_ENV = $GLOBALS['HTTP_ENV_VARS']; + } + + // Windows 95/98 do not support file locking. Detecting OS (Operation System) and setting the + // properties['OS_supports_flock'] to FALSE if win 95/98 is detected. + // This will surpress the file locking error reported from win 98 users when exportToFile() is called. + // May have to add more OS's to the list in future (Macs?). + // ### Note that it's only the FAT and NFS file systems that are really a problem. NTFS and + // the latest php libs do support flock() + $_ENV['OS'] = isSet($_ENV['OS']) ? $_ENV['OS'] : 'Unknown OS'; + switch ($_ENV['OS']) { + case 'Windows_95': + case 'Windows_98': + case 'Unknown OS': + // should catch Mac OS X compatible environment + if (!empty($_SERVER['SERVER_SOFTWARE']) + && preg_match('/Darwin/',$_SERVER['SERVER_SOFTWARE'])) { + // fall-through + } else { + $this->properties['OS_supports_flock'] = FALSE; + break; + } + default: + $this->properties['OS_supports_flock'] = TRUE; + } + } + + + /** + * Resets the object so it's able to take a new xml sting/file + * + * Constructing objects is slow. If you can, reuse ones that you have used already + * by using this reset() function. + */ + function reset() { + $this->_lastError = ''; + } + + //----------------------------------------------------------------------------------------- + // XPathBase ------ Helpers ------ + //----------------------------------------------------------------------------------------- + + /** + * This method checks the right amount and match of brackets + * + * @param $term (string) String in which is checked. + * @return (bool) TRUE: OK / FALSE: KO + */ + function _bracketsCheck($term) { + $leng = strlen($term); + $brackets = 0; + $bracketMisscount = $bracketMissmatsh = FALSE; + $stack = array(); + for ($i=0; $i<$leng; $i++) { + switch ($term[$i]) { + case '(' : + case '[' : + $stack[$brackets] = $term[$i]; + $brackets++; + break; + case ')': + $brackets--; + if ($brackets<0) { + $bracketMisscount = TRUE; + break 2; + } + if ($stack[$brackets] != '(') { + $bracketMissmatsh = TRUE; + break 2; + } + break; + case ']' : + $brackets--; + if ($brackets<0) { + $bracketMisscount = TRUE; + break 2; + } + if ($stack[$brackets] != '[') { + $bracketMissmatsh = TRUE; + break 2; + } + break; + } + } + // Check whether we had a valid number of brackets. + if ($brackets != 0) $bracketMisscount = TRUE; + if ($bracketMisscount || $bracketMissmatsh) { + return FALSE; + } + return TRUE; + } + + /** + * Looks for a string within another string -- BUT the search-string must be located *outside* of any brackets. + * + * This method looks for a string within another string. Brackets in the + * string the method is looking through will be respected, which means that + * only if the string the method is looking for is located outside of + * brackets, the search will be successful. + * + * @param $term (string) String in which the search shall take place. + * @param $expression (string) String that should be searched. + * @return (int) This method returns -1 if no string was found, + * otherwise the offset at which the string was found. + */ + function _searchString($term, $expression) { + $bracketCounter = 0; // Record where we are in the brackets. + $leng = strlen($term); + $exprLeng = strlen($expression); + for ($i=0; $i<$leng; $i++) { + $char = $term[$i]; + if ($char=='(' || $char=='[') { + $bracketCounter++; + continue; + } + elseif ($char==')' || $char==']') { + $bracketCounter--; + } + if ($bracketCounter == 0) { + // Check whether we can find the expression at this index. + if (substr($term, $i, $exprLeng) == $expression) return $i; + } + } + // Nothing was found. + return (-1); + } + + /** + * Split a string by a searator-string -- BUT the separator-string must be located *outside* of any brackets. + * + * Returns an array of strings, each of which is a substring of string formed + * by splitting it on boundaries formed by the string separator. + * + * @param $separator (string) String that should be searched. + * @param $term (string) String in which the search shall take place. + * @return (array) see above + */ + function _bracketExplode($separator, $term) { + // Note that it doesn't make sense for $separator to itself contain (,),[ or ], + // but as this is a private function we should be ok. + $resultArr = array(); + $bracketCounter = 0; // Record where we are in the brackets. + do { // BEGIN try block + // Check if any separator is in the term + $sepLeng = strlen($separator); + if (strpos($term, $separator)===FALSE) { // no separator found so end now + $resultArr[] = $term; + break; // try-block + } + + // Make a substitute separator out of 'unused chars'. + $substituteSep = str_repeat(chr(2), $sepLeng); + + // Now determine the first bracket '(' or '['. + $tmp1 = strpos($term, '('); + $tmp2 = strpos($term, '['); + if ($tmp1===FALSE) { + $startAt = (int)$tmp2; + } elseif ($tmp2===FALSE) { + $startAt = (int)$tmp1; + } else { + $startAt = min($tmp1, $tmp2); + } + + // Get prefix string part before the first bracket. + $preStr = substr($term, 0, $startAt); + // Substitute separator in prefix string. + $preStr = str_replace($separator, $substituteSep, $preStr); + + // Now get the rest-string (postfix string) + $postStr = substr($term, $startAt); + // Go all the way through the rest-string. + $strLeng = strlen($postStr); + for ($i=0; $i < $strLeng; $i++) { + $char = $postStr[$i]; + // Spot (,),[,] and modify our bracket counter. Note there is an + // assumption here that you don't have a string(with[mis)matched]brackets. + // This should be ok as the dodgy string will be detected elsewhere. + if ($char=='(' || $char=='[') { + $bracketCounter++; + continue; + } + elseif ($char==')' || $char==']') { + $bracketCounter--; + } + // If no brackets surround us check for separator + if ($bracketCounter == 0) { + // Check whether we can find the expression starting at this index. + if ((substr($postStr, $i, $sepLeng) == $separator)) { + // Substitute the found separator + for ($j=0; $j<$sepLeng; $j++) { + $postStr[$i+$j] = $substituteSep[$j]; + } + } + } + } + // Now explod using the substitute separator as key. + $resultArr = explode($substituteSep, $preStr . $postStr); + } while (FALSE); // End try block + // Return the results that we found. May be a array with 1 entry. + return $resultArr; + } + + /** + * Split a string at it's groups, ie bracketed expressions + * + * Returns an array of strings, when concatenated together would produce the original + * string. ie a(b)cde(f)(g) would map to: + * array ('a', '(b)', cde', '(f)', '(g)') + * + * @param $string (string) The string to process + * @param $open (string) The substring for the open of a group + * @param $close (string) The substring for the close of a group + * @return (array) The parsed string, see above + */ + function _getEndGroups($string, $open='[', $close=']') { + // Note that it doesn't make sense for $separator to itself contain (,),[ or ], + // but as this is a private function we should be ok. + $resultArr = array(); + do { // BEGIN try block + // Check if we have both an open and a close tag + if (empty($open) and empty($close)) { // no separator found so end now + $resultArr[] = $string; + break; // try-block + } + + if (empty($string)) { + $resultArr[] = $string; + break; // try-block + } + + + while (!empty($string)) { + // Now determine the first bracket '(' or '['. + $openPos = strpos($string, $open); + $closePos = strpos($string, $close); + if ($openPos===FALSE || $closePos===FALSE) { + // Oh, no more groups to be found then. Quit + $resultArr[] = $string; + break; + } + + // Sanity check + if ($openPos > $closePos) { + // Malformed string, dump the rest and quit. + $resultArr[] = $string; + break; + } + + // Get prefix string part before the first bracket. + $preStr = substr($string, 0, $openPos); + // This is the first string that will go in our output + if (!empty($preStr)) + $resultArr[] = $preStr; + + // Skip over what we've proceed, including the open char + $string = substr($string, $openPos + 1 - strlen($string)); + + // Find the next open char and adjust our close char +//echo "close: $closePos\nopen: $openPos\n\n"; + $closePos -= $openPos + 1; + $openPos = strpos($string, $open); +//echo "close: $closePos\nopen: $openPos\n\n"; + + // While we have found nesting... + while ($openPos && $closePos && ($closePos > $openPos)) { + // Find another close pos after the one we are looking at + $closePos = strpos($string, $close, $closePos + 1); + // And skip our open + $openPos = strpos($string, $open, $openPos + 1); + } +//echo "close: $closePos\nopen: $openPos\n\n"; + + // If we now have a close pos, then it's the end of the group. + if ($closePos === FALSE) { + // We didn't... so bail dumping what was left + $resultArr[] = $open.$string; + break; + } + + // We did, so we can extract the group + $resultArr[] = $open.substr($string, 0, $closePos + 1); + // Skip what we have processed + $string = substr($string, $closePos + 1); + } + } while (FALSE); // End try block + // Return the results that we found. May be a array with 1 entry. + return $resultArr; + } + + /** + * Retrieves a substring before a delimiter. + * + * This method retrieves everything from a string before a given delimiter, + * not including the delimiter. + * + * @param $string (string) String, from which the substring should be extracted. + * @param $delimiter (string) String containing the delimiter to use. + * @return (string) Substring from the original string before the delimiter. + * @see _afterstr() + */ + function _prestr(&$string, $delimiter, $offset=0) { + // Return the substring. + $offset = ($offset<0) ? 0 : $offset; + $pos = strpos($string, $delimiter, $offset); + if ($pos===FALSE) return $string; else return substr($string, 0, $pos); + } + + /** + * Retrieves a substring after a delimiter. + * + * This method retrieves everything from a string after a given delimiter, + * not including the delimiter. + * + * @param $string (string) String, from which the substring should be extracted. + * @param $delimiter (string) String containing the delimiter to use. + * @return (string) Substring from the original string after the delimiter. + * @see _prestr() + */ + function _afterstr($string, $delimiter, $offset=0) { + $offset = ($offset<0) ? 0 : $offset; + // Return the substring. + return substr($string, strpos($string, $delimiter, $offset) + strlen($delimiter)); + } + + //----------------------------------------------------------------------------------------- + // XPathBase ------ Debug Stuff ------ + //----------------------------------------------------------------------------------------- + + /** + * Alter the verbose (error) level reporting. + * + * Pass an int. >0 to turn on, 0 to turn off. The higher the number, the + * higher the level of verbosity. By default, the class has a verbose level + * of 1. + * + * @param $levelOfVerbosity (int) default is 1 = on + */ + function setVerbose($levelOfVerbosity = 1) { + $level = -1; + if ($levelOfVerbosity === TRUE) { + $level = 1; + } elseif ($levelOfVerbosity === FALSE) { + $level = 0; + } elseif (is_numeric($levelOfVerbosity)) { + $level = $levelOfVerbosity; + } + if ($level >= 0) $this->properties['verboseLevel'] = $levelOfVerbosity; + } + + /** + * Returns the last occured error message. + * + * @access public + * @return string (may be empty if there was no error at all) + * @see _setLastError(), _lastError + */ + function getLastError() { + return $this->_lastError; + } + + /** + * Creates a textual error message and sets it. + * + * example: 'XPath error in THIS_FILE_NAME:LINE. Message: YOUR_MESSAGE'; + * + * I don't think the message should include any markup because not everyone wants to debug + * into the browser window. + * + * You should call _displayError() rather than _setLastError() if you would like the message, + * dependant on their verbose settings, echoed to the screen. + * + * @param $message (string) a textual error message default is '' + * @param $line (int) the line number where the error occured, use __LINE__ + * @see getLastError() + */ + function _setLastError($message='', $line='-', $file='-') { + $this->_lastError = 'XPath error in ' . basename($file) . ':' . $line . '. Message: ' . $message; + } + + /** + * Displays an error message. + * + * This method displays an error messages depending on the users verbose settings + * and sets the last error message. + * + * If also possibly stops the execution of the script. + * ### Terminate should not be allowed --fab. Should it?? N.S. + * + * @param $message (string) Error message to be displayed. + * @param $lineNumber (int) line number given by __LINE__ + * @param $terminate (bool) (default TURE) End the execution of this script. + */ + function _displayError($message, $lineNumber='-', $file='-', $terminate=TRUE) { + // Display the error message. + $err = 'XPath error in '.basename($file).':'.$lineNumber.' '.$message."
      \n"; + $this->_setLastError($message, $lineNumber, $file); + if (($this->properties['verboseLevel'] > 0) OR ($terminate)) echo $err; + // End the execution of this script. + if ($terminate) exit; + } + + /** + * Displays a diagnostic message + * + * This method displays an error messages + * + * @param $message (string) Error message to be displayed. + * @param $lineNumber (int) line number given by __LINE__ + */ + function _displayMessage($message, $lineNumber='-', $file='-') { + // Display the error message. + $err = 'XPath message from '.basename($file).':'.$lineNumber.' '.$message."
      \n"; + if ($this->properties['verboseLevel'] > 0) echo $err; + } + + /** + * Called to begin the debug run of a function. + * + * This method starts a