You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
преди 13 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. // Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com)
  2. //
  3. // MIT License (MIT)
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a
  6. // copy of this software and associated documentation files (the "Software"),
  7. // to deal in the Software without restriction, including without limitation
  8. // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. // and/or sell copies of the Software, and to permit persons to whom the
  10. // Software is furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  16. // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  17. // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  18. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
  19. // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  20. // OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21. //
  22. // Local DB
  23. //-----------
  24. var locals = {'DocType':{}};
  25. var LocalDB={};
  26. var READ = 0; var WRITE = 1; var CREATE = 2; var SUBMIT = 3; var CANCEL = 4; var AMEND = 5;
  27. LocalDB.getchildren = function(child_dt, parent, parentfield, parenttype) {
  28. var l = [];
  29. for(var key in locals[child_dt]) {
  30. var d = locals[child_dt][key];
  31. if((d.parent == parent)&&(d.parentfield == parentfield)) {
  32. if(parenttype) {
  33. if(d.parenttype==parenttype)l.push(d);
  34. } else { // ignore for now
  35. l.push(d);
  36. }
  37. }
  38. }
  39. l.sort(function(a,b){return (cint(a.idx)-cint(b.idx))}); return l;
  40. }
  41. // Add Doc
  42. // ======================================================================================
  43. LocalDB.add=function(dt, dn) {
  44. if(!locals[dt]) locals[dt] = {}; if(locals[dt][dn]) delete locals[dt][dn];
  45. locals[dt][dn] = {'name':dn, 'doctype':dt, 'docstatus':0};
  46. return locals[dt][dn];
  47. }
  48. // Delete Doc
  49. // ======================================================================================
  50. LocalDB.delete_doc=function(dt, dn) {
  51. var doc = get_local(dt, dn);
  52. for(var ndt in locals) { // all doctypes
  53. if(locals[ndt]) {
  54. for(var ndn in locals[ndt]) {
  55. var doc = locals[ndt][ndn];
  56. if(doc && doc.parenttype==dt && (doc.parent==dn||doc.__oldparent==dn)) {
  57. delete locals[ndt][ndn];
  58. }
  59. }
  60. }
  61. }
  62. delete locals[dt][dn];
  63. }
  64. function get_local(dt, dn) { return locals[dt] ? locals[dt][dn] : null; }
  65. // Sync Records from Server
  66. // ======================================================================================
  67. LocalDB.sync = function(list) {
  68. if(list._kl)list = expand_doclist(list);
  69. if (list) {
  70. LocalDB.clear_locals(list[0].doctype, list[0].name);
  71. }
  72. for(var i=0;i<list.length;i++) {
  73. var d = list[i];
  74. if(!d.name) // get name (local if required)
  75. d.name = LocalDB.get_localname(d.doctype);
  76. LocalDB.add(d.doctype, d.name);
  77. locals[d.doctype][d.name] = d;
  78. if(d.doctype=='DocField') wn.meta.add_field(d);
  79. if(d.localname) {
  80. wn.model.new_names[d.localname] = d.name;
  81. //console.log(d.localname);
  82. $(document).trigger('rename', [d.doctype, d.localname, d.name]);
  83. delete locals[d.doctype][d.localname];
  84. }
  85. }
  86. }
  87. LocalDB.clear_locals = function(dt, dn) {
  88. var doclist = make_doclist(dt, dn, 1);
  89. // console.dir(['in clear', doclist]);
  90. $.each(doclist, function(i, v) {
  91. v && delete locals[v.doctype][v.name];
  92. });
  93. }
  94. // Get Local Name
  95. // ======================================================================================
  96. local_name_idx = {};
  97. LocalDB.get_localname=function(doctype) {
  98. if(!local_name_idx[doctype]) local_name_idx[doctype] = 1;
  99. var n = 'New '+ get_doctype_label(doctype) + ' ' + local_name_idx[doctype];
  100. local_name_idx[doctype]++;
  101. return n;
  102. }
  103. // Create Local Doc
  104. // ======================================================================================
  105. LocalDB.set_default_values = function(doc) {
  106. var doctype = doc.doctype;
  107. var docfields = wn.meta.docfield_list[doctype];
  108. if(!docfields) {
  109. return;
  110. }
  111. var fields_to_refresh = [];
  112. for(var fid=0;fid<docfields.length;fid++) {
  113. var f = docfields[fid];
  114. if(!in_list(no_value_fields, f.fieldtype) && doc[f.fieldname]==null) {
  115. var v = LocalDB.get_default_value(f.fieldname, f.fieldtype, f['default']);
  116. if(v) {
  117. doc[f.fieldname] = v;
  118. fields_to_refresh.push(f.fieldname);
  119. }
  120. }
  121. }
  122. return fields_to_refresh;
  123. }
  124. // ======================================================================================
  125. function check_perm_match(p, dt, dn) {
  126. if(!dn) return true;
  127. var out =false;
  128. if(p.match) {
  129. if(user_defaults[p.match]) {
  130. for(var i=0;i<user_defaults[p.match].length;i++) {
  131. // user must have match field in defaults
  132. if(user_defaults[p.match][i]==locals[dt][dn][p.match]) {
  133. // must match document
  134. return true;
  135. }
  136. }
  137. return false;
  138. } else if(!locals[dt][dn][p.match]) { // blanks are true
  139. return true;
  140. } else {
  141. return false;
  142. }
  143. } else {
  144. return true;
  145. }
  146. }
  147. /* Note: Submitted docstatus overrides the permissions. To ignore submit condition
  148. pass ignore_submit=1 */
  149. function get_perm(doctype, dn, ignore_submit) {
  150. var perm = [[0,0],];
  151. if(in_list(user_roles, 'Administrator')) perm[0][READ] = 1;
  152. var plist = getchildren('DocPerm', doctype, 'permissions', 'DocType');
  153. for(var pidx in plist) {
  154. var p = plist[pidx];
  155. var pl = cint(p.permlevel?p.permlevel:0);
  156. // if user role
  157. if(in_list(user_roles, p.role)) {
  158. // if field match
  159. if(check_perm_match(p, doctype, dn)) { // new style
  160. if(!perm[pl])perm[pl] = [];
  161. if(!perm[pl][READ]) {
  162. if(cint(p.read)) perm[pl][READ]=1; else perm[pl][READ]=0;
  163. }
  164. if(!perm[pl][WRITE]) {
  165. if(cint(p.write)) { perm[pl][WRITE]=1; perm[pl][READ]=1; }else perm[pl][WRITE]=0;
  166. }
  167. if(!perm[pl][CREATE]) {
  168. if(cint(p.create))perm[pl][CREATE]=1; else perm[pl][CREATE]=0;
  169. }
  170. if(!perm[pl][SUBMIT]) {
  171. if(cint(p.submit))perm[pl][SUBMIT]=1; else perm[pl][SUBMIT]=0;
  172. }
  173. if(!perm[pl][CANCEL]) {
  174. if(cint(p.cancel))perm[pl][CANCEL]=1; else perm[pl][CANCEL]=0;
  175. }
  176. if(!perm[pl][AMEND]) {
  177. if(cint(p.amend)) perm[pl][AMEND]=1; else perm[pl][AMEND]=0;
  178. }
  179. }
  180. }
  181. }
  182. if((!ignore_submit) && dn && locals[doctype][dn].docstatus>0) {
  183. for(pl in perm)
  184. perm[pl][WRITE]=0; // read only
  185. }
  186. return perm;
  187. }
  188. // ======================================================================================
  189. LocalDB.create = function(doctype, n) {
  190. if(!n) n = LocalDB.get_localname(doctype);
  191. var doc = LocalDB.add(doctype, n)
  192. doc.__islocal=1; doc.owner = user;
  193. LocalDB.set_default_values(doc);
  194. return n;
  195. }
  196. // ======================================================================================
  197. LocalDB.delete_record = function(dt, dn) {
  198. delete locals[dt][dn];
  199. }
  200. // ======================================================================================
  201. LocalDB.get_default_value = function(fn, ft, df) {
  202. if(df=='_Login' || df=='__user')
  203. return user;
  204. else if(df=='_Full Name')
  205. return user_fullname;
  206. else if(ft=='Date'&& (df=='Today' || df=='__today')) {
  207. return get_today(); }
  208. else if(df)
  209. return df;
  210. else if(user_defaults[fn])
  211. return user_defaults[fn][0];
  212. else if(sys_defaults[fn])
  213. return sys_defaults[fn];
  214. }
  215. // ======================================================================================
  216. LocalDB.add_child = function(doc, childtype, parentfield) {
  217. // create row doc
  218. var n = LocalDB.create(childtype);
  219. var d = locals[childtype][n];
  220. d.parent = doc.name;
  221. d.parentfield = parentfield;
  222. d.parenttype = doc.doctype;
  223. return d;
  224. }
  225. // ======================================================================================
  226. LocalDB.no_copy_list = ['amended_from','amendment_date','cancel_reason'];
  227. LocalDB.copy=function(dt, dn, from_amend) {
  228. var newdoc = LocalDB.create(dt);
  229. for(var key in locals[dt][dn]) {
  230. // dont copy name and blank fields
  231. var df = get_field(dt, key);
  232. if(key!=='name' && key.substr(0,2)!='__' &&
  233. !(df && ((!from_amend && cint(df.no_copy)==1) || in_list(LocalDB.no_copy_list, df.fieldname)))) {
  234. locals[dt][newdoc][key] = locals[dt][dn][key];
  235. }
  236. }
  237. return locals[dt][newdoc];
  238. }
  239. // ======================================================================================
  240. function make_doclist(dt, dn) {
  241. if(!locals[dt]) { return []; }
  242. var dl = [];
  243. dl[0] = locals[dt][dn];
  244. // get children
  245. for(var ndt in locals) { // all doctypes
  246. if(locals[ndt]) {
  247. for(var ndn in locals[ndt]) {
  248. var doc = locals[ndt][ndn];
  249. if(doc && doc.parenttype==dt && doc.parent==dn) {
  250. dl.push(doc)
  251. }
  252. }
  253. }
  254. }
  255. return dl;
  256. }
  257. // Meta Data
  258. // ======================================================================================
  259. var Meta={};
  260. var local_dt = {};
  261. // Make Unique Copy of DocType for each record for client scripting
  262. Meta.make_local_dt = function(dt, dn) {
  263. var dl = make_doclist('DocType', dt);
  264. if(!local_dt[dt]) local_dt[dt]={};
  265. if(!local_dt[dt][dn]) local_dt[dt][dn]={};
  266. for(var i=0;i<dl.length;i++) {
  267. var d = dl[i];
  268. if(d.doctype=='DocField') {
  269. var key = d.fieldname ? d.fieldname : d.label;
  270. local_dt[dt][dn][key] = copy_dict(d);
  271. }
  272. }
  273. }
  274. Meta.get_field=function(dt, fn, dn) {
  275. if(dn && local_dt[dt]&&local_dt[dt][dn]){
  276. return local_dt[dt][dn][fn];
  277. } else {
  278. if(wn.meta.docfield_map[dt]) var d = wn.meta.docfield_map[dt][fn];
  279. if(d) return d;
  280. }
  281. return {};
  282. }
  283. Meta.set_field_property=function(fn, key, val, doc) {
  284. if(!doc && (cur_frm.doc))doc = cur_frm.doc;
  285. try{
  286. local_dt[doc.doctype][doc.name][fn][key] = val;
  287. refresh_field(fn);
  288. } catch(e) {
  289. alert("Client Script Error: Unknown values for " + doc.name + ',' + fn +'.'+ key +'='+ val);
  290. }
  291. }
  292. // Get Dt label
  293. // ======================================================================================
  294. function get_doctype_label(dt) {
  295. return dt
  296. }
  297. function get_label_doctype(label) {
  298. return label
  299. }
  300. // Global methods for API
  301. // ======================================================================================
  302. var getchildren = LocalDB.getchildren;
  303. var get_field = Meta.get_field;
  304. var createLocal = LocalDB.create;