constec 0.1.0__py3-none-any.whl → 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
constec/db/__init__.py ADDED
@@ -0,0 +1,11 @@
1
+ """
2
+ constec.db - Django models for the Constec platform.
3
+
4
+ This package provides centralized model definitions shared between
5
+ constec-core-api and constancia-api.
6
+
7
+ Usage:
8
+ from constec.db.models import Company, User, Session
9
+ """
10
+
11
+ default_app_config = 'constec.db.apps.ConstecDbConfig'
constec/db/apps.py ADDED
@@ -0,0 +1,8 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class ConstecDbConfig(AppConfig):
5
+ default_auto_field = 'django.db.models.BigAutoField'
6
+ name = 'constec.db'
7
+ label = 'constec_db'
8
+ verbose_name = 'Constec Database Models'
@@ -0,0 +1,538 @@
1
+ # Generated by Django 6.0.1 on 2026-01-26 20:41
2
+
3
+ import django.db.models.deletion
4
+ import uuid
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ initial = True
11
+
12
+ dependencies = [
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name='ContactType',
18
+ fields=[
19
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
20
+ ('name', models.CharField(max_length=50)),
21
+ ('description', models.TextField(blank=True, null=True)),
22
+ ],
23
+ options={
24
+ 'db_table': 'core"."contact_types',
25
+ },
26
+ ),
27
+ migrations.CreateModel(
28
+ name='Entity',
29
+ fields=[
30
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
31
+ ('external_id', models.CharField(help_text='Entity ID in external ERP system (e.g., cli_Cod, pro_Cod)', max_length=255)),
32
+ ('cuit', models.CharField(blank=True, default='', help_text='CUIT without dashes (for authentication lookup)', max_length=13)),
33
+ ('metadata', models.JSONField(blank=True, default=dict)),
34
+ ],
35
+ options={
36
+ 'db_table': 'erp"."entities',
37
+ },
38
+ ),
39
+ migrations.CreateModel(
40
+ name='FlowTemplate',
41
+ fields=[
42
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
43
+ ('name', models.CharField(max_length=100)),
44
+ ('description', models.TextField()),
45
+ ('category', models.CharField(choices=[('finance', 'Finance & Accounting'), ('customer_service', 'Customer Service'), ('sales', 'Sales & CRM'), ('general', 'General Purpose'), ('custom', 'Custom')], max_length=50)),
46
+ ('graph_definition', models.JSONField(help_text='Graph structure in JSON format with nodes and edges')),
47
+ ('default_config', models.JSONField(default=dict, help_text='Default configuration for this template (LLM, tools, prompts)')),
48
+ ('is_global', models.BooleanField(default=False, help_text='If true, all organizations can use this template')),
49
+ ('is_active', models.BooleanField(default=True)),
50
+ ('version', models.CharField(default='1.0.0', max_length=20)),
51
+ ('created_at', models.DateTimeField(auto_now_add=True)),
52
+ ('updated_at', models.DateTimeField(auto_now=True)),
53
+ ],
54
+ options={
55
+ 'db_table': 'constancia"."flow_templates',
56
+ },
57
+ ),
58
+ migrations.CreateModel(
59
+ name='Module',
60
+ fields=[
61
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
62
+ ('name', models.CharField(max_length=100)),
63
+ ('slug', models.SlugField(max_length=100, null=True)),
64
+ ('description', models.TextField(blank=True, null=True)),
65
+ ('version', models.CharField(max_length=20)),
66
+ ('is_active', models.BooleanField(default=True)),
67
+ ],
68
+ options={
69
+ 'db_table': 'core"."modules',
70
+ },
71
+ ),
72
+ migrations.CreateModel(
73
+ name='Organization',
74
+ fields=[
75
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
76
+ ('name', models.CharField(max_length=255)),
77
+ ('slug', models.SlugField(max_length=100, unique=True)),
78
+ ('description', models.TextField(blank=True, null=True)),
79
+ ],
80
+ options={
81
+ 'db_table': 'core"."organizations',
82
+ },
83
+ ),
84
+ migrations.CreateModel(
85
+ name='Role',
86
+ fields=[
87
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
88
+ ('name', models.CharField(max_length=100)),
89
+ ('description', models.TextField(blank=True, null=True)),
90
+ ],
91
+ options={
92
+ 'db_table': 'erp"."roles',
93
+ },
94
+ ),
95
+ migrations.CreateModel(
96
+ name='System',
97
+ fields=[
98
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
99
+ ('name', models.CharField(max_length=100, unique=True)),
100
+ ('description', models.TextField(blank=True, null=True)),
101
+ ('api_endpoint', models.URLField(blank=True)),
102
+ ('metadata', models.JSONField(blank=True, default=dict)),
103
+ ('created_at', models.DateTimeField(auto_now_add=True, null=True)),
104
+ ('updated_at', models.DateTimeField(auto_now=True, null=True)),
105
+ ],
106
+ options={
107
+ 'db_table': 'erp"."systems',
108
+ },
109
+ ),
110
+ migrations.CreateModel(
111
+ name='Company',
112
+ fields=[
113
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
114
+ ('name', models.CharField(max_length=255)),
115
+ ('legal_name', models.CharField(max_length=255)),
116
+ ('slug', models.SlugField(max_length=100, unique=True)),
117
+ ('website', models.URLField(blank=True, null=True)),
118
+ ('parent_company', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='constec_db.company')),
119
+ ('organization', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='companies', to='constec_db.organization')),
120
+ ],
121
+ options={
122
+ 'db_table': 'core"."companies',
123
+ },
124
+ ),
125
+ migrations.CreateModel(
126
+ name='Contact',
127
+ fields=[
128
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
129
+ ('value', models.CharField(max_length=255)),
130
+ ('metadata', models.JSONField(blank=True, default=dict)),
131
+ ('type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='constec_db.contacttype')),
132
+ ],
133
+ options={
134
+ 'db_table': 'core"."contacts',
135
+ },
136
+ ),
137
+ migrations.CreateModel(
138
+ name='EntityAuth',
139
+ fields=[
140
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
141
+ ('password_hash', models.CharField(help_text='Bcrypt hashed password', max_length=255)),
142
+ ('is_active', models.BooleanField(default=True, help_text='Whether this account can authenticate')),
143
+ ('created_at', models.DateTimeField(auto_now_add=True)),
144
+ ('updated_at', models.DateTimeField(auto_now=True)),
145
+ ('last_login', models.DateTimeField(blank=True, help_text='Last successful login timestamp', null=True)),
146
+ ('entity', models.OneToOneField(help_text='The ERP entity these credentials belong to', on_delete=django.db.models.deletion.CASCADE, related_name='auth', to='constec_db.entity')),
147
+ ],
148
+ options={
149
+ 'verbose_name': 'Entity Authentication',
150
+ 'verbose_name_plural': 'Entity Authentications',
151
+ 'db_table': 'erp"."entity_auth',
152
+ },
153
+ ),
154
+ migrations.CreateModel(
155
+ name='Flow',
156
+ fields=[
157
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
158
+ ('name', models.CharField(max_length=100)),
159
+ ('description', models.TextField(blank=True, null=True)),
160
+ ('graph_definition', models.JSONField(blank=True, help_text='Custom graph structure (only if not using template)', null=True)),
161
+ ('config', models.JSONField(default=dict, help_text='Configuration that merges with template.default_config')),
162
+ ('is_active', models.BooleanField(default=True)),
163
+ ('is_default', models.BooleanField(default=False, help_text='Whether this is the default flow for the company')),
164
+ ('created_at', models.DateTimeField(auto_now_add=True)),
165
+ ('updated_at', models.DateTimeField(auto_now=True)),
166
+ ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='flows', to='constec_db.company')),
167
+ ('template', models.ForeignKey(blank=True, help_text="If set, uses template's graph. config overrides template defaults.", null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='flows', to='constec_db.flowtemplate')),
168
+ ],
169
+ options={
170
+ 'db_table': 'constancia"."flows',
171
+ },
172
+ ),
173
+ migrations.CreateModel(
174
+ name='CompanyModule',
175
+ fields=[
176
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
177
+ ('is_enabled', models.BooleanField(default=True)),
178
+ ('settings', models.JSONField(blank=True, default=dict)),
179
+ ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='company_modules', to='constec_db.company')),
180
+ ('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='company_modules', to='constec_db.module')),
181
+ ],
182
+ options={
183
+ 'db_table': 'core"."company_modules',
184
+ },
185
+ ),
186
+ migrations.AddField(
187
+ model_name='flowtemplate',
188
+ name='organization',
189
+ field=models.ForeignKey(blank=True, help_text='Organization that owns this template (null for global)', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='flow_templates', to='constec_db.organization'),
190
+ ),
191
+ migrations.CreateModel(
192
+ name='OrganizationRole',
193
+ fields=[
194
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
195
+ ('name', models.CharField(max_length=100)),
196
+ ('description', models.TextField(blank=True, null=True)),
197
+ ('permissions', models.JSONField(default=dict)),
198
+ ('is_system_role', models.BooleanField(default=False)),
199
+ ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='organization_roles', to='constec_db.organization')),
200
+ ],
201
+ options={
202
+ 'db_table': 'core"."organization_roles',
203
+ },
204
+ ),
205
+ migrations.CreateModel(
206
+ name='OrganizationUser',
207
+ fields=[
208
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
209
+ ('name', models.CharField(max_length=255)),
210
+ ('email', models.EmailField(max_length=254, unique=True)),
211
+ ('password_hash', models.CharField(max_length=255)),
212
+ ('organization', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='users', to='constec_db.organization')),
213
+ ('role', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='constec_db.organizationrole')),
214
+ ],
215
+ options={
216
+ 'db_table': 'core"."organization_users',
217
+ },
218
+ ),
219
+ migrations.AddField(
220
+ model_name='flowtemplate',
221
+ name='created_by',
222
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_templates', to='constec_db.organizationuser'),
223
+ ),
224
+ migrations.CreateModel(
225
+ name='Person',
226
+ fields=[
227
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
228
+ ('first_name', models.CharField(max_length=100)),
229
+ ('last_name', models.CharField(max_length=100)),
230
+ ('full_name', models.CharField(max_length=255)),
231
+ ('metadata', models.JSONField(blank=True, default=dict)),
232
+ ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='persons', to='constec_db.company')),
233
+ ],
234
+ options={
235
+ 'db_table': 'core"."persons',
236
+ },
237
+ ),
238
+ migrations.AddField(
239
+ model_name='entity',
240
+ name='person',
241
+ field=models.ForeignKey(blank=True, help_text='Optional link to Core person', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='erp_entities', to='constec_db.person'),
242
+ ),
243
+ migrations.CreateModel(
244
+ name='PersonContact',
245
+ fields=[
246
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
247
+ ('is_primary', models.BooleanField(default=False)),
248
+ ('contact', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_contacts', to='constec_db.contact')),
249
+ ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_contacts', to='constec_db.person')),
250
+ ],
251
+ options={
252
+ 'db_table': 'core"."person_contacts',
253
+ },
254
+ ),
255
+ migrations.CreateModel(
256
+ name='PersonTag',
257
+ fields=[
258
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
259
+ ('name', models.CharField(max_length=50)),
260
+ ('color', models.CharField(blank=True, max_length=7, null=True)),
261
+ ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_tags', to='constec_db.company')),
262
+ ],
263
+ options={
264
+ 'db_table': 'core"."person_tags',
265
+ },
266
+ ),
267
+ migrations.CreateModel(
268
+ name='PersonTagged',
269
+ fields=[
270
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
271
+ ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tagged_items', to='constec_db.person')),
272
+ ('tag', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tagged_persons', to='constec_db.persontag')),
273
+ ],
274
+ options={
275
+ 'db_table': 'core"."person_tagged',
276
+ },
277
+ ),
278
+ migrations.AddField(
279
+ model_name='entity',
280
+ name='role',
281
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='entities', to='constec_db.role'),
282
+ ),
283
+ migrations.CreateModel(
284
+ name='Session',
285
+ fields=[
286
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
287
+ ('metadata', models.JSONField(default=dict, help_text='Session context (connection, role, etc.)')),
288
+ ('is_active', models.BooleanField(default=True)),
289
+ ('ended_at', models.DateTimeField(blank=True, null=True)),
290
+ ('created_at', models.DateTimeField(auto_now_add=True)),
291
+ ('updated_at', models.DateTimeField(auto_now=True)),
292
+ ('company', models.ForeignKey(help_text='The company this session belongs to', on_delete=django.db.models.deletion.CASCADE, related_name='sessions', to='constec_db.company')),
293
+ ('flow', models.ForeignKey(help_text='AI flow configuration to use', on_delete=django.db.models.deletion.PROTECT, related_name='sessions', to='constec_db.flow')),
294
+ ('user', models.ForeignKey(help_text='The person chatting (can be employee or client)', on_delete=django.db.models.deletion.CASCADE, related_name='sessions', to='constec_db.person')),
295
+ ],
296
+ options={
297
+ 'db_table': 'constancia"."sessions',
298
+ },
299
+ ),
300
+ migrations.CreateModel(
301
+ name='Message',
302
+ fields=[
303
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
304
+ ('role', models.CharField(choices=[('user', 'User'), ('assistant', 'Assistant')], max_length=20)),
305
+ ('content', models.TextField()),
306
+ ('metadata', models.JSONField(blank=True, default=dict, help_text='Additional message data: tool calls, errors, context, etc.')),
307
+ ('created_at', models.DateTimeField(auto_now_add=True)),
308
+ ('session', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='constec_db.session')),
309
+ ],
310
+ options={
311
+ 'db_table': 'constancia"."messages',
312
+ 'ordering': ['created_at'],
313
+ },
314
+ ),
315
+ migrations.AddField(
316
+ model_name='role',
317
+ name='system',
318
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='roles', to='constec_db.system'),
319
+ ),
320
+ migrations.AddField(
321
+ model_name='entity',
322
+ name='system',
323
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='entities', to='constec_db.system'),
324
+ ),
325
+ migrations.CreateModel(
326
+ name='Connection',
327
+ fields=[
328
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
329
+ ('name', models.CharField(blank=True, default='', help_text='Descriptive name for this connection', max_length=100)),
330
+ ('slug', models.CharField(max_length=50)),
331
+ ('db_type', models.CharField(choices=[('mssql', 'SQL Server'), ('postgresql', 'PostgreSQL'), ('mysql', 'MySQL')], default='mssql', max_length=20)),
332
+ ('host', models.CharField(max_length=255)),
333
+ ('port', models.IntegerField()),
334
+ ('database', models.CharField(max_length=100)),
335
+ ('username', models.CharField(max_length=100)),
336
+ ('encrypted_password', models.TextField()),
337
+ ('is_active', models.BooleanField(default=True)),
338
+ ('last_tested_at', models.DateTimeField(blank=True, null=True)),
339
+ ('created_at', models.DateTimeField(auto_now_add=True)),
340
+ ('updated_at', models.DateTimeField(auto_now=True)),
341
+ ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='erp_connections', to='constec_db.company')),
342
+ ('system', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='connections', to='constec_db.system')),
343
+ ],
344
+ options={
345
+ 'db_table': 'erp"."connections',
346
+ },
347
+ ),
348
+ migrations.CreateModel(
349
+ name='CompanySystem',
350
+ fields=[
351
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
352
+ ('is_primary', models.BooleanField(default=False, help_text='Whether this is the primary ERP system for the company')),
353
+ ('is_active', models.BooleanField(default=True)),
354
+ ('metadata', models.JSONField(blank=True, default=dict)),
355
+ ('created_at', models.DateTimeField(auto_now_add=True)),
356
+ ('updated_at', models.DateTimeField(auto_now=True)),
357
+ ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='erp_systems', to='constec_db.company')),
358
+ ('system', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='company_assignments', to='constec_db.system')),
359
+ ],
360
+ options={
361
+ 'db_table': 'erp"."company_systems',
362
+ },
363
+ ),
364
+ migrations.CreateModel(
365
+ name='TagCategory',
366
+ fields=[
367
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
368
+ ('name', models.CharField(max_length=50)),
369
+ ('description', models.TextField(blank=True, null=True)),
370
+ ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tag_categories', to='constec_db.company')),
371
+ ],
372
+ options={
373
+ 'db_table': 'core"."tag_categories',
374
+ },
375
+ ),
376
+ migrations.AddField(
377
+ model_name='persontag',
378
+ name='category',
379
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_tags', to='constec_db.tagcategory'),
380
+ ),
381
+ migrations.CreateModel(
382
+ name='User',
383
+ fields=[
384
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
385
+ ('name', models.CharField(max_length=255)),
386
+ ('email', models.EmailField(max_length=254, unique=True)),
387
+ ('password_hash', models.CharField(max_length=255)),
388
+ ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='users', to='constec_db.company')),
389
+ ],
390
+ options={
391
+ 'db_table': 'core"."users',
392
+ },
393
+ ),
394
+ migrations.CreateModel(
395
+ name='UserGroup',
396
+ fields=[
397
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
398
+ ('name', models.CharField(max_length=100)),
399
+ ('description', models.TextField(blank=True, null=True)),
400
+ ('company', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_groups', to='constec_db.company')),
401
+ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sub_groups', to='constec_db.usergroup')),
402
+ ('users', models.ManyToManyField(related_name='groups', to='constec_db.user')),
403
+ ],
404
+ options={
405
+ 'db_table': 'core"."user_groups',
406
+ },
407
+ ),
408
+ migrations.CreateModel(
409
+ name='UserRole',
410
+ fields=[
411
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
412
+ ('name', models.CharField(max_length=100)),
413
+ ('description', models.TextField(blank=True, null=True)),
414
+ ('permissions', models.JSONField(default=dict)),
415
+ ('is_system_role', models.BooleanField(default=False)),
416
+ ('company', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_roles', to='constec_db.company')),
417
+ ],
418
+ options={
419
+ 'db_table': 'core"."user_roles',
420
+ },
421
+ ),
422
+ migrations.CreateModel(
423
+ name='UserCompanyAccess',
424
+ fields=[
425
+ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
426
+ ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_accesses', to='constec_db.company')),
427
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='company_accesses', to='constec_db.user')),
428
+ ('role', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user_accesses', to='constec_db.userrole')),
429
+ ],
430
+ options={
431
+ 'db_table': 'core"."user_company_access',
432
+ },
433
+ ),
434
+ migrations.AddIndex(
435
+ model_name='flow',
436
+ index=models.Index(fields=['company', 'is_default'], name='flows_company_982968_idx'),
437
+ ),
438
+ migrations.AddIndex(
439
+ model_name='flow',
440
+ index=models.Index(fields=['template', 'is_active'], name='flows_templat_638f1d_idx'),
441
+ ),
442
+ migrations.AlterUniqueTogether(
443
+ name='flow',
444
+ unique_together={('company', 'name')},
445
+ ),
446
+ migrations.AlterUniqueTogether(
447
+ name='companymodule',
448
+ unique_together={('company', 'module')},
449
+ ),
450
+ migrations.AlterUniqueTogether(
451
+ name='organizationrole',
452
+ unique_together={('organization', 'name')},
453
+ ),
454
+ migrations.AddIndex(
455
+ model_name='flowtemplate',
456
+ index=models.Index(fields=['organization', 'is_global'], name='flow_templa_organiz_abebc3_idx'),
457
+ ),
458
+ migrations.AddIndex(
459
+ model_name='flowtemplate',
460
+ index=models.Index(fields=['category', 'is_active'], name='flow_templa_categor_976487_idx'),
461
+ ),
462
+ migrations.AlterUniqueTogether(
463
+ name='flowtemplate',
464
+ unique_together={('organization', 'name', 'version')},
465
+ ),
466
+ migrations.AlterUniqueTogether(
467
+ name='personcontact',
468
+ unique_together={('person', 'contact')},
469
+ ),
470
+ migrations.AlterUniqueTogether(
471
+ name='persontagged',
472
+ unique_together={('person', 'tag')},
473
+ ),
474
+ migrations.AddIndex(
475
+ model_name='session',
476
+ index=models.Index(fields=['company', 'is_active'], name='sessions_company_30036a_idx'),
477
+ ),
478
+ migrations.AddIndex(
479
+ model_name='session',
480
+ index=models.Index(fields=['user', 'is_active'], name='sessions_user_id_85103c_idx'),
481
+ ),
482
+ migrations.AddIndex(
483
+ model_name='session',
484
+ index=models.Index(fields=['-created_at'], name='sessions_created_eb29b2_idx'),
485
+ ),
486
+ migrations.AddIndex(
487
+ model_name='message',
488
+ index=models.Index(fields=['session', 'created_at'], name='messages_session_1b3070_idx'),
489
+ ),
490
+ migrations.AlterUniqueTogether(
491
+ name='role',
492
+ unique_together={('system', 'name')},
493
+ ),
494
+ migrations.AddIndex(
495
+ model_name='entity',
496
+ index=models.Index(fields=['cuit'], name='entities_cuit_ad5bc3_idx'),
497
+ ),
498
+ migrations.AddIndex(
499
+ model_name='entity',
500
+ index=models.Index(fields=['system', 'cuit'], name='entities_system__347218_idx'),
501
+ ),
502
+ migrations.AlterUniqueTogether(
503
+ name='entity',
504
+ unique_together={('system', 'role', 'external_id')},
505
+ ),
506
+ migrations.AlterUniqueTogether(
507
+ name='connection',
508
+ unique_together={('system', 'slug')},
509
+ ),
510
+ migrations.AddIndex(
511
+ model_name='companysystem',
512
+ index=models.Index(fields=['company', 'is_primary'], name='company_sys_company_e5ff34_idx'),
513
+ ),
514
+ migrations.AddIndex(
515
+ model_name='companysystem',
516
+ index=models.Index(fields=['system', 'is_active'], name='company_sys_system__aeef9f_idx'),
517
+ ),
518
+ migrations.AlterUniqueTogether(
519
+ name='companysystem',
520
+ unique_together={('company', 'system')},
521
+ ),
522
+ migrations.AlterUniqueTogether(
523
+ name='persontag',
524
+ unique_together={('company', 'category', 'name')},
525
+ ),
526
+ migrations.AlterUniqueTogether(
527
+ name='usergroup',
528
+ unique_together={('company', 'name')},
529
+ ),
530
+ migrations.AlterUniqueTogether(
531
+ name='userrole',
532
+ unique_together={('company', 'name')},
533
+ ),
534
+ migrations.AlterUniqueTogether(
535
+ name='usercompanyaccess',
536
+ unique_together={('user', 'company')},
537
+ ),
538
+ ]
@@ -0,0 +1,37 @@
1
+ # Generated by Django 6.0.1 on 2026-01-27 12:52
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('constec_db', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterModelTable(
14
+ name='companysystem',
15
+ table='"erp"."company_systems"',
16
+ ),
17
+ migrations.AlterModelTable(
18
+ name='connection',
19
+ table='"erp"."connections"',
20
+ ),
21
+ migrations.AlterModelTable(
22
+ name='entity',
23
+ table='"erp"."entities"',
24
+ ),
25
+ migrations.AlterModelTable(
26
+ name='entityauth',
27
+ table='"erp"."entity_auth"',
28
+ ),
29
+ migrations.AlterModelTable(
30
+ name='role',
31
+ table='"erp"."roles"',
32
+ ),
33
+ migrations.AlterModelTable(
34
+ name='system',
35
+ table='"erp"."systems"',
36
+ ),
37
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.10 on 2026-01-27 13:07
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('constec_db', '0002_alter_companysystem_table_alter_connection_table_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='company',
15
+ name='is_active',
16
+ field=models.BooleanField(default=True),
17
+ ),
18
+ ]
File without changes