Rev 37794 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<style>.table-striped > tbody > tr:nth-child(odd) > td {background: white;background-color: white;}.table-striped > tbody > tr:nth-child(even) > td {background: white;background-color: white;}.table-striped > tbody > tr:hover > td,.table-striped > tbody > tr:hover {background-color: #e98c8f;color: white;}.btn:hover {color: grey;text-decoration: none;}.btn-primary:hover {color: grey;text-decoration: none;}.sale-details {cursor: pointer;}</style><section class="wrapper"><div class="row"><div class="col-lg-12"><h3 class="page-header"><i class="icon_document_alt"></i>OFFER HISTORY<button class="btn btn-success btn-sm" id="publish-all-btn" type="button" style="margin-left:15px;">Publish All</button><a class="btn btn-warning btn-sm refresh-offer-cache" href="javascript:void(0)" style="margin-left:5px;">Refresh Cache</a></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>OFFERS</li></ol></div></div><table style="Width:100%"><td align="left" style="Width:20%"></td><td style="Width:80%"><div id="offer-search"><div class="row"><div class="col-lg-12"><div class="col-md-3 col-sm-3 col-xs-12 form-group pull-right top_search"><div class="input-group"><span class="input-group-btn"><button class="btn btn-primary submit" id="offer-file-submit" type="button">Add Offers Using Targets</button></span></div></div><div class="col-md-3 col-sm-3 col-xs-12 form-group pull-right top_search"><div class="input-group"><input type="file" class="form-control" id="offer-file"placeholder="Upload Target Offers"/></div></div><div class="col-md-3 col-sm-3 col-xs-12 form-group pull-right top_search"><div class="input-group"><input type="month" class="form-control" id="yearmonth"placeholder="YYYY-MM"/><span class="input-group-btn"><button class="btn btn-primary submit" id="yearmonth-submit"type="button">Go!</button></span></div></div></div></div></div></td></table><div id="offer-listings-table"><div class="row"><div class="col-lg-12"><!-- Offer & Scheme Radar: bulk-select offers to send a WhatsAppdigest to HO users (RBMs / sales). Backed byOfferRadarNotificationController#sendRadarNotification. --><div class="offer-radar-bar" style="display:flex; align-items:center; gap:12px; margin-bottom:10px;"><button type="button"id="offerRadarSendBtn"class="btn btn-primary"data-radar-kind="offer"disabled>Send WhatsApp Radar (<span id="offerRadarSelectedCount">0</span>)</button><span class="text-muted" style="font-size:12px;">Tick any offers below, then send. Recipients: all HO users with a mobile number.</span></div><table class="table table-striped table-advance table-hover"><tbody><tr><th style="width:28px;"><input type="checkbox" id="offerRadarSelectAll" title="Select all"></th><th>Id</th><th>Name</th><th>Reference</th><th>Payout Type</th><th>Scheme Type</th><th>Discount</th><th>Partner Criteria</th><th>Item Criteria</th><th>Start</th><th>End</th><th>Created</th><th>Processed</th><th>Actions</th></tr>#if(!$offers.isEmpty())#foreach( $offer in $offers )<tr class="offer-details" data-offerid="$offer.getId()" data-offer-title=""><td><input type="checkbox"class="offer-radar-check"value="$offer.getId()"></td><td><a class="mk_offer_detail" href="javascript:void(0)">$offer.getId()</a></td><td><a class="mk_partner_view" href="javascript:void(0)">$offer.getName()</a></td><td>#if($offer.getReference())$offer.getReference()#else-#end</td><td>$offer.getPayoutType()</td><td>$offer.getSchemeType()</td><td>#if ($offer.isDiscount())Discount#elseNon Discount#end</td><td>$offer.getPartnerCriteriaString()</td><td>$offer.getItemCriteriaString()</td><td>$offer.getStartDate().format($dateFormatter)</td><td>$offer.getEndDate().format($dateFormatter)</td><td>$offer.getCreatedOn().format($dateTimeFormatter)</td>#if($offer.getProcessTimestamp())<td class="processed-timestamp">$offer.getProcessTimestamp().format($dateTimeFormatter)</td>#else<td class="processed-timestamp"> -</td>#end<td><ul><li>#if($offer.isActive())<a class="mk_offer_inactive" href="javascript:void(0)">Mark Inactive</a>#else<a class="mk_offer_active" href="javascript:void(0)">Mark Active</a>#end</li><li><a href="/offerDownload?offerId=$offer.getId()">DownloadReport</a></li><li><a class="process_offer" href="javascript:void(0)">Process Offer</a></li><li><a class="manage_offer_partners" href="javascript:void(0)">Manage Partners</a></li>#if(!$offer.isActive())<li><a class="delete_offer" href="javascript:void(0)" style="color:red;">Delete</a></li>#end#if(!$currentMonth)#end</ul></td></tr>#end#else<tr><td colspan="14" style="text-align:center;">NO MATCHING DATA FOUND FOR CRITERIA</td></tr>#end</tbody></table></div></div></div><div class="modal" id="offerDescription"><div class="modal-dialog modal-lg"><div class="modal-content"></div></div></div></section><script type="text/javascript">$(function () {$("#offerDescription").modal('hide');$('#offerDescription').on('hide.bs.modal', function () {$(this).find(".modal-content").html("");});$("#offer-file-submit").on('click', function () {var fileSelector = $('#offer-file')[0];if (fileSelector != undefined && fileSelector.files[0] != undefined) {if (confirm("Confirm Upload?")) {doAjaxUploadRequestHandler(context + "/offers/upload","POST", fileSelector.files[0], function (response) {if (response) {alert("Offer added successfully");loadOfferHistory('#main-content', moment(new Date()).format("YYYY-MM"));}});}} else {alert("Please upload file");}});// ── Offer Radar bulk-send wiring ──────────────────────────────// jQuery locals are renamed off the conventional $-prefix so Velocity// never sees a $ident.method() shape and tries to parse it as a// template reference. Keeps this block readable to any Velocity version// without needing the whitespace-sensitive #[[ ... ]]# literal block.var radarSelectAll = $("#offerRadarSelectAll");var radarBtn = $("#offerRadarSendBtn");var radarCount = $("#offerRadarSelectedCount");function selectedOfferIds() {var ids = [];$(".offer-radar-check:checked").each(function () {var v = parseInt(this.value, 10);if (!isNaN(v)) ids.push(v);});return ids;}function refreshRadarUi() {var ids = selectedOfferIds();radarCount.text(ids.length);radarBtn.prop("disabled", ids.length === 0);var total = $(".offer-radar-check").length;var picked = ids.length;radarSelectAll.prop("indeterminate", picked > 0 && picked < total);radarSelectAll.prop("checked", picked > 0 && picked === total);}radarSelectAll.on("change", function () {$(".offer-radar-check").prop("checked", this.checked);refreshRadarUi();});$(document).on("change", ".offer-radar-check", refreshRadarUi);radarBtn.on("click", function () {var ids = selectedOfferIds();if (ids.length === 0) return;if (!confirm("Send WhatsApp Radar digest for " + ids.length + " offer(s) to all HO users?")) return;var radarSelf = $(this);radarSelf.prop("disabled", true).text("Sending…");$.ajax({url: "/offerRadar/sendNotification",method: "POST",contentType: "application/json",data: JSON.stringify({offerIds: ids, schemeIds: []})}).done(function (resp) {var r = (resp && resp.response) || resp || {};alert("Sent to " + (r.sent || 0) + " user(s). Skipped: " + (r.skipped || 0)+ ", Failed: " + (r.failed || 0)+ "\nRegion: " + (r.regionSummary || "-")+ " | Offers added: " + (r.offersAdded || 0)+ " | Schemes added: " + (r.schemesAdded || 0)+ " | Revisions: " + (r.revisions || 0)+ " | Ending soon: " + (r.endingSoon || 0));}).fail(function (xhr) {var msg = (xhr.responseJSON && (xhr.responseJSON.response || xhr.responseJSON.message)) || xhr.statusText;alert("Radar send failed: " + msg);}).always(function () {radarSelf.html('Send WhatsApp Radar (<span id="offerRadarSelectedCount">' + ids.length + '</span>)');refreshRadarUi();});});refreshRadarUi();});</script>