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: 'order.language_id', value: $('#language_id').val() }); // language from print options
98 data.push({ name: 'action', value: 'Order/show_email_dialog' });
100 $.post("controller.pl", data, kivi.eval_json_result);
105 ns.setup_send_email_dialog = function() {
106 kivi.SalesPurchase.show_all_print_options_elements();
107 kivi.SalesPurchase.show_print_options_elements([ 'sendmode', 'media', 'copies', 'remove_draft' ], false);
109 $('#print_options_form table').first().remove().appendTo('#email_form_print_options');
111 var to_focus = $('#email_form_to').val() === '' ? 'to' : 'subject';
112 $('#email_form_' + to_focus).focus();
115 ns.finish_send_email_dialog = function() {
116 kivi.SalesPurchase.show_all_print_options_elements();
118 $('#email_form_print_options table').first().remove().prependTo('#print_options_form');
122 ns.show_email_dialog = function(html) {
123 var id = 'send_email_dialog';
124 var dialog_params = {
128 title: kivi.t8('Send email'),
130 beforeClose: kivi.Order.finish_send_email_dialog,
131 close: function(event, ui) {
132 email_dialog.remove();
136 $('#' + id).remove();
138 email_dialog = $('<div style="display:none" id="' + id + '"></div>').appendTo('body');
139 email_dialog.html(html);
140 email_dialog.dialog(dialog_params);
142 kivi.Order.setup_send_email_dialog();
144 $('.cancel').click(ns.close_email_dialog);
149 ns.send_email = function() {
150 var data = $('#order_form').serializeArray();
151 data = data.concat($('[name^="email_form."]').serializeArray());
152 data = data.concat($('[name^="print_options."]').serializeArray());
153 data.push({ name: 'order.language_id', value: $('#language_id').val() }); // language from print options
154 data.push({ name: 'action', value: 'Order/send_email' });
155 $.post("controller.pl", data, kivi.eval_json_result);
158 ns.close_email_dialog = function() {
159 email_dialog.dialog("close");
162 ns.set_number_in_title = function(elt) {
163 $('#nr_in_title').html($(elt).val());
166 ns.reload_cv_dependent_selections = function() {
167 var data = $('#order_form').serializeArray();
168 data.push({ name: 'action', value: 'Order/customer_vendor_changed' });
170 $.post("controller.pl", data, kivi.eval_json_result);
173 ns.reformat_number = function(event) {
174 $(event.target).val(kivi.format_amount(kivi.parse_amount($(event.target).val()), -2));
177 ns.update_exchangerate = function(event) {
178 var rate_input = $('#order_exchangerate_as_null_number');
179 rate_input.prop('disabled', true);
181 var data = $('#order_form').serializeArray();
182 data.push({ name: 'action', value: 'Order/update_exchangerate' });
185 url: 'controller.pl',
189 success: function(data){
190 if (!data.is_standard) {
191 $('#currency_name').text(data.currency_name);
192 var rate_text = $('#exchangerate_text');
193 if (data.exchangerate) {
194 rate_text.text(data.exchangerate);
198 rate_input.prop('disabled', false);
199 rate_input.show().val(0);
201 $('#exchangerate_settings').show();
203 $('#exchangerate_settings').hide();
205 console.log(data.is_standard);
206 console.log(data.exchangerate);
207 console.log($('#old_exchangerate').val());
208 if ($('#order_currency_id').val() != $('#old_currency_id').val() ||
209 !data.is_standard && data.exchangerate != $('#old_exchangerate').val()) {
210 kivi.display_flash('warning', kivi.t8('You have changed the currency or exchange rate. Please update prices.'));
212 $('#old_currency_id').val($('#order_currency_id').val());
213 $('#old_exchangerate').val(data.exchangerate);
218 ns.exchangerate_changed = function(event) {
219 if (kivi.parse_amount($('#order_exchangerate_as_null_number').val()) != kivi.parse_amount($('#old_exchangerate').val())) {
220 kivi.display_flash('warning', kivi.t8('You have changed the currency or exchange rate. Please update prices.'));
221 $('#old_exchangerate').val($('#order_exchangerate_as_null_number').val());
225 ns.recalc_amounts_and_taxes = function() {
226 var data = $('#order_form').serializeArray();
227 data.push({ name: 'action', value: 'Order/recalc_amounts_and_taxes' });
229 $.post("controller.pl", data, kivi.eval_json_result);
232 ns.unit_change = function(event) {
233 var row = $(event.target).parents("tbody").first();
234 var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
235 var sellprice_dom = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
236 var select_elt = $(row).find('[name="order.orderitems[].unit"]');
238 var oldval = $(select_elt).data('oldval');
239 $(select_elt).data('oldval', $(select_elt).val());
241 var data = $('#order_form').serializeArray();
242 data.push({ name: 'action', value: 'Order/unit_changed' },
243 { name: 'item_id', value: item_id_dom.val() },
244 { name: 'old_unit', value: oldval },
245 { name: 'sellprice_dom_id', value: sellprice_dom.attr('id') });
247 $.post("controller.pl", data, kivi.eval_json_result);
250 ns.update_sellprice = function(item_id, price_str) {
251 var row = $('#item_' + item_id).parents("tbody").first();
252 var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
253 var html_elt = $(row).find('[name="sellprice_text"]');
254 price_elt.val(price_str);
255 html_elt.html(price_str);
258 ns.load_second_row = function(row) {
259 var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
260 var div_elt = $(row).find('[name="second_row"]');
262 if ($(div_elt).data('loaded') == 1) {
265 var data = $('#order_form').serializeArray();
266 data.push({ name: 'action', value: 'Order/load_second_rows' },
267 { name: 'item_ids[]', value: item_id_dom.val() });
269 $.post("controller.pl", data, kivi.eval_json_result);
272 ns.load_all_second_rows = function() {
273 var rows = $('.row_entry').filter(function(idx, elt) {
274 return $(elt).find('[name="second_row"]').data('loaded') != 1;
277 var item_ids = $.map(rows, function(elt) {
278 var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
279 return { name: 'item_ids[]', value: item_id };
282 if (item_ids.length == 0) {
286 var data = $('#order_form').serializeArray();
287 data.push({ name: 'action', value: 'Order/load_second_rows' });
288 data = data.concat(item_ids);
290 $.post("controller.pl", data, kivi.eval_json_result);
293 ns.hide_second_row = function(row) {
294 $(row).children().not(':first').hide();
295 $(row).data('expanded', 0);
296 var elt = $(row).find('.expand');
297 elt.attr('src', "image/expand.svg");
298 elt.attr('alt', kivi.t8('Show details'));
299 elt.attr('title', kivi.t8('Show details'));
302 ns.show_second_row = function(row) {
303 $(row).children().not(':first').show();
304 $(row).data('expanded', 1);
305 var elt = $(row).find('.expand');
306 elt.attr('src', "image/collapse.svg");
307 elt.attr('alt', kivi.t8('Hide details'));
308 elt.attr('title', kivi.t8('Hide details'));
311 ns.toggle_second_row = function(row) {
312 if ($(row).data('expanded') == 1) {
313 ns.hide_second_row(row);
315 ns.show_second_row(row);
319 ns.init_row_handlers = function() {
320 kivi.run_once_for('.recalc', 'on_change_recalc', function(elt) {
321 $(elt).change(ns.recalc_amounts_and_taxes);
324 kivi.run_once_for('.reformat_number', 'on_change_reformat', function(elt) {
325 $(elt).change(ns.reformat_number);
328 kivi.run_once_for('.unitselect', 'on_change_unit_with_oldval', function(elt) {
329 $(elt).data('oldval', $(elt).val());
330 $(elt).change(ns.unit_change);
333 kivi.run_once_for('.row_entry', 'on_kbd_click_show_hide', function(elt) {
334 $(elt).keydown(function(event) {
336 if (event.keyCode == 40 && event.shiftKey === true) {
338 event.preventDefault();
339 row = $(event.target).parents(".row_entry").first();
340 ns.load_second_row(row);
341 ns.show_second_row(row);
344 if (event.keyCode == 38 && event.shiftKey === true) {
346 event.preventDefault();
347 row = $(event.target).parents(".row_entry").first();
348 ns.hide_second_row(row);
354 kivi.run_once_for('.expand', 'expand_second_row', function(elt) {
355 $(elt).click(function(event) {
356 event.preventDefault();
357 var row = $(event.target).parents(".row_entry").first();
358 ns.load_second_row(row);
359 ns.toggle_second_row(row);
366 ns.redisplay_line_values = function(is_sales, data) {
367 $('.row_entry').each(function(idx, elt) {
368 $(elt).find('[name="linetotal"]').html(data[idx][0]);
369 if (is_sales && $(elt).find('[name="second_row"]').data('loaded') == 1) {
370 var mt = data[idx][1];
371 var mp = data[idx][2];
373 if (mt[0] === '-') h += ' class="plus0"';
374 h += '>' + mt + ' ' + mp + '%';
376 $(elt).find('[name="linemargin"]').html(h);
381 ns.redisplay_cvpartnumbers = function(data) {
382 $('.row_entry').each(function(idx, elt) {
383 $(elt).find('[name="cvpartnumber"]').html(data[idx][0]);
387 ns.renumber_positions = function() {
388 $('.row_entry [name="position"]').each(function(idx, elt) {
391 $('.row_entry').each(function(idx, elt) {
392 $(elt).data("position", idx+1);
396 ns.reorder_items = function(order_by) {
397 var dir = $('#' + order_by + '_header_id a img').attr("data-sort-dir");
398 $('#row_table_id thead a img').remove();
403 src = "image/up.png";
406 src = "image/down.png";
409 $('#' + order_by + '_header_id a').append('<img border=0 data-sort-dir=' + dir + ' src=' + src + ' alt="' + kivi.t8('sort items') + '">');
411 var data = $('#order_form').serializeArray();
412 data.push({ name: 'action', value: 'Order/reorder_items' },
413 { name: 'order_by', value: order_by },
414 { name: 'sort_dir', value: dir });
416 $.post("controller.pl", data, kivi.eval_json_result);
419 ns.redisplay_items = function(data) {
420 var old_rows = $('.row_entry').detach();
422 $(data).each(function(idx, elt) {
423 new_rows.push(old_rows[elt.old_pos - 1]);
425 $(new_rows).appendTo($('#row_table_id'));
426 ns.renumber_positions();
429 ns.get_insert_before_item_id = function(wanted_pos) {
430 if (wanted_pos === '') return;
432 var insert_before_item_id;
433 // selection by data does not seem to work if data is changed at runtime
434 // var elt = $('.row_entry [data-position="' + wanted_pos + '"]');
435 $('.row_entry').each(function(idx, elt) {
436 if ($(elt).data("position") == wanted_pos) {
437 insert_before_item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
442 return insert_before_item_id;
445 ns.add_item = function() {
446 if ($('#add_item_parts_id').val() === '') return;
447 if (!ns.check_cv()) return;
449 $('#row_table_id thead a img').remove();
451 var insert_before_item_id = ns.get_insert_before_item_id($('#add_item_position').val());
453 var data = $('#order_form').serializeArray();
454 data.push({ name: 'action', value: 'Order/add_item' },
455 { name: 'insert_before_item_id', value: insert_before_item_id });
457 $.post("controller.pl", data, kivi.eval_json_result);
460 ns.setup_multi_items_dialog = function() {
461 $('#multi_items_filter_table input, #multi_items_filter_table select').keydown(function(event) {
462 if (event.keyCode == 13) {
463 event.preventDefault();
464 ns.multi_items_dialog_update_result();
469 $('#multi_items_filter_all_substr_multi_ilike').focus();
472 ns.show_multi_items_dialog = function() {
473 if (!ns.check_cv()) return;
475 $('#row_table_id thead a img').remove();
478 url: 'controller.pl?action=Order/show_multi_items_dialog',
479 data: { type: $('#type').val() },
480 id: 'jq_multi_items_dialog',
481 load: kivi.Order.setup_multi_items_dialog,
483 title: kivi.t8('Add multiple items'),
491 ns.close_multi_items_dialog = function() {
492 $('#jq_multi_items_dialog').dialog('close');
495 ns.multi_items_dialog_update_result = function() {
496 var data = $('#multi_items_form').serializeArray();
497 data.push({ name: 'type', value: $('#type').val() });
499 url: 'controller.pl?action=Order/multi_items_update_result',
502 success: function(data) {
503 $('#multi_items_result').html(data);
504 ns.multi_items_dialog_enable_continue();
505 ns.multi_items_result_setup_events();
510 ns.multi_items_dialog_disable_continue = function() {
511 // disable keydown-event and continue button to prevent
512 // impatient users to add parts multiple times
513 $('#multi_items_result input, #multi_items_position').off("keydown");
514 $('#multi_items_dialog_continue_button').prop('disabled', true);
517 ns.multi_items_dialog_enable_continue = function() {
518 $('#multi_items_result input, #multi_items_position').keydown(function(event) {
519 if(event.keyCode == 13) {
520 event.preventDefault();
521 ns.add_multi_items();
525 $('#multi_items_dialog_continue_button').prop('disabled', false);
528 ns.multi_items_result_setup_events = function() {
529 $('#multi_items_all_qty').change(ns.reformat_number);
530 $('#multi_items_all_qty').change(function(event) {
531 $('.multi_items_qty').val($(event.target).val());
533 $('.multi_items_qty').change(ns.reformat_number);
536 ns.add_multi_items = function() {
538 var n_rows = $('.multi_items_qty').length;
539 if (n_rows == 0) return;
542 n_rows = $('.multi_items_qty').filter(function() {
543 return $(this).val().length > 0;
545 if (n_rows == 0) return;
547 ns.multi_items_dialog_disable_continue();
549 var insert_before_item_id = ns.get_insert_before_item_id($('#multi_items_position').val());
551 var data = $('#order_form').serializeArray();
552 data = data.concat($('#multi_items_form').serializeArray());
553 data.push({ name: 'action', value: 'Order/add_multi_items' },
554 { name: 'insert_before_item_id', value: insert_before_item_id });
555 $.post("controller.pl", data, kivi.eval_json_result);
558 ns.set_input_to_one = function(clicked) {
559 if ($(clicked).val() == '') {
560 $(clicked).val(kivi.format_amount(1.00, -2));
565 ns.delete_order_item_row = function(clicked) {
566 var row = $(clicked).parents("tbody").first();
569 ns.renumber_positions();
570 ns.recalc_amounts_and_taxes();
573 ns.row_table_scroll_down = function() {
574 $('#row_table_scroll_id').scrollTop($('#row_table_scroll_id')[0].scrollHeight);
577 ns.show_longdescription_dialog = function(clicked) {
578 var row = $(clicked).parents("tbody").first();
579 var position = $(row).find('[name="position"]').html();
580 var partnumber = $(row).find('[name="partnumber"]').html();
581 var description_elt = $(row).find('[name="order.orderitems[].description"]');
582 var description = description_elt.val();
583 var longdescription_elt = $(row).find('[name="order.orderitems[].longdescription"]');
586 if (!longdescription_elt.length) {
588 { name: 'action', value: 'Order/get_item_longdescription' },
589 { name: 'type', value: $('#type').val() },
590 { name: 'item_id', value: $(row).find('[name="order.orderitems[+].id"]').val() },
591 { name: 'parts_id', value: $(row).find('[name="order.orderitems[].parts_id"]').val() }
595 url: 'controller.pl',
600 success: function(val) {
601 longdescription = val;
605 longdescription = longdescription_elt.val();
609 runningnumber: position,
610 partnumber: partnumber,
611 description: description,
612 default_longdescription: longdescription,
613 set_function: function(val) {
614 longdescription_elt.remove();
615 $('<input type="hidden" name="order.orderitems[].longdescription">').insertAfter(description_elt).val(val);
619 kivi.SalesPurchase.edit_longdescription_with_params(params);
622 ns.price_chooser_item_row = function(clicked) {
623 if (!ns.check_cv()) return;
624 var row = $(clicked).parents("tbody").first();
625 var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
627 var data = $('#order_form').serializeArray();
628 data.push({ name: 'action', value: 'Order/price_popup' },
629 { name: 'item_id', value: item_id_dom.val() });
631 $.post("controller.pl", data, kivi.eval_json_result);
634 ns.update_price_source = function(item_id, source, descr, price_str, price_editable) {
635 var row = $('#item_' + item_id).parents("tbody").first();
636 var source_elt = $(row).find('[name="order.orderitems[].active_price_source"]');
637 var button_elt = $(row).find('[name="price_chooser_button"]');
639 button_elt.val(button_elt.val().replace(/.*\|/, descr + " |"));
640 source_elt.val(source);
642 var editable_div_elt = $(row).find('[name="editable_price"]');
643 var not_editable_div_elt = $(row).find('[name="not_editable_price"]');
644 if (price_editable == 1 && source === '') {
646 $(editable_div_elt).show();
647 $(not_editable_div_elt).hide();
648 $(editable_div_elt).find(':input').prop("disabled", false);
649 $(not_editable_div_elt).find(':input').prop("disabled", true);
652 $(editable_div_elt).hide();
653 $(not_editable_div_elt).show();
654 $(editable_div_elt).find(':input').prop("disabled", true);
655 $(not_editable_div_elt).find(':input').prop("disabled", false);
659 var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
660 var html_elt = $(row).find('[name="sellprice_text"]');
661 price_elt.val(price_str);
662 html_elt.html(price_str);
663 ns.recalc_amounts_and_taxes();
666 kivi.io.close_dialog();
669 ns.update_discount_source = function(item_id, source, descr, discount_str, price_editable) {
670 var row = $('#item_' + item_id).parents("tbody").first();
671 var source_elt = $(row).find('[name="order.orderitems[].active_discount_source"]');
672 var button_elt = $(row).find('[name="price_chooser_button"]');
674 button_elt.val(button_elt.val().replace(/\|.*/, "| " + descr));
675 source_elt.val(source);
677 var editable_div_elt = $(row).find('[name="editable_discount"]');
678 var not_editable_div_elt = $(row).find('[name="not_editable_discount"]');
679 if (price_editable == 1 && source === '') {
681 $(editable_div_elt).show();
682 $(not_editable_div_elt).hide();
683 $(editable_div_elt).find(':input').prop("disabled", false);
684 $(not_editable_div_elt).find(':input').prop("disabled", true);
687 $(editable_div_elt).hide();
688 $(not_editable_div_elt).show();
689 $(editable_div_elt).find(':input').prop("disabled", true);
690 $(not_editable_div_elt).find(':input').prop("disabled", false);
694 var discount_elt = $(row).find('[name="order.orderitems[].discount_as_percent"]');
695 var html_elt = $(row).find('[name="discount_text"]');
696 discount_elt.val(discount_str);
697 html_elt.html(discount_str);
698 ns.recalc_amounts_and_taxes();
701 kivi.io.close_dialog();
704 ns.show_periodic_invoices_config_dialog = function() {
705 if ($('#type').val() !== 'sales_order') return;
708 url: 'controller.pl?action=Order/show_periodic_invoices_config_dialog',
709 data: { type: $('#type').val(),
711 config: $('#order_periodic_invoices_config').val(),
712 customer_id: $('#order_customer_id').val(),
713 transdate_as_date: $('#order_transdate_as_date').val(),
714 language_id: $('#language_id').val()
716 id: 'jq_periodic_invoices_config_dialog',
717 load: kivi.reinit_widgets,
719 title: kivi.t8('Edit the configuration for periodic invoices'),
727 ns.close_periodic_invoices_config_dialog = function() {
728 $('#jq_periodic_invoices_config_dialog').dialog('close');
731 ns.assign_periodic_invoices_config = function() {
732 var data = $('[name="Form"]').serializeArray();
733 data.push({ name: 'type', value: $('#type').val() },
734 { name: 'action', value: 'Order/assign_periodic_invoices_config' });
735 $.post("controller.pl", data, kivi.eval_json_result);
738 ns.check_save_active_periodic_invoices = function() {
739 var type = $('#type').val();
740 if (type !== 'sales_order') return true;
744 url: 'controller.pl',
745 data: { action: 'Order/get_has_active_periodic_invoices',
748 config: $('#order_periodic_invoices_config').val(),
753 success: function(val) {
759 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?'));
765 ns.show_vc_details_dialog = function() {
766 if (!ns.check_cv()) return;
770 if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
772 vc_id = $('#order_customer_id').val();
773 title = kivi.t8('Customer details');
776 vc_id = $('#order_vendor_id').val();
777 title = kivi.t8('Vendor details');
781 url: 'controller.pl',
782 data: { action: 'Order/show_customer_vendor_details_dialog',
783 type : $('#type').val(),
787 id: 'jq_customer_vendor_details_dialog',
797 ns.update_row_from_master_data = function(clicked) {
798 var row = $(clicked).parents("tbody").first();
799 var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
801 var data = $('#order_form').serializeArray();
802 data.push({ name: 'action', value: 'Order/update_row_from_master_data' });
803 data.push({ name: 'item_ids[]', value: item_id_dom.val() });
805 $.post("controller.pl", data, kivi.eval_json_result);
808 ns.update_all_rows_from_master_data = function() {
809 var item_ids = $.map($('.row_entry'), function(elt) {
810 var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
811 return { name: 'item_ids[]', value: item_id };
814 if (item_ids.length == 0) {
818 var data = $('#order_form').serializeArray();
819 data.push({ name: 'action', value: 'Order/update_row_from_master_data' });
820 data = data.concat(item_ids);
822 $.post("controller.pl", data, kivi.eval_json_result);
825 ns.show_calculate_qty_dialog = function(clicked) {
826 var row = $(clicked).parents("tbody").first();
827 var input_id = $(row).find('[name="order.orderitems[].qty_as_number"]').attr('id');
828 var formula_id = $(row).find('[name="formula[+]"]').attr('id');
830 calculate_qty_selection_dialog("", input_id, "", formula_id);
837 if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
838 $('#order_customer_id').change(kivi.Order.reload_cv_dependent_selections);
840 $('#order_vendor_id').change(kivi.Order.reload_cv_dependent_selections);
843 $('#order_currency_id').change(kivi.Order.update_exchangerate);
844 $('#order_transdate_as_date').change(kivi.Order.update_exchangerate);
845 $('#order_exchangerate_as_null_number').change(kivi.Order.exchangerate_changed);
847 if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
848 $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.sellprice, -2)) });
850 $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.lastcost, -2)) });
852 $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_description').val(o.description) });
853 $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_unit').val(o.unit) });
855 $('.add_item_input').keydown(function(event) {
856 if (event.keyCode == 13) {
857 event.preventDefault();
858 kivi.Order.add_item();
863 kivi.Order.init_row_handlers();
865 $('#row_table_id').on('sortstop', function(event, ui) {
866 $('#row_table_id thead a img').remove();
867 kivi.Order.renumber_positions();
870 $('#expand_all').on('click', function(event) {
871 event.preventDefault();
872 if ($('#expand_all').data('expanded') == 1) {
873 $('#expand_all').data('expanded', 0);
874 $('#expand_all').attr('src', 'image/expand.svg');
875 $('#expand_all').attr('alt', kivi.t8('Show all details'));
876 $('#expand_all').attr('title', kivi.t8('Show all details'));
877 $('.row_entry').each(function(idx, elt) {
878 kivi.Order.hide_second_row(elt);
881 $('#expand_all').data('expanded', 1);
882 $('#expand_all').attr('src', "image/collapse.svg");
883 $('#expand_all').attr('alt', kivi.t8('Hide all details'));
884 $('#expand_all').attr('title', kivi.t8('Hide all details'));
885 kivi.Order.load_all_second_rows();
886 $('.row_entry').each(function(idx, elt) {
887 kivi.Order.show_second_row(elt);