Skip to main content
Solved

Auto-Generate a report to generate the "Result Key" IFS24 R2


ZTC ZTC JGOTA
Hero (Customer)
Forum|alt.badge.img+14

Hello Community,

 

I hope you are all doing well.

 

I am currently working on an Event Action that sends an email and would like to include a report—specifically the "NCR Report"—as an attachment. I have already configured the logic for the Event Action, but I need to automate the generation of the report so it gets archived in the Archive Report page, thereby creating a Result Key. fyi. I do not need to generate the email attachment via PDF_REPORT_CREATED , because I need to generate the report via code to be able to archive or create the Result Key.

My main question is: how can I programmatically generate this report and have it archived in the Archive Report page to obtain the Result Key? Are there any code examples or APIs I can use for this purpose?

Additionally, I’m trying to trace the internal calls in IFS Cloud 24R2 but haven’t been able to identify the specific API responsible for this. I’ve tried using the inspection tools, but the report execution doesn’t seem to show a clear API call.

Any insights, examples, or guidance would be greatly appreciated!

 

 

Best answer by SimonTestard

@dsj on the ball as usual.

 

Here’s a bit of extra I currently employ if you want to use the same block to create the PDF file in the report document archive as well, rather than just the result set.

 

This is a generic procedure I created that can take up to 20 Parameters (9 in the NCR Report Above for instance), although it does require providing the language_code and layout_name (obviously it could also be modified to grab the default values for lang_code and layout_name if none are provided in the attribute).

 

It outputs the result key and the print job id, so that the call handler can then manipulate the report document archive entry based on those keys.

 

