Oportunidade.apl 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. #include "PROTHEUS.CH"
  2. #include "RWMAKE.CH"
  3. #include "APWEBEX.CH"
  4. #include "TOPCONN.CH"
  5. #include "TBICONN.CH"
  6. /*__________________________________________________________________________
  7. ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
  8. ¦¦+-----------------------------------------------------------------------+¦¦
  9. ¦¦¦Funçäo ¦ Oportunidade ¦ Autor ¦ Lucilene Mendes ¦ Data ¦23.08.24 ¦¦¦
  10. ¦¦+----------+------------------------------------------------------------¦¦¦
  11. ¦¦¦Descriçäo ¦ Grid com as oportunidades do vendedor. ¦¦¦
  12. ¦¦+-----------------------------------------------------------------------+¦¦
  13. ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
  14. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*/
  15. User Function Oportunidade()
  16. Local cHtml
  17. Local cLink := ""
  18. Local cCombo := ""
  19. Local cDataDe := ""
  20. Local cDataAte := ""
  21. Local cFiltDe := ""
  22. Local cFilAte := ""
  23. Local cLinkDet := ""
  24. Local aStatus:= {}
  25. Private cColunas:= ""
  26. Private cItens := ""
  27. Private cTopo := ""
  28. Private cSite := "u_PortalLogin.apw"
  29. Private cPagina := "Homologações"
  30. Private cTitle := ""
  31. Private lTableTools:= .T.
  32. Private lSidebar:= .F.
  33. Private cCodLogin := ""
  34. Private cVendLogin:= ""
  35. Web Extended Init cHtml Start U_inSite()
  36. If Empty(HttpSession->CodVend)
  37. cHtml:= '<META HTTP-EQUIV="Refresh" CONTENT="0 ; URL='+cSite+'">'
  38. Return cHtml
  39. Else
  40. If !Empty(HttpSession->Superv) .and. HttpSession->Superv <> HttpSession->CodVend
  41. HttpSession->CodVend:= HttpSession->Superv
  42. Endif
  43. Endif
  44. cVendLogin := u_GetUsrPR()
  45. cCodLogin := U_SetParPR(cVendLogin)
  46. // Pega do parâmetro com o Titulo do Portal
  47. cTitle := SuperGetMV("PS_TITLE", .T., "Portal SMS")
  48. // Define a funcao a ser chama no link
  49. cSite := "u_SMSPortal.apw?PR="+cCodLogin
  50. // Monta o cabeçalho para a pagina
  51. cHeader := U_PSHeader(cTitle, cSite)
  52. //Função que atualiza os menus
  53. cMenus := U_GetMenus(AllTrim(Upper(Procname())), cVendLogin)
  54. //Tratamento dos filtros
  55. If type("HttpPost->DataDe") <> "U"
  56. //Se vazio, usa as datas padrão para evitar erro na query
  57. If Empty(HttpPost->DataDe) .or. Empty(HttpPost->DataAte)
  58. cDataDe:= dtos(date()-30)
  59. cDataAte:= dtos(date())
  60. Else
  61. cDataDe:= dtos(ctod(HttpPost->DataDe))
  62. cDataAte:= dtos(ctod(HttpPost->DataAte))
  63. Endif
  64. //Atualiza as variáveis no valor do filtro
  65. cFiltDe:= dtoc(stod(cDataDe))
  66. cFilAte:= dtoc(stod(cDataAte))
  67. Else
  68. //Variáveis dos input dos filtros
  69. cFiltDe:= dtoc(date()-30)
  70. cFilAte:= dtoc(date())
  71. //Variáveis de filtro da query
  72. cDataDe:= dtos(date()-30)
  73. cDataAte:= dtos(date())
  74. Endif
  75. //Topo da janela
  76. //Botão incluir novo orçamento
  77. cTopo:= '<div class="row form-group">'
  78. If HttpSession->Tipo = 'S'
  79. cTopo+= ' <div class="col-sm-3">'
  80. cTopo+= ' <button class="btn btn-primary" id="btAddOpt" name="btAddOpt" onclick="javascript: location.href='+"'"+'u_AddOpt.apw?PR='+cCodLogin+"'"+';">'
  81. cTopo+= ' <i class="fa fa-plus"></i> Nova Homologação</button>'
  82. cTopo+= ' </div>'
  83. Endif
  84. //Filtros
  85. cTopo+= ' <div class="col-sm-9" align="'+Iif(HttpSession->Tipo = 'S',"right","left")+'">'
  86. cTopo+= ' <form name="formGrid" id="formGrid" method="POST" action="U_Oportunidade.apw?PR='+cCodLogin+'">'
  87. cTopo+= ' <label class="col-md-2 control-label">Início De:</label>'
  88. cTopo+= ' <div class="col-md-3">'
  89. cTopo+= ' <div class="input-group">'
  90. cTopo+= ' <span class="input-group-addon">'
  91. cTopo+= ' <i class="fa fa-calendar"></i>'
  92. cTopo+= ' </span>'
  93. cTopo+= ' <input data-plugin-datepicker="" data-plugin-options='+"'"+'{"autoclose": "true", "language": "pt-BR",'
  94. cTopo+= ' "daysOfWeekDisabled": "","daysOfWeekHighlighted":"[0]"}'+"'"+' value="'+cFiltDe+'" '
  95. cTopo+= ' placeholder="__/__/____" id="datade" name="datade" class="form-control only-numbers" type="text">'
  96. cTopo+= ' </div>'
  97. cTopo+= ' </div>'
  98. cTopo+= ' <label class="col-md-2 control-label">Início Até:</label>'
  99. cTopo+= ' <div class="col-md-3">'
  100. cTopo+= ' <div class="input-group">'
  101. cTopo+= ' <span class="input-group-addon">'
  102. cTopo+= ' <i class="fa fa-calendar"></i>'
  103. cTopo+= ' </span>'
  104. cTopo+= ' <input data-plugin-datepicker="" data-plugin-options='+"'"+'{"autoclose": "true", "language": "pt-BR",'
  105. cTopo+= ' "daysOfWeekDisabled": "","daysOfWeekHighlighted":"[0]"}'+"'"+' value="'+cFilAte+'" '
  106. cTopo+= ' placeholder="__/__/____" id="dataate" name="dataate" class="form-control only-numbers" type="text">'
  107. cTopo+= ' </div>'
  108. cTopo+= ' </div>'
  109. cTopo+= ' <button class="btn btn-primary" id="btFiltro" value="" onclick="this.value= '+"'"+'Aguarde...'+"'"+';this.disabled= '+"'"+'disabled'+"'"+';Filtro()" name="btFiltro">'
  110. cTopo+= ' <i class="fa fa-filter"></i> Filtrar</button>'
  111. cTopo+= ' </form>'
  112. cTopo+= ' </div>'
  113. cTopo+= '</div>'
  114. cQry:= " Select DISTINCT AD1_FILIAL, AD1_NROPOR, AD1_DESCRI, AD1_DESCOP, AD1_CODCLI, AD1_LOJCLI, A1_NOME, A1_EMAIL, AD1_DTINI, AD1_DTFIM, AD1_HOMOLO, AD1_VEND, AD1_REGION, AD1_DESCRE, "
  115. cQry+= " AD1_DESCCI, AD1_UF, AD1_STATUS, AD1_REVISA, AD1.R_E_C_N_O_ RECAD1 "
  116. cQry+= " From "+RetSqlName("AD1")+" AD1 "
  117. cQry+= " Inner Join "+RetSqlName("SA1")+" SA1 On A1_FILIAL = '"+xFilial("SA1")+"' AND A1_COD = AD1_CODCLI AND A1_LOJA = AD1_LOJCLI AND SA1.D_E_L_E_T_ = ' ' "
  118. cQry+= " Where AD1.D_E_L_E_T_ = ' ' "
  119. /*
  120. If HttpSession->Tipo = 'S' //Supervisor acessa todos os orçamentos da sua equipe
  121. cQry+= " AND AD1_VEND in "+FormatIn(HttpSession->Equipe,"|")+" "
  122. Else
  123. cQry+= " AND AD1_VEND = '"+cVendLogin+"' "
  124. Endif
  125. */
  126. If !Empty(cDataAte)
  127. cQry+= " And AD1_DTINI between '"+cDataDe+"' and '"+cDataAte+"' "
  128. Endif
  129. cQry+= " Order by AD1_DTINI, AD1_NROPOR, AD1_CODCLI, AD1_LOJCLI "
  130. If Select("QRY") > 0
  131. QRY->(dbCloseArea())
  132. Endif
  133. APWExOpenQuery(ChangeQuery(cQry),'QRY',.T.)
  134. //Cabeçalho do grid
  135. cColunas+='<th>Filial</th>'
  136. cColunas+='<th>Número</th>'
  137. cColunas+='<th>Descrição</th>'
  138. //cColunas+='<th>Complemento</th>'
  139. cColunas+='<th>Status</th>'
  140. cColunas+='<th>Revisão</th>'
  141. cColunas+='<th>Início</th>'
  142. cColunas+='<th>Fim</th>'
  143. cColunas+='<th>Cliente</th>'
  144. cColunas+='<th>Nome</th>'
  145. cColunas+='<th>Cidade/UF</th>'
  146. cColunas+='<th>Regional</th>'
  147. If HttpSession->Tipo = 'S'
  148. cColunas+='<th>Vendedor</th>'
  149. Endif
  150. cColunas+='<th></th>'
  151. aStatus:= RetSx3Box(Posicione('SX3',2,'AD1_STATUS','X3CBox()'),,,1)
  152. While QRY->(!Eof())
  153. //Atualiza os controles do grid
  154. cLink:= "U_MntOpt.apw?PR="+cCodLogin+"&rec="+cValtoChar(QRY->RECAD1)
  155. cLinkDet := '"onclick="window.document.location='+"'"+cLink+"&opc=view'"+';"'
  156. cItens+='<tr>'
  157. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+QRY->AD1_FILIAL+'</td>'
  158. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+QRY->AD1_NROPOR+'</td>'
  159. If (nSeek := Ascan(aStatus, { |x| x[ 2 ] == QRY->AD1_STATUS })) > 0
  160. cCombo := AllTrim( aStatus[nSeek,3])
  161. Endif
  162. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+Upper(QRY->AD1_DESCRI)+'</td>'
  163. //cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+QRY->AD1_DESCOP+'</td>'
  164. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+cCombo+'</td>'
  165. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+QRY->AD1_REVISA+'</td>'
  166. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';" data-order="'+QRY->AD1_DTINI+'">'+dtoc(stod(QRY->AD1_DTINI))+'</td>'
  167. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';" data-order="'+QRY->AD1_DTFIM+'">'+dtoc(stod(QRY->AD1_DTFIM))+'</td>'
  168. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+QRY->AD1_CODCLI+'/'+QRY->AD1_LOJCLI+'</td>'
  169. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+Alltrim(QRY->A1_NOME)+'</td>'
  170. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+Alltrim(QRY->AD1_DESCCI+" / "+QRY->AD1_UF)+'</td>'
  171. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+Alltrim(QRY->AD1_DESCRE)+'</td>'
  172. If HttpSession->Tipo = 'S'
  173. cItens+=' <td role="button" onclick="window.document.location='+"'"+cLink+"&opc=view'"+';">'+QRY->AD1_VEND+' - '+Posicione("SA3",1,xFilial("SA3")+QRY->AD1_VEND,"A3_NREDUZ")+'</td>'
  174. cItens+=' <td class="actions">'
  175. //cItens+= ' <a href="'+cLink+'&opc=copy" class="on-default" data-toggle="tooltip" data-original-title="Copiar Orçamento"><i class="fa fa-files-o"></i></a>'
  176. If QRY->AD1_VEND $ HttpSession->Equipe
  177. If QRY->AD1_STATUS $ "1/3"
  178. cItens+=' <a href="'+cLink+'&opc=edit" class="on-default" data-toggle="tooltip" data-original-title="Alterar Homologação"><i class="fa fa-pencil"></i></a>'
  179. If Empty(QRY->AD1_REVISA)
  180. cItens+=' <a href="'+cLink+'&opc=dele" class="on-default" data-toggle="tooltip" data-original-title="Excluir Homologação"><i class="fa fa-trash-o"></i></a>'
  181. Endif
  182. EndIf
  183. EndIf
  184. cItens+=' </td>'
  185. Endif
  186. cItens+='</tr>'
  187. QRY->(dbSkip())
  188. End
  189. //Retorna o HTML para construção da página
  190. cHtml := H_SMSGrid()
  191. Web Extended End
  192. Return (cHTML)
  193. // Montar o formulário para mandar por e-mail
  194. static function montarForm(cTitulo, cSubm)
  195. Local cRet:=""
  196. Local cEmail:= ""
  197. cRet+= '<!-- Modal Form -->'+CRLF
  198. cRet+= ' <div id="modalEmail" class="modal-block modal-block-primary mfp-hide">'+CRLF
  199. cRet+= ' <section class="panel">'+CRLF
  200. cRet+= ' <header class="panel-heading">'+CRLF
  201. cRet+= ' <h2 class="panel-title">Enviar '+cTitulo+' por e-mail</h2>'+CRLF
  202. cRet+= ' </header>'+CRLF
  203. cRet+= ' <div class="panel-body">'+CRLF
  204. cRet+= ' <form id="formEmail" class="form-horizontal mb-lg" novalidate="novalidate">'+CRLF
  205. cRet+= ' <span><i>Para enviar para mais de um destinatário, separe os e-mails com ;</i></span>'+CRLF
  206. cRet+= ' <br><br>'+CRLF
  207. cRet+= ' <div class="form-group">'+CRLF
  208. cRet+= ' <label class="col-sm-3 control-label">E-mail</label>'+CRLF
  209. cRet+= ' <div class="col-sm-9">'+CRLF
  210. cRet+= ' <input type="hidden" name="nrdoc"/>'+CRLF
  211. cRet+= ' <input type="hidden" name="formDest" value="'+cSubm+'"/>'+CRLF
  212. cRet+= ' <input type="email" name="email" class="form-control" placeholder="Insira seu email..." required/>'+CRLF
  213. cRet+= ' </div>'+CRLF
  214. cRet+= ' </div>'+CRLF
  215. cRet+= ' </form>'+CRLF
  216. cRet+= ' </div>'+CRLF
  217. cRet+= ' <footer class="panel-footer">'+CRLF
  218. cRet+= ' <div class="row">'+CRLF
  219. cRet+= ' <div class="col-md-12 text-right">'+CRLF
  220. cRet+= ' <button class="btn btn-primary modal-confirm" onclick="javascript:enviarEmail();">Enviar</button>'+CRLF
  221. cRet+= ' <button class="btn btn-default modal-dismiss" onclick="javascript:fecharEmail();">Cancelar</button>'+CRLF
  222. cRet+= ' </div>'+CRLF
  223. cRet+= ' </div>'+CRLF
  224. cRet+= ' </footer>'+CRLF
  225. cRet+= ' </section>'+CRLF
  226. cRet+= ' </div>'+CRLF
  227. return cRet