Revision e0ef8114
Von Tamino Steinert vor etwa 1 Jahr hinzugefügt
SL/Controller/ZUGFeRD.pm | ||
---|---|---|
257 | 257 |
$self->redirect_to( |
258 | 258 |
controller => 'ap.pl', |
259 | 259 |
action => 'load_zugferd', |
260 |
no_payment_bookings => 0, |
|
261 |
paid_1_suggestion => $::form->format_amount(\%::myconfig, $metadata{'total'}, 2), |
|
262 |
invnumber => $invnumber, |
|
263 |
AP_chart_id => $ap_chart_id, |
|
264 |
currency => $currency->name, |
|
265 |
duedate => $metadata{'duedate'}, |
|
266 |
transdate => $metadata{'transdate'}, |
|
267 |
notes => $notes, |
|
268 |
taxincluded => 0, |
|
269 |
direct_debit => $metadata{'direct_debit'}, |
|
270 |
vendor => $vendor->name, |
|
271 |
vendor_id => $vendor->id, |
|
272 |
zugferd_session_file => $file_name, |
|
273 |
%item_form, |
|
260 |
form_defaults => { |
|
261 |
zugferd_session_file => $file_name, |
|
262 |
vendor_id => $vendor->id, |
|
263 |
vendor => $vendor->name, |
|
264 |
invnumber => $invnumber, |
|
265 |
transdate => $metadata{'transdate'}, |
|
266 |
duedate => $metadata{'duedate'}, |
|
267 |
no_payment_bookings => 0, |
|
268 |
notes => $notes, |
|
269 |
taxincluded => 0, |
|
270 |
direct_debit => $metadata{'direct_debit'}, |
|
271 |
currency => $currency->name, |
|
272 |
AP_chart_id => $ap_chart_id, |
|
273 |
paid_1_suggestion => $::form->format_amount(\%::myconfig, $metadata{'total'}, 2), |
|
274 |
%item_form, |
|
275 |
}, |
|
274 | 276 |
); |
275 | 277 |
|
276 | 278 |
} |
... | ... | |
351 | 353 |
This is just a very basic Parser for ZUGFeRD/Factur-X/XRechnung invoices. |
352 | 354 |
We assume that the invoice's creator is a company with a valid |
353 | 355 |
European VAT ID or German tax number and enrolled in |
354 |
Kivitendo. Currently, implementation is a bit hacky because |
|
355 |
invoice import uses AP record templates as a vessel for |
|
356 |
generating the AP record form with the imported data filled |
|
357 |
in. |
|
356 |
Kivitendo. |
|
358 | 357 |
|
359 | 358 |
=head1 TODO |
360 | 359 |
|
... | ... | |
362 | 361 |
|
363 | 362 |
=over 4 |
364 | 363 |
|
365 |
=item Direct creation of the filled in AP record form |
|
366 |
|
|
367 |
Creating an AP record template in the database is not |
|
368 |
very elegant, since it will spam the database with record |
|
369 |
templates that become redundant once the invoice has been |
|
370 |
booked. It would be preferable to fill in the form directly. |
|
371 |
|
|
372 | 364 |
=item Automatic upload of invoice |
373 | 365 |
|
374 | 366 |
Right now, one has to use the "Book and upload" button to |
bin/mozilla/ap.pl | ||
---|---|---|
113 | 113 |
sub load_zugferd { |
114 | 114 |
$::auth->assert('ap_transactions'); |
115 | 115 |
|
116 |
my $file_name = $::form->{zugferd_session_file}; |
|
116 |
my $file_name = $::form->{form_defaults}->{zugferd_session_file}; |
|
117 |
flash('info', $::locale->text( |
|
118 |
"The ZUGFeRD/Factur-X invoice '#1' has been loaded.", $file_name)); |
|
119 |
|
|
120 |
my $template_ap = SL::DB::Manager::RecordTemplate->get_first(where => [vendor_id => $::form->{form_defaults}->{vendor_id}]); |
|
121 |
if ($template_ap) { |
|
122 |
$::form->{id} = $template_ap->id; |
|
123 |
# set default values for items |
|
124 |
my $template_item = $template_ap->items->[0]; |
|
125 |
my $chart = SL::DB::Chart->new(id => $template_item->chart_id)->load(); |
|
126 |
my $tax = SL::DB::Tax->new(id => $template_item->tax_id)->load(); |
|
127 |
foreach my $pos (1 .. $::form->{form_defautls}->{rowcount}) { |
|
128 |
$::form->{form_defautls}->{"AP_amount_chart_id_$pos"} = $chart->id; |
|
129 |
$::form->{form_defautls}->{"previous_AP_amount_chart_id_$pos"} = $chart->id; |
|
130 |
$::form->{form_defautls}->{"taxchart_$pos"} = $tax->id . '--' . $tax->rate; |
|
131 |
$::form->{form_defautls}->{"project_id_$pos"} = $template_item->project_id; |
|
117 | 132 |
|
118 |
# Defaults |
|
119 |
$::form->{title} ||= "Add"; |
|
120 |
$::form->{paidaccounts} = 1 if undef $::form->{paidaccounts}; |
|
133 |
} |
|
134 |
$::form->{form_defaults}->{FLASH} = $::form->{FLASH}; # store flash, form gets cleared |
|
135 |
return load_record_template(); |
|
136 |
} else { |
|
137 |
flash('error', $::locale->text( |
|
138 |
"No AP Record Template for vendor '#1' found.", $::form->{form_defaults}->{vendor})); |
|
139 |
} |
|
121 | 140 |
|
141 |
my $form_defaults = delete $::form->{form_defaults}; |
|
142 |
$::form->{$_} = $form_defaults->{$_} for keys %{ $form_defaults // {} }; |
|
143 |
$::form->{title} ||= "Add"; |
|
122 | 144 |
$::form->{form_validity_token} = SL::DB::ValidityToken->create(scope => SL::DB::ValidityToken::SCOPE_PURCHASE_INVOICE_POST())->token; |
123 |
flash('info', $::locale->text( |
|
124 |
"The ZUGFeRD/Factur-X invoice '#1' has been loaded.", $file_name)); |
|
125 | 145 |
update( |
126 | 146 |
keep_rows_without_amount => 1, |
127 | 147 |
dont_add_new_row => 1, |
locale/de/all | ||
---|---|---|
2433 | 2433 |
'Next run at' => 'Nächste Ausführung um', |
2434 | 2434 |
'No' => 'Nein', |
2435 | 2435 |
'No 1:n or n:1 relation' => 'Keine 1:n oder n:1 Beziehung', |
2436 |
'No AP Record Template for vendor \'#1\' found.' => 'Keine Kreditorenbuchungsvorlage für Lieferant \'#1\' gefunden.', |
|
2436 | 2437 |
'No AP template was found.' => 'Keine Kreditorenbuchungsvorlage gefunden.', |
2437 | 2438 |
'No Billing and ship to address, for Order Number #1 with ID Billing #2 and ID Shipping #3' => 'Keine Rechnungs- und Lieferadresse zur Bestellnummer #1 mit Rechnungs-ID #2 und Liefer-ID #3 gefunden', |
2438 | 2439 |
'No Company Address given' => 'Keine Firmenadresse hinterlegt!', |
... | ... | |
2444 | 2445 |
'No Order items fetched' => 'Keine Auftragspositionen gefunden', |
2445 | 2446 |
'No Shopdescription' => 'Keine Shop-Artikelbeschreibung', |
2446 | 2447 |
'No Shopimages' => 'Keine Shop-Bilder', |
2447 |
'No VAT Info for this Factur-X/ZUGFeRD invoice, please ask your vendor to add this for his Factur-X/ZUGFeRD data.' => 'Keine USt-Info für diese Factur-X/ZUGFeRD Rechnung, bitte fragen Sie Ihren Lieferanten, diese für seine Factur-X/ZUGFeRD Daten hinzuzufügen.', |
|
2448 | 2448 |
'No Vendor' => 'Kein Lieferant', |
2449 | 2449 |
'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden', |
2450 | 2450 |
'No account selected. Please select an account.' => 'Kein Konto ausgewählt. Bitte Konto auswählen.', |
... | ... | |
2836 | 2836 |
'Pictures for search parts' => 'Bilder für Warensuche', |
2837 | 2837 |
'Please Check the bank information for each customer:' => 'Bitte überprüfen Sie die Bankinformationen der Kunden:', |
2838 | 2838 |
'Please Check the bank information for each vendor:' => 'Bitte überprüfen Sie die Kontoinformationen der Lieferanten:', |
2839 |
'Please add a valid VAT-ID for this vendor: #1' => 'Bitte fügen Sie eine gültige USt-ID für diesen Lieferanten hinzu: #1', |
|
2840 | 2839 |
'Please ask your administrator to create warehouses and bins.' => 'Bitten Sie Ihren Administrator, dass er Lager und Lagerplätze anlegt.', |
2841 | 2840 |
'Please change the partnumber of the following parts and run the update again:' => 'Bitte ändern Sie daher die Artikelnummer folgender Artikel:', |
2842 | 2841 |
'Please choose a part.' => 'Bitte wählen Sie einen Artikel aus.', |
locale/en/all | ||
---|---|---|
2432 | 2432 |
'Next run at' => '', |
2433 | 2433 |
'No' => '', |
2434 | 2434 |
'No 1:n or n:1 relation' => '', |
2435 |
'No AP Record Template for vendor #1 found, please add one' => '',
|
|
2435 |
'No AP Record Template for vendor \'#1\' found.' => '',
|
|
2436 | 2436 |
'No AP template was found.' => '', |
2437 | 2437 |
'No Billing and ship to address, for Order Number #1 with ID Billing #2 and ID Shipping #3' => '', |
2438 | 2438 |
'No Company Address given' => '', |
Auch abrufbar als: Unified diff
ZUGFeRD: Buchungsvorlage für Lieferant berücksichtigen