From 942154480ed335d2f26b352ff98f79a3acea3c23 Mon Sep 17 00:00:00 2001 From: Herculino Trotta Date: Sat, 8 Feb 2025 04:16:28 -0300 Subject: [PATCH] feat(rules): add Update or Create Transaction action --- ...006_updateorcreatetransactionruleaction.py | 60 +++++++++++++++++++ ...etransactionruleaction_options_and_more.py | 22 +++++++ ...tionruleaction_search_entities_and_more.py | 33 ++++++++++ ..._alter_transactionrule_options_and_more.py | 25 ++++++++ 4 files changed, 140 insertions(+) create mode 100644 app/apps/rules/migrations/0006_updateorcreatetransactionruleaction.py create mode 100644 app/apps/rules/migrations/0007_alter_updateorcreatetransactionruleaction_options_and_more.py create mode 100644 app/apps/rules/migrations/0008_updateorcreatetransactionruleaction_search_entities_and_more.py create mode 100644 app/apps/rules/migrations/0009_alter_transactionrule_options_and_more.py diff --git a/app/apps/rules/migrations/0006_updateorcreatetransactionruleaction.py b/app/apps/rules/migrations/0006_updateorcreatetransactionruleaction.py new file mode 100644 index 0000000..c2d49fc --- /dev/null +++ b/app/apps/rules/migrations/0006_updateorcreatetransactionruleaction.py @@ -0,0 +1,60 @@ +# Generated by Django 5.1.5 on 2025-02-08 03:16 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rules', '0005_alter_transactionruleaction_rule'), + ] + + operations = [ + migrations.CreateModel( + name='UpdateOrCreateTransactionRuleAction', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('search_account', models.TextField(blank=True, help_text='Expression to match transaction account (ID or name)', verbose_name='Search Account')), + ('search_account_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Account Operator')), + ('search_type', models.TextField(blank=True, help_text="Expression to match transaction type ('IN' or 'EX')", verbose_name='Search Type')), + ('search_type_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Type Operator')), + ('search_is_paid', models.TextField(blank=True, help_text='Expression to match transaction paid status', verbose_name='Search Is Paid')), + ('search_is_paid_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Is Paid Operator')), + ('search_date', models.TextField(blank=True, help_text='Expression to match transaction date', verbose_name='Search Date')), + ('search_date_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Date Operator')), + ('search_reference_date', models.TextField(blank=True, help_text='Expression to match transaction reference date', verbose_name='Search Reference Date')), + ('search_reference_date_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Reference Date Operator')), + ('search_amount', models.TextField(blank=True, help_text='Expression to match transaction amount', verbose_name='Search Amount')), + ('search_amount_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Amount Operator')), + ('search_description', models.TextField(blank=True, help_text='Expression to match transaction description', verbose_name='Search Description')), + ('search_description_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='contains', max_length=10, verbose_name='Description Operator')), + ('search_notes', models.TextField(blank=True, help_text='Expression to match transaction notes', verbose_name='Search Notes')), + ('search_notes_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='contains', max_length=10, verbose_name='Notes Operator')), + ('search_category', models.TextField(blank=True, help_text='Expression to match transaction category (ID or name)', verbose_name='Search Category')), + ('search_category_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Category Operator')), + ('search_internal_note', models.TextField(blank=True, help_text='Expression to match transaction internal note', verbose_name='Search Internal Note')), + ('search_internal_note_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Internal Note Operator')), + ('search_internal_id', models.TextField(blank=True, help_text='Expression to match transaction internal ID', verbose_name='Search Internal ID')), + ('search_internal_id_operator', models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='exact', max_length=10, verbose_name='Internal ID Operator')), + ('set_account', models.TextField(blank=True, help_text='Expression for account to set (ID or name)', verbose_name='Set Account')), + ('set_type', models.TextField(blank=True, help_text="Expression for type to set ('IN' or 'EX')", verbose_name='Set Type')), + ('set_is_paid', models.TextField(blank=True, help_text='Expression for paid status to set', verbose_name='Set Is Paid')), + ('set_date', models.TextField(blank=True, help_text='Expression for date to set', verbose_name='Set Date')), + ('set_reference_date', models.TextField(blank=True, help_text='Expression for reference date to set', verbose_name='Set Reference Date')), + ('set_amount', models.TextField(blank=True, help_text='Expression for amount to set', verbose_name='Set Amount')), + ('set_description', models.TextField(blank=True, help_text='Expression for description to set', verbose_name='Set Description')), + ('set_notes', models.TextField(blank=True, help_text='Expression for notes to set', verbose_name='Set Notes')), + ('set_internal_note', models.TextField(blank=True, help_text='Expression for internal note to set', verbose_name='Set Internal Note')), + ('set_internal_id', models.TextField(blank=True, help_text='Expression for internal ID to set', verbose_name='Set Internal ID')), + ('set_category', models.TextField(blank=True, help_text='Expression for category to set (ID or name)', verbose_name='Set Category')), + ('set_tags', models.TextField(blank=True, help_text='Expression for tags to set (list of IDs or names)', verbose_name='Set Tags')), + ('set_entities', models.TextField(blank=True, help_text='Expression for entities to set (list of IDs or names)', verbose_name='Set Entities')), + ('rule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='update_or_create_transaction_actions', to='rules.transactionrule', verbose_name='Rule')), + ], + options={ + 'verbose_name': 'pdate or Create Transaction Action', + 'verbose_name_plural': 'pdate or Create Transaction Action Actions', + }, + ), + ] diff --git a/app/apps/rules/migrations/0007_alter_updateorcreatetransactionruleaction_options_and_more.py b/app/apps/rules/migrations/0007_alter_updateorcreatetransactionruleaction_options_and_more.py new file mode 100644 index 0000000..ed27332 --- /dev/null +++ b/app/apps/rules/migrations/0007_alter_updateorcreatetransactionruleaction_options_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 5.1.5 on 2025-02-08 04:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rules', '0006_updateorcreatetransactionruleaction'), + ] + + operations = [ + migrations.AlterModelOptions( + name='updateorcreatetransactionruleaction', + options={'verbose_name': 'Update or Create Transaction Action', 'verbose_name_plural': 'Update or Create Transaction Action Actions'}, + ), + migrations.AddField( + model_name='updateorcreatetransactionruleaction', + name='filter', + field=models.TextField(blank=True, help_text='Generic expression to enable or disable execution. Should evaluate to True or False', verbose_name='Filter'), + ), + ] diff --git a/app/apps/rules/migrations/0008_updateorcreatetransactionruleaction_search_entities_and_more.py b/app/apps/rules/migrations/0008_updateorcreatetransactionruleaction_search_entities_and_more.py new file mode 100644 index 0000000..73a0bfd --- /dev/null +++ b/app/apps/rules/migrations/0008_updateorcreatetransactionruleaction_search_entities_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 5.1.5 on 2025-02-08 06:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rules', '0007_alter_updateorcreatetransactionruleaction_options_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='updateorcreatetransactionruleaction', + name='search_entities', + field=models.TextField(blank=True, help_text='Expression to match transaction entities (list of IDs or names)', verbose_name='Search Entities'), + ), + migrations.AddField( + model_name='updateorcreatetransactionruleaction', + name='search_entities_operator', + field=models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='contains', max_length=10, verbose_name='Entities Operator'), + ), + migrations.AddField( + model_name='updateorcreatetransactionruleaction', + name='search_tags', + field=models.TextField(blank=True, help_text='Expression to match transaction tags (list of IDs or names)', verbose_name='Search Tags'), + ), + migrations.AddField( + model_name='updateorcreatetransactionruleaction', + name='search_tags_operator', + field=models.CharField(choices=[('exact', 'is exactly'), ('contains', 'contains'), ('startswith', 'starts with'), ('endswith', 'ends with'), ('eq', 'equals'), ('gt', 'greater than'), ('lt', 'less than'), ('gte', 'greater than or equal'), ('lte', 'less than or equal')], default='contains', max_length=10, verbose_name='Tags Operator'), + ), + ] diff --git a/app/apps/rules/migrations/0009_alter_transactionrule_options_and_more.py b/app/apps/rules/migrations/0009_alter_transactionrule_options_and_more.py new file mode 100644 index 0000000..7ec3046 --- /dev/null +++ b/app/apps/rules/migrations/0009_alter_transactionrule_options_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 5.1.5 on 2025-02-08 06:40 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('rules', '0008_updateorcreatetransactionruleaction_search_entities_and_more'), + ] + + operations = [ + migrations.AlterModelOptions( + name='transactionrule', + options={'verbose_name': 'Transaction rule', 'verbose_name_plural': 'Transaction rules'}, + ), + migrations.AlterModelOptions( + name='transactionruleaction', + options={'verbose_name': 'Edit transaction action', 'verbose_name_plural': 'Edit transaction actions'}, + ), + migrations.AlterModelOptions( + name='updateorcreatetransactionruleaction', + options={'verbose_name': 'Update or create transaction action', 'verbose_name_plural': 'Update or create transaction actions'}, + ), + ]