From 5c7364b16fe171bf945c05ebe2855ba1f9cd21c4 Mon Sep 17 00:00:00 2001
From: Marcos Roriz

From ba8ce836f26688ba6dd75c32a3e78ae75aac74be Mon Sep 17 00:00:00 2001
From: Marcos Roriz | Número | +Nome | +Localização do Aluno | +Nível | +Turno | +
|---|
+
From 8aaf1e98034c496746f99d950ecef931b4ab2f31 Mon Sep 17 00:00:00 2001
From: Marcos Roriz
-
## Construindo (*building*) o SETE
O SETE é construído em cima do *framework* [Electron](https://github.com/electron/electron), um arcabouço para codificação de aplicações desktop modernas baseado no ecosistema Node.js.
From edb5490e2d751b6f5302c11ccebccb5f4fe32ac1 Mon Sep 17 00:00:00 2001
From: Marcos Roriz b91eG61i`d3R@`yQ^;M0e@jH__yGAsS`fXqBXQtXeVe+FdgUi{6>BR zz&R5QWhEn@{<$B%QRbf5oyAEHIWZ0`?xX4F=pGKAKg6fh!h=18;yV!a@O-*>NbiAX zJUY#B2I(W$1%^L{&!k5f(eXwM$7FF7TsA%;seT=gy4@r$cC6q?3>rxns8FNGzD>tB zHTRQTHW@IK|N52SW&F_O3x&zS$<%TGD@5^5zm=GSoM*8?<>-F<;B7_4+4ECPyf#m` zL=GO~UYX~@vVtz=ygdBs+!Cvhwa28U;magpv!mG8C(a>JCqMS}XxOC**ARK8>KJUS z8q}X~9>p?%L$zta7G9HBJT+62jVbyCDHEJ{Sdm;=ZQ-@Og6}cWQsd&p(g8iK)S&C- zQ)deKQ$uv{oGh5W#o33<)|AcsrL`JMuNJ{>UjT}o<}Icsp0|@KM3EXM`oLmb0iCK`{NP<*GV=HvZVLOZBI6R-Ew=1hCg z=2s#gHr@$wcfL<|^IJ~VfJ^M=^3&Z86}`q&mA{vk;!rU(wS|kLHba{U=%wavQvg)N zgR2SOKXeNsaV(taDTCw{56UMdYr~wSUra!t=69!e&DIi;1smOV9CSWrO5EO>oQqup zKu_@ZM6&r^C3I*6pFS9*j9X^S2boOwi6R+5I Mom{0g1THoM*TDB4E?AoU=}nLrA;TNZ$(ut7GkRvnm~M!A6; z2_c>XU`&O?fLTtX2y%$=AR$tGV`iv^3B+#v69pD5HNaFhJ0lj}nurqCs`*Wi%u4`} z{=(f1Sf{N&ME9C@i@`~8H;#g}(a6N$)xy0+-oW>%k^yV#{mMBIdHL=p;G+NU=i}0Y zhjwSY*g7--=9tr>)>oMTN_TAf0ES$958p1WHVJ#ryI%!aYgLiQDF6`5Ua(?j@*{Ns zKph@?2|hAG2KTl=GXfCGElrcYJ)l^)g8+JrvS)#bIV%=oI 1(4-b<+VLkaB_r{M?}hsIu{Na3aVD z4dqejWB3nsUjPaVJ^@;qbltRnN5K{W>0RMPmkIwxasTh*|Ij_8TXZ9U(brJcC6%x& zNk{8}QmvS+T%2{z3!a`ntsLx8D1SZm0H$u>z0xMhJG(iyJ=LG27yNa5`D?aNew@Ol z{?z&?E|xm?ga`sWDz W%% zKA8^ngt|wA3}B3l1~gR( z8nz9-k-Sd6W|*TYDv3$W0H93T!?x$i@^OjGM0QjsyvafTiR9Nz_6RE~0U>%2 !DesKM;hhX7DN^gr~t z63U2SAMKRqcXUax2+;2@lRz>$5KO9%U;)-`{TKd2qo!S|VAY&+x4oX60Ek*1i^V@+ z(v0OdvtOAeUTC5%)D03xQkORb67}pyl&8vPvZ8r$zqyYlf|wE)?A8OWxDNTgS&pIe zqxD<@;)RoG(&Pr|Ebq$8JE?2xZ;Vy!E}fu96_Bb-6r7UcNi{=l^2mdjX)%vdd_7ZZ zr_ANeUrcbi{WRRN`IS7|12xHkW4y-wHHxs8jB$Ty=WIP!g2L*DRV!+PI(g7sHh#2l zK3EY+gXzDuik Af^@<1dut~*A{E3yJhu!Suk}TiMm*JEEOvCN;1!4b_P)ZJSq(+i-%mO zgWy(tTjYXWZj*q0O<`aE%_%7AmhM32- zXO}idpyO9=1W{b1MlMmTr!kt*=qOG4LYuY8jl;XUyy2T|eH2R-uYypo^XyaM2T}Ze z793a*uLc{4-K0cw_!Twx+iA<^RkZ?=_G~0o)H8pQ8x;9Eh;*;AzMf`MwH%Um_wJtk zs?V+ 9-tR^hqN&F3?=Q z?FFTYe8ofxkq^A?EDRG(5H&wrvC>OC7ovnv?;oO6&1O6qoa|VcZQziXn@A!mgR_l= zR*}2!KPKB_+fz= T0$oYKc}0R4wBjcM6C6^W(i{ zLv(xvQUhnL3WByXJ&a;^u_E@4JXfkF>hH W#&}#zZb_Y>EnT&$OUoD+ zA#bb@@X={Z{i#-P&tjW|ZSgii1%cvs{?3i{$xQY~$6R(xyJ(ssBZgFyO#X6(Fl{j~ zaA`w3`L@@1e77LummgQIm+BxFKNHX8Zd0L{mHD+(Z_IG*%)PwwR0os!dfWL;AQu)X ziKJb+M}_HFgkrV$Ir6ICcs!9sAf-gg*UAbVs?*$F9eRfapz9(y@s+;NsH=CHF}Cl{ zB%TmRdBl)c93YY(l|hYhVA-(Cp(awX^1{Kgwb=^AiR8A6kM}R#6hkl z3jpFZl8)fcW?wg*-UZnKTKCdU9x58Z`Mts |+E+i?bGKtc^APMC+CpOdZ zrFQIfGn`?1i9YDMM<~oI@~}gPzI%RA7KsSu2_A@v_nM2DXnWdmuU{2Wn=!s>blbuM zw>pM4YniJKbI1V0hYGIrb{)cI%C)8XX bWHvSEmCXQYqp&|~)+CR~gFka<|i zb#bCI(UounOXXYa{5;^(eIko|J?{q@8G68&Sw_$lGJ$qBU15n7fj3fl5@jKI;hNyk zS4}hfp0lsYWZ}%raOUV5wKT?a^LAo~as&o+^jB@-IAE)BlH(HzTXkXKZow#N|5bGf zJJlS4u)5jSUBia)X8nEwKD%46< {g^Sf&TJ=uwd({6srk(UEk+p1ewA$rXmv=vd+6SLecX^n(JZ zFWIrWntj0UY~yi}s*@;Zc>Trn{;#9x^t()He$diaxZ)}Vz&eNjnIWwVd32g~g89 zFJD5r>Zz@5`^E$|J+uFs)!Pf_=41g|;r|l6<<=z@bk@g#kpGZd2~kTiSvP#BVyUov z<5OvL-TWw#o*r1l+Y~&8A|u{<^_w9+MG`XJ8>n~_gy9ZN4PUA|J9i7}aR>mPo{=xM z9MY;exfjnUfBMAYO!Zc}0RK`OA9ETGfgSE7w!Qjfl)!AB*i;hTRvi%mZ{@WSBmM8m z)>5aZI`^&@{v~(MC*BWt)DW1g30tAO8^^Jk>}~!1){z&FV5y5=W_;4LzryC6ef3S& z#02p~2<#WSMf`d%+r5Muo7gWE-LDWyodLK%Io|(EYCWOV*=XC2XFB> ~5`S-W=<9-Pt?ZQ -!(psJoio z8JhIvlk#N2e4|OFM?;Bgw(!a@`-016T}DxHGY1DwmFWlV#{*Fp=}~yE*{F&3Fb>MZ zbDXNwK>5|{MFK7aeU3lmb{lP+qs9-GL6_ETl$V``+de!Ts!`F~)@ueDo69*rbQNS> zHa7M@Y?8Qn`LTN1#+7fTKxl4ARDSc$w AIA9TiMh7N7_dFjS+QWB?(;LnB@N+` z>MR)R_EhI=tX%!$Qaa{-3MEM_wQ8f?ZRQ@GKAv^0!kg=Y`s;jGie>B>mGSrZcjovP zvihUE@S3hhdsFP{pJ>%TE~ez~`Hr9S{?WPjQfSFr@z(usZxZ>MA2Y7Zwn@}y-aXC@ zH7B1<^4pA4PCgY&EqyymV>Xza)R^A4bY^V-6u4lEoJ c=!ob zRAyImaD<`-yX;bNaDV;~2UAGTXTh#z<(-bk@Yv0@;C3#8?4*y^$kSWVkZ^qTs2Cpa z)i>{A+J3H2MtfiCOcNa{IPDT()K}uXM8h!Bpx9O7(!l#6SBf6xp7K1e$ld1q0&U=| z>y}TaMU~*|mcLwDqN8VX@St&M^8Ws+cRE2E ?a;;J?8omGBoX?oJg| zek)t&E-^v4WatBW$NI;sYyN72eY9&?8YKC$$aL}_-N4hJD*Hz_46d8M05dm{WS%_D z_j^jBzCld|jul$!&Z!Qx883ejyfCa&qnypNzCX?~TDSJuu~YF=*~UQ-E8CkY=hVnz z57lmmg;MDmW#o`V%9N2?3rpLTO?3J%b>eTk@Lbm2(<7q|qNAl=9OqHHU ?#tc&<>>w2L*y5t(lG+?6ew>Hda8ioQsTKoliU&c;U9wu0s-XX?}-G z{yK8?`x52m8D%9C<%AN=%I5hbt1+DFBjF>72>Pc~dNP0Yi)9AWbXO~I?9a zNl9rl&X3@zF&J>Lrc0I5c5n{o;EG2f1YZ2HJ-#nU1qIjyksw-D?i$3Ogi?Gf o?ST+8g)_>p0;8F4uFP9*m|UYx82)3*z!PpkXYPpK zCgmY>)?wbWa+) 2pwymSgjG24!9aQ(7X#+_UWXu`DGaH}(raahIV?dSPPT zv$M0L8CJ>cw-d0DAnZ0e+EwBlD|+pabdY3;cHwu8dp>+6>d;5+9(2l%7aDEI?^Uvg zXgQ0Hy-NF6xrj+2anJ-3`zi$qcXci=Fgo&c!oRA;7qTNSWXF5dFcxlPSM(PwLWu|m z)3N!9t=~3R{jT&hM0hH05 4%`&n;tMRo|F4c%OpZ+H7>vJiYn%Z1m;y$zZzs3 zZ|V2Szb5E#>p;-kU(w%r;O3Nwf@NAF(Ts|fo1>~aA>y8|Sv(4lGiK#!|NMSTI;ghP z?O&v{* am|#+~f;=c5fwXK@*k)E$4-O3OW}DF6Rv zejP6!9?extUwz=cSKha8Eah8K z-@aLw_<0Vle tA1L };seNW&z{oyw-6 zPY>w~+KRpf+gyI)Cl%oHef`G%CP{jf%O4|by=yIok_TmnuKejdQ|7Au_~O4dSa%M^ zlC@k^XBQ?a`BZ2o8t&4gqEZ7N#ay=7W!LThD3u1gOK~!LFySIQOxLh(xTkAB&pNG@ z*$2v@31*U!L(!E{Vi)7_V=bEL6J15M33kau&jjtkgeckNGN#_CgA{b~5uqM~wqz-f zcR94cZcmITzHcf#{Kqx0pq?U>Xjk7<8eA`S-+v{h?KVHnNc8v0OfY7!r&yqYk-!)f zb0MhGPE6V=`Hx=lJD8QThZHf0lt 4iI_$>eWSVGLz}7Nw+BL)?BN%FVKlmymns8kN%9$%serpjHG_EYZ# | zyvjZem$K?SX+P2SanW(^KoZ}|G^?NSeKK%|R*M{mR8dW&oTl)}Ek1iZ-&zv+$X~ak z4~4YtxG+#9=dwk|oY_~4Q29xFQ!7z(rf+wD2Whyy|Kdd`QlaYS@FzD>8)&EMX-A7v zj*DFi4WR4Es5AeAn9HSHu|9lKuD9(zT M&4Kv;Ck%)pxA44mv3&7IbOH-z~tL zPk8vPdVi0?b4%CBr;_--R30}nAb)69*z6|uU^+%`#tZ#%Qo~((dmH3xnc84*VhskR zKUm=kSqA>-8i(ao6Ia@xrrx45kAX-gHBMISK5YGI%nf@dCq |Mgcx?f!-*h|dHKvr0;cEW~3p+-!fC8Fmb#({B-Vp*n{SkC$?eNjL{% z9})Us31jFWTR;D1>sn4(otO}t0PwvTfNNv5e2<}vZGrCks%Plna8f)23npbPM=?3? z8jRs#`*u<{H-6(hSQ;yR=Vn-ZyMx;L-=9L#GKN#>%>*ot5dR@EzPp#eG$Wq2Ue$x7 zN9DnQY-9w6bh9p{z^&ItWYPbPFAL`S J(iyWH9!aUU_lyIKON 9cOw4j+lJod$H&)LT8xVJh zTdt)}T_JH|_vMf8lyz!w?c9a)lP7~$XC=~LNTSa{@r?We=Ce)8#SAbOZtf92Yf`iH zEWw=N;!IC#VScdr<_H_EkguLp`L!@VC|-@)@qwM%NkQ^Te)gOEh>rX3;4nO^NmFV7 zz6wTcHCisptr!ukBAXR<7K!JYKbX13PqevlAuk{`TP||QU-w(mm|AMZ6{gR?{drEm z!r!MMF)0v(Rteqq1|tLwe&5xV{MH1~#D-^2J7V8`u*#mW?W|sv?9{m^hSb&^RC{)p zLg=)Ha#P@zuT3`sIZ_=UD{buA;2JEXoy;S@_%L9@UC0?m*K!3e%5B}9TK;M?ACMEU z N9tTH+>)Pv8qsx1B9_ZDZZ<1+j8_$=a`mPMq>)GU7z6;OGnw~?KQs!; zVeBn5B9_hAZ~YhXfcZG#))S3Hi?cAjQV=Er3kQ@(j({VpPZXO(tG;QnSvqA~Zrx|1 zjO@z4xtbXWz4BRc7&jA~)ww4q>H2t@PRp${>1 x}ey2sk0No0q6V_kA?D*?PR2b#iLBSeWJaH~e=YGF+g3S_#Yn(-pERsR* zAY2ZP&nvPwgp)}@cH^N;o9s@9LZGNhT;i)&@`x-=bmR%??70D)6^K`b?d BY zbG3QRC$MwC?t9H2KQNeok$NzK1L?zq138;C<+XP0w=Dn*Ck>#1a@W*;vI9=WCRDXm zuw2K`EsKE;XZo;|YlIHwg?kAn3k>{znINx1X=)*M^+ISk73Ov!f;y9zJ7@NNeI_r6 zhiCkR^|_6v8tc*Ehe?;SPpL5XIb^yDKRv)1a$64SDwysT9h^X&)(26T#ZeqHx9gcJ zAv(Z_od(b)!Gr-~>9O %vE2bFJuH}_V_ zL0Jq2dXuH7ceiE#{!P9YjMx#6 cWd;K&r7qM^HHe*2IUKN#B-=(c&^-2m$QbpI|`qibVyq{ zD7ae)GZ?%;O^7*tL_&o}8&dSGQ4ExSFkePuQk*4_hvtKpySrcM9Ve-A%@J1mDkvjt z1&TZRn_W+`%FBs2P;n_W13iHo?o-bsV62 @R6J+05-no-`!ks{_@}3{?onrd zdSG+;@xr~xY2S(Ch5b9Tw+k4CC8wvYFF(<|{6v)>fzgC0_}`*~|0fj}dR`UYYW&21 zb~D@VzhQ9@FZ$uGEG{F2vUVRvUV;TE>9e-&p*mfMcdI{aiX9V|zgxj9*4~%5y9kDv zr9Wc`Ma3GHn+7nQ1#|j9PfBs;13{t_RuvuC8~VX3Z#SW9h(5Zz*vWxnEd{sCcn8V` zrDnH(7q4i|IZ9)25uR)35H?H5PlXm1*_3W=OxiH>U*FC1Xqvd~ha*J>Dol3TU0Yy^ z`&=;B&JjB}n0P;&115;G^8>zUI`*mNOhNyMP*kEREW8An4|+{=KZWzROJNZL<0t6l zLLc1tUEImw8=LK}Z3X9$#xPw|?nDWiDy@l6Ny(Z_jm^Jy%B;*_6IMI5s3L%X0zE3{ z;zrg5yNKoW(WTvhrK1U&2Uh9br@E^*)2GFxAW$=}u$Q{n4=`CDMJ-8JzxGb-EYzol zA0Kr&S~UxcYu+GfZVoA|k>|Y?x0i|I@D^U95l!N2v?mvw7KVxAuvRA+=T39;3w`I$ zZ4z;u8dmS=?ND{$M+kYPe!Ugm%LNF4c_845@FB@|{@ht5+CWlq3RogOQi3`e<<9xR z;x!ciawV9BP^~}M-3qB!o^D5TbIoO~RW#B9-d>l=4^d!NTHe>EHc1Q8kFuiA4zpRt ziF~Y`Et|}Yg=7oU>_)WAk0)lgioogtxSr58#2x4OGgr=&x94%N2j(PkOCC5olbHEc zC*dJ%x;Cg59*HX3?LOnns209kL0huh6jmf9qi+By7j$r|S*8c91LNPQq3g=8`8nGe z903cKKnt 44ZxKS;Twv|PIDft{oVb;6D5}>`E zlzk$R4S?I@%a@n6EX7-41`=}UrJp|gha-c>l7n{(Cxh+4R)<_W6ggIKxAcB<$1!Xc zurf@^^40->S{a+IU)~|-Ew>2m=6DNXt~)37ET?Z)WiW+!5nxDg6GFn~?AXj0cViH= z6ieKfKk0G?M#sF`CGje38aZhqRhtj*tK?7vbZ6Zoe3DqV;8{UMn%cy3AMk~ps*UT8 zC-UFKDl8zTV9lVbzZv=@Bm)oZ;9%EpxfabkPT3wRI1EivNDfX}Kl+={DcTn^7WBIv zb!u>+zZjU$9_2XWCMO6_AhYynmbyocA|KQ`jxXBR&ndLA8)9QO~ !xSkoSpq+IgkTI<`y`$UEb(a4dajTg1V7Z8X9$c&p1NmkH<{lNA8M!uWDe zx6$A^M||zQZbx|e?k!3PpH)JxG^H#J)@9BWcRRwXb8l5agm91(%yy7(AW3Lq9x#=% z3h}6}yw&BJ3Y-tK@B`p%#wr5_=5EE`g|naL^tE0dp$2+%#gJ6weIP?*J_Yd*7$4-5~-CD zpt511TL`n~1l(#14xD(Ff1Q;R0S EoAAgKU%h>HAu3whY!x3vgs zJ1_#Bid@)TbxeD! V-#JC}kh!^Kp!h*g%OkyR=UKN3q@N%p?8% zS&sSI d8+Li?|ou~4U{GrTQwh(~wG;x99)*dajN zz4@QQP)EmCZ_g10dQ=fa9-+DKw^o0yX;PMT@sAJg*0cT?(@Ic>C0#XJHt4v2STHW) zWI|__p>DiOwdwWhi%2GrUYPQHyzd4thh&T9RL6RYA+Q;N$%+CPhl^xCO|Gbk{ke1$ z7U^amIn4m-ii*_DN?T0cMztsNYNtA_4tjLIa`;4{rU;OOm~ZijLbRSnt6W1{-$L6U zt=w(k4-h{uE-rjtQdnHZNK6tbE{T*76FPq$dH#IfGGguj7~t$`ZEx%Qe;+XTs!R(G O02(Sf%I_}Sy#HUqsOBjE literal 0 HcmV?d00001 diff --git a/src/renderer/img/icones/normas-listar.png b/src/renderer/img/icones/normas-listar.png new file mode 100644 index 0000000000000000000000000000000000000000..6e91e3537c7400a327628287b68d5c54e167c99f GIT binary patch literal 9107 zcmcI~c|4SD`}bv{g^`lfB*{#Yy-4<@3^N%al4PwccN;Z{#yXx#32{k{tQ8UoDKU(t zyKRQd6e8=SE={)7Sf*i^_w0V|=l jOdUQ zcwcsk=y3*umOuOXC-Exeo<9WPw(Q35+;`4rykF-1NkNqQsh|s~m+`wUTqYU6(s`Vu zxl?xMg|-^4%>n3uQ2DOR5r<3b@~;%{D^Axuoh%LCIZH|=^&O Fsp~e-$qca#mhV=iJ0eX? zOIQovutvBS>4lZyao7nzpe#J*|IP %eBtP<`+J}y0R z4==&wequ7uV_(^oZRjo)sahKHONa|A%70yeQ*0~mK}r2ma5dgXnG%GoS-Iud1QUk~ zB2=Ed!M=nQB#7#W+~8G0kAl(B6)Q2v`K2S*uyeM4M=8(6Z v* vY*`Gb)Rm&z!?~Tlq!vWMLa@H2p9#3YQ5KSKi#kw~S->%g|~=>%5 ?`$d$=vp8=>V;rT$j})48hvb@NaI_O? zqxJ)D_& cc-rt_JsJ4Z0uj4BlLXu-B>PL6Hyv@uB9avQnvT5R!jt&Q9 zehY(g=#<4)r}(e@v3mh^w)@MrCdS-C6+GAKBin9(b2=LT0udmk%$1Maq4t?UrZUbd zyZ+8Pr5uTKJN=1-1@GWBtUAw0_-PtBEjha#@*7#6+_#-yOY~WHOTNx@(YHKoY%hAr z1PwMLurum4Kat@m><4PM7Iio>0&&VzHT FMN8P|GstYyiu-@;+9>Wk7|l@NlCrKfV%4t2$h z1|E2R6V4uAaZ9l)Np#4-e 1gEX#mmZy*71CsMHw|zP?4%!iJbe zIBz2o%HiEbm{C2l1h8lmp{+NVI342UeO*UCX5iH$PK+wXp!OXRU#2^64)%dI^aU6B zl{4qF4y{x Z&d3~C-%*kJ03Ltj-VTR9^wFrC zTrv_k)P2D PiyF-7QLNwCsU=e?pn|YU%x-PXT4&a8~1;H4{ls_ zU25Z+xQshlk9z|&pc8f*hIxkbk#_vx5dwj~UChC?Fkc+BTuV8;DeoQIO)F2)#0*t< zeRh2S71&LUs-Zc}YqpImO?`o_)XrVYqHp2vPXB}zukZ*fYJ{B#x$9U}{UIADc6iLK z^y057ODB2aa;r!~9pTd~g0C84+Wq;}U6SSI%&tkNWCRvEHy_?WACkRr)9ZuG4xFCr z(8xUs=1Kw!mD;5)ms_8CLttm$&rQ9L-tZoM=t+C5D>8wbNI}n|-wwjr>qleYG}i#v zOY_*xl9{)(Ay ?llDhDQx;H2F7~qNxQBq0FjlL5unFJ1q}pIJItB6v~=| zEV<~LX`&@o@09w;Mc&6EK54HCjxV (WKhi(KsE<+V)JSeLFQTUr1?w zz6DC$3*9~0(9T(wXPMRLOlS0+ttJi_rLKC4O!ah-Br>*0`E8SKntB~RTb^+4L~s|` z_O whNEvzc%Riqa%=bfqb&W@ zl-0TG>08^T1zOLN&gU%~ot4Skr9eH3sKbl|J@?LDD}6)Cd{o1+4^FsAtMD?u03kX) zGc}~wyk?-Ij4CI&)o4BGrVD51FFL78H=UdO#EdG6eZlNN&hpK5a${d6V!gTNDSVe# zqS9BYa4`#HUUasCFtA`Wa^q++YU?5I*g@CJsI6=yXU>&z`UKDQ1HJNKS6*~@Hy!Qp zU7l!Z|D%uCmFL~LM#}HbYeDN9 ?^ooH#H@5t}niRA{T|5q~P3itv4}ZdqS}Nz!ls^Y-)H8eC zLS06o`rd|`K86hp^WX)r^LNY@L&=xSXmQzU+w`0=s#TmJKMA9&A`hem7CMTL!P{ 2tvuEaQNNI|tjj^biC8#V0;XQ%VtFclEQhLW=DMqKtTiqGPiE6{ak z=mQrB5kw#tiLG#5i4GpRqmjUTlLDTpYSRS`sN<_CY+fsN@Na0>tGe9re!T)q|Jzlf z&sS!oGCy}o0JNDXam%jj3L #1hPuod%BW-<4FRE}5y&%(E_!S<(F0R3%+)fJxd}>mD!doU zD0zmXDEB%xS{YqIELP kl0R&lJRDhs+si2-( z4a%xpyFiV#k0=3Ar8OYPSryby|AffCrluc-yA5sK?%6Y5IhMMA^iEh^sY|T5DR>Kn zZXFm8^RPNuUHZ}qjOum;$K`53=sm^C*2T*5ApHIO6`*)KiTCveSV5AxDgQB(gbleG zrOi)f>f!G1ACae`Ag#2n-n$VGLJ9t!;5eFLb_NnTjwvEX1220Y`;24D&IKYGt*2;Z z3iJr%n9_-IOt+THuY>TJtU;FrEdPBV(;DIZ5|gXHjSYk>yb4WT4pk=ndcT5s>3cXf z?<&K9Oh!E5Raikv-wtv=(+yW>ya>YO17fvss4&dlX7VQ3k@+fTd&R5ry4>Hlz*26i z?j27TnUnVesj7bNE=g2_(QU;*2Ubc^Z=2lfzmaP6e9xW@^R%As&lZqcy2#R(-jA|y zh1O;=Odh09g6WL%{u|CCo4eDvJewY!HwIuLiv+o!h$m%z#89iNdgX(Af@y_N(^8 +xt+6W${2YuC zIve;~J4oW+f%7dXp)xZ)bJ^E;xQrWHO7|#8=Yitvhyi_P!G&yz%25Gr`sGs&o-Wz6 z;(CPnxC|T>93#zNs?D3#8>$AX;m<_^a~&*h4EK}xP14KyG)dj6GY6|_)xGjFiRq?U zsa&oLNsot7^0NglaSyrrVJyrnu< hR<7wox_xx}(&~yQzM_ z-{VU<-hOzmqBV!#M4QqXViJpaV%Oq{^8DBX+kh1`&srF(3^HzEuC^Iqg 7MlXs|wq(GYXYK>P5-Z)H)TqqxYWU4D@akfg-i&Aa)4 z-XhUnga+hf2q)~pL+%MMY=3av>b-#CzFk>Anzo-zsM4HB&K^J~QqI-s6m|# 5xw6SZ{G~J-!4J>)6H1#KyCbY(`QZnhq zBu?CeP862IX *e%M`Yr zs>oFm@&XUMUVvR%v^dea gxr^24>n8_ti8p&`#{ES% zQVC^3d{e5(n4HJ#3M_AK&RRxNnU7U xu)0Qq*lV$LqX1ov O`RiG6bxmS!v
Y;1HxZ0;=QV!D0Z7JeIu@$)@8O}9+k=nKe4gTg>52a`d^uDPk}<#_u~y15 zu7uWyCuFbJU^Nzhe||GF0WAHHS$yJ*#hlBmsT5a@HdAkl*gSHdH{RaHyLmB @aV-f9y~ezNFdF4FjkVVSo|JT>?UP8%vjxVVbl($JB# zNeM4HMpq}Ct#0_t2Pusq*e!S#bX3yo_#MO>Nev b^vj75F~Ud_Fb@ zJfhOS2EaN%@N |~JTNRKP_zK~9;T&FQwFx(Nw-Eo_6MKo{GtCp@V>-}@ z%&KLx8M$k38L=U>mWjq5)+kfB)H^RoqG7d(vCFQn)?CHmh`coV#x&dfbcQ-M@4}Y| zJxo|ODEoq-wfTKF&F^3o;p2-K1(+FZo|o}MjILVv0(~9VJFtBAIzh}0iMKW1`0=xq zUud?(S|3mz^FzrSZpRw6P5Ts*PxwF5Rc2jB*Trz#O!Qp%J+aLc$)6ig34%5^W1yFs zAzNAqAMAyJ2&T2dNN7I4(0VEb!K8S_3*vx&BFP0vm6&n#%<2?8N`Z%N+B*4`$Rd0o z6C%S3M(gc|Y+(ynOZD?LN$*B?6`^&()RBuJmqY7mNjNs-Y$)YdLk}t_5Y5*P6zwCM zd^EFFgh_L`nBm#zSz^q|>V))AkRGkSMp$783Q);i2yIlzK^0UJY6tG` 58;D(z z*PGR`lLSn;JmpNmsCd*Y+QEJ7ORVYdgop>VEv2gLqf3(t;p&;mm;Rg0fv5NT+cmu$W%O=U!Fh{xpO?R7cmDG>c7WveNHAia9R*(CzA zNA92CuDLVKNcQ2H$FB(XdRWPyM9mwN>Cu4b415H)1^_9(xtWb2$mApUfFW60Y!5na z8>liXMZ$$T=4z0KBb<=ia9dG3sil0viZEai>9#*6)>po}zd61M(tsTL&tjvMZ#V2n z3vZC~Sm^eBi%y(7&m7NGZQ4$e_UmJ131%5~If8Ye^%J#|45DwDl5l6iXmr5A?+Q(L zlSS6De4fY N`5B+4j88 z8*~@QBLqACmj`m3 G~ zNjHV2r94;043l!*%(k^n4@C1`z?R_)Ce^#x>Tjk8^!v9!tA^yED%NNhMG)gFScJSi ztxKGGAI8w+TtSYC8x*xOW4X(->rwYE7(neUR`^-nCX?}C?&PN+*125;A(U8~uDO<} zPw1a9aQCL=epyCAK6VZ8&e(3m;R3xhgu7woa71h|?zbqpn? VBFh5g52P|hdlUVwzELJ5UG+LSFuppWb^k2 @NTU%!nBfw<~g#zo3E22c537|R(29V>(<^B!X~Hl<;@{@ z%QfA? q>7 z@8b@Z%Be-e?!$4gTO&`zl7!2CT5Fs2`>IF+e_hnT+G >c6*Ms!QYR~7`J`(R-AivWlMhkP;BlQ}ZU3?B<{e*s`)V@6uREsm?#N1^y z(_`<>d0Fw}m=6NWsUsRt1#fwR=nOLW$o*M(7t!$y qs+kmpP# ztn1B+rC(qaG^DI7JcoP*XN(z^Kgj$Jc*%e%Dil{gb`8yG8RF6y%_PZEScASe4-}+$ z7qX5eFUbJ|lIBJ&zFW4aZ)z@* WMAo1jg{~- z06R*q$2wgVkq||pOjask-h>wGv;Vyw7<>c VNZX8 zfxo>1^~Dy*`T@YW$jkm|Xa1K9{M$YLpEx}(?5}({4nJr;r4dA6ACK1_yv1zI9Bdot z4nAZ*ldv8%1y6J;^D(=kD x|z>KACa?bbpkc$m77J z? ^Y zz{$;O%VXAVr2V@X%U=rmhpW`2yJCa3+uUO>!iEFz0Nf7=TT{J_jrmi7HIGli%B`sy zdm%;F5(r8HK;K?niT^Lm=TGwd$sg9>bx*`=AIf8@0?42D*fS%o1;70N(u(#(2C+*J zZV;!@yy!+*o}jhh`BS+?i2T0+IsIw*KRn=nx7#nIx_~3SI8Oip>0b7FkM{W061D+e z%061XRgIRgzVml4)mH=XuKj9=`tWBZ_n-60CyzaMJh7;(!srgAGcm2FwmKfGZi$FN zTtUP6=seCT Iq#X0>U1bHj2f!uFdUe_>oe<{#a9sR_WB#kC>VM_pe dNO-751Y_d-qvAN(7fblb^!O46RO7 ztBv&rOLRU!f_nWmphV%$x}40kSY0V-?Umw~z%_-C_UF3suwxDF!K9j9by5ea|M9B~ z_|<-aUe*C-pDfAiwgt1h-v$>2M%H=n-!Si6h(VQl7jvHMc7+tr><3((s(J&wtNT&t zr|P{rO3pxn+f1j-!2(7dh_i2DG8MtXj!r_RsuIxLnZ3yQ)>HZo>rJWwM%x8Ip4#Y* zX?fja@u-R#0D~19Kj^=4%KxW4Mo&D$o{gPMG&APEWBPz%GyFc$r{}=_8%!DOlGi>G zr5p~f>vFbL $XwVMc zE#@m6rF!^4lodIV$kNb1v-zo#5#Ycy*%PcNoEcj!b7ty^iSWJWhWXDp^&{Uih^(Ag z%efGqT&Zi!VqVb09P#EYP?lhTxhiw;L(W=?t%3IEz2l00-W!xCu?GH5-nIReCg3Jz z09NHvBJ2?uPBYToph!9WoFiAE%eicRA5)33Y@&tR`R6fD2A0PIfCiuoz9m0=;cZsZ z%aS}TC&aH>S9DH%hkfyUV&qbaPeBUF+(eBphXc(uwk?QnFmquknyrlWO$?p?P^QUE zG~d)l``NF#;|n;5LL-6TSFt=Hd)@G?#8)$VgZK&2H+aR*Z!79;@w3fb0{P>%wHHs6 z y$;gjjn3n&rd6&k!!G-tzRgAov0pXV&m2&C#V!UAcx= ?Nax|q^mG9Ru?DG@LosQ0g3`;6?JjmEWP-{rgjEe+*t!SjfPM1VU!TJVkp-5Y~r z%jX}Bc{21=7F;-Vej0&$2{GVAYK?>Y-hNeK9gUoHoSVS26A*MvknKQwgHKfy@^Y6_ y6S&4ef;`!M)%mTjuwo 8JO literal 0 HcmV?d00001 diff --git a/src/renderer/js/db.js b/src/renderer/js/db.js index 191b528..7a870c4 100644 --- a/src/renderer/js/db.js +++ b/src/renderer/js/db.js @@ -20,12 +20,14 @@ const DB_TABLE_PARAMETROS = "parametros"; const DB_TABLE_IMPORTACAO = "importacao"; const DB_TABLE_REALTIME_VIAGENSPERCURSO = "viagenspercurso"; const DB_TABLE_REALTIME_VIAGENSALERTA = "viagensalertas"; +const DB_TABLE_NORMAS = "normas"; const DB_TABLES = [ DB_TABLE_ALUNO, DB_TABLE_ESCOLA, DB_TABLE_CENSO, DB_TABLE_CUSTO, DB_TABLE_FORNECEDOR, DB_TABLE_GARAGEM, DB_TABLE_MONITOR, DB_TABLE_MOTORISTA, DB_TABLE_ORDEM_DE_SERVICO, DB_TABLE_ROTA, DB_TABLE_VEICULO, DB_TABLE_USUARIOS, - DB_TABLE_PARAMETROS, DB_TABLE_REALTIME_VIAGENSPERCURSO, DB_TABLE_REALTIME_VIAGENSALERTA + DB_TABLE_PARAMETROS, DB_TABLE_REALTIME_VIAGENSPERCURSO, DB_TABLE_REALTIME_VIAGENSALERTA, + DB_TABLE_NORMAS ] diff --git a/src/renderer/modules/norma/norma-cadastrar-ctrl.js b/src/renderer/modules/norma/norma-cadastrar-ctrl.js new file mode 100644 index 0000000..149ee10 --- /dev/null +++ b/src/renderer/modules/norma/norma-cadastrar-ctrl.js @@ -0,0 +1,359 @@ +// norma-cadastrar-ctrl.js +// Este arquivo contém o script de controle da tela norma-cadastrar-view. +// O mesmo serve tanto para cadastrar, quanto para alterar os dados de uma norma. + +// Verifica se é um cadastro novo ou é uma edição +var estaEditando = false; +if (action == "editarNorma") { + estaEditando = true; +} + +// Conjuntos que indicam as rotas vinculadas ao motorista +var antRotas = new Set(); + +// Máscaras +// $('.cep').mask('00000-000'); +// $(".cpfmask").mask('000.000.000-00', { reverse: true }); +// $(".telmask").mask(telmaskbehaviour, teloptions); +// $(".datanasc").mask('00/00/0000'); +// $(".datavalidacnh").mask('00/00/0000'); +// $('.cnh').mask('000000000-00', { reverse: true }); +// $('.money').mask('#.##0,00', { reverse: true }); + +var validadorFormulario = $("#wizardCadastrarNormaForm").validate({ + // Estrutura comum de validação dos nossos formulários (mostrar erros, mostrar OK) + ...configMostrarResultadoValidacao(), + ...{ + rules: { + tipoNorma: { + required: true + }, + tipoAssunto: { + required: true + }, + // regdata: { + // required: true, + // datanasc: true + // }, + // regnome: { + // required: true, + // lettersonly: true + // }, + // regcpf: { + // required: true, + // cpf: true + // }, + // modoSexo: { + // required: true + // }, + // regcnh: { + // required: true, + // cnh: true + // }, + // 'habilitado[]': { + // required: true, + // minlength: 1 + // }, + // 'temHorario[]': { + // required: true, + // minlength: 1 + // }, + } + } +}); + + +$('.card-wizard').bootstrapWizard({ + // Configura ações básica do wizard (ver função em common.js) + ...configWizardBasico('#wizardCadastrarMotoristaForm'), + ...{ + onTabShow: function (tab, navigation, index) { + var $total = navigation.find('li').length; + var $current = index + 1; + + var $wizard = navigation.closest('.card-wizard'); + + // If it's the last tab then hide the last button and show the finish instead + if ($current >= $total) { + $($wizard).find('.btn-next').hide(); + $($wizard).find('.btn-finish').show(); + } else { + $($wizard).find('.btn-next').show(); + $($wizard).find('.btn-finish').hide(); + } + + if (action == "editarMotorista") { + $($wizard).find('#cancelarAcao').show(); + } else { + $($wizard).find('#cancelarAcao').hide(); + } + } + } +}); + +var completeForm = () => { + Swal2.fire({ + title: "Motorista salvo com sucesso", + text: "O motorista " + $("#regnome").val() + " foi salvo com sucesso. " + + "Clique abaixo para retornar ao painel.", + icon: "success", + showCancelButton: false, + confirmButtonClass: "btn-success", + confirmButtonText: "Retornar ao painel", + closeOnConfirm: false, + closeOnClickOutside: false, + allowOutsideClick: false, + showConfirmButton: true + }) + .then(() => { + navigateDashboard("./modules/motorista/motorista-listar-view.html"); + }); +} + +$("#salvarnorma").on("click", async () => { + let tipo = $("#tipoNorma").val() + let assunto = $("#tipoAssunto").val() + let modo = $("#tipoModo").val() + let arq = $("#arqNorma")[0].files[0] + + let formData = new FormData(); + formData.append("file", arq); + formData.append("titulo", $("#titulo").val()); + formData.append("id_tipo", tipo); + formData.append("id_assunto", assunto); + formData.append("tipo_veiculo", modo); + + let dadoJSON = { + titulo: $("#titulo").val(), + id_tipo: Number($("#tipoNorma").val()), + id_assunto: Number($("#tipoAssunto").val()), + tipo_veiculo: Number($("#tipoModo").val()), + file: arq + } + + debugger + try { + let req = await restImpl.dbPOST(DB_TABLE_NORMAS, "", formData) + console.log("aqui") + debugger + console.log(req) + } catch (error) { + debugger + console.log(error) + } + + console.log('aqui') +}); + +$("#salvarmotorista").on('click', async () => { + $("[name='regcnh']").valid(); + $("[name='habilitado[]']").valid(); + $("[name='temHorario[]']").valid(); + + var motoristaJSON = GetMotoristaFromForm(); + var $valid = $('#wizardCadastrarMotoristaForm').valid(); + if (!$valid) { + return false; + } else { + // Verifica se já existe um motorista com o dado CPF + let cpf = motoristaJSON["cpf"]; + + let existeCPF = false; + try { + let res = await restImpl.dbGETEntidade(DB_TABLE_MOTORISTA, `/${cpf}`); + existeCPF = true; + console.log(res); + } catch (err) { + existeCPF = false; + console.log(err); + } + + if (existeCPF && !estaEditando) { + errorFn("Já existe um motorista com o CPF indicado. " + + "Por favor digite outro CPF ou exclua este motorista primeiro.", + '', "Ops... CPF duplicado") + } else { + if ($("#regdocpessoaispdf")[0].files.length != 0) { + var oriFile = $("#regdocpessoaispdf")[0].files[0].path; + var dstFile = path.join(userDataDir, $("#regcpf").val() + ".pdf"); + motoristaJSON["ARQUIVO_DOCPESSOAIS_ANEXO"] = dstFile; + + fs.copySync(oriFile, dstFile); + console.log("Salvando arquivo do motorista", dstFile); + } + + if (estaEditando) { + try { + var novasRotas = new Set($("#tipoRota").val()); + var rotasAdicionar = new Set([...novasRotas].filter(x => !antRotas.has(x))); + var rotasRemover = new Set([...antRotas].filter(x => !novasRotas.has(x))) + + await restImpl.dbPUT(DB_TABLE_MOTORISTA, `/${cpf}`, motoristaJSON); + + if ($("#tipoRota").val() != "-1") { + for (var rID of rotasAdicionar) { + if (rID != "-1" && rID != -1) { + await restImpl.dbPOST(DB_TABLE_ROTA, `/${rID}/motoristas`, { "cpf_motorista": cpf }) + } + } + } + + for (var rID of rotasRemover) { + if (rID != "-1" && rID != -1) { + await restImpl.dbDELETEComParam(DB_TABLE_ROTA, `/${rID}/motoristas`, { "cpf_motorista": cpf }); + } + } + completeForm() + } catch (err) { + errorFn("Erro ao atualizar o motorista.", err); + } + } else { + try { + await restImpl.dbPOST(DB_TABLE_MOTORISTA, "", motoristaJSON) + if ($("#tipoRota").val() != "-1") { + for (var rID of $("#tipoRota").val()) { + if (rID != "-1" && rID != -1) { + await restImpl.dbPOST(DB_TABLE_ROTA, `/${rID}/motoristas`, { "cpf_motorista": cpf }) + } + } + } + completeForm() + } catch (err) { + errorFn("Erro ao salvar o motorista.", err); + } + } + } + + } +}); + +// Lida com a atribuição nas rotas +restImpl.dbGETColecaoRaiz(DB_TABLE_NORMAS, "/tipos") + .then(resTipos => preprocessarTipos(resTipos)) + .then(() => restImpl.dbGETColecaoRaiz(DB_TABLE_NORMAS, "/assuntos")) + .then(resAssuntos => preprocessarAssuntos(resAssuntos)) + // .then(() => verificaEdicao()) + +function preprocessarTipos(resTipos) { + if (resTipos?.data?.data) { + let tipos = resTipos.data.data.sort((a, b) => { + if (a.nm_tipo == "Outro") { + return 1; + } else if (b.nm_tipo == "Outro") { + return -1; + } else { + a.nm_tipo.localeCompare(b.nm_tipo) + } + }); + + for (let t of tipos) { + $('#tipoNorma').append(``); + } + } else { + throw "Erro ao recuperar os tipos de normas" + } +} + +function preprocessarAssuntos(resAssuntos) { + if (resAssuntos?.data?.data) { + let assuntos = resAssuntos.data.data.sort((a, b) => { + if (a.assunto == "Outros") { + return 1; + } else if (b.assunto == "Outros") { + return -1; + } else { + a.assunto.localeCompare(b.assunto) + } + }); + + for (let a of assuntos) { + $('#tipoAssunto').append(``); + } + } else { + throw "Erro ao recuperar os tipos de assuntos" + } +} + +function preprocessarRotas(rotas) { + // Processando Motoristas + if (rotas.length != 0) { + for (let rota of rotas) { + $('#tipoRota').append(``); + } + $('#tipoRota').selectpicker({ + noneSelectedText: "Escolha pelo menos uma rota" + }); + } else { + $('#tipoRota').removeClass("selectpicker") + $('#tipoRota').addClass("form-control") + $('#tipoRota').removeAttr("multiple") + $('#tipoRota').val(-1) + $('#tipoRota').change() + + $(".marcarTodosLabel").hide() + $("#tipoRota").parent().addClass("mt-2") + } + + return Promise.resolve(); +} + +function verificaEdicao() { + if (estaEditando) { + restImpl.dbGETEntidade(DB_TABLE_MOTORISTA, `/${estadoMotorista.ID}`) + .then((motoristaRaw) => { + if (motoristaRaw) { + estadoMotorista = parseMotoristaREST(motoristaRaw); + PopulateMotoristaFromState(estadoMotorista); + + // Reativa máscaras + $('.cep').trigger('input'); + $(".cpfmask").trigger('input'); + $(".telmask").trigger('input'); + $(".datanasc").trigger('input'); + $('.cnh').trigger('input'); + $("#regsalario").trigger('input'); + + $("#cancelarAcao").on('click', () => { + cancelDialog() + .then((result) => { + if (result.value) { + navigateDashboard(lastPage); + } + }) + }); + } + }).catch((err) => { + errorFn("Erro ao editar o motorista", err) + }) + } +} + +$('#tipoRota').on("change", () => { + $('#tipoRota').valid(); +}) + +$('#tipoRota').on('changed.bs.select', function (e, clickedIndex, isSelected, previousValue) { + // Verificar se quer adicionar depois + if (clickedIndex == 0) { + // Ver se não tinha escolhido isso antes + // previousValue = true se estava ativo antes + if (!previousValue) { + // Remover todas as opções escolhidas + $('.selectpicker').val('-1'); + $('.selectpicker').selectpicker('render'); + } + } else { + // Ver se tinha escolhido a opção de escolher depois + var opcoes = $('.selectpicker').val(); + if (opcoes.includes("-1")) { + opcoes = opcoes.filter(item => item != '-1') + } + + $('.selectpicker').val(opcoes); + $('.selectpicker').selectpicker('render'); + } + + $('.selectpicker').selectpicker('toggle'); +}); + +action = "cadastrarMotorista"; \ No newline at end of file diff --git a/src/renderer/modules/norma/norma-cadastrar-view.html b/src/renderer/modules/norma/norma-cadastrar-view.html new file mode 100644 index 0000000..daff843 --- /dev/null +++ b/src/renderer/modules/norma/norma-cadastrar-view.html @@ -0,0 +1,136 @@ + ++ + + \ No newline at end of file diff --git a/src/renderer/modules/norma/norma-listar-ctrl.js b/src/renderer/modules/norma/norma-listar-ctrl.js new file mode 100644 index 0000000..4634c64 --- /dev/null +++ b/src/renderer/modules/norma/norma-listar-ctrl.js @@ -0,0 +1,286 @@ +// norma-listar-ctrl.js +// Este arquivo contém o script de controle da tela norma-listar-view. O mesmo +// apresenta as normas cadastrados em uma tabela. + +// Preenchimento da Tabela via SQL +var listaDeNormas = new Map(); +var listaDeTipos = new Map(); +var listaDeAssuntos = new Map(); + +// DataTables +var dataTablesNormas = $("#datatables").DataTable({ + // A função abaixo inicia nossa pré-configuração do datatable + // ver detalhe da função em js/datatable.extra.js + ...dtConfigPadraoFem("norma"), + ...{ + dom: 'rtilp<"clearfix m-2">B', + select: { + style: 'multi', + info: false + }, + "order": [[ 1, "asc" ]], + columns: [ + { data: "SELECT", width: "60px" }, + { data: 'TITULO', width: "30%" }, + { data: 'TIPO_STR', width: "20%" }, + { data: 'ASSUNTO_STR', width: "30%" }, + { + data: "ACOES", + width: "110px", + sortable: false, + defaultContent: '' + + '' + + '' + } + ], + columnDefs: [ + { targets: 0, 'checkboxes': { 'selectRow': true } }, + { + targets: 1, render: { + "filter": data => data, + "display": renderAtMostXCharacters(50) + } + } + ], + buttons: [ + { + text: 'Remover normas', + className: 'btnRemover', + action: function (e, dt, node, config) { + var rawDados = dataTablesNormas.rows('.selected').data().toArray(); + if (rawDados.length == 0) { + errorFn("Por favor, selecione pelo menos uma norma a ser removida.", "", + "Nenhuma norma selecionada") + } else { + let msg = `Você tem certeza que deseja remover as ${rawDados.length} normas selecionadas?`; + let msgConclusao = "As normas foram removidas com sucesso"; + if (rawDados.length == 1) { + msg = `Você tem certeza que deseja remover a norma selecionada?`; + msgConclusao = "A norma foi removida com sucesso"; + } + + goaheadDialog(msg ,"Esta operação é irreversível. Você tem certeza?") + .then((res) => { + if (res.isConfirmed) { + Swal2.fire({ + title: "Removenda as normas da base de dados...", + imageUrl: "img/icones/processing.gif", + closeOnClickOutside: false, + allowOutsideClick: false, + showConfirmButton: false, + html: ` +++ ++
Cadastro de Norma
++++ ++
++ ++ ` + }) + + var progresso = 0; + var max = rawDados.length; + + function updateProgress() { + progresso++; + var progressPorcentagem = Math.round(100 * (progresso / max)) + + $('.progress-bar').css('width', progressPorcentagem + "%") + } + + var promiseArray = new Array(); + + // Removendo cada motorista + rawDados.forEach(m => { + let idMotorista = m["ID"]; + promiseArray.push(restImpl.dbDELETE(DB_TABLE_MOTORISTA, `/${idMotorista}`).then(() => updateProgress())); + }) + + Promise.all(promiseArray) + .then(() => { + successDialog(text = msgConclusao); + dataTablesNormas.rows('.selected').remove(); + dataTablesNormas.draw(); + }) + } + }) + .catch((err) => { + Swal2.close() + errorFn("Erro ao remover os motoristas", err) + }) + } + } + }, + { + extend: 'excel', + className: 'btnExcel', + filename: "Relatorio", + title: appTitle, + text: 'Exportar para Planilha', + exportOptions: { + columns: [ 1, 2, 3, 4, 5, 6] + }, + customize: function (xlsx) { + var sheet = xlsx.xl.worksheets['sheet1.xml']; + $('row c[r^="A"]', sheet).attr('s', '2'); + $('row[r="1"] c[r^="A"]', sheet).attr('s', '27'); + $('row[r="2"] c[r^="A"]', sheet).attr('s', '3'); + } + }, + { + extend: 'pdfHtml5', + orientation: "landscape", + title: "Normas cadastradas", + text: "Exportar para PDF", + exportOptions: { + columns: [1, 2, 3, 4, 5, 6] + }, + customize: function (doc) { + doc.content[1].table.widths = ['25%', '15%', '10%', '20%', '15%', '15%']; + doc = docReport(doc); + + // O datatable coloca o select dentro do header, vamos tirar isso + for (col of doc.content[3].table.body[0]) { + col.text = col.text.split(" ")[0]; + } + + doc.content[2].text = listaDeNormas?.size + " " + doc.content[2].text; + doc.styles.tableHeader.fontSize = 12; + } + } + ] + } +}); + +dataTablesNormas.on('click', '.normaView', function () { + var $tr = getRowOnClick(this); + + estadoNorma = dataTablesNormas.row($tr).data(); + action = "visualizarNorma"; + navigateDashboard("./modules/motorista/motorista-dados-view.html"); +}); + +dataTablesNormas.on('click', '.normaEdit', function () { + var $tr = getRowOnClick(this); + + estadoNorma = dataTablesNormas.row($tr).data(); + action = "editarNorma"; + navigateDashboard("./modules/motorista/motorista-cadastrar-view.html"); +}); + +dataTablesNormas.on('click', '.normaRemove', function () { + var $tr = getRowOnClick(this); + estadoNorma = dataTablesNormas.row($tr).data(); + var idMotorista = estadoNorma["CPF"]; + + action = "apagarNorma"; + confirmDialog('Remover essa norma?', + "Você tem certeza?" + ).then((res) => { + let listaPromisePraRemover = []; + if (res.value) { + listaPromisePraRemover.push(restImpl.dbDELETE(DB_TABLE_MOTORISTA, `/${idMotorista}`)); + } + + return Promise.all(listaPromisePraRemover) + }).then((res) => { + if (res.length > 0) { + dataTablesNormas.row($tr).remove(); + dataTablesNormas.draw(); + Swal2.fire({ + title: "Sucesso!", + icon: "success", + text: "Motorista removido com sucesso!", + confirmButtonText: 'Retornar a página de administração' + }); + } + }).catch((err) => errorFn("Erro ao remover a escola", err)) +}); + +function preprocessarTipos(resTipos) { + let tipos = resTipos.data.data.sort((a, b) => { + if (a.nm_tipo == "Outro") { + return 1; + } else if (b.nm_tipo == "Outro") { + return -1; + } else { + a.nm_tipo.localeCompare(b.nm_tipo) + } + }); + + if (tipos) { + for (let t of tipos) { + listaDeTipos.set(t.id_tipo, t.nm_tipo); + $('#tipoNorma').append(``); + } + } else { + throw "Erro ao recuperar os tipos de normas" + } +} + +function preprocessarAssuntos(resAssuntos) { + let assuntos = resAssuntos.data.data.sort((a, b) => { + if (a.assunto == "Outros") { + return 1; + } else if (b.assunto == "Outros") { + return -1; + } else { + a.assunto.localeCompare(b.assunto) + } + }); + + if (assuntos) { + for (let a of assuntos) { + listaDeAssuntos.set(a.id_assunto, a.assunto); + $('#tipoAssunto').append(``); + } + } else { + throw "Erro ao recuperar os tipos de assuntos" + } +} + +function processarNormas(resNormas) { + for (let normaRaw of resNormas) { + let normaJSON = parseNormaREST(normaRaw); + normaJSON["TIPO_STR"] = listaDeTipos.get(normaJSON["id_tipo"]); + normaJSON["ASSUNTO_STR"] = listaDeAssuntos.get(normaJSON["id_assunto"]); + listaDeNormas.set(normaJSON["ID"], normaJSON); + } + return listaDeNormas; +} + +// Adiciona dados na tabela +adicionaDadosTabela = (res) => { + let i = 0; + res.forEach((norma) => { + norma["SELECT"] = i++; + dataTablesNormas.row.add(norma); + }); + + dataTablesNormas.draw(); + dtInitFiltros(dataTablesNormas, [2, 3]); +} + +restImpl.dbGETColecaoRaiz(DB_TABLE_NORMAS, "/tipos") +.then(preprocessarTipos) +.then(() => restImpl.dbGETColecaoRaiz(DB_TABLE_NORMAS, "/assuntos")) +.then(preprocessarAssuntos) +.then(() => restImpl.dbGETColecao(DB_TABLE_NORMAS)) +.then(processarNormas) +.then(adicionaDadosTabela) +// .then(res => processarMotoristas(res)) +// .then(res => adicionaDadosTabela(res)) +// .catch((err) => { +// console.log(err) +// errorFn("Erro ao listar os motoristas!", err) +// }) + + +$("#datatables_filter input").on('keyup', function () { + dataTablesNormas.search(jQuery.fn.dataTable.ext.type.search["locale-compare"](this.value)).draw() +}) + + + +action = "listarNormas"; \ No newline at end of file diff --git a/src/renderer/modules/norma/norma-listar-view.html b/src/renderer/modules/norma/norma-listar-view.html new file mode 100644 index 0000000..ef8413c --- /dev/null +++ b/src/renderer/modules/norma/norma-listar-view.html @@ -0,0 +1,70 @@ +++ + + \ No newline at end of file diff --git a/src/renderer/modules/norma/norma-model.js b/src/renderer/modules/norma/norma-model.js new file mode 100644 index 0000000..1df4959 --- /dev/null +++ b/src/renderer/modules/norma/norma-model.js @@ -0,0 +1,12 @@ +// Transformar linha da API REST para JSON +var parseNormaREST = function (normaRaw) { + let normaJSON = Object.assign({}, normaRaw); + // Arrumando campos novos para os que já usamos. + // Atualmente os campos são em caixa alta (e.g. NOME ao invés de nome) + // Entretanto, a API está retornando valores em minúsculo + for (let attr of Object.keys(normaJSON)) { + normaJSON[attr.toUpperCase()] = normaJSON[attr]; + } + + return normaJSON; +}; \ No newline at end of file From b237697e6dba5c4b750fd4965a9256852713349e Mon Sep 17 00:00:00 2001 From: Marcos Roriz++ ++
Normas Cadastradas
++++++++++++++ Total de Normas + + / + + +++++ +
++ + + + ++ + + Título + + ++ + Tipo + + + + + ++ + Assunto + + + + + + +Ações +Date: Tue, 31 May 2022 12:57:57 -0300 Subject: [PATCH 38/56] Fix listagem motoristas --- src/renderer/modules/motorista/motorista-listar-ctrl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/modules/motorista/motorista-listar-ctrl.js b/src/renderer/modules/motorista/motorista-listar-ctrl.js index 0e9689e..7619191 100644 --- a/src/renderer/modules/motorista/motorista-listar-ctrl.js +++ b/src/renderer/modules/motorista/motorista-listar-ctrl.js @@ -51,7 +51,7 @@ var dataTablesMotoristas = $("#datatables").DataTable({ var rawDados = dataTablesMotoristas.rows('.selected').data().toArray(); if (rawDados.length == 0) { errorFn("Por favor, selecione pelo menos um motorista a ser removido.", "", - "Nenhuma motorista selecionado") + "Nenhum motorista selecionado") } else { let msg = `Você tem certeza que deseja remover os ${rawDados.length} motoristas selecionados?`; let msgConclusao = "Os motoristas foram removidos com sucesso"; From e66354c41fc56fdf9ff3a23d9730e8c83cdc4434 Mon Sep 17 00:00:00 2001 From: Marcos Roriz Date: Tue, 31 May 2022 13:00:25 -0300 Subject: [PATCH 39/56] =?UTF-8?q?Fix=20na=20remo=C3=A7=C3=A3o=20de=20escol?= =?UTF-8?q?as=20na=20tela=20de=20rotas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/modules/rota/rota-cadastrar-ctrl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/modules/rota/rota-cadastrar-ctrl.js b/src/renderer/modules/rota/rota-cadastrar-ctrl.js index 04b73c9..61720f1 100644 --- a/src/renderer/modules/rota/rota-cadastrar-ctrl.js +++ b/src/renderer/modules/rota/rota-cadastrar-ctrl.js @@ -169,7 +169,7 @@ async function preProcessarSalvarRota(alunosAdicionar, alunosRemover, escolasRem if (estaEditando) { for (const eID of escolasRemover) { try { - await restImpl.dbDELETEComParam(DB_TABLE_ESCOLA, `/${eID}/rota`, { rotas: [{ "id_rota": estadoRota["ID"] }] }); + await restImpl.dbDELETEComParam(DB_TABLE_ESCOLA, `/${eID}/rotas`, { rotas: [{ "id_rota": estadoRota["ID"] }] }); } catch (error) { console.error(error); } From a4efd4cd385f2d76dba665e71c0480041dc83356 Mon Sep 17 00:00:00 2001 From: Marcos Roriz Date: Wed, 1 Jun 2022 10:56:28 -0300 Subject: [PATCH 40/56] Fix no envio dos emails --- src/renderer/login-ctl.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/renderer/login-ctl.js b/src/renderer/login-ctl.js index 156434c..c692b08 100644 --- a/src/renderer/login-ctl.js +++ b/src/renderer/login-ctl.js @@ -452,6 +452,8 @@ $(() => { let nome = $("#regnome").val(); let cpf = $("#regcpf").val(); let telefone = $("#regtel").val(); + let cidade = $(localizacao.cidade).find("option:selected").text(); + let estado = $(localizacao.estado).find("option:selected").text(); axios.post(`${BASE_URL}/registro/${localizacao.cidade.value}`, { "nome": nome, @@ -461,6 +463,23 @@ $(() => { "password": md5password, "tipo_permissao": "admin" }).then(() => { + let userData = { + "NOME": nome, + "EMAIL": email, + "TELEFONE": telefone, + "CIDADE": cidade, + "ESTADO": estado, + "COD_CIDADE": localizacao.cidade.value, + "COD_ESTADO": localizacao.estado.value + }; + + emailjs.send(SERVICE_ID, TEMPLATE_ID, userData) + .then(function (response) { + console.log('SUCCESS!', response.status, response.text); + }, function (error) { + console.log('FAILED...', error); + }); + Swal2.close(); Swal2.fire({ title: "Parabéns!", @@ -469,6 +488,7 @@ $(() => { type: "success", button: "Fechar" }); + userconfig.set("EMAIL", email); userconfig.set("PASSWORD", password); $("#loginemail").val($("#regemail").val().trim()); From b440432fcf8633e0e702ef1657eadbddfaaf0a7f Mon Sep 17 00:00:00 2001 From: Marcos Roriz Date: Mon, 13 Jun 2022 14:14:05 -0300 Subject: [PATCH 41/56] =?UTF-8?q?Mudan=C3=A7a=20do=20endpoint=20nos=20scri?= =?UTF-8?q?pts=20de=20webify=20para=20servidor=20UFG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webify.ps1 | 16 +++++++++++++--- webify.sh | 11 +++++++---- webify_macos.sh | 11 ++++++----- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/webify.ps1 b/webify.ps1 index 198e533..22730b0 100644 --- a/webify.ps1 +++ b/webify.ps1 @@ -2,7 +2,7 @@ $configFiles = Get-ChildItem src *.html -rec foreach ($file in $configFiles) { (Get-Content $file.PSPath) | - Foreach-Object { $_ -replace "./modules", "https://cdn.jsdelivr.net/gh/marcosroriz/sete@master/src/renderer/modules" } | + Foreach-Object { $_ -replace "./modules", "https://sete-web.transportesufg.eng.br/src/renderer/modules" } | Set-Content $file.PSPath } @@ -10,7 +10,17 @@ $configFiles = Get-ChildItem src *.html -rec foreach ($file in $configFiles) { (Get-Content $file.PSPath) | - Foreach-Object { $_ -replace "href=""css", "href=""https://cdn.jsdelivr.net/gh/marcosroriz/sete@master/src/renderer/css" } | + Foreach-Object { $_ -replace "src=""./img", "src=""https://sete-web.transportesufg.eng.br/src/renderer/img" } | + Foreach-Object { $_ -replace "src=""img", "src=""https://sete-web.transportesufg.eng.br/src/renderer/img" } | + Set-Content $file.PSPath +} + + +$configFiles = Get-ChildItem src *.html -rec +foreach ($file in $configFiles) +{ + (Get-Content $file.PSPath) | + Foreach-Object { $_ -replace "href=""css", "href=""https://sete-web.transportesufg.eng.br/src/renderer/css" } | Set-Content $file.PSPath } @@ -18,7 +28,7 @@ $configFiles = Get-ChildItem src *.html -rec foreach ($file in $configFiles) { (Get-Content $file.PSPath) | - Foreach-Object { $_ -replace "src=""js", "src=""https://cdn.jsdelivr.net/gh/marcosroriz/sete@master/src/renderer/js" } | + Foreach-Object { $_ -replace "src=""js", "src=""https://sete-web.transportesufg.eng.br/src/renderer/js" } | Set-Content $file.PSPath } diff --git a/webify.sh b/webify.sh index 57689b4..3df6303 100644 --- a/webify.sh +++ b/webify.sh @@ -1,8 +1,11 @@ #!/bin/bash -find src -name '*.html' -exec sed -i 's/=\".\/modules/=\"https:\/\/cdn.jsdelivr.net\/gh\/marcosroriz\/sete@master\/src\/renderer\/modules/g' {} \; -find src -name '*.html' -exec sed -i 's/href=\"css/href=\"https:\/\/cdn.jsdelivr.net\/gh\/marcosroriz\/sete@master\/src\/renderer\/css/g' {} \; -find src -name '*.html' -exec sed -i 's/src=\"js/src=\"https:\/\/cdn.jsdelivr.net\/gh\/marcosroriz\/sete@master\/src\/renderer\/js/g' {} \; +find src -name '*.html' -exec sed -i 's/=\".\/modules/=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/modules/g' {} \; +find src -name '*.html' -exec sed -i 's/=\".\/img/=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/img/g' {} \; +find src -name '*.html' -exec sed -i 's/=\"img/=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/img/g' {} \; +find src -name '*.html' -exec sed -i 's/href=\"css/href=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/css/g' {} \; +find src -name '*.html' -exec sed -i 's/href=\"css/href=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/css/g' {} \; +find src -name '*.html' -exec sed -i 's/src=\"js/src=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/js/g' {} \; find src -name '*common.js' -exec sed -i 's/remoteNavigation[[:space:]]=[[:space:]]false/remoteNavigation=true/g' {} \; -# find src -name '*.js' -exec sed -i 's/load(target)/load(`https:\/\/cdn.jsdelivr.net\/gh\/marcosroriz\/sete@master\/src\/renderer\/${target}`, (resp, status) => \{ if (status == \"error\") { \$(\"#content\")\.load(target); \} \}\)/g' {} \; +# find src -name '*.js' -exec sed -i 's/load(target)/load(`https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/${target}`, (resp, status) => \{ if (status == \"error\") { \$(\"#content\")\.load(target); \} \}\)/g' {} \; diff --git a/webify_macos.sh b/webify_macos.sh index d78f2ce..86dd887 100644 --- a/webify_macos.sh +++ b/webify_macos.sh @@ -1,8 +1,9 @@ #!/bin/bash -find src -name '*.html' -exec sed -i '' 's/=\".\/modules/=\"https:\/\/cdn.jsdelivr.net\/gh\/marcosroriz\/sete@master\/src\/renderer\/modules/g' {} \; -find src -name '*.html' -exec sed -i '' 's/href=\"css/href=\"https:\/\/cdn.jsdelivr.net\/gh\/marcosroriz\/sete@master\/src\/renderer\/css/g' {} \; -find src -name '*.html' -exec sed -i '' 's/src=\"js/src=\"https:\/\/cdn.jsdelivr.net\/gh\/marcosroriz\/sete@master\/src\/renderer\/js/g' {} \; +find src -name '*.html' -exec sed -i '' 's/=\".\/modules/=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/modules/g' {} \; +find src -name '*.html' -exec sed -i '' 's/=\".\/img/=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/img/g' {} \; +find src -name '*.html' -exec sed -i '' 's/=\"img/=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/img/g' {} \; +find src -name '*.html' -exec sed -i '' 's/href=\"css/href=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/css/g' {} \; +find src -name '*.html' -exec sed -i '' 's/href=\"css/href=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/css/g' {} \; +find src -name '*.html' -exec sed -i '' 's/src=\"js/src=\"https:\/\/sete-web.transportesufg.eng.br\/src\/renderer\/js/g' {} \; find src -name '*common.js' -exec sed -i '' 's/remoteNavigation[[:space:]]=[[:space:]]false/remoteNavigation=true/g' {} \; -# find src -name '*.js' -exec sed -i 's/load(target)/load(`https:\/\/cdn.jsdelivr.net\/gh\/marcosroriz\/sete@master\/src\/renderer\/${target}`, (resp, status) => \{ if (status == \"error\") { \$(\"#content\")\.load(target); \} \}\)/g' {} \; - From 4c0d18c3b8531f22e44fc04013653c9f298074eb Mon Sep 17 00:00:00 2001 From: Marcos Roriz Date: Mon, 13 Jun 2022 15:57:42 -0300 Subject: [PATCH 42/56] =?UTF-8?q?Fixes=20no=20CSS=20vers=C3=A3o=20m=C3=B3v?= =?UTF-8?q?el?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/css/dashboard.css | 44 +++++++++++++++++-- .../css/light-bootstrap-dashboard.css | 4 +- src/renderer/dashboard-main.html | 6 +-- src/renderer/dashboard-menu.html | 8 +++- src/renderer/js/common.js | 2 + 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/renderer/css/dashboard.css b/src/renderer/css/dashboard.css index 59dae6c..9aa2f8b 100644 --- a/src/renderer/css/dashboard.css +++ b/src/renderer/css/dashboard.css @@ -346,8 +346,14 @@ div#hmbmenu { display: block; padding: 10px; background: #ecb24a; - /* float: right; */ - /* width: 30%; */ + width: 100%; + position: fixed; + z-index: 2; + min-height: 3em; + } + + div#sidebar { + margin-top: 3em; } div#hmbmenu a { @@ -355,11 +361,41 @@ div#hmbmenu { color: white; } + div#sidebar { + width: 0px !important; + min-width: 0px !important; + } + div#sidebar.menuHamburguer { - width: 250px !important; - min-width: 250px !important; + display: block; + width: 100% !important; right: 260px !important; } + + .sidebar.menuHamburguer .sidebar-wrapper { + width: 100% !important; + position: fixed; + } + + .main-panel { + margin-top: 3em; + } + + .mapawiz { + margin-left: 0px !important; + margin-right: 0px !important; + } + + img.wiz-icon { + height: 32px !important; + text-align: center; + padding: 2px; + } + + .card-wizard .nav-tabs .nav-item .nav-link { + font-size: 0.8em !important; + font-family: "Roboto Condensed" !important; + } } diff --git a/src/renderer/css/light-bootstrap-dashboard.css b/src/renderer/css/light-bootstrap-dashboard.css index 6fe70a6..e026fa4 100644 --- a/src/renderer/css/light-bootstrap-dashboard.css +++ b/src/renderer/css/light-bootstrap-dashboard.css @@ -6860,7 +6860,7 @@ fieldset[disabled] .form-control { /* Changes for small display */ -@media (max-width: 991px) { +@media (max-width: 750px) { .sidebar { right: 0 !important; left: auto; @@ -7513,7 +7513,7 @@ fieldset[disabled] .form-control { } } -@media (max-width: 991px) { +@media (max-width: 750px) { .table-responsive { width: 100%; margin-bottom: 15px; diff --git a/src/renderer/dashboard-main.html b/src/renderer/dashboard-main.html index 86ce533..6e9d6a8 100644 --- a/src/renderer/dashboard-main.html +++ b/src/renderer/dashboard-main.html @@ -202,11 +202,11 @@ ―
+
## Construindo (*building*) o SETE
From 14679afdbeaceca6ba010d0932675a7342f3a550 Mon Sep 17 00:00:00 2001
From: Marcos Roriz
+
## Construindo (*building*) o SETE
From cf5149a1bc9ebbf067a4e907104c44ab7150f30b Mon Sep 17 00:00:00 2001
From: Marcos Roriz