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.reformat_number_as_null_number = function(event) {
178 if ($(event.target).val() === '') {
181 ns.reformat_number(event);
184 ns.update_exchangerate = function(event) {
185 if (!ns.check_cv()) {
186 $('#order_currency_id').val($('#old_currency_id').val());
190 var rate_input = $('#order_exchangerate_as_null_number');
191 // unset exchangerate if currency changed
192 if ($('#order_currency_id').val() !== $('#old_currency_id').val()) {
196 // only set exchangerate if unset
197 if (rate_input.val() !== '') {
201 var data = $('#order_form').serializeArray();
202 data.push({ name: 'action', value: 'Order/update_exchangerate' });
205 url: 'controller.pl',
209 success: function(data){
210 if (!data.is_standard) {
211 $('#currency_name').text(data.currency_name);
212 if (data.exchangerate) {
213 rate_input.val(data.exchangerate);
217 $('#exchangerate_settings').show();
220 $('#exchangerate_settings').hide();
222 if ($('#order_currency_id').val() != $('#old_currency_id').val() ||
223 !data.is_standard && data.exchangerate != $('#old_exchangerate').val()) {
224 kivi.display_flash('warning', kivi.t8('You have changed the currency or exchange rate. Please check prices.'));
226 $('#old_currency_id').val($('#order_currency_id').val());
227 $('#old_exchangerate').val(data.exchangerate);
232 ns.exchangerate_changed = function(event) {
233 if (kivi.parse_amount($('#order_exchangerate_as_null_number').val()) != kivi.parse_amount($('#old_exchangerate').val())) {
234 kivi.display_flash('warning', kivi.t8('You have changed the currency or exchange rate. Please check prices.'));
235 $('#old_exchangerate').val($('#order_exchangerate_as_null_number').val());
239 ns.recalc_amounts_and_taxes = function() {
240 var data = $('#order_form').serializeArray();
241 data.push({ name: 'action', value: 'Order/recalc_amounts_and_taxes' });
243 $.post("controller.pl", data, kivi.eval_json_result);
246 ns.unit_change = function(event) {
247 var row = $(event.target).parents("tbody").first();
248 var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
249 var sellprice_dom = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
250 var select_elt = $(row).find('[name="order.orderitems[].unit"]');
252 var oldval = $(select_elt).data('oldval');
253 $(select_elt).data('oldval', $(select_elt).val());
255 var data = $('#order_form').serializeArray();
256 data.push({ name: 'action', value: 'Order/unit_changed' },
257 { name: 'item_id', value: item_id_dom.val() },
258 { name: 'old_unit', value: oldval },
259 { name: 'sellprice_dom_id', value: sellprice_dom.attr('id') });
261 $.post("controller.pl", data, kivi.eval_json_result);
264 ns.update_sellprice = function(item_id, price_str) {
265 var row = $('#item_' + item_id).parents("tbody").first();
266 var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
267 var html_elt = $(row).find('[name="sellprice_text"]');
268 price_elt.val(price_str);
269 html_elt.html(price_str);
272 ns.load_second_row = function(row) {
273 var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
274 var div_elt = $(row).find('[name="second_row"]');
276 if ($(div_elt).data('loaded') == 1) {
279 var data = $('#order_form').serializeArray();
280 data.push({ name: 'action', value: 'Order/load_second_rows' },
281 { name: 'item_ids[]', value: item_id_dom.val() });
283 $.post("controller.pl", data, kivi.eval_json_result);
286 ns.load_all_second_rows = function() {
287 var rows = $('.row_entry').filter(function(idx, elt) {
288 return $(elt).find('[name="second_row"]').data('loaded') != 1;
291 var item_ids = $.map(rows, function(elt) {
292 var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
293 return { name: 'item_ids[]', value: item_id };
296 if (item_ids.length == 0) {
300 var data = $('#order_form').serializeArray();
301 data.push({ name: 'action', value: 'Order/load_second_rows' });
302 data = data.concat(item_ids);
304 $.post("controller.pl", data, kivi.eval_json_result);
307 ns.hide_second_row = function(row) {
308 $(row).children().not(':first').hide();
309 $(row).data('expanded', 0);
310 var elt = $(row).find('.expand');
311 elt.attr('src', "image/expand.svg");
312 elt.attr('alt', kivi.t8('Show details'));
313 elt.attr('title', kivi.t8('Show details'));
316 ns.show_second_row = function(row) {
317 $(row).children().not(':first').show();
318 $(row).data('expanded', 1);
319 var elt = $(row).find('.expand');
320 elt.attr('src', "image/collapse.svg");
321 elt.attr('alt', kivi.t8('Hide details'));
322 elt.attr('title', kivi.t8('Hide details'));
325 ns.toggle_second_row = function(row) {
326 if ($(row).data('expanded') == 1) {
327 ns.hide_second_row(row);
329 ns.show_second_row(row);
333 ns.init_row_handlers = function() {
334 kivi.run_once_for('.recalc', 'on_change_recalc', function(elt) {
335 $(elt).change(ns.recalc_amounts_and_taxes);
338 kivi.run_once_for('.reformat_number', 'on_change_reformat', function(elt) {
339 $(elt).change(ns.reformat_number);
342 kivi.run_once_for('.unitselect', 'on_change_unit_with_oldval', function(elt) {
343 $(elt).data('oldval', $(elt).val());
344 $(elt).change(ns.unit_change);
347 kivi.run_once_for('.row_entry', 'on_kbd_click_show_hide', function(elt) {
348 $(elt).keydown(function(event) {
350 if (event.keyCode == 40 && event.shiftKey === true) {
352 event.preventDefault();
353 row = $(event.target).parents(".row_entry").first();
354 ns.load_second_row(row);
355 ns.show_second_row(row);
358 if (event.keyCode == 38 && event.shiftKey === true) {
360 event.preventDefault();
361 row = $(event.target).parents(".row_entry").first();
362 ns.hide_second_row(row);
368 kivi.run_once_for('.expand', 'expand_second_row', function(elt) {
369 $(elt).click(function(event) {
370 event.preventDefault();
371 var row = $(event.target).parents(".row_entry").first();
372 ns.load_second_row(row);
373 ns.toggle_second_row(row);
380 ns.redisplay_line_values = function(is_sales, data) {
381 $('.row_entry').each(function(idx, elt) {
382 $(elt).find('[name="linetotal"]').html(data[idx][0]);
383 if (is_sales && $(elt).find('[name="second_row"]').data('loaded') == 1) {
384 var mt = data[idx][1];
385 var mp = data[idx][2];
387 if (mt[0] === '-') h += ' class="plus0"';
388 h += '>' + mt + ' ' + mp + '%';
390 $(elt).find('[name="linemargin"]').html(h);
395 ns.redisplay_cvpartnumbers = function(data) {
396 $('.row_entry').each(function(idx, elt) {
397 $(elt).find('[name="cvpartnumber"]').html(data[idx][0]);
401 ns.renumber_positions = function() {
402 $('.row_entry [name="position"]').each(function(idx, elt) {
405 $('.row_entry').each(function(idx, elt) {
406 $(elt).data("position", idx+1);
410 ns.reorder_items = function(order_by) {
411 var dir = $('#' + order_by + '_header_id a img').attr("data-sort-dir");
412 $('#row_table_id thead a img').remove();
417 src = "image/up.png";
420 src = "image/down.png";
423 $('#' + order_by + '_header_id a').append('<img border=0 data-sort-dir=' + dir + ' src=' + src + ' alt="' + kivi.t8('sort items') + '">');
425 var data = $('#order_form').serializeArray();
426 data.push({ name: 'action', value: 'Order/reorder_items' },
427 { name: 'order_by', value: order_by },
428 { name: 'sort_dir', value: dir });
430 $.post("controller.pl", data, kivi.eval_json_result);
433 ns.redisplay_items = function(data) {
434 var old_rows = $('.row_entry').detach();
436 $(data).each(function(idx, elt) {
437 new_rows.push(old_rows[elt.old_pos - 1]);
439 $(new_rows).appendTo($('#row_table_id'));
440 ns.renumber_positions();
443 ns.get_insert_before_item_id = function(wanted_pos) {
444 if (wanted_pos === '') return;
446 var insert_before_item_id;
447 // selection by data does not seem to work if data is changed at runtime
448 // var elt = $('.row_entry [data-position="' + wanted_pos + '"]');
449 $('.row_entry').each(function(idx, elt) {
450 if ($(elt).data("position") == wanted_pos) {
451 insert_before_item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
456 return insert_before_item_id;
459 ns.add_item = function() {
460 if ($('#add_item_parts_id').val() === '') return;
461 if (!ns.check_cv()) return;
463 $('#row_table_id thead a img').remove();
465 var insert_before_item_id = ns.get_insert_before_item_id($('#add_item_position').val());
467 var data = $('#order_form').serializeArray();
468 data.push({ name: 'action', value: 'Order/add_item' },
469 { name: 'insert_before_item_id', value: insert_before_item_id });
471 $.post("controller.pl", data, kivi.eval_json_result);
474 ns.setup_multi_items_dialog = function() {
475 $('#multi_items_filter_table input, #multi_items_filter_table select').keydown(function(event) {
476 if (event.keyCode == 13) {
477 event.preventDefault();
478 ns.multi_items_dialog_update_result();
483 $('#multi_items_filter_all_substr_multi_ilike').focus();
486 ns.show_multi_items_dialog = function() {
487 if (!ns.check_cv()) return;
489 $('#row_table_id thead a img').remove();
492 url: 'controller.pl?action=Order/show_multi_items_dialog',
493 data: { type: $('#type').val() },
494 id: 'jq_multi_items_dialog',
495 load: kivi.Order.setup_multi_items_dialog,
497 title: kivi.t8('Add multiple items'),
505 ns.close_multi_items_dialog = function() {
506 $('#jq_multi_items_dialog').dialog('close');
509 ns.multi_items_dialog_update_result = function() {
510 var data = $('#multi_items_form').serializeArray();
511 data.push({ name: 'type', value: $('#type').val() });
513 url: 'controller.pl?action=Order/multi_items_update_result',
516 success: function(data) {
517 $('#multi_items_result').html(data);
518 ns.multi_items_dialog_enable_continue();
519 ns.multi_items_result_setup_events();
524 ns.multi_items_dialog_disable_continue = function() {
525 // disable keydown-event and continue button to prevent
526 // impatient users to add parts multiple times
527 $('#multi_items_result input, #multi_items_position').off("keydown");
528 $('#multi_items_dialog_continue_button').prop('disabled', true);
531 ns.multi_items_dialog_enable_continue = function() {
532 $('#multi_items_result input, #multi_items_position').keydown(function(event) {
533 if(event.keyCode == 13) {
534 event.preventDefault();
535 ns.add_multi_items();
539 $('#multi_items_dialog_continue_button').prop('disabled', false);
542 ns.multi_items_result_setup_events = function() {
543 $('#multi_items_all_qty').change(ns.reformat_number);
544 $('#multi_items_all_qty').change(function(event) {
545 $('.multi_items_qty').val($(event.target).val());
547 $('.multi_items_qty').change(ns.reformat_number);
550 ns.add_multi_items = function() {
552 var n_rows = $('.multi_items_qty').length;
553 if (n_rows == 0) return;
556 n_rows = $('.multi_items_qty').filter(function() {
557 return $(this).val().length > 0;
559 if (n_rows == 0) return;
561 ns.multi_items_dialog_disable_continue();
563 var insert_before_item_id = ns.get_insert_before_item_id($('#multi_items_position').val());
565 var data = $('#order_form').serializeArray();
566 data = data.concat($('#multi_items_form').serializeArray());
567 data.push({ name: 'action', value: 'Order/add_multi_items' },
568 { name: 'insert_before_item_id', value: insert_before_item_id });
569 $.post("controller.pl", data, kivi.eval_json_result);
572 ns.set_input_to_one = function(clicked) {
573 if ($(clicked).val() == '') {
574 $(clicked).val(kivi.format_amount(1.00, -2));
579 ns.delete_order_item_row = function(clicked) {
580 var row = $(clicked).parents("tbody").first();
583 ns.renumber_positions();
584 ns.recalc_amounts_and_taxes();
587 ns.row_table_scroll_down = function() {
588 $('#row_table_scroll_id').scrollTop($('#row_table_scroll_id')[0].scrollHeight);
591 ns.show_longdescription_dialog = function(clicked) {
592 var row = $(clicked).parents("tbody").first();
593 var position = $(row).find('[name="position"]').html();
594 var partnumber = $(row).find('[name="partnumber"]').html();
595 var description_elt = $(row).find('[name="order.orderitems[].description"]');
596 var description = description_elt.val();
597 var longdescription_elt = $(row).find('[name="order.orderitems[].longdescription"]');
600 if (!longdescription_elt.length) {
602 { name: 'action', value: 'Order/get_item_longdescription' },
603 { name: 'type', value: $('#type').val() },
604 { name: 'item_id', value: $(row).find('[name="order.orderitems[+].id"]').val() },
605 { name: 'parts_id', value: $(row).find('[name="order.orderitems[].parts_id"]').val() }
609 url: 'controller.pl',
614 success: function(val) {
615 longdescription = val;
619 longdescription = longdescription_elt.val();
623 runningnumber: position,
624 partnumber: partnumber,
625 description: description,
626 default_longdescription: longdescription,
627 set_function: function(val) {
628 longdescription_elt.remove();
629 $('<input type="hidden" name="order.orderitems[].longdescription">').insertAfter(description_elt).val(val);
633 kivi.SalesPurchase.edit_longdescription_with_params(params);
636 ns.price_chooser_item_row = function(clicked) {
637 if (!ns.check_cv()) return;
638 var row = $(clicked).parents("tbody").first();
639 var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
641 var data = $('#order_form').serializeArray();
642 data.push({ name: 'action', value: 'Order/price_popup' },
643 { name: 'item_id', value: item_id_dom.val() });
645 $.post("controller.pl", data, kivi.eval_json_result);
648 ns.update_price_source = function(item_id, source, descr, price_str, price_editable) {
649 var row = $('#item_' + item_id).parents("tbody").first();
650 var source_elt = $(row).find('[name="order.orderitems[].active_price_source"]');
651 var button_elt = $(row).find('[name="price_chooser_button"]');
653 button_elt.val(button_elt.val().replace(/.*\|/, descr + " |"));
654 source_elt.val(source);
656 var editable_div_elt = $(row).find('[name="editable_price"]');
657 var not_editable_div_elt = $(row).find('[name="not_editable_price"]');
658 if (price_editable == 1 && source === '') {
660 $(editable_div_elt).show();
661 $(not_editable_div_elt).hide();
662 $(editable_div_elt).find(':input').prop("disabled", false);
663 $(not_editable_div_elt).find(':input').prop("disabled", true);
666 $(editable_div_elt).hide();
667 $(not_editable_div_elt).show();
668 $(editable_div_elt).find(':input').prop("disabled", true);
669 $(not_editable_div_elt).find(':input').prop("disabled", false);
673 var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
674 var html_elt = $(row).find('[name="sellprice_text"]');
675 price_elt.val(price_str);
676 html_elt.html(price_str);
677 ns.recalc_amounts_and_taxes();
680 kivi.io.close_dialog();
683 ns.update_discount_source = function(item_id, source, descr, discount_str, price_editable) {
684 var row = $('#item_' + item_id).parents("tbody").first();
685 var source_elt = $(row).find('[name="order.orderitems[].active_discount_source"]');
686 var button_elt = $(row).find('[name="price_chooser_button"]');
688 button_elt.val(button_elt.val().replace(/\|.*/, "| " + descr));
689 source_elt.val(source);
691 var editable_div_elt = $(row).find('[name="editable_discount"]');
692 var not_editable_div_elt = $(row).find('[name="not_editable_discount"]');
693 if (price_editable == 1 && source === '') {
695 $(editable_div_elt).show();
696 $(not_editable_div_elt).hide();
697 $(editable_div_elt).find(':input').prop("disabled", false);
698 $(not_editable_div_elt).find(':input').prop("disabled", true);
701 $(editable_div_elt).hide();
702 $(not_editable_div_elt).show();
703 $(editable_div_elt).find(':input').prop("disabled", true);
704 $(not_editable_div_elt).find(':input').prop("disabled", false);
708 var discount_elt = $(row).find('[name="order.orderitems[].discount_as_percent"]');
709 var html_elt = $(row).find('[name="discount_text"]');
710 discount_elt.val(discount_str);
711 html_elt.html(discount_str);
712 ns.recalc_amounts_and_taxes();
715 kivi.io.close_dialog();
718 ns.show_periodic_invoices_config_dialog = function() {
719 if ($('#type').val() !== 'sales_order') return;
722 url: 'controller.pl?action=Order/show_periodic_invoices_config_dialog',
723 data: { type: $('#type').val(),
725 config: $('#order_periodic_invoices_config').val(),
726 customer_id: $('#order_customer_id').val(),
727 transdate_as_date: $('#order_transdate_as_date').val(),
728 language_id: $('#language_id').val()
730 id: 'jq_periodic_invoices_config_dialog',
731 load: kivi.reinit_widgets,
733 title: kivi.t8('Edit the configuration for periodic invoices'),
741 ns.close_periodic_invoices_config_dialog = function() {
742 $('#jq_periodic_invoices_config_dialog').dialog('close');
745 ns.assign_periodic_invoices_config = function() {
746 var data = $('[name="Form"]').serializeArray();
747 data.push({ name: 'type', value: $('#type').val() },
748 { name: 'action', value: 'Order/assign_periodic_invoices_config' });
749 $.post("controller.pl", data, kivi.eval_json_result);
752 ns.check_save_active_periodic_invoices = function() {
753 var type = $('#type').val();
754 if (type !== 'sales_order') return true;
758 url: 'controller.pl',
759 data: { action: 'Order/get_has_active_periodic_invoices',
762 config: $('#order_periodic_invoices_config').val(),
767 success: function(val) {
773 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?'));
779 ns.show_vc_details_dialog = function() {
780 if (!ns.check_cv()) return;
784 if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
786 vc_id = $('#order_customer_id').val();
787 title = kivi.t8('Customer details');
790 vc_id = $('#order_vendor_id').val();
791 title = kivi.t8('Vendor details');
795 url: 'controller.pl',
796 data: { action: 'Order/show_customer_vendor_details_dialog',
797 type : $('#type').val(),
801 id: 'jq_customer_vendor_details_dialog',
811 ns.update_row_from_master_data = function(clicked) {
812 var row = $(clicked).parents("tbody").first();
813 var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
815 var data = $('#order_form').serializeArray();
816 data.push({ name: 'action', value: 'Order/update_row_from_master_data' });
817 data.push({ name: 'item_ids[]', value: item_id_dom.val() });
819 $.post("controller.pl", data, kivi.eval_json_result);
822 ns.update_all_rows_from_master_data = function() {
823 var item_ids = $.map($('.row_entry'), function(elt) {
824 var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
825 return { name: 'item_ids[]', value: item_id };
828 if (item_ids.length == 0) {
832 var data = $('#order_form').serializeArray();
833 data.push({ name: 'action', value: 'Order/update_row_from_master_data' });
834 data = data.concat(item_ids);
836 $.post("controller.pl", data, kivi.eval_json_result);
839 ns.show_calculate_qty_dialog = function(clicked) {
840 var row = $(clicked).parents("tbody").first();
841 var input_id = $(row).find('[name="order.orderitems[].qty_as_number"]').attr('id');
842 var formula_id = $(row).find('[name="formula[+]"]').attr('id');
844 calculate_qty_selection_dialog("", input_id, "", formula_id);
851 if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
852 $('#order_customer_id').change(kivi.Order.reload_cv_dependent_selections);
854 $('#order_vendor_id').change(kivi.Order.reload_cv_dependent_selections);
857 $('#order_currency_id').change(kivi.Order.update_exchangerate);
858 $('#order_transdate_as_date').change(kivi.Order.update_exchangerate);
859 $('#order_exchangerate_as_null_number').change(kivi.Order.exchangerate_changed);
861 if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
862 $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.sellprice, -2)) });
864 $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.lastcost, -2)) });
866 $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_description').val(o.description) });
867 $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_unit').val(o.unit) });
869 $('.add_item_input').keydown(function(event) {
870 if (event.keyCode == 13) {
871 event.preventDefault();
872 kivi.Order.add_item();
877 kivi.Order.init_row_handlers();
879 $('#row_table_id').on('sortstop', function(event, ui) {
880 $('#row_table_id thead a img').remove();
881 kivi.Order.renumber_positions();
884 $('#expand_all').on('click', function(event) {
885 event.preventDefault();
886 if ($('#expand_all').data('expanded') == 1) {
887 $('#expand_all').data('expanded', 0);
888 $('#expand_all').attr('src', 'image/expand.svg');
889 $('#expand_all').attr('alt', kivi.t8('Show all details'));
890 $('#expand_all').attr('title', kivi.t8('Show all details'));
891 $('.row_entry').each(function(idx, elt) {
892 kivi.Order.hide_second_row(elt);
895 $('#expand_all').data('expanded', 1);
896 $('#expand_all').attr('src', "image/collapse.svg");
897 $('#expand_all').attr('alt', kivi.t8('Hide all details'));
898 $('#expand_all').attr('title', kivi.t8('Hide all details'));
899 kivi.Order.load_all_second_rows();
900 $('.row_entry').each(function(idx, elt) {
901 kivi.Order.show_second_row(elt);
907 $('.reformat_number_as_null_number').change(kivi.Order.reformat_number_as_null_number);