Bump version to 1.17.8

- Feat: Verbrauchsauswertung – Ablesung korrigieren (Datum, Zählerstand,
  Korrekturnotiz) und löschen direkt aus der Tabelle (manage_kleingarten)
- Feat: Inventarverwaltung – Gegenstände erfassen, bearbeiten, löschen;
  Ausleihe und Rückgabe je Mitglied mit Notiz und Fälligkeitsdatum tracken;
  Export/Import integriert (InventoryRepository, Schema, Validator, DataTransfer)
- Feat: Jahresabrechnung Sperrstatus – Festschreiben/Freigeben mit
  serverseitiger Prüfung aller Schreibzugriffe auf Kosten und Preise
This commit is contained in:
2026-04-19 21:59:40 +02:00
parent bc89452b5e
commit 6aa31147df
27 changed files with 1219 additions and 21 deletions

69
includes/Repositories/CostRepository.php Normal file → Executable file
View File

@@ -222,6 +222,75 @@ class CostRepository extends AbstractRepository {
return $this->wpdb->get_row( $this->wpdb->prepare( "SELECT * FROM {$year_table} WHERE entry_year = %d", $year ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
}
/**
* Get lock state for one statement year.
*
* @param int $year Selected year.
* @return array
*/
public function get_statement_lock_state( $year ) {
$details = $this->get_year_details( $year );
if ( ! $details ) {
return array(
'is_locked' => false,
'locked_at' => null,
'locked_by' => 0,
);
}
return array(
'is_locked' => ! empty( $details->statement_is_locked ) && 1 === (int) $details->statement_is_locked,
'locked_at' => isset( $details->statement_locked_at ) ? $details->statement_locked_at : null,
'locked_by' => isset( $details->statement_locked_by ) ? (int) $details->statement_locked_by : 0,
);
}
/**
* Check whether statement data for one year is locked.
*
* @param int $year Selected year.
* @return bool
*/
public function is_statement_locked( $year ) {
$state = $this->get_statement_lock_state( $year );
return ! empty( $state['is_locked'] );
}
/**
* Lock or unlock a statement year.
*
* @param int $year Selected year.
* @param bool $is_locked Target lock state.
* @param int $locked_by User ID that changes the state.
* @return bool
*/
public function set_statement_lock( $year, $is_locked, $locked_by = 0 ) {
$year = absint( $year );
if ( $year < 1 || ! $this->ensure_year( $year ) ) {
return false;
}
$payload = array(
'statement_is_locked' => $is_locked ? 1 : 0,
'statement_locked_at' => $is_locked ? $this->now() : null,
'statement_locked_by' => $is_locked ? absint( $locked_by ) : 0,
'updated_at' => $this->now(),
);
$result = $this->wpdb->update(
$this->year_table(),
$payload,
array( 'entry_year' => $year ),
array( '%d', '%s', '%d', '%s' ),
array( '%d' )
);
return false !== $result;
}
/**
* Save section-specific yearly prices.
*