GRH_2020.sql 146 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440
/*
    **********************************************************************************
    *                                                                                *
    * @package URBEM CNM - Soluções em Gestão Pública                                *
    * @copyright (c) 2013 Confederação Nacional de Municípos                         *
    * @author Confederação Nacional de Municípios                                    *
    *                                                                                *
    * O URBEM CNM é um software livre; você pode redistribuí-lo e/ou modificá-lo sob *
    * os  termos  da Licença Pública Geral GNU conforme  publicada  pela Fundação do *
    * Software Livre (FSF - Free Software Foundation); na versão 2 da Licença.       *
    *                                                                                *
    * Este  programa  é  distribuído  na  expectativa  de  que  seja  útil,   porém, *
    * SEM NENHUMA GARANTIA; nem mesmo a garantia implícita  de  COMERCIABILIDADE  OU *
    * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral do GNU *
    * para mais detalhes.                                                            *
    *                                                                                *
    * Você deve ter recebido uma cópia da Licença Pública Geral do GNU "LICENCA.txt" *
    * com  este  programa; se não, escreva para  a  Free  Software Foundation  Inc., *
    * no endereço 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.       *
    *                                                                                *
    **********************************************************************************
*/
/*
*
* Script de DDL e DML
*
* Versao 2.02.0
*
* Fabio Bertoldi - 20121001
*
*/

CREATE OR REPLACE FUNCTION atualizarBanco(VARCHAR) RETURNS BOOLEAN as $$
DECLARE
    stSqlParametro              ALIAS FOR $1;
    inExercicio                 INTEGER;
    inCodEntidadePrefeitura     INTEGER;    
    stSql                       VARCHAR;
    stInsert                    VARCHAR;
    stBanco                     VARCHAR;
    stEntidade                  VARCHAR;
    stNomeSchema                VARCHAR;
    stNomeTriger                VARCHAR;
    stArray                     VARCHAR[];
    boEsquema                   BOOLEAN:=FALSE;
    boTrigger                   BOOLEAN:=FALSE;
    boGranteEsquema             BOOLEAN:=FALSE;
    boRetorno                   BOOLEAN;
    reRegistro                  RECORD;
    reSchema                    RECORD;
