/*+********************************************************************************** * The contents of this file are subject to the vtiger CRM Public License Version 1.1 * ("License"); You may not use this file except in compliance with the License * The Original Code is: vtiger CRM Open Source * The Initial Developer of the Original Code is vtiger. * Portions created by vtiger are Copyright (C) vtiger. * All Rights Reserved. *************************************************************************************/ Vtiger.Class("Settings_Vtiger_TaxIndex_Js",{ updateSelectElement : function(selectedRegions, skippedRegions, regionsElement){ var allRegions = jQuery('.taxRegionElements'); var prevSelectedRegions = regionsElement.val(); regionsElement.html(allRegions.clone().html()); for(var index in selectedRegions) { if (jQuery.inArray(selectedRegions[index], skippedRegions) == '-1') { regionsElement.find("option[value='"+selectedRegions[index]+"']").remove(); } } if(prevSelectedRegions) { regionsElement.select2("val", prevSelectedRegions); } } },{ init : function () { this.addModuleSpecificComponent('Index','Vtiger',app.getParentModuleName()); }, //Stored history of TaxName and duplicate check result duplicateCheckCache : {}, taxContainer : false, getContainer : function(){ if(this.taxContainer == false){ this.taxContainer = jQuery("#TaxCalculationsContainer"); } return this.taxContainer; }, /** * This function will show the model for Add/Edit tax */ editTax : function(url, currentTrElement) { var aDeferred = jQuery.Deferred(); var thisInstance = this; app.helper.showProgress(); app.request.post({url:url}).then( function(err,data) { app.helper.hideProgress(); if(err == null){ var callBackFunction = function(data) { //cache should be empty when modal opened thisInstance.duplicateCheckCache = {}; var form = jQuery('#editTax'); app.helper.showVerticalScroll(jQuery('#scrollContainer'), {setHeight:'80%'}); thisInstance.registerUpdateRegionsElementEvent(); jQuery('.regions').trigger('change'); form.find('#simple').click(function(e) { form.find('.compoundOnContainer').addClass('hide'); form.find('.dedcutedTaxDesc').addClass('hide'); form.find('.taxTypeContainer').removeClass('hide').show(); form.find('#compoundOn').select2('val', null); var container = form.find('.taxTypeContainer'); var taxType = jQuery(':checked', container).val(); if (taxType == 'Variable') { form.find('.taxValueContainer').addClass('hide'); form.find('.regionsContainer').removeClass('hide').show(); } }); form.find('#compound').click(function(e) { form.find('.dedcutedTaxDesc').addClass('hide'); form.find('.taxTypeContainer').removeClass('hide').show(); form.find('.compoundOnContainer').removeClass('hide').show(); var container = form.find('.taxTypeContainer'); var taxType = jQuery(':checked', container).val(); if (taxType == 'Variable') { form.find('.taxValueContainer').addClass('hide'); form.find('.regionsContainer').removeClass('hide').show(); } }); form.find('#deducted').click(function(e) { form.find('.compoundOnContainer').addClass('hide'); form.find('.taxTypeContainer').addClass('hide'); form.find('.regionsContainer').addClass('hide'); form.find('.dedcutedTaxDesc').removeClass('hide').show(); form.find('.taxValueContainer').removeClass('hide').show(); form.find('#compoundOn').select2('val', null); }); form.find('#fixed').click(function(e) { form.find('.regionsContainer').addClass('hide'); form.find('.taxValueContainer').removeClass('hide').show(); }); form.find('#variable').click(function(e) { form.find('.taxValueContainer').addClass('hide'); form.find('.regionsContainer').removeClass('hide').show(); }); form.on('click', '.deleteRow', function(e) { var element = jQuery(e.currentTarget); element.parent().parent().remove(); }); form.find('.addNewTaxBracket').click(function(e) { e.preventDefault(e); var taxRegionsTable = form.find('.regionsTable'); var taxRegionsCount = form.find('.regionsCount').val(); var widthHeight = form.find('#widthHeight').val(); var taxBracketBlock = jQuery('\n\ \n\
×
  \n\ \n\ \n\ \n\ \n\ \n\ '); var selectedRegions = []; var regionElements = jQuery('.regionsTable select.regions'); jQuery.each(regionElements, function(index, element) { var selectedValues = jQuery(element).val(); if (jQuery.isArray(selectedValues)) { for (var i=0; i\n\ '+details.taxlabel+'\n\ '+details.taxType+'\n\ '+details.method+'\n\ '+details.percentage+'%\n\ \n\ \n\
\n\ \n\ \n\ \n\
\n\'); taxTable.append(trElementForTax); }, /* * Function to update the tax details in the list after edit */ updateTaxDetails : function(data, currentTrElement) { currentTrElement.find('.taxLabel').text(data['taxlabel']); currentTrElement.find('.taxPercentage').text(data['percentage']+'%'); currentTrElement.find('.taxType').text(data['taxType']); currentTrElement.find('.taxMethod').text(data['method']); if(data['deleted'] == '0') { currentTrElement.find('.editTaxStatus').attr('checked', 'true'); } else { currentTrElement.find('.editTaxStatus').removeAttr('checked'); } }, /** * Function to register the click event for charges list tab */ registerChargesClickEvent : function() { var thisInstance = this; var taxContainer = this.getContainer(); var contents = taxContainer.find('.contents'); var relatedContainer = contents.find('#charges'); var relatedTab = contents.find('.chargesTab'); relatedTab.click(function() { if(relatedContainer.find('.chargesContainer').length > 0) { } else { var params = {}; params['module'] = app.getModuleName(); params['parent'] = app.getParentModuleName(); params['view'] = 'TaxIndex'; params['mode'] = 'showChargesAndItsTaxes'; app.request.post({data:params}).then(function(err,data) { relatedContainer.html(data); if(contents.find('.chargesContainer').length > 0) { contents.find('.addCharge').click(function(e) { var addChargeButton = jQuery(e.currentTarget); thisInstance.editCharge(addChargeButton.data('url')); }); contents.on('click', '.editCharge', function(e) { var editChargeButton = jQuery(e.currentTarget); var currentTrElement = editChargeButton.closest('tr'); thisInstance.editCharge(editChargeButton.data('url'), currentTrElement); }); contents.find('.addChargeTax').click(function(e) { var addTaxButton = jQuery(e.currentTarget); var createTaxUrl = addTaxButton.data('url')+'&type='+addTaxButton.data('type'); thisInstance.editTax(createTaxUrl); }); contents.on('click', '.editChargeTax', function(e) { var editTaxButton = jQuery(e.currentTarget); var currentTrElement = editTaxButton.closest('tr'); thisInstance.editTax(editTaxButton.data('url'), currentTrElement); }); } }); } }); }, editCharge : function(url, currentTrElement) { var aDeferred = jQuery.Deferred(); var thisInstance = this; app.helper.showProgress(); app.request.post({url:url}).then( function(err,data) { var callBackFunction = function(data) { //cache should be empty when modal opened thisInstance.duplicateCheckCache = {}; var form = jQuery('#editCharge'); thisInstance.registerUpdateRegionsElementEvent(); jQuery('.regions').trigger('change'); var container = jQuery('#scrollContainer'); form.find('#flat').click(function(e) { form.find('.percentIcon').addClass('hide'); jQuery('[name="value"]', container).data('ruleInventory_percentage',false).data('rulePositivenumber',true); jQuery('[name="defaultValue"]', container).data('ruleInventory_percentage',false).data('rulePositivenumber',true); var valuesObjsList = jQuery('.valuesList', container); jQuery.each(valuesObjsList, function(index, element) { jQuery(element).data('ruleInventory_percentage',false).data('rulePositivenumber',true); }); }); form.find('#percent').click(function(e) { form.find('.percentIcon').removeClass('hide'); jQuery('[name="value"]', container).data('ruleInventory_percentage',true).data('rulePositivenumber',true); jQuery('[name="defaultValue"]', container).data('ruleInventory_percentage',true).data('rulePositivenumber',true); var valuesObjsList = jQuery('.valuesList', container); jQuery.each(valuesObjsList, function(index, element) { jQuery(element).data('ruleInventory_percentage',true).data('rulePositivenumber',true); }); }); form.find('#fixed').click(function(e) { form.find('.regionsContainer').addClass('hide'); form.find('.chargeValueContainer').removeClass('hide').show(); }); form.find('#variable').click(function(e) { form.find('.chargeValueContainer').addClass('hide'); form.find('.regionsContainer').removeClass('hide').show(); }); form.find('.isTaxable').click(function(e) { var element = jQuery(e.currentTarget); var isChecked = element.is(':checked'); if (isChecked) { form.find('.taxContainer').removeClass('hide').show(); } else { form.find('.taxContainer').addClass('hide'); } }); form.on('click', '.deleteRow', function(e) { var element = jQuery(e.currentTarget); element.parent().parent().remove(); }); form.find('.addNewTaxBracket').click(function(e) { e.preventDefault(e); var taxRegionsTable = form.find('.regionsTable'); var taxRegionsCount = form.find('.regionsCount').val(); var widthHeight = form.find('#widthHeight').val(); var selectedFormat = jQuery(':checked', form.find('.formatContainer')).val(); var validator = 'PositiveNumber'; if (selectedFormat == 'Percent') { validator = 'inventory_percentage'; } var taxBracketBlock = jQuery('\n\ \n\ ×  \n\ \n\ \n\ \n\ \n\ \n\ '); var selectedRegions = []; var regionElements = jQuery('.regionsTable select.regions'); jQuery.each(regionElements, function(index, element) { var selectedValues = jQuery(element).val(); if (jQuery.isArray(selectedValues)) { for (var i=0; i\n\ '+details.name+'\n\ '+details.value+'\n\ '+details.isTaxable+'\n\ '+details.selectedTaxes+'\n\ \n\
\n\ \n\ \n\ \n\
\n\ '); jQuery('.inventoryChargesTable', container).append(trElementForCharge); }, validateChargeName : function(data) { var thisInstance = this; var aDeferred = jQuery.Deferred(); var chargeName = data.name; var form = jQuery('#editCharge'); var chargeNameElement = form.find('[name="name"]'); if(!(chargeName in thisInstance.duplicateCheckCache)) { thisInstance.checkDuplicateChargeName(data).then( function(data){ thisInstance.duplicateCheckCache[chargeName] = data['success']; aDeferred.resolve(data); }, function(data, err){ thisInstance.duplicateCheckCache[chargeName] = data['success']; thisInstance.duplicateCheckCache['message'] = data['message']; app.helper.showErrorNotification({message:data['message']}); aDeferred.reject(data); } ); } else { if(thisInstance.duplicateCheckCache[chargeName] == true){ var result = thisInstance.duplicateCheckCache['message']; app.helper.showErrorNotification({message:result}); aDeferred.reject(); } else { aDeferred.resolve(); } } return aDeferred.promise(); }, checkDuplicateChargeName : function(details) { var aDeferred = jQuery.Deferred(); var params = { 'module' : app.getModuleName(), 'parent' : app.getParentModuleName(), 'action' : 'TaxAjax', 'mode' : 'checkDuplicateInventoryCharge', 'name' : details.name, 'chargeid' : details.chargeid } app.request.post({data:params}).then(function(err,data) { if(err == null){ var response = data; var result = response['success']; if(result == true) { aDeferred.reject(response); } else { aDeferred.resolve(response); } } else { aDeferred.reject(); } }); return aDeferred.promise(); }, registerUpdateRegionsElementEvent : function() { jQuery('.regionsTable').on('change', '.regions', function(e) { var currentElement = e.currentTarget; var selectedRegions = []; var regionElements = jQuery('.regionsTable select.regions'); jQuery.each(regionElements, function(index, element) { var selectedValues = jQuery(element).val(); if (jQuery.isArray(selectedValues)) { for (var i=0; i 0) { } else { var params = {}; params['module'] = app.getModuleName(); params['parent'] = app.getParentModuleName(); params['view'] = 'TaxIndex'; params['mode'] = 'showTaxRegions'; app.request.post({data:params}).then(function(err,data) { relatedContainer.html(data); contents.find('.addRegion').click(function(e) { var addRegionButton = jQuery(e.currentTarget); thisInstance.editRegion(addRegionButton.data('url')); }); contents.on('click', '.editRegion', function(e) { var editRegionButton = jQuery(e.currentTarget); var currentTrElement = editRegionButton.closest('tr'); thisInstance.editRegion(editRegionButton.data('url'), currentTrElement); }); contents.on('click', '.deleteRegion', function(e) { var deleteRegionButton = jQuery(e.currentTarget); var currentTrElement = deleteRegionButton.closest('tr'); thisInstance.deleteRegion(deleteRegionButton.data('url'), currentTrElement); }); }); } }); }, deleteRegion : function(url, currentElement) { var message = app.vtranslate('JS_DELETE_REGION_DESC'); app.helper.showConfirmationBox({'message' : message}).then(function(e) { app.helper.showProgress(); app.request.post({url:url}).then(function(err,data){ app.helper.hideProgress(); if(err == null) { currentElement.remove(); var params = { message: app.vtranslate('JS_TAX_REGION_DELETED_SUCCESSFULLY') }; app.helper.showSuccessNotification(params); } else { var params = { message : app.vtranslate('JS_LBL_PERMISSION') } app.helper.showErrorNotification(params); } }); }); }, editRegion : function(url, currentTrElement) { var aDeferred = jQuery.Deferred(); var thisInstance = this; app.helper.showProgress(); app.request.post({url:url}).then( function(err,data) { if(err == null){ var callBackFunction = function(data) { var form = jQuery('#editTaxRegion'); //cache should be empty when modal opened thisInstance.duplicateCheckCache = {}; var params = { submitHandler : function(form){ var form = jQuery(form); thisInstance.saveRegionDetails(form, currentTrElement); } } form.vtValidate(params); form.submit(function(e) { e.preventDefault(); }) } app.helper.hideProgress(); app.helper.showModal(data,{cb:callBackFunction}); }else { aDeferred.reject(err); } }); return aDeferred.promise(); }, saveRegionDetails : function(form, currentTrElement) { var thisInstance = this; var params = form.serializeFormData(); if(typeof params == 'undefined' ) { params = {}; } thisInstance.validateRegionName(params).then( function(data) { app.helper.showProgress(); params.module = app.getModuleName(); params.parent = app.getParentModuleName(); params.action = 'TaxAjax'; params.mode = 'saveTaxRegion'; app.request.post({data:params}).then( function(err,data) { app.helper.hideProgress(); app.helper.hideModal(); if(form.find('[name="taxRegionId"]').val() == "") { thisInstance.addRegionDetails(data); } else { currentTrElement.find('.taxRegionName').text(data['name']); } var params = { message: app.vtranslate('JS_TAX_REGION_SAVED_SUCCESSFULLY') }; app.helper.showSuccessNotification(params); } ); }, function(data,err){ app.helper.hideModal(); app.helper.showErrorNotification({message:data["message"]}); } ); }, validateRegionName : function(data) { var thisInstance = this; var aDeferred = jQuery.Deferred(); var regionName = data.name; var form = jQuery('#editTaxRegion'); var regionNameElement = form.find('[name="name"]'); if(!(regionName in thisInstance.duplicateCheckCache)) { thisInstance.checkDuplicateRegionName(data).then( function(data){ thisInstance.duplicateCheckCache[regionName] = true; thisInstance.duplicateCheckCache['message'] = app.vtranslate('JS_LBL_TAX_REGION_EXIST'); aDeferred.resolve(data); }, function(data, err){ thisInstance.duplicateCheckCache[regionName] = data['success']; thisInstance.duplicateCheckCache['message'] = data['message']; aDeferred.reject(data); } ); } else { if(thisInstance.duplicateCheckCache[regionName] == true){ aDeferred.reject({message:thisInstance.duplicateCheckCache['message']}); } else { aDeferred.resolve(); } } return aDeferred.promise(); }, checkDuplicateRegionName : function(details) { var aDeferred = jQuery.Deferred(); var params = { 'module' : app.getModuleName(), 'parent' : app.getParentModuleName(), 'action' : 'TaxAjax', 'mode' : 'checkDuplicateTaxRegion', 'taxRegionName' : details.name, 'taxRegionId' : details.taxRegionId } app.request.post({data:params}).then(function(err,data) { if(err == null){ var result = data['success']; if(result == true) { aDeferred.reject(data); } else { aDeferred.resolve(data); } }else { aDeferred.reject(); } }); return aDeferred.promise(); }, addRegionDetails : function(details) { var container = this.getContainer(); var trElementForRegion = jQuery('\n\ \n\ '+details.name+'\n\ \n\ \n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\ '); jQuery('.taxRegionsTable', container).append(trElementForRegion); }, /* * Function to update tax status as enabled or disabled */ updateTaxStatus : function(currentTarget) { var aDeferred = jQuery.Deferred(); var currentTrElement = currentTarget.closest('tr'); var taxId = currentTrElement.data('taxid'); var taxType = currentTrElement.data('taxtype'); var deleted = currentTarget.is(':checked') ? 0 : 1; app.helper.showProgress(); var params = { 'module' : app.getModuleName(), 'parent' : app.getParentModuleName(), 'action' : 'TaxAjax', 'mode' : 'updateTaxStatus', 'taxid' : taxId, 'type' : taxType, 'deleted' : deleted } app.request.post({data:params}).then( function(err,data) { if(err == null){ app.helper.hideProgress(); aDeferred.resolve(data); }else { app.helper.hideProgress(); aDeferred.reject(err); } }); return aDeferred.promise(); }, /* * Function to register all actions in the Tax List */ registerActions : function() { var thisInstance = this; var container = this.getContainer(); //register click event for Add New Tax button container.find('.addTax').click(function(e) { var addTaxButton = jQuery(e.currentTarget); var createTaxUrl = addTaxButton.data('url')+'&type='+addTaxButton.data('type'); thisInstance.editTax(createTaxUrl); }); //register event for edit tax icon container.on('click', '.editTax', function(e) { var editTaxButton = jQuery(e.currentTarget); var currentTrElement = editTaxButton.closest('tr'); thisInstance.editTax(editTaxButton.data('url'), currentTrElement); }); //register event for checkbox to change the tax Status container.on('click', '.editTaxStatus', function(e) { var currentTarget = jQuery(e.currentTarget); thisInstance.updateTaxStatus(currentTarget).then( function(data){ var params = {}; if(currentTarget.is(':checked')) { params.message = app.vtranslate('JS_TAX_ENABLED'); } else { params.message = app.vtranslate('JS_TAX_DISABLED'); } app.helper.showSuccessNotification(params); }, function(error){ //TODO: Handle Error } ); }); container.on('click', '[name="default_tax_mode"]', function(e) { var currentTarget = jQuery(e.currentTarget); var value = currentTarget.val(); var prevSelectedValue = jQuery('#selectedTaxMode').val(); if(value != prevSelectedValue) { var params = { 'module' : app.getModuleName(), 'parent' : app.getParentModuleName(), 'action' : 'TaxAjax', 'mode' : 'updateDefaultTaxMode', 'defaultTaxMode': value } app.request.post({data:params}).then(function(err,data) { if(err == null){ jQuery('#selectedTaxMode').val(value); var selectedType = currentTarget.parent().find('.mode').text(); app.helper.showSuccessNotification({ "message":app.vtranslate('JS_DEFAULT_TAX_MODE_SET_AS') + selectedType }); } else { app.helper.showErrorNotification({ "message": err }); } }); } }); }, registerEvents : function(){ this.registerChargesClickEvent(); this.registerRegionsClickEvent(); this.registerActions(); } });