« Back to History
warper_salary_self.php
|
20260920_164915.php
Initial Domain Snapshot
Copy Code
<?php /* ============================================================================= File: /erp/warper_salary_self.php Purpose: Mobile-First Warper Self Salary Portal Auth : STRICT Page ACL ============================================================================= */ header('X-Frame-Options: SAMEORIGIN'); error_reporting(E_ALL); ini_set('display_errors','1'); require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('warper_salary_self'); $company_id = (int)($ctx['company_id'] ?? 0); $pdo = $ctx['pdo'] ?? null; if (!($pdo instanceof PDO)) { require __DIR__ . '/core/db.php'; $pdo = $GLOBALS['pdo'] ?? null; } $u = $ctx['user'] ?? []; $user_id = (int)($u['id'] ?? 0); function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } function n0($v){ return number_format((float)$v, 0, '.', ''); } function n2($v){ return number_format((float)$v, 2, '.', ''); } /* ---------------- 1. MAP LOGGED-IN EMPLOYEE ---------------- */ $logged_emp_id = 0; $employee_name = $u['name'] ?? ($u['username'] ?? 'User'); if ($user_id > 0) { try { $stU = $pdo->prepare("SELECT employee_id FROM users WHERE id = ? AND company_id = ? LIMIT 1"); $stU->execute([$user_id, $company_id]); $logged_emp_id = (int)$stU->fetchColumn(); if ($logged_emp_id <= 0) { $stE = $pdo->prepare("SELECT id, name FROM company_employee_master WHERE user_id = ? AND company_id = ? AND is_active = 1 LIMIT 1"); $stE->execute([$user_id, $company_id]); if ($r = $stE->fetch(PDO::FETCH_ASSOC)) { $logged_emp_id = (int)$r['id']; $employee_name = $r['name']; } } else { $stE = $pdo->prepare("SELECT name FROM company_employee_master WHERE id = ? AND company_id = ? LIMIT 1"); $stE->execute([$logged_emp_id, $company_id]); if ($r = $stE->fetch(PDO::FETCH_ASSOC)) { $employee_name = $r['name']; } } } catch (Throwable $e) {} } /* ---------------- 2. INPUTS (MONTH & PERIOD) ---------------- */ if (!empty($_GET['month_key'])) { $month_key = date('Y-m-01', strtotime($_GET['month_key'])); $period = strtoupper(substr($_GET['period'] ?? 'H2', 0, 2)); if (!in_array($period, ['H1', 'H2'])) $period = 'H2'; } else { $to_param = $_GET['to'] ?? date('Y-m-d'); $to_ts = strtotime($to_param) ?: time(); $month_key = date('Y-m-01', $to_ts); $period = ((int)date('j', $to_ts) <= 15) ? 'H1' : 'H2'; } if ($period === 'H1') { $from = date('Y-m-01', strtotime($month_key)); $to = date('Y-m-15', strtotime($month_key)); } else { $from = date('Y-m-16', strtotime($month_key)); $to = date('Y-m-t', strtotime($month_key)); } /* ---------------- 3. FETCH SELF SALARY & BREAKDOWN ---------------- */ $quality_breakdown = []; $gross_salary = 0; if ($logged_emp_id > 0) { $sql = " SELECT q.name AS quality_name, COALESCE(q.warping_rate, 0) AS rate, SUM(CASE WHEN cbs.taka IS NULL OR cbs.taka = '' THEN 0 ELSE CAST(cbs.taka AS DECIMAL(12,2)) END) AS total_taka FROM company_beam_stock cbs LEFT JOIN beam_qualities q ON q.id = cbs.quality_id AND q.company_id = cbs.company_id WHERE cbs.company_id = :cid AND cbs.warp_date BETWEEN :from AND :to AND cbs.warper_id = :emp_id GROUP BY cbs.quality_id, q.name, q.warping_rate HAVING total_taka > 0 ORDER BY q.name "; $st = $pdo->prepare($sql); $st->execute([':cid' => $company_id, ':from' => $from, ':to' => $to, ':emp_id' => $logged_emp_id]); $quality_breakdown = $st->fetchAll(PDO::FETCH_ASSOC); foreach ($quality_breakdown as $qb) { $gross_salary += ($qb['total_taka'] * $qb['rate']); } } // Fetch Extra, Deduction, Advance $total_extra = $total_ded = $total_adv = 0; if ($logged_emp_id > 0) { $qExtra = $pdo->prepare("SELECT COALESCE(SUM(amount),0) FROM employee_extra WHERE company_id=? AND employee_id=? AND entry_date BETWEEN ? AND ?"); $qExtra->execute([$company_id, $logged_emp_id, $from, $to]); $total_extra = (float)$qExtra->fetchColumn(); $qDed = $pdo->prepare("SELECT COALESCE(SUM(amount),0) FROM employee_deduction WHERE company_id=? AND employee_id=? AND entry_date BETWEEN ? AND ?"); $qDed->execute([$company_id, $logged_emp_id, $from, $to]); $total_ded = (float)$qDed->fetchColumn(); $qAdv = $pdo->prepare("SELECT COALESCE(SUM(amount),0) FROM employee_advance WHERE company_id=? AND employee_id=? AND date BETWEEN ? AND ?"); $qAdv->execute([$company_id, $logged_emp_id, $from, $to]); $total_adv = (float)$qAdv->fetchColumn(); } $net_payable = $gross_salary + $total_extra - $total_ded - $total_adv; ?> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>My Salary Details - Mister Manager</title> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css"> <style> :root { --app-bg: #F4F6F8; --primary-color: #04AA6D; --primary-dark: #027349; --card-radius: 16px; } body { background-color: var(--app-bg); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; color: #1F2937; padding-bottom: 30px; } .app-top-header { background: #ffffff; border-bottom: 1px solid #E5E7EB; padding: 12px 16px; position: sticky; top: 0; z-index: 100; box-shadow: 0 2px 4px rgba(0,0,0,0.02); } .btn-back-dashboard { display: inline-flex; align-items: center; gap: 6px; color: var(--primary-color); text-decoration: none; font-weight: 700; font-size: 14px; } .main-wrapper { max-width: 500px; margin: 0 auto; padding: 16px; } .filter-card { background: #ffffff; border-radius: var(--card-radius); padding: 16px; box-shadow: 0 2px 8px rgba(0,0,0,0.04); border: 1px solid #E5E7EB; margin-bottom: 16px; } .net-pay-card { background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-dark) 100%); color: #ffffff; border-radius: var(--card-radius); padding: 20px; text-align: center; box-shadow: 0 8px 20px rgba(4, 170, 109, 0.25); margin-bottom: 16px; } .net-pay-amount { font-size: 32px; font-weight: 800; margin: 4px 0 0; letter-spacing: -0.5px; } .breakdown-card { background: #ffffff; border-radius: var(--card-radius); padding: 16px; box-shadow: 0 2px 8px rgba(0,0,0,0.04); border: 1px solid #E5E7EB; margin-bottom: 16px; } .summary-row { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; border-bottom: 1px dashed #E5E7EB; font-size: 14px; font-weight: 600; } .summary-row:last-child { border-bottom: none; } .quality-item-card { background: #F9FAFB; border: 1px solid #F3F4F6; border-radius: 12px; padding: 12px; margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center; } </style> </head> <body> <!-- APP TOP BAR WITH DASHBOARD LINK --> <div class="app-top-header d-flex align-items-center justify-content-between"> <a href="index.php" class="btn-back-dashboard"> <i class="bi bi-arrow-left fs-5"></i> Dashboard </a> <div class="fw-bold fs-6 text-dark">My Warper Salary</div> </div> <div class="main-wrapper"> <!-- MONTH & PERIOD FILTER FORM --> <div class="filter-card"> <form method="get" id="salaryForm" class="row g-2"> <div class="col-7"> <label class="form-label text-muted small fw-bold mb-1">Select Month</label> <input type="month" name="month_key" class="form-control form-control-sm rounded-3" value="<?= h(date('Y-m', strtotime($from))) ?>" onchange="this.form.submit()"> </div> <div class="col-5"> <label class="form-label text-muted small fw-bold mb-1">Period</label> <select name="period" class="form-select form-select-sm rounded-3" onchange="this.form.submit()"> <option value="H1" <?= $period==='H1'?'selected':'' ?>>H1 (1-15)</option> <option value="H2" <?= $period==='H2'?'selected':'' ?>>H2 (16-End)</option> </select> </div> </form> </div> <!-- NET PAYABLE HIGHLIGHT CARD --> <div class="net-pay-card"> <div class="text-white-50 text-uppercase fw-bold small">Total Net Payable</div> <div class="net-pay-amount">₹ <?= n0($net_payable) ?></div> <div class="mt-2 small opacity-90"> <i class="bi bi-person-fill me-1"></i> <?= h($employee_name) ?> </div> </div> <!-- SALARY BREAKDOWN SUMMARY --> <div class="breakdown-card"> <div class="fw-bold text-muted small text-uppercase mb-2">Salary Summary</div> <div class="summary-row"> <span class="text-dark"><i class="bi bi-calculator me-2 text-primary"></i> Gross Salary</span> <span class="text-dark">₹ <?= n0($gross_salary) ?></span> </div> <?php if ($total_extra > 0): ?> <div class="summary-row"> <span class="text-success"><i class="bi bi-plus-circle me-2"></i> Extra Allowance</span> <span class="text-success">+ ₹ <?= n0($total_extra) ?></span> </div> <?php endif; ?> <?php if ($total_ded > 0): ?> <div class="summary-row"> <span class="text-danger"><i class="bi bi-dash-circle me-2"></i> Deductions</span> <span class="text-danger">- ₹ <?= n0($total_ded) ?></span> </div> <?php endif; ?> <?php if ($total_adv > 0): ?> <div class="summary-row"> <span class="text-warning"><i class="bi bi-cash-coin me-2"></i> Advance Taken</span> <span class="text-warning">- ₹ <?= n0($total_adv) ?></span> </div> <?php endif; ?> </div> <!-- QUALITY-WISE PRODUCTION DETAILS --> <div class="breakdown-card"> <div class="fw-bold text-muted small text-uppercase mb-3"> <i class="bi bi-layers-fill me-1"></i> Quality Work Details </div> <?php if (empty($quality_breakdown)): ?> <div class="text-center py-4 text-muted small"> <i class="bi bi-inbox display-6 d-block mb-2 text-muted"></i> Is period me koi warping entry nahi mili. </div> <?php else: ?> <?php foreach ($quality_breakdown as $qb): ?> <?php $item_total = $qb['total_taka'] * $qb['rate']; ?> <div class="quality-item-card"> <div> <div class="fw-bold text-dark fs-6"><?= h($qb['quality_name']) ?></div> <div class="text-muted small mt-1"> <?= n0($qb['total_taka']) ?> Taka × ₹<?= n2($qb['rate']) ?> </div> </div> <div class="text-end fw-bold text-success fs-6"> ₹ <?= n0($item_total) ?> </div> </div> <?php endforeach; ?> <?php endif; ?> </div> </div> </body> </html>