Subversion Repositories SmartDukaan

Rev

Rev 37444 | Rev 37468 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 37444 Rev 37460
Line 984... Line 984...
984
      border-color: #c8d2f4
984
      border-color: #c8d2f4
985
    }
985
    }
986
 
986
 
987
    .brand-head {
987
    .brand-head {
988
      display: grid;
988
      display: grid;
989
      grid-template-columns:24px 130px 1fr 100px 60px;
989
      grid-template-columns:24px 130px 1fr 96px 100px 60px;
990
      gap: 12px;
990
      gap: 12px;
991
      align-items: center;
991
      align-items: center;
992
      padding: 10px 14px;
992
      padding: 10px 14px;
993
      cursor: pointer;
993
      cursor: pointer;
994
      user-select: none
994
      user-select: none
995
    }
995
    }
996
 
996
 
-
 
997
    .brand-head .bpc {
-
 
998
      display: inline-flex;
-
 
999
      align-items: center;
-
 
1000
      justify-content: center;
-
 
1001
      gap: 4px;
-
 
1002
      font-size: 11.5px;
-
 
1003
      font-weight: 700;
-
 
1004
      color: var(--brand);
-
 
1005
      background: #eef2ff;
-
 
1006
      border: 1px solid #d7defb;
-
 
1007
      border-radius: 999px;
-
 
1008
      padding: 3px 9px;
-
 
1009
      font-variant-numeric: tabular-nums;
-
 
1010
      white-space: nowrap;
-
 
1011
      justify-self: center
-
 
1012
    }
-
 
1013
 
-
 
1014
    .brand-head .bpc.zero {
-
 
1015
      color: var(--soft);
-
 
1016
      background: #f1f3f9;
-
 
1017
      border-color: var(--line)
-
 
1018
    }
-
 
1019
 
-
 
1020
    .brand-head .bpc svg {
-
 
1021
      width: 11px;
-
 
1022
      height: 11px
-
 
1023
    }
-
 
1024
 
997
    .brand-head .cx {
1025
    .brand-head .cx {
998
      color: #c5cce0;
1026
      color: #c5cce0;
999
      font-size: 14px;
1027
      font-size: 14px;
1000
      transition: transform .18s ease, color .12s
1028
      transition: transform .18s ease, color .12s
1001
    }
1029
    }
Line 1421... Line 1449...
1421
      text-align: center;
1449
      text-align: center;
1422
      color: var(--soft);
1450
      color: var(--soft);
1423
      font-size: 12.5px
1451
      font-size: 12.5px
1424
    }
1452
    }
1425
 
1453
 
-
 
1454
    /* extras: aging + partner-billing tables */
-
 
1455
    .xtable {
-
 
1456
      width: 100%;
-
 
1457
      border-collapse: separate;
-
 
1458
      border-spacing: 0;
-
 
1459
      font-size: 13px
-
 
1460
    }
-
 
1461
 
-
 
1462
    .xtable th {
-
 
1463
      font-size: 10.5px;
-
 
1464
      text-transform: uppercase;
-
 
1465
      letter-spacing: .06em;
-
 
1466
      color: var(--soft);
-
 
1467
      font-weight: 700;
-
 
1468
      white-space: nowrap;
-
 
1469
      padding: 10px 10px;
-
 
1470
      border-bottom: 1px solid var(--line);
-
 
1471
      text-align: left;
-
 
1472
      background: #fff
-
 
1473
    }
-
 
1474
 
-
 
1475
    .xtable th.num {
-
 
1476
      text-align: right
-
 
1477
    }
-
 
1478
 
-
 
1479
    .xtable td {
-
 
1480
      padding: 10px;
-
 
1481
      border-bottom: 1px solid var(--line2);
-
 
1482
      color: var(--ink);
-
 
1483
      font-weight: 500
-
 
1484
    }
-
 
1485
 
-
 
1486
    .xtable td.num {
-
 
1487
      text-align: right;
-
 
1488
      font-variant-numeric: tabular-nums;
-
 
1489
      font-weight: 650
-
 
1490
    }
-
 
1491
 
-
 
1492
    .xtable tbody tr:hover {
-
 
1493
      background: #f6f8fd
-
 
1494
    }
-
 
1495
 
-
 
1496
    .xtable .rbm-nm {
-
 
1497
      font-weight: 700;
-
 
1498
      color: var(--ink)
-
 
1499
    }
