1 namespace('kivi.Order', function(ns) {
 
   2   ns.check_cv = function() {
 
   3     if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation') {
 
   4       if ($('#order_customer_id').val() === '') {
 
   5         alert(kivi.t8('Please select a customer.'));
 
   9       if ($('#order_vendor_id').val() === '') {
 
  10         alert(kivi.t8('Please select a vendor.'));
 
  17   ns.check_duplicate_parts = function(question) {
 
  18     var id_arr = $('[name="order.orderitems[].parts_id"]').map(function() { return this.value; }).get();
 
  20     var i, obj = {}, pos = [];
 
  22     for (i = 0; i < id_arr.length; i++) {
 
  24       if (obj.hasOwnProperty(id)) {
 
  31       question = question || kivi.t8("Do you really want to save?");
 
  32       return confirm(kivi.t8("There are duplicate parts at positions") + "\n"
 
  33                      + pos.join(', ') + "\n"
 
  39   ns.check_valid_reqdate = function() {
 
  40     if ($('#order_reqdate_as_date').val() === '') {
 
  41       alert(kivi.t8('Please select a delivery date.'));
 
  48   ns.save = function(action, warn_on_duplicates, warn_on_reqdate) {
 
  49     if (!ns.check_cv()) return;
 
  50     if (warn_on_duplicates && !ns.check_duplicate_parts()) return;
 
  51     if (warn_on_reqdate    && !ns.check_valid_reqdate())   return;
 
  53     var data = $('#order_form').serializeArray();
 
  54     data.push({ name: 'order.language_id', value: $('#language_id').val() }); // language from print options
 
  55     data.push({ name: 'action', value: 'Order/' + action });
 
  57     $.post("controller.pl", data, kivi.eval_json_result);
 
  60   ns.delete_order = function() {
 
  61     var data = $('#order_form').serializeArray();
 
  62     data.push({ name: 'action', value: 'Order/delete' });
 
  64     $.post("controller.pl", data, kivi.eval_json_result);
 
  67   ns.show_print_options = function(warn_on_duplicates) {
 
  68     if (!ns.check_cv()) return;
 
  69     if (warn_on_duplicates && !ns.check_duplicate_parts(kivi.t8("Do you really want to print?"))) return;
 
  74         title: kivi.t8('Print options'),
 
  81   ns.print = function() {
 
  82     $('#print_options').dialog('close');
 
  84     var data = $('#order_form').serializeArray();
 
  85     data = data.concat($('#print_options_form').serializeArray());
 
  86     data.push({ name: 'order.language_id', value: $('#language_id').val() }); // language from print options
 
  87     data.push({ name: 'action', value: 'Order/print' });
 
  89     $.post("controller.pl", data, kivi.eval_json_result);
 
  92   ns.email = function(warn_on_duplicates) {
 
  93     if (warn_on_duplicates && !ns.check_duplicate_parts(kivi.t8("Do you really want to send by mail?"))) return;
 
  94     if (!ns.check_cv()) return;
 
  96     var data = $('#order_form').serializeArray();
 
  97     data.push({ name: 'action', value: 'Order/show_email_dialog' });
 
  99     $.post("controller.pl", data, kivi.eval_json_result);
 
 104   ns.setup_send_email_dialog = function() {
 
 105     kivi.SalesPurchase.show_all_print_options_elements();
 
 106     kivi.SalesPurchase.show_print_options_elements([ 'sendmode', 'media', 'copies', 'remove_draft' ], false);
 
 108     $('#print_options_form table').first().remove().appendTo('#email_form_print_options');
 
 110     var to_focus = $('#email_form_to').val() === '' ? 'to' : 'subject';
 
 111     $('#email_form_' + to_focus).focus();
 
 114   ns.finish_send_email_dialog = function() {
 
 115     kivi.SalesPurchase.show_all_print_options_elements();
 
 117     $('#email_form_print_options table').first().remove().prependTo('#print_options_form');
 
 121   ns.show_email_dialog = function(html) {
 
 122     var id            = 'send_email_dialog';
 
 123     var dialog_params = {
 
 127       title:  kivi.t8('Send email'),
 
 129       beforeClose: kivi.Order.finish_send_email_dialog,
 
 130       close: function(event, ui) {
 
 131         email_dialog.remove();
 
 135     $('#' + id).remove();
 
 137     email_dialog = $('<div style="display:none" id="' + id + '"></div>').appendTo('body');
 
 138     email_dialog.html(html);
 
 139     email_dialog.dialog(dialog_params);
 
 141     kivi.Order.setup_send_email_dialog();
 
 143     $('.cancel').click(ns.close_email_dialog);
 
 148   ns.send_email = function() {
 
 149     var data = $('#order_form').serializeArray();
 
 150     data = data.concat($('[name^="email_form."]').serializeArray());
 
 151     data = data.concat($('[name^="print_options."]').serializeArray());
 
 152     data.push({ name: 'order.language_id', value: $('#language_id').val() }); // language from print options
 
 153     data.push({ name: 'action', value: 'Order/send_email' });
 
 154     $.post("controller.pl", data, kivi.eval_json_result);
 
 157   ns.close_email_dialog = function() {
 
 158     email_dialog.dialog("close");
 
 161   ns.set_number_in_title = function(elt) {
 
 162     $('#nr_in_title').html($(elt).val());
 
 165   ns.reload_cv_dependant_selections = function() {
 
 166     var data = $('#order_form').serializeArray();
 
 167     data.push({ name: 'action', value: 'Order/customer_vendor_changed' });
 
 169     $.post("controller.pl", data, kivi.eval_json_result);
 
 172   ns.reformat_number = function(event) {
 
 173     $(event.target).val(kivi.format_amount(kivi.parse_amount($(event.target).val()), -2));
 
 176   ns.recalc_amounts_and_taxes = function() {
 
 177     var data = $('#order_form').serializeArray();
 
 178     data.push({ name: 'action', value: 'Order/recalc_amounts_and_taxes' });
 
 180     $.post("controller.pl", data, kivi.eval_json_result);
 
 183   ns.unit_change = function(event) {
 
 184     var row           = $(event.target).parents("tbody").first();
 
 185     var item_id_dom   = $(row).find('[name="orderitem_ids[+]"]');
 
 186     var sellprice_dom = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
 
 187     var select_elt    = $(row).find('[name="order.orderitems[].unit"]');
 
 189     var oldval = $(select_elt).data('oldval');
 
 190     $(select_elt).data('oldval', $(select_elt).val());
 
 192     var data = $('#order_form').serializeArray();
 
 193     data.push({ name: 'action',           value: 'Order/unit_changed'     },
 
 194               { name: 'item_id',          value: item_id_dom.val()        },
 
 195               { name: 'old_unit',         value: oldval                   },
 
 196               { name: 'sellprice_dom_id', value: sellprice_dom.attr('id') });
 
 198     $.post("controller.pl", data, kivi.eval_json_result);
 
 201   ns.update_sellprice = function(item_id, price_str) {
 
 202     var row       = $('#item_' + item_id).parents("tbody").first();
 
 203     var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
 
 204     var html_elt  = $(row).find('[name="sellprice_text"]');
 
 205     price_elt.val(price_str);
 
 206     html_elt.html(price_str);
 
 209   ns.load_second_row = function(row) {
 
 210     var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
 
 211     var div_elt     = $(row).find('[name="second_row"]');
 
 213     if ($(div_elt).data('loaded') == 1) {
 
 216     var data = $('#order_form').serializeArray();
 
 217     data.push({ name: 'action',     value: 'Order/load_second_rows' },
 
 218               { name: 'item_ids[]', value: item_id_dom.val()        });
 
 220     $.post("controller.pl", data, kivi.eval_json_result);
 
 223   ns.load_all_second_rows = function() {
 
 224     var rows = $('.row_entry').filter(function(idx, elt) {
 
 225       return $(elt).find('[name="second_row"]').data('loaded') != 1;
 
 228     var item_ids = $.map(rows, function(elt) {
 
 229       var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
 
 230       return { name: 'item_ids[]', value: item_id };
 
 233     if (item_ids.length == 0) {
 
 237     var data = $('#order_form').serializeArray();
 
 238     data.push({ name: 'action', value: 'Order/load_second_rows' });
 
 239     data = data.concat(item_ids);
 
 241     $.post("controller.pl", data, kivi.eval_json_result);
 
 244   ns.hide_second_row = function(row) {
 
 245     $(row).children().not(':first').hide();
 
 246     $(row).data('expanded', 0);
 
 247     var elt = $(row).find('.expand');
 
 248     elt.attr('src', "image/expand.svg");
 
 249     elt.attr('alt', kivi.t8('Show details'));
 
 250     elt.attr('title', kivi.t8('Show details'));
 
 253   ns.show_second_row = function(row) {
 
 254     $(row).children().not(':first').show();
 
 255     $(row).data('expanded', 1);
 
 256     var elt = $(row).find('.expand');
 
 257     elt.attr('src', "image/collapse.svg");
 
 258     elt.attr('alt', kivi.t8('Hide details'));
 
 259     elt.attr('title', kivi.t8('Hide details'));
 
 262   ns.toggle_second_row = function(row) {
 
 263     if ($(row).data('expanded') == 1) {
 
 264       ns.hide_second_row(row);
 
 266       ns.show_second_row(row);
 
 270   ns.init_row_handlers = function() {
 
 271     kivi.run_once_for('.recalc', 'on_change_recalc', function(elt) {
 
 272       $(elt).change(ns.recalc_amounts_and_taxes);
 
 275     kivi.run_once_for('.reformat_number', 'on_change_reformat', function(elt) {
 
 276       $(elt).change(ns.reformat_number);
 
 279     kivi.run_once_for('.unitselect', 'on_change_unit_with_oldval', function(elt) {
 
 280       $(elt).data('oldval', $(elt).val());
 
 281       $(elt).change(ns.unit_change);
 
 284     kivi.run_once_for('.row_entry', 'on_kbd_click_show_hide', function(elt) {
 
 285       $(elt).keydown(function(event) {
 
 287         if (event.keyCode == 40 && event.shiftKey === true) {
 
 289           event.preventDefault();
 
 290           row = $(event.target).parents(".row_entry").first();
 
 291           ns.load_second_row(row);
 
 292           ns.show_second_row(row);
 
 295         if (event.keyCode == 38 && event.shiftKey === true) {
 
 297           event.preventDefault();
 
 298           row = $(event.target).parents(".row_entry").first();
 
 299           ns.hide_second_row(row);
 
 305     kivi.run_once_for('.expand', 'expand_second_row', function(elt) {
 
 306       $(elt).click(function(event) {
 
 307         event.preventDefault();
 
 308         var row = $(event.target).parents(".row_entry").first();
 
 309         ns.load_second_row(row);
 
 310         ns.toggle_second_row(row);
 
 317   ns.redisplay_line_values = function(is_sales, data) {
 
 318     $('.row_entry').each(function(idx, elt) {
 
 319       $(elt).find('[name="linetotal"]').html(data[idx][0]);
 
 320       if (is_sales && $(elt).find('[name="second_row"]').data('loaded') == 1) {
 
 321         var mt = data[idx][1];
 
 322         var mp = data[idx][2];
 
 324         if (mt[0] === '-') h += ' class="plus0"';
 
 325         h += '>' + mt + '  ' + mp + '%';
 
 327         $(elt).find('[name="linemargin"]').html(h);
 
 332   ns.redisplay_cvpartnumbers = function(data) {
 
 333     $('.row_entry').each(function(idx, elt) {
 
 334       $(elt).find('[name="cvpartnumber"]').html(data[idx][0]);
 
 338   ns.renumber_positions = function() {
 
 339     $('.row_entry [name="position"]').each(function(idx, elt) {
 
 342     $('.row_entry').each(function(idx, elt) {
 
 343       $(elt).data("position", idx+1);
 
 347   ns.reorder_items = function(order_by) {
 
 348     var dir = $('#' + order_by + '_header_id a img').attr("data-sort-dir");
 
 349     $('#row_table_id thead a img').remove();
 
 354       src = "image/up.png";
 
 357       src = "image/down.png";
 
 360     $('#' + order_by + '_header_id a').append('<img border=0 data-sort-dir=' + dir + ' src=' + src + ' alt="' + kivi.t8('sort items') + '">');
 
 362     var data = $('#order_form').serializeArray();
 
 363     data.push({ name: 'action',   value: 'Order/reorder_items' },
 
 364               { name: 'order_by', value: order_by              },
 
 365               { name: 'sort_dir', value: dir                   });
 
 367     $.post("controller.pl", data, kivi.eval_json_result);
 
 370   ns.redisplay_items = function(data) {
 
 371     var old_rows = $('.row_entry').detach();
 
 373     $(data).each(function(idx, elt) {
 
 374       new_rows.push(old_rows[elt.old_pos - 1]);
 
 376     $(new_rows).appendTo($('#row_table_id'));
 
 377     ns.renumber_positions();
 
 380   ns.get_insert_before_item_id = function(wanted_pos) {
 
 381     if (wanted_pos === '') return;
 
 383     var insert_before_item_id;
 
 384     // selection by data does not seem to work if data is changed at runtime
 
 385     // var elt = $('.row_entry [data-position="' + wanted_pos + '"]');
 
 386     $('.row_entry').each(function(idx, elt) {
 
 387       if ($(elt).data("position") == wanted_pos) {
 
 388         insert_before_item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
 
 393     return insert_before_item_id;
 
 396   ns.add_item = function() {
 
 397     if ($('#add_item_parts_id').val() === '') return;
 
 398     if (!ns.check_cv()) return;
 
 400     $('#row_table_id thead a img').remove();
 
 402     var insert_before_item_id = ns.get_insert_before_item_id($('#add_item_position').val());
 
 404     var data = $('#order_form').serializeArray();
 
 405     data.push({ name: 'action', value: 'Order/add_item' },
 
 406               { name: 'insert_before_item_id', value: insert_before_item_id });
 
 408     $.post("controller.pl", data, kivi.eval_json_result);
 
 411   ns.setup_multi_items_dialog = function() {
 
 412     $('#multi_items_filter_table input, #multi_items_filter_table select').keydown(function(event) {
 
 413       if (event.keyCode == 13) {
 
 414         event.preventDefault();
 
 415         ns.multi_items_dialog_update_result();
 
 420     $('#multi_items_filter_all_substr_multi_ilike').focus();
 
 423   ns.show_multi_items_dialog = function() {
 
 424     if (!ns.check_cv()) return;
 
 426     $('#row_table_id thead a img').remove();
 
 429       url:    'controller.pl?action=Order/show_multi_items_dialog',
 
 430       data:   { type: $('#type').val() },
 
 431       id:     'jq_multi_items_dialog',
 
 432       load:   kivi.Order.setup_multi_items_dialog,
 
 434         title:  kivi.t8('Add multiple items'),
 
 442   ns.close_multi_items_dialog = function() {
 
 443     $('#jq_multi_items_dialog').dialog('close');
 
 446   ns.multi_items_dialog_update_result = function() {
 
 447     var data = $('#multi_items_form').serializeArray();
 
 448     data.push({ name: 'type', value: $('#type').val() });
 
 450       url:     'controller.pl?action=Order/multi_items_update_result',
 
 453       success: function(data) {
 
 454         $('#multi_items_result').html(data);
 
 455         ns.multi_items_dialog_enable_continue();
 
 456         ns.multi_items_result_setup_events();
 
 461   ns.multi_items_dialog_disable_continue = function() {
 
 462     // disable keydown-event and continue button to prevent
 
 463     // impatient users to add parts multiple times
 
 464     $('#multi_items_result input, #multi_items_position').off("keydown");
 
 465     $('#multi_items_dialog_continue_button').prop('disabled', true);
 
 468   ns.multi_items_dialog_enable_continue = function()  {
 
 469     $('#multi_items_result input, #multi_items_position').keydown(function(event) {
 
 470       if(event.keyCode == 13) {
 
 471         event.preventDefault();
 
 472         ns.add_multi_items();
 
 476     $('#multi_items_dialog_continue_button').prop('disabled', false);
 
 479   ns.multi_items_result_setup_events = function() {
 
 480     $('#multi_items_all_qty').change(ns.reformat_number);
 
 481     $('#multi_items_all_qty').change(function(event) {
 
 482       $('.multi_items_qty').val($(event.target).val());
 
 484     $('.multi_items_qty').change(ns.reformat_number);
 
 487   ns.add_multi_items = function() {
 
 489     var n_rows = $('.multi_items_qty').length;
 
 490     if (n_rows == 0) return;
 
 493     n_rows = $('.multi_items_qty').filter(function() {
 
 494       return $(this).val().length > 0;
 
 496     if (n_rows == 0) return;
 
 498     ns.multi_items_dialog_disable_continue();
 
 500     var insert_before_item_id = ns.get_insert_before_item_id($('#multi_items_position').val());
 
 502     var data = $('#order_form').serializeArray();
 
 503     data = data.concat($('#multi_items_form').serializeArray());
 
 504     data.push({ name: 'action', value: 'Order/add_multi_items' },
 
 505               { name: 'insert_before_item_id', value: insert_before_item_id });
 
 506     $.post("controller.pl", data, kivi.eval_json_result);
 
 509   ns.set_input_to_one = function(clicked) {
 
 510     if ($(clicked).val() == '') {
 
 511       $(clicked).val(kivi.format_amount(1.00, -2));
 
 516   ns.delete_order_item_row = function(clicked) {
 
 517     var row = $(clicked).parents("tbody").first();
 
 520     ns.renumber_positions();
 
 521     ns.recalc_amounts_and_taxes();
 
 524   ns.row_table_scroll_down = function() {
 
 525     $('#row_table_scroll_id').scrollTop($('#row_table_scroll_id')[0].scrollHeight);
 
 528   ns.show_longdescription_dialog = function(clicked) {
 
 529     var row                 = $(clicked).parents("tbody").first();
 
 530     var position            = $(row).find('[name="position"]').html();
 
 531     var partnumber          = $(row).find('[name="partnumber"]').html();
 
 532     var description_elt     = $(row).find('[name="order.orderitems[].description"]');
 
 533     var description         = description_elt.val();
 
 534     var longdescription_elt = $(row).find('[name="order.orderitems[].longdescription"]');
 
 537     if (!longdescription_elt.length) {
 
 539         { name: 'action',   value: 'Order/get_item_longdescription'                          },
 
 540         { name: 'type',     value: $('#type').val()                                          },
 
 541         { name: 'item_id',  value: $(row).find('[name="order.orderitems[+].id"]').val()      },
 
 542         { name: 'parts_id', value: $(row).find('[name="order.orderitems[].parts_id"]').val() }
 
 546         url:      'controller.pl',
 
 551         success:  function(val) {
 
 552           longdescription = val;
 
 556       longdescription = longdescription_elt.val();
 
 560       runningnumber:           position,
 
 561       partnumber:              partnumber,
 
 562       description:             description,
 
 563       default_longdescription: longdescription,
 
 564       set_function:            function(val) {
 
 565         longdescription_elt.remove();
 
 566         $('<input type="hidden" name="order.orderitems[].longdescription">').insertAfter(description_elt).val(val);
 
 570     kivi.SalesPurchase.edit_longdescription_with_params(params);
 
 573   ns.price_chooser_item_row = function(clicked) {
 
 574     if (!ns.check_cv()) return;
 
 575     var row         = $(clicked).parents("tbody").first();
 
 576     var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
 
 578     var data = $('#order_form').serializeArray();
 
 579     data.push({ name: 'action',  value: 'Order/price_popup' },
 
 580               { name: 'item_id', value: item_id_dom.val()   });
 
 582     $.post("controller.pl", data, kivi.eval_json_result);
 
 585   ns.update_price_source = function(item_id, source, descr, price_str, price_editable) {
 
 586     var row        = $('#item_' + item_id).parents("tbody").first();
 
 587     var source_elt = $(row).find('[name="order.orderitems[].active_price_source"]');
 
 588     var button_elt = $(row).find('[name="price_chooser_button"]');
 
 590     button_elt.val(button_elt.val().replace(/.*\|/, descr + " |"));
 
 591     source_elt.val(source);
 
 593     var editable_div_elt     = $(row).find('[name="editable_price"]');
 
 594     var not_editable_div_elt = $(row).find('[name="not_editable_price"]');
 
 595     if (price_editable == 1 && source === '') {
 
 597       $(editable_div_elt).show();
 
 598       $(not_editable_div_elt).hide();
 
 599       $(editable_div_elt).find(':input').prop("disabled", false);
 
 600       $(not_editable_div_elt).find(':input').prop("disabled", true);
 
 603       $(editable_div_elt).hide();
 
 604       $(not_editable_div_elt).show();
 
 605       $(editable_div_elt).find(':input').prop("disabled", true);
 
 606       $(not_editable_div_elt).find(':input').prop("disabled", false);
 
 610       var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
 
 611       var html_elt  = $(row).find('[name="sellprice_text"]');
 
 612       price_elt.val(price_str);
 
 613       html_elt.html(price_str);
 
 614       ns.recalc_amounts_and_taxes();
 
 617     kivi.io.close_dialog();
 
 620   ns.update_discount_source = function(item_id, source, descr, discount_str, price_editable) {
 
 621     var row        = $('#item_' + item_id).parents("tbody").first();
 
 622     var source_elt = $(row).find('[name="order.orderitems[].active_discount_source"]');
 
 623     var button_elt = $(row).find('[name="price_chooser_button"]');
 
 625     button_elt.val(button_elt.val().replace(/\|.*/, "| " + descr));
 
 626     source_elt.val(source);
 
 628     var editable_div_elt     = $(row).find('[name="editable_discount"]');
 
 629     var not_editable_div_elt = $(row).find('[name="not_editable_discount"]');
 
 630     if (price_editable == 1 && source === '') {
 
 632       $(editable_div_elt).show();
 
 633       $(not_editable_div_elt).hide();
 
 634       $(editable_div_elt).find(':input').prop("disabled", false);
 
 635       $(not_editable_div_elt).find(':input').prop("disabled", true);
 
 638       $(editable_div_elt).hide();
 
 639       $(not_editable_div_elt).show();
 
 640       $(editable_div_elt).find(':input').prop("disabled", true);
 
 641       $(not_editable_div_elt).find(':input').prop("disabled", false);
 
 645       var discount_elt = $(row).find('[name="order.orderitems[].discount_as_percent"]');
 
 646       var html_elt     = $(row).find('[name="discount_text"]');
 
 647       discount_elt.val(discount_str);
 
 648       html_elt.html(discount_str);
 
 649       ns.recalc_amounts_and_taxes();
 
 652     kivi.io.close_dialog();
 
 655   ns.show_periodic_invoices_config_dialog = function() {
 
 656     if ($('#type').val() !== 'sales_order') return;
 
 659       url:    'controller.pl?action=Order/show_periodic_invoices_config_dialog',
 
 660       data:   { type:              $('#type').val(),
 
 662                 config:            $('#order_periodic_invoices_config').val(),
 
 663                 customer_id:       $('#order_customer_id').val(),
 
 664                 transdate_as_date: $('#order_transdate_as_date').val(),
 
 665                 language_id:       $('#language_id').val()
 
 667       id:     'jq_periodic_invoices_config_dialog',
 
 668       load:   kivi.reinit_widgets,
 
 670         title:  kivi.t8('Edit the configuration for periodic invoices'),
 
 678   ns.close_periodic_invoices_config_dialog = function() {
 
 679     $('#jq_periodic_invoices_config_dialog').dialog('close');
 
 682   ns.assign_periodic_invoices_config = function() {
 
 683     var data = $('[name="Form"]').serializeArray();
 
 684     data.push({ name: 'type',   value: $('#type').val() },
 
 685               { name: 'action', value: 'Order/assign_periodic_invoices_config' });
 
 686     $.post("controller.pl", data, kivi.eval_json_result);
 
 689   ns.check_save_active_periodic_invoices = function() {
 
 690     var type = $('#type').val();
 
 691     if (type !== 'sales_order') return true;
 
 695       url:      'controller.pl',
 
 696       data:     { action: 'Order/get_has_active_periodic_invoices',
 
 699                   config: $('#order_periodic_invoices_config').val(),
 
 704       success:  function(val) {
 
 710       return confirm(kivi.t8('This sales order has an active configuration for periodic invoices. If you save then all subsequently created invoices will contain those changes as well, but not those that have already been created. Do you want to continue?'));
 
 716   ns.show_vc_details_dialog = function() {
 
 717     if (!ns.check_cv()) return;
 
 721     if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
 
 723       vc_id = $('#order_customer_id').val();
 
 724       title = kivi.t8('Customer details');
 
 727       vc_id = $('#order_vendor_id').val();
 
 728       title = kivi.t8('Vendor details');
 
 732       url:    'controller.pl',
 
 733       data:   { action: 'Order/show_customer_vendor_details_dialog',
 
 734                 type  : $('#type').val(),
 
 738       id:     'jq_customer_vendor_details_dialog',
 
 748   ns.update_row_from_master_data = function(clicked) {
 
 749     var row = $(clicked).parents("tbody").first();
 
 750     var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
 
 752     var data = $('#order_form').serializeArray();
 
 753     data.push({ name: 'action', value: 'Order/update_row_from_master_data' });
 
 754     data.push({ name: 'item_ids[]', value: item_id_dom.val() });
 
 756     $.post("controller.pl", data, kivi.eval_json_result);
 
 759   ns.update_all_rows_from_master_data = function() {
 
 760     var item_ids = $.map($('.row_entry'), function(elt) {
 
 761       var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
 
 762       return { name: 'item_ids[]', value: item_id };
 
 765     if (item_ids.length == 0) {
 
 769     var data = $('#order_form').serializeArray();
 
 770     data.push({ name: 'action', value: 'Order/update_row_from_master_data' });
 
 771     data = data.concat(item_ids);
 
 773     $.post("controller.pl", data, kivi.eval_json_result);
 
 776   ns.show_calculate_qty_dialog = function(clicked) {
 
 777     var row        = $(clicked).parents("tbody").first();
 
 778     var input_id   = $(row).find('[name="order.orderitems[].qty_as_number"]').attr('id');
 
 779     var formula_id = $(row).find('[name="formula[+]"]').attr('id');
 
 781     calculate_qty_selection_dialog("", input_id, "", formula_id);
 
 788   if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
 
 789     $('#order_customer_id').change(kivi.Order.reload_cv_dependant_selections);
 
 791     $('#order_vendor_id').change(kivi.Order.reload_cv_dependant_selections);
 
 794   if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
 
 795     $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.sellprice, -2)) });
 
 797     $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.lastcost, -2)) });
 
 799   $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_description').val(o.description) });
 
 800   $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_unit').val(o.unit) });
 
 802   $('.add_item_input').keydown(function(event) {
 
 803     if (event.keyCode == 13) {
 
 804       event.preventDefault();
 
 805       kivi.Order.add_item();
 
 810   kivi.Order.init_row_handlers();
 
 812   $('#row_table_id').on('sortstop', function(event, ui) {
 
 813     $('#row_table_id thead a img').remove();
 
 814     kivi.Order.renumber_positions();
 
 817   $('#expand_all').on('click', function(event) {
 
 818     event.preventDefault();
 
 819     if ($('#expand_all').data('expanded') == 1) {
 
 820       $('#expand_all').data('expanded', 0);
 
 821       $('#expand_all').attr('src', 'image/expand.svg');
 
 822       $('#expand_all').attr('alt', kivi.t8('Show all details'));
 
 823       $('#expand_all').attr('title', kivi.t8('Show all details'));
 
 824       $('.row_entry').each(function(idx, elt) {
 
 825         kivi.Order.hide_second_row(elt);
 
 828       $('#expand_all').data('expanded', 1);
 
 829       $('#expand_all').attr('src', "image/collapse.svg");
 
 830       $('#expand_all').attr('alt', kivi.t8('Hide all details'));
 
 831       $('#expand_all').attr('title', kivi.t8('Hide all details'));
 
 832       kivi.Order.load_all_second_rows();
 
 833       $('.row_entry').each(function(idx, elt) {
 
 834         kivi.Order.show_second_row(elt);