3 "name": "Pman.Dialog.XtupleExpenses",
6 "path": "/home/edward/gitlive/web.xtuple/Pman/Xtuple/Pman.Dialog.XtupleExpenses.bjs",
14 "title": "Edit / Create expense Report",
16 "xtype": "LayoutDialog",
21 "xtype": "LayoutRegion",
27 "xtype": "LayoutRegion",
32 "xtype": "ContentPanel",
37 "|actioncomplete": "function(_self,action)\n{\n \n var btns = ['postToManagement', 'postToAccounts','postToGL', 'postToStaff', 'saveBtn'];\n var showhide = function()\n {\n Roo.each(btns, function(b) {\n _this[b].hide();\n });\n switch(_this.form.findField('expense_status').getValue()) {\n case '':\n _this['saveBtn'].show();\n return; // do not show any button...\n case 'Draft': \n _this['saveBtn'].show();\n _this['postToManagement'].show();\n break;\n \n \n case 'Pending Management Approval':\n case 'Pending Supervisor Approval': // old system..\n // check if they are managmenet..\n // eg. have to be in TIER2\n if (!Pman.Login.inGroup('TIER2') && !Pman.Login.inGroup('TIER1') && \n !Pman.Login.inGroup('Administrators')) {\n return;\n }\n _this['postToAccounts'].show();\n _this['postToStaff'].show(); \n _this['saveBtn'].show();\n break;\n case 'Pending Accounting Approval':\n if (!Pman.Login.inGroup('Administrators')) {\n return;\n }\n \n // check if they are managmenet..\n _this['postToGL'].show();\n _this['postToStaff'].show(); \n _this['saveBtn'].show(); \n break;\n \n \n }\n }\n \n if (action.type == 'setdata') {\n //_this.dialog.el.mask(\"Loading\");\n if (_this.data.expense_id) {\n this.load({ method: 'GET', params: { '_id' : _this.data.expense_id }});\n \n return;\n }\n showhide();\n _this.grid.ds.load({});\n return;\n }\n if (action.type == 'load') {\n \n \n showhide();\n \n \n \n _this.grid.ds.load({});\n return;\n }\n if (action.type =='submit') {\n \n \n if (! (1 * _this.form.findField('expense_id').getValue()) ) {\n Roo.log(\"fire event\");\n _this.data = action.result.data;\n this.fireEvent('actioncomplete', this, { type: 'setdata', data: action.result.data });\n return;\n }\n \n \n _this.dialog.hide();\n \n if (_this.callback) {\n _this.callback.call(_this, _this.form.getValues());\n }\n _this.form.reset();\n return;\n }\n}\n",
38 "|rendered": "function (form)\n{\n _this.form= form;\n}\n"
41 "style": "margin:10px;",
43 "|url": "baseURL + '/Roo/expense.php'",
53 "style": "width:380px",
59 "name": "expense_number",
66 "fieldLabel": "Due Date",
68 "name": "expense_trandate",
74 "fieldLabel": "Summary",
75 "name": "expense_memo",
81 "fieldLabel": "Status",
82 "name": "expense_status",
92 "style": "clear:both;float:left;",
97 "fieldLabel": "Comments / For Review etc.",
98 "name": "expense_comments",
114 "legend": "Employee",
115 "style": "width:250px;margin-left:10px",
120 "fieldLabel": "Name",
121 "name": "expense_emp_id_emp_name",
123 "xtype": "TextField",
129 "legend": "Financial Details",
130 "style": "width:250px;margin-left:10px",
135 "fieldLabel": "Advance Paid",
136 "name": "expense_advance",
138 "xtype": "TextField",
142 "fieldLabel": "Amount",
143 "name": "expense_amount_ro",
146 "xtype": "TextField",
151 "name": "expense_tax_ro",
154 "xtype": "TextField",
158 "fieldLabel": "Total",
159 "name": "expense_total_ro",
162 "xtype": "TextField",
172 "displayField": "accnt_descrip",
174 "emptyText": "Select accnt",
175 "fieldLabel": "Paid from Bank Account (accounting only)",
176 "forceSelection": true,
177 "hiddenName": "expense_accnt_id",
179 "loadingText": "Searching...",
181 "name": "expense_accnt_id_accnt_descrip",
183 "qtip": "Select accnt",
185 "selectOnFocus": true,
186 "tpl": "<div class=\"x-grid-cell-text x-btn button\"><b>{accnt_descrip}</b> </div>",
187 "triggerAction": "all",
188 "valueField": "accnt_id",
195 "|beforeload": "function (_self, o){\n o.params = o.params || {};\n // set more here\n o.params.accnt_subaccnttype_code = 'CA';\n}\n"
200 "|sortInfo": "{ direction : 'ASC', field: 'accnt_descrip' }",
205 "xtype": "HttpProxy",
208 "|url": "baseURL + '/Roo/accnt.php'"
212 "xtype": "JsonReader",
216 "totalProperty": "total",
217 "|fields": "[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"accnt_number\",\"type\":\"string\"}]"
230 "name": "base_curr_id",
235 "name": "base_curr_name",
240 "name": "def_expcat_id",
245 "name": "def_expcat_descrip",
250 "name": "expense_emp_id",
255 "name": "expense_id",
270 "|activate": "function() {\n _this.panel = this;\n if (_this.grid) {\n // _this.grid.footer.onClick('first');\n }\n}"
273 "fitContainer": true,
276 "tableName": "expitem",
278 "xtype": "GridPanel",
283 "|render": "function() \n{\n _this.grid = this; \n //_this.dialog = Pman.Dialog.FILL_IN\n if (_this.panel.active) {\n //this.gi.onClick('first');\n }\n}",
284 "|rowdblclick": "function (_self, rowIndex, e)\n{\n if (!_this.dialog) return;\n _this.dialog.show( this.getDataSource().getAt(rowIndex).data, function() {\n _this.grid.footer.onClick('first');\n }); \n}\n",
285 "afteredit": "function (e)\n{\n \n if (e.field == 'expitem_date') {\n e.record.set('expitem_date', Date.parseDate(e.value, 'Y-m-d'));\n \n } \n \n e.record.commit();\n}"
288 "autoExpandColumn": "expitem_memo",
291 "xtype": "EditorGrid",
296 "beforeload": "function (_self, options)\n{\n \n options.params = options.param || {};\n options.params.limit = 999;\n _this.grid.view.el.unmask();\n options.params.expitem_expense_id = _this.form.findField('expense_id').getValue() *1 ;\n if (! options.params.expitem_expense_id) {\n Roo.log(\"no expense id yet\");\n this.removeAll();\n _this.grid.view.el.mask(\"Save First\");\n return false;\n }\n \n}",
297 "update": "function (_self, record, operation)\n{\n if (operation != 'commit') {\n return;\n }\n var send = Roo.apply({}, record.data);\n // fix date...\n send.expitem_date = typeof(send.expitem_date) == 'object' ? send.expitem_date.format('Y-m-d') : send.expitem_date;\n \n \n function updateTotals(){\n var t = { expense_total_ro : 0 , expense_amount_ro : 0, expense_tax_ro : 0 }\n _this.grid.ds.each(function(r) {\n var fc_total = (r.data.expitem_tax * 1) + (r.data.expitem_amount_fc * 1);\n if (!fc_total) {\n return;\n }\n var base_total = r.data.expitem_total * 1;\n var rate = base_total / fc_total;\n t.expense_total_ro += base_total;\n t.expense_amount_ro += (r.data.expitem_amount_fc * rate);\n t.expense_tax_ro += (r.data.expitem_tax * rate);\n \n });\n t.expense_total_ro = t.expense_total_ro.toFixed(2);\n t.expense_amount_ro = t.expense_amount_ro.toFixed(2);\n t.expense_tax_ro = t.expense_tax_ro.toFixed(2);\n \n \n _this.form.setValues(t);\n }\n \n \n new Pman.Request( {\n method : 'POST' ,\n url : baseURL + '/Roo/expitem',\n params :send,\n success : function(res) {\n if (!record.data.expitem_id) {\n record.set('expitem_id', res.data.expitem_id);\n }\n record.set('expitem_total', res.data.expitem_total);\n updateTotals();\n }\n });\n \n \n \n}"
299 "*prop": "dataSource",
302 "|sortInfo": "{ field : 'expitem_row', direction: 'ASC' }",
307 "xtype": "HttpProxy",
309 "|url": "baseURL + '/Roo/expitem.php'",
314 "xtype": "JsonReader",
315 "totalProperty": "total",
319 "|fields": "[\n {\n 'name': 'expitem_id',\n 'type': 'int'\n },\n {\n 'name': 'expitem_expense_id',\n 'type': 'int'\n },\n {\n 'name': 'expitem_curr_id',\n 'type': 'int'\n },\n {\n 'name': 'expitem_expcat_id',\n 'type': 'int'\n },\n {\n 'name': 'expitem_row',\n 'type': 'int'\n },\n {\n 'name': 'expitem_amount',\n 'type': 'float'\n },\n {\n 'name': 'expitem_amount_fc',\n 'type': 'float'\n },\n {\n 'name': 'expitem_tax',\n 'type': 'float'\n },\n {\n 'name': 'expitem_total',\n 'type': 'float'\n },\n {\n 'name': 'expitem_date',\n 'type': 'date',\n 'dateFormat': 'Y-m-d'\n },\n {\n 'name': 'expitem_is_billable',\n 'type': 'int'\n },\n {\n 'name': 'expitem_memo',\n 'type': 'string'\n }\n]"
330 "|click": "function()\n{\n \n \n \n var grid = _this.grid;\n var r = grid.getDataSource().reader.newRow({\n expitem_id : 0,\n expitem_expense_id : _this.form.findField('expense_id').getValue(),\n expitem_row : grid.ds.getCount() + 1,\n expitem_date : new Date(),\n expitem_curr_id : _this.form.findField('base_curr_id').getValue(),\n expitem_curr_id_curr_name : _this.form.findField('base_curr_name').getValue(),\n expitem_expcat_id : _this.form.findField('def_expcat_id').getValue(),\n expitem_expcat_id_expcat_descrip : _this.form.findField('def_expcat_descrip').getValue(),\n expitem_amount_tax : 0.0\n \n });\n \n grid.stopEditing();\n var lr = grid.ds.getCount()\n grid.getDataSource().insert(lr, r); \n grid.startEditing(lr, 1); \n}"
332 "cls": "x-btn-text-icon",
335 "|icon": "Roo.rootURL + 'images/default/dd/drop-add.gif'",
336 "|xns": "Roo.Toolbar"
339 "|xns": "Roo.Toolbar",
344 "|click": "function()\n{\n var ce = _this.grid.selModel.getSelectedCell();\n if (!ce) {\n Roo.MessageBox.alert(\"Error\", \"Select a line to delete\");\n return;\n }\n var rec = _this.grid.ds.getAt(ce[0]);\n if (!rec.data.expitem_id) {\n _this.grid.ds.remove(rec);\n return;\n }\n \n \n new Pman.Request({\n mask : 'Deleting',\n url : baseURL + '/Roo/expitem',\n method : 'POST',\n params : {\n _delete : rec.data.expitem_id\n },\n success : function()\n {\n _this.grid.ds.remove(rec); \n }\n });\n \n \n}\n "
346 "cls": "x-btn-text-icon",
349 "|icon": "rootURL + '/Pman/templates/images/trash.gif'",
350 "|xns": "Roo.Toolbar"
355 "*prop": "colModel[]",
356 "dataIndex": "expitem_row",
359 "xtype": "ColumnModel",
360 "|renderer": "function(v) { return String.format('{0}', v); }",
364 "*prop": "colModel[]",
365 "dataIndex": "expitem_date",
368 "xtype": "ColumnModel",
369 "|renderer": "function(v) {\n if (!v) {\n return '<span style=\"color:red\">' + \"NO DATE\" + '</span>';\n }\n\n return String.format('{0}', typeof(v) == 'object' ? v.format('d/M/Y') : v); \n }",
374 "xtype": "GridEditor",
381 "xtype": "DateField",
389 "*prop": "colModel[]",
390 "dataIndex": "expitem_expcat_id",
391 "header": "Category",
393 "xtype": "ColumnModel",
394 "|renderer": "function(v,x,r) { return String.format('{0}', r.data.expitem_expcat_id_expcat_descrip); }",
399 "xtype": "GridEditor",
405 "displayField": "expcat_descrip",
407 "emptyText": "Select expcat",
408 "fieldLabel": "expcat",
409 "forceSelection": true,
410 "hiddenName": "expitem_expcat_id",
412 "loadingText": "Searching...",
414 "name": "expitem_expcat_id_expcat_descrip",
416 "qtip": "Select expcat",
418 "selectOnFocus": true,
419 "tpl": "<div class=\"x-grid-cell-text x-btn button\"><b>{expcat_descrip}</b> </div>",
420 "triggerAction": "all",
422 "valueField": "expcat_id",
429 "|beforeload": "function (_self, o){\n o.params = o.params || {};\n // set more here\n}\n"
434 "|sortInfo": "{ direction : 'ASC', field: 'expcat_descrip' }",
439 "xtype": "HttpProxy",
442 "|url": "baseURL + '/Roo/expcat.php'"
446 "xtype": "JsonReader",
450 "totalProperty": "total",
451 "|fields": "[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"expcat_code\",\"type\":\"string\"}]"
462 "*prop": "colModel[]",
463 "dataIndex": "expitem_memo",
464 "header": "Description",
466 "xtype": "ColumnModel",
467 "|renderer": "function(v) { return String.format('{0}', v); }",
472 "xtype": "GridEditor",
477 "xtype": "TextField",
485 "*prop": "colModel[]",
486 "dataIndex": "expitem_curr_id",
487 "header": "Currency",
489 "xtype": "ColumnModel",
490 "|renderer": "function(v,x,r) { return String.format('{0}', r.data.expitem_curr_id_curr_name); }",
495 "xtype": "GridEditor",
501 "displayField": "curr_name",
503 "emptyText": "Select curr_symbol",
504 "fieldLabel": "curr_symbol",
505 "forceSelection": true,
506 "hiddenName": "expitem_curr_id",
508 "loadingText": "Searching...",
510 "name": "expitem_curr_id_curr_name",
512 "qtip": "Select curr_symbol",
514 "selectOnFocus": true,
515 "tpl": "<div class=\"x-grid-cell-text x-btn button\"><b>{curr_name}</b> </div>",
516 "triggerAction": "all",
518 "valueField": "curr_id",
528 "|sortInfo": "{ direction : 'ASC', field: 'id' }",
530 "|beforeload": "function (_self, o){\n o.params = o.params || {};\n // set more here\n}\n"
535 "xtype": "HttpProxy",
538 "|url": "baseURL + '/Roo/curr_symbol.php'"
542 "xtype": "JsonReader",
546 "totalProperty": "total",
547 "|fields": "[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"curr_name\",\"type\":\"string\"}]"
558 "*prop": "colModel[]",
560 "dataIndex": "expitem_amount_fc",
563 "xtype": "ColumnModel",
564 "|renderer": "function(v) { return String.format('{0}', (1*v).toFixed(2)); }",
569 "xtype": "GridEditor",
574 "xtype": "NumberField",
582 "*prop": "colModel[]",
584 "dataIndex": "expitem_tax",
587 "xtype": "ColumnModel",
588 "|renderer": "function(v) { return String.format('{0}', (1*v).toFixed(2)); }",
593 "xtype": "GridEditor",
598 "xtype": "NumberField",
606 "*prop": "colModel[]",
608 "dataIndex": "expitem_total",
609 "header": "Base Total",
611 "xtype": "ColumnModel",
612 "|renderer": "function(v) { return String.format('{0}', (1*v).toFixed(2)); }",
621 "click": "function (_self, e)\n{\n _this.dialog.hide();\n}"
623 "*prop": "buttons[]",
630 "click": "function (_self, e)\n{\n if (!_this.form.findField('expense_id').getValue()) {\n Roo.MessageBox.alert(\"Error\",\"You must save your expense report before printing/downloading\");\n return; \n }\n new Pman.Download({\n url : baseURL + '/Roo/expense',\n method : 'GET',\n params : {\n expense_id : _this.form.findField('expense_id').getValue(),\n _asExcel : 1\n }\n });\n Roo.MessageBox.alert(\"Notice\",\"Your report should be downloading now\");\n \n}"
632 "*prop": "buttons[]",
633 "text": "Download/Print",
639 "click": "function (_self, e)\n{\n // do some checks?\n \n _this.form.findField('expense_status').setValue('Pending Management Approval');\n _this.form.doAction(\"submit\");\n\n}",
640 "render": "function (_self)\n{\n _this.postToManagement = _self;\n}"
642 "*prop": "buttons[]",
643 "text": "Post to Management",
649 "click": "function (_self, e)\n{\n // do some checks?\n _this.form.findField('expense_status').setValue('Pending Accounting Approval');\n \n _this.form.doAction(\"submit\");\n\n}",
650 "render": "function (_self)\n{\n _this.postToAccounts = _self;\n}"
652 "*prop": "buttons[]",
653 "text": "Post to Accounts",
659 "click": "function (_self, e)\n{\n \n \n \n \n Roo.MessageBox.confirm(\"Confirm\", \"Post to General Ledger - this is very difficult to reverse so make sure it is correct\",\n function(b) {\n if (b!='yes') { \n return;\n }\n _this.form.findField('_post').setValue(1);\n _this.form.submit();\n \n }\n );\n \n // do some checks?\n\n \n // _this.form.doAction(\"submit\");\n\n}",
660 "render": "function (_self)\n{\n _this.postToGL = _self;\n}"
662 "*prop": "buttons[]",
663 "text": "Post to General Ledger",
669 "click": "function (_self, e)\n{\n // do some checks?\n\n if (! _this.form.findField('expense_comments').getValue().length ) {\n Roo.MessageBox.alert(\"Error\", \"Fill in a comment why it is getting rejected\");\n return;\n }\n \n _this.form.findField('expense_status').setValue('Draft');\n _this.form.doAction(\"submit\");\n\n}",
670 "render": "function (_self)\n{\n _this.postToStaff = _self;\n \n}"
672 "*prop": "buttons[]",
673 "text": "Reject / Require Clarification",
679 "click": "function (_self, e)\n{\n // do some checks?\n \n \n _this.form.doAction(\"submit\");\n\n}",
680 "render": "function (_self)\n{\n _this.saveBtn = _self;\n}"
682 "*prop": "buttons[]",