90 |
90 |
|
91 |
91 |
$self->render(
|
92 |
92 |
'order/form',
|
93 |
|
title => $self->get_title_for('add'),
|
|
93 |
title => $self->type_data->text('add'),
|
94 |
94 |
%{$self->{template_args}}
|
95 |
95 |
);
|
96 |
96 |
}
|
... | ... | |
118 |
118 |
|
119 |
119 |
$self->render(
|
120 |
120 |
'order/form',
|
121 |
|
title => $self->get_title_for('edit'),
|
|
121 |
title => $self->type_data->text('edit'),
|
122 |
122 |
%{$self->{template_args}}
|
123 |
123 |
);
|
124 |
124 |
}
|
... | ... | |
151 |
151 |
$self->pre_render();
|
152 |
152 |
$self->render(
|
153 |
153 |
'order/form',
|
154 |
|
title => $self->get_title_for('edit'),
|
|
154 |
title => $self->type_data->text('edit'),
|
155 |
155 |
%{$self->{template_args}}
|
156 |
156 |
);
|
157 |
157 |
}
|
... | ... | |
480 |
480 |
email_form => $email_form,
|
481 |
481 |
show_bcc => $::auth->assert('email_bcc', 'may fail'),
|
482 |
482 |
FILES => \%files,
|
483 |
|
is_customer => $self->cv eq 'customer',
|
|
483 |
is_customer => $self->type_data->properties('is_customer'),
|
484 |
484 |
ALL_EMPLOYEES => \@employees_with_email,
|
485 |
485 |
ALL_PARTNER_EMAIL_ADDRESSES => $all_partner_email_addresses,
|
486 |
486 |
is_final_version => $self->is_final_version,
|
... | ... | |
907 |
907 |
|
908 |
908 |
$self->render(
|
909 |
909 |
'order/form',
|
910 |
|
title => $self->get_title_for('edit'),
|
|
910 |
title => $self->type_data->text('edit'),
|
911 |
911 |
%{$self->{template_args}}
|
912 |
912 |
);
|
913 |
913 |
}
|
... | ... | |
967 |
967 |
sub action_show_customer_vendor_details_dialog {
|
968 |
968 |
my ($self) = @_;
|
969 |
969 |
|
970 |
|
my $is_customer = 'customer' eq $::form->{vc};
|
|
970 |
my $is_customer = $self->type_data->properties('is_customer');
|
971 |
971 |
my $cv;
|
972 |
972 |
if ($is_customer) {
|
973 |
973 |
$cv = SL::DB::Customer->new(id => $::form->{vc_id})->load;
|
... | ... | |
1307 |
1307 |
|
1308 |
1308 |
$self->render(
|
1309 |
1309 |
'order/form',
|
1310 |
|
title => $self->get_title_for('edit'),
|
|
1310 |
title => $self->type_data->text('edit'),
|
1311 |
1311 |
%{$self->{template_args}}
|
1312 |
1312 |
);
|
1313 |
1313 |
|
... | ... | |
1597 |
1597 |
sub init_cv {
|
1598 |
1598 |
my ($self) = @_;
|
1599 |
1599 |
|
1600 |
|
my $cv = (any { $self->type eq $_ } (SALES_ORDER_TYPE(), SALES_QUOTATION_TYPE())) ? 'customer'
|
1601 |
|
: (any { $self->type eq $_ } (PURCHASE_ORDER_TYPE(), REQUEST_QUOTATION_TYPE())) ? 'vendor'
|
1602 |
|
: die "Not a valid type for order";
|
1603 |
|
|
1604 |
|
return $cv;
|
|
1600 |
return $self->type_data->properties('customervendor');
|
1605 |
1601 |
}
|
1606 |
1602 |
|
1607 |
1603 |
sub init_search_cvpartnumber {
|
... | ... | |
1635 |
1631 |
|
1636 |
1632 |
sub init_part_picker_classification_ids {
|
1637 |
1633 |
my ($self) = @_;
|
1638 |
|
my $attribute = 'used_for_' . ($self->type =~ m{sales} ? 'sale' : 'purchase');
|
1639 |
1634 |
|
1640 |
|
return [ map { $_->id } @{ SL::DB::Manager::PartClassification->get_all(where => [ $attribute => 1 ]) } ];
|
|
1635 |
return [ map { $_->id } @{ SL::DB::Manager::PartClassification->get_all(
|
|
1636 |
where => $self->type_data->part_classification_query()) } ];
|
1641 |
1637 |
}
|
1642 |
1638 |
|
1643 |
1639 |
sub init_is_final_version {
|
... | ... | |
1656 |
1652 |
|
1657 |
1653 |
sub check_auth {
|
1658 |
1654 |
my ($self) = @_;
|
1659 |
|
|
1660 |
|
my $right_for = { map { $_ => $_.'_edit' . ' | ' . $_.'_view' } @{$self->valid_types} };
|
1661 |
|
|
1662 |
|
my $right = $right_for->{ $self->type };
|
1663 |
|
$right ||= 'DOES_NOT_EXIST';
|
1664 |
|
|
1665 |
|
$::auth->assert($right);
|
|
1655 |
$::auth->assert($self->type_data->rights('view'));
|
1666 |
1656 |
}
|
1667 |
1657 |
|
1668 |
1658 |
sub check_auth_for_edit {
|
1669 |
1659 |
my ($self) = @_;
|
1670 |
|
|
1671 |
|
my $right_for = { map { $_ => $_.'_edit' } @{$self->valid_types} };
|
1672 |
|
|
1673 |
|
my $right = $right_for->{ $self->type };
|
1674 |
|
$right ||= 'DOES_NOT_EXIST';
|
1675 |
|
|
1676 |
|
$::auth->assert($right);
|
|
1660 |
$::auth->assert($self->type_data->rights('edit'));
|
1677 |
1661 |
}
|
1678 |
1662 |
|
1679 |
1663 |
# build the selection box for contacts
|
... | ... | |
2173 |
2157 |
sub setup_edit_action_bar {
|
2174 |
2158 |
my ($self, %params) = @_;
|
2175 |
2159 |
|
2176 |
|
my $deletion_allowed = (any { $self->type eq $_ } (SALES_QUOTATION_TYPE(), REQUEST_QUOTATION_TYPE()))
|
2177 |
|
|| (($self->type eq SALES_ORDER_TYPE()) && $::instance_conf->get_sales_order_show_delete)
|
2178 |
|
|| (($self->type eq PURCHASE_ORDER_TYPE()) && $::instance_conf->get_purchase_order_show_delete);
|
2179 |
|
|
2180 |
2160 |
my @req_trans_cost_art = qw(kivi.Order.check_transport_cost_article_presence) x!!$::instance_conf->get_transport_cost_reminder_article_number_id;
|
2181 |
2161 |
my @req_cusordnumber = qw(kivi.Order.check_cusordnumber_presence) x($self->type eq SALES_ORDER_TYPE() && $::instance_conf->get_order_warn_no_cusordnumber);
|
2182 |
2162 |
|
... | ... | |
2192 |
2172 |
$has_final_invoice = any {'SL::DB::Invoice' eq ref $_ && "final_invoice" eq $_->type} @$lr;
|
2193 |
2173 |
}
|
2194 |
2174 |
|
2195 |
|
my $right_for = { map { $_ => $_.'_edit' } @{$self->valid_types} };
|
2196 |
|
my $right = $right_for->{ $self->type };
|
2197 |
|
$right ||= 'DOES_NOT_EXIST';
|
2198 |
|
my $may_edit_create = $::auth->assert($right, 'may fail');
|
|
2175 |
my $may_edit_create = $::auth->assert($self->type_data->rights('edit'), 'may fail');
|
2199 |
2176 |
|
2200 |
2177 |
my $is_final_version = $self->is_final_version;
|
2201 |
2178 |
|
... | ... | |
2257 |
2234 |
t8('Save and Quotation'),
|
2258 |
2235 |
call => [ 'kivi.submit_ajax_form', $self->url_for(action => "save_and_order_workflow", to_type => SALES_QUOTATION_TYPE()), '#order_form' ],
|
2259 |
2236 |
checks => [ @req_trans_cost_art, @req_cusordnumber ],
|
2260 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE(), REQUEST_QUOTATION_TYPE())),
|
|
2237 |
only_if => $self->type_data->show_menu('save_and_quotation'),
|
2261 |
2238 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2262 |
2239 |
],
|
2263 |
2240 |
action => [
|
2264 |
2241 |
t8('Save and RFQ'),
|
2265 |
2242 |
call => [ 'kivi.Order.purchase_check_for_direct_delivery', { to_type => REQUEST_QUOTATION_TYPE() } ],
|
2266 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE(), SALES_QUOTATION_TYPE(), PURCHASE_ORDER_TYPE())),
|
|
2243 |
only_if => $self->type_data->show_menu('save_and_rfq'),
|
2267 |
2244 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2268 |
2245 |
],
|
2269 |
2246 |
action => [
|
2270 |
2247 |
t8('Save and Sales Order'),
|
2271 |
2248 |
call => [ 'kivi.submit_ajax_form', $self->url_for(action => "save_and_order_workflow", to_type => SALES_ORDER_TYPE()), '#order_form' ],
|
2272 |
2249 |
checks => [ @req_trans_cost_art ],
|
2273 |
|
only_if => (any { $self->type eq $_ } (SALES_QUOTATION_TYPE(), REQUEST_QUOTATION_TYPE(), PURCHASE_ORDER_TYPE())),
|
|
2250 |
only_if => $self->type_data->show_menu('save_and_sales_order'),
|
2274 |
2251 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2275 |
2252 |
],
|
2276 |
2253 |
action => [
|
2277 |
2254 |
t8('Save and Purchase Order'),
|
2278 |
2255 |
call => [ 'kivi.Order.purchase_check_for_direct_delivery', { to_type => PURCHASE_ORDER_TYPE() } ],
|
2279 |
2256 |
checks => [ @req_trans_cost_art, @req_cusordnumber ],
|
2280 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE(), REQUEST_QUOTATION_TYPE())),
|
|
2257 |
only_if => $self->type_data->show_menu('save_and_purchase_order'),
|
2281 |
2258 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2282 |
2259 |
],
|
2283 |
2260 |
action => [
|
... | ... | |
2289 |
2266 |
checks => [ 'kivi.Order.check_save_active_periodic_invoices',
|
2290 |
2267 |
@req_trans_cost_art, @req_cusordnumber,
|
2291 |
2268 |
],
|
2292 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE(), PURCHASE_ORDER_TYPE())),
|
|
2269 |
only_if => $self->type_data->show_menu('save_and_delivery_order'),
|
2293 |
2270 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2294 |
2271 |
],
|
2295 |
2272 |
action => [
|
... | ... | |
2301 |
2278 |
checks => [ 'kivi.Order.check_save_active_periodic_invoices',
|
2302 |
2279 |
@req_trans_cost_art, @req_cusordnumber,
|
2303 |
2280 |
],
|
2304 |
|
only_if => (any { $self->type eq $_ } (PURCHASE_ORDER_TYPE())),
|
|
2281 |
only_if => $self->type_data->show_menu('save_and_supplier_delivery_order'),
|
2305 |
2282 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2306 |
2283 |
],
|
2307 |
2284 |
action => [
|
... | ... | |
2309 |
2286 |
call => [ 'kivi.Order.save', { action => 'save_and_reclamation',
|
2310 |
2287 |
warn_on_duplicates => $::instance_conf->get_order_warn_duplicate_parts },
|
2311 |
2288 |
],
|
2312 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE(), PURCHASE_ORDER_TYPE()))
|
|
2289 |
only_if =>$self->type_data->show_menu('save_and_reclamation')
|
2313 |
2290 |
],
|
2314 |
2291 |
action => [
|
2315 |
2292 |
t8('Save and Invoice'),
|
... | ... | |
2320 |
2297 |
@req_trans_cost_art, @req_cusordnumber,
|
2321 |
2298 |
],
|
2322 |
2299 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
|
2300 |
only_if => $self->type_data->show_menu('save_and_invoice'),
|
2323 |
2301 |
],
|
2324 |
2302 |
action => [
|
2325 |
2303 |
($has_invoice_for_advance_payment ? t8('Save and Further Invoice for Advance Payment') : t8('Save and Invoice for Advance Payment')),
|
... | ... | |
2332 |
2310 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.')
|
2333 |
2311 |
: $has_final_invoice ? t8('This order has already a final invoice.')
|
2334 |
2312 |
: undef,
|
2335 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE())),
|
|
2313 |
only_if => $self->type_data->show_menu('save_and_invoice_for_advance_payment'),
|
2336 |
2314 |
],
|
2337 |
2315 |
action => [
|
2338 |
2316 |
t8('Save and Final Invoice'),
|
... | ... | |
2345 |
2323 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.')
|
2346 |
2324 |
: $has_final_invoice ? t8('This order has already a final invoice.')
|
2347 |
2325 |
: undef,
|
2348 |
|
only_if => (any { $self->type eq $_ } (SALES_ORDER_TYPE())) && $has_invoice_for_advance_payment,
|
|
2326 |
only_if => $self->type_data->show_menu('save_and_final_invoice') && $has_invoice_for_advance_payment,
|
2349 |
2327 |
],
|
2350 |
2328 |
action => [
|
2351 |
2329 |
t8('Save and AP Transaction'),
|
2352 |
2330 |
call => [ 'kivi.Order.save', { action => 'save_and_ap_transaction',
|
2353 |
2331 |
warn_on_duplicates => $::instance_conf->get_order_warn_duplicate_parts },
|
2354 |
2332 |
],
|
2355 |
|
only_if => (any { $self->type eq $_ } (PURCHASE_ORDER_TYPE())),
|
|
2333 |
only_if => $self->type_data->show_menu('save_and_ap_transaction'),
|
2356 |
2334 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.') : undef,
|
2357 |
2335 |
],
|
2358 |
2336 |
|
... | ... | |
2407 |
2385 |
disabled => !$may_edit_create ? t8('You do not have the permissions to access this function.')
|
2408 |
2386 |
: !$self->order->id ? t8('This object has not been saved yet.')
|
2409 |
2387 |
: undef,
|
2410 |
|
only_if => $deletion_allowed,
|
|
2388 |
only_if => $self->type_data->show_menu('delete'),
|
2411 |
2389 |
],
|
2412 |
2390 |
|
2413 |
2391 |
combobox => [
|
... | ... | |
2552 |
2530 |
return $active ? t8('active') : t8('inactive');
|
2553 |
2531 |
}
|
2554 |
2532 |
|
2555 |
|
sub get_title_for {
|
2556 |
|
my ($self, $action) = @_;
|
2557 |
|
|
2558 |
|
return '' if none { lc($action)} qw(add edit);
|
2559 |
|
|
2560 |
|
# for locales:
|
2561 |
|
# $::locale->text("Add Sales Order");
|
2562 |
|
# $::locale->text("Add Purchase Order");
|
2563 |
|
# $::locale->text("Add Quotation");
|
2564 |
|
# $::locale->text("Add Request for Quotation");
|
2565 |
|
# $::locale->text("Edit Sales Order");
|
2566 |
|
# $::locale->text("Edit Purchase Order");
|
2567 |
|
# $::locale->text("Edit Quotation");
|
2568 |
|
# $::locale->text("Edit Request for Quotation");
|
2569 |
|
|
2570 |
|
$action = ucfirst(lc($action));
|
2571 |
|
return $self->type eq SALES_ORDER_TYPE() ? $::locale->text("$action Sales Order")
|
2572 |
|
: $self->type eq PURCHASE_ORDER_TYPE() ? $::locale->text("$action Purchase Order")
|
2573 |
|
: $self->type eq SALES_QUOTATION_TYPE() ? $::locale->text("$action Quotation")
|
2574 |
|
: $self->type eq REQUEST_QUOTATION_TYPE() ? $::locale->text("$action Request for Quotation")
|
2575 |
|
: '';
|
2576 |
|
}
|
2577 |
|
|
2578 |
2533 |
sub get_item_cvpartnumber {
|
2579 |
2534 |
my ($self, $item) = @_;
|
2580 |
2535 |
|
... | ... | |
2650 |
2605 |
}
|
2651 |
2606 |
|
2652 |
2607 |
sub nr_key {
|
2653 |
|
return $_[0]->type eq SALES_ORDER_TYPE() ? 'ordnumber'
|
2654 |
|
: $_[0]->type eq PURCHASE_ORDER_TYPE() ? 'ordnumber'
|
2655 |
|
: $_[0]->type eq SALES_QUOTATION_TYPE() ? 'quonumber'
|
2656 |
|
: $_[0]->type eq REQUEST_QUOTATION_TYPE() ? 'quonumber'
|
2657 |
|
: '';
|
|
2608 |
my ($self) = @_;
|
|
2609 |
|
|
2610 |
return $self->type_data->properties('nr_key');
|
2658 |
2611 |
}
|
2659 |
2612 |
|
2660 |
2613 |
sub save_and_redirect_to {
|
... | ... | |
2662 |
2615 |
|
2663 |
2616 |
$self->save();
|
2664 |
2617 |
|
2665 |
|
my $text = $self->type eq SALES_ORDER_TYPE() ? $::locale->text('The order has been saved')
|
2666 |
|
: $self->type eq PURCHASE_ORDER_TYPE() ? $::locale->text('The order has been saved')
|
2667 |
|
: $self->type eq SALES_QUOTATION_TYPE() ? $::locale->text('The quotation has been saved')
|
2668 |
|
: $self->type eq REQUEST_QUOTATION_TYPE() ? $::locale->text('The rfq has been saved')
|
2669 |
|
: '';
|
2670 |
|
flash_later('info', $text);
|
|
2618 |
flash_later('info', $self->type_data->text('saved'));
|
2671 |
2619 |
|
2672 |
2620 |
$self->redirect_to(%params, id => $self->order->id);
|
2673 |
2621 |
}
|
Order: nutze TypeData