Hi guys,<br><br>I am not a really skilled developer, but I would like as well to see vTiger evolve to a product even more stable.<br><br>As 
Dennis Grant, Richie and many others are outlining, there are many issues in the source code design, security, tests, etc.<br>My point of view is if we try to fixes those issues without a structured process, it will never end..
<br><br>I would suggest:<br>1. Categories the needs of softwares in general on a Wiki: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Security&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / List of the possible hacks for PHP Mysql Apache etc.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Code efficiency / No duplicated code, no dead code, etc.
<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; Code design&nbsp;&nbsp;&nbsp;&nbsp; / Variables on top, functions written clearly and in logic order, functions variables commented<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User interface&nbsp;&nbsp; / Display, form verification, Ajax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add other categories or modify those above, I just give an overview of what I think
<br><br>2. Once we have categories, define the rules on a Wiki:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Security&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / Fix SQL injections: Use the function xxx in every sql queries<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fix ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Code efficiency / Delete all the code commented 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Delete all the code not used<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Define main design patterns precisely<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Recode each functions which can be improved
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Code design&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / Comment each variables<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; / Comment each function<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / Create complete vTiger API<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User interface&nbsp;&nbsp;&nbsp; / Manage and fix design problems
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / Manage and fix Ajax<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; / Manage and fix Javascript verifications on forms<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add other categories or modify those above, I just give an overview of what I think
<br><br>3. Wait for the release of vTigercrm-5.0.3<br><br>4. Create a Branche in vTiger Trac system named &quot;5.0.3 Core Code Improvement&quot;<br><br>5. Work on files 1 by 1 according to the categories and rules<br><br>
6. When file has been treated in this process once, a second check must be performed<br><br>Those steps are not very well described, we needs more technical people to define precisely categories and rules, but if a structure like that is established, even if the work is huge we could at the end get a proper code really clean... after what the database should be worked out with the same process, and finally update the code according to the database changes.
<br><br>What do you think?<br><br>Regards,<br>Clem<br><br><br><div><span class="gmail_quote">On 1/12/07, <b class="gmail_sendername">Joe Bordes</b> &lt;<a href="mailto:joe@tsolucio.com">joe@tsolucio.com</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi Richie,<br><br>I would really like to help. But my experience has been that you don&#39;t
<br>want that help.<br><br>I have asked many &quot;developer&quot; questions on this list and have received<br>no answer. I am adding modules and code to vtiger and need to know the<br>changes so these can keep up<br>I have directly asked questions about vforge to no avail
<br>I have sent email thru web asking to colaborate and host <a href="http://vtiger.es">vtiger.es</a> -&gt;<br>nothing<br>I have offered my help with exact details -&gt; nothing<br>I was actively helping in the forums and wiki -&gt; doesn&#39;t to seem
<br>important<br><br>Sorry to be so harsh, it is not my intention (email is very cold). I am<br>just stating my personal experience and feelings. If you can get in<br>contact with me, I am very interested in establishing a relationship
<br>with VTiger and helping out.<br><br>Regards, Joe<br>TSolucio<br><br>El vie, 12-01-2007 a las 14:47 +0530, richie escribiσ:<br>&gt; Dennis you are bang on target.<br>&gt; Yes, we do have inconsistencies of the kind you have mentioned and
<br>&gt; some worse too ;-).<br>&gt;<br>&gt; Thanks for pointing these out.<br>&gt; If you have made some fixes to these kinds of issues, do contribute<br>&gt; the same back and we will have it integrated into the core.<br>
&gt;<br>&gt; The code can be vastly improved team and we need your help. This is<br>&gt; something that I have always asked for. We are not geniuses but we are<br>&gt; willing to learn.<br>&gt; Yes there are pretty, pretty bad practices in the code but then not
<br>&gt; all the code is junk. Together we can clean it up much much faster.<br>&gt;<br>&gt; Richie<br>&gt;<br>&gt; Dennis Grant wrote:<br>&gt; &gt; OK gang, time for me to go off on a rant here:<br>&gt; &gt;<br>&gt; &gt;
<br>&gt; &gt;<br>&gt; &gt; I recently had a ticket where a user – a manager – was complaining<br>&gt; &gt; about how the HelpDesk-TroubleTickets module had two views called<br>&gt; &gt; "All", and they had different definitions.
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; I had a look inside the vtiger_customview table, and sure enough,<br>&gt; &gt; there were two rows in HelpDesk titled "All"; one with a viewed of<br>&gt; &gt; "64" and one with a viewed of '95".
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; I was able to determine that viewed = 64 was the correct one. It<br>&gt; &gt; looked to me like somebody had created a custom view titled<br>&gt; &gt; "All" (that ought to be a reserved word and should be rejected as a
<br>&gt; &gt; possible custom view name) and the user interface (soundly) doesn't<br>&gt; &gt; allow a view named "All" to be deleted.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; So I deleted that row from the database – and all hell broke loose.
<br>&gt; &gt; All of a sudden, I couldn't view the ListView for the HelpDesk<br>&gt; &gt; module any more; instead, I got the familiar "PearDatabase" error<br>&gt; &gt; which means some Sql statement somewhere is screwed up.
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; So I go "whoops!" and I put the line back in the table – and that<br>&gt; &gt; DOESN'T FIX THE PROBLEM.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; Oh. Shit.<br>
&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; It takes me a few seconds to work out that something, somewhere has<br>&gt; &gt; associated my user with the cvid of 95 and my yanking it out has<br>&gt; &gt; broken that association. I go looking for where that association is
<br>&gt; &gt; stored (FOR USER admin MODULE helpdesk USE LISTVIEW CUSTOMVIEW 95)<br>&gt; &gt; but I can't find it.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; So I go into the code itself, and discover the culprit is the line:
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; $list_query = $oCustomView-&gt;getModifiedCvListQuery($viewid,<br>&gt; &gt; $listquery,&quot;HelpDesk&quot;);<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; In HelpDesk/ListView.php. $list_query is coming back as "select ,
<br>&gt; &gt; foo bar blech", and then later on that query is executed. This query<br>&gt; &gt; not being proper SQL syntax, it bombs.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; As a quick fix, I add the following hack:
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; If ($viewid == 95) {<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;$viewid = 64;<br>&gt; &gt;<br>&gt; &gt; }<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; Which restores functionality – whew! – and then I go looking to see
<br>&gt; &gt; what the hell happened.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; I am not a DBA; my database experience up to this point was a couple<br>&gt; &gt; of basic SQL and database classes in college, and some basic
<br>&gt; &gt; database reporting apps in the 20-odd years since. I'm learning the<br>&gt; &gt; DBA stuff on the fly. I was not aware of "ON DELETE CASCADE" foreign<br>&gt; &gt; key constraints, and the concept that deleting a row from one table
<br>&gt; &gt; might cascade through other tables. I am now. I discovered that<br>&gt; &gt; there are a number of tables set up that use the vtiger_customview<br>&gt; &gt; table as a foreign key, and have the ON DELETE CASCADE constraint on
<br>&gt; &gt; them. Thus, deleting the row from vtiger_customview deleted rows<br>&gt; &gt; from vtiger_cvcolumnlist (and a few others) which explains why my<br>&gt; &gt; putting that row back in didn't fix the problem. I guess I need to
<br>&gt; &gt; learn about rollbacks.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; That's *MY* mistake. It is always dangerous to muck around with the<br>&gt; &gt; brains of an application without knowing all the ramifications
<br>&gt; &gt; beforehand. Something innocent looking turned out to have deeper<br>&gt; &gt; implications than I assumed, and I got myself into a spot of<br>&gt; &gt; trouble. My Bad.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;
<br>&gt; &gt; But – and this is what I want to rant about – there is blame to<br>&gt; &gt; share here. Because in further debugging the chain of events that<br>&gt; &gt; led to a PHP error being displayed to a user, one sees that the CRM
<br>&gt; &gt; code is making all kinds of assumptions about its data. The<br>&gt; &gt; application is positively RIFE with:<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; $sql_query = buildQueryDynamically();<br>&gt; &gt;
<br>&gt; &gt; $result_set = sql-&gt;execute($sql_query);<br>&gt; &gt;<br>&gt; &gt; doSomething($result_set);<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; Where NONE of these procedures EVER checks for errors.<br>&gt; &gt;
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; Here's an actual example:<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; function getCvColumnListSQL($cvid)<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $columnslist = $this-&gt;getColumnsListByCvid($cvid);
<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(isset($columnslist))<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach($columnslist as $columnname=&gt;$value)<br>&gt; &gt;
<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $tablefield = &quot;&quot;;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($value != &quot;&quot;)<br>&gt; &gt;
<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $list = explode(&quot;:&quot;,$value);<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Added For getting status
<br>&gt; &gt; for Activities -Jaguar<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sqllist_column =<br>&gt; &gt; $list[0].&quot;.&quot;.$list[1];<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($this-&gt;customviewmodule
<br>&gt; &gt; == &quot;Calendar&quot;)<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($list[1] ==<br>&gt; &gt; &quot;status&quot;)
<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sqllist_column = &quot;case when<br>&gt; &gt; (vtiger_activity.status not like &#39;&#39;) then vtiger_activity.status
<br>&gt; &gt; else vtiger_activity.eventstatus end as activitystatus&quot;;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Added for for assigned to<br>&gt; &gt; sorting<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($list[1] == &quot;smownerid&quot;)
<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sqllist_column =<br>&gt; &gt; &quot;case when (vtiger_users.user_name not like &#39;&#39;) then
<br>&gt; &gt; vtiger_users.user_name else vtiger_groups.groupname end as<br>&gt; &gt; user_name&quot;;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $sqllist[] =
<br>&gt; &gt; $sqllist_column;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Ends<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $tablefield[$list[0]] =<br>
&gt; &gt; $list[1];<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $fieldlabel =<br>&gt; &gt; trim(str_replace($this-&gt;escapemodule,&quot; &quot;,$list[3]));<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;list_fields[$fieldlabel] = $tablefield;
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; $this-&gt;list_fields_name[$fieldlabel] = $list[2];<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $returnsql = implode(&quot;,&quot;,$sqllist);
<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $returnsql;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; This function assumes everything works – there's no test to see if
<br>&gt; &gt; the $cvid parameter passed in is not null. It checks to see if<br>&gt; &gt; $columnlist isset before doing stuff, but has no code in the case of<br>&gt; &gt; $columnlist NOT being set. There's no test to check for $columnlist
<br>&gt; &gt; being set, but containing no rows. It COULD attempt to fill in<br>&gt; &gt; reasonable defaults. It COULD flag the error back higher to the<br>&gt; &gt; function that called it. There's a million different things that it
<br>&gt; &gt; COULD do – but instead, it fails silently, returning bogus data,<br>&gt; &gt; which breaks the upstream code.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; This function is only half done. It works for cases where everything
<br>&gt; &gt; works as expected, but fails spectacularly in cases where the<br>&gt; &gt; unexpected happens:<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; - what should it do if $columnslist fails the isset test?<br>
&gt; &gt;<br>&gt; &gt; - what should it do if $columnname or $value is NULL?<br>&gt; &gt;<br>&gt; &gt; - what should it do if the explode() fails (meaning that the data in<br>&gt; &gt; value is not in the expected format)?
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; And this sort of thing happens ALL OVER THE PLACE in the CRM code.<br>&gt; &gt; There is a persistent and pathological lack of error checking and<br>&gt; &gt; handling.
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; This needs to be rectified.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; Please, please, PLEASE – if you are writing new code for the CRM,<br>&gt; &gt; take the time to do the error checking and handling!
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; DG<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; ____________________________________________________________________<br>&gt; &gt;<br>&gt; &gt; _______________________________________________
<br>&gt; &gt; Reach hundreds of potential candidates - <a href="http://jobs.vtiger.com">http://jobs.vtiger.com</a><br>&gt;<br>&gt; _______________________________________________<br>&gt; Reach hundreds of potential candidates - 
<a href="http://jobs.vtiger.com">http://jobs.vtiger.com</a><br><br>_______________________________________________<br>Reach hundreds of potential candidates - <a href="http://jobs.vtiger.com">http://jobs.vtiger.com</a> </blockquote>
</div><br>