Revision 5c859d64
Von Bernd Bleßmann vor etwa 7 Jahren hinzugefügt
SL/Controller/Order.pm | ||
---|---|---|
use parent qw(SL::Controller::Base);
|
||
|
||
use SL::Helper::Flash qw(flash_later);
|
||
use SL::Presenter::Tag qw(select_tag);
|
||
use SL::Presenter::Tag qw(select_tag hidden_tag);
|
||
use SL::Locale::String qw(t8);
|
||
use SL::SessionFile::Random;
|
||
use SL::PriceSource;
|
||
... | ... | |
|
||
use List::Util qw(first);
|
||
use List::UtilsBy qw(sort_by uniq_by);
|
||
use List::MoreUtils qw(none pairwise first_index);
|
||
use List::MoreUtils qw(any none pairwise first_index);
|
||
use English qw(-no_match_vars);
|
||
use File::Spec;
|
||
use Cwd;
|
||
... | ... | |
->render($self);
|
||
}
|
||
|
||
# open the periodic invoices config dialog
|
||
#
|
||
# If there are values in the form (i.e. dialog was opened before),
|
||
# then use this values. Create new ones, else.
|
||
sub action_show_periodic_invoices_config_dialog {
|
||
my ($self) = @_;
|
||
|
||
my $config = _make_periodic_invoices_config_from_yaml(delete $::form->{config});
|
||
$config ||= SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $::form->{id}) if $::form->{id};
|
||
$config ||= SL::DB::PeriodicInvoicesConfig->new(periodicity => 'm',
|
||
order_value_periodicity => 'p', # = same as periodicity
|
||
start_date_as_date => $::form->{transdate} || $::form->current_date,
|
||
extend_automatically_by => 12,
|
||
active => 1,
|
||
email_subject => GenericTranslations->get(
|
||
language_id => $::form->{language_id},
|
||
translation_type =>"preset_text_periodic_invoices_email_subject"),
|
||
email_body => GenericTranslations->get(
|
||
language_id => $::form->{language_id},
|
||
translation_type =>"preset_text_periodic_invoices_email_body"),
|
||
);
|
||
$config->periodicity('m') if none { $_ eq $config->periodicity } @SL::DB::PeriodicInvoicesConfig::PERIODICITIES;
|
||
$config->order_value_periodicity('p') if none { $_ eq $config->order_value_periodicity } ('p', @SL::DB::PeriodicInvoicesConfig::ORDER_VALUE_PERIODICITIES);
|
||
|
||
$::form->get_lists(printers => "ALL_PRINTERS",
|
||
charts => { key => 'ALL_CHARTS',
|
||
transdate => 'current_date' });
|
||
|
||
$::form->{AR} = [ grep { $_->{link} =~ m/(?:^|:)AR(?::|$)/ } @{ $::form->{ALL_CHARTS} } ];
|
||
|
||
if ($::form->{customer_id}) {
|
||
$::form->{ALL_CONTACTS} = SL::DB::Manager::Contact->get_all_sorted(where => [ cp_cv_id => $::form->{customer_id} ]);
|
||
}
|
||
|
||
$self->render('oe/edit_periodic_invoices_config', { layout => 0 },
|
||
popup_dialog => 1,
|
||
popup_js_close_function => 'kivi.Order.close_periodic_invoices_config_dialog()',
|
||
popup_js_assign_function => 'kivi.Order.assign_periodic_invoices_config()',
|
||
config => $config,
|
||
%$::form);
|
||
}
|
||
|
||
# assign the values of the periodic invoices config dialog
|
||
# as yaml in the hidden tag and set the status.
|
||
sub action_assign_periodic_invoices_config {
|
||
my ($self) = @_;
|
||
|
||
$::form->isblank('start_date_as_date', $::locale->text('The start date is missing.'));
|
||
|
||
my $config = { active => $::form->{active} ? 1 : 0,
|
||
terminated => $::form->{terminated} ? 1 : 0,
|
||
direct_debit => $::form->{direct_debit} ? 1 : 0,
|
||
periodicity => (any { $_ eq $::form->{periodicity} } @SL::DB::PeriodicInvoicesConfig::PERIODICITIES) ? $::form->{periodicity} : 'm',
|
||
order_value_periodicity => (any { $_ eq $::form->{order_value_periodicity} } ('p', @SL::DB::PeriodicInvoicesConfig::ORDER_VALUE_PERIODICITIES)) ? $::form->{order_value_periodicity} : 'p',
|
||
start_date_as_date => $::form->{start_date_as_date},
|
||
end_date_as_date => $::form->{end_date_as_date},
|
||
first_billing_date_as_date => $::form->{first_billing_date_as_date},
|
||
print => $::form->{print} ? 1 : 0,
|
||
printer_id => $::form->{print} ? $::form->{printer_id} * 1 : undef,
|
||
copies => $::form->{copies} * 1 ? $::form->{copies} : 1,
|
||
extend_automatically_by => $::form->{extend_automatically_by} * 1 || undef,
|
||
ar_chart_id => $::form->{ar_chart_id} * 1,
|
||
send_email => $::form->{send_email} ? 1 : 0,
|
||
email_recipient_contact_id => $::form->{email_recipient_contact_id} * 1 || undef,
|
||
email_recipient_address => $::form->{email_recipient_address},
|
||
email_sender => $::form->{email_sender},
|
||
email_subject => $::form->{email_subject},
|
||
email_body => $::form->{email_body},
|
||
};
|
||
|
||
my $periodic_invoices_config = YAML::Dump($config);
|
||
|
||
my $status = $self->_get_periodic_invoices_status($config);
|
||
|
||
$self->js
|
||
->remove('#order_periodic_invoices_config')
|
||
->insertAfter(hidden_tag('order.periodic_invoices_config', $periodic_invoices_config), '#periodic_invoices_status')
|
||
->run('kivi.Order.close_periodic_invoices_config_dialog')
|
||
->html('#periodic_invoices_status', $status)
|
||
->flash('info', t8('The periodic invoices config has been assigned.'))
|
||
->render($self);
|
||
}
|
||
|
||
sub action_get_has_active_periodic_invoices {
|
||
my ($self) = @_;
|
||
|
||
my $config = _make_periodic_invoices_config_from_yaml(delete $::form->{config});
|
||
$config ||= SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $::form->{id}) if $::form->{id};
|
||
|
||
my $has_active_periodic_invoices =
|
||
$self->type eq _sales_order_type()
|
||
&& $config
|
||
&& $config->active
|
||
&& (!$config->end_date || ($config->end_date > DateTime->today_local))
|
||
&& $config->get_previous_billed_period_start_date;
|
||
|
||
$_[0]->render(\ !!$has_active_periodic_invoices, { type => 'text' });
|
||
}
|
||
|
||
# save the order and redirect to the frontend subroutine for a new
|
||
# delivery order
|
||
sub action_save_and_delivery_order {
|
||
... | ... | |
|
||
# load or create a new order object
|
||
#
|
||
# And assign changes from the for to this object.
|
||
# And assign changes from the form to this object.
|
||
# If the order is loaded from db, check if items are deleted in the form,
|
||
# remove them form the object and collect them for removing from db on saving.
|
||
# Then create/update items from form (via _make_item) and add them.
|
||
... | ... | |
$order = SL::DB::Manager::Order->find_by(id => $::form->{id}) if $::form->{id};
|
||
$order ||= SL::DB::Order->new(orderitems => []);
|
||
|
||
my $form_orderitems = delete $::form->{order}->{orderitems};
|
||
my $form_orderitems = delete $::form->{order}->{orderitems};
|
||
my $form_periodic_invoices_config = delete $::form->{order}->{periodic_invoices_config};
|
||
|
||
$order->assign_attributes(%{$::form->{order}});
|
||
|
||
my $periodic_invoices_config = _make_periodic_invoices_config_from_yaml($form_periodic_invoices_config);
|
||
$order->periodic_invoices_config($periodic_invoices_config) if $periodic_invoices_config;
|
||
|
||
# remove deleted items
|
||
$self->item_ids_to_delete([]);
|
||
foreach my $idx (reverse 0..$#{$order->orderitems}) {
|
||
... | ... | |
sub _pre_render {
|
||
my ($self) = @_;
|
||
|
||
$self->{all_taxzones} = SL::DB::Manager::TaxZone->get_all_sorted();
|
||
$self->{all_departments} = SL::DB::Manager::Department->get_all_sorted();
|
||
$self->{all_employees} = SL::DB::Manager::Employee->get_all(where => [ or => [ id => $self->order->employee_id,
|
||
deleted => 0 ] ],
|
||
sort_by => 'name');
|
||
$self->{all_salesmen} = SL::DB::Manager::Employee->get_all(where => [ or => [ id => $self->order->salesman_id,
|
||
deleted => 0 ] ],
|
||
sort_by => 'name');
|
||
$self->{all_projects} = SL::DB::Manager::Project->get_all(where => [ or => [ id => $self->order->globalproject_id,
|
||
active => 1 ] ],
|
||
sort_by => 'projectnumber');
|
||
$self->{all_payment_terms} = SL::DB::Manager::PaymentTerm->get_all_sorted(where => [ or => [ id => $self->order->payment_id,
|
||
obsolete => 0 ] ]);
|
||
|
||
$self->{all_delivery_terms} = SL::DB::Manager::DeliveryTerm->get_all_sorted();
|
||
|
||
$self->{current_employee_id} = SL::DB::Manager::Employee->current->id;
|
||
$self->{all_taxzones} = SL::DB::Manager::TaxZone->get_all_sorted();
|
||
$self->{all_departments} = SL::DB::Manager::Department->get_all_sorted();
|
||
$self->{all_employees} = SL::DB::Manager::Employee->get_all(where => [ or => [ id => $self->order->employee_id,
|
||
deleted => 0 ] ],
|
||
sort_by => 'name');
|
||
$self->{all_salesmen} = SL::DB::Manager::Employee->get_all(where => [ or => [ id => $self->order->salesman_id,
|
||
deleted => 0 ] ],
|
||
sort_by => 'name');
|
||
$self->{all_projects} = SL::DB::Manager::Project->get_all(where => [ or => [ id => $self->order->globalproject_id,
|
||
active => 1 ] ],
|
||
sort_by => 'projectnumber');
|
||
$self->{all_payment_terms} = SL::DB::Manager::PaymentTerm->get_all_sorted(where => [ or => [ id => $self->order->payment_id,
|
||
obsolete => 0 ] ]);
|
||
$self->{all_delivery_terms} = SL::DB::Manager::DeliveryTerm->get_all_sorted();
|
||
$self->{current_employee_id} = SL::DB::Manager::Employee->current->id;
|
||
$self->{periodic_invoices_status} = $self->_get_periodic_invoices_status($self->order->periodic_invoices_config);
|
||
|
||
my $print_form = Form->new('');
|
||
$print_form->{type} = $self->type;
|
||
... | ... | |
} } @all_objects;
|
||
}
|
||
|
||
$::request->{layout}->use_javascript("${_}.js") for qw(kivi.SalesPurchase kivi.Order kivi.File ckeditor/ckeditor ckeditor/adapters/jquery);
|
||
$::request->{layout}->use_javascript("${_}.js") for qw(kivi.SalesPurchase kivi.Order kivi.File ckeditor/ckeditor ckeditor/adapters/jquery edit_periodic_invoices_config);
|
||
$self->_setup_edit_action_bar;
|
||
}
|
||
|
||
... | ... | |
action => [
|
||
t8('Save'),
|
||
call => [ 'kivi.Order.save', $::instance_conf->get_order_warn_duplicate_parts ],
|
||
checks => [ 'kivi.Order.check_save_active_periodic_invoices' ],
|
||
accesskey => 'enter',
|
||
],
|
||
action => [
|
||
t8('Save and Delivery Order'),
|
||
call => [ 'kivi.Order.save_and_delivery_order', $::instance_conf->get_order_warn_duplicate_parts ],
|
||
checks => [ 'kivi.Order.check_save_active_periodic_invoices' ],
|
||
],
|
||
action => [
|
||
t8('Save and Invoice'),
|
||
call => [ 'kivi.Order.save_and_invoice', $::instance_conf->get_order_warn_duplicate_parts ],
|
||
checks => [ 'kivi.Order.check_save_active_periodic_invoices' ],
|
||
],
|
||
|
||
], # end of combobox "Save"
|
||
... | ... | |
return %files;
|
||
}
|
||
|
||
sub _make_periodic_invoices_config_from_yaml {
|
||
my ($yaml_config) = @_;
|
||
|
||
return if !$yaml_config;
|
||
my $attr = YAML::Load($yaml_config);
|
||
return if 'HASH' ne ref $attr;
|
||
return SL::DB::PeriodicInvoicesConfig->new(%$attr);
|
||
}
|
||
|
||
|
||
sub _get_periodic_invoices_status {
|
||
my ($self, $config) = @_;
|
||
|
||
return if $self->type ne _sales_order_type();
|
||
return t8('not configured') if !$config;
|
||
|
||
my $active = ('HASH' eq ref $config) ? $config->{active}
|
||
: ('SL::DB::PeriodicInvoicesConfig' eq ref $config) ? $config->active
|
||
: die "Cannot get status of periodic invoices config";
|
||
|
||
return $active ? t8('active') : t8('inactive');
|
||
}
|
||
|
||
sub _sales_order_type {
|
||
'sales_order';
|
||
}
|
||
... | ... | |
|
||
=item * custom shipto address
|
||
|
||
=item * periodic invoices
|
||
|
||
=item * language / part translations
|
||
|
||
=item * access rights
|
js/kivi.Order.js | ||
---|---|---|
kivi.io.close_dialog();
|
||
};
|
||
|
||
ns.show_periodic_invoices_config_dialog = function() {
|
||
if ($('#type').val() !== 'sales_order') return;
|
||
|
||
kivi.popup_dialog({
|
||
url: 'controller.pl?action=Order/show_periodic_invoices_config_dialog',
|
||
data: { type : $('#type').val(),
|
||
id : $('#id').val(),
|
||
config : $('#order_periodic_invoices_config').val(),
|
||
customer_id: $('#order_customer_id').val(),
|
||
transdate : $('#order_transdate').val(),
|
||
language_id: $('#language_id').val()
|
||
},
|
||
id: 'jq_periodic_invoices_config_dialog',
|
||
load: kivi.reinit_widgets,
|
||
dialog: {
|
||
title: kivi.t8('Edit the configuration for periodic invoices'),
|
||
width: 800,
|
||
height: 650
|
||
}
|
||
});
|
||
return true;
|
||
};
|
||
|
||
ns.close_periodic_invoices_config_dialog = function() {
|
||
$('#jq_periodic_invoices_config_dialog').dialog('close');
|
||
};
|
||
|
||
ns.assign_periodic_invoices_config = function() {
|
||
var data = $('[name="Form"]').serializeArray();
|
||
data.push({ name: 'type', value: $('#type').val() });
|
||
data.push({ name: 'action', value: 'Order/assign_periodic_invoices_config' });
|
||
$.post("controller.pl", data, kivi.eval_json_result);
|
||
};
|
||
|
||
ns.check_save_active_periodic_invoices = function() {
|
||
var type = $('#type').val();
|
||
if (type !== 'sales_order') return true;
|
||
|
||
var active = false;
|
||
$.ajax({
|
||
url: 'controller.pl',
|
||
data: { action: 'Order/get_has_active_periodic_invoices',
|
||
type : type,
|
||
id : $('#id').val(),
|
||
config: $('#order_periodic_invoices_config').val(),
|
||
},
|
||
method: "GET",
|
||
async: false,
|
||
dataType: 'text',
|
||
success: function(val){
|
||
active = val;
|
||
}
|
||
});
|
||
|
||
if (active == 1) {
|
||
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?'));
|
||
}
|
||
|
||
return true;
|
||
};
|
||
|
||
});
|
||
|
||
$(function(){
|
js/locale/de.js | ||
---|---|---|
"Edit picture":"Bild bearbeiten",
|
||
"Edit project link":"Projektverknüpfung bearbeiten",
|
||
"Edit text block":"Textblock bearbeiten",
|
||
"Edit the configuration for periodic invoices":"Konfiguration für wiederkehrende Rechnungen bearbeiten",
|
||
"Enter longdescription":"Langtext eingeben",
|
||
"Error: Name missing":"Fehler: Name fehlt",
|
||
"File upload":"Datei Upload",
|
locale/de/all | ||
---|---|---|
'The payment term has been saved.' => 'Die Zahlungsbedingungen wurden gespeichert.',
|
||
'The payment term is in use and cannot be deleted.' => 'Die Zahlungsbedingungen werden bereits benutzt und können nicht gelöscht werden.',
|
||
'The payments have been posted.' => 'Die Zahlungen wurden gebucht.',
|
||
'The periodic invoices config has been assigned.' => 'Die Konfiguration für wiederkehrende Rechnungen wurde übernommen.',
|
||
'The port is missing.' => 'Port fehlt',
|
||
'The preferred one is to install packages provided by your operating system distribution (e.g. Debian or RPM packages).' => 'Die bevorzugte Art, ein Perl-Modul zu installieren, ist durch Installation eines von Ihrem Betriebssystem zur Verfügung gestellten Paketes (z.B. Debian-Pakete oder RPM).',
|
||
'The price rule for this discount does not exist anymore' => 'Die Preisregel für diesen Rabatt existiert nicht mehr',
|
templates/webpages/order/tabs/basic_data.html | ||
---|---|---|
title_key = 'description',
|
||
style = 'width: 250px') %]</td>
|
||
</tr>
|
||
[%- IF SELF.type == "sales_order" %]
|
||
<tr>
|
||
<th align="right">[%- 'Periodic Invoices' | T8 %]</th>
|
||
<td>[% L.button_tag('kivi.Order.show_periodic_invoices_config_dialog()', LxERP.t8('Configure')) %]
|
||
(<span id='periodic_invoices_status'>[%- SELF.periodic_invoices_status -%]</span>)
|
||
<a href="doc/html/ch03.html#features.periodic-invoices.variables" target="_blank">?</a>
|
||
</td>
|
||
</tr>
|
||
[%- END %]
|
||
</table>
|
||
</td>
|
||
|
Auch abrufbar als: Unified diff
Auftrags-Controller: Konfiguration wiederkehrender Rechnungen.