Handsontable keeps rounding values

Viewed 36

I am currently using a script to create Purchase orders that has been developed using HandsonTable. The script works absolutely fine, however I am having issues with some rounding and decimals, especially for the field quantity. If I am to enter a straight value such as 10 it all works fine, however I sometimes have values that come with decimals, such as 10.45 and I would like to enter this value, however it always ends up as a rounded value (and also no decimals) once I end up saving the actual order.

Here how I enter my data:

enter image description here

Result after saving:

enter image description here

As you can see, the value 40.25 became 40. I have tried a few things looking around the web, such as adding matissa or numericFormat: {pattern: '0,0'},in the qty value and I’ve also tried to find some freelancer but none of them were able to help me get this resolved.

Please find below the code I was told is responsible for this - some expert help would be immensely appreciated, thank you.

    <script>

function removeCommas(str) {
"use strict";
return(str.replace(/,/g,''));
}

function dc_percent_change(invoker){
"use strict";
var total_mn = $('input[name="total_mn"]').val();
var t_mn = (removeCommas(total_mn));
var rs = (t_mn*invoker.value)/100;

$('input[name="dc_total"]').val(numberWithCommas(rs));
$('input[name="after_discount"]').val(numberWithCommas(t_mn - rs));

}

function dc_total_change(invoker){
"use strict";
var total_mn = $('input[name="total_mn"]').val();
var t_mn = (removeCommas(total_mn));
var rs = t_mn - (removeCommas(invoker.value));

$('input[name="after_discount"]').val(numberWithCommas(rs));
}

$(function(){
"use strict";
    validate_purorder_form();
    function validate_purorder_form(selector) {

        selector = typeof(selector) == 'undefined' ? '#pur_order-form' : selector;

        appValidateForm($(selector), {
            pur_order_name: 'required',
            pur_order_number: 'required',
            order_date: 'required',
            vendor: 'required',
        });
    }


});
function estimate_by_vendor(invoker){
"use strict";
if(invoker.value != 0){
    $.post(admin_url + 'purchase/estimate_by_vendor/'+invoker.value).done(function(response){
    response = JSON.parse(response);
    $('select[name="estimate"]').html('');
    $('select[name="estimate"]').append(response.result);
    $('select[name="estimate"]').selectpicker('refresh');
    $('#dropdown_menu_tax_total_type1').html('');
    $('#dropdown_menu_tax_total_type1').append('<span class="discount-type-selected">' + response.currency + '</span>');
    $('#dropdown_menu_tax_total_type2').html('');
    $('#dropdown_menu_tax_total_type2').append('<span class="discount-type-selected">' + response.currency + '</span>');
    $('#dropdown_menu_tax_total_type3').html('');
    $('#dropdown_menu_tax_total_type3').append('<span class="discount-type-selected">' + response.currency + '</span>');
    });

}
}

<?php if(!isset($pur_order)){
?>  
function numberWithCommas(x) {
"use strict";
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
var dataObject = [
    
    ];
var hotElement = document.querySelector('#example');
    var hotElementContainer = hotElement.parentNode;
    var hotSettings = {
    data: dataObject,
    columns: [
        {
        data: 'item_code',
        renderer: customDropdownRenderer,
        editor: "chosen",
        width: 150,
        chosenOptions: {
            data: <?php echo json_encode($items); ?>
        }
        },
        {
        data: 'unit_id',
        renderer: customDropdownRenderer,
        editor: "chosen",
        width: 50,
        chosenOptions: {
            data: <?php echo json_encode($units); ?>
        },
        readOnly: true
    
        },
        {
        data: 'unit_price',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        },
        readOnly: true
        },
        {
        data: 'quantity',
        type: 'numeric',
    
        },
        {
        data: 'into_money',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        },
        readOnly: true
        },
        {
        data: 'tax',
        renderer: customDropdownRenderer,
        editor: "chosen",
        multiSelect:true,
        width: 50,
        chosenOptions: {
            multiple: true,
            data: <?php echo json_encode($taxes); ?>
        }
        },
        {
        data: 'total',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        },
        readOnly: true
        },{
        data: 'discount_%',
        type: 'numeric',
        renderer: customRenderer
        },
        {
        data: 'discount_money',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        }
        },
        {
        data: 'total_money',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        }
    
        }
    
    ],
    licenseKey: 'non-commercial-and-evaluation',
    stretchH: 'all',
    width: '100%',
    autoWrapRow: true,
    rowHeights: 30,
    columnHeaderHeight: 40,
    minRows: 10,
    maxRows: 40,
    rowHeaders: true,
    colWidths: [200,10,100,50,100,50,100,50,100,100],
    colHeaders: [
        '<?php echo _l('items'); ?>',
        '<?php echo _l('unit'); ?>',
        '<?php echo _l('unit_price'); ?>',
        '<?php echo _l('quantity'); ?>',
        '<?php echo _l('subtotal'); ?>',
        '<?php echo _l('tax'); ?>',
        '<?php echo _l('subtotal_after_tax'); ?>',
        '<?php echo _l('discount(%)').'(%)'; ?>',
        '<?php echo _l('discount(money)'); ?>',
        '<?php echo _l('total'); ?>',
    ],
    columnSorting: {
        indicator: true
    },
    autoColumnSize: {
        samplingRatio: 23
    },
    dropdownMenu: true,
    mergeCells: true,
    contextMenu: true,
    manualRowMove: true,
    manualColumnMove: true,
    multiColumnSorting: {
        indicator: true
    },
    filters: true,
    manualRowResize: true,
    manualColumnResize: true
    };


