├── ExemploDelphi ├── FakeDataGeneratorDemo.dpr ├── FakeDataGeneratorDemo.dproj ├── FakeDataGeneratorDemo.res ├── Main.dfm └── Main.pas ├── ExemploLazarus ├── FakeDataGeneratorDemo.ico ├── FakeDataGeneratorDemo.lpi ├── FakeDataGeneratorDemo.lpr ├── FakeDataGeneratorDemo.lps ├── main.lfm └── main.pas ├── FakeDataExample.pas ├── FakeDataGenerator.pas └── README.md /ExemploDelphi/FakeDataGeneratorDemo.dpr: -------------------------------------------------------------------------------- 1 | program FakeDataGeneratorDemo; 2 | 3 | uses 4 | Vcl.Forms, 5 | Main in 'Main.pas' {Form6}, 6 | FakeDataGenerator in '..\FakeDataGenerator.pas'; 7 | 8 | {$R *.res} 9 | 10 | begin 11 | Application.Initialize; 12 | Application.MainFormOnTaskbar := True; 13 | Application.CreateForm(TForm6, Form6); 14 | Application.Run; 15 | end. 16 | -------------------------------------------------------------------------------- /ExemploDelphi/FakeDataGeneratorDemo.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {2BA8E2E9-F528-4AB3-978D-C27D9A777AA6} 4 | 19.5 5 | VCL 6 | True 7 | Debug 8 | Win32 9 | 1 10 | Application 11 | FakeDataGeneratorDemo.dpr 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Cfg_1 29 | true 30 | true 31 | 32 | 33 | true 34 | Base 35 | true 36 | 37 | 38 | true 39 | Cfg_2 40 | true 41 | true 42 | 43 | 44 | .\$(Platform)\$(Config) 45 | .\$(Platform)\$(Config) 46 | false 47 | false 48 | false 49 | false 50 | false 51 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 52 | $(BDS)\bin\delphi_PROJECTICON.ico 53 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 54 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 55 | FakeDataGeneratorDemo 56 | 57 | 58 | compMercadoPago;DataSnapServer;vclwinx;emshosting;fmx;DbxCommonDriver;vclie;bindengine;VCLRESTComponents;FireDACCommonODBC;DBXMSSQLDriver;IndyIPCommon;emsclient;FireDACCommonDriver;i9TGroq;appanalytics;IndyProtocols;vclx;uniGUI28Chart;frxe28;dbxcds;vcledge;IndyIPClient;D2_Pay;i9SendAPI;bindcompvclwinx;AWSStorage;FmxTeeUI;MakerAI;Webstore;emsedge;bindcompfmx;i9Webhook;DBXFirebirdDriver;fsDB28;inetdb;ibmonitor;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;i9CloudDfe_pkg;VclSmp;inet;DataSnapCommon;MelhorEnvio;fmxase;vcltouch;frx28;compPicPay;DBXOdbcDriver;dbrtl;FireDACOracleDriver;FireDACDBXDriver;fmxdae;TeeDB;compCielo;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;frxDB28;FireDACMongoDBDriver;IndySystem;compUseBoletos;FireDACTDataDriver;vcldb;ibxbindings;uSynEdit_R2024;vclFireDAC;fs28;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;compAsaas;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;adortl;dsnapxml;IndyIPServer;DataSnapClient;DataSnapProviderClient;dsnapcon;DBXSybaseASEDriver;uniGUI28VCL;DBXDb2Driver;D4signComponent;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;ibxpress;bindcompvcl;dsnap;DBXSybaseASADriver;CloudService;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;i9PagSeguro;vclib;IntegraNotasDelphi;DataSnapNativeClient;bindcompvclsmp;fmxobj;FMXTee;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 59 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 60 | Debug 61 | true 62 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 63 | 1033 64 | $(BDS)\bin\default_app.manifest 65 | 66 | 67 | DEBUG;$(DCC_Define) 68 | true 69 | false 70 | true 71 | true 72 | true 73 | true 74 | true 75 | 76 | 77 | false 78 | PerMonitorV2 79 | 80 | 81 | false 82 | RELEASE;$(DCC_Define) 83 | 0 84 | 0 85 | 86 | 87 | PerMonitorV2 88 | 89 | 90 | 91 | MainSource 92 | 93 | 94 |
Form6
95 | dfm 96 |
97 | 98 | 99 | Base 100 | 101 | 102 | Cfg_1 103 | Base 104 | 105 | 106 | Cfg_2 107 | Base 108 | 109 |
110 | 111 | Delphi.Personality.12 112 | Application 113 | 114 | 115 | 116 | FakeDataGeneratorDemo.dpr 117 | 118 | 119 | 120 | 121 | 122 | FakeDataGeneratorDemo.exe 123 | true 124 | 125 | 126 | 127 | 128 | 1 129 | 130 | 131 | Contents\MacOS 132 | 1 133 | 134 | 135 | 0 136 | 137 | 138 | 139 | 140 | classes 141 | 64 142 | 143 | 144 | classes 145 | 64 146 | 147 | 148 | 149 | 150 | res\xml 151 | 1 152 | 153 | 154 | res\xml 155 | 1 156 | 157 | 158 | 159 | 160 | library\lib\armeabi-v7a 161 | 1 162 | 163 | 164 | 165 | 166 | library\lib\armeabi 167 | 1 168 | 169 | 170 | library\lib\armeabi 171 | 1 172 | 173 | 174 | 175 | 176 | library\lib\armeabi-v7a 177 | 1 178 | 179 | 180 | 181 | 182 | library\lib\mips 183 | 1 184 | 185 | 186 | library\lib\mips 187 | 1 188 | 189 | 190 | 191 | 192 | library\lib\armeabi-v7a 193 | 1 194 | 195 | 196 | library\lib\arm64-v8a 197 | 1 198 | 199 | 200 | 201 | 202 | library\lib\armeabi-v7a 203 | 1 204 | 205 | 206 | 207 | 208 | res\drawable 209 | 1 210 | 211 | 212 | res\drawable 213 | 1 214 | 215 | 216 | 217 | 218 | res\values 219 | 1 220 | 221 | 222 | res\values 223 | 1 224 | 225 | 226 | 227 | 228 | res\values-v21 229 | 1 230 | 231 | 232 | res\values-v21 233 | 1 234 | 235 | 236 | 237 | 238 | res\values 239 | 1 240 | 241 | 242 | res\values 243 | 1 244 | 245 | 246 | 247 | 248 | res\drawable 249 | 1 250 | 251 | 252 | res\drawable 253 | 1 254 | 255 | 256 | 257 | 258 | res\drawable-xxhdpi 259 | 1 260 | 261 | 262 | res\drawable-xxhdpi 263 | 1 264 | 265 | 266 | 267 | 268 | res\drawable-xxxhdpi 269 | 1 270 | 271 | 272 | res\drawable-xxxhdpi 273 | 1 274 | 275 | 276 | 277 | 278 | res\drawable-ldpi 279 | 1 280 | 281 | 282 | res\drawable-ldpi 283 | 1 284 | 285 | 286 | 287 | 288 | res\drawable-mdpi 289 | 1 290 | 291 | 292 | res\drawable-mdpi 293 | 1 294 | 295 | 296 | 297 | 298 | res\drawable-hdpi 299 | 1 300 | 301 | 302 | res\drawable-hdpi 303 | 1 304 | 305 | 306 | 307 | 308 | res\drawable-xhdpi 309 | 1 310 | 311 | 312 | res\drawable-xhdpi 313 | 1 314 | 315 | 316 | 317 | 318 | res\drawable-mdpi 319 | 1 320 | 321 | 322 | res\drawable-mdpi 323 | 1 324 | 325 | 326 | 327 | 328 | res\drawable-hdpi 329 | 1 330 | 331 | 332 | res\drawable-hdpi 333 | 1 334 | 335 | 336 | 337 | 338 | res\drawable-xhdpi 339 | 1 340 | 341 | 342 | res\drawable-xhdpi 343 | 1 344 | 345 | 346 | 347 | 348 | res\drawable-xxhdpi 349 | 1 350 | 351 | 352 | res\drawable-xxhdpi 353 | 1 354 | 355 | 356 | 357 | 358 | res\drawable-xxxhdpi 359 | 1 360 | 361 | 362 | res\drawable-xxxhdpi 363 | 1 364 | 365 | 366 | 367 | 368 | res\drawable-small 369 | 1 370 | 371 | 372 | res\drawable-small 373 | 1 374 | 375 | 376 | 377 | 378 | res\drawable-normal 379 | 1 380 | 381 | 382 | res\drawable-normal 383 | 1 384 | 385 | 386 | 387 | 388 | res\drawable-large 389 | 1 390 | 391 | 392 | res\drawable-large 393 | 1 394 | 395 | 396 | 397 | 398 | res\drawable-xlarge 399 | 1 400 | 401 | 402 | res\drawable-xlarge 403 | 1 404 | 405 | 406 | 407 | 408 | res\values 409 | 1 410 | 411 | 412 | res\values 413 | 1 414 | 415 | 416 | 417 | 418 | 1 419 | 420 | 421 | Contents\MacOS 422 | 1 423 | 424 | 425 | 0 426 | 427 | 428 | 429 | 430 | Contents\MacOS 431 | 1 432 | .framework 433 | 434 | 435 | Contents\MacOS 436 | 1 437 | .framework 438 | 439 | 440 | Contents\MacOS 441 | 1 442 | .framework 443 | 444 | 445 | 0 446 | 447 | 448 | 449 | 450 | 1 451 | .dylib 452 | 453 | 454 | 1 455 | .dylib 456 | 457 | 458 | 1 459 | .dylib 460 | 461 | 462 | Contents\MacOS 463 | 1 464 | .dylib 465 | 466 | 467 | Contents\MacOS 468 | 1 469 | .dylib 470 | 471 | 472 | Contents\MacOS 473 | 1 474 | .dylib 475 | 476 | 477 | 0 478 | .dll;.bpl 479 | 480 | 481 | 482 | 483 | 1 484 | .dylib 485 | 486 | 487 | 1 488 | .dylib 489 | 490 | 491 | 1 492 | .dylib 493 | 494 | 495 | Contents\MacOS 496 | 1 497 | .dylib 498 | 499 | 500 | Contents\MacOS 501 | 1 502 | .dylib 503 | 504 | 505 | Contents\MacOS 506 | 1 507 | .dylib 508 | 509 | 510 | 0 511 | .bpl 512 | 513 | 514 | 515 | 516 | 0 517 | 518 | 519 | 0 520 | 521 | 522 | 0 523 | 524 | 525 | 0 526 | 527 | 528 | 0 529 | 530 | 531 | Contents\Resources\StartUp\ 532 | 0 533 | 534 | 535 | Contents\Resources\StartUp\ 536 | 0 537 | 538 | 539 | Contents\Resources\StartUp\ 540 | 0 541 | 542 | 543 | 0 544 | 545 | 546 | 547 | 548 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 549 | 1 550 | 551 | 552 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 553 | 1 554 | 555 | 556 | 557 | 558 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 559 | 1 560 | 561 | 562 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 563 | 1 564 | 565 | 566 | 567 | 568 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 569 | 1 570 | 571 | 572 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 573 | 1 574 | 575 | 576 | 577 | 578 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 579 | 1 580 | 581 | 582 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 583 | 1 584 | 585 | 586 | 587 | 588 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 589 | 1 590 | 591 | 592 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 593 | 1 594 | 595 | 596 | 597 | 598 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 599 | 1 600 | 601 | 602 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 603 | 1 604 | 605 | 606 | 607 | 608 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 609 | 1 610 | 611 | 612 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 613 | 1 614 | 615 | 616 | 617 | 618 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 619 | 1 620 | 621 | 622 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 623 | 1 624 | 625 | 626 | 627 | 628 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 629 | 1 630 | 631 | 632 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 633 | 1 634 | 635 | 636 | 637 | 638 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 639 | 1 640 | 641 | 642 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 643 | 1 644 | 645 | 646 | 647 | 648 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 649 | 1 650 | 651 | 652 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 653 | 1 654 | 655 | 656 | 657 | 658 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 659 | 1 660 | 661 | 662 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 663 | 1 664 | 665 | 666 | 667 | 668 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 669 | 1 670 | 671 | 672 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 673 | 1 674 | 675 | 676 | 677 | 678 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 679 | 1 680 | 681 | 682 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 683 | 1 684 | 685 | 686 | 687 | 688 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 689 | 1 690 | 691 | 692 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 693 | 1 694 | 695 | 696 | 697 | 698 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 699 | 1 700 | 701 | 702 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 703 | 1 704 | 705 | 706 | 707 | 708 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 709 | 1 710 | 711 | 712 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 713 | 1 714 | 715 | 716 | 717 | 718 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 719 | 1 720 | 721 | 722 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 723 | 1 724 | 725 | 726 | 727 | 728 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 729 | 1 730 | 731 | 732 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 733 | 1 734 | 735 | 736 | 737 | 738 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 739 | 1 740 | 741 | 742 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 743 | 1 744 | 745 | 746 | 747 | 748 | 1 749 | 750 | 751 | 1 752 | 753 | 754 | 755 | 756 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 757 | 1 758 | 759 | 760 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 761 | 1 762 | 763 | 764 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 765 | 1 766 | 767 | 768 | 769 | 770 | ..\ 771 | 1 772 | 773 | 774 | ..\ 775 | 1 776 | 777 | 778 | ..\ 779 | 1 780 | 781 | 782 | 783 | 784 | 1 785 | 786 | 787 | 1 788 | 789 | 790 | 1 791 | 792 | 793 | 794 | 795 | ..\$(PROJECTNAME).launchscreen 796 | 64 797 | 798 | 799 | ..\$(PROJECTNAME).launchscreen 800 | 64 801 | 802 | 803 | 804 | 805 | 1 806 | 807 | 808 | 1 809 | 810 | 811 | 1 812 | 813 | 814 | 815 | 816 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 817 | 1 818 | 819 | 820 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 821 | 1 822 | 823 | 824 | 825 | 826 | ..\ 827 | 1 828 | 829 | 830 | ..\ 831 | 1 832 | 833 | 834 | ..\ 835 | 1 836 | 837 | 838 | 839 | 840 | Contents 841 | 1 842 | 843 | 844 | Contents 845 | 1 846 | 847 | 848 | Contents 849 | 1 850 | 851 | 852 | 853 | 854 | Contents\Resources 855 | 1 856 | 857 | 858 | Contents\Resources 859 | 1 860 | 861 | 862 | Contents\Resources 863 | 1 864 | 865 | 866 | 867 | 868 | library\lib\armeabi-v7a 869 | 1 870 | 871 | 872 | library\lib\arm64-v8a 873 | 1 874 | 875 | 876 | 1 877 | 878 | 879 | 1 880 | 881 | 882 | 1 883 | 884 | 885 | 1 886 | 887 | 888 | Contents\MacOS 889 | 1 890 | 891 | 892 | Contents\MacOS 893 | 1 894 | 895 | 896 | Contents\MacOS 897 | 1 898 | 899 | 900 | 0 901 | 902 | 903 | 904 | 905 | library\lib\armeabi-v7a 906 | 1 907 | 908 | 909 | 910 | 911 | 1 912 | 913 | 914 | 1 915 | 916 | 917 | 918 | 919 | Assets 920 | 1 921 | 922 | 923 | Assets 924 | 1 925 | 926 | 927 | 928 | 929 | Assets 930 | 1 931 | 932 | 933 | Assets 934 | 1 935 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | True 951 | 952 | 953 | 12 954 | 955 | 956 | 957 | 958 |
959 | -------------------------------------------------------------------------------- /ExemploDelphi/FakeDataGeneratorDemo.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delphicleancode/FakeDataGenerator/be3341aa3782547245629b350a0b77195f5ae710/ExemploDelphi/FakeDataGeneratorDemo.res -------------------------------------------------------------------------------- /ExemploDelphi/Main.dfm: -------------------------------------------------------------------------------- 1 | object Form6: TForm6 2 | Left = 0 3 | Top = 0 4 | Caption = 'Fake Data Generator Demo' 5 | ClientHeight = 700 6 | ClientWidth = 916 7 | Color = clBtnFace 8 | Font.Charset = DEFAULT_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -12 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | TextHeight = 15 14 | object lblTitulo: TLabel 15 | Left = 249 16 | Top = 8 17 | Width = 417 18 | Height = 28 19 | Caption = 'Gerador de Dados Fict'#237'cios para sistemas' 20 | Font.Charset = DEFAULT_CHARSET 21 | Font.Color = clNavy 22 | Font.Height = -20 23 | Font.Name = 'Segoe UI' 24 | Font.Style = [fsBold] 25 | ParentFont = False 26 | end 27 | object memDadosFake: TMemo 28 | Left = 29 29 | Top = 42 30 | Width = 857 31 | Height = 591 32 | Lines.Strings = ( 33 | '') 34 | TabOrder = 0 35 | end 36 | object btnGerar: TButton 37 | Left = 320 38 | Top = 648 39 | Width = 217 40 | Height = 33 41 | Caption = 'Gerar' 42 | Font.Charset = DEFAULT_CHARSET 43 | Font.Color = clWindowText 44 | Font.Height = -18 45 | Font.Name = 'Segoe UI' 46 | Font.Style = [fsBold] 47 | ParentFont = False 48 | TabOrder = 1 49 | OnClick = btnGerarClick 50 | end 51 | end 52 | -------------------------------------------------------------------------------- /ExemploDelphi/Main.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delphicleancode/FakeDataGenerator/be3341aa3782547245629b350a0b77195f5ae710/ExemploDelphi/Main.pas -------------------------------------------------------------------------------- /ExemploLazarus/FakeDataGeneratorDemo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/delphicleancode/FakeDataGenerator/be3341aa3782547245629b350a0b77195f5ae710/ExemploLazarus/FakeDataGeneratorDemo.ico -------------------------------------------------------------------------------- /ExemploLazarus/FakeDataGeneratorDemo.lpi: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <Scaled Value="True"/> 10 | <ResourceType Value="res"/> 11 | <UseXPManifest Value="True"/> 12 | <XPManifest> 13 | <DpiAware Value="True"/> 14 | </XPManifest> 15 | <Icon Value="0"/> 16 | </General> 17 | <BuildModes> 18 | <Item Name="Default" Default="True"/> 19 | </BuildModes> 20 | <PublishOptions> 21 | <Version Value="2"/> 22 | <UseFileFilters Value="True"/> 23 | </PublishOptions> 24 | <RunParams> 25 | <FormatVersion Value="2"/> 26 | </RunParams> 27 | <RequiredPackages> 28 | <Item> 29 | <PackageName Value="LCL"/> 30 | </Item> 31 | </RequiredPackages> 32 | <Units> 33 | <Unit> 34 | <Filename Value="FakeDataGeneratorDemo.lpr"/> 35 | <IsPartOfProject Value="True"/> 36 | </Unit> 37 | <Unit> 38 | <Filename Value="main.pas"/> 39 | <IsPartOfProject Value="True"/> 40 | <ComponentName Value="Form1"/> 41 | <ResourceBaseClass Value="Form"/> 42 | <UnitName Value="Main"/> 43 | </Unit> 44 | <Unit> 45 | <Filename Value="..\FakeDataGenerator.pas"/> 46 | <IsPartOfProject Value="True"/> 47 | </Unit> 48 | </Units> 49 | </ProjectOptions> 50 | <CompilerOptions> 51 | <Version Value="11"/> 52 | <PathDelim Value="\"/> 53 | <Target> 54 | <Filename Value="FakeDataGeneratorDemo"/> 55 | </Target> 56 | <SearchPaths> 57 | <IncludeFiles Value="$(ProjOutDir)"/> 58 | <OtherUnitFiles Value=".."/> 59 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 60 | </SearchPaths> 61 | <Linking> 62 | <Debugging> 63 | <DebugInfoType Value="dsDwarf3"/> 64 | </Debugging> 65 | <Options> 66 | <Win32> 67 | <GraphicApplication Value="True"/> 68 | </Win32> 69 | </Options> 70 | </Linking> 71 | </CompilerOptions> 72 | <Debugging> 73 | <Exceptions> 74 | <Item> 75 | <Name Value="EAbort"/> 76 | </Item> 77 | <Item> 78 | <Name Value="ECodetoolError"/> 79 | </Item> 80 | <Item> 81 | <Name Value="EFOpenError"/> 82 | </Item> 83 | </Exceptions> 84 | </Debugging> 85 | </CONFIG> 86 | -------------------------------------------------------------------------------- /ExemploLazarus/FakeDataGeneratorDemo.lpr: -------------------------------------------------------------------------------- 1 | program FakeDataGeneratorDemo; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | uses 6 | {$IFDEF UNIX} 7 | cthreads, 8 | {$ENDIF} 9 | {$IFDEF HASAMIGA} 10 | athreads, 11 | {$ENDIF} 12 | Interfaces, // this includes the LCL widgetset 13 | Forms, Main, FakeDataGenerator 14 | { you can add units after this }; 15 | 16 | {$R *.res} 17 | 18 | begin 19 | RequireDerivedFormResource:=True; 20 | Application.Scaled:=True; 21 | Application.Initialize; 22 | Application.CreateForm(TForm1, Form1); 23 | Application.Run; 24 | end. 25 | 26 | -------------------------------------------------------------------------------- /ExemploLazarus/FakeDataGeneratorDemo.lps: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectSession> 4 | <PathDelim Value="\"/> 5 | <Version Value="12"/> 6 | <BuildModes Active="Default"/> 7 | <Units> 8 | <Unit> 9 | <Filename Value="FakeDataGeneratorDemo.lpr"/> 10 | <IsPartOfProject Value="True"/> 11 | <EditorIndex Value="-1"/> 12 | <WindowIndex Value="-1"/> 13 | <TopLine Value="-1"/> 14 | <CursorPos X="-1" Y="-1"/> 15 | <UsageCount Value="20"/> 16 | </Unit> 17 | <Unit> 18 | <Filename Value="main.pas"/> 19 | <IsPartOfProject Value="True"/> 20 | <ComponentName Value="Form1"/> 21 | <ResourceBaseClass Value="Form"/> 22 | <UnitName Value="Main"/> 23 | <IsVisibleTab Value="True"/> 24 | <TopLine Value="15"/> 25 | <CursorPos X="17" Y="28"/> 26 | <UsageCount Value="20"/> 27 | <Loaded Value="True"/> 28 | <LoadedDesigner Value="True"/> 29 | </Unit> 30 | <Unit> 31 | <Filename Value="..\FakeDataGenerator.pas"/> 32 | <IsPartOfProject Value="True"/> 33 | <EditorIndex Value="-1"/> 34 | <WindowIndex Value="-1"/> 35 | <TopLine Value="-1"/> 36 | <CursorPos X="-1" Y="-1"/> 37 | <UsageCount Value="20"/> 38 | </Unit> 39 | </Units> 40 | <JumpHistory> 41 | <Position> 42 | <Filename Value="main.pas"/> 43 | </Position> 44 | </JumpHistory> 45 | <RunParams> 46 | <FormatVersion Value="2"/> 47 | <Modes ActiveMode=""/> 48 | </RunParams> 49 | </ProjectSession> 50 | </CONFIG> 51 | -------------------------------------------------------------------------------- /ExemploLazarus/main.lfm: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 786 3 | Height = 826 4 | Top = 52 5 | Width = 922 6 | Caption = 'Form1' 7 | ClientHeight = 826 8 | ClientWidth = 922 9 | DesignTimePPI = 120 10 | LCLVersion = '3.6.0.0' 11 | object lblTitulo: TLabel 12 | Left = 249 13 | Height = 28 14 | Top = 8 15 | Width = 388 16 | Caption = 'Gerador de Dados Fictícios para sistemas' 17 | Font.Color = clNavy 18 | Font.Height = -20 19 | Font.Name = 'Segoe UI' 20 | Font.Style = [fsBold] 21 | ParentFont = False 22 | end 23 | object memDadosFake: TMemo 24 | Left = 29 25 | Height = 694 26 | Top = 42 27 | Width = 857 28 | Lines.Strings = ( 29 | '' 30 | ) 31 | TabOrder = 0 32 | end 33 | object btnGerar: TButton 34 | Left = 328 35 | Height = 33 36 | Top = 752 37 | Width = 217 38 | Caption = 'Gerar' 39 | Font.Color = clWindowText 40 | Font.Height = -18 41 | Font.Name = 'Segoe UI' 42 | Font.Style = [fsBold] 43 | ParentFont = False 44 | TabOrder = 1 45 | OnClick = btnGerarClick 46 | end 47 | end 48 | -------------------------------------------------------------------------------- /ExemploLazarus/main.pas: -------------------------------------------------------------------------------- 1 | unit Main; 2 | 3 | {$mode objfpc}{$H+} 4 | 5 | interface 6 | 7 | uses 8 | Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls; 9 | 10 | type 11 | 12 | { TForm1 } 13 | 14 | TForm1 = class(TForm) 15 | btnGerar: TButton; 16 | lblTitulo: TLabel; 17 | memDadosFake: TMemo; 18 | procedure btnGerarClick(Sender: TObject); 19 | private 20 | 21 | public 22 | 23 | end; 24 | 25 | var 26 | Form1: TForm1; 27 | 28 | implementation 29 | uses FakeDataGenerator; 30 | 31 | {$R *.lfm} 32 | 33 | { TForm1 } 34 | 35 | procedure TForm1.btnGerarClick(Sender: TObject); 36 | var 37 | FakeData: TFakeDataGenerator; 38 | RazaoSocial: string; 39 | begin 40 | try 41 | memDadosFake.Clear; 42 | Randomize; 43 | FakeData := TFakeDataGenerator.Create; 44 | memDadosFake.Lines.Add('============================================='); 45 | 46 | memDadosFake.Lines.Add(''); 47 | memDadosFake.Lines.Add('.:: PESSOA FÍSICA ::.'); 48 | memDadosFake.Lines.Add('CPF: ' + FakeData.GerarCPF); 49 | memDadosFake.Lines.Add('RG: ' + FakeData.GerarRG); 50 | memDadosFake.Lines.Add('PIS: ' + FakeData.GerarPIS); 51 | memDadosFake.Lines.Add('Título de Eleitor: ' + FakeData.GerarTituloEleitor); 52 | memDadosFake.Lines.Add('Telefone: ' + FakeData.GerarTelefone); 53 | memDadosFake.Lines.Add('Celular: ' + FakeData.GerarCelular); 54 | memDadosFake.Lines.Add('Nome Completo: ' + FakeData.GerarNomeCompleto); 55 | memDadosFake.Lines.Add('Nome Completo Feminino: ' + FakeData.GerarNomeCompleto(True)); 56 | memDadosFake.Lines.Add('Cartão Visa: ' + FakeData.GerarCartaoCredito('V')); 57 | memDadosFake.Lines.Add('Cartão aleatório: ' + FakeData.GerarCartaoCredito); 58 | memDadosFake.Lines.Add('Conta Bancária aleatória: ' + FakeData.GerarContaBancaria); 59 | memDadosFake.Lines.Add('Conta BB: ' + FakeData.GerarContaBancaria('001', False)); 60 | memDadosFake.Lines.Add(''); 61 | 62 | memDadosFake.Lines.Add('.:: EMPRESA ::.'); 63 | RazaoSocial := FakeData.GerarRazaoSocial; 64 | memDadosFake.Lines.Add('CNPJ: ' + FakeData.GerarCNPJ); 65 | memDadosFake.Lines.Add('Razão Social: ' + RazaoSocial); 66 | memDadosFake.Lines.Add('Nome Fantasia: '+ FakeData.GerarNomeFantasia(RazaoSocial)); 67 | memDadosFake.Lines.Add('Endereço: ' + FakeData.GerarLogradouro + ', '+ FakeData.GerarNumero); 68 | memDadosFake.Lines.Add('Bairro: ' + FakeData.GerarBairro); 69 | memDadosFake.Lines.Add('Cidade/UF: ' + FakeData.GerarCidade+ '/'+ FakeData.GerarUF); 70 | memDadosFake.Lines.Add('CEP: ' + FakeData.GerarCEP); 71 | memDadosFake.Lines.Add('Email: ' + FakeData.GerarEmail(FakeData.GerarNomeCompleto)); 72 | memDadosFake.Lines.Add('Documento: ' + FakeData.GerarDocumento); 73 | 74 | memDadosFake.Lines.Add(''); 75 | memDadosFake.Lines.Add('.:: VEÍCULO ::.'); 76 | memDadosFake.Lines.Add('RENAVAM: ' + FakeData.GerarRENAVAM); 77 | memDadosFake.Lines.Add('Placa (tradicional): ' + FakeData.GerarPlacaVeiculo); 78 | memDadosFake.Lines.Add('Placa (Mercosul): ' + FakeData.GerarPlacaVeiculo(True)); 79 | 80 | memDadosFake.Lines.Add(''); 81 | memDadosFake.Lines.Add('.:: DADOS DE SAÚDE ::.'); 82 | memDadosFake.Lines.Add('Tipo Sanguíneo: ' + FakeData.GerarTipoSanguineo); 83 | memDadosFake.Lines.Add('Altura: ' + IntToStr(FakeData.GerarAltura) + ' cm'); 84 | memDadosFake.Lines.Add('Peso: ' + FloatToStr(FakeData.GerarPeso) + ' kg'); 85 | memDadosFake.Lines.Add('Pressão Arterial: ' + FakeData.GerarPressaoArterial); 86 | memDadosFake.Lines.Add('Medicamento: ' + FakeData.GerarMedicamento); 87 | memDadosFake.Lines.Add('Especialidade Médica: '+ FakeData.GerarEspecialidadeMedica); 88 | memDadosFake.Lines.Add('Plano de Saúde: ' + FakeData.GerarPlanoSaude); 89 | 90 | memDadosFake.Lines.Add(''); 91 | memDadosFake.Lines.Add('============================================='); 92 | finally 93 | FakeData.Free; 94 | end; 95 | 96 | 97 | end; 98 | 99 | end. 100 | 101 | -------------------------------------------------------------------------------- /FakeDataExample.pas: -------------------------------------------------------------------------------- 1 | program FakeDataExample; 2 | 3 | {$APPTYPE CONSOLE} 4 | 5 | uses 6 | SysUtils, 7 | Classes, 8 | FakeDataGenerator in 'FakeDataGenerator.pas'; 9 | 10 | var 11 | FakeData: TFakeDataGenerator; 12 | i: Integer; 13 | SQL: string; 14 | RazaoSocial: string; 15 | NomeCompleto: string; 16 | 17 | begin 18 | try 19 | Randomize; 20 | FakeData := TFakeDataGenerator.Create; 21 | try 22 | WriteLn('Gerador de Dados Fictícios para ERP Financeiro'); 23 | WriteLn('============================================='); 24 | WriteLn(''); 25 | 26 | // Mostrar exemplos de dados básicos 27 | WriteLn('-- Dados Básicos --'); 28 | WriteLn('CPF: ', FakeData.GerarCPF); 29 | WriteLn('CNPJ: ', FakeData.GerarCNPJ); 30 | WriteLn('Telefone: ', FakeData.GerarTelefone); 31 | WriteLn('Celular: ', FakeData.GerarCelular); 32 | WriteLn('Nome Completo: ', FakeData.GerarNomeCompleto); 33 | WriteLn('Nome Completo Feminino: ', FakeData.GerarNomeCompleto(True)); 34 | 35 | RazaoSocial := FakeData.GerarRazaoSocial; 36 | WriteLn('Razão Social: ', RazaoSocial); 37 | WriteLn('Nome Fantasia: ', FakeData.GerarNomeFantasia(RazaoSocial)); 38 | WriteLn('Endereço: ', FakeData.GerarLogradouro, ', ', FakeData.GerarNumero); 39 | WriteLn('Bairro: ', FakeData.GerarBairro); 40 | WriteLn('Cidade/UF: ', FakeData.GerarCidade, '/', FakeData.GerarUF); 41 | WriteLn('CEP: ', FakeData.GerarCEP); 42 | NomeCompleto := FakeData.GerarNomeCompleto; 43 | WriteLn('Email: ', FakeData.GerarEmail(NomeCompleto)); 44 | WriteLn('Documento: ', FakeData.GerarDocumento); 45 | 46 | WriteLn(''); 47 | 48 | // Exemplos de outros documentos 49 | WriteLn('-- Documentos Adicionais --'); 50 | WriteLn('CNH: ', FakeData.GerarCNH); 51 | WriteLn('RG: ', FakeData.GerarRG); 52 | WriteLn('PIS/PASEP: ', FakeData.GerarPIS); 53 | WriteLn('Título de Eleitor: ', FakeData.GerarTituloEleitor); 54 | WriteLn('RENAVAM: ', FakeData.GerarRENAVAM); 55 | WriteLn('Placa de Veículo (Padrão Antigo): ', FakeData.GerarPlacaVeiculo(False)); 56 | WriteLn('Placa de Veículo (Padrão Mercosul): ', FakeData.GerarPlacaVeiculo(True)); 57 | WriteLn('Inscrição Estadual (SP): ', FakeData.GerarInscricaoEstadual('SP')); 58 | 59 | WriteLn(''); 60 | 61 | // Dados pessoais adicionais 62 | WriteLn('-- Dados Pessoais Adicionais --'); 63 | WriteLn('Data de Nascimento: ', DateToStr(FakeData.GerarDataNascimento)); 64 | WriteLn('Perfil Instagram: ', FakeData.GerarPerfilRedeSocial(NomeCompleto, 'instagram')); 65 | WriteLn('Perfil LinkedIn: ', FakeData.GerarPerfilRedeSocial(NomeCompleto, 'linkedin')); 66 | WriteLn('Estado Civil: ', FakeData.GerarEstadoCivil); 67 | WriteLn('Profissão: ', FakeData.GerarProfissao); 68 | WriteLn('Escolaridade: ', FakeData.GerarEscolaridade); 69 | 70 | WriteLn(''); 71 | 72 | // Dados empresariais e financeiros 73 | WriteLn('-- Dados Empresariais e Financeiros --'); 74 | WriteLn('Cartão de Crédito (Visa): ', FakeData.GerarCartaoCredito('V')); 75 | WriteLn('Cartão de Crédito (Mastercard): ', FakeData.GerarCartaoCredito('M')); 76 | WriteLn('Conta Bancária: ', FakeData.GerarContaBancaria); 77 | WriteLn('CNAE: ', FakeData.GerarCNAE); 78 | WriteLn('Inscrição Municipal: ', FakeData.GerarInscricaoMunicipal); 79 | WriteLn('Departamento: ', FakeData.GerarDepartamento); 80 | WriteLn('Cargo: ', FakeData.GerarCargo); 81 | WriteLn('Chave PIX (CPF): ', FakeData.GerarChavePIX('cpf')); 82 | WriteLn('Chave PIX (Email): ', FakeData.GerarChavePIX('email')); 83 | WriteLn('Chave PIX (Aleatória): ', FakeData.GerarChavePIX('aleatoria')); 84 | 85 | WriteLn(''); 86 | 87 | // Dados financeiros de documentos 88 | WriteLn('-- Documentos Financeiros --'); 89 | WriteLn('Código de Barras do Boleto: ', FakeData.GerarCodigoBarrasBoleto); 90 | WriteLn('Linha Digitável do Boleto: ', FakeData.GerarLinhaDigitavelBoleto); 91 | WriteLn('Código de Rastreio: ', FakeData.GerarCodigoRastreio); 92 | WriteLn('Alíquota de ICMS: ', FormatFloat('0.00%', FakeData.GerarAliquotaImposto('ICMS'))); 93 | WriteLn('Alíquota de ISS: ', FormatFloat('0.00%', FakeData.GerarAliquotaImposto('ISS'))); 94 | WriteLn('Nota Fiscal: ', FakeData.GerarNotaFiscal); 95 | WriteLn('Data Aleatória (últimos 30 dias): ', DateToStr(FakeData.GerarData(Date-30, Date))); 96 | WriteLn('Valor Aleatório (R$ 100 a R$ 1000): R$ ', FormatFloat('#,##0.00', FakeData.GerarValor(100, 1000))); 97 | 98 | WriteLn(''); 99 | 100 | // Dados de saúde 101 | WriteLn('-- Dados de Saúde --'); 102 | WriteLn('Tipo Sanguíneo: ', FakeData.GerarTipoSanguineo); 103 | WriteLn('Altura: ', FakeData.GerarAltura, ' cm'); 104 | WriteLn('Peso: ', FormatFloat('0.0', FakeData.GerarPeso), ' kg'); 105 | WriteLn('Pressão Arterial: ', FakeData.GerarPressaoArterial); 106 | WriteLn('Medicamento: ', FakeData.GerarMedicamento); 107 | WriteLn('Especialidade Médica: ', FakeData.GerarEspecialidadeMedica); 108 | WriteLn('Plano de Saúde: ', FakeData.GerarPlanoSaude); 109 | 110 | WriteLn(''); 111 | 112 | // Dados acadêmicos 113 | WriteLn('-- Dados Acadêmicos --'); 114 | WriteLn('Instituição de Ensino: ', FakeData.GerarNomeInstituicaoEnsino); 115 | WriteLn('Curso de Graduação: ', FakeData.GerarCursoGraduacao); 116 | WriteLn('Área de Formação: ', FakeData.GerarAreaFormacao); 117 | WriteLn('Matrícula Acadêmica: ', FakeData.GerarMatriculaAcademica); 118 | WriteLn('Coeficiente de Rendimento: ', FormatFloat('0.00', FakeData.GerarCoeficienteRendimento)); 119 | WriteLn('Data de Formatura: ', DateToStr(FakeData.GerarDataFormatura)); 120 | WriteLn('Título da Monografia: ', FakeData.GerarTituloMonografia); 121 | 122 | WriteLn(''); 123 | 124 | // Outros dados específicos 125 | WriteLn('-- Outros Dados Específicos --'); 126 | WriteLn('Protocolo: ', FakeData.GerarProtocolo); 127 | WriteLn('SKU de Produto (Eletrônicos): ', FakeData.GerarSKU('ELET')); 128 | WriteLn('Código EAN-13: ', FakeData.GerarEAN13); 129 | WriteLn('Código CID: ', FakeData.GerarCID); 130 | WriteLn('Processo Judicial: ', FakeData.GerarProcessoJudicial); 131 | 132 | WriteLn(''); 133 | 134 | // Exemplo de uso em SQL para cadastro de cliente 135 | WriteLn('-- Exemplo de SQL para Cadastro de Cliente --'); 136 | WriteLn('INSERT INTO PESSOAS ('); 137 | WriteLn(' TIPO, TIPO_CADASTRO, NOME_RAZAO, CPF_CNPJ, TELEFONE, CELULAR,'); 138 | WriteLn(' EMAIL, ENDERECO, NUMERO, BAIRRO, CIDADE, UF, CEP, DATA_CADASTRO'); 139 | WriteLn(') VALUES ('); 140 | NomeCompleto := FakeData.GerarNomeCompleto; 141 | SQL := Format( 142 | ' ''F'', ''Cliente'', ''%s'', ''%s'', ''%s'', ''%s'','+ 143 | ' ''%s'', ''%s'', ''%s'', ''%s'', ''%s'', ''%s'', ''%s'', CURRENT_DATE', 144 | [ 145 | NomeCompleto, 146 | FakeData.GerarCPF, 147 | FakeData.GerarTelefone, 148 | FakeData.GerarCelular, 149 | FakeData.GerarEmail(NomeCompleto), 150 | FakeData.GerarLogradouro, 151 | FakeData.GerarNumero, 152 | FakeData.GerarBairro, 153 | FakeData.GerarCidade, 154 | FakeData.GerarUF, 155 | FakeData.GerarCEP 156 | ] 157 | ); 158 | WriteLn(SQL); 159 | WriteLn(');'); 160 | 161 | WriteLn(''); 162 | 163 | // Exemplo de uso em SQL para contas a receber 164 | WriteLn('-- Exemplo de SQL para Contas a Receber --'); 165 | WriteLn('INSERT INTO CONTAS_RECEBER ('); 166 | WriteLn(' ID_EMPRESA, ID_PESSOA, DOCUMENTO, EMISSAO, VENCIMENTO,'); 167 | WriteLn(' VALOR, DESCRICAO, SITUACAO'); 168 | WriteLn(') VALUES ('); 169 | SQL := Format( 170 | ' 1, 1, ''%s'', CURRENT_DATE, ''%s'','+ 171 | ' %s, ''%s'', ''P''', 172 | [ 173 | FakeData.GerarDocumento, 174 | FormatDateTime('yyyy-mm-dd', FakeData.GerarData(Date, Date + 30)), 175 | StringReplace(FormatFloat('0.00', FakeData.GerarValor(100, 5000)), ',', '.', [rfReplaceAll]), 176 | 'Venda de produtos' 177 | ] 178 | ); 179 | WriteLn(SQL); 180 | WriteLn(');'); 181 | 182 | WriteLn(''); 183 | WriteLn('Pressione ENTER para sair...'); 184 | ReadLn; 185 | finally 186 | FakeData.Free; 187 | end; 188 | except 189 | on E: Exception do 190 | begin 191 | WriteLn('Erro: ', E.Message); 192 | ReadLn; 193 | end; 194 | end; 195 | end. 196 | -------------------------------------------------------------------------------- /FakeDataGenerator.pas: -------------------------------------------------------------------------------- 1 | unit FakeDataGenerator; 2 | 3 | interface 4 | 5 | uses 6 | SysUtils, Classes, Math, DateUtils, StrUtils; 7 | 8 | type 9 | TFakeDataGenerator = class 10 | private 11 | FNomesMasculinos: TStringList; 12 | FSobrenomes : TStringList; 13 | FNomesFemininos : TStringList; 14 | FLogradouros : TStringList; 15 | FCidades : TStringList; 16 | FBairros : TStringList; 17 | FUFs : TStringList; 18 | FMedicamentos : TStringList; 19 | FEspecialidades : TStringList; 20 | FPlanosSaude : TStringList; 21 | FInstituicoesEnsino: TStringList; 22 | FCursosGraduacao: TStringList; 23 | FAreasFormacao : TStringList; 24 | FMarcasVeiculos : TStringList; 25 | FModelosVeiculos: TStringList; 26 | FCoresVeiculos : TStringList; 27 | FCombustiveis : TStringList; 28 | 29 | FCategoriasProdutos : TStringList; 30 | FMarcasProdutos : TStringList; 31 | FAdjetivosProdutos : TStringList; 32 | FStatusPedido : TStringList; 33 | FMetodosPagamento : TStringList; 34 | FStatusPagamento : TStringList; 35 | FComentariosProdutos: TStringList; 36 | 37 | function GerarDigitosCPF(const Digits: string): string; 38 | function GerarDigitosCNPJ(const Digits: string): string; 39 | function GerarDigitosModulo11(const Digits: string; Peso: Integer): string; 40 | function ApenasNumeros(const Str: string): string; 41 | public 42 | constructor Create; 43 | destructor Destroy; override; 44 | 45 | { Documentos Brasileiros } 46 | function GerarCPF(Formatado: Boolean = True): string; 47 | function GerarCNPJ(Formatado: Boolean = True): string; 48 | function GerarCNH: string; 49 | function GerarRG(Formatado: Boolean = True): string; 50 | function GerarInscricaoEstadual(UF: string): string; 51 | function GerarPIS(Formatado: Boolean = True): string; 52 | function GerarRENAVAM: string; 53 | function GerarTituloEleitor(Formatado: Boolean = True): string; 54 | function GerarPlacaVeiculo(Mercosul: Boolean = False): string; 55 | 56 | { Dados Pessoais } 57 | function GerarNome(Feminino: Boolean = False): string; 58 | function GerarNomeCompleto(Feminino: Boolean = False): string; 59 | function GerarTelefone(Formatado: Boolean = True): string; 60 | function GerarCelular(Formatado: Boolean = True): string; 61 | function GerarEmail(const Nome: string): string; 62 | function GerarDataNascimento(IdadeMinima: Integer = 18; IdadeMaxima: Integer = 80): TDateTime; 63 | function GerarPerfilRedeSocial(const Nome: string; RedeSocial: string = 'instagram'): string; 64 | function GerarEstadoCivil: string; 65 | function GerarProfissao: string; 66 | function GerarEscolaridade: string; 67 | 68 | { Dados Empresariais } 69 | function GerarRazaoSocial: string; 70 | function GerarNomeFantasia(const RazaoSocial: string): string; 71 | function GerarDocumento: string; 72 | function GerarCartaoCredito(Bandeira: string = ''): string; 73 | function GerarContaBancaria(Banco: string = ''; Formatado: Boolean = True): string; 74 | function GerarCNAE(Formatado: Boolean = True): string; 75 | function GerarInscricaoMunicipal(Municipio: string = ''): string; 76 | function GerarDepartamento: string; 77 | function GerarCargo: string; 78 | function GerarChavePIX(TipoChave: string = 'aleatoria'): string; 79 | 80 | { Dados de Saúde } 81 | function GerarTipoSanguineo: string; 82 | function GerarAltura(Min: Integer = 150; Max: Integer = 200): Integer; // em cm 83 | function GerarPeso(Min: Integer = 50; Max: Integer = 120): Double; // em kg 84 | function GerarPressaoArterial: string; 85 | function GerarMedicamento: string; 86 | function GerarEspecialidadeMedica: string; 87 | function GerarPlanoSaude: string; 88 | 89 | { Dados Acadêmicos } 90 | function GerarNomeInstituicaoEnsino: string; 91 | function GerarCursoGraduacao: string; 92 | function GerarAreaFormacao: string; 93 | function GerarMatriculaAcademica: string; 94 | function GerarCoeficienteRendimento: Double; // 0 a 10 95 | function GerarDataFormatura(AnoInicio: Integer = 0): TDateTime; 96 | function GerarTituloMonografia: string; 97 | 98 | { Dados de Endereço } 99 | function GerarLogradouro: string; 100 | function GerarNumero: string; 101 | function GerarComplemento: string; 102 | function GerarBairro: string; 103 | function GerarCidade: string; 104 | function GerarUF: string; 105 | function GerarCEP(Formatado: Boolean = True): string; 106 | 107 | { Dados Financeiros } 108 | function GerarData(DataInicial, DataFinal: TDateTime): TDateTime; 109 | function GerarValor(ValorMinimo, ValorMaximo: Double): Double; 110 | function GerarCodigoBarrasBoleto(Banco: string = ''): string; 111 | function GerarLinhaDigitavelBoleto(Banco: string = ''): string; 112 | function GerarCodigoRastreio: string; 113 | function GerarAliquotaImposto(TipoImposto: string = 'ICMS'): Double; 114 | function GerarNotaFiscal(UF: string = ''): string; 115 | 116 | { Outros Dados Específicos } 117 | function GerarProtocolo: string; 118 | function GerarSKU(Categoria: string = ''): string; 119 | function GerarEAN13: string; 120 | function GerarCID: string; 121 | function GerarProcessoJudicial: string; 122 | 123 | { Dados de Veículos } 124 | function GerarMarcaVeiculo: string; 125 | function GerarModeloVeiculo(const Marca: string = ''): string; 126 | function GerarAnoVeiculo(IdadeMaxima: Integer = 20): Integer; 127 | function GerarChassi: string; 128 | function GerarCor: string; 129 | function GerarTipoCombustivel: string; 130 | function GerarQuilometragem(AnoVeiculo: Integer): Integer; 131 | 132 | { Dados de Produtos e E-commerce } 133 | function GerarNomeProduto(Categoria: string = ''): string; 134 | function GerarDescricaoProduto(const NomeProduto: string; TamanhoDescricao: Integer = 2): string; 135 | function GerarCategoriaProduto: string; 136 | function GerarPrecoProduto(ValorMinimo: Double = 10.0; ValorMaximo: Double = 2000.0): Double; 137 | function GerarDescontoProduto(DescontoMaximo: Integer = 50): Integer; 138 | function GerarCodigoProduto: string; 139 | function GerarPesoProduto(PesoMinimo: Integer = 100; PesoMaximo: Integer = 10000): Integer; 140 | function GerarDimensoesProduto: string; 141 | function GerarAvaliacaoProduto: Integer; 142 | function GerarComentarioProduto(Positivo: Boolean = True): string; 143 | function GerarEstoqueProduto(EstoqueMinimo: Integer = 0; EstoqueMaximo: Integer = 500): Integer; 144 | function GerarStatusPedido: string; 145 | function GerarStatusPagamento: string; 146 | function GerarMetodoPagamento: string; 147 | function GerarCupomDesconto(Prefixo: string = ''): string; 148 | function GerarNumeroPedido: string; 149 | function GerarIDTransacao: string; 150 | end; 151 | 152 | implementation 153 | 154 | constructor TFakeDataGenerator.Create; 155 | begin 156 | inherited; 157 | 158 | FNomesMasculinos := TStringList.Create; 159 | FSobrenomes := TStringList.Create; 160 | FNomesFemininos := TStringList.Create; 161 | FLogradouros := TStringList.Create; 162 | FCidades := TStringList.Create; 163 | FBairros := TStringList.Create; 164 | FUFs := TStringList.Create; 165 | FMedicamentos := TStringList.Create; 166 | FEspecialidades := TStringList.Create; 167 | FPlanosSaude := TStringList.Create; 168 | 169 | FInstituicoesEnsino := TStringList.Create; 170 | FCursosGraduacao := TStringList.Create; 171 | FAreasFormacao := TStringList.Create; 172 | 173 | FMarcasVeiculos := TStringList.Create; 174 | FModelosVeiculos := TStringList.Create; 175 | FCoresVeiculos := TStringList.Create; 176 | FCombustiveis := TStringList.Create; 177 | 178 | FCategoriasProdutos := TStringList.Create; 179 | FMarcasProdutos := TStringList.Create; 180 | FAdjetivosProdutos := TStringList.Create; 181 | FStatusPedido := TStringList.Create; 182 | FMetodosPagamento := TStringList.Create; 183 | FStatusPagamento := TStringList.Create; 184 | FComentariosProdutos := TStringList.Create; 185 | 186 | // Inicializar listas com dados 187 | with FNomesMasculinos do 188 | begin 189 | Add('João'); Add('José'); Add('Antônio'); Add('Francisco'); Add('Carlos'); 190 | Add('Paulo'); Add('Pedro'); Add('Lucas'); Add('Luiz'); Add('Marcos'); 191 | Add('Gabriel'); Add('Rafael'); Add('Daniel'); Add('Marcelo'); Add('Bruno'); 192 | Add('Eduardo'); Add('Felipe'); Add('Raimundo'); Add('Rodrigo'); Add('Sebastião'); 193 | end; 194 | 195 | with FNomesFemininos do 196 | begin 197 | Add('Maria'); Add('Ana'); Add('Francisca'); Add('Juliana'); Add('Márcia'); 198 | Add('Fernanda'); Add('Adriana'); Add('Patricia'); Add('Aline'); Add('Sandra'); 199 | Add('Camila'); Add('Amanda'); Add('Bruna'); Add('Jéssica'); Add('Letícia'); 200 | Add('Júlia'); Add('Luciana'); Add('Vanessa'); Add('Mariana'); Add('Gabriela'); 201 | end; 202 | 203 | with FSobrenomes do 204 | begin 205 | Add('Silva'); Add('Santos'); Add('Oliveira'); Add('Souza'); Add('Lima'); 206 | Add('Pereira'); Add('Ferreira'); Add('Costa'); Add('Rodrigues'); Add('Almeida'); 207 | Add('Nascimento'); Add('Carvalho'); Add('Araújo'); Add('Ribeiro'); Add('Gomes'); 208 | Add('Martins'); Add('Correia'); Add('Cavalcanti'); Add('Dias'); Add('Campos'); 209 | end; 210 | 211 | with FLogradouros do 212 | begin 213 | Add('Rua'); Add('Avenida'); Add('Travessa'); Add('Alameda'); Add('Praça'); 214 | end; 215 | 216 | with FBairros do 217 | begin 218 | Add('Centro'); Add('Jardim'); Add('Vila'); Add('Parque'); Add('Bela Vista'); 219 | Add('Santo Antônio'); Add('São José'); Add('Industrial'); Add('Nova Esperança'); 220 | end; 221 | 222 | with FCidades do 223 | begin 224 | Add('São Paulo'); Add('Rio de Janeiro'); Add('Belo Horizonte'); Add('Salvador'); 225 | Add('Fortaleza'); Add('Brasília'); Add('Curitiba'); Add('Manaus'); Add('Recife'); 226 | Add('Porto Alegre'); Add('Belém'); Add('Goiânia'); Add('São Luís'); Add('Maceió'); 227 | end; 228 | 229 | with FUFs do 230 | begin 231 | Add('SP'); Add('RJ'); Add('MG'); Add('BA'); Add('CE'); Add('DF'); Add('PR'); 232 | Add('AM'); Add('PE'); Add('RS'); Add('PA'); Add('GO'); Add('MA'); Add('AL'); 233 | Add('SC'); Add('MT'); Add('MS'); Add('PB'); Add('PI'); Add('RN'); 234 | end; 235 | 236 | // Preencher lista de medicamentos comuns 237 | with FMedicamentos do 238 | begin 239 | Add('Losartana'); Add('Dipirona'); Add('Amoxicilina'); Add('Omeprazol'); 240 | Add('Paracetamol'); Add('Ibuprofeno'); Add('Atenolol'); Add('Metformina'); 241 | Add('Fluoxetina'); Add('Enalapril'); Add('Anlodipino'); Add('Sinvastatina'); 242 | Add('Levotiroxina'); Add('Azitromicina'); Add('Captopril'); Add('Clonazepam'); 243 | Add('Nimesulida'); Add('Dexametasona'); Add('Cefalexina'); Add('Ranitidina'); 244 | end; 245 | 246 | // Preencher lista de especialidades médicas 247 | with FEspecialidades do 248 | begin 249 | Add('Cardiologia'); Add('Dermatologia'); Add('Endocrinologia'); Add('Neurologia'); 250 | Add('Ortopedia'); Add('Pediatria'); Add('Ginecologia'); Add('Psiquiatria'); 251 | Add('Urologia'); Add('Oftalmologia'); Add('Otorrinolaringologia'); Add('Geriatria'); 252 | Add('Oncologia'); Add('Anestesiologia'); Add('Clínica Médica'); Add('Cirurgia Geral'); 253 | Add('Gastroenterologia'); Add('Infectologia'); Add('Nefrologia'); Add('Reumatologia'); 254 | end; 255 | 256 | // Preencher lista de planos de saúde 257 | with FPlanosSaude do 258 | begin 259 | Add('Unimed'); Add('Amil'); Add('SulAmérica'); Add('Bradesco Saúde'); 260 | Add('Notre Dame Intermédica'); Add('Hapvida'); Add('Golden Cross'); Add('Porto Seguro Saúde'); 261 | Add('São Francisco Saúde'); Add('Prevent Senior'); Add('Mediservice'); Add('Care Plus'); 262 | Add('CASSI'); Add('GEAP Saúde'); Add('Allianz Saúde'); Add('OneHealth'); 263 | end; 264 | 265 | // Preencher lista de instituições de ensino 266 | with FInstituicoesEnsino do 267 | begin 268 | Add('Universidade de São Paulo'); 269 | Add('Universidade Estadual de Campinas'); 270 | Add('Universidade Federal do Rio de Janeiro'); 271 | Add('Universidade Federal de Minas Gerais'); 272 | Add('Pontifícia Universidade Católica de São Paulo'); 273 | Add('Universidade de Brasília'); 274 | Add('Universidade Federal do Rio Grande do Sul'); 275 | Add('Universidade Estadual Paulista'); 276 | Add('Universidade Federal da Bahia'); 277 | Add('Universidade Federal de Pernambuco'); 278 | Add('Universidade Federal do Paraná'); 279 | Add('Universidade Federal de Santa Catarina'); 280 | Add('Universidade Federal do Ceará'); 281 | Add('Universidade Federal Fluminense'); 282 | Add('Universidade Federal de São Carlos'); 283 | Add('Universidade Federal de Goiás'); 284 | Add('Universidade do Estado do Rio de Janeiro'); 285 | Add('Universidade Federal do Pará'); 286 | Add('Universidade Federal da Paraíba'); 287 | Add('Universidade Federal de Santa Maria'); 288 | Add('Centro Universitário FEI'); 289 | Add('Faculdade de Tecnologia de São Paulo'); 290 | Add('Instituto Federal de Educação, Ciência e Tecnologia'); 291 | Add('Faculdades Integradas'); 292 | Add('Fundação Getúlio Vargas'); 293 | end; 294 | 295 | // Preencher lista de cursos de graduação 296 | with FCursosGraduacao do 297 | begin 298 | Add('Administração'); 299 | Add('Direito'); 300 | Add('Medicina'); 301 | Add('Engenharia Civil'); 302 | Add('Psicologia'); 303 | Add('Ciência da Computação'); 304 | Add('Odontologia'); 305 | Add('Enfermagem'); 306 | Add('Arquitetura e Urbanismo'); 307 | Add('Engenharia Elétrica'); 308 | Add('Farmácia'); 309 | Add('Contabilidade'); 310 | Add('Pedagogia'); 311 | Add('Nutrição'); 312 | Add('Fisioterapia'); 313 | Add('Publicidade e Propaganda'); 314 | Add('Sistemas de Informação'); 315 | Add('Medicina Veterinária'); 316 | Add('Engenharia de Produção'); 317 | Add('Jornalismo'); 318 | Add('Análise e Desenvolvimento de Sistemas'); 319 | Add('Educação Física'); 320 | Add('Engenharia Mecânica'); 321 | Add('Ciências Econômicas'); 322 | Add('Biomedicina'); 323 | Add('Design'); 324 | Add('Agronomia'); 325 | Add('Relações Internacionais'); 326 | Add('Química'); 327 | Add('Física'); 328 | end; 329 | 330 | // Preencher lista de áreas de formação 331 | with FAreasFormacao do 332 | begin 333 | Add('Ciências Exatas e da Terra'); 334 | Add('Ciências Biológicas'); 335 | Add('Engenharias'); 336 | Add('Ciências da Saúde'); 337 | Add('Ciências Agrárias'); 338 | Add('Ciências Sociais Aplicadas'); 339 | Add('Ciências Humanas'); 340 | Add('Linguística, Letras e Artes'); 341 | Add('Multidisciplinar'); 342 | end; 343 | 344 | // Preencher marcas de veículos 345 | with FMarcasVeiculos do 346 | begin 347 | Add('Volkswagen'); 348 | Add('Fiat'); 349 | Add('Chevrolet'); 350 | Add('Ford'); 351 | Add('Toyota'); 352 | Add('Honda'); 353 | Add('Hyundai'); 354 | Add('Jeep'); 355 | Add('Renault'); 356 | Add('Nissan'); 357 | Add('BMW'); 358 | Add('Mercedes-Benz'); 359 | Add('Audi'); 360 | Add('Mitsubishi'); 361 | Add('Kia'); 362 | Add('Peugeot'); 363 | Add('Citroën'); 364 | Add('Subaru'); 365 | Add('Suzuki'); 366 | Add('Land Rover'); 367 | end; 368 | 369 | // Preencher modelos de veículos (com prefixo da marca para associação) 370 | with FModelosVeiculos do 371 | begin 372 | // Volkswagen 373 | Add('Volkswagen|Gol'); 374 | Add('Volkswagen|Fox'); 375 | Add('Volkswagen|Polo'); 376 | Add('Volkswagen|Golf'); 377 | Add('Volkswagen|Jetta'); 378 | Add('Volkswagen|T-Cross'); 379 | Add('Volkswagen|Tiguan'); 380 | Add('Volkswagen|Saveiro'); 381 | Add('Volkswagen|Amarok'); 382 | Add('Volkswagen|Virtus'); 383 | // Fiat 384 | Add('Fiat|Uno'); 385 | Add('Fiat|Mobi'); 386 | Add('Fiat|Argo'); 387 | Add('Fiat|Cronos'); 388 | Add('Fiat|Toro'); 389 | Add('Fiat|Strada'); 390 | Add('Fiat|Fiorino'); 391 | Add('Fiat|Pulse'); 392 | Add('Fiat|Ducato'); 393 | Add('Fiat|500'); 394 | // Chevrolet 395 | Add('Chevrolet|Onix'); 396 | Add('Chevrolet|Prisma'); 397 | Add('Chevrolet|Cruze'); 398 | Add('Chevrolet|Tracker'); 399 | Add('Chevrolet|S10'); 400 | Add('Chevrolet|Spin'); 401 | Add('Chevrolet|Cobalt'); 402 | Add('Chevrolet|Montana'); 403 | Add('Chevrolet|Equinox'); 404 | Add('Chevrolet|Camaro'); 405 | // Ford 406 | Add('Ford|Ka'); 407 | Add('Ford|EcoSport'); 408 | Add('Ford|Ranger'); 409 | Add('Ford|Focus'); 410 | Add('Ford|Fiesta'); 411 | Add('Ford|Edge'); 412 | Add('Ford|Fusion'); 413 | Add('Ford|Bronco'); 414 | Add('Ford|Mustang'); 415 | Add('Ford|Territory'); 416 | // Toyota 417 | Add('Toyota|Corolla'); 418 | Add('Toyota|Yaris'); 419 | Add('Toyota|Hilux'); 420 | Add('Toyota|SW4'); 421 | Add('Toyota|RAV4'); 422 | Add('Toyota|Etios'); 423 | Add('Toyota|Camry'); 424 | Add('Toyota|Prius'); 425 | Add('Toyota|Land Cruiser'); 426 | Add('Toyota|Corolla Cross'); 427 | // Honda 428 | Add('Honda|Civic'); 429 | Add('Honda|Fit'); 430 | Add('Honda|HR-V'); 431 | Add('Honda|WR-V'); 432 | Add('Honda|CR-V'); 433 | Add('Honda|City'); 434 | Add('Honda|Accord'); 435 | Add('Honda|Jazz'); 436 | // Outros modelos... 437 | end; 438 | 439 | // Preencher cores de veículos 440 | with FCoresVeiculos do 441 | begin 442 | Add('Preto'); 443 | Add('Branco'); 444 | Add('Prata'); 445 | Add('Cinza'); 446 | Add('Vermelho'); 447 | Add('Azul'); 448 | Add('Verde'); 449 | Add('Amarelo'); 450 | Add('Marrom'); 451 | Add('Bege'); 452 | Add('Dourado'); 453 | Add('Vinho'); 454 | Add('Laranja'); 455 | Add('Azul Marinho'); 456 | Add('Grafite'); 457 | Add('Bronze'); 458 | Add('Branco Perolizado'); 459 | Add('Preto Metálico'); 460 | Add('Prata Metálico'); 461 | Add('Vermelho Metálico'); 462 | end; 463 | 464 | // Preencher tipos de combustível 465 | with FCombustiveis do 466 | begin 467 | Add('Gasolina'); 468 | Add('Etanol'); 469 | Add('Flex'); 470 | Add('Diesel'); 471 | Add('GNV'); 472 | Add('Híbrido'); 473 | Add('Elétrico'); 474 | Add('Diesel S10'); 475 | Add('Gasolina Aditivada'); 476 | Add('Etanol Aditivado'); 477 | end; 478 | 479 | // Preencher categorias de produtos 480 | with FCategoriasProdutos do 481 | begin 482 | Add('Eletrônicos'); 483 | Add('Informática'); 484 | Add('Celulares'); 485 | Add('Eletrodomésticos'); 486 | Add('Móveis'); 487 | Add('Decoração'); 488 | Add('Cama, Mesa e Banho'); 489 | Add('Moda Masculina'); 490 | Add('Moda Feminina'); 491 | Add('Moda Infantil'); 492 | Add('Calçados'); 493 | Add('Acessórios'); 494 | Add('Relógios'); 495 | Add('Joias e Semijoias'); 496 | Add('Livros'); 497 | Add('Games'); 498 | Add('Brinquedos'); 499 | Add('Bebês'); 500 | Add('Beleza e Perfumaria'); 501 | Add('Saúde'); 502 | Add('Esportes e Lazer'); 503 | Add('Ferramentas'); 504 | Add('Automotivo'); 505 | Add('Alimentos e Bebidas'); 506 | Add('Pet Shop'); 507 | end; 508 | 509 | // Preencher marcas de produtos 510 | with FMarcasProdutos do 511 | begin 512 | Add('Premium'); 513 | Add('TechPro'); 514 | Add('MasterTech'); 515 | Add('UltraMax'); 516 | Add('EcoLife'); 517 | Add('HomeStyle'); 518 | Add('FashionTrend'); 519 | Add('SportMax'); 520 | Add('NaturalCare'); 521 | Add('KidsFun'); 522 | Add('GlobalBrands'); 523 | Add('EasyHome'); 524 | Add('GourmetChef'); 525 | Add('LifeQuality'); 526 | Add('SmartChoice'); 527 | Add('EcoFriendly'); 528 | Add('ModernLiving'); 529 | Add('ClassicDesign'); 530 | Add('PerfectFit'); 531 | Add('PurePet'); 532 | end; 533 | 534 | // Preencher adjetivos para produtos 535 | with FAdjetivosProdutos do 536 | begin 537 | Add('Profissional'); 538 | Add('Avançado'); 539 | Add('Premium'); 540 | Add('Luxo'); 541 | Add('Ultra'); 542 | Add('Slim'); 543 | Add('Compacto'); 544 | Add('Elegante'); 545 | Add('Moderno'); 546 | Add('Clássico'); 547 | Add('Resistente'); 548 | Add('Durável'); 549 | Add('Econômico'); 550 | Add('Potente'); 551 | Add('Portátil'); 552 | Add('Versátil'); 553 | Add('Inteligente'); 554 | Add('Digital'); 555 | Add('Wireless'); 556 | Add('Ergonômico'); 557 | end; 558 | 559 | // Preencher status de pedido 560 | with FStatusPedido do 561 | begin 562 | Add('Aguardando Pagamento'); 563 | Add('Pagamento Aprovado'); 564 | Add('Em Separação'); 565 | Add('Em Transporte'); 566 | Add('Entregue'); 567 | Add('Cancelado'); 568 | Add('Pagamento Recusado'); 569 | Add('Devolução Solicitada'); 570 | Add('Devolução Aprovada'); 571 | Add('Devolução Concluída'); 572 | Add('Troca Solicitada'); 573 | Add('Troca Aprovada'); 574 | Add('Troca Concluída'); 575 | end; 576 | 577 | // Preencher métodos de pagamento 578 | with FMetodosPagamento do 579 | begin 580 | Add('Cartão de Crédito'); 581 | Add('Cartão de Débito'); 582 | Add('Boleto Bancário'); 583 | Add('Transferência Bancária'); 584 | Add('PIX'); 585 | Add('PayPal'); 586 | Add('PicPay'); 587 | Add('Google Pay'); 588 | Add('Apple Pay'); 589 | Add('Samsung Pay'); 590 | Add('Mercado Pago'); 591 | Add('Vale-Presente'); 592 | end; 593 | 594 | // Preencher status de pagamento 595 | with FStatusPagamento do 596 | begin 597 | Add('Aguardando Pagamento'); 598 | Add('Pagamento Aprovado'); 599 | Add('Pagamento Recusado'); 600 | Add('Pagamento em Análise'); 601 | Add('Pagamento Cancelado'); 602 | Add('Pagamento Estornado'); 603 | Add('Pagamento Parcial'); 604 | Add('Aguardando Reembolso'); 605 | Add('Reembolso Realizado'); 606 | end; 607 | 608 | // Preencher comentários de produtos 609 | with FComentariosProdutos do 610 | begin 611 | // Comentários positivos 612 | Add('Excelente produto, superou minhas expectativas!'); 613 | Add('Ótimo custo-benefício, recomendo.'); 614 | Add('Chegou antes do prazo e em perfeitas condições.'); 615 | Add('Produto de qualidade, acabamento perfeito.'); 616 | Add('Atendeu perfeitamente às minhas necessidades.'); 617 | Add('Estou muito satisfeito com a compra.'); 618 | Add('Funciona muito bem, fácil de usar.'); 619 | Add('Design moderno e qualidade impecável.'); 620 | Add('Um dos melhores produtos que já comprei.'); 621 | Add('Entrega rápida e produto conforme descrição.'); 622 | Add('Durável e resistente, vale cada centavo.'); 623 | Add('Comprei para presentear e a pessoa adorou!'); 624 | Add('Funcionalidades além do esperado. Recomendo!'); 625 | Add('Já é minha terceira compra deste produto. Perfeito!'); 626 | 627 | // Comentários negativos 628 | Add('Não atendeu minhas expectativas, qualidade inferior.'); 629 | Add('Produto chegou com defeito, terei que devolver.'); 630 | Add('Não funciona como deveria, estou decepcionado.'); 631 | Add('Tamanho não corresponde ao anunciado.'); 632 | Add('Material frágil, quebrou no primeiro uso.'); 633 | Add('Demorou muito para entregar e veio com avarias.'); 634 | Add('Cor muito diferente da foto do anúncio.'); 635 | Add('Produto não vale o preço cobrado.'); 636 | Add('Difícil de usar, manual não explica corretamente.'); 637 | Add('Acabamento deixa a desejar para o valor pago.'); 638 | Add('Já apresentou defeito com poucos dias de uso.'); 639 | Add('Assistência técnica não resolveu meu problema.'); 640 | end; 641 | end; 642 | 643 | destructor TFakeDataGenerator.Destroy; 644 | begin 645 | FNomesMasculinos.Free; 646 | FSobrenomes.Free; 647 | FNomesFemininos.Free; 648 | FLogradouros.Free; 649 | FCidades.Free; 650 | FBairros.Free; 651 | FUFs.Free; 652 | FMedicamentos.Free; 653 | FEspecialidades.Free; 654 | FPlanosSaude.Free; 655 | FInstituicoesEnsino.Free; 656 | FCursosGraduacao.Free; 657 | FAreasFormacao.Free; 658 | FMarcasVeiculos.Free; 659 | FModelosVeiculos.Free; 660 | FCoresVeiculos.Free; 661 | FCombustiveis.Free; 662 | FCategoriasProdutos.Free; 663 | FMarcasProdutos.Free; 664 | FAdjetivosProdutos.Free; 665 | FStatusPedido.Free; 666 | FMetodosPagamento.Free; 667 | FStatusPagamento.Free; 668 | FComentariosProdutos.Free; 669 | inherited; 670 | end; 671 | 672 | function TFakeDataGenerator.ApenasNumeros(const Str: string): string; 673 | var 674 | i: Integer; 675 | begin 676 | Result := ''; 677 | for i := 1 to Length(Str) do 678 | if CharInSet(Str[i], ['0'..'9']) then 679 | Result := Result + Str[i]; 680 | end; 681 | 682 | function TFakeDataGenerator.GerarDigitosModulo11(const Digits: string; Peso: Integer): string; 683 | var 684 | i, Sum, Remainder, Digit: Integer; 685 | Weight: Integer; 686 | begin 687 | Sum := 0; 688 | Weight := Peso; 689 | 690 | for i := Length(Digits) downto 1 do 691 | begin 692 | Sum := Sum + (StrToInt(Digits[i]) * Weight); 693 | Dec(Weight); 694 | if Weight < 2 then 695 | Weight := Peso; 696 | end; 697 | 698 | Remainder := Sum mod 11; 699 | 700 | if Remainder < 2 then 701 | Digit := 0 702 | else 703 | Digit := 11 - Remainder; 704 | 705 | Result := IntToStr(Digit); 706 | end; 707 | 708 | function TFakeDataGenerator.GerarDigitosCPF(const Digits: string): string; 709 | var 710 | Digit1, Digit2: string; 711 | begin 712 | Digit1 := GerarDigitosModulo11(Digits, 10); 713 | Digit2 := GerarDigitosModulo11(Digits + Digit1, 11); 714 | Result := Digit1 + Digit2; 715 | end; 716 | 717 | function TFakeDataGenerator.GerarDigitosCNPJ(const Digits: string): string; 718 | var 719 | Digit1, Digit2: string; 720 | i, Sum, Weight, Remainder, Digit: Integer; 721 | begin 722 | // Primeiro dígito 723 | Sum := 0; 724 | Weight := 5; 725 | for i := 1 to 4 do 726 | begin 727 | Sum := Sum + StrToInt(Digits[i]) * Weight; 728 | Dec(Weight); 729 | end; 730 | 731 | Weight := 9; 732 | for i := 5 to 12 do 733 | begin 734 | Sum := Sum + StrToInt(Digits[i]) * Weight; 735 | Dec(Weight); 736 | end; 737 | 738 | Remainder := Sum mod 11; 739 | if Remainder < 2 then 740 | Digit1 := '0' 741 | else 742 | Digit1 := IntToStr(11 - Remainder); 743 | 744 | // Segundo dígito 745 | Sum := 0; 746 | Weight := 6; 747 | for i := 1 to 5 do 748 | begin 749 | Sum := Sum + StrToInt(Digits[i]) * Weight; 750 | Dec(Weight); 751 | end; 752 | 753 | Weight := 9; 754 | for i := 6 to 12 do 755 | begin 756 | Sum := Sum + StrToInt(Digits[i]) * Weight; 757 | Dec(Weight); 758 | end; 759 | 760 | Sum := Sum + StrToInt(Digit1) * 2; 761 | 762 | Remainder := Sum mod 11; 763 | if Remainder < 2 then 764 | Digit2 := '0' 765 | else 766 | Digit2 := IntToStr(11 - Remainder); 767 | 768 | Result := Digit1 + Digit2; 769 | end; 770 | 771 | function TFakeDataGenerator.GerarCPF(Formatado: Boolean = True): string; 772 | var 773 | i: Integer; 774 | CPFNumeros: string; 775 | Digitos: string; 776 | begin 777 | CPFNumeros := ''; 778 | for i := 1 to 9 do 779 | CPFNumeros := CPFNumeros + IntToStr(Random(10)); 780 | 781 | Digitos := GerarDigitosCPF(CPFNumeros); 782 | 783 | if Formatado then 784 | Result := Copy(CPFNumeros, 1, 3) + '.' + 785 | Copy(CPFNumeros, 4, 3) + '.' + 786 | Copy(CPFNumeros, 7, 3) + '-' + 787 | Digitos 788 | else 789 | Result := CPFNumeros + Digitos; 790 | end; 791 | 792 | function TFakeDataGenerator.GerarCNPJ(Formatado: Boolean = True): string; 793 | var 794 | i: Integer; 795 | BaseNumeros: string; 796 | Digitos: string; 797 | begin 798 | BaseNumeros := ''; 799 | for i := 1 to 8 do 800 | BaseNumeros := BaseNumeros + IntToStr(Random(10)); 801 | 802 | BaseNumeros := BaseNumeros + '0001'; // Matriz 803 | 804 | Digitos := GerarDigitosCNPJ(BaseNumeros); 805 | 806 | if Formatado then 807 | Result := Copy(BaseNumeros, 1, 2) + '.' + 808 | Copy(BaseNumeros, 3, 3) + '.' + 809 | Copy(BaseNumeros, 6, 3) + '/' + 810 | Copy(BaseNumeros, 9, 4) + '-' + 811 | Digitos 812 | else 813 | Result := BaseNumeros + Digitos; 814 | end; 815 | 816 | function TFakeDataGenerator.GerarTelefone(Formatado: Boolean = True): string; 817 | var 818 | DDD, Numero: string; 819 | begin 820 | DDD := IntToStr(10 + Random(90)); // DDDs válidos entre 10 e 99 821 | Numero := ''; 822 | 823 | // Gera número fixo (começa com 2, 3, 4 ou 5) 824 | Numero := IntToStr(2 + Random(4)); 825 | 826 | // Complementa com mais 7 números 827 | while Length(Numero) < 8 do 828 | Numero := Numero + IntToStr(Random(10)); 829 | 830 | if Formatado then 831 | Result := '(' + DDD + ') ' + Copy(Numero, 1, 4) + '-' + Copy(Numero, 5, 4) 832 | else 833 | Result := DDD + Numero; 834 | end; 835 | 836 | function TFakeDataGenerator.GerarCelular(Formatado: Boolean = True): string; 837 | var 838 | DDD, Numero: string; 839 | begin 840 | DDD := IntToStr(10 + Random(90)); // DDDs válidos entre 10 e 99 841 | 842 | // Celulares começam com 9 seguido de 8 dígitos 843 | Numero := '9'; 844 | 845 | // Complementa com mais 8 números 846 | while Length(Numero) < 9 do 847 | Numero := Numero + IntToStr(Random(10)); 848 | 849 | if Formatado then 850 | Result := '(' + DDD + ') ' + Copy(Numero, 1, 5) + '-' + Copy(Numero, 6, 4) 851 | else 852 | Result := DDD + Numero; 853 | end; 854 | 855 | function TFakeDataGenerator.GerarCNH: string; 856 | var 857 | i: Integer; 858 | CNH: string; 859 | begin 860 | CNH := ''; 861 | for i := 1 to 11 do 862 | CNH := CNH + IntToStr(Random(10)); 863 | 864 | Result := CNH; 865 | end; 866 | 867 | function TFakeDataGenerator.GerarNome(Feminino: Boolean = False): string; 868 | begin 869 | if Feminino then 870 | Result := FNomesFemininos[Random(FNomesFemininos.Count)] 871 | else 872 | Result := FNomesMasculinos[Random(FNomesMasculinos.Count)]; 873 | end; 874 | 875 | function TFakeDataGenerator.GerarNomeCompleto(Feminino: Boolean = False): string; 876 | var 877 | Nome: string; 878 | NumSobrenomes: Integer; 879 | i: Integer; 880 | begin 881 | if Feminino then 882 | Nome := FNomesFemininos[Random(FNomesFemininos.Count)] 883 | else 884 | Nome := FNomesMasculinos[Random(FNomesMasculinos.Count)]; 885 | 886 | NumSobrenomes := 1 + Random(2); // 1 a 2 sobrenomes 887 | 888 | for i := 1 to NumSobrenomes do 889 | Nome := Nome + ' ' + FSobrenomes[Random(FSobrenomes.Count)]; 890 | 891 | Result := Nome; 892 | end; 893 | 894 | function TFakeDataGenerator.GerarRazaoSocial: string; 895 | var 896 | Prefixos: array[0..9] of string; 897 | Sufixos: array[0..9] of string; 898 | begin 899 | Prefixos[0] := 'Tech'; 900 | Prefixos[1] := 'Grupo'; 901 | Prefixos[2] := 'Industria'; 902 | Prefixos[3] := 'Comercial'; 903 | Prefixos[4] := 'Centro'; 904 | Prefixos[5] := 'Mega'; 905 | Prefixos[6] := 'Super'; 906 | Prefixos[7] := 'Multi'; 907 | Prefixos[8] := 'Nova'; 908 | Prefixos[9] := 'Global'; 909 | 910 | Sufixos[0] := 'Sistemas'; 911 | Sufixos[1] := 'Soluções'; 912 | Sufixos[2] := 'Tecnologia'; 913 | Sufixos[3] := 'Comércio'; 914 | Sufixos[4] := 'Distribuição'; 915 | Sufixos[5] := 'Serviços'; 916 | Sufixos[6] := 'Produtos'; 917 | Sufixos[7] := 'Indústria'; 918 | Sufixos[8] := 'Logística'; 919 | Sufixos[9] := 'Consultoria'; 920 | 921 | Result := Prefixos[Random(10)] + ' ' + 922 | FSobrenomes[Random(FSobrenomes.Count)] + ' ' + 923 | Sufixos[Random(10)] + ' ' + 924 | 'LTDA'; 925 | end; 926 | 927 | function TFakeDataGenerator.GerarNomeFantasia(const RazaoSocial: string): string; 928 | begin 929 | Result := StringReplace(RazaoSocial, ' LTDA', '', [rfReplaceAll, rfIgnoreCase]); 930 | end; 931 | 932 | function TFakeDataGenerator.GerarLogradouro: string; 933 | var 934 | NomesRuas: array[0..9] of string; 935 | begin 936 | NomesRuas[0] := 'das Flores'; 937 | NomesRuas[1] := 'São João'; 938 | NomesRuas[2] := 'Brasil'; 939 | NomesRuas[3] := 'dos Bandeirantes'; 940 | NomesRuas[4] := 'Quinze de Novembro'; 941 | NomesRuas[5] := 'Sete de Setembro'; 942 | NomesRuas[6] := 'Dom Pedro I'; 943 | NomesRuas[7] := 'Santos Dumont'; 944 | NomesRuas[8] := 'Tiradentes'; 945 | NomesRuas[9] := 'José de Alencar'; 946 | 947 | Result := FLogradouros[Random(FLogradouros.Count)] + ' ' + NomesRuas[Random(10)]; 948 | end; 949 | 950 | function TFakeDataGenerator.GerarNumero: string; 951 | begin 952 | Result := IntToStr(1 + Random(9999)); 953 | end; 954 | 955 | function TFakeDataGenerator.GerarComplemento: string; 956 | var 957 | Complementos: array[0..5] of string; 958 | begin 959 | Complementos[0] := 'Apto ' + IntToStr(Random(999)); 960 | Complementos[1] := 'Sala ' + IntToStr(Random(999)); 961 | Complementos[2] := 'Bloco ' + Chr(65 + Random(26)); 962 | Complementos[3] := 'Casa ' + IntToStr(Random(99)); 963 | Complementos[4] := 'Loja ' + IntToStr(Random(99)); 964 | Complementos[5] := ''; // Vazio 965 | 966 | Result := Complementos[Random(6)]; 967 | end; 968 | 969 | function TFakeDataGenerator.GerarBairro: string; 970 | begin 971 | Result := FBairros[Random(FBairros.Count)] + ' ' + 972 | FSobrenomes[Random(FSobrenomes.Count)]; 973 | end; 974 | 975 | function TFakeDataGenerator.GerarCidade: string; 976 | begin 977 | Result := FCidades[Random(FCidades.Count)]; 978 | end; 979 | 980 | function TFakeDataGenerator.GerarUF: string; 981 | begin 982 | Result := FUFs[Random(FUFs.Count)]; 983 | end; 984 | 985 | function TFakeDataGenerator.GerarCEP(Formatado: Boolean = True): string; 986 | var 987 | CEP: string; 988 | i: Integer; 989 | begin 990 | CEP := ''; 991 | for i := 1 to 8 do 992 | CEP := CEP + IntToStr(Random(10)); 993 | 994 | if Formatado then 995 | Result := Copy(CEP, 1, 5) + '-' + Copy(CEP, 6, 3) 996 | else 997 | Result := CEP; 998 | end; 999 | 1000 | function TFakeDataGenerator.GerarEmail(const Nome: string): string; 1001 | var 1002 | Dominios: array[0..4] of string; 1003 | NomeSemAcentos, Parte1, Parte2: string; 1004 | i: Integer; 1005 | begin 1006 | Dominios[0] := 'gmail.com'; 1007 | Dominios[1] := 'hotmail.com'; 1008 | Dominios[2] := 'outlook.com'; 1009 | Dominios[3] := 'yahoo.com.br'; 1010 | Dominios[4] := 'uol.com.br'; 1011 | 1012 | // Remove espaços e acentos 1013 | NomeSemAcentos := AnsiLowerCase(Nome); 1014 | NomeSemAcentos := StringReplace(NomeSemAcentos, ' ', '.', [rfReplaceAll]); 1015 | 1016 | // Substituições de caracteres acentuados 1017 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'á', 'a', [rfReplaceAll]); 1018 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'à', 'a', [rfReplaceAll]); 1019 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'â', 'a', [rfReplaceAll]); 1020 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ã', 'a', [rfReplaceAll]); 1021 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'é', 'e', [rfReplaceAll]); 1022 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ê', 'e', [rfReplaceAll]); 1023 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'í', 'i', [rfReplaceAll]); 1024 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ó', 'o', [rfReplaceAll]); 1025 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ô', 'o', [rfReplaceAll]); 1026 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'õ', 'o', [rfReplaceAll]); 1027 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ú', 'u', [rfReplaceAll]); 1028 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ç', 'c', [rfReplaceAll]); 1029 | 1030 | // Adiciona número aleatório opcional 1031 | if Random(2) = 1 then 1032 | NomeSemAcentos := NomeSemAcentos + IntToStr(Random(1000)); 1033 | 1034 | Result := NomeSemAcentos + '@' + Dominios[Random(5)]; 1035 | end; 1036 | 1037 | function TFakeDataGenerator.GerarData(DataInicial, DataFinal: TDateTime): TDateTime; 1038 | var 1039 | Dias: Integer; 1040 | begin 1041 | Dias := DaysBetween(DataInicial, DataFinal); 1042 | Result := IncDay(DataInicial, Random(Dias + 1)); 1043 | end; 1044 | 1045 | function TFakeDataGenerator.GerarValor(ValorMinimo, ValorMaximo: Double): Double; 1046 | begin 1047 | Result := ValorMinimo + Random * (ValorMaximo - ValorMinimo); 1048 | Result := RoundTo(Result, -2); // Arredonda para 2 casas decimais 1049 | end; 1050 | 1051 | function TFakeDataGenerator.GerarDocumento: string; 1052 | var 1053 | Tipos: array[0..4] of string; 1054 | begin 1055 | Tipos[0] := 'NF-'; 1056 | Tipos[1] := 'FAT-'; 1057 | Tipos[2] := 'BOL-'; 1058 | Tipos[3] := 'REC-'; 1059 | Tipos[4] := 'DUP-'; 1060 | 1061 | Result := Tipos[Random(5)] + IntToStr(Random(100000)); 1062 | end; 1063 | 1064 | function TFakeDataGenerator.GerarInscricaoEstadual(UF: string): string; 1065 | var 1066 | i: Integer; 1067 | IE: string; 1068 | begin 1069 | IE := ''; 1070 | // Formato simplificado para exemplificar - na prática cada UF tem sua regra 1071 | for i := 1 to 9 do 1072 | IE := IE + IntToStr(Random(10)); 1073 | 1074 | Result := IE; 1075 | end; 1076 | 1077 | function TFakeDataGenerator.GerarPIS(Formatado: Boolean = True): string; 1078 | var 1079 | i: Integer; 1080 | PIS: string; 1081 | Soma, Resto, Digito: Integer; 1082 | Peso: array[1..10] of Integer; 1083 | begin 1084 | // Inicializa os pesos para cálculo do dígito verificador 1085 | Peso[1] := 3; 1086 | Peso[2] := 2; 1087 | Peso[3] := 9; 1088 | Peso[4] := 8; 1089 | Peso[5] := 7; 1090 | Peso[6] := 6; 1091 | Peso[7] := 5; 1092 | Peso[8] := 4; 1093 | Peso[9] := 3; 1094 | Peso[10] := 2; 1095 | 1096 | // Gera os 10 primeiros dígitos 1097 | PIS := ''; 1098 | for i := 1 to 10 do 1099 | PIS := PIS + IntToStr(Random(10)); 1100 | 1101 | // Calcula o dígito verificador 1102 | Soma := 0; 1103 | for i := 1 to 10 do 1104 | Soma := Soma + StrToInt(PIS[i]) * Peso[i]; 1105 | 1106 | Resto := Soma mod 11; 1107 | 1108 | if Resto < 2 then 1109 | Digito := 0 1110 | else 1111 | Digito := 11 - Resto; 1112 | 1113 | PIS := PIS + IntToStr(Digito); 1114 | 1115 | if Formatado then 1116 | Result := Copy(PIS, 1, 3) + '.' + 1117 | Copy(PIS, 4, 5) + '.' + 1118 | Copy(PIS, 9, 2) + '-' + 1119 | Copy(PIS, 11, 1) 1120 | else 1121 | Result := PIS; 1122 | end; 1123 | 1124 | function TFakeDataGenerator.GerarRENAVAM: string; 1125 | var 1126 | i: Integer; 1127 | RENAVAM: string; 1128 | Soma, Resto, Digito: Integer; 1129 | Peso: array[1..10] of Integer; 1130 | begin 1131 | // Inicializa os pesos para cálculo do dígito verificador 1132 | Peso[1] := 3; 1133 | Peso[2] := 2; 1134 | Peso[3] := 9; 1135 | Peso[4] := 8; 1136 | Peso[5] := 7; 1137 | Peso[6] := 6; 1138 | Peso[7] := 5; 1139 | Peso[8] := 4; 1140 | Peso[9] := 3; 1141 | Peso[10] := 2; 1142 | 1143 | // Gera os 10 primeiros dígitos, começando com um número não-zero 1144 | RENAVAM := IntToStr(1 + Random(9)); // Primeiro dígito não pode ser zero 1145 | 1146 | for i := 2 to 10 do 1147 | RENAVAM := RENAVAM + IntToStr(Random(10)); 1148 | 1149 | // Calcula o dígito verificador 1150 | Soma := 0; 1151 | for i := 1 to 10 do 1152 | Soma := Soma + StrToInt(RENAVAM[i]) * Peso[i]; 1153 | 1154 | Resto := Soma mod 11; 1155 | 1156 | if Resto < 2 then 1157 | Digito := 0 1158 | else 1159 | Digito := 11 - Resto; 1160 | 1161 | Result := RENAVAM + IntToStr(Digito); 1162 | end; 1163 | 1164 | function TFakeDataGenerator.GerarPlacaVeiculo(Mercosul: Boolean = False): string; 1165 | const 1166 | Letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 1167 | var 1168 | i: Integer; 1169 | Placa: string; 1170 | begin 1171 | // Gera três letras para a parte alfabética 1172 | Placa := ''; 1173 | for i := 1 to 3 do 1174 | Placa := Placa + Letras[Random(Length(Letras)) + 1]; 1175 | 1176 | if Mercosul then 1177 | begin 1178 | // Formato Mercosul: ABC1D23 (3 letras, 1 número, 1 letra, 2 números) 1179 | Placa := Placa + IntToStr(Random(10)) + 1180 | Letras[Random(Length(Letras)) + 1] + 1181 | IntToStr(Random(10)) + IntToStr(Random(10)); 1182 | end 1183 | else 1184 | begin 1185 | // Formato antigo: ABC1234 (3 letras, 4 números) 1186 | Placa := Placa + IntToStr(Random(10)) + 1187 | IntToStr(Random(10)) + IntToStr(Random(10)) + 1188 | IntToStr(Random(10)); 1189 | end; 1190 | 1191 | Result := Placa; 1192 | end; 1193 | 1194 | function TFakeDataGenerator.GerarCartaoCredito(Bandeira: string = ''): string; 1195 | var 1196 | Prefixo: string; 1197 | Comprimento: Integer; 1198 | Cartao: string; 1199 | i, Soma, Digito, ValorDigito: Integer; 1200 | Dobro: Boolean; 1201 | begin 1202 | // Define prefixo e comprimento baseado na bandeira 1203 | if Bandeira = '' then 1204 | Bandeira := Copy('VMAD', Random(4) + 1, 1); // Visa, Mastercard, Amex, Discover 1205 | 1206 | case UpCase(Bandeira[1]) of 1207 | 'V': begin // Visa 1208 | Prefixo := '4'; 1209 | Comprimento := 16; 1210 | end; 1211 | 'M': begin // Mastercard 1212 | Prefixo := '5' + IntToStr(1 + Random(5)); // 51-55 1213 | Comprimento := 16; 1214 | end; 1215 | 'A': begin // American Express 1216 | if Random(2) = 0 then 1217 | Prefixo := '34' 1218 | else 1219 | Prefixo := '37'; 1220 | Comprimento := 15; 1221 | end; 1222 | 'D': begin // Discover 1223 | Prefixo := '6011'; 1224 | Comprimento := 16; 1225 | end; 1226 | else begin // Padrão - Visa 1227 | Prefixo := '4'; 1228 | Comprimento := 16; 1229 | end; 1230 | end; 1231 | 1232 | // Gera os dígitos restantes (exceto o último que é verificador) 1233 | Cartao := Prefixo; 1234 | while Length(Cartao) < Comprimento - 1 do 1235 | Cartao := Cartao + IntToStr(Random(10)); 1236 | 1237 | // Implementa o algoritmo de Luhn para calcular o dígito verificador 1238 | Soma := 0; 1239 | Dobro := False; 1240 | 1241 | for i := Length(Cartao) downto 1 do 1242 | begin 1243 | ValorDigito := StrToInt(Cartao[i]); 1244 | 1245 | if Dobro then 1246 | begin 1247 | ValorDigito := ValorDigito * 2; 1248 | if ValorDigito > 9 then 1249 | ValorDigito := ValorDigito - 9; 1250 | end; 1251 | 1252 | Soma := Soma + ValorDigito; 1253 | Dobro := not Dobro; 1254 | end; 1255 | 1256 | Digito := (10 - (Soma mod 10)) mod 10; 1257 | 1258 | Result := Cartao + IntToStr(Digito); 1259 | 1260 | // Formata o número do cartão, se desejar adicionar formatação 1261 | // Ex: XXXX-XXXX-XXXX-XXXX 1262 | end; 1263 | 1264 | function TFakeDataGenerator.GerarContaBancaria(Banco: string = ''; Formatado: Boolean = True): string; 1265 | var 1266 | BancoNum, Agencia, Conta, DigitoAgencia, DigitoConta: string; 1267 | i, Soma, Resto, Digito, Valor: Integer; 1268 | BancosComuns: array[0..4] of string; 1269 | begin 1270 | // Lista dos bancos mais comuns 1271 | BancosComuns[0] := '001'; // Banco do Brasil 1272 | BancosComuns[1] := '341'; // Itaú 1273 | BancosComuns[2] := '033'; // Santander 1274 | BancosComuns[3] := '104'; // Caixa Econômica 1275 | BancosComuns[4] := '237'; // Bradesco 1276 | 1277 | // Se não foi especificado um banco, escolhe um aleatoriamente 1278 | if Banco = '' then 1279 | BancoNum := BancosComuns[Random(5)] 1280 | else 1281 | BancoNum := Banco; 1282 | 1283 | // Gera número da agência (4 dígitos) 1284 | Agencia := ''; 1285 | for i := 1 to 4 do 1286 | Agencia := Agencia + IntToStr(Random(10)); 1287 | 1288 | // Gera dígito verificador da agência (alguns bancos usam) 1289 | Soma := 0; 1290 | for i := 1 to 4 do 1291 | begin 1292 | Valor := StrToInt(Agencia[i]) * (5 - i); 1293 | Soma := Soma + Valor; 1294 | end; 1295 | 1296 | Resto := Soma mod 11; 1297 | if Resto = 0 then 1298 | DigitoAgencia := '0' 1299 | else if Resto = 1 then 1300 | DigitoAgencia := 'X' 1301 | else 1302 | DigitoAgencia := IntToStr(11 - Resto); 1303 | 1304 | // Gera número da conta (entre 5 e 8 dígitos, dependendo do banco) 1305 | Conta := ''; 1306 | for i := 1 to 6 + Random(3) do // 6 a 8 dígitos 1307 | Conta := Conta + IntToStr(Random(10)); 1308 | 1309 | // Gera dígito verificador da conta 1310 | Soma := 0; 1311 | for i := 1 to Length(Conta) do 1312 | begin 1313 | Valor := StrToInt(Conta[i]) * ((Length(Conta) + 1) - i); 1314 | Soma := Soma + Valor; 1315 | end; 1316 | 1317 | Resto := Soma mod 11; 1318 | if Resto = 0 then 1319 | DigitoConta := '0' 1320 | else if Resto = 1 then 1321 | DigitoConta := 'X' 1322 | else 1323 | DigitoConta := IntToStr(11 - Resto); 1324 | 1325 | if Formatado then 1326 | Result := 'Banco: ' + BancoNum + ' - Agência: ' + Agencia + '-' + DigitoAgencia + 1327 | ' - Conta: ' + Conta + '-' + DigitoConta 1328 | else 1329 | Result := BancoNum + Agencia + DigitoAgencia + Conta + DigitoConta; 1330 | end; 1331 | 1332 | function TFakeDataGenerator.GerarTituloEleitor(Formatado: Boolean = True): string; 1333 | var 1334 | i, Soma, Resto, Digito1, Digito2: Integer; 1335 | UF, Titulo, Zona, Secao: string; 1336 | UFCodigos: array[0..26] of string; 1337 | begin 1338 | // Códigos das UFs para título de eleitor 1339 | UFCodigos[0] := '01'; // SP 1340 | UFCodigos[1] := '02'; // MG 1341 | UFCodigos[2] := '03'; // RJ 1342 | UFCodigos[3] := '04'; // RS 1343 | UFCodigos[4] := '05'; // BA 1344 | UFCodigos[5] := '06'; // PR 1345 | UFCodigos[6] := '07'; // CE 1346 | UFCodigos[7] := '08'; // PE 1347 | UFCodigos[8] := '09'; // SC 1348 | UFCodigos[9] := '10'; // GO 1349 | UFCodigos[10] := '11'; // MA 1350 | UFCodigos[11] := '12'; // PB 1351 | UFCodigos[12] := '13'; // PA 1352 | UFCodigos[13] := '14'; // ES 1353 | UFCodigos[14] := '15'; // PI 1354 | UFCodigos[15] := '16'; // RN 1355 | UFCodigos[16] := '17'; // AL 1356 | UFCodigos[17] := '18'; // MT 1357 | UFCodigos[18] := '19'; // MS 1358 | UFCodigos[19] := '20'; // DF 1359 | UFCodigos[20] := '21'; // SE 1360 | UFCodigos[21] := '22'; // AM 1361 | UFCodigos[22] := '23'; // RO 1362 | UFCodigos[23] := '24'; // AC 1363 | UFCodigos[24] := '25'; // AP 1364 | UFCodigos[25] := '26'; // RR 1365 | UFCodigos[26] := '27'; // TO 1366 | 1367 | // Seleciona UF aleatória 1368 | UF := UFCodigos[Random(27)]; 1369 | 1370 | // Gera 8 dígitos para o número do título 1371 | Titulo := ''; 1372 | for i := 1 to 8 do 1373 | Titulo := Titulo + IntToStr(Random(10)); 1374 | 1375 | // Calcula o primeiro dígito verificador (baseado no estado) 1376 | Soma := StrToInt(UF) * 9 + 1377 | StrToInt(Titulo[1]) * 8 + 1378 | StrToInt(Titulo[2]) * 7 + 1379 | StrToInt(Titulo[3]) * 6 + 1380 | StrToInt(Titulo[4]) * 5 + 1381 | StrToInt(Titulo[5]) * 4 + 1382 | StrToInt(Titulo[6]) * 3 + 1383 | StrToInt(Titulo[7]) * 2 + 1384 | StrToInt(Titulo[8]) * 1; 1385 | 1386 | Resto := Soma mod 11; 1387 | if Resto = 10 then 1388 | Digito1 := 0 1389 | else 1390 | Digito1 := Resto; 1391 | 1392 | // Calcula o segundo dígito verificador 1393 | Soma := StrToInt(Titulo[1]) * 9 + 1394 | StrToInt(Titulo[2]) * 8 + 1395 | StrToInt(Titulo[3]) * 7 + 1396 | StrToInt(Titulo[4]) * 6 + 1397 | StrToInt(Titulo[5]) * 5 + 1398 | StrToInt(Titulo[6]) * 4 + 1399 | StrToInt(Titulo[7]) * 3 + 1400 | StrToInt(Titulo[8]) * 2 + 1401 | Digito1 * 1; 1402 | 1403 | Resto := Soma mod 11; 1404 | if Resto = 10 then 1405 | Digito2 := 0 1406 | else 1407 | Digito2 := Resto; 1408 | 1409 | // Gera zona e seção 1410 | Zona := Format('%.3d', [Random(999) + 1]); // Zona de 001 a 999 1411 | Secao := Format('%.4d', [Random(9999) + 1]); // Seção de 0001 a 9999 1412 | 1413 | if Formatado then 1414 | Result := Titulo + Format('%.2d%.2d', [Digito1, Digito2]) + ' ' + Zona + ' ' + Secao 1415 | else 1416 | Result := Titulo + Format('%.2d%.2d', [Digito1, Digito2]) + Zona + Secao; 1417 | end; 1418 | 1419 | function TFakeDataGenerator.GerarRG(Formatado: Boolean = True): string; 1420 | var 1421 | i, Soma, Digito: Integer; 1422 | RG: string; 1423 | DigitoStr: string; 1424 | begin 1425 | // Gera os primeiros dígitos (normalmente de 7 a 9 dígitos) 1426 | RG := ''; 1427 | for i := 1 to 8 do // Usaremos 8 dígitos + DV 1428 | RG := RG + IntToStr(Random(10)); 1429 | 1430 | // Calcula o dígito verificador (algoritmo simplificado, sem especificidade por UF) 1431 | Soma := 0; 1432 | for i := 1 to Length(RG) do 1433 | Soma := Soma + StrToInt(RG[i]) * (10 - i); 1434 | 1435 | Digito := Soma mod 11; 1436 | 1437 | case Digito of 1438 | 0..9: DigitoStr := IntToStr(Digito); 1439 | 10: DigitoStr := 'X'; 1440 | else 1441 | DigitoStr := '0'; 1442 | end; 1443 | 1444 | // Formata o RG se necessário 1445 | if Formatado then 1446 | Result := Copy(RG, 1, 2) + '.' + 1447 | Copy(RG, 3, 3) + '.' + 1448 | Copy(RG, 6, 3) + '-' + 1449 | DigitoStr 1450 | else 1451 | Result := RG + DigitoStr; 1452 | end; 1453 | 1454 | function TFakeDataGenerator.GerarDataNascimento(IdadeMinima: Integer = 18; IdadeMaxima: Integer = 80): TDateTime; 1455 | var 1456 | DiasAno: Integer; 1457 | DataAtual: TDateTime; 1458 | AnosAleatorios: Integer; 1459 | begin 1460 | DataAtual := Date; 1461 | DiasAno := 365; 1462 | AnosAleatorios := IdadeMinima + Random(IdadeMaxima - IdadeMinima + 1); 1463 | Result := IncDay(DataAtual, -AnosAleatorios * DiasAno - Random(DiasAno)); // Subtrai anos e dias aleatórios 1464 | end; 1465 | 1466 | function TFakeDataGenerator.GerarPerfilRedeSocial(const Nome: string; RedeSocial: string = 'instagram'): string; 1467 | var 1468 | NomeSemAcentos, NomeUsuario: string; 1469 | Separadores: array[0..3] of string; 1470 | PossivelSufixo: Boolean; 1471 | begin 1472 | // Remove espaços e acentos 1473 | NomeSemAcentos := AnsiLowerCase(Nome); 1474 | NomeSemAcentos := StringReplace(NomeSemAcentos, ' ', '', [rfReplaceAll]); 1475 | 1476 | // Substituições de caracteres acentuados 1477 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'á', 'a', [rfReplaceAll]); 1478 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'à', 'a', [rfReplaceAll]); 1479 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'â', 'a', [rfReplaceAll]); 1480 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ã', 'a', [rfReplaceAll]); 1481 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'é', 'e', [rfReplaceAll]); 1482 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ê', 'e', [rfReplaceAll]); 1483 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'í', 'i', [rfReplaceAll]); 1484 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ó', 'o', [rfReplaceAll]); 1485 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ô', 'o', [rfReplaceAll]); 1486 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'õ', 'o', [rfReplaceAll]); 1487 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ú', 'u', [rfReplaceAll]); 1488 | NomeSemAcentos := StringReplace(NomeSemAcentos, 'ç', 'c', [rfReplaceAll]); 1489 | 1490 | // Define variações possíveis para nome de usuário 1491 | Separadores[0] := ''; 1492 | Separadores[1] := '.'; 1493 | Separadores[2] := '_'; 1494 | Separadores[3] := ''; 1495 | 1496 | // Cria nome de usuário básico 1497 | NomeUsuario := NomeSemAcentos; 1498 | 1499 | // Adiciona sufixo aleatório em alguns casos 1500 | PossivelSufixo := Random(3) > 0; // 2/3 de chance de adicionar sufixo 1501 | 1502 | if PossivelSufixo then 1503 | begin 1504 | case Random(5) of 1505 | 0: NomeUsuario := NomeUsuario + Separadores[Random(4)] + IntToStr(Random(100)); 1506 | 1: NomeUsuario := NomeUsuario + Separadores[Random(4)] + IntToStr(YearOf(Date) - Random(30)); 1507 | 2: NomeUsuario := NomeUsuario + Separadores[Random(4)] + 'real'; 1508 | 3: NomeUsuario := NomeUsuario + Separadores[Random(4)] + 'br'; 1509 | 4: NomeUsuario := NomeUsuario + Separadores[Random(4)] + 'oficial'; 1510 | end; 1511 | end; 1512 | 1513 | // Formata de acordo com a rede social 1514 | RedeSocial := AnsiLowerCase(RedeSocial); 1515 | if (RedeSocial = 'twitter') or (RedeSocial = 'x') then 1516 | Result := '@' + NomeUsuario 1517 | else if RedeSocial = 'instagram' then 1518 | Result := '@' + NomeUsuario 1519 | else if RedeSocial = 'linkedin' then 1520 | Result := 'linkedin.com/in/' + NomeUsuario 1521 | else if RedeSocial = 'facebook' then 1522 | Result := 'facebook.com/' + NomeUsuario 1523 | else 1524 | Result := '@' + NomeUsuario; 1525 | end; 1526 | 1527 | function TFakeDataGenerator.GerarEstadoCivil: string; 1528 | var 1529 | EstadosCivis: array[0..4] of string; 1530 | Probabilidades: array[0..4] of Integer; 1531 | ValorSorteio, SomaProbabilidades, i: Integer; 1532 | begin 1533 | // Estados civis com suas respectivas probabilidades 1534 | EstadosCivis[0] := 'Solteiro(a)'; 1535 | EstadosCivis[1] := 'Casado(a)'; 1536 | EstadosCivis[2] := 'Divorciado(a)'; 1537 | EstadosCivis[3] := 'Viúvo(a)'; 1538 | EstadosCivis[4] := 'União Estável'; 1539 | 1540 | // Probabilidades relativas (ajuste conforme necessário) 1541 | Probabilidades[0] := 40; // 40% de chance de ser solteiro 1542 | Probabilidades[1] := 35; // 35% de chance de ser casado 1543 | Probabilidades[2] := 10; // 10% de chance de ser divorciado 1544 | Probabilidades[3] := 5; // 5% de chance de ser viúvo 1545 | Probabilidades[4] := 10; // 10% de chance de estar em união estável 1546 | 1547 | // Calcula soma das probabilidades 1548 | SomaProbabilidades := 0; 1549 | for i := 0 to 4 do 1550 | SomaProbabilidades := SomaProbabilidades + Probabilidades[i]; 1551 | 1552 | // Sorteia um valor dentro do range de probabilidades 1553 | ValorSorteio := Random(SomaProbabilidades) + 1; 1554 | 1555 | // Determina qual estado civil foi sorteado 1556 | SomaProbabilidades := 0; 1557 | for i := 0 to 4 do 1558 | begin 1559 | SomaProbabilidades := SomaProbabilidades + Probabilidades[i]; 1560 | if ValorSorteio <= SomaProbabilidades then 1561 | begin 1562 | Result := EstadosCivis[i]; 1563 | Break; 1564 | end; 1565 | end; 1566 | end; 1567 | 1568 | function TFakeDataGenerator.GerarProfissao: string; 1569 | var 1570 | Profissoes: array[0..19] of string; 1571 | begin 1572 | Profissoes[0] := 'Administrador(a)'; 1573 | Profissoes[1] := 'Advogado(a)'; 1574 | Profissoes[2] := 'Analista de Sistemas'; 1575 | Profissoes[3] := 'Arquiteto(a)'; 1576 | Profissoes[4] := 'Contador(a)'; 1577 | Profissoes[5] := 'Designer'; 1578 | Profissoes[6] := 'Economista'; 1579 | Profissoes[7] := 'Enfermeiro(a)'; 1580 | Profissoes[8] := 'Engenheiro(a)'; 1581 | Profissoes[9] := 'Farmacêutico(a)'; 1582 | Profissoes[10] := 'Médico(a)'; 1583 | Profissoes[11] := 'Professor(a)'; 1584 | Profissoes[12] := 'Programador(a)'; 1585 | Profissoes[13] := 'Psicólogo(a)'; 1586 | Profissoes[14] := 'Técnico(a) em Informática'; 1587 | Profissoes[15] := 'Vendedor(a)'; 1588 | Profissoes[16] := 'Gerente Comercial'; 1589 | Profissoes[17] := 'Fisioterapeuta'; 1590 | Profissoes[18] := 'Nutricionista'; 1591 | Profissoes[19] := 'Empresário(a)'; 1592 | 1593 | Result := Profissoes[Random(20)]; 1594 | end; 1595 | 1596 | function TFakeDataGenerator.GerarEscolaridade: string; 1597 | var 1598 | NiveisEscolaridade: array[0..6] of string; 1599 | Probabilidades: array[0..6] of Integer; 1600 | ValorSorteio, SomaProbabilidades, i: Integer; 1601 | begin 1602 | // Níveis de escolaridade 1603 | NiveisEscolaridade[0] := 'Ensino Fundamental Incompleto'; 1604 | NiveisEscolaridade[1] := 'Ensino Fundamental Completo'; 1605 | NiveisEscolaridade[2] := 'Ensino Médio Incompleto'; 1606 | NiveisEscolaridade[3] := 'Ensino Médio Completo'; 1607 | NiveisEscolaridade[4] := 'Ensino Superior Incompleto'; 1608 | NiveisEscolaridade[5] := 'Ensino Superior Completo'; 1609 | NiveisEscolaridade[6] := 'Pós-graduação'; 1610 | 1611 | // Probabilidades relativas (ajuste conforme necessário) 1612 | Probabilidades[0] := 5; // 5% Fundamental Incompleto 1613 | Probabilidades[1] := 10; // 10% Fundamental Completo 1614 | Probabilidades[2] := 10; // 10% Médio Incompleto 1615 | Probabilidades[3] := 30; // 30% Médio Completo 1616 | Probabilidades[4] := 15; // 15% Superior Incompleto 1617 | Probabilidades[5] := 20; // 20% Superior Completo 1618 | Probabilidades[6] := 10; // 10% Pós-graduação 1619 | 1620 | // Calcula soma das probabilidades 1621 | SomaProbabilidades := 0; 1622 | for i := 0 to 6 do 1623 | SomaProbabilidades := SomaProbabilidades + Probabilidades[i]; 1624 | 1625 | // Sorteia um valor dentro do range de probabilidades 1626 | ValorSorteio := Random(SomaProbabilidades) + 1; 1627 | 1628 | // Determina qual nível de escolaridade foi sorteado 1629 | SomaProbabilidades := 0; 1630 | for i := 0 to 6 do 1631 | begin 1632 | SomaProbabilidades := SomaProbabilidades + Probabilidades[i]; 1633 | if ValorSorteio <= SomaProbabilidades then 1634 | begin 1635 | Result := NiveisEscolaridade[i]; 1636 | Break; 1637 | end; 1638 | end; 1639 | end; 1640 | 1641 | { Dadpos Empresariais } 1642 | function TFakeDataGenerator.GerarCNAE(Formatado: Boolean = True): string; 1643 | var 1644 | CNAEPrincipais: array[0..9] of string; 1645 | CNAE: string; 1646 | begin 1647 | // Exemplos de CNAEs principais mais comuns 1648 | CNAEPrincipais[0] := '4751201'; // Comércio varejista especializado de equipamentos e suprimentos de informática 1649 | CNAEPrincipais[1] := '4781400'; // Comércio varejista de artigos do vestuário e acessórios 1650 | CNAEPrincipais[2] := '5611201'; // Restaurantes e similares 1651 | CNAEPrincipais[3] := '4711301'; // Comércio varejista de mercadorias em geral - hipermercados 1652 | CNAEPrincipais[4] := '4530703'; // Comércio a varejo de peças e acessórios novos para veículos automotores 1653 | CNAEPrincipais[5] := '8599604'; // Treinamento em desenvolvimento profissional e gerencial 1654 | CNAEPrincipais[6] := '6201501'; // Desenvolvimento de programas de computador sob encomenda 1655 | CNAEPrincipais[7] := '6920601'; // Atividades de contabilidade 1656 | CNAEPrincipais[8] := '8610101'; // Atividades de atendimento hospitalar 1657 | CNAEPrincipais[9] := '4120400'; // Construção de edifícios 1658 | 1659 | // Seleciona um CNAE principal aleatório 1660 | CNAE := CNAEPrincipais[Random(10)]; 1661 | 1662 | if Formatado then 1663 | Result := Copy(CNAE, 1, 4) + '-' + Copy(CNAE, 5, 1) + '/' + Copy(CNAE, 6, 2) 1664 | else 1665 | Result := CNAE; 1666 | end; 1667 | 1668 | function TFakeDataGenerator.GerarInscricaoMunicipal(Municipio: string = ''): string; 1669 | var 1670 | i: Integer; 1671 | InscMunicipal: string; 1672 | Digito: Integer; 1673 | Soma: Integer; 1674 | begin 1675 | // Gera um número de inscrição municipal com 8 dígitos + DV 1676 | InscMunicipal := ''; 1677 | for i := 1 to 8 do 1678 | InscMunicipal := InscMunicipal + IntToStr(Random(10)); 1679 | 1680 | // Calcula dígito verificador (algoritmo simplificado) 1681 | Soma := 0; 1682 | for i := 1 to 8 do 1683 | Soma := Soma + StrToInt(InscMunicipal[i]) * (9 - i); 1684 | 1685 | Digito := Soma mod 11; 1686 | if Digito = 10 then 1687 | Digito := 0; 1688 | 1689 | Result := InscMunicipal + IntToStr(Digito); 1690 | end; 1691 | 1692 | function TFakeDataGenerator.GerarDepartamento: string; 1693 | var 1694 | Departamentos: array[0..14] of string; 1695 | begin 1696 | Departamentos[0] := 'Administrativo'; 1697 | Departamentos[1] := 'Recursos Humanos'; 1698 | Departamentos[2] := 'Financeiro'; 1699 | Departamentos[3] := 'Contabilidade'; 1700 | Departamentos[4] := 'Comercial'; 1701 | Departamentos[5] := 'Marketing'; 1702 | Departamentos[6] := 'Compras'; 1703 | Departamentos[7] := 'Logística'; 1704 | Departamentos[8] := 'Tecnologia da Informação'; 1705 | Departamentos[9] := 'Jurídico'; 1706 | Departamentos[10] := 'Produção'; 1707 | Departamentos[11] := 'Qualidade'; 1708 | Departamentos[12] := 'Pesquisa e Desenvolvimento'; 1709 | Departamentos[13] := 'Atendimento ao Cliente'; 1710 | Departamentos[14] := 'Manutenção'; 1711 | 1712 | Result := Departamentos[Random(15)]; 1713 | end; 1714 | 1715 | function TFakeDataGenerator.GerarCargo: string; 1716 | var 1717 | NiveisCargos: array[0..3] of string; 1718 | AreasCargos: array[0..8] of string; 1719 | PrefixosCargos: array[0..3] of string; 1720 | begin 1721 | NiveisCargos[0] := ''; 1722 | NiveisCargos[1] := 'Assistente de '; 1723 | NiveisCargos[2] := 'Analista de '; 1724 | NiveisCargos[3] := 'Coordenador de '; 1725 | 1726 | AreasCargos[0] := 'Vendas'; 1727 | AreasCargos[1] := 'Marketing'; 1728 | AreasCargos[2] := 'RH'; 1729 | AreasCargos[3] := 'Financeiro'; 1730 | AreasCargos[4] := 'TI'; 1731 | AreasCargos[5] := 'Administrativo'; 1732 | AreasCargos[6] := 'Comercial'; 1733 | AreasCargos[7] := 'Operações'; 1734 | AreasCargos[8] := 'Projetos'; 1735 | 1736 | PrefixosCargos[0] := 'Gerente de '; 1737 | PrefixosCargos[1] := 'Diretor de '; 1738 | PrefixosCargos[2] := 'Supervisor de '; 1739 | PrefixosCargos[3] := 'Consultor de '; 1740 | 1741 | if Random(10) > 6 then // 30% de chance de ser cargo de gestão 1742 | Result := PrefixosCargos[Random(4)] + AreasCargos[Random(9)] 1743 | else 1744 | Result := NiveisCargos[Random(4)] + AreasCargos[Random(9)]; 1745 | 1746 | // Algumas exceções para cargos específicos 1747 | if Random(10) = 0 then // 10% de chance de ser um cargo específico 1748 | begin 1749 | case Random(5) of 1750 | 0: Result := 'Desenvolvedor'; 1751 | 1: Result := 'Contador'; 1752 | 2: Result := 'Advogado'; 1753 | 3: Result := 'Designer'; 1754 | 4: Result := 'Recepcionista'; 1755 | end; 1756 | end; 1757 | end; 1758 | 1759 | function TFakeDataGenerator.GerarChavePIX(TipoChave: string = 'aleatoria'): string; 1760 | var 1761 | TiposChave: array[0..3] of string; 1762 | begin 1763 | TiposChave[0] := 'cpf'; 1764 | TiposChave[1] := 'cnpj'; 1765 | TiposChave[2] := 'email'; 1766 | TiposChave[3] := 'telefone'; 1767 | 1768 | // Se não for especificado ou for aleatório, escolhe um tipo aleatoriamente 1769 | if (TipoChave = 'aleatoria') or (TipoChave = '') then 1770 | TipoChave := TiposChave[Random(4)]; 1771 | 1772 | TipoChave := AnsiLowerCase(TipoChave); 1773 | 1774 | if TipoChave = 'cpf' then 1775 | Result := GerarCPF(False) 1776 | else if TipoChave = 'cnpj' then 1777 | Result := GerarCNPJ(False) 1778 | else if TipoChave = 'email' then 1779 | Result := GerarEmail(GerarNomeCompleto) 1780 | else if TipoChave = 'telefone' then 1781 | Result := '+55' + GerarCelular(False) 1782 | else if TipoChave = 'aleatoria' then 1783 | begin 1784 | // Gera uma chave aleatória de 32 caracteres (formato UUID) 1785 | Result := ''; 1786 | while Length(Result) < 32 do 1787 | begin 1788 | case Random(3) of 1789 | 0: Result := Result + Chr(Ord('0') + Random(10)); // Dígito 1790 | 1: Result := Result + Chr(Ord('a') + Random(6)); // a-f 1791 | 2: Result := Result + Chr(Ord('0') + Random(10)); // Dígito 1792 | end; 1793 | end; 1794 | 1795 | // Formata como UUID 1796 | Result := Copy(Result, 1, 8) + '-' + 1797 | Copy(Result, 9, 4) + '-' + 1798 | Copy(Result, 13, 4) + '-' + 1799 | Copy(Result, 17, 4) + '-' + 1800 | Copy(Result, 21, 12); 1801 | end; 1802 | end; 1803 | 1804 | { Dados Financeiros} 1805 | function TFakeDataGenerator.GerarCodigoBarrasBoleto(Banco: string = ''): string; 1806 | var 1807 | CodigoBarras: string; 1808 | CodigoBanco, Moeda, FatorVencimento, Valor: string; 1809 | DV, i: Integer; 1810 | DataVencimento: TDateTime; 1811 | ValorBoleto: Double; 1812 | Soma: Integer; 1813 | Peso: Integer; 1814 | begin 1815 | // Se o banco não for especificado, escolhe um dos principais 1816 | if Banco = '' then 1817 | begin 1818 | case Random(5) of 1819 | 0: Banco := '001'; // Banco do Brasil 1820 | 1: Banco := '341'; // Itaú 1821 | 2: Banco := '033'; // Santander 1822 | 3: Banco := '104'; // Caixa 1823 | 4: Banco := '237'; // Bradesco 1824 | end; 1825 | end; 1826 | 1827 | CodigoBanco := Banco; 1828 | Moeda := '9'; // Real 1829 | 1830 | // Gera uma data de vencimento aleatória (entre hoje e 60 dias à frente) 1831 | DataVencimento := GerarData(Date, Date + 60); 1832 | // Calcula o fator de vencimento (base: 07/10/1997) 1833 | FatorVencimento := Format('%.4d', [DaysBetween(EncodeDate(1997, 10, 7), DataVencimento)]); 1834 | 1835 | // Gera um valor aleatório entre R$ 10,00 e R$ 10.000,00 1836 | ValorBoleto := Random * 9990 + 10; 1837 | // Formata o valor (10 dígitos, com zeros à esquerda) 1838 | Valor := Format('%.10d', [Round(ValorBoleto * 100)]); 1839 | 1840 | // Gera o campo livre (20 dígitos) 1841 | CodigoBarras := CodigoBanco + Moeda; 1842 | for i := 1 to 20 do 1843 | CodigoBarras := CodigoBarras + IntToStr(Random(10)); 1844 | 1845 | // Insere fator de vencimento e valor 1846 | CodigoBarras := Copy(CodigoBarras, 1, 4) + FatorVencimento + Valor + Copy(CodigoBarras, 5, 20); 1847 | 1848 | // Calcula dígito verificador do código de barras (Módulo 11) 1849 | Soma := 0; 1850 | Peso := 2; 1851 | for i := Length(CodigoBarras) downto 1 do 1852 | begin 1853 | Soma := Soma + (StrToInt(CodigoBarras[i]) * Peso); 1854 | Inc(Peso); 1855 | if Peso > 9 then 1856 | Peso := 2; 1857 | end; 1858 | 1859 | DV := 11 - (Soma mod 11); 1860 | if (DV = 0) or (DV = 10) or (DV = 11) then 1861 | DV := 1; 1862 | 1863 | // Insere o DV na posição 5 1864 | Result := Copy(CodigoBarras, 1, 4) + IntToStr(DV) + Copy(CodigoBarras, 5, 39); 1865 | end; 1866 | 1867 | function TFakeDataGenerator.GerarLinhaDigitavelBoleto(Banco: string = ''): string; 1868 | var 1869 | CodigoBarras: string; 1870 | Campo1, Campo2, Campo3, Campo4, Campo5: string; 1871 | DV1, DV2, DV3, DV4: Integer; 1872 | i, Soma, Resto: Integer; 1873 | Peso: Integer; 1874 | begin 1875 | // Gera o código de barras 1876 | CodigoBarras := GerarCodigoBarrasBoleto(Banco); 1877 | 1878 | // Divide o código de barras em campos para a linha digitável 1879 | Campo1 := Copy(CodigoBarras, 1, 3) + Copy(CodigoBarras, 4, 1) + Copy(CodigoBarras, 20, 5); 1880 | Campo2 := Copy(CodigoBarras, 25, 10); 1881 | Campo3 := Copy(CodigoBarras, 35, 10); 1882 | Campo4 := Copy(CodigoBarras, 5, 1); // DV do código de barras 1883 | Campo5 := Copy(CodigoBarras, 6, 14); // Fator de vencimento (4) + Valor (10) 1884 | 1885 | // Calcula os DVs de cada campo usando Módulo 10 1886 | // Campo 1 1887 | Soma := 0; 1888 | Peso := 2; 1889 | for i := Length(Campo1) downto 1 do 1890 | begin 1891 | Soma := Soma + IfThen(StrToInt(Campo1[i]) * Peso > 9, 1892 | (StrToInt(Campo1[i]) * Peso) div 10 + (StrToInt(Campo1[i]) * Peso) mod 10, 1893 | StrToInt(Campo1[i]) * Peso); 1894 | Peso := IfThen(Peso = 2, 1, 2); 1895 | end; 1896 | Resto := Soma mod 10; 1897 | DV1 := IfThen(Resto = 0, 0, 10 - Resto); 1898 | 1899 | // Campo 2 1900 | Soma := 0; 1901 | Peso := 2; 1902 | for i := Length(Campo2) downto 1 do 1903 | begin 1904 | Soma := Soma + IfThen(StrToInt(Campo2[i]) * Peso > 9, 1905 | (StrToInt(Campo2[i]) * Peso) div 10 + (StrToInt(Campo2[i]) * Peso) mod 10, 1906 | StrToInt(Campo2[i]) * Peso); 1907 | Peso := IfThen(Peso = 2, 1, 2); 1908 | end; 1909 | Resto := Soma mod 10; 1910 | DV2 := IfThen(Resto = 0, 0, 10 - Resto); 1911 | 1912 | // Campo 3 1913 | Soma := 0; 1914 | Peso := 2; 1915 | for i := Length(Campo3) downto 1 do 1916 | begin 1917 | Soma := Soma + IfThen(StrToInt(Campo3[i]) * Peso > 9, 1918 | (StrToInt(Campo3[i]) * Peso) div 10 + (StrToInt(Campo3[i]) * Peso) mod 10, 1919 | StrToInt(Campo3[i]) * Peso); 1920 | Peso := IfThen(Peso = 2, 1, 2); 1921 | end; 1922 | Resto := Soma mod 10; 1923 | DV3 := IfThen(Resto = 0, 0, 10 - Resto); 1924 | 1925 | // Monta a linha digitável formatada 1926 | Result := Copy(Campo1, 1, 5) + '.' + Copy(Campo1, 6, 4) + IntToStr(DV1) + ' ' + 1927 | Copy(Campo2, 1, 5) + '.' + Copy(Campo2, 6, 5) + IntToStr(DV2) + ' ' + 1928 | Copy(Campo3, 1, 5) + '.' + Copy(Campo3, 6, 5) + IntToStr(DV3) + ' ' + 1929 | Campo4 + ' ' + 1930 | Campo5; 1931 | end; 1932 | 1933 | function TFakeDataGenerator.GerarCodigoRastreio: string; 1934 | const 1935 | Letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 1936 | var 1937 | Codigo: string; 1938 | i: Integer; 1939 | begin 1940 | // Códigos de rastreio dos Correios seguem o padrão: 2 letras + 9 dígitos + BR 1941 | Codigo := ''; 1942 | 1943 | // 2 letras iniciais 1944 | for i := 1 to 2 do 1945 | Codigo := Codigo + Letras[Random(Length(Letras)) + 1]; 1946 | 1947 | // 9 dígitos 1948 | for i := 1 to 9 do 1949 | Codigo := Codigo + IntToStr(Random(10)); 1950 | 1951 | // Sufixo BR 1952 | Codigo := Codigo + 'BR'; 1953 | 1954 | Result := Codigo; 1955 | end; 1956 | 1957 | function TFakeDataGenerator.GerarAliquotaImposto(TipoImposto: string = 'ICMS'): Double; 1958 | begin 1959 | TipoImposto := UpperCase(TipoImposto); 1960 | 1961 | if TipoImposto = 'ICMS' then 1962 | // Alíquotas comuns de ICMS: 4%, 7%, 12%, 17%, 18%, 25% 1963 | case Random(6) of 1964 | 0: Result := 4.0; 1965 | 1: Result := 7.0; 1966 | 2: Result := 12.0; 1967 | 3: Result := 17.0; 1968 | 4: Result := 18.0; 1969 | 5: Result := 25.0; 1970 | end 1971 | else if TipoImposto = 'IPI' then 1972 | // Alíquotas comuns de IPI: entre 0% e 20% 1973 | Result := Random(20) + Random 1974 | else if TipoImposto = 'ISS' then 1975 | // Alíquotas comuns de ISS: entre 2% e 5% 1976 | Result := 2.0 + Random(3) + Random 1977 | else if TipoImposto = 'PIS' then 1978 | // Alíquota PIS: 0.65% ou 1.65% 1979 | if Random(2) = 0 then 1980 | Result := 0.65 1981 | else 1982 | Result := 1.65 1983 | else if TipoImposto = 'COFINS' then 1984 | // Alíquota COFINS: 3% ou 7.6% 1985 | if Random(2) = 0 then 1986 | Result := 3.0 1987 | else 1988 | Result := 7.6 1989 | else 1990 | // Alíquota genérica entre 1% e 30% 1991 | Result := 1.0 + Random(29) + Random; 1992 | 1993 | // Arredonda para 2 casas decimais 1994 | Result := RoundTo(Result, -2); 1995 | end; 1996 | 1997 | function TFakeDataGenerator.GerarNotaFiscal(UF: string = ''): string; 1998 | var 1999 | Serie, Numero, Modelo, AnoEmissao, UF_Sigla: string; 2000 | begin 2001 | // Gera a série da nota (geralmente 1 a 999) 2002 | Serie := Format('%.3d', [Random(999) + 1]); 2003 | 2004 | // Gera o número da nota (pode ter até 9 dígitos) 2005 | Numero := Numero + IntToStr(1 + Random(9)); 2006 | while Length(Numero) < 9 do 2007 | Numero := Numero + IntToStr(Random(10)); 2008 | 2009 | // Modelos mais comuns de NF 2010 | case Random(4) of 2011 | 0: Modelo := '55'; // NF-e 2012 | 1: Modelo := '65'; // NFC-e 2013 | 2: Modelo := '57'; // CT-e 2014 | 3: Modelo := '59'; // SAT 2015 | end; 2016 | 2017 | // Ano de emissão (últimos 2 dígitos) 2018 | AnoEmissao := Copy(IntToStr(YearOf(Date)), 3, 2); 2019 | 2020 | // Define a UF se não especificada 2021 | if UF = '' then 2022 | UF_Sigla := FUFs[Random(FUFs.Count)] 2023 | else 2024 | UF_Sigla := UF; 2025 | 2026 | if Modelo = '55' then // NF-e 2027 | Result := Format('NF-e nº %s, Série %s, Emissão: %s/%s', 2028 | [Numero, Serie, AnoEmissao, UF_Sigla]) 2029 | else if Modelo = '65' then // NFC-e 2030 | Result := Format('NFC-e nº %s, Série %s, Emissão: %s/%s', 2031 | [Numero, Serie, AnoEmissao, UF_Sigla]) 2032 | else if Modelo = '57' then // CT-e 2033 | Result := Format('CT-e nº %s, Série %s, Emissão: %s/%s', 2034 | [Numero, Serie, AnoEmissao, UF_Sigla]) 2035 | else // SAT ou outros 2036 | Result := Format('CF-e-SAT nº %s, Emissão: %s/%s', 2037 | [Numero, AnoEmissao, UF_Sigla]); 2038 | end; 2039 | 2040 | { Outros Dados Específicos} 2041 | function TFakeDataGenerator.GerarProtocolo: string; 2042 | var 2043 | Ano, Sequencia: string; 2044 | i: Integer; 2045 | begin 2046 | // Formatos comuns de protocolos: 2047 | // AAAA/NNNNNN ou AAAA-NNNNNN ou NNNNNNNNNN/AAAA 2048 | 2049 | // Ano atual ou ano recente 2050 | if Random(2) = 0 then 2051 | Ano := IntToStr(YearOf(Date)) 2052 | else 2053 | Ano := IntToStr(YearOf(Date) - Random(3)); 2054 | 2055 | // Sequência numérica 2056 | Sequencia := ''; 2057 | for i := 1 to 6 + Random(4) do // 6 a 9 dígitos 2058 | Sequencia := Sequencia + IntToStr(Random(10)); 2059 | 2060 | // Formata o protocolo 2061 | case Random(3) of 2062 | 0: Result := Ano + '/' + Sequencia; 2063 | 1: Result := Ano + '-' + Sequencia; 2064 | 2: Result := Sequencia + '/' + Ano; 2065 | end; 2066 | end; 2067 | 2068 | function TFakeDataGenerator.GerarSKU(Categoria: string = ''): string; 2069 | var 2070 | Prefixo, CodigoProduto, CodigoVariacao: string; 2071 | Categorias: array[0..9] of string; 2072 | i: Integer; 2073 | begin 2074 | // Categorias comuns de produtos 2075 | Categorias[0] := 'ELET'; // Eletrônicos 2076 | Categorias[1] := 'VEST'; // Vestuário 2077 | Categorias[2] := 'MOVEL'; // Móveis 2078 | Categorias[3] := 'LIVRO'; // Livros 2079 | Categorias[4] := 'AUTO'; // Automotivo 2080 | Categorias[5] := 'ALIM'; // Alimentos 2081 | Categorias[6] := 'BEBID'; // Bebidas 2082 | Categorias[7] := 'ESPO'; // Esportes 2083 | Categorias[8] := 'INFO'; // Informática 2084 | Categorias[9] := 'BRINQ'; // Brinquedos 2085 | 2086 | // Define o prefixo da categoria 2087 | if Categoria = '' then 2088 | Prefixo := Categorias[Random(10)] 2089 | else 2090 | Prefixo := Copy(UpperCase(Categoria), 1, 5); 2091 | 2092 | // Código do produto (4-6 dígitos) 2093 | CodigoProduto := ''; 2094 | for i := 1 to 4 + Random(3) do 2095 | CodigoProduto := CodigoProduto + IntToStr(Random(10)); 2096 | 2097 | // Código de variação (1-2 dígitos) para cor/tamanho/modelo 2098 | CodigoVariacao := ''; 2099 | for i := 1 to 1 + Random(2) do 2100 | CodigoVariacao := CodigoVariacao + IntToStr(Random(10)); 2101 | 2102 | // Formato final: PREFIXO-PRODUTO-VARIACAO 2103 | Result := Prefixo + '-' + CodigoProduto + '-' + CodigoVariacao; 2104 | end; 2105 | 2106 | function TFakeDataGenerator.GerarEAN13: string; 2107 | var 2108 | EAN: string; 2109 | i, Soma, Resto, DigitoVerif: Integer; 2110 | Peso: Integer; 2111 | begin 2112 | // Gera os 12 primeiros dígitos do EAN-13 2113 | // Os primeiros 3 dígitos são o código do país (Brasil: 789 ou 790) 2114 | if Random(2) = 0 then 2115 | EAN := '789' 2116 | else 2117 | EAN := '790'; 2118 | 2119 | // Completa até 12 dígitos 2120 | while Length(EAN) < 12 do 2121 | EAN := EAN + IntToStr(Random(10)); 2122 | 2123 | // Calcula o dígito verificador (13º dígito) 2124 | Soma := 0; 2125 | Peso := 1; 2126 | 2127 | for i := 12 downto 1 do 2128 | begin 2129 | Soma := Soma + StrToInt(EAN[i]) * (1 + 2 * (i mod 2)); 2130 | end; 2131 | 2132 | Resto := Soma mod 10; 2133 | if Resto = 0 then 2134 | DigitoVerif := 0 2135 | else 2136 | DigitoVerif := 10 - Resto; 2137 | 2138 | Result := EAN + IntToStr(DigitoVerif); 2139 | end; 2140 | 2141 | function TFakeDataGenerator.GerarCID: string; 2142 | var 2143 | Capitulos: array[0..20] of string; 2144 | Grupo, Categoria: string; 2145 | NumeroCategoria: Integer; 2146 | begin 2147 | // Exemplos de capítulos do CID-10 2148 | Capitulos[0] := 'A'; // Algumas doenças infecciosas e parasitárias 2149 | Capitulos[1] := 'B'; // Algumas doenças infecciosas e parasitárias 2150 | Capitulos[2] := 'C'; // Neoplasias 2151 | Capitulos[3] := 'D'; // Neoplasias / Doenças do sangue 2152 | Capitulos[4] := 'E'; // Doenças endócrinas, nutricionais e metabólicas 2153 | Capitulos[5] := 'F'; // Transtornos mentais e comportamentais 2154 | Capitulos[6] := 'G'; // Doenças do sistema nervoso 2155 | Capitulos[7] := 'H'; // Doenças do olho e anexos / Doenças do ouvido 2156 | Capitulos[8] := 'I'; // Doenças do aparelho circulatório 2157 | Capitulos[9] := 'J'; // Doenças do aparelho respiratório 2158 | Capitulos[10] := 'K'; // Doenças do aparelho digestivo 2159 | Capitulos[11] := 'L'; // Doenças da pele e do tecido subcutâneo 2160 | Capitulos[12] := 'M'; // Doenças do sistema osteomuscular e do tecido conjuntivo 2161 | Capitulos[13] := 'N'; // Doenças do aparelho geniturinário 2162 | Capitulos[14] := 'O'; // Gravidez, parto e puerpério 2163 | Capitulos[15] := 'P'; // Afecções do período perinatal 2164 | Capitulos[16] := 'Q'; // Malformações congênitas 2165 | Capitulos[17] := 'R'; // Sintomas, sinais e achados anormais 2166 | Capitulos[18] := 'S'; // Lesões, envenenamento e outras causas externas 2167 | Capitulos[19] := 'T'; // Lesões, envenenamento e outras causas externas 2168 | Capitulos[20] := 'Z'; // Fatores que influenciam o estado de saúde 2169 | 2170 | // Seleciona um capítulo aleatório 2171 | Grupo := Capitulos[Random(21)]; 2172 | 2173 | // Gera o número da categoria (0-99) 2174 | NumeroCategoria := Random(100); 2175 | Categoria := Format('%.2d', [NumeroCategoria]); 2176 | 2177 | // Alguns CIDs têm subcategorias com 1 dígito adicional 2178 | if Random(3) = 0 then // ~33% de chance 2179 | Result := Grupo + Categoria + '.' + IntToStr(Random(10)) 2180 | else 2181 | Result := Grupo + Categoria; 2182 | end; 2183 | 2184 | function TFakeDataGenerator.GerarProcessoJudicial: string; 2185 | var 2186 | Numero, DigitoVerificador, AnoProcesso, Segmento, Origem, UF: string; 2187 | i, Soma, Resto, Digito: Integer; 2188 | UFCodigos: array[0..26] of string; 2189 | begin 2190 | // Estrutura CNJ: NNNNNNN-DD.AAAA.J.TR.OOOO 2191 | // N = Número do processo 2192 | // D = Dígito verificador 2193 | // A = Ano do ajuizamento 2194 | // J = Órgão ou segmento do Judiciário 2195 | // TR = Tribunal do respectivo segmento 2196 | // O = Unidade de origem do processo 2197 | 2198 | // Códigos de UF para processo judicial 2199 | UFCodigos[0] := '01'; // AC 2200 | UFCodigos[1] := '02'; // AL 2201 | UFCodigos[2] := '03'; // AM 2202 | UFCodigos[3] := '04'; // AP 2203 | UFCodigos[4] := '05'; // BA 2204 | UFCodigos[5] := '06'; // CE 2205 | UFCodigos[6] := '07'; // DF 2206 | UFCodigos[7] := '08'; // ES 2207 | UFCodigos[8] := '09'; // GO 2208 | UFCodigos[9] := '10'; // MA 2209 | UFCodigos[10] := '11'; // MG 2210 | UFCodigos[11] := '12'; // MS 2211 | UFCodigos[12] := '13'; // MT 2212 | UFCodigos[13] := '14'; // PA 2213 | UFCodigos[14] := '15'; // PB 2214 | UFCodigos[15] := '16'; // PE 2215 | UFCodigos[16] := '17'; // PI 2216 | UFCodigos[17] := '18'; // PR 2217 | UFCodigos[18] := '19'; // RJ 2218 | UFCodigos[19] := '20'; // RN 2219 | UFCodigos[20] := '21'; // RO 2220 | UFCodigos[21] := '22'; // RR 2221 | UFCodigos[22] := '23'; // RS 2222 | UFCodigos[23] := '24'; // SC 2223 | UFCodigos[24] := '25'; // SE 2224 | UFCodigos[25] := '26'; // SP 2225 | UFCodigos[26] := '27'; // TO 2226 | 2227 | // Gera o número sequencial de 7 dígitos 2228 | Numero := ''; 2229 | for i := 1 to 7 do 2230 | Numero := Numero + IntToStr(Random(10)); 2231 | 2232 | // Ano do processo (entre 2010 e ano atual) 2233 | AnoProcesso := IntToStr(2010 + Random(YearOf(Date) - 2010 + 1)); 2234 | 2235 | // Segmento do Judiciário 2236 | case Random(5) of 2237 | 0: Segmento := '1'; // Justiça Federal 2238 | 1: Segmento := '2'; // Justiça do Trabalho 2239 | 2: Segmento := '3'; // Justiça Estadual 2240 | 3: Segmento := '4'; // Justiça Eleitoral 2241 | 4: Segmento := '5'; // Justiça Militar 2242 | end; 2243 | 2244 | // Tribunal (UF do Tribunal) 2245 | UF := UFCodigos[Random(27)]; 2246 | 2247 | // Unidade de origem (Fórum/Vara) 2248 | Origem := Format('%.4d', [Random(9999) + 1]); 2249 | 2250 | // Calcula o dígito verificador 2251 | Soma := 0; 2252 | for i := 1 to Length(Numero) do 2253 | Soma := Soma + StrToInt(Numero[i]) * (i+1); 2254 | 2255 | Resto := Soma mod 97; 2256 | Digito := 98 - Resto; 2257 | DigitoVerificador := Format('%.2d', [Digito]); 2258 | 2259 | // Monta o número completo no formato CNJ 2260 | Result := Numero + '-' + DigitoVerificador + '.' + 2261 | AnoProcesso + '.' + Segmento + '.' + 2262 | UF + '.' + Origem; 2263 | end; 2264 | 2265 | function TFakeDataGenerator.GerarTipoSanguineo: string; 2266 | const 2267 | Tipos: array[0..7] of string = ('A+', 'A-', 'B+', 'B-', 'AB+', 'AB-', 'O+', 'O-'); 2268 | // Distribuição aproximada na população brasileira 2269 | Probabilidades: array[0..7] of Integer = (36, 6, 9, 2, 3, 1, 38, 5); 2270 | var 2271 | ValorSorteio, SomaProbabilidades, i: Integer; 2272 | begin 2273 | // Calcula soma das probabilidades 2274 | SomaProbabilidades := 0; 2275 | for i := 0 to 7 do 2276 | SomaProbabilidades := SomaProbabilidades + Probabilidades[i]; 2277 | 2278 | // Sorteia um valor dentro do range de probabilidades 2279 | ValorSorteio := Random(SomaProbabilidades) + 1; 2280 | 2281 | // Determina qual tipo sanguíneo foi sorteado 2282 | SomaProbabilidades := 0; 2283 | for i := 0 to 7 do 2284 | begin 2285 | SomaProbabilidades := SomaProbabilidades + Probabilidades[i]; 2286 | if ValorSorteio <= SomaProbabilidades then 2287 | begin 2288 | Result := Tipos[i]; 2289 | Break; 2290 | end; 2291 | end; 2292 | end; 2293 | 2294 | function TFakeDataGenerator.GerarAltura(Min: Integer = 150; Max: Integer = 200): Integer; 2295 | var 2296 | Media, DesvioPadrao: Double; 2297 | Altura: Double; 2298 | begin 2299 | // Utilize distribuição normal para maior realismo 2300 | Media := (Min + Max) / 2; 2301 | DesvioPadrao := (Max - Min) / 6; // ~ 99.7% dos valores entre Min e Max 2302 | 2303 | // Gerar usando distribuição normal 2304 | repeat 2305 | // Box-Muller transform para gerar distribuição normal 2306 | Altura := Media + DesvioPadrao * Sqrt(-2 * Ln(Random + 0.000001)) * 2307 | Cos(2 * PI * Random); 2308 | until (Altura >= Min) and (Altura <= Max); 2309 | 2310 | Result := Round(Altura); 2311 | end; 2312 | 2313 | function TFakeDataGenerator.GerarPeso(Min: Integer = 50; Max: Integer = 120): Double; 2314 | var 2315 | Media, DesvioPadrao: Double; 2316 | Peso: Double; 2317 | begin 2318 | // Utilize distribuição normal para maior realismo 2319 | Media := (Min + Max) / 2; 2320 | DesvioPadrao := (Max - Min) / 6; // ~ 99.7% dos valores entre Min e Max 2321 | 2322 | // Gerar usando distribuição normal 2323 | repeat 2324 | // Box-Muller transform para gerar distribuição normal 2325 | Peso := Media + DesvioPadrao * Sqrt(-2 * Ln(Random + 0.000001)) * 2326 | Sin(2 * PI * Random); 2327 | until (Peso >= Min) and (Peso <= Max); 2328 | 2329 | // Arredondar para 1 casa decimal 2330 | Result := RoundTo(Peso, -1); 2331 | end; 2332 | 2333 | function TFakeDataGenerator.GerarPressaoArterial: string; 2334 | var 2335 | // Valores aproximados para adultos saudáveis 2336 | SistolicaMin, SistolicaMax: Integer; 2337 | DiastolicaMin, DiastolicaMax: Integer; 2338 | Sistolica, Diastolica: Integer; 2339 | Chance: Integer; 2340 | begin 2341 | // Define ranges normais de pressão (pode ser modificado para criar casos específicos) 2342 | Chance := Random(100); 2343 | 2344 | if Chance < 10 then 2345 | begin // Hipertensão 2346 | SistolicaMin := 140; 2347 | SistolicaMax := 179; 2348 | DiastolicaMin := 90; 2349 | DiastolicaMax := 109; 2350 | end 2351 | else if Chance < 15 then 2352 | begin // Hipotensão 2353 | SistolicaMin := 90; 2354 | SistolicaMax := 100; 2355 | DiastolicaMin := 50; 2356 | DiastolicaMax := 65; 2357 | end 2358 | else 2359 | begin // Normal 2360 | SistolicaMin := 110; 2361 | SistolicaMax := 139; 2362 | DiastolicaMin := 70; 2363 | DiastolicaMax := 89; 2364 | end; 2365 | 2366 | Sistolica := SistolicaMin + Random(SistolicaMax - SistolicaMin + 1); 2367 | Diastolica := DiastolicaMin + Random(DiastolicaMax - DiastolicaMin + 1); 2368 | 2369 | Result := Format('%d/%d mmHg', [Sistolica, Diastolica]); 2370 | end; 2371 | 2372 | function TFakeDataGenerator.GerarMedicamento: string; 2373 | begin 2374 | Result := FMedicamentos[Random(FMedicamentos.Count)]; 2375 | end; 2376 | 2377 | function TFakeDataGenerator.GerarEspecialidadeMedica: string; 2378 | begin 2379 | Result := FEspecialidades[Random(FEspecialidades.Count)]; 2380 | end; 2381 | 2382 | function TFakeDataGenerator.GerarPlanoSaude: string; 2383 | var 2384 | Plano: string; 2385 | TipoPlano: string; 2386 | begin 2387 | Plano := FPlanosSaude[Random(FPlanosSaude.Count)]; 2388 | 2389 | // Adicionar tipo/categoria do plano 2390 | case Random(5) of 2391 | 0: TipoPlano := 'Básico'; 2392 | 1: TipoPlano := 'Essencial'; 2393 | 2: TipoPlano := 'Premium'; 2394 | 3: TipoPlano := 'Master'; 2395 | 4: TipoPlano := 'Executivo'; 2396 | end; 2397 | 2398 | if Random(2) = 0 then 2399 | Result := Format('%s %s', [Plano, TipoPlano]) 2400 | else 2401 | Result := Plano; 2402 | end; 2403 | 2404 | { Dados Acadêmicos } 2405 | function TFakeDataGenerator.GerarNomeInstituicaoEnsino: string; 2406 | begin 2407 | Result := FInstituicoesEnsino[Random(FInstituicoesEnsino.Count)]; 2408 | end; 2409 | 2410 | function TFakeDataGenerator.GerarCursoGraduacao: string; 2411 | begin 2412 | Result := FCursosGraduacao[Random(FCursosGraduacao.Count)]; 2413 | end; 2414 | 2415 | function TFakeDataGenerator.GerarAreaFormacao: string; 2416 | begin 2417 | Result := FAreasFormacao[Random(FAreasFormacao.Count)]; 2418 | end; 2419 | 2420 | function TFakeDataGenerator.GerarMatriculaAcademica: string; 2421 | var 2422 | AnoBase: Integer; 2423 | NumeroSequencial: Integer; 2424 | Digito: Integer; 2425 | Matricula: string; 2426 | Soma: Integer; 2427 | i: Integer; 2428 | begin 2429 | // Formato comum: AAANNNNND 2430 | // AA: ano de ingresso (últimos 2 dígitos) 2431 | // NNNNN: número sequencial (5 dígitos) 2432 | // D: dígito verificador 2433 | 2434 | // Define o ano base (de 5 anos atrás até o ano atual) 2435 | AnoBase := YearOf(Date) - Random(6); 2436 | 2437 | // Gera número sequencial 2438 | NumeroSequencial := 10000 + Random(90000); // 5 dígitos: 10000 a 99999 2439 | 2440 | // Forma a matrícula base 2441 | Matricula := Copy(IntToStr(AnoBase), 3, 2) + IntToStr(NumeroSequencial); 2442 | 2443 | // Calcula dígito verificador (soma ponderada) 2444 | Soma := 0; 2445 | for i := 1 to Length(Matricula) do 2446 | Soma := Soma + StrToInt(Matricula[i]) * i; 2447 | 2448 | Digito := Soma mod 10; 2449 | 2450 | // Adiciona o dígito verificador 2451 | Result := Matricula + IntToStr(Digito); 2452 | end; 2453 | 2454 | function TFakeDataGenerator.GerarCoeficienteRendimento: Double; 2455 | var 2456 | Media, DesvioPadrao: Double; 2457 | CR: Double; 2458 | begin 2459 | // A maioria dos alunos tem CR entre 6.0 e 8.5 2460 | Media := 7.25; 2461 | DesvioPadrao := 1.0; 2462 | 2463 | // Gerar usando distribuição normal 2464 | repeat 2465 | // Box-Muller transform para gerar distribuição normal 2466 | CR := Media + DesvioPadrao * Sqrt(-2 * Ln(Random + 0.000001)) * 2467 | Cos(2 * PI * Random); 2468 | until (CR >= 0) and (CR <= 10); 2469 | 2470 | // Arredondar para 2 casas decimais 2471 | Result := RoundTo(CR, -2); 2472 | end; 2473 | 2474 | function TFakeDataGenerator.GerarDataFormatura(AnoInicio: Integer = 0): TDateTime; 2475 | var 2476 | AnoBase, MesBase, DiaBase: Word; 2477 | DuracaoCurso: Integer; 2478 | DataBase: TDateTime; 2479 | begin 2480 | // Se não foi informado o ano de início, gera aleatoriamente 2481 | if AnoInicio = 0 then 2482 | AnoInicio := YearOf(Date) - Random(10) - 3; // Entre 3 e 12 anos atrás 2483 | 2484 | // Duração típica do curso (em anos) 2485 | case Random(6) of 2486 | 0, 1, 2: DuracaoCurso := 4; // 50% de chance: cursos de 4 anos (maioria) 2487 | 3, 4: DuracaoCurso := 5; // 33% de chance: cursos de 5 anos (engenharias, etc) 2488 | 5: DuracaoCurso := 6; // 17% de chance: cursos de 6 anos (medicina, etc) 2489 | end; 2490 | 2491 | // Adiciona uma variação para considerar possíveis atrasos ou adiantamentos 2492 | if Random(10) < 7 then // 70% chance de ter atraso 2493 | DuracaoCurso := DuracaoCurso + Random(2); // Adiciona até 1 ano de atraso 2494 | 2495 | // Define o ano de formatura 2496 | AnoBase := AnoInicio + DuracaoCurso; 2497 | 2498 | // A maioria das formaturas ocorre em dezembro ou julho 2499 | if Random(100) < 70 then 2500 | MesBase := 12 // 70% dezembro 2501 | else 2502 | MesBase := 7; // 30% julho 2503 | 2504 | // Dia típico de formatura (15 a 30 do mês) 2505 | DiaBase := 15 + Random(16); 2506 | 2507 | // Cria a data completa 2508 | Result := EncodeDate(AnoBase, MesBase, DiaBase); 2509 | end; 2510 | 2511 | function TFakeDataGenerator.GerarTituloMonografia: string; 2512 | const 2513 | Inicios: array[0..14] of string = ( 2514 | 'Análise de', 'Estudo sobre', 'Uma abordagem sobre', 'Investigação de', 2515 | 'Perspectivas de', 'Desenvolvimento de', 'O impacto de', 'Avaliação de', 2516 | 'Contribuições para', 'Aspectos de', 'Reflexões sobre', 'Aplicação de', 2517 | 'Metodologia para', 'Os desafios de', 'Tendências em' 2518 | ); 2519 | 2520 | Temas: array[0..14] of string = ( 2521 | 'sustentabilidade', 'inteligência artificial', 'tecnologias emergentes', 2522 | 'gestão de processos', 'comportamento organizacional', 'saúde pública', 2523 | 'comunicação digital', 'desenvolvimento sustentável', 'políticas públicas', 2524 | 'educação inclusiva', 'metodologias ativas', 'mercado financeiro', 2525 | 'sistemas integrados', 'inovação tecnológica', 'análise de dados' 2526 | ); 2527 | 2528 | Contextos: array[0..14] of string = ( 2529 | 'no contexto brasileiro', 'em ambientes corporativos', 'na sociedade contemporânea', 2530 | 'no cenário atual', 'em instituições públicas', 'em organizações de saúde', 2531 | 'no setor educacional', 'na indústria 4.0', 'em economias emergentes', 2532 | 'no comércio eletrônico', 'na tomada de decisão', 'em projetos sociais', 2533 | 'nas relações internacionais', 'em pequenas e médias empresas', 'na transformação digital' 2534 | ); 2535 | var 2536 | Titulo: string; 2537 | begin 2538 | // Estrutura básica do título: Início + Tema + Contexto 2539 | // Ex: "Análise de inteligência artificial no cenário atual" 2540 | Titulo := Inicios[Random(15)] + ' ' + Temas[Random(15)] + ' ' + Contextos[Random(15)]; 2541 | 2542 | // Em 30% dos casos, adiciona um subtítulo 2543 | if Random(10) < 3 then 2544 | Titulo := Titulo + ': um estudo de caso'; 2545 | 2546 | Result := Titulo; 2547 | end; 2548 | 2549 | { Dados de Veículos } 2550 | function TFakeDataGenerator.GerarMarcaVeiculo: string; 2551 | begin 2552 | Result := FMarcasVeiculos[Random(FMarcasVeiculos.Count)]; 2553 | end; 2554 | 2555 | function TFakeDataGenerator.GerarModeloVeiculo(const Marca: string = ''): string; 2556 | var 2557 | MarcaSelecionada: string; 2558 | ModelosMarca: TStringList; 2559 | i, ModeloIndex: Integer; 2560 | ModeloInfo: string; 2561 | begin 2562 | // Se não foi especificada uma marca, gera aleatoriamente 2563 | if Marca = '' then 2564 | MarcaSelecionada := GerarMarcaVeiculo 2565 | else 2566 | MarcaSelecionada := Marca; 2567 | 2568 | // Cria uma lista temporária para armazenar apenas os modelos da marca selecionada 2569 | ModelosMarca := TStringList.Create; 2570 | try 2571 | // Procura por modelos da marca específica 2572 | for i := 0 to FModelosVeiculos.Count - 1 do 2573 | begin 2574 | ModeloInfo := FModelosVeiculos[i]; 2575 | if Pos(MarcaSelecionada + '|', ModeloInfo) = 1 then 2576 | ModelosMarca.Add(ModeloInfo); 2577 | end; 2578 | 2579 | // Se encontrou modelos para a marca, seleciona um aleatoriamente 2580 | if ModelosMarca.Count > 0 then 2581 | begin 2582 | ModeloIndex := Random(ModelosMarca.Count); 2583 | ModeloInfo := ModelosMarca[ModeloIndex]; 2584 | // Retorna apenas a parte do modelo (após o | ) 2585 | Result := Copy(ModeloInfo, Pos('|', ModeloInfo) + 1, Length(ModeloInfo)); 2586 | end 2587 | else 2588 | // Se não encontrou modelos para a marca, retorna um texto genérico 2589 | Result := 'Modelo ' + IntToStr(Random(100)); 2590 | finally 2591 | ModelosMarca.Free; 2592 | end; 2593 | end; 2594 | 2595 | function TFakeDataGenerator.GerarAnoVeiculo(IdadeMaxima: Integer = 20): Integer; 2596 | var 2597 | AnoAtual, IdadeVeiculo: Integer; 2598 | begin 2599 | AnoAtual := YearOf(Date); 2600 | 2601 | // Distribuição mais realista para idade de veículos 2602 | // Maior probabilidade para veículos entre 0 e 10 anos 2603 | if Random(100) < 70 then 2604 | IdadeVeiculo := Random(10) // 70% dos veículos têm até 10 anos 2605 | else 2606 | IdadeVeiculo := 10 + Random(IdadeMaxima - 9); // 30% têm entre 11 e IdadeMaxima anos 2607 | 2608 | Result := AnoAtual - IdadeVeiculo; 2609 | end; 2610 | 2611 | function TFakeDataGenerator.GerarChassi: string; 2612 | const 2613 | ValidChars = '0123456789ABCDEFGHJKLMNPRSTUVWXYZ'; // Sem I, O, Q 2614 | var 2615 | i: Integer; 2616 | Chassi: string; 2617 | begin 2618 | // Formato padrão de chassi: 17 caracteres 2619 | // 3 primeiros: WMI (World Manufacturer Identifier) 2620 | // 6 seguintes: Descrição do veículo 2621 | // 1 verificador 2622 | // 1 ano modelo 2623 | // 1 fábrica 2624 | // 5 últimos: número sequencial 2625 | 2626 | SetLength(Chassi, 17); 2627 | 2628 | // Gerando os 17 caracteres 2629 | for i := 1 to 17 do 2630 | Chassi[i] := ValidChars[Random(Length(ValidChars)) + 1]; 2631 | 2632 | // Geralmente o 10º caractere indica o ano do modelo 2633 | Chassi[10] := ValidChars[Random(10) + 1]; // Anos mais frequentes 2634 | 2635 | Result := Chassi; 2636 | end; 2637 | 2638 | function TFakeDataGenerator.GerarCor: string; 2639 | begin 2640 | Result := FCoresVeiculos[Random(FCoresVeiculos.Count)]; 2641 | end; 2642 | 2643 | function TFakeDataGenerator.GerarTipoCombustivel: string; 2644 | var 2645 | Probabilidades: array[0..6] of Integer; 2646 | ValorSorteio, SomaProbabilidades, i: Integer; 2647 | begin 2648 | // Probabilidades para cada tipo de combustível (baseado na frota brasileira) 2649 | Probabilidades[0] := 45; // 45% Flex 2650 | Probabilidades[1] := 20; // 20% Gasolina 2651 | Probabilidades[2] := 15; // 15% Diesel 2652 | Probabilidades[3] := 10; // 10% Etanol 2653 | Probabilidades[4] := 5; // 5% GNV 2654 | Probabilidades[5] := 3; // 3% Híbrido 2655 | Probabilidades[6] := 2; // 2% Elétrico 2656 | 2657 | // Calcula soma das probabilidades 2658 | SomaProbabilidades := 0; 2659 | for i := 0 to 6 do 2660 | SomaProbabilidades := SomaProbabilidades + Probabilidades[i]; 2661 | 2662 | // Sorteia um valor dentro do range de probabilidades 2663 | ValorSorteio := Random(SomaProbabilidades) + 1; 2664 | 2665 | // Determina qual combustível foi sorteado 2666 | SomaProbabilidades := 0; 2667 | for i := 0 to 6 do 2668 | begin 2669 | SomaProbabilidades := SomaProbabilidades + Probabilidades[i]; 2670 | if ValorSorteio <= SomaProbabilidades then 2671 | begin 2672 | Result := FCombustiveis[i]; 2673 | Break; 2674 | end; 2675 | end; 2676 | end; 2677 | 2678 | function TFakeDataGenerator.GerarQuilometragem(AnoVeiculo: Integer): Integer; 2679 | var 2680 | AnoAtual, IdadeVeiculo, MediaKmAnual: Integer; 2681 | KmBase, Variacao: Double; 2682 | begin 2683 | AnoAtual := YearOf(Date); 2684 | IdadeVeiculo := AnoAtual - AnoVeiculo; 2685 | 2686 | // Média de quilometragem anual (entre 10.000 e 20.000 km) 2687 | MediaKmAnual := 10000 + Random(10001); 2688 | 2689 | // Quilometragem base (média anual * idade) 2690 | KmBase := MediaKmAnual * IdadeVeiculo; 2691 | 2692 | // Adiciona variação de até 30% para mais ou para menos 2693 | Variacao := (Random * 0.6) - 0.3; // -30% a +30% 2694 | 2695 | // Calcula quilometragem final com variação e arredonda 2696 | Result := Round(KmBase * (1 + Variacao)); 2697 | 2698 | // Garante que não seja negativo (para veículos novos) 2699 | if Result < 0 then 2700 | Result := Random(1000); // Veículo novo com poucos km 2701 | end; 2702 | 2703 | function TFakeDataGenerator.GerarNomeProduto(Categoria: string = ''): string; 2704 | var 2705 | Marca, Adjetivo: string; 2706 | Sufixos: array[0..9] of string; 2707 | NomeBase: string; 2708 | begin 2709 | Marca := FMarcasProdutos[Random(FMarcasProdutos.Count)]; 2710 | Adjetivo := FAdjetivosProdutos[Random(FAdjetivosProdutos.Count)]; 2711 | 2712 | // Sufixos diversos para produtos 2713 | Sufixos[0] := 'Pro'; 2714 | Sufixos[1] := 'Plus'; 2715 | Sufixos[2] := 'Max'; 2716 | Sufixos[3] := 'Ultra'; 2717 | Sufixos[4] := 'Lite'; 2718 | Sufixos[5] := ''; 2719 | Sufixos[6] := 'Smart'; 2720 | Sufixos[7] := 'Premium'; 2721 | Sufixos[8] := IntToStr(1000 + Random(9000)); // Número de 1000 a 9999 2722 | Sufixos[9] := Chr(65 + Random(26)); // Letra de A a Z 2723 | 2724 | // Se não tiver categoria, gera uma aleatória 2725 | if Categoria = '' then 2726 | Categoria := FCategoriasProdutos[Random(FCategoriasProdutos.Count)]; 2727 | 2728 | // Gera estrutura base do nome do produto baseado na categoria 2729 | if Categoria = 'Eletrônicos' then 2730 | NomeBase := Marca + ' ' + Adjetivo + ' ' + Sufixos[Random(10)] 2731 | else if Categoria = 'Informática' then 2732 | NomeBase := Marca + ' ' + Adjetivo + ' ' + Sufixos[Random(10)] 2733 | else if Categoria = 'Celulares' then 2734 | NomeBase := Marca + ' ' + 'Smartphone ' + Adjetivo + ' ' + Sufixos[Random(10)] 2735 | else if Categoria = 'Eletrodomésticos' then 2736 | NomeBase := Marca + ' ' + Adjetivo + ' ' + Sufixos[Random(10)] 2737 | else if (Categoria = 'Móveis') or (Categoria = 'Decoração') then 2738 | NomeBase := Marca + ' ' + Adjetivo + ' ' + Sufixos[Random(10)] 2739 | else if (Categoria = 'Moda Masculina') or (Categoria = 'Moda Feminina') or (Categoria = 'Moda Infantil') then 2740 | NomeBase := Marca + ' ' + Adjetivo + ' ' + Sufixos[Random(10)] 2741 | else if Categoria = 'Calçados' then 2742 | NomeBase := Marca + ' ' + Adjetivo + ' ' + Sufixos[Random(10)] 2743 | else if Categoria = 'Livros' then 2744 | NomeBase := Marca + ' ' + Adjetivo + ' ' + Sufixos[Random(10)] 2745 | else 2746 | NomeBase := Marca + ' ' + Adjetivo + ' ' + Sufixos[Random(10)]; 2747 | 2748 | Result := NomeBase; 2749 | end; 2750 | 2751 | function TFakeDataGenerator.GerarDescricaoProduto(const NomeProduto: string; TamanhoDescricao: Integer = 2): string; 2752 | var 2753 | Descricao: TStringList; 2754 | Caracteristicas: array[0..19] of string; 2755 | Beneficios: array[0..14] of string; 2756 | Garantias: array[0..4] of string; 2757 | i, NumParagrafos: Integer; 2758 | begin 2759 | // Características genéricas para produtos 2760 | Caracteristicas[0] := 'Fabricado com materiais de alta qualidade'; 2761 | Caracteristicas[1] := 'Design moderno e elegante'; 2762 | Caracteristicas[2] := 'Leve e compacto'; 2763 | Caracteristicas[3] := 'Fácil de usar e configurar'; 2764 | Caracteristicas[4] := 'Resistente a impactos e arranhões'; 2765 | Caracteristicas[5] := 'Disponível em várias cores'; 2766 | Caracteristicas[6] := 'Tecnologia de ponta'; 2767 | Caracteristicas[7] := 'Alta performance'; 2768 | Caracteristicas[8] := 'Econômico e sustentável'; 2769 | Caracteristicas[9] := 'Acabamento premium'; 2770 | Caracteristicas[10] := 'Bateria de longa duração'; 2771 | Caracteristicas[11] := 'Conectividade avançada'; 2772 | Caracteristicas[12] := 'Compatível com diversos dispositivos'; 2773 | Caracteristicas[13] := 'Interface intuitiva'; 2774 | Caracteristicas[14] := 'Múltiplas funções em um único produto'; 2775 | Caracteristicas[15] := 'Tecnologia de última geração'; 2776 | Caracteristicas[16] := 'Controle preciso e eficiente'; 2777 | Caracteristicas[17] := 'Sensor de alta precisão'; 2778 | Caracteristicas[18] := 'Processamento rápido'; 2779 | Caracteristicas[19] := 'Armazenamento amplo'; 2780 | 2781 | // Benefícios genéricos 2782 | Beneficios[0] := 'Proporciona maior conforto e praticidade'; 2783 | Beneficios[1] := 'Economiza tempo e esforço'; 2784 | Beneficios[2] := 'Melhora a produtividade'; 2785 | Beneficios[3] := 'Ideal para uso doméstico ou profissional'; 2786 | Beneficios[4] := 'Oferece melhor custo-benefício do mercado'; 2787 | Beneficios[5] := 'Traz mais segurança e tranquilidade'; 2788 | Beneficios[6] := 'Ajuda a economizar energia'; 2789 | Beneficios[7] := 'Prolonga a vida útil de seus equipamentos'; 2790 | Beneficios[8] := 'Reduz custos a longo prazo'; 2791 | Beneficios[9] := 'Melhora a experiência do usuário'; 2792 | Beneficios[10] := 'Protege contra danos e desgastes prematuros'; 2793 | Beneficios[11] := 'Aumenta a eficiência no dia a dia'; 2794 | Beneficios[12] := 'Contribui para a organização do ambiente'; 2795 | Beneficios[13] := 'Garante resultados profissionais'; 2796 | Beneficios[14] := 'Adapta-se a diferentes necessidades'; 2797 | 2798 | // Informações de garantia 2799 | Garantias[0] := 'Garantia de 12 meses do fabricante'; 2800 | Garantias[1] := 'Garantia de 6 meses contra defeitos de fabricação'; 2801 | Garantias[2] := 'Garantia estendida disponível'; 2802 | Garantias[3] := 'Produto com certificação de qualidade'; 2803 | Garantias[4] := 'Atendimento ao cliente 24 horas'; 2804 | 2805 | // Cria a descrição do produto 2806 | Descricao := TStringList.Create; 2807 | try 2808 | // Primeiro parágrafo - Introdução 2809 | Descricao.Add(Format('O %s é a escolha perfeita para quem busca qualidade e inovação. %s e %s.', 2810 | [NomeProduto, Caracteristicas[Random(20)], Caracteristicas[Random(20)]])); 2811 | 2812 | // Características do produto 2813 | Descricao.Add(''); 2814 | Descricao.Add('CARACTERÍSTICAS PRINCIPAIS:'); 2815 | for i := 1 to 3 + Random(3) do // 3 a 5 características 2816 | Descricao.Add('- ' + Caracteristicas[Random(20)]); 2817 | 2818 | // Benefícios 2819 | Descricao.Add(''); 2820 | Descricao.Add('BENEFÍCIOS:'); 2821 | for i := 1 to 2 + Random(3) do // 2 a 4 benefícios 2822 | Descricao.Add('- ' + Beneficios[Random(15)]); 2823 | 2824 | // Adiciona informações de garantia 2825 | Descricao.Add(''); 2826 | Descricao.Add('INFORMAÇÕES ADICIONAIS:'); 2827 | Descricao.Add('- ' + Garantias[Random(5)]); 2828 | Descricao.Add('- Produto original com nota fiscal'); 2829 | 2830 | // Conclusão 2831 | Descricao.Add(''); 2832 | Descricao.Add(Format('Não perca a oportunidade de adquirir o %s e elevar sua experiência ao próximo nível!', [NomeProduto])); 2833 | 2834 | // Limita o tamanho da descrição conforme solicitado 2835 | if TamanhoDescricao < 5 then 2836 | begin 2837 | NumParagrafos := TamanhoDescricao; 2838 | while Descricao.Count > NumParagrafos * 3 do 2839 | Descricao.Delete(Descricao.Count - 1); 2840 | end; 2841 | 2842 | Result := Descricao.Text; 2843 | finally 2844 | Descricao.Free; 2845 | end; 2846 | end; 2847 | 2848 | function TFakeDataGenerator.GerarCategoriaProduto: string; 2849 | begin 2850 | Result := FCategoriasProdutos[Random(FCategoriasProdutos.Count)]; 2851 | end; 2852 | 2853 | function TFakeDataGenerator.GerarPrecoProduto(ValorMinimo: Double = 10.0; ValorMaximo: Double = 2000.0): Double; 2854 | var 2855 | PrecosComuns: array[0..9] of Double; 2856 | UsarPrecoComum: Boolean; 2857 | begin 2858 | // Preços comuns que são mais frequentes no mercado 2859 | PrecosComuns[0] := 19.90; 2860 | PrecosComuns[1] := 29.90; 2861 | PrecosComuns[2] := 49.90; 2862 | PrecosComuns[3] := 99.90; 2863 | PrecosComuns[4] := 149.90; 2864 | PrecosComuns[5] := 199.90; 2865 | PrecosComuns[6] := 299.90; 2866 | PrecosComuns[7] := 399.90; 2867 | PrecosComuns[8] := 499.90; 2868 | PrecosComuns[9] := 999.90; 2869 | 2870 | // 40% de chance de usar um preço comum 2871 | UsarPrecoComum := Random(100) < 40; 2872 | 2873 | if UsarPrecoComum and (ValorMinimo <= PrecosComuns[0]) and (ValorMaximo >= PrecosComuns[9]) then 2874 | Result := PrecosComuns[Random(10)] 2875 | else 2876 | begin 2877 | // Gera um preço aleatório dentro do intervalo 2878 | Result := ValorMinimo + Random * (ValorMaximo - ValorMinimo); 2879 | 2880 | // Arredonda para o formato XX,90 (muito comum em preços de varejo) 2881 | if Random(100) < 70 then // 70% de chance 2882 | Result := Trunc(Result) - 0.10 + 0.99; 2883 | 2884 | // Arredonda para 2 casas decimais 2885 | Result := RoundTo(Result, -2); 2886 | end; 2887 | end; 2888 | 2889 | function TFakeDataGenerator.GerarDescontoProduto(DescontoMaximo: Integer = 50): Integer; 2890 | var 2891 | DescontosComuns: array[0..5] of Integer; 2892 | UsarDescontoComum: Boolean; 2893 | Desconto: Integer; 2894 | begin 2895 | // Descontos comuns no varejo 2896 | DescontosComuns[0] := 5; 2897 | DescontosComuns[1] := 10; 2898 | DescontosComuns[2] := 15; 2899 | DescontosComuns[3] := 20; 2900 | DescontosComuns[4] := 30; 2901 | DescontosComuns[5] := 50; 2902 | 2903 | // 60% de chance de usar um desconto comum 2904 | UsarDescontoComum := Random(100) < 60; 2905 | 2906 | if UsarDescontoComum then 2907 | begin 2908 | // Encontra o maior desconto comum que é menor ou igual ao máximo permitido 2909 | for Desconto := High(DescontosComuns) downto Low(DescontosComuns) do 2910 | if DescontosComuns[Result] <= DescontoMaximo then 2911 | Exit(DescontosComuns[Desconto]); 2912 | end; 2913 | 2914 | // Caso contrário, gera um desconto aleatório múltiplo de 5 (5%, 10%, 15%...) 2915 | Result := (Random(DescontoMaximo div 5) + 1) * 5; 2916 | if Result > DescontoMaximo then 2917 | Result := DescontoMaximo; 2918 | end; 2919 | 2920 | function TFakeDataGenerator.GerarCodigoProduto: string; 2921 | var 2922 | Prefixo: string; 2923 | Numero: Integer; 2924 | begin 2925 | // Gera um prefixo de 2 a 3 letras 2926 | Prefixo := ''; 2927 | for var i := 1 to 2 + Random(2) do 2928 | Prefixo := Prefixo + Chr(65 + Random(26)); 2929 | 2930 | // Gera um número de 4 a 6 dígitos 2931 | Numero := 1000 + Random(999000); 2932 | 2933 | // Formata o código 2934 | Result := Prefixo + '-' + IntToStr(Numero); 2935 | end; 2936 | 2937 | function TFakeDataGenerator.GerarPesoProduto(PesoMinimo: Integer = 100; PesoMaximo: Integer = 10000): Integer; 2938 | begin 2939 | // Peso em gramas 2940 | Result := PesoMinimo + Random(PesoMaximo - PesoMinimo + 1); 2941 | 2942 | // Arredonda para múltiplos de 10g para produtos leves, 100g para produtos médios e 1000g para produtos pesados 2943 | if Result < 1000 then 2944 | Result := (Result div 10) * 10 2945 | else if Result < 5000 then 2946 | Result := (Result div 100) * 100 2947 | else 2948 | Result := (Result div 1000) * 1000; 2949 | end; 2950 | 2951 | function TFakeDataGenerator.GerarDimensoesProduto: string; 2952 | var 2953 | Altura, Largura, Profundidade: Integer; 2954 | begin 2955 | // Dimensões em centímetros com limites realistas 2956 | Altura := 2 + Random(99); // 2cm a 100cm 2957 | Largura := 2 + Random(99); // 2cm a 100cm 2958 | Profundidade := 2 + Random(99); // 2cm a 100cm 2959 | 2960 | // Formata as dimensões (AxLxP) 2961 | Result := Format('%d x %d x %d cm', [Altura, Largura, Profundidade]); 2962 | end; 2963 | 2964 | function TFakeDataGenerator.GerarAvaliacaoProduto: Integer; 2965 | var 2966 | Avaliacoes: array[0..4] of Integer; 2967 | begin 2968 | // Distribuição de probabilidade para avaliações: 2969 | // 5 estrelas - 45% 2970 | // 4 estrelas - 30% 2971 | // 3 estrelas - 15% 2972 | // 2 estrelas - 7% 2973 | // 1 estrela - 3% 2974 | Avaliacoes[0] := 45; // 5 estrelas 2975 | Avaliacoes[1] := 30; // 4 estrelas 2976 | Avaliacoes[2] := 15; // 3 estrelas 2977 | Avaliacoes[3] := 7; // 2 estrelas 2978 | Avaliacoes[4] := 3; // 1 estrela 2979 | 2980 | var Sorteio := Random(100) + 1; 2981 | var Acumulado := 0; 2982 | 2983 | for var i := 0 to 4 do 2984 | begin 2985 | Acumulado := Acumulado + Avaliacoes[i]; 2986 | if Sorteio <= Acumulado then 2987 | Exit(5 - i); 2988 | end; 2989 | 2990 | Result := 5; // Padrão caso algo dê errado 2991 | end; 2992 | 2993 | function TFakeDataGenerator.GerarComentarioProduto(Positivo: Boolean = True): string; 2994 | var 2995 | ComentariosPositivos, ComentariosNegativos: TStringList; 2996 | i: Integer; 2997 | begin 2998 | ComentariosPositivos := TStringList.Create; 2999 | ComentariosNegativos := TStringList.Create; 3000 | try 3001 | // Separa os comentários em positivos e negativos 3002 | for i := 0 to FComentariosProdutos.Count - 1 do 3003 | begin 3004 | if i < 14 then // Os primeiros 14 são positivos 3005 | ComentariosPositivos.Add(FComentariosProdutos[i]) 3006 | else 3007 | ComentariosNegativos.Add(FComentariosProdutos[i]); 3008 | end; 3009 | 3010 | // Retorna um comentário aleatório conforme solicitado 3011 | if Positivo then 3012 | Result := ComentariosPositivos[Random(ComentariosPositivos.Count)] 3013 | else 3014 | Result := ComentariosNegativos[Random(ComentariosNegativos.Count)]; 3015 | finally 3016 | ComentariosPositivos.Free; 3017 | ComentariosNegativos.Free; 3018 | end; 3019 | end; 3020 | 3021 | function TFakeDataGenerator.GerarEstoqueProduto(EstoqueMinimo: Integer = 0; EstoqueMaximo: Integer = 500): Integer; 3022 | begin 3023 | Result := EstoqueMinimo + Random(EstoqueMaximo - EstoqueMinimo + 1); 3024 | 3025 | // Itens populares tendem a ter estoques maiores 3026 | if Random(100) < 20 then // 20% de chance para produtos populares 3027 | Result := Result * 2; 3028 | 3029 | // Possibilidade de produtos esgotados 3030 | if (EstoqueMinimo = 0) and (Random(100) < 5) then // 5% de chance 3031 | Result := 0; 3032 | end; 3033 | 3034 | function TFakeDataGenerator.GerarStatusPedido: string; 3035 | begin 3036 | Result := FStatusPedido[Random(FStatusPedido.Count)]; 3037 | end; 3038 | 3039 | function TFakeDataGenerator.GerarStatusPagamento: string; 3040 | begin 3041 | Result := FStatusPagamento[Random(FStatusPagamento.Count)]; 3042 | end; 3043 | 3044 | function TFakeDataGenerator.GerarMetodoPagamento: string; 3045 | begin 3046 | Result := FMetodosPagamento[Random(FMetodosPagamento.Count)]; 3047 | end; 3048 | 3049 | function TFakeDataGenerator.GerarCupomDesconto(Prefixo: string = ''): string; 3050 | var 3051 | Codigos: array[0..4] of string; 3052 | Codigo: string; 3053 | begin 3054 | Codigos[0] := 'PROMO'; 3055 | Codigos[1] := 'DESC'; 3056 | Codigos[2] := 'SALE'; 3057 | Codigos[3] := 'SAVE'; 3058 | Codigos[4] := 'OFFER'; 3059 | 3060 | // Se não for especificado um prefixo, escolhe aleatoriamente 3061 | if Prefixo = '' then 3062 | Prefixo := Codigos[Random(5)]; 3063 | 3064 | // Gera um código alfanumérico de 4 a 6 caracteres 3065 | Codigo := ''; 3066 | for var i := 1 to 4 + Random(3) do 3067 | begin 3068 | case Random(3) of 3069 | 0: Codigo := Codigo + Chr(65 + Random(26)); // Letra maiúscula 3070 | 1: Codigo := Codigo + Chr(48 + Random(10)); // Número 3071 | 2: Codigo := Codigo + Chr(65 + Random(26)); // Letra maiúscula 3072 | end; 3073 | end; 3074 | 3075 | // Formata o cupom 3076 | Result := UpperCase(Prefixo) + Codigo; 3077 | end; 3078 | 3079 | function TFakeDataGenerator.GerarNumeroPedido: string; 3080 | var 3081 | Ano, NumSequencial: string; 3082 | begin 3083 | // Formato comum de número de pedido: ANO + Sequencial 3084 | Ano := Copy(IntToStr(YearOf(Date)), 3, 2); // Últimos 2 dígitos do ano 3085 | NumSequencial := Format('%.6d', [Random(1000000)]); // 6 dígitos 3086 | 3087 | Result := Ano + NumSequencial; 3088 | end; 3089 | 3090 | function TFakeDataGenerator.GerarIDTransacao: string; 3091 | var 3092 | Caracteres: string; 3093 | ID: string; 3094 | begin 3095 | Caracteres := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 3096 | ID := ''; 3097 | 3098 | // Gera um ID de transação alfanumérico único (comum em sistemas de pagamento) 3099 | // Formato: 4 grupos de 4 caracteres separados por hífen 3100 | for var i := 1 to 4 do 3101 | begin 3102 | for var j := 1 to 4 do 3103 | ID := ID + Caracteres[Random(Length(Caracteres)) + 1]; 3104 | 3105 | if i < 4 then 3106 | ID := ID + '-'; 3107 | end; 3108 | 3109 | Result := ID; 3110 | end; 3111 | 3112 | 3113 | end. 3114 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Biblioteca FakeDataGenerator para Delphi/Lazarus 2 | 3 | Uma biblioteca Delphi/Lazarus para geração de dados fictícios brasileiros, ideal para preencher bancos de dados de teste ou demonstração. 4 | Pode ser utilizado em sistemas CRM, ERP etc. 5 | 6 | ## 📋 Sumário 7 | 8 | - [Recursos](#-recursos) 9 | - [Documentos Brasileiros](#-documentos-brasileiros) 10 | - [Dados Pessoais](#-dados-pessoais) 11 | - [Dados Empresariais e Financeiros](#-dados-empresariais-e-financeiros) 12 | - [Endereços Completos](#-endereços-completos) 13 | - [Valores e Datas](#-valores-e-datas) 14 | - [Dados de Saúde](#-dados-de-saúde) 15 | - [Dados Acadêmicos](#-dados-acadêmicos) 16 | - [Dados de Veículos](#-dados-de-veículos) 17 | - [Dados de Produtos e E-commerce](#-dados-de-produtos-e-e-commerce) 18 | - [Instalação](#-instalação) 19 | - [Como Usar](#-como-usar) 20 | - [Exemplos](#-exemplos) 21 | - [Populando Empresas](#--populando-uma-tabela-de-empresas) 22 | - [Gerando Contas a Receber](#gerando-contas-a-receber) 23 | - [Populando Dados de Prontuário](#--populando-dados-de-prontuário-médico) 24 | - [Populando Dados de Veículos](#--populando-dados-de-veículos) 25 | - [Populando Dados de Produtos](#--populando-dados-de-produtos) 26 | - [Documentação da API](#-documentação-da-api) 27 | - [Métodos para Documentos](#métodos-para-documentos) 28 | - [Métodos para Dados Pessoais](#métodos-para-dados-pessoais) 29 | - [Métodos para Dados Empresariais e Financeiros](#métodos-para-dados-empresariais-e-financeiros) 30 | - [Métodos para Endereços](#métodos-para-endereços) 31 | - [Métodos para Valores e Datas](#métodos-para-valores-e-datas) 32 | - [Métodos para Dados de Saúde](#métodos-para-dados-de-saúde) 33 | - [Métodos para Dados Acadêmicos](#métodos-para-dados-acadêmicos) 34 | - [Métodos para Dados de Veículos](#métodos-para-dados-de-veículos) 35 | - [Métodos para Dados de Produtos e E-commerce](#métodos-para-dados-de-produtos-e-e-commerce) 36 | - [Métodos Utilitários](#métodos-utilitários) 37 | - [Contribuindo](#-contribuindo) 38 | - [Licença](#-licença) 39 | 40 | [🔝](#-sumário) 41 | ## ✨ Recursos 42 | 43 | Esta biblioteca oferece métodos para gerar diversos tipos de dados fictícios, incluindo: 44 | 45 | [🔝](#-sumário) 46 | ### 📄 Documentos Brasileiros 47 | - CPF com validação de dígitos verificadores 48 | - CNPJ com validação de dígitos verificadores 49 | - CNH (Carteira Nacional de Habilitação) 50 | - RG (Registro Geral) 51 | - Inscrição Estadual 52 | - PIS/PASEP 53 | - Título de Eleitor 54 | - RENAVAM 55 | - Placa de Veículo (padrão antigo e Mercosul) 56 | 57 | [🔝](#-sumário) 58 | ### 👤 Dados Pessoais 59 | - Nomes e sobrenomes (masculinos/femininos) 60 | - Nomes completos 61 | - Telefones fixos com DDD 62 | - Telefones celulares com DDD 63 | - Endereços de e-mail 64 | 65 | [🔝](#-sumário) 66 | ### 🏢 Dados Empresariais e Financeiros 67 | - Razão Social 68 | - Nome Fantasia 69 | - Números de documentos fiscais 70 | - Contas bancárias 71 | - Cartões de crédito (Visa, Mastercard, Amex, Discover) 72 | 73 | [🔝](#-sumário) 74 | ### 🏠 Endereços Completos 75 | - Logradouros (Rua, Avenida, etc.) 76 | - Número 77 | - Complemento 78 | - Bairro 79 | - Cidade 80 | - UF 81 | - CEP formatado 82 | 83 | [🔝](#-sumário) 84 | ### 💰 Valores e Datas 85 | - Datas aleatórias dentro de um intervalo 86 | - Valores monetários 87 | - Códigos de documentos comerciais 88 | 89 | [🔝](#-sumário) 90 | ### 🏥 Dados de Saúde 91 | - Tipo sanguíneo (A+, A-, B+, B-, AB+, AB-, O+, O-) 92 | - Altura (em centímetros) 93 | - Peso (em quilogramas) 94 | - Pressão arterial 95 | - Medicamentos 96 | - Especialidades médicas 97 | - Planos de saúde 98 | 99 | [🔝](#-sumário) 100 | ### 🎓 Dados Acadêmicos 101 | - Nome de instituições de ensino 102 | - Nomes de cursos de graduação 103 | - Áreas de formação acadêmica 104 | - Números de matrículas acadêmicas 105 | - Coeficientes de rendimento 106 | - Datas de formatura 107 | - Títulos de monografias ou trabalhos acadêmicos 108 | 109 | [🔝](#-sumário) 110 | ### 🚗 Dados de Veículos 111 | - Marcas de veículos populares no Brasil 112 | - Modelos específicos para cada marca 113 | - Anos de fabricação com distribuição realista 114 | - Números de chassi válidos 115 | - Cores de veículos 116 | - Tipos de combustível (Flex, Gasolina, Diesel, etc.) 117 | - Quilometragem proporcional à idade do veículo 118 | 119 | [🔝](#-sumário) 120 | ### 🛒 Dados de Produtos e E-commerce 121 | - Nomes de produtos por categoria 122 | - Descrições detalhadas de produtos 123 | - Categorias de produtos 124 | - Preços com padrões realistas de mercado 125 | - Descontos promocionais 126 | - Códigos e identificadores de produtos 127 | - Especificações físicas (peso e dimensões) 128 | - Avaliações e comentários de clientes 129 | - Níveis de estoque 130 | - Status de pedidos e pagamentos 131 | - Métodos de pagamento 132 | - Cupons de desconto 133 | - Números de pedido 134 | - IDs de transação financeira 135 | 136 | [🔝](#-sumário) 137 | ## 💻 Instalação 138 | 139 | 1. Faça o download dos arquivos fonte ou clone este repositório 140 | 2. Adicione o arquivo `FakeDataGenerator.pas` ao seu projeto Delphi/Lazarus 141 | 3. Adicione `FakeDataGenerator` na cláusula `uses` de suas units 142 | 143 | [🔝](#-sumário) 144 | ## 🚀 Como Usar 145 | 146 | ## - Exemplo básico de uso: 147 | 148 | ```pascal 149 | uses 150 | ..., FakeDataGenerator; 151 | 152 | var 153 | FakeData: TFakeDataGenerator; 154 | begin 155 | // Inicie a geração de números aleatórios 156 | Randomize; 157 | 158 | // Crie uma instância do gerador 159 | FakeData := TFakeDataGenerator.Create; 160 | try 161 | // Gere e utilize os dados fictícios 162 | ShowMessage('CPF: ' + FakeData.GerarCPF); 163 | ShowMessage('Nome: ' + FakeData.GerarNomeCompleto); 164 | ShowMessage('Email: ' + FakeData.GerarEmail(FakeData.GerarNomeCompleto)); 165 | finally 166 | // Libere os recursos 167 | FakeData.Free; 168 | end; 169 | end; 170 | ``` 171 | [🔝](#-sumário) 172 | ## 📝 Exemplos 173 | 174 | [🔝](#-sumário) 175 | ## - Populando uma tabela de empresas 176 | 177 | ```pascal 178 | 179 | procedure PopularEmpresas(Quantidade: Integer); 180 | var 181 | FakeData: TFakeDataGenerator; 182 | i: Integer; 183 | RazaoSocial: string; 184 | begin 185 | FakeData := TFakeDataGenerator.Create; 186 | try 187 | for i := 1 to Quantidade do 188 | begin 189 | RazaoSocial := FakeData.GerarRazaoSocial; 190 | 191 | qryEmpresas.Close; 192 | qryEmpresas.SQL.Text := 'INSERT INTO EMPRESAS (RAZAO_SOCIAL, NOME_FANTASIA, CNPJ, ' + 193 | 'TELEFONE, EMAIL, ENDERECO, CIDADE, UF, CEP) ' + 194 | 'VALUES (:RAZAO, :FANTASIA, :CNPJ, :TEL, :EMAIL, ' + 195 | ':END, :CID, :UF, :CEP)'; 196 | 197 | qryEmpresas.ParamByName('RAZAO').AsString := RazaoSocial; 198 | qryEmpresas.ParamByName('FANTASIA').AsString := FakeData.GerarNomeFantasia(RazaoSocial); 199 | qryEmpresas.ParamByName('CNPJ').AsString := FakeData.GerarCNPJ; 200 | qryEmpresas.ParamByName('TEL').AsString := FakeData.GerarTelefone; 201 | qryEmpresas.ParamByName('EMAIL').AsString := FakeData.GerarEmail(RazaoSocial); 202 | qryEmpresas.ParamByName('END').AsString := 203 | FakeData.GerarLogradouro + ', ' + FakeData.GerarNumero; 204 | qryEmpresas.ParamByName('CID').AsString := FakeData.GerarCidade; 205 | qryEmpresas.ParamByName('UF').AsString := FakeData.GerarUF; 206 | qryEmpresas.ParamByName('CEP').AsString := FakeData.GerarCEP; 207 | 208 | qryEmpresas.ExecSQL; 209 | end; 210 | finally 211 | FakeData.Free; 212 | end; 213 | end; 214 | 215 | ``` 216 | 217 | [🔝](#-sumário) 218 | ## Gerando contas a receber 219 | 220 | ```pascal 221 | procedure GerarContasReceber(IDEmpresa, IDPessoa: Integer; Quantidade: Integer); 222 | var 223 | FakeData: TFakeDataGenerator; 224 | i: Integer; 225 | DataVencimento: TDateTime; 226 | begin 227 | FakeData := TFakeDataGenerator.Create; 228 | try 229 | for i := 1 to Quantidade do 230 | begin 231 | // Gera uma data de vencimento nos próximos 60 dias 232 | DataVencimento := FakeData.GerarData(Date, Date + 60); 233 | 234 | qryContasReceber.Close; 235 | qryContasReceber.SQL.Text := 236 | 'INSERT INTO CONTAS_RECEBER (ID_EMPRESA, ID_PESSOA, DOCUMENTO, ' + 237 | 'EMISSAO, VENCIMENTO, VALOR, DESCRICAO, SITUACAO) ' + 238 | 'VALUES (:EMPRESA, :PESSOA, :DOC, :EMISSAO, :VENC, :VALOR, :DESC, :SIT)'; 239 | 240 | qryContasReceber.ParamByName('EMPRESA').AsInteger := IDEmpresa; 241 | qryContasReceber.ParamByName('PESSOA').AsInteger := IDPessoa; 242 | qryContasReceber.ParamByName('DOC').AsString := FakeData.GerarDocumento; 243 | qryContasReceber.ParamByName('EMISSAO').AsDate := Date; 244 | qryContasReceber.ParamByName('VENC').AsDate := DataVencimento; 245 | qryContasReceber.ParamByName('VALOR').AsFloat := FakeData.GerarValor(100, 5000); 246 | qryContasReceber.ParamByName('DESC').AsString := 'Venda de mercadorias'; 247 | qryContasReceber.ParamByName('SIT').AsString := 'P'; // Pendente 248 | 249 | qryContasReceber.ExecSQL; 250 | end; 251 | finally 252 | FakeData.Free; 253 | end; 254 | end; 255 | 256 | ``` 257 | 258 | [🔝](#-sumário) 259 | ## - Populando dados de prontuário médico 260 | 261 | ```pascal 262 | procedure PopularProntuarios(Quantidade: Integer); 263 | var 264 | FakeData: TFakeDataGenerator; 265 | i: Integer; 266 | IDPessoa: Integer; 267 | begin 268 | FakeData := TFakeDataGenerator.Create; 269 | try 270 | for i := 1 to Quantidade do 271 | begin 272 | // Obter pessoa aleatória do banco de dados 273 | qryPessoas.Close; 274 | qryPessoas.Open; 275 | qryPessoas.First; 276 | qryPessoas.MoveBy(Random(qryPessoas.RecordCount)); 277 | IDPessoa := qryPessoas.FieldByName('ID').AsInteger; 278 | 279 | qryProntuarios.Close; 280 | qryProntuarios.SQL.Text := 281 | 'INSERT INTO PRONTUARIOS (ID_PESSOA, TIPO_SANGUINEO, ALTURA, ' + 282 | 'PESO, PRESSAO_ARTERIAL, ULTIMA_ATUALIZACAO) ' + 283 | 'VALUES (:PESSOA, :TIPO_SANG, :ALTURA, :PESO, :PRESSAO, :DATA)'; 284 | 285 | qryProntuarios.ParamByName('PESSOA').AsInteger := IDPessoa; 286 | qryProntuarios.ParamByName('TIPO_SANG').AsString := FakeData.GerarTipoSanguineo; 287 | qryProntuarios.ParamByName('ALTURA').AsInteger := FakeData.GerarAltura; 288 | qryProntuarios.ParamByName('PESO').AsFloat := FakeData.GerarPeso; 289 | qryProntuarios.ParamByName('PRESSAO').AsString := FakeData.GerarPressaoArterial; 290 | qryProntuarios.ParamByName('DATA').AsDateTime := Now; 291 | 292 | qryProntuarios.ExecSQL; 293 | end; 294 | finally 295 | FakeData.Free; 296 | end; 297 | end; 298 | ``` 299 | 300 | [🔝](#-sumário) 301 | ## - Populando dados de veículos 302 | 303 | ```pascal 304 | procedure PopularVeiculos(Quantidade: Integer); 305 | var 306 | FakeData: TFakeDataGenerator; 307 | i: Integer; 308 | IDPessoa: Integer; 309 | Marca: string; 310 | Modelo: string; 311 | AnoFabricacao: Integer; 312 | begin 313 | FakeData := TFakeDataGenerator.Create; 314 | try 315 | for i := 1 to Quantidade do 316 | begin 317 | // Obter pessoa aleatória do banco de dados 318 | qryPessoas.Close; 319 | qryPessoas.Open; 320 | qryPessoas.First; 321 | qryPessoas.MoveBy(Random(qryPessoas.RecordCount)); 322 | IDPessoa := qryPessoas.FieldByName('ID').AsInteger; 323 | 324 | // Gerar dados do veículo 325 | Marca := FakeData.GerarMarcaVeiculo; 326 | Modelo := FakeData.GerarModeloVeiculo(Marca); 327 | AnoFabricacao := FakeData.GerarAnoVeiculo; 328 | 329 | qryVeiculos.Close; 330 | qryVeiculos.SQL.Text := 331 | 'INSERT INTO VEICULOS (ID_PROPRIETARIO, MARCA, MODELO, ANO_FABRICACAO, ' + 332 | 'ANO_MODELO, CHASSI, COR, COMBUSTIVEL, PLACA, RENAVAM, QUILOMETRAGEM) ' + 333 | 'VALUES (:PROP, :MARCA, :MODELO, :ANOFAB, :ANOMOD, :CHASSI, :COR, ' + 334 | ':COMB, :PLACA, :RENAVAM, :KM)'; 335 | 336 | qryVeiculos.ParamByName('PROP').AsInteger := IDPessoa; 337 | qryVeiculos.ParamByName('MARCA').AsString := Marca; 338 | qryVeiculos.ParamByName('MODELO').AsString := Modelo; 339 | qryVeiculos.ParamByName('ANOFAB').AsInteger := AnoFabricacao; 340 | qryVeiculos.ParamByName('ANOMOD').AsInteger := AnoFabricacao + Random(2); // Ano modelo pode ser igual ou até 1 ano mais recente 341 | qryVeiculos.ParamByName('CHASSI').AsString := FakeData.GerarChassi; 342 | qryVeiculos.ParamByName('COR').AsString := FakeData.GerarCor; 343 | qryVeiculos.ParamByName('COMB').AsString := FakeData.GerarTipoCombustivel; 344 | qryVeiculos.ParamByName('PLACA').AsString := FakeData.GerarPlacaVeiculo(Random(2) = 1); // 50% chance de usar placa Mercosul 345 | qryVeiculos.ParamByName('RENAVAM').AsString := FakeData.GerarRENAVAM; 346 | qryVeiculos.ParamByName('KM').AsInteger := FakeData.GerarQuilometragem(AnoFabricacao); 347 | 348 | qryVeiculos.ExecSQL; 349 | end; 350 | finally 351 | FakeData.Free; 352 | end; 353 | end; 354 | ``` 355 | 356 | [🔝](#-sumário) 357 | ## - Populando dados de produtos 358 | 359 | ```pascal 360 | procedure PopularProdutos(Quantidade: Integer); 361 | var 362 | FakeData: TFakeDataGenerator; 363 | i: Integer; 364 | Categoria: string; 365 | NomeProduto: string; 366 | begin 367 | FakeData := TFakeDataGenerator.Create; 368 | try 369 | for i := 1 to Quantidade do 370 | begin 371 | // Gerar dados básicos do produto 372 | Categoria := FakeData.GerarCategoriaProduto; 373 | NomeProduto := FakeData.GerarNomeProduto(Categoria); 374 | 375 | qryProdutos.Close; 376 | qryProdutos.SQL.Text := 377 | 'INSERT INTO PRODUTOS_ECOMMERCE (CODIGO, NOME, DESCRICAO, CATEGORIA, ' + 378 | 'PRECO_VENDA, PERCENTUAL_DESCONTO, ESTOQUE_ATUAL, PESO, DIMENSOES) ' + 379 | 'VALUES (:COD, :NOME, :DESC, :CAT, :PRECO, :DESC_PERC, :ESTOQUE, :PESO, :DIM)'; 380 | 381 | qryProdutos.ParamByName('COD').AsString := FakeData.GerarCodigoProduto; 382 | qryProdutos.ParamByName('NOME').AsString := NomeProduto; 383 | qryProdutos.ParamByName('DESC').AsString := FakeData.GerarDescricaoProduto(NomeProduto); 384 | qryProdutos.ParamByName('CAT').AsString := Categoria; 385 | qryProdutos.ParamByName('PRECO').AsFloat := FakeData.GerarPrecoProduto(50, 1500); 386 | qryProdutos.ParamByName('DESC_PERC').AsInteger := FakeData.GerarDescontoProduto; 387 | qryProdutos.ParamByName('ESTOQUE').AsInteger := FakeData.GerarEstoqueProduto; 388 | qryProdutos.ParamByName('PESO').AsInteger := FakeData.GerarPesoProduto; 389 | qryProdutos.ParamByName('DIM').AsString := FakeData.GerarDimensoesProduto; 390 | 391 | qryProdutos.ExecSQL; 392 | 393 | // Adiciona algumas avaliações para este produto 394 | AdicionarAvaliacoesProduto(qryProdutos.LastInsertID, 1 + Random(5)); 395 | end; 396 | finally 397 | FakeData.Free; 398 | end; 399 | end; 400 | 401 | procedure AdicionarAvaliacoesProduto(IDProduto: Integer; Quantidade: Integer); 402 | var 403 | FakeData: TFakeDataGenerator; 404 | i, IDCliente, Avaliacao: Integer; 405 | Positivo: Boolean; 406 | begin 407 | FakeData := TFakeDataGenerator.Create; 408 | try 409 | for i := 1 to Quantidade do 410 | begin 411 | // Obter cliente aleatório do banco de dados 412 | qryClientes.Close; 413 | qryClientes.Open; 414 | qryClientes.First; 415 | qryClientes.MoveBy(Random(qryClientes.RecordCount)); 416 | IDCliente := qryClientes.FieldByName('ID').AsInteger; 417 | 418 | // Gerar avaliação com maior tendência a ser positiva (mais realista) 419 | Avaliacao := FakeData.GerarAvaliacaoProduto; 420 | Positivo := Avaliacao >= 4; // 4 ou 5 estrelas são consideradas positivas 421 | 422 | qryAvaliacoes.Close; 423 | qryAvaliacoes.SQL.Text := 424 | 'INSERT INTO AVALIACOES_PRODUTO (ID_PRODUTO, ID_CLIENTE, AVALIACAO, ' + 425 | 'COMENTARIO, DATA_AVALIACAO) ' + 426 | 'VALUES (:PROD, :CLI, :AVAL, :COMENT, :DATA)'; 427 | 428 | qryAvaliacoes.ParamByName('PROD').AsInteger := IDProduto; 429 | qryAvaliacoes.ParamByName('CLI').AsInteger := IDCliente; 430 | qryAvaliacoes.ParamByName('AVAL').AsInteger := Avaliacao; 431 | qryAvaliacoes.ParamByName('COMENT').AsString := FakeData.GerarComentarioProduto(Positivo); 432 | qryAvaliacoes.ParamByName('DATA').AsDateTime := FakeData.GerarData(IncDay(Date, -30), Date); 433 | 434 | qryAvaliacoes.ExecSQL; 435 | end; 436 | finally 437 | FakeData.Free; 438 | end; 439 | end; 440 | ``` 441 | 442 | [🔝](#-sumário) 443 | ## 📖 Documentação da API 444 | 445 | ### TFakeDataGenerator 446 | 447 | [🔝](#-sumário) 448 | #### Métodos para Documentos 449 | 450 | ```pascal 451 | // Gera um CPF válido. Se Formatado = True, retorna no formato XXX.XXX.XXX-XX. 452 | function GerarCPF(Formatado: Boolean = True): string; 453 | 454 | // Gera um CNPJ válido. Se Formatado = True, retorna no formato XX.XXX.XXX/XXXX-XX. 455 | function GerarCNPJ(Formatado: Boolean = True): string; 456 | 457 | // Gera um número de CNH fictício. 458 | function GerarCNH: string; 459 | 460 | // Gera uma inscrição estadual para a UF informada. 461 | function GerarInscricaoEstadual(UF: string): string; 462 | 463 | // Gera um número PIS/PASEP válido. Se Formatado = True, retorna no formato XXX.XXXXX.XX-X. 464 | function GerarPIS(Formatado: Boolean = True): string; 465 | 466 | // Gera um número de RG válido. Se Formatado = True, retorna no formato XX.XXX.XXX-X. 467 | function GerarRG(Formatado: Boolean = True): string; 468 | 469 | // Gera um número RENAVAM válido. 470 | function GerarRENAVAM: string; 471 | 472 | // Gera um número de título de eleitor. Se Formatado = True, inclui espaços entre os grupos. 473 | function GerarTituloEleitor(Formatado: Boolean = True): string; 474 | 475 | // Gera uma placa de veículo. Se Mercosul = True, usa o padrão Mercosul (ABC1D23). 476 | function GerarPlacaVeiculo(Mercosul: Boolean = False): string; 477 | ``` 478 | 479 | [🔝](#-sumário) 480 | #### Métodos para Dados Pessoais 481 | 482 | ```pascal 483 | // Gera um nome (primeiro nome) aleatório. 484 | function GerarNome(Feminino: Boolean = False): string; 485 | 486 | // Gera um nome completo (nome + sobrenomes) aleatório. 487 | function GerarNomeCompleto(Feminino: Boolean = False): string; 488 | 489 | // Gera um número de telefone fixo com DDD. 490 | function GerarTelefone(Formatado: Boolean = True): string; 491 | 492 | // Gera um número de celular com DDD, iniciando com 9. 493 | function GerarCelular(Formatado: Boolean = True): string; 494 | 495 | // Gera um endereço de e-mail baseado no nome fornecido. 496 | function GerarEmail(const Nome: string): string; 497 | 498 | // Gera uma data de nascimento com idade entre IdadeMinima e IdadeMaxima. 499 | function GerarDataNascimento(IdadeMinima: Integer = 18; IdadeMaxima: Integer = 80): TDateTime; 500 | 501 | // Gera um perfil de rede social com base no nome. 502 | function GerarPerfilRedeSocial(const Nome: string; RedeSocial: string = 'instagram'): string; 503 | 504 | // Gera um estado civil aleatório. 505 | function GerarEstadoCivil: string; 506 | 507 | // Gera uma profissão aleatória. 508 | function GerarProfissao: string; 509 | 510 | // Gera um nível de escolaridade aleatório. 511 | function GerarEscolaridade: string; 512 | ``` 513 | 514 | [🔝](#-sumário) 515 | #### Métodos para Dados Empresariais e Financeiros 516 | 517 | ```pascal 518 | // Gera uma razão social para empresa. 519 | function GerarRazaoSocial: string; 520 | 521 | // Gera um nome fantasia baseado na razão social. 522 | function GerarNomeFantasia(const RazaoSocial: string): string; 523 | 524 | // Gera um número de documento fiscal ou comercial. 525 | function GerarDocumento: string; 526 | 527 | // Gera um número de cartão de crédito válido. Bandeira pode ser: V (Visa), M (Mastercard), A (Amex), D (Discover). 528 | function GerarCartaoCredito(Bandeira: string = ''): string; 529 | 530 | // Gera dados de conta bancária. Banco pode ser especificado ou deixado em branco para seleção aleatória. 531 | function GerarContaBancaria(Banco: string = ''; Formatado: Boolean = True): string; 532 | 533 | // Gera um código CNAE para atividade empresarial. 534 | function GerarCNAE(Formatado: Boolean = True): string; 535 | 536 | // Gera um número de inscrição municipal. 537 | function GerarInscricaoMunicipal(Municipio: string = ''): string; 538 | 539 | // Gera um nome de departamento empresarial. 540 | function GerarDepartamento: string; 541 | 542 | // Gera um cargo profissional. 543 | function GerarCargo: string; 544 | 545 | // Gera uma chave PIX de acordo com o tipo especificado. 546 | function GerarChavePIX(TipoChave: string = 'aleatoria'): string; 547 | ``` 548 | 549 | [🔝](#-sumário) 550 | #### Métodos para Endereços 551 | 552 | ```pascal 553 | // Gera um logradouro aleatório (tipo + nome da rua). 554 | function GerarLogradouro: string; 555 | 556 | // Gera um número para endereço. 557 | function GerarNumero: string; 558 | 559 | // Gera um complemento de endereço (pode retornar vazio). 560 | function GerarComplemento: string; 561 | 562 | // Gera um nome de bairro. 563 | function GerarBairro: string; 564 | 565 | // Gera um nome de cidade. 566 | function GerarCidade: string; 567 | 568 | // Gera uma sigla de estado (UF). 569 | function GerarUF: string; 570 | 571 | // Gera um CEP. Se Formatado = True, retorna no formato XXXXX-XXX. 572 | function GerarCEP(Formatado: Boolean = True): string; 573 | ``` 574 | 575 | [🔝](#-sumário) 576 | #### Métodos para Valores e Datas 577 | 578 | ```pascal 579 | // Gera uma data aleatória entre DataInicial e DataFinal. 580 | function GerarData(DataInicial, DataFinal: TDateTime): TDateTime; 581 | 582 | // Gera um valor aleatório entre ValorMinimo e ValorMaximo. 583 | function GerarValor(ValorMinimo, ValorMaximo: Double): Double; 584 | 585 | // Gera um código de barras para boleto. 586 | function GerarCodigoBarrasBoleto(Banco: string = ''): string; 587 | 588 | // Gera uma linha digitável para boleto. 589 | function GerarLinhaDigitavelBoleto(Banco: string = ''): string; 590 | 591 | // Gera um código de rastreio para encomendas. 592 | function GerarCodigoRastreio: string; 593 | 594 | // Gera uma alíquota de imposto do tipo especificado. 595 | function GerarAliquotaImposto(TipoImposto: string = 'ICMS'): Double; 596 | 597 | // Gera um número de nota fiscal. 598 | function GerarNotaFiscal(UF: string = ''): string; 599 | ``` 600 | 601 | [🔝](#-sumário) 602 | #### Métodos para Dados de Saúde 603 | 604 | ```pascal 605 | // Gera um tipo sanguíneo (A+, A-, B+, B-, AB+, AB-, O+, O-). 606 | function GerarTipoSanguineo: string; 607 | 608 | // Gera uma altura em centímetros entre Min e Max. 609 | function GerarAltura(Min: Integer = 150; Max: Integer = 200): Integer; 610 | 611 | // Gera um peso em quilogramas entre Min e Max. 612 | function GerarPeso(Min: Integer = 50; Max: Integer = 120): Double; 613 | 614 | // Gera uma pressão arterial no formato "120/80 mmHg". 615 | function GerarPressaoArterial: string; 616 | 617 | // Gera um nome de medicamento comum. 618 | function GerarMedicamento: string; 619 | 620 | // Gera uma especialidade médica. 621 | function GerarEspecialidadeMedica: string; 622 | 623 | // Gera um nome de plano de saúde. 624 | function GerarPlanoSaude: string; 625 | ``` 626 | 627 | [🔝](#-sumário) 628 | #### Métodos para Dados Acadêmicos 629 | 630 | ```pascal 631 | // Gera um nome de instituição de ensino aleatório. 632 | function GerarNomeInstituicaoEnsino: string; 633 | 634 | // Gera um nome de curso de graduação aleatório. 635 | function GerarCursoGraduacao: string; 636 | 637 | // Gera uma área de formação acadêmica aleatória. 638 | function GerarAreaFormacao: string; 639 | 640 | // Gera um número de matrícula acadêmica no formato AAANNNNND (AA=ano, NNNNN=sequencial, D=dígito verificador). 641 | function GerarMatriculaAcademica: string; 642 | 643 | // Gera um coeficiente de rendimento (CR) entre 0 e 10 com distribuição mais realista. 644 | function GerarCoeficienteRendimento: Double; // 0 a 10 645 | 646 | // Gera uma data de formatura com base no ano de início do curso. 647 | function GerarDataFormatura(AnoInicio: Integer = 0): TDateTime; 648 | 649 | // Gera um título de monografia ou trabalho acadêmico. 650 | function GerarTituloMonografia: string; 651 | ``` 652 | 653 | [🔝](#-sumário) 654 | #### Métodos para Dados de Veículos 655 | 656 | ```pascal 657 | // Gera uma marca de veículo popular no Brasil. 658 | function GerarMarcaVeiculo: string; 659 | 660 | // Gera um modelo compatível com a marca especificada. Se a marca for vazia, escolhe aleatoriamente. 661 | function GerarModeloVeiculo(const Marca: string = ''): string; 662 | 663 | // Gera um ano de fabricação com distribuição realista (mais veículos novos). Limita a idade máxima. 664 | function GerarAnoVeiculo(IdadeMaxima: Integer = 20): Integer; 665 | 666 | // Gera um número de chassi no formato padrão de 17 caracteres. 667 | function GerarChassi: string; 668 | 669 | // Gera uma cor de veículo. 670 | function GerarCor: string; 671 | 672 | // Gera um tipo de combustível com distribuição baseada na frota brasileira. 673 | function GerarTipoCombustivel: string; 674 | 675 | // Gera uma quilometragem plausível baseada na idade do veículo. 676 | function GerarQuilometragem(AnoVeiculo: Integer): Integer; 677 | ``` 678 | 679 | [🔝](#-sumário) 680 | #### Métodos para Dados de Produtos e E-commerce 681 | 682 | ```pascal 683 | // Gera um nome de produto baseado na categoria informada. Se a categoria for vazia, escolhe aleatoriamente. 684 | function GerarNomeProduto(Categoria: string = ''): string; 685 | 686 | // Gera uma descrição detalhada para o produto. TamanhoDescricao controla a quantidade de parágrafos. 687 | function GerarDescricaoProduto(const NomeProduto: string; TamanhoDescricao: Integer = 2): string; 688 | 689 | // Gera uma categoria de produto aleatória (Eletrônicos, Moda, Alimentos, etc.). 690 | function GerarCategoriaProduto: string; 691 | 692 | // Gera um preço de produto com distribuição realista, preferencialmente terminando em ,90 ou ,99. 693 | function GerarPrecoProduto(ValorMinimo: Double = 10.0; ValorMaximo: Double = 2000.0): Double; 694 | 695 | // Gera um percentual de desconto comum no varejo (5%, 10%, 15%, 20%, etc.). 696 | function GerarDescontoProduto(DescontoMaximo: Integer = 50): Integer; 697 | 698 | // Gera um código interno de produto no formato XX-NNNNNN. 699 | function GerarCodigoProduto: string; 700 | 701 | // Gera um peso para o produto em gramas. 702 | function GerarPesoProduto(PesoMinimo: Integer = 100; PesoMaximo: Integer = 10000): Integer; 703 | 704 | // Gera dimensões para o produto no formato AxLxP (altura x largura x profundidade). 705 | function GerarDimensoesProduto: string; 706 | 707 | // Gera uma avaliação de produto (1 a 5 estrelas) com distribuição realista. 708 | function GerarAvaliacaoProduto: Integer; 709 | 710 | // Gera um comentário de produto. Se Positivo=True, retorna um comentário elogioso. 711 | function GerarComentarioProduto(Positivo: Boolean = True): string; 712 | 713 | // Gera uma quantidade de estoque para o produto. 714 | function GerarEstoqueProduto(EstoqueMinimo: Integer = 0; EstoqueMaximo: Integer = 500): Integer; 715 | 716 | // Gera um status de pedido (Em Processamento, Enviado, Entregue, Cancelado, etc.). 717 | function GerarStatusPedido: string; 718 | 719 | // Gera um status de pagamento (Pendente, Aprovado, Recusado, Estornado, etc.). 720 | function GerarStatusPagamento: string; 721 | 722 | // Gera um método de pagamento (Cartão de Crédito, Boleto, PIX, etc.). 723 | function GerarMetodoPagamento: string; 724 | 725 | // Gera um código de cupom de desconto promocional. 726 | function GerarCupomDesconto(Prefixo: string = ''): string; 727 | 728 | // Gera um número de pedido no formato comercial (AANNNNNN - ano + sequencial). 729 | function GerarNumeroPedido: string; 730 | 731 | // Gera um ID de transação usado em gateways de pagamento (formato alfanumérico). 732 | function GerarIDTransacao: string; 733 | ``` 734 | 735 | [🔝](#-sumário) 736 | #### Métodos Utilitários 737 | 738 | ```pascal 739 | // Remove todos os caracteres não-numéricos de uma string. 740 | function ApenasNumeros(const Str: string): string; 741 | 742 | // Calcula dígito verificador usando o algoritmo de módulo 11. 743 | function GerarDigitosModulo11(const Digits: string; Peso: Integer): string; 744 | 745 | // Calcula os dígitos verificadores do CPF. 746 | function GerarDigitosCPF(const Digits: string): string; 747 | 748 | // Calcula os dígitos verificadores do CNPJ. 749 | function GerarDigitosCNPJ(const Digits: string): string; 750 | ``` 751 | 752 | [🔝](#-sumário) 753 | ## 🤝 Contribuindo 754 | Contribuições são bem-vindas! Sinta-se à vontade para abrir issues ou enviar pull requests com melhorias, correções ou novas funcionalidades. 755 | 756 | Faça um fork deste repositório 757 | Crie uma branch para sua feature (git checkout -b feature/nova-funcionalidade) 758 | Faça commit das suas alterações (git commit -m 'Adiciona nova funcionalidade') 759 | Faça push para a branch (git push origin feature/nova-funcionalidade) 760 | Abra um Pull Request 761 | 762 | [🔝](#-sumário) 763 | ## 📄 Licença 764 | Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes. 765 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 766 | 767 | 768 | Desenvolvido para facilitar a criação de ambientes de teste e demonstração em sistemas de gestão empresarial. 769 | --------------------------------------------------------------------------------