-
 
1500
 
-
 
1501
    .xtable tr.tot td {
-
 
1502
      font-weight: 770;
-
 
1503
      background: #fafbfe;
-
 
1504
      border-top: 2px solid var(--line);
-
 
1505
      color: var(--ink)
-
 
1506
    }
-
 
1507
 
-
 
1508
    .xtable tr.bal td {
-
 
1509
      font-weight: 700;
-
 
1510
      background: #fffbf2;
-
 
1511
      border-top: 1px dashed #f0d68a;
-
 
1512
      color: #7a5a00
-
 
1513
    }
-
 
1514
 
-
 
1515
    .xtable tr.bal td.hdr {
-
 
1516
      font-weight: 770
-
 
1517
    }
-
 
1518
 
-
 
1519
    .xtable td.g-hid {
-
 
1520
      border-left: 2px solid transparent
-
 
1521
    }
-
 
1522
 
-
 
1523
    /* placeholder for future column tint */
-
 
1524
    .xtable th.g-hid, .xtable td.g-hid {
-
 
1525
      color: var(--hid)
-
 
1526
    }
-
 
1527
 
-
 
1528
    .xtable th.g-fast, .xtable td.g-fast {
-
 
1529
      color: var(--fast)
-
 
1530
    }
-
 
1531
 
-
 
1532
    .xtable th.g-run, .xtable td.g-run {
-
 
1533
      color: var(--run)
-
 
1534
    }
-
 
1535
 
-
 
1536
    .xtable th.g-slow, .xtable td.g-slow {
-
 
1537
      color: var(--slow)
-
 
1538
    }
-
 
1539
 
-
 
1540
    .xtable th.g-other, .xtable td.g-other {
-
 
1541
      color: var(--other)
-
 
1542
    }
-
 
1543
 
-
 
1544
    .xtable th.g-total, .xtable td.g-total {
-
 
1545
      color: var(--brand);
-
 
1546
      font-weight: 700
-
 
1547
    }
-
 
1548
 
-
 
1549
    .xtable td.g-hid, .xtable td.g-fast, .xtable td.g-run, .xtable td.g-slow, .xtable td.g-other {
-
 
1550
      opacity: .95
-
 
1551
    }
-
 
1552
 
-
 
1553
    .xtable td.zero {
-
 
1554
      color: var(--soft);
-
 
1555
      font-weight: 500
-
 
1556
    }
-
 
1557
 
-
 
1558
    .xtable .cnt-pill {
-
 
1559
      display: inline-block;
-
 
1560
      min-width: 32px;
-
 
1561
      padding: 2px 8px;
-
 
1562
      border-radius: 6px;
-
 
1563
      font-size: 11.5px;
-
 
1564
      font-weight: 700;
-
 
1565
      font-variant-numeric: tabular-nums;
-
 
1566
      background: #eef2ff;
-
 
1567
      color: var(--brand)
-
 
1568
    }
-
 
1569
 
-
 
1570
    .xtable .cnt-pill.zero {
-
 
1571
      background: #f1f3f9;
-
 
1572
      color: var(--soft)
-
 
1573
    }
-
 
1574
 
-
 
1575
    .xtable .cnt-pill.warn {
-
 
1576
      background: #fff0e0;
-
 
1577
      color: #a04600
-
 
1578
    }
-
 
1579
 
-
 
1580
    .xtable .cnt-pill.good {
-
 
1581
      background: #e5f7ee;
-
 
1582
      color: #177a3a
-
 
1583
    }
-
 
1584
 