var hot = new Handsontable(hotElement, hotSettings);
hot.addHook('afterChange', function(changes, src) {
if(changes !== null){
    changes.forEach(([row, prop, oldValue, newValue]) => {
        if(newValue != ''){
        if(prop == 'item_code'){
            $.post(admin_url + 'purchase/items_change/'+newValue).done(function(response){
            response = JSON.parse(response);

            hot.setDataAtCell(row,1, response.value.unit_id);
            hot.setDataAtCell(row,2, response.value.purchase_price);
            hot.setDataAtCell(row,4, response.value.purchase_price*hot.getDataAtCell(row,3));
            });
        }else if(prop == 'quantity'){
            hot.setDataAtCell(row,4, newValue*hot.getDataAtCell(row,2));
            hot.setDataAtCell(row,6, newValue*hot.getDataAtCell(row,2));
            hot.setDataAtCell(row,9, newValue*hot.getDataAtCell(row,2));
        }else if(prop == 'tax'){
            $.post(admin_url + 'purchase/tax_change/'+newValue).done(function(response){
            response = JSON.parse(response);
            hot.setDataAtCell(row,6, (response.total_tax*(hot.getDataAtCell(row,4)))/100 + (hot.getDataAtCell(row,4)));
            hot.setDataAtCell(row,9, (response.total_tax*(hot.getDataAtCell(row,4)))/100 + (hot.getDataAtCell(row,4)));
            });
        }else if(prop == 'discount_%'){
            hot.setDataAtCell(row,8, (newValue*(hot.getDataAtCell(row,6)))/100 );

        }else if(prop == 'discount_money'){
            hot.setDataAtCell(row,9, ((hot.getDataAtCell(row,6)) - newValue));
        }else if(prop == 'total_money'){
        var total_money = 0;
            for (var row_index = 0; row_index <= 40; row_index++) {
            if((hot.getDataAtCell(row_index, 9)) > 0){
                total_money += ((hot.getDataAtCell(row_index, 9)));
            }
            }
            $('input[name="total_mn"]').val(numberWithCommas(total_money));
        }
        }
    });
}
});
$('.save_detail').on('click', function() {
$('input[name="pur_order_detail"]').val(hot.getData());   
});

function coppy_pur_estimate(){
"use strict";
var pur_estimate = $('select[name="estimate"]').val();
if(pur_estimate != ''){
    hot.alter('remove_row',0,hot.countRows ());
    $.post(admin_url + 'purchase/coppy_pur_estimate/'+pur_estimate).done(function(response){
        response = JSON.parse(response);
        hot.updateSettings({
        data: response.result,
        });

        var total_money = 0;
        for (var row_index = 0; row_index <= 40; row_index++) {
            if((hot.getDataAtCell(row_index, 9)) > 0){
            total_money += ((hot.getDataAtCell(row_index, 9)));
            }
        }
        $('input[name="total_mn"]').val(numberWithCommas(total_money));
        $('input[name="dc_percent"]').val(numberWithCommas(response.dc_percent));
        $('input[name="dc_total"]').val(numberWithCommas(response.dc_total));
        $('input[name="after_discount"]').val(numberWithCommas(total_money - response.dc_total));
    });

    
}else{
    alert_float('warning', '<?php echo _l('please_chose_pur_estimate'); ?>')
}
}


