src/ApplicationBundle/Modules/HoneybeeWeb/Resources/views/pages/tools/hb360_my_estimate.html.twig line 1

Open in your IDE?
  1. {% include '@Application/inc/central_header.html.twig' %}
  2. {% include '@HoneybeeWeb/inc/_web_design_system.html.twig' %}
  3. {% include '@HoneybeeWeb/inc/_hb360_tags.html.twig' %}
  4. <style>
  5. .hbm-wrap { max-width: 900px; margin: 0 auto; padding: 0 28px; }
  6. .hbm-hero { background: var(--n-cream); padding: 120px 0 32px; }
  7. .hbm-card { background: var(--n-white); border: 1px solid var(--n-border-md); border-radius: var(--n-radius); padding: 26px; box-shadow: var(--n-shadow-sm); }
  8. .hbm-switch { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 16px; }
  9. .hbm-switch a { font-size: 12.5px; font-weight: 600; color: var(--n-muted); border: 1.5px solid var(--n-border-md); border-radius: 100px; padding: 6px 14px; text-decoration: none; }
  10. .hbm-switch a.active { background: var(--n-dark); color: #fff; border-color: var(--n-dark); }
  11. .hbm-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
  12. .hbm-share { font-size: 12.5px; color: var(--n-muted); margin-top: 10px; word-break: break-all; }
  13. </style>
  14. <section class="hbm-hero">
  15.     <div class="hbm-wrap">
  16.         <div class="n-label">HoneyBee 360 Β· Your saved estimate</div>
  17.         <h1 style="font-family:'Montserrat',sans-serif;font-size:clamp(1.7rem,3.5vw,2.4rem);font-weight:900;color:var(--n-dark);letter-spacing:-.025em;line-height:1.1;margin:0 0 10px">
  18.             {% if current %}{{ current.title ?: 'Your solar estimate' }}{% else %}My solar estimates{% endif %}
  19.         </h1>
  20.         {% if current %}
  21.         <p class="n-body" style="margin:0;font-size:14px;color:var(--n-muted)">Saved {{ current.updatedAt|date('d M Y') }}{% if current.address %} Β· πŸ“ {{ current.address }}{% endif %}</p>
  22.         {% endif %}
  23.     </div>
  24. </section>
  25. <section style="background:var(--n-cream);padding:8px 0 100px">
  26.     <div class="hbm-wrap">
  27.         {% if not storage_ready %}
  28.             <div class="hbm-card" style="text-align:center;color:var(--n-muted)">
  29.                 <i class="fa-solid fa-hourglass-half" style="font-size:26px;color:var(--n-amber);display:block;margin-bottom:10px"></i>
  30.                 Estimate saving is being switched on for your account β€” please try again shortly.<br>
  31.                 Meanwhile the <a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" style="color:var(--n-amber);font-weight:600">Instant Solar Estimate</a> works as usual.
  32.             </div>
  33.         {% elseif not current %}
  34.             <div class="hbm-card" style="text-align:center;color:var(--n-muted)">
  35.                 <i class="fa-solid fa-solar-panel" style="font-size:26px;color:var(--n-amber);display:block;margin-bottom:10px"></i>
  36.                 No saved estimate yet.<br><br>
  37.                 <a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" class="n-btn n-btn-amber">Run an Instant Solar Estimate <i class="fa-solid fa-bolt"></i></a>
  38.             </div>
  39.         {% else %}
  40.             {% if projects|length > 1 %}
  41.             <div class="hbm-switch">
  42.                 {% for p in projects %}
  43.                     <a href="{{ url('hb360_my_estimate', {'p': p.id}) }}" class="{{ p.id == current.id ? 'active' : '' }}">{{ p.title ?: ('Estimate #' ~ p.id) }}</a>
  44.                 {% endfor %}
  45.             </div>
  46.             {% endif %}
  47.             {% if app.request.get('locked') %}
  48.                 <div class="hbm-card" style="margin-bottom:16px;border-left:3px solid var(--n-amber)">
  49.                     <b>πŸ”’ Package {{ app.request.get('locked') }} needs the {{ app.request.get('tier') ?: 'higher' }} plan.</b>
  50.                     <span style="color:var(--n-muted);font-size:13px">Your saved estimate is untouched β€” upgrade to unlock this package.</span>
  51.                     <a href="{{ url('honeybee_pricing') }}" class="n-btn n-btn-amber" style="margin-left:10px;padding:8px 16px;font-size:13px">See plans</a>
  52.                 </div>
  53.             {% endif %}
  54.             {# β”€β”€ FUNNEL-3: My designs β€” every saved studio design on this account, with
  55.                  the honest offer-status line and own-scoped manage actions. β”€β”€ #}
  56.             {% if my_designs is defined and my_designs|length > 0 %}
  57.                 <div class="hbm-card" style="margin-bottom:16px">
  58.                     <div class="n-label">HoneyWatt Β· my designs</div>
  59.                     {% for d in my_designs %}
  60.                         <div style="border-top:1px dashed var(--n-border-md);padding:10px 0;{{ loop.first ? 'border-top:none;' : '' }}">
  61.                             <div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap">
  62.                                 <b style="font-size:14px">{{ d.title }}</b>
  63.                                 <span style="color:var(--n-muted);font-size:12.5px">
  64.                                     {{ d.summary.zones }} zone{{ d.summary.zones == 1 ? '' : 's' }} Β·
  65.                                     {{ d.summary.modules|number_format(0, ',', '.') }} modules Β·
  66.                                     {{ d.summary.kwp|number_format(1, ',', '.') }} kWp
  67.                                     {%- if d.address %} Β· {{ d.address }}{% endif %} Β· {{ d.updated }}
  68.                                 </span>
  69.                             </div>
  70.                             {% if d.offer %}
  71.                                 <div style="font-size:12.5px;margin-top:4px;color:var(--n-amber);font-weight:600">
  72.                                     Offer request{% if d.offer.recipient %} β†’ {{ d.offer.recipient }}{% endif %}: {{ d.offer.label }}
  73.                                 </div>
  74.                             {% endif %}
  75.                             <div style="display:flex;gap:8px;margin-top:8px;flex-wrap:wrap;align-items:center">
  76.                                 <a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}?mydesign={{ d.id }}"
  77.                                    class="n-btn n-btn-amber" style="padding:6px 14px;font-size:12.5px">Open &amp; customize</a>
  78.                                 <form method="post" action="{{ url('hb360_design_rename', {'id': d.id}) }}" style="display:flex;gap:6px">
  79.                                     <input type="text" name="title" placeholder="Rename…" style="padding:6px 8px;border:1.5px solid var(--n-border-md);border-radius:6px;font-size:12.5px;width:160px">
  80.                                     <button type="submit" class="n-btn n-btn-outline" style="padding:6px 10px;font-size:12.5px">Rename</button>
  81.                                 </form>
  82.                                 <form method="post" action="{{ url('hb360_design_duplicate', {'id': d.id}) }}">
  83.                                     <button type="submit" class="n-btn n-btn-outline" style="padding:6px 10px;font-size:12.5px">Duplicate</button>
  84.                                 </form>
  85.                                 <form method="post" action="{{ url('hb360_design_delete', {'id': d.id}) }}"
  86.                                       onsubmit="return confirm('Delete this design? It disappears from your list (kept 30 days, then purged).');">
  87.                                     <button type="submit" class="n-btn n-btn-outline" style="padding:6px 10px;font-size:12.5px;color:#b4452f">Delete</button>
  88.                                 </form>
  89.                             </div>
  90.                         </div>
  91.                     {% endfor %}
  92.                 </div>
  93.             {% endif %}
  94.             {# β”€β”€ FUNNEL-1: the attached studio design (minimal card β€” the applicant design
  95.                  workspace is a later slice). Figures are the CLIENT-shown pills, said so. β”€β”€ #}
  96.             {% if design is defined and design %}
  97.                 <div class="hbm-card" style="margin-bottom:16px;border-left:3px solid var(--n-amber)">
  98.                     <div class="n-label">HoneyWatt Β· your saved design</div>
  99.                     <p style="margin:8px 0 4px;font-size:15px;font-weight:700">
  100.                         {{ design.summary.zones }} zone{{ design.summary.zones == 1 ? '' : 's' }} Β·
  101.                         {{ design.summary.modules|number_format(0, ',', '.') }} modules Β·
  102.                         {{ design.summary.kwp|number_format(1, ',', '.') }} kWp
  103.                         {%- if design.summary.components > 0 %} Β· {{ design.summary.components }} component{{ design.summary.components == 1 ? '' : 's' }}{% endif %}
  104.                     </p>
  105.                     <p style="margin:0;font-size:12.5px;color:var(--n-muted)">
  106.                         Figures as designed in the studio{% if design.saved_at %} Β· saved {{ design.saved_at|date('d M Y H:i') }}{% endif %}.
  107.                         Your layout is stored with this estimate and attached to your account.
  108.                         <a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" style="color:var(--n-amber);font-weight:600">Keep designing</a>
  109.                     </p>
  110.                 </div>
  111.             {% endif %}
  112.             <div class="hbm-card">
  113.                 {% if estimate and estimate.ok is defined and estimate.ok %}
  114.                 {% include '@HoneybeeWeb/inc/_hb360_report_body.html.twig' with {'estimate': estimate, 'report': report, 'project': current} %}
  115.                 {% else %}
  116.                 <div style="text-align:center;color:var(--n-muted);padding:8px 0 2px">
  117.                     No estimate figures yet for this entry β€” run the
  118.                     <a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" style="color:var(--n-amber);font-weight:600">Instant Solar Estimate</a>
  119.                     at your address to add yield, cost and payback.
  120.                 </div>
  121.                 {% endif %}
  122.                 <div class="hbm-actions">
  123.                     {% if report %}
  124.                         <form method="post" action="{{ url('hb360_generate_report', {'id': current.id}) }}" style="display:flex;gap:8px;flex-wrap:wrap;align-items:center">
  125.                             {% if report.equipment is defined and report.equipment.inverters.ok|default(false) %}
  126.                             <select name="inverter_model" style="padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px;max-width:320px">
  127.                                 {% for c in report.equipment.inverters.configs|slice(0, 8) %}
  128.                                     {% if c.valid %}
  129.                                     <option value="{{ c.key }}" {{ c.key == report.equipment.chosen ? 'selected' : '' }}>{{ c.key }} Β· β‚¬{{ c.eur_per_kw }}/kW{{ c.preferred ? ' β˜…' : '' }}</option>
  130.                                     {% endif %}
  131.                                 {% endfor %}
  132.                             </select>
  133.                             {% endif %}
  134.                             <button type="submit" class="n-btn n-btn-outline">Refresh report <i class="fa-solid fa-rotate"></i></button>
  135.                         </form>
  136.                         {% if current.convertedRef %}
  137.                             <a href="{{ url('hb360_convert_confirm', {'id': current.id}) }}" class="n-btn n-btn-outline">EPC project: {{ current.convertedRef|split('#')|first }} <i class="fa-solid fa-arrow-up-right-from-square"></i></a>
  138.                         {% else %}
  139.                             <a href="{{ url('hb360_convert_confirm', {'id': current.id}) }}" class="n-btn n-btn-amber">Convert to EPC project <i class="fa-solid fa-file-signature"></i></a>
  140.                         {% endif %}
  141.                         <a href="{{ url('honeybee_contact') }}" class="n-btn n-btn-outline">Book a HoneyCore Site Assessment <i class="fa-solid fa-arrow-right"></i></a>
  142.                     {% else %}
  143.                         <form method="post" action="{{ url('hb360_generate_report', {'id': current.id}) }}">
  144.                             <button type="submit" class="n-btn n-btn-amber">Generate my full feasibility report <i class="fa-solid fa-file-lines"></i></button>
  145.                         </form>
  146.                         <a href="{{ url('honeybee_tool', {'slug': 'rooftop-estimate'}) }}" class="n-btn n-btn-outline">Re-run the estimate</a>
  147.                     {% endif %}
  148.                 </div>
  149.                 {% if report and current.shareToken %}
  150.                     <div class="hbm-share">
  151.                         <i class="fa-solid fa-link" style="color:var(--n-amber)"></i> Share (read-only):
  152.                         <a href="{{ url('hb360_shared_estimate', {'shareToken': current.shareToken}) }}" style="color:var(--n-amber)">{{ url('hb360_shared_estimate', {'shareToken': current.shareToken}) }}</a>
  153.                     </div>
  154.                 {% endif %}
  155.                 {% if report %}
  156.                     {% set pc_in = report.package_c.inputs|default(null) %}
  157.                     <div style="margin-top:26px;border-top:2px solid var(--n-border-md);padding-top:18px">
  158.                         <h3 style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:1.05rem;color:var(--n-dark);margin:0 0 4px">
  159.                             {{ report.package_c is defined ? 'Update the hybrid design (Package C)' : 'Go hybrid β€” add battery, backup & EV charging (Package C)' }}
  160.                         </h3>
  161.                         <p style="font-size:12.5px;color:var(--n-muted);margin:0 0 12px">A few details about how the site runs β€” everything stays an estimate until a site survey.</p>
  162.                         <form method="post" action="{{ url('hb360_generate_hybrid', {'id': current.id}) }}">
  163.                             <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px">
  164.                                 <label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Daytime use (% of load)
  165.                                     <input type="number" name="day_share" min="10" max="95" value="{{ pc_in ? pc_in.day_share_pct : 60 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
  166.                                 </label>
  167.                                 <label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Critical load (%)
  168.                                     <input type="number" name="critical_load_pct" min="0" max="100" value="{{ pc_in ? pc_in.critical_load_pct : 30 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
  169.                                 </label>
  170.                                 <label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Grid outages (h/yr)
  171.                                     <input type="number" name="outage_hours_yr" min="0" max="2000" value="{{ pc_in ? pc_in.outage_hours_yr : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
  172.                                 </label>
  173.                             </div>
  174.                             <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-top:12px">
  175.                                 <label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">AC 11 kW chargers
  176.                                     <input type="number" name="ev_ac11" min="0" max="200" value="{{ pc_in ? pc_in.chargers.ac11|default(0) : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
  177.                                 </label>
  178.                                 <label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">AC 22 kW chargers
  179.                                     <input type="number" name="ev_ac22" min="0" max="200" value="{{ pc_in ? pc_in.chargers.ac22|default(0) : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
  180.                                 </label>
  181.                                 <label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">DC 50 kW chargers
  182.                                     <input type="number" name="ev_dc50" min="0" max="50" value="{{ pc_in ? pc_in.chargers.dc50|default(0) : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
  183.                                 </label>
  184.                                 <label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">DC 150 kW chargers
  185.                                     <input type="number" name="ev_dc150" min="0" max="50" value="{{ pc_in ? pc_in.chargers.dc150|default(0) : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
  186.                                 </label>
  187.                             </div>
  188.                             <button type="submit" class="n-btn n-btn-amber" style="margin-top:14px">{{ report.package_c is defined ? 'Update hybrid design' : 'Design my hybrid system' }} <i class="fa-solid fa-battery-full"></i></button>
  189.                         </form>
  190.                     </div>
  191.                     {% set pd_in = report.package_d.inputs|default(null) %}
  192.                     <div style="margin-top:26px;border-top:2px solid var(--n-border-md);padding-top:18px">
  193.                         <h3 style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:1.05rem;color:var(--n-dark);margin:0 0 4px">
  194.                             {{ report.package_d is defined ? 'Update the grid & connection concept (Package D)' : 'Check the grid connection (Package D)' }}
  195.                         </h3>
  196.                         <p style="font-size:12.5px;color:var(--n-muted);margin:0 0 12px">Scans mapped grid infrastructure near your site and drafts the DNO-enquiry briefing: connection level, protection checklist, EMS functions. Concept-grade β€” a chartered engineer and the grid operator decide.</p>
  197.                         <form method="post" action="{{ url('hb360_generate_grid', {'id': current.id}) }}">
  198.                             <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px">
  199.                                 <label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Feed-in cap (% of PV AC)
  200.                                     <input type="number" name="export_cap_pct" min="0" max="100" value="{{ pd_in ? pd_in.export_cap_pct : 100 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
  201.                                 </label>
  202.                                 <label style="font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--n-muted)">Existing connection (kVA, 0 = unknown)
  203.                                     <input type="number" name="existing_connection_kva" min="0" max="100000" value="{{ pd_in and pd_in.existing_connection_kva ? pd_in.existing_connection_kva : 0 }}" style="width:100%;margin-top:5px;padding:9px 10px;border:1.5px solid var(--n-border-md);border-radius:var(--n-radius-sm);font-size:13px">
  204.                                 </label>
  205.                             </div>
  206.                             <button type="submit" class="n-btn n-btn-amber" style="margin-top:14px">{{ report.package_d is defined ? 'Update grid concept' : 'Draft my grid concept' }} <i class="fa-solid fa-bolt-lightning"></i></button>
  207.                         </form>
  208.                     </div>
  209.                     <div style="margin-top:26px;border-top:2px solid var(--n-border-md);padding-top:18px">
  210.                         <h3 style="font-family:'Montserrat',sans-serif;font-weight:800;font-size:1.05rem;color:var(--n-dark);margin:0 0 4px">
  211.                             {{ report.package_e is defined ? 'Update the execution & operate pack (Packages E + F)' : 'Plan the build & operation (Packages E + F)' }}
  212.                         </h3>
  213.                         <p style="font-size:12.5px;color:var(--n-muted);margin:0 0 12px">Graded L1–L5 bill of materials, an RFQ pack for vendor enquiries, the staged commissioning checklist, and the O&amp;M plan that closes the loop into HoneyCore monitoring. Uses everything generated above.</p>
  214.                         <form method="post" action="{{ url('hb360_generate_execution', {'id': current.id}) }}">
  215.                             <button type="submit" class="n-btn n-btn-amber">{{ report.package_e is defined ? 'Update execution pack' : 'Build my execution pack' }} <i class="fa-solid fa-clipboard-check"></i></button>
  216.                         </form>
  217.                     </div>
  218.                 {% endif %}
  219.             </div>
  220.         {% endif %}
  221.     </div>
  222. </section>
  223. {% include '@HoneybeeWeb/footer/central_footer.html.twig' %}