Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.74 KB | None | 0 0
  1. import {OomnitzaDb} from "../api/api.coffee";
  2. import {OomnitzaUtility} from "../util/util.coffee";
  3. import moment from "moment";
  4. import _ from "lodash";
  5. import {ARCHIVE, EDIT, NEW, VERSION, VIEW} from "./constants";
  6.  
  7. const db = new OomnitzaDb();
  8.  
  9. const getContractMedia = (contract_id) => {
  10. return db.v3.query.get(["contracts", contract_id, "media"]);
  11. };
  12. const sendContractMedia = (contract_id, data) => {
  13. return db.v3.query.postFormData(["contracts", contract_id, "media"], data);
  14. };
  15. const deleteContractMedia = (contract_id, media_id) => {
  16. return db.v3.query.delete(["contracts", contract_id, "media", media_id]);
  17. };
  18. const setAsContractDisplayPhoto = (contract_id, media_id) => {
  19. return db.v3.query.patch(["contracts", contract_id, "media", media_id, "default_display"], {});
  20. };
  21. const getHistoryList = (contract_id, skipCount, params) => {
  22. const queryParams = ["limit=100", `skip=${skipCount}`, ...params];
  23. return db.v3.query.get(["contracts", contract_id, "changes-history"], queryParams);
  24. };
  25. const getContractMeta = () => {
  26. return db.v3.query.meta("contracts");
  27. };
  28. const getContractDetails = (id) => {
  29. return db.v3.query.get(["contracts", id]);
  30. };
  31. const getContractFromArchive = (id) => {
  32. return db.v3.query.get(["contracts", id], ["include_deleted=1"]);
  33. };
  34. const getContractFromHistory = (id, version) => {
  35. return db.v3.query.get(["contracts", id, "history", version]);
  36. };
  37. const restoreContract = (id) => {
  38. return db.v3.query.patch(["contracts", id, "?include_deleted=1"], {deleted: null});
  39. };
  40.  
  41. function searchUsers(value) {
  42. return db.v3.query.get(["users", "suggest"], ["q=" + value]);
  43. }
  44.  
  45. function searchLocations(value) {
  46. return db.v3.query.get(["locations", "suggest"], ["q=" + value]);
  47. }
  48.  
  49. function searchSaas(value) { //TODO
  50. return db.v3.query.get(["saas", "suggest"], ["q=" + value]);
  51. }
  52.  
  53. function searchContractField(fieldId, value) {
  54. return db.v3.query.get(["contracts", "autocomplete", fieldId], ["q=" + value]);
  55. }
  56.  
  57. const onAutocomplete = (fieldId, value, data_type) => {
  58. if (data_type === "USERS") {
  59. return searchUsers(value);
  60. } else if (data_type === "LOCATION") {
  61. return searchLocations(value);
  62. } else if (data_type === "SAAS") { //TODO
  63. return searchSaas(value);
  64. }
  65. return searchContractField(fieldId, value);
  66. };
  67. const updateContract = (contrac_id, data) => {
  68. return db.v3.query.patch(["contracts", contrac_id], data);
  69. };
  70. const createContract = (data) => {
  71. return db.v3.query.post(["contracts"], data);
  72. };
  73. const wfTriggerCheck = (contract_id, data, mode = "EDIT") => {
  74. return db.v3.query[mode == NEW ? "post" : "patch"](["contracts", contract_id, "wf-trigger"], data);
  75. };
  76. // Link to description https://oomnitza.atlassian.net/wiki/spaces/OPS/pages/1196425364/Object+Contract#id-[Object]Contract-FieldsOrder
  77. const defaultContractFieldsConfig = {
  78. fields: [
  79. "contract_name",
  80. "contract_type",
  81. "software_id",
  82. "payment_date",
  83. "payment_schedule",
  84. "renewal_date",
  85. "price",
  86. "responsible_person",
  87. "limit_number_of_licenses",
  88. "number_of_licenses",
  89. "number_of_seats",
  90. "license_key",
  91. "calculate_per_user_price",
  92. "version",
  93. "change_date",
  94. "changed_by",
  95. "creation_date",
  96. "created_by",
  97. "start_date",
  98. "old_renewal_date",
  99. "contract_end_date",
  100. "vendor_name",
  101. "support_phone",
  102. "contract_id",
  103. "saas_id",
  104. "latest_payment_date"
  105. ],
  106. fields_enable: {
  107. "contract_name": true,
  108. "contract_type": true,
  109. "software_id": true,
  110. "payment_date": true,
  111. "payment_schedule": true,
  112. "renewal_date": true,
  113. "price": true,
  114. "responsible_person": true,
  115. "limit_number_of_licenses": true,
  116. "number_of_licenses": true,
  117. "number_of_seats": true,
  118. "license_key": true,
  119. "calculate_per_user_price": true,
  120. "version": true,
  121. "change_date": true,
  122. "changed_by": true,
  123. "creation_date": true,
  124. "created_by": true,
  125. "start_date": true,
  126. "old_renewal_date": true,
  127. "contract_end_date": true,
  128. "vendor_name": true,
  129. "support_phone": true,
  130. "contract_id": true,
  131. "saas_id": true,
  132. "latest_payment_date": true
  133. }
  134. };
  135.  
  136. function getInitialVisibleFields() {
  137. return {...defaultContractFieldsConfig};
  138. }
  139.  
  140. function getRoleConfig() {
  141. return db.v3.query.get(["service", "profile"]);
  142. }
  143.  
  144. function getSBConfigList() {
  145. return db.v3.query.get(["settings", "role_based_views"]);
  146. }
  147.  
  148. function getSBConfigById(id) {
  149. return db.v3.query.get(["settings", "role_based_views", id]);
  150. }
  151.  
  152. function getFieldsConfiguredOnSB(belongs, defaultFields) {
  153. return $.when(
  154. getRoleConfig(),
  155. getSBConfigList()
  156. )
  157. .then(([{role}], [views]) => {
  158. const view = _.find(views, {belongs_to: belongs, permissions_id: role});
  159. return view ? getSBConfigById(view.id) : defaultFields;
  160. })
  161. .catch(() => defaultFields);
  162. }
  163.  
  164. const fieldVisibleByConfig = (fields, field, contract_type, limit) => {
  165. const ids = ["number_of_licenses"];
  166. if (contract_type === ENTERPRISE_CONTRACT && _.includes(ids, field) && limit != "1") {
  167. return false;
  168. }
  169. return !_.has(fields, field) || fields[field];
  170. };
  171.  
  172. const hiddenFields = ["uid", "version"];
  173. const contractAttributes = [
  174. "contract_name",
  175. "contract_type",
  176. "saas_id",
  177. "software_id",
  178. "payment_date",
  179. "payment_schedule",
  180. "latest_payment_date",
  181. "renewal_date",
  182. "price",
  183. "responsible_person",
  184. "limit_number_of_licenses",
  185. "calculate_per_user_price",
  186. "number_of_licenses",
  187. "number_of_seats",
  188. "license_key"
  189. ];
  190.  
  191. const REGULAR_CONTRACT = "Regular Contract";
  192. const ENTERPRISE_CONTRACT = "SaaS \"Enterprise\" Contract";
  193. const PER_USER_CONTRACT = "SaaS \"Per User\" Contract";
  194. const DESKTOP_SOFTWARE_CONTRACT = "Desktop Software Contract";
  195. const contractTypes = [REGULAR_CONTRACT, PER_USER_CONTRACT, ENTERPRISE_CONTRACT, DESKTOP_SOFTWARE_CONTRACT];
  196. const typeToAttribute = {
  197. [REGULAR_CONTRACT]: [
  198. "contract_name",
  199. "contract_type"
  200. ],
  201. [PER_USER_CONTRACT]: [
  202. "contract_name",
  203. "contract_type",
  204. "saas_id",
  205. "software_id",
  206. "payment_date",
  207. "payment_schedule",
  208. "latest_payment_date",
  209. "renewal_date",
  210. "price",
  211. "responsible_person",
  212. "number_of_licenses"
  213. ],
  214. [ENTERPRISE_CONTRACT]: [
  215. "contract_name",
  216. "contract_type",
  217. "saas_id",
  218. "software_id",
  219. "payment_date",
  220. "payment_schedule",
  221. "latest_payment_date",
  222. "renewal_date",
  223. "price",
  224. "responsible_person", "limit_number_of_licenses",
  225. "calculate_per_user_price",
  226. "number_of_licenses"],
  227. [DESKTOP_SOFTWARE_CONTRACT]: [
  228. "contract_name",
  229. "contract_type",
  230. "software_id",
  231. "payment_date",
  232. "payment_schedule",
  233. "latest_payment_date",
  234. "renewal_date",
  235. "price",
  236. "responsible_person",
  237. "calculate_per_user_price",
  238. "number_of_seats",
  239. "license_key"
  240. ]
  241. };
  242. const isContractAttribute = (field_id) => {
  243. return _.includes(contractAttributes, field_id);
  244. };
  245. const isRelevantContractField = (contract_type, field_id) => {
  246. if (!_.includes(contractTypes, contract_type)) {
  247. return _.includes(["contract_name", "contract_type"], field_id);
  248. }
  249. return !isContractAttribute(field_id) || _.includes(typeToAttribute[contract_type], field_id);
  250. };
  251.  
  252. function isAutocomplete(type) {
  253. return _.includes(["USERS", "LOCATION"], type);
  254. }
  255.  
  256. function isCustomAutocomplete(searchhelp_type) {
  257. return searchhelp_type === "dynamic";
  258. }
  259.  
  260. function fieldNotVisible(meta, id, data) {
  261. return !isRelevantContractField(data.contract_type, id) && !shouldShowByRelational(meta, id, data);
  262. }
  263.  
  264. function isEditable(val, mode, id, data_type) {
  265. const ids = ["contract_type"];
  266.  
  267. if (mode === VIEW) {
  268. return false;
  269. } else if (mode === ARCHIVE) {
  270. return false;
  271. } else if (mode === VERSION) {
  272. return false;
  273. } else if (mode === NEW && _.includes(ids, id)) {
  274. return true;
  275. }
  276.  
  277. if (_.includes(["SAAS"], data_type)) {
  278. return true;
  279. }
  280.  
  281. return val;
  282. }
  283.  
  284. const isEmptyVal = (val) => {
  285. if (_.isObject(val)) {
  286. return _.isEmpty(val) || _.isEqual(val, {id: null, label: null});
  287. }
  288. if (_.isString(val)) {
  289. return !_.trim(val).length;
  290. }
  291. return _.isNil(val);
  292. };
  293.  
  294. const isMandatory = (meta, id) => {
  295. return _.has(meta, id) && !formatBool(_.get(meta, [id, "optional"], false));
  296. };
  297.  
  298. const isMandatoryEmpty = (meta, id, data) => {
  299. return isMandatory(meta, id) && isEmptyVal(data[id]);
  300. };
  301.  
  302. const shouldShowByRelational = (meta, id, data) => {
  303. let dependencies = _.get(meta, [id, "dependencies"], {});
  304. if (!_.isEmpty(dependencies)) {
  305. return _.every(dependencies, (values, id) => {
  306. let {data_type} = meta[id];
  307. let value = data[id];
  308. if (data_type === "LOCATION") {
  309. return _.includes(values, _.get(value, "value", value));
  310. }
  311. return _.includes(values, value);
  312. });
  313. }
  314. return true;
  315. };
  316.  
  317. const shouldShowInMode = (mode, field_id, editable) => {
  318. let isCustomField = !isContractAttribute(field_id);
  319. if (mode === NEW && isCustomField) {
  320. return formatBool(editable);
  321. }
  322. return true;
  323. };
  324.  
  325. const hasChangesToSave = (prevdata, data) => {
  326. return !_.every(data, (value, id) => {
  327. if ((isEmptyVal(value) && isEmptyVal(prevdata[id]))) {
  328. return true;
  329. }
  330. return _.isEqual(value, prevdata[id]);
  331. });
  332. };
  333.  
  334. function formatBool(val) {
  335. return val == "1";
  336. }
  337.  
  338. function getErrorsModel(meta) {
  339. let errorModel = {};
  340. _.map(_.keys(_.omit(meta, hiddenFields)), (key) => {
  341. errorModel[key] = "";
  342. });
  343. return errorModel;
  344. }
  345.  
  346. const getInitialContractDetails = (meta) => {
  347. return _.mapValues(meta, ({default_value}) => default_value);
  348. };
  349.  
  350. function getFieldList(meta, data, mode, {fields_enable, fields}) {
  351. const newMeta = _.omit(meta, hiddenFields);
  352. const contract_type = data.contract_type;
  353. const limit = _.get(data, "limit_number_of_licenses", false);
  354. let fieldList = _.map(newMeta, ({data_type, editable, optional, hardcode, label, length, searchhelp, searchhelp_type, display_order, dependencies}, id) => {
  355. return {
  356. id,
  357. data_type,
  358. label,
  359. searchhelp,
  360. searchhelp_type,
  361. dependencies,
  362. editable: isEditable(formatBool(editable), mode, id, data_type),
  363. mandatory: !formatBool(optional),
  364. hasSystemLogo: formatBool(hardcode),
  365. maxLength: length,
  366. order: display_order,
  367. value: getValue(data[id], data_type)
  368. };
  369. })
  370. .filter(({id}) => isRelevantContractField(contract_type, id))
  371. .filter(({id}) => shouldShowByRelational(meta, id, data))
  372. .filter(({id, editable}) => shouldShowInMode(mode, id, editable))
  373. .filter(({id}) => fieldVisibleByConfig(fields_enable, id, contract_type, limit));
  374.  
  375. return _.orderBy(fieldList,
  376. [({id}, idx) => {
  377. if ((fields).indexOf(id) > -1) {
  378. return (fields).indexOf(id);
  379. }
  380. return idx + 1000;
  381. }], ["asc"]);
  382. //TODO: move contract attributes up
  383. //TODO: order custom fileds by role based views
  384. }
  385.  
  386. function getValue(value, data_type) { //value for fieldlist's components
  387. if (_.isNull(value)) {
  388. return "";
  389. } else if (isAutocomplete(data_type)) {
  390. if (_.isNull(value.id)) {
  391. return "";
  392. }
  393. return {
  394. value: value.id,
  395. label: value.label
  396. };
  397. } else if (data_type == "DATE") {
  398. return value ? moment.unix(value).toDate() : value;
  399. }
  400. return value;
  401. }
  402.  
  403. const getSaveValue = (meta, id, value) => {
  404. let fieldMeta = _.get(meta, [id], {});
  405. if (isAutocomplete(fieldMeta.data_type)) {
  406. return _.has(value, "value") ? {id: value.value, label: value.label} : value;
  407. } else if (isCustomAutocomplete(fieldMeta.searchhelp_type)) {
  408. return _.get(value, "value", value);
  409. } else if (fieldMeta.data_type === "DATE") {
  410. if (!value) {
  411. return null;
  412. }
  413. return moment(value).unix();
  414. }
  415. return value;
  416. };
  417.  
  418. const pickRelevantData = (meta, data) => {
  419. return _.pickBy(data, (value, id) => {
  420. return shouldShowByRelational(meta, id, data) && isRelevantContractField(data.contract_type, id);
  421. });
  422. };
  423.  
  424. export {
  425. onAutocomplete,
  426. getValue,
  427. isAutocomplete,
  428. isCustomAutocomplete,
  429. getErrorsModel,
  430. formatBool,
  431. isEditable,
  432. getFieldList,
  433. getContractMeta,
  434. getContractDetails,
  435. getContractFromArchive,
  436. getContractFromHistory,
  437. restoreContract,
  438. isMandatory,
  439. isMandatoryEmpty,
  440. fieldNotVisible,
  441. getContractMedia,
  442. sendContractMedia,
  443. deleteContractMedia,
  444. setAsContractDisplayPhoto,
  445. getHistoryList,
  446. shouldShowByRelational,
  447. getInitialContractDetails,
  448. updateContract,
  449. createContract,
  450. wfTriggerCheck,
  451. isRelevantContractField,
  452. getSaveValue,
  453. isEmptyVal,
  454. pickRelevantData,
  455. hasChangesToSave,
  456. getFieldsConfiguredOnSB,
  457. getInitialVisibleFields,
  458. fieldVisibleByConfig
  459. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement