Financeiro.apl 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  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 ¦ Financeiro ¦ Autor ¦ Lucilene Mendes ¦ Data ¦03.12.17 ¦¦¦
  10. ¦¦+----------+------------------------------------------------------------¦¦¦
  11. ¦¦¦Descriçäo ¦ Grid com os títulos em aberto do vendedor. ¦¦¦
  12. ¦¦+-----------------------------------------------------------------------+¦¦
  13. ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
  14. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*/
  15. User Function Financeiro()
  16. Local cHtml
  17. Local cValTit := ""
  18. Local cValPag := ""
  19. Local cSldTit := ""
  20. Local cFiltro := ""
  21. Local cDataDe := ""
  22. Local cDataAte := ""
  23. Local cFiltDe := ""
  24. Local cFilAte := ""
  25. Local nSeq := 0
  26. Local _nVlrJuros:= 0
  27. Local _nVlrDoc := 0
  28. Local _nVlrAbat := 0
  29. Private cColunas:= ""
  30. Private cItens := ""
  31. Private cTopo := ""
  32. Private cSite := "u_PortalLogin.apw"
  33. Private cPagina := "Financeiro"
  34. Private cTitle := ""
  35. Private lTableTools:= .T.
  36. Private lSidebar:= .F.
  37. Private cCodLogin := ""
  38. Private cVendLogin:= ""
  39. Private cJavaScr := ""
  40. Web Extended Init cHtml Start U_inSite()
  41. cVendLogin := u_GetUsrPR()
  42. cCodLogin := U_SetParPR(cVendLogin)
  43. If Empty(HttpSession->CodVend)
  44. cHtml:= '<META HTTP-EQUIV="Refresh" CONTENT="0 ; URL='+cSite+'">'
  45. Return cHtml
  46. Else
  47. If !Empty(HttpSession->Superv) .and. HttpSession->Superv <> HttpSession->CodVend
  48. HttpSession->CodVend:= HttpSession->Superv
  49. Endif
  50. Endif
  51. // Pega do parâmetro com o Titulo do Portal
  52. cTitle := SuperGetMV("PS_TITLE", .T., "Portal SMS")
  53. // Define a funcao a ser chama no link
  54. cSite := "u_SMSPortal.apw?PR="+cCodLogin
  55. // Monta o cabeçalho para a pagina
  56. cHeader := U_PSHeader(cTitle, cSite)
  57. //Função que atualiza os menus
  58. cMenus := cMenus := U_GetMenus(AllTrim(Upper(Procname())), cVendLogin)
  59. //Tratamento dos filtros
  60. If type("HttpPost->DataDe") <> "U"
  61. //Se vazio, usa as datas padrão para evitar erro na query
  62. If Empty(HttpPost->DataDe) .or. Empty(HttpPost->DataAte)
  63. cDataDe:= dtos(date()-30)
  64. cDataAte:= dtos(date())
  65. Else
  66. cDataDe:= dtos(ctod(HttpPost->DataDe))
  67. cDataAte:= dtos(ctod(HttpPost->DataAte))
  68. Endif
  69. //Atualiza as variáveis no valor do filtro
  70. cFiltDe:= dtoc(stod(cDataDe))
  71. cFilAte:= dtoc(stod(cDataAte))
  72. cFiltro:= HttpPost->tipoFiltro
  73. Else
  74. //Variáveis dos input dos filtros
  75. cFiltDe:= dtoc(date()-30)
  76. cFilAte:= dtoc(date())
  77. //Variáveis de filtro da query
  78. cDataDe:= dtos(date()-30)
  79. cDataAte:= dtos(date())
  80. cFiltro:= '1' //1=Emissao, 2=Vencto, 3=Baixa
  81. Endif
  82. //Filtros
  83. cTopo:= '<div class="row form-group">'
  84. cTopo+= ' <div class="col-sm-12" align="left">'
  85. cTopo+= ' <form name="formGrid" id="formGrid" method="POST" action="U_Financeiro.apw?PR='+cCodLogin+'">'
  86. cTopo+= ' <label class="col-md-1 control-label">Tipo Data:</label>'
  87. cTopo+= ' <div class="col-sm-2">'
  88. cTopo+= ' <div class="input-group">'
  89. cTopo+= ' <select data-plugin-selectTwo class="form-control populate mb-md" name="tipofiltro" id="tipofiltro" '
  90. cTopo+= ' data-plugin-options='+"'"+'{"minimumResultsForSearch": "-1"}'+"'"+' required="" aria-required="true" value="'+cFiltro+'">'
  91. cTopo+= ' <option value="1"'+Iif(cFiltro='1',' selected','')+'>Emissão</option>'
  92. cTopo+= ' <option value="2"'+Iif(cFiltro='2',' selected','')+'>Vencimento</option>'
  93. cTopo+= ' <option value="3"'+Iif(cFiltro='3',' selected','')+'>Baixa</option>'
  94. cTopo+= ' </select>'
  95. cTopo+= ' </div>'
  96. cTopo+= ' </div>'
  97. cTopo+= ' <label class="col-md-1 control-label">De:</label>'
  98. cTopo+= ' <div class="col-md-2">'
  99. cTopo+= ' <div class="input-group">'
  100. cTopo+= ' <span class="input-group-addon">'
  101. cTopo+= ' <i class="fa fa-calendar"></i>'
  102. cTopo+= ' </span>'
  103. cTopo+= ' <input data-plugin-datepicker="" data-plugin-options='+"'"+'{"autoclose": "true", "language": "pt-BR",'
  104. cTopo+= ' "daysOfWeekDisabled": "","daysOfWeekHighlighted":"[0]"}'+"'"+' value="'+cFiltDe+'" '
  105. cTopo+= ' placeholder="__/__/____" id="datade" name="datade" class="form-control only-numbers" type="text"></input>'
  106. cTopo+= ' </div>'
  107. cTopo+= ' </div>'
  108. cTopo+= ' <label class="col-md-1 control-label">Até:</label>'
  109. cTopo+= ' <div class="col-md-2">'
  110. cTopo+= ' <div class="input-group">'
  111. cTopo+= ' <span class="input-group-addon">'
  112. cTopo+= ' <i class="fa fa-calendar"></i>'
  113. cTopo+= ' </span>'
  114. cTopo+= ' <input data-plugin-datepicker="" data-plugin-options='+"'"+'{"autoclose": "true", "language": "pt-BR",'
  115. cTopo+= ' "daysOfWeekDisabled": "","daysOfWeekHighlighted":"[0]"}'+"'"+' value="'+cFilAte+'" '
  116. cTopo+= ' placeholder="__/__/____" id="dataate" name="dataate" class="form-control only-numbers" type="text"></input>'
  117. cTopo+= ' </div>'
  118. cTopo+= ' </div>'
  119. cTopo+= ' <div class="col-md-2">'
  120. cTopo+= ' <button class="btn btn-primary" id="btFiltro" value="" onclick="this.value= '+"'"+'Aguarde...'+"'"+';this.disabled= '+"'"+'disabled'+"'"+';Filtro()" name="btFiltro">'
  121. cTopo+= ' <i class="fa fa-filter"></i> Filtrar</button>'
  122. cTopo+= ' </div>'
  123. cTopo+= ' </form>'
  124. /*
  125. cTopo+= ' <div class="col-md-2">'
  126. cTopo+= ' <button class="btn btn-primary" id="btBoleto" value="" onclick="GerarBoletos();" name="btBoleto">'
  127. cTopo+= ' <i class="fa fa-filter"></i> Gerar Boletos</button>'
  128. cTopo+= ' </div>'
  129. */
  130. cTopo+= ' </div>'
  131. cTopo+= '</div>'
  132. // Buscar os Títulos
  133. cQry := " SELECT DISTINCT case when e1_saldo>0 then 'ABERTO' else 'BAIXADO' end STATUS, E1_FILIAL, E1_NUM, E1_CLIENTE, E1_LOJA, E1_PREFIXO, E1_PARCELA, E1_EMISSAO, "
  134. cQry += " E1_VENCREA, E1_BAIXA, E1_TIPO, E1_VALOR, E1_SALDO, E1_NUMBCO, E1_PORTADO, E1_ACRESC, E1_VALJUR, E1_DECRESC, SE1.R_E_C_N_O_ NUMREC, A1_CGC, A1_NREDUZ, A1_VEND VEND, A1_EMAIL "
  135. cQry += "FROM "+RetSqlName("SE1")+" SE1 "
  136. cQry += " JOIN " + RetSqlName("SA1")+" SA1 ON A1_FILIAL = '"+xFilial("SA1")+"' AND E1_CLIENTE = A1_COD AND E1_LOJA = A1_LOJA AND SA1.D_E_L_E_T_ = ' ' "
  137. If HttpSession->Tipo = 'S' //Supervisor acessa todos os clientes da sua equipe
  138. cQry+= " AND A1_VEND in "+FormatIn(HttpSession->Equipe,"|")+" "
  139. Else
  140. cQry+= " AND A1_VEND = '"+cVendLogin+"'"
  141. Endif
  142. cQry += " WHERE SE1.D_E_L_E_T_ = ' ' "
  143. If cFiltro = '1' //Emissão
  144. cQry+= " AND E1_EMISSAO between '"+cDataDe+"' and '"+cDataAte+"' "
  145. Elseif cFiltro = '2' //Vencimento
  146. cQry+= " AND E1_VENCREA between '"+cDataDe+"' and '"+cDataAte+"' "
  147. Elseif cFiltro = '3' //Baixa
  148. cQry+= " AND E1_BAIXA between '"+cDataDe+"' and '"+cDataAte+"' "
  149. Endif
  150. cQry += " AND E1_TIPO NOT IN ('NCC','RA') "
  151. cQry += " AND E1_TIPO NOT IN " + FormatIn(MVABATIM,"|") "
  152. cQry += " ORDER BY 1, E1_VENCREA, SE1.R_E_C_N_O_ "
  153. cQry := ChangeQuery(cQry)
  154. If Select("QRY") > 0
  155. QRY->(dbCloseArea())
  156. Endif
  157. APWExOpenQuery(ChangeQuery(cQry),'QRY',.T.)
  158. TcSetField("QRY","E1_EMISSAO","D")
  159. TcSetField("QRY","E1_VENCREA","D")
  160. TcSetField("QRY","E1_BAIXA","D")
  161. //Cabeçalho do grid
  162. //cColunas+='<th></th>'
  163. cColunas+='<th>Número</th>'
  164. cColunas+='<th>Parcela</th>'
  165. cColunas+='<th>Tipo</th>'
  166. cColunas+='<th>Cliente</th>'
  167. cColunas+='<th>CPF/CNPJ</th>'
  168. cColunas+='<th>Emissão</th>'
  169. cColunas+='<th>Vencimento</th>'
  170. cColunas+='<th>Baixa</th>'
  171. cColunas+='<th>Valor</th>'
  172. cColunas+='<th>Valor Pago</th>'
  173. cColunas+='<th>Saldo</th>'
  174. cColunas+='<th>Status</th>'
  175. //cColunas+='<th></th>'
  176. If HttpSession->Tipo = 'S' //Supervisor
  177. cColunas+='<th>Vendedor</th>'
  178. Endif
  179. While QRY->(!Eof())
  180. nSeq++
  181. If dDatabase > QRY->E1_VENCREA
  182. _nVlrJuros:= Round(QRY->E1_VALJUR * (dDatabase - QRY->E1_VENCREA),2)
  183. Else
  184. _nVlrJuros:= 0
  185. Endif
  186. _nVlrDoc := 0
  187. //Calcula o valor do título somente se o título possuir saldo
  188. If QRY->E1_SALDO > 0
  189. cFilAnt:= QRY->E1_FILIAL
  190. _nVlrAbat :=SomaAbat(QRY->E1_PREFIXO,QRY->E1_NUM,QRY->E1_PARCELA,"R",1,dDatabase,QRY->E1_CLIENTE,QRY->E1_LOJA)
  191. _nVlrDoc := Round((((QRY->E1_SALDO+_nVlrJuros+QRY->E1_ACRESC)- QRY->E1_DECRESC)*100)-(_nVlrAbat*100),0)/100
  192. Endif
  193. If QRY->E1_TIPO $ "NCC,IN-,IR-,CS-,PI-,CF-,IS-"
  194. cValTit:= TransForm(QRY->E1_VALOR*-1,"@E 999,999,999.99")
  195. cValPag:= TransForm((QRY->E1_VALOR-QRY->E1_SALDO)*-1,"@E 999,999,999.99")
  196. cSldTit:= TransForm(_nVlrDoc,"@E 999,999,999.99")
  197. Else
  198. cValTit:= TransForm(QRY->E1_VALOR ,"@E 999,999,999.99")
  199. cValPag:= TransForm(QRY->E1_VALOR-QRY->E1_SALDO ,"@E 999,999,999.99")
  200. cSldTit:= TransForm(_nVlrDoc,"@E 999,999,999.99")
  201. Endif
  202. cItens+='<tr>'
  203. //cItens+=' <td><input type="checkbox" value="'+cValtoChar(QRY->NUMREC)+'" id="checkbol'+cvaltochar(nSeq)+'"></td>'
  204. cItens+=' <td>'+trim(QRY->E1_PREFIXO)+'/'+QRY->E1_NUM+'</td>'
  205. cItens+=' <td>'+QRY->E1_PARCELA+'</td>'
  206. cItens+=' <td>'+QRY->E1_TIPO+'</td>'
  207. cItens+=' <td>'+QRY->E1_CLIENTE+"/"+QRY->E1_LOJA+" - "+Alltrim(QRY->A1_NREDUZ)+'</td>'
  208. cItens+=' <td>'+Transform(QRY->A1_CGC,"@R 99.999.999/9999-99")+'</td>'
  209. cItens+=' <td data-order="'+dtos(QRY->E1_EMISSAO)+'">'+DTOC(QRY->E1_EMISSAO)+'</td>'
  210. cItens+=' <td data-order="'+dtos(QRY->E1_VENCREA)+'">'+DTOC(QRY->E1_VENCREA)+'</td>'
  211. cItens+=' <td data-order="'+Iif(!Empty(QRY->E1_BAIXA),dtos(QRY->E1_BAIXA),'')+'">'+DTOC(QRY->E1_BAIXA)+'</td>'
  212. cItens+=' <td>'+cValTit+'</td>'
  213. cItens+=' <td>'+cValPag+'</td>'
  214. cItens+=' <td>'+cSldTit+'</td>'
  215. cItens+=' <td>'+QRY->STATUS+'</td>'
  216. /*
  217. cItens+=' <td class="actions">'
  218. If QRY->STATUS = "ABERTO" //.and. QRY->E1_PORTADO == "341" .and. !empty(QRY->E1_NUMBCO)
  219. cItens+=' <a class="modal-email" href="#" data-toggle="tooltip" data-original-title="Enviar BOLETO por e-mail" title="" onClick="javascript:abreEmail('+cValtoChar(QRY->NUMREC)+','+"'"+Alltrim(QRY->A1_EMAIL)+"'"+');">'
  220. cItens+=' <i class="fa fa-envelope-o"></i>'
  221. cItens+=' </a>'
  222. cItens+=' <a href="#" data-toggle="tooltip" data-original-title="Abrir BOLETO" title="" onClick="javascript:ViewBoleto('+cValtoChar(QRY->NUMREC)+');">'
  223. cItens+=' <i class="fa fa-file-pdf-o"></i>'
  224. cItens+=' </a>'
  225. Endif
  226. cItens+=' </td>'
  227. */
  228. If HttpSession->Tipo = 'S' //Supervisor
  229. cItens+=' <td>'+QRY->VEND+' - '+Posicione("SA3",1,xFilial("SA3")+QRY->VEND,"A3_NREDUZ")+'</td>'
  230. Endif
  231. cItens+='</tr>'
  232. QRY->(dbSkip())
  233. End
  234. /*
  235. cItens+= montarForm("Boleto", "MaiPBol.apw?PR="+cCodLogin)
  236. cJavaScr += 'var aBolImp = [];' + CRLF
  237. cJavaScr += 'function ViewBoleto(idBoleto){' + CRLF
  238. cJavaScr += ' if (! aBolImp.includes(idBoleto)) {' + CRLF
  239. cJavaScr += ' aBolImp.push(idBoleto); ' + CRLF
  240. cJavaScr += ' $.ajax({ ' + CRLF
  241. cJavaScr += ' url: "U_MaiPBol.apw?PR='+cCodLogin+'",' + CRLF
  242. cJavaScr += ' type: "POST",' + CRLF
  243. cJavaScr += ' data: "email=&doc="+idBoleto,' + CRLF
  244. cJavaScr += ' cache: false, ' + CRLF
  245. cJavaScr += ' success: ' + CRLF
  246. cJavaScr += ' function(docBoleto) {' + CRLF
  247. cJavaScr += ' if (docBoleto.indexOf("<META HTTP-EQUIV") >= 0 ) {' + CRLF
  248. cJavaScr += ' $("html").html(docBoleto);' + CRLF
  249. cJavaScr += ' return;' + CRLF
  250. cJavaScr += ' }' + CRLF
  251. cJavaScr += ' if (docBoleto == "" ) {' + CRLF
  252. cJavaScr += ' bootbox.alert("Falha ao gerar o arquivo. Tente novamente mais tarde.");' + CRLF
  253. cJavaScr += ' }' + CRLF
  254. cJavaScr += ' if (docBoleto.substr(0,6) == "BOLETO") {' + CRLF
  255. cJavaScr += ' window.open("/anexos/boleto/"+docBoleto,"_blank")' + CRLF
  256. cJavaScr += ' }' + CRLF
  257. cJavaScr += ' for( var i = 0; i < aBolImp.length; i++){ ' + CRLF
  258. cJavaScr += ' if ( aBolImp[i] == idBoleto) { ' + CRLF
  259. cJavaScr += ' aBolImp.splice(i, 1); ' + CRLF
  260. cJavaScr += ' i--; ' + CRLF
  261. cJavaScr += ' }' + CRLF
  262. cJavaScr += ' }' + CRLF
  263. cJavaScr += ' }' + CRLF
  264. cJavaScr += ' });' + CRLF
  265. cJavaScr += ' }' + CRLF
  266. cJavaScr += '}' + CRLF
  267. */
  268. //Retorna o HTML para construção da página
  269. cHtml := H_SMSGrid()
  270. Web Extended End
  271. Return (cHTML)
  272. // Montar o formulário para mandar por e-mail
  273. static function montarForm(cTitulo, cSubm)
  274. Local cRet:=""
  275. cRet+= '<!-- Modal Form -->'+CRLF
  276. cRet+= ' <div id="modalEmail" class="modal-block modal-block-primary mfp-hide">'+CRLF
  277. cRet+= ' <section class="panel">'+CRLF
  278. cRet+= ' <header class="panel-heading">'+CRLF
  279. cRet+= ' <h2 class="panel-title">Enviar '+cTitulo+' por e-mail</h2>'+CRLF
  280. cRet+= ' </header>'+CRLF
  281. cRet+= ' <div class="panel-body">'+CRLF
  282. cRet+= ' <form id="formEmail" class="form-horizontal mb-lg" novalidate="novalidate">'+CRLF
  283. cRet+= ' <span><i>Para enviar para mais de um destinatário, separe os e-mails com ;</i></span>'+CRLF
  284. cRet+= ' <br><br>'+CRLF
  285. cRet+= ' <div class="form-group">'+CRLF
  286. cRet+= ' <label class="col-sm-3 control-label">E-mail</label>'+CRLF
  287. cRet+= ' <div class="col-sm-9">'+CRLF
  288. cRet+= ' <input type="hidden" name="nrdoc"/>'+CRLF
  289. cRet+= ' <input type="hidden" name="formDest" value="'+cSubm+'"/>'+CRLF
  290. cRet+= ' <input type="email" name="email" class="form-control" placeholder="Insira seu email..." required/>'+CRLF
  291. cRet+= ' </div>'+CRLF
  292. cRet+= ' </div>'+CRLF
  293. cRet+= ' </form>'+CRLF
  294. cRet+= ' </div>'+CRLF
  295. cRet+= ' <footer class="panel-footer">'+CRLF
  296. cRet+= ' <div class="row">'+CRLF
  297. cRet+= ' <div class="col-md-12 text-right">'+CRLF
  298. cRet+= ' <button class="btn btn-primary modal-confirm" onclick="javascript:enviarEmail();">Enviar</button>'+CRLF
  299. cRet+= ' <button class="btn btn-default modal-dismiss" onclick="javascript:fecharEmail();">Cancelar</button>'+CRLF
  300. cRet+= ' </div>'+CRLF
  301. cRet+= ' </div>'+CRLF
  302. cRet+= ' </footer>'+CRLF
  303. cRet+= ' </section>'+CRLF
  304. cRet+= ' </div>'+CRLF
  305. // conout(cret)
  306. return cRet