« Back to History
yarn_company_add.php
|
20260721_154034.php
Initial Bulk Import
Copy Code
<?php /* ========================================================= File: /erp/yarn_company_add.php Features: Bootstrap 5 UI, Ctx Pattern, Delete-then-Insert Logic ========================================================= */ error_reporting(E_ALL); ini_set('display_errors',1); /* ---- 1. Context & Auth (ctx pattern) ---- */ require_once __DIR__ . '/modules/auth/auth.php'; require_once __DIR__ . '/modules/activity/activity_logger.php'; require_login(); $u = auth_user(); $company_id = (int)($u['company_id'] ?? 0); $pdo = $GLOBALS['pdo'] ?? null; if (!$pdo) { require __DIR__ . '/core/db.php'; $pdo = $GLOBALS['pdo']; } /* ---- 2. Table Auto-Init ---- */ $pdo->exec("CREATE TABLE IF NOT EXISTS yarn_company_data ( id BIGINT PRIMARY KEY AUTO_INCREMENT, company_id BIGINT NOT NULL, stock_type VARCHAR(50) NOT NULL, yarn_types TEXT NOT NULL, company_name VARCHAR(191) NOT NULL, denier VARCHAR(50) NOT NULL, color VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_main (company_id, stock_type, company_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); /* ---- 3. Handle Save (Delete-then-Insert Pattern) ---- */ $msg = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $stock_type = trim($_POST['stock_type'] ?? ''); $company_sel = trim($_POST['company_select'] ?? ''); $company_new = trim($_POST['company_new'] ?? ''); $company_name = ($company_sel === '__add__') ? $company_new : $company_sel; $company_name = trim($company_name); $denier = trim($_POST['denier'] ?? ''); $color = trim($_POST['color'] ?? ''); $types = []; if (isset($_POST['yarn_type'])) { foreach ((array)$_POST['yarn_type'] as $v) { $v = trim(str_replace(',', '-', (string)$v)); if ($v !== '' && $v !== '__add__') $types[] = $v; } } $yarn_types_csv = implode(',', array_unique($types)); if ($stock_type && $company_name && !empty($types)) { try { $pdo->beginTransaction(); // Delete-then-Insert logic: Is combination ka purana data saaf karein $del = $pdo->prepare("DELETE FROM yarn_company_data WHERE company_id=? AND stock_type=? AND company_name=? AND denier=? AND color=?"); $del->execute([$company_id, $stock_type, $company_name, $denier, $color]); // Naya data insert karein $ins = $pdo->prepare("INSERT INTO yarn_company_data (company_id, stock_type, yarn_types, company_name, denier, color) VALUES (?,?,?,?,?,?)"); $ins->execute([$company_id, $stock_type, $yarn_types_csv, $company_name, $denier, $color]); $insert_id = (int)$pdo->lastInsertId(); $pdo->commit(); activity_log([ 'company_id' => $company_id ?? 0, 'user_id' => $u['id'] ?? ($_SESSION['user_id'] ?? 0), 'module' => 'yarn', 'action_name' => 'create', 'entity_type' => 'yarn_company_data', 'entity_id' => $insert_id ?? 0, 'remarks' => 'Yarn company data created' ]); $msg = '<div class="alert alert-success border-0 shadow-sm">✔ Data saved successfully using Delete-then-Insert pattern.</div>'; } catch (Exception $e) { $pdo->rollBack(); $msg = '<div class="alert alert-danger">✖ Error: ' . $e->getMessage() . '</div>'; } } } /* ---- 4. Data Fetch for JS ---- */ $STOCK_TYPES = ['Yarn','TFO','TPM','Zari','Kasab']; $dataMap = []; $denierPerStock = array_fill_keys($STOCK_TYPES, []); $colorPerStock = array_fill_keys($STOCK_TYPES, []); $globalTypes = ['Polyester','Catonic','Nylon']; $res = $pdo->prepare("SELECT * FROM yarn_company_data WHERE company_id = ?"); $res->execute([$company_id]); while ($r = $res->fetch(PDO::FETCH_ASSOC)) { $s = $r['stock_type']; $c = $r['company_name']; if(!isset($dataMap[$s])) $dataMap[$s] = []; if(!isset($dataMap[$s][$c])) $dataMap[$s][$c] = ['denier'=>[], 'color'=>[], 'yarn_types'=>[]]; if(!in_array($r['denier'], $denierPerStock[$s])) $denierPerStock[$s][] = $r['denier']; if(!in_array($r['color'], $colorPerStock[$s])) $colorPerStock[$s][] = $r['color']; foreach(explode(',', $r['yarn_types']) as $yt) if(!in_array($yt, $globalTypes)) $globalTypes[] = $yt; } $companyList = []; foreach($STOCK_TYPES as $st) { $companyList[$st] = array_keys($dataMap[$st] ?? []); sort($companyList[$st]); } require_once __DIR__ . '/partials/header.php'; ?> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <div class="container-fluid py-5 px-4"> <div class="card border-0 shadow-lg" style="border-radius: 15px;"> <div class="card-header bg-primary text-white py-3" style="border-radius: 15px 15px 0 0;"> <h4 class="mb-0 fw-bold">Add Yarn Company Data</h4> </div> <div class="card-body p-4 p-md-5"> <?= $msg ?> <form method="post" id="companyForm" autocomplete="off"> <div class="row g-4 mb-4"> <div class="col-md-6"> <label class="form-label fw-semibold">Stock Type</label> <select name="stock_type" id="stock_type" class="form-select form-select-lg border-2" required> <?php foreach($STOCK_TYPES as $st): ?> <option value="<?= $st ?>"><?= $st ?></option> <?php endforeach; ?> </select> </div> <div class="col-md-6"> <label class="form-label fw-semibold">Company</label> <select name="company_select" id="company_select" class="form-select form-select-lg border-2" required></select> <input type="text" name="company_new" id="company_new" class="form-control mt-2 d-none border-primary" placeholder="Enter new company name"> </div> </div> <div class="row g-4 mb-4"> <div class="col-md-6"> <label class="form-label fw-semibold">Denier</label> <select name="denier" id="denier" class="form-select border-2" required></select> </div> <div class="col-md-6"> <label class="form-label fw-semibold">Color</label> <select name="color" id="color" class="form-select border-2" required></select> </div> </div> <div class="mb-4"> <label class="form-label fw-semibold">Yarn Type(s)</label> <div id="yarnTypeContainer" class="d-grid gap-2"> </div> <button type="button" class="btn btn-outline-primary btn-sm mt-3 fw-bold" onclick="addMoreYarnType()"> + Add Another Yarn Type </button> </div> <hr class="my-4 text-muted"> <div class="d-flex justify-content-between align-items-center"> <button type="submit" class="btn btn-primary btn-lg px-5 shadow">Save Record</button> <a href="yarn_company_list.php" class="btn btn-link text-decoration-none fw-bold">See Company Data</a> </div> </form> </div> </div> </div> <script> const COMPANY_LIST = <?= json_encode($companyList) ?>; const DENIER_LIST = <?= json_encode($denierPerStock) ?>; const COLOR_LIST = <?= json_encode($colorPerStock) ?>; const GLOBAL_TYPES = <?= json_encode($globalTypes) ?>; const stockTypeEl = document.getElementById('stock_type'); const companySelect = document.getElementById('company_select'); const denierSel = document.getElementById('denier'); const colorSel = document.getElementById('color'); function elt(tag, attrs={}, text=''){ const e=document.createElement(tag); for(const k in attrs) (k==='class')? e.className=attrs[k] : e.setAttribute(k, attrs[k]); if(text) e.textContent=text; return e; } function refreshUI() { const stock = stockTypeEl.value; // Refresh Companies companySelect.innerHTML = '<option value="">-- Select Company --</option>'; (COMPANY_LIST[stock] || []).forEach(c => companySelect.appendChild(elt('option', {value:c}, c))); companySelect.appendChild(elt('option', {value:'__add__'}, '+ Add New…')); // Refresh Denier/Color const populate = (el, list) => { el.innerHTML = '<option value="">-- Select --</option>'; (list || []).forEach(v => el.appendChild(elt('option', {value:v}, v))); el.appendChild(elt('option', {value:'__add__'}, '+ Add New…')); }; populate(denierSel, DENIER_LIST[stock]); populate(colorSel, COLOR_LIST[stock]); // Init Yarn Types document.getElementById('yarnTypeContainer').innerHTML = ''; addMoreYarnType(); } function addMoreYarnType() { const container = document.getElementById('yarnTypeContainer'); const div = elt('div', {class: 'input-group shadow-sm'}); const sel = elt('select', {name: 'yarn_type[]', class: 'form-select border-2', required: true}); sel.appendChild(elt('option', {value: ''}, '-- Select Yarn Type --')); GLOBAL_TYPES.forEach(t => sel.appendChild(elt('option', {value: t}, t))); sel.appendChild(elt('option', {value: '__add__'}, '+ Add New…')); sel.addEventListener('change', function() { if(this.value === '__add__') { const nv = prompt("Enter New Yarn Type:"); if(nv) { const opt = elt('option', {value: nv.trim(), selected: true}, nv.trim()); this.add(opt, this.options[1]); } else { this.value = ''; } } }); const btn = elt('button', {type: 'button', class: 'btn btn-outline-danger'}, 'Remove'); btn.onclick = () => div.remove(); div.appendChild(sel); div.appendChild(btn); container.appendChild(div); } // Global Add-New Handler [companySelect, denierSel, colorSel].forEach(el => { el.addEventListener('change', function() { if(this.id === 'company_select') { document.getElementById('company_new').classList.toggle('d-none', this.value !== '__add__'); if(this.value === '__add__') document.getElementById('company_new').focus(); } else if(this.value === '__add__') { const nv = prompt("Enter New Value:"); if(nv) { const opt = elt('option', {value: nv.trim(), selected: true}, nv.trim()); this.add(opt, this.options[1]); } else { this.value = ''; } } }); }); stockTypeEl.addEventListener('change', refreshUI); document.addEventListener('DOMContentLoaded', refreshUI); </script> <?php if (file_exists(__DIR__ . '/partials/footer.php')) include __DIR__ . '/partials/footer.php'; ?>