do not try to translate accountables of unknown models
[tine20] / tine20 / Sales / js / Sales.js
1 /*
2  * Tine 2.0
3  * 
4  * @package     Sales
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-2014 Metaways Infosystems GmbH (http://www.metaways.de)
8  *
9  */
10  
11 Ext.namespace('Tine.Sales');
12
13 /**
14  * address renderer, not a default renderer
15  * 
16  * @author      Philipp Schuele <p.schuele@metaways.de>
17  * 
18  * @constructor
19  * Constructs mainscreen of the Sales application
20  */
21 Tine.Sales.MainScreen = Ext.extend(Tine.widgets.MainScreen, {
22     appName: 'Sales',
23     activeContentType: 'Product',
24     contentTypes: [
25         {modelName: 'Product', requiredRight: 'manage_products', singularContainerMode: true},
26         {modelName: 'Contract', requiredRight: 'manage_contracts', singularContainerMode: true, genericCtxActions: ['grants']},
27         {modelName: 'Customer', requiredRight: 'manage_customers', singularContainerMode: true},
28         {modelName: 'Invoice', requiredRight: 'manage_invoices', singularContainerMode: true},
29         {modelName: 'CostCenter', requiredRight: 'manage_costcenters', singularContainerMode: true},
30         {modelName: 'Division', requiredRight: 'manage_divisions', singularContainerMode: true},
31         {modelName: 'Offer', requiredRight: 'manage_offers', singularContainerMode: true},
32         {modelName: 'OrderConfirmation', requiredRight: 'manage_orderconfirmations', singularContainerMode: true}
33     ]
34 });
35
36 // rendered sums registry for the invoiceposition grid panel
37 Tine.Sales.renderedSumsPerMonth = {};
38
39 Tine.Sales.addToClipboard = function(record, companyName) {
40     // this is called either from the edit dialog or from the grid, so we have different record types
41     var fieldPrefix = record.data.hasOwnProperty('bic') ? 'adr_' : '';
42     
43     companyName = companyName ? companyName : (record.get('name') ? record.get('name') : '');
44
45     var lines = companyName + "\n";
46     
47         lines += (record.get((fieldPrefix + 'prefix1')) ? record.get((fieldPrefix + 'prefix1')) + "\n" : '');
48         lines += (record.get((fieldPrefix + 'prefix2')) ? record.get((fieldPrefix + 'prefix2')) + "\n" : '');
49         lines += (record.get(fieldPrefix + 'pobox') ? record.get(fieldPrefix + 'pobox') + "\n" : (record.get(fieldPrefix + 'street') ? record.get(fieldPrefix + 'street') + "\n" : ''));
50         lines += (record.get((fieldPrefix + 'postalcode')) ? (record.get((fieldPrefix + 'postalcode')) + ' ') : '') + (record.get((fieldPrefix + 'locality')) ? record.get((fieldPrefix + 'locality')) : '');
51         
52         if (record.get('countryname')) {
53             lines += "\n" + record.get('countryname');
54         }
55     
56     var app = Tine.Tinebase.appMgr.get('Sales');
57     
58     Tine.Sales.CopyAddressDialog.openWindow({winTitle: app.i18n._('Copy address to the clipboard'), app: app, content: lines});
59 };
60
61 /** @param {Tine.Tinebase.data.Record} record
62  * @param {String} companyName
63  * 
64  * @return {String}
65  */
66 Tine.Sales.renderAddress = function(record, companyName) {
67     // this is called either from the edit dialog or from the grid, so we have different record types
68     var fieldPrefix = record.data.hasOwnProperty('bic') ? 'adr_' : '';
69     
70     companyName = companyName ? companyName : (record.get('name') ? record.get('name') : '');
71
72     var lines = companyName + "\n";
73     
74     lines += (record.get((fieldPrefix + 'prefix1')) ? record.get((fieldPrefix + 'prefix1')) + "\n" : '');
75     lines += (record.get((fieldPrefix + 'prefix2')) ? record.get((fieldPrefix + 'prefix2')) + "\n" : '');
76     lines += (record.get((fieldPrefix + 'pobox')) ? (record.get(fieldPrefix + 'pobox') + "\n") : ((record.get(fieldPrefix + 'street') ? record.get(fieldPrefix + 'street') + "\n" : '')));
77     lines += (record.get((fieldPrefix + 'postalcode')) ? (record.get((fieldPrefix + 'postalcode')) + ' ') : '') + (record.get((fieldPrefix + 'locality')) ? record.get((fieldPrefix + 'locality')) : '');
78     
79     if (record.get('countryname')) {
80         lines += "\n" + record.get('countryname');
81     }
82     
83     return lines;
84 };
85
86 /**
87  * opens the Copy Address Dialog and adds the rendered address
88  * 
89  * @param {Tine.Tinebase.data.Record} record
90  * @param {String} companyName
91  */
92 Tine.Sales.addToClipboard = function(record, companyName) {
93     var app = Tine.Tinebase.appMgr.get('Sales');
94     
95     Tine.Sales.CopyAddressDialog.openWindow({
96         winTitle: 'Copy address to the clipboard', 
97         app: app, 
98         content: Tine.Sales.renderAddress(record, companyName)
99     });
100 };
101
102 Tine.Sales.renderAddressAsLine = function(values) {
103     var ret = '';
104     var app = Tine.Tinebase.appMgr.get('Sales');
105     if (values.customer_id && values.customer_id.hasOwnProperty('name')) {
106         ret += '<b>' + Ext.util.Format.htmlEncode(values.customer_id.name) + '</b> - ';
107     }
108     
109     ret += Ext.util.Format.htmlEncode((values.postbox ? values.postbox : values.street));
110     ret += ', ';
111     ret += Ext.util.Format.htmlEncode(values.postalcode);
112     ret += ' ';
113     ret += Ext.util.Format.htmlEncode(values.locality);
114     ret += ' (';
115     ret += app.i18n._(values.type)
116     
117     if (values.type == 'billing') {
118         ret += ' - ' + Ext.util.Format.htmlEncode(values.custom1);
119     }
120     
121     ret += ')';
122     
123     return ret;
124 };
125
126 /**
127  * register special renderer for invoice address_id
128  */
129 Tine.widgets.grid.RendererManager.register('Sales', 'Invoice', 'address_id', Tine.Sales.renderAddressAsLine);
130
131 /**
132  * renders the model of the invoice position
133  * 
134  * @param {String} value
135  * @param {Object} row
136  * @param {Tine.Tinebase.data.Record} rec
137  * @return {String}
138  */
139 Tine.Sales.renderInvoicePositionModel = function(value, row, rec) {
140     if (! value) {
141         return '';
142     }
143     var split = value.split('_Model_');
144     var model = Tine[split[0]].Model[split[1]];
145     
146     return '<span class="tine-recordclass-gridicon ' + model.getMeta('appName') + model.getMeta('modelName') + '">&nbsp;</span>' + model.getRecordName() + ' (' + model.getAppName() + ')';
147 };
148
149 /**
150  * register special renderer for the invoice position
151  */
152 Tine.widgets.grid.RendererManager.register('Sales', 'InvoicePosition', 'model', Tine.Sales.renderInvoicePositionModel);
153
154 /**
155  * renders the quantity of the invoice position
156  */
157 Tine.Sales.InvoicePositionQuantityRendererRegistry = function() {
158     var renderers = {};
159     
160     return {
161         /**
162          * return renderer
163          * 
164          * @param {String} phpModelName
165          * @return {Function}
166          */
167         get: function(phpModelName, unit) {
168             var unit = unit.replace(/\s/, '');
169             if (renderers.hasOwnProperty(phpModelName+unit)) {
170                 return renderers[phpModelName+unit];
171             } else {
172                 // default function
173                 return function(value, row, rec) {
174                     return value;
175                 }
176             }
177         },
178         
179         /**
180          * register renderer
181          * 
182          * @param {String} phpModelName
183          * @param {Function} func
184          */
185         register: function(phpModelName, unit, func) {
186             var unit = unit.replace(/\s/, '');
187             renderers[phpModelName+unit] = func;
188         },
189         
190         /**
191          * check if a renderer is explicitly registered
192          * 
193          * @param {String} phpModelName
194          * @return {Boolean}
195          */
196         has: function(phpModelName, unit) {
197             var unit = unit.replace(/\s/, '');
198             return renderers.hasOwnProperty(phpModelName+unit);
199         }
200     }
201 }();
202
203 /**
204  * renders the unit of the invoice position
205  * 
206  * @param {String} value
207  * @param {Object} row
208  * @param {Tine.Tinebase.data.Record} rec
209  * @return {String}
210  */
211 Tine.Sales.renderInvoicePositionUnit = function(value, row, rec) {
212     
213     if (! value) {
214         return '';
215     }
216     
217     var model = rec.get('model');
218     var split = model.split('_Model_');
219     
220     var app = Tine.Tinebase.appMgr.get(split[0]);
221     
222     return app.i18n._(value);
223 };
224 /**
225  * renders the unit of the invoice position
226  * @param {} value
227  * @param {} row
228  * @param {} rec
229  * @return {}
230  */
231 Tine.Sales.renderInvoicePositionQuantity = function(value, row, rec) {
232     var model = rec.data.model;
233     if (Tine.Sales.InvoicePositionQuantityRendererRegistry.has(model, rec.data.unit)) {
234         var renderer = Tine.Sales.InvoicePositionQuantityRendererRegistry.get(model, rec.data.unit);
235         return renderer(value, row, rec);
236     } else {
237         return value;
238     }
239 };
240
241 /**
242  * register special renderer for the invoice position
243  */
244 Tine.widgets.grid.RendererManager.register('Sales', 'InvoicePosition', 'unit', Tine.Sales.renderInvoicePositionUnit);
245 Tine.widgets.grid.RendererManager.register('Sales', 'InvoicePosition', 'quantity', Tine.Sales.renderInvoicePositionQuantity);
246
247
248 Tine.Sales.renderBillingPoint = function(v) {
249     var app = Tine.Tinebase.appMgr.get('Sales');
250     return v ? app.i18n._hidden(v) : '';
251 }
252
253 Tine.widgets.grid.RendererManager.register('Sales', 'Contract', 'billing_point', Tine.Sales.renderBillingPoint);
254
255 Tine.Sales.renderCostCenter = function(value, row, rec) {
256     if (Ext.isObject(value)) {
257         return value.number + ' - ' + value.remark;
258     }
259     
260     return '';
261 };
262
263 Tine.widgets.grid.RendererManager.register('Sales', 'Invoice', 'costcenter_id', Tine.Sales.renderCostCenter);
264
265 /**
266  * allows all accountables to register (needed for accountable combo box)
267  */
268 Tine.Sales.AccountableRegistry = function() {
269     var accountables = {};
270     
271     return {
272         /**
273          * return all accountables as array
274          * 
275          * @return {Array}
276          */
277         getArray: function() {
278             var ar = [];
279             Ext.iterate(accountables, function(key, value) {
280                 ar.push(value);
281             });
282             
283             return ar;
284         },
285         
286         /**
287          * register accountable
288          * 
289          * @param {String} appName
290          * @param {String} modelName
291          */
292         register: function(appName, modelName) {
293             var key = appName + modelName;
294             if (! accountables.hasOwnProperty(key)) {
295                 accountables[key] = {appName: appName, modelName: modelName};
296             }
297         },
298         
299         /**
300          * check if a renderer is explicitly registered
301          * 
302          * @param {String} appName
303          * @param {String} modelName
304          * @return {Boolean}
305          */
306         has: function(appName, modelName) {
307             var key = appName + modelName;
308             return accountables.hasOwnProperty(key);
309         }
310     }
311 }();
312
313 Tine.Sales.AccountableRegistry.register('Sales', 'Product');
314
315
316 Tine.Sales.renderAccountable = function(values) {
317     if (Ext.isEmpty(values)) {
318         return '';
319     }
320     var split = values.split('_Model_');
321     var ret = '';
322     var app = Tine.Tinebase.appMgr.get(split[0]);
323     
324     return app ? app.i18n._(split[0] + split[1]) : null;
325 };
326
327 /**
328  * register special renderer for invoice address_id
329  */
330 Tine.widgets.grid.RendererManager.register('Sales', 'Product', 'accountable', Tine.Sales.renderAccountable);