mahnung/class/mahnungcron.class.php
Eduard Wisch d1db85322b
All checks were successful
Deploy mahnung / deploy (push) Successful in 14s
Initiales Release: Mahnung-Modul v0.1.0 [deploy]
Vollstaendiges 3-stufiges Mahnwesen nach BGB §288:
- SQL-Schema (llx_mahnung_mahnung, llx_mahnung_stufe)
- CRUD-Klassen (Mahnung, MahnungStufe, MahnungVorschlag)
- TCPDF DIN-5008 PDF-Generierung
- Verzugszinsberechnung B2C/B2B + §288 Abs.5 Pauschale
- Trigger: offene Mahnungen bei Zahlungseingang schliessen
- Hook: Tab + Button auf Rechnungs-/Kundenkarte
- Cron: taegl. Vorschlagsliste + Ntfy-Push
- Deploy-Pipeline (.forgejo/workflows/deploy.yml)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 12:09:37 +02:00

124 lines
3.2 KiB
PHP

<?php
/* Copyright (C) 2026 Eduard Wisch <data@data-it-solution.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 3.
*/
/**
* \file htdocs/custom/mahnung/class/mahnungcron.class.php
* \ingroup mahnung
* \brief Cron-Job: Vorschlagsliste ueberfaelliger Rechnungen einsammeln,
* Ntfy-Push mit Kennzahl an Eddy.
*/
require_once DOL_DOCUMENT_ROOT.'/custom/mahnung/class/mahnungvorschlag.class.php';
require_once DOL_DOCUMENT_ROOT.'/custom/mahnung/class/mahnungntfy.class.php';
class MahnungCron
{
/** @var DoliDB */
public $db;
/** @var string */
public $error = '';
/** @var string[] */
public $errors = array();
/** @var string */
public $output = '';
/** @var int|string */
public $lastresult = 0;
/**
* @param DoliDB $db
*/
public function __construct($db)
{
$this->db = $db;
}
/**
* Sucht ueberfaellige Rechnungen, ermittelt Vorschlaege je Stufe,
* sendet Ntfy-Push mit Anzahl je Stufe und Gesamtwert.
*
* @return int 0 bei Erfolg, < 0 bei Fehler
*/
public function buildVorschlagsliste()
{
global $conf;
$service = new MahnungVorschlag($this->db);
$vorschlaege = $service->getVorschlaege();
$count = count($vorschlaege);
$counts = array(1 => 0, 2 => 0, 3 => 0);
$summe = 0.0;
foreach ($vorschlaege as $v) {
$stufe = (int) $v['vorgeschlagene_stufe'];
if (isset($counts[$stufe])) {
$counts[$stufe]++;
}
$summe += (float) $v['betrag_offen'];
}
$summe = round($summe, 2);
if ($count === 0) {
$this->output = 'Keine ueberfaelligen Rechnungen mit faelliger Mahnung.';
$this->lastresult = 0;
return 0;
}
$dolUrl = trim((string) getDolGlobalString('MAIN_INFO_SOCIETE_NOM', ''));
$listUrl = self::buildAbsoluteUrl('/custom/mahnung/list.php?mode=vorschlag');
$title = 'Mahnwesen: '.$count.' offene Vorschlaege';
$message = "Stufe 1 (Erinnerung): {$counts[1]}\n";
$message .= "Stufe 2 (Mahnung): {$counts[2]}\n";
$message .= "Stufe 3 (Letzte Mahnung): {$counts[3]}\n";
$message .= 'Offener Betrag: '.number_format($summe, 2, ',', '.').' EUR';
MahnungNtfy::send($title, $message, $listUrl, array('envelope_with_arrow', 'warning'));
// Optional: GlobalNotify-Badge ins Dolibarr-UI (wenn Modul aktiv)
if (isModEnabled('globalnotify') && class_exists('GlobalNotify') === false) {
$gnPath = DOL_DOCUMENT_ROOT.'/custom/globalnotify/class/globalnotify.class.php';
if (file_exists($gnPath)) {
require_once $gnPath;
}
}
if (class_exists('GlobalNotify')) {
GlobalNotify::actionRequired(
'mahnung',
'Mahnwesen: '.$count.' Vorschlaege',
$message,
$listUrl,
'Vorschlagsliste oeffnen'
);
}
$this->output = $title.' — '.$message;
$this->lastresult = $count;
return 0;
}
/**
* Baut eine absolute URL aus einem relativen Pfad anhand der Dolibarr-URL-Konfig.
*
* @param string $relPath
* @return string
*/
private static function buildAbsoluteUrl($relPath)
{
$base = trim((string) getDolGlobalString('DOLIBARR_MAIN_URL_ROOT', ''));
if (empty($base) && defined('DOL_MAIN_URL_ROOT')) {
$base = DOL_MAIN_URL_ROOT;
}
if (empty($base)) {
return $relPath;
}
return rtrim($base, '/').$relPath;
}
}