1PROCEDURE report_new_instance_and_print(attr_ in varchar2, result_key_out_ out number, print_job_id_out_ out number) IS
2
3 result_key_ NUMBER;
4 job_attr_ VARCHAR2(2000);
5 job_contents_attr_ VARCHAR2(2000);
6 print_job_id_ VARCHAR2(25);
7 instance_attr_ VARCHAR2(32000);
8
9 real_report_attr_ varchar2(4000);
10 real_parameter_attr_ varchar2(4000);
11
12 language_code_ varchar2(3) := client_sys.get_item_value('LANGUAGE_CODE',
13 attr_);
14 layout_name_ varchar2(4000) := client_sys.get_item_value('LAYOUT_NAME',
15 attr_);
16
17 report_param_ varchar2(4000) := client_sys.get_item_value('REPORT_PARAM',
18 attr_);
19 report_param_value_ varchar2(4000) := client_sys.get_item_value('REPORT_PARAM_VALUE',
20 attr_);
21
22 param_1_ varchar2(4000) := client_sys.get_item_value('PARAM_1',
23 attr_);
24 param_1_value_ varchar2(4000) := client_sys.get_item_value('PARAM_1_VALUE',
25 attr_);
26
27 param_2_ varchar2(4000) := client_sys.get_item_value('PARAM_2',
28 attr_);
29 param_2_value_ varchar2(4000) := client_sys.get_item_value('PARAM_2_VALUE',
30 attr_);
31
32 param_3_ varchar2(4000) := client_sys.get_item_value('PARAM_3',
33 attr_);
34 param_3_value_ varchar2(4000) := client_sys.get_item_value('PARAM_3_VALUE',
35 attr_);
36
37 param_4_ varchar2(4000) := client_sys.get_item_value('PARAM_4',
38 attr_);
39 param_4_value_ varchar2(4000) := client_sys.get_item_value('PARAM_4_VALUE',
40 attr_);
41
42 param_5_ varchar2(4000) := client_sys.get_item_value('PARAM_5',
43 attr_);
44 param_5_value_ varchar2(4000) := client_sys.get_item_value('PARAM_5_VALUE',
45 attr_);
46
47 param_6_ varchar2(4000) := client_sys.get_item_value('PARAM_6',
48 attr_);
49 param_6_value_ varchar2(4000) := client_sys.get_item_value('PARAM_6_VALUE',
50 attr_);
51
52 param_7_ varchar2(4000) := client_sys.get_item_value('PARAM_7',
53 attr_);
54 param_7_value_ varchar2(4000) := client_sys.get_item_value('PARAM_7_VALUE',
55 attr_);
56
57 param_8_ varchar2(4000) := client_sys.get_item_value('PARAM_8',
58 attr_);
59 param_8_value_ varchar2(4000) := client_sys.get_item_value('PARAM_8_VALUE',
60 attr_);
61
62 param_9_ varchar2(4000) := client_sys.get_item_value('PARAM_9',
63 attr_);
64 param_9_value_ varchar2(4000) := client_sys.get_item_value('PARAM_9_VALUE',
65 attr_);
66
67 param_10_ varchar2(4000) := client_sys.get_item_value('PARAM_10',
68 attr_);
69 param_10_value_ varchar2(4000) := client_sys.get_item_value('PARAM_10_VALUE',
70 attr_);
71
72 param_11_ varchar2(4000) := client_sys.get_item_value('PARAM_11',
73 attr_);
74 param_11_value_ varchar2(4000) := client_sys.get_item_value('PARAM_11_VALUE',
75 attr_);
76 param_12_ varchar2(4000) := client_sys.get_item_value('PARAM_12',
77 attr_);
78 param_12_value_ varchar2(4000) := client_sys.get_item_value('PARAM_12_VALUE',
79 attr_);
80 param_13_ varchar2(4000) := client_sys.get_item_value('PARAM_13',
81 attr_);
82 param_13_value_ varchar2(4000) := client_sys.get_item_value('PARAM_13_VALUE',
83 attr_);
84 param_14_ varchar2(4000) := client_sys.get_item_value('PARAM_14',
85 attr_);
86 param_14_value_ varchar2(4000) := client_sys.get_item_value('PARAM_14_VALUE',
87 attr_);
88 param_15_ varchar2(4000) := client_sys.get_item_value('PARAM_15',
89 attr_);
90 param_15_value_ varchar2(4000) := client_sys.get_item_value('PARAM_15_VALUE',
91 attr_);
92 param_16_ varchar2(4000) := client_sys.get_item_value('PARAM_16',
93 attr_);
94 param_16_value_ varchar2(4000) := client_sys.get_item_value('PARAM_16_VALUE',
95 attr_);
96 param_17_ varchar2(4000) := client_sys.get_item_value('PARAM_17',
97 attr_);
98 param_17_value_ varchar2(4000) := client_sys.get_item_value('PARAM_17_VALUE',
99 attr_);
100 param_18_ varchar2(4000) := client_sys.get_item_value('PARAM_18',
101 attr_);
102 param_18_value_ varchar2(4000) := client_sys.get_item_value('PARAM_18_VALUE',
103 attr_);
104 param_19_ varchar2(4000) := client_sys.get_item_value('PARAM_19',
105 attr_);
106 param_19_value_ varchar2(4000) := client_sys.get_item_value('PARAM_19_VALUE',
107 attr_);
108 param_20_ varchar2(4000) := client_sys.get_item_value('PARAM_20',
109 attr_);
110 param_20_value_ varchar2(4000) := client_sys.get_item_value('PARAM_20_VALUE',
111 attr_);
112 begin
113
114 -- Create Report Attr
115 client_sys.clear_attr(real_report_attr_);
116
117 if report_param_ is null or report_param_value_ is null then
118 -- Procedure not called properly, no report parameter such as report ID provided, exit procedure
119 RETURN;
120 END IF;
121
122 client_sys.add_to_attr(report_param_,
123 report_param_value_,
124 real_report_attr_);
125
126 -- Create Report Parameters Attr
127 client_sys.clear_attr(real_parameter_attr_);
128 IF param_1_ is not null then
129 client_sys.add_to_attr(param_1_,
130 nvl(param_1_value_, ''),
131 real_parameter_attr_);
132 end if;
133
134 IF param_2_ is not null then
135 client_sys.add_to_attr(param_2_,
136 nvl(param_2_value_, ''),
137 real_parameter_attr_);
138 end if;
139
140 IF param_3_ is not null then
141 client_sys.add_to_attr(param_3_,
142 nvl(param_3_value_, ''),
143 real_parameter_attr_);
144 end if;
145
146 IF param_4_ is not null then
147 client_sys.add_to_attr(param_4_,
148 nvl(param_4_value_, ''),
149 real_parameter_attr_);
150 end if;
151
152 IF param_5_ is not null then
153 client_sys.add_to_attr(param_5_,
154 nvl(param_5_value_, ''),
155 real_parameter_attr_);
156 end if;
157
158 if param_6_ is not null then
159 client_sys.add_to_attr(param_6_,
160 nvl(param_6_value_, ''),
161 real_parameter_attr_);
162 end if;
163
164 IF param_7_ is not null then
165 client_sys.add_to_attr(param_7_,
166 nvl(param_7_value_, ''),
167 real_parameter_attr_);
168 end if;
169
170 IF param_8_ is not null then
171 client_sys.add_to_attr(param_8_,
172 nvl(param_8_value_, ''),
173 real_parameter_attr_);
174 end if;
175
176 IF param_9_ is not null then
177 client_sys.add_to_attr(param_9_,
178 nvl(param_9_value_, ''),
179 real_parameter_attr_);
180 end if;
181
182 IF param_10_ is not null then
183 client_sys.add_to_attr(param_10_,
184 nvl(param_10_value_, ''),
185 real_parameter_attr_);
186 end if;
187
188 IF param_11_ is not null then
189 client_sys.add_to_attr(param_11_,
190 nvl(param_11_value_, ''),
191 real_parameter_attr_);
192 end if;
193
194 IF param_12_ is not null then
195 client_sys.add_to_attr(param_12_,
196 nvl(param_12_value_, ''),
197 real_parameter_attr_);
198 end if;
199
200 IF param_13_ is not null then
201 client_sys.add_to_attr(param_13_,
202 nvl(param_13_value_, ''),
203 real_parameter_attr_);
204 end if;
205
206 IF param_14_ is not null then
207 client_sys.add_to_attr(param_14_,
208 nvl(param_14_value_, ''),
209 real_parameter_attr_);
210 end if;
211
212 IF param_15_ is not null then
213 client_sys.add_to_attr(param_15_,
214 nvl(param_15_value_, ''),
215 real_parameter_attr_);
216 end if;
217
218 IF param_16_ is not null then
219 client_sys.add_to_attr(param_16_,
220 nvl(param_16_value_, ''),
221 real_parameter_attr_);
222 end if;
223
224 IF param_17_ is not null then
225 client_sys.add_to_attr(param_17_,
226 nvl(param_17_value_, ''),
227 real_parameter_attr_);
228 end if;
229
230 IF param_18_ is not null then
231 client_sys.add_to_attr(param_18_,
232 nvl(param_18_value_, ''),
233 real_parameter_attr_);
234 end if;
235
236 IF param_19_ is not null then
237 client_sys.add_to_attr(param_19_,
238 nvl(param_19_value_, ''),
239 real_parameter_attr_);
240 end if;
241
242 IF param_20_ is not null then
243 client_sys.add_to_attr(param_20_,
244 nvl(param_20_value_, ''),
245 real_parameter_attr_);
246 end if;
247
248 -- Create new archive instance to obtain result_key
249 Archive_API.New_Instance(result_key_,
250 real_report_attr_,
251 real_parameter_attr_);
252
253 Client_SYS.Clear_Attr(instance_attr_);
254 Client_SYS.Clear_Attr(real_parameter_attr_);
255 Archive_API.Get_Info(instance_attr_, real_parameter_attr_, result_key_);
256
257 Client_SYS.Clear_Attr(job_attr_);
258 Client_SYS.Clear_Attr(job_contents_attr_);
259 Client_SYS.Add_To_Attr('RESULT_KEY', result_key_, job_contents_attr_);
260
261 -- Grab language code and layout
262 Client_SYS.Add_To_Attr('LANG_CODE', language_code_, job_contents_attr_);
263
264 Client_SYS.Add_To_Attr('LAYOUT_NAME', layout_name_, job_contents_attr_);
265
266 -- Setup new PrintJob with Result Key obtained above. job_attr is left null to avoid a physical print happening
267 Print_Job_API.New_Print_Job(print_job_id_,
268 job_attr_,
269 job_contents_attr_);
270
271 -- Execute Print Job to create PDF File
272 Print_Job_API.Print(print_job_id_);
273
274 print_job_id_out_ := print_job_id_;
275 result_key_out_ := result_key_;
276
277END report_new_instance_and_print;

 