1426
    @media (max-width: 960px) {
1585
    @media (max-width: 960px) {
1427
      .kpis {
1586
      .kpis {
1428
        grid-template-columns:repeat(2, 1fr)
1587
        grid-template-columns:repeat(2, 1fr)
1429
      }
1588
      }
1430
 
1589
 
Line 1537... Line 1696...
1537
      <b>TGT</b> is summed from persisted per-day snapshots (<code>inventory.rbm_targets</code>) — days with no
1696
      <b>TGT</b> is summed from persisted per-day snapshots (<code>inventory.rbm_targets</code>) — days with no
1538
      scheduler-written snapshot contribute 0.
1697
      scheduler-written snapshot contribute 0.
1539
      <b>ACH</b> is computed from source orders (<code>transaction.order</code>) for the range.
1698
      <b>ACH</b> is computed from source orders (<code>transaction.order</code>) for the range.
1540
    </div>
1699
    </div>
1541
  </div>
1700
  </div>
-
 
1701
 
-
 
1702
  <!-- >15 Days Aging Sold -->
-
 
1703
  <div class="sectionlabel">&gt; 15 Days Aging Sold</div>
-
 
1704
  <div class="card">
-
 
1705
    <div class="card-hd">
-
 
1706
      <div>
-
 
1707
        <h2>Aging Inventory Cleared</h2>
-
 
1708
        <p class="desc">Billed value of items that were &gt; 15 days old at sale, per RBM, for the picked range.</p>
-
 
1709
      </div>
-
 
1710
      <span class="badge-period" id="rdrrAgingPeriod">&mdash;</span>
-
 
1711
    </div>
-
 
1712
    <div id="rdrrAgingWrap">
-
 
1713
      <div class="loading">
-
 
1714
        <div class="spinner"></div>
-
 
1715
        Loading&hellip;
-
 
1716
      </div>
-
 
1717
    </div>
-
 
1718
  </div>
-
 
1719
 
-
 
1720
  <!-- Partner Billing Count -->
-
 
1721
  <div class="sectionlabel">Partner Billing Count <span
-
 
1722
          style="color:var(--soft);font-weight:600;text-transform:none;letter-spacing:0;margin-left:6px">(Target: &gt;1L, Non-Target: &gt;20K)</span>
-
 
1723
  </div>
-
 
1724
  <div class="card">
-
 
1725
    <div class="card-hd">
-
 
1726
      <div>
-
 
1727
        <h2>Partners Who Billed This Month</h2>
-
 
1728
        <p class="desc">Counts partners meeting the billing threshold in each week bucket. Always month-to-date (weekly
-
 
1729
          buckets are inherently monthly).</p>
-
 
1730
      </div>
-
 
1731
      <span class="badge-period" id="rdrrBillingPeriod">&mdash;</span>
-
 
1732
    </div>
-
 
1733
    <div id="rdrrBillingWrap">
-
 
1734
      <div class="loading">
-
 
1735
        <div class="spinner"></div>
-
 
1736
        Loading&hellip;
-
 
1737
      </div>
-
 
1738
    </div>
-
 
1739
  </div>
1542
</div>
1740
</div>
1543
 
1741
 
1544
<!-- achieved-vs-pending modal (opens from the RBMs ≥ 100% Target KPI card) -->
1742
<!-- achieved-vs-pending modal (opens from the RBMs ≥ 100% Target KPI card) -->
1545
<div class="status-back" id="rdrrStatusBack">
1743
<div class="status-back" id="rdrrStatusBack">
1546
  <div class="status-modal">
1744
  <div class="status-modal">
Line 1660... Line 1858...
1660
      load();
1858
      load();
1661
    });
1859
    });
1662
 
1860
 
