Subversion Repositories Web Services

Rev

Rev 118591 | Rev 119237 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6524 fvs 1
<?php
2
/**
6663 fvs 3
 *
7061 fvs 4
 * This file is part of Open Library System.
6663 fvs 5
 * Copyright © 2009, Dansk Bibliotekscenter a/s,
6524 fvs 6
 * Tempovej 7-11, DK-2750 Ballerup, Denmark. CVR: 15149043
7
 *
7061 fvs 8
 * Open Library System is free software: you can redistribute it and/or modify
6524 fvs 9
 * it under the terms of the GNU Affero General Public License as published by
10
 * the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
7061 fvs 13
 * Open Library System is distributed in the hope that it will be useful,
6524 fvs 14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU Affero General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Affero General Public License
7061 fvs 19
 * along with Open Library System.  If not, see <http://www.gnu.org/licenses/>.
6524 fvs 20
*/
21
 
22
 
73971 fvs 23
/** \brief Service to query info the VIP database
7795 fvs 24
 *
25
 */
26
 
27
 
27394 fvs 28
require_once('OLS_class_lib/webServiceServer_class.php');
29
require_once('OLS_class_lib/oci_class.php');
33386 fvs 30
require_once 'OLS_class_lib/memcache_class.php';
6524 fvs 31
 