BEGIN
    EXECUTE stSqlParametro;

    inExercicio := selectIntoInteger('SELECT valor FROM administracao.configuracao WHERE parametro = ''ano_exercicio'' ORDER BY exercicio desc LIMIT 1');
    inCodEntidadePrefeitura := selectIntoInteger('SELECT valor::integer as valor
                                                    FROM administracao.configuracao
                                                   WHERE parametro = ''cod_entidade_prefeitura''
                                                     AND exercicio = '|| quote_literal(inExercicio) ||' ');


    IF strpos(trim(upper(stSqlParametro)),upper('CREATE SCHEMA')) > 0 THEN
        boEsquema    := TRUE;
        stNomeSchema := trim(translate(stSqlParametro,'CREATE SCHEMA ;',''));
        stInsert     := 'INSERT INTO administracao.schema_rh (schema_cod,schema_nome) VALUES ((SELECT max(schema_cod) FROM administracao.schema_rh)+1,'|| quote_literal(stNomeSchema) ||')';      
        EXECUTE stInsert;
        
        stSql := 'SELECT TRUE as retorno
                    FROM administracao.entidade_rh
                   WHERE cod_entidade = '|| inCodEntidadePrefeitura ||'
                   LIMIT 1';
        boRetorno := selectIntoBoolean(stSql);
        IF boRetorno IS TRUE THEN
            stInsert := 'INSERT INTO administracao.entidade_rh (exercicio,cod_entidade,schema_cod) 
                         VALUES
                         ('|| quote_literal(inExercicio) ||','|| inCodEntidadePrefeitura ||',(SELECT max(schema_cod) FROM administracao.schema_rh))';
            EXECUTE stInsert;
        END IF;
    END IF;
    IF strpos(trim(upper(stSqlParametro)),upper('CREATE TRIGGER')) > 0 THEN
        boTrigger    := TRUE;
        stArray      := string_to_array( stSqlParametro, ' ');
        stNomeTriger := stArray[3];
    END IF;
    IF strpos(trim(upper(stSqlParametro)),upper('GRANT ALL ON SCHEMA')) > 0 THEN
        boGranteEsquema := TRUE;
        stArray         := string_to_array( stSqlParametro, ' ');
        stNomeSchema    := stArray[5];
    END IF;

    stSql := '  SELECT entidade.cod_entidade
                  FROM orcamento.entidade
                 WHERE exercicio = '|| quote_literal(inExercicio) ||'
                   AND cod_entidade IN (SELECT cod_entidade
                                          FROM administracao.entidade_rh
                                         WHERE exercicio = '|| quote_literal(inExercicio) ||'
                                        GROUP BY cod_entidade)
                   AND cod_entidade != ('|| inCodEntidadePrefeitura ||')';
    FOR reRegistro IN EXECUTE stSql LOOP
        stBanco := stSqlParametro;        
        IF boEsquema THEN
            stBanco := trim(replace(stSqlParametro,';','')) ||'_'|| reRegistro.cod_entidade ||';';

            stInsert := 'INSERT INTO administracao.entidade_rh (exercicio,cod_entidade,schema_cod) 
                         VALUES
                         ('|| quote_literal(inExercicio) ||','|| reRegistro.cod_entidade ||',(SELECT max(schema_cod) FROM administracao.schema_rh))';
            EXECUTE stInsert;
        ELSIF boTrigger THEN
            stBanco := trim(replace(stSqlParametro,stNomeTriger,stNomeTriger ||'_'|| reRegistro.cod_entidade));
            stSql := 'SELECT * FROM administracao.schema_rh';
            FOR reSchema IN EXECUTE stSql LOOP
                stBanco := replace(stBanco,' '|| reSchema.schema_nome ||'.',' '|| reSchema.schema_nome ||'_'|| reRegistro.cod_entidade ||'.');
            END LOOP;
        ELSIF boGranteEsquema THEN
            stBanco := replace(stBanco, stNomeSchema,' '|| stNomeSchema ||'_'|| reRegistro.cod_entidade);
        ELSE 
            stSql := 'SELECT * FROM administracao.schema_rh';
            FOR reSchema IN EXECUTE stSql LOOP
                stBanco := replace(stBanco,' '|| reSchema.schema_nome ||'.',' '|| reSchema.schema_nome ||'_'|| reRegistro.cod_entidade ||'.');
            END LOOP;
        END IF;
        EXECUTE stBanco;
    END LOOP;
    RETURN TRUE;
END;
$$ LANGUAGE 'plpgsql';


--------------------------------------------
-- CRIANDO TABELA concurso.atributo_concurso
--------------------------------------------

SELECT atualizarbanco('
CREATE TABLE concurso.atributo_concurso(
    cod_cadastro    INTEGER     NOT NULL,
    cod_atributo    INTEGER     NOT NULL,
    ativo           BOOLEAN     NOT NULL,
    CONSTRAINT pk_atributo_condurso     PRIMARY KEY (cod_cadastro, cod_atributo)
);
');
SELECT atualizarbanco('GRANT ALL ON concurso.atributo_concurso TO urbem;');


----------------
-- Ticket #20140
----------------

UPDATE administracao.acao           SET ativo = FALSE WHERE cod_acao = 1739;
UPDATE administracao.acao           SET ativo = FALSE WHERE cod_acao = 1737;
UPDATE administracao.funcionalidade SET ativo = FALSE WHERE cod_funcionalidade = 360;


----------------
-- Ticket #16389
----------------

INSERT
  INTO administracao.relatorio
     ( cod_gestao
     , cod_modulo
     , cod_relatorio
     , nom_relatorio
     , arquivo
     )
VALUES
     ( 4
     , 27
     , 29
     , 'Relatório Contra Cheque'
     , 'contraCheque.rptdesign'
     );


----------------
-- Ticket #20507
----------------

UPDATE administracao.acao SET nom_acao = 'Exportação Banco Caixa' WHERE cod_acao = 1969 and cod_funcionalidade = 354;


----------------
-- Ticket #19515
----------------

DROP   TYPE colunasCustomizavelEventos CASCADE;
CREATE TYPE colunasCustomizavelEventos AS (
cod_contrato              INTEGER,
registro                  INTEGER,
nom_cgm                   VARCHAR,
cpf                       VARCHAR,
desc_orgao                VARCHAR,
desc_local                VARCHAR,
desc_funcao               VARCHAR,
desc_cargo                VARCHAR,
desc_especialidade_cargo  VARCHAR,
desc_especialidade_funcao VARCHAR,
desc_padrao               VARCHAR,
valor1                    NUMERIC,
quantidade1               NUMERIC,
quantidade1Parcela        NUMERIC,
valor2                    NUMERIC,
quantidade2               NUMERIC,
quantidade2Parcela        NUMERIC,
valor3                    NUMERIC,
quantidade3               NUMERIC,
quantidade3Parcela        NUMERIC,
valor4                    NUMERIC,
quantidade4               NUMERIC,
quantidade4Parcela        NUMERIC,
valor5                    NUMERIC,
quantidade5               NUMERIC,
quantidade5Parcela        NUMERIC,
valor6                    NUMERIC,
quantidade6               NUMERIC,
quantidade6Parcela        NUMERIC
);


----------------
-- Ticket #19689
----------------

INSERT
  INTO administracao.relatorio
     ( cod_gestao
     , cod_modulo
     , cod_relatorio
     , nom_relatorio
     , arquivo
     )
VALUES
     ( 4
     , 27
     , 30
     , 'Registros de Evento'
     , 'consultarRegistroEvento.rptdesign'
     );


----------------
-- Ticket #15957
----------------

SELECT atualizarbanco('
CREATE TABLE pessoal.contrato_pensionista_caso_causa (
    cod_contrato        INTEGER     NOT NULL,
    dt_rescisao         DATE        NOT NULL,
    timestamp           TIMESTAMP   NOT NULL DEFAULT (''now''::text)::timestamp(3) with time zone,
    cod_caso_causa      INTEGER     NOT NULL,
    inc_folha_salario   BOOLEAN             ,
    inc_folha_decimo    BOOLEAN             ,
    CONSTRAINT pk_contrato_pensionista_caso_causa   PRIMARY KEY                             (cod_contrato),
    CONSTRAINT fk_contrato_pensionista_caso_causa_1 FOREIGN KEY                             (cod_caso_causa)
                                                    REFERENCES pessoal.caso_causa           (cod_caso_causa),
    CONSTRAINT fk_contrato_pensionista_caso_causa_2 FOREIGN KEY                             (cod_contrato)
                                                    REFERENCES pessoal.contrato_pensionista (cod_contrato)
);
');
SELECT atualizarbanco('
GRANT ALL ON pessoal.contrato_pensionista_caso_causa TO urbem;
');

SELECT atualizarbanco('
CREATE TABLE pessoal.causa_obito_pensionista(
    cod_contrato        INTEGER         NOT NULL,
    num_certidao_obito  VARCHAR(10)     NOT NULL,
    causa_mortis        VARCHAR(200)    NOT NULL,
    CONSTRAINT pk_causa_obito_pensionista       PRIMARY KEY (cod_contrato),
    CONSTRAINT fk_causa_obito_pensionista_1     FOREIGN KEY (cod_contrato)
                                                REFERENCES pessoal.contrato_pensionista_caso_causa (cod_contrato)
);
');
SELECT atualizarbanco('
GRANT ALL ON pessoal.causa_obito_pensionista TO urbem;
');

SELECT atualizarbanco('
CREATE TABLE pessoal.contrato_pensionista_caso_causa_norma(
    cod_contrato        INTEGER     NOT NULL,
    cod_norma           INTEGER     NOT NULL,
    CONSTRAINT pk_contrato_pensionista_caso_causa_norma     PRIMARY KEY                                         (cod_contrato),
    CONSTRAINT fk_contrato_pensionista_caso_causa_norma_1   FOREIGN KEY                                         (cod_contrato)
                                                            REFERENCES pessoal.contrato_pensionista_caso_causa  (cod_contrato),
    CONSTRAINT fk_contrato_pensionista_caso_causa_norma_2   FOREIGN KEY                                         (cod_norma)
                                                            REFERENCES normas.norma                             (cod_norma)
);
');
SELECT atualizarbanco('
GRANT ALL ON pessoal.contrato_pensionista_caso_causa_norma TO urbem;
');


----------------
-- Ticket #20422
----------------

DROP   TYPE colunasEventosCalculados CASCADE;
CREATE TYPE colunasEventosCalculados AS (
    cod_contrato                INTEGER,  
    cod_evento                  INTEGER,  
    codigo                      VARCHAR,
    descricao                   VARCHAR,
    natureza                    CHAR,
    tipo                        CHAR,
    fixado                      CHAR,
    limite_calculo              BOOLEAN,
    apresenta_parcela           BOOLEAN,
    evento_sistema              BOOLEAN,
    sigla                       VARCHAR,
    valor                       NUMERIC,        
    quantidade                  NUMERIC,
    desdobramento               VARCHAR,
    desdobramento_texto         VARCHAR,
    sequencia                   INTEGER,
    desc_sequencia              VARCHAR,
    quantidade_total_parcela    INTEGER
);


----------------
-- Ticket #20563
----------------

DROP Function recuperaContribuicaoPrevidenciaria( VARCHAR
                                                , INTEGER
                                                , INTEGER
                                                , INTEGER
                                                , VARCHAR
                                                , VARCHAR
                                                , VARCHAR
                                                );


----------------
-- Ticket #20437
----------------

SELECT atualizarbanco('ALTER TABLE pessoal.contrato_pensionista_previdencia ADD COLUMN bo_excluido BOOLEAN NOT NULL DEFAULT FALSE;');


----------------
-- Ticket #20274
----------------

SELECT atualizarbanco('
ALTER TABLE pessoal.servidor_cid ADD COLUMN data_laudo DATE;
');


----------------
-- Ticket #16515
----------------

SELECT atualizarbanco('CREATE TABLE pessoal.contrato_servidor_situacao(
    cod_contrato                INTEGER         NOT NULL,
    situacao                    CHAR(1)         NOT NULL,
    timestamp                   TIMESTAMP       NOT NULL DEFAULT (''now''::text)::timestamp(3) with time zone,
    cod_periodo_movimentacao    INTEGER         NOT NULL,
    situacao_literal            VARCHAR(25)     NOT NULL,
    deleted                     BOOLEAN         NOT NULL DEFAULT FALSE,
    CONSTRAINT pk_contrato_servidor_situacao    PRIMARY KEY                                    (cod_contrato, timestamp, situacao),
    CONSTRAINT fk_contrato_servidor_situacao_1  FOREIGN KEY                                    (cod_contrato)
                                                REFERENCES pessoal.contrato                    (cod_contrato),
    CONSTRAINT fk_contrato_servidor_situacao_2  FOREIGN KEY                                    (cod_periodo_movimentacao)
                                                REFERENCES folhapagamento.periodo_movimentacao (cod_periodo_movimentacao)
);
');
SELECT atualizarbanco('GRANT ALL ON pessoal.contrato_servidor_situacao TO urbem;');

CREATE OR REPLACE FUNCTION manutencao() RETURNS VOID AS $$
DECLARE
    inCodPrefeitura     VARCHAR;
    stSQLEntidade       VARCHAR;
    reRecordEntidade    RECORD;
    stEntidade          VARCHAR;
    stSQL               VARCHAR;
    reRecord            RECORD;
    stInsert            VARCHAR;
    stPrefeitura        VARCHAR;
    inCodPeriodo        INTEGER;
BEGIN

    PERFORM 1
       FROM administracao.configuracao
      WHERE cod_modulo = 2
        AND exercicio  = '2013'
        AND parametro  = 'cnpj'
        AND valor      = '04641551000195'
          ;
    IF FOUND THEN
        stPrefeitura := 'Manaquiri';
        UPDATE pessoal.contrato_servidor_nomeacao_posse
           SET dt_nomeacao = timestamp::date
             , dt_posse    = timestamp::date
             , dt_admissao = timestamp::date
         WHERE cod_contrato IN (
                                 SELECT cod_contrato
                                   FROM pessoal.contrato_servidor_nomeacao_posse
                                  WHERE dt_admissao = '1111-11-11'
                                     OR dt_admissao = '1010-12-12'
                               )
             ;
    END IF;

    PERFORM 1
       FROM administracao.configuracao
      WHERE cod_modulo = 2
        AND exercicio  = '2013'
        AND parametro  = 'cnpj'
        AND valor      = '94068418000184'
          ;
    IF FOUND THEN
        UPDATE pessoal.contrato_servidor_nomeacao_posse
           SET dt_nomeacao = '2012-02-02'
             , dt_posse    = '2012-02-02'
             , dt_admissao = '2012-02-02'
         WHERE cod_contrato = 1355
             ;
    END IF;

    PERFORM 1
       FROM administracao.configuracao
      WHERE cod_modulo = 2
        AND exercicio  = '2013'
        AND parametro  = 'cnpj'
        AND valor      = '13805528000180'
          ;
    IF FOUND THEN
        stPrefeitura := 'Mata';
        UPDATE pessoal.contrato_servidor_nomeacao_posse
           SET dt_nomeacao = '2003-03-03'
             , dt_posse    = '2003-03-03'
             , dt_admissao = '2003-03-03'
         WHERE cod_contrato = 7383
             ;
        UPDATE pessoal.contrato_servidor_nomeacao_posse
           SET dt_nomeacao = '2007-04-23'
             , dt_posse    = '2007-04-23'
             , dt_admissao = '2007-04-23'
         WHERE cod_contrato = 7860
            OR cod_contrato = 7864
             ;
    END IF;

    SELECT valor
      INTO inCodPrefeitura
      FROM administracao.configuracao
     WHERE cod_modulo = 8
       AND exercicio  = '2013'
       AND parametro  = 'cod_entidade_prefeitura'
         ;

    stSQLEntidade := '
                       SELECT DISTINCT(cod_entidade)::CHAR
                            , ''entidade_'' || cod_entidade AS entidade
                         FROM administracao.entidade_rh
                        WHERE exercicio = ''2013''
                          AND cod_entidade != '|| inCodPrefeitura ||'::INTEGER
                        UNION
                       SELECT ''''::CHAR AS cod_entidade
                            , ''entidade'' AS entidade
                            ;
                     ';
    FOR reRecordEntidade IN EXECUTE stSQLEntidade LOOP
        IF reRecordEntidade.cod_entidade != '' THEN
            stEntidade := '_' || reRecordEntidade.cod_entidade;
        ELSE
            stEntidade := '';
        END IF;
        stSQL := '
                   Select contrato_servidor_nomeacao_posse.cod_contrato
                        , dt_admissao::timestamp AS timestamp
                        , (
                            SELECT cod_periodo_movimentacao
                              FROM folhapagamento.periodo_movimentacao
                             WHERE contrato_servidor_nomeacao_posse.dt_admissao::DATE BETWEEN dt_inicial AND dt_final
                          )         AS cod_periodo_movimentacao
                        , ''A''     AS situacao
                        , ''Ativo'' AS situacao_literal
                     FROM pessoal'|| stEntidade ||'.contrato_servidor_nomeacao_posse
                     JOIN (
                              SELECT cod_contrato
                                   , min(timestamp) AS timestamp
                                FROM pessoal'|| stEntidade ||'.contrato_servidor_nomeacao_posse
                            GROUP BY cod_contrato
                          ) AS min_timestamp
                       ON contrato_servidor_nomeacao_posse.cod_contrato = min_timestamp.cod_contrato
                      AND contrato_servidor_nomeacao_posse.timestamp    = min_timestamp.timestamp
                    UNION
                   SELECT cod_contrato
                        , dt_concessao::timestamp AS timestamp
                        , (
                            SELECT cod_periodo_movimentacao
                              FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                             WHERE aposentadoria.dt_concessao::DATE BETWEEN dt_inicial AND dt_final
                          )              AS cod_periodo_movimentacao
                        , ''P''          AS situacao
                        , ''Aposentado'' AS situacao_literal
                     FROM pessoal'|| stEntidade ||'.aposentadoria 
                    WHERE NOT EXISTS (
                                       SELECT 1
                                         FROM pessoal'|| stEntidade ||'.aposentadoria_excluida
                                        WHERE aposentadoria_excluida.cod_contrato = aposentadoria.cod_contrato
                                     )
                    UNION
                   SELECT cod_contrato
                        , dt_rescisao::timestamp as timestamp
                        , (
                            SELECT cod_periodo_movimentacao
                              FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                             WHERE contrato_servidor_caso_causa.dt_rescisao::DATE BETWEEN dt_inicial AND dt_final
                          )              AS cod_periodo_movimentacao
                        , ''R''          AS situacao
                        , ''Rescindido'' AS situacao_literal
                     FROM pessoal'|| stEntidade ||'.contrato_servidor_caso_causa
                    UNION
                   SELECT cod_contrato
                        , dt_inicio_beneficio::TIMESTAMP AS timestamp
                        , (
                            SELECT cod_periodo_movimentacao
                              FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                             WHERE contrato_pensionista.dt_inicio_beneficio::DATE BETWEEN dt_inicial AND dt_final
                          )               AS cod_periodo_movimentacao
                        , ''E''           AS situacao
                        , ''Pensionista'' AS situacao_literal
                     FROM pessoal'|| stEntidade ||'.contrato_pensionista
                        ;
                 ';
        FOR reRecord IN EXECUTE stSQL LOOP
            IF    stPrefeitura = 'Mata'      AND reRecord.cod_periodo_movimentacao IS NULL THEN
                inCodPeriodo = 506;
            ELSIF stPrefeitura = 'Manaquiri' AND reRecord.cod_periodo_movimentacao IS NULL THEN
                inCodPeriodo = 1;
            ELSE
                inCodPeriodo = reRecord.cod_periodo_movimentacao;
            END IF;
            stInsert := '
                          INSERT
                            INTO pessoal'|| stEntidade ||'.contrato_servidor_situacao
                               ( cod_contrato
                               , situacao
                               , timestamp
                               , cod_periodo_movimentacao
                               , situacao_literal
                               )
                          VALUES
                               ( '|| reRecord.cod_contrato                    ||'
                               , '|| quote_literal(reRecord.situacao)         ||'
                               , '|| quote_literal(reRecord.timestamp)        ||'
                               , '|| inCodPeriodo                             ||'
                               , '|| quote_literal(reRecord.situacao_literal) ||'
                               );
                        ';
            EXECUTE stInsert;
        END LOOP;

    END LOOP;

END;
$$ LANGUAGE 'plpgsql';
SELECT        manutencao();
DROP FUNCTION manutencao();


CREATE OR REPLACE FUNCTION tr_situacao_contrato_aposentadoria() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        inCodPeriodo := selectintointeger('
                                              SELECT cod_periodo_movimentacao
                                                FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                            ORDER BY cod_periodo_movimentacao DESc
                                               LIMIT 1
                                                   ;
                                          ');

        stSQL := '
                   INSERT
                     INTO '|| stSchema ||'.contrato_servidor_situacao
                        ( cod_contrato
                        , situacao
                        , cod_periodo_movimentacao
                        , situacao_literal
                        )
                   VALUES
                        ( '|| NEW.cod_contrato ||'
                        , '|| quote_literal('P') ||'
                        , '|| inCodPeriodo ||'
                        , '|| quote_literal('Aposentado') ||'
                        );
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION tr_situacao_contrato_aposentadoria_excluida() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        stSQL := '
                   UPDATE '|| stSchema ||'.contrato_servidor_situacao
                      SET deleted = TRUE
                    WHERE cod_contrato = '|| NEW.cod_contrato   ||'
                      AND situacao     = '|| quote_literal('P') ||'
                        ;
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION tr_situacao_contrato_pensionista() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        inCodPeriodo := selectintointeger('
                                              SELECT cod_periodo_movimentacao
                                                FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                            ORDER BY cod_periodo_movimentacao DESc
                                               LIMIT 1
                                                   ;
                                          ');

        stSQL := '
                   INSERT
                     INTO '|| stSchema ||'.contrato_servidor_situacao
                        ( cod_contrato
                        , situacao
                        , cod_periodo_movimentacao
                        , situacao_literal
                        )
                   VALUES
                        ( '|| NEW.cod_contrato ||'
                        , '|| quote_literal('E') ||'
                        , '|| inCodPeriodo ||'
                        , '|| quote_literal('Pensionista') ||'
                        );
                 ';
    ELSIF TG_OP = 'DELETE' THEN
        stSQL := '
                   UPDATE '|| stSchema ||'.contrato_servidor_situacao
                      SET deleted = TRUE
                    WHERE cod_contrato = '|| OLD.cod_contrato   ||'
                      AND situacao     = '|| quote_literal('E') ||'
                        ;
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION tr_situacao_contrato_servidor() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        inCodPeriodo := selectintointeger('
                                              SELECT cod_periodo_movimentacao
                                                FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                            ORDER BY cod_periodo_movimentacao DESc
                                               LIMIT 1
                                                   ;
                                          ');

        stSQL := '
                   INSERT
                     INTO '|| stSchema ||'.contrato_servidor_situacao
                        ( cod_contrato
                        , situacao
                        , cod_periodo_movimentacao
                        , situacao_literal
                        )
                   VALUES
                        ( '|| NEW.cod_contrato ||'
                        , '|| quote_literal('A') ||'
                        , '|| inCodPeriodo ||'
                        , '|| quote_literal('Ativo') ||'
                        );
                 ';
    ELSIF TG_OP = 'DELETE' THEN
        stSQL := '
                   UPDATE '|| stSchema ||'.contrato_servidor_situacao
                      SET deleted = TRUE
                    WHERE cod_contrato = '|| OLD.cod_contrato   ||'
                        ;
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION tr_situacao_contrato_servidor_caso_causa() RETURNS TRIGGER AS $$
DECLARE
    stSchema        VARCHAR := '';
    stEntidade      VARCHAR := '';
    inCodPeriodo    INTEGER;
    stSQL           VARCHAR;
BEGIN

    SELECT nspname
      INTO stSchema
      FROM pg_namespace
      JOIN pg_class
        ON pg_class.relnamespace = pg_namespace.oid
     WHERE pg_class.oid = TG_RELID
         ;

    IF substr(stSchema, length(stSchema)-1, 1) = '_' THEN
        stEntidade := substr(stSchema, length(stSchema)-1, 2);
    END IF;

    IF      TG_OP = 'INSERT' THEN
        inCodPeriodo := selectintointeger('
                                              SELECT cod_periodo_movimentacao
                                                FROM folhapagamento'|| stEntidade ||'.periodo_movimentacao
                                            ORDER BY cod_periodo_movimentacao DESc
                                               LIMIT 1
                                                   ;
                                          ');

        stSQL := '
                   INSERT
                     INTO '|| stSchema ||'.contrato_servidor_situacao
                        ( cod_contrato
                        , situacao
                        , cod_periodo_movimentacao
                        , situacao_literal
                        )
                   VALUES
                        ( '|| NEW.cod_contrato ||'
                        , '|| quote_literal('R') ||'
                        , '|| inCodPeriodo ||'
                        , '|| quote_literal('Rescindido') ||'
                        );
                 ';
    ELSIF TG_OP = 'DELETE' THEN
        stSQL := '
                   UPDATE '|| stSchema ||'.contrato_servidor_situacao
                      SET deleted = TRUE
                    WHERE cod_contrato = '|| OLD.cod_contrato   ||'
                      AND situacao     = '|| quote_literal('R') ||'
                      AND timestamp    = (
                                           SELECT MAX(timestamp)
                                             FROM '|| stSchema ||'.contrato_servidor_situacao
                                            WHERE cod_contrato = '|| OLD.cod_contrato   ||'
                                              AND situacao     = '|| quote_literal('R') ||'
                                         )
                        ;
                 ';
    END IF;

    EXECUTE stSQL;

    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_pensionista            BEFORE INSERT OR DELETE ON pessoal.contrato_pensionista         FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_pensionista();           ');
SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_servidor               BEFORE INSERT OR DELETE ON pessoal.contrato_servidor            FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_servidor();              ');
SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_aposentadoria          BEFORE INSERT OR DELETE ON pessoal.aposentadoria                FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_aposentadoria();         ');
SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_aposentadoria_excluida BEFORE INSERT OR DELETE ON pessoal.aposentadoria_excluida       FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_aposentadoria_excluida();');
SELECT atualizarbanco('CREATE TRIGGER trg_situacao_contrato_servidor_caso_causa    BEFORE INSERT OR DELETE ON pessoal.contrato_servidor_caso_causa FOR EACH ROW EXECUTE PROCEDURE tr_situacao_contrato_servidor_caso_causa();   ');


----------------
-- Ticket #20273
----------------

SELECT atualizarbanco('
ALTER TABLE pessoal.pensionista_cid ADD COLUMN data_laudo DATE;
');


----------------
-- Ticket #20585
----------------

CREATE TYPE colunasUltimoContratoServidorCargoCbo AS (
    cod_cbo     INTEGER,
    cod_cargo   INTEGER
   );


----------------
-- Ticket #20275
----------------

DROP   TYPE colunasContratoServidor CASCADE;
CREATE TYPE colunasContratoServidor AS (
    cod_contrato                INTEGER,
    cod_norma                   INTEGER,
    cod_forma_pagamento         INTEGER,
    cod_tipo_pagamento          INTEGER,
    cod_tipo_salario            INTEGER,
    cod_tipo_admissao           INTEGER,
    cod_categoria               INTEGER,
    cod_vinculo                 INTEGER,
    cod_cargo                   INTEGER,
    desc_cargo                  VARCHAR,
    cod_regime                  INTEGER,
    desc_regime                 VARCHAR,
    cod_sub_divisao             INTEGER,
    desc_sub_divisao            VARCHAR, 
    nr_cartao_ponto             VARCHAR,
    ativo                       BOOLEAN,
    dt_opcao_fgts               DATE,
    adiantamento                BOOLEAN,
    cod_grade                   INTEGER,
    registro                    INTEGER,
    cod_servidor                INTEGER,
    cod_uf                      INTEGER,
    cod_municipio               INTEGER,
    numcgm                      INTEGER,
    nome_pai                    VARCHAR, 
    nome_mae                    VARCHAR, 
    zona_titulo                 VARCHAR,
    secao_titulo                VARCHAR,
    caminho_foto                VARCHAR,
    nr_titulo_eleitor           VARCHAR,
    cod_estado_civil            INTEGER,
    cod_raca                    INTEGER,
    cod_orgao                   INTEGER,
    desc_orgao                  VARCHAR,
    orgao                       VARCHAR,
    cod_local                   INTEGER,
    desc_local                  VARCHAR,
    cod_regime_funcao           INTEGER,
    desc_regime_funcao          VARCHAR,
    cod_sub_divisao_funcao      INTEGER,
    desc_sub_divisao_funcao     VARCHAR,
    cod_funcao                  INTEGER,
    desc_funcao                 VARCHAR,
    cod_cbo_funcao              INTEGER,
    desc_cbo_funcao             VARCHAR,
    cod_especialidade_funcao    INTEGER,
    desc_especialidade_funcao   VARCHAR,
    cod_especialidade_cargo     INTEGER,
    desc_especialidade_cargo    VARCHAR,
    cod_tipo                    INTEGER,
    desc_tipo_cedencia          VARCHAR,
    cod_conselho                INTEGER,
    sigla_conselho              VARCHAR,
    desc_conselho               VARCHAR,
    cod_agencia_fgts            INTEGER,
    cod_banco_fgts              INTEGER,
    nr_conta_fgts               VARCHAR,
    cod_agencia_salario         INTEGER,
    cod_banco_salario           INTEGER,
    nr_conta_salario            VARCHAR,
    num_banco_salario           VARCHAR,
    nom_banco_salario           VARCHAR,
    num_agencia_salario         VARCHAR,
    nom_agencia_salario         VARCHAR,
    dt_validade_exame           DATE,
    dt_inicio_progressao        DATE,
    cod_nivel_padrao            INTEGER,
    dt_nomeacao                 DATE,
    dt_posse                    DATE,
    dt_admissao                 DATE,
    cod_ocorrencia              INTEGER,
    cod_padrao                  INTEGER,
    valor_padrao                NUMERIC,
    desc_padrao                 VARCHAR,
    cod_previdencia             INTEGER,
    salario                     NUMERIC,
    horas_mensais               NUMERIC,
    horas_semanais              NUMERIC,
    vigencia                    DATE,
    numcgm_sindicato            INTEGER,
    cod_cid                     INTEGER,
    numcgm_conjuge              INTEGER,
    nr_carteira_res             VARCHAR,
    cat_reservista              VARCHAR,
    origem_reservista           VARCHAR,
    nom_cgm                     VARCHAR,
    servidor_pis_pasep          VARCHAR,
    rg                          VARCHAR,
    cpf                         VARCHAR,
    dt_nascimento               DATE,
    valor_atributo              VARCHAR,
    data_laudo                  DATE
);

DROP   TYPE colunasContratoPensionista CASCADE;
CREATE TYPE colunasContratoPensionista AS (
    cod_contrato                INTEGER,
    registro                    INTEGER,
    cod_contrato_cedente        INTEGER,
    cod_dependencia             INTEGER,
    cod_pensionista             INTEGER,
    num_beneficio               VARCHAR,
    percentual_pagamento        NUMERIC,
    dt_inicio_beneficio         DATE,
    dt_encerramento             DATE,
    motivo_encerramento         VARCHAR,
    cod_profissao               INTEGER,
    numcgm                      INTEGER,
    cod_grau                    INTEGER,
    cod_orgao                   INTEGER,
    desc_orgao                  VARCHAR,
    orgao                       VARCHAR,
    cod_local                   INTEGER,
    desc_local                  VARCHAR,
    cod_agencia_salario         INTEGER,
    cod_banco_salario           INTEGER,
    nr_conta_salario            VARCHAR,
    num_banco_salario           VARCHAR,
    nom_banco_salario           VARCHAR,
    num_agencia_salario         VARCHAR,
    nom_agencia_salario         VARCHAR,
    cod_previdencia             INTEGER,
    cod_processo                INTEGER,
    cod_cid                     INTEGER,
    cod_regime_funcao           INTEGER,
    desc_regime_funcao          VARCHAR,
    cod_sub_divisao_funcao      INTEGER,
    desc_sub_divisao_funcao     VARCHAR,
    cod_funcao                  INTEGER,
    desc_funcao                 VARCHAR,
    desc_cbo_funcao             VARCHAR,
    cod_especialidade_funcao    INTEGER,
    desc_especialidade_funcao   VARCHAR,
    nom_cgm                     VARCHAR,
    rg                          VARCHAR,
    cpf                         VARCHAR,
    dt_nascimento               DATE,
    valor_atributo              VARCHAR,
    data_laudo                  DATE
);

CREATE OR REPLACE FUNCTION recuperarContratoServidor(VARCHAR,VARCHAR,INTEGER,VARCHAR,VARCHAR,VARCHAR) RETURNS SETOF colunasContratoServidor AS $$
DECLARE
    stConfiguracao                  ALIAS FOR $1;
    stEntidade                      ALIAS FOR $2;
    inCodPeriodoMovimentacao        ALIAS FOR $3;
    stTipoFiltro                    ALIAS FOR $4;
    stValoresFiltro                 ALIAS FOR $5;
    stExercicio                     ALIAS FOR $6;
    rwContratoServidor              colunasContratoServidor%ROWTYPE;
    stSql                           VARCHAR;
    stSqlAux                        VARCHAR;
    inCodTipoAtributo               INTEGER;
    stTimestampFechamentoPeriodo    VARCHAR;
    stCodigos                       VARCHAR;
    stContagemTempo                 VARCHAR;
    reContratoServidor              RECORD;
    reRegistro                      RECORD;
    crCursor                        REFCURSOR;
    arConfiguracao                  VARCHAR[];    
    arValoresFiltro                 VARCHAR[];    
    inIndex                         INTEGER := 1;    
    inCodOrganograma                INTEGER;
BEGIN
    stTimestampFechamentoPeriodo := ultimoTimestampPeriodoMovimentacao(inCodPeriodoMovimentacao,stEntidade);
    arConfiguracao := string_to_array(stConfiguracao,','); 

    stSql := 'SELECT valor 
                FROM administracao.configuracao 
               WHERE parametro = '|| quote_literal('dtContagemInicial'|| stEntidade) ||' AND exercicio = '|| quote_literal(stExercicio) ||' ';
    stContagemTempo := selectIntoVarchar(stSql);

    stSql := '    SELECT contrato_servidor.*
                       , contrato.registro
                       , servidor.*';
                       
    IF stTipoFiltro = 'atributo_servidor' OR stTipoFiltro = 'atributo_servidor_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        
        --Verifica o tipo do atributo 
        --TODO - Pegar o cod_modulo e cod_cadastro vindos do parametro stValoresFiltro. atualmente so é passado o cod_atributo
        stSqlAux := 'SELECT cod_tipo FROM administracao.atributo_dinamico WHERE cod_modulo = 22 AND cod_cadastro = 5 AND cod_atributo = '||arValoresFiltro[2];
        inCodTipoAtributo := selectIntoInteger(stSqlAux);
        IF inCodTipoAtributo = 3 OR inCodTipoAtributo = 4 THEN
            stSql := stSql || ', atributo_valor_padrao.valor_padrao as valor_atributo';
        ELSE
            stSql := stSql || ', atributo_contrato_servidor_valor.valor as valor_atributo';
        END IF;
    ELSE
        stSql := stSql || ', ''''::varchar as valor_atributo';
    END IF;          
    
    stSql := stSql || '
                    FROM pessoal'||stEntidade||'.contrato_servidor 
              INNER JOIN pessoal'||stEntidade||'.contrato
                      ON contrato.cod_contrato = contrato_servidor.cod_contrato
              INNER JOIN pessoal'||stEntidade||'.servidor_contrato_servidor
                      ON servidor_contrato_servidor.cod_contrato = contrato_servidor.cod_contrato
              INNER JOIN pessoal'||stEntidade||'.servidor
                      ON servidor.cod_servidor = servidor_contrato_servidor.cod_servidor';

    IF stTipoFiltro = 'reg_sub_fun_esp' OR stTipoFiltro = 'reg_sub_fun_esp_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                                    ON contrato_servidor_regime_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_regime_funcao.cod_regime IN ('||arValoresFiltro[1]||')
                            INNER JOIN (  SELECT contrato_servidor_regime_funcao.cod_contrato
                                               , max(contrato_servidor_regime_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                                           WHERE contrato_servidor_regime_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_regime_funcao.cod_contrato) as max_contrato_servidor_regime_funcao
                                    ON max_contrato_servidor_regime_funcao.cod_contrato = contrato_servidor_regime_funcao.cod_contrato
                                   AND max_contrato_servidor_regime_funcao.timestamp = contrato_servidor_regime_funcao.timestamp
                            INNER JOIN pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                    ON contrato_servidor_sub_divisao_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_sub_divisao_funcao.cod_sub_divisao IN ('||arValoresFiltro[2]||')
                            INNER JOIN (  SELECT contrato_servidor_sub_divisao_funcao.cod_contrato
                                               , max(contrato_servidor_sub_divisao_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                           WHERE contrato_servidor_sub_divisao_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_sub_divisao_funcao.cod_contrato) as max_contrato_servidor_sub_divisao_funcao
                                    ON max_contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                   AND max_contrato_servidor_sub_divisao_funcao.timestamp = contrato_servidor_sub_divisao_funcao.timestamp
                            INNER JOIN pessoal'||stEntidade||'.contrato_servidor_funcao
                                    ON contrato_servidor_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_funcao.cod_cargo IN ('||arValoresFiltro[3]||')
                            INNER JOIN (  SELECT contrato_servidor_funcao.cod_contrato
                                               , max(contrato_servidor_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                                           WHERE contrato_servidor_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_funcao.cod_contrato) as max_contrato_servidor_funcao
                                    ON max_contrato_servidor_funcao.cod_contrato = contrato_servidor_funcao.cod_contrato
                                   AND max_contrato_servidor_funcao.timestamp = contrato_servidor_funcao.timestamp';
        IF trim(arValoresFiltro[4]) != '' THEN
            stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                                        ON contrato_servidor_especialidade_funcao.cod_contrato = contrato.cod_contrato
                                       AND contrato_servidor_especialidade_funcao.cod_especialidade IN ('||arValoresFiltro[4]||')
                                INNER JOIN (  SELECT contrato_servidor_especialidade_funcao.cod_contrato
                                                   , max(contrato_servidor_especialidade_funcao.timestamp) as timestamp
                                                FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                                               WHERE contrato_servidor_especialidade_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                            GROUP BY contrato_servidor_especialidade_funcao.cod_contrato) as max_contrato_servidor_especialidade_funcao
                                        ON max_contrato_servidor_especialidade_funcao.cod_contrato = contrato_servidor_especialidade_funcao.cod_contrato
                                       AND max_contrato_servidor_especialidade_funcao.timestamp = contrato_servidor_especialidade_funcao.timestamp';
        END IF;
    END IF;
    IF stTipoFiltro = 'reg_sub_car_esp' OR stTipoFiltro = 'reg_sub_car_esp_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        IF trim(arValoresFiltro[4]) != '' THEN
            stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_especialidade_cargo
                                        ON contrato_servidor_especialidade_cargo.cod_contrato = contrato.cod_contrato
                                       AND contrato_servidor_especialidade_cargo.cod_especialidade IN ('||arValoresFiltro[4]||')';
        END IF;
        stSql := stSql || ' WHERE contrato_servidor.cod_regime IN ('||arValoresFiltro[1]||')
                              AND contrato_servidor.cod_sub_divisao IN ('||arValoresFiltro[2]||')
                              AND contrato_servidor.cod_cargo IN ('||arValoresFiltro[3]||')';
    END IF;
    IF stTipoFiltro = 'contrato'                OR
       stTipoFiltro = 'contrato_todos'          OR
       stTipoFiltro = 'contrato_rescisao'       OR
       stTipoFiltro = 'contrato_aposentado'     OR
       stTipoFiltro = 'cgm_contrato'            OR
       stTipoFiltro = 'cgm_contrato_aposentado' OR
       stTipoFiltro = 'cgm_contrato_rescisao'   OR
       stTipoFiltro = 'cgm_contrato_todos'      THEN
        stSql := stSql || ' WHERE contrato.cod_contrato IN ('||stValoresFiltro||')';
    END IF;
    IF stTipoFiltro = 'lotacao' OR stTipoFiltro = 'lotacao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_orgao
                                    ON contrato_servidor_orgao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_orgao.cod_orgao IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_orgao.cod_contrato
                                               , max(contrato_servidor_orgao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_orgao
                                           WHERE contrato_servidor_orgao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_orgao.cod_contrato) as max_contrato_servidor_orgao
                                    ON max_contrato_servidor_orgao.cod_contrato = contrato_servidor_orgao.cod_contrato
                                   AND max_contrato_servidor_orgao.timestamp = contrato_servidor_orgao.timestamp';
    END IF;
    IF stTipoFiltro = 'local' OR stTipoFiltro = 'local_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_local
                                    ON contrato_servidor_local.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_local.cod_local IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_local.cod_contrato
                                               , max(contrato_servidor_local.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_local
                                           WHERE contrato_servidor_local.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_local.cod_contrato) as max_contrato_servidor_local
                                    ON max_contrato_servidor_local.cod_contrato = contrato_servidor_local.cod_contrato
                                   AND max_contrato_servidor_local.timestamp = contrato_servidor_local.timestamp';
    END IF;
    IF stTipoFiltro = 'sub_divisao' OR stTipoFiltro = 'sub_divisao_grupo' THEN
        stSql := stSql || ' WHERE contrato_servidor.cod_sub_divisao IN ('||stValoresFiltro||')';
    END IF;
    IF stTipoFiltro = 'sub_divisao_funcao' OR stTipoFiltro = 'sub_divisao_funcao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                    ON contrato_servidor_sub_divisao_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_sub_divisao_funcao.cod_sub_divisao IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_sub_divisao_funcao.cod_contrato
                                               , max(contrato_servidor_sub_divisao_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                           WHERE contrato_servidor_sub_divisao_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_sub_divisao_funcao.cod_contrato) as max_contrato_servidor_sub_divisao_funcao
                                    ON max_contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                   AND max_contrato_servidor_sub_divisao_funcao.timestamp = contrato_servidor_sub_divisao_funcao.timestamp';
    END IF;
    
    IF stTipoFiltro = 'atributo_servidor' OR stTipoFiltro = 'atributo_servidor_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.atributo_contrato_servidor_valor
                                    ON atributo_contrato_servidor_valor.cod_contrato = contrato.cod_contrato
                                   AND atributo_contrato_servidor_valor.cod_atributo = '||arValoresFiltro[2];

        IF arValoresFiltro[1] = '1' THEN
            stSql := stSql || '        AND atributo_contrato_servidor_valor.valor IN ('||arValoresFiltro[3]||')';
        ELSE
            stSql := stSql || '        AND atributo_contrato_servidor_valor.valor = '''||arValoresFiltro[3]||'''';
        END IF;
                                   
        IF inCodTipoAtributo = 3 OR inCodTipoAtributo = 4 THEN
            stSql := stSql || '
                            INNER JOIN administracao.atributo_valor_padrao
                                    ON atributo_valor_padrao.cod_modulo = atributo_contrato_servidor_valor.cod_modulo
                                   AND atributo_valor_padrao.cod_cadastro = atributo_contrato_servidor_valor.cod_cadastro
                                   AND atributo_valor_padrao.cod_atributo = atributo_contrato_servidor_valor.cod_atributo
                                   AND atributo_valor_padrao.cod_valor = atributo_contrato_servidor_valor.valor';
        END IF;
        
        stSql := stSql || '
                            INNER JOIN (  SELECT atributo_contrato_servidor_valor.cod_contrato
                                               , atributo_contrato_servidor_valor.cod_atributo
                                               , max(atributo_contrato_servidor_valor.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.atributo_contrato_servidor_valor
                                           WHERE atributo_contrato_servidor_valor.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY atributo_contrato_servidor_valor.cod_contrato
                                               , atributo_contrato_servidor_valor.cod_atributo) as max_atributo_contrato_servidor_valor
                                    ON max_atributo_contrato_servidor_valor.cod_contrato = atributo_contrato_servidor_valor.cod_contrato
                                   AND max_atributo_contrato_servidor_valor.cod_atributo = atributo_contrato_servidor_valor.cod_atributo
                                   AND max_atributo_contrato_servidor_valor.timestamp = atributo_contrato_servidor_valor.timestamp';
    END IF;
    
    IF stTipoFiltro = 'padrao' OR stTipoFiltro = 'padrao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_padrao
                                    ON contrato_servidor_padrao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_padrao.cod_padrao IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_padrao.cod_contrato
                                               , max(contrato_servidor_padrao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_padrao
                                           WHERE contrato_servidor_padrao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_padrao.cod_contrato) as max_contrato_servidor_padrao
                                    ON max_contrato_servidor_padrao.cod_contrato = contrato_servidor_padrao.cod_contrato
                                   AND max_contrato_servidor_padrao.timestamp = contrato_servidor_padrao.timestamp';
    END IF;
    IF stTipoFiltro = 'cargo' OR stTipoFiltro = 'cargo_grupo' THEN
        stSql := stSql || ' WHERE contrato_servidor.cod_cargo IN ('||stValoresFiltro||')';
    END IF;
    IF stTipoFiltro = 'funcao' OR stTipoFiltro = 'funcao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_funcao
                                    ON contrato_servidor_funcao.cod_contrato = contrato.cod_contrato
                                   AND contrato_servidor_funcao.cod_cargo IN ('||stValoresFiltro||')
                            INNER JOIN (  SELECT contrato_servidor_funcao.cod_contrato
                                               , max(contrato_servidor_funcao.timestamp) as timestamp
                                            FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                                           WHERE contrato_servidor_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                        GROUP BY contrato_servidor_funcao.cod_contrato) as max_contrato_servidor_funcao
                                    ON max_contrato_servidor_funcao.cod_contrato = contrato_servidor_funcao.cod_contrato
                                   AND max_contrato_servidor_funcao.timestamp = contrato_servidor_funcao.timestamp';
    END IF;


    FOR reContratoServidor IN EXECUTE stSql LOOP
        --DADOS DA TABELA pessoal'||stEntidade||'.contrato
        rwContratoServidor.registro            := reContratoServidor.registro;       
                         
        --DADOS DA TABELA pessoal'||stEntidade||'.servidor
        rwContratoServidor.cod_servidor        := reContratoServidor.cod_servidor;     
        rwContratoServidor.cod_uf              := reContratoServidor.cod_uf;           
        rwContratoServidor.cod_municipio       := reContratoServidor.cod_municipio;    
        rwContratoServidor.numcgm              := reContratoServidor.numcgm;           
        rwContratoServidor.nome_pai            := reContratoServidor.nome_pai;         
        rwContratoServidor.nome_mae            := reContratoServidor.nome_mae;         
        rwContratoServidor.zona_titulo         := reContratoServidor.zona_titulo;      
        rwContratoServidor.secao_titulo        := reContratoServidor.secao_titulo;     
        rwContratoServidor.caminho_foto        := reContratoServidor.caminho_foto;     
        rwContratoServidor.nr_titulo_eleitor   := reContratoServidor.nr_titulo_eleitor;
        rwContratoServidor.cod_estado_civil    := reContratoServidor.cod_estado_civil; 
        rwContratoServidor.cod_raca            := reContratoServidor.cod_raca;         


        --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor
        rwContratoServidor.cod_contrato        := reContratoServidor.cod_contrato;       
        rwContratoServidor.cod_norma           := reContratoServidor.cod_norma;          
        rwContratoServidor.cod_tipo_pagamento  := reContratoServidor.cod_tipo_pagamento; 
        rwContratoServidor.cod_tipo_salario    := reContratoServidor.cod_tipo_salario;   
        rwContratoServidor.cod_tipo_admissao   := reContratoServidor.cod_tipo_admissao;  
        rwContratoServidor.cod_categoria       := reContratoServidor.cod_categoria;      
        rwContratoServidor.cod_vinculo         := reContratoServidor.cod_vinculo;        
        rwContratoServidor.cod_cargo           := reContratoServidor.cod_cargo;          
        rwContratoServidor.cod_regime          := reContratoServidor.cod_regime;         
        rwContratoServidor.cod_sub_divisao     := reContratoServidor.cod_sub_divisao;    
        rwContratoServidor.nr_cartao_ponto     := reContratoServidor.nr_cartao_ponto;    
        rwContratoServidor.ativo               := reContratoServidor.ativo;              
        rwContratoServidor.dt_opcao_fgts       := reContratoServidor.dt_opcao_fgts;      
        rwContratoServidor.adiantamento        := reContratoServidor.adiantamento;       
        rwContratoServidor.cod_grade           := reContratoServidor.cod_grade;  
        rwContratoServidor.valor_atributo  := reContratoServidor.valor_atributo;               

        WHILE arConfiguracao[inIndex] IS NOT NULL LOOP
            --DADOS DA TABELA pessoal.contrato_servidor_nomeacao_posse
            IF arConfiguracao[inIndex] = 'anp' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '  SELECT contrato_servidor_nomeacao_posse.dt_nomeacao
                                 , contrato_servidor_nomeacao_posse.dt_posse
                                 , contrato_servidor_nomeacao_posse.dt_admissao
                              FROM pessoal'||stEntidade||'.contrato_servidor_nomeacao_posse
                        INNER JOIN (  SELECT contrato_servidor_nomeacao_posse.cod_contrato
                                           , max(contrato_servidor_nomeacao_posse.timestamp) as timestamp
                                        FROM pessoal'||stEntidade||'.contrato_servidor_nomeacao_posse
                                       WHERE timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                    GROUP BY contrato_servidor_nomeacao_posse.cod_contrato) as max_contrato_servidor_nomeacao_posse
                                ON max_contrato_servidor_nomeacao_posse.cod_contrato = contrato_servidor_nomeacao_posse.cod_contrato
                               AND max_contrato_servidor_nomeacao_posse.timestamp = contrato_servidor_nomeacao_posse.timestamp
                             WHERE contrato_servidor_nomeacao_posse.cod_contrato = '||reContratoServidor.cod_contrato;

                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.dt_nomeacao := reRegistro.dt_nomeacao;
                rwContratoServidor.dt_posse    := reRegistro.dt_posse;
                rwContratoServidor.dt_admissao := reRegistro.dt_admissao;               
            END IF;

            --DADOS DA TABELA pessoal.cargo
            IF arConfiguracao[inIndex] = 'ca' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT cargo.descricao as desc_cargo
                                FROM pessoal'||stEntidade||'.cargo
                               WHERE cargo.cod_cargo = '||reContratoServidor.cod_cargo;
                rwContratoServidor.desc_cargo   := selectIntoVarchar(stSql);
            END IF;

            --DADOS DA TABELA pessoal.regime
            IF arConfiguracao[inIndex] = 'car' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT regime.descricao as desc_regime
                                FROM pessoal'||stEntidade||'.regime
                               WHERE regime.cod_regime = '||reContratoServidor.cod_regime;
                rwContratoServidor.desc_regime   := selectIntoVarchar(stSql);
            END IF;

            --DADOS DA TABELA pessoal.sub_divisao
            IF arConfiguracao[inIndex] = 'cas' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT sub_divisao.descricao as desc_sub_divisao
                                FROM pessoal'||stEntidade||'.sub_divisao
                               WHERE sub_divisao.cod_sub_divisao = '||reContratoServidor.cod_sub_divisao;
                rwContratoServidor.desc_sub_divisao   := selectIntoVarchar(stSql);
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_cedencia
            IF arConfiguracao[inIndex] = 'c' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_cedencia.cod_tipo
                                   , tipo_cedencia.descricao as desc_tipo_cedencia
                                FROM pessoal'||stEntidade||'.contrato_servidor_cedencia
                          INNER JOIN pessoal'||stEntidade||'.tipo_cedencia
                                  ON tipo_cedencia.cod_tipo = contrato_servidor_cedencia.cod_tipo
                               WHERE contrato_servidor_cedencia.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_tipo             := reRegistro.cod_tipo;
                rwContratoServidor.desc_tipo_cedencia   := reRegistro.desc_tipo_cedencia;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_conselho
            IF arConfiguracao[inIndex] = 'co' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_conselho.cod_conselho
                                   , conselho.sigla as sigla_conselho
                                   , conselho.descricao as desc_conselho
                                FROM pessoal'||stEntidade||'.contrato_servidor_conselho
                          INNER JOIN pessoal'||stEntidade||'.conselho
                                  ON conselho.cod_conselho = contrato_servidor_conselho.cod_conselho
                               WHERE contrato_servidor_conselho.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_conselho     := reRegistro.cod_conselho;
                rwContratoServidor.sigla_conselho   := reRegistro.sigla_conselho;
                rwContratoServidor.desc_conselho    := reRegistro.desc_conselho;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_conta_fgts
            IF arConfiguracao[inIndex] = 'cf' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_conta_fgts.cod_agencia as cod_agencia_fgts
                                   , contrato_servidor_conta_fgts.cod_banco as cod_banco_fgts
                                   , contrato_servidor_conta_fgts.nr_conta as nr_conta_fgts
                                FROM pessoal'||stEntidade||'.contrato_servidor_conta_fgts
                               WHERE contrato_servidor_conta_fgts.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_agencia_fgts     := reRegistro.cod_agencia_fgts;
                rwContratoServidor.cod_banco_fgts       := reRegistro.cod_banco_fgts;
                rwContratoServidor.nr_conta_fgts        := reRegistro.nr_conta_fgts;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_conta_salario
            IF arConfiguracao[inIndex] = 'cs' OR arConfiguracao[inIndex] = 'all' THEN
                -- Verifica no histórico se foi pago em crédito em banco ou foi pago em outra forma de pagamento
                -- Caso tenha sido pago em outra forma, retornar vazio os dados da conta salário
                stSql := '    SELECT contrato_servidor_forma_pagamento.*
                                FROM pessoal'||stEntidade||'.contrato_servidor_forma_pagamento
                          INNER JOIN (  SELECT contrato_servidor_forma_pagamento.cod_contrato
                                             , max(timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_forma_pagamento
                                         WHERE timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_forma_pagamento.cod_contrato
                                     ) as max_contrato_servidor_forma_pagamento
                                  ON contrato_servidor_forma_pagamento.cod_contrato = max_contrato_servidor_forma_pagamento.cod_contrato
                              AND contrato_servidor_forma_pagamento.timestamp = max_contrato_servidor_forma_pagamento.timestamp
                            WHERE contrato_servidor_forma_pagamento.cod_contrato = '||reContratoServidor.cod_contrato;

                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_forma_pagamento := reRegistro.cod_forma_pagamento;

                IF rwContratoServidor.cod_forma_pagamento = 3 THEN --Crédito em conta
                    stSql := '    SELECT contrato_servidor_conta_salario_historico.cod_agencia as cod_agencia_salario
                                    , contrato_servidor_conta_salario_historico.cod_banco as cod_banco_salario
                                    , contrato_servidor_conta_salario_historico.nr_conta as nr_conta_salario
                                    , banco.num_banco as num_banco_salario
                                    , banco.nom_banco as nom_banco_salario
                                    , agencia.num_agencia as num_agencia_salario
                                    , agencia.nom_agencia as nom_agencia_salario
                                 FROM pessoal'||stEntidade||'.contrato_servidor_conta_salario_historico
                           INNER JOIN (  SELECT contrato_servidor_conta_salario_historico.cod_contrato
                                              , max(contrato_servidor_conta_salario_historico.timestamp) as timestamp
                                           FROM pessoal'||stEntidade||'.contrato_servidor_conta_salario_historico
                                          WHERE contrato_servidor_conta_salario_historico.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                       GROUP BY contrato_servidor_conta_salario_historico.cod_contrato) as max_contrato_servidor_conta_salario_historico
                                    ON max_contrato_servidor_conta_salario_historico.cod_contrato = contrato_servidor_conta_salario_historico.cod_contrato
                                   AND max_contrato_servidor_conta_salario_historico.timestamp = contrato_servidor_conta_salario_historico.timestamp
                            INNER JOIN monetario.agencia
                                    ON agencia.cod_banco = contrato_servidor_conta_salario_historico.cod_banco
                                   AND agencia.cod_agencia = contrato_servidor_conta_salario_historico.cod_agencia
                            INNER JOIN monetario.banco
                                    ON banco.cod_banco = contrato_servidor_conta_salario_historico.cod_banco
                                 WHERE contrato_servidor_conta_salario_historico.cod_contrato = '||reContratoServidor.cod_contrato;

                    OPEN crCursor FOR EXECUTE stSql;
                        FETCH crCursor INTO reRegistro;
                    CLOSE crCursor;
                    rwContratoServidor.cod_agencia_salario     := reRegistro.cod_agencia_salario;
                    rwContratoServidor.cod_banco_salario       := reRegistro.cod_banco_salario;
                    rwContratoServidor.nr_conta_salario        := reRegistro.nr_conta_salario;
                    rwContratoServidor.num_banco_salario       := reRegistro.num_banco_salario;
                    rwContratoServidor.nom_banco_salario       := reRegistro.nom_banco_salario;
                    rwContratoServidor.num_agencia_salario     := reRegistro.num_agencia_salario;
                    rwContratoServidor.nom_agencia_salario     := reRegistro.nom_agencia_salario;
                ELSE
                    rwContratoServidor.cod_agencia_salario     := NULL;
                    rwContratoServidor.cod_banco_salario       := NULL;
                    rwContratoServidor.nr_conta_salario        := NULL;
                    rwContratoServidor.num_banco_salario       := NULL;
                    rwContratoServidor.nom_banco_salario       := NULL;
                    rwContratoServidor.num_agencia_salario     := NULL;
                    rwContratoServidor.nom_agencia_salario     := NULL;
                END IF;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_exame_medico
            IF arConfiguracao[inIndex] = 'em' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_exame_medico.dt_validade_exame
                                FROM pessoal'||stEntidade||'.contrato_servidor_exame_medico
                          INNER JOIN (  SELECT contrato_servidor_exame_medico.cod_contrato
                                             , max(contrato_servidor_exame_medico.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_exame_medico
                                         WHERE contrato_servidor_exame_medico.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_exame_medico.cod_contrato) as max_contrato_servidor_exame_medico
                                  ON max_contrato_servidor_exame_medico.cod_contrato = contrato_servidor_exame_medico.cod_contrato
                                 AND max_contrato_servidor_exame_medico.timestamp = contrato_servidor_exame_medico.timestamp
                               WHERE contrato_servidor_exame_medico.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.dt_validade_exame  := reRegistro.dt_validade_exame;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_inicio_progressao
            IF arConfiguracao[inIndex] = 'ip' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_inicio_progressao.dt_inicio_progressao
                                FROM pessoal'||stEntidade||'.contrato_servidor_inicio_progressao
                          INNER JOIN (  SELECT contrato_servidor_inicio_progressao.cod_contrato
                                             , max(contrato_servidor_inicio_progressao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_inicio_progressao
                                         WHERE contrato_servidor_inicio_progressao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_inicio_progressao.cod_contrato) as max_contrato_servidor_inicio_progressao
                                  ON max_contrato_servidor_inicio_progressao.cod_contrato = contrato_servidor_inicio_progressao.cod_contrato
                                 AND max_contrato_servidor_inicio_progressao.timestamp = contrato_servidor_inicio_progressao.timestamp
                               WHERE contrato_servidor_inicio_progressao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.dt_inicio_progressao  := reRegistro.dt_inicio_progressao;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_nivel_padrao
            IF arConfiguracao[inIndex] = 'np' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_nivel_padrao.cod_nivel_padrao
                                FROM pessoal'||stEntidade||'.contrato_servidor_nivel_padrao
                          INNER JOIN (  SELECT contrato_servidor_nivel_padrao.cod_contrato
                                             , max(contrato_servidor_nivel_padrao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_nivel_padrao
                                         WHERE contrato_servidor_nivel_padrao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_nivel_padrao.cod_contrato) as max_contrato_servidor_nivel_padrao
                                  ON max_contrato_servidor_nivel_padrao.cod_contrato = contrato_servidor_nivel_padrao.cod_contrato
                                 AND max_contrato_servidor_nivel_padrao.timestamp = contrato_servidor_nivel_padrao.timestamp
                               WHERE contrato_servidor_nivel_padrao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_nivel_padrao  := reRegistro.cod_nivel_padrao;
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_ocorrencia
            IF arConfiguracao[inIndex] = 'oc' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_ocorrencia.cod_ocorrencia
                                FROM pessoal'||stEntidade||'.contrato_servidor_ocorrencia
                          INNER JOIN (  SELECT contrato_servidor_ocorrencia.cod_contrato
                                             , max(contrato_servidor_ocorrencia.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_ocorrencia
                                         WHERE contrato_servidor_ocorrencia.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_ocorrencia.cod_contrato) as max_contrato_servidor_ocorrencia
                                  ON max_contrato_servidor_ocorrencia.cod_contrato = contrato_servidor_ocorrencia.cod_contrato
                                 AND max_contrato_servidor_ocorrencia.timestamp = contrato_servidor_ocorrencia.timestamp
                               WHERE contrato_servidor_ocorrencia.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_ocorrencia  := reRegistro.cod_ocorrencia;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_padrao
            IF arConfiguracao[inIndex] = 'p' OR arConfiguracao[inIndex] = 'pp' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_padrao.cod_padrao
                                FROM pessoal'||stEntidade||'.contrato_servidor_padrao
                          INNER JOIN (  SELECT contrato_servidor_padrao.cod_contrato
                                             , max(contrato_servidor_padrao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_padrao
                                         WHERE contrato_servidor_padrao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_padrao.cod_contrato) as max_contrato_servidor_padrao
                                  ON max_contrato_servidor_padrao.cod_contrato = contrato_servidor_padrao.cod_contrato
                                 AND max_contrato_servidor_padrao.timestamp = contrato_servidor_padrao.timestamp
                               WHERE contrato_servidor_padrao.cod_contrato = '||reContratoServidor.cod_contrato;
                
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_padrao  := reRegistro.cod_padrao;
                
                IF arConfiguracao[inIndex] = 'pp' THEN
                    IF rwContratoServidor.cod_padrao IS NOT NULL THEN 
                        stSql := '    SELECT padrao_padrao.valor
                                        , padrao.descricao
                                        FROM folhapagamento'||stEntidade||'.padrao_padrao
                                INNER JOIN (  SELECT padrao_padrao.cod_padrao
                                                    , max(padrao_padrao.timestamp) as timestamp
                                                FROM folhapagamento'||stEntidade||'.padrao_padrao
                                                WHERE padrao_padrao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                            GROUP BY padrao_padrao.cod_padrao) as max_padrao_padrao
                                        ON max_padrao_padrao.cod_padrao = padrao_padrao.cod_padrao
                                        AND max_padrao_padrao.timestamp = padrao_padrao.timestamp
                                INNER JOIN folhapagamento'||stEntidade||'.padrao
                                        ON padrao.cod_padrao = padrao_padrao.cod_padrao
                                    WHERE padrao_padrao.cod_padrao = '||rwContratoServidor.cod_padrao;
                        OPEN crCursor FOR EXECUTE stSql;
                            FETCH crCursor INTO reRegistro;
                        CLOSE crCursor;
                        rwContratoServidor.desc_padrao   := reRegistro.descricao;
                        rwContratoServidor.valor_padrao  := reRegistro.valor;
                    END IF;
                END IF;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_previdencia
            IF arConfiguracao[inIndex] = 'pr' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_previdencia.cod_previdencia
                                FROM pessoal'||stEntidade||'.contrato_servidor_previdencia
                          INNER JOIN (  SELECT contrato_servidor_previdencia.cod_contrato
                                             , max(contrato_servidor_previdencia.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_previdencia
                                         WHERE contrato_servidor_previdencia.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_previdencia.cod_contrato) as max_contrato_servidor_previdencia
                                  ON max_contrato_servidor_previdencia.cod_contrato = contrato_servidor_previdencia.cod_contrato
                                 AND max_contrato_servidor_previdencia.timestamp = contrato_servidor_previdencia.timestamp
                          INNER JOIN folhapagamento'||stEntidade||'.previdencia_previdencia
                                  ON previdencia_previdencia.cod_previdencia = contrato_servidor_previdencia.cod_previdencia
                                 AND previdencia_previdencia.tipo_previdencia = ''o''
                          INNER JOIN (  SELECT previdencia_previdencia.cod_previdencia
                                             , max(previdencia_previdencia.timestamp) as timestamp
                                          FROM folhapagamento'||stEntidade||'.previdencia_previdencia
                                      GROUP BY previdencia_previdencia.cod_previdencia) as max_previdencia_previdencia
                                  ON max_previdencia_previdencia.cod_previdencia = previdencia_previdencia.cod_previdencia
                                 AND max_previdencia_previdencia.timestamp = previdencia_previdencia.timestamp
                               WHERE contrato_servidor_previdencia.bo_excluido = false
                                 AND contrato_servidor_previdencia.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_previdencia  := reRegistro.cod_previdencia;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_salario
            IF arConfiguracao[inIndex] = 's' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_salario.salario
                                   , contrato_servidor_salario.horas_mensais
                                   , contrato_servidor_salario.horas_semanais
                                   , contrato_servidor_salario.vigencia
                                FROM pessoal'||stEntidade||'.contrato_servidor_salario
                          INNER JOIN (  SELECT contrato_servidor_salario.cod_contrato
                                             , max(contrato_servidor_salario.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_salario
                                         WHERE contrato_servidor_salario.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_salario.cod_contrato) as max_contrato_servidor_salario
                                  ON max_contrato_servidor_salario.cod_contrato = contrato_servidor_salario.cod_contrato
                                 AND max_contrato_servidor_salario.timestamp = contrato_servidor_salario.timestamp
                               WHERE contrato_servidor_salario.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.salario          := reRegistro.salario;       
                rwContratoServidor.horas_mensais    := reRegistro.horas_mensais; 
                rwContratoServidor.horas_semanais   := reRegistro.horas_semanais;
                rwContratoServidor.vigencia         := reRegistro.vigencia;      
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_sindicato
            IF arConfiguracao[inIndex] = 'si' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_sindicato.numcgm_sindicato
                                FROM pessoal'||stEntidade||'.contrato_servidor_sindicato
                               WHERE contrato_servidor_sindicato.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.numcgm_sindicato          := reRegistro.numcgm_sindicato;       
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_orgao
            IF arConfiguracao[inIndex] = 'o' OR arConfiguracao[inIndex] = 'oo' OR arConfiguracao[inIndex] = 'all' THEN        
                stSql := '    SELECT contrato_servidor_orgao.cod_orgao
                                   , recuperadescricaoorgao(contrato_servidor_orgao.cod_orgao,'''||stTimestampFechamentoPeriodo||''') as descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_orgao
                          INNER JOIN (  SELECT contrato_servidor_orgao.cod_contrato
                                             , max(contrato_servidor_orgao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_orgao
                                         WHERE contrato_servidor_orgao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_orgao.cod_contrato) as max_contrato_servidor_orgao
                                  ON max_contrato_servidor_orgao.cod_contrato = contrato_servidor_orgao.cod_contrato
                                 AND max_contrato_servidor_orgao.timestamp = contrato_servidor_orgao.timestamp
                               WHERE contrato_servidor_orgao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_orgao  := reRegistro.cod_orgao;
                rwContratoServidor.desc_orgao := reRegistro.descricao;

                --DADOS DA TABELA organograma.fn_consulta_orgao
                IF arConfiguracao[inIndex] = 'oo' OR arConfiguracao[inIndex] = 'all' THEN        
                    inCodOrganograma := selectIntoInteger('SELECT cod_organograma FROM organograma.orgao_nivel WHERE cod_orgao = '||reRegistro.cod_orgao);
                    stSql := 'SELECT organograma.fn_consulta_orgao('||inCodOrganograma||','||reRegistro.cod_orgao||')';
                    rwContratoServidor.orgao := selectIntoVarchar(stSql); 
                END IF;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_local
            IF arConfiguracao[inIndex] = 'l' OR arConfiguracao[inIndex] = 'all' THEN        
                stSql := '    SELECT contrato_servidor_local.cod_local
                                   , local.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_local
                          INNER JOIN (  SELECT contrato_servidor_local.cod_contrato
                                             , max(contrato_servidor_local.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_local
                                         WHERE contrato_servidor_local.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_local.cod_contrato) as max_contrato_servidor_local
                                  ON max_contrato_servidor_local.cod_contrato = contrato_servidor_local.cod_contrato
                                 AND max_contrato_servidor_local.timestamp = contrato_servidor_local.timestamp
                          INNER JOIN organograma.local
                                  ON local.cod_local = contrato_servidor_local.cod_local
                               WHERE contrato_servidor_local.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_local  := reRegistro.cod_local;
                rwContratoServidor.desc_local := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_regime_funcao
            IF arConfiguracao[inIndex] = 'rf' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT contrato_servidor_regime_funcao.cod_regime as cod_regime_funcao
                                   , regime.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                          INNER JOIN (  SELECT contrato_servidor_regime_funcao.cod_contrato
                                             , max(contrato_servidor_regime_funcao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                                         WHERE contrato_servidor_regime_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_regime_funcao.cod_contrato) as max_contrato_servidor_regime_funcao
                                  ON max_contrato_servidor_regime_funcao.cod_contrato = contrato_servidor_regime_funcao.cod_contrato
                                 AND max_contrato_servidor_regime_funcao.timestamp = contrato_servidor_regime_funcao.timestamp
                          INNER JOIN pessoal'||stEntidade||'.regime
                                  ON regime.cod_regime = contrato_servidor_regime_funcao.cod_regime
                               WHERE contrato_servidor_regime_funcao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_regime_funcao  := reRegistro.cod_regime_funcao;
                rwContratoServidor.desc_regime_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
            IF arConfiguracao[inIndex] = 'sf' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT contrato_servidor_sub_divisao_funcao.cod_sub_divisao as cod_sub_divisao_funcao
                                   , sub_divisao.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                          INNER JOIN (  SELECT contrato_servidor_sub_divisao_funcao.cod_contrato
                                             , max(contrato_servidor_sub_divisao_funcao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                         WHERE contrato_servidor_sub_divisao_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_sub_divisao_funcao.cod_contrato) as max_contrato_servidor_sub_divisao_funcao
                                  ON max_contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                 AND max_contrato_servidor_sub_divisao_funcao.timestamp = contrato_servidor_sub_divisao_funcao.timestamp
                          INNER JOIN pessoal'||stEntidade||'.sub_divisao
                                  ON sub_divisao.cod_sub_divisao = contrato_servidor_sub_divisao_funcao.cod_sub_divisao
                               WHERE contrato_servidor_sub_divisao_funcao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_sub_divisao_funcao  := reRegistro.cod_sub_divisao_funcao;
                rwContratoServidor.desc_sub_divisao_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_funcao
            IF arConfiguracao[inIndex] = 'f' OR arConfiguracao[inIndex] = 'all' THEN        
                stSql := '    SELECT contrato_servidor_funcao.cod_cargo as cod_funcao
                                   , cargo.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                          INNER JOIN (  SELECT contrato_servidor_funcao.cod_contrato
                                             , max(contrato_servidor_funcao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                                         WHERE contrato_servidor_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_funcao.cod_contrato) as max_contrato_servidor_funcao
                                  ON max_contrato_servidor_funcao.cod_contrato = contrato_servidor_funcao.cod_contrato
                                 AND max_contrato_servidor_funcao.timestamp = contrato_servidor_funcao.timestamp
                          INNER JOIN pessoal'||stEntidade||'.cargo
                                  ON cargo.cod_cargo = contrato_servidor_funcao.cod_cargo
                               WHERE contrato_servidor_funcao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_funcao  := reRegistro.cod_funcao;
                rwContratoServidor.desc_funcao := reRegistro.descricao;

                IF rwContratoServidor.cod_funcao IS NOT NULL THEN 
                    stSql := ' SELECT * 
                                 FROM ( SELECT cargo.cod_cargo
                                             , cbo.codigo as cbo_codigo
                                             , cbo.cod_cbo as cod_cbo
                                             , cargo.descricao
                                          FROM pessoal'||stEntidade||'.cargo
                                             , pessoal'||stEntidade||'.cbo_cargo
                                             , (  SELECT cod_cargo
                                                       , max(timestamp) as timestamp
                                                    FROM pessoal'||stEntidade||'.cbo_cargo
                                                GROUP BY cod_cargo) as max_cbo_cargo
                                             , pessoal'||stEntidade||'.cbo
                                         WHERE cargo.cod_cargo = cbo_cargo.cod_cargo
                                           AND cbo_cargo.cod_cargo = max_cbo_cargo.cod_cargo 
                                           AND cbo_cargo.timestamp = max_cbo_cargo.timestamp
                                           AND cbo_cargo.cod_cbo = cbo.cod_cbo
                                         UNION
                                        SELECT cargo.cod_cargo
                                             , cbo.codigo as cbo_codigo
                                             , cbo.cod_cbo as cod_cbo
                                             , cargo.descricao
                                          FROM pessoal'||stEntidade||'.cargo
                                             , pessoal'||stEntidade||'.especialidade
                                             , pessoal'||stEntidade||'.cbo_especialidade
                                             , (  SELECT cod_especialidade
                                             , max(timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.cbo_especialidade
                                      GROUP BY cod_especialidade) as max_cod_especialidade
                                             , pessoal'||stEntidade||'.cbo
                                         WHERE cargo.cod_cargo = especialidade.cod_cargo
                                           AND especialidade.cod_especialidade = cbo_especialidade.cod_especialidade
                                           AND cbo_especialidade.cod_especialidade = max_cod_especialidade.cod_especialidade 
                                           AND cbo_especialidade.timestamp = max_cod_especialidade.timestamp
                                           AND cbo_especialidade.cod_cbo = cbo.cod_cbo) as funcao
                                         WHERE funcao.cod_cargo = '||reRegistro.cod_funcao;
    
                    OPEN crCursor FOR EXECUTE stSql;
                        FETCH crCursor INTO reRegistro;
                    CLOSE crCursor;
                    rwContratoServidor.cod_cbo_funcao               := reRegistro.cod_cbo;
                    rwContratoServidor.desc_cbo_funcao              := reRegistro.descricao;
                END IF;

            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
            IF arConfiguracao[inIndex] = 'ef' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT contrato_servidor_especialidade_funcao.cod_especialidade as cod_especialidade_funcao
                                   , especialidade.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                          INNER JOIN (  SELECT contrato_servidor_especialidade_funcao.cod_contrato
                                             , max(contrato_servidor_especialidade_funcao.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                                         WHERE contrato_servidor_especialidade_funcao.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY contrato_servidor_especialidade_funcao.cod_contrato) as max_contrato_servidor_especialidade_funcao
                                  ON max_contrato_servidor_especialidade_funcao.cod_contrato = contrato_servidor_especialidade_funcao.cod_contrato
                                 AND max_contrato_servidor_especialidade_funcao.timestamp = contrato_servidor_especialidade_funcao.timestamp
                          INNER JOIN pessoal'||stEntidade||'.especialidade
                                  ON especialidade.cod_especialidade = contrato_servidor_especialidade_funcao.cod_especialidade
                               WHERE contrato_servidor_especialidade_funcao.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_especialidade_funcao  := reRegistro.cod_especialidade_funcao;
                rwContratoServidor.desc_especialidade_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_especialidade_cargo
            IF arConfiguracao[inIndex] = 'ec' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT contrato_servidor_especialidade_cargo.cod_especialidade as cod_especialidade_cargo
                                   , especialidade.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_cargo
                          INNER JOIN pessoal'||stEntidade||'.especialidade
                                  ON especialidade.cod_especialidade = contrato_servidor_especialidade_cargo.cod_especialidade
                               WHERE contrato_servidor_especialidade_cargo.cod_contrato = '||reContratoServidor.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_especialidade_cargo  := reRegistro.cod_especialidade_cargo;
                rwContratoServidor.desc_especialidade_cargo := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.servidor_cid
            IF arConfiguracao[inIndex] = 'cid' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT  servidor_cid.cod_cid
                                    , servidor_cid.data_laudo
                                FROM pessoal'||stEntidade||'.servidor_cid
                          INNER JOIN (  SELECT servidor_cid.cod_servidor
                                             , max(servidor_cid.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.servidor_cid
                                         WHERE servidor_cid.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY servidor_cid.cod_servidor) as max_servidor_cid
                                  ON max_servidor_cid.cod_servidor = servidor_cid.cod_servidor
                                 AND max_servidor_cid.timestamp = servidor_cid.timestamp
                               WHERE servidor_cid.cod_servidor = '||reContratoServidor.cod_servidor;

                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.cod_cid  := reRegistro.cod_cid;
                rwContratoServidor.data_laudo  := reRegistro.data_laudo;
                
            END IF;
            --DADOS DA TABELA pessoal'||stEntidade||'.servidor_conjuge
            IF arConfiguracao[inIndex] = 'con' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT servidor_conjuge.numcgm as numcgm_conjuge
                                FROM pessoal'||stEntidade||'.servidor_conjuge
                          INNER JOIN (  SELECT servidor_conjuge.cod_servidor
                                             , max(servidor_conjuge.timestamp) as timestamp
                                          FROM pessoal'||stEntidade||'.servidor_conjuge
                                         WHERE servidor_conjuge.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                      GROUP BY servidor_conjuge.cod_servidor) as max_servidor_conjuge
                                  ON max_servidor_conjuge.cod_servidor = servidor_conjuge.cod_servidor
                                 AND max_servidor_conjuge.timestamp = servidor_conjuge.timestamp
                               WHERE servidor_conjuge.bo_excluido = false
                                 AND servidor_conjuge.cod_servidor = '||reContratoServidor.cod_servidor;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.numcgm_conjuge  := reRegistro.numcgm_conjuge;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.servidor_reservista
            IF arConfiguracao[inIndex] = 'res' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT servidor_reservista.nr_carteira_res
                                   , servidor_reservista.cat_reservista
                                   , servidor_reservista.origem_reservista
                                FROM pessoal'||stEntidade||'.servidor_reservista
                               WHERE servidor_reservista.cod_servidor = '||reContratoServidor.cod_servidor;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.nr_carteira_res      := reRegistro.nr_carteira_res;
                rwContratoServidor.cat_reservista       := reRegistro.cat_reservista;
                rwContratoServidor.origem_reservista    := reRegistro.origem_reservista;
            END IF;

            --DADOS DA TABELA cgm
            IF arConfiguracao[inIndex] = 'cgm' OR arConfiguracao[inIndex] = 'all' THEN      
                stSql := '    SELECT sw_cgm.nom_cgm
                                   , sw_cgm_pessoa_fisica.servidor_pis_pasep
                                   , sw_cgm_pessoa_fisica.rg
                                   , cpf
                                   , sw_cgm_pessoa_fisica.dt_nascimento
                                FROM sw_cgm
                          INNER JOIN sw_cgm_pessoa_fisica
                                  ON sw_cgm_pessoa_fisica.numcgm = sw_cgm.numcgm
                               WHERE sw_cgm.numcgm = '||reContratoServidor.numcgm;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoServidor.nom_cgm              := reRegistro.nom_cgm;            
                rwContratoServidor.servidor_pis_pasep   := reRegistro.servidor_pis_pasep; 
                rwContratoServidor.rg                   := reRegistro.rg;                 
                rwContratoServidor.cpf                  := reRegistro.cpf;                
                rwContratoServidor.dt_nascimento        := reRegistro.dt_nascimento;      
            END IF;
                
            inIndex := inIndex + 1;
        END LOOP;
        inIndex := 1;

        RETURN NEXT rwContratoServidor;
    END LOOP;
END;
$$ LANGUAGE 'plpgsql';


CREATE OR REPLACE FUNCTION recuperarContratoPensionista(VARCHAR,VARCHAR,INTEGER,VARCHAR,VARCHAR,VARCHAR) RETURNS SETOF colunasContratoPensionista AS $$
DECLARE
    stConfiguracao                  ALIAS FOR $1;
    stEntidade                      ALIAS FOR $2;
    inCodPeriodoMovimentacao        ALIAS FOR $3;
    stTipoFiltro                    ALIAS FOR $4;
    stValoresFiltro                 ALIAS FOR $5;
    stExercicio                     ALIAS FOR $6;
    rwContratoPensionista           colunasContratoPensionista%ROWTYPE;
    stSql                           VARCHAR := '';
    stSqlWhere                      VARCHAR := '';
    stSqlAux                        VARCHAR;
    inCodTipoAtributo               INTEGER;
    stTimestampFechamentoPeriodo    VARCHAR;
    stCodigos                       VARCHAR;
    stContagemTempo                 VARCHAR;
    reContratoPensionista              RECORD;
    reRegistro                      RECORD;
    crCursor                        REFCURSOR;
    arConfiguracao                  VARCHAR[];
    arValoresFiltro                 VARCHAR[];
    inIndex                         INTEGER := 1;
    inCodOrganograma                INTEGER;
BEGIN
    stTimestampFechamentoPeriodo := ultimoTimestampPeriodoMovimentacao(inCodPeriodoMovimentacao,stEntidade);
    arConfiguracao := string_to_array(stConfiguracao,',');

    stSql := 'SELECT valor
                FROM administracao.configuracao
               WHERE parametro = '|| quote_literal('dtContagemInicial'||stEntidade) ||' AND exercicio = '|| quote_literal(stExercicio)||' ';
    stContagemTempo := selectIntoVarchar(stSql);

    stSql := '    SELECT contrato_pensionista.*
                       , contrato.registro
                       , pensionista.*';

    IF stTipoFiltro = 'atributo_pensionista' OR stTipoFiltro = 'atributo_pensionista_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');

        --Verifica o tipo do atributo
        --TODO - Pegar o cod_modulo e cod_cadastro vindos do parametro stValoresFiltro. atualmente so é passado o cod_atributo
        stSqlAux := 'SELECT cod_tipo FROM administracao.atributo_dinamico WHERE cod_modulo = 22 AND cod_cadastro = 7 AND cod_atributo = '||arValoresFiltro[2];
        inCodTipoAtributo := selectIntoInteger(stSqlAux);
        IF inCodTipoAtributo = 3 OR inCodTipoAtributo = 4 THEN
            stSql := stSql || ', atributo_valor_padrao.valor_padrao as valor_atributo';
        ELSE
            stSql := stSql || ', atributo_contrato_pensionista.valor as valor_atributo';
        END IF;
    ELSE
        stSql := stSql || ', ''''::varchar as valor_atributo';
    END IF;

    stSql := stSql || '
                    FROM pessoal'||stEntidade||'.contrato_pensionista
              INNER JOIN pessoal'||stEntidade||'.contrato
                      ON contrato.cod_contrato = contrato_pensionista.cod_contrato
              INNER JOIN pessoal'||stEntidade||'.pensionista
                      ON pensionista.cod_pensionista = contrato_pensionista.cod_pensionista
                     AND pensionista.cod_contrato_cedente = contrato_pensionista.cod_contrato_cedente
';

    IF stTipoFiltro = 'reg_sub_fun_esp' OR stTipoFiltro = 'reg_sub_fun_esp_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');

        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                                    ON contrato_servidor_regime_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_regime_funcao.cod_regime IN ('||arValoresFiltro[1]||')
                            INNER JOIN pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                    ON contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_sub_divisao_funcao.cod_sub_divisao IN ('||arValoresFiltro[2]||')
                            INNER JOIN pessoal'||stEntidade||'.contrato_servidor_funcao
                                    ON contrato_servidor_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_funcao.cod_cargo IN ('||arValoresFiltro[3]||')';

        stSqlWhere := stSqlWhere || ' AND contrato_servidor_regime_funcao.timestamp = (  SELECT timestamp
                                                                             FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao as contrato_servidor_regime_funcao_interna
                                                                            WHERE contrato_servidor_regime_funcao_interna.cod_contrato = contrato_servidor_regime_funcao.cod_contrato
                                                                              AND contrato_servidor_regime_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                         ORDER BY timestamp desc
                                                                            LIMIT 1 )

                                      AND contrato_servidor_sub_divisao_funcao.timestamp = (  SELECT timestamp
                                                                                                FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao as contrato_servidor_sub_divisao_funcao_interna
                                                                                               WHERE contrato_servidor_sub_divisao_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                                 AND contrato_servidor_sub_divisao_funcao_interna.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                                                                            ORDER BY timestamp desc
                                                                                               LIMIT 1
                                                                                           )
                                      AND contrato_servidor_funcao.timestamp = (  SELECT timestamp
                                                                                    FROM pessoal'||stEntidade||'.contrato_servidor_funcao as contrato_servidor_funcao_interna
                                                                                   WHERE contrato_servidor_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                     AND contrato_servidor_funcao_interna.cod_contrato = contrato_servidor_funcao.cod_contrato
                                                                                ORDER BY timestamp desc
                                                                                   LIMIT 1 )';

        IF trim(arValoresFiltro[4]) != '' THEN
            stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                                        ON contrato_servidor_especialidade_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                       AND contrato_servidor_especialidade_funcao.cod_especialidade IN ('||arValoresFiltro[4]||')';

            stSqlWhere := stSqlWhere || ' AND contrato_servidor_especialidade_funcao.timestamp = ( SELECT timestamp
                                                                                                     FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao as contrato_servidor_especialidade_funcao_interna
                                                                                                    WHERE contrato_servidor_especialidade_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                                      AND contrato_servidor_especialidade_funcao_interna.cod_contrato = contrato_servidor_especialidade_funcao.cod_contrato
                                                                                                 ORDER BY timestamp desc
                                                                                                    LIMIT 1
                                                                                                  )';

        END IF;
    END IF;

    IF stTipoFiltro = 'contrato'                   OR
       stTipoFiltro = 'contrato_pensionista'       OR
       stTipoFiltro = 'contrato_todos'             OR
       stTipoFiltro = 'cgm_contrato'               OR
       stTipoFiltro = 'cgm_contrato_pensionista'   OR
       stTipoFiltro = 'cgm_contrato_todos'      THEN
        stSql := stSql || ' WHERE contrato.cod_contrato IN ('||stValoresFiltro||')';
    END IF;
    IF stTipoFiltro = 'lotacao' OR stTipoFiltro = 'lotacao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_pensionista_orgao
                                    ON contrato_pensionista_orgao.cod_contrato = contrato.cod_contrato
                                   AND contrato_pensionista_orgao.cod_orgao IN ('||stValoresFiltro||')';

        stSqlWhere := stSqlWhere || ' AND contrato_pensionista_orgao.timestamp = ( SELECT timestamp
                                                                                     FROM pessoal'||stEntidade||'.contrato_pensionista_orgao as contrato_pensionista_orgao_interna
                                                                                    WHERE contrato_pensionista_orgao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                      AND contrato_pensionista_orgao_interna.cod_contrato = contrato_pensionista_orgao.cod_contrato
                                                                                 ORDER BY timestamp desc
                                                                                    LIMIT 1
                                                                                  )';

    END IF;
    IF stTipoFiltro = 'local' OR stTipoFiltro = 'local_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_local
                                    ON contrato_servidor_local.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_local.cod_local IN ('||stValoresFiltro||')';

        stSqlWhere := stSqlWhere || ' AND contrato_servidor_local.timestamp = (  SELECT timestamp
                                                                                   FROM pessoal'||stEntidade||'.contrato_servidor_local as contrato_servidor_local_interna
                                                                                  WHERE contrato_servidor_local_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                    AND contrato_servidor_local_interna.cod_contrato = contrato_servidor_local.cod_contrato
                                                                               ORDER BY timestamp desc
                                                                                  LIMIT 1
                                                                                  )';

    END IF;
--     IF stTipoFiltro = 'sub_divisao' OR stTipoFiltro = 'sub_divisao_grupo' THEN
--         stSql := stSql || ' WHERE contrato_servidor.cod_sub_divisao IN ('||stValoresFiltro||')';
--     END IF;
    IF stTipoFiltro = 'sub_divisao_funcao' OR stTipoFiltro = 'sub_divisao_funcao_grupo' THEN
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                                    ON contrato_servidor_sub_divisao_funcao.cod_contrato = contrato_pensionista.cod_contrato_cedente
                                   AND contrato_servidor_sub_divisao_funcao.cod_sub_divisao IN ('||stValoresFiltro||')';

        stSqlWhere := stSqlWhere || ' AND contrato_servidor_sub_divisao_funcao.timestamp = ( SELECT timestamp
                                                                                               FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao as contrato_servidor_sub_divisao_funcao_interna
                                                                                              WHERE contrato_servidor_sub_divisao_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                                AND contrato_servidor_sub_divisao_funcao_interna.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                                                                           ORDER BY timestamp desc
                                                                                              LIMIT 1
                                                                                            )';

    END IF;

    IF stTipoFiltro = 'atributo_pensionista' OR stTipoFiltro = 'atributo_pensionista_grupo' THEN
        arValoresFiltro := string_to_array(stValoresFiltro,'#');
        stSql := stSql || ' INNER JOIN pessoal'||stEntidade||'.atributo_contrato_pensionista
                                    ON atributo_contrato_pensionista.cod_contrato = contrato.cod_contrato
                                   AND atributo_contrato_pensionista.cod_atributo = '||arValoresFiltro[2];
        
        IF arValoresFiltro[1] = '1' THEN
            stSql := stSql || '        AND atributo_contrato_pensionista.valor IN ('||arValoresFiltro[3]||')';
        ELSE
            stSql := stSql || '        AND atributo_contrato_pensionista.valor = '''||arValoresFiltro[3]||'''';
        END IF;

        IF inCodTipoAtributo = 3 OR inCodTipoAtributo = 4 THEN
            stSql := stSql || '
                            INNER JOIN administracao.atributo_valor_padrao
                                    ON atributo_valor_padrao.cod_modulo = atributo_contrato_pensionista.cod_modulo
                                   AND atributo_valor_padrao.cod_cadastro = atributo_contrato_pensionista.cod_cadastro
                                   AND atributo_valor_padrao.cod_atributo = atributo_contrato_pensionista.cod_atributo
                                   AND atributo_valor_padrao.cod_valor = atributo_contrato_pensionista.valor';
        END IF;

        stSqlWhere := stSqlWhere || ' AND atributo_contrato_pensionista.timestamp = (  SELECT timestamp
                                                                                         FROM pessoal'||stEntidade||'.atributo_contrato_pensionista as atributo_contrato_pensionista_interna
                                                                                        WHERE atributo_contrato_pensionista.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                          AND atributo_contrato_pensionista_interna.cod_contrato = atributo_contrato_pensionista.cod_contrato
                                                                                          AND atributo_contrato_pensionista_interna.cod_atributo = atributo_contrato_pensionista.cod_atributo
                                                                                     ORDER BY timestamp desc
                                                                                        LIMIT 1
                                                                                        )';
    END IF;

    stSql := stSql||regexp_replace(stSqlWhere, '^ AND', ' WHERE');
    stSqlWhere := '';

    FOR reContratoPensionista IN EXECUTE stSql LOOP
        rwContratoPensionista.cod_contrato           := reContratoPensionista.cod_contrato;
        rwContratoPensionista.registro               := reContratoPensionista.registro;
        rwContratoPensionista.cod_contrato_cedente   := reContratoPensionista.cod_contrato_cedente;
        rwContratoPensionista.cod_dependencia        := reContratoPensionista.cod_dependencia;
        rwContratoPensionista.cod_pensionista        := reContratoPensionista.cod_pensionista;
        rwContratoPensionista.num_beneficio          := reContratoPensionista.num_beneficio;
        rwContratoPensionista.percentual_pagamento   := reContratoPensionista.percentual_pagamento;
        rwContratoPensionista.dt_inicio_beneficio    := reContratoPensionista.dt_inicio_beneficio;
        rwContratoPensionista.dt_encerramento        := reContratoPensionista.dt_encerramento;
        rwContratoPensionista.motivo_encerramento    := reContratoPensionista.motivo_encerramento;
        rwContratoPensionista.cod_profissao          := reContratoPensionista.cod_profissao;
        rwContratoPensionista.numcgm                 := reContratoPensionista.numcgm;
        rwContratoPensionista.cod_grau               := reContratoPensionista.cod_grau;

        rwContratoPensionista.valor_atributo         := reContratoPensionista.valor_atributo;

        WHILE arConfiguracao[inIndex] IS NOT NULL LOOP
            --DADOS DA TABELA pessoal.contrato_pensionista_conta_salario
            IF arConfiguracao[inIndex] = 'cs' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_pensionista_conta_salario.cod_agencia as cod_agencia_salario
                                   , contrato_pensionista_conta_salario.cod_banco as cod_banco_salario
                                   , contrato_pensionista_conta_salario.nr_conta as nr_conta_salario
                                   , banco.num_banco as num_banco_salario
                                   , banco.nom_banco as nom_banco_salario
                                   , agencia.num_agencia as num_agencia_salario
                                   , agencia.nom_agencia as nom_agencia_salario
                                FROM pessoal'||stEntidade||'.contrato_pensionista_conta_salario
                          INNER JOIN monetario.agencia
                                  ON agencia.cod_banco = contrato_pensionista_conta_salario.cod_banco
                                 AND agencia.cod_agencia = contrato_pensionista_conta_salario.cod_agencia
                          INNER JOIN monetario.banco
                                  ON banco.cod_banco = contrato_pensionista_conta_salario.cod_banco
                               WHERE contrato_pensionista_conta_salario.cod_contrato = '||reContratoPensionista.cod_contrato||'
                                 AND contrato_pensionista_conta_salario.timestamp = ( SELECT timestamp
                                                                                        FROM pessoal'||stEntidade||'.contrato_pensionista_conta_salario as contrato_pensionista_conta_salario_interna
                                                                                       WHERE contrato_pensionista_conta_salario_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                         AND contrato_pensionista_conta_salario_interna.cod_contrato = contrato_pensionista_conta_salario.cod_contrato
                                                                                    ORDER BY timestamp DESC
                                                                                       LIMIT 1 )';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_agencia_salario     := reRegistro.cod_agencia_salario;
                rwContratoPensionista.cod_banco_salario       := reRegistro.cod_banco_salario;
                rwContratoPensionista.nr_conta_salario        := reRegistro.nr_conta_salario;
                rwContratoPensionista.num_banco_salario       := reRegistro.num_banco_salario;
                rwContratoPensionista.nom_banco_salario       := reRegistro.nom_banco_salario;
                rwContratoPensionista.num_agencia_salario     := reRegistro.num_agencia_salario;
                rwContratoPensionista.nom_agencia_salario     := reRegistro.nom_agencia_salario;
            END IF;

            --DADOS DA TABELA pessoal.contrato_pensionista_previdencia
            IF arConfiguracao[inIndex] = 'pr' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_pensionista_previdencia.cod_previdencia
                                FROM pessoal'||stEntidade||'.contrato_pensionista_previdencia
                               WHERE contrato_pensionista_previdencia.timestamp = (  SELECT timestamp
                                                                                       FROM pessoal'||stEntidade||'.contrato_pensionista_previdencia as contrato_pensionista_previdencia_interna
                                                                                      WHERE contrato_pensionista_previdencia_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                        AND contrato_pensionista_previdencia_interna.cod_contrato = contrato_pensionista_previdencia.cod_contrato
                                                                                   ORDER BY timestamp DESC
                                                                                      LIMIT 1 )
                                 AND contrato_pensionista_previdencia.cod_contrato = '||reContratoPensionista.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_previdencia  := reRegistro.cod_previdencia;
            END IF;

            --DADOS DA TABELA pessoal.contrato_pensionista_processo
            IF arConfiguracao[inIndex] = 'pro' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_pensionista_processo.cod_processo
                                FROM pessoal'||stEntidade||'.contrato_pensionista_processo
                               WHERE contrato_pensionista_processo.cod_contrato = '||reContratoPensionista.cod_contrato;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_processo  := reRegistro.cod_processo;
            END IF;

            --DADOS DA TABELA pessoal.contrato_pensionista_orgao
            IF arConfiguracao[inIndex] = 'o' OR arConfiguracao[inIndex] = 'oo' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_pensionista_orgao.cod_orgao
                                   , recuperadescricaoorgao(contrato_pensionista_orgao.cod_orgao,'''||stTimestampFechamentoPeriodo||''') as descricao
                                FROM pessoal'||stEntidade||'.contrato_pensionista_orgao
                               WHERE contrato_pensionista_orgao.cod_contrato = '||reContratoPensionista.cod_contrato||'
                                 AND contrato_pensionista_orgao.timestamp = ( SELECT timestamp
                                                                                FROM pessoal'||stEntidade||'.contrato_pensionista_orgao as contrato_pensionista_orgao_interna
                                                                               WHERE contrato_pensionista_orgao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                 AND contrato_pensionista_orgao_interna.cod_contrato = contrato_pensionista_orgao.cod_contrato
                                                                            ORDER BY timestamp DESC
                                                                               LIMIT 1 )';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_orgao  := reRegistro.cod_orgao;
                rwContratoPensionista.desc_orgao := reRegistro.descricao;

                --DADOS DA TABELA organograma.fn_consulta_orgao
                IF arConfiguracao[inIndex] = 'oo' OR arConfiguracao[inIndex] = 'all' THEN
                    inCodOrganograma := selectIntoInteger('SELECT cod_organograma FROM organograma.orgao_nivel WHERE cod_orgao = '||reRegistro.cod_orgao);
                    stSql := 'SELECT organograma.fn_consulta_orgao('||inCodOrganograma||','||reRegistro.cod_orgao||')';
                    rwContratoPensionista.orgao := selectIntoVarchar(stSql);
                END IF;
            END IF;

            --DADOS DA TABELA pessoal'||stEntidade||'.contrato_servidor_local
            IF arConfiguracao[inIndex] = 'l' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_local.cod_local
                                   , local.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_local
                          INNER JOIN organograma.local
                                  ON local.cod_local = contrato_servidor_local.cod_local
                               WHERE contrato_servidor_local.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_local.timestamp = ( SELECT timestamp
                                                                             FROM pessoal'||stEntidade||'.contrato_servidor_local as contrato_servidor_local_interna
                                                                            WHERE contrato_servidor_local_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                              AND contrato_servidor_local_interna.cod_contrato = contrato_servidor_local.cod_contrato
                                                                         ORDER BY timestamp DESC
                                                                            LIMIT 1 ) ';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_local  := reRegistro.cod_local;
                rwContratoPensionista.desc_local := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal.pensionista_cid
            IF arConfiguracao[inIndex] = 'cid' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT pensionista_cid.cod_cid
                                   , pensionista_cid.data_laudo
                                FROM pessoal'||stEntidade||'.pensionista_cid
                               WHERE pensionista_cid.cod_pensionista = '||reContratoPensionista.cod_pensionista;
                
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                
                rwContratoPensionista.cod_cid  := reRegistro.cod_cid;
                rwContratoPensionista.data_laudo  := reRegistro.data_laudo;
            END IF;

            --DADOS DA TABELA cgm
            IF arConfiguracao[inIndex] = 'cgm' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT sw_cgm.nom_cgm
                                   , sw_cgm_pessoa_fisica.servidor_pis_pasep
                                   , sw_cgm_pessoa_fisica.rg
                                   , cpf
                                   , sw_cgm_pessoa_fisica.dt_nascimento
                                FROM sw_cgm
                          INNER JOIN sw_cgm_pessoa_fisica
                                  ON sw_cgm_pessoa_fisica.numcgm = sw_cgm.numcgm
                               WHERE sw_cgm.numcgm = '||reContratoPensionista.numcgm;
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.nom_cgm              := reRegistro.nom_cgm;
                rwContratoPensionista.rg                   := reRegistro.rg;
                rwContratoPensionista.cpf                  := reRegistro.cpf;
                rwContratoPensionista.dt_nascimento        := reRegistro.dt_nascimento;
            END IF;

            --################################################################
            --Daqui pra baixo pega informações do servidor
            --através do cod_contrato_cedente

            --DADOS DA TABELA pessoal.contrato_servidor_regime_funcao
            IF arConfiguracao[inIndex] = 'rf' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_regime_funcao.cod_regime as cod_regime_funcao
                                   , regime.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao
                          INNER JOIN pessoal'||stEntidade||'.regime
                                  ON regime.cod_regime = contrato_servidor_regime_funcao.cod_regime
                               WHERE contrato_servidor_regime_funcao.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_regime_funcao.timestamp = ( SELECT timestamp
                                                                                   FROM pessoal'||stEntidade||'.contrato_servidor_regime_funcao as contrato_servidor_regime_funcao_interna
                                                                                  WHERE contrato_servidor_regime_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                    AND contrato_servidor_regime_funcao_interna.cod_contrato = contrato_servidor_regime_funcao.cod_contrato
                                                                               ORDER BY timestamp DESC
                                                                                  LIMIT 1 )';
                                                                                  
                raise notice '%', stSql;
                
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_regime_funcao  := reRegistro.cod_regime_funcao;
                rwContratoPensionista.desc_regime_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_sub_divisao_funcao
            IF arConfiguracao[inIndex] = 'sf' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_sub_divisao_funcao.cod_sub_divisao as cod_sub_divisao_funcao
                                   , sub_divisao.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao
                          INNER JOIN pessoal'||stEntidade||'.sub_divisao
                                  ON sub_divisao.cod_sub_divisao = contrato_servidor_sub_divisao_funcao.cod_sub_divisao
                               WHERE contrato_servidor_sub_divisao_funcao.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_sub_divisao_funcao.timestamp = ( SELECT timestamp
                                                                                          FROM pessoal'||stEntidade||'.contrato_servidor_sub_divisao_funcao as contrato_servidor_sub_divisao_funcao_interna
                                                                                         WHERE contrato_servidor_sub_divisao_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                           AND contrato_servidor_sub_divisao_funcao_interna.cod_contrato = contrato_servidor_sub_divisao_funcao.cod_contrato
                                                                                      ORDER BY timestamp DESC
                                                                                         LIMIT 1 ) ';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_sub_divisao_funcao  := reRegistro.cod_sub_divisao_funcao;
                rwContratoPensionista.desc_sub_divisao_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_funcao
            IF arConfiguracao[inIndex] = 'f' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_funcao.cod_cargo as cod_funcao
                                   , cargo.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_funcao
                          INNER JOIN pessoal'||stEntidade||'.cargo
                                  ON cargo.cod_cargo = contrato_servidor_funcao.cod_cargo
                               WHERE contrato_servidor_funcao.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_funcao.timestamp = ( SELECT timestamp
                                                                              FROM pessoal'||stEntidade||'.contrato_servidor_funcao as contrato_servidor_funcao_interna
                                                                             WHERE contrato_servidor_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                               AND contrato_servidor_funcao_interna.cod_contrato = contrato_servidor_funcao.cod_contrato
                                                                          ORDER BY timestamp DESC
                                                                             LIMIT 1 )';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_funcao  := reRegistro.cod_funcao;
                rwContratoPensionista.desc_funcao := reRegistro.descricao;


                stSql := ' SELECT * FROM
                         (   SELECT cargo.cod_cargo
                                 , cbo.codigo as cbo_codigo
                                 , cargo.descricao
                              FROM pessoal'||stEntidade||'.cargo
                                 , pessoal'||stEntidade||'.cbo_cargo
                                 , pessoal'||stEntidade||'.cbo
                             WHERE cargo.cod_cargo = cbo_cargo.cod_cargo
                               AND cbo_cargo.timestamp = ( SELECT timestamp
                                                             FROM pessoal'||stEntidade||'.cbo_cargo as cbo_cargo_interna
                                                            WHERE cbo_cargo_interna.cod_cargo = cbo_cargo.cod_cargo
                                                         ORDER BY timestamp desc
                                                            LIMIT 1 )
                               AND cbo_cargo.cod_cbo = cbo.cod_cbo
                            UNION
                            SELECT cargo.cod_cargo
                                 , cbo.codigo as cbo_codigo
                                 , cargo.descricao
                              FROM pessoal'||stEntidade||'.cargo
                                 , pessoal'||stEntidade||'.especialidade
                                 , pessoal'||stEntidade||'.cbo_especialidade
                                 , pessoal'||stEntidade||'.cbo
                             WHERE cargo.cod_cargo = especialidade.cod_cargo
                               AND especialidade.cod_especialidade = cbo_especialidade.cod_especialidade
                               AND cbo_especialidade.timestamp = (  SELECT timestamp
                                                                      FROM pessoal'||stEntidade||'.cbo_especialidade as cbo_especialidade_interna
                                                                     WHERE cbo_especialidade_interna.cod_especialidade = cbo_especialidade.cod_especialidade
                                                                  ORDER BY timestamp desc
                                                                      LIMIT 1 )
                               AND cbo_especialidade.cod_cbo = cbo.cod_cbo) as funcao
                    WHERE funcao.cod_cargo = '||reRegistro.cod_funcao;


                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.desc_cbo_funcao := reRegistro.descricao;
            END IF;

            --DADOS DA TABELA pessoal.contrato_servidor_especialidade_funcao
            IF arConfiguracao[inIndex] = 'ef' OR arConfiguracao[inIndex] = 'all' THEN
                stSql := '    SELECT contrato_servidor_especialidade_funcao.cod_especialidade as cod_especialidade_funcao
                                   , especialidade.descricao
                                FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao
                          INNER JOIN pessoal'||stEntidade||'.especialidade
                                  ON especialidade.cod_especialidade = contrato_servidor_especialidade_funcao.cod_especialidade
                               WHERE contrato_servidor_especialidade_funcao.cod_contrato = '||reContratoPensionista.cod_contrato_cedente||'
                                 AND contrato_servidor_especialidade_funcao.timestamp = ( SELECT timestamp
                                                                                          FROM pessoal'||stEntidade||'.contrato_servidor_especialidade_funcao as contrato_servidor_especialidade_funcao_interna
                                                                                         WHERE contrato_servidor_especialidade_funcao_interna.timestamp <= '''||stTimestampFechamentoPeriodo||'''
                                                                                           AND contrato_servidor_especialidade_funcao_interna.cod_contrato = contrato_servidor_especialidade_funcao.cod_contrato
                                                                                           ORDER BY timestamp desc
                                                                                           LIMIT 1
                                                                                       )';
                OPEN crCursor FOR EXECUTE stSql;
                    FETCH crCursor INTO reRegistro;
                CLOSE crCursor;
                rwContratoPensionista.cod_especialidade_funcao  := reRegistro.cod_especialidade_funcao;
                rwContratoPensionista.desc_especialidade_funcao := reRegistro.descricao;
            END IF;


            inIndex := inIndex + 1;
        END LOOP;
        inIndex := 1;

        RETURN NEXT rwContratoPensionista;
    END LOOP;
END;
$$ LANGUAGE 'plpgsql';


----------------
-- Ticket #19512
----------------

CREATE OR REPLACE FUNCTION manutencao() RETURNS VOID AS $$
DECLARE

BEGIN
    PERFORM 1
       FROM pg_type
      WHERE typname = 'novoRelatorioFichaFinanceira';
    IF FOUND THEN
        DROP TYPE novoRelatorioFichaFinanceira CASCADE;
    END IF;

    CREATE TYPE novoRelatorioFichaFinanceira AS (
        cod_periodo_movimentacao    INTEGER,
        cod_configuracao            INTEGER,
        cod_complementar            INTEGER,
        descricao_periodo           VARCHAR,
        descricao_configuracao      VARCHAR,
        codigo_evento               VARCHAR,
        descricao_evento            VARCHAR,
        natureza_evento             VARCHAR,
        desdobramento               VARCHAR,
        quantidade                  NUMERIC,
        proventos                   NUMERIC,
        descontos                   NUMERIC,
        valor                       NUMERIC,
        ordem_por_natureza          INTEGER
    );

END;
$$ LANGUAGE 'plpgsql';
SELECT        manutencao();
DROP FUNCTION manutencao();


---------------------------------------------------------
-- CORRECAO DE PK EM folhapagamento.atributo_padrao_valor
---------------------------------------------------------

ALTER TABLE folhapagamento.atributo_padrao_valor DROP CONSTRAINT pk_atributo_padrao_valor;
ALTER TABLE folhapagamento.atributo_padrao_valor ADD  CONSTRAINT pk_atributo_padrao_valor PRIMARY KEY (cod_modulo, cod_cadastro, cod_atributo, cod_padrao, timestamp_padrao);