e5a91fb1be4561bbca0c811b37074ab15ef63402
[fa-stable.git] / includes / db / crm_contacts_db.inc
1 <?php
2 /**********************************************************************
3     Copyright (C) FrontAccounting, LLC.
4         Released under the terms of the GNU General Public License, GPL, 
5         as published by the Free Software Foundation, either version 3 
6         of the License, or (at your option) any later version.
7     This program is distributed in the hope that it will be useful,
8     but WITHOUT ANY WARRANTY; without even the implied warranty of
9     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
10     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
12
13 function add_crm_person($ref, $name, $name2, $address, $phone, $phone2, $fax, $email, $lang, $notes,
14         $cat_ids=null, $entity=null)
15 {
16         $sql = "INSERT INTO ".TB_PREF."crm_persons (ref, name, name2, address,
17                 phone, phone2, fax, email, lang, notes)
18                 VALUES ("
19                   .db_escape($ref) . ", "
20                   .db_escape($name) . ", "
21                   .db_escape($name2) . ", "
22                   .db_escape($address) . ", "
23                   .db_escape($phone) . ", "
24                   .db_escape($phone2) . ", "
25                   .db_escape($fax) . ", "
26                   .db_escape($email) . ", "
27                   .db_escape($lang) . ", "
28                   .db_escape($notes)
29                 .")";
30
31         begin_transaction();
32
33         $ret = db_query($sql, "Can't insert crm person");
34         $id = db_insert_id();
35         if ($ret && $cat_ids) {
36                 if(!update_person_contacts($id, $cat_ids, $entity))
37                         return null;
38         }
39         commit_transaction();
40         return $id;
41 }
42
43 function update_crm_person($id, $ref, $name, $name2, $address, $phone, $phone2, $fax, $email, 
44         $lang, $notes, $cat_ids, $entity=null, $type=null)
45 {
46         $sql = "UPDATE ".TB_PREF."crm_persons SET "
47                   ."ref=".db_escape($ref) . ", "
48                   ."name=".db_escape($name) . ", "
49                   ."name2=".db_escape($name2) . ", "
50                   ."address=".db_escape($address) . ", "
51                   ."phone=".db_escape($phone) . ", "
52                   ."phone2=".db_escape($phone2) . ", "
53                   ."fax=".db_escape($fax) . ", "
54                   ."email=".db_escape($email) . ", "
55                   ."lang=".db_escape($lang) . ", "
56                   ."notes=".db_escape($notes)
57                   ." WHERE id = ".db_escape($id);
58
59         begin_transaction();
60
61         $ret = db_query($sql, "Can't update crm person");
62         if ($ret) {
63                 if(!update_person_contacts($id, $cat_ids, $entity, $type))
64                         return null;
65         }
66         commit_transaction();
67         return $id;
68 }
69
70 function delete_crm_person($person, $with_contacts=false)
71 {
72         begin_transaction();
73
74         if ($with_contacts) {
75                 $sql = "DELETE FROM ".TB_PREF."crm_contacts WHERE person_id=".db_escape($person);
76                 db_query($sql, "Can't delete crm contacts");
77         }
78         $sql = "DELETE FROM ".TB_PREF."crm_persons WHERE id=".db_escape($person);
79         $ret = db_query($sql, "Can't delete crm person");
80
81         commit_transaction();
82         return $ret;
83 }
84 /*
85         Retrieve full contact data from database for selected type/action/entity or person
86 */
87 function get_crm_persons($type=null, $action=null, $entity=null, $person=null, $unique=false)
88 {
89         $sql = "SELECT t.*, p.*, r.id as contact_id FROM ".TB_PREF."crm_persons p,"
90                 .TB_PREF."crm_categories t, "
91                 .TB_PREF."crm_contacts r WHERE ";
92         $sel = array('r.type=t.type', 'r.action=t.action', 'r.person_id=p.id');
93
94         if ($type) 
95                 $sel[] = 't.type='.db_escape($type);
96
97         if ($action) 
98                 $sel[] = 't.action='.db_escape($action);
99
100         if ($entity) 
101                 $sel[] = 'r.entity_id='.db_escape($entity);
102
103         if ($person)
104                 $sel[] = 'r.person_id='.db_escape($person);
105
106         $sql .= implode (" AND ", $sel);
107
108         if ($unique)
109                 $sql .= " GROUP BY person_id";
110         else
111                 $sql .= " ORDER BY contact_id";
112
113         $result = db_query($sql, "Can't get crm persons");
114         // fallback to general contacts
115         if (!db_num_rows($result) && $action && $action != 'general')
116                 return get_crm_persons($type, 'general', $entity, $person, $unique);
117         else
118                 return $result;
119 }
120
121 function get_crm_person($id)
122 {
123         $sql = "SELECT * FROM ".TB_PREF."crm_persons WHERE id=".db_escape($id);
124
125         $res = db_query($sql, "Can't get crm persons");
126
127         $person = db_fetch($res);
128         $person['contacts'] = get_person_contacts($id);
129
130         return $person;
131 }
132
133 /*
134         Returns all contacts for given person id
135 */
136 function get_person_contacts($id)
137 {
138         $sql = "SELECT t.id FROM "
139                 .TB_PREF."crm_categories t, "
140                 .TB_PREF."crm_contacts r WHERE r.type=t.type AND r.action=t.action 
141                         AND r.person_id=".db_escape($id);
142
143         $contacts = array();
144         $ret = db_query($sql, "Can't get crm person contacts");
145         while($cont = db_fetch_row($ret))
146                 $contacts[] = $cont[0];
147         return $contacts;
148 }
149
150 function update_person_contacts($id, $cat_ids, $entity_id=null, $type=null)
151 {
152         $sql = "DELETE FROM ".TB_PREF."crm_contacts WHERE person_id=".db_escape($id);
153         if ($type)
154                 $sql .= " AND type=".db_escape($type);
155
156         begin_transaction();
157
158         $ret = db_query($sql, "Can't delete person contacts");
159
160         foreach($cat_ids as $n => $cid)
161                 $cat_ids[$n] = db_escape($cid);
162
163         if($ret && count($cat_ids)) {
164                 array_walk($cat_ids,'db_escape');
165                 $sql = "INSERT INTO ".TB_PREF."crm_contacts (person_id,type,action,entity_id)
166                         SELECT ".db_escape($id).",t.type, t.action,".db_escape($entity_id, true)."
167                         FROM ".TB_PREF."crm_categories t WHERE t.id=".implode(' OR t.id=', $cat_ids);
168                 if ($type)
169                         $sql .= " AND t.type=".db_escape($type);
170                 $ret = db_query($sql, "Can't update person contacts");
171         }
172         commit_transaction();
173         return $ret;
174 }
175
176 function delete_entity_contacts($class, $entity)
177 {
178         delete_crm_contacts(null, $class, $entity);
179         // cleanup
180         $res = get_crm_persons($class, null, $entity, null, true);
181         while($person = db_fetch($res)) {
182                 $rels = get_person_contacts($person['id']);
183                 if (count($rels) == 0) {
184                         delete_crm_person($person['id']);
185                 }
186         }
187 }
188
189 //-----------------------------------------------------------------------------------------------
190
191 function add_crm_category($type, $action, $name, $description)
192 {
193         $sql = "INSERT INTO ".TB_PREF."crm_categories (type, action, name, description)
194                 VALUES (".db_escape($type) . ", "
195                   .db_escape($action) . ", "
196                   .db_escape($name) . ", "
197                   .db_escape($description)
198                 .")";
199         db_query($sql,"The insert of the crm category failed");
200 }
201
202 function update_crm_category($selected_id, $type, $action, $name, $description)
203 {
204         $sql = "UPDATE ".TB_PREF."crm_categories SET ";
205         if ($type)
206                 $sql .= "type=".db_escape($type) . ",";
207         if ($action)
208                 $sql .= "action=".db_escape($action) . ",";
209         $sql .= "name=".db_escape($name) . ","
210                         ."description=".db_escape($description)
211                         ." WHERE id = ".db_escape($selected_id);
212         db_query($sql,"The update of the crm category failed");
213 }
214
215 function delete_crm_category($selected_id)
216 {
217         // preserve system categories
218         $sql="DELETE FROM ".TB_PREF."crm_categories WHERE system=0 AND id=".db_escape($selected_id);
219         db_query($sql,"could not delete crm category");
220 }
221
222 function get_crm_categories($show_inactive)
223 {
224         $sql = "SELECT * FROM ".TB_PREF."crm_categories";
225         if (!$show_inactive) $sql .= " WHERE !inactive";
226         $sql .= " ORDER BY type, action";
227         return db_query($sql,"could not get areas");
228 }
229
230 function get_crm_category($selected_id)
231 {
232         $sql = "SELECT * FROM ".TB_PREF."crm_categories WHERE id=".db_escape($selected_id);
233
234         $result = db_query($sql,"could not get crm category");
235         return db_fetch($result);
236 }
237
238 function get_crm_category_name($id)
239 {
240         $sql = "SELECT name FROM ".TB_PREF."crm_categories WHERE id=".db_escape($id);
241
242         $result = db_query($sql, "could not get sales type");
243
244         $row = db_fetch_row($result);
245         return $row[0];
246 }
247
248 //----------------------------------------------------------------------------------------
249 //      Contact is relation between person and entity in some category
250 //
251 function add_crm_contact($type, $action, $entity_id, $person_id)
252 {
253         $sql = "INSERT INTO ".TB_PREF."crm_contacts (person_id, type, action, entity_id) VALUES ("
254                 .db_escape($person_id) . ","
255                 .db_escape($type) . ","
256                 .db_escape($action) . ","
257                 .db_escape($entity_id) . ")";
258         return db_query($sql, "Can't insert crm contact");
259 }
260 /*
261         Delete contact selected by unique id.
262 */
263 function delete_crm_contact($id)
264 {
265         $sql = "DELETE FROM ".TB_PREF."crm_contacts WHERE id=".db_escape($id);
266
267         return db_query($sql, "Can't delete crm contact");
268 }
269 /*
270         Delete selected contacts for given person
271 */
272 function delete_crm_contacts($person_id = null, $type = null, $entity_id=null, $action = null)
273 {
274         $sql = "DELETE FROM ".TB_PREF."crm_contacts WHERE ";
275
276         if ($person_id)
277                 $where[] = 'person_id='.db_escape($person_id);
278         if ($type)
279                 $where[] = 'type='.db_escape($type);
280         if ($entity_id)
281                 $where[] = 'entity_id='.db_escape($entity_id);
282         if ($action)
283                 $where[] = 'action='.db_escape($action);
284
285         return db_query($sql.implode(' AND ', $where), "Can't delete crm contact");
286 }
287
288 /*
289         Returns person data for given contact id
290 */
291 function get_crm_contact($id)
292 {
293         $sql = "SELECT t.type, t.action, p.*, r.person_id, r.id  FROM ".TB_PREF."crm_persons p,"
294                 .TB_PREF."crm_categories t, "
295                 .TB_PREF."crm_contacts r WHERE r.type=t.type AND r.action=t.action AND r.person_id=p.id"
296                 ." AND r.id=".db_escape($id);
297         $ret = db_query($sql, "Can't get crm contact");
298         if($ret)
299                 return  db_fetch($ret, "Can't fetch contact data");
300         return $ret;
301 }
302
303 /*
304          Check for whether category is used in contacts.
305 */
306 function is_crm_category_used($id)
307 {
308         $row = get_crm_category($id);
309         $sql = "SELECT COUNT(*) FROM ".TB_PREF."crm_contacts WHERE type='".$row['type']."' AND action='".$row['action']."'";
310         $result = db_query($sql, "check relations for crm_contacts failed");
311         $contacts = db_fetch($result);
312         return $contacts[0];
313 }
314
315