]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/extras/import/import_holdings.pl
updated import scripts (PINES specific, but a good example)
[Evergreen.git] / Open-ILS / src / extras / import / import_holdings.pl
1 #!/usr/bin/perl -w
2 use strict;
3 use XML::LibXML;
4 use Time::HiRes qw/time/;
5 use Getopt::Long;
6 use Data::Dumper;
7 use Error qw/:try/;
8 use open qw/:utf8/;
9
10 $|=1;
11
12 my ($userid, $sourceid, $cn_id, $cp_id, $cp_file, $cn_file, $map_file) = (1, 2, 1, 1, 'asset_copy.sql','asset_volume.sql','record_id_map.pl');
13
14 GetOptions (    
15         "sourceid"              => \$sourceid,
16         "copy_file=s"           => \$cp_file,
17         "volume_file=s"         => \$cn_file,
18         "tcn_map_file=s"        => \$map_file,
19         "userid=i"              => \$userid,
20         "first_volume=i"        => \$cn_id,
21         "first_copy=i"          => \$cp_id,
22 );
23
24 my $tcn_map;
25
26 eval `cat $map_file`;
27
28 open CP, ">$cp_file" or die "Can't open $cp_file!  $!\n";
29 open CN, ">$cn_file" or die "Can't open $cn_file!  $!\n";
30
31
32 print CP <<SQL;
33 SET CLIENT_ENCODING TO 'UNICODE';
34 COPY asset.copy (id,editor,creator,barcode,call_number,copy_number,status,home_lib,loan_duration,fine_level,circulate,deposit,deposit_amount,price,ref,opac_visible) FROM STDIN;
35 SQL
36
37 print CN <<SQL;
38 SET CLIENT_ENCODING TO 'UNICODE';
39 COPY asset.call_number (id,editor,creator,record,label,owning_lib) FROM STDIN;
40 SQL
41
42 my $xact_id = time;
43
44 my $parser = XML::LibXML->new;
45
46 my $cn_map;
47
48 my $xml = '';
49 while ( $xml .= <STDIN> ) {
50         chomp $xml;
51         next unless $xml;
52
53         my $tcn;
54         my $doc;
55         my $success = 0;
56         try {
57                 $doc = $parser->parse_string($xml);;
58                 $tcn = $doc->documentElement->findvalue( '/*/*[@tag="035"][1]' );
59                 $success = 1;
60         } catch Error with {
61                 my $e = shift;
62                 warn $e;
63                 warn $xml;
64         };      
65         next unless $success;
66
67         $tcn =~ s/^.*?(\w+)\s*$/$1/go;
68         
69         unless ($tcn) {
70                 warn "\nNo TCN found in rec!!\n";
71                 $xml = '';
72                 next;
73         }
74
75         unless (exists($$tcn_map{$tcn})) {
76                 warn "\n !! TCN $tcn not in the map!\n";
77                 $xml = '';
78                 next;
79         }
80
81         my $rec_id = $$tcn_map{$tcn};
82
83         for my $node ($doc->documentElement->findnodes('/*/*[@tag="999"]')) {
84                 my $barcode = $node->findvalue( '*[@code="i"]' );
85                 my $label = $node->findvalue( '*[@code="a"]' );
86                 my $owning_lib = $node->findvalue( '*[@code="m"]' );
87                 my $home_lib = $owning_lib;
88                 my $price = $node->findvalue( '*[@code="p"]' );
89                 my $copy_number = $node->findvalue( '*[@code="c"]' );
90
91                 next unless $barcode;
92                 next unless $label;
93
94                 $barcode =~ s/\\/\\\\/g;
95                 $label =~ s/\\/\\\\/g;
96
97                 unless (exists($$cn_map{"$rec_id/$home_lib/$label"})) {
98                         $$cn_map{"$rec_id/$home_lib/$label"} = $cn_id;
99                         print CN join("\t",($cn_id,$userid,$userid,$rec_id,$label,$owning_lib))."\n";
100                         print 'v';
101                         $cn_id++;
102                 }
103
104                 print CP join("\t", (   $cp_id,$userid,$userid,$barcode,
105                                         $$cn_map{"$rec_id/$home_lib/$label"},
106                                         $copy_number,1,$home_lib,2,2,1,0,'0.00',
107                                         $price,0,1 )
108                          )."\n";
109                 print 'c';
110                 $cp_id++;
111         }
112         $xml = '';
113 }
114
115 print CN "\\.\n";
116 print CN "SELECT setval('asset.call_number_id_seq'::TEXT, $cn_id);\n";
117 print CP "\\.\n";
118 print CP "SELECT setval('asset.copy_id_seq'::TEXT, $cp_id);\n";
119