File: //tmp/confirm_method.php
public function confirm(string $id): void
{
$this->requireAuth();
$receipt = Database::fetchOne("SELECT * FROM receipts WHERE id = ?", [$id]);
if (!$receipt || $receipt['status'] !== 'draft') {
$this->flash('error', 'Pratica non confermabile');
$this->redirect('/receipts/' . $id);
return;
}
if (empty($receipt['customer_id'])) {
$this->flash('error', 'Associa un cliente prima di confermare');
$this->redirect('/receipts/' . $id);
return;
}
Database::beginTransaction();
try {
// Genera piano rate
$numRate = (int)($receipt['num_installments'] ?? 3);
$advance = (float)($receipt['advance_amount'] ?? 0);
$toFinance = (float)($receipt['total'] ?? 0) - $advance;
$costRetail = (float)($receipt['dilazione_cost'] ?? 0);
$totalRate = round($toFinance, 2);
$instAmount = $numRate > 0 ? round($totalRate / $numRate, 2) : $totalRate;
$today = new \DateTime();
$reminderDays = 15;
try { $reminderDays = (int)(Database::fetchOne("SELECT setting_value FROM settings WHERE setting_key = 'reminder_days_before'")['setting_value'] ?? 15); } catch(\Throwable $e) {}
// Rimuovi rate esistenti
Database::delete('receipt_installments', 'receipt_id = ?', [$id]);
for ($i = 1; $i <= $numRate; $i++) {
$days = $i * 30;
$dueDate = (clone $today)->modify("+{$days} days");
$reminderDate = (clone $dueDate)->modify("-{$reminderDays} days");
$amount = $i === $numRate ? round($totalRate - ($instAmount * ($numRate - 1)), 2) : $instAmount;
Database::insert('receipt_installments', [
'receipt_id' => $id,
'installment_number' => $i,
'due_date' => $dueDate->format('Y-m-d'),
'amount' => $amount,
'paid_amount' => 0,
'status' => 'pending',
'reminder_date' => $reminderDate->format('Y-m-d'),
]);
}
Database::update('receipts', [
'status' => 'confirmed',
'updated_at' => date('Y-m-d H:i:s'),
], 'id = ?', [$id]);
Database::commit();
$this->log('receipt_confirmed', 'receipts', (int)$id, ['installments' => $numRate]);
$this->flash('success', "Pratica confermata con {$numRate} rate generate");
} catch (\Throwable $e) {
Database::rollBack();
$this->flash('error', 'Errore conferma: ' . $e->getMessage());
}
$this->redirect('/receipts/' . $id);
}