3 # Copyright 2013,2014,2015 PTFS Europe Ltd
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
24 # Handles all the edi processing for a site
25 # loops through the vendor_edifact records and uploads and downloads
26 # edifact files if the appropriate type is enabled
27 # downloaded quotes, invoices and responses are processed here
28 # if orders are enabled and present they are generated and sent
29 # can be run as frequently as required
30 # log messages are appended to logdir/editrace.log
32 use Koha
::Script
-cron
;
34 use Log
::Log4perl
qw(:easy);
36 use Koha
::EDI
qw( process_quote process_invoice process_ordrsp);
37 use Koha
::Edifact
::Transport
;
38 use Fcntl
qw( :DEFAULT :flock :seek );
40 my $logdir = C4
::Context
->config('logdir');
42 # logging set to trace as this may be what you
43 # want on implementation
44 Log
::Log4perl
->easy_init(
47 file
=> ">>$logdir/editrace.log",
51 # we dont have a lock dir in context so use the logdir
52 my $pidfile = "$logdir/edicron.pid";
54 my $pid_handle = check_pidfile
();
56 my $schema = Koha
::Database
->new()->schema();
58 my @edi_accts = $schema->resultset('VendorEdiAccount')->all();
60 my $logger = Log
::Log4perl
->get_logger();
62 for my $acct (@edi_accts) {
63 if ( $acct->quotes_enabled ) {
64 my $downloader = Koha
::Edifact
::Transport
->new( $acct->id );
65 $downloader->download_messages('QUOTE');
69 if ( $acct->invoices_enabled ) {
72 if ( $acct->plugin ) {
73 $downloader = Koha
::Plugins
::Handler
->run(
75 class => $acct->plugin,
76 method
=> 'edifact_transport',
78 vendor_edi_account_id
=> $acct->id,
84 $downloader ||= Koha
::Edifact
::Transport
->new( $acct->id );
86 $downloader->download_messages('INVOICE');
89 if ( $acct->orders_enabled ) {
91 # select pending messages
92 my @pending_orders = $schema->resultset('EdifactMessage')->search(
94 message_type
=> 'ORDERS',
95 vendor_id
=> $acct->vendor_id,
99 my $uploader = Koha
::Edifact
::Transport
->new( $acct->id );
100 $uploader->upload_messages(@pending_orders);
102 if ( $acct->responses_enabled ) {
103 my $downloader = Koha
::Edifact
::Transport
->new( $acct->id );
104 $downloader->download_messages('ORDRSP');
108 # process any downloaded quotes
110 my @downloaded_quotes = $schema->resultset('EdifactMessage')->search(
112 message_type
=> 'QUOTE',
117 foreach my $quote_file (@downloaded_quotes) {
118 my $filename = $quote_file->filename;
119 $logger->trace("Processing quote $filename");
120 process_quote
($quote_file);
123 # process any downloaded invoices
124 if ( C4
::Context
->preference('EdifactInvoiceImport') eq 'automatic' ) {
125 my @downloaded_invoices = $schema->resultset('EdifactMessage')->search(
127 message_type
=> 'INVOICE',
132 foreach my $invoice (@downloaded_invoices) {
133 my $filename = $invoice->filename();
134 $logger->trace("Processing invoice $filename");
137 if ( my $plugin_class = $invoice->edi_acct->plugin ) {
138 my $plugin = $plugin_class->new();
139 if ( $plugin->can('edifact_process_invoice') ) {
141 Koha
::Plugins
::Handler
->run(
143 class => $plugin_class,
144 method
=> 'edifact_process_invoice',
153 process_invoice
($invoice) unless $plugin_used;
157 my @downloaded_responses = $schema->resultset('EdifactMessage')->search(
159 message_type
=> 'ORDRSP',
164 foreach my $response (@downloaded_responses) {
165 my $filename = $response->filename();
166 $logger->trace("Processing order response $filename");
167 process_ordrsp
($response);
170 if ( close $pid_handle ) {
175 $logger->error("Error on pidfile close: $!");
181 # sysopen my $fh, $pidfile, O_EXCL | O_RDWR or log_exit "$0 already running"
182 sysopen my $fh, $pidfile, O_RDWR
| O_CREAT
183 or log_exit
("$0: open $pidfile: $!");
184 flock $fh => LOCK_EX
or log_exit
("$0: flock $pidfile: $!");
186 sysseek $fh, 0, SEEK_SET
or log_exit
("$0: sysseek $pidfile: $!");
187 truncate $fh, 0 or log_exit
("$0: truncate $pidfile: $!");
188 print $fh "$$\n" or log_exit
("$0: print $pidfile: $!");
195 $logger->error($error);