CORE-POS/IS4C

View on GitHub
fannie/purchasing/js/manual.js

Summary

Maintainability
F
3 days
Test Coverage
function skuField(row, vendor_id)
{
    var sku = $('<input type="text" name="sku[]" required />')
        .addClass('form-control')
        .addClass('item-sku')
        .addClass('upc-field')
        .addClass('input-sm')
        .autocomplete({
            source: function(request, callback) {
                vendorAutoComplete('../ws/', 'sku', request.term, vendor_id, callback);
            },
            minLength: 2
        })
        .on( "autocompletechange", function(event,ui) {
            // post value to console for validation
            skuLookup($(this).val(), $(this));
        });
    row.append($('<td>').append(sku));
}

function upcField(row, vendor_id)
{
    var upc = $('<input type="text" name="upc[]" required />')
        .addClass('form-control')
        .addClass('item-upc')
        .addClass('input-sm')
        .addClass('upc-field')
        .autocomplete({
            source: function(request, callback) {
                vendorAutoComplete('../ws/', 'item', request.term, vendor_id, callback);
            },
            minLength: 2
        })
        .on( "autocompletechange", function(event,ui) {
            // post value to console for validation
            upcLookup($(this).val(), $(this));
        })
        .on("keyup", function(event,ui) {
            if (event.keyCode == 13) {
                addInvoiceLine();
            }
        });
    row.append($('<td>').append(upc));
}

function qtyField(row)
{
    var qty = $('<input type="text" name="cases[]" required />')
        .val(1)
        .addClass('input-sm')
        .addClass('item-cases')
        .addClass('form-control');
    row.append($('<td>').addClass('col-sm-1').append(qty));
}

function caseSizeField(row)
{
    var caseSize = $('<input type="text" name="case-size[]" required />')
        .val(1)
        .addClass('item-units')
        .addClass('input-sm')
        .addClass('form-control');
    row.append($('<td>').addClass('col-sm-1').append(caseSize));
}

function totalField(row)
{
    var total = $('<input type="text" name="total[]" required />')
        .addClass('price-field')
        .addClass('input-sm')
        .addClass('form-control');
    row.append($('<td>').append(total));
}

function brandField(row)
{
    var brand = $('<input type="text" name="brand[]" />')
        .val($('#vendor-name strong').html())
        .addClass('item-brand')
        .addClass('input-sm')
        .addClass('form-control');
    row.append($('<td>').append(brand));
}

function descriptionField(row)
{
    var description = $('<input type="text" name="description[]" required />')
        .hover(function() {
            $(this).prop('title', $(this).val());
        })
        .addClass('item-description')
        .addClass('input-sm')
        .addClass('form-control');
    row.append($('<td>').append(description));
}

function removeButton(row)
{
    if ($('input[name=order-id]').length > 0) {
        return;
    }
    var remove = $('<button type="button">')
        .addClass('btn')
        .addClass('btn-default')
        .addClass('alert-danger')
        .addClass('btn-sm')
        .html($('#delete-html').html())
        .click(function() {
            $(this).closest('tr').remove();
        });
    row.append($('<td>').append(remove));
}

function receiveLine()
{
    var row = $('<tr class="small">');
    row.append('<th class="text-right">Recv\'d Qty</th>');
    row.append('<td><input type="text" name="recv-cases[]" class="input-sm recv-cases form-control" /></td>'); 
    row.append('<th class="text-right" colspan="2">Recv\'d Cost</th>');
    row.append('<td><input type="text" name="recv-cost[]" class="input-sm recv-cost form-control" /></td>'); 
    row.append('<th class="text-right">Recv\'d Date</th>');
    row.append('<td><input type="text" name="recv-date[]" class="input-sm recv-date form-control" /></td>'); 

    row.prependTo('#invoice-table tbody');

    $('input.recv-date').datepicker({
        dateFormat: 'yy-mm-dd',    
        changeYear: true,
        yearRange: "c-10:c+10",
    });
    $('input.recv-date').attr('autocomplete', 'off');
}

function addInvoiceLine()
{
    if ($('input[name=order-id]').length > 0) {
        receiveLine();
    }

    var vendor_id = $('#vendor-id').val();
    var row = $('<tr>');

    upcField(row, vendor_id);
    skuField(row, vendor_id);
    qtyField(row);
    caseSizeField(row);
    totalField(row);
    brandField(row);
    descriptionField(row);
    removeButton(row);

    row.prependTo('#invoice-table tbody');

    row.find('input:first').focus();
}

