22a99e8e2273d8a946259b1d3d2eff548f9a9be2
[tine20] / tine20 / Crm / js / Model.js
1 /*
2  * Tine 2.0
3  * 
4  * @package     Crm
5  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
6  * @author      Philipp Schuele <p.schuele@metaways.de>
7  * @copyright   Copyright (c) 2007-2010 Metaways Infosystems GmbH (http://www.metaways.de)
8  *
9  */
10  
11 Ext.namespace('Tine.Crm', 'Tine.Crm.Model');
12
13 /**
14  * @namespace Tine.Crm.Model
15  * @class Tine.Crm.Model.Lead
16  * @extends Tine.Tinebase.data.Record
17  * 
18  * Lead Record Definition
19  */ 
20 Tine.Crm.Model.Lead = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.genericFields.concat([
21         {name: 'id',            type: 'string'},
22         {name: 'lead_name',     type: 'string'},
23         {name: 'leadstate_id',  type: 'int'},
24         {name: 'leadtype_id',   type: 'int'},
25         {name: 'leadsource_id', type: 'int'},
26         {name: 'start',         type: 'date', dateFormat: Date.patterns.ISO8601Long},
27         {name: 'description',   type: 'string'},
28         {name: 'end',           type: 'date', dateFormat: Date.patterns.ISO8601Long},
29         {name: 'turnover',      type: 'int'},
30         {name: 'probability',   type: 'int'},
31         {name: 'probableTurnover',   type: 'int'},
32         {name: 'end_scheduled', type: 'date', dateFormat: Date.patterns.ISO8601Long},
33         {name: 'lastread'},
34         {name: 'lastreader'},
35         {name: 'responsible'},
36         {name: 'customer'},
37         {name: 'partner'},
38         {name: 'tasks'},
39         {name: 'relations'},
40         {name: 'products'},
41         {name: 'tags'},
42         {name: 'notes'},
43         {name: 'customfields', omitDuplicateResolving: true}
44     ]), {
45     appName: 'Crm',
46     modelName: 'Lead',
47     idProperty: 'id',
48     titleProperty: 'lead_name',
49     // ngettext('Lead', 'Leads', n);
50     recordName: 'Lead',
51     recordsName: 'Leads',
52     containerProperty: 'container_id',
53     // ngettext('lead list', 'lead lists', n); gettext('lead lists');
54     containerName: 'lead list',
55     containersName: 'lead lists',
56     getTitle: function() {
57         return this.get('lead_name') ? this.get('lead_name') : false;
58     }
59 });
60
61 /**
62  * @namespace Tine.Crm.Model
63  * 
64  * get default data for a new lead
65  *  
66  * @return {Object} default data
67  * @static
68  * 
69  * TODO generalize default container id handling?
70  */ 
71 Tine.Crm.Model.Lead.getDefaultData = function() {
72     
73     var defaults = Tine.Crm.registry.get('defaults');
74     var app = Tine.Tinebase.appMgr.get('Crm');
75     
76     var data = {
77         start: new Date().clearTime(),
78         leadstate_id: defaults.leadstate_id,
79         leadtype_id: defaults.leadtype_id,
80         leadsource_id: defaults.leadsource_id,
81         container_id: app.getMainScreen().getWestPanel().getContainerTreePanel().getSelectedContainer('addGrant', defaults.container_id),
82         probability: 0,
83         turnover: 0,
84         relations: [{
85             type: 'responsible',
86             related_record: Tine.Tinebase.registry.get('userContact')
87         }]
88     };
89     
90     return data;
91 };
92
93 /**
94  * get filtermodel of lead model
95  * 
96  * @namespace Tine.Crm.Model
97  * @static
98  * @return {Array} filterModel definition
99  */ 
100 Tine.Crm.Model.Lead.getFilterModel = function() {
101     var app = Tine.Tinebase.appMgr.get('Crm'),
102         filters = [
103             {label: _('Quick Search'),  field: 'query',    operators: ['contains']},
104             {filtertype: 'tine.widget.container.filtermodel', app: app, recordClass: Tine.Crm.Model.Lead},
105             {label: app.i18n._('Lead name'),   field: 'lead_name' },
106             {filtertype: 'crm.leadstate', app: app},
107             {label: app.i18n._('Probability'), field: 'probability', valueType: 'percentage'},
108             {label: app.i18n._('Turnover'),    field: 'turnover', valueType: 'number', defaultOperator: 'greater'},
109             {filtertype: 'tinebase.tag', app: app},
110             {label: _('Last Modified Time'),                                                field: 'last_modified_time', valueType: 'date'},
111             {label: _('Last Modified By'),                                                  field: 'last_modified_by',   valueType: 'user'},
112             {label: _('Creation Time'),                                                     field: 'creation_time',      valueType: 'date'},
113             {label: _('Created By'),                                                        field: 'created_by',         valueType: 'user'},
114             {filtertype: 'crm.contact'},
115             {filtertype: 'foreignrecord', app: app, foreignRecordClass: Tine.Tasks.Model.Task, ownField: 'task'}
116         ];
117         
118     if (Tine.Sales && Tine.Tinebase.common.hasRight('run', 'Sales')) {
119         filters.push({filtertype: 'foreignrecord', 
120             app: app,
121             foreignRecordClass: Tine.Sales.Model.Product,
122             ownField: 'product'
123         });
124     }
125     
126     return filters;
127 }
128
129 /**
130  * @namespace Tine.Crm.Model
131  * @class Tine.Crm.Model.Settings
132  * @extends Tine.Tinebase.data.Record
133  * 
134  * Settings Record Definition
135  * 
136  * TODO         generalize this
137  */ 
138 Tine.Crm.Model.Settings = Tine.Tinebase.data.Record.create([
139         {name: 'id'},
140         {name: 'defaults'},
141         {name: 'leadstates'},
142         {name: 'leadtypes'},
143         {name: 'leadsources'},
144         {name: 'default_leadstate_id',  type: 'int'},
145         {name: 'default_leadtype_id',   type: 'int'},
146         {name: 'default_leadsource_id', type: 'int'}
147     ], {
148     appName: 'Crm',
149     modelName: 'Settings',
150     idProperty: 'id',
151     titleProperty: 'title',
152     // ngettext('Settings', 'Settings', n);
153     recordName: 'Settings',
154     recordsName: 'Settingss',
155     // ngettext('record list', 'record lists', n);
156     containerName: 'Settings',
157     containersName: 'Settings',
158     getTitle: function() {
159         return this.recordName;
160     }
161 });
162
163 Tine.Crm.Model.getRandomUnusedId = function(store) {
164     var result;
165     do {
166         result = Tine.Tinebase.common.getRandomNumber(0, 21474836);
167     } while (store.getById(result) != undefined)
168     
169     return result;
170 };