1414from rest_framework .exceptions import ValidationError
1515
1616from poms .accounts .models import Account
17+ from poms .clients .models import Client
1718from poms .common .utils import date_now , format_float , format_float_to_2
1819from poms .counterparties .models import Counterparty , Responsible
1920from poms .currencies .models import Currency
4647 TransactionType ,
4748 TransactionTypeInput ,
4849)
49- from poms .transactions .utils import generate_user_fields
50+ from poms .transactions .utils import _read_json_text , generate_user_fields
5051from poms .users .models import EcosystemDefault
52+ from poms .vault .models import VaultRecord
5153
5254_l = logging .getLogger ("poms.transactions" )
5355
@@ -164,6 +166,9 @@ def __init__( # noqa: PLR0913, PLR0915
164166 if complex_transaction and not complex_transaction_status :
165167 self .complex_transaction_status = complex_transaction .status_id
166168
169+ if self .clear_execution_log :
170+ self .complex_transaction .execution_log = ""
171+
167172 self ._context = context
168173 self ._context ["transaction_type" ] = self .transaction_type
169174 self ._id_seq = 0
@@ -178,9 +183,6 @@ def __init__( # noqa: PLR0913, PLR0915
178183 for i in range (10 ):
179184 self .values [f"phantom_instrument_{ i } " ] = None
180185
181- if self .clear_execution_log :
182- self .complex_transaction .execution_log = ""
183-
184186 self .complex_transaction .owner = self .member
185187 # self.complex_transaction.save() # it will create empty transaction in db!
186188
@@ -267,6 +269,10 @@ def _get_val_by_model_cls_for_transaction_type_input(master_user, value, model_c
267269 return EventClass .objects .get (user_code = value )
268270 elif issubclass (model_class , NotificationClass ):
269271 return NotificationClass .objects .get (user_code = value )
272+ elif issubclass (model_class , Client ):
273+ return Client .objects .get (user_code = value )
274+ elif issubclass (model_class , VaultRecord ):
275+ return VaultRecord .objects .get (user_code = value )
270276 except Exception :
271277 _l .debug (f"Could not find default value relation { value } " )
272278 return None
@@ -305,6 +311,10 @@ def _get_val_by_model_cls_for_complex_transaction_input(master_user, obj, model_
305311 return EventClass .objects .get (user_code = obj .value_relation )
306312 elif issubclass (model_class , NotificationClass ):
307313 return NotificationClass .objects .get (user_code = obj .value_relation )
314+ elif issubclass (model_class , Client ):
315+ return Client .objects .get (user_code = obj .value_relation )
316+ elif issubclass (model_class , VaultRecord ):
317+ return VaultRecord .objects .get (user_code = obj .value_relation )
308318 except Exception :
309319 _l .error (f"Could not find default value relation { obj .value_relation } " )
310320 return None
@@ -340,6 +350,9 @@ def _get_val_by_model_cls_for_complex_transaction_input(master_user, obj, model_
340350 TransactionTypeInput .SELECTOR ,
341351 ):
342352 value = ci .value_string
353+ elif i .value_type == TransactionTypeInput .JSON :
354+ value = _read_json_text (ci .value_string )
355+ _l .info ("JSON read: %r type=%s" , value , type (value ).__name__ if value is not None else None )
343356 elif i .value_type == TransactionTypeInput .NUMBER :
344357 value = ci .value_float
345358 elif i .value_type == TransactionTypeInput .DATE :
@@ -353,7 +366,7 @@ def _get_val_by_model_cls_for_complex_transaction_input(master_user, obj, model_
353366 if value is not None :
354367 self .values [i .name ] = value
355368
356- # _l.debug('self.inputs %s' % self.inputs )
369+ # _l.debug('before self.values %s' % self.values )
357370
358371 self .record_execution_progress ("==== COMPLEX TRANSACTION VALUES ====" , self .values )
359372
@@ -416,6 +429,8 @@ def _get_val_by_model_cls_for_complex_transaction_input(master_user, obj, model_
416429
417430 self .record_execution_progress ("==== CALCULATED INPUTS ====" )
418431
432+ # _l.info("check values %s" % self.values)
433+
419434 for key , value in self .values .items ():
420435 self .record_execution_progress (f"Key: { key } . Value: { value } . Type: { type (self .values [key ]).__name__ } " )
421436
@@ -2215,13 +2230,26 @@ def _save_inputs(self):
22152230 ci .complex_transaction = self .complex_transaction
22162231 ci .transaction_type_input = ti
22172232
2218- if ti .value_type in (
2219- TransactionTypeInput .STRING ,
2220- TransactionTypeInput .SELECTOR ,
2221- ):
2233+ if ti .value_type in (TransactionTypeInput .STRING , TransactionTypeInput .SELECTOR ):
22222234 if val is None :
22232235 val = ""
22242236 ci .value_string = val
2237+ elif ti .value_type == TransactionTypeInput .JSON :
2238+ # val may be dict/list OR already a JSON string
2239+ if val is None :
2240+ ci .value_string = ""
2241+ elif isinstance (val , dict ):
2242+ ci .value_string = json .dumps (val , ensure_ascii = False , separators = ("," , ":" ))
2243+ elif isinstance (val , str ):
2244+ # keep if it is valid JSON; else wrap it as JSON string
2245+ try :
2246+ json .loads (val )
2247+ ci .value_string = val
2248+ except json .JSONDecodeError :
2249+ ci .value_string = json .dumps (val , ensure_ascii = False )
2250+ else :
2251+ # numbers, bools, etc. -> store valid JSON
2252+ ci .value_string = json .dumps (val , ensure_ascii = False )
22252253 elif ti .value_type == TransactionTypeInput .NUMBER :
22262254 if val is None :
22272255 val = 0.0
@@ -2249,9 +2277,21 @@ def execute_user_fields_expressions(self):
22492277 "transactions" : trns ,
22502278 }
22512279
2280+ # do not remove, somehow json inputs are always strings, which leads to impossiblity to address by keys
2281+ for i in self .inputs :
2282+ if i .value_type == TransactionTypeInput .JSON :
2283+ val = self .values .get (i .name )
2284+ if isinstance (val , str ):
2285+ try :
2286+ self .values [i .name ] = json .loads (val )
2287+ except json .JSONDecodeError :
2288+ _l .error ("execute_user_fields_expressions decode error" )
2289+
22522290 for key , value in self .values .items ():
22532291 names [key ] = value
22542292
2293+ # _l.info('before names %s' % names)
2294+
22552295 self .record_execution_progress ("Calculating User Fields" )
22562296
22572297 _result_for_log = {}
0 commit comments