6663 fvs 32
class openAgency extends webServiceServer {
37646 fvs 33
  protected $cache;
75051 fvs 34
  protected $cache_expire = array();
6524 fvs 35
 
37646 fvs 36
  public function __construct() {
37
    webServiceServer::__construct('openagency.ini');
38
    $this->cache = new cache($this->config->get_value('cache_host', 'setup'),
39
                             $this->config->get_value('cache_port', 'setup'),
40
                             $this->config->get_value('cache_expire', 'setup'));
75051 fvs 41
    $this->cache_expire = $this->config->get_value('cache_operation_expire', 'setup');
37646 fvs 42
  }
8493 fvs 43
 
44
 
75288 fvs 45
  /** \brief Fetch information about automation of ILL
37646 fvs 46
   *
47
   * Request:
48
   * - agencyId
49
   * - AutService: autPotential, autRequester or autProvider
50
   * - materialType
51
   * Response:
52
   * - autPotential
53
   * or
54
   * - autProvider
55
   * or
56
   * - autRequester
57
   * or
58
   * - error
59
   **/
70996 fvs 60
  public function automation($param) {
49530 fvs 61
    if (!$this->aaa->has_right('netpunkt.dk', 500))
94616 fvs 62
      Object::set_value($res, 'error', 'authentication_error');
37646 fvs 63
    else {
76369 fvs 64
      $agency = self::strip_agency($param->agencyId->_value);
63922 fvs 65
      $cache_key = 'OA_aut_' . $this->config->get_inifile_hash() . $agency . $param->autService->_value . $param->materialType->_value;
75051 fvs 66
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
37646 fvs 67
      if ($ret = $this->cache->get($cache_key)) {
68
        verbose::log(STAT, 'Cache hit');
69
        return $ret;
70
      }
95192 fvs 71
      $this->watch->start('entry');
72
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
37646 fvs 73
      if (empty($res->error)) {
74
        switch ($param->autService->_value) {
75
          case 'autPotential':
95192 fvs 76
            $this->watch->start('sql1');
22129 fvs 77
            try {
37646 fvs 78
              $oci->bind('bind_laantager', $agency);
79
              $oci->bind('bind_materiale_id', $param->materialType->_value);
80
              $oci->set_query('SELECT id_nr, valg
98577 fvs 81
                                 FROM vip_fjernlaan
82
                                WHERE laantager = :bind_laantager
83
                                  AND materiale_id = :bind_materiale_id');
109350 fvs 84
              $this->watch->start('fetch');
37646 fvs 85
              $vf_row = $oci->fetch_into_assoc();
109350 fvs 86
              $this->watch->stop('fetch');
22129 fvs 87
            }
29525 fvs 88
            catch (ociException $e) {
37646 fvs 89
              verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 90
              Object::set_value($res, 'error', 'service_unavailable');
29525 fvs 91
            }
95192 fvs 92
            $this->watch->stop('sql1');
29525 fvs 93
            if (empty($res->error)) {
37646 fvs 94
              if ($vf_row['VALG'] == 'a') {
95
                try {
96
                  $oci->bind('bind_materiale_id', $param->materialType->_value);
77415 fvs 97
                  $oci->bind('bind_status', 'J');
95192 fvs 98
                  $this->watch->start('sql2');
37646 fvs 99
                  $oci->set_query('SELECT laangiver
98577 fvs 100
                                     FROM vip_fjernlaan
101
                                    WHERE materiale_id = :bind_materiale_id
102
                                      AND status = :bind_status');    // ??? NULL og DISTINCT
95192 fvs 103
                  $this->watch->stop('sql2');
37646 fvs 104
                  $ap = &$res->autPotential->_value;
94616 fvs 105
                  Object::set_value($ap, 'materialType', $param->materialType->_value);
109350 fvs 106
                  $this->watch->start('fetch');
95042 fvs 107
                  while ($vf_row = $oci->fetch_into_assoc()) {
108
                    if ($vf_row['LAANGIVER']) {
94616 fvs 109
                      Object::set_array_value($ap, 'responder', $vf_row['LAANGIVER']);
95042 fvs 110
                    }
111
                  }
109350 fvs 112
                  $this->watch->stop('fetch');
22129 fvs 113
                }
37646 fvs 114
                catch (ociException $e) {
95192 fvs 115
                  $this->watch->stop('sql2');
37646 fvs 116
                  verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 117
                  Object::set_value($res, 'error', 'service_unavailable');
37646 fvs 118
                }
119
              }
51658 fvs 120
              elseif ($vf_row['VALG'] == 'l') {
95192 fvs 121
                $this->watch->start('sql3');
51658 fvs 122
                try {
123
                  $oci->bind('bind_fjernlaan_id', $vf_row['ID_NR']);
124
                  $oci->set_query('SELECT bib_nr
98577 fvs 125
                                     FROM vip_fjernlaan_bibliotek
126
                                    WHERE fjernlaan_id = :bind_fjernlaan_id');
51658 fvs 127
                  $ap = &$res->autPotential->_value;
94616 fvs 128
                  Object::set_value($ap, 'materialType', $param->materialType->_value);
109350 fvs 129
                  $this->watch->start('fetch');
51658 fvs 130
                  while ($vfb_row = $oci->fetch_into_assoc())
94616 fvs 131
                    Object::set_array_value($ap, 'responder', self::normalize_agency($vfb_row['BIB_NR']));
109350 fvs 132
                  $this->watch->stop('fetch');
51658 fvs 133
                }
134
                catch (ociException $e) {
135
                  verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 136
                  Object::set_value($res, 'error', 'service_unavailable');
51658 fvs 137
                }
95192 fvs 138
                $this->watch->stop('sql3');
37646 fvs 139
              }
51658 fvs 140
              else {
94616 fvs 141
                Object::set_value($res, 'error', 'no_agencies_found');
37646 fvs 142
              }
33386 fvs 143
            }
37646 fvs 144
            break;
145
          case 'autRequester':
29525 fvs 146
            try {
37646 fvs 147
              $oci->bind('bind_laantager', $agency);
148
              $oci->bind('bind_materiale_id', $param->materialType->_value);
95192 fvs 149
              $this->watch->start('sql4');
37646 fvs 150
              $oci->set_query('SELECT *
98577 fvs 151
                                 FROM vip_fjernlaan
152
                                WHERE laantager = :bind_laantager
153
                                  AND materiale_id = :bind_materiale_id');
95192 fvs 154
              $this->watch->stop('sql4');
37646 fvs 155
              $ar = &$res->autRequester->_value;
94620 fvs 156
              Object::set_value($ar, 'requester', $agency);
157
              Object::set_value($ar, 'materialType', $param->materialType->_value);
109350 fvs 158
              $this->watch->start('fetch');
37646 fvs 159
              if ($vf_row = $oci->fetch_into_assoc()) {
94620 fvs 160
                Object::set_value($ar, 'willSend', self::parse_will_send($vf_row['STATUS']));
161
                Object::set_value($ar, 'willSendOwn', self::parse_will_send($vf_row['STATUS_EGET']));
96290 fvs 162
                $profile_fom = $this->config->get_value('profile_for_own_material','setup');
163
                if (!$profile = $profile_fom[strtolower($vf_row['PROFIL_EGET'])]) {
164
                  $profile = reset($profile_fom);
165
                }
166
                Object::set_value($ar, 'ownMaterialAgeInDays', $profile['age_in_days']);
167
                Object::set_value($ar, 'ownDeliveryLimitInDays', $profile['limit_in_days']);
94620 fvs 168
                Object::set_value($ar, 'autPeriod', $vf_row['PERIODE']);
169
                Object::set_value($ar, 'autId', $vf_row['ID_NR']);
170
                Object::set_value($ar, 'autChoice', $vf_row['VALG']);
171
                Object::set_value($ar, 'autRes', ($vf_row['RESERVERING'] == 'J' ? 'YES' : 'NO'));
37646 fvs 172
              }
96292 fvs 173
              else {
94620 fvs 174
                Object::set_value($ar, 'willSend', 'NO');
96292 fvs 175
                Object::set_value($ar, 'willSendOwn', 'NO');
176
              }
109350 fvs 177
              $this->watch->stop('fetch');
29525 fvs 178
            }
179
            catch (ociException $e) {
95192 fvs 180
              $this->watch->stop('sql4');
37646 fvs 181
              verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 182
              Object::set_value($res, 'error', 'service_unavailable');
29525 fvs 183
            }
37646 fvs 184
            break;
185
          case 'autProvider':
22129 fvs 186
            try {
37646 fvs 187
              $oci->bind('bind_laangiver', $agency);
188
              $oci->bind('bind_materiale_id', $param->materialType->_value);
95192 fvs 189
              $this->watch->start('sql5');
37646 fvs 190
              $oci->set_query('SELECT *
98577 fvs 191
                                 FROM vip_fjernlaan
192
                                WHERE laangiver = :bind_laangiver
193
                                  AND materiale_id = :bind_materiale_id');
95192 fvs 194
              $this->watch->stop('sql5');
37646 fvs 195
              $ap = &$res->autProvider->_value;
94620 fvs 196
              Object::set_value($ap, 'provider', $agency);
197
              Object::set_value($ap, 'materialType', $param->materialType->_value);
109350 fvs 198
              $this->watch->start('fetch');
37646 fvs 199
              if ($vf_row = $oci->fetch_into_assoc()) {
94620 fvs 200
                Object::set_value($ap, 'willReceive',  ($vf_row['STATUS'] == 'J' ? 'YES' : 'NO'));
201
                Object::set_value($ap, 'autPeriod',  $vf_row['PERIODE']);
202
                Object::set_value($ap, 'autId',  $vf_row['ID_NR']);
37646 fvs 203
              }
204
              else
94620 fvs 205
                Object::set_value($ap, 'willSend', 'NO');
109350 fvs 206
              $this->watch->stop('fetch');
22129 fvs 207
            }
29525 fvs 208
            catch (ociException $e) {
95192 fvs 209
              $this->watch->stop('sql5');
37646 fvs 210
              verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 211
              Object::set_value($res, 'error', 'service_unavailable');
29525 fvs 212
            }
37646 fvs 213
            break;
214
          default:
94616 fvs 215
            Object::set_value($res, 'error', 'error_in_request');
9142 fvs 216
        }
37646 fvs 217
      }
218
    }
94616 fvs 219
    //print_r($res); var_dump($param); die();
220
    @ $ret->automationResponse->_value = $res;
37646 fvs 221
    $ret = $this->objconvert->set_obj_namespace($ret, $this->xmlns['oa']);
222
    if (empty($res->error)) $this->cache->set($cache_key, $ret);
95192 fvs 223
    $this->watch->stop('entry');
37646 fvs 224
    return $ret;
225
  }
6524 fvs 226
 
57216 fvs 227
 
75288 fvs 228
  /** \brief Fetch encryption to use when sending mails
37646 fvs 229
   *
230
   * Request:
105051 fvs 231
   * - serviceRequester
232
   * - borrowerCheckAllowed
233
   * Response:
234
   * - borrowerCheckLibrary
235
   * - - isil
236
   * - - agencyName
237
   * or
238
   * - error
239
   */
240
  public function borrowerCheckList($param) {
241
    if (!$this->aaa->has_right('netpunkt.dk', 500))
242
      Object::set_value($res, 'error', 'authentication_error');
243
    else {
244
      $cache_key = 'OA_bcl' . $this->config->get_inifile_hash() . $param->serviceRequester->_value . $param->borrowerCheckAllowed->_value;
245
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
246
      if ($ret = $this->cache->get($cache_key)) {
247
        verbose::log(STAT, 'Cache hit');
248
        return $ret;
249
      }
250
      $this->watch->start('entry');
251
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
252
      if (empty($res->error)) {
253
        try {
254
          $oci->bind('bind_navn', strtolower($param->serviceRequester->_value));
255
          if (self::xs_boolean($param->borrowerCheckAllowed->_value)) {
256
            $oci->bind('bind_1', '1');
257
            $add_sql = 'f.har_laanertjek = :bind_1';
258
          }
259
          else {
260
            $oci->bind('bind_0', '0');
261
            $add_sql = '(f.har_laanertjek = :bind_0 OR f.har_laanertjek is null)';
262
          }
105067 fvs 263
          $oci->bind('bind_u', 'U');
105051 fvs 264
          $this->watch->start('sql1');
265
          $oci->set_query('SELECT fa.faust, f.bib_nr, vv.navn
105070 fvs 266
                             FROM fjernadgang_andre fa, fjernadgang f, vip_vsn vv, vip v
105051 fvs 267
                            WHERE lower(fa.navn) = :bind_navn
268
                              AND vv.bib_nr = f.bib_nr
105070 fvs 269
                              AND v.bib_nr = f.bib_nr
270
                              AND (v.delete_mark is null OR v.delete_mark = :bind_u)
105051 fvs 271
                              AND fa.faust = f.faust
272
                              AND ' . $add_sql . '
273
                            ORDER BY vv.navn');
274
          $this->watch->stop('sql1');
109350 fvs 275
          $this->watch->start('fetch');
105051 fvs 276
          while ($vk_row = $oci->fetch_into_assoc()) {
277
            Object::set_value($b, 'agencyName', $vk_row['NAVN']);
278
            Object::set_value($b, 'isil', 'DK-' . $vk_row['BIB_NR']);
279
            Object::set_array_value($res, 'borrowerCheckLibrary', $b);
280
            unset($b);
281
          }
109350 fvs 282
          $this->watch->stop('fetch');
105051 fvs 283
        }
284
        catch (ociException $e) {
285
          $this->watch->stop('sql1');
286
          verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
287
          Object::set_value($res, 'error', 'service_unavailable');
288
        }
289
      }
290
    }
291
    //print_r($res); var_dump($param); die();
292
    Object::set_value($ret, 'borrowerCheckListResponse', $res);
293
    //@ $ret->borrowerCheckListResponse->_value = $res;
294
    $ret = $this->objconvert->set_obj_namespace($ret, $this->xmlns['oa']);
295
    if (empty($res->error)) $this->cache->set($cache_key, $ret);
296
    $this->watch->stop('entry');
297
    return $ret;
298
  }
299
 
300
 
301
  /** \brief Fetch encryption to use when sending mails
302
   *
303
   * Request:
37646 fvs 304
   * - email
305
   * Response:
306
   * - encryption
307
   * - - encrypt
308
   * - - email
309
   * - - agencyId
310
   * - - key
311
   * - - base64
312
   * - - date
313
   * or
314
   * - error
315
   */
316
  public function encryption($param) {
49530 fvs 317
    if (!$this->aaa->has_right('netpunkt.dk', 500))
94616 fvs 318
      Object::set_value($res, 'error', 'authentication_error');
37646 fvs 319
    else {
63922 fvs 320
      $cache_key = 'OA_enc_' . $this->config->get_inifile_hash() . $param->email->_value;
75051 fvs 321
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
37646 fvs 322
      if ($ret = $this->cache->get($cache_key)) {
323
        verbose::log(STAT, 'Cache hit');
29525 fvs 324
        return $ret;
37646 fvs 325
      }
95192 fvs 326
      $this->watch->start('entry');
327
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
37646 fvs 328
      if (empty($res->error)) {
329
        try {
330
          $oci->bind('bind_email', $param->email->_value);
95192 fvs 331
          $this->watch->start('sql1');
37646 fvs 332
          $oci->set_query('SELECT * FROM vip_krypt WHERE email = :bind_email');
95192 fvs 333
          $this->watch->stop('sql1');
109350 fvs 334
          $this->watch->start('fetch');
37646 fvs 335
          while ($vk_row = $oci->fetch_into_assoc()) {
94620 fvs 336
            Object::set_value($o, 'encrypt', 'YES');
337
            Object::set_value($o, 'email', $param->email->_value);
338
            Object::set_value($o, 'agencyId', $vk_row['BIBLIOTEK']);
339
            Object::set_value($o, 'key', $vk_row['KEY']);
340
            Object::set_value($o, 'base64', ($vk_row['NOTBASE64'] == 'ja' ? 'NO' : 'YES'));
341
            Object::set_value($o, 'date', $vk_row['UDL_DATO']);
342
            Object::set_array_value($res, 'encryption', $o);
37646 fvs 343
            unset($o);
344
          }
109350 fvs 345
          $this->watch->stop('fetch');
95042 fvs 346
          if (empty($res)) {
94620 fvs 347
            Object::set_value($o, 'encrypt', 'NO');
348
            Object::set_array_value($res, 'encryption', $o);
95042 fvs 349
          }
37646 fvs 350
        }
351
        catch (ociException $e) {
95192 fvs 352
          $this->watch->stop('sql1');
37646 fvs 353
          verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 354
          Object::set_value($res, 'error', 'service_unavailable');
37646 fvs 355
        }
356
      }
6524 fvs 357
    }
358
 
37646 fvs 359
    //var_dump($res); var_dump($param); die();
94620 fvs 360
    Object::set_value($ret, 'encryptionResponse', $res);
37646 fvs 361
    $ret = $this->objconvert->set_obj_namespace($ret, $this->xmlns['oa']);
362
    if (empty($res->error)) $this->cache->set($cache_key, $ret);
95192 fvs 363
    $this->watch->stop('entry');
37646 fvs 364
    return $ret;
365
  }
57216 fvs 366
 
367
 
75288 fvs 368
  /** \brief Fetch endUserOrderPolicy - which item can be ordered by externals systems
37646 fvs 369
   *
57216 fvs 370
   * Request:
371
   * - agencyId
372
   * - orderMaterialType
373
   * - ownedByAgency
374
   * Response:
375
   * - willReceive
376
   * - condition
377
   * or
378
   * - error
37646 fvs 379
   */
380
  public function endUserOrderPolicy($param) {
49530 fvs 381
    if (!$this->aaa->has_right('netpunkt.dk', 500))
94616 fvs 382
      Object::set_value($res, 'error', 'authentication_error');
37646 fvs 383
    else {
76369 fvs 384
      $agency = self::strip_agency($param->agencyId->_value);
37646 fvs 385
      $mat_type = strtolower($param->orderMaterialType->_value);
63922 fvs 386
      $cache_key = 'OA_endUOP_' . $this->config->get_inifile_hash() . $agency . $param->orderMaterialType->_value . $param->ownedByAgency->_value;
75051 fvs 387
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
37646 fvs 388
      if ($ret = $this->cache->get($cache_key)) {
389
        verbose::log(STAT, 'Cache hit');
390
        return $ret;
391
      }
95192 fvs 392
      $this->watch->start('entry');
393
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
37646 fvs 394
      if (empty($res->error)) {
395
        $assoc['cdrom']     = array('CDROM_BEST_MODT', 'BEST_TEKST_CDROM');
396
        $assoc['journal']   = array('PER_BEST_MODT',   'BEST_TEKST_PER');
397
        $assoc['monograph'] = array('MONO_BEST_MODT',  'BEST_TEKST');
398
        $assoc['music']     = array('MUSIK_BEST_MODT', 'BEST_TEKST_MUSIK');
399
        $assoc['newspaper'] = array('AVIS_BEST_MODT',  'BEST_TEKST_AVIS');
400
        $assoc['video']     = array('VIDEO_BEST_MODT', 'BEST_TEKST_VIDEO');
76369 fvs 401
        if (self::xs_boolean($param->ownedByAgency->_value)) {
37646 fvs 402
          $fjernl = '';
403
        }
48442 fvs 404
        else {
37646 fvs 405
          $fjernl = '_FJL';
406
        }
407
        if (isset($fjernl) && $assoc[$mat_type]) {
408
          $will_receive = $assoc[$mat_type][0] . $fjernl;
95192 fvs 409
          $this->watch->start('sql1');
37646 fvs 410
          try {
411
            $oci->bind('bind_bib_nr', $agency);
95192 fvs 412
            $this->watch->start('sql1');
37646 fvs 413
            $oci->set_query('SELECT best_modt, ' . $will_receive . ' "WR", vt.*, vte.*
98577 fvs 414
                               FROM vip_beh vb, vip_txt vt, vip_txt_eng vte
415
                              WHERE vb.bib_nr = :bind_bib_nr
416
                                AND vb.bib_nr = vt.bib_nr (+)
417
                                AND vb.bib_nr = vte.bib_nr (+)');
95192 fvs 418
            $this->watch->stop('sql1');
109350 fvs 419
            $this->watch->start('fetch');
37646 fvs 420
            if ($vb_row = $oci->fetch_into_assoc()) {
94788 fvs 421
              Object::set_value($res, 'willReceive',
422
                ($vb_row['BEST_MODT'] == 'J' && ($vb_row['WR'] == 'J' || $vb_row['WR'] == 'B') ? 1 : 0));
37646 fvs 423
              if ($vb_row['WR'] == 'B') {
424
                $col = $assoc[$mat_type][1] . $fjernl;
109052 fvs 425
                self::array_append_value_and_language($res->condition, $vb_row[$col], 'dan');
426
                self::array_append_value_and_language($res->condition, $vb_row[$col.'_E'], 'eng');
37646 fvs 427
              }
33386 fvs 428
            }
109350 fvs 429
            $this->watch->stop('fetch');
37646 fvs 430
          }
431
          catch (ociException $e) {
95192 fvs 432
            $this->watch->stop('sql1');
37646 fvs 433
            verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 434
            Object::set_value($res, 'error', 'service_unavailable');
37646 fvs 435
          }
95192 fvs 436
          $this->watch->stop('sql1');
37646 fvs 437
        }
438
        else
94616 fvs 439
          Object::set_value($res, 'error', 'error_in_request');
37646 fvs 440
      }
95042 fvs 441
      if (empty($res)) {
94616 fvs 442
        Object::set_value($res, 'error', 'no_agencies_found');
95042 fvs 443
      }
37646 fvs 444
    }
445
 
446
    //var_dump($res); var_dump($param); die();
94788 fvs 447
    Object::set_value($ret, 'endUserOrderPolicyResponse', $res);
37646 fvs 448
    $ret = $this->objconvert->set_obj_namespace($ret, $this->xmlns['oa']);
449
    if (empty($res->error)) $this->cache->set($cache_key, $ret);
95192 fvs 450
    $this->watch->stop('entry');
37646 fvs 451
    return $ret;
452
  }
453
 
57216 fvs 454
 
75288 fvs 455
  /** \brief Fetch the CulrProfile
37646 fvs 456
   *
57216 fvs 457
   * Request:
458
   * - agencyId
58237 fvs 459
   * - requesterIp
57216 fvs 460
   * Response:
461
   * - culrProfile (see xsd for parameters)
462
   * or
463
   * - error
37646 fvs 464
   */
57216 fvs 465
  public function getCulrProfile($param) {
57687 fvs 466
    if (!$this->aaa->has_right('netpunkt.dk', 551))
94616 fvs 467
      Object::set_value($res, 'error', 'authentication_error');
57216 fvs 468
    else {
76369 fvs 469
      $agency = self::strip_agency($param->agencyId->_value);
470
      $trusted_ip = self::trusted_culr_ip($param->authentication->_value, $param->requesterIp->_value);
112847 fvs 471
      $cache_key = 'OA_getCP' . $this->config->get_inifile_hash() . $agency;
75051 fvs 472
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
57216 fvs 473
      if ($ret = $this->cache->get($cache_key)) {
474
        verbose::log(STAT, 'Cache hit');
475
        return $ret;
476
      }
95192 fvs 477
      $this->watch->start('entry');
478
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
57216 fvs 479
      if (empty($res->error)) {
480
        try {
481
          $oci->bind('bind_agency', $agency);
115094 fvs 482
          $oci->bind('bind_deleted', 'deleted');
95192 fvs 483
          $this->watch->start('sql1');
57216 fvs 484
          $oci->set_query('SELECT * FROM vip_culr_profile
115094 fvs 485
                            WHERE bib_nr = :bind_agency AND typeofclient != :bind_deleted');
95192 fvs 486
          $this->watch->stop('sql1');
109350 fvs 487
          $this->watch->start('fetch');
112847 fvs 488
          if ($cp_row = $oci->fetch_into_assoc()) {
489
            $client_type = $cp_row['TYPEOFCLIENT'];
94825 fvs 490
            Object::set_value($cp, 'agencyId', self::normalize_agency($cp_row['BIB_NR']));
112847 fvs 491
            Object::set_value($cp, 'typeOfClient', $client_type);
94825 fvs 492
            Object::set_value($cp, 'contactTechName', $cp_row['CONTACT_TECH_NAME']);
493
            Object::set_value($cp, 'contactTechMail', $cp_row['CONTACT_TECH_EMAIL']);
494
            Object::set_value($cp, 'contactTechPhone', $cp_row['CONTACT_TECH_PHONE']);
495
            Object::set_value($cp, 'contactAdmName', $cp_row['CONTACT_ADM_NAME']);
496
            Object::set_value($cp, 'contactAdmMail', $cp_row['CONTACT_ADM_EMAIL']);
497
            Object::set_value($cp, 'contactAdmPhone', $cp_row['CONTACT_ADM_PHONE']);
112847 fvs 498
 
94825 fvs 499
            Object::set_array_value($res, 'culrProfile', $cp);
57216 fvs 500
            unset($cp);
501
          }
109350 fvs 502
          $this->watch->stop('fetch');
59633 fvs 503
          if (empty($res)) {
94616 fvs 504
            Object::set_value($res, 'error', 'profile_not_found');
59633 fvs 505
          }
57216 fvs 506
        }
507
        catch (ociException $e) {
95192 fvs 508
          $this->watch->stop('sql1');
57216 fvs 509
          verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 510
          Object::set_value($res, 'error', 'service_unavailable');
57216 fvs 511
        }
512
      }
513
    }
514
    //var_dump($res); var_dump($param); die();
94825 fvs 515
    Object::set_value($ret, 'getCulrProfileResponse', $res);
57216 fvs 516
    $ret = $this->objconvert->set_obj_namespace($ret, $this->xmlns['oa']);
517
    if (empty($res->error)) $this->cache->set($cache_key, $ret);
95192 fvs 518
    $this->watch->stop('entry');
57216 fvs 519
    return $ret;
520
  }
521
 
70996 fvs 522
  /** \brief getRegistryInfo
523
   *
524
   * Request:
115094 fvs 525
   * Request:
70996 fvs 526
   * - agencyId
527
   * - agencyName
528
   * - lastUpdated
529
   * - libraryType
530
   * - libraryStatus
531
   * Response:
532
   * - registryInfo (see xsd for parameters)
533
   * or
534
   * - error
535
   */
536
  public function getRegistryInfo($param) {
81450 fvs 537
    if (!$this->aaa->has_right('netpunkt.dk', 500))
94616 fvs 538
      Object::set_value($res, 'error', 'authentication_error');
70996 fvs 539
    else {
76369 fvs 540
      $agency = self::strip_agency($param->agencyId->_value);
70996 fvs 541
      $cache_key = 'OA_getRI' .
542
                   $this->config->get_inifile_hash() .
543
                   $agency .
544
                   $param->agencyName->_value .
545
                   $param->lastUpdated->_value .
546
                   $param->libraryType->_value .
547
                   $param->libraryStatus->_value;
75051 fvs 548
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
70996 fvs 549
      if ($ret = $this->cache->get($cache_key)) {
550
        verbose::log(STAT, 'Cache hit');
551
        return $ret;
552
      }
95192 fvs 553
      $this->watch->start('entry');
554
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
70996 fvs 555
      if (empty($res->error)) {
556
        try {
77428 fvs 557
      // remove all libraries starting with 3, 5 or 6 - cannot be part of getRegistryInfo
88108 fvs 558
          //$sqls[] = '(v.bib_nr < 300000 OR (v.bib_nr >= 400000 AND v.bib_nr < 500000) OR v.bib_nr >= 700000)';
559
      // remove all libraries starting with 5 or 6 - cannot be part of getRegistryInfo
560
            $sqls[] = '(v.bib_nr < 500000 OR v.bib_nr >= 700000)';
561
        // agencyId
562
            if ($agency) {
563
              $sqls[] = 'v.bib_nr = :bind_bib_nr';
564
              $oci->bind('bind_bib_nr', $agency);
70996 fvs 565
            }
88108 fvs 566
        // agencyName
567
            if ($val = $param->agencyName->_value) {
568
              $sqls[] = '(regexp_like(upper(v.navn), upper(:bind_navn))' .
569
                        ' OR (regexp_like(upper(sup.tekst), upper(:bind_navn)) AND sup.type = :bind_n))';
570
              $oci->bind('bind_navn', self::build_regexp_like($val));
571
              $oci->bind('bind_n', 'N');
70996 fvs 572
            }
88108 fvs 573
        // lastUpdated
574
            if ($val = $param->lastUpdated->_value) {
575
              $sqls[] = '(v.dato >= TO_DATE(:bind_date, \'YYYY-MM-DD\')' .
576
                        ' OR v.bs_dato >= TO_DATE(:bind_date, \'YYYY-MM-DD\')' .
577
                        ' OR vsn.dato >= TO_DATE(:bind_date, \'YYYY-MM-DD\'))' .
578
              $oci->bind('bind_date', $val);
579
            }
580
        // libraryType
581
            if ($val = $param->libraryType->_value
582
              && ($param->libraryType->_value == 'Folkebibliotek'
583
                || $param->libraryType->_value == 'Forskningsbibliotek'
111500 fvs 584
                || $param->libraryType->_value == 'Skolebibliotek'
585
                || $param->libraryType->_value == 'Other')) {
88108 fvs 586
              $sqls[] = 'vsn.bib_type = :bind_bib_type';
587
              $oci->bind('bind_bib_type', $param->libraryType->_value);
588
            }
589
            else {    // Alle or NULL
111500 fvs 590
              $sqls[] = '(vsn.bib_type = :bind_bib_folk OR vsn.bib_type = :bind_bib_forsk)';
591
              $oci->bind('bind_bib_folk', 'Folkebibliotek');
592
              $oci->bind('bind_bib_forsk', 'Forskningsbibliotek');
97533 fvs 593
              //$sqls[] = '(vsn.bib_type = :bind_bib_type_1 OR vsn.bib_type = :bind_bib_type_2)';
594
              //$oci->bind('bind_bib_type_1', 'Folkebibliotek');
595
              //$oci->bind('bind_bib_type_2', 'Forskningsbibliotek');
88108 fvs 596
            }
597
        // libraryStatus
598
            if ($param->libraryStatus->_value == 'usynlig') {
599
              $oci->bind('bind_u', 'U');
600
              $sqls[] = 'v.delete_mark = :bind_u';
601
            } elseif ($param->libraryStatus->_value == 'slettet') {
602
              $oci->bind('bind_s', 'S');
603
              $sqls[] = 'v.delete_mark = :bind_s';
604
            } elseif ($param->libraryStatus->_value <> 'alle') {
605
              $oci->bind('bind_u', 'U');
606
              $sqls[] = '(v.delete_mark is null OR v.delete_mark = :bind_u)';
607
            }
608
            $filter_sql = implode(' AND ', $sqls);
609
            $sql ='SELECT v.bib_nr, v.navn, v.navn_e, v.navn_k, v.navn_e_k, v.type, v.tlf_nr, v.email, v.badr,
610
                          v.bpostnr, v.bcity, v.isil, v.kmd_nr, v.url_homepage, v.url_payment, v.delete_mark,
611
                          v.afsaetningsbibliotek, v.afsaetningsnavn_k, v.knudepunkt, v.p_nr, v.uni_c_nr,
109013 fvs 612
                          v.leder, v.titel, v.leder_samarb,  v.titel_samarb, v.latitude, v.longitude,
88108 fvs 613
                          TO_CHAR(v.dato, \'YYYY-MM-DD\') dato, TO_CHAR(v.bs_dato, \'YYYY-MM-DD\') bs_dato,
614
                          vsn.navn vsn_navn, vsn.bib_nr vsn_bib_nr, vsn.bib_type vsn_bib_type,
615
                          vsn.email vsn_email, vsn.tlf_nr vsn_tlf_nr, vsn.fax_nr vsn_fax_nr,
616
                          TO_CHAR(vsn.dato, \'YYYY-MM-DD\') vsn_dato, vsn.oclc_symbol,
617
                          vsn.cvr_nr vsn_cvr_nr, vsn.p_nr vsn_p_nr, vsn.ean_nummer vsn_ean_nummer,
109013 fvs 618
                          vsn.leder vsn_leder, vsn.titel vsn_titel, vsn.sb_kopibestil,
88108 fvs 619
                          vb.best_modt, vb.best_modt_luk, vb.best_modt_luk_eng,
109013 fvs 620
                          txt.aabn_tid, txt.kvt_tekst_fjl, txt.service_tekst, eng.aabn_tid_e, eng.kvt_tekst_fjl_e, hold.holdeplads,
88108 fvs 621
                          bestil.url_serv_dkl, bestil.support_email, bestil.support_tlf, bestil.ncip_address, bestil.ncip_password,
622
                          kat.url_best_blanket, kat.url_best_blanket_text, kat.url_laanerstatus, kat.ncip_lookup_user,
623
                          kat.ncip_renew, kat.ncip_cancel, kat.ncip_update_request, kat.filial_vsn,
624
                          vd.mailbestil_via, vd.url_itemorder_bestil, vd.zbestil_groupid, vd.zbestil_userid, vd.zbestil_passw,
109075 fvs 625
                          vd.holdingsformat, vd.svar_email, vd.best_txt,
88108 fvs 626
                          ors.shipping ors_shipping, ors.cancel ors_cancel, ors.answer ors_answer,
627
                          ors.cancelreply ors_cancelreply, ors.cancel_answer_synchronic ors_cancel_answer_synchronic,
628
                          ors.renew ors_renew, ors.renewanswer ors_renewanswer,
629
                          ors.renew_answer_synchronic ors_renew_answer_synchronic,
630
                          ors.iso18626_address, ors.iso18626_password
98577 fvs 631
                     FROM vip v, vip_vsn vsn, vip_danbib vd, vip_beh vb, vip_txt txt, vip_txt_eng eng,
632
                          vip_sup sup, vip_bogbus_holdeplads hold, vip_bestil bestil, vip_kat kat, open_agency_ors ors
633
                    WHERE ' . $filter_sql . '
634
                      AND v.kmd_nr = vsn.bib_nr (+)
635
                      AND v.bib_nr = vd.bib_nr (+)
636
                      AND v.bib_nr = vb.bib_nr (+)
637
                      AND v.bib_nr = sup.bib_nr (+)
638
                      AND v.bib_nr = txt.bib_nr (+)
639
                      AND v.bib_nr = hold.bib_nr (+)
640
                      AND v.bib_nr = eng.bib_nr (+)
641
                      AND v.bib_nr = bestil.bib_nr (+)
642
                      AND v.bib_nr = ors.bib_nr (+)
643
                      AND v.bib_nr = kat.bib_nr (+)
644
                    ORDER BY vsn.bib_nr ASC, v.bib_nr ASC';
95192 fvs 645
            $this->watch->start('sql1');
88108 fvs 646
            $oci->set_query($sql);
95192 fvs 647
            $this->watch->stop('sql1');
109350 fvs 648
            $this->watch->start('fetch');
88108 fvs 649
            while ($row = $oci->fetch_into_assoc()) {
650
              if (empty($curr_bib)) {
651
                $curr_bib = $row['BIB_NR'];
70996 fvs 652
              }
88108 fvs 653
              if ($curr_bib <> $row['BIB_NR']) {
94825 fvs 654
                Object::set_array_value($res, 'registryInfo', $registryInfo);
88108 fvs 655
                unset($registryInfo);
656
                $curr_bib = $row['BIB_NR'];
75288 fvs 657
              }
88108 fvs 658
              if ($row) {
659
                self::fill_pickupAgency($registryInfo->pickupAgency->_value, $row);
89658 fvs 660
                $dbc_target = $this->config->get_value('dbc_target', 'setup');
88108 fvs 661
                if ($row['HOLDINGSFORMAT'] == 'B') {
662
                  self::use_dbc_as_z3950_target($row, $dbc_target['z3950'], $param->authentication->_value);
663
                  self::use_dbc_as_iso18626_target($row, $dbc_target['iso18626']);
664
                }
665
                if ($row['MAILBESTIL_VIA'] == 'C') {
666
                  self::set_z3950Ill($registryInfo, $row);
667
                }
668
                elseif ($row['MAILBESTIL_VIA'] == 'E') {
669
                  self::set_iso18626($registryInfo, $row);
94059 fvs 670
                  if (empty($row['URL_ITEMORDER_BESTIL']) || !in_array($row['HOLDINGSFORMAT'], array('A', '', NULL))) {
671
                    self::use_dbc_as_z3950_target($row, $dbc_target['z3950'], $param->authentication->_value);
672
                  }
89658 fvs 673
                  self::set_z3950Ill($registryInfo, $row, FALSE);
88108 fvs 674
                }
75288 fvs 675
              }
70996 fvs 676
            }
109350 fvs 677
            $this->watch->stop('fetch');
95042 fvs 678
            if ($registryInfo) {
94825 fvs 679
              Object::set_array_value($res, 'registryInfo', $registryInfo);
95042 fvs 680
            }
70996 fvs 681
        }
94059 fvs 682
        catch (ociException $e) {
95192 fvs 683
          $this->watch->stop('sql1');
94059 fvs 684
          verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 685
          Object::set_value($res, 'error', 'service_unavailable');
94059 fvs 686
        }
70996 fvs 687
      }
94059 fvs 688
    }
689
    //var_dump($res); var_dump($param); die();
94825 fvs 690
    Object::set_value($ret, 'getRegistryInfoResponse', $res);
691
    $ret = $this->objconvert->set_obj_namespace($ret, $this->xmlns['oa']);
692
    if (empty($res->error)) $this->cache->set($cache_key, $ret);
95192 fvs 693
    $this->watch->stop('entry');
94825 fvs 694
    return $ret;
695
  }
57216 fvs 696
 
94825 fvs 697
  /** \brief Fetch SaouLicenseInfo
698
   *
699
   * Request:
700
   * - agencyId
701
   * Response:
702
   * - saouLicenseInfo (see xsd for parameters)
703
   * or
704
   * - error
705
   */
706
  public function getSaouLicenseInfo($param) {
707
    if (!$this->aaa->has_right('netpunkt.dk', 500))
708
      Object::set_value($res, 'error', 'authentication_error');
709
    else {
710
      $agency = self::strip_agency($param->agencyId->_value);
711
      $cache_key = 'OA_getSLI' . $this->config->get_inifile_hash() . $agency;
712
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
713
      if ($ret = $this->cache->get($cache_key)) {
714
        verbose::log(STAT, 'Cache hit');
715
        return $ret;
716
      }
95192 fvs 717
      $this->watch->start('entry');
718
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
94825 fvs 719
      if (empty($res->error)) {
63587 fvs 720
        try {
94825 fvs 721
          if ($agency) {
722
            $oci->bind('bind_agency', $agency);
723
            $where = 'ud.bib_nr = :bind_agency AND ';
724
          }
725
          $fb_licens = 'fb_licens';
726
          $oci->bind('bind_fb_licens', $fb_licens);
95192 fvs 727
          $this->watch->start('sql1');
94825 fvs 728
          $oci->set_query('SELECT ud.bib_nr, domain, proxyurl
98577 fvs 729
                             FROM user_domains ud, licensguide lg
730
                            WHERE ' . $where . ' origin_source = :bind_fb_licens
731
                              AND ud.bib_nr = lg.bib_nr (+)
732
                            ORDER BY bib_nr');
95192 fvs 733
          $this->watch->stop('sql1');
94825 fvs 734
          $last_bib = '';
109350 fvs 735
          $this->watch->start('fetch');
94825 fvs 736
          while ($sl_row = $oci->fetch_into_assoc()) {
737
            if ($last_lib != $sl_row['BIB_NR']) {
738
              if ($last_lib) {
739
                Object::set_array_value($res, 'saouLicenseInfo', $sl);
740
                unset($sl);
63587 fvs 741
              }
94825 fvs 742
              $last_lib = $sl_row['BIB_NR'];
743
              Object::set_value($sl, 'agencyId', $sl_row['BIB_NR']);
744
              if ($sl_row['PROXYURL']) {
745
                Object::set_value($sl, 'proxyUrl', $sl_row['PROXYURL']);
746
              }
63587 fvs 747
            }
94825 fvs 748
            Object::set_array_value($sl, 'ipAddress', $sl_row['DOMAIN']);
63587 fvs 749
          }
109350 fvs 750
          $this->watch->stop('fetch');
94825 fvs 751
          if ($sl) {
752
            Object::set_array_value($res, 'saouLicenseInfo', $sl);
63587 fvs 753
          }
754
        }
94825 fvs 755
        catch (ociException $e) {
95192 fvs 756
          $this->watch->stop('sql1');
94825 fvs 757
          verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
758
          Object::set_value($res, 'error', 'service_unavailable');
759
        }
63587 fvs 760
      }
761
    }
94825 fvs 762
    //var_dump($res); var_dump($param); die();
763
    Object::set_value($ret, 'getSaouLicenseInfoResponse', $res);
764
    $ret = $this->objconvert->set_obj_namespace($ret, $this->xmlns['oa']);
765
    if (empty($res->error)) $this->cache->set($cache_key, $ret);
95192 fvs 766
    $this->watch->stop('entry');
94825 fvs 767
    return $ret;
768
  }
63587 fvs 769
 
92921 fvs 770
  /** \brief Fetch search profiles for the openSearch service
771
   *
772
   * Request:
773
   * - agencyId
774
   * Response:
775
   * - searchCollection
776
   * - - agencyId
777
   * - - profile
778
   * - - - profileName
779
   * - - - source
780
   * - - - - sourceName
781
   * - - - - sourceIdentifier
782
   * - - - - 1 above or 2 below
783
   * - - - - sourceOwner
784
   * - - - - sourceFormat
785
   */
786
  public function searchCollection($param) {
787
    if (!$this->aaa->has_right('netpunkt.dk', 500))
94616 fvs 788
      Object::set_value($res, 'error', 'authentication_error');
92921 fvs 789
    else {
790
      $agency = self::strip_agency($param->agencyId->_value);
791
      $cache_key = 'OA_opeSC_' . $this->config->get_inifile_hash() . $agency;
792
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
793
      if ($ret = $this->cache->get($cache_key)) {
794
        verbose::log(STAT, 'Cache hit');
795
        return $ret;
796
      }
95192 fvs 797
      $this->watch->start('entry');
798
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
92921 fvs 799
      if (empty($res->error)) {
800
        try {
801
          // hent alle broend_to_kilder med searchable == "Y" og loop over dem.
802
          // find de kilder som profilen kender:
803
          // Søgbarheden (sourceSearchable) gives hvis den findes i den givne profil (broendkilde_id findes)
804
          // Søgbargeden kan evt. begrænses af broend_to_kilder.access_for
805
          $oci->bind('bind_y', 'Y');
95192 fvs 806
          $this->watch->start('sql1');
92921 fvs 807
          $oci->set_query('SELECT DISTINCT *
98577 fvs 808
                             FROM broend_to_kilder
809
                            WHERE searchable = :bind_y
810
                            ORDER BY upper(name)');
92921 fvs 811
          $kilder_res = $oci->fetch_all_into_assoc();
95192 fvs 812
          $this->watch->stop('sql1');
92921 fvs 813
          foreach ($kilder_res as $kilde) {
814
            $kilder[$kilde['ID_NR']] = $kilde;
815
          }
816
          if ($agency) {
817
            $oci->bind('bind_agency', $agency);
818
            $sql_add = ' AND broend_to_profiler.bib_nr = :bind_agency';
819
          }
95192 fvs 820
          $this->watch->start('sql2');
92921 fvs 821
          $oci->set_query('SELECT broendkilde_id, profil_id, name, broend_to_profiler.bib_nr
98577 fvs 822
                             FROM broendprofil_to_kilder, broend_to_profiler
823
                            WHERE broendprofil_to_kilder.broendkilde_id IS NOT NULL
824
                              AND broendprofil_to_kilder.profil_id IS NOT NULL
825
                              AND broend_to_profiler.id_nr = broendprofil_to_kilder.profil_id (+)' . $sql_add);
92921 fvs 826
          $profil_res = $oci->fetch_all_into_assoc();
95192 fvs 827
          $this->watch->stop('sql2');
92932 fvs 828
          $profiles = array();
92921 fvs 829
          foreach ($profil_res as $pr) {
830
            if ($pr['PROFIL_ID'] && $pr['BROENDKILDE_ID']) {
831
              $profiles[$pr['BIB_NR']][$pr['PROFIL_ID']][$pr['NAME']][] = $pr['BROENDKILDE_ID'];
832
            }
833
          }
834
          foreach ($profiles as $agency => $agency_profiles) {
835
            foreach ($agency_profiles as $profile) {
836
              foreach ($profile as $profile_name => $kilde_ids) {
837
                foreach ($kilde_ids as $kilde_id) {
92932 fvs 838
                  if ($kilder[$kilde_id] && (empty($kilder[$kilde_id]['ACCESS_FOR']) || strpos($kilder[$kilde_id]['ACCESS_FOR'], $agency) !== FALSE)) {
94825 fvs 839
                    Object::set_value($s->_value, 'sourceName', $kilder[$kilde_id]['NAME']);
840
                    Object::set_value($s->_value, 'sourceIdentifier', str_replace('[agency]', $agency, $kilder[$kilde_id]['IDENTIFIER']));
841
                    $source[] = $s;
92921 fvs 842
                    unset($s);
843
                  }
844
                }
845
                if ($source) {
94825 fvs 846
                  Object::set_value($p->_value, 'profileName', $profile_name);
847
                  $p->_value->source = $source;
848
                  $res_profile[] = $p;
92921 fvs 849
                  unset($p);
850
                  unset($source);
851
                }
852
              }
853
            }
854
            if ($res_profile) {
94825 fvs 855
              Object::set_value($a, 'agencyId', $agency);
92921 fvs 856
              $a->profile = $res_profile;
94825 fvs 857
              Object::set_array_value($res, 'searchCollection', $a);
92921 fvs 858
              unset($a);
859
              unset($res_profile);
860
            }
861
          }
92932 fvs 862
          if (empty($res)) {
94616 fvs 863
            Object::set_value($res, 'error', 'profile_not_found');
92932 fvs 864
          }
92921 fvs 865
        }
866
        catch (ociException $e) {
95192 fvs 867
          $this->watch->stop('sql1');
868
          $this->watch->stop('sql2');
869
          verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
870
          Object::set_value($res, 'error', 'service_unavailable');
92921 fvs 871
        }
872
      }
873
    }
95192 fvs 874
    //var_dump($res); var_dump($param); die();
875
    Object::set_value($ret, 'searchCollectionResponse', $res);
876
    $ret = $this->objconvert->set_obj_namespace($ret, $this->xmlns['oa']);
877
    if (empty($res->error)) $this->cache->set($cache_key, $ret);
878
    $this->watch->stop('entry');
879
    return $ret;
880
  }
92921 fvs 881
 
882
 
95192 fvs 883
  /** \brief Fetching different info for the ORS-system
884
   *
885
   * Request:
886
   * - agencyId
887
   * - service
888
   * Response (depending on service):
889
   * -  information - see xsd for parameters
890
   * or orsAnswer - see xsd for parameters
891
   * or orsCancel - see xsd for parameters
892
   * or orsCancelReply - see xsd for parameters
893
   * or orsCancelRequestUser - see xsd for parameters
894
   * or orsEndUserRequest - see xsd for parameters
895
   * or orsEndUserIllRequest - see xsd for parameters
896
   * or orsItemRequest - see xsd for parameters
897
   * or orsLookupUser - see xsd for parameters
898
   * or orsRecall - see xsd for parameters
899
   * or orsReceipt - see xsd for parameters
900
   * or orsRenew - see xsd for parameters
901
   * or orsRenewAnswer - see xsd for parameters
902
   * or orsRenewItemUser - see xsd for parameters
903
   * or orsShipping - see xsd for parameters
904
   * or orsStatusRequest - see xsd for parameters
905
   * or orsStatusResponse - see xsd for parameters
906
   * or serverInformation - see xsd for parameters
907
   * or userOrderParameters - see xsd for parameters
908
   * or userParameters - see xsd for parameters
909
   * or error
910
   */
911
  public function service($param) {
912
    if (!$this->aaa->has_right('netpunkt.dk', 500))
913
      Object::set_value($res, 'error', 'authentication_error');
914
    else {
915
      $agency = self::strip_agency($param->agencyId->_value);
916
      $cache_key = 'OA_ser_' . $this->config->get_inifile_hash() . $agency . $param->service->_value;
917
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
918
      if ($ret = $this->cache->get($cache_key)) {
919
        verbose::log(STAT, 'Cache hit');
920
        return $ret;
921
      }
922
      $this->watch->start('entry');
923
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
924
      if (empty($res->error)) {
925
        $tab_col['v'] = array('bib_nr', 'navn', 'tlf_nr', 'fax_nr', 'email', 'badr', 'bpostnr', 'bcity', 'type', '*');
926
        $tab_col['vv'] = array('bib_nr', 'navn', 'tlf_nr', 'fax_nr', 'email', 'badr', 'bpostnr', 'bcity', 'bib_type', '*');
927
        $tab_col['vb'] = array('bib_nr', '*');
928
        $tab_col['vbst'] = array('bib_nr', 'ncip_address', '*');
929
        $tab_col['vd'] = array('bib_nr', 'svar_fax', 'svar_email', '*');
930
        $tab_col['vk'] = array('bib_nr', '*');
931
        $tab_col['oao'] = array('bib_nr', '*');
932
        foreach ($tab_col as $prefix => $arr) {
933
          foreach ($arr as $col) {
934
            $q .= (empty($q) ? '' : ', ') .
935
              $prefix . '.' . $col .
936
              ($col == '*' ? '' : ' "' . strtoupper($prefix . '.' . $col) . '"');
937
          }
37646 fvs 938
        }
939
        try {
95192 fvs 940
          $oci->bind('bind_bib_nr', $agency);
941
          $this->watch->start('sql1');
942
          $oci->set_query('SELECT ' . $q . '
98577 fvs 943
                             FROM vip v, vip_vsn vv, vip_beh vb, vip_bestil vbst, vip_danbib vd, vip_kat vk, open_agency_ors oao
944
                            WHERE v.bib_nr = vd.bib_nr (+)
945
                              AND v.kmd_nr = vv.bib_nr (+)
946
                              AND v.bib_nr = vk.bib_nr (+)
947
                              AND v.bib_nr = vb.bib_nr (+)
948
                              AND v.bib_nr = vbst.bib_nr (+)
949
                              AND v.bib_nr = oao.bib_nr (+)
950
                              AND v.bib_nr = :bind_bib_nr');
109350 fvs 951
          $this->watch->start('fetch1');
95192 fvs 952
          $oa_row = $oci->fetch_into_assoc();
109350 fvs 953
          $this->watch->stop('fetch1');
95192 fvs 954
          $this->watch->stop('sql1');
955
          self::sanitize_array($oa_row);
956
          if ($param->service->_value == 'information') {
957
            $consortia = array();
958
            if ($oa_row['FILIAL_VSN'] <> 'J' && $oa_row['KMD_NR']) {
959
              $help = $oa_row['KMD_NR'];
960
            }
961
            else {
962
              $help = $agency;
963
            }
964
            $oci->bind('bind_bib_nr', $help);
965
            $this->watch->start('sql2');
966
            $oci->set_query('SELECT *
98577 fvs 967
                               FROM vip_viderestil
968
                              WHERE bib_nr = :bind_bib_nr');
109350 fvs 969
            $this->watch->start('fetch2');
95192 fvs 970
            while ($row = $oci->fetch_into_assoc()) {
971
              $vv_row[$row['BIB_NR_VIDERESTIL']] = $row;
972
            }
109350 fvs 973
            $this->watch->stop('fetch2');
95192 fvs 974
            $this->watch->stop('sql2');
975
            if ($vv_row) {
976
              $oci->bind('bind_bib_nr', $help);
977
              $this->watch->start('sql3');
978
              $oci->set_query('SELECT vilse
98577 fvs 979
                                 FROM vip, laaneveje
980
                                WHERE (vip.kmd_nr = bibliotek OR vip.bib_nr = bibliotek)
981
                                  AND vip.bib_nr = :bind_bib_nr
982
                                ORDER BY prionr DESC');
109350 fvs 983
              $this->watch->start('fetch3');
95192 fvs 984
              while ($lv_row = $oci->fetch_into_assoc()) {
985
                if ($p = $vv_row[$lv_row['VILSE']]) {
986
                  $consortia[] = $p;
987
                }
988
              }
109350 fvs 989
              $this->watch->start('fetch3');
95192 fvs 990
              $this->watch->stop('sql3');
991
              if (count($vv_row) <> count($consortia)) {
992
                verbose::log(ERROR, 'OpenAgency('.__LINE__.'):: agency ' . $agency .
993
                    ' has libraries in VIP_VIDERESTIL not found in LAANEVEJE');
994
              }
995
            }
996
          }
997
          if ($param->service->_value == 'userOrderParameters') {
998
            if ($oa_row['FILIAL_VSN'] <> 'J' && $oa_row['KMD_NR']) {
999
              $oci->bind('bind_bib_nr', $oa_row['KMD_NR']);
1000
            }
1001
            else {
1002
              $oci->bind('bind_bib_nr', $agency);
1003
            }
1004
            $this->watch->start('sql4');
98577 fvs 1005
            $oci->set_query('SELECT fjernadgang.har_laanertjek fjernadgang_har_laanertjek, fjernadgang.*, fjernadgang_andre.*
1006
                               FROM fjernadgang, fjernadgang_andre
1007
                              WHERE fjernadgang.faust (+) = fjernadgang_andre.faust
1008
                                AND bib_nr = :bind_bib_nr');
95192 fvs 1009
            $fjernadgang_rows = $oci->fetch_all_into_assoc();
1010
            $this->watch->stop('sql4');
1011
          }
37646 fvs 1012
        }
1013
        catch (ociException $e) {
95192 fvs 1014
          verbose::log(FATAL, 'OpenAgency('.__LINE__.'):: OCI select error: ' . $oci->get_error_string());
94616 fvs 1015
          Object::set_value($res, 'error', 'service_unavailable');
95192 fvs 1016
          $this->watch->stop('sql1');
1017
          $this->watch->stop('sql2');
1018
          $this->watch->stop('sql3');
1019
          $this->watch->stop('sql4');
37646 fvs 1020
        }
95192 fvs 1021
        if (empty($oa_row)) {
1022
          Object::set_value($res, 'error', 'agency_not_found');
1023
        }
37646 fvs 1024
        if (empty($res->error)) {
95192 fvs 1025
          //        verbose::log(TRACE, 'OpenAgency('.__LINE__.'):: action=service&agencyId=' . $param->agencyId->_value .  '&service=' . $param->service->_value);
1026
          switch ($param->service->_value) {
1027
            case 'information':
1028
              $inf = &$res->information->_value;
1029
              Object::set_value($inf, 'agencyId', self::normalize_agency($oa_row['VV.BIB_NR']));
1030
              Object::set_value($inf, 'agencyName', $oa_row['VV.NAVN']);
1031
              Object::set_value($inf, 'agencyPhone', $oa_row['VV.TLF_NR']);
1032
              Object::set_value($inf, 'agencyFax', $oa_row['VV.FAX_NR']);
1033
              Object::set_value($inf, 'agencyEmail', $oa_row['VV.EMAIL']);
1034
              Object::set_value($inf, 'agencyType', self::set_agency_type($oa_row['VV.BIB_NR'], $oa_row['VV.BIB_TYPE']));
1035
              Object::set_value($inf, 'agencyCatalogueUrl', $oa_row['URL_BIB_KAT']);
1036
              Object::set_value($inf, 'branchId', self::normalize_agency($oa_row['V.BIB_NR']));
1037
              Object::set_value($inf, 'branchName', $oa_row['V.NAVN']);
1038
              Object::set_value($inf, 'branchPhone', $oa_row['V.TLF_NR']);
1039
              Object::set_value($inf, 'branchFax', $oa_row['VD.SVAR_FAX']);
1040
              Object::set_value($inf, 'branchEmail', $oa_row['V.EMAIL']);
108962 fvs 1041
              Object::set_value($inf, 'branchRejectedRecordsEmail', $oa_row['MAIL_REFUSED_RECORDS'], FALSE);
1042
              Object::set_value($inf, 'branchTransReportEmail', $oa_row['MAIL_DATA_TRANSMISSION'], FALSE);
95192 fvs 1043
              Object::set_value($inf, 'branchType', $oa_row['V.TYPE']);
108962 fvs 1044
              Object::set_value($inf, 'dropOffAgency', $oa_row['AFSAETNINGSBIBLIOTEK'], FALSE);
95192 fvs 1045
              Object::set_value($inf, 'postalAddress', $oa_row['V.BADR']);
1046
              Object::set_value($inf, 'postalCode', $oa_row['V.BPOSTNR']);
1047
              Object::set_value($inf, 'city', $oa_row['V.BCITY']);
1048
              Object::set_value($inf, 'isil', $oa_row['ISIL']);
1049
              Object::set_value($inf, 'junction', $oa_row['KNUDEPUNKT']);
1050
              Object::set_value($inf, 'kvik', ($oa_row['KVIK'] == 'kvik' ? 'YES' : 'NO'));
1051
              Object::set_value($inf, 'lookupUrl', $oa_row['URL_VIDERESTIL']);
1052
              Object::set_value($inf, 'norfri', ($oa_row['NORFRI'] == 'norfri' ? 'YES' : 'NO'));
1053
              Object::set_value($inf, 'requestOrder', $oa_row['USE_LAANEVEJ']);
1054
              Object::set_value($inf, 'sender', self::normalize_agency($oa_row['CHANGE_REQUESTER']));
1055
              if (is_null($inf->sender->_value))
1056
                Object::set_value($inf, 'sender', self::normalize_agency($oa_row['V.BIB_NR']));
1057
              Object::set_value($inf, 'replyToEmail', $oa_row['VD.SVAR_EMAIL']);
1058
              foreach ($consortia as $c_key => &$c) {
1059
                Object::set_value($inf->consortia[$c_key]->_value, 'agencyId', $c['BIB_NR_VIDERESTIL']);
1060
                Object::set_value($inf->consortia[$c_key]->_value, 'lookupUrl', $c['URL_VIDERESTIL']);
64806 fvs 1061
              }
95192 fvs 1062
              //print_r($oa_row); var_dump($res->information->_value); die();
1063
              break;
1064
            case 'orsAnswer':
1065
              $orsA = &$res->orsAnswer->_value;
1066
              Object::set_value($orsA, 'responder', self::normalize_agency($oa_row['OAO.BIB_NR']));
1067
              if ($oa_row['MAILBESTIL_VIA'] == 'E' || $oa_row['ANSWER'] == '18626') {
1068
                self::fill_iso18626_protocol($orsA, $oa_row);
1069
              }
88108 fvs 1070
              else {
95192 fvs 1071
                Object::set_value($orsA, 'willReceive', (in_array($oa_row['ANSWER'], array('z3950', 'mail', 'ors')) ? 'YES' : ''));
1072
                Object::set_value($orsA, 'synchronous', 0);
1073
                Object::set_value($orsA, 'protocol', self::normalize_iso18626($oa_row['ANSWER']));
1074
                if ($oa_row['ANSWER'] == 'z3950') {
1075
                  Object::set_value($orsA, 'address', $oa_row['ANSWER_Z3950_ADDRESS']);
1076
                }
1077
                elseif ($oa_row['ANSWER'] == 'mail') {
1078
                  Object::set_value($orsA, 'address', $oa_row['ANSWER_MAIL_ADDRESS']);
1079
                }
1080
                Object::set_value($orsA, 'userId', $oa_row['ANSWER_Z3950_USER']);
1081
                Object::set_value($orsA, 'groupId', $oa_row['ANSWER_Z3950_GROUP']);
1082
                Object::set_value($orsA, 'passWord', ($oa_row['ANSWER'] == 'z3950' ? $oa_row['ANSWER_Z3950_PASSWORD'] : $oa_row['ANSWER_NCIP_AUTH']));
37646 fvs 1083
              }
95192 fvs 1084
              //var_dump($res->orsAnswer->_value); die();
1085
              break;
1086
            case 'orsCancelRequestUser':
1087
              $orsCRU = &$res->orsCancelRequestUser->_value;
1088
              Object::set_value($orsCRU, 'responder', self::normalize_agency($oa_row['VK.BIB_NR']));
1089
              Object::set_value($orsCRU, 'willReceive', ($oa_row['NCIP_CANCEL'] == 'J' ? 'YES' : 'NO'));
1090
              Object::set_value($orsCRU, 'synchronous', 0);
1091
              Object::set_value($orsCRU, 'address', $oa_row['NCIP_CANCEL_ADDRESS']);
1092
              Object::set_value($orsCRU, 'passWord', $oa_row['NCIP_CANCEL_PASSWORD']);
1093
              //var_dump($res->orsCancelRequestUser->_value); die();
1094
              break;
1095
            case 'orsEndUserRequest':
1096
              $orsEUR = &$res->orsEndUserRequest->_value;
1097
              Object::set_value($orsEUR, 'responder', self::normalize_agency($oa_row['VB.BIB_NR']));
1098
              Object::set_value($orsEUR, 'willReceive', ($oa_row['BEST_MODT'] == 'J' ? 'YES' : 'NO'));
1099
              Object::set_value($orsEUR, 'synchronous', 0);
1100
              switch ($oa_row['BESTIL_VIA']) {
1101
                case 'A':
1102
                  Object::set_value($orsEUR, 'protocol', 'mail');
1103
                  Object::set_value($orsEUR, 'address', $oa_row['EMAIL_BESTIL']);
1104
                  Object::set_value($orsEUR, 'format', 'text');
1105
                  break;
1106
                case 'B':
1107
                  Object::set_value($orsEUR, 'protocol', 'mail');
1108
                  Object::set_value($orsEUR, 'address', $oa_row['EMAIL_BESTIL']);
1109
                  Object::set_value($orsEUR, 'format', 'ill0');
1110
                  break;
1111
                case 'C':
1112
                  Object::set_value($orsEUR, 'protocol', 'ors');
1113
                  break;
1114
                case 'D':
1115
                  Object::set_value($orsEUR, 'protocol', 'ncip');
1116
                  Object::set_value($orsEUR, 'address', $oa_row['VBST.NCIP_ADDRESS']);
1117
                  Object::set_value($orsEUR, 'passWord', $oa_row['NCIP_PASSWORD']);
1118
                  break;
88108 fvs 1119
              }
95192 fvs 1120
              //var_dump($res->orsEndUserRequest->_value); die();
1121
              break;
1122
            case 'orsEndUserIllRequest':
1123
              $orsEUIR = &$res->orsEndUserIllRequest->_value;
1124
              Object::set_value($orsEUIR, 'responder', self::normalize_agency($oa_row['VB.BIB_NR']));
1125
              Object::set_value($orsEUIR, 'willReceive', ($oa_row['BEST_MODT'] == 'J' ? 'YES' : 'NO'));
1126
              Object::set_value($orsEUIR, 'synchronous', 0);
1127
              switch ($oa_row['BESTIL_FJL_VIA']) {
1128
                case 'A':
1129
                  Object::set_value($orsEUIR, 'protocol', 'mail');
1130
                  Object::set_value($orsEUIR, 'address', $oa_row['EMAIL_FJL_BESTIL']);
1131
                  Object::set_value($orsEUIR, 'format', 'text');
1132
                  break;
1133
                case 'B':
1134
                  Object::set_value($orsEUIR, 'protocol', 'mail');
1135
                  Object::set_value($orsEUIR, 'address', $oa_row['EMAIL_FJL_BESTIL']);
1136
                  Object::set_value($orsEUIR, 'format', 'ill0');
1137
                  break;
1138
                case 'C':
1139
                  Object::set_value($orsEUIR, 'protocol', 'ors');
1140
                  break;
1141
              }
1142
              break;
1143
            case 'orsItemRequest':
1144
              $orsIR = &$res->orsItemRequest->_value;
1145
              Object::set_value($orsIR, 'responder', self::normalize_agency($oa_row['VD.BIB_NR']));
1146
              switch ($oa_row['MAILBESTIL_VIA']) {
1147
                case 'A':
1148
                  Object::set_value($orsIR, 'willReceive', 'YES');
1149
                  Object::set_value($orsIR, 'synchronous', 0);
1150
                  Object::set_value($orsIR, 'protocol', 'mail');
1151
                  Object::set_value($orsIR, 'address', $oa_row['BEST_EMAIL']);
1152
                  break;
1153
                case 'B':
1154
                  Object::set_value($orsIR, 'willReceive', 'YES');
1155
                  Object::set_value($orsIR, 'synchronous', 0);
1156
                  Object::set_value($orsIR, 'protocol', 'ors');
1157
                  break;
1158
                case 'C':
1159
                  Object::set_value($orsIR, 'willReceive', 'YES');
1160
                  Object::set_value($orsIR, 'synchronous', 0);
1161
                  Object::set_value($orsIR, 'protocol', 'z3950');
1162
                  Object::set_value($orsIR, 'address', $oa_row['URL_ITEMORDER_BESTIL']);
1163
                  break;
1164
                case 'E':
1165
                  self::fill_iso18626_protocol($orsIR, $oa_row);
1166
                  break;
1167
                case 'D':
1168
                default:
1169
                  Object::set_value($orsIR, 'willReceive', 'NO');
1170
                  if ($oa_row['BEST_TXT']) {
1171
                    $orsIR->reason = self::value_and_language($oa_row['BEST_TXT'], 'dan');
95042 fvs 1172
                  }
95192 fvs 1173
                  break;
1174
              }
1175
              if (in_array($orsIR->protocol->_value, array('mail', 'ors', 'z3950'))) {
108962 fvs 1176
                Object::set_value($orsIR, 'userId', $oa_row['ZBESTIL_USERID'], FALSE);
1177
                Object::set_value($orsIR, 'groupId', $oa_row['ZBESTIL_GROUPID'], FALSE);
1178
                Object::set_value($orsIR, 'passWord', $oa_row['ZBESTIL_PASSW'], FALSE);
95192 fvs 1179
                if ($orsIR->protocol->_value == 'mail') {
1180
                  switch ($oa_row['FORMAT_BEST']) {
1181
                    case 'illdanbest':
1182
                      Object::set_value($orsIR, 'format', 'text');
1183
                      break;
1184
                    case 'ill0form':
1185
                    case 'ill5form':
1186
                      Object::set_value($orsIR, 'format', 'ill0');
1187
                      break;
1188
                  }
74702 fvs 1189
                }
37646 fvs 1190
              }
95192 fvs 1191
              //var_dump($res->orsItemRequest->_value); die();
1192
              break;
1193
            case 'orsLookupUser':
1194
              $orsLU = &$res->orsLookupUser->_value;
1195
              Object::set_value($orsLU, 'responder', self::normalize_agency($oa_row['VK.BIB_NR']));
1196
              Object::set_value($orsLU, 'willReceive', ($oa_row['NCIP_LOOKUP_USER'] == 'J' ? 'YES' : 'NO'));
1197
              Object::set_value($orsLU, 'synchronous', 0);
1198
              Object::set_value($orsLU, 'address', $oa_row['NCIP_LOOKUP_USER_ADDRESS']);
1199
              Object::set_value($orsLU, 'passWord', $oa_row['NCIP_LOOKUP_USER_PASSWORD']);
1200
              //var_dump($res->orsLookupUser->_value); die();
1201
              break;
1202
            case 'orsRecall':
1203
              $orsR = &$res->orsRecall->_value;
1204
              Object::set_value($orsR, 'responder', self::normalize_agency($oa_row['OAO.BIB_NR']));
111515 fvs 1205
              if (($oa_row['MAILBESTIL_VIA'] == 'E') ||
1206
                 (($oa_row['MAILBESTIL_VIA'] == 'D') && $oa_row['ISO18626_ADDRESS'])) {
95192 fvs 1207
                self::fill_iso18626_protocol($orsR, $oa_row);
37646 fvs 1208
              }
83280 fvs 1209
              else {
95192 fvs 1210
                Object::set_value($orsR, 'willReceive', (in_array($oa_row['RECALL'], array('z3950', 'mail', 'ors')) ? 'YES' : ''));
1211
                Object::set_value($orsR, 'synchronous', 0);
1212
                Object::set_value($orsR, 'protocol', self::normalize_iso18626($oa_row['RECALL']));
1213
                Object::set_value($orsR, 'address', '');
1214
                Object::set_value($orsR, 'userId', $oa_row['RECALL_Z3950_USER']);
1215
                Object::set_value($orsR, 'groupId', $oa_row['RECALL_Z3950_GROUP']);
1216
                Object::set_value($orsR, 'passWord', ($oa_row['RECALL'] == 'z3950' ? $oa_row['RECALL_Z3950_PASSWORD'] : $oa_row['RECALL_NCIP_AUTH']));
1217
                if ($oa_row['RECALL'] == 'z3950')
1218
                  Object::set_value($orsR, 'address', $oa_row['RECALL_Z3950_ADDRESS']);
83280 fvs 1219
              }
95192 fvs 1220
              //var_dump($res->orsRecall->_value); die();
1221
              break;
1222
            case 'orsReceipt':
1223
              $orsR = &$res->orsReceipt->_value;
1224
              Object::set_value($orsR, 'responder', self::normalize_agency($oa_row['VD.BIB_NR']));
1225
              Object::set_value($orsR, 'willReceive', (in_array($oa_row['MAILKVITTER_VIA'], array('A', 'B', 'C')) ? 'YES' : 'NO'));
1226
              Object::set_value($orsR, 'synchronous', 0);
1227
              if ($oa_row['MAILKVITTER_VIA'] == 'C') {
1228
                Object::set_value($orsR, 'protocol', 'https');
1229
                Object::set_value($orsR, 'address', $oa_row['OPENRECEIPT_URL']);
1230
                Object::set_value($orsR, 'passWord', $oa_row['OPENRECEIPT_PASSWORD']);
1231
                Object::set_value($orsR, 'format', 'xml');
1232
              }
1233
              else {
1234
                if ($oa_row['MAILKVITTER_VIA'] == 'A') {
1235
                  Object::set_value($orsR, 'protocol', 'mail');
71439 fvs 1236
                }
95192 fvs 1237
                elseif ($oa_row['MAILKVITTER_VIA'] == 'B') {
1238
                  Object::set_value($orsR, 'protocol', 'ors');
71439 fvs 1239
                }
1240
                else {
95192 fvs 1241
                  Object::set_value($orsR, 'protocol', '');
71439 fvs 1242
                }
95192 fvs 1243
                Object::set_value($orsR, 'address', $oa_row['KVIT_EMAIL']);
1244
                if ($oa_row['FORMAT_KVIT'] == 'ill0form') {
1245
                  Object::set_value($orsR, 'format', 'ill0');
71439 fvs 1246
                }
95192 fvs 1247
                elseif ($oa_row['FORMAT_KVIT'] == 'ill5form') {
1248
                  Object::set_value($orsR, 'format', 'ill0');
71439 fvs 1249
                }
95192 fvs 1250
                elseif ($oa_row['FORMAT_KVIT'] == 'illdanbest') {
1251
                  Object::set_value($orsR, 'format', 'text');
71439 fvs 1252
                }
95192 fvs 1253
              }
1254
              //var_dump($res->orsReceipt->_value); die();
1255
              break;
1256
            case 'orsRenew':
1257
              $orsR = &$res->orsRenew->_value;
1258
              Object::set_value($orsR, 'responder', self::normalize_agency($oa_row['OAO.BIB_NR']));
111515 fvs 1259
              if (($oa_row['MAILBESTIL_VIA'] == 'E') ||
1260
                 (($oa_row['MAILBESTIL_VIA'] == 'D') && $oa_row['ISO18626_ADDRESS'])) {
95192 fvs 1261
                self::fill_iso18626_protocol($orsR, $oa_row);
1262
              }
1263
              else {
1264
                if ($oa_row['RENEW'] == 'z3950' || $oa_row['RENEW'] == 'ors') {
1265
                  Object::set_value($orsR, 'willReceive', 'YES');
1266
                  Object::set_value($orsR, 'synchronous', '0');
1267
                  Object::set_value($orsR, 'protocol', self::normalize_iso18626($oa_row['RENEW']));
1268
                  if ($oa_row['RENEW'] == 'z3950') {
1269
                    Object::set_value($orsR, 'address', $oa_row['RENEW_Z3950_ADDRESS']);
1270
                    Object::set_value($orsR, 'userId', $oa_row['RENEW_Z3950_USER']);
1271
                    Object::set_value($orsR, 'groupId', $oa_row['RENEW_Z3950_GROUP']);
1272
                    Object::set_value($orsR, 'passWord', $oa_row['RENEW_Z3950_PASSWORD']);
95042 fvs 1273
                  }
88108 fvs 1274
                }
1275
                else {
95192 fvs 1276
                  Object::set_value($orsR, 'willReceive', 'NO');
1277
                  Object::set_value($orsR, 'synchronous', '0');
88108 fvs 1278
                }
95192 fvs 1279
              }
1280
              //var_dump($res->orsRenew->_value); die();
1281
              break;
1282
            case 'orsRenewAnswer':
1283
              $orsRA = &$res->orsRenewAnswer->_value;
1284
              Object::set_value($orsRA, 'responder', self::normalize_agency($oa_row['OAO.BIB_NR']));
1285
              if ($oa_row['MAILBESTIL_VIA'] == 'E' || $oa_row['ANSWER'] == '18626') {
1286
                self::fill_iso18626_protocol($orsRA, $oa_row);
1287
              }
1288
              else {
1289
                if ($oa_row['RENEW'] == 'z3950' || $oa_row['RENEW'] == 'ors') {
1290
                  if ($oa_row['RENEWANSWER'] == 'z3950' || $oa_row['RENEWANSWER'] == 'ors') {
1291
                    Object::set_value($orsRA, 'willReceive', 'YES');
1292
                    Object::set_value($orsRA, 'synchronous', $oa_row['RENEW_ANSWER_SYNCHRONIC'] == 'J' ? 1 : 0);
1293
                    Object::set_value($orsRA, 'protocol', self::normalize_iso18626($oa_row['RENEWANSWER']));
1294
                    if ($oa_row['RENEWANSWER'] == 'z3950') {
1295
                      Object::set_value($orsRA, 'address', $oa_row['RENEWANSWER_Z3950_ADDRESS']);
1296
                      Object::set_value($orsRA, 'userId', $oa_row['RENEWANSWER_Z3950_USER']);
1297
                      Object::set_value($orsRA, 'groupId', $oa_row['RENEWANSWER_Z3950_GROUP']);
1298
                      Object::set_value($orsRA, 'passWord', $oa_row['RENEWANSWER_Z3950_PASSWORD']);
74702 fvs 1299
                    }
1300
                  }
1301
                  else {
95192 fvs 1302
                    Object::set_value($orsRA, 'willReceive', 'NO');
1303
                    Object::set_value($orsRA, 'synchronous', 0);
74702 fvs 1304
                  }
1305
                }
95192 fvs 1306
              }
1307
              //var_dump($res->orsRenewAnswer->_value); die();
1308
              break;
1309
            case 'orsCancel':
1310
              $orsC = &$res->orsCancel->_value;
1311
              Object::set_value($orsC, 'responder', self::normalize_agency($oa_row['OAO.BIB_NR']));
111515 fvs 1312
              if (($oa_row['MAILBESTIL_VIA'] == 'E') ||
1313
                 (($oa_row['MAILBESTIL_VIA'] == 'D') && $oa_row['ISO18626_ADDRESS'])) {
95192 fvs 1314
                self::fill_iso18626_protocol($orsC, $oa_row);
1315
              }
1316
              else {
1317
                if ($oa_row['CANCEL'] == 'z3950' || $oa_row['CANCEL'] == 'ors') {
1318
                  Object::set_value($orsC, 'willReceive', 'YES');
1319
                  Object::set_value($orsC, 'synchronous', 0);
1320
                  Object::set_value($orsC, 'protocol', self::normalize_iso18626($oa_row['CANCEL']));
1321
                  if ($oa_row['CANCEL'] == 'z3950') {
1322
                    Object::set_value($orsC, 'address', $oa_row['CANCEL_Z3950_ADDRESS']);
1323
                    Object::set_value($orsC, 'userId', $oa_row['CANCEL_Z3950_USER']);
1324
                    Object::set_value($orsC, 'groupId', $oa_row['CANCEL_Z3950_GROUP']);
1325
                    Object::set_value($orsC, 'passWord', $oa_row['CANCEL_Z3950_PASSWORD']);
74702 fvs 1326
                  }
1327
                }
1328
                else {
95192 fvs 1329
                  Object::set_value($orsC, 'willReceive', 'NO');
1330
                  Object::set_value($orsC, 'synchronous', 0);
74702 fvs 1331
                }
95192 fvs 1332
              }
1333
              //var_dump($res->orsCancel->_value); die();
1334
              break;
1335
            case 'orsCancelReply':
1336
              $orsCR = &$res->orsCancelReply->_value;
1337
              Object::set_value($orsCR, 'responder', self::normalize_agency($oa_row['OAO.BIB_NR']));
1338
              if ($oa_row['MAILBESTIL_VIA'] == 'E' || $oa_row['ANSWER'] == '18626') {
1339
                self::fill_iso18626_protocol($orsCR, $oa_row);
1340
              }
1341
              else {
1342
                if ($oa_row['CANCELREPLY'] == 'z3950' || $oa_row['CANCELREPLY'] == 'ors') {
1343
                  Object::set_value($orsCR, 'willReceive', 'YES');
1344
                  Object::set_value($orsCR, 'synchronous', $oa_row['CANCEL_ANSWER_SYNCHRONIC'] == 'J' ? 1 : 0);
1345
                  Object::set_value($orsCR, 'protocol', self::normalize_iso18626($oa_row['CANCELREPLY']));
1346
                  if ($oa_row['CANCELREPLY'] == 'z3950') {
1347
                    Object::set_value($orsCR, 'address', $oa_row['CANCELREPLY_Z3950_ADDRESS']);
1348
                    Object::set_value($orsCR, 'userId', $oa_row['CANCELREPLY_Z3950_USER']);
1349
                    Object::set_value($orsCR, 'groupId', $oa_row['CANCELREPLY_Z3950_GROUP']);
1350
                    Object::set_value($orsCR, 'passWord', $oa_row['CANCELREPLY_Z3950_PASSWORD']);
74702 fvs 1351
                  }
1352
                }
1353
                else {
95192 fvs 1354
                  Object::set_value($orsCR, 'willReceive', 'NO');
1355
                  Object::set_value($orsCR, 'synchronous', 0);
74702 fvs 1356
                }
95192 fvs 1357
              }
1358
              //var_dump($res->orsCancelReply->_value); die();
1359
              break;
1360
            case 'orsRenewItemUser':
1361
              $orsRIU = &$res->orsRenewItemUser->_value;
1362
              Object::set_value($orsRIU, 'responder', self::normalize_agency($oa_row['VK.BIB_NR']));
1363
              Object::set_value($orsRIU, 'willReceive', ($oa_row['NCIP_RENEW'] == 'J' ? 'YES' : 'NO'));
1364
              Object::set_value($orsRIU, 'synchronous', 0);
1365
              Object::set_value($orsRIU, 'address', $oa_row['NCIP_RENEW_ADDRESS']);
1366
              Object::set_value($orsRIU, 'passWord', $oa_row['NCIP_RENEW_PASSWORD']);
1367
              //var_dump($res->orsRenewItemUser->_value); die();
1368
              break;
1369
            case 'orsShipping':
1370
              $orsS = &$res->orsShipping->_value;
1371
              Object::set_value($orsS, 'responder', self::normalize_agency($oa_row['OAO.BIB_NR']));
1372
              if ($oa_row['MAILBESTIL_VIA'] == 'E' || $oa_row['ANSWER'] == '18626') {
1373
                self::fill_iso18626_protocol($orsS, $oa_row);
1374
              }
1375
              else {
1376
                Object::set_value($orsS, 'willReceive', (in_array($oa_row['SHIPPING'], array('z3950', 'mail', 'ors')) ? 'YES' : ''));
1377
                Object::set_value($orsS, 'synchronous', 0);
1378
                Object::set_value($orsS, 'protocol', self::normalize_iso18626($oa_row['SHIPPING']));
1379
                Object::set_value($orsS, 'address', '');
1380
                Object::set_value($orsS, 'userId', $oa_row['SHIPPING_Z3950_USER']);
1381
                Object::set_value($orsS, 'groupId', $oa_row['SHIPPING_Z3950_GROUP']);
1382
                Object::set_value($orsS, 'passWord', ($oa_row['SHIPPING'] == 'z3950' ? $oa_row['SHIPPING_Z3950_PASSWORD'] : $oa_row['SHIPPING_NCIP_AUTH']));
1383
                if ($oa_row['SHIPPING'] == 'z3950')
1384
                  Object::set_value($orsS, 'address', $oa_row['SHIPPING_Z3950_ADDRESS']);
1385
              }
1386
              //var_dump($res->orsShipping->_value); die();
1387
              break;
1388
            case 'orsStatusRequest':
1389
              $orsSR = &$res->orsStatusRequest->_value;
1390
              Object::set_value($orsSR, 'responder', self::normalize_agency($oa_row['OAO.BIB_NR']));
1391
              Object::set_value($orsSR, 'willReceive', '');
111515 fvs 1392
              if (($oa_row['MAILBESTIL_VIA'] == 'E') ||
1393
                 (($oa_row['MAILBESTIL_VIA'] == 'D') && $oa_row['ISO18626_ADDRESS'])) {
95192 fvs 1394
                self::fill_iso18626_protocol($orsSR, $oa_row);
1395
              }
1396
              break;
1397
            case 'orsStatusResponse':
1398
              $orsSR = &$res->orsStatusResponse->_value;
1399
              Object::set_value($orsSR, 'responder', self::normalize_agency($oa_row['OAO.BIB_NR']));
1400
              Object::set_value($orsSR, 'willReceive', '');
1401
              if ($oa_row['MAILBESTIL_VIA'] == 'E' || $oa_row['ANSWER'] == '18626') {
1402
                self::fill_iso18626_protocol($orsSR, $oa_row);
1403
              }
1404
              break;
1405
            case 'serverInformation':
1406
              $serI = &$res->serverInformation->_value;
1407
              Object::set_value($serI, 'responder', self::normalize_agency($oa_row['VD.BIB_NR']));
1408
              Object::set_value($serI, 'isil', $oa_row['ISIL']);
1409
              if ($oa_row['ISO20775_URL']) {
1410
                Object::set_value($serI, 'protocol', 'iso20775');
1411
                Object::set_value($serI, 'address', $oa_row['ISO20775_URL']);
1412
                Object::set_value($serI, 'passWord', $oa_row['ISO20775_PASSWORD']);
1413
              }
1414
              elseif ($oa_row['URL_ITEMORDER_BESTIL']) {
1415
                Object::set_value($serI, 'protocol', 'z3950');
1416
                Object::set_value($serI, 'address', $oa_row['URL_ITEMORDER_BESTIL']);
1417
                Object::set_value($serI, 'userId', $oa_row['ZBESTIL_USERID']);
1418
                Object::set_value($serI, 'groupId', $oa_row['ZBESTIL_GROUPID']);
1419
                Object::set_value($serI, 'passWord', $oa_row['ZBESTIL_PASSW']);
1420
              }
1421
              else {
1422
                Object::set_value($serI, 'protocol', 'none');
1423
              }
1424
              //var_dump($res->serverInformation->_value); die();
1425
              break;
1426
            case 'userParameters':
1427
              $usrP = &$res->userParameters->_value;
1428
              $get_obl = array('LD_CPR' => 'cpr',
1429
                  'LD_ID' => 'common',
1430
                  'LD_LKST' => 'barcode',
1431
                  'LD_KLNR' => 'cardno',
1432
                  'LD_TXT' => 'optional');
1433
              Object::set_value($usrP, 'userIdType', 'no_userid_selected');
1434
              foreach ($get_obl as $key => $val) {
1435
                if (substr($oa_row[$key],0,1) == 'O') {
1436
                  Object::set_value($usrP, 'userIdType', $val);
1437
                  break;
37646 fvs 1438
                }
95192 fvs 1439
              }
1440
              break;
1441
            case 'userOrderParameters':
1442
              $usrOP = &$res->userOrderParameters->_value;
1443
              $u_fld = array('LD_CPR' => 'cpr',
1444
                  'LD_ID' => 'userId',
1445
                  'LD_TXT' => 'customId',
1446
                  'LD_LKST' => 'barcode',
1447
                  'LD_KLNR' => 'cardno',
1448
                  'LD_PIN' => 'pincode',
1449
                  'LD_DATO' => 'userDateOfBirth',
1450
                  'LD_NAVN' => 'userName',
1451
                  'LD_ADR' => 'userAddress',
1452
                  'LD_EMAIL' => 'userMail',
1453
                  'LD_TLF' => 'userTelephone');
1454
              foreach ($u_fld as $vip_key => $res_key) {
1455
                $sw = $oa_row[$vip_key][0];
1456
                if (in_array($sw, array('J', 'O'))) {
1457
                  Object::set_value($f, 'userParameterType', $res_key);
1458
                  Object::set_value($f, 'parameterRequired', ($sw == 'O'? '1' : '0'));
1459
                  Object::set_array_value($usrOP, 'userParameter', $f);
1460
                  unset($f);
38686 fvs 1461
                }
95192 fvs 1462
              }
1463
              if (in_array($oa_row['LD_ID'][0], array('J', 'O'))) {
109052 fvs 1464
                self::array_append_value_and_language($usrOP->userIdTxt, $oa_row['LD_ID_TXT'], 'dan');
1465
                self::array_append_value_and_language($usrOP->userIdTxt, $oa_row['LD_ID_TXT_ENG'], 'eng');
95192 fvs 1466
              }
1467
              if (in_array($oa_row['LD_TXT'][0], array('J', 'O'))) {
109052 fvs 1468
                self::array_append_value_and_language($usrOP->customIdTxt, $oa_row['LD_TXT2'], 'dan');
1469
                self::array_append_value_and_language($usrOP->customIdTxt, $oa_row['LD_TXT2_ENG'], 'eng');
95192 fvs 1470
              }
1471
              $per = array('PER_NR' => 'volume',
1472
                  'PER_HEFTE' => 'issue',
1473
                  'PER_AAR' => 'publicationDateOfComponent',
1474
                  'PER_SIDE' => 'pagination',
1475
                  'PER_FORFATTER' => 'authorOfComponent',
1476
                  'PER_TITEL' => 'titleOfComponent',
1477
                  'PER_KILDE' => 'userReferenceSource');
1478
              foreach ($per as $key => $val)
1479
                $per_ill[$key . '_FJL'] = $val;
1480
              $avis = array('AVIS_DATO' => 'issue',
1481
                  'AVIS_AAR' => 'publicationDateOfComponent',
1482
                  'AVIS_FORFATTER' => 'authorOfComponent',
1483
                  'AVIS_TITEL' => 'titleOfComponent',
1484
                  'AVIS_KILDE' => 'userReferenceSource');
1485
              foreach ($avis as $key => $val)
1486
                $avis_ill[$key . '_FJL'] = $val;
1487
              $m_fld = array('CDROM_BEST_MODT' => array('cdrom', 'local'),
1488
                  'CDROM_BEST_MODT_FJL' => array('cdrom', 'ill'),
1489
                  'MONO_BEST_MODT' => array('monograph', 'local'),
1490
                  'MONO_BEST_MODT_FJL' => array('monograph', 'ill'),
1491
                  'MUSIK_BEST_MODT' => array('music', 'local'),
1492
                  'MUSIK_BEST_MODT_FJL' => array('music', 'ill'),
1493
                  'AVIS_BEST_MODT' => array('newspaper', 'local', $avis),
1494
                  'AVIS_BEST_MODT_FJL' => array('newspaper', 'ill', $avis_ill),
1495
                  'PER_BEST_MODT' => array('journal', 'local', $per),
1496
                  'PER_BEST_MODT_FJL' => array('journal', 'ill', $per_ill),
1497
                  'VIDEO_BEST_MODT' => array('video', 'local'),
1498
                  'VIDEO_BEST_MODT_FJL' => array('video', 'ill'));
1499
              foreach ($m_fld as $vip_key => $res_key) {
1500
                if (in_array($oa_row[$vip_key], array('J', 'B'))) {
1501
                  Object::set_value($f, 'orderMaterialType', $res_key[0]);
1502
                  Object::set_value($f, 'orderType', $res_key[1]);
1503
                  if (is_array($res_key[2])) {
1504
                    foreach ($res_key[2] as $elem_vip_key => $elem_res_key) {
1505
                      if (in_array($oa_row[$elem_vip_key], array('J', 'O'))) {
1506
                        Object::set_value($p, 'itemParameterType', $elem_res_key);
1507
                        Object::set_value($p, 'parameterRequired', ($oa_row[$elem_vip_key] == 'O'? '1' : '0'));
1508
                        Object::set_array_value($f, 'itemParameter', $p);
1509
                        unset($p);
38686 fvs 1510
                      }
1511
                    }
1512
                  }
95192 fvs 1513
                  Object::set_array_value($usrOP, 'orderParameters', $f);
38686 fvs 1514
                  unset($f);
1515
                }
95192 fvs 1516
              }
1517
              foreach ($fjernadgang_rows as $fjern) {
1518
                Object::set_value($f->_value, 'borrowerCheckSystem', $fjern['NAVN']);
1519
                Object::set_value($f->_value, 'borrowerCheck', $fjern['FJERNADGANG_HAR_LAANERTJEK'] == 1 ? '1' : '0');
1520
                $bCP[] = $f;
1521
                unset($f);
1522
              }
1523
              $aP = new stdClass();
1524
              $aP->borrowerCheckParameters = $bCP;
1525
              Object::set_value($aP, 'acceptOrderFromUnknownUser', in_array($oa_row['BEST_UKENDT'], array('N', 'K'))? '1' : '0');
109052 fvs 1526
              self::array_append_value_and_language($aP->acceptOrderFromUnknownUserText, $oa_row['BEST_UKENDT_TXT'], 'dan');
1527
              self::array_append_value_and_language($aP->acceptOrderFromUnknownUserText, $oa_row['BEST_UKENDT_TXT_ENG'], 'eng');
95192 fvs 1528
              Object::set_value($aP, 'acceptOrderAgencyOffline', $oa_row['LAANERTJEK_NORESPONSE'] == 'N' ? '0' : '1');
1529
              Object::set_value($aP, 'payForPostage', $oa_row['PORTO_BETALING'] == 'N' ? '0' : '1');
1530
              Object::set_value($usrOP, 'agencyParameters', $aP);
1531
              /*      <open:userOrderParameters>
1532
                      <!--1 or more repetitions:-->
1533
                      <open:userParameter>
1534
                      <open:userParameterType>?</open:userParameterType>
1535
                      <open:parameterRequired>?</open:parameterRequired>
1536
                      </open:userParameter>
1537
                      <!--Zero or more repetitions:-->
1538
                      <open:customIdTxt open:language="?">?</open:customIdTxt>
1539
                      <!--Zero or more repetitions:-->
1540
                      <open:userIdTxt open:language="?">?</open:userIdTxt>
1541
                      <!--1 or more repetitions:-->
1542
                      <open:orderParameters>
1543
                      <open:orderMaterialType>?</open:orderMaterialType>
1544
                      <open:orderType>?</open:orderType>
1545
                      <!--1 or more repetitions:-->
1546
                      <open:itemParameter>
1547
                      <open:itemParameterType>?</open:itemParameterType>
1548
                      <open:parameterRequired>?</open:parameterRequired>
1549
                      </open:itemParameter>
1550
                      </open:orderParameters>
1551
                      <open:agencyParameters>
1552
                      <!--Zero or more repetitions:-->
1553
                      <open:borrowerCheckParameters>
1554
                      <open:borrowerCheckSystem>?</open:borrowerCheckSystem>
1555
                      <open:borrowerCheck>?</open:borrowerCheck>
1556
                      </open:borrowerCheckParameters>
1557
                      <open:acceptOrderFromUnknownUser>?</open:acceptOrderFromUnknownUser>
1558
                      <!--0 to 2 repetitions:-->
1559
                      <open:acceptOrderFromUnknownUserText open:language="?">?</open:acceptOrderFromUnknownUserText>
1560
                      <open:acceptOrderAgencyOffline>?</open:acceptOrderAgencyOffline>
1561
                      <open:payForPostage>?</open:payForPostage>
1562
                      </open:agencyParameters>
1563
                      </open:userOrderParameters>                        */
38686 fvs 1564
 
95192 fvs 1565
              //print_r($oa_row); 
1566
              //var_dump($res); var_dump($param); die();
1567
              break;
1568
            default:
1569
              Object::set_value($res, 'error', 'error_in_request');
37646 fvs 1570
          }
28203 fvs 1571
        }
37646 fvs 1572
      }
95192 fvs 1573
    }
6524 fvs 1574
 
1575
 
95192 fvs 1576
    //var_dump($res); var_dump($param); die();
1577
    Object::set_value($ret, 'serviceResponse', $res);
1578
    $ret = $this->objconvert->set_obj_namespace($ret, $this->xmlns['oa']);
1579
    if (empty($res->error)) $this->cache->set($cache_key, $ret);
1580
    $this->watch->stop('entry');
1581
    return $ret;
1582
  }
37646 fvs 1583
 
57216 fvs 1584
 
95192 fvs 1585
  /** \brief Fetch information about the library: name, address, ...
1586
   *
1587
   * Request:
1588
   * - agencyId
1589
   * - agencyName
1590
   * - agencyAddress
1591
   * - postalCode
1592
   * - city
1593
   * - stilNumber
1594
   * - anyField
1595
   * - libraryType
1596
   * - libraryStatus
1597
   * - pickupAllowed
1598
   * - geolocation->latitude
1599
   * - geolocation->longitude
1600
   * - geolocation->longitude
1601
   * - geolocation->distanceInMeter
1602
   * - sort
48442 fvs 1603
 
95192 fvs 1604
   * Response:
1605
   * - pickupAgency
1606
   * - - agencyName
1607
   * - - branchId
1608
   * - - branchName
1609
   * - - branchPhone
1610
   * - - branchEmail
1611
   * - - postalAddress
1612
   * - - postalCode
1613
   * - - city
1614
   * - - isil
1615
   * - - branchWebsiteUrl *
1616
   * - - serviceDeclarationUrl *
1617
   * - - registrationFormUrl *
1618
   * - - paymentUrl *
1619
   * - - userStatusUrl *
1620
   * - - agencySubdivision
1621
   * - - openingHours
1622
   * - - temporarilyClosed
1623
   * - - temporarilyClosedReason
1624
   * - - pickupAllowed *
1625
   * - - and more - see the xsd for all
1626
   * - or
1627
   * - - error
1628
   */
1629
  public function findLibrary($param) {
1630
    if (!$this->aaa->has_right('netpunkt.dk', 500))
1631
      Object::set_value($res, 'error', 'authentication_error');
1632
    else {
1633
      if ($geoloc = $param->geolocation->_value) {
1634
        $geo_cache = $geoloc->latitude->_value . '_' . $geoloc->longitude->_value . '_' . $geoloc->distanceInMeter->_value;
1635
      }
1636
      $cache_key = 'OA_FinL_' .
1637
        $this->config->get_inifile_hash() .
1638
        self::stringiefy($param->agencyId) . '_' .
1639
        self::stringiefy($param->agencyName) . '_' .
1640
        self::stringiefy($param->agencyAddress) . '_' .
1641
        self::stringiefy($param->postalCode) . '_' .
1642
        self::stringiefy($param->city) . '_' .
1643
        self::stringiefy($param->stilNumber) . '_' .
1644
        self::stringiefy($param->anyField) . '_' .
1645
        self::stringiefy($param->libraryType) . '_' .
1646
        self::stringiefy($param->libraryStatus) . '_' .
1647
        self::stringiefy($param->pickupAllowed) . '_' .
1648
        $geo_cache . '_' .
1649
        self::stringiefy($param->sort);
1650
      self::set_cache_expire($this->cache_expire[__FUNCTION__]);
1651
      if ($ret = $this->cache->get($cache_key)) {
1652
        verbose::log(STAT, 'Cache hit');
1653
        return $ret;
1654
      }
1655
      $this->watch->start('entry');
1656
      $oci = self::connect($this->config->get_value('agency_credentials','setup'), __LINE__, $res);
1657
      // agencyId
1658
      if ($agency_id = self::strip_agency($param->agencyId->_value)) {
1659
        $sqls[] = 'v.bib_nr = :bind_bib_nr';
1660
        $oci->bind('bind_bib_nr', $agency_id);
1661
      }
1662
      // agencyName
1663
      if ($val = $param->agencyName->_value) {
1664
        $sqls[] = '(regexp_like(upper(v.navn), upper(:bind_navn))' .
1665
            ' OR (regexp_like(upper(sup.tekst), upper(:bind_navn)) AND sup.type = :bind_n))';
1666
        $oci->bind('bind_navn', self::build_regexp_like($val));
1667
        $oci->bind('bind_n', 'N');
1668
      }
1669
      // agencyAddress
1670
      if ($val = $param->agencyAddress->_value) {
1671
        $sqls[] = '(regexp_like(upper(v.badr), upper(:bind_addr))' .
1672
            ' OR (regexp_like(upper(sup.tekst), upper(:bind_addr)) AND sup.type = :bind_a)' .
1673
            ' OR regexp_like(upper(vsn.badr), upper(:bind_addr)))';
1674
        $oci->bind('bind_addr', self::build_regexp_like($val));
1675
        $oci->bind('bind_a', 'A');
1676
      }
1677
      // postalCode
1678
      if ($val = $param->postalCode->_value) {
1679
        $sqls[] = '(regexp_like(upper(v.bpostnr), upper(:bind_postnr))' .
1680
            ' OR (regexp_like(upper(sup.tekst), upper(:bind_postnr)) AND sup.type = :bind_p))';
1681
        $oci->bind('bind_postnr', self::build_regexp_like($val));
1682
        $oci->bind('bind_p', 'P');
1683
      }
1684
      // city
1685
      if ($val = $param->city->_value) {
1686
        $sqls[] = 'regexp_like(upper(v.bcity), upper(:bind_city))';
1687
        $oci->bind('bind_city', self::build_regexp_like($val));
1688
      }
1689
      // stilNumber
1690
      if ($val = $param->stilNumber->_value) {
1691
        $sqls[] = 'v.uni_c_nr = :bind_uni_c_nr';
1692
        $oci->bind('bind_uni_c_nr', $val);
1693
      }
1694
      // anyField
1695
      if ($val = $param->anyField->_value) {
1696
        $bib_nr = self::strip_agency($param->anyField->_value);
1697
        if (is_numeric($bib_nr) && (strlen($bib_nr) == 6)) {
1698
          $oci->bind('bind_bib_nr', $bib_nr);
1699
          $bibnr_sql = '(v.bib_nr = :bind_bib_nr) OR ';
88620 fvs 1700
        }
95192 fvs 1701
        $sqls[] = '(' . $bibnr_sql .
1702
          'regexp_like(upper(v.navn), upper(:bind_any))' .
1703
          ' OR regexp_like(upper(v.badr), upper(:bind_any))' .
1704
          ' OR regexp_like(upper(v.bpostnr), upper(:bind_any))' .
1705
          ' OR regexp_like(upper(v.bcity), upper(:bind_any))' .
1706
          ' OR (regexp_like(upper(sup.tekst), upper(:bind_any)) AND sup.type = :bind_n)' .
1707
          ' OR (regexp_like(upper(sup.tekst), upper(:bind_any)) AND sup.type = :bind_a)' .
1708
          ' OR (regexp_like(upper(sup.tekst), upper(:bind_any)) AND sup.type = :bind_p))';
1709
        $oci->bind('bind_any', self::build_regexp_like($val));
1710
        $oci->bind('bind_a', 'A');
1711
        $oci->bind('bind_n', 'N');
1712
        $oci->bind('bind_p', 'P');
1713
      }
1714
      // libraryType
1715
      if ($val = $param->libraryType->_value
88108 fvs 1716
          && ($param->libraryType->_value == 'Folkebibliotek'
1717
            || $param->libraryType->_value == 'Forskningsbibliotek'
111500 fvs 1718
            || $param->libraryType->_value == 'Skolebibliotek'
1719
            || $param->libraryType->_value == 'Other')) {
95192 fvs 1720
        $sqls[] = 'vsn.bib_type = :bind_bib_type';
1721
        $oci->bind('bind_bib_type', $param->libraryType->_value);
1722
      }
1723
      elseif (empty($agency_id) && empty($param->stilNumber->_value)) {
105372 fvs 1724
        $sqls[] = '(vsn.bib_type != :bind_bib_type OR vsn.bib_type IS null)';
95192 fvs 1725
        $oci->bind('bind_bib_type', 'Skolebibliotek');
1726
      }
1727
      // libraryStatus
1728
      if ($param->libraryStatus->_value == 'usynlig') {
1729
        $oci->bind('bind_u', 'U');
1730
        $sqls[] = 'v.delete_mark = :bind_u';
1731
      } elseif ($param->libraryStatus->_value == 'slettet') {
1732
        $oci->bind('bind_s', 'S');
1733
        $sqls[] = 'v.delete_mark = :bind_s';
1734
      } elseif ($param->libraryStatus->_value <> 'alle') {
1735
        $sqls[] = 'v.delete_mark is null';
1736
      }
1737
      // pickupAllowed
1738
      if (isset($param->pickupAllowed->_value)) {
1739
        $j = 'J';
1740
        $oci->bind('bind_j', $j);
1741
        if (self::xs_boolean($param->pickupAllowed->_value)) {
1742
          $sqls[] .= 'vb.best_modt = :bind_j';
88108 fvs 1743
        }
95192 fvs 1744
        else {
1745
          $sqls[] .= 'vb.best_modt != :bind_j';
88108 fvs 1746
        }
95192 fvs 1747
      }
1748
      $filter_sql = implode(' AND ', $sqls);
1749
 
1750
      // sort
1751
      if (isset($param->sort)) {
1752
        if (is_array($param->sort)) {
1753
          $sorts = $param->sort;
88108 fvs 1754
        }
95192 fvs 1755
        else {
1756
          $sorts = array($param->sort);
1757
        }
1758
        foreach ($sorts as $s) {
1759
          switch ($s->_value) {
1760
            case 'agencyId':      $sort_order[] = 'v.bib_nr'; break;
1761
            case 'agencyName':    $sort_order[] = 'v.navn'; break;
1762
            case 'agencyAddress': $sort_order[] = 'v.badr'; break;
1763
            case 'postalCode':    $sort_order[] = 'v.postnr'; break;
1764
            case 'city':          $sort_order[] = 'v.bcity'; break;
1765
            case 'libraryType':   $sort_order[] = 'vsn.bib_type'; break;
95042 fvs 1766
          }
95192 fvs 1767
        }
1768
        if ((count($sorts) == 1) && ($sorts[0]->_value == 'distance') && isset($geoloc->latitude->_value) && isset($geoloc->latitude->_value)) {
1769
          if (!$distance = intval($geoloc->distanceInMeter->_value)) {
1770
            $distance = 500000;
95042 fvs 1771
          }
95192 fvs 1772
          $sort_order[] = 'distance asc';
1773
          $deg2rad = 0.0174532925;
1774
          $rad2deg = 57.2957795;
1775
          $deg2meter = 111045;
1776
          $latitude = $geoloc->latitude->_value;
1777
          $longitude = $geoloc->longitude->_value;
1778
          // Flat earth society: 
1779
          //$distance_sql = "$deg2meter * SQRT(POWER(v.latitude-$latitude,2) + POWER(v.longitude-$longitude,2)) distance, ";
1780
          // Haversine: https://en.wikipedia.org/wiki/Haversine_formula
1781
          $distance_sql = "$deg2meter * $rad2deg * (ACOS(COS($deg2rad*$latitude) * COS($deg2rad*v.latitude) * COS($deg2rad*($longitude-v.longitude)) + SIN($deg2rad*$latitude) * SIN($deg2rad*v.latitude))) distance, ";
88108 fvs 1782
        }
95192 fvs 1783
      }
1784
      if (is_array($sort_order)) {
1785
        $order_by = implode(', ', $sort_order);
1786
      }
1787
      else {
1788
        $order_by = 'v.bib_nr';
1789
      }
88108 fvs 1790
 
95192 fvs 1791
      $sql ='SELECT ' . $distance_sql . 'v.bib_nr, v.navn, v.navn_e, v.navn_k, v.navn_e_k, v.type, v.tlf_nr, v.email, v.badr,
98577 fvs 1792
                    v.bpostnr, v.bcity, v.isil, v.kmd_nr, v.url_homepage, v.url_payment, v.delete_mark,
108962 fvs 1793
                    v.afsaetningsbibliotek, v.afsaetningsnavn_k, v.p_nr, v.uni_c_nr, v.leder, v.titel,
98577 fvs 1794
                    TO_CHAR(v.dato, \'YYYY-MM-DD\') dato, TO_CHAR(v.bs_dato, \'YYYY-MM-DD\') bs_dato,
108962 fvs 1795
                    v.latitude, v.longitude, v.knudepunkt, v.leder_samarb,  v.titel_samarb,
98577 fvs 1796
                    vsn.navn vsn_navn, vsn.bib_nr vsn_bib_nr, vsn.bib_type vsn_bib_type,
1797
                    vsn.email vsn_email, vsn.tlf_nr vsn_tlf_nr, vsn.fax_nr vsn_fax_nr,
108962 fvs 1798
                    vsn.leder vsn_leder, vsn.titel vsn_titel,
98577 fvs 1799
                    TO_CHAR(vsn.dato, \'YYYY-MM-DD\') vsn_dato, vsn.oclc_symbol, vsn.sb_kopibestil,
1800
                    vsn.cvr_nr vsn_cvr_nr, vsn.p_nr vsn_p_nr, vsn.ean_nummer vsn_ean_nummer,
109075 fvs 1801
                    vd.svar_email, vd.koerselsordning, vd.mailbestil_via, vd.best_txt,
98577 fvs 1802
                    vb.best_modt, vb.best_modt_luk, vb.best_modt_luk_eng,
108962 fvs 1803
                    txt.aabn_tid, txt.kvt_tekst_fjl, txt.service_tekst,
1804
                    eng.aabn_tid_e, eng.kvt_tekst_fjl_e, hold.holdeplads,
98577 fvs 1805
                    bestil.url_serv_dkl, bestil.support_email, bestil.support_tlf, bestil.ncip_address, bestil.ncip_password,
1806
                    kat.url_best_blanket, kat.url_best_blanket_text, kat.url_laanerstatus, kat.ncip_lookup_user,
1807
                    kat.ncip_renew, kat.ncip_cancel, kat.ncip_update_request, kat.filial_vsn,
1808
                    kat.url_viderestil, kat.url_bib_kat
108962 fvs 1809
               FROM vip v, vip_vsn vsn, vip_danbib vd, vip_beh vb, vip_txt txt, vip_txt_eng eng, vip_sup sup,
98577 fvs 1810
                    vip_bogbus_holdeplads hold, vip_bestil bestil, vip_kat kat
1811
              WHERE ' . $filter_sql . '
1812
                AND v.kmd_nr = vsn.bib_nr (+)
108962 fvs 1813
                AND v.bib_nr = vd.bib_nr (+)
98577 fvs 1814
                AND v.bib_nr = vb.bib_nr (+)
1815
                AND v.bib_nr = sup.bib_nr (+)
1816
                AND v.bib_nr = txt.bib_nr (+)
1817
                AND v.bib_nr = hold.bib_nr (+)
1818
                AND v.bib_nr = eng.bib_nr (+)
1819