Auftrags-Controller: Artikel-Mehrfachauswahl-Dialog nicht ohne Kunde/Lieferant
[kivitendo-erp.git] / js / kivi.Order.js
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.'));
6         return false;
7       }
8     } else  {
9       if ($('#order_vendor_id').val() === '') {
10         alert(kivi.t8('Please select a vendor.'));
11         return false;
12       }
13     }
14     return true;
15   };
16
17   ns.check_duplicate_parts = function(question) {
18     var id_arr = $('[name="order.orderitems[].parts_id"]').map(function() { return this.value; }).get();
19
20     var i, obj = {}, pos = [];
21
22     for (i = 0; i < id_arr.length; i++) {
23       var id = id_arr[i];
24       if (obj.hasOwnProperty(id)) {
25         pos.push(i + 1);
26       }
27       obj[id] = 0;
28     }
29
30     if (pos.length > 0) {
31       question = question || kivi.t8("Do you really want to continue?");
32       return confirm(kivi.t8("There are duplicate parts at positions") + "\n"
33                      + pos.join(', ') + "\n"
34                      + question);
35     }
36     return true;
37   };
38
39   ns.check_valid_reqdate = function() {
40     if ($('#order_reqdate_as_date').val() === '') {
41       alert(kivi.t8('Please select a delivery date.'));
42       return false;
43     } else {
44       return true;
45     }
46   };
47
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;
52
53     var data = $('#order_form').serializeArray();
54     data.push({ name: 'action', value: 'Order/' + action });
55
56     $.post("controller.pl", data, kivi.eval_json_result);
57   };
58
59   ns.delete_order = function() {
60     var data = $('#order_form').serializeArray();
61     data.push({ name: 'action', value: 'Order/delete' });
62
63     $.post("controller.pl", data, kivi.eval_json_result);
64   };
65
66   ns.show_print_options = function(warn_on_duplicates) {
67     if (!ns.check_cv()) return;
68     if (warn_on_duplicates && !ns.check_duplicate_parts(kivi.t8("Do you really want to print?"))) return;
69
70     kivi.popup_dialog({
71       id: 'print_options',
72       dialog: {
73         title: kivi.t8('Print options'),
74         width:  800,
75         height: 300
76       }
77     });
78   };
79
80   ns.print = function() {
81     $('#print_options').dialog('close');
82
83     var data = $('#order_form').serializeArray();
84     data = data.concat($('#print_options_form').serializeArray());
85     data.push({ name: 'action', value: 'Order/print' });
86
87     $.post("controller.pl", data, kivi.eval_json_result);
88   };
89
90   var email_dialog;
91
92   ns.setup_send_email_dialog = function() {
93     kivi.SalesPurchase.show_all_print_options_elements();
94     kivi.SalesPurchase.show_print_options_elements([ 'sendmode', 'media', 'copies', 'remove_draft' ], false);
95
96     $('#print_options_form table').first().remove().appendTo('#email_form_print_options');
97
98     var to_focus = $('#email_form_to').val() === '' ? 'to' : 'subject';
99     $('#email_form_' + to_focus).focus();
100   };
101
102   ns.finish_send_email_dialog = function() {
103     kivi.SalesPurchase.show_all_print_options_elements();
104
105     $('#email_form_print_options table').first().remove().prependTo('#print_options_form');
106     return true;
107   };
108
109   ns.show_email_dialog = function(html) {
110     var id            = 'send_email_dialog';
111     var dialog_params = {
112       id:     id,
113       width:  800,
114       height: 600,
115       title:  kivi.t8('Send email'),
116       modal:  true,
117       beforeClose: kivi.Order.finish_send_email_dialog,
118       close: function(event, ui) {
119         email_dialog.remove();
120       }
121     };
122
123     $('#' + id).remove();
124
125     email_dialog = $('<div style="display:none" id="' + id + '"></div>').appendTo('body');
126     email_dialog.html(html);
127     email_dialog.dialog(dialog_params);
128
129     kivi.Order.setup_send_email_dialog();
130
131     $('.cancel').click(ns.close_email_dialog);
132
133     return true;
134   };
135
136   ns.send_email = function() {
137     var data = $('#order_form').serializeArray();
138     data = data.concat($('[name^="email_form."]').serializeArray());
139     data = data.concat($('[name^="print_options."]').serializeArray());
140     data.push({ name: 'action', value: 'Order/send_email' });
141     $.post("controller.pl", data, kivi.eval_json_result);
142   };
143
144   ns.close_email_dialog = function() {
145     email_dialog.dialog("close");
146   };
147
148   ns.set_number_in_title = function(elt) {
149     $('#nr_in_title').html($(elt).val());
150   };
151
152   ns.reload_cv_dependent_selections = function() {
153     $('#order_shipto_id').val('');
154     var data = $('#order_form').serializeArray();
155     data.push({ name: 'action', value: 'Order/customer_vendor_changed' });
156
157     $.post("controller.pl", data, kivi.eval_json_result);
158   };
159
160   ns.reformat_number = function(event) {
161     $(event.target).val(kivi.format_amount(kivi.parse_amount($(event.target).val()), -2));
162   };
163
164   ns.reformat_number_as_null_number = function(event) {
165     if ($(event.target).val() === '') {
166       return;
167     }
168     ns.reformat_number(event);
169   };
170
171   ns.update_exchangerate = function(event) {
172     if (!ns.check_cv()) {
173       $('#order_currency_id').val($('#old_currency_id').val());
174       return;
175     }
176
177     var rate_input = $('#order_exchangerate_as_null_number');
178     // unset exchangerate if currency changed
179     if ($('#order_currency_id').val() !== $('#old_currency_id').val()) {
180       rate_input.val('');
181     }
182
183     // only set exchangerate if unset
184     if (rate_input.val() !== '') {
185       return;
186     }
187
188     var data = $('#order_form').serializeArray();
189     data.push({ name: 'action', value: 'Order/update_exchangerate' });
190
191     $.ajax({
192       url: 'controller.pl',
193       data: data,
194       method: 'POST',
195       dataType: 'json',
196       success: function(data){
197         if (!data.is_standard) {
198           $('#currency_name').text(data.currency_name);
199           if (data.exchangerate) {
200             rate_input.val(data.exchangerate);
201           } else {
202             rate_input.val('');
203           }
204           $('#exchangerate_settings').show();
205         } else {
206           rate_input.val('');
207           $('#exchangerate_settings').hide();
208         }
209         if ($('#order_currency_id').val() != $('#old_currency_id').val() ||
210             !data.is_standard && data.exchangerate != $('#old_exchangerate').val()) {
211           kivi.display_flash('warning', kivi.t8('You have changed the currency or exchange rate. Please check prices.'));
212         }
213         $('#old_currency_id').val($('#order_currency_id').val());
214         $('#old_exchangerate').val(data.exchangerate);
215       }
216     });
217   };
218
219   ns.exchangerate_changed = function(event) {
220     if (kivi.parse_amount($('#order_exchangerate_as_null_number').val()) != kivi.parse_amount($('#old_exchangerate').val())) {
221       kivi.display_flash('warning', kivi.t8('You have changed the currency or exchange rate. Please check prices.'));
222       $('#old_exchangerate').val($('#order_exchangerate_as_null_number').val());
223     }
224   };
225
226   ns.recalc_amounts_and_taxes = function() {
227     var data = $('#order_form').serializeArray();
228     data.push({ name: 'action', value: 'Order/recalc_amounts_and_taxes' });
229
230     $.post("controller.pl", data, kivi.eval_json_result);
231   };
232
233   ns.unit_change = function(event) {
234     var row           = $(event.target).parents("tbody").first();
235     var item_id_dom   = $(row).find('[name="orderitem_ids[+]"]');
236     var sellprice_dom = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
237     var select_elt    = $(row).find('[name="order.orderitems[].unit"]');
238
239     var oldval = $(select_elt).data('oldval');
240     $(select_elt).data('oldval', $(select_elt).val());
241
242     var data = $('#order_form').serializeArray();
243     data.push({ name: 'action',           value: 'Order/unit_changed'     },
244               { name: 'item_id',          value: item_id_dom.val()        },
245               { name: 'old_unit',         value: oldval                   },
246               { name: 'sellprice_dom_id', value: sellprice_dom.attr('id') });
247
248     $.post("controller.pl", data, kivi.eval_json_result);
249   };
250
251   ns.update_sellprice = function(item_id, price_str) {
252     var row       = $('#item_' + item_id).parents("tbody").first();
253     var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
254     var html_elt  = $(row).find('[name="sellprice_text"]');
255     price_elt.val(price_str);
256     html_elt.html(price_str);
257   };
258
259   ns.load_second_row = function(row) {
260     var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
261     var div_elt     = $(row).find('[name="second_row"]');
262
263     if ($(div_elt).data('loaded') == 1) {
264       return;
265     }
266     var data = $('#order_form').serializeArray();
267     data.push({ name: 'action',     value: 'Order/load_second_rows' },
268               { name: 'item_ids[]', value: item_id_dom.val()        });
269
270     $.post("controller.pl", data, kivi.eval_json_result);
271   };
272
273   ns.load_all_second_rows = function() {
274     var rows = $('.row_entry').filter(function(idx, elt) {
275       return $(elt).find('[name="second_row"]').data('loaded') != 1;
276     });
277
278     var item_ids = $.map(rows, function(elt) {
279       var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
280       return { name: 'item_ids[]', value: item_id };
281     });
282
283     if (item_ids.length == 0) {
284       return;
285     }
286
287     var data = $('#order_form').serializeArray();
288     data.push({ name: 'action', value: 'Order/load_second_rows' });
289     data = data.concat(item_ids);
290
291     $.post("controller.pl", data, kivi.eval_json_result);
292   };
293
294   ns.hide_second_row = function(row) {
295     $(row).children().not(':first').hide();
296     $(row).data('expanded', 0);
297     var elt = $(row).find('.expand');
298     elt.attr('src', "image/expand.svg");
299     elt.attr('alt', kivi.t8('Show details'));
300     elt.attr('title', kivi.t8('Show details'));
301   };
302
303   ns.show_second_row = function(row) {
304     $(row).children().not(':first').show();
305     $(row).data('expanded', 1);
306     var elt = $(row).find('.expand');
307     elt.attr('src', "image/collapse.svg");
308     elt.attr('alt', kivi.t8('Hide details'));
309     elt.attr('title', kivi.t8('Hide details'));
310   };
311
312   ns.toggle_second_row = function(row) {
313     if ($(row).data('expanded') == 1) {
314       ns.hide_second_row(row);
315     } else {
316       ns.show_second_row(row);
317     }
318   };
319
320   ns.init_row_handlers = function() {
321     kivi.run_once_for('.recalc', 'on_change_recalc', function(elt) {
322       $(elt).change(ns.recalc_amounts_and_taxes);
323     });
324
325     kivi.run_once_for('.reformat_number', 'on_change_reformat', function(elt) {
326       $(elt).change(ns.reformat_number);
327     });
328
329     kivi.run_once_for('.unitselect', 'on_change_unit_with_oldval', function(elt) {
330       $(elt).data('oldval', $(elt).val());
331       $(elt).change(ns.unit_change);
332     });
333
334     kivi.run_once_for('.row_entry', 'on_kbd_click_show_hide', function(elt) {
335       $(elt).keydown(function(event) {
336         var row;
337         if (event.keyCode == 40 && event.shiftKey === true) {
338           // shift arrow down
339           event.preventDefault();
340           row = $(event.target).parents(".row_entry").first();
341           ns.load_second_row(row);
342           ns.show_second_row(row);
343           return false;
344         }
345         if (event.keyCode == 38 && event.shiftKey === true) {
346           // shift arrow up
347           event.preventDefault();
348           row = $(event.target).parents(".row_entry").first();
349           ns.hide_second_row(row);
350           return false;
351         }
352       });
353     });
354
355     kivi.run_once_for('.expand', 'expand_second_row', function(elt) {
356       $(elt).click(function(event) {
357         event.preventDefault();
358         var row = $(event.target).parents(".row_entry").first();
359         ns.load_second_row(row);
360         ns.toggle_second_row(row);
361         return false;
362       })
363     });
364
365   };
366
367   ns.redisplay_line_values = function(is_sales, data) {
368     $('.row_entry').each(function(idx, elt) {
369       $(elt).find('[name="linetotal"]').html(data[idx][0]);
370       if (is_sales && $(elt).find('[name="second_row"]').data('loaded') == 1) {
371         var mt = data[idx][1];
372         var mp = data[idx][2];
373         var h  = '<span';
374         if (mt[0] === '-') h += ' class="plus0"';
375         h += '>' + mt + '&nbsp;&nbsp;' + mp + '%';
376         h += '</span>';
377         $(elt).find('[name="linemargin"]').html(h);
378       }
379     });
380   };
381
382   ns.redisplay_cvpartnumbers = function(data) {
383     $('.row_entry').each(function(idx, elt) {
384       $(elt).find('[name="cvpartnumber"]').html(data[idx][0]);
385     });
386   };
387
388   ns.renumber_positions = function() {
389     $('.row_entry [name="position"]').each(function(idx, elt) {
390       $(elt).html(idx+1);
391     });
392     $('.row_entry').each(function(idx, elt) {
393       $(elt).data("position", idx+1);
394     });
395   };
396
397   ns.reorder_items = function(order_by) {
398     var dir = $('#' + order_by + '_header_id a img').attr("data-sort-dir");
399     $('#row_table_id thead a img').remove();
400
401     var src;
402     if (dir == "1") {
403       dir = "0";
404       src = "image/up.png";
405     } else {
406       dir = "1";
407       src = "image/down.png";
408     }
409
410     $('#' + order_by + '_header_id a').append('<img border=0 data-sort-dir=' + dir + ' src=' + src + ' alt="' + kivi.t8('sort items') + '">');
411
412     var data = $('#order_form').serializeArray();
413     data.push({ name: 'action',   value: 'Order/reorder_items' },
414               { name: 'order_by', value: order_by              },
415               { name: 'sort_dir', value: dir                   });
416
417     $.post("controller.pl", data, kivi.eval_json_result);
418   };
419
420   ns.redisplay_items = function(data) {
421     var old_rows = $('.row_entry').detach();
422     var new_rows = [];
423     $(data).each(function(idx, elt) {
424       new_rows.push(old_rows[elt.old_pos - 1]);
425     });
426     $(new_rows).appendTo($('#row_table_id'));
427     ns.renumber_positions();
428   };
429
430   ns.get_insert_before_item_id = function(wanted_pos) {
431     if (wanted_pos === '') return;
432
433     var insert_before_item_id;
434     // selection by data does not seem to work if data is changed at runtime
435     // var elt = $('.row_entry [data-position="' + wanted_pos + '"]');
436     $('.row_entry').each(function(idx, elt) {
437       if ($(elt).data("position") == wanted_pos) {
438         insert_before_item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
439         return false;
440       }
441     });
442
443     return insert_before_item_id;
444   };
445
446   ns.add_item = function() {
447     if ($('#add_item_parts_id').val() === '') return;
448     if (!ns.check_cv()) return;
449
450     $('#row_table_id thead a img').remove();
451
452     var insert_before_item_id = ns.get_insert_before_item_id($('#add_item_position').val());
453
454     var data = $('#order_form').serializeArray();
455     data.push({ name: 'action', value: 'Order/add_item' },
456               { name: 'insert_before_item_id', value: insert_before_item_id });
457
458     $.post("controller.pl", data, kivi.eval_json_result);
459   };
460
461   ns.open_multi_items_dialog = function() {
462     if (!ns.check_cv()) return;
463
464     var pp = $("#add_item_parts_id").data("part_picker");
465     pp.o.multiple=1;
466     pp.open_dialog();
467   };
468
469   ns.add_multi_items = function(data) {
470     var insert_before_item_id = ns.get_insert_before_item_id($('#multi_items_position').val());
471     data = data.concat($('#order_form').serializeArray());
472     data.push({ name: 'action', value: 'Order/add_multi_items' },
473               { name: 'insert_before_item_id', value: insert_before_item_id });
474     $.post("controller.pl", data, kivi.eval_json_result);
475   };
476
477   ns.delete_order_item_row = function(clicked) {
478     var row = $(clicked).parents("tbody").first();
479     $(row).remove();
480
481     ns.renumber_positions();
482     ns.recalc_amounts_and_taxes();
483   };
484
485   ns.row_table_scroll_down = function() {
486     $('#row_table_scroll_id').scrollTop($('#row_table_scroll_id')[0].scrollHeight);
487   };
488
489   ns.show_longdescription_dialog = function(clicked) {
490     var row                 = $(clicked).parents("tbody").first();
491     var position            = $(row).find('[name="position"]').html();
492     var partnumber          = $(row).find('[name="partnumber"]').html();
493     var description_elt     = $(row).find('[name="order.orderitems[].description"]');
494     var longdescription_elt = $(row).find('[name="order.orderitems[].longdescription"]');
495
496     var params = {
497       runningnumber:           position,
498       partnumber:              partnumber,
499       description:             description_elt.val(),
500       default_longdescription: longdescription_elt.val(),
501       set_function:            function(val) {
502         longdescription_elt.val(val);
503       }
504     };
505
506     kivi.SalesPurchase.edit_longdescription_with_params(params);
507   };
508
509   ns.price_chooser_item_row = function(clicked) {
510     if (!ns.check_cv()) return;
511     var row         = $(clicked).parents("tbody").first();
512     var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
513
514     var data = $('#order_form').serializeArray();
515     data.push({ name: 'action',  value: 'Order/price_popup' },
516               { name: 'item_id', value: item_id_dom.val()   });
517
518     $.post("controller.pl", data, kivi.eval_json_result);
519   };
520
521   ns.update_price_source = function(item_id, source, descr, price_str, price_editable) {
522     var row        = $('#item_' + item_id).parents("tbody").first();
523     var source_elt = $(row).find('[name="order.orderitems[].active_price_source"]');
524     var button_elt = $(row).find('[name="price_chooser_button"]');
525
526     button_elt.val(button_elt.val().replace(/.*\|/, descr + " |"));
527     source_elt.val(source);
528
529     var editable_div_elt     = $(row).find('[name="editable_price"]');
530     var not_editable_div_elt = $(row).find('[name="not_editable_price"]');
531     if (price_editable == 1 && source === '') {
532       // editable
533       $(editable_div_elt).show();
534       $(not_editable_div_elt).hide();
535       $(editable_div_elt).find(':input').prop("disabled", false);
536       $(not_editable_div_elt).find(':input').prop("disabled", true);
537     } else {
538       // not editable
539       $(editable_div_elt).hide();
540       $(not_editable_div_elt).show();
541       $(editable_div_elt).find(':input').prop("disabled", true);
542       $(not_editable_div_elt).find(':input').prop("disabled", false);
543     }
544
545     if (price_str) {
546       var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
547       var html_elt  = $(row).find('[name="sellprice_text"]');
548       price_elt.val(price_str);
549       html_elt.html(price_str);
550       ns.recalc_amounts_and_taxes();
551     }
552
553     kivi.io.close_dialog();
554   };
555
556   ns.update_discount_source = function(item_id, source, descr, discount_str, price_editable) {
557     var row        = $('#item_' + item_id).parents("tbody").first();
558     var source_elt = $(row).find('[name="order.orderitems[].active_discount_source"]');
559     var button_elt = $(row).find('[name="price_chooser_button"]');
560
561     button_elt.val(button_elt.val().replace(/\|.*/, "| " + descr));
562     source_elt.val(source);
563
564     var editable_div_elt     = $(row).find('[name="editable_discount"]');
565     var not_editable_div_elt = $(row).find('[name="not_editable_discount"]');
566     if (price_editable == 1 && source === '') {
567       // editable
568       $(editable_div_elt).show();
569       $(not_editable_div_elt).hide();
570       $(editable_div_elt).find(':input').prop("disabled", false);
571       $(not_editable_div_elt).find(':input').prop("disabled", true);
572     } else {
573       // not editable
574       $(editable_div_elt).hide();
575       $(not_editable_div_elt).show();
576       $(editable_div_elt).find(':input').prop("disabled", true);
577       $(not_editable_div_elt).find(':input').prop("disabled", false);
578     }
579
580     if (discount_str) {
581       var discount_elt = $(row).find('[name="order.orderitems[].discount_as_percent"]');
582       var html_elt     = $(row).find('[name="discount_text"]');
583       discount_elt.val(discount_str);
584       html_elt.html(discount_str);
585       ns.recalc_amounts_and_taxes();
586     }
587
588     kivi.io.close_dialog();
589   };
590
591   ns.show_periodic_invoices_config_dialog = function() {
592     if ($('#type').val() !== 'sales_order') return;
593
594     kivi.popup_dialog({
595       url:    'controller.pl?action=Order/show_periodic_invoices_config_dialog',
596       data:   { type:              $('#type').val(),
597                 id:                $('#id').val(),
598                 config:            $('#order_periodic_invoices_config').val(),
599                 customer_id:       $('#order_customer_id').val(),
600                 transdate_as_date: $('#order_transdate_as_date').val(),
601                 language_id:       $('#language_id').val()
602               },
603       id:     'jq_periodic_invoices_config_dialog',
604       load:   kivi.reinit_widgets,
605       dialog: {
606         title:  kivi.t8('Edit the configuration for periodic invoices'),
607         width:  800,
608         height: 650
609       }
610     });
611     return true;
612   };
613
614   ns.close_periodic_invoices_config_dialog = function() {
615     $('#jq_periodic_invoices_config_dialog').dialog('close');
616   };
617
618   ns.assign_periodic_invoices_config = function() {
619     var data = $('[name="Form"]').serializeArray();
620     data.push({ name: 'type',   value: $('#type').val() },
621               { name: 'action', value: 'Order/assign_periodic_invoices_config' });
622     $.post("controller.pl", data, kivi.eval_json_result);
623   };
624
625   ns.check_save_active_periodic_invoices = function() {
626     var type = $('#type').val();
627     if (type !== 'sales_order') return true;
628
629     var active = false;
630     $.ajax({
631       url:      'controller.pl',
632       data:     { action: 'Order/get_has_active_periodic_invoices',
633                   type  : type,
634                   id    : $('#id').val(),
635                   config: $('#order_periodic_invoices_config').val(),
636                 },
637       method:   "GET",
638       async:    false,
639       dataType: 'text',
640       success:  function(val) {
641         active = val;
642       }
643     });
644
645     if (active == 1) {
646       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?'));
647     }
648
649     return true;
650   };
651
652   ns.show_vc_details_dialog = function() {
653     if (!ns.check_cv()) return;
654     var vc;
655     var vc_id;
656     var title;
657     if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
658       vc    = 'customer';
659       vc_id = $('#order_customer_id').val();
660       title = kivi.t8('Customer details');
661     } else {
662       vc    = 'vendor';
663       vc_id = $('#order_vendor_id').val();
664       title = kivi.t8('Vendor details');
665     }
666
667     kivi.popup_dialog({
668       url:    'controller.pl',
669       data:   { action: 'Order/show_customer_vendor_details_dialog',
670                 type  : $('#type').val(),
671                 vc    : vc,
672                 vc_id : vc_id
673               },
674       id:     'jq_customer_vendor_details_dialog',
675       dialog: {
676         title:  title,
677         width:  800,
678         height: 650
679       }
680     });
681     return true;
682   };
683
684   ns.update_row_from_master_data = function(clicked) {
685     var row = $(clicked).parents("tbody").first();
686     var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
687
688     var data = $('#order_form').serializeArray();
689     data.push({ name: 'action', value: 'Order/update_row_from_master_data' });
690     data.push({ name: 'item_ids[]', value: item_id_dom.val() });
691
692     $.post("controller.pl", data, kivi.eval_json_result);
693   };
694
695   ns.update_all_rows_from_master_data = function() {
696     var item_ids = $.map($('.row_entry'), function(elt) {
697       var item_id = $(elt).find('[name="orderitem_ids[+]"]').val();
698       return { name: 'item_ids[]', value: item_id };
699     });
700
701     if (item_ids.length == 0) {
702       return;
703     }
704
705     var data = $('#order_form').serializeArray();
706     data.push({ name: 'action', value: 'Order/update_row_from_master_data' });
707     data = data.concat(item_ids);
708
709     $.post("controller.pl", data, kivi.eval_json_result);
710   };
711
712   ns.show_calculate_qty_dialog = function(clicked) {
713     var row        = $(clicked).parents("tbody").first();
714     var input_id   = $(row).find('[name="order.orderitems[].qty_as_number"]').attr('id');
715     var formula_id = $(row).find('[name="formula[+]"]').attr('id');
716
717     calculate_qty_selection_dialog("", input_id, "", formula_id);
718     return true;
719   };
720
721   ns.edit_custom_shipto = function() {
722     if (!ns.check_cv()) return;
723
724     kivi.SalesPurchase.edit_custom_shipto();
725   };
726
727   ns.purchase_order_check_for_direct_delivery = function() {
728     if ($('#type').val() != 'sales_order') {
729       kivi.submit_form_with_action($('#order_form'), 'Order/purchase_order');
730     }
731
732     var empty = true;
733     var shipto;
734     if ($('#order_shipto_id').val() !== '') {
735       empty = false;
736       shipto = $('#order_shipto_id option:selected').text();
737     } else {
738       $('#shipto_inputs [id^="shipto"]').each(function(idx, elt) {
739         if (!empty)                                     return true;
740         if (/^shipto_to_copy/.test($(elt).prop('id')))  return true;
741         if (/^shiptocp_gender/.test($(elt).prop('id'))) return true;
742         if (/^shiptocvar_/.test($(elt).prop('id')))     return true;
743         if ($(elt).val() !== '') {
744           empty = false;
745           return false;
746         }
747       });
748       var shipto_elements = [];
749       $([$('#shiptoname').val(), $('#shiptostreet').val(), $('#shiptozipcode').val(), $('#shiptocity').val()]).each(function(idx, elt) {
750         if (elt !== '') shipto_elements.push(elt);
751       });
752       shipto = shipto_elements.join('; ');
753     }
754
755     var use_it = false;
756     if (!empty) {
757       ns.direct_delivery_dialog(shipto);
758     } else {
759       kivi.submit_form_with_action($('#order_form'), 'Order/purchase_order');
760     }
761   };
762
763   ns.direct_delivery_callback = function(accepted) {
764     $('#direct-delivery-dialog').dialog('close');
765
766     if (accepted) {
767       $('<input type="hidden" name="use_shipto">').appendTo('#order_form').val('1');
768     }
769
770     kivi.submit_form_with_action($('#order_form'), 'Order/purchase_order');
771   };
772
773   ns.direct_delivery_dialog = function(shipto) {
774     $('#direct-delivery-dialog').remove();
775
776     var text1 = kivi.t8('You have entered or selected the following shipping address for this customer:');
777     var text2 = kivi.t8('Do you want to carry this shipping address over to the new purchase order so that the vendor can deliver the goods directly to your customer?');
778     var html  = '<div id="direct-delivery-dialog"><p>' + text1 + '</p><p>' + shipto + '</p><p>' + text2 + '</p>';
779     html      = html + '<hr><p>';
780     html      = html + '<input type="button" value="' + kivi.t8('Yes') + '" size="30" onclick="kivi.Order.direct_delivery_callback(true)">';
781     html      = html + '&nbsp;';
782     html      = html + '<input type="button" value="' + kivi.t8('No')  + '" size="30" onclick="kivi.Order.direct_delivery_callback(false)">';
783     html      = html + '</p></div>';
784     $(html).hide().appendTo('#order_form');
785
786     kivi.popup_dialog({id: 'direct-delivery-dialog',
787                        dialog: {title:  kivi.t8('Carry over shipping address'),
788                                 height: 300,
789                                 width:  500 }});
790   };
791
792   ns.follow_up_window = function() {
793     var id   = $('#id').val();
794     var type = $('#type').val();
795
796     var number_info = '';
797     if ($('#type').val() == 'sales_order' || $('#type').val() == 'purchase_order') {
798       number_info = $('#order_ordnumber').val();
799     } else if ($('#type').val() == 'sales_quotation' || $('#type').val() == 'request_quotation') {
800       number_info = $('#order_quonumber').val();
801     }
802
803     var name_info = '';
804     if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation') {
805       name_info = $('#order_customer_id_name').val();
806     } else if ($('#type').val() == 'purchase_order' || $('#type').val() == 'request_quotation') {
807       name_info = $('#order_vendor_id_name').val();
808     }
809
810     var info = '';
811     if (number_info !== '') { info += ' (' + number_info + ')' }
812     if (name_info   !== '') { info += ' (' + name_info + ')' }
813
814     if (!$('#follow_up_rowcount').lenght) {
815       $('<input type="hidden" name="follow_up_rowcount"        id="follow_up_rowcount">').appendTo('#order_form');
816       $('<input type="hidden" name="follow_up_trans_id_1"      id="follow_up_trans_id_1">').appendTo('#order_form');
817       $('<input type="hidden" name="follow_up_trans_type_1"    id="follow_up_trans_type_1">').appendTo('#order_form');
818       $('<input type="hidden" name="follow_up_trans_info_1"    id="follow_up_trans_info_1">').appendTo('#order_form');
819       $('<input type="hidden" name="follow_up_trans_subject_1" id="follow_up_trans_subject_1">').appendTo('#order_form');
820     }
821     $('#follow_up_rowcount').val(1);
822     $('#follow_up_trans_id_1').val(id);
823     $('#follow_up_trans_type_1').val(type);
824     $('#follow_up_trans_info_1').val(info);
825     $('#follow_up_trans_subject_1').val($('#order_transaction_description').val());
826
827     follow_up_window();
828   };
829
830 });
831
832 $(function() {
833   if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
834     $('#order_customer_id').change(kivi.Order.reload_cv_dependent_selections);
835   } else {
836     $('#order_vendor_id').change(kivi.Order.reload_cv_dependent_selections);
837   }
838
839   $('#order_currency_id').change(kivi.Order.update_exchangerate);
840   $('#order_transdate_as_date').change(kivi.Order.update_exchangerate);
841   $('#order_exchangerate_as_null_number').change(kivi.Order.exchangerate_changed);
842
843   if ($('#type').val() == 'sales_order' || $('#type').val() == 'sales_quotation' ) {
844     $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.sellprice, -2)) });
845   } else {
846     $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.lastcost, -2)) });
847   }
848   $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_description').val(o.description) });
849   $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_unit').val(o.unit) });
850
851   $('.add_item_input').keydown(function(event) {
852     if (event.keyCode == 13) {
853       event.preventDefault();
854       kivi.Order.add_item();
855       return false;
856     }
857   });
858
859   kivi.Order.init_row_handlers();
860
861   $('#row_table_id').on('sortstop', function(event, ui) {
862     $('#row_table_id thead a img').remove();
863     kivi.Order.renumber_positions();
864   });
865
866   $('#expand_all').on('click', function(event) {
867     event.preventDefault();
868     if ($('#expand_all').data('expanded') == 1) {
869       $('#expand_all').data('expanded', 0);
870       $('#expand_all').attr('src', 'image/expand.svg');
871       $('#expand_all').attr('alt', kivi.t8('Show all details'));
872       $('#expand_all').attr('title', kivi.t8('Show all details'));
873       $('.row_entry').each(function(idx, elt) {
874         kivi.Order.hide_second_row(elt);
875       });
876     } else {
877       $('#expand_all').data('expanded', 1);
878       $('#expand_all').attr('src', "image/collapse.svg");
879       $('#expand_all').attr('alt', kivi.t8('Hide all details'));
880       $('#expand_all').attr('title', kivi.t8('Hide all details'));
881       kivi.Order.load_all_second_rows();
882       $('.row_entry').each(function(idx, elt) {
883         kivi.Order.show_second_row(elt);
884       });
885     }
886     return false;
887   });
888
889   $('.reformat_number_as_null_number').change(kivi.Order.reformat_number_as_null_number);
890
891 });