Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TYPE ERROR in GetDepotAufstellung -> MT535 -> parseHoldings -> Bereitstellungsdatum #451

Open
SegFaulty opened this issue Aug 24, 2024 · 0 comments

Comments

@SegFaulty
Copy link

breaks GetDepotAufstellung

was already marked as weak in MT535.php:

 $holding->setDate($this->getDate($r[1]));
  // TODO The time code looks wrong.
  if ($iwn[1] == 'C') {
      preg_match('/^.{14}(.{6})/sm', $iwn[2], $r);
      $holding->setTime($r[1]);
  } else {

$holding->setTime($r[1]); expecting a DateTime Object, gets string

my fix was a complete rewrite of this block:

OLD:

        // Bereitstellungsdatum
          // :98A::PRIC//20210304
          if (preg_match('/:98([AC])::(.*?):/sm', $block, $iwn)) {
              preg_match('/^.{6}(.{8})/sm', $iwn[2], $r);
              $holding->setDate($this->getDate($r[1]));
              // TODO The time code looks wrong.
              if ($iwn[1] == 'C') {
                  preg_match('/^.{14}(.{6})/sm', $iwn[2], $r);
                  $holding->setTime($r[1]);
              } else {
                  $time = new \DateTime();
                  $time->setTime(0, 0);
                  $holding->setTime($time);
              }
          }

          $result->addHolding($holding);
      }
      return $result;
  }

  protected function getDate(string $val): \DateTime
  {
      preg_match('/(\d{4})(\d{2})(\d{2})/', $val, $m);
      try {
          return new \DateTime($m[1] . '-' . $m[2] . '-' . $m[3]);
      } catch (\Exception $e) {
          throw new \InvalidArgumentException("Invalid date: $val", 0, $e);
      }
  }
}

replaced with NEW:

            // Bereitstellungsdatum
            // :98A::PRIC//20210304
	        if (preg_match('~:98[AC]::PRIC//(\d{8})(\d{6})?~sm', $block, $r)){
				$date = new \DateTime(substr($r[1],0,4).'-'.substr($r[1],4,2).'-'.substr($r[1],6,2));
				$time = $date;
				if( !empty($r[2]) ){
					$time->setTime(substr($r[2],0,2), substr($r[1],2,2), substr($r[1],4,2));
				}
		        $holding->setDate($date);
		        $holding->setTime($time);
	        }else{
				// not found
		        $holding->setDate(new \DateTime('today'));
		        $holding->setTime(new \DateTime('now'));
	        }

            $result->addHolding($holding);
        }
        return $result;
    }
} // end of class

Sidenote:
I do not understad why there is a separate date and time value in holding
... but in the intend of the old method, time as a DateTime gets the current date by default .. seems not right ...
so I set "date" with time 0:0:0 and "time" with the correct date ...
so I can later use $holding->getTime()->getTimstamp() to get a plausible timestamp

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant