app/template/aneros2023/Block/customer_rank_info.twig line 1

Open in your IDE?
  1. {#
  2. * Plugin Name : CustomerRank
  3. *
  4. * Copyright (C) BraTech Co., Ltd. All Rights Reserved.
  5. * http://www.bratech.co.jp/
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. #}
  10. {% block stylesheet %}
  11. <style>
  12. .next-level { color: #ff0000; font-weight: bold; }
  13. .progress-container {
  14.   position: relative;
  15.   background: #eee;
  16.   border-radius: 10px;
  17.   height: 20px;
  18.   max-width: 500px;
  19.   width:80%;
  20.   margin: 10px auto;
  21.   overflow: hidden;
  22.   border: 1px #000 solid;
  23. }
  24. .progress-bar-fill {
  25.   background: linear-gradient(to right, #ee0000, #ff7f7f);
  26.   height: 100%;
  27.   width: 0;
  28.   border-radius: 10px;
  29.   transition: width 1.5s ease;
  30. }
  31. .progress-text {
  32.   position: absolute;
  33.   left: 50%; top: 0;
  34.   transform: translateX(-50%);
  35.   font-size: 12px;
  36.   color: #000;
  37. }
  38. .rank {
  39.   position: relative;
  40.   cursor: help;
  41. }
  42. .rank span.tooltip {
  43.   position: absolute;
  44.   bottom: 125%; left: 50%;
  45.   transform: translateX(-50%);
  46.   background: rgba(0,0,0,0.8);
  47.   color: #fff;
  48.   padding: 4px 8px;
  49.   border-radius: 4px;
  50.   white-space: nowrap;
  51.   opacity: 0;
  52.   pointer-events: none;
  53.   transition: opacity .3s ease;
  54.   z-index: 10;
  55.   font-weight:normal !important;
  56. }
  57. .rank:hover .tooltip,
  58. .rank:focus .tooltip { opacity: 1; }
  59. .tooltip-percent {
  60.   color: #e60000;
  61.   font-weight: bold;
  62. }
  63. .next_info .note {
  64.   font-size: 10px;
  65.   color: #555;
  66.   margin-top: 5px;
  67. }
  68. </style>
  69. {% endblock stylesheet %}
  70. {% if NextCustomerRank %}
  71.   {# Pre-compute once #}
  72.   {% set userTotal       = CurrentCondition.total_amount|default(0) %}
  73.   {% set cartTotal       = get_carts_total_price()|default(0) %}
  74.   {% set combinedTotal   = userTotal + cartTotal %}
  75.   {% set currentStart    = CurrentCustomerRank.condAmount|default(0) %}
  76.   {# Safer: default nextEnd to 0 if not set #}
  77.   {% set nextEnd         = NextCustomerRank.condAmount|default(0) %}
  78.   {% set nextAmount      = nextEnd - combinedTotal %}
  79.   {% if nextAmount < 0 %}{% set nextAmount = 0 %}{% endif %}
  80.   {# --- SAFE progress calculation (avoid division by zero) --- #}
  81.   {% set denom = nextEnd - currentStart %}
  82.   {% if denom > 0 %}
  83.     {# Normal case: can compute progress safely #}
  84.     {% set rawPercent = (((combinedTotal - currentStart) / denom) * 100)|round(0, 'floor') %}
  85.   {% else %}
  86.     {# No valid "next" threshold (top rank, or misconfigured thresholds) #}
  87.     {# Treat as 100% so we never divide by zero and never crash mypage/cart. #}
  88.     {% set rawPercent = 100 %}
  89.   {% endif %}
  90.   {# Clamp progress to 0–100 #}
  91.   {% if rawPercent < 0 %}
  92.     {% set progressPercent = 0 %}
  93.   {% elseif rawPercent > 100 %}
  94.     {% set progressPercent = 100 %}
  95.   {% else %}
  96.     {% set progressPercent = rawPercent %}
  97.   {% endif %}
  98.   {# total point rate #}
  99.   {% set totalPointRate = BaseInfo.basic_point_rate|default(0) + NextCustomerRank.pointRate|default(0) %}
  100.   <div id="customer_rank">
  101.     <div class="container-fluid">
  102.       <div class="col-md-10 col-md-offset-1">
  103.         <div class="next_info">
  104.           <p>
  105.             {% if nextAmount == 0 %}
  106.               おめでとうございます!
  107.               「<span class="rank {{ NextCustomerRank.name }}" tabindex="0">
  108.                 {{ NextCustomerRank.name }}
  109.                 <span class="tooltip">
  110.                   次回のご注文からポイント率が
  111.                   <span class="tooltip-percent">{{ totalPointRate }}%</span>に!
  112.                 </span>
  113.               </span>」にランクアップします!
  114.             {% else %}
  115.               あと <span class="next-level">{{ nextAmount|number_format }}円</span> で
  116.               「<span class="rank {{ NextCustomerRank.name }}" tabindex="0">
  117.                 {{ NextCustomerRank.name }}
  118.                 <span class="tooltip">
  119.                   次回のご注文からポイント率が
  120.                   <span class="tooltip-percent">{{ totalPointRate }}%</span>に!
  121.                 </span>
  122.               </span>」にランクアップ!
  123.             {% endif %}
  124.           </p>
  125.           <div class="progress-container">
  126.             <div class="progress-bar-fill"></div>
  127.             <span class="progress-text">0%</span>
  128.           </div>
  129.           <p class="note">※クーポン・ポイント適用前の目安です。ご注文発送後にランクが更新されます。</p>
  130.         </div>
  131.       </div>
  132.     </div>
  133.   </div>
  134. {% endif %}
  135. {% block javascript %}
  136. <script>
  137.   $(function(){
  138.     $("#customer_rank").appendTo("#customer-rank-info");
  139.   });
  140.   document.addEventListener("DOMContentLoaded", function(){
  141.     {% if NextCustomerRank %}
  142.       var bar      = document.querySelector(".progress-bar-fill"),
  143.           text     = document.querySelector(".progress-text"),
  144.           percent  = {{ progressPercent }},
  145.           duration = 1500,
  146.           stepTime = percent ? duration / percent : duration;
  147.       bar.style.transition = 'width ' + duration + 'ms ease';
  148.       setTimeout(function(){
  149.         bar.style.width = percent + "%";
  150.         var current = 0,
  151.             timer   = setInterval(function(){
  152.               text.textContent = (++current) + "%";
  153.               if (current >= percent) clearInterval(timer);
  154.             }, stepTime);
  155.       }, 200);
  156.     {% endif %}
  157.   });
  158. </script>
  159. {% endblock javascript %}