Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
slapos.core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Romain Courteaud
slapos.core
Commits
40fa9ff0
Commit
40fa9ff0
authored
Dec 29, 2020
by
Rafael Monnerat
Browse files
Options
Browse Files
Download
Plain Diff
Payzen rest
See merge request
nexedi/slapos.core!274
parents
eb35deda
79de2138
Changes
10
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
306 additions
and
288 deletions
+306
-288
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/PayzenEvent_isPaymentExpired.py
...ortal_skins/slapos_payzen/PayzenEvent_isPaymentExpired.py
+7
-0
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/PayzenEvent_isPaymentExpired.xml
...rtal_skins/slapos_payzen/PayzenEvent_isPaymentExpired.xml
+2
-2
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/PayzenEvent_processUpdate.py
...m/portal_skins/slapos_payzen/PayzenEvent_processUpdate.py
+79
-88
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/PayzenEvent_processUpdate.xml
.../portal_skins/slapos_payzen/PayzenEvent_processUpdate.xml
+9
-1
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenSkins.py
...Item/portal_components/test.erp5.testSlapOSPayzenSkins.py
+189
-73
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenWorkflow.py
...m/portal_components/test.erp5.testSlapOSPayzenWorkflow.py
+15
-14
master/bt5/slapos_payzen/WorkflowTemplateItem/portal_workflow/payzen_interface_workflow/scripts/PayzenEvent_generateNavigationPage.py
...ce_workflow/scripts/PayzenEvent_generateNavigationPage.py
+1
-0
master/bt5/slapos_payzen/WorkflowTemplateItem/portal_workflow/payzen_interface_workflow/scripts/PayzenEvent_registerPayzen.py
..._interface_workflow/scripts/PayzenEvent_registerPayzen.py
+0
-44
master/bt5/slapos_payzen/WorkflowTemplateItem/portal_workflow/payzen_interface_workflow/scripts/PayzenEvent_updateStatus.py
...en_interface_workflow/scripts/PayzenEvent_updateStatus.py
+4
-4
master/bt5/slapos_payzen/WorkflowTemplateItem/portal_workflow/payzen_interface_workflow/transitions/register_payzen.xml
...payzen_interface_workflow/transitions/register_payzen.xml
+0
-62
No files found.
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/PayzenEvent_isPaymentExpired.py
0 → 100644
View file @
40fa9ff0
"""
This script was introduced for backward compatibility on migration and for
introduce custom delays on what configures the expiration dates.
"""
from
DateTime
import
DateTime
return
int
(
DateTime
())
-
int
(
transaction_date
)
>
86400
master/bt5/slapos_payzen/
WorkflowTemplateItem/portal_workflow/payzen_interface_workflow/scripts/PayzenEvent_registerPayzen
.xml
→
master/bt5/slapos_payzen/
SkinTemplateItem/portal_skins/slapos_payzen/PayzenEvent_isPaymentExpired
.xml
View file @
40fa9ff0
...
...
@@ -50,11 +50,11 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
state_chang
e
</string>
</value>
<value>
<string>
transaction_dat
e
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
PayzenEvent_
registerPayzen
</string>
</value>
<value>
<string>
PayzenEvent_
isPaymentExpired
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/PayzenEvent_processUpdate.py
View file @
40fa9ff0
...
...
@@ -13,75 +13,70 @@ transaction = payzen_event.getDestinationValue()
if
transaction
is
None
:
raise
ValueError
(
"Unable to find related transaction"
)
assert
signature
in
(
True
,
False
)
if
signature
is
False
:
# signature is wrong, bye bye
payzen_event
.
confirm
(
comment
=
'Signature does not match'
)
return
isTransitionPossible
=
context
.
getPortalObject
().
portal_workflow
.
isTransitionPossible
error_code
=
data_kw
[
'errorCode'
]
if
error_code
==
'2'
:
transaction_date
,
_
=
transaction
.
PaymentTransaction_getPayzenId
()
status
=
data_kw
[
'status'
]
answer
=
data_kw
[
'answer'
]
if
status
!=
"SUCCESS"
:
error_code
=
answer
[
"error_code"
]
if
error_code
==
"PSP_010"
:
# Transaction Not Found
# Mark on payment transaction history log that transaction was not processed yet
transaction_date
,
_
=
transaction
.
PaymentTransaction_getPayzenId
()
payzen_event
.
confirm
()
payzen_event
.
acknowledge
(
comment
=
'Transaction not found on payzen side.'
)
if
int
(
DateTime
())
-
int
(
transaction_date
)
>
86400
:
if
context
.
PayzenEvent_isPaymentExpired
(
transaction_date
):
if
isTransitionPossible
(
transaction
,
'cancel'
):
transaction
.
cancel
(
comment
=
'Aborting unknown payzen payment.'
)
else
:
storeWorkflowComment
(
transaction
,
'Error code 2 (Not found) did not changed the document state.'
)
'Error code PSP_010 (Not found) did not changed the document state.'
)
return
else
:
# Unknown errorCode
payzen_event
.
confirm
(
comment
=
'Unknown errorCode %r'
%
error_code
)
return
elif
error_code
==
'0'
:
transaction_code_mapping
=
{
'0'
:
'Initial (being treated)'
,
'1'
:
'To be validated '
,
'2'
:
'To be forced - Contact issuer'
,
'3'
:
'To be validated and authorized'
,
'4'
:
'Waiting for submission'
,
'5'
:
'Waiting for authorization'
,
'6'
:
'Submitted'
,
'7'
:
'Expired'
,
'8'
:
'Refused'
,
'9'
:
'Cancelled'
,
'10'
:
'Waiting'
,
'11'
:
'Being submitted'
,
'12'
:
'Being authorized'
,
'13'
:
'Failed'
,
}
mark_transaction_id_list
=
[
'0'
,
'1'
,
'3'
,
'5'
,
'10'
,
'11'
,
'12'
]
continue_transaction_id_list
=
[
'4'
,
'6'
]
cancel_transaction_id_list
=
[
'8'
]
transaction_status
=
data_kw
[
'transactionStatus'
]
transaction_status_description
=
transaction_code_mapping
.
get
(
transaction_status
,
None
)
if
transaction_status_description
is
None
:
payzen_event
.
confirm
(
comment
=
'Unknown transactionStatus %r'
%
transaction_status
)
transaction_list
=
answer
[
"transactions"
]
if
len
(
transaction_list
)
!=
1
:
# Unexpected Number of Transactions
payzen_event
.
confirm
(
comment
=
'Unexpected Number of Transaction for this order'
)
return
if
transaction_status
in
mark_transaction_id_list
:
transaction_kw
=
transaction_list
[
0
]
# See Full Status list at https://payzen.io/en-EN/rest/V4.0/api/kb/status_reference.html
mark_transaction_id_list
=
[
'AUTHORISED_TO_VALIDATE'
,
'WAITING_AUTHORISATION'
,
'WAITING_AUTHORISATION_TO_VALIDATE'
,
]
continue_transaction_id_list
=
[
'AUTHORISED'
,
'CAPTURED'
,
'PARTIALLY_AUTHORISED'
]
cancel_transaction_id_list
=
[
'REFUSED'
]
transaction_status
=
transaction_kw
[
'detailedStatus'
]
if
transaction_status
in
mark_transaction_id_list
:
# Mark on payment transaction history log that transaction was not processed yet
storeWorkflowComment
(
transaction
,
'Transaction status %s (%s) did not changed the document state'
%
(
transaction_status
,
transaction_status_description
))
storeWorkflowComment
(
transaction
,
'Transaction status %s did not changed the document state'
%
(
transaction_status
))
payzen_event
.
confirm
()
payzen_event
.
acknowledge
(
comment
=
'Automatic acknowledge as result of correct communication'
)
if
isTransitionPossible
(
transaction
,
'confirm'
):
transaction
.
confirm
(
comment
=
'Confirmed as really saw in PayZen.'
)
elif
transaction_status
in
continue_transaction_id_list
:
elif
transaction_status
in
continue_transaction_id_list
:
# Check authAmount and authDevise and if match, stop transaction
auth_amount
=
int
(
data_kw
[
'authA
mount'
])
auth_devise
=
data_kw
[
'authDevise
'
]
auth_amount
=
int
(
transaction_kw
[
'transactionDetails'
][
'cardDetails'
][
'authorizationResponse'
][
'a
mount'
])
auth_devise
=
transaction_kw
[
'transactionDetails'
][
'cardDetails'
][
'authorizationResponse'
][
'currency
'
]
transaction_amount
=
int
((
round
(
transaction
.
PaymentTransaction_getTotalPayablePrice
(),
2
)
*
-
100
))
if
transaction_amount
!=
auth_amount
:
payzen_event
.
confirm
(
comment
=
'Received amount (%r) does not match stored on transaction (%r)'
%
(
auth_amount
,
transaction_amount
))
return
transaction_devise
=
transaction
.
getResourceValue
().
Currency_getIntegrationMapping
()
transaction_devise
=
transaction
.
getResourceReference
()
if
transaction_devise
!=
auth_devise
:
payzen_event
.
confirm
(
comment
=
'Received devise (%r) does not match stored on transaction (%r)'
%
(
auth_devise
,
transaction_devise
))
return
...
...
@@ -100,17 +95,13 @@ elif error_code == '0':
else
:
payzen_event
.
confirm
(
comment
=
'Expected to put transaction in stopped state, but achieved only %s state'
%
transaction
.
getSimulationState
())
elif
transaction_status
in
cancel_transaction_id_list
:
elif
transaction_status
in
cancel_transaction_id_list
:
payzen_event
.
confirm
()
payzen_event
.
acknowledge
(
comment
=
'Refused payzen payment.'
)
if
isTransitionPossible
(
transaction
,
'cancel'
):
transaction
.
cancel
(
comment
=
'Aborting refused payzen payment.'
)
return
else
:
payzen_event
.
confirm
(
comment
=
'Transaction status %r (%r) is not supported'
\
%
(
transaction_status
,
transaction_status_description
))
return
else
:
# Unknown errorCode
payzen_event
.
confirm
(
comment
=
'Unknown errorCode %r'
%
error_code
)
payzen_event
.
confirm
(
comment
=
'Transaction status %r is not supported'
\
%
(
transaction_status
))
return
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/PayzenEvent_processUpdate.xml
View file @
40fa9ff0
...
...
@@ -50,7 +50,15 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
data_kw, signature, REQUEST=None
</string>
</value>
<value>
<string>
data_kw, REQUEST=None
</string>
</value>
</item>
<item>
<key>
<string>
_proxy_roles
</string>
</key>
<value>
<tuple>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
...
...
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenSkins.py
View file @
40fa9ff0
This diff is collapsed.
Click to expand it.
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenWorkflow.py
View file @
40fa9ff0
...
...
@@ -5,7 +5,7 @@ from DateTime import DateTime
from
Products.ERP5Type.tests.utils
import
createZODBPythonScript
import
difflib
HARDCODED_PRICE
=
99.6
HARDCODED_PRICE
=
-
99.6
vads_url_cancel
=
'http://example.org/cancel'
vads_url_error
=
'http://example.org/error'
...
...
@@ -187,6 +187,7 @@ class TestSlapOSPayzenInterfaceWorkflow(SlapOSTestCaseMixinWithAbort):
'vads_amount'
:
str
(
int
(
HARDCODED_PRICE
*
-
100
)),
'vads_currency'
:
978
,
'vads_trans_id'
:
transaction_id
,
'vads_order_id'
:
transaction_id
,
'vads_site_id'
:
'foo'
,
}
# Calculate the signature...
...
...
@@ -201,10 +202,10 @@ class TestSlapOSPayzenInterfaceWorkflow(SlapOSTestCaseMixinWithAbort):
'%(vads_url_return)s">
\
n
\
n
\
n
<input type="hidden" name="vads_site_id" '
\
'value="%(vads_site_id)s">
\
n
\
n
\
n
<input type="hidden" name="vads_url_e'
\
'rror"
\
n
value="%(vads_url_error)s">
\
n
\
n
\
n
<input type="hidden'
\
'" name="vads_trans_id" value="%(vads_trans_id)s">
\
n
\
n
\
n
<input type="'
\
'hidden" name="vads_action_mode"
\
n
value="INTERACTIVE">
\
n
\
n
\
n
'
\
'" name="vads_trans_id" value="%(vads_trans_id)s">
\
n
\
n
\
n
'
\
'<input type="hidden" name="vads_url_success"
\
n
value="'
\
'%(vads_url_success)s">
\
n
\
n
\
n
<input type="hidden" name="vads_url_refe'
\
'%(vads_url_success)s">
\
n
\
n
\
n
<input type="hidden" name="vads_order_id'
\
'" value="%(vads_trans_id)s">
\
n
\
n
\
n
<input type="hidden" name="vads_url_refe'
\
'rral"
\
n
value="%(vads_url_referral)s">
\
n
\
n
\
n
<input type="hid'
\
'den" name="vads_page_action"
\
n
value="PAYMENT">
\
n
\
n
\
n
<input '
\
'type="hidden" name="vads_trans_date"
\
n
value="'
\
...
...
@@ -218,7 +219,8 @@ class TestSlapOSPayzenInterfaceWorkflow(SlapOSTestCaseMixinWithAbort):
'
\
n
<input type="hidden" name="vads_language" value="%(vads_language)s">
\
n
\
n
\
n
<inpu'
\
't type="hidden" name="vads_currency" value="%(vads_currency)s">
\
n
\
n
\
n
'
\
' <input type="hidden" name="vads_amount" value="%(vads_amount)s">
\
n
\
n
\
n
'
\
' <input type="hidden" name="vads_version" value="V2">
\
n
\
n
<center>
\
n
'
\
' <input type="hidden" name="vads_version" value="V2">
\
n
\
n
\
n
<input type="'
\
'hidden" name="vads_action_mode"
\
n
value="INTERACTIVE">
\
n
\
n
<center>
\
n
'
\
' <input type="submit" value="Click to pay">
\
n
</center>
\
n
</form>'
%
data_dict
# Event message state
...
...
@@ -252,17 +254,17 @@ class TestSlapOSPayzenInterfaceWorkflow(SlapOSTestCaseMixinWithAbort):
_
,
_
=
payment
.
PaymentTransaction_generatePayzenId
()
self
.
assertRaises
(
AttributeError
,
event
.
updateStatus
)
def
mock
Soap
GetInfo
(
self
,
method_to_call
,
expected_args
,
result_tuple
):
def
mock
Rest
GetInfo
(
self
,
method_to_call
,
expected_args
,
result_tuple
):
payment_service
=
self
.
portal
.
portal_secure_payments
.
slapos_payzen_test
def
mock
soad
_getInfo
(
arg1
,
arg2
):
def
mock
rest
_getInfo
(
arg1
,
arg2
):
self
.
assertEqual
(
arg1
,
expected_args
[
0
])
self
.
assertEqual
(
arg2
,
expected_args
[
1
])
return
result_tuple
setattr
(
payment_service
,
'
soap_getInfo'
,
mocksoad
_getInfo
)
setattr
(
payment_service
,
'
rest_getInfo'
,
mockrest
_getInfo
)
try
:
return
method_to_call
()
finally
:
del
payment_service
.
soap
_getInfo
del
payment_service
.
rest
_getInfo
def
_simulatePayzenEvent_processUpdate
(
self
):
script_name
=
'PayzenEvent_processUpdate'
...
...
@@ -293,16 +295,15 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by P
payment
.
PaymentTransaction_generatePayzenId
()
mocked_data_kw
=
'mocked_data_kw'
mocked_signature
=
'mocked_signature'
mocked_sent_text
=
'mocked_sent_text'
mocked_received_text
=
'mocked_received_text'
self
.
_simulatePayzenEvent_processUpdate
()
try
:
self
.
mock
Soap
GetInfo
(
self
.
mock
Rest
GetInfo
(
event
.
updateStatus
,
(
transaction_date
.
toZone
(
'UTC'
).
asdatetime
(),
transaction_id
),
(
mocked_data_kw
,
mocked_s
ignature
,
mocked_s
ent_text
,
mocked_received_text
),
(
mocked_data_kw
,
mocked_sent_text
,
mocked_received_text
),
)
finally
:
self
.
_dropPayzenEvent_processUpdate
()
...
...
@@ -311,11 +312,11 @@ portal_workflow.doActionFor(context, action='edit_action', comment='Visited by P
self
.
assertEqual
(
len
(
event_message_list
),
2
)
sent_message
=
[
x
for
x
in
event_message_list
\
if
x
.
getTitle
()
==
'Sent
SOAP
'
][
0
]
if
x
.
getTitle
()
==
'Sent
Data
'
][
0
]
self
.
assertEqual
(
sent_message
.
getTextContent
(),
mocked_sent_text
)
received_message
=
[
x
for
x
in
event_message_list
\
if
x
.
getTitle
()
==
'Received
SOAP
'
][
0
]
if
x
.
getTitle
()
==
'Received
Data
'
][
0
]
self
.
assertEqual
(
received_message
.
getPredecessor
(),
sent_message
.
getRelativeUrl
())
self
.
assertEqual
(
received_message
.
getTextContent
(),
mocked_received_text
)
...
...
master/bt5/slapos_payzen/WorkflowTemplateItem/portal_workflow/payzen_interface_workflow/scripts/PayzenEvent_generateNavigationPage.py
View file @
40fa9ff0
...
...
@@ -29,6 +29,7 @@ payzen_dict = {
'vads_amount'
:
str
(
int
(
round
((
payment_transaction
.
PaymentTransaction_getTotalPayablePrice
()
*
-
100
),
0
))),
'vads_trans_date'
:
now
.
toZone
(
'UTC'
).
asdatetime
().
strftime
(
'%Y%m%d%H%M%S'
),
'vads_trans_id'
:
transaction_id
,
'vads_order_id'
:
transaction_id
,
'vads_language'
:
'en'
,
'vads_url_cancel'
:
vads_url_cancel
,
'vads_url_error'
:
vads_url_error
,
...
...
master/bt5/slapos_payzen/WorkflowTemplateItem/portal_workflow/payzen_interface_workflow/scripts/PayzenEvent_registerPayzen.py
deleted
100644 → 0
View file @
eb35deda
"""Registers current transaction in payment
In order to not transmit sensitive information the registration is done by looking the newest
payzen related transaction for destination_section and doing its duplicate"""
from
DateTime
import
DateTime
payzen_event
=
state_change
[
'object'
]
transaction
=
payzen_event
.
getDestinationValue
()
payment_service
=
payzen_event
.
getSourceValue
(
portal_type
=
"Payzen Service"
)
previous_id
=
transaction
.
PaymentTransaction_getPreviousPayzenId
()
if
previous_id
is
None
:
payzen_event
.
confirm
(
comment
=
'No previous id found'
)
return
transaction_date
,
transaction_id
=
transaction
.
PaymentTransaction_generatePayzenId
()
if
transaction_id
is
None
:
raise
ValueError
(
'Transaction already mapped in integration tool.'
)
# do causality mapping in integration_site between transaction.getRelativeUrl and today + transaction_id
payzen_dict
=
{}
payzen_dict
.
update
(
devise
=
transaction
.
getResourceValue
().
Currency_getIntegrationMapping
(),
amount
=
str
(
int
(
round
((
transaction
.
PaymentTransaction_getTotalPayablePrice
()
*
-
100
),
0
))),
presentationDate
=
transaction
.
getStartDate
().
toZone
(
'UTC'
).
asdatetime
(),
newTransactionId
=
transaction_id
,
transmissionDate
=
transaction_date
.
asdatetime
(),
transactionId
=
previous_id
)
data_kw
,
signature
,
sent_text
,
received_text
=
payment_service
.
soap_duplicate
(
**
payzen_dict
)
# SENT
sent
=
payzen_event
.
newContent
(
title
=
'Sent SOAP'
,
portal_type
=
'Payzen Event Message'
,
text_content
=
sent_text
)
# RECEIVED
payzen_event
.
newContent
(
title
=
'Received SOAP'
,
text_content
=
received_text
,
predecessor_value
=
sent
,
portal_type
=
'Payzen Event Message'
)
context
.
PayzenEvent_processUpdate
(
state_change
,
data_kw
,
signature
)
master/bt5/slapos_payzen/WorkflowTemplateItem/portal_workflow/payzen_interface_workflow/scripts/PayzenEvent_updateStatus.py
View file @
40fa9ff0
...
...
@@ -6,20 +6,20 @@ if transaction_id is None:
raise
ValueError
(
'Transaction not registered in payzen integration tool'
)
payment_service
=
payzen_event
.
getSourceValue
(
portal_type
=
"Payzen Service"
)
data_kw
,
s
ignature
,
sent_text
,
received_text
=
payment_service
.
soap
_getInfo
(
data_kw
,
s
ent_text
,
received_text
=
payment_service
.
rest
_getInfo
(
transaction_date
.
toZone
(
'UTC'
).
asdatetime
(),
transaction_id
)
# SENT
sent
=
payzen_event
.
newContent
(
title
=
'Sent
SOAP
'
,
title
=
'Sent
Data
'
,
portal_type
=
'Payzen Event Message'
,
text_content
=
sent_text
)
# RECEIVED
payzen_event
.
newContent
(
title
=
'Received
SOAP
'
,
title
=
'Received
Data
'
,
portal_type
=
'Payzen Event Message'
,
text_content
=
received_text
,
predecessor_value
=
sent
)
payzen_event
.
PayzenEvent_processUpdate
(
data_kw
,
signature
)
payzen_event
.
PayzenEvent_processUpdate
(
data_kw
)
master/bt5/slapos_payzen/WorkflowTemplateItem/portal_workflow/payzen_interface_workflow/transitions/register_payzen.xml
deleted
100644 → 0
View file @
eb35deda
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"TransitionDefinition"
module=
"Products.DCWorkflow.Transitions"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
actbox_category
</string>
</key>
<value>
<string>
workflow
</string>
</value>
</item>
<item>
<key>
<string>
actbox_icon
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
actbox_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
actbox_url
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
after_script_name
</string>
</key>
<value>
<string>
PayzenEvent_registerPayzen
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
guard
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
register_payzen
</string>
</value>
</item>
<item>
<key>
<string>
new_state_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
script_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
trigger_type
</string>
</key>
<value>
<int>
2
</int>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment