diff --git a/ProcessMaker/Console/Commands/EvaluateCaseRetention.php b/ProcessMaker/Console/Commands/EvaluateCaseRetention.php new file mode 100644 index 0000000000..9404366d25 --- /dev/null +++ b/ProcessMaker/Console/Commands/EvaluateCaseRetention.php @@ -0,0 +1,52 @@ +info('Case retention policy is disabled'); + $this->error('Skipping case retention evaluation'); + + return; + } + + $this->info('Case retention policy is enabled'); + $this->info('Evaluating and deleting cases past their retention period'); + + // Process all processes when retention policy is enabled + // Processes without retention_period will default to 1_year + Process::chunkById(100, function ($processes) { + foreach ($processes as $process) { + dispatch(new EvaluateProcessRetentionJob($process->id)); + } + }); + + $this->info('Cases retention evaluation complete'); + } +} diff --git a/ProcessMaker/Console/Kernel.php b/ProcessMaker/Console/Kernel.php index 7edd255225..03fc408949 100644 --- a/ProcessMaker/Console/Kernel.php +++ b/ProcessMaker/Console/Kernel.php @@ -90,6 +90,13 @@ protected function schedule(Schedule $schedule) break; } + // evaluate cases retention policy + $schedule->command('cases:retention:evaluate') + ->daily() + ->onOneServer() + ->withoutOverlapping() + ->runInBackground(); + // 5 minutes is recommended in https://laravel.com/docs/12.x/horizon#metrics $schedule->command('horizon:snapshot')->everyFiveMinutes(); } diff --git a/ProcessMaker/Jobs/EvaluateProcessRetentionJob.php b/ProcessMaker/Jobs/EvaluateProcessRetentionJob.php new file mode 100644 index 0000000000..f5d2415993 --- /dev/null +++ b/ProcessMaker/Jobs/EvaluateProcessRetentionJob.php @@ -0,0 +1,105 @@ +processId); + if (!$process) { + Log::error('CaseRetentionJob: Process not found', ['process_id' => $this->processId]); + + return; + } + + // Default to 1_year if retention_period is not set + $retentionPeriod = $process->properties['retention_period'] ?? '1_year'; + $retentionMonths = match ($retentionPeriod) { + '6_months' => 6, + '1_year' => 12, + '3_years' => 36, + '5_years' => 60, + default => 12, // Default to 1_year + }; + + // Default retention_updated_at to now if not set + // This means the retention policy applies from now for processes without explicit retention settings + $retentionUpdatedAt = isset($process->properties['retention_updated_at']) + ? Carbon::parse($process->properties['retention_updated_at']) + : Carbon::now(); + + // Check if there are any process requests for this process + // If not, nothing to delete + if (!ProcessRequest::where('process_id', $this->processId)->exists()) { + return; + } + + // Handle two scenarios: + // 1. Cases created BEFORE retention_updated_at: Delete if older than retention period from retention_updated_at + // (These cases were subject to the old retention policy, but we apply current retention from update date) + // 2. Cases created AFTER retention_updated_at: Delete if older than retention period from their creation date + // (These cases are subject to the new retention policy) + + $now = Carbon::now(); + + // For cases created before retention_updated_at: cutoff is retention_updated_at - retention_period + $oldCasesCutoff = $retentionUpdatedAt->copy()->subMonths($retentionMonths); + + // For cases created after retention_updated_at: cutoff is now - retention_period + $newCasesCutoff = $now->copy()->subMonths($retentionMonths); + + // Use subquery to get process request IDs + $processRequestSubquery = ProcessRequest::where('process_id', $this->processId)->select('id'); + + CaseNumber::whereIn('process_request_id', $processRequestSubquery) + ->where(function ($query) use ($retentionUpdatedAt, $oldCasesCutoff, $newCasesCutoff) { + // Cases created before retention_updated_at: delete if created before (retention_updated_at - retention_period) + $query->where(function ($q) use ($retentionUpdatedAt, $oldCasesCutoff) { + $q->where('created_at', '<', $retentionUpdatedAt) + ->where('created_at', '<', $oldCasesCutoff); + }) + // Cases created after retention_updated_at: delete if created before (now - retention_period) + ->orWhere(function ($q) use ($retentionUpdatedAt, $newCasesCutoff) { + $q->where('created_at', '>=', $retentionUpdatedAt) + ->where('created_at', '<', $newCasesCutoff); + }); + }) + ->chunkById(100, function ($cases) { + $caseIds = $cases->pluck('id'); + // Delete the cases + CaseNumber::whereIn('id', $caseIds)->delete(); + + // TODO: Add logs to track the number of cases deleted + // Get deleted timestamp + // $deletedAt = Carbon::now(); + // RetentionPolicyLog::record($process->id, $caseIds, $deletedAt); + }); + } +} diff --git a/README.md b/README.md index 17789a6e1a..889bb63882 100644 --- a/README.md +++ b/README.md @@ -439,6 +439,26 @@ How to use icon: npm run dev-font ``` +# Case Retention Tier (CASE_RETENTION_TIER) + +The case retention policy controls how long cases are stored before they are automatically and permanently deleted. The **CASE_RETENTION_TIER** environment variable determines which retention periods customers can select when configuring a process. Each tier exposes a different set of options in the UI; options for higher tiers are visible but disabled so users see what is available at higher tiers. + +### Supported tiers + +| Tier | Retention options available | +|------|----------------------------| +| **1** | Six months, One year | +| **2** | Six months, One year, Three years | +| **3** | Six months, One year, Three years, Five years | + +Set the variable in your `.env` file: +```env +CASE_RETENTION_POLICY_ENABLED=true +CASE_RETENTION_TIER=1 +``` +Use `1`, `2`, or `3`. The default is `1` if not set. The default retention period shown in the UI for Tier 1 is one year. + + # Prometheus and Grafana diff --git a/config/app.php b/config/app.php index 4d461545fd..229bca462c 100644 --- a/config/app.php +++ b/config/app.php @@ -288,6 +288,9 @@ // Enable or disable TCE customization feature 'tce_customization_enable' => env('TCE_CUSTOMIZATION_ENABLED', false), + // Enable or disable case retention policy + 'case_retention_policy_enabled' => env('CASE_RETENTION_POLICY_ENABLED', false), + 'prometheus_namespace' => env('PROMETHEUS_NAMESPACE', strtolower(preg_replace('/[^a-zA-Z0-9_]+/', '_', env('APP_NAME', 'processmaker')))), 'server_timing' => [ @@ -302,6 +305,18 @@ 'multitenancy' => env('MULTITENANCY', false), 'reassign_restrict_to_assignable_users' => env('REASSIGN_RESTRICT_TO_ASSIGNABLE_USERS', true), + + // When true, shows the Cases Retention section on process configuration + 'case_retention_policy_enabled' => filter_var(env('CASE_RETENTION_POLICY_ENABLED', false), FILTER_VALIDATE_BOOLEAN), + + // Controls which retention periods are available in the UI for the current tier. + 'case_retention_tier' => env('CASE_RETENTION_TIER', '1'), + 'case_retention_tier_options' => [ + '1' => ['six_months', 'one_year'], + '2' => ['six_months', 'one_year', 'three_years'], + '3' => ['six_months', 'one_year', 'three_years', 'five_years'], + ], + 'resources_core_path' => base_path('resources-core'), 'scheduler' => [ 'claim_timeout_minutes' => env('SCHEDULER_CLAIM_TIMEOUT_MINUTES', 5), diff --git a/devhub/pm-font/svg/check-circle-outline.svg b/devhub/pm-font/svg/check-circle-outline.svg new file mode 100644 index 0000000000..79932fc0c0 --- /dev/null +++ b/devhub/pm-font/svg/check-circle-outline.svg @@ -0,0 +1,3 @@ + diff --git a/devhub/pm-font/svg/exclamation-triangle.svg b/devhub/pm-font/svg/exclamation-triangle.svg new file mode 100644 index 0000000000..dc9fa5ea18 --- /dev/null +++ b/devhub/pm-font/svg/exclamation-triangle.svg @@ -0,0 +1,3 @@ + diff --git a/resources/fonts/pm-font/index.html b/resources/fonts/pm-font/index.html index 90ee73e5e7..19b60faa9a 100644 --- a/resources/fonts/pm-font/index.html +++ b/resources/fonts/pm-font/index.html @@ -103,7 +103,7 @@
diff --git a/resources/fonts/pm-font/processmaker-font.css b/resources/fonts/pm-font/processmaker-font.css
index c716cce24f..e8ceeedff5 100644
--- a/resources/fonts/pm-font/processmaker-font.css
+++ b/resources/fonts/pm-font/processmaker-font.css
@@ -1,11 +1,11 @@
@font-face {
font-family: "processmaker-font";
- src: url('processmaker-font.eot?t=1747081178345'); /* IE9*/
- src: url('processmaker-font.eot?t=1747081178345#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url("processmaker-font.woff2?t=1747081178345") format("woff2"),
- url("processmaker-font.woff?t=1747081178345") format("woff"),
- url('processmaker-font.ttf?t=1747081178345') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
- url('processmaker-font.svg?t=1747081178345#processmaker-font') format('svg'); /* iOS 4.1- */
+ src: url('processmaker-font.eot?t=1770239064379'); /* IE9*/
+ src: url('processmaker-font.eot?t=1770239064379#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url("processmaker-font.woff2?t=1770239064379") format("woff2"),
+ url("processmaker-font.woff?t=1770239064379") format("woff"),
+ url('processmaker-font.ttf?t=1770239064379') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('processmaker-font.svg?t=1770239064379#processmaker-font') format('svg'); /* iOS 4.1- */
}
[class^="fp-"], [class*=" fp-"] {
@@ -37,42 +37,44 @@
.fp-bpmn-text-annotation:before { content: "\ea13"; }
.fp-brush-icon:before { content: "\ea14"; }
.fp-check-circle-blue:before { content: "\ea15"; }
-.fp-close:before { content: "\ea16"; }
-.fp-cloud-download-outline:before { content: "\ea17"; }
-.fp-connector-outline:before { content: "\ea18"; }
-.fp-copy-outline:before { content: "\ea19"; }
-.fp-copy:before { content: "\ea1a"; }
-.fp-desktop:before { content: "\ea1b"; }
-.fp-edit-outline:before { content: "\ea1c"; }
-.fp-expand:before { content: "\ea1d"; }
-.fp-eye:before { content: "\ea1e"; }
-.fp-fields-icon:before { content: "\ea1f"; }
-.fp-flowgenie-outline:before { content: "\ea20"; }
-.fp-folder-outline:before { content: "\ea21"; }
-.fp-fullscreen:before { content: "\ea22"; }
-.fp-github:before { content: "\ea23"; }
-.fp-inbox:before { content: "\ea24"; }
-.fp-layout-icon:before { content: "\ea25"; }
-.fp-link-icon:before { content: "\ea26"; }
-.fp-map:before { content: "\ea27"; }
-.fp-minimize:before { content: "\ea28"; }
-.fp-mobile:before { content: "\ea29"; }
-.fp-pdf:before { content: "\ea2a"; }
-.fp-pen-edit:before { content: "\ea2b"; }
-.fp-play-outline:before { content: "\ea2c"; }
-.fp-plus-thin:before { content: "\ea2d"; }
-.fp-plus:before { content: "\ea2e"; }
-.fp-pm-block:before { content: "\ea2f"; }
-.fp-remove-outlined:before { content: "\ea30"; }
-.fp-screen-outline:before { content: "\ea31"; }
-.fp-script-outline:before { content: "\ea32"; }
-.fp-slack-notification:before { content: "\ea33"; }
-.fp-slack:before { content: "\ea34"; }
-.fp-slideshow:before { content: "\ea35"; }
-.fp-table:before { content: "\ea36"; }
-.fp-tachometer-alt-average:before { content: "\ea37"; }
-.fp-trash-blue:before { content: "\ea38"; }
-.fp-trash:before { content: "\ea39"; }
-.fp-unlink:before { content: "\ea3a"; }
-.fp-update-outline:before { content: "\ea3b"; }
+.fp-check-circle-outline:before { content: "\ea16"; }
+.fp-close:before { content: "\ea17"; }
+.fp-cloud-download-outline:before { content: "\ea18"; }
+.fp-connector-outline:before { content: "\ea19"; }
+.fp-copy-outline:before { content: "\ea1a"; }
+.fp-copy:before { content: "\ea1b"; }
+.fp-desktop:before { content: "\ea1c"; }
+.fp-edit-outline:before { content: "\ea1d"; }
+.fp-exclamation-triangle:before { content: "\ea1e"; }
+.fp-expand:before { content: "\ea1f"; }
+.fp-eye:before { content: "\ea20"; }
+.fp-fields-icon:before { content: "\ea21"; }
+.fp-flowgenie-outline:before { content: "\ea22"; }
+.fp-folder-outline:before { content: "\ea23"; }
+.fp-fullscreen:before { content: "\ea24"; }
+.fp-github:before { content: "\ea25"; }
+.fp-inbox:before { content: "\ea26"; }
+.fp-layout-icon:before { content: "\ea27"; }
+.fp-link-icon:before { content: "\ea28"; }
+.fp-map:before { content: "\ea29"; }
+.fp-minimize:before { content: "\ea2a"; }
+.fp-mobile:before { content: "\ea2b"; }
+.fp-pdf:before { content: "\ea2c"; }
+.fp-pen-edit:before { content: "\ea2d"; }
+.fp-play-outline:before { content: "\ea2e"; }
+.fp-plus-thin:before { content: "\ea2f"; }
+.fp-plus:before { content: "\ea30"; }
+.fp-pm-block:before { content: "\ea31"; }
+.fp-remove-outlined:before { content: "\ea32"; }
+.fp-screen-outline:before { content: "\ea33"; }
+.fp-script-outline:before { content: "\ea34"; }
+.fp-slack-notification:before { content: "\ea35"; }
+.fp-slack:before { content: "\ea36"; }
+.fp-slideshow:before { content: "\ea37"; }
+.fp-table:before { content: "\ea38"; }
+.fp-tachometer-alt-average:before { content: "\ea39"; }
+.fp-trash-blue:before { content: "\ea3a"; }
+.fp-trash:before { content: "\ea3b"; }
+.fp-unlink:before { content: "\ea3c"; }
+.fp-update-outline:before { content: "\ea3d"; }
diff --git a/resources/fonts/pm-font/processmaker-font.eot b/resources/fonts/pm-font/processmaker-font.eot
index fc8398ccf1..b10e9eb2b5 100644
Binary files a/resources/fonts/pm-font/processmaker-font.eot and b/resources/fonts/pm-font/processmaker-font.eot differ
diff --git a/resources/fonts/pm-font/processmaker-font.less b/resources/fonts/pm-font/processmaker-font.less
index 889600b9db..9d190be82b 100644
--- a/resources/fonts/pm-font/processmaker-font.less
+++ b/resources/fonts/pm-font/processmaker-font.less
@@ -1,10 +1,10 @@
@font-face {font-family: "processmaker-font";
- src: url('processmaker-font.eot?t=1747081178345'); /* IE9*/
- src: url('processmaker-font.eot?t=1747081178345#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url("processmaker-font.woff2?t=1747081178345") format("woff2"),
- url("processmaker-font.woff?t=1747081178345") format("woff"),
- url('processmaker-font.ttf?t=1747081178345') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
- url('processmaker-font.svg?t=1747081178345#processmaker-font') format('svg'); /* iOS 4.1- */
+ src: url('processmaker-font.eot?t=1770239064379'); /* IE9*/
+ src: url('processmaker-font.eot?t=1770239064379#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url("processmaker-font.woff2?t=1770239064379") format("woff2"),
+ url("processmaker-font.woff?t=1770239064379") format("woff"),
+ url('processmaker-font.ttf?t=1770239064379') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('processmaker-font.svg?t=1770239064379#processmaker-font') format('svg'); /* iOS 4.1- */
}
[class^="fp-"], [class*=" fp-"] {
@@ -35,41 +35,43 @@
.fp-bpmn-text-annotation:before { content: "\ea13"; }
.fp-brush-icon:before { content: "\ea14"; }
.fp-check-circle-blue:before { content: "\ea15"; }
-.fp-close:before { content: "\ea16"; }
-.fp-cloud-download-outline:before { content: "\ea17"; }
-.fp-connector-outline:before { content: "\ea18"; }
-.fp-copy-outline:before { content: "\ea19"; }
-.fp-copy:before { content: "\ea1a"; }
-.fp-desktop:before { content: "\ea1b"; }
-.fp-edit-outline:before { content: "\ea1c"; }
-.fp-expand:before { content: "\ea1d"; }
-.fp-eye:before { content: "\ea1e"; }
-.fp-fields-icon:before { content: "\ea1f"; }
-.fp-flowgenie-outline:before { content: "\ea20"; }
-.fp-folder-outline:before { content: "\ea21"; }
-.fp-fullscreen:before { content: "\ea22"; }
-.fp-github:before { content: "\ea23"; }
-.fp-inbox:before { content: "\ea24"; }
-.fp-layout-icon:before { content: "\ea25"; }
-.fp-link-icon:before { content: "\ea26"; }
-.fp-map:before { content: "\ea27"; }
-.fp-minimize:before { content: "\ea28"; }
-.fp-mobile:before { content: "\ea29"; }
-.fp-pdf:before { content: "\ea2a"; }
-.fp-pen-edit:before { content: "\ea2b"; }
-.fp-play-outline:before { content: "\ea2c"; }
-.fp-plus-thin:before { content: "\ea2d"; }
-.fp-plus:before { content: "\ea2e"; }
-.fp-pm-block:before { content: "\ea2f"; }
-.fp-remove-outlined:before { content: "\ea30"; }
-.fp-screen-outline:before { content: "\ea31"; }
-.fp-script-outline:before { content: "\ea32"; }
-.fp-slack-notification:before { content: "\ea33"; }
-.fp-slack:before { content: "\ea34"; }
-.fp-slideshow:before { content: "\ea35"; }
-.fp-table:before { content: "\ea36"; }
-.fp-tachometer-alt-average:before { content: "\ea37"; }
-.fp-trash-blue:before { content: "\ea38"; }
-.fp-trash:before { content: "\ea39"; }
-.fp-unlink:before { content: "\ea3a"; }
-.fp-update-outline:before { content: "\ea3b"; }
+.fp-check-circle-outline:before { content: "\ea16"; }
+.fp-close:before { content: "\ea17"; }
+.fp-cloud-download-outline:before { content: "\ea18"; }
+.fp-connector-outline:before { content: "\ea19"; }
+.fp-copy-outline:before { content: "\ea1a"; }
+.fp-copy:before { content: "\ea1b"; }
+.fp-desktop:before { content: "\ea1c"; }
+.fp-edit-outline:before { content: "\ea1d"; }
+.fp-exclamation-triangle:before { content: "\ea1e"; }
+.fp-expand:before { content: "\ea1f"; }
+.fp-eye:before { content: "\ea20"; }
+.fp-fields-icon:before { content: "\ea21"; }
+.fp-flowgenie-outline:before { content: "\ea22"; }
+.fp-folder-outline:before { content: "\ea23"; }
+.fp-fullscreen:before { content: "\ea24"; }
+.fp-github:before { content: "\ea25"; }
+.fp-inbox:before { content: "\ea26"; }
+.fp-layout-icon:before { content: "\ea27"; }
+.fp-link-icon:before { content: "\ea28"; }
+.fp-map:before { content: "\ea29"; }
+.fp-minimize:before { content: "\ea2a"; }
+.fp-mobile:before { content: "\ea2b"; }
+.fp-pdf:before { content: "\ea2c"; }
+.fp-pen-edit:before { content: "\ea2d"; }
+.fp-play-outline:before { content: "\ea2e"; }
+.fp-plus-thin:before { content: "\ea2f"; }
+.fp-plus:before { content: "\ea30"; }
+.fp-pm-block:before { content: "\ea31"; }
+.fp-remove-outlined:before { content: "\ea32"; }
+.fp-screen-outline:before { content: "\ea33"; }
+.fp-script-outline:before { content: "\ea34"; }
+.fp-slack-notification:before { content: "\ea35"; }
+.fp-slack:before { content: "\ea36"; }
+.fp-slideshow:before { content: "\ea37"; }
+.fp-table:before { content: "\ea38"; }
+.fp-tachometer-alt-average:before { content: "\ea39"; }
+.fp-trash-blue:before { content: "\ea3a"; }
+.fp-trash:before { content: "\ea3b"; }
+.fp-unlink:before { content: "\ea3c"; }
+.fp-update-outline:before { content: "\ea3d"; }
diff --git a/resources/fonts/pm-font/processmaker-font.module.less b/resources/fonts/pm-font/processmaker-font.module.less
index d101bf60e6..b0168741d1 100644
--- a/resources/fonts/pm-font/processmaker-font.module.less
+++ b/resources/fonts/pm-font/processmaker-font.module.less
@@ -1,10 +1,10 @@
@font-face {font-family: "processmaker-font";
- src: url('processmaker-font.eot?t=1747081178345'); /* IE9*/
- src: url('processmaker-font.eot?t=1747081178345#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url("processmaker-font.woff2?t=1747081178345") format("woff2"),
- url("processmaker-font.woff?t=1747081178345") format("woff"),
- url('processmaker-font.ttf?t=1747081178345') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
- url('processmaker-font.svg?t=1747081178345#processmaker-font') format('svg'); /* iOS 4.1- */
+ src: url('processmaker-font.eot?t=1770239064379'); /* IE9*/
+ src: url('processmaker-font.eot?t=1770239064379#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url("processmaker-font.woff2?t=1770239064379") format("woff2"),
+ url("processmaker-font.woff?t=1770239064379") format("woff"),
+ url('processmaker-font.ttf?t=1770239064379') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('processmaker-font.svg?t=1770239064379#processmaker-font') format('svg'); /* iOS 4.1- */
}
[class^="fp-"], [class*=" fp-"] {
@@ -36,43 +36,45 @@
.fp-bpmn-text-annotation:before { content: "\ea13"; }
.fp-brush-icon:before { content: "\ea14"; }
.fp-check-circle-blue:before { content: "\ea15"; }
-.fp-close:before { content: "\ea16"; }
-.fp-cloud-download-outline:before { content: "\ea17"; }
-.fp-connector-outline:before { content: "\ea18"; }
-.fp-copy-outline:before { content: "\ea19"; }
-.fp-copy:before { content: "\ea1a"; }
-.fp-desktop:before { content: "\ea1b"; }
-.fp-edit-outline:before { content: "\ea1c"; }
-.fp-expand:before { content: "\ea1d"; }
-.fp-eye:before { content: "\ea1e"; }
-.fp-fields-icon:before { content: "\ea1f"; }
-.fp-flowgenie-outline:before { content: "\ea20"; }
-.fp-folder-outline:before { content: "\ea21"; }
-.fp-fullscreen:before { content: "\ea22"; }
-.fp-github:before { content: "\ea23"; }
-.fp-inbox:before { content: "\ea24"; }
-.fp-layout-icon:before { content: "\ea25"; }
-.fp-link-icon:before { content: "\ea26"; }
-.fp-map:before { content: "\ea27"; }
-.fp-minimize:before { content: "\ea28"; }
-.fp-mobile:before { content: "\ea29"; }
-.fp-pdf:before { content: "\ea2a"; }
-.fp-pen-edit:before { content: "\ea2b"; }
-.fp-play-outline:before { content: "\ea2c"; }
-.fp-plus-thin:before { content: "\ea2d"; }
-.fp-plus:before { content: "\ea2e"; }
-.fp-pm-block:before { content: "\ea2f"; }
-.fp-remove-outlined:before { content: "\ea30"; }
-.fp-screen-outline:before { content: "\ea31"; }
-.fp-script-outline:before { content: "\ea32"; }
-.fp-slack-notification:before { content: "\ea33"; }
-.fp-slack:before { content: "\ea34"; }
-.fp-slideshow:before { content: "\ea35"; }
-.fp-table:before { content: "\ea36"; }
-.fp-tachometer-alt-average:before { content: "\ea37"; }
-.fp-trash-blue:before { content: "\ea38"; }
-.fp-trash:before { content: "\ea39"; }
-.fp-unlink:before { content: "\ea3a"; }
-.fp-update-outline:before { content: "\ea3b"; }
+.fp-check-circle-outline:before { content: "\ea16"; }
+.fp-close:before { content: "\ea17"; }
+.fp-cloud-download-outline:before { content: "\ea18"; }
+.fp-connector-outline:before { content: "\ea19"; }
+.fp-copy-outline:before { content: "\ea1a"; }
+.fp-copy:before { content: "\ea1b"; }
+.fp-desktop:before { content: "\ea1c"; }
+.fp-edit-outline:before { content: "\ea1d"; }
+.fp-exclamation-triangle:before { content: "\ea1e"; }
+.fp-expand:before { content: "\ea1f"; }
+.fp-eye:before { content: "\ea20"; }
+.fp-fields-icon:before { content: "\ea21"; }
+.fp-flowgenie-outline:before { content: "\ea22"; }
+.fp-folder-outline:before { content: "\ea23"; }
+.fp-fullscreen:before { content: "\ea24"; }
+.fp-github:before { content: "\ea25"; }
+.fp-inbox:before { content: "\ea26"; }
+.fp-layout-icon:before { content: "\ea27"; }
+.fp-link-icon:before { content: "\ea28"; }
+.fp-map:before { content: "\ea29"; }
+.fp-minimize:before { content: "\ea2a"; }
+.fp-mobile:before { content: "\ea2b"; }
+.fp-pdf:before { content: "\ea2c"; }
+.fp-pen-edit:before { content: "\ea2d"; }
+.fp-play-outline:before { content: "\ea2e"; }
+.fp-plus-thin:before { content: "\ea2f"; }
+.fp-plus:before { content: "\ea30"; }
+.fp-pm-block:before { content: "\ea31"; }
+.fp-remove-outlined:before { content: "\ea32"; }
+.fp-screen-outline:before { content: "\ea33"; }
+.fp-script-outline:before { content: "\ea34"; }
+.fp-slack-notification:before { content: "\ea35"; }
+.fp-slack:before { content: "\ea36"; }
+.fp-slideshow:before { content: "\ea37"; }
+.fp-table:before { content: "\ea38"; }
+.fp-tachometer-alt-average:before { content: "\ea39"; }
+.fp-trash-blue:before { content: "\ea3a"; }
+.fp-trash:before { content: "\ea3b"; }
+.fp-unlink:before { content: "\ea3c"; }
+.fp-update-outline:before { content: "\ea3d"; }
}
\ No newline at end of file
diff --git a/resources/fonts/pm-font/processmaker-font.scss b/resources/fonts/pm-font/processmaker-font.scss
index 0eae6ae361..e6e8bbda03 100644
--- a/resources/fonts/pm-font/processmaker-font.scss
+++ b/resources/fonts/pm-font/processmaker-font.scss
@@ -1,10 +1,10 @@
@font-face {font-family: "processmaker-font";
- src: url('processmaker-font.eot?t=1747081178345'); /* IE9*/
- src: url('processmaker-font.eot?t=1747081178345#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url("processmaker-font.woff2?t=1747081178345") format("woff2"),
- url("processmaker-font.woff?t=1747081178345") format("woff"),
- url('processmaker-font.ttf?t=1747081178345') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
- url('processmaker-font.svg?t=1747081178345#processmaker-font') format('svg'); /* iOS 4.1- */
+ src: url('processmaker-font.eot?t=1770239064379'); /* IE9*/
+ src: url('processmaker-font.eot?t=1770239064379#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url("processmaker-font.woff2?t=1770239064379") format("woff2"),
+ url("processmaker-font.woff?t=1770239064379") format("woff"),
+ url('processmaker-font.ttf?t=1770239064379') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('processmaker-font.svg?t=1770239064379#processmaker-font') format('svg'); /* iOS 4.1- */
}
[class^="fp-"], [class*=" fp-"] {
@@ -35,44 +35,46 @@
.fp-bpmn-text-annotation:before { content: "\ea13"; }
.fp-brush-icon:before { content: "\ea14"; }
.fp-check-circle-blue:before { content: "\ea15"; }
-.fp-close:before { content: "\ea16"; }
-.fp-cloud-download-outline:before { content: "\ea17"; }
-.fp-connector-outline:before { content: "\ea18"; }
-.fp-copy-outline:before { content: "\ea19"; }
-.fp-copy:before { content: "\ea1a"; }
-.fp-desktop:before { content: "\ea1b"; }
-.fp-edit-outline:before { content: "\ea1c"; }
-.fp-expand:before { content: "\ea1d"; }
-.fp-eye:before { content: "\ea1e"; }
-.fp-fields-icon:before { content: "\ea1f"; }
-.fp-flowgenie-outline:before { content: "\ea20"; }
-.fp-folder-outline:before { content: "\ea21"; }
-.fp-fullscreen:before { content: "\ea22"; }
-.fp-github:before { content: "\ea23"; }
-.fp-inbox:before { content: "\ea24"; }
-.fp-layout-icon:before { content: "\ea25"; }
-.fp-link-icon:before { content: "\ea26"; }
-.fp-map:before { content: "\ea27"; }
-.fp-minimize:before { content: "\ea28"; }
-.fp-mobile:before { content: "\ea29"; }
-.fp-pdf:before { content: "\ea2a"; }
-.fp-pen-edit:before { content: "\ea2b"; }
-.fp-play-outline:before { content: "\ea2c"; }
-.fp-plus-thin:before { content: "\ea2d"; }
-.fp-plus:before { content: "\ea2e"; }
-.fp-pm-block:before { content: "\ea2f"; }
-.fp-remove-outlined:before { content: "\ea30"; }
-.fp-screen-outline:before { content: "\ea31"; }
-.fp-script-outline:before { content: "\ea32"; }
-.fp-slack-notification:before { content: "\ea33"; }
-.fp-slack:before { content: "\ea34"; }
-.fp-slideshow:before { content: "\ea35"; }
-.fp-table:before { content: "\ea36"; }
-.fp-tachometer-alt-average:before { content: "\ea37"; }
-.fp-trash-blue:before { content: "\ea38"; }
-.fp-trash:before { content: "\ea39"; }
-.fp-unlink:before { content: "\ea3a"; }
-.fp-update-outline:before { content: "\ea3b"; }
+.fp-check-circle-outline:before { content: "\ea16"; }
+.fp-close:before { content: "\ea17"; }
+.fp-cloud-download-outline:before { content: "\ea18"; }
+.fp-connector-outline:before { content: "\ea19"; }
+.fp-copy-outline:before { content: "\ea1a"; }
+.fp-copy:before { content: "\ea1b"; }
+.fp-desktop:before { content: "\ea1c"; }
+.fp-edit-outline:before { content: "\ea1d"; }
+.fp-exclamation-triangle:before { content: "\ea1e"; }
+.fp-expand:before { content: "\ea1f"; }
+.fp-eye:before { content: "\ea20"; }
+.fp-fields-icon:before { content: "\ea21"; }
+.fp-flowgenie-outline:before { content: "\ea22"; }
+.fp-folder-outline:before { content: "\ea23"; }
+.fp-fullscreen:before { content: "\ea24"; }
+.fp-github:before { content: "\ea25"; }
+.fp-inbox:before { content: "\ea26"; }
+.fp-layout-icon:before { content: "\ea27"; }
+.fp-link-icon:before { content: "\ea28"; }
+.fp-map:before { content: "\ea29"; }
+.fp-minimize:before { content: "\ea2a"; }
+.fp-mobile:before { content: "\ea2b"; }
+.fp-pdf:before { content: "\ea2c"; }
+.fp-pen-edit:before { content: "\ea2d"; }
+.fp-play-outline:before { content: "\ea2e"; }
+.fp-plus-thin:before { content: "\ea2f"; }
+.fp-plus:before { content: "\ea30"; }
+.fp-pm-block:before { content: "\ea31"; }
+.fp-remove-outlined:before { content: "\ea32"; }
+.fp-screen-outline:before { content: "\ea33"; }
+.fp-script-outline:before { content: "\ea34"; }
+.fp-slack-notification:before { content: "\ea35"; }
+.fp-slack:before { content: "\ea36"; }
+.fp-slideshow:before { content: "\ea37"; }
+.fp-table:before { content: "\ea38"; }
+.fp-tachometer-alt-average:before { content: "\ea39"; }
+.fp-trash-blue:before { content: "\ea3a"; }
+.fp-trash:before { content: "\ea3b"; }
+.fp-unlink:before { content: "\ea3c"; }
+.fp-update-outline:before { content: "\ea3d"; }
$fp-add-outlined: "\ea01";
$fp-arrow-left: "\ea02";
@@ -95,42 +97,44 @@ $fp-bpmn-task: "\ea12";
$fp-bpmn-text-annotation: "\ea13";
$fp-brush-icon: "\ea14";
$fp-check-circle-blue: "\ea15";
-$fp-close: "\ea16";
-$fp-cloud-download-outline: "\ea17";
-$fp-connector-outline: "\ea18";
-$fp-copy-outline: "\ea19";
-$fp-copy: "\ea1a";
-$fp-desktop: "\ea1b";
-$fp-edit-outline: "\ea1c";
-$fp-expand: "\ea1d";
-$fp-eye: "\ea1e";
-$fp-fields-icon: "\ea1f";
-$fp-flowgenie-outline: "\ea20";
-$fp-folder-outline: "\ea21";
-$fp-fullscreen: "\ea22";
-$fp-github: "\ea23";
-$fp-inbox: "\ea24";
-$fp-layout-icon: "\ea25";
-$fp-link-icon: "\ea26";
-$fp-map: "\ea27";
-$fp-minimize: "\ea28";
-$fp-mobile: "\ea29";
-$fp-pdf: "\ea2a";
-$fp-pen-edit: "\ea2b";
-$fp-play-outline: "\ea2c";
-$fp-plus-thin: "\ea2d";
-$fp-plus: "\ea2e";
-$fp-pm-block: "\ea2f";
-$fp-remove-outlined: "\ea30";
-$fp-screen-outline: "\ea31";
-$fp-script-outline: "\ea32";
-$fp-slack-notification: "\ea33";
-$fp-slack: "\ea34";
-$fp-slideshow: "\ea35";
-$fp-table: "\ea36";
-$fp-tachometer-alt-average: "\ea37";
-$fp-trash-blue: "\ea38";
-$fp-trash: "\ea39";
-$fp-unlink: "\ea3a";
-$fp-update-outline: "\ea3b";
+$fp-check-circle-outline: "\ea16";
+$fp-close: "\ea17";
+$fp-cloud-download-outline: "\ea18";
+$fp-connector-outline: "\ea19";
+$fp-copy-outline: "\ea1a";
+$fp-copy: "\ea1b";
+$fp-desktop: "\ea1c";
+$fp-edit-outline: "\ea1d";
+$fp-exclamation-triangle: "\ea1e";
+$fp-expand: "\ea1f";
+$fp-eye: "\ea20";
+$fp-fields-icon: "\ea21";
+$fp-flowgenie-outline: "\ea22";
+$fp-folder-outline: "\ea23";
+$fp-fullscreen: "\ea24";
+$fp-github: "\ea25";
+$fp-inbox: "\ea26";
+$fp-layout-icon: "\ea27";
+$fp-link-icon: "\ea28";
+$fp-map: "\ea29";
+$fp-minimize: "\ea2a";
+$fp-mobile: "\ea2b";
+$fp-pdf: "\ea2c";
+$fp-pen-edit: "\ea2d";
+$fp-play-outline: "\ea2e";
+$fp-plus-thin: "\ea2f";
+$fp-plus: "\ea30";
+$fp-pm-block: "\ea31";
+$fp-remove-outlined: "\ea32";
+$fp-screen-outline: "\ea33";
+$fp-script-outline: "\ea34";
+$fp-slack-notification: "\ea35";
+$fp-slack: "\ea36";
+$fp-slideshow: "\ea37";
+$fp-table: "\ea38";
+$fp-tachometer-alt-average: "\ea39";
+$fp-trash-blue: "\ea3a";
+$fp-trash: "\ea3b";
+$fp-unlink: "\ea3c";
+$fp-update-outline: "\ea3d";
diff --git a/resources/fonts/pm-font/processmaker-font.styl b/resources/fonts/pm-font/processmaker-font.styl
index 889600b9db..9d190be82b 100644
--- a/resources/fonts/pm-font/processmaker-font.styl
+++ b/resources/fonts/pm-font/processmaker-font.styl
@@ -1,10 +1,10 @@
@font-face {font-family: "processmaker-font";
- src: url('processmaker-font.eot?t=1747081178345'); /* IE9*/
- src: url('processmaker-font.eot?t=1747081178345#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url("processmaker-font.woff2?t=1747081178345") format("woff2"),
- url("processmaker-font.woff?t=1747081178345") format("woff"),
- url('processmaker-font.ttf?t=1747081178345') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
- url('processmaker-font.svg?t=1747081178345#processmaker-font') format('svg'); /* iOS 4.1- */
+ src: url('processmaker-font.eot?t=1770239064379'); /* IE9*/
+ src: url('processmaker-font.eot?t=1770239064379#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url("processmaker-font.woff2?t=1770239064379") format("woff2"),
+ url("processmaker-font.woff?t=1770239064379") format("woff"),
+ url('processmaker-font.ttf?t=1770239064379') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('processmaker-font.svg?t=1770239064379#processmaker-font') format('svg'); /* iOS 4.1- */
}
[class^="fp-"], [class*=" fp-"] {
@@ -35,41 +35,43 @@
.fp-bpmn-text-annotation:before { content: "\ea13"; }
.fp-brush-icon:before { content: "\ea14"; }
.fp-check-circle-blue:before { content: "\ea15"; }
-.fp-close:before { content: "\ea16"; }
-.fp-cloud-download-outline:before { content: "\ea17"; }
-.fp-connector-outline:before { content: "\ea18"; }
-.fp-copy-outline:before { content: "\ea19"; }
-.fp-copy:before { content: "\ea1a"; }
-.fp-desktop:before { content: "\ea1b"; }
-.fp-edit-outline:before { content: "\ea1c"; }
-.fp-expand:before { content: "\ea1d"; }
-.fp-eye:before { content: "\ea1e"; }
-.fp-fields-icon:before { content: "\ea1f"; }
-.fp-flowgenie-outline:before { content: "\ea20"; }
-.fp-folder-outline:before { content: "\ea21"; }
-.fp-fullscreen:before { content: "\ea22"; }
-.fp-github:before { content: "\ea23"; }
-.fp-inbox:before { content: "\ea24"; }
-.fp-layout-icon:before { content: "\ea25"; }
-.fp-link-icon:before { content: "\ea26"; }
-.fp-map:before { content: "\ea27"; }
-.fp-minimize:before { content: "\ea28"; }
-.fp-mobile:before { content: "\ea29"; }
-.fp-pdf:before { content: "\ea2a"; }
-.fp-pen-edit:before { content: "\ea2b"; }
-.fp-play-outline:before { content: "\ea2c"; }
-.fp-plus-thin:before { content: "\ea2d"; }
-.fp-plus:before { content: "\ea2e"; }
-.fp-pm-block:before { content: "\ea2f"; }
-.fp-remove-outlined:before { content: "\ea30"; }
-.fp-screen-outline:before { content: "\ea31"; }
-.fp-script-outline:before { content: "\ea32"; }
-.fp-slack-notification:before { content: "\ea33"; }
-.fp-slack:before { content: "\ea34"; }
-.fp-slideshow:before { content: "\ea35"; }
-.fp-table:before { content: "\ea36"; }
-.fp-tachometer-alt-average:before { content: "\ea37"; }
-.fp-trash-blue:before { content: "\ea38"; }
-.fp-trash:before { content: "\ea39"; }
-.fp-unlink:before { content: "\ea3a"; }
-.fp-update-outline:before { content: "\ea3b"; }
+.fp-check-circle-outline:before { content: "\ea16"; }
+.fp-close:before { content: "\ea17"; }
+.fp-cloud-download-outline:before { content: "\ea18"; }
+.fp-connector-outline:before { content: "\ea19"; }
+.fp-copy-outline:before { content: "\ea1a"; }
+.fp-copy:before { content: "\ea1b"; }
+.fp-desktop:before { content: "\ea1c"; }
+.fp-edit-outline:before { content: "\ea1d"; }
+.fp-exclamation-triangle:before { content: "\ea1e"; }
+.fp-expand:before { content: "\ea1f"; }
+.fp-eye:before { content: "\ea20"; }
+.fp-fields-icon:before { content: "\ea21"; }
+.fp-flowgenie-outline:before { content: "\ea22"; }
+.fp-folder-outline:before { content: "\ea23"; }
+.fp-fullscreen:before { content: "\ea24"; }
+.fp-github:before { content: "\ea25"; }
+.fp-inbox:before { content: "\ea26"; }
+.fp-layout-icon:before { content: "\ea27"; }
+.fp-link-icon:before { content: "\ea28"; }
+.fp-map:before { content: "\ea29"; }
+.fp-minimize:before { content: "\ea2a"; }
+.fp-mobile:before { content: "\ea2b"; }
+.fp-pdf:before { content: "\ea2c"; }
+.fp-pen-edit:before { content: "\ea2d"; }
+.fp-play-outline:before { content: "\ea2e"; }
+.fp-plus-thin:before { content: "\ea2f"; }
+.fp-plus:before { content: "\ea30"; }
+.fp-pm-block:before { content: "\ea31"; }
+.fp-remove-outlined:before { content: "\ea32"; }
+.fp-screen-outline:before { content: "\ea33"; }
+.fp-script-outline:before { content: "\ea34"; }
+.fp-slack-notification:before { content: "\ea35"; }
+.fp-slack:before { content: "\ea36"; }
+.fp-slideshow:before { content: "\ea37"; }
+.fp-table:before { content: "\ea38"; }
+.fp-tachometer-alt-average:before { content: "\ea39"; }
+.fp-trash-blue:before { content: "\ea3a"; }
+.fp-trash:before { content: "\ea3b"; }
+.fp-unlink:before { content: "\ea3c"; }
+.fp-update-outline:before { content: "\ea3d"; }
diff --git a/resources/fonts/pm-font/processmaker-font.svg b/resources/fonts/pm-font/processmaker-font.svg
index ed7d5af29f..cb0f0ad5f9 100644
--- a/resources/fonts/pm-font/processmaker-font.svg
+++ b/resources/fonts/pm-font/processmaker-font.svg
@@ -70,119 +70,125 @@
{{ __('Each case in this process is retained from the moment it is created for the period defined in this section.')}}
+{{ __('After this period expires, the case is automatically and ') }}{{ __('permanently deleted') }}{{ __(', regardless of its status. This deletion includes all files and all data associated with the case and cannot be undone.') }}
+{{ __('Retention periods over one year must be handled by Technical Support. Please contact Technical Support for assistance.')}}
++ {{ __('If you reduce the current retention period, cases older than the new period will be ') }}{{ __('permanently deleted') }}{{ __('. Only cases that meet the new retention period will be kept.') }} +
+ +{{ __('Cases older than the retention period will be automatically deleted during the previously set retention time.') }}
+ + +