« Back to History
beam_sent_entry.php
|
20260721_154032.php
Initial Bulk Import
Copy Code
<?php // job_work/beam_sent_entry.php - Modern Beam Send Entry require_once dirname(__DIR__) . '/modules/auth/page_acl.php'; $ctx = page_require_access('beam_sent_entry'); $pdo = $ctx['pdo']; $company_id = (int)$ctx['company_id']; $u = $ctx['user']; require_once dirname(__DIR__) . '/partials/header.php'; // Fetch beams for dropdown (no status filter) $st = $pdo->prepare(" SELECT id, beam_no, beam_quality, meter, beam_slot FROM company_beam_stock WHERE company_id = :cid AND load_type = 'stock' ORDER BY beam_no "); $st->execute(['cid' => $company_id]); $beams = $st->fetchAll(PDO::FETCH_ASSOC); // Handle Form Submission $errors = []; $success = false; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_beam_sent'])) { $challan_no = $_POST['challan_no'] ?? ''; $challan_date = $_POST['challan_date'] ?? date('Y-m-d'); $party_name = $_POST['party_name'] ?? ''; $items = $_POST['items'] ?? []; if (!$challan_no || !$challan_date || !$party_name || empty($items)) { $errors[] = 'All fields are required.'; } else { try { $pdo->beginTransaction(); foreach ($items as $item) { $beam_id = (int)($item['beam_id'] ?? 0); if ($beam_id <= 0) continue; // 1. Insert into beam_sent $stmt = $pdo->prepare("INSERT INTO beam_sent (company_id, beam_id, challan_no, challan_date, party_name, sent_by, sent_at) VALUES (?, ?, ?, ?, ?, ?, NOW())"); $stmt->execute([$company_id, $beam_id, $challan_no, $challan_date, $party_name, $u['id']]); // 2. Update company_beam_stock (set load_type to 'sent') $update = $pdo->prepare("UPDATE company_beam_stock SET load_type = 'sent', updated_at = NOW() WHERE id = ? AND company_id = ?"); $update->execute([$beam_id, $company_id]); if ($update->rowCount() === 0) { throw new Exception("Failed to update load_type for beam ID $beam_id"); } // 3. Log activity $pdo->prepare("INSERT INTO user_activity_logs ( company_id, user_id, functional_role_id, activity_type, module_name, page_slug, action_name, reference_id, activity_note, ip_address, user_agent, created_at ) VALUES ( :company_id, :user_id, NULL, :activity_type, :module_name, :page_slug, :action_name, :reference_id, :activity_note, :ip_address, :user_agent, NOW() )") ->execute([ ':company_id' => $company_id, ':user_id' => $u['id'], ':activity_type' => 'send', ':module_name' => 'beam_sent_entry', ':page_slug' => 'beam_sent_entry', ':action_name' => 'beam_sent', ':reference_id' => $beam_id, ':activity_note' => "Beam sent via beam_sent_entry | Challan: $challan_no | Party: $party_name | Beam ID: $beam_id", ':ip_address' => $_SERVER['REMOTE_ADDR'] ?? '', ':user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', ]); } $pdo->commit(); $success = true; } catch (Exception $e) { $pdo->rollBack(); $errors[] = 'Error: ' . $e->getMessage(); } } } ?> <div class="container py-4"> <?php if (!empty($errors)): ?> <div class="alert alert-danger"><?= implode('<br>', $errors) ?></div> <?php elseif (!empty($success)): ?> <div class="alert alert-success">Beam(s) sent successfully!</div> <?php endif; ?> <form id="beamSentForm" action="" method="POST"> <div class="card mb-3"> <div class="card-header font-weight-bold">Challan Header</div> <div class="card-body"> <div class="form-row"> <div class="form-group col-md-3"> <label>Challan No *</label> <input type="number" name="challan_no" class="form-control" placeholder="No" required> </div> <div class="form-group col-md-3"> <label>Challan Date</label> <input type="date" name="challan_date" class="form-control" value="<?= date('Y-m-d'); ?>" required> </div> <div class="form-group col-md-6"> <label>Job Work Party</label> <select name="party_name" class="form-control" required> <option value="">-- Select Party --</option> <?php $st = $pdo->prepare("SELECT party_name FROM job_work_party WHERE company_id = :cid AND status = 'Active' ORDER BY party_name"); $st->execute(['cid' => $company_id]); while ($row = $st->fetch(PDO::FETCH_ASSOC)) { echo '<option value="' . htmlspecialchars($row['party_name']) . '">' . htmlspecialchars($row['party_name']) . '</option>'; } ?> </select> </div> </div> </div> </div> <div class="card mb-3"> <div class="card-header d-flex justify-content-between align-items-center"> <span>Beam Details</span> <button type="button" id="addRowBtn" class="btn btn-primary btn-sm" onclick="addRow()">+ Add Row</button> </div> <div class="table-responsive"> <table class="table mb-0" id="itemsTable"> <thead class="thead-light"> <tr> <th>Beam No</th> <th>Quality</th> <th>Slot</th> <th>Meter</th> <th class="text-center">Action</th> </tr> </thead> <tbody></tbody> </table> </div> </div> <div class="card mb-3"> <div class="card-body d-flex justify-content-between align-items-center"> <div> <small class="text-muted font-weight-bold">Total Beams</small> <span id="totalBeams" class="h4 ml-2">0</span> </div> <button type="submit" name="save_beam_sent" class="btn btn-success btn-lg"> <i class="fas fa-save mr-2"></i> Save & Send </button> </div> </div> </form> </div> <script> const BEAMS = Array.isArray(window.BEAMS) ? window.BEAMS : <?= json_encode($beams, JSON_UNESCAPED_UNICODE) ?>; let rowCount = 0; function addRow() { const tbody = document.querySelector("#itemsTable tbody"); const id = rowCount++; let options = '<option value="">-- Select Beam --</option>'; if (Array.isArray(BEAMS) && BEAMS.length) { BEAMS.forEach(b => { options += `<option value="${b.id}" data-quality="${b.beam_quality}" data-slot="${b.beam_slot}" data-meter="${b.meter}">#${b.beam_no}</option>`; }); } const tr = document.createElement("tr"); tr.innerHTML = ` <td><select name="items[${id}][beam_id]" class="form-control" onchange="mapBeamData(this, ${id})" required>${options}</select></td> <td><input type="text" id="q_${id}" class="form-control" readonly></td> <td><input type="text" id="s_${id}" class="form-control" readonly></td> <td><input type="text" id="m_${id}" class="form-control" readonly></td> <td class="text-center"><button type="button" class="btn btn-sm btn-danger" onclick="this.closest('tr').remove(); calculate();"><i class="fas fa-trash"></i></button></td> `; tbody.appendChild(tr); calculate(); } function mapBeamData(sel, id) { const opt = sel.selectedOptions[0]; document.getElementById(`q_${id}`).value = opt.dataset.quality || ''; document.getElementById(`s_${id}`).value = opt.dataset.slot || ''; document.getElementById(`m_${id}`).value = opt.dataset.meter || ''; calculate(); } function calculate() { let b = document.querySelectorAll("#itemsTable tbody tr").length; document.getElementById("totalBeams").innerText = b; } window.onload = function() { addRow(); }; </script> <?php require_once dirname(__DIR__) . '/partials/footer.php'; ?>