« Back to History
karigar_deduction_manage.php
|
20260721_154032.php
Initial Bulk Import
Copy Code
<?php /* ============================================================================= File: /erp/karigar_deduction_manage.php Title: Karigar Deduction (−) — Add • Edit • Delete • Filter Scope: Page-local only. Multi-company aware. ============================================================================= */ /* ---------- BOOTSTRAP + AUTH ---------- */ require __DIR__ . '/modules/auth/auth.php'; require_login(); require_once __DIR__ . '/modules/activity/activity_logger.php'; $u = auth_user(); $COMPANY_ID = (int)($u['company_id'] ?? 0); $USER_ID = (int)($u['id'] ?? 0); $pdo = $GLOBALS['pdo'] ?? null; if (!$pdo) { require __DIR__ . '/core/db.php'; } /* ---------- dev errors ---------- */ error_reporting(E_ALL); ini_set('display_errors','1'); /* ---------- session + CSRF ---------- */ if (session_status() !== PHP_SESSION_ACTIVE) session_start(); if (empty($_SESSION['csrf'])) $_SESSION['csrf'] = bin2hex(random_bytes(16)); function csrf_field(){ echo '<input type="hidden" name="csrf" value="'.htmlspecialchars($_SESSION['csrf']).'">'; } function check_csrf(){ if (($_POST['csrf'] ?? '') !== ($_SESSION['csrf'] ?? '')) { http_response_code(400); exit('Bad CSRF'); } } /* ---------- Helpers ---------- */ function j($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } function money0($n){ return number_format((float)$n, 2, '.', ''); } function redirect_self($extra=''){ $q = $_GET; if ($extra) parse_str($extra, $tmp); if (!empty($tmp)) $q = array_merge($q, $tmp); $url = strtok($_SERVER['REQUEST_URI'],'?'); if (!empty($q)) $url .= '?'.http_build_query($q); header("Location: $url"); exit; } function self_url(array $overrides = [], array $remove = []){ $q = $_GET; foreach ($remove as $key) unset($q[$key]); foreach ($overrides as $key => $value) { if ($value === null || $value === '') unset($q[$key]); else $q[$key] = $value; } $url = strtok($_SERVER['REQUEST_URI'],'?'); if (!empty($q)) $url .= '?'.http_build_query($q); return $url; } /* ---------- POST handling ---------- */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { check_csrf(); $action = $_POST['action'] ?? ''; $posted_f_kar = $_POST['f_kar'] ?? ''; try { if ($action === 'create' || $action === 'update') { $id = (int)($_POST['id'] ?? 0); $karigar_id = (int)($_POST['karigar_id'] ?? 0); $entry_date = trim($_POST['entry_date'] ?? ''); $amount = (float)($_POST['amount'] ?? 0); $notes = trim($_POST['notes'] ?? ''); if ($karigar_id <= 0) throw new Exception('Karigar selection required'); if ($entry_date === '') throw new Exception('Entry date required'); if ($amount <= 0) throw new Exception('Amount must be greater than zero'); // Fetch Karigar Name $st = $pdo->prepare("SELECT karigar_name FROM loom_karigar_master WHERE id=? AND company_id=? LIMIT 1"); $st->execute([$karigar_id, $COMPANY_ID]); $kar_name = $st->fetchColumn() ?: 'Karigar#'.$karigar_id; if ($action === 'create') { $ins = $pdo->prepare("INSERT INTO karigar_deduction (company_id, karigar_id, karigar_name, entry_date, amount, notes, created_by, updated_at) VALUES (?,?,?,?,?,?,?, NOW())"); $ins->execute([$COMPANY_ID, $karigar_id, $kar_name, $entry_date, $amount, $notes, $USER_ID]); activity_log([ 'company_id' => $COMPANY_ID, 'user_id' => $USER_ID, 'module' => 'karigar', 'action_name' => 'create', 'entity_type' => 'karigar_deduction', 'entity_id' => (int)$pdo->lastInsertId(), 'remarks' => 'Created karigar deduction' ]); $_SESSION['flash_ok'] = 'Deduction added successfully.'; } else { $up = $pdo->prepare("UPDATE karigar_deduction SET karigar_id=?, karigar_name=?, entry_date=?, amount=?, notes=?, updated_at=NOW() WHERE id=? AND company_id=?"); $up->execute([$karigar_id, $kar_name, $entry_date, $amount, $notes, $id, $COMPANY_ID]); activity_log([ 'company_id' => $COMPANY_ID, 'user_id' => $USER_ID, 'module' => 'karigar', 'action_name' => 'edit', 'entity_type' => 'karigar_deduction', 'entity_id' => $id, 'remarks' => 'Updated karigar deduction' ]); $_SESSION['flash_ok'] = 'Deduction updated successfully.'; } } if ($action === 'delete') { $id = (int)($_POST['id'] ?? 0); $pdo->prepare("DELETE FROM karigar_deduction WHERE id=? AND company_id=?")->execute([$id, $COMPANY_ID]); activity_log([ 'company_id' => $COMPANY_ID, 'user_id' => $USER_ID, 'module' => 'karigar', 'action_name' => 'delete', 'entity_type' => 'karigar_deduction', 'entity_id' => $id, 'remarks' => 'Deleted karigar deduction' ]); $_SESSION['flash_ok'] = 'Entry deleted.'; } $qs = $posted_f_kar ? 'f_kar='.urlencode($posted_f_kar) : ''; redirect_self($qs); } catch (Exception $e) { $_SESSION['flash_err'] = $e->getMessage(); redirect_self(); } } /* ---------- Filters & Data Fetch ---------- */ $F_kar = (int)($_GET['f_kar'] ?? 0); $F_month = $_GET['f_month'] ?? ''; // Load Karigars for Dropdowns $karStmt = $pdo->prepare("SELECT id, karigar_name AS name, khata_code AS code, entry_name FROM loom_karigar_master WHERE company_id = ? AND (is_active = 1 OR is_active IS NULL) ORDER BY name ASC"); $karStmt->execute([$COMPANY_ID]); $KARIGARS = $karStmt->fetchAll(PDO::FETCH_ASSOC); // Fetch Rows $where = ["ex.company_id = :cid"]; $params = [':cid' => $COMPANY_ID]; if ($F_kar > 0) { $where[] = "ex.karigar_id = :kar"; $params[':kar'] = $F_kar; } if ($F_month) { $where[] = "DATE_FORMAT(ex.entry_date,'%Y-%m') = :mon"; $params[':mon'] = $F_month; } $sql = "SELECT ex.*, COALESCE(lkm.khata_code,'') AS khata_code FROM karigar_deduction ex LEFT JOIN loom_karigar_master lkm ON lkm.id = ex.karigar_id AND lkm.company_id = ex.company_id WHERE " . implode(' AND ', $where) . " ORDER BY ex.entry_date DESC, ex.id DESC LIMIT 500"; $stmt = $pdo->prepare($sql); $stmt->execute($params); $ROWS = $stmt->fetchAll(PDO::FETCH_ASSOC); $editRow = null; if (isset($_GET['edit'])) { $st = $pdo->prepare("SELECT * FROM karigar_deduction WHERE id=? AND company_id=?"); $st->execute([(int)$_GET['edit'], $COMPANY_ID]); $editRow = $st->fetch(PDO::FETCH_ASSOC); } require_once __DIR__ . '/partials/header.php'; ?> <div class="container-fluid py-4"> <?php if (!empty($_SESSION['flash_ok'])): ?> <div class="alert alert-success border-0 shadow-sm alert-dismissible fade show"> <?= j($_SESSION['flash_ok']) ?><button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php unset($_SESSION['flash_ok']); endif; ?> <?php if (!empty($_SESSION['flash_err'])): ?> <div class="alert alert-danger border-0 shadow-sm alert-dismissible fade show"> <?= j($_SESSION['flash_err']) ?><button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php unset($_SESSION['flash_err']); endif; ?> <div class="card shadow-sm border-0 mb-4"> <div class="card-header bg-white py-3"> <h5 class="mb-0 fw-bold text-danger"><i class="bi bi-dash-circle-fill me-2"></i> <?= $editRow ? 'Edit' : 'Add' ?> Karigar Deduction</h5> </div> <div class="card-body bg-light-subtle"> <form method="post" class="row g-3" autocomplete="off"> <?php csrf_field(); ?> <input type="hidden" name="action" value="<?= $editRow ? 'update' : 'create' ?>"> <?php if ($editRow): ?><input type="hidden" name="id" value="<?= (int)$editRow['id'] ?>"><?php endif; ?> <input type="hidden" name="f_kar" value="<?= j($F_kar) ?>"> <div class="col-md-4"> <label class="form-label small fw-bold">Karigar</label> <select name="karigar_id" class="form-select shadow-none" required> <option value="">Select Karigar...</option> <?php foreach ($KARIGARS as $k): $sel = ($editRow && (int)$editRow['karigar_id'] === (int)$k['id']) ? 'selected' : ''; ?> <option value="<?= (int)$k['id'] ?>" <?= $sel ?>><?= j($k['name'].' ['.($k['code']?:'N/A').']') ?></option> <?php endforeach; ?> </select> </div> <div class="col-md-3"> <label class="form-label small fw-bold">Entry Date</label> <input type="date" name="entry_date" class="form-control shadow-none" value="<?= j($editRow['entry_date'] ?? date('Y-m-d')) ?>" required> </div> <div class="col-md-2"> <label class="form-label small fw-bold">Amount</label> <input type="number" step="0.01" name="amount" class="form-control shadow-none border-danger-subtle" placeholder="0.00" value="<?= j($editRow['amount'] ?? '') ?>" required> </div> <div class="col-md-3"> <label class="form-label small fw-bold">Notes</label> <input type="text" name="notes" class="form-control shadow-none" placeholder="Reason..." value="<?= j($editRow['notes'] ?? '') ?>"> </div> <div class="col-12 text-end"> <?php if ($editRow): ?> <a href="<?= j(self_url([], ['edit'])) ?>" class="btn btn-outline-secondary px-4">Cancel</a> <?php endif; ?> <button type="submit" class="btn btn-danger px-5 fw-bold"> <?= $editRow ? 'Update Entry' : 'Add Deduction' ?> </button> </div> </form> </div> <div class="card-footer bg-white border-top py-3"> <form method="get" class="row g-2 align-items-end"> <div class="col-md-4 col-sm-6"> <label class="small text-muted fw-bold">Filter Karigar</label> <select name="f_kar" class="form-select form-select-sm shadow-none"> <option value="0">All Karigars</option> <?php foreach ($KARIGARS as $k): ?> <option value="<?= (int)$k['id'] ?>" <?= ($F_kar === (int)$k['id'] ? 'selected' : '') ?>><?= j($k['name']) ?></option> <?php endforeach; ?> </select> </div> <div class="col-md-3 col-sm-6"> <label class="small text-muted fw-bold">Filter Month</label> <input type="month" name="f_month" class="form-select form-select-sm shadow-none" value="<?= j($F_month) ?>"> </div> <div class="col-md-5"> <button type="submit" class="btn btn-sm btn-dark px-3">Apply</button> <a href="<?= j(self_url([], ['edit', 'f_kar', 'f_month'])) ?>" class="btn btn-sm btn-outline-secondary px-3">Reset</a> </div> </form> </div> </div> <div class="card shadow-sm border-0"> <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead class="table-light text-uppercase small"> <tr> <th class="ps-3" style="width:50px">#</th> <th style="width:130px">Date</th> <th>Karigar</th> <th class="text-end">Amount</th> <th>Notes</th> <th class="text-end pe-3">Actions</th> </tr> </thead> <tbody> <?php if (!$ROWS): ?> <tr><td colspan="6" class="text-center py-5 text-muted small">No records found.</td></tr> <?php else: foreach ($ROWS as $r): ?> <tr> <td class="ps-3 text-muted"><?= (int)$r['id'] ?></td> <td class="fw-medium text-nowrap"><?= date('d-M-Y', strtotime($r['entry_date'])) ?></td> <td> <div class="fw-bold"><?= j($r['karigar_name']) ?></div> <div class="small text-muted"><?= j($r['khata_code']) ?></div> </td> <td class="text-end fw-bold text-danger">₹<?= money0($r['amount']) ?></td> <td class="small text-muted"><?= j($r['notes']) ?></td> <td class="text-end pe-3"> <div class="d-flex justify-content-end gap-1"> <a href="<?= j(self_url(['edit' => (int)$r['id']])) ?>" class="btn btn-sm btn-primary shadow-sm" title="Edit"> <i class="bi bi-pencil-fill"></i> Edit </a> <form method="post" onsubmit="return confirm('Delete?');" class="d-inline"> <?php csrf_field(); ?> <input type="hidden" name="action" value="delete"> <input type="hidden" name="id" value="<?= (int)$r['id'] ?>"> <input type="hidden" name="f_kar" value="<?= j($F_kar) ?>"> <button type="submit" class="btn btn-sm btn-dark shadow-sm"> <i class="bi bi-trash-fill"></i> </button> </form> </div> </td> </tr> <?php endforeach; endif; ?> </tbody> </table> </div> </div> </div> <?php require_once __DIR__ . '/partials/footer.php'; ?>