1663
    function load() {
1861
    function load() {
1664
      $("#rdrrTableWrap").html('<div class="loading"><div class="spinner"></div>Loading&hellip;</div>');
1862
      $("#rdrrTableWrap").html('<div class="loading"><div class="spinner"></div>Loading&hellip;</div>');
-
 
1863
      $("#rdrrAgingWrap").html('<div class="loading"><div class="spinner"></div>Loading&hellip;</div>');
-
 
1864
      $("#rdrrBillingWrap").html('<div class="loading"><div class="spinner"></div>Loading&hellip;</div>');
1665
      $("#rdrrPeriodLabel").text(fmtDate(startDate) + " – " + fmtDate(endDate));
1865
      $("#rdrrPeriodLabel").text(fmtDate(startDate) + " – " + fmtDate(endDate));
-
 
1866
      $("#rdrrAgingPeriod").text(fmtDate(startDate) + " – " + fmtDate(endDate));
1666
      fetch("/rbm-drr/data?startDate=" + startDate + "&endDate=" + endDate, {credentials: "same-origin"})
1867
      fetch("/rbm-drr/data?startDate=" + startDate + "&endDate=" + endDate, {credentials: "same-origin"})
1667
              .then(function (r) {
1868
              .then(function (r) {
1668
                return r.json().then(function (b) {
1869
                return r.json().then(function (b) {
1669
                  return {ok: r.ok, body: b};
1870
                  return {ok: r.ok, body: b};
1670
                });
1871
                });
Line 1677... Line 1878...
1677
                render(res.body);
1878
                render(res.body);
1678
              })
1879
              })
1679
              .catch(function (e) {
1880
              .catch(function (e) {
1680
                $("#rdrrTableWrap").html('<div class="empty">Failed to load: ' + (e && e.message ? e.message : "network error") + '</div>');
1881
                $("#rdrrTableWrap").html('<div class="empty">Failed to load: ' + (e && e.message ? e.message : "network error") + '</div>');
1681
              });
1882
              });
-
 
1883
 
-
 
1884
      fetch("/rbm-drr/extras?startDate=" + startDate + "&endDate=" + endDate, {credentials: "same-origin"})
-
 
1885
              .then(function (r) {
-
 
1886
                return r.json().then(function (b) {
-
 
1887
                  return {ok: r.ok, body: b};
-
 
1888
                });
-
 
1889
              })
-
 
1890
              .then(function (res) {
-
 
1891
                if (!res.ok) {
-
 
1892
                  var msg = '<div class="empty">' + escapeHtml(res.body && res.body.error ? res.body.error : "Failed to load.") + '</div>';
-
 
1893
                  $("#rdrrAgingWrap").html(msg);
-
 
1894
                  $("#rdrrBillingWrap").html(msg);
-
 
1895
                  return;
-
 
1896
                }
-
 
1897
                renderAging(res.body);
-
 
1898
                renderPartnerBilling(res.body);
-
 
1899
              })
-
 
1900
              .catch(function (e) {
-
 
1901
                var msg = '<div class="empty">Failed to load: ' + (e && e.message ? e.message : "network error") + '</div>';
-
 
1902
                $("#rdrrAgingWrap").html(msg);
-
 
1903
                $("#rdrrBillingWrap").html(msg);
-
 
1904
              });
-
 
1905
    }
-
 
1906
 
-
 
1907
    function renderAging(data) {
-
 
1908
      var rows = data.aging || [];
-
 
1909
      var totals = data.agingTotals || {};
-
 
1910
      var balance = data.balance || {};
-
 
1911
      if (rows.length === 0) {
-
 
1912
        $("#rdrrAgingWrap").html('<div class="empty"><div class="ei">📦</div>No aging inventory sold in this range.</div>');
-
 
1913
        return;
-
 
1914
      }
-
 
1915
      var html = ['<table class="xtable"><thead><tr>',
-
 
1916
        '<th>RBM</th>',
-
 
1917
        '<th class="num g-hid">HID</th>',
-
 
1918
        '<th class="num g-fast">FAST</th>',
-
 
1919
        '<th class="num g-run">RUN</th>',
-
 
1920
        '<th class="num g-slow">SLOW</th>',
-
 
1921
        '<th class="num g-other">OTHER</th>',
-
 
1922
        '<th class="num g-total">TOTAL</th>',
-
 
1923
        '</tr></thead><tbody>'];
-
 
1924
      rows.forEach(function (r) {
-
 
1925
        html.push('<tr>' +
-
 
1926
                '<td class="rbm-nm">' + escapeHtml(r.rbmName || '-') + '</td>' +
-
 
1927
                cell(r.hid, 'g-hid') + cell(r.fast, 'g-fast') + cell(r.run, 'g-run') +
-
 
1928
                cell(r.slow, 'g-slow') + cell(r.other, 'g-other') + cell(r.total, 'g-total') +
-
 
1929
                '</tr>');
-
 
1930
      });
-
 
1931
      html.push('<tr class="tot">' +
-
 
1932
              '<td>Total</td>' +
-
 
1933
              cell(totals.hid, 'g-hid') + cell(totals.fast, 'g-fast') + cell(totals.run, 'g-run') +
-
 
1934
              cell(totals.slow, 'g-slow') + cell(totals.other, 'g-other') + cell(totals.total, 'g-total') +
-
 
1935
              '</tr>');
-
 
1936
      html.push('<tr class="bal">' +
-
 
1937
              '<td class="hdr">15-Day Balance Value</td>' +
-
 
1938
              cell(balance.hid) + cell(balance.fast) + cell(balance.run) +
-
 
1939
              cell(balance.slow) + cell(balance.other) + cell(balance.total) +
-
 
1940
              '</tr>');
-
 
1941
      html.push('</tbody></table>');
-
 
1942
      $("#rdrrAgingWrap").html(html.join(""));
-
 
1943
    }
-
 
1944
 
-
 
1945
    function cell(v, cls) {
-
 
1946
      v = Number(v) || 0;
-
 
1947
      var zero = v === 0 ? ' zero' : '';
-
 
1948
      var extra = cls ? ' ' + cls : '';
-
 
1949
      return '<td class="num' + extra + zero + '">' + formatIndian(v) + '</td>';
-
 
1950
    }
-
 
1951
 
-
 
1952
    function formatIndian(n) {
-
 
1953
      n = Math.round(Number(n) || 0);
-
 
1954
      if (n === 0) return '0';
-
 
1955
      var s = n.toString();
-
 
1956
      var lastThree = s.substring(s.length - 3);
-
 
1957
      var otherNums = s.substring(0, s.length - 3);
-
 
1958
      if (otherNums !== '') lastThree = ',' + lastThree;
-
 
1959
      return otherNums.replace(/\B(?=(\d{2})+(?!\d))/g, ',') + lastThree;
-
 
1960
    }
-
 
1961
 
-
 
1962
    function renderPartnerBilling(data) {
-
 
1963
      var rows = data.partnerBilling || [];
-
 
1964
      var totals = data.partnerBillingTotals || {};
-
 
1965
      $("#rdrrBillingPeriod").text(data.partnerBillingMonth || '');
-
 
1966
      if (rows.length === 0) {
-
 
1967
        $("#rdrrBillingWrap").html('<div class="empty"><div class="ei">👥</div>No targeted partners this month.</div>');
-
 
1968
        return;
-
 
1969
      }
-
 
1970
      var html = ['<table class="xtable"><thead><tr>',
-
 
1971
        '<th>RBM</th>',
-
 
1972
        '<th class="num">Targeted</th>',
-
 
1973
        '<th class="num">Week 1<br><small style="color:var(--soft);font-weight:600">(1–7)</small></th>',
-
 
1974
        '<th class="num">Week 2<br><small style="color:var(--soft);font-weight:600">(8–15)</small></th>',
-
 
1975
        '<th class="num">Week 3<br><small style="color:var(--soft);font-weight:600">(16–22)</small></th>',
-
 
1976
        '<th class="num">Week 4<br><small style="color:var(--soft);font-weight:600">(23–end)</small></th>',
-
 
1977
        '<th class="num g-total">MTD</th>',
-
 
1978
        '<th class="num">Zero Billed<br><small style="color:var(--soft);font-weight:600">(&lt;1L / &lt;20K)</small></th>',
-
 
1979
        '</tr></thead><tbody>'];
-
 
1980
      rows.forEach(function (r) {
-
 
1981
        html.push('<tr>' +
-
 
1982
                '<td class="rbm-nm">' + escapeHtml(r.rbmName || '-') + '</td>' +
-
 
1983
                '<td class="num">' + pill(r.targeted, '') + '</td>' +
-
 
1984
                '<td class="num">' + pill(r.w1, ratio(r.w1, r.targeted)) + '</td>' +
-
 
1985
                '<td class="num">' + pill(r.w2, ratio(r.w2, r.targeted)) + '</td>' +
-
 
1986
                '<td class="num">' + pill(r.w3, ratio(r.w3, r.targeted)) + '</td>' +
-
 
1987
                '<td class="num">' + pill(r.w4, ratio(r.w4, r.targeted)) + '</td>' +
-
 
1988
                '<td class="num g-total">' + pill(r.mtd, ratio(r.mtd, r.targeted)) + '</td>' +
-
 
1989
                '<td class="num">' + pill(r.zero, r.zero > 0 ? 'warn' : 'zero') + '</td>' +
-
 
1990
                '</tr>');
-
 
1991
      });
-
 
1992
      html.push('<tr class="tot">' +
-
 
1993
              '<td>Total</td>' +
-
 
1994
              '<td class="num">' + formatIndian(totals.targeted) + '</td>' +
-
 
1995
              '<td class="num">' + formatIndian(totals.w1) + '</td>' +
-
 
1996
              '<td class="num">' + formatIndian(totals.w2) + '</td>' +
-
 
1997
              '<td class="num">' + formatIndian(totals.w3) + '</td>' +
-
 
1998
              '<td class="num">' + formatIndian(totals.w4) + '</td>' +
-
 
1999
              '<td class="num g-total">' + formatIndian(totals.mtd) + '</td>' +
-
 
2000
              '<td class="num">' + formatIndian(totals.zero) + '</td>' +
-
 
2001
              '</tr>');
-
 
2002
      html.push('</tbody></table>');
-
 
2003
      $("#rdrrBillingWrap").html(html.join(""));
-
 
2004
    }
-
 
2005
 
-
 
2006
    function pill(v, cls) {
-
 
2007
      v = Number(v) || 0;
-
 
2008
      var c = cls || (v === 0 ? 'zero' : '');
-
 
2009
      return '<span class="cnt-pill ' + c + '">' + formatIndian(v) + '</span>';
-
 
2010
    }
-
 
2011
 
-
 
2012
    function ratio(part, total) {
-
 
2013
      part = Number(part) || 0;
-
 
2014
      total = Number(total) || 0;
-
 
2015
      if (total === 0) return 'zero';
-
 
2016
      var p = (part / total) * 100;
-
 
2017
      if (p >= 60) return 'good';
-
 
2018
      if (p >= 30) return '';
-
 
2019
      if (p > 0) return 'warn';
-
 
2020
      return 'zero';
1682
    }
2021
    }
