/** * Updates the range matching the given identifier id and decreases its * next pointer by one. Also free and taken properties are updated * accordingly. * @param integer $rangeId id of the range to be updated * @return boolean true if and only if the operation succeeds; otherwise * false */ public function decreaseByOne($rangeId) { // Get db access $table = $this->getTable(); // Get ISBN range object $range = $table->getRange($rangeId, false); // Check that we have a result if ($range != null) { // Update free $range->free += 1; // Update taken $range->taken -= 1; // Check if closed if ($range->is_closed) { // Update is_closed and is_active $range->is_closed = false; $range->is_active = true; // Range reopened, range end becomes next pointer $range->next = $range->range_end; } else { // Decrease next pointer $range->next = substr($range->next, 0, 3) - 1; // Next pointer is a string, add left padding $range->next = str_pad($range->next, 3, "0", STR_PAD_LEFT); // Add ISSN range helper file require_once JPATH_COMPONENT . '/helpers/issnrange.php'; // Get next pointer check digit $rangeNextCheckDigit = IssnrangeHelper::countIssnCheckDigit($range->block . $range->next); // Set next pointer check digit $range->next .= $rangeNextCheckDigit; // Validate next pointer if (!IssnrangeHelper::validateIssn($range->block . $range->next)) { $this->setError(JText::_('COM_ISSNREGISTRY_ERROR_ISSN_RANGE_UPDATE_INVALID_NEXT_POINTER')); return false; } } // Update to db if ($table->updateDecrease($range)) { return true; } } return false; }