91 |
91 |
|
92 |
92 |
$self->render(
|
93 |
93 |
'order/form',
|
94 |
|
title => $self->get_title_for('add'),
|
|
94 |
title => $self->type_data->text('add'),
|
95 |
95 |
%{$self->{template_args}}
|
96 |
96 |
);
|
97 |
97 |
}
|
... | ... | |
119 |
119 |
|
120 |
120 |
$self->render(
|
121 |
121 |
'order/form',
|
122 |
|
title => $self->get_title_for('edit'),
|
|
122 |
title => $self->type_data->text('edit'),
|
123 |
123 |
%{$self->{template_args}}
|
124 |
124 |
);
|
125 |
125 |
}
|
... | ... | |
159 |
159 |
$self->pre_render();
|
160 |
160 |
$self->render(
|
161 |
161 |
'order/form',
|
162 |
|
title => $self->get_title_for('edit'),
|
|
162 |
title => $self->type_data->text('edit'),
|
163 |
163 |
%{$self->{template_args}}
|
164 |
164 |
);
|
165 |
165 |
}
|
... | ... | |
492 |
492 |
email_form => $email_form,
|
493 |
493 |
show_bcc => $::auth->assert('email_bcc', 'may fail'),
|
494 |
494 |
FILES => \%files,
|
495 |
|
is_customer => $self->cv eq 'customer',
|
|
495 |
is_customer => $self->type_data->properties('is_customer'),
|
496 |
496 |
ALL_EMPLOYEES => \@employees_with_email,
|
497 |
497 |
ALL_PARTNER_EMAIL_ADDRESSES => $all_partner_email_addresses,
|
498 |
498 |
is_final_version => $self->is_final_version,
|
... | ... | |
926 |
926 |
|
927 |
927 |
$self->render(
|
928 |
928 |
'order/form',
|
929 |
|
title => $self->get_title_for('edit'),
|
|
929 |
title => $self->type_data->text('edit'),
|
930 |
930 |
%{$self->{template_args}}
|
931 |
931 |
);
|
932 |
932 |
}
|
... | ... | |
986 |
986 |
sub action_show_customer_vendor_details_dialog {
|
987 |
987 |
my ($self) = @_;
|
988 |
988 |
|
989 |
|
my $is_customer = 'customer' eq $::form->{vc};
|
|
989 |
my $is_customer = $self->type_data->properties('is_customer');
|
990 |
990 |
my $cv;
|
991 |
991 |
if ($is_customer) {
|
992 |
992 |
$cv = SL::DB::Customer->new(id => $::form->{vc_id})->load;
|
... | ... | |
1330 |
1330 |
|
1331 |
1331 |
$self->render(
|
1332 |
1332 |
'order/form',
|
1333 |
|
title => $self->get_title_for('edit'),
|
|
1333 |
title => $self->type_data->text('edit'),
|
1334 |
1334 |
%{$self->{template_args}}
|
1335 |
1335 |
);
|
1336 |
1336 |
|
... | ... | |
1649 |
1649 |
sub init_cv {
|
1650 |
1650 |
my ($self) = @_;
|
1651 |
1651 |
|
1652 |
|
my $cv = (any { $self->type eq $_ } (SALES_ORDER_INTAKE_TYPE(), SALES_ORDER_TYPE(), SALES_QUOTATION_TYPE())) ? 'customer'
|
1653 |
|
: (any { $self->type eq $_ } (PURCHASE_ORDER_TYPE(), REQUEST_QUOTATION_TYPE(), PURCHASE_QUOTATION_INTAKE_TYPE())) ? 'vendor'
|
1654 |
|
: die "Not a valid type for order";
|
1655 |
|
|
1656 |
|
return $cv;
|
|
1652 |
return $self->type_data->properties('customervendor');
|
1657 |
1653 |
}
|
1658 |
1654 |
|
1659 |
1655 |
sub init_search_cvpartnumber {
|
... | ... | |
1687 |
1683 |
|
1688 |
1684 |
sub init_part_picker_classification_ids {
|
1689 |
1685 |
my ($self) = @_;
|
1690 |
|
my $attribute = 'used_for_' . ($self->type =~ m{sales} ? 'sale' : 'purchase');
|
1691 |
1686 |
|
1692 |
|
return [ map { $_->id } @{ SL::DB::Manager::PartClassification->get_all(where => [ $attribute => 1 ]) } ];
|
|
1687 |
return [ map { $_->id } @{ SL::DB::Manager::PartClassification->get_all(
|
|
1688 |
where => $self->type_data->part_classification_query()) } ];
|
1693 |
1689 |
}
|
1694 |
1690 |
|
1695 |
1691 |
sub init_is_final_version {
|
... | ... | |
1708 |
1704 |
|
1709 |
1705 |
sub check_auth {
|
1710 |
1706 |
my ($self) = @_;
|
1711 |
|
|
1712 |
|
my $right_for = { map { $_ => $_.'_edit' . ' | ' . $_.'_view' } @{$self->valid_types} };
|
1713 |
|
$right_for->{ SALES_ORDER_INTAKE_TYPE() } = 'sales_order_edit | sales_order_view';
|
1714 |
|
$right_for->{ PURCHASE_QUOTATION_INTAKE_TYPE() } = 'request_quotation_edit | request_quotation_view';
|
1715 |
|
|
1716 |
|
my $right = $right_for->{ $self->type };
|
1717 |
|
$right ||= 'DOES_NOT_EXIST';
|
1718 |
|
|
1719 |
|
$::auth->assert($right);
|
|
1707 |
$::auth->assert($self->type_data->rights('view'));
|
1720 |
1708 |
}
|
1721 |
1709 |
|
1722 |
1710 |
sub check_auth_for_edit {
|
1723 |
1711 |
my ($self) = @_;
|
1724 |
|
|
1725 |
|
my $right_for = { map { $_ => $_.'_edit' } @{$self->valid_types} };
|
1726 |
|
$right_for->{ SALES_ORDER_INTAKE_TYPE() } = 'sales_order_edit';
|
1727 |
|
$right_for->{ PURCHASE_QUOTATION_INTAKE_TYPE() } = 'request_quotation_edit';
|
1728 |
|
|
1729 |
|
my $right = $right_for->{ $self->type };
|
1730 |
|
$right ||= 'DOES_NOT_EXIST';
|
1731 |
|
|
1732 |
|
$::auth->assert($right);
|
|
1712 |
$::auth->assert($self->type_data->rights('edit'));
|
1733 |
1713 |
}
|
1734 |
1714 |
|
1735 |
1715 |
# build the selection box for contacts
|
... | ... | |
2242 |
2222 |
sub setup_edit_action_bar {
|
2243 |
2223 |
my ($self, %params) = @_;
|
2244 |
2224 |
|
2245 |
|
my $deletion_allowed = (any { $self->type eq $_ } (SALES_QUOTATION_TYPE(), REQUEST_QUOTATION_TYPE(), PURCHASE_QUOTATION_INTAKE_TYPE()))
|
2246 |
|
|| (($self->type eq SALES_ORDER_TYPE()) && $::instance_conf->get_sales_order_show_delete)
|
2247 |
|
|| (($self->type eq SALES_ORDER_INTAKE_TYPE()) && $::instance_conf->get_sales_order_show_delete)
|
2248 |
|
|| (($self->type eq PURCHASE_ORDER_TYPE()) && $::instance_conf->get_purchase_order_show_delete);
|
2249 |
|
|
2250 |
2225 |
my @req_trans_cost_art = qw(kivi.Order.check_transport_cost_article_presence) x!!$::instance_conf->get_transport_cost_reminder_article_number_id;
|
2251 |
2226 |
my @req_cusordnumber = qw(kivi.Order.check_cusordnumber_presence) x(( any {$self->type eq $_} (SALES_ORDER_INTAKE_TYPE(), SALES_ORDER_TYPE()) ) && $::instance_conf->get_order_warn_no_cusordnumber);
|
2252 |
2227 |
|
... | ... | |
2262 |
2237 |
$has_final_invoice = any {'SL::DB::Invoice' eq ref $_ && "final_invoice" eq $_->type} @$lr;
|
2263 |
2238 |
}
|
2264 |
2239 |
|
2265 |
|
my $right_for = { map { $_ => $_.'_edit' } @{$self->valid_types} };
|
2266 |
|
$right_for->{ SALES_ORDER_INTAKE_TYPE() } = 'sales_order_edit';
|
2267 |
|
$right_for->{ PURCHASE_QUOTATION_INTAKE_TYPE() } = 'request_quotation_edit';
|
2268 |
|
my $right = $right_for->{ $self->type };
|
2269 |
|
$right ||= 'DOES_NOT_EXIST';
|
2270 |
|
my $may_edit_create = $::auth->assert($right, 'may fail');
|
|
2240 |
my $may_edit_create = $::auth->assert($self->type_data->rights('edit'), 'may fail');
|
2271 |
2241 |
|
2272 |
2242 |
my $is_final_version = $self->is_final_version;
|
2273 |
2243 |
|
... | ... | |
2329 |
2299 |
t8('Save and Quotation'),
|
2330 |
2300 |
call => [ 'kivi.submit_ajax_form', $self->url_for(action => "save_and_order_workflow", to_type => SALES_QUOTATION_TYPE()), '#order_form' ],
|
2331 |
2301 |
checks => [ @req_trans_cost_art, @req_cusordnumber ],
|
2332 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_INTAKE_TYPE(), SALES_ORDER_TYPE(), REQUEST_QUOTATION_TYPE(), PURCHASE_QUOTATION_INTAKE_TYPE())),
|
|
2302 |
only_if => $self->type_data->show_menu('save_and_quotation'),
|
2333 |
2303 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2334 |
2304 |
],
|
2335 |
2305 |
action => [
|
2336 |
2306 |
t8('Save and RFQ'),
|
2337 |
2307 |
call => [ 'kivi.Order.purchase_check_for_direct_delivery', { to_type => REQUEST_QUOTATION_TYPE() } ],
|
2338 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_INTAKE_TYPE(), SALES_ORDER_TYPE(), SALES_QUOTATION_TYPE(), PURCHASE_ORDER_TYPE())),
|
|
2308 |
only_if => $self->type_data->show_menu('save_and_rfq'),
|
2339 |
2309 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2340 |
2310 |
],
|
2341 |
2311 |
action => [
|
... | ... | |
2354 |
2324 |
t8('Save and Sales Order Confirmation'),
|
2355 |
2325 |
call => [ 'kivi.submit_ajax_form', $self->url_for(action => "save_and_order_workflow", to_type => SALES_ORDER_TYPE()), '#order_form' ],
|
2356 |
2326 |
checks => [ @req_trans_cost_art ],
|
2357 |
|
only_if => (any { $self->type eq $_ } (SALES_QUOTATION_TYPE(), SALES_ORDER_INTAKE_TYPE(), REQUEST_QUOTATION_TYPE(), PURCHASE_ORDER_TYPE(), PURCHASE_QUOTATION_INTAKE_TYPE())),
|
|
2327 |
only_if => $self->type_data->show_menu('save_and_sales_order'),
|
2358 |
2328 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2359 |
2329 |
],
|
2360 |
2330 |
action => [
|
2361 |
2331 |
t8('Save and Purchase Order'),
|
2362 |
2332 |
call => [ 'kivi.Order.purchase_check_for_direct_delivery', { to_type => PURCHASE_ORDER_TYPE() } ],
|
2363 |
2333 |
checks => [ @req_trans_cost_art, @req_cusordnumber ],
|
2364 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_INTAKE_TYPE(), SALES_ORDER_TYPE(), REQUEST_QUOTATION_TYPE(), PURCHASE_QUOTATION_INTAKE_TYPE())),
|
|
2334 |
only_if => $self->type_data->show_menu('save_and_purchase_order'),
|
2365 |
2335 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2366 |
2336 |
],
|
2367 |
2337 |
action => [
|
... | ... | |
2373 |
2343 |
checks => [ 'kivi.Order.check_save_active_periodic_invoices',
|
2374 |
2344 |
@req_trans_cost_art, @req_cusordnumber,
|
2375 |
2345 |
],
|
2376 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE(), PURCHASE_ORDER_TYPE())),
|
|
2346 |
only_if => $self->type_data->show_menu('save_and_delivery_order'),
|
2377 |
2347 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2378 |
2348 |
],
|
2379 |
2349 |
action => [
|
... | ... | |
2396 |
2366 |
checks => [ 'kivi.Order.check_save_active_periodic_invoices',
|
2397 |
2367 |
@req_trans_cost_art, @req_cusordnumber,
|
2398 |
2368 |
],
|
2399 |
|
only_if => (any { $self->type eq $_ } (PURCHASE_ORDER_TYPE())),
|
|
2369 |
only_if => $self->type_data->show_menu('save_and_supplier_delivery_order'),
|
2400 |
2370 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2401 |
2371 |
],
|
2402 |
2372 |
action => [
|
... | ... | |
2404 |
2374 |
call => [ 'kivi.Order.save', { action => 'save_and_reclamation',
|
2405 |
2375 |
warn_on_duplicates => $::instance_conf->get_order_warn_duplicate_parts },
|
2406 |
2376 |
],
|
2407 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE(), PURCHASE_ORDER_TYPE()))
|
|
2377 |
only_if =>$self->type_data->show_menu('save_and_reclamation')
|
2408 |
2378 |
],
|
2409 |
2379 |
action => [
|
2410 |
2380 |
t8('Save and Invoice'),
|
... | ... | |
2415 |
2385 |
@req_trans_cost_art, @req_cusordnumber,
|
2416 |
2386 |
],
|
2417 |
2387 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2418 |
|
not_if => (any { $self->type eq $_ } (SALES_ORDER_INTAKE_TYPE(), PURCHASE_QUOTATION_INTAKE_TYPE())),
|
|
2388 |
only_if => $self->type_data->show_menu('save_and_invoice'),
|
2419 |
2389 |
],
|
2420 |
2390 |
action => [
|
2421 |
2391 |
($has_invoice_for_advance_payment ? t8('Save and Further Invoice for Advance Payment') : t8('Save and Invoice for Advance Payment')),
|
... | ... | |
2428 |
2398 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.')
|
2429 |
2399 |
: $has_final_invoice ? t8('This order has already a final invoice.')
|
2430 |
2400 |
: undef,
|
2431 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE())),
|
|
2401 |
only_if => $self->type_data->show_menu('save_and_invoice_for_advance_payment'),
|
2432 |
2402 |
],
|
2433 |
2403 |
action => [
|
2434 |
2404 |
t8('Save and Final Invoice'),
|
... | ... | |
2441 |
2411 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.')
|
2442 |
2412 |
: $has_final_invoice ? t8('This order has already a final invoice.')
|
2443 |
2413 |
: undef,
|
2444 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE())) && $has_invoice_for_advance_payment,
|
|
2414 |
only_if => $self->type_data->show_menu('save_and_final_invoice') && $has_invoice_for_advance_payment,
|
2445 |
2415 |
],
|
2446 |
2416 |
action => [
|
2447 |
2417 |
t8('Save and AP Transaction'),
|
2448 |
2418 |
call => [ 'kivi.Order.save', { action => 'save_and_ap_transaction',
|
2449 |
2419 |
warn_on_duplicates => $::instance_conf->get_order_warn_duplicate_parts },
|
2450 |
2420 |
],
|
2451 |
|
only_if => (any { $self->type eq $_ } (PURCHASE_ORDER_TYPE())),
|
|
2421 |
only_if => $self->type_data->show_menu('save_and_ap_transaction'),
|
2452 |
2422 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2453 |
2423 |
],
|
2454 |
2424 |
|
... | ... | |
2503 |
2473 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.')
|
2504 |
2474 |
: !$self->order->id ? t8('This object has not been saved yet.')
|
2505 |
2475 |
: undef,
|
2506 |
|
only_if => $deletion_allowed,
|
|
2476 |
only_if => $self->type_data->show_menu('delete'),
|
2507 |
2477 |
],
|
2508 |
2478 |
|
2509 |
2479 |
combobox => [
|
... | ... | |
2648 |
2618 |
return $active ? t8('active') : t8('inactive');
|
2649 |
2619 |
}
|
2650 |
2620 |
|
2651 |
|
sub get_title_for {
|
2652 |
|
my ($self, $action) = @_;
|
2653 |
|
|
2654 |
|
return '' if none { lc($action)} qw(add edit);
|
2655 |
|
|
2656 |
|
# for locales:
|
2657 |
|
# $::locale->text("Add Sales Order Intake");
|
2658 |
|
# $::locale->text("Add Sales Order");
|
2659 |
|
# $::locale->text("Add Purchase Order");
|
2660 |
|
# $::locale->text("Add Quotation");
|
2661 |
|
# $::locale->text("Add Request for Quotation");
|
2662 |
|
# $::locale->text("Add Purchase Quotation Intake");
|
2663 |
|
# $::locale->text("Edit Sales Order Intake");
|
2664 |
|
# $::locale->text("Edit Sales Order");
|
2665 |
|
# $::locale->text("Edit Purchase Order");
|
2666 |
|
# $::locale->text("Edit Quotation");
|
2667 |
|
# $::locale->text("Edit Request for Quotation");
|
2668 |
|
# $::locale->text("Edit Purchase Quotation Intake");
|
2669 |
|
|
2670 |
|
$action = ucfirst(lc($action));
|
2671 |
|
return $self->type eq SALES_ORDER_INTAKE_TYPE() ? $::locale->text("$action Sales Order Intake")
|
2672 |
|
: $self->type eq SALES_ORDER_TYPE() ? $::locale->text("$action Sales Order")
|
2673 |
|
: $self->type eq PURCHASE_ORDER_TYPE() ? $::locale->text("$action Purchase Order")
|
2674 |
|
: $self->type eq SALES_QUOTATION_TYPE() ? $::locale->text("$action Quotation")
|
2675 |
|
: $self->type eq REQUEST_QUOTATION_TYPE() ? $::locale->text("$action Request for Quotation")
|
2676 |
|
: $self->type eq PURCHASE_QUOTATION_INTAKE_TYPE() ? $::locale->text("$action Purchase Quotation Intake")
|
2677 |
|
: '';
|
2678 |
|
}
|
2679 |
|
|
2680 |
2621 |
sub get_item_cvpartnumber {
|
2681 |
2622 |
my ($self, $item) = @_;
|
2682 |
2623 |
|
... | ... | |
2752 |
2693 |
}
|
2753 |
2694 |
|
2754 |
2695 |
sub nr_key {
|
2755 |
|
return $_[0]->type eq SALES_ORDER_INTAKE_TYPE() ? 'ordnumber'
|
2756 |
|
: $_[0]->type eq SALES_ORDER_TYPE() ? 'ordnumber'
|
2757 |
|
: $_[0]->type eq PURCHASE_ORDER_TYPE() ? 'ordnumber'
|
2758 |
|
: $_[0]->type eq SALES_QUOTATION_TYPE() ? 'quonumber'
|
2759 |
|
: $_[0]->type eq REQUEST_QUOTATION_TYPE() ? 'quonumber'
|
2760 |
|
: $_[0]->type eq PURCHASE_QUOTATION_INTAKE_TYPE() ? 'quonumber'
|
2761 |
|
: '';
|
|
2696 |
my ($self) = @_;
|
|
2697 |
|
|
2698 |
return $self->type_data->properties('nr_key');
|
2762 |
2699 |
}
|
2763 |
2700 |
|
2764 |
2701 |
sub save_and_redirect_to {
|
... | ... | |
2766 |
2703 |
|
2767 |
2704 |
$self->save();
|
2768 |
2705 |
|
2769 |
|
my $text = $self->type eq SALES_ORDER_INTAKE_TYPE() ? $::locale->text('The order intake has been saved')
|
2770 |
|
: $self->type eq SALES_ORDER_TYPE() ? $::locale->text('The order confirmation has been saved')
|
2771 |
|
: $self->type eq PURCHASE_ORDER_TYPE() ? $::locale->text('The order has been saved')
|
2772 |
|
: $self->type eq SALES_QUOTATION_TYPE() ? $::locale->text('The quotation has been saved')
|
2773 |
|
: $self->type eq REQUEST_QUOTATION_TYPE() ? $::locale->text('The rfq has been saved')
|
2774 |
|
: $self->type eq PURCHASE_QUOTATION_INTAKE_TYPE() ? $::locale->text('The quotation intake has been saved')
|
2775 |
|
: '';
|
2776 |
|
flash_later('info', $text);
|
|
2706 |
flash_later('info', $self->type_data->text('saved'));
|
2777 |
2707 |
|
2778 |
2708 |
$self->redirect_to(%params, id => $self->order->id);
|
2779 |
2709 |
}
|
Order: nutze TypeData