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
0
Merge Requests
0
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
Léo-Paul Géneau
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