[
MAINHACK
]
Mail Test
BC
Config Scan
HOME
Create...
New File
New Folder
Viewing / Editing File: manage.php
<?php require_once '../config/database.php'; require_once '../config/functions.php'; requireAuth('accountant'); // Get pending returns $stmt = $pdo->prepare(" SELECT r.*, c.name as client_name, c.phone as client_phone, u.full_name as representative_name, p.name as product_name, p.unit FROM returns r JOIN clients c ON r.client_id = c.id JOIN users u ON r.representative_id = u.id JOIN products p ON r.product_id = p.id WHERE r.status = 'pending' ORDER BY r.requested_at DESC "); $stmt->execute(); $pending_returns = $stmt->fetchAll(); // Get processed returns (recent) $stmt = $pdo->prepare(" SELECT r.*, c.name as client_name, u.full_name as representative_name, p.name as product_name, p.unit, pu.full_name as processed_by_name FROM returns r JOIN clients c ON r.client_id = c.id JOIN users u ON r.representative_id = u.id JOIN products p ON r.product_id = p.id LEFT JOIN users pu ON r.processed_by = pu.id WHERE r.status IN ('approved', 'rejected') ORDER BY r.processed_at DESC LIMIT 20 "); $stmt->execute(); $processed_returns = $stmt->fetchAll(); $error = ''; $success = ''; // Handle return actions if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? ''; $return_id = $_POST['return_id'] ?? ''; if (!$return_id) { $error = 'معرف المرتجع مطلوب'; } else { try { $pdo->beginTransaction(); // Get return details $stmt = $pdo->prepare("SELECT * FROM returns WHERE id = ? AND status = 'pending'"); $stmt->execute([$return_id]); $return_request = $stmt->fetch(); if (!$return_request) { throw new Exception('طلب المرتجع غير موجود أو تم معالجته مسبقاً'); } if ($action === 'approve') { // Calculate balance adjustments $client_balance_after = $return_request['client_balance_before'] - $return_request['return_value']; $shift_balance_adjustment = 0; if ($client_balance_after < 0) { // If return value exceeds client debt, adjust shift balance $shift_balance_adjustment = abs($client_balance_after); $client_balance_after = 0; } // Update return status $stmt = $pdo->prepare(" UPDATE returns SET status = 'approved', processed_at = NOW(), processed_by = ?, client_balance_after = ?, shift_balance_adjustment = ? WHERE id = ? "); $stmt->execute([$_SESSION['user_id'], $client_balance_after, $shift_balance_adjustment, $return_id]); // Update client balance $stmt = $pdo->prepare("UPDATE clients SET balance = ? WHERE id = ?"); $stmt->execute([$client_balance_after, $return_request['client_id']]); // Update shift totals if needed if ($shift_balance_adjustment > 0) { $stmt = $pdo->prepare(" UPDATE shifts SET total_returns = total_returns + ? WHERE id = ? "); $stmt->execute([$shift_balance_adjustment, $return_request['shift_id']]); } // Add returned quantity back to shift products $stmt = $pdo->prepare(" UPDATE shift_products SET remaining_quantity = remaining_quantity + ?, returned_quantity = returned_quantity + ?, sold_quantity = sold_quantity - ? WHERE shift_id = ? AND product_id = ? "); $stmt->execute([ $return_request['quantity'], $return_request['quantity'], $return_request['quantity'], $return_request['shift_id'], $return_request['product_id'] ]); addAuditLog($pdo, $_SESSION['user_id'], 'approve_return', 'return', $return_id, ['status' => 'pending'], ['status' => 'approved'], "الموافقة على مرتجع رقم {$return_request['return_number']}"); $success = 'تم الموافقة على المرتجع بنجاح'; } elseif ($action === 'reject') { $rejection_reason = trim($_POST['rejection_reason'] ?? ''); if (!$rejection_reason) { throw new Exception('سبب الرفض مطلوب'); } $stmt = $pdo->prepare(" UPDATE returns SET status = 'rejected', processed_at = NOW(), processed_by = ?, reason = CONCAT(reason, '\n\nسبب الرفض: ', ?) WHERE id = ? "); $stmt->execute([$_SESSION['user_id'], $rejection_reason, $return_id]); addAuditLog($pdo, $_SESSION['user_id'], 'reject_return', 'return', $return_id, ['status' => 'pending'], ['status' => 'rejected'], "رفض مرتجع رقم {$return_request['return_number']}: $rejection_reason"); $success = 'تم رفض المرتجع'; } $pdo->commit(); // Refresh data header("Location: /returns/manage.php?success=" . urlencode($success)); exit; } catch (Exception $e) { $pdo->rollBack(); $error = $e->getMessage(); } } } if (isset($_GET['success'])) { $success = $_GET['success']; } ?> <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>إدارة المرتجعات - حسابات عربية بن فريش</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.rtl.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"> <style> .return-card { border-radius: 15px; transition: all 0.3s ease; border-left: 5px solid #ffc107; } .return-card:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0,0,0,0.1); } .return-approved { border-left-color: #198754; } .return-rejected { border-left-color: #dc3545; } .return-value { font-size: 1.2rem; font-weight: bold; color: #fd7e14; } </style> </head> <body class="bg-light"> <div class="container-fluid mt-4"> <div class="d-flex justify-content-between align-items-center mb-4"> <h2><i class="fas fa-clipboard-check me-2"></i>إدارة المرتجعات</h2> <a href="/dashboard.php" class="btn btn-outline-secondary"> <i class="fas fa-arrow-left me-1"></i>العودة </a> </div> <?php if ($error): ?> <div class="alert alert-danger" role="alert"> <i class="fas fa-exclamation-triangle me-2"></i><?= htmlspecialchars($error) ?> </div> <?php endif; ?> <?php if ($success): ?> <div class="alert alert-success" role="alert"> <i class="fas fa-check-circle me-2"></i><?= htmlspecialchars($success) ?> </div> <?php endif; ?> <!-- Pending Returns --> <div class="row mb-4"> <div class="col-12"> <div class="card"> <div class="card-header bg-warning text-dark"> <h5 class="mb-0"> <i class="fas fa-clock me-2"></i> المرتجعات المعلقة (<?= count($pending_returns) ?>) </h5> </div> <div class="card-body"> <?php if (empty($pending_returns)): ?> <div class="text-center text-muted py-4"> <i class="fas fa-check-circle fa-3x mb-3"></i> <p>لا توجد مرتجعات معلقة</p> </div> <?php else: ?> <div class="row"> <?php foreach ($pending_returns as $return): ?> <div class="col-md-6 mb-3"> <div class="return-card card"> <div class="card-body"> <div class="d-flex justify-content-between align-items-start mb-3"> <div> <h6 class="card-title"><?= htmlspecialchars($return['return_number']) ?></h6> <small class="text-muted"> <?= date('Y-m-d H:i', strtotime($return['requested_at'])) ?> </small> </div> <div class="return-value"> <?= formatCurrency($return['return_value']) ?> </div> </div> <div class="mb-3"> <div class="row"> <div class="col-6"> <small class="text-muted">العميل:</small> <div><?= htmlspecialchars($return['client_name']) ?></div> </div> <div class="col-6"> <small class="text-muted">المندوب:</small> <div><?= htmlspecialchars($return['representative_name']) ?></div> </div> </div> </div> <div class="mb-3"> <div class="row"> <div class="col-6"> <small class="text-muted">المنتج:</small> <div><?= htmlspecialchars($return['product_name']) ?></div> </div> <div class="col-6"> <small class="text-muted">الكمية:</small> <div><?= $return['quantity'] ?> <?= htmlspecialchars($return['unit']) ?></div> </div> </div> </div> <div class="mb-3"> <small class="text-muted">السبب:</small> <p class="small"><?= nl2br(htmlspecialchars($return['reason'])) ?></p> </div> <div class="mb-3"> <small class="text-muted">رصيد العميل قبل المرتجع:</small> <div class="fw-bold"><?= formatCurrency($return['client_balance_before']) ?></div> </div> <div class="d-flex gap-2"> <form method="POST" class="flex-grow-1"> <input type="hidden" name="return_id" value="<?= $return['id'] ?>"> <input type="hidden" name="action" value="approve"> <button type="submit" class="btn btn-success btn-sm w-100" onclick="return confirm('هل أنت متأكد من الموافقة على هذا المرتجع؟')"> <i class="fas fa-check me-1"></i>موافقة </button> </form> <button type="button" class="btn btn-danger btn-sm" data-bs-toggle="modal" data-bs-target="#rejectModal<?= $return['id'] ?>"> <i class="fas fa-times me-1"></i>رفض </button> </div> </div> </div> <!-- Reject Modal --> <div class="modal fade" id="rejectModal<?= $return['id'] ?>" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">رفض المرتجع</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <form method="POST"> <div class="modal-body"> <input type="hidden" name="return_id" value="<?= $return['id'] ?>"> <input type="hidden" name="action" value="reject"> <div class="mb-3"> <label class="form-label">سبب الرفض *</label> <textarea class="form-control" name="rejection_reason" rows="3" placeholder="اكتب سبب رفض المرتجع..." required></textarea> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">إلغاء</button> <button type="submit" class="btn btn-danger">رفض المرتجع</button> </div> </form> </div> </div> </div> </div> <?php endforeach; ?> </div> <?php endif; ?> </div> </div> </div> </div> <!-- Processed Returns --> <div class="row"> <div class="col-12"> <div class="card"> <div class="card-header bg-info text-white"> <h5 class="mb-0"> <i class="fas fa-history me-2"></i> المرتجعات المعالجة (آخر 20) </h5> </div> <div class="card-body"> <?php if (empty($processed_returns)): ?> <div class="text-center text-muted py-4"> <i class="fas fa-inbox fa-3x mb-3"></i> <p>لا توجد مرتجعات معالجة</p> </div> <?php else: ?> <div class="table-responsive"> <table class="table table-hover"> <thead> <tr> <th>رقم المرتجع</th> <th>العميل</th> <th>المنتج</th> <th>الكمية</th> <th>القيمة</th> <th>الحالة</th> <th>معالج بواسطة</th> <th>تاريخ المعالجة</th> </tr> </thead> <tbody> <?php foreach ($processed_returns as $return): ?> <tr> <td><?= htmlspecialchars($return['return_number']) ?></td> <td><?= htmlspecialchars($return['client_name']) ?></td> <td><?= htmlspecialchars($return['product_name']) ?></td> <td><?= $return['quantity'] ?> <?= htmlspecialchars($return['unit']) ?></td> <td><?= formatCurrency($return['return_value']) ?></td> <td> <span class="badge bg-<?= $return['status'] === 'approved' ? 'success' : 'danger' ?>"> <?= $return['status'] === 'approved' ? 'موافق عليه' : 'مرفوض' ?> </span> </td> <td><?= htmlspecialchars($return['processed_by_name']) ?></td> <td><?= date('Y-m-d H:i', strtotime($return['processed_at'])) ?></td> </tr> <?php endforeach; ?> </tbody> </table> </div> <?php endif; ?> </div> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> </body> </html>
Save Changes
Cancel / Back
Close ×
Server Info
Hostname: premium320.web-hosting.com
Server IP: 66.29.153.54
PHP Version: 8.2.29
Server Software: LiteSpeed
System: Linux premium320.web-hosting.com 4.18.0-553.50.1.lve.el8.x86_64 #1 SMP Thu Apr 17 19:10:24 UTC 2025 x86_64
HDD Total: 97.87 GB
HDD Free: 76.87 GB
Domains on IP: N/A (Requires external lookup)
System Features
Safe Mode:
Off
disable_functions:
None
allow_url_fopen:
On
allow_url_include:
Off
magic_quotes_gpc:
Off
register_globals:
Off
open_basedir:
None
cURL:
Enabled
ZipArchive:
Enabled
MySQLi:
Enabled
PDO:
Enabled
wget:
Yes
curl (cmd):
Yes
perl:
Yes
python:
Yes (py3)
gcc:
Yes
pkexec:
No
git:
Yes
User Info
Username: aoneqssk
User ID (UID): 1285
Group ID (GID): 1290
Script Owner UID: 1285
Current Dir Owner: 1285