function skuLookup(sku, elem)
{
    doLookup('sku', sku, elem);
}

function upcLookup(upc, elem)
{
    doLookup('upc', upc, elem);
}

var loading = false;
function stopLoading()
{
    loading=false;
}

function doLookup(mode, term, elem)
{
    if (loading) {
        return;
    }
    var vendor_id = $('#vendor-id').val();
    var p = { type: 'vendor', vendor_id: vendor_id };
    if (mode === 'sku') {
        p.sku = term;
    } else if (mode === 'upc') {
        p.upc = term;
    }

    var req = {
        jsonrpc: '2.0',
        method: '\\COREPOS\\Fannie\\API\\webservices\\FannieItemInfo',
        id: new Date().getTime(),
        params: p
    };

    $.ajax({
        url: '../ws/',
        type: 'post',
        data: JSON.stringify(req),
        dataType: 'json',
        contentType: 'application/json'
    }).done(function(data) {
        if (data.result && (data.result.sku || data.result.upc)) {
            if (mode === 'sku' && data.result.upc !== '0000000000000') {
                elem.closest('tr').find('.item-upc').val(data.result.upc);
            } else if (mode === 'sku') {
                elem.closest('tr').find('.item-upc').val('');
            } else if (mode === 'upc') {
                elem.closest('tr').find('.item-sku').val(data.result.sku);
            }
            if (data.result.units !== '') {
                elem.closest('tr').find('.item-units').val(data.result.units);
            }
            if (data.result.brand !== '') {
                elem.closest('tr').find('.item-brand').val(data.result.brand);
            }
            if (data.result.description !== '') {
                elem.closest('tr').find('.item-description').val(data.result.description);
            }
        }
    });
}

function vendorAutoComplete(ws_url, field_name, search_term, vendor_id, callback)
{
    var req = {
        jsonrpc: '2.0',
        method: '\\COREPOS\\Fannie\\API\\webservices\\FannieAutoComplete',
        id: new Date().getTime(),
        params: { field: field_name, search: search_term, vendor_id: vendor_id }
    };

    $.ajax({
        url: ws_url,
        type: 'post',
        data: JSON.stringify(req),
        dataType: 'json',
        contentType: 'application/json'
    }).done(function(data) {
        if (data.result) {
            callback(data.result);
        }
    }).fail(function() {
        callback([]);
    });
}

function saveOrder()
{
    $('#save-btn').prop('disabled', true);
    var dataStr = $('#order-form').serialize();
    $.ajax({
        type: 'post',
        data: dataStr,
        dataType: 'json'
    }).done(function(resp) {
        if (resp.error) {
            showBootstrapAlert('#alert-area', 'danger', resp.message);
            $('#save-btn').prop('disabled', false);
        } else {
            window.location = 'ViewPurchaseOrders.php?id=' + resp.order_id;
        }
    });
}

function existingOrder(orderJSON, itemsJSON)
{
    var order = JSON.parse(orderJSON);
    var items = JSON.parse(itemsJSON);

    if (order.creationDate) {
        $('input[name=order-date]').val(order.creationDate);
    }
    if (order.vendorOrderID) {
        $('input[name=po-number]').val(order.vendorOrderID);
    }
    if (order.vendorInvoiceID) {
        $('input[name=inv-number]').val(order.vendorInvoiceID);
    }

    var name = $('#vendor-name').html();
    name = name.replace('New <', 'Existing <');
    name += ' #' + order.orderID;
    $('#vendor-name').html(name);

    var idField = $('<input type="hidden" name="order-id" />').val(order.orderID);
    $('#order-form').append(idField);

    loading = true;
    items.forEach(function(item) {
        var total = Number(item.receivedTotalCost);
        var unit = Number(item.unitCost);
        var cases = Number(item.quantity);
        var caseSize = Number(item.caseSize);

        if (isNaN(total)) {
            total = unit * cases * caseSize;
        }

        addInvoiceLine();
        $('input.item-sku:first').val(item.sku);
        $('input.item-upc:first').val(item.internalUPC);
        $('input.item-cases:first').val(cases);
        $('input.item-units:first').val(caseSize);
        $('input.price-field:first').val(total);
        $('input.item-brand:first').val(item.brand);
        $('input.item-description:first').val(item.description);
        $('input.recv-cases:first').val(item.receivedQty);
        $('input.recv-cost:first').val(item.receivedTotalCost);
        $('input.recv-date:first').val(item.receivedDate);
    });

    setTimeout(stopLoading, 250);
}