|
Lines 19-26
Link Here
|
| 19 |
use Modern::Perl; |
19 |
use Modern::Perl; |
| 20 |
use MARC::File::XML; |
20 |
use MARC::File::XML; |
| 21 |
use List::MoreUtils qw( uniq ); |
21 |
use List::MoreUtils qw( uniq ); |
| 22 |
use Getopt::Long qw( GetOptions ); |
22 |
use Getopt::Long qw( GetOptions ); |
| 23 |
use Pod::Usage qw( pod2usage ); |
23 |
use Pod::Usage qw( pod2usage ); |
| 24 |
|
24 |
|
| 25 |
use Koha::Script; |
25 |
use Koha::Script; |
| 26 |
use C4::Auth; |
26 |
use C4::Auth; |
|
Lines 96-104
if ($help) {
Link Here
|
| 96 |
pod2usage(1); |
96 |
pod2usage(1); |
| 97 |
} |
97 |
} |
| 98 |
|
98 |
|
| 99 |
$filename ||= 'koha.mrc'; |
99 |
$filename ||= 'koha.mrc'; |
| 100 |
$output_format ||= 'iso2709'; |
100 |
$output_format ||= 'iso2709'; |
| 101 |
$record_type ||= 'bibs'; |
101 |
$record_type ||= 'bibs'; |
| 102 |
|
102 |
|
| 103 |
# Retrocompatibility for the format parameter |
103 |
# Retrocompatibility for the format parameter |
| 104 |
$output_format = 'iso2709' if $output_format eq 'marc'; |
104 |
$output_format = 'iso2709' if $output_format eq 'marc'; |
|
Lines 119-129
if ( $deleted_barcodes and $record_type ne 'bibs' ) {
Link Here
|
| 119 |
pod2usage(q|--deleted_barcodes can only be used with biblios|); |
119 |
pod2usage(q|--deleted_barcodes can only be used with biblios|); |
| 120 |
} |
120 |
} |
| 121 |
|
121 |
|
| 122 |
if ( $report_id ) { |
122 |
if ($report_id) { |
| 123 |
|
123 |
|
| 124 |
# Check report exists |
124 |
# Check report exists |
| 125 |
$report = Koha::Reports->find( $report_id ); |
125 |
$report = Koha::Reports->find($report_id); |
| 126 |
unless ( $report ) { |
126 |
unless ($report) { |
| 127 |
pod2usage( sprintf( "No saved report (%s) found", $report_id ) ); |
127 |
pod2usage( sprintf( "No saved report (%s) found", $report_id ) ); |
| 128 |
} |
128 |
} |
| 129 |
$sql = $report->savedsql; |
129 |
$sql = $report->savedsql; |
|
Lines 137-159
if ( $report_id ) {
Link Here
|
| 137 |
|
137 |
|
| 138 |
# convert SQL parameters to placeholders |
138 |
# convert SQL parameters to placeholders |
| 139 |
my $params_needed = ( $sql =~ s/(<<[^>]+>>)/\?/g ); |
139 |
my $params_needed = ( $sql =~ s/(<<[^>]+>>)/\?/g ); |
| 140 |
die("You supplied ". scalar @report_params . " parameter(s) and $params_needed are required by the report") if scalar @report_params != $params_needed; |
140 |
die( "You supplied " . scalar @report_params . " parameter(s) and $params_needed are required by the report" ) |
|
|
141 |
if scalar @report_params != $params_needed; |
| 141 |
} |
142 |
} |
| 142 |
|
143 |
|
| 143 |
$start_accession = dt_from_string( $start_accession ) if $start_accession; |
144 |
$start_accession = dt_from_string($start_accession) if $start_accession; |
| 144 |
$end_accession = dt_from_string( $end_accession ) if $end_accession; |
145 |
$end_accession = dt_from_string($end_accession) if $end_accession; |
| 145 |
|
146 |
|
| 146 |
# Parse marc conditions |
147 |
# Parse marc conditions |
| 147 |
my @marc_conditions; |
148 |
my @marc_conditions; |
| 148 |
if ($marc_conditions) { |
149 |
if ($marc_conditions) { |
| 149 |
foreach my $condition (split(/,\s*/, $marc_conditions)) { |
150 |
foreach my $condition ( split( /,\s*/, $marc_conditions ) ) { |
| 150 |
if ($condition =~ /^(\d{3})([\w\d]?)(=|(?:!=)|>|<)([^,]+)$/) { |
151 |
if ( $condition =~ /^(\d{3})([\w\d]?)(=|(?:!=)|>|<)([^,]+)$/ ) { |
| 151 |
push @marc_conditions, [$1, $2, $3, $4]; |
152 |
push @marc_conditions, [ $1, $2, $3, $4 ]; |
| 152 |
} |
153 |
} elsif ( $condition =~ /^(exists|not_exists)\((\d{3})([\w\d]?)\)$/ ) { |
| 153 |
elsif ($condition =~ /^(exists|not_exists)\((\d{3})([\w\d]?)\)$/) { |
154 |
push @marc_conditions, [ $2, $3, $1 eq 'exists' ? '?' : '!?' ]; |
| 154 |
push @marc_conditions, [$2, $3, $1 eq 'exists' ? '?' : '!?']; |
155 |
} else { |
| 155 |
} |
|
|
| 156 |
else { |
| 157 |
die("Invalid condititon: $condition"); |
156 |
die("Invalid condititon: $condition"); |
| 158 |
} |
157 |
} |
| 159 |
} |
158 |
} |
|
Lines 164-176
my $dbh = C4::Context->dbh;
Link Here
|
| 164 |
# Redirect stdout |
163 |
# Redirect stdout |
| 165 |
open STDOUT, '>', $filename if $filename; |
164 |
open STDOUT, '>', $filename if $filename; |
| 166 |
|
165 |
|
| 167 |
|
|
|
| 168 |
my @record_ids; |
166 |
my @record_ids; |
| 169 |
|
167 |
|
| 170 |
$timestamp = ($timestamp) ? output_pref({ dt => dt_from_string($timestamp), dateformat => 'iso', dateonly => 0, }): ''; |
168 |
$timestamp = |
|
|
169 |
($timestamp) ? output_pref( { dt => dt_from_string($timestamp), dateformat => 'iso', dateonly => 0, } ) : ''; |
| 171 |
|
170 |
|
| 172 |
if ( $record_type eq 'bibs' ) { |
171 |
if ( $record_type eq 'bibs' ) { |
| 173 |
if ( $report ) { |
172 |
if ($report) { |
|
|
173 |
|
| 174 |
# Run the report and fetch biblionumbers |
174 |
# Run the report and fetch biblionumbers |
| 175 |
my ($sth) = execute_query( |
175 |
my ($sth) = execute_query( |
| 176 |
{ |
176 |
{ |
|
Lines 186-195
if ( $record_type eq 'bibs' ) {
Link Here
|
| 186 |
pod2usage(q|The --report_id you specified returned no biblionumbers|); |
186 |
pod2usage(q|The --report_id you specified returned no biblionumbers|); |
| 187 |
} |
187 |
} |
| 188 |
} |
188 |
} |
| 189 |
} elsif ( $timestamp ) { |
189 |
} elsif ($timestamp) { |
| 190 |
if (!$dont_export_items) { |
190 |
if ( !$dont_export_items ) { |
| 191 |
push @record_ids, $_->{biblionumber} for @{ |
191 |
push @record_ids, $_->{biblionumber} for @{ |
| 192 |
$dbh->selectall_arrayref(q| ( |
192 |
$dbh->selectall_arrayref( |
|
|
193 |
q| ( |
| 193 |
SELECT biblio_metadata.biblionumber |
194 |
SELECT biblio_metadata.biblionumber |
| 194 |
FROM biblio_metadata |
195 |
FROM biblio_metadata |
| 195 |
LEFT JOIN items USING(biblionumber) |
196 |
LEFT JOIN items USING(biblionumber) |
|
Lines 201-248
if ( $record_type eq 'bibs' ) {
Link Here
|
| 201 |
LEFT JOIN deleteditems USING(biblionumber) |
202 |
LEFT JOIN deleteditems USING(biblionumber) |
| 202 |
WHERE biblio_metadata.timestamp >= ? |
203 |
WHERE biblio_metadata.timestamp >= ? |
| 203 |
OR deleteditems.timestamp >= ? |
204 |
OR deleteditems.timestamp >= ? |
| 204 |
) |, { Slice => {} }, ( $timestamp ) x 4 ); |
205 |
) |, { Slice => {} }, ($timestamp) x 4 |
|
|
206 |
); |
| 205 |
}; |
207 |
}; |
| 206 |
} else { |
208 |
} else { |
| 207 |
push @record_ids, $_->{biblionumber} for @{ |
209 |
push @record_ids, $_->{biblionumber} for @{ |
| 208 |
$dbh->selectall_arrayref(q| ( |
210 |
$dbh->selectall_arrayref( |
|
|
211 |
q| ( |
| 209 |
SELECT biblio_metadata.biblionumber |
212 |
SELECT biblio_metadata.biblionumber |
| 210 |
FROM biblio_metadata |
213 |
FROM biblio_metadata |
| 211 |
WHERE biblio_metadata.timestamp >= ? |
214 |
WHERE biblio_metadata.timestamp >= ? |
| 212 |
) |, { Slice => {} }, $timestamp ); |
215 |
) |, { Slice => {} }, $timestamp |
|
|
216 |
); |
| 213 |
}; |
217 |
}; |
| 214 |
} |
218 |
} |
| 215 |
} else { |
219 |
} else { |
| 216 |
my $conditions = { |
220 |
my $conditions = { |
| 217 |
( $starting_biblionumber or $ending_biblionumber ) |
221 |
( $starting_biblionumber or $ending_biblionumber ) |
| 218 |
? ( |
222 |
? ( |
| 219 |
"me.biblionumber" => { |
223 |
"me.biblionumber" => { |
| 220 |
( $starting_biblionumber ? ( '>=' => $starting_biblionumber ) : () ), |
224 |
( $starting_biblionumber ? ( '>=' => $starting_biblionumber ) : () ), |
| 221 |
( $ending_biblionumber ? ( '<=' => $ending_biblionumber ) : () ), |
225 |
( $ending_biblionumber ? ( '<=' => $ending_biblionumber ) : () ), |
| 222 |
} |
226 |
} |
| 223 |
) |
227 |
) |
| 224 |
: (), |
228 |
: (), |
| 225 |
( $starting_callnumber or $ending_callnumber ) |
229 |
( $starting_callnumber or $ending_callnumber ) |
| 226 |
? ( |
230 |
? ( |
| 227 |
callnumber => { |
231 |
callnumber => { |
| 228 |
( $starting_callnumber ? ( '>=' => $starting_callnumber ) : () ), |
232 |
( $starting_callnumber ? ( '>=' => $starting_callnumber ) : () ), |
| 229 |
( $ending_callnumber ? ( '<=' => $ending_callnumber ) : () ), |
233 |
( $ending_callnumber ? ( '<=' => $ending_callnumber ) : () ), |
| 230 |
} |
234 |
} |
| 231 |
) |
235 |
) |
| 232 |
: (), |
236 |
: (), |
| 233 |
( $start_accession or $end_accession ) |
237 |
( $start_accession or $end_accession ) |
| 234 |
? ( |
238 |
? ( |
| 235 |
dateaccessioned => { |
239 |
dateaccessioned => { |
| 236 |
( $start_accession ? ( '>=' => $start_accession ) : () ), |
240 |
( $start_accession ? ( '>=' => $start_accession ) : () ), |
| 237 |
( $end_accession ? ( '<=' => $end_accession ) : () ), |
241 |
( $end_accession ? ( '<=' => $end_accession ) : () ), |
| 238 |
} |
242 |
} |
| 239 |
) |
243 |
) |
| 240 |
: (), |
244 |
: (), |
| 241 |
( $itemtype |
245 |
( |
| 242 |
? |
246 |
$itemtype |
| 243 |
C4::Context->preference('item-level_itypes') |
247 |
? C4::Context->preference('item-level_itypes') |
| 244 |
? ( 'items.itype' => $itemtype ) |
248 |
? ( 'items.itype' => $itemtype ) |
| 245 |
: ( 'me.itemtype' => $itemtype ) |
249 |
: ( 'me.itemtype' => $itemtype ) |
| 246 |
: () |
250 |
: () |
| 247 |
), |
251 |
), |
| 248 |
|
252 |
|
|
Lines 252-260
if ( $record_type eq 'bibs' ) {
Link Here
|
| 252 |
push @record_ids, $biblioitem->biblionumber; |
256 |
push @record_ids, $biblioitem->biblionumber; |
| 253 |
} |
257 |
} |
| 254 |
} |
258 |
} |
| 255 |
} |
259 |
} elsif ( $record_type eq 'auths' ) { |
| 256 |
elsif ( $record_type eq 'auths' ) { |
260 |
if ($report) { |
| 257 |
if ( $report ) { |
261 |
|
| 258 |
# Run the report and fetch authids |
262 |
# Run the report and fetch authids |
| 259 |
my ($sth) = execute_query( |
263 |
my ($sth) = execute_query( |
| 260 |
{ |
264 |
{ |
|
Lines 304-341
if ( @record_ids and $id_list_file ) {
Link Here
|
| 304 |
open my $fh, '<', $id_list_file or die "Cannot open file $id_list_file ($!)"; |
308 |
open my $fh, '<', $id_list_file or die "Cannot open file $id_list_file ($!)"; |
| 305 |
my @filter_record_ids = <$fh>; |
309 |
my @filter_record_ids = <$fh>; |
| 306 |
@filter_record_ids = map { my $id = $_; $id =~ s/[\r\n]*$//; $id } @filter_record_ids; |
310 |
@filter_record_ids = map { my $id = $_; $id =~ s/[\r\n]*$//; $id } @filter_record_ids; |
|
|
311 |
|
| 307 |
# intersection |
312 |
# intersection |
| 308 |
my %record_ids = map { $_ => 1 } @record_ids; |
313 |
my %record_ids = map { $_ => 1 } @record_ids; |
| 309 |
@record_ids = grep $record_ids{$_}, @filter_record_ids; |
314 |
@record_ids = grep $record_ids{$_}, @filter_record_ids; |
| 310 |
} |
315 |
} |
| 311 |
|
316 |
|
| 312 |
if ($deleted_barcodes) { |
317 |
if ($deleted_barcodes) { |
| 313 |
for my $record_id ( @record_ids ) { |
318 |
for my $record_id (@record_ids) { |
| 314 |
my $barcode = $dbh->selectall_arrayref(q| |
319 |
my $barcode = $dbh->selectall_arrayref( |
|
|
320 |
q| |
| 315 |
SELECT DISTINCT barcode |
321 |
SELECT DISTINCT barcode |
| 316 |
FROM deleteditems |
322 |
FROM deleteditems |
| 317 |
WHERE deleteditems.biblionumber = ? |
323 |
WHERE deleteditems.biblionumber = ? |
| 318 |
AND barcode IS NOT NULL AND barcode != '' |
324 |
AND barcode IS NOT NULL AND barcode != '' |
| 319 |
|, { Slice => {} }, $record_id ); |
325 |
|, { Slice => {} }, $record_id |
|
|
326 |
); |
| 320 |
say $_->{barcode} for @$barcode; |
327 |
say $_->{barcode} for @$barcode; |
| 321 |
} |
328 |
} |
| 322 |
} |
329 |
} else { |
| 323 |
else { |
|
|
| 324 |
Koha::Exporter::Record::export( |
330 |
Koha::Exporter::Record::export( |
| 325 |
{ record_type => $record_type, |
331 |
{ |
| 326 |
record_ids => \@record_ids, |
332 |
record_type => $record_type, |
| 327 |
record_conditions => @marc_conditions ? \@marc_conditions : undef, |
333 |
record_ids => \@record_ids, |
| 328 |
format => $output_format, |
334 |
record_conditions => @marc_conditions ? \@marc_conditions : undef, |
| 329 |
csv_profile_id => $csv_profile_id, |
335 |
format => $output_format, |
| 330 |
export_items => (not $dont_export_items), |
336 |
csv_profile_id => $csv_profile_id, |
| 331 |
clean => $clean || 0, |
337 |
export_items => ( not $dont_export_items ), |
|
|
338 |
clean => $clean || 0, |
| 332 |
embed_see_from_headings => $embed_see_from_headings || 0, |
339 |
embed_see_from_headings => $embed_see_from_headings || 0, |
| 333 |
} |
340 |
} |
| 334 |
); |
341 |
); |
| 335 |
} |
342 |
} |
| 336 |
exit; |
343 |
exit; |
| 337 |
|
344 |
|
| 338 |
|
|
|
| 339 |
=head1 NAME |
345 |
=head1 NAME |
| 340 |
|
346 |
|
| 341 |
export records - This script exports record (biblios or authorities) |
347 |
export records - This script exports record (biblios or authorities) |
| 342 |
- |
|
|