1683
 
2022
 
1684
    // Cached latest payload so the "Target Status by RBM" modal can render
2023
    // Cached latest payload so the "Target Status by RBM" modal can render
1685
    // without a re-fetch when the KPI card is clicked.
2024
    // without a re-fetch when the KPI card is clicked.
1686
    var LAST_PAYLOAD = null;
2025
    var LAST_PAYLOAD = null;
Line 1811... Line 2150...
1811
      var maxShare = brands[0].sharePct || 0.001;
2150
      var maxShare = brands[0].sharePct || 0.001;
1812
      var html = '<div class="brands">';
2151
      var html = '<div class="brands">';
1813
      brands.forEach(function (b, idx) {
2152
      brands.forEach(function (b, idx) {
1814
        var barW = maxShare > 0 ? Math.min(100, (b.sharePct / maxShare) * 100) : 0;
2153
        var barW = maxShare > 0 ? Math.min(100, (b.sharePct / maxShare) * 100) : 0;
1815
        var topCls = idx === 0 ? ' top' : '';
2154
        var topCls = idx === 0 ? ' top' : '';
-
 
2155
        var pc = Number(b.partnerCount) || 0;
-
 
2156
        var pcCls = pc === 0 ? ' zero' : '';
-
 
2157
        var pcLabel = pc + (pc === 1 ? ' partner' : ' partners');
1816
        html += '<div class="brand-card' + topCls + '" data-idx="' + idx + '">' +
2158
        html += '<div class="brand-card' + topCls + '" data-idx="' + idx + '">' +
1817
                '<div class="brand-head">' +
2159
                '<div class="brand-head">' +
1818
                '<div class="cx">&rsaquo;</div>' +
2160
                '<div class="cx">&rsaquo;</div>' +
1819
                '<div class="bn" title="' + escapeHtml(b.brand) + '">' + escapeHtml(b.brand) + '</div>' +
2161
                '<div class="bn" title="' + escapeHtml(b.brand) + '">' + escapeHtml(b.brand) + '</div>' +
1820
                '<div class="btrack"><i style="width:' + barW.toFixed(1) + '%"></i></div>' +
2162
                '<div class="btrack"><i style="width:' + barW.toFixed(1) + '%"></i></div>' +
-
 
2163
                '<div class="bpc' + pcCls + '" title="Distinct partners of this RBM who billed ' + escapeHtml(b.brand) + ' in the range">' +
-
 
2164
                '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>' +
-
 
2165
                pcLabel +
-
 
2166
                '</div>' +
1821
                '<div class="bval">' + fmtLakh(b.valueSold) + '</div>' +
2167
                '<div class="bval">' + fmtLakh(b.valueSold) + '</div>' +
1822
                '<div class="bshare">' + (b.sharePct || 0).toFixed(1) + '%</div>' +
2168
                '<div class="bshare">' + (b.sharePct || 0).toFixed(1) + '%</div>' +
1823
                '</div>' +
2169
                '</div>' +
1824
                '<div class="brand-body">' +
2170
                '<div class="brand-body">' +
1825
                '<div class="bhdr">Movement Split within ' + escapeHtml(b.brand) + '</div>' +
2171
                '<div class="bhdr">Movement Split within ' + escapeHtml(b.brand) + '</div>' +