/** * Could (should) tidy this up to move the Quote/Invoice etc Specific * functionality into seperate files. * * * Karl - 20/5/2011 */ $(function() { /** * A more generic way of handling the HABTM * Copypasta'd from add_edit_shipment.js. */ function addToList(modelName, id, value, ULelement) { var thisLI = $('
  • '); var thisButton = $(''); thisButton.addClass('removeFromList'); thisButton.button(); var thisHiddenInput = $(''); var modelString = '['+modelName+']'; thisHiddenInput.attr('name', 'data[PurchaseOrder]'+modelString+'[]'); thisHiddenInput.attr('value', id); thisLI.attr('id', modelName+'ID_'+id); thisLI.html(value); thisLI.prepend(thisButton); thisLI.append(thisHiddenInput); ULelement.append(thisLI); } //Remove X button clicked. $('.removeFromList').live('click', function() { $(this).parent().remove(); }); // var config defined in global.js loadLineItems(); var docID = $('#documentID').html(); $("#lineItemDetails").hide(); $( "#addLineItemModal" ).dialog({ autoOpen: false, height: 900, width: 600, modal: true, buttons: { "Add Line Item": function() { $('#LineItemDescription').ckeditor(function() { this.updateElement(); }); var thisLineItemInputs = $('#LineItemAddForm').find('input,select,textarea'); $.post('/line_items/ajax_add', thisLineItemInputs, function(data) { if(data == 'SUCCESS') { loadLineItems(); $( "#addLineItemModal" ).dialog('close'); } else { alert("Line Item could not be saved") $('#LineItemDescription').ckeditor(config); } }); }, Cancel: function() { $( this ).dialog( "close" ); } }, close: function() { loadLineItems(); } }); $( "#editLineItemModal" ).dialog({ autoOpen: false, height: 900, width: 600, modal: true, buttons: { "Edit Line Item": function() { $('#LineItemDescription').ckeditor(function() { this.updateElement(); }); var thisLineItemInputs = $('#LineItemEditForm').find('input,select,textarea'); $.post('/line_items/ajax_edit', thisLineItemInputs, function(data) { if(data == 'SUCCESS') { $( "#editLineItemModal" ).dialog('close'); } else { alert("Line Item could not be saved") $('#LineItemDescription').ckeditor(config); } }); }, Cancel: function() { $( "#editLineItemModal" ).dialog('close'); } }, close: function() { loadLineItems(); } }); $( "#QuoteDetails" ).dialog({ autoOpen: false, height: 900, width: 600, modal: true, buttons: { "Edit Quote Details": function() { $('#QuoteCommercialComments').ckeditor(function() { this.updateElement(); this.destroy(); }); var quoteInputs = $('#QuoteEditForm').find('input,select,textarea'); $.post('/quotes/ajax_edit', quoteInputs, function(data) { $( "#QuoteDetails" ).dialog('close'); }); }, Cancel: function() { $( this ).dialog( "close" ); } }, close: function() { loadLineItems(); } }); $( "#addJobConfirmation" ).dialog({ autoOpen: false, height: 400, width: 400, modal: true, buttons: { "Create Order Acknowledgement": function() { var documentID = $("#documentID").html(); //window.location.href = "/documents/convert_to_oa/"+documentID; //var newOAform = $('#DocumentConvertToOaForm').find('input'); var newOAform = $('#DocumentConvertToOaForm'); newOAform.submit(); /*$.post('/documents/convert_to_oa', newOAform, function(data) { if(data =='SUCCESS') { $("#flashMessage").html("Invoice Saved Successfully"); } else { $("#flashMessage").html("Unable to Save Invoice"); } $("#flashMessage").show(); loadLineItems(); }); */ }, Cancel: function() { $( this ).dialog( "close" ); } }, close: function() { } }); $("#pageContentFactory").hide(); //Add a new Page Element. $("#addPage").button().click(function(event) { event.preventDefault(); newPage(false); return false; }); //Open the LineItem dialog $(".addLineItem").button().click(function() { $('#LineItemDescription').ckeditor(function() { this.destroy(); }); $("#editLineItemModal").empty(); var nextItemNo = $(".lineItem").length; nextItemNo++; $.get('/line_items/add/'+docID, function(data) { $("#addLineItemModal").html(data); $("#LineItemItemNumber").val(nextItemNo); //Auto fill in the next Item No $("#productDetails").hide(); $('#LineItemDescription').ckeditor(config); showHideTextPrices(); $( "#addLineItemModal" ).dialog('open'); }); return false; }); $(".editLineItem").live('click', function() { $('#LineItemDescription').ckeditor(function() { this.destroy(); }); $("#addLineItemModal").empty(); var thisLineItemID = $(this).parent('td').attr('id'); $.get('/line_items/edit/'+thisLineItemID, function(data) { $("#editLineItemModal").html(data); $("#productDetails").hide(); $('#LineItemDescription').ckeditor(config); showHideTextPrices(); $( "#editLineItemModal" ).dialog('open'); }); }); var products = {}; $("#principleSelect").live('change',function() { var principleID = getSelectedID('#principleSelect'); $("#productDetails").hide(); $.get('/documents/getProducts/'+principleID, function(data) { $('#productsDiv').html(data); var resp = $(data).filter(".products_json"); products = jQuery.parseJSON(resp.html()); }); }); //Search for a Product $("#productSearch").live('change', function() { productSearch(); }); $("#productSearchButton").live('click', function() { productSearch(); }); function productSearch() { var searchVal = $("#productSearch").val(); searchVal = searchVal.toLowerCase(); var param = "term="+searchVal; $.getJSON("/products/autocomplete", param, function(data) { $("#productList").empty(); for(var id in data) { var link = "
  • "+data[id]+"
  • "; $("#productList").append(link); } }); } //Click on a search product name. $(".search_product").live('click', function() { var productID = $(this).data('product-id'); getProductDetails(productID); return false; }); $("#productSelect").live('change',function() { var productID = getSelectedID('#productSelect'); getProductDetails(productID); }); function getProductDetails(productID) { $.get('/documents/getProductDetails/'+productID, function(data) { $("#lineItemDetails").show(); $("#LineItemProductId").val(data.id); $("#LineItemTitle").val(data.title); var descText = ''; if(data.item_code) { descText = descText + '
    Item Code: ' + data.item_code; } if(data.item_description) { descText = descText + '
    Item Description: ' + data.item_description + '
    '; } descText = descText + data.description; $("#LineItemDescription").val(descText); }, "json"); } //Autocomplete product title for adding lineItem $( "#productAutocomplete" ).live('focus', function() { $(this).autocomplete({ source: "/products/autocomplete", minLength: 2, select: function( event, ui ) { console.log(ui); }, appendTo: '#searchProducts' }); }); $("#productAutocomplete").insertAfter(); // Initialize the editor. // Callback function can be passed and executed after full instance creation. $('.page').ckeditor(config); $("#LineItemHasTextPrices").live('change', function() { showHideTextPrices(); }); //Remove this Page $(".removePage").live('click',function() { $('.page').ckeditor(function() { this.destroy(); }); $(this).parents(".docPage").remove(); $('.page').ckeditor(config); }); $("#savePages").click(function() { savePages(); }); var timeoutID = window.setTimeout(savePages, 30000); $(".quickpricing").live('change', function() { calculateQuickPrices(); }); $('.removeLineItem').live('click', function() { var thisLineItemID = $(this).parent('td').attr('id'); $.post('/line_items/ajax_delete/'+thisLineItemID, function(data) { loadLineItems(); }); }); $("#editQuoteDetails").click(function() { var quoteID = $("#quoteID").html(); $('#QuoteCommercialComments').ckeditor(function() { this.destroy(); }); $.get('/quotes/edit/'+quoteID, function(data) { $("#QuoteDetails").html(data); $('#QuoteCommercialComments').ckeditor(config); $("#QuoteDetails").dialog('open'); }); }); // Fairly quick and easy way to make this select box editable. Good enough. $("#QuotePaymentTermsOptions").live('change', function(data) { selectedOption = $("#QuotePaymentTermsOptions").val(); $("#QuotePaymentTerms").val(selectedOption); console.log(selectedOption); }); $("#generateFirstPage").click(function() { if($(".firstPage").length == 0) { newPage(true); } else { var confirmed = confirm("This will overwrite any changes you have made to the first page"); } if(confirmed) { $.get('/documents/generateFirstPage/'+docID, function(data) { $(".firstPage").val(data); savePages(); }); } }); $("#pdfDocButton").click(function() { window.location = $(this).data('url'); }); $("#emailDocButton").click(function() { var confirmed = confirm("This will email this Document and all Attachments to the Contact. Are you sure you want to do this?"); if(confirmed) { window.location = $(this).data('url'); } }); //Invoice View $('#shippingDetails').ckeditor(config); $("#DocumentBillTo").ckeditor(config); $("#DocumentShipTo").ckeditor(config); $("#saveInvoiceButton").click(function() { saveDocument('Invoice'); }); //OA View. $("#saveOAButton").click(function() { saveDocument('Order Acknowledgement'); //if the job has changed, the create invoice button wont work properly. //window.location.reload(true); $('.job-title').html($("#OrderAcknowledgementJobId :selected").text()); }); //This is fucked beyond all words. $("#PurchaseOrderDeliverTo").ckeditor(config); $("#PurchaseOrderOrderedFrom").ckeditor(config); $("#PurchaseOrderShippingInstructions").ckeditor(config); $("#PurchaseOrderDescription").ckeditor(config); //PackingList View. Damn you past Karl. $("#savePackingListButton").click(function() { saveDocument('Packing List'); //if the job has changed, the create invoice button wont work properly. //window.location.reload(true); $('.job-title').html($("#PackingListJobId :selected").text()); }); //PurchaseOrder View. Damn you past Karl. $("#savePurchaseOrderButton").click(function() { saveDocument('Purchase Order'); }); // Changing PO principal, fill in the default fields. $("#PurchaseOrderPrincipleId").live('change', function(d) { var principleID = getSelectedID('#PurchaseOrderPrincipleId'); $.getJSON('/principles/defaults/'+principleID, function(data) { console.log(data.Principle.po_ordered_from); $('#PurchaseOrderOrderedFrom').val(data.Principle.po_ordered_from); updateTextFields(); //Update the CKEditor instances. }); }); // Changing Freight Forwarder text $("#freightForwarderSelect").live('change', function(d) { $("#PurchaseOrderFreightForwarderText").val(getSelectedText("#freightForwarderSelect")); saveDocument('Purchase Order'); }); $("#createOA").click(function() { $("#addJobConfirmation").dialog('open'); }); // Issue #56 - try to stop doubleclicks on button-links. $(".button-link").one('click', function() { location.href = $(this).data('href'); }); //Choosing an address $(".billing_address").click(function() { var address = $(this).next().html(); setAddress(address, '#DocumentBillTo', 'Bill To'); }); $(".shipping_address").click(function() { var address = $(this).next().html(); setAddress(address, '#DocumentShipTo', 'Ship To'); }); //Fuck it. Copypaste. Autocompletion of jobs on PO document view $( "#job_autocomplete" ).autocomplete({ source: "/jobs/autocomplete", minLength: 2, select: function( event, ui ) { if($('#JobID_'+ui.item.id).length == 0) { //This Job is not already in the List. addToList('Job', ui.item.id, ui.item.value, $('#jobsList')); var jobs_val = $("#PurchaseOrderJobsText").val(); $("#PurchaseOrderJobsText").val(jobs_val +', '+ ui.item.value) console.log(ui.item.id); console.log(ui.item.value); //POST the job ID to a method on the documents controller to add the LineItems $.post('/documents/add_job_items_to_po/'+ui.item.id+'/'+$("#DocumentId").val(), function(data) { loadLineItems(); saveDocument('Purchase Order'); }); } } }); }); $('#generateShippingInstructions').live('click', function(event) { event.preventDefault(); saveDocument('Purchase Order'); $.post('/documents/generateShippingInstructions/'+$("#DocumentId").val(), function(data) { $('#PurchaseOrderShippingInstructions').val(data); updateTextFields(); //Update the CKEditor instances. //$("#PurchaseOrderShippingInstructions").ckeditor(config); }); }); $('.generateCommercialComments').live('click', function(event) { event.preventDefault(); var deliveryTime = $("#QuoteDeliveryTime").val(); var deliveryTF = $("#QuoteDeliveryTimeFrame").val(); var paymentTerms = $("#QuotePaymentTerms").val(); var daysValid = $("#QuoteDaysValid").val(); var deliveryPoint = $("#QuoteDeliveryPoint").val(); var exchangeRate = $("#QuoteExchangeRate").val(); var customsDuty = $("#QuoteCustomsDuty").val(); deliveryTime = deliveryTime.toUpperCase(); paymentTerms = paymentTerms.toUpperCase(); deliveryPoint = deliveryPoint.toUpperCase(); var commComments = $("#commCommentsInitialString").clone(); var commList = commComments.find('ol'); commList.append('
  • DELIVERY IS ESTIMATED AT '+deliveryTime+ ' '+deliveryTF+ ' FROM RECEIPT OF YOUR TECHNICALLY AND COMMERCIALLY CLEAR ORDER'); commList.append('
  • PAYMENT TERMS: '+paymentTerms+'
  • '); commList.append('
  • QUOTATION IS VALID FOR '+daysValid+' DAYS
  • '); commList.append('
  • ALL PRICES ARE '+deliveryPoint+'
  • '); commList.append('
  • EXCHANGE RATE: '+exchangeRate+'
  • '); commList.append('
  • CUSTOMS DUTY INCLUDED AT: '+customsDuty+'
  • '); commList.append('
  • GST 10% EXTRA
  • '); commList.append('
  • WHEN PAYMENTS ARE MADE INTO OUR BANK ACCOUNT, BANK CHARGES ARE YOUR RESPONSIBILITY
  • '); $('#QuoteCommercialComments').val(commComments.html()); }); //Save the current document //@param string documentName for message function saveDocument(documentName) { updateTextFields(); //Update the CKEditor instances. var fields = $('#DocumentEditForm').find('input,select,textarea'); $.post('/documents/ajax_edit', fields, function(data) { if(data =='SUCCESS') { $("#flashMessage").html(documentName+" saved Successfully"); } else { $("#flashMessage").html("Unable to save "+documentName); } $("#flashMessage").show(); loadLineItems(); }); } //Set the address given the addressFieldID and a label FieldName function setAddress(address, addressFieldID, fieldName) { console.log(address); if($(addressFieldID).val() == '') { $(addressFieldID).val(address); } else { var c = confirm("Set " + fieldName+ " to this address?"); if(c) { $(addressFieldID).val(address); } } } function showHideTextPrices() { if( $('#LineItemHasTextPrices').val() == 1) { $("#noCosting").hide(); $("#noCosting").find('input').val(''); $("#textPrices").show(); } else { $("#noCosting").show(); $("#textPrices").hide(); } } //I am a much better programmer now. //FUCK YEAH!! function updateTextFields() { var fields = [ '#shippingDetails', "#DocumentBillTo", "#DocumentShipTo", "#PurchaseOrderDeliverTo", "#PurchaseOrderOrderedFrom", "#PurchaseOrderShippingInstructions", "#PurchaseOrderDescription" ]; for (i in fields) { $(fields[i]).ckeditor(function() { this.updateElement(); }); } } function newPage(firstPage) { $('.page').ckeditor(function() { this.destroy(); }); var newPage = $('#pageContentFactory').clone(); newPage.removeAttr('id'); newPage.show(); var pageCount = $('.docPage').length; //alert(pageCount); pageCount++; var model = 'DocPage'; var field = 'content'; var ID = getCakeID(model,pageCount, field); var name = getCakeName(model, pageCount, field); newPage.find('label').attr('for', ID); newPage.find('textarea').attr('id', ID).attr('name', name); newPage.addClass('docPage'); if(firstPage == true) { newPage.find('textarea').addClass('firstPage'); } var hiddenName = getCakeName(model, pageCount, 'page_number'); newPage.append(''); $('.pages').append(newPage); $('.page').ckeditor(config); } function savePages() { var docPages = $('#DocumentEditForm').find('input,select,textarea'); $('.page').ckeditor(function() { this.updateElement(); }); $.post('/documents/ajax_edit', docPages, function(data) { $("#flashMessage").html("Document saved"); $("#flashMessage").show(); loadLineItems(); }); } function loadLineItems() { var documentID = $("#documentID").html(); /*$.get('/line_items/getTable/'+documentID, function(data) { $("#lineItems").html(data); });*/ $.ajax({ url: '/line_items/getTable/'+documentID, cache: false, success: function(data) { $("#lineItems").html(data); } }); } function calculateQuickPrices() { var quantity = $('#LineItemQuantity').val(); var gross_unit_price = $("#LineItemGrossUnitPrice").val(); var net_unit_price = $("#LineItemNetUnitPrice").val(); var discount_percent = $("#LineItemDiscountPercent").val(); var discount_amount_unit = $("#LineItemDiscountAmountUnit").val(); var discount_amount_total = $("#LineItemDiscountAmountTotal").val(); var gross_price = $("#LineItemGrossPrice").val(); var net_price = $("#LineItemNetPrice").val(); gross_price = quantity * gross_unit_price; $("#LineItemGrossPrice").val(gross_price); discount_amount_unit = (discount_percent/100) * gross_unit_price; discount_amount_unit = discount_amount_unit.toFixed(2); discount_amount_total = (discount_percent/100) * gross_price; discount_amount_total = discount_amount_total.toFixed(2); $("#LineItemDiscountAmountTotal").val(discount_amount_total); net_price = gross_price - discount_amount_total; $("#LineItemNetPrice").val(net_price); $("#LineItemDiscountAmountUnit").val(discount_amount_unit); net_unit_price = gross_unit_price - discount_amount_unit; $("#LineItemNetUnitPrice").val(net_unit_price); } function calcNetPrice() { var discountPercent = $("#discountPercent").val(); var unitPrice = $('#unitPrice').val(); var quantity = $('#LineItemQuantity').val(); var grossSellPrice = quantity * unitPrice; //Calculate the Sale Discount amount. var UnitDiscountAmount = (discountPercent/100) * unitPrice; var TotalDiscountAmount = (discountPercent/100) * grossSellPrice; UnitDiscountAmount = UnitDiscountAmount.toFixed(2); TotalDiscountAmount = TotalDiscountAmount.toFixed(2); $('#total_discountAmount').val(TotalDiscountAmount); $('#discountAmountEach').val(UnitDiscountAmount); $('#net_price_each').val(unitPrice - UnitDiscountAmount); $('#grossPrice').val(grossSellPrice); var netPrice = grossSellPrice - TotalDiscountAmount; $('#netPrice').val(netPrice); } function checkNaN(value) { if( isNaN(value) == true) { return 0; } else { return value; } }