// ApplicantImport.php — idempotent, protokolliert, wiederanlauffähig
public function import(Batch $batch): Report
{
$report = new Report($batch->id);
foreach ($batch->rows() as $row) {
try {
$applicant = $this->repo->upsert($row->normalized());
$this->events->dispatch(new ApplicantSynced($applicant));
$report->ok($row->ref);
} catch (ValidationError $e) {
$report->skip($row->ref, $e->getMessage());
}
}
return $report->finish(); // 0 Zeilen verloren
}
# Fernwartung: VPN-Tunnel prüfen, Dienst neu starten
$ ping -c 3 10.8.0.1
$ sudo systemctl restart wg-quick@wg0
$ restic -r s3:backup.de/kunde backup /srv --verbose # verschlüsselt, Standort DE
// ShiftPlanner.php — Besetzung gegen Regelwerk prüfen
private function validate(Shift $shift, Ruleset $rules): array
{
return collect($rules->all())
->map(fn (Rule $r) => $r->check($shift))
->reject(fn (Result $res) => $res->passed())
->values()->all();
}
SELECT a.id, a.status, COUNT(e.id) AS events
FROM applicants a
LEFT JOIN events e ON e.applicant_id = a.id
WHERE a.updated_at >= :since
GROUP BY a.id ORDER BY events DESC;
// ApplicantImport.php — idempotent, protokolliert, wiederanlauffähig
public function import(Batch $batch): Report
{
$report = new Report($batch->id);
foreach ($batch->rows() as $row) {
try {
$applicant = $this->repo->upsert($row->normalized());
$this->events->dispatch(new ApplicantSynced($applicant));
$report->ok($row->ref);
} catch (ValidationError $e) {
$report->skip($row->ref, $e->getMessage());
}
}
return $report->finish(); // 0 Zeilen verloren
}
# Fernwartung: VPN-Tunnel prüfen, Dienst neu starten
$ ping -c 3 10.8.0.1
$ sudo systemctl restart wg-quick@wg0
$ restic -r s3:backup.de/kunde backup /srv --verbose # verschlüsselt, Standort DE
// ShiftPlanner.php — Besetzung gegen Regelwerk prüfen
private function validate(Shift $shift, Ruleset $rules): array
{
return collect($rules->all())
->map(fn (Rule $r) => $r->check($shift))
->reject(fn (Result $res) => $res->passed())
->values()->all();
}
SELECT a.id, a.status, COUNT(e.id) AS events
FROM applicants a
LEFT JOIN events e ON e.applicant_id = a.id
WHERE a.updated_at >= :since
GROUP BY a.id ORDER BY events DESC;
// ApplicantImport.php — idempotent, protokolliert, wiederanlauffähig
public function import(Batch $batch): Report
{
$report = new Report($batch->id);
foreach ($batch->rows() as $row) {
try {
$applicant = $this->repo->upsert($row->normalized());
$this->events->dispatch(new ApplicantSynced($applicant));
$report->ok($row->ref);
} catch (ValidationError $e) {
$report->skip($row->ref, $e->getMessage());
}
}
return $report->finish(); // 0 Zeilen verloren
}
# Fernwartung: VPN-Tunnel prüfen, Dienst neu starten
$ ping -c 3 10.8.0.1
$ sudo systemctl restart wg-quick@wg0
$ restic -r s3:backup.de/kunde backup /srv --verbose # verschlüsselt, Standort DE
// ShiftPlanner.php — Besetzung gegen Regelwerk prüfen
private function validate(Shift $shift, Ruleset $rules): array
{
return collect($rules->all())
->map(fn (Rule $r) => $r->check($shift))
->reject(fn (Result $res) => $res->passed())
->values()->all();
}
SELECT a.id, a.status, COUNT(e.id) AS events
FROM applicants a
LEFT JOIN events e ON e.applicant_id = a.id
WHERE a.updated_at >= :since
GROUP BY a.id ORDER BY events DESC;
// ApplicantImport.php — idempotent, protokolliert, wiederanlauffähig
public function import(Batch $batch): Report
{
$report = new Report($batch->id);
foreach ($batch->rows() as $row) {
try {
$applicant = $this->repo->upsert($row->normalized());
$this->events->dispatch(new ApplicantSynced($applicant));
$report->ok($row->ref);
} catch (ValidationError $e) {
$report->skip($row->ref, $e->getMessage());
}
}
return $report->finish(); // 0 Zeilen verloren
}
# Fernwartung: VPN-Tunnel prüfen, Dienst neu starten
$ ping -c 3 10.8.0.1
$ sudo systemctl restart wg-quick@wg0
$ restic -r s3:backup.de/kunde backup /srv --verbose # verschlüsselt, Standort DE
// ShiftPlanner.php — Besetzung gegen Regelwerk prüfen
private function validate(Shift $shift, Ruleset $rules): array
{
return collect($rules->all())
->map(fn (Rule $r) => $r->check($shift))
->reject(fn (Result $res) => $res->passed())
->values()->all();
}
SELECT a.id, a.status, COUNT(e.id) AS events
FROM applicants a
LEFT JOIN events e ON e.applicant_id = a.id
WHERE a.updated_at >= :since
GROUP BY a.id ORDER BY events DESC;