Merge branch 'pu/2013.03/modelconfig-hr'
[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         {name: 'attachments'}
45     ]), {
46     appName: 'Crm',
47     modelName: 'Lead',
48     idProperty: 'id',
49     titleProperty: 'lead_name',
50     // ngettext('Lead', 'Leads', n);
51     recordName: 'Lead',
52     recordsName: 'Leads',
53     containerProperty: 'container_id',
54     // ngettext('lead list', 'lead lists', n); gettext('lead lists');
55     containerName: 'lead list',
56     containersName: 'lead lists',
57     getTitle: function() {
58         return this.get('lead_name') ? this.get('lead_name') : false;
59     }
60 });
61
62 /**
63  * @namespace Tine.Crm.Model
64  * 
65  * get default data for a new lead
66  *  
67  * @return {Object} default data
68  * @static
69  * 
70  * TODO generalize default container id handling?
71  */ 
72 Tine.Crm.Model.Lead.getDefaultData = function() {
73     
74     var defaults = Tine.Crm.registry.get('defaults');
75     var app = Tine.Tinebase.appMgr.get('Crm');
76     
77     var data = {
78         start: new Date().clearTime(),
79         leadstate_id: defaults.leadstate_id,
80         leadtype_id: defaults.leadtype_id,
81         leadsource_id: defaults.leadsource_id,
82         container_id: app.getMainScreen().getWestPanel().getContainerTreePanel().getSelectedContainer('addGrant', defaults.container_id),
83         probability: 0,
84         turnover: 0,
85         relations: [{
86             type: 'responsible',
87             related_record: Tine.Tinebase.registry.get('userContact')
88         }]
89     };
90     
91     return data;
92 };
93
94 /**
95  * get filtermodel of lead model
96  * 
97  * @namespace Tine.Crm.Model
98  * @static
99  * @return {Array} filterModel definition
100  */ 
101 Tine.Crm.Model.Lead.getFilterModel = function() {
102     var app = Tine.Tinebase.appMgr.get('Crm'),
103         filters = [
104             {label: _('Quick Search'),  field: 'query',    operators: ['contains']},
105             {filtertype: 'tine.widget.container.filtermodel', app: app, recordClass: Tine.Crm.Model.Lead},
106             {label: app.i18n._('Lead name'),   field: 'lead_name' },
107             {filtertype: 'crm.leadstate', app: app},
108             {label: app.i18n._('Probability'), field: 'probability', valueType: 'percentage'},
109             {label: app.i18n._('Turnover'),    field: 'turnover', valueType: 'number', defaultOperator: 'greater'},
110             {filtertype: 'tinebase.tag', app: app},
111             {label: _('Last Modified Time'),                                                field: 'last_modified_time', valueType: 'date'},
112             {label: _('Last Modified By'),                                                  field: 'last_modified_by',   valueType: 'user'},
113             {label: _('Creation Time'),                                                     field: 'creation_time',      valueType: 'date'},
114             {label: _('Created By'),                                                        field: 'created_by',         valueType: 'user'},
115             {filtertype: 'crm.contact'},
116             {filtertype: 'foreignrecord', app: app, foreignRecordClass: Tine.Tasks.Model.Task, ownField: 'task'}
117         ];
118         
119     if (Tine.Sales && Tine.Tinebase.common.hasRight('run', 'Sales')) {
120         filters.push({filtertype: 'foreignrecord', 
121             app: app,
122             foreignRecordClass: Tine.Sales.Model.Product,
123             ownField: 'product'
124         });
125     }
126     
127     return filters;
128 }
129
130 /**
131  * @namespace Tine.Crm.Model
132  * @class Tine.Crm.Model.Settings
133  * @extends Tine.Tinebase.data.Record
134  * 
135  * Settings Record Definition
136  * 
137  * TODO         generalize this
138  */ 
139 Tine.Crm.Model.Settings = Tine.Tinebase.data.Record.create([
140         {name: 'id'},
141         {name: 'defaults'},
142         {name: 'leadstates'},
143         {name: 'leadtypes'},
144         {name: 'leadsources'},
145         {name: 'default_leadstate_id',  type: 'int'},
146         {name: 'default_leadtype_id',   type: 'int'},
147         {name: 'default_leadsource_id', type: 'int'}
148     ], {
149     appName: 'Crm',
150     modelName: 'Settings',
151     idProperty: 'id',
152     titleProperty: 'title',
153     // ngettext('Settings', 'Settings', n);
154     recordName: 'Settings',
155     recordsName: 'Settingss',
156     // ngettext('record list', 'record lists', n);
157     containerName: 'Settings',
158     containersName: 'Settings',
159     getTitle: function() {
160         return this.recordName;
161     }
162 });
163
164 Tine.Crm.Model.getRandomUnusedId = function(store) {
165     var result;
166     do {
167         result = Tine.Tinebase.common.getRandomNumber(0, 21474836);
168     } while (store.getById(result) != undefined)
169     
170     return result;
171 };