use SL::DB;
use SL::Locale::String qw(t8);
use DateTime;
+use Carp;
sub retrieve_open_invoices {
$main::lxdebug->enter_sub();
my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);
my $arap = $params{vc} eq 'customer' ? 'ar' : 'ap';
my $vc = $params{vc} eq 'customer' ? 'customer' : 'vendor';
+ my $vc_vc_id = $params{vc} eq 'customer' ? 'c_vendor_id' : 'v_customer_id';
my $mandate = $params{vc} eq 'customer' ? " AND COALESCE(vc.mandator_id, '') <> '' AND vc.mandate_date_of_signature IS NOT NULL " : '';
- # in query: for customers, use payment terms from invoice, for vendors use
- # payment terms from vendor settings
- # currently there is no option in vendor invoices for setting payment terms,
- # so the vendor settings are always used
-
- my $payment_term_type = $params{vc} eq 'customer' ? "${arap}" : 'vc';
-
# open_amount is not the current open amount according to bookkeeping, but
# the open amount minus the SEPA transfer amounts that haven't been closed yet
my $query =
(${arap}.amount - (${arap}.amount * pt.percent_skonto)) as amount_less_skonto,
(${arap}.amount * pt.percent_skonto) as skonto_amount,
vc.name AS vcname, vc.language_id, ${arap}.duedate as duedate, ${arap}.direct_debit,
+ vc.${vc_vc_id} as vc_vc_id,
COALESCE(vc.iban, '') <> '' AND COALESCE(vc.bic, '') <> '' ${mandate} AS vc_bank_info_ok,
- ${arap}.amount - ${arap}.paid - COALESCE(open_transfers.amount, 0) AS open_amount
+ ${arap}.amount - ${arap}.paid - COALESCE(open_transfers.amount, 0) AS open_amount,
+ COALESCE(open_transfers.amount, 0) AS transfer_amount,
+ pt.description as pt_description
FROM ${arap}
LEFT JOIN ${vc} vc ON (${arap}.${vc}_id = vc.id)
GROUP BY sei.${arap}_id)
AS open_transfers ON (${arap}.id = open_transfers.${arap}_id)
- LEFT JOIN payment_terms pt ON (${payment_term_type}.payment_id = pt.id)
+ LEFT JOIN payment_terms pt ON (${arap}.payment_id = pt.id)
WHERE ${arap}.amount > (COALESCE(open_transfers.amount, 0) + ${arap}.paid)
ORDER BY lower(vc.name) ASC, lower(${arap}.invnumber) ASC
|;
+ # $main::lxdebug->message(LXDebug->DEBUG2(),"sepa add query:".$query);
my $results = selectall_hashref_query($form, $dbh, $query);
$transfer->{reference} = "${invnumber}-${num_payments}";
}
- $h_item_id->execute();
+ $h_item_id->execute() || $::form->dberror($q_item_id);
my ($item_id) = $h_item_id->fetchrow_array();
my $end_to_end_id = strftime "LXO%Y%m%d%H%M%S", localtime;
$main::lxdebug->leave_sub();
}
+sub undo_export {
+ $main::lxdebug->enter_sub();
+
+ my $self = shift;
+ my %params = @_;
+
+ Common::check_params(\%params, qw(id));
+
+ my $sepa_export = SL::DB::Manager::SepaExport->find_by(id => $params{id});
+
+ croak "Not a valid SEPA Export id: $params{id}" unless $sepa_export;
+ croak "Cannot undo closed exports." if $sepa_export->closed;
+ croak "Cannot undo executed exports." if $sepa_export->executed;
+
+ die "Could not undo $sepa_export->id" if !$sepa_export->delete();
+
+ $main::lxdebug->leave_sub();
+}
+
sub list_exports {
$main::lxdebug->enter_sub();
}
1;
+
+
+__END__
+
+=head1 NAME
+
+SL::SEPA - Base class for SEPA objects
+
+=head1 SYNOPSIS
+
+ # get all open invoices we like to pay via SEPA
+ my $invoices = SL::SEPA->retrieve_open_invoices(vc => 'vendor');
+
+ # add some IBAN and purposes for open transaction
+ # and assign this to a SEPA export
+ my $id = SL::SEPA->create_export('employee' => $::myconfig{login},
+ 'bank_transfers' => \@bank_transfers,
+ 'vc' => 'vendor');
+
+=head1 DESCRIPTIONS
+
+This is the base class for SEPA. SEPA and the underlying directories
+(SEPA::XML etc) are used to genereate valid XML files for the SEPA
+(Single European Payment Area) specification and offers this structure
+as a download via a xml file.
+
+An export can have one or more transaction which have to
+comply to the specification (IBAN, BIC, amount, purpose, etc).
+
+Furthermore kivitendo sepa exports have two
+valid states: Open or closed and executed or not executed.
+
+The state closed can be set via a user interface and the
+state executed is automatically assigned if the action payment
+is triggered.
+
+=head1 FUNCTIONS
+
+=head2 C<undo_export> $sepa_export_id
+
+Needs a valid sepa_export id and deletes the sepa export if
+the state of the export is neither executed nor closed.
+Returns undef if the deletion was successfully.
+Otherwise the function just dies with a short notice of the id.
+
+=cut