Skip to content
Snippets Groups Projects
import_pod_ratings.php 5.94 KiB
<?php
/**
 * Import record comments from POD. Require a CSV export.
 * Usage: php scripts/import_pod_ratings.php ~/avis.out someone
 */
require(__DIR__.'/../console.php');





class PODImportLog {
  protected
    $_stats = ['import_count' => 0,
               'invalid' => 0,
               'record_not_found' => 0,
               'user_not_found' => 0];

  function printError($comment_id, $message) {
    echo "\n" . '[ERR] ' . $comment_id . ': '. $message . "\n";
  }


  function saveError($comment) {
    echo "\n" . '[ERR] Comment: ' . $comment->getEntete() . ' Error: ' . implode('. ', $comment->getErrors()) . "\n";
  }


  function commentInvalid($comment_id, $message) {
    $this->_stats['invalid'] = $this->_stats['invalid'] + 1;
    $this->printError($comment_id, 'Comment is invalid: ' . $message);
  }


  function recordNotFound($comment_id, $isbn, $barcode) {
    $this->_stats['record_not_found'] = $this->_stats['record_not_found'] + 1;
    $this->printError($comment_id, 'record not found. ISBN: ' . $isbn . ' CB: ' . $barcode);
  }

  function userNotFound($comment_id, $user_card) {
    $this->_stats['user_not_found'] = $this->_stats['user_not_found'] + 1;
    $this->printError($comment_id, 'user not found: ' . $user_card);
  }


  function success() {
    $this->_stats['import_count'] = $this->_stats['import_count'] + 1;
    echo '.';
  }


  function printStats() {
    foreach($this->_stats as $label => $count)
      echo "$label : $count\n";
  }
}



class PODCommentImport {
  protected
    $_log,
    $_unimarc,
    $_comments = [];

  function __construct() {
    $this->_unimarc = new Class_NoticeUnimarc_Writer();
    $this->_log = new PODImportLog();
  }

  function findRecord($isbn, $barcode) {
    if ($item = Class_Exemplaire::findFirstBy(['code_barres' => $barcode]))
      return $item->getNotice();

    return Class_Notice::findFirstBy(['isbn' => $isbn]);
  }


  function findUser($user_card) {
    return $user_card
      ? Class_Users::findFirstBy(['idabon' => $user_card])
      : null;
  }


  function createComment($record, $user, $comment_title, $comment_content, $rating, $creation_date) {
    $head = trim($comment_title)
      ? iconv('CP850', 'UTF-8', $comment_title)
      : $record->getTitrePrincipal();

    return (new Class_AvisNotice())
      ->setClefOeuvre($record->getClefOeuvre())
      ->setDateAvis(Class_Date::frToIso($creation_date))
      ->setEntete($head)
      ->setAvis(iconv('CP850', 'UTF-8', $comment_content))
      ->setNote($rating)
      ->setUser($user)
      ->setStatut(1);
  }


  function importComment($data, $default_user) {
    $comment_id = $data[0];
    $isbn = $data[2];
    $barcode = $data[6];
    $user_card = $data[8];
    $comment_title = $data[10];
    $comment_content = $data[11];
    $creation_date = $data[12];
    $rating = $data[13];

    if (!$record = $this->findRecord($isbn, $barcode))
      return $this->_log->recordNotFound($comment_id, $isbn, $barcode);

    if (!$user = $this->findUser($user_card)) {
      $this->_log->userNotFound($comment_id, $user_card);
      $user = $default_user;
    }

    $comment = $this->createComment($record, $user, trim($comment_title), trim($comment_content), $rating, $creation_date);

    if (!$comment->isValid())
      return $this->_log->commentInvalid($comment_id, implode(', ', $comment->getErrors()));

    $this->_comments[] = $comment;
    $this->_log->success();
  }


  function save() {
    array_map([$this, 'saveComment'], $this->_comments);
  }


  function saveComment($comment) {
    if ($comment->save())
      return $this->_log->success();

    $this->_log->saveError($comment);
    $this->dumpComment($comment);
  }

  function dumpComment($comment) {
    echo "\n\n";
    foreach($comment->getRawAttributes() as $attribute => $value)
      echo $attribute . ': ' . $value . "\n";
  }


  function printStats() {
    $this->_log->printStats();
  }
}


function check($expected, $actual, $message) {
  if ($expected === $actual) {
    echo "\n[OK] " . $message .': ' . $actual . "\n";
    return;
  }

  echo "\n[FAIL] " . $message . ': expected: ' . $expected . ' actual: ' . $actual . "\n";
}


function runTests() {
  $comment = Class_AvisNotice::findFirstBy(['clef_oeuvre' => 'ANKA--GUERAUDG-']);

  check('2012-11-03', $comment->getDateAvis(), 'Anka date');

  check('Anka', $comment->getEntete(), 'Anka title');

  check(1, $comment->getStatut(), 'Anka status');

  check(5, (int)$comment->getNote(), 'Anka rating');

  check(24694, (int)$comment->getUser()->getIdabon(), 'Anka user card');

  check('Anka', $comment->getFirstNotice()->getTitrePrincipal(), 'Anka record title');


  $comment = Class_AvisNotice::findFirstBy(['clef_oeuvre' => 'AVENUEDESMYSTERES--IRVINGJ-']);

  check('Avenue des Mystères', $comment->getEntete(), 'Avenue des Mystères comment title');
}



function exitWithError($message) {
  echo $message;
  echo "\n\n";
  exit(1);
}



if (3 > count($argv)) {
  echo <<<USAGE
Usage:
  php scripts/import_pod_ratings [PATH TO EXPORT] [ACCOUNT LOGIN FOR ORPHANED RATINGS]

Example:
  php scripts/import_pod_ratings ~/avis.out admin

USAGE;
  exit(1);
}

$filename = $argv[1];
if (false === ($handle = fopen($filename, "r")))
  exitWithError('Could not open ' . $filename);


$login = $argv[2];
if (!$default_user = Class_Users::findFirstBy(['login' => $login]))
  exitWithError('Could not find user: '. $login);


$pod_import = new PODCommentImport();

try {
  fgetcsv($handle, 0, "\t"); // ignore first line
  while (false !== ($data = fgetcsv($handle, 0, "\t"))) {
    $pod_import->importComment($data, $default_user);
  }
} finally {
  fclose($handle);
}

echo "\n\n";
$pod_import->printStats();


echo "\n\nApply import [A], Test import [T], Exit [default]: ";
$handle = fopen ("php://stdin","r");
$line = fgets($handle);
fclose($handle);


if(trim($line) == 'T'){
  echo "\nTest import\n";

  Class_AvisNotice::getLoader()->defaultToVolatile();
  $pod_import->save();
  runTests();
}

if(trim($line) == 'A'){
  echo "\nApply\n";
  $pod_import->save();
}

echo "\nBye bye\n";
?>