Rev 36002 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<section class="wrapper"><div class="row"><div class="col-lg-12"><h3 class="page-header"><i class="icon_document_alt"></i>Pending Approval</h3><ol class="breadcrumb"><li><i class="fa fa-home"></i><a href="${rc.contextPath}/dashboard">Home</a></li><li><i class="icon_document_alt"></i>Approval</li></ol></div></div><div class="col-lg-12">#foreach( $transactionApprovalModel in $approvalModelList)<div class="approval-card">## Card Header<div class="approval-header"><div class="approval-header-left">#if($transactionApprovalModel.isFirstPo())<span class="badge badge-first-po">First PO Approval</span>#else<span class="badge badge-price">Price Approval</span>#end<span class="txn-id">TXN #<spanclass="mk-transactionId">$transactionApprovalModel.getTransactionId()</span></span></div><div class="approval-header-right"><span class="header-meta">$transactionApprovalModel.getCreatedOn().format($dateTimeFormatter)</span></div></div>## Card Info Row<div class="approval-info-row"><div class="info-item"><span class="info-label">Retailer</span><span class="info-value">$transactionApprovalModel.getRetailerName()</span></div><div class="info-item"><span class="info-label">Created By</span><span class="info-value">$transactionApprovalModel.getCreatedBy()</span></div><div class="info-item"><span class="info-label">Items</span><span class="info-value">$transactionApprovalModel.getLineItemModels().size()</span></div></div>## Items Table<div class="approval-table-wrap"><table class="approval-table"><thead><tr><th class="text-right">Item Id</th><th>Item Name</th><th class="text-center">Qty</th><th class="text-right">Total DP</th><th class="text-right">Total SP</th><th class="text-right">Difference</th><th class="text-center">Stock</th></tr></thead><tbody>#foreach($orderDetail in $transactionApprovalModel.getLineItemModels())<tr><td class="text-center">$orderDetail.getItemId()</td><td><div class="item-name">$orderDetail.getItemName()</div></td><td class="text-center">$orderDetail.getItemQuantity()</td><td class="text-right">$orderDetail.getFormattedTotalDp()</td><td class="text-right">$orderDetail.getFormattedTotalSellingPrice()</td><td class="text-right">$orderDetail.getFormattedDifference()</td><td class="text-center">#if($orderDetail.getAvailableStock() >= $orderDetail.getItemQuantity())<span class="stock-badge stock-ok">$orderDetail.getAvailableStock()</span>#elseif($orderDetail.getAvailableStock() > 0)<span class="stock-badge stock-low">$orderDetail.getAvailableStock()</span>#else<span class="stock-badge stock-out">$orderDetail.getAvailableStock()</span>#end</td></tr>#end</tbody><tfoot><tr class="totals-row"><td></td><td class="text-right"><strong>Total</strong></td><td class="text-center"><strong>$transactionApprovalModel.getTotalPcs()</strong></td><td class="text-right"><strong>$transactionApprovalModel.getFormattedTotalDpValue()</strong></td><td class="text-right"><strong>$transactionApprovalModel.getFormattedTotalSellingPriceValue()</strong></td><td class="text-right"><strong>$transactionApprovalModel.getFormattedTotalDifferenceValue()</strong></td><td></td></tr></tfoot></table></div>## Action Row<div class="approval-actions approvalTransactionId"><textarea placeholder="Add remark..." class="remark-box form-control approval-remark"></textarea><div class="action-buttons"><button class="transactionApprovalRejected btn-reject" data-approval="REJECTED"><i class="fa fa-times"></i> Reject</button><button class="transactionApprovalApproved btn-approve" data-approval="APPROVED"><i class="fa fa-check"></i> Approve</button></div></div></div>#end#if($approvalModelList.isEmpty())<div class="empty-state"><i class="fa fa-check-circle"></i><p>No pending approvals</p></div>#end</div></section><style>.approval-card {background: #fff;border: 1px solid #e0e0e0;border-radius: 8px;margin-bottom: 20px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.06);overflow: hidden;}.approval-header {display: flex;justify-content: space-between;align-items: center;padding: 14px 20px;background: #f8f9fa;border-bottom: 1px solid #e0e0e0;}.approval-header-left {display: flex;align-items: center;gap: 12px;}.badge-first-po {background: #ff9800;color: #fff;padding: 4px 12px;border-radius: 4px;font-size: 12px;font-weight: 600;text-transform: uppercase;letter-spacing: 0.5px;}.badge-price {background: #2196F3;color: #fff;padding: 4px 12px;border-radius: 4px;font-size: 12px;font-weight: 600;text-transform: uppercase;letter-spacing: 0.5px;}.txn-id {font-size: 15px;font-weight: 600;color: #333;}.header-meta {font-size: 13px;color: #888;}.approval-info-row {display: flex;gap: 40px;padding: 12px 20px;border-bottom: 1px solid #f0f0f0;}.info-item {display: flex;flex-direction: column;}.info-label {font-size: 11px;color: #999;text-transform: uppercase;letter-spacing: 0.5px;margin-bottom: 2px;}.info-value {font-size: 14px;font-weight: 600;color: #333;}.approval-table-wrap {padding: 0;overflow-x: auto;}.approval-table {width: 100%;border-collapse: collapse;font-size: 13px;}.approval-table thead th {background: #f8f9fa;padding: 10px 14px;font-weight: 600;color: #555;border-bottom: 2px solid #e0e0e0;font-size: 12px;text-transform: uppercase;letter-spacing: 0.3px;white-space: nowrap;}.approval-table tbody td {padding: 10px 14px;border-bottom: 1px solid #f0f0f0;color: #333;}.approval-table tbody tr:last-child td {border-bottom: none;}.approval-table tfoot .totals-row td {padding: 10px 14px;background: #f0f4f8;border-top: 2px solid #ccc;font-size: 13px;}.approval-table tbody tr:hover {background: #fafbfc;}.text-center {text-align: center;}.text-right {text-align: right;}.item-name {font-weight: 500;color: #333;}.item-id {font-size: 11px;color: #999;margin-top: 2px;}.stock-badge {display: inline-block;min-width: 32px;padding: 3px 8px;border-radius: 4px;font-weight: 700;font-size: 13px;text-align: center;}.stock-ok {background: #e8f5e9;color: #2e7d32;}.stock-low {background: #fff3e0;color: #e65100;}.stock-out {background: #ffebee;color: #c62828;}.approval-actions {display: flex;align-items: center;gap: 16px;padding: 14px 20px;background: #f8f9fa;border-top: 1px solid #e0e0e0;}.approval-remark {flex: 1;border: 1px solid #ddd;border-radius: 6px;padding: 8px 12px;font-size: 13px;resize: none;height: 40px;}.approval-remark:focus {border-color: #2196F3;outline: none;box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.15);}.action-buttons {display: flex;gap: 8px;flex-shrink: 0;}.btn-approve, .btn-reject {padding: 8px 20px;border: none;border-radius: 6px;font-size: 13px;font-weight: 600;cursor: pointer;transition: all 0.2s;}.btn-approve {background: #4caf50;color: #fff;}.btn-approve:hover {background: #388e3c;}.btn-reject {background: #fff;color: #e53935;border: 1px solid #e53935;}.btn-reject:hover {background: #ffebee;}.empty-state {text-align: center;padding: 60px 20px;color: #999;}.empty-state i {font-size: 48px;color: #4caf50;margin-bottom: 12px;}.empty-state p {font-size: 16px;}</style>