templates/base.html.twig line 1

  1. {% trans_default_domain "top_bar" %}
  2. <!DOCTYPE html>
  3. <html lang="{{ app.request.getLocale() }}">
  4. <head>
  5.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6.     <meta name="author" content="Fogazzi Mirko" />
  7.     <meta name="copyright" content="Fogazzi Mirko" />
  8.     {{ include('seo_metatag.html.twig') }}
  9.     {{ impostazioni.ritornaImpostazioneDaNome("HeaderGeneraleTuttePagine")|raw }}
  10.     {{ traduzione.CaricaTraduzioniDaFamiglie(["agenti_dialog_principale", "dialog_ricerca_cliente", "agenti_crea_offerta_da_carrello_dialog"], app.request.locale) }}
  11.     {{ include('ZZ_front_end/stili_base.html.twig') }}
  12.     <title>{% block title %}{{ impostazioni.ritornaImpostazioneDaNome("TitleGenerico")|raw }}{% endblock %}</title>
  13.     <link rel="stylesheet" href="{{ asset('css/sm-core-css.css') }}">
  14.     <link rel="stylesheet" href="{{ asset('css/simple-sidebar.css') }}">
  15.     <!-- Bootstrap core CSS -->
  16.     <link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet">
  17.     <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css" rel="stylesheet">
  18.     <link href="{{ asset('css/dropdown-css-style.css') }}" rel="stylesheet">
  19.     {#  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css">  #}
  20.     <link href="{{ asset('java_lib/jquery-ui-1.12.0/jquery-ui.min.css') }}" rel="stylesheet">
  21.     {% if is_granted('ROLE_ADMIN') or app.user or is_granted('ROLE_AGENTE') or is_granted('ROLE_COMMERCIALE') or is_granted("ROLE_FORNITORE") %}
  22.         {#<link href="https://unpkg.com/tabulator-tables@4.2.7/dist/css/tabulator.min.css" rel="stylesheet">#}
  23.         <link href="https://unpkg.com/tabulator-tables@5.2.3/dist/css/tabulator.min.css" rel="stylesheet">
  24.         <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.css" integrity="sha256-aa0xaJgmK/X74WM224KMQeNQC2xYKwlAt08oZqjeF0E=" crossorigin="anonymous" />
  25.     {% endif %}
  26.     <!-- FONT AWSOME -->
  27.     <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
  28.     <!-- SLICK CAROUSEL -->
  29.     <link rel="stylesheet" type="text/css" href="{{ asset('java_lib/slick-1.8.1/slick/slick.css') }}"/>
  30.     <link rel="stylesheet" type="text/css" href="{{ asset('java_lib/slick-1.8.1/slick/slick-theme.css') }}"/>
  31.     <!-- TINY SLIDER -->
  32.     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tiny-slider/2.9.2/tiny-slider.css">
  33.     <!-- CORE NAV -->
  34.     <link rel="stylesheet" type="text/css" href="{{ asset('java_lib/custom_mf_sidebar/mf_sidebar.css') }}" />
  35.     <style type="text/css">
  36.         #modalZoomImg * {box-sizing: border-box;}
  37.         div#modalDettaglioCliente.modal.fade.in{
  38.             visibility: visible;
  39.         }
  40.         div#modalDettaglioCliente.modal.fade{
  41.             display: block;
  42.             visibility: hidden;
  43.         }
  44.         .bottone-risorse-articoli{
  45.             position: absolute;
  46.             border: solid 1px green;
  47.             border-radius: 10px;
  48.             padding: 5px;
  49.             float: right;
  50.             width: 40px;
  51.             z-index: 99;
  52.             cursor: pointer;
  53.             background: white;
  54.             top: 0px;
  55.             right: 0px;
  56.             height: 40px;
  57.         }
  58.         .bottone-risorse-articoli img{
  59.             height: 100%;
  60.             width: 100%;
  61.             /* Permalink - use to edit and share this gradient: https://colorzilla.com/gradient-editor/#ffffff+0,ffffff+100&1+0,0+100;White+to+Transparent */
  62.             background: transparent;
  63.         }
  64.         .img-zoom-container {
  65.             position: relative;
  66.         }
  67.         .centra-flex-tutto{
  68.             display: flex;
  69.             flex-direction: row;
  70.             align-content: center;
  71.             align-items: center;
  72.             justify-content: center;
  73.         }
  74.         .img-zoom-lens {
  75.             position: absolute;
  76.             border: 1px solid #d4d4d4;
  77.             /*set the size of the lens:*/
  78.             width: 250px;
  79.             height: 250px;
  80.         }
  81.         .img-zoom-result {
  82.             border: 1px solid #d4d4d4;
  83.             /*set the size of the result div:*/
  84.             width: 300px;
  85.             height: 300px;
  86.         }
  87.         {% if impostazioni.ritornaImpostazioneDaNome('NascondiFrecceSuGiuInInputNumber') == '1' %}
  88.         /* Chrome, Safari, Edge, Opera */
  89.         input::-webkit-outer-spin-button,
  90.         input::-webkit-inner-spin-button {
  91.             -webkit-appearance: none;
  92.             margin: 0;
  93.         }
  94.         /* Firefox */
  95.         input[type=number] {
  96.             -moz-appearance: textfield;
  97.         }
  98.         {% endif %}
  99.         /* The snackbar - position it at the bottom and in the middle of the screen */
  100.         #snackbar {
  101.             visibility: hidden; /* Hidden by default. Visible on click */
  102.             min-width: 350px; /* Set a default minimum width */
  103.             margin-left: -125px; /* Divide value of min-width by 2 */
  104.             background-color: #333; /* Black background color */
  105.             color: #fff; /* White text color */
  106.             text-align: center; /* Centered text */
  107.             border-radius: 2px; /* Rounded borders */
  108.             padding: 16px; /* Padding */
  109.             position: fixed; /* Sit on top of the screen */
  110.             z-index: 1; /* Add a z-index if needed */
  111.             left: 50%; /* Center the snackbar */
  112.             bottom: 80px; /* 30px from the bottom */
  113.             font-size: 15pt;
  114.         }
  115.         .attiva-tiny-slider{
  116.             display: none;
  117.         }
  118.         .attiva-slick{
  119.             display: none;
  120.         }
  121.         #bodyTabellaRicercaCliente tr:hover{
  122.             background-color: yellow;
  123.             cursor: pointer;
  124.         }
  125.         .cercaCliente:hover{
  126.             cursor: pointer;
  127.         }
  128.         .modal { overflow: auto !important; }
  129.         /* Show the snackbar when clicking on a button (class added with JavaScript) */
  130.         #snackbar.show {
  131.             visibility: visible; /* Show the snackbar */
  132.             /* Add animation: Take 0.5 seconds to fade in and out the snackbar.
  133.             However, delay the fade out process for 2.5 seconds */
  134.             -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s;
  135.             animation: fadein 0.5s, fadeout 0.5s 2.5s;
  136.         }
  137.         /* Animations to fade the snackbar in and out */
  138.         @-webkit-keyframes fadein {
  139.             from {bottom: 0; opacity: 0;}
  140.             to {bottom: 80px; opacity: 1;}
  141.         }
  142.         @keyframes fadein {
  143.             from {bottom: 0; opacity: 0;}
  144.             to {bottom: 80px; opacity: 1;}
  145.         }
  146.         @-webkit-keyframes fadeout {
  147.             from {bottom: 80px; opacity: 1;}
  148.             to {bottom: 0; opacity: 0;}
  149.         }
  150.         @keyframes fadeout {
  151.             from {bottom: 80px; opacity: 1;}
  152.             to {bottom: 0; opacity: 0;}
  153.         }
  154.     </style>
  155.     {% block head %}{% endblock %}
  156.     {% block stylesheet %}{% endblock %}
  157.     {% block altri_nav %}{% endblock %}
  158.     <!-- jQuery Core -->
  159.     <script type="text/javascript" src="{{ asset('java_lib/jquery-2.2.4.min.js') }}"></script>
  160.     <script type="text/javascript" src="{{ asset('java_lib/jquery-ui-1.12.0/jquery-ui.min.js') }}"></script>
  161.     <script type="text/javascript" src="{{ asset('java_lib/bootstrap.min.js') }}"></script>
  162.     {#  <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js"></script> #}
  163. </head>
  164. <body>
  165. <div id="snackbar"></div>
  166. <div class="loading" id="loadingMaster">Loading&#8230;</div>
  167. {% if app.request.get("_route") == 'admin_pagine_e_componenti_editor' %}
  168.     {% set mostraTopBar = 0 %}
  169. {% endif %}
  170. {% if (mostraTopBar is defined and mostraTopBar == 1) or mostraTopBar is not defined %}
  171.     {{ include('ZZ_front_end/top_bar/top_bar.html.twig') }}
  172. {% endif %}
  173. {% if app.request.get("_route") == 'home_shop' %}
  174.     <div class="modal fade" role="dialog" tabindex="-1" style="z-index: 999999;" id="modal-cerca-filtro-avanzato-dialog">
  175.         <div class="modal-dialog" role="document">
  176.             <div class="modal-content">
  177.                 <div class="modal-header">
  178.                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  179.                     <h4 class="modal-title">{{ traduzione.OttieniElementoDizionario("top_bar_filtro_avanzato_title", "top_bar").valoreUscita }}</h4>
  180.                 </div>
  181.                 <div class="modal-body">
  182.                     <form id="form-filtro-avanzato">
  183.                         <div class="form-group">
  184.                             <label for="filtro-avanzato-codice">{{ traduzione.OttieniElementoDizionario("top_bar_filtro_avanzato_codice_label", "top_bar").valoreUscita }}</label>
  185.                             <input type="text" class="form-control" name="articolo.codice" id="filtro-avanzato-codice">
  186.                         </div>
  187.                         <div class="form-group">
  188.                             <label for="filtro-avanzato-nome">{{ traduzione.OttieniElementoDizionario("top_bar_filtro_avanzato_descrizione_label", "top_bar").valoreUscita }}</label>
  189.                             <input type="text" class="form-control" name="articolo.nome" id="filtro-avanzato-nome">
  190.                         </div>
  191.                         <div class="form-group">
  192.                             <label for="filtro-avanzato-marca">{{ traduzione.OttieniElementoDizionario("top_bar_filtro_avanzato_marca_label", "top_bar").valoreUscita }}</label>
  193.                             <input type="text" class="form-control" name="mappa.marca" id="filtro-avanzato-marca">
  194.                         </div>
  195.                         <div class="checkbox">
  196.                             <label>
  197.                                 <input type="checkbox" name="filtro-avanzato-solo-disponibile"> {{ traduzione.OttieniElementoDizionario("top_bar_filtro_avanzato_mostra_solo_disponibili", "top_bar").valoreUscita }}
  198.                             </label>
  199.                         </div>
  200.                         <div class="checkbox">
  201.                             <label>
  202.                                 <input type="checkbox" name="filtro-avanzato-cerca-solo-in-categorie-selezionate"> {{ traduzione.OttieniElementoDizionario("top_bar_filtro_avanzato_cerca_solo_in_albero_categorie_corrente", "top_bar").valoreUscita }}
  203.                             </label>
  204.                         </div>
  205.                     </form>
  206.                 </div>
  207.                 <div class="modal-footer">
  208.                     <button type="button" onclick="ResetRicerca();" class="btn btn-danger" data-dismiss="modal">{{ traduzione.OttieniElementoDizionario("top_bar_filtro_avanzato_reset_btn", "top_bar").valoreUscita }}</button>
  209.                     <button type="button" onclick="$('#form-filtro-avanzato').submit();" class="btn btn-primary" data-dismiss="modal">{{ traduzione.OttieniElementoDizionario("top_bar_filtro_avanzato_applica_btn", "top_bar").valoreUscita }}</button>
  210.                 </div>
  211.             </div><!-- /.modal-content -->
  212.         </div><!-- /.modal-dialog -->
  213.     </div><!-- /.modal -->
  214. {% endif %}
  215. <div class="modal fade" tabindex="-1" role="dialog" id="modalZoomImg" style="z-index: 9999;">
  216.     <div class="modal-dialog panel-warning" role="document"  style="width: 80%;">
  217.         <div class="modal-content panel-warning">
  218.             <div class="modal-body" style="overflow-y: auto;">
  219.                 <div class="col-md-12 nascondiStampa">
  220.                     <div class="img-zoom-container">
  221.                         <div class="col-md-6 col-xs-12">
  222.                             <img id="zoomImgImg" src="" style="max-height: 90vh; width: auto;">
  223.                         </div>
  224.                         <div class="col-md-6 col-xs-12" style="max-height: 90vh;">
  225.                             <div id="zoomImgResult" class="img-zoom-result" style="width: 100%; height: 90vh;"></div>
  226.                         </div>
  227.                     </div>
  228.                 </div>
  229.             </div>
  230.             <div class="modal-footer">
  231.                 <button type="button" class="btn btn-danger" data-dismiss="modal">Chiudi</button>
  232.             </div>
  233.         </div><!-- /.modal-content -->
  234.     </div><!-- /.modal-dialog -->
  235. </div><!-- /.modal -->
  236. <div class="modal fade" tabindex="-1" role="dialog" id="risorseCatArtDialog" style="z-index: 99999;">
  237.     <div class="modal-dialog panel-warning" role="document"  style="width: 80%;">
  238.         <div class="modal-content panel-warning">
  239.             <div class="modal-header">
  240.                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  241.                 <h4 class="modal-title">Risorse</h4>
  242.             </div>
  243.             <div class="modal-body" id="risorseCatArtDialog-body" style="overflow-y: auto;">
  244.             </div>
  245.             <div class="modal-footer">
  246.                 <button type="button" class="btn btn-danger" data-dismiss="modal">Chiudi</button>
  247.             </div>
  248.         </div><!-- /.modal-content -->
  249.     </div><!-- /.modal-dialog -->
  250. </div><!-- /.modal -->
  251. {% if not is_granted('ROLE_ADMIN') or is_granted('ROLE_AGENTE') or is_granted('ROLE_COMMERCIALE') %}
  252. <div class="modal fade" tabindex="-1" role="dialog" id="modalDettaglioClienteLoggato">
  253.     <div class="modal-dialog panel-warning" role="document"  style="width: 80%;">
  254.         <div class="modal-content panel-warning">
  255.             <div class="modal-header">
  256.                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  257.                 <h4 class="modal-title" id="modalTitleDettaglioClienteLoggato">
  258.                     <button class="btn btn-danger" style="margin-right: 10px;" data-dismiss="modal" aria-label="Close">{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_indietro_btn", "agenti_dialog_principale").valoreUscita }}</button>
  259.                     {{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_dettaglio_cliente", "agenti_dialog_principale").valoreUscita }} <span id="modalDettaglioClienteLoggato-title2" style="color:red;"></span>
  260.                 </h4>
  261.             </div>
  262.             <div class="modal-body" id="modalDettaglioClienteLoggato-body" style="overflow-y: auto;">
  263.             </div>
  264.         </div>
  265.     </div>
  266. </div>
  267. {% endif %}
  268. {% if is_granted('ROLE_ADMIN') or is_granted('ROLE_AGENTE') or is_granted('ROLE_COMMERCIALE') %}
  269. <div class="modal fade" tabindex="-1" role="dialog" id="modalDettaglioCliente">
  270.     <div class="modal-dialog panel-warning" role="document"  style="width: 80%;">
  271.         <div class="modal-content panel-warning">
  272.             <div class="modal-header">
  273.                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  274.                 <h4 class="modal-title" id="modalTitleDettaglioCliente">
  275.                     <button class="btn btn-danger" style="margin-right: 10px;" data-dismiss="modal" aria-label="Close">{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_indietro_btn", "agenti_dialog_principale").valoreUscita }}</button>
  276.                     {{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_dettaglio_cliente", "agenti_dialog_principale").valoreUscita }} <span id="modalDettaglioCliente-title2" style="color:red;"></span>
  277.                     <button href="" style="float:right; margin-right: 20px;" id="modalDettaglioClienteCreaOffertaDaCarrelloBtn" data-toggle="modal" data-target="#modalCreaOffertaDaCarrello" class="btn btn-sm btn-primary">{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_crea_offerta_da_carrello_btn", "agenti_dialog_principale").valoreUscita }}</button>
  278.                     <button href="" style="float: right; margin-right: 20px;" id="modalDettaglioClienteSpostaCarrelloBtn" class="btn btn-sm btn-warning">{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_sposta_carrello_btn", "agenti_dialog_principale").valoreUscita }}</button>
  279.                     {% set attivaTipoOrdine = impostazioni.ritornaImpostazioneDaNome("AbilitaTipoOrdine") %}
  280.                     <div class="form-inline" style="float:right; margin-right:20px;{% if attivaTipoOrdine != '1' %}display:none;{% endif %}">
  281.                         <div class="form-group">
  282.                             <label for="tipo-ordine-input">{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_tipo_ordine", "agenti_dialog_principale").valoreUscita }}</label>
  283.                             <select id="tipo-ordine-input" class="form-control" style="width:auto;">
  284.                                 {% if attivaTipoOrdine == '1' %}
  285.                                     {% for tipoOrdine in servizi.RitornaTipiOrdine() %}
  286.                                         <option {% if loop.first %} selected="selected"{% endif %} value="{{ tipoOrdine.id|default("") }}">{{ tipoOrdine.testoVisualizzato|default("") }}</option>
  287.                                     {% endfor %}
  288.                                 {% endif %}
  289.                                 {% if servizi.RitornaTipiOrdine()|length <= 0 or attivaTipoOrdine == '0' %}
  290.                                     <option value=""></option>
  291.                                 {% endif %}
  292.                             </select>
  293.                         </div>
  294.                     </div>
  295.                 </h4>
  296.             </div>
  297.             <div class="modal-body" style="overflow-y: auto;">
  298.                 <div class="col-md-12 nascondiStampa">
  299.                     <div class="form-inline center">
  300.                         <div class="input-group" style="width: 100%;">
  301.                             <span style="font-weight: bold;width: 10%;min-width: 200px;" class="input-group-addon cercaCliente" id="basic-addon1">{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_seleziona_cliente", "agenti_dialog_principale").valoreUscita }}</span>
  302.                             <input type="text" style="width: 10%;min-width: 150px;" class="form-control cercaCliente" id="codiceClienteTxt" readonly placeholder="{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_cliente_codice", "agenti_dialog_principale").valoreUscita }}">
  303.                             <input type="text" style="width: 60%;" class="form-control cercaCliente" id="ragioneSocialeText" readonly placeholder="{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_cliente_ragione_sociale", "agenti_dialog_principale").valoreUscita }}">
  304.                             <button class="btn btn-small btn-danger pulisci-selezione-cliente" style="margin-left: 10px;" onclick="PulisciSelezioneCliente();"><i class="fa fa-trash" aria-hidden="true"></i></button>
  305.                             <button class="btn btn-default" data-valore="{% if servizi.RitornaAltriDatiUtente() and servizi.RitornaAltriDatiUtente().nascondiPrezzi %}1{% else %}0{% endif %}" id="nascondiPrzBtnDettCliente" onclick="VariaStatoBottoneNascondiPrezzi();" style="margin-left: 10px;{% if impostazioni.ritornaImpostazioneDaNome('MostraPulsanteNascondiPrezzi') != '1' %}display:none;{% endif %}">Nascondi prezzi</button>
  306.                         </div>
  307.                     </div>
  308.                     <hr>
  309.                     <div class="moda-dettaglio-cliente-body">
  310.                     </div>
  311.                 </div>
  312.             </div>
  313.             <div class="modal-footer">
  314.                 <button type="button" class="btn btn-danger" data-dismiss="modal">{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_chiudi_btn", "agenti_dialog_principale").valoreUscita }}</button>
  315.             </div>
  316.         </div><!-- /.modal-content -->
  317.     </div><!-- /.modal-dialog -->
  318. </div><!-- /.modal -->
  319. <div class="modal fade" tabindex="-1" role="dialog" id="modalCreaOffertaDaCarrello">
  320.     <div class="modal-dialog panel-warning" role="document">
  321.         <div class="modal-content panel-warning">
  322.             <div class="modal-header">
  323.                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  324.                 <h4 class="modal-title">
  325.                     {{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_crea_offerta_da_carrello_btn", "agenti_dialog_principale").valoreUscita }}
  326.                 </h4>
  327.             </div>
  328.             <div class="modal-body" id="modalCreaOffertaDaCarrelloBody" style="overflow-y: auto;">
  329.                 <form id="creaOffertaDaCarrelloForm" action="{{ path('offerte_crea_da_carrello') }}">
  330.                     <div class="form-group">
  331.                         <label for="modal-crea-offerta-carrello-note">{{ traduzione.OttieniElementoDizionario("agenti_crea_offerta_da_carrello_dialog_note", "agenti_crea_offerta_da_carrello_dialog").valoreUscita }}</label>
  332.                         <textarea class="form-control" id="modal-crea-offerta-carrello-note" name="modal-crea-offerta-carrello-note"></textarea>
  333.                     </div>
  334.                     <div class="form-group">
  335.                         <label for="modal-crea-offerta-carrello-note-aziendali">{{ traduzione.OttieniElementoDizionario("agenti_crea_offerta_da_carrello_dialog_note_aziendali", "agenti_crea_offerta_da_carrello_dialog").valoreUscita }}</label>
  336.                         <textarea class="form-control" id="modal-crea-offerta-carrello-note" name="modal-crea-offerta-carrello-note-aziendali"></textarea>
  337.                     </div>
  338.                     <div class="form-group">
  339.                         <label for="modal-crea-offerta-carrello-riferimento-offerta">{{ traduzione.OttieniElementoDizionario("agenti_crea_offerta_da_carrello_dialog_note_riferimento_offerta", "agenti_crea_offerta_da_carrello_dialog").valoreUscita }}</label>
  340.                         <input type="text" class="form-control" id="modal-crea-offerta-carrello-riferimento-offerta" name="modal-crea-offerta-carrello-riferimento-offerta">
  341.                     </div>
  342.                     <div class="checkbox">
  343.                         <label>
  344.                             <input type="checkbox" id="modal-crea-offerta-carrello-invia-mail" name="modal-crea-offerta-carrello-invia-mail" checked="checked">{{ traduzione.OttieniElementoDizionario("agenti_crea_offerta_da_carrello_dialog_invia_offerta_mail_checkbox", "agenti_crea_offerta_da_carrello_dialog").valoreUscita }}
  345.                         </label>
  346.                     </div>
  347.                 </form>
  348.             </div>
  349.             <div class="modal-footer">
  350.                 <button href="" style="float:right; margin-right: 20px;" id="modalCreaOfferteDaCarrello_creaBtn" class="btn btn-sm btn-success">{{ traduzione.OttieniElementoDizionario("agenti_dialog_principale_crea_offerta_da_carrello_btn", "agenti_dialog_principale").valoreUscita }}</button>
  351.             </div>
  352.         </div><!-- /.modal-content -->
  353.     </div><!-- /.modal-dialog -->
  354. </div><!-- /.modal -->
  355. {% endif %}
  356. <div class="modal fade" tabindex="-1" role="dialog" id="modalRichiestaPrezzo">
  357.     <div class="modal-dialog panel-warning" role="document"  style="width: 80%;">
  358.         <div class="modal-content panel-warning">
  359.             <div class="modal-header">
  360.                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  361.                 <h4 class="modal-title">
  362.                     {{ traduzione.CaricaTraduzioniDaFamiglia("richiesta_prezzo", app.request.locale, false) }}
  363.                     {{ traduzione.OttieniElementoDizionario("richiesta_prezzo_title", "richiesta_prezzo").valoreUscita }}
  364.                 </h4>
  365.             </div>
  366.             <div class="modal-body" id="modalRichiestaPrezzoBody" style="overflow-y: auto;">
  367.             </div>
  368.         </div><!-- /.modal-content -->
  369.     </div><!-- /.modal-dialog -->
  370. </div><!-- /.modal -->
  371. <div class="modal fade" tabindex="-1" role="dialog" id="modalMagazziniSecondari">
  372.     <div class="modal-dialog panel-warning" role="document"  style="width: 80%;">
  373.         <div class="modal-content panel-warning">
  374.             <div class="modal-header">
  375.                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  376.                 <h4 class="modal-title">
  377.                     {{ traduzione.CaricaTraduzioniDaFamiglia("modal_magazzini_secondari", app.request.locale, false) }}
  378.                     {{ traduzione.OttieniElementoDizionario("modal_magazzini_secondari_title_main_modal", "modal_magazzini_secondari").valoreUscita }}
  379.                 </h4>
  380.             </div>
  381.             <div class="modal-body" id="modalMagazziniSecondariBody" style="overflow-y: auto;">
  382.             </div>
  383.         </div><!-- /.modal-content -->
  384.     </div><!-- /.modal-dialog -->
  385. </div><!-- /.modal -->
  386. {% if is_granted('ROLE_ADMIN') or is_granted('ROLE_AGENTE') or is_granted('ROLE_COMMERCIALE') %}
  387. <div class="modal fade" tabindex="-1" role="dialog" id="modalCercaCliente">
  388.     <div class="modal-dialog panel-warning" role="document"  style="width: 80%;">
  389.         <div class="modal-content panel-warning">
  390.             <div class="modal-header">
  391.                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  392.                 <h4 class="modal-title" id="modalTitle">{{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_title", "dialog_ricerca_cliente").valoreUscita }}</h4>
  393.             </div>
  394.             <div class="modal-body" style="overflow-y: auto;">
  395.                 <div class="col-md-12">
  396.                     <div class="col-md-4">
  397.                         <div class="form-inline center has-success">
  398.                             <div class="input-group" style="width: 100%;">
  399.                                 <span class="input-group-addon" id="basic-addon1"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></span>
  400.                                 <input type="text" class="form-control" id="ricercaClienteTxt" placeholder="{{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_inizia_a_scrivere", "dialog_ricerca_cliente").valoreUscita }}">
  401.                             </div>
  402.                         </div>
  403.                     </div>
  404.                     <div class="col-md-4">
  405.                         <div class="form-inline center has-success">
  406.                             <div class="input-group" style="width: 100%;">
  407.                                 <span class="input-group-addon" id="basic-addon1"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></span>
  408.                                 <input type="text" class="form-control" id="ricercaCittaTxt" placeholder="{{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_filtro_citta", "dialog_ricerca_cliente").valoreUscita }}">
  409.                             </div>
  410.                         </div>
  411.                     </div>
  412.                     <div class="col-md-4">
  413.                         <div class="form-inline center has-success">
  414.                             <div class="input-group" style="width: 100%;">
  415.                                 <span class="input-group-addon" id="basic-addon1"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></span>
  416.                                 <input type="text" class="form-control" id="ricercaProvinciaTxt" placeholder="{{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_filtro_provincia", "dialog_ricerca_cliente").valoreUscita }}">
  417.                             </div>
  418.                         </div>
  419.                     </div>
  420.                 </div>
  421.                 <table class="table table-striped table-responsive">
  422.                     <thead>
  423.                     <tr>
  424.                         <th>
  425.                             {{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_tab_col1_a", "dialog_ricerca_cliente").valoreUscita }}
  426.                             <br>
  427.                             {{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_tab_col1_b", "dialog_ricerca_cliente").valoreUscita }}
  428.                             <br>
  429.                             {{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_tab_col1_c", "dialog_ricerca_cliente").valoreUscita }}
  430.                         </th>
  431.                         <th>
  432.                             {{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_tab_col2_a", "dialog_ricerca_cliente").valoreUscita }}
  433.                             <br>
  434.                             {{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_tab_col2_b", "dialog_ricerca_cliente").valoreUscita }}
  435.                             <br>
  436.                             {{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_tab_col2_c", "dialog_ricerca_cliente").valoreUscita }}
  437.                         </th><th>
  438.                             {{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_tab_col3_a", "dialog_ricerca_cliente").valoreUscita }}
  439.                             <br>
  440.                             {{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_tab_col3_b", "dialog_ricerca_cliente").valoreUscita }}
  441.                             <br>
  442.                             {{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_tab_col3_c", "dialog_ricerca_cliente").valoreUscita }}
  443.                         </th>
  444.                     </tr>
  445.                     </thead>
  446.                     <tbody id="bodyTabellaRicercaCliente">
  447.                     </tbody>
  448.                 </table>
  449.             </div>
  450.             <div class="modal-footer">
  451.                 <button type="button" id="chiudiModalCercaCliente" class="btn btn-danger" data-dismiss="modal">{{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_chiudi_btn", "dialog_ricerca_cliente").valoreUscita }}</button>
  452.             </div>
  453.         </div><!-- /.modal-content -->
  454.     </div><!-- /.modal-dialog -->
  455. </div><!-- /.modal -->
  456. {% endif %}
  457. <div class="container-fluid contenitore_generale_body" >
  458.     <div class="row master-row-body">
  459.         <div class="col-md-12 master-col-body">
  460.             {% block body %}{% endblock %}
  461.         </div>
  462.     </div>
  463. </div><!-- /.container -->
  464. <script src="https://www.google.com/recaptcha/api.js?render={{ impostazioni.ritornaImpostazioneDaNome('ReCaptchaSiteKey') }}"></script>
  465. <script>
  466.     grecaptcha.ready(function() {
  467.         grecaptcha.execute('{{ impostazioni.ritornaImpostazioneDaNome('ReCaptchaSiteKey') }}', {action: 'homepage'}).then(function(token) {
  468.             $('.re-captcha-v3').val = token;
  469.         });
  470.     });
  471. </script>
  472. <!-- FOSJsRoutingBundle -->
  473. <script src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>
  474. <script src="{{ path('fos_js_routing_js', { callback: 'fos.Router.setData' }) }}"></script>
  475. <!-- jQuery smartmenus plugin -->
  476. <script src="{{ asset('java_lib/jquery.smartmenus.min.js') }}"></script>
  477. <script src="{{ asset('java_lib/jquery.smartmenus.bootstrap.min.js') }}"></script>
  478. <script src="{{ asset('java_lib/jquery.stickytableheaders.min.js') }}" type="text/javascript"></script>
  479. <!-- SLICK CAROUSEL -->
  480. <script type="text/javascript" src="{{ asset('java_lib/slick-1.8.1/slick/slick.min.js') }}"></script>
  481. <!-- TINY SLIDER -->
  482. <script src="https://cdnjs.cloudflare.com/ajax/libs/tiny-slider/2.9.2/min/tiny-slider.js"></script>
  483. <!-- CORE NAV -->
  484. <script type="text/javascript" src="{{ asset('java_lib/custom_mf_sidebar/mf_sidebar.js') }}"></script>
  485. {#  <script type="text/javascript" src="https://unpkg.com/tabulator-tables@4.2.7/dist/js/tabulator.min.js"></script>#}
  486. <script type="text/javascript" src="https://unpkg.com/tabulator-tables@5.2.3/dist/js/tabulator.min.js"></script>
  487. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js" integrity="sha256-xKeoJ50pzbUGkpQxDYHD7o7hxe0LaOGeguUidbq6vis=" crossorigin="anonymous"></script>
  488. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" integrity="sha256-Uv9BNBucvCPipKQ2NS9wYpJmi8DTOEfTA/nH2aoJALw=" crossorigin="anonymous"></script>
  489. <script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/3.0.1/luxon.min.js" integrity="sha512-6ZJuab/UnRq1muTChgrVxJhSgygmL2GMLVmSJN7pcBEqJ1dWPbqN9CiZ6U3HrcApTIJsLnMgXYBYgtVkJ8fWiw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  490. <script type="text/javascript">
  491.     {# Variabili utile per la sostituzione del carrello #}
  492.     let idCarrelloAttuale = '';
  493.     let stadioSostituzione = 0; {# Quando lo stadio è 1 allora ho già in memoria i due salti #}
  494.     {# FINE #}
  495.     var memorizzazioneAltriDatiUtente = {}
  496.     var lens = null;
  497.     var img = null;
  498.     {# Codice per zoom immagine #}
  499.     function imageZoom(imgID, resultID) {
  500.         if (lens != null){
  501.             lens.removeEventListener("mousemove", moveLens);
  502.             img.removeEventListener("mousemove", moveLens);
  503.             lens.removeEventListener("touchmove", moveLens);
  504.             img.removeEventListener("touchmove", moveLens);
  505.             lens.remove();
  506.             lens = null;
  507.         }
  508.         var result, cx, cy;
  509.         img = document.getElementById(imgID);
  510.         result = document.getElementById(resultID);
  511.         /* Create lens: */
  512.         lens = document.createElement("DIV");
  513.         lens.setAttribute("class", "img-zoom-lens");
  514.         /* Insert lens: */
  515.         img.parentElement.insertBefore(lens, img);
  516.         /* Calculate the ratio between result DIV and lens: */
  517.         cx = result.offsetWidth / lens.offsetWidth;
  518.         cy = result.offsetHeight / lens.offsetHeight;
  519.         /* Set background properties for the result DIV */
  520.         result.style.backgroundImage = "url('" + img.src + "')";
  521.         result.style.backgroundSize = (img.width * cx) + "px " + (img.height * cy) + "px";
  522.         /* Execute a function when someone moves the cursor over the image, or the lens: */
  523.         lens.addEventListener("mousemove", moveLens);
  524.         img.addEventListener("mousemove", moveLens);
  525.         /* And also for touch screens: */
  526.         lens.addEventListener("touchmove", moveLens);
  527.         img.addEventListener("touchmove", moveLens);
  528.         function moveLens(e) {
  529.             var pos, x, y;
  530.             /* Prevent any other actions that may occur when moving over the image */
  531.             e.preventDefault();
  532.             /* Get the cursor's x and y positions: */
  533.             pos = getCursorPos(e);
  534.             /* Calculate the position of the lens: */
  535.             x = pos.x - (lens.offsetWidth / 2);
  536.             y = pos.y - (lens.offsetHeight / 2);
  537.             /* Prevent the lens from being positioned outside the image: */
  538.             if (x > img.width - lens.offsetWidth) {x = img.width - lens.offsetWidth;}
  539.             if (x < 0) {x = 0;}
  540.             if (y > img.height - lens.offsetHeight) {y = img.height - lens.offsetHeight;}
  541.             if (y < 0) {y = 0;}
  542.             /* Set the position of the lens: */
  543.             lens.style.left = x + "px";
  544.             lens.style.top = y + "px";
  545.             /* Display what the lens "sees": */
  546.             result.style.backgroundPosition = "-" + (x * cx) + "px -" + (y * cy) + "px";
  547.         }
  548.         function getCursorPos(e) {
  549.             var a, x = 0, y = 0;
  550.             e = e || window.event;
  551.             /* Get the x and y positions of the image: */
  552.             a = img.getBoundingClientRect();
  553.             /* Calculate the cursor's x and y coordinates, relative to the image: */
  554.             x = e.pageX - a.left;
  555.             y = e.pageY - a.top;
  556.             /* Consider any page scrolling: */
  557.             x = x - window.pageXOffset;
  558.             y = y - window.pageYOffset;
  559.             return {x : x, y : y};
  560.         }
  561.     }
  562.     var randomRgbColor = function() {
  563.         var r = Math.floor(Math.random() * 255);
  564.         var g = Math.floor(Math.random() * 255);
  565.         var b = Math.floor(Math.random() * 255);
  566.         return "rgb(" + r + "," + g + "," + b + ")";
  567.     }
  568.     function toastMessage(messaggio, rosso = false) {
  569.         // Get the snackbar DIV
  570.         var x = document.getElementById("snackbar");
  571.         $(x).text(messaggio);
  572.         if (rosso){
  573.             $(x).css('background-color', 'red');
  574.             $(x).css('color', 'black');
  575.         }else{
  576.             $(x).css('background-color', 'black');
  577.             $(x).css('color', 'white');
  578.         }
  579.         // Add the "show" class to DIV
  580.         x.className = "show";
  581.         // After 3 seconds, remove the show class from DIV
  582.         setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000);
  583.     }
  584.     function ApriModalRichiestaPrezzo(idMappa){
  585.         $('#loadingMaster').show();
  586.         $.ajax({
  587.             dataType: 'html',
  588.             url: Routing.generate('richiesta_prezzo_modal', {'idMappa' : (idMappa) }),
  589.             async: true, //you won't need that if nothing in your following code is dependend of the result
  590.             success: function (response) {
  591.                 $('#modalRichiestaPrezzoBody').html(response);
  592.                 $('#modalRichiestaPrezzo').modal('toggle');
  593.                 $('#loadingMaster').hide();
  594.             },
  595.             error: function(XMLHttpRequest, textStatus, errorThrown) {
  596.                 $('#loadingMaster').hide();
  597.                 alert("Status: " + textStatus); alert("Error: " + errorThrown);
  598.             }
  599.         });
  600.     }
  601.     function ApriModalMagazziniSecondari(idMappa, qta){
  602.         $('#loadingMaster').show();
  603.         $.ajax({
  604.             dataType: 'html',
  605.             url: Routing.generate('magazzini_secondari_modal', {'idMappa' : (idMappa), 'qta' : (qta) }),
  606.             async: true, //you won't need that if nothing in your following code is dependend of the result
  607.             success: function (response) {
  608.                 $('#modalMagazziniSecondariBody').html(response);
  609.                 $('#modalMagazziniSecondari').modal('toggle');
  610.                 $('#loadingMaster').hide();
  611.             },
  612.             error: function(XMLHttpRequest, textStatus, errorThrown) {
  613.                 $('#loadingMaster').hide();
  614.                 alert("Status: " + textStatus); alert("Error: " + errorThrown);
  615.             }
  616.         });
  617.     }
  618.     function CountArticoliCarrello()
  619.     {
  620.         $.ajax({
  621.             type: "POST",
  622.             dataType: 'html',
  623.             url: Routing.generate('carrello_conta_articoli'),
  624.             async: true //you won't need that if nothing in your following code is dependend of the result
  625.         })
  626.         .done(function (response) {
  627.             let js = JSON.parse(response);
  628.             idCarrelloAttuale = js.idCarrello;
  629.             if(idCarrelloAttuale != ''){
  630.                 $('#modalDettaglioClienteSpostaCarrelloBtn').show();
  631.             }else{
  632.                 $('#modalDettaglioClienteSpostaCarrelloBtn').hide();
  633.             }
  634.             if (js.count == '0')
  635.                 $('#badgeArticoliCarello').html(" ");
  636.             else
  637.                 $('#badgeArticoliCarello').html(js.count);
  638.         })
  639.         DettaglioCarrelloJson();
  640.     }
  641.     function DettaglioCarrelloJson()
  642.     {
  643.         $.ajax({
  644.             type: "POST",
  645.             dataType: 'html',
  646.             url: Routing.generate('carrello_dettagli_json'),
  647.             async: true //you won't need that if nothing in your following code is dependend of the result
  648.         })
  649.             .done(function (response) {
  650.                 let js = JSON.parse(response);
  651.                 $("#badgeTotaleImponibileCarrello").html(" - € " + js.imponibile)
  652.             })
  653.     }
  654.     {% if is_granted('ROLE_ADMIN') or is_granted('ROLE_AGENTE') or is_granted('ROLE_COMMERCIALE') %}
  655.     function CambioTabRisorseCategorieSelect(altezza=350) {
  656.         let categoriaSelezionata = $('#tab-risorse-categorie-select').find('option:selected').val();
  657.         $.ajax({
  658.             type: "POST",
  659.             dataType: 'json',
  660.             data: {'tab': 'dati_da_categoria', 'categoria': (categoriaSelezionata)},
  661.             async: true,
  662.             url: Routing.generate('agente_dettaglio_carica_tab_anagrafica', {idAnagrafica: $("#id-anagrafica-da-utilizzare").val()}),
  663.             success: function (response) {
  664.                 var tableRisorseAnag = new Tabulator("#tabella-risorse", {
  665.                     height: (altezza + "px"),
  666.                     data:response.data,           //load row data from array
  667.                     layout:"fitDataFill",      //fit columns to width of table
  668.                     responsiveLayout:"collapse",  //hide columns that dont fit on the table
  669.                     columns: response.colonne,
  670.                 });
  671.                 tableRisorseAnag.on("rowClick", function(e, row){
  672.                     //e - the click event object
  673.                     //row - row component
  674.                     var valore = row.getCell('idRisorsa').getValue();
  675.                     var url = Routing.generate('agente_recupera_risorsa_anagrafica') + '?idRisorsa=' + valore;
  676.                     var win = window.open(url, '_blank');
  677.                     win.focus();
  678.                 });
  679.                 if('sorting' in response){
  680.                     let sort = [];
  681.                     for (const [key, value] of Object.entries(response.sorting)) {
  682.                         //value => {'field' => '', 'direction' => ''}
  683.                         sort.push({'column': value.field, 'dir': value.direction});
  684.                     }
  685.                     if(sort.length > 0){
  686.                         tableRisorseAnag.setSort(sort);
  687.                     }
  688.                 }
  689.             }
  690.         });
  691.     }
  692.     {% else %}
  693.     function CambioTabRisorseCategorieSelect() {
  694.         let categoriaSelezionata = $('#tab-risorse-categorie-select').find('option:selected').val();
  695.         $.ajax({
  696.             type: "POST",
  697.             dataType: 'json',
  698.             data: {'categoria': (categoriaSelezionata)},
  699.             async: true,
  700.             url: Routing.generate('storico_carica_risorse_anagrafiche'),
  701.             success: function (response) {
  702.                 var tableRisorseAnag = new Tabulator("#tabella-risorse", {
  703.                     height: "350px",
  704.                     data:response.data,           //load row data from array
  705.                     layout:"fitDataFill",      //fit columns to width of table
  706.                     responsiveLayout:"collapse",  //hide columns that dont fit on the table
  707.                     columns: response.colonne,
  708.                 });
  709.                 tableRisorseAnag.on("rowClick", function(e, row){
  710.                     //e - the click event object
  711.                     //row - row component
  712.                     var valore = row.getCell('idRisorsa').getValue();
  713.                     var url = Routing.generate('recupera_risorsa_anagrafica') + '?idRisorsa=' + valore;
  714.                     var win = window.open(url, '_blank');
  715.                     win.focus();
  716.                 });
  717.             }
  718.         });
  719.     }
  720.     {% endif %}
  721.     function ResetRicercaFiltroAvanzato(){
  722.         $("#cerca-filtro-btn").removeAttr("style")
  723.         filtroAvanzato = "";
  724.         document.getElementById('form-filtro-avanzato').reset();
  725.     }
  726.     function ResetRicerca(){
  727.         $("#ricercaVeloceTxt").val("");
  728.     }
  729.     {% if not (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  730.     function ApriDettaglioClienteLoggato(){
  731.         $('#loadingMaster').show();
  732.         $.ajax({
  733.             type: "POST",
  734.             dataType: 'html',
  735.             url: Routing.generate('utente_dettaglio_anagrafica'),
  736.             async: true,
  737.             success: function (response) {
  738.                 $('#loadingMaster').hide();
  739.                 $('#modalDettaglioClienteLoggato-body').html(response);
  740.                 $("#modalDettaglioClienteLoggato").modal('toggle');
  741.             },
  742.             error: function (xhr, ajaxOptions, thrownError) {
  743.                 $('#loadingMaster').hide();
  744.                 alert(xhr.status);
  745.                 alert(thrownError);
  746.             }
  747.         });
  748.     }
  749.     {% endif %}
  750.     {% if (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  751.     function ApriDettaglioClienteDialog(){
  752.         aggiornaVisualizzaAltriDatiUtente('V', '', function (response) {
  753.             let cookie = response;
  754.             $(".pulisci-selezione-cliente").hide();
  755.             if (cookie != "" && cookie && cookie.length > 0){
  756.                 let json = JSON.parse(cookie);
  757.                 $(".pulisci-selezione-cliente").show();
  758.                 $("#codiceClienteTxt").val(json.codice);
  759.                 $("#ragioneSocialeText").val(json.ragioneSociale);
  760.                 let tipoOrdine = json.hasOwnProperty("tipoOrdine") ? json.tipoOrdine : '';
  761.                 $("#tipo-ordine-input > option").each(function() {
  762.                     if($(this).val() ==tipoOrdine){
  763.                         $(this).attr("selected", "selected");
  764.                     } else {
  765.                         $(this).removeAttr("selected");
  766.                     }
  767.                 });
  768.                 $('#navbar-dettaglio-cliente').text(json.codice + ' - ' + json.ragioneSociale);
  769.                 $('#selezionaVariantiModalCliente').text('Cliente: ' + json.codice + ' - ' + json.ragioneSociale);
  770.                 memorizzazioneAltriDatiUtente = json;
  771.                 CaricaDettaglioCliente(json.id);
  772.             }
  773.         });
  774.         AggiornaStatoSelezioneCliente();
  775.         $("#modalDettaglioCliente").modal('show');
  776.     }
  777.     function SpostaCarrello(idAnagraficaDestinazione){
  778.         stadioSostituzione = 0;
  779.         $('#loadingMaster').show();
  780.         $.ajax({
  781.             type: "POST",
  782.             dataType: 'json',
  783.             url: Routing.generate('agente_sposta_carrello', {
  784.                 idCarrelloOrigine: (idCarrelloAttuale),
  785.                 idAnagraficaDestinazione: (idAnagraficaDestinazione)
  786.             }),
  787.             async: true,
  788.             success: function (response) {
  789.                 $('#loadingMaster').hide();
  790.                 let js = JSON.parse(response);
  791.                 if(js.successo == 'SI'){
  792.                     toastMessage(js.messaggio);
  793.                     CountArticoliCarrello();
  794.                 }else{
  795.                     toastMessage(js.messaggio, true);
  796.                 }
  797.             },
  798.             error: function(XMLHttpRequest, textStatus, errorThrown) {
  799.                 $('#loadingMaster').hide();
  800.                 alert("Status: " + textStatus); alert("Error: " + errorThrown);
  801.             }
  802.         });
  803.     }
  804.     function CaricaTabellaGeneraleClienti(rigaInizio) {
  805.         var str_ric = $("#ricercaClienteTxt").val();
  806.         var citta = $("#ricercaCittaTxt").val();
  807.         var provincia = $("#ricercaProvinciaTxt").val();
  808.         $.ajax({
  809.             type: "POST",
  810.             dataType: 'html',
  811.             data: {
  812.                 "data": {
  813.                     'ricerca': str_ric,
  814.                     'citta' : citta,
  815.                     'provincia' : provincia
  816.                 }
  817.             },
  818.             url: Routing.generate('agente_lista_clienti_ricerca', {
  819.                 rigaInzio: rigaInizio
  820.             }),
  821.             async: true,
  822.             success: function (response) {
  823.                 $('#bodyTabellaRicercaCliente').html(response);
  824.             },
  825.             error: function (xhr, ajaxOptions, thrownError) {
  826.                 alert(xhr.status);
  827.                 alert(thrownError);
  828.             }
  829.         });
  830.     }
  831.     function CaricaDettaglioCliente(id) {
  832.         $.ajax({
  833.             type: "POST",
  834.             dataType: 'html',
  835.             url: Routing.generate('agente_dettaglio_anagrafica', {
  836.                 id: (id), soloDati: 1
  837.             }),
  838.             async: true,
  839.             success: function (response) {
  840.                 $('.moda-dettaglio-cliente-body').html(response);
  841.                 $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  842.                     let tabAperto = e.target; // newly activated tab
  843.                     let identificativo = tabAperto.hash.substring(1);
  844.                     let contenitore = $('#' + identificativo);
  845.                     if(identificativo != 'tab-home') {
  846.                         $(contenitore).html('');
  847.                         $.ajax({
  848.                             type: "POST",
  849.                             dataType: 'html',
  850.                             data: {'tab': (identificativo)},
  851.                             async: true,
  852.                             url: Routing.generate('agente_dettaglio_carica_tab_anagrafica', {idAnagrafica: id}),
  853.                             success: function (response) {
  854.                                 $(contenitore).html(response);
  855.                             },
  856.                             error: function (xhr, ajaxOptions, thrownError) {
  857.                                 alert(xhr.status);
  858.                                 alert(thrownError);
  859.                             }
  860.                         });
  861.                     }
  862.                 });
  863.             }
  864.         });
  865.     }
  866.     function VerificaStileBottoneNascondiPrezzi(){
  867.         if ($("#nascondiPrzBtnDettCliente").data("valore") == '0'){
  868.             $("#nascondiPrzBtnDettCliente").css("background-color", "#fff");
  869.         }else{
  870.             $("#nascondiPrzBtnDettCliente").css("background-color", "yellow");
  871.         }
  872.     }
  873.     
  874.     function VariaStatoBottoneNascondiPrezzi(){
  875.         if ($("#nascondiPrzBtnDettCliente").data("valore") == '0'){
  876.             $("#nascondiPrzBtnDettCliente").data("valore", '1')
  877.             VerificaStileBottoneNascondiPrezzi();
  878.         }else{
  879.             $("#nascondiPrzBtnDettCliente").data("valore", '0')
  880.             VerificaStileBottoneNascondiPrezzi();
  881.         }
  882.         let datiCliente = {
  883.             'codice' : memorizzazioneAltriDatiUtente.codice,
  884.             'ragioneSociale': memorizzazioneAltriDatiUtente.ragioneSociale,
  885.             'id' : memorizzazioneAltriDatiUtente.id,
  886.             'tipoOrdine' : $("#tipo-ordine-input").find(":selected").val(),
  887.             'nascondiPrezzi': $("#nascondiPrzBtnDettCliente").data('valore')
  888.         };
  889.         aggiornaVisualizzaAltriDatiUtente('M', JSON.stringify(datiCliente), function (response) {
  890.             memorizzazioneAltriDatiUtente = datiCliente;
  891.         });
  892.     }
  893.     function PulisciSelezioneCliente(dati){
  894.         aggiornaVisualizzaAltriDatiUtente('E', '', function (response) {
  895.             if(response.esito == 'OK') {
  896.                 AggiornaStatoSelezioneCliente();
  897.                 $("#codiceClienteTxt").val("");
  898.                 $("#ragioneSocialeText").val("");
  899.                 CountArticoliCarrello();
  900.                 memorizzazioneAltriDatiUtente = {}
  901.                 $('.moda-dettaglio-cliente-body').html("");
  902.             }else{
  903.                 alert('{{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_errore_pulisci_cliente", "dialog_ricerca_cliente").valoreUscita }}');
  904.             }
  905.         });
  906.     }
  907.     function AggiornaStatoSelezioneCliente() {
  908.         aggiornaVisualizzaAltriDatiUtente('V', '', function (response) {
  909.             let cck = response;
  910.             if (cck != "" && cck && cck.length > 0) {
  911.                 $(".pulisci-selezione-cliente").show();
  912.                 $(".top-bar-seleziona-cliente").css("background-color", "yellow");
  913.                 memorizzazioneAltriDatiUtente = JSON.parse(cck);
  914.             } else {
  915.                 $(".pulisci-selezione-cliente").hide();
  916.                 $(".top-bar-seleziona-cliente").css("background-color", "transparent");
  917.                 $('#navbar-dettaglio-cliente').text("");
  918.                 $('#selezionaVariantiModalCliente').text('');
  919.             }
  920.         });
  921.     }
  922.     {% endif %}
  923.     function aggiornaVisualizzaAltriDatiUtente(operazione, valore, callback = null){
  924.         $.ajax({
  925.             type: "POST",
  926.             dataType: 'json',
  927.             data: {'valore' : (valore)},
  928.             async: true,
  929.             url: Routing.generate({% if is_granted("ROLE_AGENTE") %}'agente_altro_dato'{% else %}'utente_altro_dato'{% endif %}, {
  930.                 operazione: (operazione)
  931.             }),
  932.             success: function (response){
  933.                 memorizzazioneAltriDatiUtente = valore;
  934.                 callback(response);
  935.             },
  936.             error: function (xhr, ajaxOptions, thrownError) {
  937.                 alert(xhr.status);
  938.                 alert(thrownError);
  939.             }
  940.         });
  941.     }
  942.     function adattaContenutoABarraSuperiore(){
  943.         $(".contenitore_generale_body").css("padding-top", $(".navbar-fixed-top").height() + "px")
  944.         $(".nav-side-menu").css("padding-top", $(".navbar-fixed-top").height() + "px")
  945.     }
  946.     $(document).ready(function () {
  947.         $(window).resize(function() {
  948.             adattaContenutoABarraSuperiore();
  949.         });
  950.         $(document).on("click", ".attiva-img-zoom", function (event){
  951.             event.stopImmediatePropagation();
  952.             event.stopPropagation();
  953.             $("#zoomImgImg").attr("src", $(this).attr("src"));
  954.             $("#modalZoomImg").modal('show');
  955.         });
  956.         $('#modalZoomImg').on("shown.bs.modal", function (){
  957.             imageZoom("zoomImgImg", "zoomImgResult");
  958.         });
  959.         $('.attiva-slick')
  960.             .on('init', function(slick) {
  961.                 $('.attiva-slick').fadeIn(3000);
  962.             })
  963.             .slick();
  964.         $('.attiva-tiny-slider').each(function (index, item) {
  965.             let arrConfig = $(item).data('configurazione');
  966.             tns(arrConfig);
  967.             $(item).css({ display: "block" });
  968.         });
  969.         $('.form-ordinazione-articolo').on("submit", function (e) {
  970.             let disponibilita = $(this).find('input[name="disponibilita"]').val();
  971.             let disponibilitaMagSecondari = $(this).find('input[name="disponibilita-mag-secondari"]').val();
  972.             if(disponibilita && disponibilita <= 0 ) {
  973.                 if(disponibilitaMagSecondari > 0) {
  974.                     e.preventDefault();
  975.                     ApriModalMagazziniSecondari($(this).find('input[name="id-mappa"]').val(), $(this).find('input[name="qta"]').val());
  976.                 }
  977.             }
  978.         });
  979.         $('[data-toggle="popover"]').popover();
  980.         $("#set_min_width").css("min-width", $(window).width() / 2);
  981.         $("#form_news").mouseleave(function () {
  982.             $("#set_min_width").css("display", "none");
  983.         });
  984.         $("#set_min_width").mouseenter(function () {
  985.             $("#set_min_width").css("display", "inline-block");
  986.         });
  987.         $("#set_min_width").mouseleave(function () {
  988.             $("#set_min_width").css("display", "none");
  989.         });
  990.         $('#cerca-btn-top').on('click', function () {
  991.             ResetRicercaFiltroAvanzato();
  992.             RicercaVeloce($("#ricercaVeloceTxt").val());
  993.         });
  994.         $("#ricercaVeloceTxt").on("keypress", function(e) {
  995.             if(e.which == 13) {
  996.                 ResetRicercaFiltroAvanzato();
  997.                 RicercaVeloce($("#ricercaVeloceTxt").val());
  998.             }
  999.         });
  1000.         var errori_validazione = [
  1001.             {% if errori_validazione is defined %}
  1002.             {% for err in errori_validazione %}
  1003.             "{{ err }}",
  1004.             {% endfor %}
  1005.             {% endif %}
  1006.         ];
  1007.         $.each(errori_validazione, function (item) {
  1008.             $("#form_" + errori_validazione[item]).addClass("dato-invalido");
  1009.         });
  1010.         CountArticoliCarrello();
  1011.         adattaContenutoABarraSuperiore();
  1012.         {% if (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  1013.         $("#ricercaClienteTxt, #ricercaCittaTxt, #ricercaProvinciaTxt").on("change paste keyup", function () {
  1014.             CaricaTabellaGeneraleClienti($("#inizioRiga").data('valore'));
  1015.         });
  1016.         $(".cercaCliente").on("focus, click", function () {
  1017.             stadioSostituzione = 0;
  1018.             $("#modalCercaCliente").modal('show');
  1019.         });
  1020.         $("#tipo-ordine-input").on("change", function (){
  1021.             aggiornaVisualizzaAltriDatiUtente('V', '', function (response) {
  1022.                 let cookie = response;
  1023.                 if (cookie != "" && cookie && cookie.length > 0){
  1024.                     let json = JSON.parse(cookie);
  1025.                     let datiCliente = {
  1026.                         'codice' : json.codice,
  1027.                         'ragioneSociale': json.ragioneSociale,
  1028.                         'id' : json.id,
  1029.                         'tipoOrdine' : $("#tipo-ordine-input").find(":selected").val(),
  1030.                         'nascondiPrezzi': $("#nascondiPrzBtnDettCliente").data('valore')
  1031.                     };
  1032.                     {% if (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  1033.                         VerificaStileBottoneNascondiPrezzi();
  1034.                     {% endif %}
  1035.                     aggiornaVisualizzaAltriDatiUtente('M', JSON.stringify(datiCliente), function (response) {
  1036.                         CountArticoliCarrello();
  1037.                         location.reload(); //Ricarico la pagina
  1038.                     });
  1039.                 }
  1040.             });
  1041.         });
  1042.         $("#bodyTabellaRicercaCliente").on("click", "tr", function () {
  1043.             $("#codiceClienteTxt").val($(this).data("codice"));
  1044.             $("#ragioneSocialeText").val($(this).data("ragione-sociale"));
  1045.             let datiCliente = {
  1046.                 'codice' : $(this).data("codice"),
  1047.                 'ragioneSociale': $(this).data("ragione-sociale"),
  1048.                 'id' : $(this).data("identificativo"),
  1049.                 'tipoOrdine' : $("#tipo-ordine-input").find(":selected").val(),
  1050.                 'nascondiPrezzi': $("#nascondiPrzBtnDettCliente").data('valore')
  1051.             };
  1052.             $('#navbar-dettaglio-cliente').text(datiCliente.codice + ' - ' + datiCliente.ragioneSociale);
  1053.             $('#selezionaVariantiModalCliente').text('Cliente: ' + datiCliente.codice + ' - ' + datiCliente.ragioneSociale);
  1054.             $("#modalCercaCliente").modal('toggle');
  1055.             aggiornaVisualizzaAltriDatiUtente('M', JSON.stringify(datiCliente), function (response) {
  1056.                 AggiornaStatoSelezioneCliente();
  1057.                 CountArticoliCarrello();
  1058.                 CaricaDettaglioCliente(datiCliente.id);
  1059.                 {% if (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  1060.                     VerificaStileBottoneNascondiPrezzi();
  1061.                 {% endif %}
  1062.             });
  1063.             if(stadioSostituzione == 1){
  1064.                 if(confirm('{{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_conferma_spostamento_carrello", "dialog_ricerca_cliente").valoreUscita }}')) {
  1065.                     SpostaCarrello($(this).data("identificativo"));
  1066.                 }
  1067.             }
  1068.         });
  1069.         $('#modalDettaglioClienteSpostaCarrelloBtn').on('click', function (event) {
  1070.            if(stadioSostituzione == 0){
  1071.                event.preventDefault();
  1072.                event.stopPropagation();
  1073.                stadioSostituzione = 1;
  1074.                $("#modalCercaCliente").modal('show');
  1075.            }
  1076.         });
  1077.         $('#modalCreaOfferteDaCarrello_creaBtn').on("click", function (event) {
  1078.             if(confirm("{{ traduzione.OttieniElementoDizionario("dialog_ricerca_cliente_conferma_generazione_offerta", "dialog_ricerca_cliente").valoreUscita }}")){
  1079.                 $("#creaOffertaDaCarrelloForm").submit();
  1080.             }
  1081.         });
  1082.         aggiornaVisualizzaAltriDatiUtente('V', '', function (response) {
  1083.             let cookie = response;
  1084.             $(".pulisci-selezione-cliente").hide();
  1085.             if (cookie != "" && cookie && cookie.length > 0){
  1086.                 let json = JSON.parse(cookie);
  1087.                 $(".pulisci-selezione-cliente").show();
  1088.                 $("#codiceClienteTxt").val(json.codice);
  1089.                 $("#ragioneSocialeText").val(json.ragioneSociale);
  1090.                 $("#nascondiPrzBtnDettCliente").data('valore', json.nascondiPrezzi)
  1091.                 let tipoOrdine = json.hasOwnProperty("tipoOrdine") ? json.tipoOrdine : '';
  1092.                 $("#tipo-ordine-input > option").each(function() {
  1093.                     if($(this).val() ==tipoOrdine){
  1094.                         $(this).attr("selected", "selected");
  1095.                     }else{
  1096.                         $(this).removeAttr("selected");
  1097.                     }
  1098.                 });
  1099.                 $('#navbar-dettaglio-cliente').text(json.codice + ' - ' + json.ragioneSociale);
  1100.                 $('#selezionaVariantiModalCliente').text('Cliente: ' + json.codice + ' - ' + json.ragioneSociale);
  1101.                 memorizzazioneAltriDatiUtente = json;
  1102.                 {% if (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  1103.                     VerificaStileBottoneNascondiPrezzi();
  1104.                 {% endif %}
  1105.                 CaricaQuadratiAlbero("");
  1106.             }
  1107.         });
  1108.         AggiornaStatoSelezioneCliente();
  1109.         {% if (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  1110.             VerificaStileBottoneNascondiPrezzi();
  1111.         {% endif %}
  1112.         CaricaTabellaGeneraleClienti(0);
  1113.         {# Verifico se l'utente ha effettuato il LOGIN #}
  1114.         {% elseif is_granted("IS_AUTHENTICATED_REMEMBERED") %}
  1115.         aggiornaVisualizzaAltriDatiUtente('V', '', function (response) {
  1116.             let cookie = response;
  1117.             $(".pulisci-selezione-cliente").hide();
  1118.             if (cookie != "" && cookie && cookie.length > 0){
  1119.                 let json = JSON.parse(cookie);
  1120.                 $(".pulisci-selezione-cliente").show();
  1121.                 $("#codiceClienteTxt").val(json.codice);
  1122.                 $("#ragioneSocialeText").val(json.ragioneSociale);
  1123.                 let tipoOrdine = json.hasOwnProperty("tipoOrdine") ? json.tipoOrdine : '';
  1124.                 $("#tipo-ordine-input > option").each(function() {
  1125.                     if($(this).val() ==tipoOrdine){
  1126.                         $(this).attr("selected", "selected");
  1127.                     }else{
  1128.                         $(this).removeAttr("selected");
  1129.                     }
  1130.                 });
  1131.                 {% if (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  1132.                     $('#navbar-dettaglio-cliente').text(json.codice + ' - ' + json.ragioneSociale);
  1133.                 {% endif %}
  1134.                 $('#selezionaVariantiModalCliente').text('Cliente: ' + json.codice + ' - ' + json.ragioneSociale);
  1135.                 $("#nascondiPrzBtnDettCliente").data('valore', json.nascondiPrezzi)
  1136.                 memorizzazioneAltriDatiUtente = json;
  1137.                 {% if (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  1138.                     VerificaStileBottoneNascondiPrezzi();
  1139.                 {% endif %}
  1140.                 CaricaQuadratiAlbero("");
  1141.             }
  1142.         });
  1143.         $("#tipo-ordine-input").on("change", function (){
  1144.             aggiornaVisualizzaAltriDatiUtente('V', '', function (response) {
  1145.                     let datiCliente = {
  1146.                         'codice' : '',
  1147.                         'ragioneSociale': '',
  1148.                         'id' : '',
  1149.                         'tipoOrdine' : $("#tipo-ordine-input").find(":selected").val(),
  1150.                         'nascondiPrezzi': $("#nascondiPrzBtnDettCliente").data('valore')
  1151.                     };
  1152.                 {% if (is_granted("ROLE_ADMIN") or is_granted("ROLE_COMMERCIALE") or is_granted("ROLE_AGENTE")) %}
  1153.                     VerificaStileBottoneNascondiPrezzi();
  1154.                 {% endif %}
  1155.                     aggiornaVisualizzaAltriDatiUtente('M', JSON.stringify(datiCliente), function (response) {
  1156.                         CountArticoliCarrello();
  1157.                         location.reload(); //Ricarico la pagina
  1158.                     });
  1159.             });
  1160.         });
  1161.         {% endif %}
  1162.         {% for flash_message in app.session.flashbag.get('notice')%}
  1163.             toastMessage("{{ flash_message }}");
  1164.         {% endfor %}
  1165.         {% for flash_message in app.session.flashbag.get('error')%}
  1166.             toastMessage("{{ flash_message }}", true);
  1167.         {% endfor %}
  1168.     });
  1169. </script>
  1170. {% block javascript %}{% endblock %}
  1171. <div class="pushContent"></div>
  1172. </body>
  1173. {% if app.request.get("_route") != 'admin_pagine_e_componenti_editor' %}
  1174.     {% if impostazioni.ritornaImpostazioneDaNome('MostraFooterSviluppatoDa') == '1' %}
  1175.         <footer class="navbar navbar-default navbar-fixed-bottom">
  1176.             <div style="margin-top: 15px;" class="container">
  1177.                 <span style="vertical-align: middle;"><a href="http://www.fogazzimirko.it">Sviluppato da Fogazzi Mirko © {{ "now"|date("Y") }}{% block footer %}{% endblock %}</a></span>
  1178.             </div>
  1179.         </footer>
  1180.     {% endif %}
  1181. {% endif %}
  1182. </html>