<?php } else{ ?>

function numberWithCommas(x) {
"use strict";
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

var dataObject = <?php echo html_entity_decode($pur_order_detail); ?>;
var hotElement = document.querySelector('#example');
    var hotElementContainer = hotElement.parentNode;
    var hotSettings = {
    data: dataObject,
    columns: [
        {
        data: 'id',
        type: 'numeric',
    
        },
        {
        data: 'pur_order',
        type: 'numeric',
    
        },
        {
        data: 'item_code',
        renderer: customDropdownRenderer,
        editor: "chosen",
        width: 150,
        chosenOptions: {
            data: <?php echo json_encode($items); ?>
        }
        },
        {
        data: 'unit_id',
        renderer: customDropdownRenderer,
        editor: "chosen",
        width: 50,
        chosenOptions: {
            data: <?php echo json_encode($units); ?>
        },
        readOnly: true
    
        },
        {
        data: 'unit_price',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        },
        readOnly: true
        },
        {
        data: 'quantity',
        type: 'numeric',
    
        },
        {
        data: 'into_money',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        },
        readOnly: true
        },
        {
        data: 'tax',
        renderer: customDropdownRenderer,
        editor: "chosen",
        multiSelect:true,
        width: 50,
        chosenOptions: {
            multiple: true,
            data: <?php echo json_encode($taxes); ?>
        }
        },
        {
        data: 'total',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        },
        readOnly: true
        },{
        data: 'discount_%',
        type: 'numeric',
        renderer: customRenderer
        },
        {
        data: 'discount_money',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        }
        },
        {
        data: 'total_money',
        type: 'numeric',
        numericFormat: {
            pattern: '0,0'
        }
    
        }
    
    ],
    licenseKey: 'non-commercial-and-evaluation',
    stretchH: 'all',
    width: '100%',
    autoWrapRow: true,
    rowHeights: 30,
    columnHeaderHeight: 40,
    minRows: 10,
    maxRows: 40,
    rowHeaders: true,
    colWidths: [0,0,200,50,100,50,100,50,100,50,100,100],
    colHeaders: [
        '',
        '',
        '<?php echo _l('items'); ?>',
        '<?php echo _l('unit'); ?>',
        '<?php echo _l('unit_price'); ?>',
        '<?php echo _l('quantity'); ?>',
        '<?php echo _l('subtotal'); ?>',
        '<?php echo _l('tax'); ?>',
        '<?php echo _l('subtotal_after_tax'); ?>',
        '<?php echo _l('discount(%)').'(%)'; ?>',
        '<?php echo _l('discount(money)'); ?>',
        '<?php echo _l('total'); ?>',
    ],
    columnSorting: {
        indicator: true
    },
    autoColumnSize: {
        samplingRatio: 23
    },
    dropdownMenu: true,
    mergeCells: true,
    contextMenu: true,
    manualRowMove: true,
    manualColumnMove: true,
    multiColumnSorting: {
        indicator: true
    },
    hiddenColumns: {
        columns: [0,1],
        indicators: true
    },
    filters: true,
    manualRowResize: true,
    manualColumnResize: true
    };