View original
Did this topic help you find an answer to your question?

3 replies

dsj
Ultimate Hero (Partner)
Forum|alt.badge.img+22
  • Ultimate Hero (Partner)
  • 896 replies
  • June 12, 2025

Hi ​@ZTC ZTC JGOTA 

Here is a sample code for creating an archive record for NCR Report

1Declare
2
3 report_attr_ VARCHAR2(2000);
4 result_key_ NUMBER;
5 printer_id_ VARCHAR2(100);
6 parameter_attr_ VARCHAR2(2000);
7
8BEGIN
9 Client_SYS.Clear_Attr(report_attr_);
10 Client_SYS.Add_To_Attr('REPORT_ID', 'NCR_REP', report_attr_);
11
12 Client_SYS.Clear_Attr(parameter_attr_);
13 -- Add the report parameters
14 Client_SYS.Add_To_Attr('PARAM1', 'VALUE1', parameter_attr_);
15 Client_SYS.Add_To_Attr('PARAM2', 'VALUE2', parameter_attr_);
16
17 Archive_API.New_Instance(result_key_, report_attr_, parameter_attr_);
18END;

Report parameters can be found using this query

select column_name parameter, column_value default_value
from report_column_definition
where report_id = 'NCR_REP'
and column_query is not null

 

Hope it helps!

