Nikolay Ponomarev commited on
Commit
24eb4d9
·
1 Parent(s): 2eb263c

Finance help

Browse files
.idea/.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
.idea/dbnavigator.xml ADDED
@@ -0,0 +1,425 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="DBNavigator.Project.DDLFileAttachmentManager">
4
+ <mappings />
5
+ <preferences />
6
+ </component>
7
+ <component name="DBNavigator.Project.DatabaseAssistantManager">
8
+ <assistants />
9
+ </component>
10
+ <component name="DBNavigator.Project.DatabaseFileManager">
11
+ <open-files />
12
+ </component>
13
+ <component name="DBNavigator.Project.Settings">
14
+ <connections />
15
+ <browser-settings>
16
+ <general>
17
+ <display-mode value="TABBED" />
18
+ <navigation-history-size value="100" />
19
+ <show-object-details value="false" />
20
+ <enable-sticky-paths value="true" />
21
+ </general>
22
+ <filters>
23
+ <object-type-filter>
24
+ <object-type name="SCHEMA" enabled="true" />
25
+ <object-type name="USER" enabled="true" />
26
+ <object-type name="ROLE" enabled="true" />
27
+ <object-type name="PRIVILEGE" enabled="true" />
28
+ <object-type name="CHARSET" enabled="true" />
29
+ <object-type name="TABLE" enabled="true" />
30
+ <object-type name="VIEW" enabled="true" />
31
+ <object-type name="MATERIALIZED_VIEW" enabled="true" />
32
+ <object-type name="NESTED_TABLE" enabled="true" />
33
+ <object-type name="COLUMN" enabled="true" />
34
+ <object-type name="INDEX" enabled="true" />
35
+ <object-type name="CONSTRAINT" enabled="true" />
36
+ <object-type name="DATASET_TRIGGER" enabled="true" />
37
+ <object-type name="DATABASE_TRIGGER" enabled="true" />
38
+ <object-type name="SYNONYM" enabled="true" />
39
+ <object-type name="SEQUENCE" enabled="true" />
40
+ <object-type name="PROCEDURE" enabled="true" />
41
+ <object-type name="FUNCTION" enabled="true" />
42
+ <object-type name="PACKAGE" enabled="true" />
43
+ <object-type name="TYPE" enabled="true" />
44
+ <object-type name="TYPE_ATTRIBUTE" enabled="true" />
45
+ <object-type name="ARGUMENT" enabled="true" />
46
+ <object-type name="JAVA_CLASS" enabled="true" />
47
+ <object-type name="JAVA_INNER_CLASS" enabled="true" />
48
+ <object-type name="JAVA_FIELD" enabled="true" />
49
+ <object-type name="JAVA_METHOD" enabled="true" />
50
+ <object-type name="DIMENSION" enabled="true" />
51
+ <object-type name="CLUSTER" enabled="true" />
52
+ <object-type name="DBLINK" enabled="true" />
53
+ <object-type name="CREDENTIAL" enabled="true" />
54
+ <object-type name="AI_PROFILE" enabled="true" />
55
+ </object-type-filter>
56
+ </filters>
57
+ <sorting>
58
+ <object-type name="COLUMN" sorting-type="NAME" />
59
+ <object-type name="FUNCTION" sorting-type="NAME" />
60
+ <object-type name="PROCEDURE" sorting-type="NAME" />
61
+ <object-type name="ARGUMENT" sorting-type="POSITION" />
62
+ <object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" />
63
+ </sorting>
64
+ <default-editors>
65
+ <object-type name="VIEW" editor-type="SELECTION" />
66
+ <object-type name="PACKAGE" editor-type="SELECTION" />
67
+ <object-type name="TYPE" editor-type="SELECTION" />
68
+ </default-editors>
69
+ </browser-settings>
70
+ <navigation-settings>
71
+ <lookup-filters>
72
+ <lookup-objects>
73
+ <object-type name="SCHEMA" enabled="true" />
74
+ <object-type name="USER" enabled="false" />
75
+ <object-type name="ROLE" enabled="false" />
76
+ <object-type name="PRIVILEGE" enabled="false" />
77
+ <object-type name="CHARSET" enabled="false" />
78
+ <object-type name="TABLE" enabled="true" />
79
+ <object-type name="VIEW" enabled="true" />
80
+ <object-type name="MATERIALIZED VIEW" enabled="true" />
81
+ <object-type name="INDEX" enabled="true" />
82
+ <object-type name="CONSTRAINT" enabled="true" />
83
+ <object-type name="DATASET TRIGGER" enabled="true" />
84
+ <object-type name="DATABASE TRIGGER" enabled="true" />
85
+ <object-type name="SYNONYM" enabled="false" />
86
+ <object-type name="SEQUENCE" enabled="true" />
87
+ <object-type name="PROCEDURE" enabled="true" />
88
+ <object-type name="FUNCTION" enabled="true" />
89
+ <object-type name="PACKAGE" enabled="true" />
90
+ <object-type name="TYPE" enabled="true" />
91
+ <object-type name="JAVA CLASS" enabled="true" />
92
+ <object-type name="INNER CLASS" enabled="true" />
93
+ <object-type name="JAVA FIELD" enabled="true" />
94
+ <object-type name="JAVA METHOD" enabled="true" />
95
+ <object-type name="JAVA PARAMETER" enabled="true" />
96
+ <object-type name="DIMENSION" enabled="false" />
97
+ <object-type name="CLUSTER" enabled="false" />
98
+ <object-type name="DBLINK" enabled="false" />
99
+ <object-type name="CREDENTIAL" enabled="false" />
100
+ </lookup-objects>
101
+ <force-database-load value="false" />
102
+ <prompt-connection-selection value="true" />
103
+ <prompt-schema-selection value="true" />
104
+ </lookup-filters>
105
+ </navigation-settings>
106
+ <dataset-grid-settings>
107
+ <general>
108
+ <enable-zooming value="true" />
109
+ <enable-column-tooltip value="true" />
110
+ </general>
111
+ <sorting>
112
+ <nulls-first value="true" />
113
+ <max-sorting-columns value="4" />
114
+ </sorting>
115
+ <audit-columns>
116
+ <column-names value="" />
117
+ <visible value="true" />
118
+ <editable value="false" />
119
+ </audit-columns>
120
+ </dataset-grid-settings>
121
+ <dataset-editor-settings>
122
+ <text-editor-popup>
123
+ <active value="false" />
124
+ <active-if-empty value="false" />
125
+ <data-length-threshold value="100" />
126
+ <popup-delay value="1000" />
127
+ </text-editor-popup>
128
+ <values-actions-popup>
129
+ <show-popup-button value="true" />
130
+ <element-count-threshold value="1000" />
131
+ <data-length-threshold value="250" />
132
+ </values-actions-popup>
133
+ <general>
134
+ <fetch-block-size value="100" />
135
+ <fetch-timeout value="30" />
136
+ <trim-whitespaces value="true" />
137
+ <convert-empty-strings-to-null value="true" />
138
+ <select-content-on-cell-edit value="true" />
139
+ <large-value-preview-active value="true" />
140
+ </general>
141
+ <filters>
142
+ <prompt-filter-dialog value="true" />
143
+ <default-filter-type value="BASIC" />
144
+ </filters>
145
+ <qualified-text-editor text-length-threshold="300">
146
+ <content-types>
147
+ <content-type name="Text" enabled="true" />
148
+ <content-type name="Properties" enabled="true" />
149
+ <content-type name="XML" enabled="true" />
150
+ <content-type name="DTD" enabled="true" />
151
+ <content-type name="HTML" enabled="true" />
152
+ <content-type name="XHTML" enabled="true" />
153
+ <content-type name="SQL" enabled="true" />
154
+ <content-type name="PL/SQL" enabled="true" />
155
+ <content-type name="JSON" enabled="true" />
156
+ <content-type name="JSON5" enabled="true" />
157
+ <content-type name="YAML" enabled="true" />
158
+ </content-types>
159
+ </qualified-text-editor>
160
+ <record-navigation>
161
+ <navigation-target value="VIEWER" />
162
+ </record-navigation>
163
+ </dataset-editor-settings>
164
+ <code-editor-settings>
165
+ <general>
166
+ <show-object-navigation-gutter value="false" />
167
+ <show-spec-declaration-navigation-gutter value="true" />
168
+ <enable-spellchecking value="true" />
169
+ <enable-reference-spellchecking value="false" />
170
+ </general>
171
+ <confirmations>
172
+ <save-changes value="false" />
173
+ <revert-changes value="true" />
174
+ <exit-on-changes value="ASK" />
175
+ </confirmations>
176
+ </code-editor-settings>
177
+ <code-completion-settings>
178
+ <filters>
179
+ <basic-filter>
180
+ <filter-element type="RESERVED_WORD" id="keyword" selected="true" />
181
+ <filter-element type="RESERVED_WORD" id="function" selected="true" />
182
+ <filter-element type="RESERVED_WORD" id="parameter" selected="true" />
183
+ <filter-element type="RESERVED_WORD" id="datatype" selected="true" />
184
+ <filter-element type="RESERVED_WORD" id="exception" selected="true" />
185
+ <filter-element type="OBJECT" id="schema" selected="true" />
186
+ <filter-element type="OBJECT" id="role" selected="true" />
187
+ <filter-element type="OBJECT" id="user" selected="true" />
188
+ <filter-element type="OBJECT" id="privilege" selected="true" />
189
+ <user-schema>
190
+ <filter-element type="OBJECT" id="table" selected="true" />
191
+ <filter-element type="OBJECT" id="view" selected="true" />
192
+ <filter-element type="OBJECT" id="materialized view" selected="true" />
193
+ <filter-element type="OBJECT" id="index" selected="true" />
194
+ <filter-element type="OBJECT" id="constraint" selected="true" />
195
+ <filter-element type="OBJECT" id="trigger" selected="true" />
196
+ <filter-element type="OBJECT" id="synonym" selected="false" />
197
+ <filter-element type="OBJECT" id="sequence" selected="true" />
198
+ <filter-element type="OBJECT" id="procedure" selected="true" />
199
+ <filter-element type="OBJECT" id="function" selected="true" />
200
+ <filter-element type="OBJECT" id="package" selected="true" />
201
+ <filter-element type="OBJECT" id="type" selected="true" />
202
+ <filter-element type="OBJECT" id="dimension" selected="true" />
203
+ <filter-element type="OBJECT" id="cluster" selected="true" />
204
+ <filter-element type="OBJECT" id="dblink" selected="true" />
205
+ </user-schema>
206
+ <public-schema>
207
+ <filter-element type="OBJECT" id="table" selected="false" />
208
+ <filter-element type="OBJECT" id="view" selected="false" />
209
+ <filter-element type="OBJECT" id="materialized view" selected="false" />
210
+ <filter-element type="OBJECT" id="index" selected="false" />
211
+ <filter-element type="OBJECT" id="constraint" selected="false" />
212
+ <filter-element type="OBJECT" id="trigger" selected="false" />
213
+ <filter-element type="OBJECT" id="synonym" selected="false" />
214
+ <filter-element type="OBJECT" id="sequence" selected="false" />
215
+ <filter-element type="OBJECT" id="procedure" selected="false" />
216
+ <filter-element type="OBJECT" id="function" selected="false" />
217
+ <filter-element type="OBJECT" id="package" selected="false" />
218
+ <filter-element type="OBJECT" id="type" selected="false" />
219
+ <filter-element type="OBJECT" id="dimension" selected="false" />
220
+ <filter-element type="OBJECT" id="cluster" selected="false" />
221
+ <filter-element type="OBJECT" id="dblink" selected="false" />
222
+ </public-schema>
223
+ <any-schema>
224
+ <filter-element type="OBJECT" id="table" selected="true" />
225
+ <filter-element type="OBJECT" id="view" selected="true" />
226
+ <filter-element type="OBJECT" id="materialized view" selected="true" />
227
+ <filter-element type="OBJECT" id="index" selected="true" />
228
+ <filter-element type="OBJECT" id="constraint" selected="true" />
229
+ <filter-element type="OBJECT" id="trigger" selected="true" />
230
+ <filter-element type="OBJECT" id="synonym" selected="true" />
231
+ <filter-element type="OBJECT" id="sequence" selected="true" />
232
+ <filter-element type="OBJECT" id="procedure" selected="true" />
233
+ <filter-element type="OBJECT" id="function" selected="true" />
234
+ <filter-element type="OBJECT" id="package" selected="true" />
235
+ <filter-element type="OBJECT" id="type" selected="true" />
236
+ <filter-element type="OBJECT" id="dimension" selected="true" />
237
+ <filter-element type="OBJECT" id="cluster" selected="true" />
238
+ <filter-element type="OBJECT" id="dblink" selected="true" />
239
+ </any-schema>
240
+ </basic-filter>
241
+ <extended-filter>
242
+ <filter-element type="RESERVED_WORD" id="keyword" selected="true" />
243
+ <filter-element type="RESERVED_WORD" id="function" selected="true" />
244
+ <filter-element type="RESERVED_WORD" id="parameter" selected="true" />
245
+ <filter-element type="RESERVED_WORD" id="datatype" selected="true" />
246
+ <filter-element type="RESERVED_WORD" id="exception" selected="true" />
247
+ <filter-element type="OBJECT" id="schema" selected="true" />
248
+ <filter-element type="OBJECT" id="user" selected="true" />
249
+ <filter-element type="OBJECT" id="role" selected="true" />
250
+ <filter-element type="OBJECT" id="privilege" selected="true" />
251
+ <user-schema>
252
+ <filter-element type="OBJECT" id="table" selected="true" />
253
+ <filter-element type="OBJECT" id="view" selected="true" />
254
+ <filter-element type="OBJECT" id="materialized view" selected="true" />
255
+ <filter-element type="OBJECT" id="index" selected="true" />
256
+ <filter-element type="OBJECT" id="constraint" selected="true" />
257
+ <filter-element type="OBJECT" id="trigger" selected="true" />
258
+ <filter-element type="OBJECT" id="synonym" selected="true" />
259
+ <filter-element type="OBJECT" id="sequence" selected="true" />
260
+ <filter-element type="OBJECT" id="procedure" selected="true" />
261
+ <filter-element type="OBJECT" id="function" selected="true" />
262
+ <filter-element type="OBJECT" id="package" selected="true" />
263
+ <filter-element type="OBJECT" id="type" selected="true" />
264
+ <filter-element type="OBJECT" id="dimension" selected="true" />
265
+ <filter-element type="OBJECT" id="cluster" selected="true" />
266
+ <filter-element type="OBJECT" id="dblink" selected="true" />
267
+ </user-schema>
268
+ <public-schema>
269
+ <filter-element type="OBJECT" id="table" selected="true" />
270
+ <filter-element type="OBJECT" id="view" selected="true" />
271
+ <filter-element type="OBJECT" id="materialized view" selected="true" />
272
+ <filter-element type="OBJECT" id="index" selected="true" />
273
+ <filter-element type="OBJECT" id="constraint" selected="true" />
274
+ <filter-element type="OBJECT" id="trigger" selected="true" />
275
+ <filter-element type="OBJECT" id="synonym" selected="true" />
276
+ <filter-element type="OBJECT" id="sequence" selected="true" />
277
+ <filter-element type="OBJECT" id="procedure" selected="true" />
278
+ <filter-element type="OBJECT" id="function" selected="true" />
279
+ <filter-element type="OBJECT" id="package" selected="true" />
280
+ <filter-element type="OBJECT" id="type" selected="true" />
281
+ <filter-element type="OBJECT" id="dimension" selected="true" />
282
+ <filter-element type="OBJECT" id="cluster" selected="true" />
283
+ <filter-element type="OBJECT" id="dblink" selected="true" />
284
+ </public-schema>
285
+ <any-schema>
286
+ <filter-element type="OBJECT" id="table" selected="true" />
287
+ <filter-element type="OBJECT" id="view" selected="true" />
288
+ <filter-element type="OBJECT" id="materialized view" selected="true" />
289
+ <filter-element type="OBJECT" id="index" selected="true" />
290
+ <filter-element type="OBJECT" id="constraint" selected="true" />
291
+ <filter-element type="OBJECT" id="trigger" selected="true" />
292
+ <filter-element type="OBJECT" id="synonym" selected="true" />
293
+ <filter-element type="OBJECT" id="sequence" selected="true" />
294
+ <filter-element type="OBJECT" id="procedure" selected="true" />
295
+ <filter-element type="OBJECT" id="function" selected="true" />
296
+ <filter-element type="OBJECT" id="package" selected="true" />
297
+ <filter-element type="OBJECT" id="type" selected="true" />
298
+ <filter-element type="OBJECT" id="dimension" selected="true" />
299
+ <filter-element type="OBJECT" id="cluster" selected="true" />
300
+ <filter-element type="OBJECT" id="dblink" selected="true" />
301
+ </any-schema>
302
+ </extended-filter>
303
+ </filters>
304
+ <sorting enabled="true">
305
+ <sorting-element type="RESERVED_WORD" id="keyword" />
306
+ <sorting-element type="RESERVED_WORD" id="datatype" />
307
+ <sorting-element type="OBJECT" id="column" />
308
+ <sorting-element type="OBJECT" id="table" />
309
+ <sorting-element type="OBJECT" id="view" />
310
+ <sorting-element type="OBJECT" id="materialized view" />
311
+ <sorting-element type="OBJECT" id="index" />
312
+ <sorting-element type="OBJECT" id="constraint" />
313
+ <sorting-element type="OBJECT" id="trigger" />
314
+ <sorting-element type="OBJECT" id="synonym" />
315
+ <sorting-element type="OBJECT" id="sequence" />
316
+ <sorting-element type="OBJECT" id="procedure" />
317
+ <sorting-element type="OBJECT" id="function" />
318
+ <sorting-element type="OBJECT" id="package" />
319
+ <sorting-element type="OBJECT" id="type" />
320
+ <sorting-element type="OBJECT" id="dimension" />
321
+ <sorting-element type="OBJECT" id="cluster" />
322
+ <sorting-element type="OBJECT" id="dblink" />
323
+ <sorting-element type="OBJECT" id="schema" />
324
+ <sorting-element type="OBJECT" id="role" />
325
+ <sorting-element type="OBJECT" id="user" />
326
+ <sorting-element type="RESERVED_WORD" id="function" />
327
+ <sorting-element type="RESERVED_WORD" id="parameter" />
328
+ </sorting>
329
+ <format>
330
+ <enforce-code-style-case value="true" />
331
+ </format>
332
+ </code-completion-settings>
333
+ <execution-engine-settings>
334
+ <statement-execution>
335
+ <fetch-block-size value="100" />
336
+ <execution-timeout value="20" />
337
+ <debug-execution-timeout value="600" />
338
+ <focus-result value="false" />
339
+ <prompt-execution value="false" />
340
+ </statement-execution>
341
+ <script-execution>
342
+ <command-line-interfaces />
343
+ <execution-timeout value="300" />
344
+ </script-execution>
345
+ <method-execution>
346
+ <execution-timeout value="30" />
347
+ <debug-execution-timeout value="600" />
348
+ <parameter-history-size value="10" />
349
+ </method-execution>
350
+ </execution-engine-settings>
351
+ <operation-settings>
352
+ <transactions>
353
+ <uncommitted-changes>
354
+ <on-project-close value="ASK" />
355
+ <on-disconnect value="ASK" />
356
+ <on-autocommit-toggle value="ASK" />
357
+ </uncommitted-changes>
358
+ <multiple-uncommitted-changes>
359
+ <on-commit value="ASK" />
360
+ <on-rollback value="ASK" />
361
+ </multiple-uncommitted-changes>
362
+ </transactions>
363
+ <session-browser>
364
+ <disconnect-session value="ASK" />
365
+ <kill-session value="ASK" />
366
+ <reload-on-filter-change value="false" />
367
+ </session-browser>
368
+ <compiler>
369
+ <compile-type value="KEEP" />
370
+ <compile-dependencies value="ASK" />
371
+ <always-show-controls value="false" />
372
+ </compiler>
373
+ </operation-settings>
374
+ <ddl-file-settings>
375
+ <extensions>
376
+ <mapping file-type-id="VIEW" extensions="vw" />
377
+ <mapping file-type-id="TRIGGER" extensions="trg" />
378
+ <mapping file-type-id="PROCEDURE" extensions="prc" />
379
+ <mapping file-type-id="FUNCTION" extensions="fnc" />
380
+ <mapping file-type-id="PACKAGE" extensions="pkg" />
381
+ <mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
382
+ <mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
383
+ <mapping file-type-id="TYPE" extensions="tpe" />
384
+ <mapping file-type-id="TYPE_SPEC" extensions="tps" />
385
+ <mapping file-type-id="TYPE_BODY" extensions="tpb" />
386
+ <mapping file-type-id="JAVA_SOURCE" extensions="sql" />
387
+ </extensions>
388
+ <general>
389
+ <lookup-ddl-files value="true" />
390
+ <create-ddl-files value="false" />
391
+ <synchronize-ddl-files value="true" />
392
+ <use-qualified-names value="false" />
393
+ <make-scripts-rerunnable value="true" />
394
+ </general>
395
+ </ddl-file-settings>
396
+ <assistant-settings>
397
+ <credential-settings>
398
+ <credentials />
399
+ </credential-settings>
400
+ </assistant-settings>
401
+ <general-settings>
402
+ <regional-settings>
403
+ <date-format value="MEDIUM" />
404
+ <number-format value="UNGROUPED" />
405
+ <locale value="SYSTEM_DEFAULT" />
406
+ <use-custom-formats value="false" />
407
+ </regional-settings>
408
+ <environment>
409
+ <environment-types>
410
+ <environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
411
+ <environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
412
+ <environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
413
+ <environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
414
+ </environment-types>
415
+ <visibility-settings>
416
+ <connection-tabs value="true" />
417
+ <dialog-headers value="true" />
418
+ <object-editor-tabs value="true" />
419
+ <script-editor-tabs value="false" />
420
+ <execution-result-tabs value="true" />
421
+ </visibility-settings>
422
+ </environment>
423
+ </general-settings>
424
+ </component>
425
+ </project>
.idea/finance_help.iml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
6
+ <orderEntry type="sourceFolder" forTests="false" />
7
+ </component>
8
+ </module>
.idea/inspectionProfiles/Project_Default.xml ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
5
+ <option name="ignoredPackages">
6
+ <value>
7
+ <list size="1">
8
+ <item index="0" class="java.lang.String" itemvalue="aiogram" />
9
+ </list>
10
+ </value>
11
+ </option>
12
+ </inspection_tool>
13
+ </profile>
14
+ </component>
.idea/inspectionProfiles/profiles_settings.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
.idea/misc.xml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="Python 3.11" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
7
+ </project>
.idea/modules.xml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/finance_help.iml" filepath="$PROJECT_DIR$/.idea/finance_help.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
Dockerfile ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM ubuntu:22.04
2
+
3
+ ENV DEBIAN_FRONTEND=noninteractive
4
+ RUN apt-get update && apt-get install -y \
5
+ curl ca-certificates python3 python3-pip bash && \
6
+ rm -rf /var/lib/apt/lists/*
7
+
8
+ # Install Ollama
9
+ RUN curl -fsSL https://ollama.com/install.sh | sh
10
+
11
+ WORKDIR /app
12
+ COPY requirements.txt /app/requirements.txt
13
+ RUN pip3 install --no-cache-dir -r /app/requirements.txt
14
+
15
+ COPY app.py /app/app.py
16
+ COPY start.sh /app/start.sh
17
+ RUN chmod +x /app/start.sh
18
+
19
+ # Ollama listens on localhost by default; set host explicitly
20
+ ENV OLLAMA_HOST=0.0.0.0:11434
21
+
22
+ # For Gradio on Spaces
23
+ ENV GRADIO_SERVER_NAME=0.0.0.0
24
+ ENV GRADIO_SERVER_PORT=7860
25
+
26
+ CMD ["/app/start.sh"]
app.py ADDED
@@ -0,0 +1,264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import re
3
+ import html as ihtml
4
+ import textwrap
5
+ import requests
6
+ import gradio as gr
7
+ import litellm
8
+ from smolagents import CodeAgent, LiteLLMModel, tool
9
+
10
+
11
+ MODEL_NAME = os.getenv(
12
+ "MODEL_NAME",
13
+ "danielsheep/Qwen3-Coder-30B-A3B-Instruct-1M-Unsloth:UD-IQ3_XXS",
14
+ )
15
+ OLLAMA_BASE = os.getenv("OLLAMA_URL", "http://127.0.0.1:11434")
16
+
17
+
18
+ def make_model():
19
+ return LiteLLMModel(
20
+ model_id=f"ollama_chat/{MODEL_NAME}",
21
+ api_base=OLLAMA_BASE,
22
+ num_ctx=16384,
23
+ temperature=0.2,
24
+ max_tokens=4096,
25
+ )
26
+
27
+
28
+ def _strip_html(raw_html: str) -> str:
29
+ """Грубое преобразование HTML -> текст, чтобы агенты не тащили сырой HTML в ответ."""
30
+ raw_html = ihtml.unescape(raw_html)
31
+ raw_html = re.sub(r"(?is)<(script|style).*?>.*?</\1>", " ", raw_html)
32
+ raw_html = re.sub(r"(?is)<br\s*/?>", "\n", raw_html)
33
+ raw_html = re.sub(r"(?is)</p\s*>", "\n", raw_html)
34
+ raw_html = re.sub(r"(?is)<.*?>", " ", raw_html)
35
+ raw_html = re.sub(r"[ \t]+", " ", raw_html)
36
+ raw_html = re.sub(r"\n{3,}", "\n\n", raw_html)
37
+ return raw_html.strip()
38
+
39
+
40
+ @tool
41
+ def web_search(query: str) -> str:
42
+ """Ищет краткую информацию в интернете по текстовому запросу (через DuckDuckGo HTML).
43
+ Args:
44
+ query: Текстовый поисковый запрос.
45
+ """
46
+ resp = requests.get(
47
+ "https://duckduckgo.com/html/",
48
+ params={"q": query},
49
+ timeout=10,
50
+ headers={"User-Agent": "financial-aid-navigator-demo"},
51
+ )
52
+ resp.raise_for_status()
53
+ text = _strip_html(resp.text)
54
+ return text[:4500]
55
+
56
+
57
+ def run_fin_aid_multi_agent(case_description: str, region: str, urgency: str, allow_internet: bool):
58
+ model = make_model()
59
+ tools = [web_search] if allow_internet else []
60
+
61
+ if allow_internet:
62
+ web_hint_triage = """
63
+ В сгенерированном коде НЕ используй import requests и другие сетевые библиотеки.
64
+ Для доступа в интернет у тебя есть ТОЛЬКО инструмент web_search(query: str).
65
+ ОБЯЗАТЕЛЬНО: минимум 2 раза вызвать web_search:
66
+ 1) по запросу вида "emergency financial assistance <регион>" или "rent assistance <регион>";
67
+ 2) по запросу вида "how to avoid financial aid scams" или "debt relief scams warning".
68
+ Не вставляй сырой HTML — только извлечённые выводы.
69
+ """
70
+ web_hint_actions = """
71
+ В сгенерированном коде НЕ используй import requests.
72
+ Интернет — только через web_search(query: str).
73
+ Используй результаты поиска, чтобы дополнить список вариантов помощи (гос/НКО/долги/жильё/коммунальные),
74
+ и добавь предупреждения о мошенничестве.
75
+ """
76
+ web_hint_writer = """
77
+ В сгенерированном коде НЕ используй import requests.
78
+ Интернет — только через web_search(query: str).
79
+ Можно уточнить формулировки и типовые источники помощи, но не вставляй сырой HTML.
80
+ """
81
+ else:
82
+ web_hint_common = """
83
+ Интернет недоступен, инструмент web_search отсутствует.
84
+ Не пытайся импортировать requests или вызывать web_search.
85
+ Опирайся только на свои знания и общие принципы.
86
+ """
87
+ web_hint_triage = web_hint_common
88
+ web_hint_actions = web_hint_common
89
+ web_hint_writer = web_hint_common
90
+
91
+ # Агент 1: Триаж / разбор ситуации
92
+ triage = CodeAgent(
93
+ tools=tools,
94
+ model=model,
95
+ add_base_tools=False,
96
+ max_steps=6,
97
+ )
98
+ triage_prompt = f"""
99
+ Ты агент Triage.
100
+ Всегда отвечай на РУССКОМ языке.
101
+ {web_hint_triage}
102
+
103
+ Цель: быстро разобрать ситуацию человека и определить приоритеты.
104
+ Важные правила:
105
+ - НЕ проси и НЕ предлагай вводить чувствительные данные: номера карт, CVV, пароли, коды из SMS, полные паспорта/ID.
106
+ - Можно предлагать безопасные категории данных (диапазоны сумм, тип дохода, примерные расходы, статус аренды).
107
+ - Никаких индивидуальных инвестсоветов. Фокус: кризисная поддержка, бюджет, варианты помощи.
108
+
109
+ Сформируй внутренний результат со структурой:
110
+ - Краткое резюме ситуации (2–4 предложения)
111
+ - Допущения (список)
112
+ - Приоритеты по срочности (список: "сегодня", "на неделе", "в течение месяца")
113
+ - Риски (список: выселение/отключения/штрафы/коллекторы/мошенники/псих.перегрузка)
114
+ - Какие данные подготовить (безопасный список)
115
+ - Вопросы для уточнения (до 8 вопросов)
116
+
117
+ Срочность: {urgency}
118
+ Регион: {region}
119
+ Описание ситуации:
120
+ {case_description}
121
+ """
122
+ triage_result = triage.run(textwrap.dedent(triage_prompt))
123
+
124
+ # Агент 2: Генератор действий и вариантов помощи (структура данных)
125
+ actions_agent = CodeAgent(
126
+ tools=tools,
127
+ model=model,
128
+ add_base_tools=False,
129
+ max_steps=7,
130
+ )
131
+ actions_prompt = f"""
132
+ Ты агент Actions.
133
+ Всегда отвечай на РУССКОМ языке.
134
+ {web_hint_actions}
135
+
136
+ На основе результата Triage сформируй ПИТОНОВСКИЙ СПИСОК словарей actions (и больше ничего).
137
+ Каждый элемент — словарь с полями:
138
+ - "bucket": "urgent" | "short_term" | "mid_term"
139
+ - "title": краткий заголовок
140
+ - "steps": список шагов (3–8 пунктов)
141
+ - "expected_outcome": 1 строка
142
+ - "documents": список (что подготовить)
143
+ - "warnings": список (риски/мошенники/ошибки)
144
+
145
+ Дополнительно: создай список resources (тоже питоновский список словарей), где каждый словарь:
146
+ - "type": "government" | "ngo" | "debt_counseling" | "housing" | "utilities" | "other"
147
+ - "name": название/категория
148
+ - "what_it_helps_with": 1 строка
149
+ - "how_to_start": 1 строка (что сделать первым)
150
+ - "notes": 1 строка
151
+
152
+ ВАЖНО:
153
+ - Если интернет доступен, используй web_search результаты, но НЕ вставляй HTML.
154
+ - Если конкретных названий по региону нет, давай понятные категории ("муниципальная помощь с арендой", "служба соцзащиты", "некоммерческие фонды").
155
+
156
+ Вход (Triage):
157
+ {triage_result}
158
+ """
159
+ actions_struct = actions_agent.run(textwrap.dedent(actions_prompt))
160
+
161
+ # Агент 3: Писатель — финальный Markdown отчёт (через python-код с переменной report)
162
+ writer = CodeAgent(
163
+ tools=tools,
164
+ model=model,
165
+ add_base_tools=False,
166
+ max_steps=4,
167
+ )
168
+ writer_prompt = f"""
169
+ Ты агент Writer.
170
+ Всегда отвечай на РУССКОМ языке.
171
+ {web_hint_writer}
172
+
173
+ Твоя задача — СФОРМИРОВАТЬ ГОТОВЫЙ ОТЧЁТ ДЛЯ ЧЕЛОВЕКА в формате Markdown.
174
+ КРИТИЧЕСКИ ВАЖНО: это ФИНАЛЬНЫЙ шаг. Ты должен сгенерировать Python-код,
175
+ который создаёт переменную report (многострочная строка Markdown) и возвращает её
176
+ как последнее выражение (без print, без return).
177
+
178
+ Формат кода:
179
+ report = \"\"\"
180
+ ...markdown...
181
+ \"\"\"
182
+ report
183
+
184
+ Структура отчёта:
185
+ # План финансовой помощи
186
+ ## Важно
187
+ - (дисклеймер: не юр/фин совет; при угрозе выселения/насилия/суицида — обращаться в местные службы)
188
+ - (не сообщать коды, CVV, пароли; осторожно со "моментальными списаниями" и предоплатами)
189
+ ## Сводка ситуации
190
+ ## Приоритеты
191
+ ### Сегодня (24–72 часа)
192
+ ### На неделе
193
+ ### В течение месяца
194
+ ## Варианты помощи в регионе
195
+ - список пунктов на основе resources
196
+ ## Пошаговый план
197
+ - сгруппируй по urgent/short_term/mid_term
198
+ ## Мини-бюджет на 30 дней
199
+ - как быстро стабилизировать: урезание расходов, переговоры, отсрочки/рассрочки (общие принципы)
200
+ ## Анти-мошенничество
201
+ - признаки скама и что проверять
202
+ ## Что подготовить
203
+ ## Вопросы для уточнения
204
+
205
+ Важные требования:
206
+ - Используй информацию из Triage и структуру actions/resources.
207
+ - НЕ включай Python-структуры (dict/list) в Markdown — только читабельный текст.
208
+ - НЕ запрашивай и НЕ перечисляй чувствительные данные (номера карт, CVV, пароли, SMS-коды).
209
+ - Не используй web_search после того, как report сформирован.
210
+
211
+ Вход (Triage):
212
+ {triage_result}
213
+
214
+ Вход (Actions структуры):
215
+ {actions_struct}
216
+ """
217
+ result = writer.run(textwrap.dedent(writer_prompt))
218
+ final_markdown = str(result).strip() if result is not None else ""
219
+ return final_markdown
220
+
221
+
222
+ with gr.Blocks(title="Financial Aid Navigator (Multi-agent)") as demo:
223
+ gr.Markdown("# Financial Aid Navigator (Multi-agent, Ollama + Qwen)")
224
+ gr.Markdown(f"- Model: `{MODEL_NAME}`\n- Ollama: `{OLLAMA_BASE}`")
225
+
226
+ region = gr.Textbox(
227
+ label="Регион",
228
+ placeholder="Например: Нидерланды, Амстердам / Казахстан, Алматы / Польша, Варшава",
229
+ lines=1,
230
+ )
231
+ urgency = gr.Dropdown(
232
+ ["срочно (24–72 часа)", "в течение недели", "не срочно (в течение месяца)"],
233
+ value="в течение недели",
234
+ label="Срочность",
235
+ )
236
+ case_description = gr.Textbox(
237
+ label="Описание ситуации",
238
+ lines=9,
239
+ placeholder=(
240
+ "Опишите кратко: что случилось, есть ли долги/просрочки, аренда/ипотека, "
241
+ "примерный уровень доходов/расходов (можно диапазонами), что самое срочное."
242
+ ),
243
+ )
244
+ allow_internet = gr.Checkbox(
245
+ label="Разрешить агенту поиск в интернете (web_search)",
246
+ value=False,
247
+ )
248
+
249
+ run_btn = gr.Button("Сформировать план помощи")
250
+ output = gr.Markdown()
251
+
252
+ run_btn.click(
253
+ fn=run_fin_aid_multi_agent,
254
+ inputs=[case_description, region, urgency, allow_internet],
255
+ outputs=[output],
256
+ )
257
+
258
+
259
+ def main():
260
+ demo.launch()
261
+
262
+
263
+ if __name__ == "__main__":
264
+ main()
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ requests~=2.32.3
2
+ gradio>=4.0.0
3
+ smolagents[litellm]>=0.4.0
4
+ litellm>=1.0.0
start.sh ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ MODEL_NAME="${MODEL_NAME:-danielsheep/Qwen3-Coder-30B-A3B-Instruct-1M-Unsloth:UD-IQ3_XXS}"
5
+ OLLAMA_URL="${OLLAMA_URL:-http://127.0.0.1:11434}"
6
+
7
+ # Get the directory where the script is located
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ cd "$SCRIPT_DIR"
10
+
11
+ # Create virtual environment if it doesn't exist
12
+ if [ ! -d "venv" ]; then
13
+ echo "Creating virtual environment..."
14
+ python3 -m venv venv
15
+ fi
16
+
17
+ # Activate virtual environment
18
+ echo "Activating virtual environment..."
19
+ source venv/bin/activate
20
+
21
+ # Install requirements
22
+ echo "Installing requirements..."
23
+ pip install --upgrade pip
24
+ pip install -r requirements.txt
25
+
26
+ # Start Ollama server in background
27
+ ollama serve > /tmp/ollama.log 2>&1 &
28
+ OLLAMA_PID=$!
29
+
30
+ # Wait until Ollama is ready
31
+ python3 - << 'PY'
32
+ import time, urllib.request
33
+ url = "http://127.0.0.1:11434/api/tags"
34
+ for _ in range(120):
35
+ try:
36
+ urllib.request.urlopen(url, timeout=1).read()
37
+ print("Ollama is up")
38
+ raise SystemExit(0)
39
+ except Exception:
40
+ time.sleep(1)
41
+ raise SystemExit("Ollama did not start")
42
+ PY
43
+
44
+ # Pull model (first run will download it)
45
+ ollama pull "${MODEL_NAME}"
46
+
47
+ # Start Gradio app
48
+ exec python3 app.py