var hot = new Handsontable(hotElement, hotSettings);
hot.addHook('afterChange', function(changes, src) {
if(changes !== null){
    changes.forEach(([row, prop, oldValue, newValue]) => {
        if(newValue != ''){
        if(prop == 'item_code'){
        $.post(admin_url + 'purchase/items_change/'+newValue).done(function(response){
            response = JSON.parse(response);

            hot.setDataAtCell(row,3, response.value.unit_id);
            hot.setDataAtCell(row,4, response.value.purchase_price);
            hot.setDataAtCell(row,6, response.value.purchase_price*hot.getDataAtCell(row,5));
        });
        }else if(prop == 'quantity'){
        hot.setDataAtCell(row,6, newValue*hot.getDataAtCell(row,4));
        hot.setDataAtCell(row,8, newValue*hot.getDataAtCell(row,4));
        hot.setDataAtCell(row,11, newValue*hot.getDataAtCell(row,4));
        }else if(prop == 'tax'){
        $.post(admin_url + 'purchase/tax_change/'+newValue).done(function(response){
            response = JSON.parse(response);
            hot.setDataAtCell(row,8, (response.total_tax*(hot.getDataAtCell(row,6)))/100 + (hot.getDataAtCell(row,6)));
            hot.setDataAtCell(row,11, (response.total_tax*(hot.getDataAtCell(row,6)))/100 + (hot.getDataAtCell(row,6)));
        });
        }else if(prop == 'discount_%'){
        hot.setDataAtCell(row,10, (newValue*(hot.getDataAtCell(row,8)))/100 );

        }else if(prop == 'discount_money'){
        hot.setDataAtCell(row,11, ((hot.getDataAtCell(row,8)) - newValue));
        }else if(prop == 'total_money'){
        var total_money = 0;
        for (var row_index = 0; row_index <= 40; row_index++) {
            if((hot.getDataAtCell(row_index, 11)) > 0){
            total_money += ((hot.getDataAtCell(row_index, 11)));
            }
        }
        $('input[name="total_mn"]').val(numberWithCommas(total_money));
        }
    }
    });
}
});
$('.save_detail').on('click', function() {
$('input[name="pur_order_detail"]').val(hot.getData());   
});

id = $('select[name="vendor"]').val();
$.post(admin_url + 'purchase/estimate_by_vendor/'+id).done(function(response){
response = JSON.parse(response);
$('select[name="estimate"]').html('');
$('select[name="estimate"]').append(response.result);
$('select[name="estimate"]').val(<?php echo html_entity_decode($pur_order->estimate); ?>).change();
$('select[name="estimate"]').selectpicker('refresh');
});

var total_money = 0;
for (var row_index = 0; row_index <= 40; row_index++) {
if((hot.getDataAtCell(row_index, 11)) > 0){
    total_money += ((hot.getDataAtCell(row_index, 11)));
}


}
$('input[name="total_mn"]').val(numberWithCommas(total_money));

function coppy_pur_estimate(){
"use strict";
var pur_estimate = $('select[name="estimate"]').val();
if(pur_estimate != ''){
    hot.alter('remove_row',0,hot.countRows ());
    $.post(admin_url + 'purchase/coppy_pur_estimate/'+pur_estimate).done(function(response){
        response = JSON.parse(response);
        hot.updateSettings({
        data: response.result,
        });
        var total_money = 0;
        for (var row_index = 0; row_index <= 40; row_index++) {
        if((hot.getDataAtCell(row_index, 11)) > 0){
            total_money += ((hot.getDataAtCell(row_index, 11)));
        }
        }
        $('input[name="total_mn"]').val(numberWithCommas(total_money));
        $('input[name="dc_percent"]').val(numberWithCommas(response.dc_percent));
        $('input[name="dc_total"]').val(numberWithCommas(response.dc_total));
        $('input[name="after_discount"]').val(numberWithCommas(total_money - response.dc_total));  
    });
}else{
    alert_float('warning', '<?php echo _l('please_chose_pur_estimate'); ?>')
}
}

<?php } ?>
function customRenderer(instance, td, row, col, prop, value, cellProperties) {
"use strict";
    Handsontable.renderers.TextRenderer.apply(this, arguments);
    if(td.innerHTML != ''){
    td.innerHTML = td.innerHTML + '%'
    td.className = 'htRight';
    }
}

function customDropdownRenderer(instance, td, row, col, prop, value, cellProperties) {
"use strict";
    var selectedId;
    var optionsList = cellProperties.chosenOptions.data;
    
    if(typeof optionsList === "undefined" || typeof optionsList.length === "undefined" || !optionsList.length) {
        Handsontable.cellTypes.text.renderer(instance, td, row, col, prop, value, cellProperties);
        return td;
    }

    var values = (value + "").split("|");
    value = [];
    for (var index = 0; index < optionsList.length; index++) {

        if (values.indexOf(optionsList[index].id + "") > -1) {
            selectedId = optionsList[index].id;
            value.push(optionsList[index].label);
        }
    }
    value = value.join(", ");

    Handsontable.cellTypes.text.renderer(instance, td, row, col, prop, value, cellProperties);
    return td;
}

</script>
0 Answers
Related