Damith


Forum|alt.badge.img+12
  • Hero (Customer)
  • 335 replies
  • Answer
  • June 16, 2025

@dsj on the ball as usual.

 

Here’s a bit of extra I currently employ if you want to use the same block to create the PDF file in the report document archive as well, rather than just the result set.

 

This is a generic procedure I created that can take up to 20 Parameters (9 in the NCR Report Above for instance), although it does require providing the language_code and layout_name (obviously it could also be modified to grab the default values for lang_code and layout_name if none are provided in the attribute).

 

It outputs the result key and the print job id, so that the call handler can then manipulate the report document archive entry based on those keys.

 

1PROCEDURE report_new_instance_and_print(attr_ in varchar2, result_key_out_ out number, print_job_id_out_ out number) IS
2
3 result_key_ NUMBER;
4 job_attr_ VARCHAR2(2000);
5 job_contents_attr_ VARCHAR2(2000);
6 print_job_id_ VARCHAR2(25);
7 instance_attr_ VARCHAR2(32000);
8
9 real_report_attr_ varchar2(4000);
10 real_parameter_attr_ varchar2(4000);
11
12 language_code_ varchar2(3) := client_sys.get_item_value('LANGUAGE_CODE',
13 attr_);
14 layout_name_ varchar2(4000) := client_sys.get_item_value('LAYOUT_NAME',
15 attr_);
16
17 report_param_ varchar2(4000) := client_sys.get_item_value('REPORT_PARAM',
18 attr_);
19 report_param_value_ varchar2(4000) := client_sys.get_item_value('REPORT_PARAM_VALUE',
20 attr_);
21
22 param_1_ varchar2(4000) := client_sys.get_item_value('PARAM_1',
23 attr_);
24 param_1_value_ varchar2(4000) := client_sys.get_item_value('PARAM_1_VALUE',
25 attr_);
26
27 param_2_ varchar2(4000) := client_sys.get_item_value('PARAM_2',
28 attr_);
29 param_2_value_ varchar2(4000) := client_sys.get_item_value('PARAM_2_VALUE',
30 attr_);
31
32 param_3_ varchar2(4000) := client_sys.get_item_value('PARAM_3',
33 attr_);
34 param_3_value_ varchar2(4000) := client_sys.get_item_value('PARAM_3_VALUE',
35 attr_);
36
37 param_4_ varchar2(4000) := client_sys.get_item_value('PARAM_4',
38 attr_);
39 param_4_value_ varchar2(4000) := client_sys.get_item_value('PARAM_4_VALUE',
40 attr_);
41
42 param_5_ varchar2(4000) := client_sys.get_item_value('PARAM_5',
43 attr_);
44 param_5_value_ varchar2(4000) := client_sys.get_item_value('PARAM_5_VALUE',
45 attr_);
46
47 param_6_ varchar2(4000) := client_sys.get_item_value('PARAM_6',
48 attr_);
49 param_6_value_ varchar2(4000) := client_sys.get_item_value('PARAM_6_VALUE',
50 attr_);
51
52 param_7_ varchar2(4000) := client_sys.get_item_value('PARAM_7',
53 attr_);
54 param_7_value_ varchar2(4000) := client_sys.get_item_value('PARAM_7_VALUE',
55 attr_);
56
57 param_8_ varchar2(4000) := client_sys.get_item_value('PARAM_8',
58 attr_);
59 param_8_value_ varchar2(4000) := client_sys.get_item_value('PARAM_8_VALUE',
60 attr_);
61
62 param_9_ varchar2(4000) := client_sys.get_item_value('PARAM_9',
63 attr_);
64 param_9_value_ varchar2(4000) := client_sys.get_item_value('PARAM_9_VALUE',
65 attr_);
66
67 param_10_ varchar2(4000) := client_sys.get_item_value('PARAM_10',
68 attr_);
69 param_10_value_ varchar2(4000) := client_sys.get_item_value('PARAM_10_VALUE',
70 attr_);
71
72 param_11_ varchar2(4000) := client_sys.get_item_value('PARAM_11',
73 attr_);
74 param_11_value_ varchar2(4000) := client_sys.get_item_value('PARAM_11_VALUE',
75 attr_);
76 param_12_ varchar2(4000) := client_sys.get_item_value('PARAM_12',
77 attr_);
78 param_12_value_ varchar2(4000) := client_sys.get_item_value('PARAM_12_VALUE',
79 attr_);
80 param_13_ varchar2(4000) := client_sys.get_item_value('PARAM_13',
81 attr_);
82 param_13_value_ varchar2(4000) := client_sys.get_item_value('PARAM_13_VALUE',
83 attr_);
84 param_14_ varchar2(4000) := client_sys.get_item_value('PARAM_14',
85 attr_);
86 param_14_value_ varchar2(4000) := client_sys.get_item_value('PARAM_14_VALUE',
87 attr_);
88 param_15_ varchar2(4000) := client_sys.get_item_value('PARAM_15',
89 attr_);
90 param_15_value_ varchar2(4000) := client_sys.get_item_value('PARAM_15_VALUE',
91 attr_);
92 param_16_ varchar2(4000) := client_sys.get_item_value('PARAM_16',
93 attr_);
94 param_16_value_ varchar2(4000) := client_sys.get_item_value('PARAM_16_VALUE',
95 attr_);
96 param_17_ varchar2(4000) := client_sys.get_item_value('PARAM_17',
97 attr_);
98 param_17_value_ varchar2(4000) := client_sys.get_item_value('PARAM_17_VALUE',
99 attr_);
100 param_18_ varchar2(4000) := client_sys.get_item_value('PARAM_18',
101 attr_);
102 param_18_value_ varchar2(4000) := client_sys.get_item_value('PARAM_18_VALUE',
103 attr_);
104 param_19_ varchar2(4000) := client_sys.get_item_value('PARAM_19',
105 attr_);
106 param_19_value_ varchar2(4000) := client_sys.get_item_value('PARAM_19_VALUE',
107 attr_);
108 param_20_ varchar2(4000) := client_sys.get_item_value('PARAM_20',
109 attr_);
110 param_20_value_ varchar2(4000) := client_sys.get_item_value('PARAM_20_VALUE',
111 attr_);
112 begin
113
114 -- Create Report Attr
115 client_sys.clear_attr(real_report_attr_);
116
117 if report_param_ is null or report_param_value_ is null then
118 -- Procedure not called properly, no report parameter such as report ID provided, exit procedure
119 RETURN;
120 END IF;
121
122 client_sys.add_to_attr(report_param_,
123 report_param_value_,
124 real_report_attr_);
125
126 -- Create Report Parameters Attr
127 client_sys.clear_attr(real_parameter_attr_);
128 IF param_1_ is not null then
129 client_sys.add_to_attr(param_1_,
130 nvl(param_1_value_, ''),
131 real_parameter_attr_);
132 end if;
133
134 IF param_2_ is not null then
135 client_sys.add_to_attr(param_2_,
136 nvl(param_2_value_, ''),
137 real_parameter_attr_);
138 end if;
139
140 IF param_3_ is not null then
141 client_sys.add_to_attr(param_3_,
142 nvl(param_3_value_, ''),
143 real_parameter_attr_);
144 end if;
145
146 IF param_4_ is not null then
147 client_sys.add_to_attr(param_4_,
148 nvl(param_4_value_, ''),
149 real_parameter_attr_);
150 end if;
151
152 IF param_5_ is not null then
153 client_sys.add_to_attr(param_5_,
154 nvl(param_5_value_, ''),
155 real_parameter_attr_);
156 end if;
157
158 if param_6_ is not null then
159 client_sys.add_to_attr(param_6_,
160 nvl(param_6_value_, ''),
161 real_parameter_attr_);
162 end if;
163
164 IF param_7_ is not null then
165 client_sys.add_to_attr(param_7_,
166 nvl(param_7_value_, ''),
167 real_parameter_attr_);
168 end if;
169
170 IF param_8_ is not null then
171 client_sys.add_to_attr(param_8_,
172 nvl(param_8_value_, ''),
173 real_parameter_attr_);
174 end if;
175
176 IF param_9_ is not null then
177 client_sys.add_to_attr(param_9_,
178 nvl(param_9_value_, ''),
179 real_parameter_attr_);
180 end if;
181
182 IF param_10_ is not null then
183 client_sys.add_to_attr(param_10_,
184 nvl(param_10_value_, ''),
185 real_parameter_attr_);
186 end if;
187
188 IF param_11_ is not null then
189 client_sys.add_to_attr(param_11_,
190 nvl(param_11_value_, ''),
191 real_parameter_attr_);
192 end if;
193
194 IF param_12_ is not null then
195 client_sys.add_to_attr(param_12_,
196 nvl(param_12_value_, ''),
197 real_parameter_attr_);
198 end if;
199
200 IF param_13_ is not null then
201 client_sys.add_to_attr(param_13_,
202 nvl(param_13_value_, ''),
203 real_parameter_attr_);
204 end if;
205
206 IF param_14_ is not null then
207 client_sys.add_to_attr(param_14_,
208 nvl(param_14_value_, ''),
209 real_parameter_attr_);
210 end if;
211
212 IF param_15_ is not null then
213 client_sys.add_to_attr(param_15_,
214 nvl(param_15_value_, ''),
215 real_parameter_attr_);
216 end if;
217
218 IF param_16_ is not null then
219 client_sys.add_to_attr(param_16_,
220 nvl(param_16_value_, ''),
221 real_parameter_attr_);
222 end if;
223
224 IF param_17_ is not null then
225 client_sys.add_to_attr(param_17_,
226 nvl(param_17_value_, ''),
227 real_parameter_attr_);
228 end if;
229
230 IF param_18_ is not null then
231 client_sys.add_to_attr(param_18_,
232 nvl(param_18_value_, ''),
233 real_parameter_attr_);
234 end if;
235
236 IF param_19_ is not null then
237 client_sys.add_to_attr(param_19_,
238 nvl(param_19_value_, ''),
239 real_parameter_attr_);
240 end if;
241
242 IF param_20_ is not null then
243 client_sys.add_to_attr(param_20_,
244 nvl(param_20_value_, ''),
245 real_parameter_attr_);
246 end if;
247
248 -- Create new archive instance to obtain result_key
249 Archive_API.New_Instance(result_key_,
250 real_report_attr_,
251 real_parameter_attr_);
252
253 Client_SYS.Clear_Attr(instance_attr_);
254 Client_SYS.Clear_Attr(real_parameter_attr_);
255 Archive_API.Get_Info(instance_attr_, real_parameter_attr_, result_key_);
256
257 Client_SYS.Clear_Attr(job_attr_);
258 Client_SYS.Clear_Attr(job_contents_attr_);
259 Client_SYS.Add_To_Attr('RESULT_KEY', result_key_, job_contents_attr_);
260
261 -- Grab language code and layout
262 Client_SYS.Add_To_Attr('LANG_CODE', language_code_, job_contents_attr_);
263
264 Client_SYS.Add_To_Attr('LAYOUT_NAME', layout_name_, job_contents_attr_);
265
266 -- Setup new PrintJob with Result Key obtained above. job_attr is left null to avoid a physical print happening
267 Print_Job_API.New_Print_Job(print_job_id_,
268 job_attr_,
269 job_contents_attr_);
270
271 -- Execute Print Job to create PDF File
272 Print_Job_API.Print(print_job_id_);
273
274 print_job_id_out_ := print_job_id_;
275 result_key_out_ := result_key_;
276
277END report_new_instance_and_print;

 


dsj
Ultimate Hero (Partner)
Forum|alt.badge.img+22
  • Ultimate Hero (Partner)
  • 896 replies
  • June 16, 2025

@SimonTestard  this is awesome 😎 Thanks for sharing.


Reply


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings