├── 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 |
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 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | -
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | -
75 |
76 |
77 | -
78 |
79 |
80 | -
81 |
82 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/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 | [](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 |
--------------------------------------------------------------------------------