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
21504241
Commit
21504241
authored
Dec 19, 2022
by
Rafael Monnerat
Browse files
Options
Browse Files
Download
Plain Diff
Rework payment transaction generation
See merge request
nexedi/slapos.core!459
parents
5128c902
48b9b61f
Changes
98
Hide whitespace changes
Inline
Side-by-side
Showing
98 changed files
with
1487 additions
and
2910 deletions
+1487
-2910
master/bt5/slapos_accounting/ActionTemplateItem/portal_types/Sale%20Invoice%20Transaction/create_slapos_reversal.xml
...s/Sale%20Invoice%20Transaction/create_slapos_reversal.xml
+1
-1
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/AccountingTransactionModule_getUnpaidInvoiceList.py
...nting/AccountingTransactionModule_getUnpaidInvoiceList.py
+3
-9
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/AccountingTransaction_getPaymentState.py
...lapos_accounting/AccountingTransaction_getPaymentState.py
+19
-11
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Alarm_cancelStartedPaymentTransactionPaid.py
...s_accounting/Alarm_cancelStartedPaymentTransactionPaid.py
+1
-1
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Base_getReceivableAccountList.py
..._skins/slapos_accounting/Base_getReceivableAccountList.py
+6
-0
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Base_getReceivableAccountList.xml
...skins/slapos_accounting/Base_getReceivableAccountList.xml
+9
-1
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Entity_createPaymentTransaction.py
...kins/slapos_accounting/Entity_createPaymentTransaction.py
+79
-0
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Entity_createPaymentTransaction.xml
...ins/slapos_accounting/Entity_createPaymentTransaction.xml
+2
-2
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Entity_getOutstandingAmountList.py
...kins/slapos_accounting/Entity_getOutstandingAmountList.py
+42
-0
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Entity_getOutstandingAmountList.xml
...ins/slapos_accounting/Entity_getOutstandingAmountList.xml
+2
-2
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/PaymentTransaction_cancelIfSaleInvoiceTransactionIsLettered.py
...ntTransaction_cancelIfSaleInvoiceTransactionIsLettered.py
+2
-25
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/PaymentTransaction_cancelIfSaleInvoiceTransactionIsLettered.xml
...tTransaction_cancelIfSaleInvoiceTransactionIsLettered.xml
+1
-1
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_createReversalSaleInvoiceTransaction.py
...nvoiceTransaction_createReversalSaleInvoiceTransaction.py
+58
-0
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_createReversalSaleInvoiceTransaction.xml
...voiceTransaction_createReversalSaleInvoiceTransaction.xml
+2
-2
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_createSlapOSReversalTransaction.py
...SaleInvoiceTransaction_createSlapOSReversalTransaction.py
+0
-10
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_createSlapOSReversalTransaction.xml
...aleInvoiceTransaction_createSlapOSReversalTransaction.xml
+0
-62
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_getSlapOSPaymentRelated.py
...ounting/SaleInvoiceTransaction_getSlapOSPaymentRelated.py
+0
-3
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_getSlapOSPaymentRelatedValue.py
...ng/SaleInvoiceTransaction_getSlapOSPaymentRelatedValue.py
+0
-8
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_getSlapOSPaymentRelatedValue.xml
...g/SaleInvoiceTransaction_getSlapOSPaymentRelatedValue.xml
+0
-62
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_isLettered.py
...ns/slapos_accounting/SaleInvoiceTransaction_isLettered.py
+18
-0
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_isLettered.xml
...s/slapos_accounting/SaleInvoiceTransaction_isLettered.xml
+9
-1
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_redirectToManualSlapOSPayment.py
...g/SaleInvoiceTransaction_redirectToManualSlapOSPayment.py
+21
-0
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_redirectToManualSlapOSPayment.xml
.../SaleInvoiceTransaction_redirectToManualSlapOSPayment.xml
+1
-1
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_viewCancelPaymentAndCreateReversalTransactionDialog.xml
...n_viewCancelPaymentAndCreateReversalTransactionDialog.xml
+5
-1
master/bt5/slapos_accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSAccountingAlarm.py
.../portal_components/test.erp5.testSlapOSAccountingAlarm.py
+33
-13
master/bt5/slapos_accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSAccountingAlarm.xml
...portal_components/test.erp5.testSlapOSAccountingAlarm.xml
+3
-24
master/bt5/slapos_accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSAccountingSkins.py
.../portal_components/test.erp5.testSlapOSAccountingSkins.py
+522
-50
master/bt5/slapos_accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSEntityCreatePayment.py
...tal_components/test.erp5.testSlapOSEntityCreatePayment.py
+57
-63
master/bt5/slapos_accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSEntityCreatePayment.xml
...al_components/test.erp5.testSlapOSEntityCreatePayment.xml
+5
-26
master/bt5/slapos_accounting/bt/template_test_id_list
master/bt5/slapos_accounting/bt/template_test_id_list
+2
-1
master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseDefaultScenarioMixin.py
...omponents/test.erp5.SlapOSTestCaseDefaultScenarioMixin.py
+37
-62
master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseMixin.py
...teItem/portal_components/test.erp5.SlapOSTestCaseMixin.py
+4
-24
master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseMixin.xml
...eItem/portal_components/test.erp5.SlapOSTestCaseMixin.xml
+3
-24
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Alarm_createRegularisationRequest.py
...tal_skins/slapos_crm/Alarm_createRegularisationRequest.py
+21
-2
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Person_checkToCreateRegularisationRequest.py
...s/slapos_crm/Person_checkToCreateRegularisationRequest.py
+4
-4
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Person_getSubscriptionRequestFirstUnpaidInvoiceList.py
...rm/Person_getSubscriptionRequestFirstUnpaidInvoiceList.py
+3
-3
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Person_getSubscriptionRequestFirstUnpaidInvoiceList.xml
...m/Person_getSubscriptionRequestFirstUnpaidInvoiceList.xml
+1
-1
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/RegularisationRequest_invalidateIfPersonBalanceIsOk.py
...rm/RegularisationRequest_invalidateIfPersonBalanceIsOk.py
+4
-4
master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCRMAlarm.py
...ateItem/portal_components/test.erp5.testSlapOSCRMAlarm.py
+78
-31
master/bt5/slapos_erp5/TestTemplateItem/portal_components/test.erp5.testSlapOSCodingStyle.py
...Item/portal_components/test.erp5.testSlapOSCodingStyle.py
+1
-1
master/bt5/slapos_erp5/TestTemplateItem/portal_components/test.erp5.testSlapOSERP5DefaultScenario.py
...tal_components/test.erp5.testSlapOSERP5DefaultScenario.py
+24
-74
master/bt5/slapos_erp5/TestTemplateItem/portal_components/test.erp5.testSlapOSERP5DefaultScenario.xml
...al_components/test.erp5.testSlapOSERP5DefaultScenario.xml
+3
-24
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_all_invoice_list_js.js
...e_module/rjs_gadget_erp5_page_slap_all_invoice_list_js.js
+1
-0
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_all_invoice_list_js.xml
..._module/rjs_gadget_erp5_page_slap_all_invoice_list_js.xml
+1
-1
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_invoice_list_js.js
..._page_module/rjs_gadget_erp5_page_slap_invoice_list_js.js
+1
-0
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_invoice_list_js.xml
...page_module/rjs_gadget_erp5_page_slap_invoice_list_js.xml
+2
-2
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_sale_invoice_transaction_view_js.js
...gadget_erp5_page_slap_sale_invoice_transaction_view_js.js
+1
-1
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_sale_invoice_transaction_view_js.xml
...adget_erp5_page_slap_sale_invoice_transaction_view_js.xml
+2
-2
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_slapos_invoice_state_js.js
...tem/web_page_module/rjs_gadget_slapos_invoice_state_js.js
+4
-5
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_slapos_invoice_state_js.xml
...em/web_page_module/rjs_gadget_slapos_invoice_state_js.xml
+1
-1
master/bt5/slapos_jio/SkinTemplateItem/portal_skins/slapos_hal_json_style/AccountingTransaction_getPaymentStateAsHateoas.py
...n_style/AccountingTransaction_getPaymentStateAsHateoas.py
+2
-6
master/bt5/slapos_jio/SkinTemplateItem/portal_skins/slapos_hal_json_style/SaleInvoiceTransaction_viewAsHateoas.xml
...s_hal_json_style/SaleInvoiceTransaction_viewAsHateoas.xml
+0
-1
master/bt5/slapos_jio/SkinTemplateItem/portal_skins/slapos_hal_json_style/SaleInvoiceTransaction_viewAsHateoas/my_payment_transaction.xml
...voiceTransaction_viewAsHateoas/my_payment_transaction.xml
+0
-124
master/bt5/slapos_jio_ui_test/PathTemplateItem/portal_tests/slaposjs_zuite/testSlapOSJSInvoiceUnpaid.zpt
...portal_tests/slaposjs_zuite/testSlapOSJSInvoiceUnpaid.zpt
+6
-6
master/bt5/slapos_jio_ui_test/SkinTemplateItem/portal_skins/slapos_ui_test/ERP5Site_createSlapOSFakeInvoiceForTestUser.py
...os_ui_test/ERP5Site_createSlapOSFakeInvoiceForTestUser.py
+8
-0
master/bt5/slapos_payzen/PathTemplateItem/portal_alarms/slapos_payzen_update_confirmed_payment.xml
.../portal_alarms/slapos_payzen_update_confirmed_payment.xml
+0
-97
master/bt5/slapos_payzen/PathTemplateItem/portal_alarms/slapos_trigger_payment_transaction_order_builder.xml
...arms/slapos_trigger_payment_transaction_order_builder.xml
+0
-97
master/bt5/slapos_payzen/PathTemplateItem/portal_orders/slapos_payment_transaction_builder/category_movement_group_on_delivery.xml
...ansaction_builder/category_movement_group_on_delivery.xml
+0
-64
master/bt5/slapos_payzen/PathTemplateItem/portal_orders/slapos_payment_transaction_builder/category_movement_group_on_line.xml
...t_transaction_builder/category_movement_group_on_line.xml
+0
-57
master/bt5/slapos_payzen/PathTemplateItem/portal_orders/slapos_payment_transaction_builder/property_movement_group_on_line.xml
...t_transaction_builder/property_movement_group_on_line.xml
+0
-55
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/Alarm_triggerPaymentTransactionOrderBuilder.py
...pos_payzen/Alarm_triggerPaymentTransactionOrderBuilder.py
+0
-4
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/Alarm_triggerPaymentTransactionOrderBuilder.xml
...os_payzen/Alarm_triggerPaymentTransactionOrderBuilder.xml
+0
-62
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/Alarm_updatePayzenConfirmedPaymentTransaction.py
...s_payzen/Alarm_updatePayzenConfirmedPaymentTransaction.py
+0
-12
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/Alarm_updatePayzenConfirmedPaymentTransaction.xml
..._payzen/Alarm_updatePayzenConfirmedPaymentTransaction.xml
+0
-62
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/OrderBuilder_generateUnrelatedInvoiceList.py
...lapos_payzen/OrderBuilder_generateUnrelatedInvoiceList.py
+0
-71
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/OrderBuilder_generateUnrelatedInvoiceList.xml
...apos_payzen/OrderBuilder_generateUnrelatedInvoiceList.xml
+0
-62
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/PaymentTransaction_startPayzenPayment.py
...ns/slapos_payzen/PaymentTransaction_startPayzenPayment.py
+0
-13
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenAlarm.py
...Item/portal_components/test.erp5.testSlapOSPayzenAlarm.py
+21
-210
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenAlarm.xml
...tem/portal_components/test.erp5.testSlapOSPayzenAlarm.xml
+3
-24
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenEntityCreatePayment.py
...mponents/test.erp5.testSlapOSPayzenEntityCreatePayment.py
+33
-0
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenEntityCreatePayment.xml
...ponents/test.erp5.testSlapOSPayzenEntityCreatePayment.xml
+10
-25
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenSkins.py
...Item/portal_components/test.erp5.testSlapOSPayzenSkins.py
+54
-255
master/bt5/slapos_payzen/bt/template_path_list
master/bt5/slapos_payzen/bt/template_path_list
+0
-4
master/bt5/slapos_payzen/bt/template_test_id_list
master/bt5/slapos_payzen/bt/template_test_id_list
+1
-1
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_notifyPaymentIsReady.py
...ption_request/SubscriptionRequest_notifyPaymentIsReady.py
+1
-1
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_notifyPaymentIsReady.xml
...tion_request/SubscriptionRequest_notifyPaymentIsReady.xml
+1
-1
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_processOrdered.py
...ubscription_request/SubscriptionRequest_processOrdered.py
+4
-6
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_testPaymentBalance.py
...ription_request/SubscriptionRequest_testPaymentBalance.py
+5
-5
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_verifyPaymentBalanceIsReady.py
...equest/SubscriptionRequest_verifyPaymentBalanceIsReady.py
+6
-8
master/bt5/slapos_subscription_request/TestTemplateItem/portal_components/test.erp5.testSlapOSSubscriptionCancellationScenario.py
...s/test.erp5.testSlapOSSubscriptionCancellationScenario.py
+0
-14
master/bt5/slapos_subscription_request/TestTemplateItem/portal_components/test.erp5.testSlapOSSubscriptionCancellationScenario.xml
.../test.erp5.testSlapOSSubscriptionCancellationScenario.xml
+3
-24
master/bt5/slapos_subscription_request/TestTemplateItem/portal_components/test.erp5.testSlapOSSubscriptionScenario.py
...al_components/test.erp5.testSlapOSSubscriptionScenario.py
+27
-53
master/bt5/slapos_subscription_request/TestTemplateItem/portal_components/test.erp5.testSlapOSSubscriptionScenario.xml
...l_components/test.erp5.testSlapOSSubscriptionScenario.xml
+3
-24
master/bt5/slapos_wechat/PathTemplateItem/portal_alarms/slapos_wechat_update_confirmed_payment.xml
.../portal_alarms/slapos_wechat_update_confirmed_payment.xml
+0
-101
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/Alarm_updateWechatConfirmedPaymentTransaction.py
...s_wechat/Alarm_updateWechatConfirmedPaymentTransaction.py
+0
-12
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/Alarm_updateWechatConfirmedPaymentTransaction.xml
..._wechat/Alarm_updateWechatConfirmedPaymentTransaction.xml
+0
-62
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/PaymentTransaction_startWechatPayment.py
...ns/slapos_wechat/PaymentTransaction_startWechatPayment.py
+0
-13
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/SaleInvoiceTransaction_createReversalWechatTransaction.py
...SaleInvoiceTransaction_createReversalWechatTransaction.py
+0
-55
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/SaleInvoiceTransaction_getWechatPaymentRelatedValue.py
...at/SaleInvoiceTransaction_getWechatPaymentRelatedValue.py
+0
-7
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/SaleInvoiceTransaction_getWechatPaymentRelatedValue.xml
...t/SaleInvoiceTransaction_getWechatPaymentRelatedValue.xml
+0
-62
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatAlarm.py
...Item/portal_components/test.erp5.testSlapOSWechatAlarm.py
+21
-210
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatAlarm.xml
...tem/portal_components/test.erp5.testSlapOSWechatAlarm.xml
+3
-24
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatBuilder.py
...em/portal_components/test.erp5.testSlapOSWechatBuilder.py
+0
-19
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatEntityCreatePayment.py
...mponents/test.erp5.testSlapOSWechatEntityCreatePayment.py
+33
-0
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatEntityCreatePayment.xml
...ponents/test.erp5.testSlapOSWechatEntityCreatePayment.xml
+106
-0
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatSkins.py
...Item/portal_components/test.erp5.testSlapOSWechatSkins.py
+36
-249
master/bt5/slapos_wechat/bt/template_path_list
master/bt5/slapos_wechat/bt/template_path_list
+0
-1
master/bt5/slapos_wechat/bt/template_test_id_list
master/bt5/slapos_wechat/bt/template_test_id_list
+1
-1
No files found.
master/bt5/slapos_accounting/ActionTemplateItem/portal_types/Sale%20Invoice%20Transaction/create_slapos_reversal.xml
View file @
21504241
...
...
@@ -88,7 +88,7 @@
<dictionary>
<item>
<key>
<string>
text
</string>
</key>
<value>
<string>
python: object.getSimulationState() in (\'stopped\', )
</string>
</value>
<value>
<string>
python: object.getSimulationState() in (\'stopped\', )
and not object.SaleInvoiceTransaction_isLettered()
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/AccountingTransactionModule_getUnpaidInvoiceList.py
View file @
21504241
...
...
@@ -3,16 +3,10 @@ portal_membership=portal.portal_membership
user
=
portal_membership
.
getAuthenticatedMember
().
getUserValue
()
def
wrapWithShadow
():
return
[
i
.
getCausalityValue
(
portal_type
=
"Sale Invoice Transaction"
)
for
i
in
context
.
getPortalObject
().
portal_catalog
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
"started"
,
destination_section_uid
=
user
.
getUid
(),
default_causality_portal_type
=
"Sale Invoice Transaction"
,
default_causality_simulation_state
=
(
"stopped"
,
"delivered"
),
)]
def
wrapWithShadow
(
user
):
return
user
.
Entity_getOutstandingAmountList
()
return
user
.
Person_restrictMethodAsShadowUser
(
shadow_document
=
user
,
callable_object
=
wrapWithShadow
,
argument_list
=
[])
argument_list
=
[
user
])
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/AccountingTransaction_getPaymentState.py
View file @
21504241
...
...
@@ -42,19 +42,27 @@ else:
elif
context
.
getTotalPrice
()
==
0
:
result
=
"Free!"
else
:
# Check if there is an ongoing SlapOS payment
payment
=
context
.
SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
()
if
payment
is
None
:
result
=
"Unpaid"
else
:
result
=
"Pay Now"
# Search to know if there are some payment waiting for confirmation
payment
=
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
"started"
,
default_causality_uid
=
context
.
getUid
(),
default_payment_mode_uid
=
[
portal
.
portal_categories
.
payment_mode
.
payzen
.
getUid
(),
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
()],
)
if
payment
is
not
None
:
# Check if mapping exists
external_payment_id
=
person
.
Person_restrictMethodAsShadowUser
(
shadow_document
=
person
,
callable_object
=
payment
.
PaymentTransaction_getExternalPaymentId
,
argument_list
=
[])[
0
]
if
external_payment_id
is
None
:
result
=
"Pay Now"
if
person
is
not
None
:
external_payment_id
=
person
.
Person_restrictMethodAsShadowUser
(
shadow_document
=
person
,
callable_object
=
payment
.
PaymentTransaction_getExternalPaymentId
,
argument_list
=
[])[
0
]
else
:
external_payment_id
=
payment
.
PaymentTransaction_getExternalPaymentId
()
if
external_payment_id
is
not
None
:
result
=
"Waiting for payment confirmation"
return
result
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Alarm_cancelStartedPaymentTransactionPaid.py
View file @
21504241
...
...
@@ -12,7 +12,7 @@ portal.portal_catalog.searchAndActivate(
payment_mode_uid
=
[
portal
.
portal_categories
.
payment_mode
.
payzen
.
getUid
(),
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
()],
method_id
=
'PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Group
ed'
,
method_id
=
'PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Letter
ed'
,
packet_size
=
1
,
# just one to minimise errors
activate_kw
=
{
'tag'
:
tag
},
**
kw
...
...
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Base_getReceivableAccountList.py
0 → 100644
View file @
21504241
# Note: can be cached for 24h if needed: the list is not expected to change often, nor to ever reach even 10 entries.
portal
=
context
.
getPortalObject
()
return
portal
.
account_module
.
searchFolder
(
strict_account_type_uid
=
portal
.
portal_categories
.
account_type
.
asset
.
receivable
.
getUid
(),
validation_state
=
'validated'
,
)
master/bt5/slapos_
payzen/SkinTemplateItem/portal_skins/slapos_payzen/PaymentTransaction_startPayzenPaymen
t.xml
→
master/bt5/slapos_
accounting/SkinTemplateItem/portal_skins/slapos_accounting/Base_getReceivableAccountLis
t.xml
View file @
21504241
...
...
@@ -52,9 +52,17 @@
<key>
<string>
_params
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
_proxy_roles
</string>
</key>
<value>
<tuple>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
PaymentTransaction_startPayzenPaymen
t
</string>
</value>
<value>
<string>
Base_getReceivableAccountLis
t
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Entity_createPaymentTransaction.py
0 → 100644
View file @
21504241
from
Products.ERP5Type.Message
import
translateString
from
zExceptions
import
Unauthorized
if
REQUEST
is
not
None
:
raise
Unauthorized
portal
=
context
.
getPortalObject
()
if
not
invoice_list
:
raise
ValueError
(
'You need to provide at least one Invoice transaction'
)
# For now consider a single value is passed, in future we intend to create
# a single payment per invoice.
current_invoice
=
invoice_list
[
0
]
payment_tag
=
"sale_invoice_transaction_create_payment_%s"
%
current_invoice
.
getUid
()
if
context
.
REQUEST
.
get
(
payment_tag
,
None
)
is
not
None
:
raise
ValueError
(
'This script was already called twice on the same transaction '
)
if
current_invoice
.
SaleInvoiceTransaction_isLettered
():
raise
ValueError
(
'This invoice is already lettered'
)
context
.
serialize
()
quantity
=
0
for
movement
in
current_invoice
.
searchFolder
(
portal_type
=
'Sale Invoice Transaction Line'
,
default_source_uid
=
[
i
.
uid
for
i
in
context
.
Base_getReceivableAccountList
()]):
quantity
+=
movement
.
getQuantity
()
if
quantity
>=
0
:
raise
ValueError
(
'You cannot generate Payment Transaction for zero or negative amounts.'
)
current_payment
=
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
causality
=
current_invoice
.
getRelativeUrl
(),
source_section
=
current_invoice
.
getSourceSection
(),
destination_section
=
current_invoice
.
getDestinationSection
(),
resource
=
current_invoice
.
getResource
(),
price_currency
=
current_invoice
.
getResource
(),
specialise
=
current_invoice
.
getSpecialise
(),
payment_mode
=
current_invoice
.
getPaymentMode
(),
start_date
=
current_invoice
.
getStartDate
(),
stop_date
=
current_invoice
.
getStopDate
(),
source_payment
=
'%s/bank_account'
%
current_invoice
.
getSourceSection
(),
# the other place defnied: business process
# Workarround to not create default lines.
created_by_builder
=
1
)
current_payment
.
newContent
(
portal_type
=
"Accounting Transaction Line"
,
quantity
=-
1
*
quantity
,
source
=
'account_module/receivable'
,
destination
=
'account_module/payable'
,
start_date
=
current_invoice
.
getStartDate
(),
stop_date
=
current_invoice
.
getStopDate
())
current_payment
.
newContent
(
portal_type
=
"Accounting Transaction Line"
,
quantity
=
1
*
quantity
,
source
=
'account_module/payment_to_encash'
,
destination
=
'account_module/payment_to_encash'
,
start_date
=
current_invoice
.
getStartDate
(),
stop_date
=
current_invoice
.
getStopDate
())
comment
=
translateString
(
"Initialised by Entity_createPaymentTransaction."
)
# Reindex with a tag to ensure that there will be no generation while the object isn't
# reindexed.
payment_tag
=
"sale_invoice_transaction_create_payment_%s"
%
current_invoice
.
getUid
()
current_payment
.
activate
(
tag
=
payment_tag
).
immediateReindexObject
()
# Call script rather them call confirm(), since it would set security and fail whenever
# start is called.
current_payment
.
AccountingTransaction_setReference
()
comment
=
translateString
(
"Initialised by Entity_createPaymentTransaction."
)
current_payment
.
start
(
comment
=
comment
)
# Set a flag on the request for prevent 2 calls on the same transaction
context
.
REQUEST
.
set
(
payment_tag
,
1
)
return
current_payment
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/
SaleInvoiceTransaction_getSlapOSPaymentRelated
.xml
→
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/
Entity_createPaymentTransaction
.xml
View file @
21504241
...
...
@@ -50,11 +50,11 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
**kw
</string>
</value>
<value>
<string>
invoice_list, REQUEST=None
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
SaleInvoiceTransaction_getSlapOSPaymentRelated
</string>
</value>
<value>
<string>
Entity_createPaymentTransaction
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/Entity_getOutstandingAmountList.py
0 → 100644
View file @
21504241
"""return a list of invoices with the following attributes:
- payment_request_uid: the uid of the invoice, we consider that payment request is the invoice.
- total_price: the amount left to pay for this invoice
- getTotalPrice: the original amount of this invoice.
Arguments:
- at_date (default None)
"""
portal
=
context
.
getPortalObject
()
params
=
dict
()
if
at_date
:
params
[
'at_date'
]
=
at_date
params
[
'grouping_reference'
]
=
None
object_list
=
[]
for
(
idx
,
brain
)
in
enumerate
(
portal
.
portal_simulation
.
getInventoryList
(
mirror_section_uid
=
context
.
getUid
(),
simulation_state
=
(
'stopped'
,
'delivered'
),
node_uid
=
[
x
.
uid
for
x
in
context
.
Base_getReceivableAccountList
()]
or
-
1
,
**
params
)):
# XXX rewrap inventory list brain because they don't have a valid "uid" and cannot be used
# directly in listbox. We should probably add support for this in getInventoryList instead
# of this hack
# XXX In our case, this hould be always None.
payment_request_uid
=
brain
.
payment_request_uid
if
not
payment_request_uid
:
payment_request_uid
=
brain
.
getObject
().
getExplanationUid
()
payment_request
=
portal
.
portal_catalog
.
getObject
(
uid
=
payment_request_uid
)
object_list
.
append
(
payment_request
.
asContext
(
section_uid
=
brain
.
section_uid
,
payment_request_uid
=
payment_request_uid
,
node_uid
=
brain
.
node_uid
,
node_relative_url
=
brain
.
node_relative_url
,
total_price
=
brain
.
total_price
,
uid
=
'new_%s'
%
idx
,))
return
object_list
master/bt5/slapos_
wechat/SkinTemplateItem/portal_skins/slapos_wechat/PaymentTransaction_startWechatPaymen
t.xml
→
master/bt5/slapos_
accounting/SkinTemplateItem/portal_skins/slapos_accounting/Entity_getOutstandingAmountLis
t.xml
View file @
21504241
...
...
@@ -50,11 +50,11 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string></string>
</value>
<value>
<string>
at_date=None, **kw
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
PaymentTransaction_startWechatPaymen
t
</string>
</value>
<value>
<string>
Entity_getOutstandingAmountLis
t
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Group
ed.py
→
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Letter
ed.py
View file @
21504241
...
...
@@ -4,35 +4,13 @@ if simulation_state != "started":
# The payment isn't started, so ignore it
return
"Not Started"
portal
=
context
.
getPortalObject
()
paid
=
False
def
isNodeFromLineReceivable
(
line
):
node_value
=
line
.
getSourceValue
(
portal_type
=
'Account'
)
return
node_value
.
getAccountType
()
==
'asset/receivable'
invoice
=
context
.
getCausalityValue
()
if
invoice
is
None
:
# No invoice Related, so skip and ignore
return
line_found
=
False
line_list
=
invoice
.
getMovementList
(
portal
.
getPortalAccountingMovementTypeList
())
if
not
len
(
line_list
):
# Ignore since lines to group don't exist yet
return
for
line
in
line_list
:
if
isNodeFromLineReceivable
(
line
):
line_found
=
True
if
line
.
hasGroupingReference
():
paid
=
True
letter
=
line
.
getGroupingReference
()
break
if
line_found
and
paid
:
letter
=
invoice
.
SaleInvoiceTransaction_isLettered
()
if
letter
:
# We should ensure that the order builder won't create another document.
context
.
edit
(
payment_mode
=
None
)
context
.
cancel
(
comment
=
"Payment is cancelled since the invoice is payed by other document,
\
...
...
@@ -40,7 +18,6 @@ if line_found and paid:
# Should be safe now to fix everything XXXXXXX
invoice
.
SaleInvoiceTransaction_resetPaymentMode
()
return
"Payment Cancelled"
return
"Skipped"
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Group
ed.xml
→
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Letter
ed.xml
View file @
21504241
...
...
@@ -54,7 +54,7 @@
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Group
ed
</string>
</value>
<value>
<string>
PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Letter
ed
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_
payzen/SkinTemplateItem/portal_skins/slapos_payzen/SaleInvoiceTransaction_createReversalPayzen
Transaction.py
→
master/bt5/slapos_
accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_createReversalSaleInvoice
Transaction.py
View file @
21504241
""" Create a reversal transaction from current payzen transaction. """
from
zExceptions
import
Unauthorized
if
REQUEST
is
not
None
:
raise
Unauthorized
""" Create a reversal transaction from current transaction. """
portal
=
context
.
getPortalObject
()
if
not
batch_mode
and
context
.
getPaymentMode
()
not
in
[
"payzen"
,
"wechat"
]:
message
=
context
.
Base_translateString
(
"The payment mode is unsupported."
)
return
context
.
Base_redirect
(
keep_items
=
{
'portal_status_message'
:
message
})
# Check that we are in state that we are waiting for user manual payment
assert
context
.
getPortalType
()
==
'Sale Invoice Transaction'
assert
context
.
getPaymentMode
()
==
'payzen'
assert
context
.
getPaymentMode
()
in
(
'payzen'
,
'wechat'
)
assert
context
.
getSimulationState
()
==
'stopped'
assert
context
.
getTotalPrice
()
!=
0
assert
context
.
getSpecialise
()
in
(
"sale_trade_condition_module/slapos_aggregated_trade_condition"
,
"sale_trade_condition_module/slapos_aggregated_subscription_trade_condition"
)
paid
=
True
for
line
in
context
.
getMovementList
(
portal
.
getPortalAccountingMovementTypeList
()):
node_value
=
line
.
getSourceValue
(
portal_type
=
'Account'
)
if
node_value
.
getAccountType
()
==
'asset/receivable'
:
if
not
line
.
hasGroupingReference
():
paid
=
False
break
assert
not
paid
# Dont create if the invoice is already paied
assert
not
context
.
SaleInvoiceTransaction_isLettered
()
payment
=
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
"started"
,
default_causality_uid
=
context
.
getUid
(),
default_payment_mode_uid
=
portal
.
portal_categories
.
payment_mode
.
payzen
.
getUid
(),
default_payment_mode_uid
=
[
portal
.
portal_categories
.
payment_mode
.
payzen
.
getUid
(),
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
()],
)
assert
payment
is
not
None
assert
payment
.
getSimulationState
()
==
'started'
assert
payment
.
getPaymentMode
()
==
'payzen'
assert
payment
.
PaymentTransaction_getPayzenId
()[
1
]
is
None
if
payment
is
not
None
:
payment_mode
=
payment
.
getPaymentMode
()
if
payment_mode
==
'payzen'
and
payment
.
PaymentTransaction_getPayzenId
()[
1
]
is
not
None
:
# The payment transaction will be cancelled by a proper alarm.
raise
ValueError
(
"Payment Transaction is waiting for External Payzen confirmation!"
)
elif
payment_mode
==
'wechat'
and
payment
.
PaymentTransaction_getWechatId
()[
1
]
is
not
None
:
# The payment transaction will be cancelled by a proper alarm.
raise
ValueError
(
"Payment Transaction is waiting for External Wechat confirmation!"
)
# Should be safe now to fix everything
context
.
SaleInvoiceTransaction_resetPaymentMode
()
payment
.
edit
(
payment_mode
=
None
)
reversal_transaction
=
context
.
Base_createCloneDocument
(
batch_mode
=
1
)
payment
.
cancel
(
comment
=
"Reversal sale invoice transaction created %s"
%
reversal_transaction
.
getRelativeUrl
())
reversal_transaction
.
edit
(
title
=
"Reversal Transaction for %s"
%
context
.
getTitle
(),
...
...
@@ -53,4 +50,9 @@ for line in reversal_transaction.getMovementList():
reversal_transaction
.
confirm
(
comment
=
"Automatic because of reversal creation"
)
reversal_transaction
.
stop
(
comment
=
"Automatic because of reversal creation"
)
return
reversal_transaction
if
batch_mode
:
return
reversal_transaction
message
=
context
.
Base_translateString
(
"Reversal Transaction created."
)
return
reversal_transaction
.
Base_redirect
(
keep_items
=
{
'portal_status_message'
:
message
})
master/bt5/slapos_
payzen/SkinTemplateItem/portal_skins/slapos_payzen/SaleInvoiceTransaction_createReversalPayzen
Transaction.xml
→
master/bt5/slapos_
accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_createReversalSaleInvoice
Transaction.xml
View file @
21504241
...
...
@@ -50,11 +50,11 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
REQUEST=Non
e
</string>
</value>
<value>
<string>
batch_mode=Fals
e
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
SaleInvoiceTransaction_createReversal
Payzen
Transaction
</string>
</value>
<value>
<string>
SaleInvoiceTransaction_createReversal
SaleInvoice
Transaction
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_createSlapOSReversalTransaction.py
deleted
100644 → 0
View file @
5128c902
if
context
.
getPaymentMode
()
==
"payzen"
:
reversal_payment
=
context
.
SaleInvoiceTransaction_createReversalPayzenTransaction
()
elif
context
.
getPaymentMode
()
==
"wechat"
:
reversal_payment
=
context
.
SaleInvoiceTransaction_createReversalWechatTransaction
()
else
:
message
=
context
.
Base_translateString
(
"The payment mode is unsupported."
)
return
context
.
Base_redirect
(
keep_items
=
{
'portal_status_message'
:
message
})
message
=
context
.
Base_translateString
(
"Reversal Transaction created."
)
return
reversal_payment
.
Base_redirect
(
keep_items
=
{
'portal_status_message'
:
message
})
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_createSlapOSReversalTransaction.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
**kw
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
SaleInvoiceTransaction_createSlapOSReversalTransaction
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_getSlapOSPaymentRelated.py
deleted
100644 → 0
View file @
5128c902
payment_transaction
=
context
.
SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
()
if
payment_transaction
is
not
None
:
return
payment_transaction
.
getRelativeUrl
()
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_getSlapOSPaymentRelatedValue.py
deleted
100644 → 0
View file @
5128c902
portal
=
context
.
getPortalObject
()
return
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
"started"
,
default_causality_uid
=
context
.
getUid
(),
default_payment_mode_uid
=
[
portal
.
portal_categories
.
payment_mode
.
payzen
.
getUid
(),
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
()],
)
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_getSlapOSPaymentRelatedValue.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
**kw
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_isLettered.py
0 → 100644
View file @
21504241
from
zExceptions
import
Unauthorized
if
REQUEST
is
not
None
:
raise
Unauthorized
portal
=
context
.
getObject
()
line_list
=
context
.
getMovementList
(
portal_type
=
portal
.
getPortalAccountingMovementTypeList
())
if
not
len
(
line_list
):
# Ignore since lines to group don't exist yet
return
False
source_list
=
[
i
.
getRelativeUrl
()
for
i
in
context
.
Base_getReceivableAccountList
()]
for
line
in
line_list
:
if
line
.
getSource
()
in
source_list
:
if
line
.
hasGroupingReference
():
return
line
.
getGroupingReference
()
master/bt5/slapos_
wechat/SkinTemplateItem/portal_skins/slapos_wechat/SaleInvoiceTransaction_createReversalWechatTransaction
.xml
→
master/bt5/slapos_
accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_isLettered
.xml
View file @
21504241
...
...
@@ -52,9 +52,17 @@
<key>
<string>
_params
</string>
</key>
<value>
<string>
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>
<value>
<string>
SaleInvoiceTransaction_
createReversalWechatTransaction
</string>
</value>
<value>
<string>
SaleInvoiceTransaction_
isLettered
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_
jio/SkinTemplateItem/portal_skins/slapos_hal_json_style/Payment
Transaction_redirectToManualSlapOSPayment.py
→
master/bt5/slapos_
accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoice
Transaction_redirectToManualSlapOSPayment.py
View file @
21504241
payment_mode
=
context
.
getPaymentMode
()
entity
=
context
.
getDestinationSectionValue
()
def
wrapWithShadow
(
entity
,
invoice
):
return
entity
.
Entity_createPaymentTransaction
([
invoice
])
payment
=
entity
.
Person_restrictMethodAsShadowUser
(
shadow_document
=
entity
,
callable_object
=
wrapWithShadow
,
argument_list
=
[
entity
,
context
])
if
web_site
is
None
:
web_site
=
context
.
getWebSiteValue
()
if
payment_mode
==
"wechat"
:
return
contex
t
.
PaymentTransaction_redirectToManualWechatPayment
(
web_site
=
web_site
)
return
paymen
t
.
PaymentTransaction_redirectToManualWechatPayment
(
web_site
=
web_site
)
elif
payment_mode
==
"payzen"
:
return
contex
t
.
PaymentTransaction_redirectToManualPayzenPayment
(
web_site
=
web_site
)
return
paymen
t
.
PaymentTransaction_redirectToManualPayzenPayment
(
web_site
=
web_site
)
raise
ValueError
(
"%s isn't an acceptable payment mode"
%
payment_mode
)
master/bt5/slapos_
jio/SkinTemplateItem/portal_skins/slapos_hal_json_style/Payment
Transaction_redirectToManualSlapOSPayment.xml
→
master/bt5/slapos_
accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoice
Transaction_redirectToManualSlapOSPayment.xml
View file @
21504241
...
...
@@ -54,7 +54,7 @@
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
Payment
Transaction_redirectToManualSlapOSPayment
</string>
</value>
<value>
<string>
SaleInvoice
Transaction_redirectToManualSlapOSPayment
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_accounting/SkinTemplateItem/portal_skins/slapos_accounting/SaleInvoiceTransaction_viewCancelPaymentAndCreateReversalTransactionDialog.xml
View file @
21504241
...
...
@@ -35,7 +35,11 @@
</item>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
SaleInvoiceTransaction_createSlapOSReversalTransaction
</string>
</value>
<value>
<string>
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
</string>
</value>
</item>
<item>
<key>
<string>
action_title
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
...
...
master/bt5/slapos_accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSAccountingAlarm.py
View file @
21504241
# -*- coding:
utf-8 -*-
# -*- coding:utf-8 -*-
##############################################################################
#
# Copyright (c) 2012 Nexedi SA and Contributors. All Rights Reserved.
# Copyright (c) 2002-2018 Nexedi SA and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
...
...
@@ -1411,14 +1432,14 @@ class TestSlapOSCancelSaleTnvoiceTransactionPaiedPaymentListAlarm(SlapOSTestCase
self
.
tic
()
self
.
assertNotEqual
(
'Not visited by PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Group
ed'
,
'Not visited by PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Letter
ed'
,
payment_transaction
.
getTitle
())
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Group
ed'
)
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Letter
ed'
)
def
test_payment_is_draft_payzen
(
self
):
self
.
_test_payment_is_draft
(
payment_mode
=
"payzen"
)
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Group
ed'
)
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransactionIs
Letter
ed'
)
def
test_payment_is_draft_wechat
(
self
):
self
.
_test_payment_is_draft
(
payment_mode
=
"wechat"
)
...
...
@@ -1440,14 +1461,14 @@ class TestSlapOSCancelSaleTnvoiceTransactionPaiedPaymentListAlarm(SlapOSTestCase
self
.
tic
()
self
.
assertNotEqual
(
'Not visited by PaymentTransaction_cancelIfSaleInvoiceTransaction
IsGroup
ed'
,
'Not visited by PaymentTransaction_cancelIfSaleInvoiceTransaction
isLetter
ed'
,
payment_transaction
.
getTitle
())
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransaction
IsGroup
ed'
)
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransaction
isLetter
ed'
)
def
test_payment_is_stopped_payzen
(
self
):
self
.
_test_payment_is_stopped
(
payment_mode
=
"payzen"
)
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransaction
IsGroup
ed'
)
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransaction
isLetter
ed'
)
def
test_payment_is_stopped_wechat
(
self
):
self
.
_test_payment_is_stopped
(
payment_mode
=
"wechat"
)
...
...
@@ -1469,14 +1490,13 @@ class TestSlapOSCancelSaleTnvoiceTransactionPaiedPaymentListAlarm(SlapOSTestCase
self
.
tic
()
self
.
assertNotEqual
(
'Visited by PaymentTransaction_cancelIfSaleInvoiceTransaction
IsGroup
ed'
,
'Visited by PaymentTransaction_cancelIfSaleInvoiceTransaction
isLetter
ed'
,
payment_transaction
.
getTitle
())
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransaction
IsGroup
ed'
)
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransaction
isLetter
ed'
)
def
test_payment_is_started_payzen
(
self
):
self
.
_test_payment_is_started
(
payment_mode
=
"payzen"
)
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransaction
IsGroup
ed'
)
@
simulateByTitlewMark
(
'PaymentTransaction_cancelIfSaleInvoiceTransaction
isLetter
ed'
)
def
test_payment_is_started_wechat
(
self
):
self
.
_test_payment_is_started
(
payment_mode
=
"wechat"
)
self
.
_test_payment_is_started
(
payment_mode
=
"wechat"
)
\ No newline at end of file
master/bt5/slapos_accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSAccountingAlarm.xml
View file @
21504241
...
...
@@ -6,12 +6,6 @@
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOSAccountingAlarm
</string>
</value>
...
...
@@ -55,28 +49,13 @@
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
I
=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
...
...
@@ -89,7 +68,7 @@
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
Q
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
</value>
</item>
</dictionary>
...
...
@@ -98,7 +77,7 @@
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
...
...
master/bt5/slapos_accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSAccountingSkins.py
View file @
21504241
...
...
@@ -26,7 +26,7 @@
#
##############################################################################
from
erp5.component.test.SlapOSTestCaseMixin
import
SlapOSTestCaseMixin
,
withAbort
,
simulate
from
erp5.component.test.SlapOSTestCaseMixin
import
SlapOSTestCaseMixin
,
withAbort
from
zExceptions
import
Unauthorized
from
DateTime
import
DateTime
...
...
@@ -50,6 +50,37 @@ class TestSlapOSAccounting(SlapOSTestCaseMixin):
reference
=
"TESTOSO-%s"
%
new_id
,
)
def
createSaleInvoiceTransactionForReversal
(
self
,
destination_section
=
None
,
price
=
2
,
payment_mode
=
"payzen"
):
new_title
=
self
.
generateNewId
()
new_reference
=
self
.
generateNewId
()
new_source_reference
=
self
.
generateNewId
()
new_destination_reference
=
self
.
generateNewId
()
invoice
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Sale Invoice Transaction"
,
title
=
new_title
,
start_date
=
DateTime
(),
reference
=
new_reference
,
source_reference
=
new_source_reference
,
destination_reference
=
new_destination_reference
,
destination_section
=
destination_section
,
payment_mode
=
payment_mode
,
specialise
=
"sale_trade_condition_module/slapos_aggregated_trade_condition"
,
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
invoice
,
'stopped'
)
invoice
.
newContent
(
title
=
""
,
portal_type
=
"Invoice Line"
,
quantity
=-
2
,
price
=
price
,
)
invoice
.
newContent
(
portal_type
=
"Sale Invoice Transaction Line"
,
source
=
"account_module/receivable"
,
quantity
=-
3
,
)
return
invoice
@
withAbort
def
test_IT_calculateSubscriptionStartDate_REQUEST_disallowed
(
self
):
item
=
self
.
createInstanceTree
()
...
...
@@ -209,43 +240,37 @@ class TestSlapOSAccounting(SlapOSTestCaseMixin):
self
.
portal
.
OpenSaleOrder_reindexIfIndexedBeforeLine
,
REQUEST
=
{})
def
test_SaleInvoiceTransaction_createReversalSaleInvoiceTransaction_redirect_payzen
(
self
):
sale_invoice_transaction
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
'payzen'
)
self
.
tic
()
@
simulate
(
"SaleInvoiceTransaction_createReversalPayzenTransaction"
,
"*args, **kwargs"
,
"""context.portal_workflow.doActionFor(context, action='edit_action', comment='Visited by SaleInvoiceTransaction_createReversalPayzenTransaction')
return context.getParentValue()"""
)
def
test_SaleInvoiceTransaction_createSlapOSReversalTransaction_payzen
(
self
):
sale_invoice_transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Sale Invoice Transaction"
)
sale_invoice_transaction
.
edit
(
payment_mode
=
"payzen"
)
redirect
=
sale_invoice_transaction
.
SaleInvoiceTransaction_createSlapOSReversalTransaction
()
self
.
assertTrue
(
redirect
.
endswith
(
'accounting_module?portal_status_message=Reversal%20Transaction%20created.'
),
"%s doesn't end with sale_invoice_transaction.SaleInvoiceTransaction_createSlapOSReversalTransaction()"
%
redirect
)
self
.
assertEqual
(
'Visited by SaleInvoiceTransaction_createReversalPayzenTransaction'
,
sale_invoice_transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
redirect
=
sale_invoice_transaction
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
()
self
.
assertTrue
(
redirect
.
endswith
(
'?portal_status_message=Reversal%20Transaction%20created.'
),
"%s doesn't end with expected response"
%
redirect
)
@
simulate
(
"SaleInvoiceTransaction_createReversalWechatTransaction"
,
"*args, **kwargs"
,
"""context.portal_workflow.doActionFor(context, action='edit_action', comment='Visited by SaleInvoiceTransaction_createReversalWechatTransaction')
return context.getParentValue()"""
)
def
test_SaleInvoiceTransaction_createSlapOSReversalTransaction_wechat
(
self
):
sale_invoice_transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Sale Invoice Transaction"
)
sale_invoice_transaction
.
edit
(
payment_mode
=
"wechat"
)
def
test_SaleInvoiceTransaction_createReversalSaleInvoiceTransaction_redirect_wechat
(
self
):
sale_invoice_transaction
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
'wechat'
)
self
.
tic
()
redirect
=
sale_invoice_transaction
.
SaleInvoiceTransaction_createSlapOSReversalTransaction
()
self
.
assertTrue
(
redirect
.
endswith
(
'accounting_module?portal_status_message=Reversal%20Transaction%20created.'
),
"%s doesn't end with sale_invoice_transaction.SaleInvoiceTransaction_createSlapOSReversalTransaction()"
%
redirect
)
self
.
assertEqual
(
'Visited by SaleInvoiceTransaction_createReversalWechatTransaction'
,
sale_invoice_transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
redirect
=
sale_invoice_transaction
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
()
self
.
assertTrue
(
redirect
.
endswith
(
'?portal_status_message=Reversal%20Transaction%20created.'
),
"%s doesn't end with expected response"
%
redirect
)
def
test_SaleInvoiceTransaction_create
SlapOSReversalTransaction
_unknown
(
self
):
def
test_SaleInvoiceTransaction_create
ReversalSaleInvoiceTransaction_redirect
_unknown
(
self
):
sale_invoice_transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Sale Invoice Transaction"
)
sale_invoice_transaction
.
edit
(
payment_mode
=
"unknown"
)
redirect
=
sale_invoice_transaction
.
SaleInvoiceTransaction_create
SlapOSReversal
Transaction
()
redirect
=
sale_invoice_transaction
.
SaleInvoiceTransaction_create
ReversalSaleInvoice
Transaction
()
self
.
assertTrue
(
redirect
.
endswith
(
'%s?portal_status_message=The%%20payment%%20mode%%20is%%20unsupported.'
%
sale_invoice_transaction
.
getRelativeUrl
()),
"%s doesn't end with %s?portal_status_message=The%%20payment%%20mode%%20is%%20unsupported."
%
(
redirect
,
sale_invoice_transaction
.
getRelativeUrl
()))
self
.
assertTrue
(
redirect
.
endswith
(
'%s?portal_status_message=The%%20payment%%20mode%%20is%%20unsupported.'
%
sale_invoice_transaction
.
getRelativeUrl
()),
"%s doesn't end with %s?portal_status_message=The%%20payment%%20mode%%20is%%20unsupported."
%
(
redirect
,
sale_invoice_transaction
.
getRelativeUrl
()))
def
test_SaleInvoiceTransaction_resetPaymentMode
(
self
):
sale_invoice_transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Sale Invoice Transaction"
)
...
...
@@ -289,19 +314,6 @@ return context.getParentValue()""")
def
test_AccountingTransactionModule_getUnpaidInvoiceList
(
self
):
person
=
self
.
makePerson
(
user
=
1
)
payment_template
=
self
.
portal
.
restrictedTraverse
(
self
.
portal
.
portal_preferences
.
getPreferredDefaultPrePaymentTemplate
())
payment
=
payment_template
.
Base_createCloneDocument
(
batch_mode
=
1
)
for
line
in
payment
.
contentValues
():
if
line
.
getSource
()
==
"account_module/payment_to_encash"
:
line
.
setQuantity
(
-
1
)
elif
line
.
getSource
()
==
"account_module/receivable"
:
line
.
setQuantity
(
1
)
payment
.
confirm
()
payment
.
start
()
template
=
self
.
portal
.
restrictedTraverse
(
self
.
portal
.
portal_preferences
.
getPreferredDefaultPrePaymentSubscriptionInvoiceTemplate
())
...
...
@@ -321,26 +333,486 @@ return context.getParentValue()""")
cell
.
edit
(
quantity
=
1
)
cell
.
setPrice
(
1
)
payment
.
setCausalityValue
(
current_invoice
)
payment
.
setDestinationSectionValue
(
person
)
current_invoice
.
plan
()
current_invoice
.
confirm
()
current_invoice
.
startBuilding
()
current_invoice
.
reindexObject
()
current_invoice
.
stop
()
self
.
tic
()
current_invoice
.
Delivery_manageBuildingCalculatingDelivery
()
self
.
tic
()
applied_rule
=
current_invoice
.
getCausalityRelated
(
portal_type
=
"Applied Rule"
)
for
sm
in
self
.
portal
.
portal_catalog
(
portal_type
=
'Simulation Movement'
,
simulation_state
=
[
'draft'
,
'planned'
,
None
],
left_join_list
=
[
'delivery_uid'
],
delivery_uid
=
None
,
path
=
"%%%s%%"
%
applied_rule
):
if
sm
.
getDelivery
()
is
not
None
:
continue
root_applied_rule
=
sm
.
getRootAppliedRule
()
root_applied_rule_path
=
root_applied_rule
.
getPath
()
sm
.
getCausalityValue
(
portal_type
=
'Business Link'
).
build
(
path
=
'%s/%%'
%
root_applied_rule_path
)
self
.
tic
()
self
.
login
(
person
.
getUserId
())
unpaid_invoice_list
=
self
.
portal
.
accounting_module
.
AccountingTransactionModule_getUnpaidInvoiceList
()
self
.
assertEqual
(
self
.
portal
.
accounting_module
.
AccountingTransactionModule_getUnpaidInvoiceList
()
,
[
current_invoice
])
[
i
.
getRelativeUrl
()
for
i
in
unpaid_invoice_list
]
,
[
current_invoice
.
getRelativeUrl
()
])
self
.
login
()
payment_template
=
self
.
portal
.
restrictedTraverse
(
self
.
portal
.
portal_preferences
.
getPreferredDefaultPrePaymentTemplate
())
payment
=
payment_template
.
Base_createCloneDocument
(
batch_mode
=
1
)
for
line
in
payment
.
contentValues
():
if
line
.
getSource
()
==
"account_module/payment_to_encash"
:
line
.
setQuantity
(
-
1
)
elif
line
.
getSource
()
==
"account_module/receivable"
:
line
.
setQuantity
(
1
)
payment
.
confirm
()
payment
.
start
()
payment
.
setCausalityValue
(
current_invoice
)
payment
.
setDestinationSectionValue
(
person
)
payment
.
stop
()
self
.
tic
()
is_lettered
=
False
letter
=
None
for
line
in
current_invoice
.
contentValues
():
if
line
.
getSource
()
==
"account_module/receivable"
:
is_lettered
=
True
letter
=
line
.
getGroupingReference
()
self
.
assertTrue
(
is_lettered
)
# is it groupped?
is_lettered
=
False
for
line
in
payment
.
contentValues
():
if
line
.
getSource
()
==
"account_module/receivable"
:
is_lettered
=
True
self
.
assertEqual
(
letter
,
line
.
getGroupingReference
())
self
.
assertTrue
(
is_lettered
)
self
.
login
(
person
.
getUserId
())
unpaid_invoice_list
=
self
.
portal
.
accounting_module
.
AccountingTransactionModule_getUnpaidInvoiceList
()
self
.
assertEqual
(
self
.
portal
.
accounting_module
.
AccountingTransactionModule_getUnpaidInvoiceList
(),
[])
\ No newline at end of file
[
i
.
getRelativeUrl
()
for
i
in
unpaid_invoice_list
],
[])
@
withAbort
def
test_createReversalSaleInvoiceTransaction_bad_portal_type
(
self
):
self
.
assertRaises
(
AssertionError
,
self
.
portal
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
,
batch_mode
=
1
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_bad_payment_mode
(
self
):
invoice
=
self
.
createSaleInvoiceTransactionForReversal
()
invoice
.
edit
(
payment_mode
=
"cash"
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
,
batch_mode
=
1
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_bad_state
(
self
,
payment_mode
=
'payzen'
):
invoice
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
payment_mode
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
invoice
,
'delivered'
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
,
batch_mode
=
1
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_zero_price
(
self
,
payment_mode
=
'payzen'
):
invoice
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
payment_mode
)
invoice
.
manage_delObjects
(
invoice
.
contentIds
())
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
,
batch_mode
=
1
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_wrong_trade_condition
(
self
,
payment_mode
=
'payzen'
):
invoice
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
payment_mode
)
invoice
.
edit
(
specialise
=
None
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
,
batch_mode
=
1
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_paid
(
self
,
payment_mode
=
'payzen'
):
invoice
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
payment_mode
)
line
=
invoice
.
contentValues
(
portal_type
=
"Sale Invoice Transaction Line"
)[
0
]
line
.
edit
(
grouping_reference
=
"azerty"
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
,
batch_mode
=
1
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_registered_payment
(
self
,
payment_mode
=
'payzen'
):
invoice
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
payment_mode
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
payment_mode
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
self
.
tic
()
payment
.
PaymentTransaction_generatePayzenId
()
self
.
assertRaises
(
ValueError
,
invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
,
batch_mode
=
1
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_ok
(
self
,
payment_mode
=
'payzen'
):
invoice
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
payment_mode
)
self
.
tic
()
reversale_invoice
=
invoice
.
\
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
(
batch_mode
=
1
)
self
.
assertEqual
(
invoice
.
getPaymentMode
(
""
),
""
)
self
.
assertEqual
(
reversale_invoice
.
getTitle
(),
"Reversal Transaction for %s"
%
invoice
.
getTitle
())
self
.
assertEqual
(
reversale_invoice
.
getDescription
(),
"Reversal Transaction for %s"
%
invoice
.
getTitle
())
self
.
assertEqual
(
reversale_invoice
.
getCausality
(),
invoice
.
getRelativeUrl
())
self
.
assertEqual
(
reversale_invoice
.
getSimulationState
(),
"stopped"
)
self
.
assertEqual
(
invoice
.
getSimulationState
(),
"stopped"
)
invoice_line_id
=
invoice
.
contentValues
(
portal_type
=
"Invoice Line"
)[
0
].
getId
()
transaction_line_id
=
invoice
.
contentValues
(
portal_type
=
"Sale Invoice Transaction Line"
)[
0
].
getId
()
self
.
assertEqual
(
invoice
[
invoice_line_id
].
getQuantity
(),
-
reversale_invoice
[
invoice_line_id
].
getQuantity
())
self
.
assertEqual
(
reversale_invoice
[
invoice_line_id
].
getQuantity
(),
2
)
self
.
assertEqual
(
invoice
[
transaction_line_id
].
getQuantity
(),
-
reversale_invoice
[
transaction_line_id
].
getQuantity
())
self
.
assertEqual
(
reversale_invoice
[
transaction_line_id
].
getQuantity
(),
3
)
self
.
assertEqual
(
len
(
invoice
.
getMovementList
()),
2
)
# Both invoice should have a grouping reference
self
.
assertNotEqual
(
invoice
[
transaction_line_id
].
getGroupingReference
(
""
),
""
)
self
.
assertEqual
(
invoice
[
transaction_line_id
].
getGroupingReference
(
"1"
),
reversale_invoice
[
transaction_line_id
].
getGroupingReference
(
"2"
))
# All references should be regenerated
self
.
assertNotEqual
(
invoice
.
getReference
(
""
),
reversale_invoice
.
getReference
(
""
))
self
.
assertNotEqual
(
invoice
.
getSourceReference
(
""
),
reversale_invoice
.
getSourceReference
(
""
))
self
.
assertNotEqual
(
invoice
.
getDestinationReference
(
""
),
reversale_invoice
.
getDestinationReference
(
""
))
self
.
assertTrue
(
invoice
.
SaleInvoiceTransaction_isLettered
())
self
.
assertTrue
(
reversale_invoice
.
SaleInvoiceTransaction_isLettered
())
# Another trade condition
self
.
assertEqual
(
reversale_invoice
.
getSpecialise
(),
"sale_trade_condition_module/slapos_manual_accounting_trade_condition"
)
self
.
tic
()
@
withAbort
def
test_createReversalSaleInvoiceTransaction_ok_dont_autocancel
(
self
,
payment_mode
=
'payzen'
):
invoice
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
payment_mode
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
payment_mode
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
self
.
tic
()
reversale_invoice
=
invoice
.
\
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
(
batch_mode
=
1
)
self
.
assertEqual
(
invoice
.
getPaymentMode
(
""
),
""
)
# Related payment is cancelled by a proper alarm.
self
.
assertEqual
(
payment
.
getSimulationState
(),
"started"
)
self
.
assertEqual
(
reversale_invoice
.
getTitle
(),
"Reversal Transaction for %s"
%
invoice
.
getTitle
())
self
.
assertEqual
(
reversale_invoice
.
getDescription
(),
"Reversal Transaction for %s"
%
invoice
.
getTitle
())
self
.
assertEqual
(
reversale_invoice
.
getCausality
(),
invoice
.
getRelativeUrl
())
self
.
assertEqual
(
reversale_invoice
.
getSimulationState
(),
"stopped"
)
self
.
assertEqual
(
invoice
.
getSimulationState
(),
"stopped"
)
invoice_line_id
=
invoice
.
contentValues
(
portal_type
=
"Invoice Line"
)[
0
].
getId
()
transaction_line_id
=
invoice
.
contentValues
(
portal_type
=
"Sale Invoice Transaction Line"
)[
0
].
getId
()
self
.
assertEqual
(
invoice
[
invoice_line_id
].
getQuantity
(),
-
reversale_invoice
[
invoice_line_id
].
getQuantity
())
self
.
assertEqual
(
reversale_invoice
[
invoice_line_id
].
getQuantity
(),
2
)
self
.
assertEqual
(
invoice
[
transaction_line_id
].
getQuantity
(),
-
reversale_invoice
[
transaction_line_id
].
getQuantity
())
self
.
assertEqual
(
reversale_invoice
[
transaction_line_id
].
getQuantity
(),
3
)
self
.
assertEqual
(
len
(
invoice
.
getMovementList
()),
2
)
# Both invoice should have a grouping reference
self
.
assertNotEqual
(
invoice
[
transaction_line_id
].
getGroupingReference
(
""
),
""
)
self
.
assertEqual
(
invoice
[
transaction_line_id
].
getGroupingReference
(
"1"
),
reversale_invoice
[
transaction_line_id
].
getGroupingReference
(
"2"
))
# All references should be regenerated
self
.
assertNotEqual
(
invoice
.
getReference
(
""
),
reversale_invoice
.
getReference
(
""
))
self
.
assertNotEqual
(
invoice
.
getSourceReference
(
""
),
reversale_invoice
.
getSourceReference
(
""
))
self
.
assertNotEqual
(
invoice
.
getDestinationReference
(
""
),
reversale_invoice
.
getDestinationReference
(
""
))
self
.
assertTrue
(
invoice
.
SaleInvoiceTransaction_isLettered
())
self
.
assertTrue
(
reversale_invoice
.
SaleInvoiceTransaction_isLettered
())
# Another trade condition
self
.
assertEqual
(
reversale_invoice
.
getSpecialise
(),
"sale_trade_condition_module/slapos_manual_accounting_trade_condition"
)
self
.
tic
()
@
withAbort
def
test_createReversalSaleInvoiceTransaction_wechat_bad_state
(
self
):
self
.
test_createReversalSaleInvoiceTransaction_bad_state
(
payment_mode
=
'wechat'
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_wechat_zero_price
(
self
):
self
.
test_createReversalSaleInvoiceTransaction_zero_price
(
payment_mode
=
'wechat'
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_wechat_wrong_trade_condition
(
self
):
self
.
test_createReversalSaleInvoiceTransaction_wrong_trade_condition
(
payment_mode
=
'wechat'
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_wechat_paid
(
self
):
self
.
test_createReversalSaleInvoiceTransaction_paid
(
payment_mode
=
'wechat'
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_wechat_registered_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransactionForReversal
(
payment_mode
=
'wechat'
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
'wechat'
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
self
.
tic
()
payment
.
PaymentTransaction_generateWechatId
()
self
.
assertRaises
(
ValueError
,
invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
,
batch_mode
=
1
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_wechat_ok
(
self
):
self
.
test_createReversalSaleInvoiceTransaction_ok
(
payment_mode
=
'wechat'
)
@
withAbort
def
test_createReversalSaleInvoiceTransaction_wechat_ok_dont_autocancel
(
self
):
self
.
test_createReversalSaleInvoiceTransaction_ok_dont_autocancel
(
payment_mode
=
'wechat'
)
@
withAbort
def
test_AccountingTransaction_getPaymentState_draft_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
@
withAbort
def
test_AccountingTransaction_getPaymentState_deleted_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
delete
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
@
withAbort
def
test_AccountingTransaction_getPaymentState_cancelled_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
cancel
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
@
withAbort
def
test_AccountingTransaction_getPaymentState_planned_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
plan
()
self
.
assertEqual
(
"Ongoing"
,
invoice
.
AccountingTransaction_getPaymentState
())
@
withAbort
def
test_AccountingTransaction_getPaymentState_confirmed_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
setStartDate
(
DateTime
())
invoice
.
confirm
()
self
.
assertEqual
(
"Ongoing"
,
invoice
.
AccountingTransaction_getPaymentState
())
@
withAbort
def
test_AccountingTransaction_getPaymentState_started_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
start
()
self
.
assertEqual
(
"Ongoing"
,
invoice
.
AccountingTransaction_getPaymentState
())
@
withAbort
def
test_AccountingTransaction_getPaymentState_payzen_reversed_payment
(
self
):
invoice
=
self
.
createStoppedSaleInvoiceTransaction
()
self
.
tic
()
reversal
=
invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
(
batch_mode
=
1
)
self
.
tic
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
self
.
assertEqual
(
0
,
invoice
.
getTotalPrice
()
+
reversal
.
getTotalPrice
())
@
withAbort
def
test_AccountingTransaction_getPaymentState_wechat_reversed_payment
(
self
):
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
payment_mode
=
'wechat'
)
self
.
tic
()
reversal
=
invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
(
batch_mode
=
1
)
self
.
tic
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
self
.
assertEqual
(
0
,
invoice
.
getTotalPrice
()
+
reversal
.
getTotalPrice
())
def
test_AccountingTransaction_getPaymentState_payzen_free_payment
(
self
):
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
price
=
0
)
self
.
tic
()
self
.
assertEqual
(
"Free!"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_wechat_free_payment
(
self
):
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
price
=
0
,
payment_mode
=
'wechat'
)
self
.
tic
()
self
.
assertEqual
(
"Free!"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_payzen_unpaid_payment
(
self
):
invoice
=
self
.
createStoppedSaleInvoiceTransaction
()
# If payment is not indexed or not started the state should be Pay Now
self
.
assertEqual
(
"Pay Now"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_wechat_unpaid_payment
(
self
):
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
payment_mode
=
'wechat'
)
# If payment is not indexed or not started the state should be Pay Now
self
.
assertEqual
(
"Pay Now"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_payzen_paynow_payment
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
self
.
login
(
person
.
getUserId
())
self
.
assertEqual
(
"Pay Now"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_wechat_paynow_payment
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
(),
payment_mode
=
"wechat"
)
self
.
tic
()
self
.
login
(
person
.
getUserId
())
self
.
assertEqual
(
"Pay Now"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_payzen_waiting_payment
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
())
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
'payzen'
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
payment
.
PaymentTransaction_generatePayzenId
()
self
.
tic
()
self
.
login
(
person
.
getUserId
())
self
.
assertEqual
(
"Waiting for payment confirmation"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_wechat_waiting_payment
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
(),
payment_mode
=
'wechat'
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
'wechat'
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
payment
.
PaymentTransaction_generateWechatId
()
self
.
tic
()
self
.
login
(
person
.
getUserId
())
self
.
assertEqual
(
"Waiting for payment confirmation"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_payzen_papaid_payment
(
self
):
invoice
=
self
.
createStoppedSaleInvoiceTransaction
()
self
.
tic
()
for
line
in
invoice
.
getMovementList
(
self
.
portal
.
getPortalAccountingMovementTypeList
()):
node_value
=
line
.
getSourceValue
(
portal_type
=
'Account'
)
if
node_value
.
getAccountType
()
==
'asset/receivable'
:
line
.
setGroupingReference
(
"TEST%s"
%
self
.
new_id
)
self
.
assertEqual
(
"Paid"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_wechat_paid_payment
(
self
):
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
payment_mode
=
'wechat'
)
self
.
tic
()
for
line
in
invoice
.
getMovementList
(
self
.
portal
.
getPortalAccountingMovementTypeList
()):
node_value
=
line
.
getSourceValue
(
portal_type
=
'Account'
)
if
node_value
.
getAccountType
()
==
'asset/receivable'
:
line
.
setGroupingReference
(
"TEST%s"
%
self
.
new_id
)
self
.
assertEqual
(
"Paid"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_wire_transfer_paid_payment
(
self
):
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
payment_mode
=
'wire_transfer'
)
self
.
tic
()
for
line
in
invoice
.
getMovementList
(
self
.
portal
.
getPortalAccountingMovementTypeList
()):
node_value
=
line
.
getSourceValue
(
portal_type
=
'Account'
)
if
node_value
.
getAccountType
()
==
'asset/receivable'
:
line
.
setGroupingReference
(
"TEST%s"
%
self
.
new_id
)
self
.
assertEqual
(
"Paid"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_Base_getReceivableAccountList
(
self
):
account_list
=
self
.
portal
.
Base_getReceivableAccountList
()
self
.
assertIn
(
'account_module/receivable'
,
[
i
.
getRelativeUrl
()
for
i
in
account_list
])
\ No newline at end of file
master/bt5/slapos_
payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenBuilder
.py
→
master/bt5/slapos_
accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSEntityCreatePayment
.py
View file @
21504241
# -*- coding:
utf-8 -*-
# -*- coding:utf-8 -*-
##############################################################################
#
# Copyright (c) 2012 Nexedi SA and Contributors. All Rights Reserved.
# Copyright (c) 2022 Nexedi SA and Contributors. All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
from
erp5.component.test.SlapOSTestCaseMixin
import
SlapOSTestCaseMixin
class
TestSlapOS
PaymentTransactionOrderBuilder
Mixin
(
SlapOSTestCaseMixin
):
class
TestSlapOS
EntityCreatePayment
Mixin
(
SlapOSTestCaseMixin
):
def
sumReceivable
(
self
,
payment_transaction
):
quantity
=
.
0
...
...
@@ -22,7 +36,7 @@ class TestSlapOSPaymentTransactionOrderBuilderMixin(SlapOSTestCaseMixin):
def
assertPayment
(
self
,
payment
,
invoice
):
self
.
assertEqual
(
self
.
sumReceivable
(
invoice
),
payment
\
.
PaymentTransaction_getTotalPayablePrice
())
self
.
assertEqual
(
'
confirm
ed'
,
payment
.
getSimulationState
())
self
.
assertEqual
(
'
start
ed'
,
payment
.
getSimulationState
())
self
.
assertSameSet
([],
payment
.
checkConsistency
())
self
.
assertSameSet
([
invoice
],
payment
.
getCausalityValueList
())
self
.
assertSameSet
([],
payment
.
getCausalityRelatedValueList
(
...
...
@@ -63,19 +77,14 @@ class TestSlapOSPaymentTransactionOrderBuilderMixin(SlapOSTestCaseMixin):
'destination/account_module/payable'
,
'source/account_module/receivable'
])
def
emptyBuild
(
self
,
**
kw
):
delivery_list
=
self
.
_build
(
**
kw
)
self
.
assert
SameSet
([],
delivery_lis
t
)
return
delivery_lis
t
def
fullBuild
(
self
,
person
,
invoice_list
):
payment
=
person
.
Entity_createPaymentTransaction
(
invoice_list
)
self
.
assert
NotEqual
(
None
,
paymen
t
)
return
paymen
t
def
fullBuild
(
self
,
**
kw
):
delivery_list
=
self
.
_build
(
**
kw
)
self
.
assertNotEqual
([],
delivery_list
)
return
delivery_list
def
_build
(
self
,
**
kw
):
return
self
.
portal
.
portal_orders
.
slapos_payment_transaction_builder
.
build
(
**
kw
)
def
resetPaymentTag
(
self
,
invoice
):
payment_tag
=
"sale_invoice_transaction_create_payment_%s"
%
invoice
.
getUid
()
invoice
.
REQUEST
.
set
(
payment_tag
,
None
)
def
_test
(
self
):
person
=
self
.
portal
.
person_module
.
template_member
\
...
...
@@ -87,12 +96,8 @@ class TestSlapOSPaymentTransactionOrderBuilderMixin(SlapOSTestCaseMixin):
invoice
.
confirm
()
invoice
.
stop
()
self
.
tic
()
payment
_list
=
self
.
fullBuild
(
uid
=
invoice
.
getUid
()
)
payment
=
self
.
fullBuild
(
person
,
[
invoice
]
)
self
.
tic
()
self
.
assertEqual
(
1
,
len
(
payment_list
))
payment
=
payment_list
[
0
].
getObject
()
self
.
assertPayment
(
payment
,
invoice
)
def
_test_twice
(
self
):
...
...
@@ -105,13 +110,13 @@ class TestSlapOSPaymentTransactionOrderBuilderMixin(SlapOSTestCaseMixin):
invoice
.
confirm
()
invoice
.
stop
()
self
.
tic
()
payment_list
=
self
.
fullBuild
(
uid
=
invoice
.
getUid
())
payment
=
self
.
fullBuild
(
person
,
[
invoice
])
self
.
assertPayment
(
payment
,
invoice
)
self
.
tic
()
self
.
emptyBuild
(
uid
=
invoice
.
getUid
()
)
self
.
resetPaymentTag
(
invoice
)
self
.
assertEqual
(
1
,
len
(
payment_list
))
payment
=
payment_list
[
0
].
getObject
()
# Create twice, generate 2 payments
payment
=
self
.
fullBuild
(
person
,
[
invoice
])
self
.
assertPayment
(
payment
,
invoice
)
def
_test_twice_transaction
(
self
):
...
...
@@ -124,13 +129,9 @@ class TestSlapOSPaymentTransactionOrderBuilderMixin(SlapOSTestCaseMixin):
invoice
.
confirm
()
invoice
.
stop
()
self
.
tic
()
payment
_list
=
self
.
fullBuild
(
uid
=
invoice
.
getUid
()
)
self
.
emptyBuild
(
uid
=
invoice
.
getUid
()
)
payment
=
self
.
fullBuild
(
person
,
[
invoice
]
)
self
.
assertRaises
(
ValueError
,
person
.
Entity_createPaymentTransaction
,
[
invoice
]
)
self
.
tic
()
self
.
assertEqual
(
1
,
len
(
payment_list
))
payment
=
payment_list
[
0
].
getObject
()
self
.
assertPayment
(
payment
,
invoice
)
def
_test_twice_indexation
(
self
):
...
...
@@ -143,17 +144,18 @@ class TestSlapOSPaymentTransactionOrderBuilderMixin(SlapOSTestCaseMixin):
invoice
.
confirm
()
invoice
.
stop
()
self
.
tic
()
payment
_list
=
self
.
fullBuild
(
uid
=
invoice
.
getUid
()
)
payment
=
self
.
fullBuild
(
person
,
[
invoice
]
)
self
.
commit
()
# the payment transaction is immediately indexed
self
.
assertEqual
(
1
,
len
(
payment_list
))
self
.
emptyBuild
(
uid
=
invoice
.
getUid
())
self
.
tic
()
# Request was over, so emulate start a new one
self
.
resetPaymentTag
(
invoice
)
# Should we take into account that a payment is ongoing?
payment2
=
self
.
fullBuild
(
person
,
[
invoice
])
payment
=
payment_list
[
0
].
getObject
()
self
.
tic
()
self
.
assertPayment
(
payment
,
invoice
)
self
.
assertPayment
(
payment2
,
invoice
)
def
_test_cancelled_payment
(
self
):
person
=
self
.
portal
.
person_module
.
template_member
\
...
...
@@ -165,18 +167,13 @@ class TestSlapOSPaymentTransactionOrderBuilderMixin(SlapOSTestCaseMixin):
invoice
.
confirm
()
invoice
.
stop
()
self
.
tic
()
payment
_list
=
self
.
fullBuild
(
uid
=
invoice
.
getUid
()
)
payment
_list
[
0
]
.
cancel
()
payment
=
self
.
fullBuild
(
person
,
[
invoice
]
)
payment
.
cancel
()
self
.
tic
()
self
.
portal
.
REQUEST
.
set
(
"sale_invoice_transaction_order_builder_%s"
%
invoice
.
getUid
(),
Non
e
)
self
.
resetPaymentTag
(
invoic
e
)
payment
_list
=
self
.
fullBuild
(
uid
=
invoice
.
getUid
()
)
payment
=
self
.
fullBuild
(
person
,
[
invoice
]
)
self
.
tic
()
self
.
emptyBuild
(
uid
=
invoice
.
getUid
())
self
.
assertEqual
(
1
,
len
(
payment_list
))
payment
=
payment_list
[
0
].
getObject
()
self
.
assertPayment
(
payment
,
invoice
)
def
_test_two_invoices
(
self
):
...
...
@@ -195,7 +192,8 @@ class TestSlapOSPaymentTransactionOrderBuilderMixin(SlapOSTestCaseMixin):
invoice_2
.
confirm
()
invoice_2
.
stop
()
self
.
tic
()
payment_list
=
self
.
fullBuild
(
uid
=
[
invoice_1
.
getUid
(),
invoice_2
.
getUid
()])
payment_list
=
[
self
.
fullBuild
(
person
,
[
invoice_1
]),
self
.
fullBuild
(
person
,
[
invoice_2
])]
self
.
tic
()
self
.
assertEqual
(
2
,
len
(
payment_list
))
...
...
@@ -236,21 +234,17 @@ class TestSlapOSPaymentTransactionOrderBuilderMixin(SlapOSTestCaseMixin):
invoice
.
confirm
()
invoice
.
stop
()
self
.
tic
()
payment
_list
=
self
.
fullBuild
(
uid
=
[
invoice
.
getUid
()
])
payment
=
self
.
fullBuild
(
person
,
[
invoice
])
self
.
tic
()
self
.
assertEqual
(
1
,
len
(
payment_list
))
payment
=
payment_list
[
0
].
getObject
()
self
.
assertPayment
(
payment
,
invoice
)
class
TestSlapOS
PaymentTransactionOrderBuilder
(
TestSlapOSPaymentTransactionOrderBuilder
Mixin
):
payment_mode
=
"
payzen
"
class
TestSlapOS
EntityCreatePayment
(
TestSlapOSEntityCreatePayment
Mixin
):
payment_mode
=
"
wire_transfer
"
test
=
TestSlapOS
PaymentTransactionOrderBuilder
Mixin
.
_test
test_twice
=
TestSlapOS
PaymentTransactionOrderBuilder
Mixin
.
_test_twice
test_twice_transaction
=
TestSlapOS
PaymentTransactionOrderBuilder
Mixin
.
_test_twice_transaction
test_twice_indexation
=
TestSlapOS
PaymentTransactionOrderBuilder
Mixin
.
_test_twice_indexation
test_cancelled_payment
=
TestSlapOS
PaymentTransactionOrderBuilder
Mixin
.
_test_cancelled_payment
test_two_invoices
=
TestSlapOS
PaymentTransactionOrderBuilder
Mixin
.
_test_two_invoices
test_two_lines
=
TestSlapOS
PaymentTransactionOrderBuilder
Mixin
.
_test_two_lines
test
=
TestSlapOS
EntityCreatePayment
Mixin
.
_test
test_twice
=
TestSlapOS
EntityCreatePayment
Mixin
.
_test_twice
test_twice_transaction
=
TestSlapOS
EntityCreatePayment
Mixin
.
_test_twice_transaction
test_twice_indexation
=
TestSlapOS
EntityCreatePayment
Mixin
.
_test_twice_indexation
test_cancelled_payment
=
TestSlapOS
EntityCreatePayment
Mixin
.
_test_cancelled_payment
test_two_invoices
=
TestSlapOS
EntityCreatePayment
Mixin
.
_test_two_invoices
test_two_lines
=
TestSlapOS
EntityCreatePayment
Mixin
.
_test_two_lines
master/bt5/slapos_
wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatBuilder
.xml
→
master/bt5/slapos_
accounting/TestTemplateItem/portal_components/test.erp5.testSlapOSEntityCreatePayment
.xml
View file @
21504241
...
...
@@ -6,15 +6,9 @@
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOS
WechatBuilder
</string>
</value>
<value>
<string>
testSlapOS
EntityCreatePayment
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
...
...
@@ -24,7 +18,7 @@
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
test.erp5.testSlapOS
WechatBuilder
</string>
</value>
<value>
<string>
test.erp5.testSlapOS
EntityCreatePayment
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
...
...
@@ -55,28 +49,13 @@
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
I
=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
...
...
@@ -89,7 +68,7 @@
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
Q
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
</value>
</item>
</dictionary>
...
...
@@ -98,7 +77,7 @@
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
...
...
master/bt5/slapos_accounting/bt/template_test_id_list
View file @
21504241
...
...
@@ -6,4 +6,5 @@ test.erp5.testSlapOSContractSkins
test.erp5.testSlapOSAccountingInteractionWorkflow
test.erp5.testSlapOSAccountingSkins
test.erp5.testSlapOSAccountingAlarm
test.erp5.testSlapOSContractAlarm
\ No newline at end of file
test.erp5.testSlapOSContractAlarm
test.erp5.testSlapOSEntityCreatePayment
\ No newline at end of file
master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseDefaultScenarioMixin.py
View file @
21504241
# -*- coding:
utf-8 -*-
# -*- coding:utf-8 -*-
##############################################################################
#
# Copyright (c) 2012 Nexedi SA and Contributors. All Rights Reserved.
# Copyright (c) 2019 Nexedi SA and Contributors. All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
...
...
@@ -432,23 +446,6 @@ class DefaultScenarioMixin(TestSlapOSSecurityMixin):
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
builder
=
self
.
portal
.
portal_orders
.
slapos_payment_transaction_builder
for
_
in
range
(
500
):
# build the aggregated payment
self
.
stepCallSlaposTriggerPaymentTransactionOrderBuilderAlarm
()
self
.
tic
()
# If there is something unbuild recall alarm.
if
len
(
builder
.
OrderBuilder_generateUnrelatedInvoiceList
()):
break
# start the payzen payment
self
.
stepCallSlaposPayzenUpdateConfirmedPaymentAlarm
()
self
.
tic
()
# stabilise the payment deliveries and expand them
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
# trigger the CRM interaction
self
.
stepCallSlaposCrmCreateRegularisationRequestAlarm
()
self
.
tic
()
...
...
@@ -560,18 +557,7 @@ class DefaultScenarioMixin(TestSlapOSSecurityMixin):
payment_list
=
invoice
.
getCausalityRelatedValueList
(
portal_type
=
'Payment Transaction'
)
self
.
assertEqual
(
1
,
len
(
payment_list
))
payment
=
payment_list
[
0
].
getObject
()
causality_list
=
payment
.
getCausalityValueList
()
self
.
assertSameSet
([
invoice
],
causality_list
)
self
.
assertEqual
(
'started'
,
payment
.
getSimulationState
())
self
.
assertEqual
(
'draft'
,
payment
.
getCausalityState
())
self
.
assertEqual
(
-
1
*
payment
.
PaymentTransaction_getTotalPayablePrice
(),
invoice
.
getTotalPrice
())
self
.
assertEqual
(
0
,
len
(
payment_list
))
def
assertPersonDocumentCoverage
(
self
,
person
):
self
.
login
()
...
...
@@ -666,28 +652,7 @@ class DefaultScenarioMixin(TestSlapOSSecurityMixin):
self
.
assertEqual
(
None
,
to_click_message
)
@
changeSkin
(
'RJS'
)
def
useWechatManually
(
self
,
web_site
,
user_id
,
is_email_expected
=
True
):
person
=
self
.
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Person"
,
user_id
=
user_id
)
self
.
assertNotEqual
(
person
,
None
)
self
.
assertInvoiceNotification
(
person
,
is_email_expected
)
# If you are using live test, be aware that the call of the alarm can be
# not enough for the number of objects on the site.
document_id
=
self
.
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
"started"
,
destination_section_uid
=
person
.
getUid
()
).
getId
()
web_site
.
accounting_module
[
document_id
].
\
PaymentTransaction_redirectToManualWechatPayment
()
@
changeSkin
(
'RJS'
)
def
usePayzenManually
(
self
,
web_site
,
user_id
,
is_email_expected
=
True
):
def
usePaymentManually
(
self
,
web_site
,
user_id
,
is_email_expected
=
True
,
subscription_request
=
None
):
person
=
self
.
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Person"
,
user_id
=
user_id
)
...
...
@@ -695,17 +660,27 @@ class DefaultScenarioMixin(TestSlapOSSecurityMixin):
self
.
assertNotEqual
(
person
,
None
)
self
.
assertInvoiceNotification
(
person
,
is_email_expected
)
# Pay to payzen...
# If you are using live test, be aware that the call of the alarm can be
# not enough for the number of objects on the site.
document_id
=
self
.
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
"started"
,
destination_section_uid
=
person
.
getUid
()
).
getId
()
invoice_list
=
person
.
Entity_getOutstandingAmountList
()
self
.
login
()
if
subscription_request
is
not
None
:
expected_causality
=
subscription_request
.
getRelativeUrl
()
filtered_invoice_list
=
[]
for
invoice
in
invoice_list
:
spl
=
invoice
.
getCausalityValue
()
if
spl
is
not
None
and
spl
.
getCausality
()
==
expected_causality
:
filtered_invoice_list
.
append
(
invoice
)
self
.
assertEqual
(
len
(
filtered_invoice_list
),
1
)
invoice_list
=
filtered_invoice_list
else
:
self
.
assertEqual
(
len
(
invoice_list
),
1
)
self
.
login
(
user_id
)
document_id
=
invoice_list
[
0
].
getId
()
web_site
.
accounting_module
[
document_id
].
\
PaymentTransaction_redirectToManualPayzenPayment
()
SaleInvoiceTransaction_redirectToManualSlapOSPayment
()
self
.
tic
()
def
assertSubscriptionStopped
(
self
,
person
):
self
.
login
()
...
...
master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseMixin.py
View file @
21504241
...
...
@@ -567,13 +567,13 @@ class SlapOSTestCaseMixin(testSlapOSMixin):
reference
=
"TESTTRANS-%s"
%
new_id
,
)
def
createSaleInvoiceTransaction
(
self
):
def
createSaleInvoiceTransaction
(
self
,
**
kw
):
new_id
=
self
.
generateNewId
()
return
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Sale Invoice Transaction'
,
title
=
"Invoice %s"
%
new_id
,
reference
=
"TESTSIT-%s"
%
new_id
,
)
**
kw
)
def
createPayzenEvent
(
self
):
return
self
.
portal
.
system_event_module
.
newContent
(
...
...
@@ -585,16 +585,11 @@ class SlapOSTestCaseMixin(testSlapOSMixin):
portal_type
=
'Wechat Event'
,
reference
=
'PAY-%s'
%
self
.
generateNewId
())
def
createPayzenSaleInvoiceTransaction
(
self
,
destination_section
=
None
,
price
=
2
,
payment_mode
=
"payzen"
):
new_title
=
self
.
generateNewId
()
new_reference
=
self
.
generateNewId
()
def
createStoppedSaleInvoiceTransaction
(
self
,
destination_section
=
None
,
price
=
2
,
payment_mode
=
"payzen"
):
new_source_reference
=
self
.
generateNewId
()
new_destination_reference
=
self
.
generateNewId
()
invoice
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Sale Invoice Transaction"
,
title
=
new_title
,
invoice
=
self
.
createSaleInvoiceTransaction
(
start_date
=
DateTime
(),
reference
=
new_reference
,
source_reference
=
new_source_reference
,
destination_reference
=
new_destination_reference
,
destination_section
=
destination_section
,
...
...
@@ -614,23 +609,8 @@ class SlapOSTestCaseMixin(testSlapOSMixin):
source
=
"account_module/receivable"
,
quantity
=-
3
,
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
payment_mode
,
causality_value
=
invoice
,
destination_section
=
destination_section
,
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
return
invoice
def
createWechatSaleInvoiceTransaction
(
self
,
destination_section
=
None
,
price
=
2
):
return
self
.
createPayzenSaleInvoiceTransaction
(
destination_section
=
destination_section
,
price
=
price
,
payment_mode
=
'wechat'
)
def
createRegularisationRequest
(
self
):
new_id
=
self
.
generateNewId
()
return
self
.
portal
.
regularisation_request_module
.
newContent
(
...
...
master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseMixin.xml
View file @
21504241
...
...
@@ -6,12 +6,6 @@
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
SlapOSTestCaseMixin
</string>
</value>
...
...
@@ -55,28 +49,13 @@
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
I
=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
...
...
@@ -89,7 +68,7 @@
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
Q
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
</value>
</item>
</dictionary>
...
...
@@ -98,7 +77,7 @@
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
...
...
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Alarm_createRegularisationRequest.py
View file @
21504241
portal
=
context
.
getPortalObject
()
person_uid_list
=
[]
for
(
_
,
brain
)
in
enumerate
(
portal
.
portal_simulation
.
getInventoryList
(
simulation_state
=
(
'stopped'
,
'delivered'
),
parent_payment_mode_uid
=
[
portal
.
portal_categories
.
payment_mode
.
payzen
.
getUid
(),
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
()],
group_by_mirror_section
=
True
,
portal_type
=
portal
.
getPortalAccountingMovementTypeList
(),
node_uid
=
[
x
.
uid
for
x
in
context
.
Base_getReceivableAccountList
()],
grouping_reference
=
None
)):
payment_request_uid
=
brain
.
payment_request_uid
if
not
payment_request_uid
:
payment_request_uid
=
brain
.
getObject
().
getExplanationUid
()
payment_request
=
portal
.
portal_catalog
.
getObject
(
uid
=
payment_request_uid
)
section_uid
=
payment_request
.
getDestinationSectionUid
(
portal_type
=
"Person"
)
if
section_uid
is
not
None
:
person_uid_list
.
append
(
section_uid
)
portal
.
portal_catalog
.
searchAndActivate
(
portal_type
=
"Person"
,
validation_state
=
"validated"
,
destination_section_related__portal_type
=
"Payment Transaction"
,
destination_section_related__simulation_state
=
"started"
,
uid
=
person_uid_list
,
method_id
=
'Person_checkToCreateRegularisationRequest'
,
activate_kw
=
{
'tag'
:
tag
}
)
...
...
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Person_checkToCreateRegularisationRequest.py
View file @
21504241
...
...
@@ -28,12 +28,12 @@ outstanding_amount = person.Entity_statSlapOSOutstandingAmount()
# Amount to be ignored, as it comes from the first invoice generated
# after the subscription. We do not take it into account as no service
# was provided yet.
unpaid_
payment
_amount
=
0
for
payment
in
person
.
Person_getSubscriptionRequestFirstUnpaidPayment
List
():
unpaid_
payment_amount
+=
payment
.
PaymentTransaction_getTotalPayable
Price
()
unpaid_
invoice
_amount
=
0
for
invoice
in
person
.
Person_getSubscriptionRequestFirstUnpaidInvoice
List
():
unpaid_
invoice_amount
+=
invoice
.
getTotal
Price
()
# It can't be smaller, we are considernig all open invoices are from unpaid_payment_amount
if
round
(
float
(
outstanding_amount
),
2
)
==
round
(
-
float
(
unpaid_payment
_amount
),
2
):
if
round
(
float
(
outstanding_amount
),
2
)
==
round
(
float
(
unpaid_invoice
_amount
),
2
):
return
ticket
,
None
if
int
(
outstanding_amount
)
>
0
:
...
...
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Person_getSubscriptionRequestFirstUnpaid
Payment
List.py
→
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Person_getSubscriptionRequestFirstUnpaid
Invoice
List.py
View file @
21504241
...
...
@@ -12,8 +12,8 @@ subscription_request_list = portal.portal_catalog(
creation_date
=
Query
(
creation_date
=
addToDate
(
DateTime
(),
to_add
=
{
'day'
:
-
20
}),
range
=
"min"
))
for
subscription_request
in
subscription_request_list
:
first_
period_payment
=
subscription_request
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
if
first_
period_payment
is
not
None
and
first_period_payment
.
getSimulationState
()
==
"started"
:
unpaid_list
.
append
(
first_
period_payment
)
first_
invoice
=
subscription_request
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
if
first_
invoice
is
not
None
and
not
first_invoice
.
SaleInvoiceTransaction_isLettered
()
:
unpaid_list
.
append
(
first_
invoice
)
return
unpaid_list
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Person_getSubscriptionRequestFirstUnpaid
Payment
List.xml
→
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/Person_getSubscriptionRequestFirstUnpaid
Invoice
List.xml
View file @
21504241
...
...
@@ -54,7 +54,7 @@
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
Person_getSubscriptionRequestFirstUnpaid
Payment
List
</string>
</value>
<value>
<string>
Person_getSubscriptionRequestFirstUnpaid
Invoice
List
</string>
</value>
</item>
</dictionary>
</pickle>
...
...
master/bt5/slapos_crm/SkinTemplateItem/portal_skins/slapos_crm/RegularisationRequest_invalidateIfPersonBalanceIsOk.py
View file @
21504241
...
...
@@ -13,12 +13,12 @@ outstanding_amount = person.Entity_statSlapOSOutstandingAmount()
# Amount to be ignored, as it comes from the first invoice generated
# after the subscription. We do not take it into account as no service
# was provided yet.
unpaid_
payment
_amount
=
0
for
payment
in
person
.
Person_getSubscriptionRequestFirstUnpaidPayment
List
():
unpaid_
payment_amount
+=
payment
.
PaymentTransaction_getTotalPayable
Price
()
unpaid_
invoice
_amount
=
0
for
invoice
in
person
.
Person_getSubscriptionRequestFirstUnpaidInvoice
List
():
unpaid_
invoice_amount
+=
invoice
.
getTotal
Price
()
# It can't be smaller, we are considernig all open invoices are from unpaid_payment_amount
if
round
(
float
(
outstanding_amount
),
2
)
==
round
(
-
float
(
unpaid_payment
_amount
),
2
):
if
round
(
float
(
outstanding_amount
),
2
)
==
round
(
float
(
unpaid_invoice
_amount
),
2
):
context
.
invalidate
(
comment
=
"Automatically disabled as balance is %s"
%
outstanding_amount
)
return
...
...
master/bt5/slapos_crm/TestTemplateItem/portal_components/test.erp5.testSlapOSCRMAlarm.py
View file @
21504241
...
...
@@ -27,6 +27,52 @@ from DateTime import DateTime
class
TestSlapOSCRMCreateRegularisationRequest
(
SlapOSTestCaseMixin
):
def
createFinalInvoice
(
self
,
person
):
template
=
self
.
portal
.
restrictedTraverse
(
self
.
portal
.
portal_preferences
.
getPreferredDefaultPrePaymentSubscriptionInvoiceTemplate
())
current_invoice
=
template
.
Base_createCloneDocument
(
batch_mode
=
1
)
current_invoice
.
edit
(
destination_value
=
person
,
destination_section_value
=
person
,
destination_decision_value
=
person
,
start_date
=
DateTime
(
'2019/10/20'
),
stop_date
=
DateTime
(
'2019/10/20'
),
title
=
'Fake Invoice for Demo User Functional'
,
price_currency
=
"currency_module/EUR"
,
reference
=
'1'
)
cell
=
current_invoice
[
"1"
][
"movement_0"
]
cell
.
edit
(
quantity
=
1
)
cell
.
setPrice
(
1
)
current_invoice
.
plan
()
current_invoice
.
confirm
()
current_invoice
.
startBuilding
()
current_invoice
.
reindexObject
()
current_invoice
.
stop
()
self
.
tic
()
current_invoice
.
Delivery_manageBuildingCalculatingDelivery
()
self
.
tic
()
applied_rule
=
current_invoice
.
getCausalityRelated
(
portal_type
=
"Applied Rule"
)
for
sm
in
self
.
portal
.
portal_catalog
(
portal_type
=
'Simulation Movement'
,
simulation_state
=
[
'draft'
,
'planned'
,
None
],
left_join_list
=
[
'delivery_uid'
],
delivery_uid
=
None
,
path
=
"%%%s%%"
%
applied_rule
):
if
sm
.
getDelivery
()
is
not
None
:
continue
root_applied_rule
=
sm
.
getRootAppliedRule
()
root_applied_rule_path
=
root_applied_rule
.
getPath
()
sm
.
getCausalityValue
(
portal_type
=
'Business Link'
).
build
(
path
=
'%s/%%'
%
root_applied_rule_path
)
return
current_invoice
def
test_alarm_expected_person
(
self
):
new_id
=
self
.
generateNewId
()
person
=
self
.
portal
.
person_module
.
newContent
(
...
...
@@ -35,14 +81,7 @@ class TestSlapOSCRMCreateRegularisationRequest(SlapOSTestCaseMixin):
)
person
.
validate
()
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Payment Transaction for TestSlapOSCRMCreateRegularisationRequest person %s"
%
new_id
,
destination_section
=
person
.
getRelativeUrl
(),
start_date
=
DateTime
()
)
payment
.
confirm
()
payment
.
start
()
self
.
createFinalInvoice
(
person
)
self
.
tic
()
alarm
=
self
.
portal
.
portal_alarms
.
\
...
...
@@ -56,17 +95,9 @@ class TestSlapOSCRMCreateRegularisationRequest(SlapOSTestCaseMixin):
title
=
"Test person %s"
%
new_id
)
person
.
validate
()
self
.
createFinalInvoice
(
person
)
person
.
invalidate
()
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Payment Transaction for TestSlapOSCRMCreateRegularisationRequest person %s"
%
new_id
,
destination_section
=
person
.
getRelativeUrl
(),
start_date
=
DateTime
()
)
payment
.
confirm
()
payment
.
start
()
self
.
tic
()
alarm
=
self
.
portal
.
portal_alarms
.
\
slapos_crm_create_regularisation_request
...
...
@@ -79,23 +110,31 @@ class TestSlapOSCRMCreateRegularisationRequest(SlapOSTestCaseMixin):
title
=
"Test person %s"
%
new_id
)
person
.
validate
()
current_invoice
=
self
.
createFinalInvoice
(
person
)
payment_template
=
self
.
portal
.
restrictedTraverse
(
self
.
portal
.
portal_preferences
.
getPreferredDefaultPrePaymentTemplate
())
payment
=
payment_template
.
Base_createCloneDocument
(
batch_mode
=
1
)
for
line
in
payment
.
contentValues
():
if
line
.
getSource
()
==
"account_module/payment_to_encash"
:
line
.
setQuantity
(
-
1
)
elif
line
.
getSource
()
==
"account_module/receivable"
:
line
.
setQuantity
(
1
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Payment Transaction for TestSlapOSCRMCreateRegularisationRequest person %s"
%
new_id
,
destination_section
=
person
.
getRelativeUrl
(),
start_date
=
DateTime
()
)
payment
.
confirm
()
payment
.
start
()
payment
.
setCausalityValue
(
current_invoice
)
payment
.
setDestinationSectionValue
(
person
)
payment
.
stop
()
self
.
tic
()
self
.
tic
()
alarm
=
self
.
portal
.
portal_alarms
.
\
slapos_crm_create_regularisation_request
self
.
_test_alarm_not_visited
(
alarm
,
person
,
"Person_checkToCreateRegularisationRequest"
)
def
test_alarm_payment_
confirm
ed
(
self
):
def
test_alarm_payment_
start
ed
(
self
):
new_id
=
self
.
generateNewId
()
person
=
self
.
portal
.
person_module
.
newContent
(
portal_type
=
'Person'
,
...
...
@@ -103,18 +142,26 @@ class TestSlapOSCRMCreateRegularisationRequest(SlapOSTestCaseMixin):
)
person
.
validate
()
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Payment Transaction for TestSlapOSCRMCreateRegularisationRequest person %s"
%
new_id
,
destination_section
=
person
.
getRelativeUrl
(),
start_date
=
DateTime
()
)
current_invoice
=
self
.
createFinalInvoice
(
person
)
payment_template
=
self
.
portal
.
restrictedTraverse
(
self
.
portal
.
portal_preferences
.
getPreferredDefaultPrePaymentTemplate
())
payment
=
payment_template
.
Base_createCloneDocument
(
batch_mode
=
1
)
for
line
in
payment
.
contentValues
():
if
line
.
getSource
()
==
"account_module/payment_to_encash"
:
line
.
setQuantity
(
-
1
)
elif
line
.
getSource
()
==
"account_module/receivable"
:
line
.
setQuantity
(
1
)
payment
.
confirm
()
payment
.
start
()
payment
.
setCausalityValue
(
current_invoice
)
payment
.
setDestinationSectionValue
(
person
)
self
.
tic
()
alarm
=
self
.
portal
.
portal_alarms
.
\
slapos_crm_create_regularisation_request
self
.
_test_alarm
_not_visited
(
alarm
,
person
,
"Person_checkToCreateRegularisationRequest"
)
self
.
_test_alarm
(
alarm
,
person
,
"Person_checkToCreateRegularisationRequest"
)
class
TestSlapOSCrmInvalidateSuspendedRegularisationRequest
(
SlapOSTestCaseMixinWithAbort
):
...
...
master/bt5/slapos_erp5/TestTemplateItem/portal_components/test.erp5.testSlapOSCodingStyle.py
View file @
21504241
...
...
@@ -149,7 +149,7 @@ def makeTestSlapOSCodingStyleTestCase(tested_business_template):
'slapos_crm_monitoring/Event_checkCustomerAsSourceOrDestinationConsistency'
,
'slapos_crm_monitoring/SupportRequest_checkCausalitySourceDestinationConsistency'
,
'slapos_crm_monitoring/SupportRequest_getLastEvent'
,
'slapos_crm/Person_getSubscriptionRequestFirstUnpaid
Payment
List'
,
'slapos_crm/Person_getSubscriptionRequestFirstUnpaid
Invoice
List'
,
'slapos_crm/RegularisationRequest_afterClone'
,
'slapos_crm/RegularisationRequest_getResourceItemList'
,
'slapos_crm/RegularisationRequest_init'
,
...
...
master/bt5/slapos_erp5/TestTemplateItem/portal_components/test.erp5.testSlapOSERP5DefaultScenario.py
View file @
21504241
# -*- coding:
utf-8 -*-
# -*- coding:utf-8 -*-
##############################################################################
#
# Copyright (c) 2012 Nexedi SA and Contributors. All Rights Reserved.
# Copyright (c) 2022 Nexedi SA and Contributors. All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
...
...
@@ -237,23 +251,6 @@ class TestSlapOSDefaultScenario(DefaultScenarioMixin):
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
builder
=
self
.
portal
.
portal_orders
.
slapos_payment_transaction_builder
for
_
in
range
(
500
):
# build the aggregated payment
self
.
stepCallSlaposTriggerPaymentTransactionOrderBuilderAlarm
()
self
.
tic
()
# If there is something unbuild recall alarm.
if
len
(
builder
.
OrderBuilder_generateUnrelatedInvoiceList
()):
break
# start the payzen payment
self
.
stepCallSlaposPayzenUpdateConfirmedPaymentAlarm
()
self
.
tic
()
# stabilise the payment deliveries and expand them
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
# trigger the CRM interaction
self
.
stepCallSlaposCrmCreateRegularisationRequestAlarm
()
self
.
tic
()
...
...
@@ -266,10 +263,10 @@ class TestSlapOSDefaultScenario(DefaultScenarioMixin):
self
.
assertPersonDocumentCoverage
(
person
)
self
.
login
(
public_person
.
getUserId
())
self
.
usePay
zen
Manually
(
self
.
web_site
,
public_person
.
getUserId
())
self
.
usePay
ment
Manually
(
self
.
web_site
,
public_person
.
getUserId
())
self
.
login
(
friend_person
.
getUserId
())
self
.
usePay
zen
Manually
(
self
.
web_site
,
friend_person
.
getUserId
())
self
.
usePay
ment
Manually
(
self
.
web_site
,
friend_person
.
getUserId
())
class
TestSlapOSDefaultCRMEscalation
(
DefaultScenarioMixin
):
...
...
@@ -283,6 +280,7 @@ class TestSlapOSDefaultCRMEscalation(DefaultScenarioMixin):
default_source_project_uid
=
person
.
getUid
()
)
self
.
assertNotEqual
(
ticket
,
None
)
event
=
self
.
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
'Mail Message'
,
default_resource_uid
=
self
.
portal
.
service_module
[
service_id
].
getUid
(),
...
...
@@ -344,18 +342,7 @@ class TestSlapOSDefaultCRMEscalation(DefaultScenarioMixin):
payment_list
=
invoice
.
getCausalityRelatedValueList
(
portal_type
=
'Payment Transaction'
)
self
.
assertEqual
(
1
,
len
(
payment_list
))
payment
=
payment_list
[
0
].
getObject
()
causality_list
=
payment
.
getCausalityValueList
()
self
.
assertSameSet
([
invoice
],
causality_list
)
self
.
assertEqual
(
'cancelled'
,
payment
.
getSimulationState
())
self
.
assertEqual
(
'draft'
,
payment
.
getCausalityState
())
self
.
assertEqual
(
-
1
*
payment
.
PaymentTransaction_getTotalPayablePrice
(),
invoice
.
getTotalPrice
())
self
.
assertEqual
(
0
,
len
(
payment_list
))
# Check reverse invoice
reverse_invoice_list
=
invoice
.
getCausalityRelatedValueList
(
...
...
@@ -468,23 +455,6 @@ class TestSlapOSDefaultCRMEscalation(DefaultScenarioMixin):
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
builder
=
self
.
portal
.
portal_orders
.
slapos_payment_transaction_builder
for
_
in
range
(
500
):
# build the aggregated payment
self
.
stepCallSlaposTriggerPaymentTransactionOrderBuilderAlarm
()
self
.
tic
()
# If there is something unbuild recall alarm.
if
len
(
builder
.
OrderBuilder_generateUnrelatedInvoiceList
()):
break
# start the payzen payment
self
.
stepCallSlaposPayzenUpdateConfirmedPaymentAlarm
()
self
.
tic
()
# stabilise the payment deliveries and expand them
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
# create the regularisation request
self
.
stepCallSlaposCrmCreateRegularisationRequestAlarm
()
self
.
tic
()
...
...
@@ -525,13 +495,10 @@ class TestSlapOSDefaultCRMEscalation(DefaultScenarioMixin):
# Manually cancel the users invoice
payment
=
self
.
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Payment Transaction"
,
destination_section_uid
=
person
.
getUid
(),
simulation_state
=
"started"
)
invoice
=
payment
.
getCausalityValue
(
portal_type
=
"Sale Invoice Transaction"
)
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
()
invoice_list
=
person
.
Entity_getOutstandingAmountList
()
self
.
assertEqual
(
len
(
invoice_list
),
1
)
sale_transaction_invoice
=
invoice_list
[
0
].
getObject
()
sale_transaction_invoice
.
SaleInvoiceTransaction_createReversalSaleInvoiceTransaction
(
batch_mode
=
1
)
self
.
tic
()
...
...
@@ -602,22 +569,5 @@ class TestSlapOSDefaultCRMEscalation(DefaultScenarioMixin):
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
builder
=
self
.
portal
.
portal_orders
.
slapos_payment_transaction_builder
for
_
in
range
(
500
):
# build the aggregated payment
self
.
stepCallSlaposTriggerPaymentTransactionOrderBuilderAlarm
()
self
.
tic
()
# If there is something unbuild recall alarm.
if
len
(
builder
.
OrderBuilder_generateUnrelatedInvoiceList
()):
break
# start the payzen payment
self
.
stepCallSlaposPayzenUpdateConfirmedPaymentAlarm
()
self
.
tic
()
# stabilise the payment deliveries and expand them
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
# check final document state
self
.
assertPersonDocumentCoverage
(
person
)
master/bt5/slapos_erp5/TestTemplateItem/portal_components/test.erp5.testSlapOSERP5DefaultScenario.xml
View file @
21504241
...
...
@@ -6,12 +6,6 @@
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOSERP5DefaultScenario
</string>
</value>
...
...
@@ -55,28 +49,13 @@
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
I
=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
...
...
@@ -89,7 +68,7 @@
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
Q
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
</value>
</item>
</dictionary>
...
...
@@ -98,7 +77,7 @@
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
...
...
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_all_invoice_list_js.js
View file @
21504241
...
...
@@ -53,6 +53,7 @@
}
if
(
1
||
(
result
.
data
.
rows
[
i
].
hasOwnProperty
(
"
id
"
)))
{
value
=
result
.
data
.
rows
[
i
].
value
.
AccountingTransaction_getPaymentStateAsHateoas
;
value
.
jio_key
=
result
.
data
.
rows
[
i
].
id
;
result
.
data
.
rows
[
i
].
value
.
AccountingTransaction_getPaymentStateAsHateoas
=
{
field_gadget_param
:
{
css_class
:
""
,
...
...
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_all_invoice_list_js.xml
View file @
21504241
...
...
@@ -254,7 +254,7 @@
</tuple>
<state>
<tuple>
<float>
16
67590788.38
</float>
<float>
16
71074456.17
</float>
<string>
UTC
</string>
</tuple>
</state>
...
...
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_invoice_list_js.js
View file @
21504241
...
...
@@ -53,6 +53,7 @@
}
if
(
1
||
(
result
.
data
.
rows
[
i
].
hasOwnProperty
(
"
id
"
)))
{
value
=
result
.
data
.
rows
[
i
].
value
.
AccountingTransaction_getPaymentStateAsHateoas
;
value
.
jio_key
=
result
.
data
.
rows
[
i
].
id
;
result
.
data
.
rows
[
i
].
value
.
AccountingTransaction_getPaymentStateAsHateoas
=
{
field_gadget_param
:
{
css_class
:
""
,
...
...
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_invoice_list_js.xml
View file @
21504241
...
...
@@ -236,7 +236,7 @@
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
1004.
6631.33059.11776
</string>
</value>
<value>
<string>
1004.
12379.1853.8140
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
...
...
@@ -254,7 +254,7 @@
</tuple>
<state>
<tuple>
<float>
16
67930581.61
</float>
<float>
16
71070228.44
</float>
<string>
UTC
</string>
</tuple>
</state>
...
...
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_sale_invoice_transaction_view_js.js
View file @
21504241
...
...
@@ -160,7 +160,7 @@
"
title
"
:
result
[
1
][
5
],
"
default
"
:
{
state
:
gadget
.
state
.
doc
.
payment_state
,
payment_transaction
:
gadget
.
state
.
doc
.
payment_transaction
jio_key
:
gadget
.
state
.
jio_key
},
"
css_class
"
:
""
,
"
required
"
:
1
,
...
...
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_erp5_page_slap_sale_invoice_transaction_view_js.xml
View file @
21504241
...
...
@@ -236,7 +236,7 @@
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
999.2068.62564.17
</string>
</value>
<value>
<string>
1004.12196.28653.10734
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
...
...
@@ -254,7 +254,7 @@
</tuple>
<state>
<tuple>
<float>
16
67919626.06
</float>
<float>
16
71070129.29
</float>
<string>
UTC
</string>
</tuple>
</state>
...
...
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_slapos_invoice_state_js.js
View file @
21504241
...
...
@@ -14,16 +14,15 @@
link
;
return
gadget
.
getTranslationDict
([
'
Pay Now
'
])
.
push
(
function
(
translation_dict
)
{
if
((
gadget
.
state
.
payment_transaction
!==
null
)
&&
(
gadget
.
state
.
payment_transaction
!==
undefined
))
{
if
(
gadget
.
state
.
payment_state
===
'
Pay Now
'
)
{
link
=
domsugar
(
"
li
"
,
{},
[
domsugar
(
"
a
"
,
{
class
:
"
ui-btn ui-first-child ui-btn-icon-center
"
,
text
:
translation_dict
[
"
Pay Now
"
],
href
:
gadget
.
state
.
hateoas_url
+
gadget
.
state
.
payment_transaction
+
"
/
Payment
Transaction_redirectToManualSlapOSPayment
"
gadget
.
state
.
jio_key
+
"
/
SaleInvoice
Transaction_redirectToManualSlapOSPayment
"
})
]);
}
else
{
...
...
@@ -41,7 +40,7 @@
return
gadget
.
getSetting
(
"
hateoas_url
"
)
.
push
(
function
(
hateoas_url
)
{
return
gadget
.
changeState
({
payment_transaction
:
options
.
value
.
payment_transaction
,
jio_key
:
options
.
value
.
jio_key
,
payment_state
:
options
.
value
.
state
,
hateoas_url
:
hateoas_url
});
...
...
master/bt5/slapos_jio/PathTemplateItem/web_page_module/rjs_gadget_slapos_invoice_state_js.xml
View file @
21504241
...
...
@@ -254,7 +254,7 @@
</tuple>
<state>
<tuple>
<float>
16
67929052.34
</float>
<float>
16
71070046.11
</float>
<string>
UTC
</string>
</tuple>
</state>
...
...
master/bt5/slapos_jio/SkinTemplateItem/portal_skins/slapos_hal_json_style/AccountingTransaction_getPaymentStateAsHateoas.py
View file @
21504241
state
=
context
.
AccountingTransaction_getPaymentState
()
payment_transaction
=
None
payment_mode
=
None
if
state
==
"Pay Now"
:
payment_transaction_value
=
context
.
SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
()
payment_transaction
=
payment_transaction_value
.
getRelativeUrl
()
payment_mode
=
payment_transaction_value
.
getPaymentMode
()
payment_mode
=
context
.
getPaymentMode
()
# ???
return
{
"state"
:
context
.
Base_translateString
(
state
),
"payment_mode"
:
payment_mode
,
"payment_transaction"
:
payment_transaction
}
"payment_mode"
:
payment_mode
}
master/bt5/slapos_jio/SkinTemplateItem/portal_skins/slapos_hal_json_style/SaleInvoiceTransaction_viewAsHateoas.xml
View file @
21504241
...
...
@@ -100,7 +100,6 @@
<string>
my_resource_title
</string>
<string>
my_payment_transaction_external_id
</string>
<string>
my_payment_state
</string>
<string>
my_payment_transaction
</string>
</list>
</value>
</item>
...
...
master/bt5/slapos_jio/SkinTemplateItem/portal_skins/slapos_hal_json_style/SaleInvoiceTransaction_viewAsHateoas/my_payment_transaction.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"ProxyField"
module=
"Products.ERP5Form.ProxyField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
delegated_list
</string>
</key>
<value>
<list>
<string>
default
</string>
<string>
title
</string>
</list>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
my_payment_transaction
</string>
</value>
</item>
<item>
<key>
<string>
message_values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
external_validator_failed
</string>
</key>
<value>
<string>
The input failed the external validator.
</string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
overrides
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
field_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
form_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
target
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
tales
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
default
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
field_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
form_id
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
target
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
default
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
field_id
</string>
</key>
<value>
<string>
my_string_field
</string>
</value>
</item>
<item>
<key>
<string>
form_id
</string>
</key>
<value>
<string>
Base_viewFieldLibrary
</string>
</value>
</item>
<item>
<key>
<string>
target
</string>
</key>
<value>
<string>
Click to edit the target
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Payment Transaction
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"TALESMethod"
module=
"Products.Formulator.TALESField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_text
</string>
</key>
<value>
<string>
python: context.SaleInvoiceTransaction_getSlapOSPaymentRelated()
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_jio_ui_test/PathTemplateItem/portal_tests/slaposjs_zuite/testSlapOSJSInvoiceUnpaid.zpt
View file @
21504241
...
...
@@ -76,12 +76,12 @@
</tr>
<tr>
<td>
waitForElementPresent
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
Payment
Transaction_redirectToManualSlapOSPayment')]
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
SaleInvoice
Transaction_redirectToManualSlapOSPayment')]
</td>
<td></td>
</tr>
<tr>
<td>
assertElementPresent
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
Payment
Transaction_redirectToManualSlapOSPayment')]
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
SaleInvoice
Transaction_redirectToManualSlapOSPayment')]
</td>
<td></td>
</tr>
<tr>
...
...
@@ -165,12 +165,12 @@
</tr>
<tr>
<td>
waitForElementPresent
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
Payment
Transaction_redirectToManualSlapOSPayment')]
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
SaleInvoice
Transaction_redirectToManualSlapOSPayment')]
</td>
<td></td>
</tr>
<tr>
<td>
assertElementPresent
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
Payment
Transaction_redirectToManualSlapOSPayment')]
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
SaleInvoice
Transaction_redirectToManualSlapOSPayment')]
</td>
<td></td>
</tr>
<tr>
...
...
@@ -284,12 +284,12 @@
</tr>
<tr>
<td>
waitForElementPresent
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
Payment
Transaction_redirectToManualSlapOSPayment')]
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
SaleInvoice
Transaction_redirectToManualSlapOSPayment')]
</td>
<td></td>
</tr>
<tr>
<td>
assertElementPresent
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
Payment
Transaction_redirectToManualSlapOSPayment')]
</td>
<td>
//div[contains(@data-gadget-url, 'gadget_slapos_invoice_state.html')]//a[contains(@href, '
SaleInvoice
Transaction_redirectToManualSlapOSPayment')]
</td>
<td></td>
</tr>
<tr>
...
...
master/bt5/slapos_jio_ui_test/SkinTemplateItem/portal_skins/slapos_ui_test/ERP5Site_createSlapOSFakeInvoiceForTestUser.py
View file @
21504241
...
...
@@ -74,5 +74,13 @@ if not unpaid:
"SimulationMovement_buildSlapOS"
,
"SaleInvoiceTransaction_forceBuildSlapOSAccountingLineList"
)
).
SaleInvoiceTransaction_setFakeGroupingReference
()
payment
.
activate
(
after_method_id
=
(
"immediateReindexObject"
,
"_updateSimulation"
,
"Delivery_manageBuildingCalculatingDelivery"
,
"SimulationMovement_buildSlapOS"
,
"SaleInvoiceTransaction_forceBuildSlapOSAccountingLineList"
)
).
SaleInvoiceTransaction_setFakeGroupingReference
()
return
'Done.'
master/bt5/slapos_payzen/PathTemplateItem/portal_alarms/slapos_payzen_update_confirmed_payment.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Alarm"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
active_sense_method_id
</string>
</key>
<value>
<string>
Alarm_updatePayzenConfirmedPaymentTransaction
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
slapos_payzen_update_confirmed_payment
</string>
</value>
</item>
<item>
<key>
<string>
periodicity_hour
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_minute
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_minute_frequency
</string>
</key>
<value>
<int>
5
</int>
</value>
</item>
<item>
<key>
<string>
periodicity_month
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_month_day
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_start_date
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1288051200.0
</float>
<string>
GMT
</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
periodicity_week
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Alarm
</string>
</value>
</item>
<item>
<key>
<string>
sense_method_id
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Handles confirmed Payment Transactions with PayZen interface
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_payzen/PathTemplateItem/portal_alarms/slapos_trigger_payment_transaction_order_builder.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Alarm"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
active_sense_method_id
</string>
</key>
<value>
<string>
Alarm_triggerPaymentTransactionOrderBuilder
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
slapos_trigger_payment_transaction_order_builder
</string>
</value>
</item>
<item>
<key>
<string>
periodicity_hour
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_minute
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_minute_frequency
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
periodicity_month
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_month_day
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_start_date
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
548812800.0
</float>
<string>
GMT
</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
periodicity_week
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Alarm
</string>
</value>
</item>
<item>
<key>
<string>
sense_method_id
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Trigger Payment Transaction Order Builder
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_payzen/PathTemplateItem/portal_orders/slapos_payment_transaction_builder/category_movement_group_on_delivery.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Category Movement Group"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
collect_order_group/delivery
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
category_movement_group_on_delivery
</string>
</value>
</item>
<item>
<key>
<string>
int_index
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Category Movement Group
</string>
</value>
</item>
<item>
<key>
<string>
tested_property
</string>
</key>
<value>
<tuple>
<string>
causality
</string>
<string>
destination_payment
</string>
<string>
destination_section
</string>
<string>
price_currency
</string>
<string>
resource
</string>
<string>
source_payment
</string>
<string>
source_section
</string>
<string>
specialise
</string>
<string>
payment_mode
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
update_always
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_payzen/PathTemplateItem/portal_orders/slapos_payment_transaction_builder/category_movement_group_on_line.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Category Movement Group"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
collect_order_group/line
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
category_movement_group_on_line
</string>
</value>
</item>
<item>
<key>
<string>
int_index
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Category Movement Group
</string>
</value>
</item>
<item>
<key>
<string>
tested_property
</string>
</key>
<value>
<tuple>
<string>
destination
</string>
<string>
source
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
update_always
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_payzen/PathTemplateItem/portal_orders/slapos_payment_transaction_builder/property_movement_group_on_line.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Property Movement Group"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
collect_order_group/line
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
property_movement_group_on_line
</string>
</value>
</item>
<item>
<key>
<string>
int_index
</string>
</key>
<value>
<int>
2
</int>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Property Movement Group
</string>
</value>
</item>
<item>
<key>
<string>
tested_property
</string>
</key>
<value>
<tuple>
<string>
start_date
</string>
<string>
stop_date
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
property_movement_group_on_line
</string>
</value>
</item>
<item>
<key>
<string>
update_always
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/Alarm_triggerPaymentTransactionOrderBuilder.py
deleted
100644 → 0
View file @
5128c902
context
.
getPortalObject
().
portal_orders
.
slapos_payment_transaction_builder
.
build
(
activate_kw
=
{
'tag'
:
tag
}
)
context
.
activate
(
after_tag
=
tag
).
getId
()
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/Alarm_triggerPaymentTransactionOrderBuilder.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
tag, fixit, params
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
Alarm_triggerPaymentTransactionOrderBuilder
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/Alarm_updatePayzenConfirmedPaymentTransaction.py
deleted
100644 → 0
View file @
5128c902
portal
=
context
.
getPortalObject
()
portal
.
portal_catalog
.
searchAndActivate
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
[
"confirmed"
],
causality_state
=
[
"draft"
],
payment_mode_uid
=
portal
.
portal_categories
.
payment_mode
.
payzen
.
getUid
(),
method_id
=
'PaymentTransaction_startPayzenPayment'
,
packet_size
=
1
,
# just one to minimise errors
activate_kw
=
{
'tag'
:
tag
}
)
context
.
activate
(
after_tag
=
tag
).
getId
()
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/Alarm_updatePayzenConfirmedPaymentTransaction.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
tag, fixit, params
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
Alarm_updatePayzenConfirmedPaymentTransaction
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/OrderBuilder_generateUnrelatedInvoiceList.py
deleted
100644 → 0
View file @
5128c902
portal
=
context
.
getPortalObject
()
newTempSimulationMovement
=
portal
.
portal_trash
.
newContent
select_dict
=
{
'causality_payment_transaction_related_uid'
:
None
,
'causality_subscription_request_related_uid'
:
None
,
}
select_kw
=
kwargs
.
copy
()
select_kw
.
pop
(
'portal_type'
,
None
)
select_kw
.
pop
(
'delivery_relative_url_list'
,
None
)
select_kw
.
update
(
portal_type
=
'Sale Invoice Transaction'
,
simulation_state
=
'stopped'
,
default_payment_mode_uid
=
(
portal
.
portal_categories
.
payment_mode
.
payzen
.
getUid
(),
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
()),
limit
=
10
,
# do only some in one shot
select_dict
=
select_dict
,
left_join_list
=
select_dict
.
keys
(),
causality_payment_transaction_related_uid
=
None
,
causality_subscription_request_related_uid
=
None
)
default_source_uid
=
portal
.
restrictedTraverse
(
'account_module/receivable'
).
getUid
()
movement_list
=
[]
_id
=
1
for
invoice
in
portal
.
portal_catalog
(
**
select_kw
):
invoice
.
getObject
().
serialize
()
# in order to avoid selection on concurrent transactions
payment_tag
=
"sale_invoice_transaction_order_builder_%s"
%
invoice
.
getObject
().
getUid
()
if
context
.
REQUEST
.
get
(
payment_tag
,
None
)
is
not
None
or
\
context
.
portal_activities
.
countMessageWithTag
(
payment_tag
)
>
0
:
# Invoice was selected before the payment be indexed or it was already created on this transaction
# so skip the invoice for now.
continue
quantity
=
0.
for
movement
in
invoice
.
searchFolder
(
portal_type
=
'Sale Invoice Transaction Line'
,
default_source_uid
=
default_source_uid
):
quantity
+=
movement
.
getQuantity
()
temp_movement_kw
=
dict
(
portal_type
=
"Simulation Movement"
,
causality
=
invoice
.
getRelativeUrl
(),
source_section
=
invoice
.
getSourceSection
(),
destination_section
=
invoice
.
getDestinationSection
(),
resource
=
invoice
.
getResource
(),
price_currency
=
invoice
.
getResource
(),
start_date
=
invoice
.
getStartDate
(),
stop_date
=
invoice
.
getStopDate
(),
specialise
=
invoice
.
getSpecialise
(),
payment_mode
=
invoice
.
getPaymentMode
(),
source_payment
=
'%s/bank_account'
%
invoice
.
getSourceSection
(),
# the other place defnied: business process
)
temp_movement_rec
=
newTempSimulationMovement
(
temp_object
=
True
,
id
=
str
(
_id
),
quantity
=-
1
*
quantity
,
source
=
'account_module/receivable'
,
destination
=
'account_module/payable'
,
**
temp_movement_kw
)
_id
+=
1
temp_movement_bank
=
newTempSimulationMovement
(
temp_object
=
True
,
id
=
str
(
_id
),
quantity
=
1
*
quantity
,
source
=
'account_module/payment_to_encash'
,
destination
=
'account_module/payment_to_encash'
,
**
temp_movement_kw
)
_id
+=
1
movement_list
.
extend
([
temp_movement_rec
,
temp_movement_bank
])
return
movement_list
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/OrderBuilder_generateUnrelatedInvoiceList.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
*args, **kwargs
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
OrderBuilder_generateUnrelatedInvoiceList
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_payzen/SkinTemplateItem/portal_skins/slapos_payzen/PaymentTransaction_startPayzenPayment.py
deleted
100644 → 0
View file @
5128c902
from
DateTime
import
DateTime
state
=
context
.
getSimulationState
()
transaction_amount
=
int
(
round
((
context
.
PaymentTransaction_getTotalPayablePrice
()
*
-
100
),
2
))
if
(
state
!=
'confirmed'
)
or
(
context
.
getPaymentMode
()
!=
'payzen'
)
or
(
transaction_amount
==
0
):
if
(
transaction_amount
==
0
):
invoice
=
context
.
getCausalityValue
(
portal_types
=
"Sale Invoice Transaction"
)
if
invoice
is
not
None
and
round
(
invoice
.
getTotalPrice
(),
2
)
==
0
:
context
.
edit
(
payment_mode
=
"wire_transfer"
)
return
else
:
# Request manual payment
context
.
start
(
comment
=
'Requested manual payment'
)
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenAlarm.py
View file @
21504241
# Copyright (c) 2002-2012 Nexedi SA and Contributors. All Rights Reserved.
# -*- coding:utf-8 -*-
##############################################################################
#
# Copyright (c) 2022 Nexedi SA and Contributors. All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
from
erp5.component.test.SlapOSTestCaseMixin
import
SlapOSTestCaseMixinWithAbort
from
Products.ERP5Type.tests.utils
import
createZODBPythonScript
from
DateTime
import
DateTime
class
TestSlapOSPayzenUpdateConfirmedPayment
(
SlapOSTestCaseMixinWithAbort
):
def
_simulatePaymentTransaction_startPayzenPayment
(
self
):
script_name
=
'PaymentTransaction_startPayzenPayment'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
raise
ValueError
(
'Precondition failed: %s exists in custom'
%
script_name
)
createZODBPythonScript
(
self
.
portal
.
portal_skins
.
custom
,
script_name
,
'*args, **kwargs'
,
'# Script body
\
n
'
"""portal_workflow = context.portal_workflow
portal_workflow.doActionFor(context, action='edit_action', comment='Visited by PaymentTransaction_startPayzenPayment') """
)
self
.
commit
()
def
_dropPaymentTransaction_startPayzenPayment
(
self
):
script_name
=
'PaymentTransaction_startPayzenPayment'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
self
.
portal
.
portal_skins
.
custom
.
manage_delObjects
(
script_name
)
self
.
commit
()
def
test_alarm_confirmed_draft_payzen
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"payzen"
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
self
.
tic
()
self
.
_simulatePaymentTransaction_startPayzenPayment
()
try
:
self
.
portal
.
portal_alarms
.
slapos_payzen_update_confirmed_payment
.
activeSense
()
self
.
tic
()
finally
:
self
.
_dropPaymentTransaction_startPayzenPayment
()
self
.
tic
()
self
.
assertEqual
(
'Visited by PaymentTransaction_startPayzenPayment'
,
transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
def
test_alarm_not_confirmed
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"payzen"
,
)
self
.
tic
()
self
.
_simulatePaymentTransaction_startPayzenPayment
()
try
:
self
.
portal
.
portal_alarms
.
slapos_payzen_update_confirmed_payment
.
activeSense
()
self
.
tic
()
finally
:
self
.
_dropPaymentTransaction_startPayzenPayment
()
self
.
tic
()
self
.
assertNotEqual
(
'Visited by PaymentTransaction_startPayzenPayment'
,
transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
def
test_alarm_not_draft
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"payzen"
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'solved'
)
self
.
tic
()
self
.
_simulatePaymentTransaction_startPayzenPayment
()
try
:
self
.
portal
.
portal_alarms
.
slapos_payzen_update_confirmed_payment
.
activeSense
()
self
.
tic
()
finally
:
self
.
_dropPaymentTransaction_startPayzenPayment
()
self
.
tic
()
self
.
assertNotEqual
(
'Visited by PaymentTransaction_startPayzenPayment'
,
transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
def
test_alarm_not_payzen
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
self
.
tic
()
self
.
_simulatePaymentTransaction_startPayzenPayment
()
try
:
self
.
portal
.
portal_alarms
.
slapos_payzen_update_confirmed_payment
.
activeSense
()
self
.
tic
()
finally
:
self
.
_dropPaymentTransaction_startPayzenPayment
()
self
.
tic
()
self
.
assertNotEqual
(
'Visited by PaymentTransaction_startPayzenPayment'
,
transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
def
_simulatePaymentTransaction_getTotalPayablePrice
(
self
):
script_name
=
'PaymentTransaction_getTotalPayablePrice'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
raise
ValueError
(
'Precondition failed: %s exists in custom'
%
script_name
)
createZODBPythonScript
(
self
.
portal
.
portal_skins
.
custom
,
script_name
,
'*args, **kwargs'
,
'# Script body
\
n
'
"""return 1"""
)
self
.
commit
()
def
_simulatePaymentTransaction_getZeroTotalPayablePrice
(
self
):
script_name
=
'PaymentTransaction_getTotalPayablePrice'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
raise
ValueError
(
'Precondition failed: %s exists in custom'
%
script_name
)
createZODBPythonScript
(
self
.
portal
.
portal_skins
.
custom
,
script_name
,
'*args, **kwargs'
,
'# Script body
\
n
'
"""return 0"""
)
self
.
commit
()
def
_dropPaymentTransaction_getTotalPayablePrice
(
self
):
script_name
=
'PaymentTransaction_getTotalPayablePrice'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
self
.
portal
.
portal_skins
.
custom
.
manage_delObjects
(
script_name
)
self
.
commit
()
def
test_not_confirmed_payment
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"payzen"
,
)
simulation_state
=
transaction
.
getSimulationState
()
modification_date
=
transaction
.
getModificationDate
()
self
.
_simulatePaymentTransaction_getTotalPayablePrice
()
try
:
transaction
.
PaymentTransaction_startPayzenPayment
()
finally
:
self
.
_dropPaymentTransaction_getTotalPayablePrice
()
self
.
assertEqual
(
transaction
.
getSimulationState
(),
simulation_state
)
self
.
assertEqual
(
transaction
.
getModificationDate
(),
modification_date
)
def
test_not_payzen_payment
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
simulation_state
=
transaction
.
getSimulationState
()
modification_date
=
transaction
.
getModificationDate
()
self
.
_simulatePaymentTransaction_getTotalPayablePrice
()
try
:
transaction
.
PaymentTransaction_startPayzenPayment
()
finally
:
self
.
_dropPaymentTransaction_getTotalPayablePrice
()
self
.
assertEqual
(
transaction
.
getSimulationState
(),
simulation_state
)
self
.
assertEqual
(
transaction
.
getModificationDate
(),
modification_date
)
def
test_zero_amount_payment
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"payzen"
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
simulation_state
=
transaction
.
getSimulationState
()
modification_date
=
transaction
.
getModificationDate
()
self
.
_simulatePaymentTransaction_getZeroTotalPayablePrice
()
try
:
transaction
.
PaymentTransaction_startPayzenPayment
()
finally
:
self
.
_dropPaymentTransaction_getTotalPayablePrice
()
self
.
assertEqual
(
transaction
.
getSimulationState
(),
simulation_state
)
self
.
assertEqual
(
transaction
.
getModificationDate
(),
modification_date
)
def
test_expected_payment
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"payzen"
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
self
.
_simulatePaymentTransaction_getTotalPayablePrice
()
try
:
transaction
.
PaymentTransaction_startPayzenPayment
()
finally
:
self
.
_dropPaymentTransaction_getTotalPayablePrice
()
self
.
assertEqual
(
transaction
.
getSimulationState
(),
'started'
)
class
TestSlapOSPayzenUpdateStartedPayment
(
SlapOSTestCaseMixinWithAbort
):
def
test_not_started_payment
(
self
):
...
...
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenAlarm.xml
View file @
21504241
...
...
@@ -6,12 +6,6 @@
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOSPayzenAlarm
</string>
</value>
...
...
@@ -55,28 +49,13 @@
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
I
=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
...
...
@@ -89,7 +68,7 @@
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
Q
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
</value>
</item>
</dictionary>
...
...
@@ -98,7 +77,7 @@
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
...
...
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenEntityCreatePayment.py
0 → 100644
View file @
21504241
# -*- coding:utf-8 -*-
##############################################################################
#
# Copyright (c) 2022 Nexedi SA and Contributors. All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
from
erp5.component.test.testSlapOSEntityCreatePayment
import
TestSlapOSEntityCreatePaymentMixin
class
TestSlapOSEntityCreatePayment
(
TestSlapOSEntityCreatePaymentMixin
):
payment_mode
=
"payzen"
test
=
TestSlapOSEntityCreatePaymentMixin
.
_test
test_twice
=
TestSlapOSEntityCreatePaymentMixin
.
_test_twice
test_twice_transaction
=
TestSlapOSEntityCreatePaymentMixin
.
_test_twice_transaction
test_twice_indexation
=
TestSlapOSEntityCreatePaymentMixin
.
_test_twice_indexation
test_cancelled_payment
=
TestSlapOSEntityCreatePaymentMixin
.
_test_cancelled_payment
test_two_invoices
=
TestSlapOSEntityCreatePaymentMixin
.
_test_two_invoices
test_two_lines
=
TestSlapOSEntityCreatePaymentMixin
.
_test_two_lines
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzen
Builder
.xml
→
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzen
EntityCreatePayment
.xml
View file @
21504241
...
...
@@ -7,14 +7,14 @@
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOSPayzenEntityCreatePayment
</string>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOSPayzenBuilder
</string>
</value>
<key>
<string>
default_source_reference
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
...
...
@@ -24,7 +24,7 @@
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
test.erp5.testSlapOSPayzen
Builder
</string>
</value>
<value>
<string>
test.erp5.testSlapOSPayzen
EntityCreatePayment
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
...
...
@@ -55,28 +55,13 @@
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
I
=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
...
...
@@ -89,7 +74,7 @@
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
Q
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
</value>
</item>
</dictionary>
...
...
@@ -98,7 +83,7 @@
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
...
...
master/bt5/slapos_payzen/TestTemplateItem/portal_components/test.erp5.testSlapOSPayzenSkins.py
View file @
21504241
# Copyright (c) 2002-2012 Nexedi SA and Contributors. All Rights Reserved.
# -*- coding:utf-8 -*-
##############################################################################
#
# Copyright (c) 2022 Nexedi SA and Contributors. All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
from
erp5.component.test.SlapOSTestCaseMixin
import
SlapOSTestCaseMixinWithAbort
from
DateTime
import
DateTime
...
...
@@ -25,14 +45,6 @@ class TestSlapOSCurrency_getIntegrationMapping(SlapOSTestCaseMixinWithAbort):
class
TestSlapOSAccountingTransaction_updateStartDate
(
SlapOSTestCaseMixinWithAbort
):
def
createPaymentTransaction
(
self
):
new_id
=
self
.
generateNewId
()
return
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
)
def
test_date_changed
(
self
):
date
=
DateTime
(
"2001/01/01"
)
payment_transaction
=
self
.
createPaymentTransaction
()
...
...
@@ -657,85 +669,6 @@ class TestSlapOSPayzenBase_getPayzenServiceRelativeUrl(SlapOSTestCaseMixinWithAb
result
=
self
.
portal
.
Base_getPayzenServiceRelativeUrl
()
self
.
assertEqual
(
result
,
'portal_secure_payments/slapos_payzen_test'
)
class
TestSlapOSPayzenAccountingTransaction_getPaymentState
(
SlapOSTestCaseMixinWithAbort
):
def
test_AccountingTransaction_getPaymentState_draft_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_deleted_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
delete
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_cancelled_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
cancel
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_planned_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
plan
()
self
.
assertEqual
(
"Ongoing"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_confirmed_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
setStartDate
(
DateTime
())
invoice
.
confirm
()
self
.
assertEqual
(
"Ongoing"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_started_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
start
()
self
.
assertEqual
(
"Ongoing"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_reversed_payment
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
self
.
tic
()
reversal
=
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
()
self
.
tic
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
self
.
assertEqual
(
0
,
invoice
.
getTotalPrice
()
+
reversal
.
getTotalPrice
())
def
test_AccountingTransaction_getPaymentState_free_payment
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
(
price
=
0
)
self
.
tic
()
self
.
assertEqual
(
"Free!"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_unpaid_payment
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
# If payment is not indexed or not started the state should be unpaid
self
.
assertEqual
(
"Unpaid"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_paynow_payment
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createPayzenSaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
self
.
login
(
person
.
getUserId
())
self
.
assertEqual
(
"Pay Now"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_waiting_payment
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createPayzenSaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
payment
=
invoice
.
SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
()
payment
.
PaymentTransaction_generatePayzenId
()
self
.
login
(
person
.
getUserId
())
self
.
assertEqual
(
"Waiting for payment confirmation"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_paid_payment
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
self
.
tic
()
for
line
in
invoice
.
getMovementList
(
self
.
portal
.
getPortalAccountingMovementTypeList
()):
node_value
=
line
.
getSourceValue
(
portal_type
=
'Account'
)
if
node_value
.
getAccountType
()
==
'asset/receivable'
:
line
.
setGroupingReference
(
"TEST%s"
%
self
.
new_id
)
self
.
assertEqual
(
"Paid"
,
invoice
.
AccountingTransaction_getPaymentState
())
class
TestSlapOSPayzenPaymentTransaction_redirectToManualPayzenPayment
(
SlapOSTestCaseMixinWithAbort
):
...
...
@@ -780,11 +713,19 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
def
test_PaymentTransaction_redirectToManualPayzenPayment_redirect
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
create
Payzen
SaleInvoiceTransaction
(
invoice
=
self
.
create
Stopped
SaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
payment
=
invoice
.
SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
()
payment
.
setResourceValue
(
self
.
portal
.
currency_module
.
EUR
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
'payzen'
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
resource_value
=
self
.
portal
.
currency_module
.
EUR
,
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
self
.
tic
()
self
.
login
(
person
.
getUserId
())
self
.
_simulatePaymentTransaction_getVADSUrlDict
()
...
...
@@ -810,15 +751,32 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
"%s/return"
%
(
payment_transaction_url
)]:
self
.
assertTrue
(
item
in
text_content
,
"%s not in %s"
%
(
item
,
text_content
))
self
.
tic
()
system_event_list
=
payment
.
getDestinationRelatedValueList
(
portal_type
=
"Payzen Event"
)
self
.
assertEqual
(
len
(
system_event_list
),
1
)
self
.
assertEqual
(
system_event_list
[
0
].
getDestinationSection
(),
invoice
.
getDestinationSection
())
self
.
assertEqual
(
len
(
system_event_list
[
0
].
contentValues
(
portal_type
=
"Payzen Event Message"
)),
1
)
def
test_PaymentTransaction_redirectToManualPayzenPayment_already_registered
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
create
Payzen
SaleInvoiceTransaction
(
invoice
=
self
.
create
Stopped
SaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
payment
=
invoice
.
SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
()
payment
.
setResourceValue
(
self
.
portal
.
currency_module
.
EUR
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
'payzen'
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
resource_value
=
self
.
portal
.
currency_module
.
EUR
,
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
payment
.
PaymentTransaction_generatePayzenId
()
self
.
tic
()
self
.
login
(
person
.
getUserId
())
...
...
@@ -831,164 +789,5 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
self
.
assertEqual
(
"%s/already_registered"
%
payment
.
getRelativeUrl
(),
redirect
)
class
TestSlapOSPayzenSaleInvoiceTransaction_getSlapOSPaymentRelatedValue
(
SlapOSTestCaseMixinWithAbort
):
def
test_SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
()
self
.
assertNotEqual
(
None
,
payment
)
self
.
assertEqual
(
payment
.
getSimulationState
(),
"started"
)
self
.
assertEqual
(
payment
.
getCausalityValue
(),
invoice
)
self
.
assertEqual
(
payment
.
getPaymentModeUid
(),
self
.
portal
.
portal_categories
.
payment_mode
.
payzen
.
getUid
())
payment
.
setStartDate
(
DateTime
())
payment
.
stop
()
payment
.
immediateReindexObject
()
payment
=
invoice
.
SaleInvoiceTransaction_getSlapOSPaymentRelatedValue
()
self
.
assertEqual
(
None
,
payment
)
class
TestSlapOSPayzenSaleInvoiceTransaction_createReversalPayzenTransaction
(
SlapOSTestCaseMixinWithAbort
):
def
test_createReversalPayzenTransaction_REQUEST_disallowed
(
self
):
self
.
assertRaises
(
Unauthorized
,
self
.
portal
.
SaleInvoiceTransaction_createReversalPayzenTransaction
,
REQUEST
=
{})
def
test_createReversalPayzenTransaction_bad_portal_type
(
self
):
self
.
assertRaises
(
AssertionError
,
self
.
portal
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_bad_payment_mode
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
invoice
.
edit
(
payment_mode
=
"cash"
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_bad_state
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
invoice
,
'delivered'
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_zero_price
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
invoice
.
manage_delObjects
(
invoice
.
contentIds
())
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_wrong_trade_condition
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
invoice
.
edit
(
specialise
=
None
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_paid
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
line
=
invoice
.
contentValues
(
portal_type
=
"Sale Invoice Transaction Line"
)[
0
]
line
.
edit
(
grouping_reference
=
"azerty"
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_no_payment
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
# Do not reindex payment. portal_catalog will not find it.
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_no_payzen_payment
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
getCausalityRelatedValue
()
payment
.
edit
(
payment_mode
=
"cash"
)
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_no_payment_state
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
getCausalityRelatedValue
()
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'cancelled'
)
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_registered_payment
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
getCausalityRelatedValue
()
payment
.
PaymentTransaction_generatePayzenId
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalPayzenTransaction
)
def
test_createReversalPayzenTransaction_ok
(
self
):
invoice
=
self
.
createPayzenSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
getCausalityRelatedValue
()
reversale_invoice
=
invoice
.
\
SaleInvoiceTransaction_createReversalPayzenTransaction
()
self
.
assertEqual
(
invoice
.
getPaymentMode
(
""
),
""
)
self
.
assertEqual
(
payment
.
getPaymentMode
(
""
),
""
)
self
.
assertEqual
(
payment
.
getSimulationState
(),
"cancelled"
)
self
.
assertEqual
(
reversale_invoice
.
getTitle
(),
"Reversal Transaction for %s"
%
invoice
.
getTitle
())
self
.
assertEqual
(
reversale_invoice
.
getDescription
(),
"Reversal Transaction for %s"
%
invoice
.
getTitle
())
self
.
assertEqual
(
reversale_invoice
.
getCausality
(),
invoice
.
getRelativeUrl
())
self
.
assertEqual
(
reversale_invoice
.
getSimulationState
(),
"stopped"
)
self
.
assertEqual
(
invoice
.
getSimulationState
(),
"stopped"
)
invoice_line_id
=
invoice
.
contentValues
(
portal_type
=
"Invoice Line"
)[
0
].
getId
()
transaction_line_id
=
invoice
.
contentValues
(
portal_type
=
"Sale Invoice Transaction Line"
)[
0
].
getId
()
self
.
assertEqual
(
invoice
[
invoice_line_id
].
getQuantity
(),
-
reversale_invoice
[
invoice_line_id
].
getQuantity
())
self
.
assertEqual
(
reversale_invoice
[
invoice_line_id
].
getQuantity
(),
2
)
self
.
assertEqual
(
invoice
[
transaction_line_id
].
getQuantity
(),
-
reversale_invoice
[
transaction_line_id
].
getQuantity
())
self
.
assertEqual
(
reversale_invoice
[
transaction_line_id
].
getQuantity
(),
3
)
self
.
assertEqual
(
len
(
invoice
.
getMovementList
()),
2
)
# Both invoice should have a grouping reference
self
.
assertNotEqual
(
invoice
[
transaction_line_id
].
getGroupingReference
(
""
),
""
)
self
.
assertEqual
(
invoice
[
transaction_line_id
].
getGroupingReference
(
"1"
),
reversale_invoice
[
transaction_line_id
].
getGroupingReference
(
"2"
))
# All references should be regenerated
self
.
assertNotEqual
(
invoice
.
getReference
(
""
),
reversale_invoice
.
getReference
(
""
))
self
.
assertNotEqual
(
invoice
.
getSourceReference
(
""
),
reversale_invoice
.
getSourceReference
(
""
))
self
.
assertNotEqual
(
invoice
.
getDestinationReference
(
""
),
reversale_invoice
.
getDestinationReference
(
""
))
# Another trade condition
self
.
assertEqual
(
reversale_invoice
.
getSpecialise
(),
"sale_trade_condition_module/slapos_manual_accounting_trade_condition"
)
self
.
tic
()
system_event_list
=
payment
.
getDestinationRelatedValueList
(
portal_type
=
"Payzen Event"
)
self
.
assertEqual
(
len
(
system_event_list
),
0
)
\ No newline at end of file
master/bt5/slapos_payzen/bt/template_path_list
View file @
21504241
accounting_module/template_sale_invoice_transaction
accounting_module/template_sale_invoice_transaction/**
portal_alarms/slapos_payzen_update_confirmed_payment
portal_alarms/slapos_payzen_update_started_payment
portal_alarms/slapos_trigger_payment_transaction_order_builder
portal_integrations/slapos_payzen_test_integration
portal_integrations/slapos_payzen_test_integration/Causality
portal_integrations/slapos_payzen_test_integration/Resource
portal_integrations/slapos_payzen_test_integration/Resource/**
portal_integrations/slapos_payzen_test_integration/SourceProject
portal_orders/slapos_payment_transaction_builder
portal_orders/slapos_payment_transaction_builder/**
portal_secure_payments/slapos_payzen_test
portal_secure_payments/slapos_payzen_test/**
sale_trade_condition_module/payzen_sale_trade_condition
...
...
master/bt5/slapos_payzen/bt/template_test_id_list
View file @
21504241
test.erp5.testSlapOSPayzen
Builder
test.erp5.testSlapOSPayzen
EntityCreatePayment
test.erp5.testSlapOSPayzenSkins
test.erp5.testSlapOSPayzenAlarm
test.erp5.testSlapOSPayzenWorkflow
\ No newline at end of file
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_notifyPaymentIsReady.py
View file @
21504241
...
...
@@ -25,7 +25,7 @@ notification_mapping_dict = {
'name'
:
recipient
.
getTitle
(),
'subscription_title'
:
context
.
getTitle
(),
# Possible more actions goes here
'payment_relative_relative_url'
:
payment
.
getRelativeUrl
()}
'payment_relative_relative_url'
:
invoice
.
getRelativeUrl
()}
# Preserve HTML else convert to text
if
notification_message
.
getContentType
()
==
"text/html"
:
...
...
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_notifyPaymentIsReady.xml
View file @
21504241
...
...
@@ -50,7 +50,7 @@
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
payment
</string>
</value>
<value>
<string>
invoice
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
...
...
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_processOrdered.py
View file @
21504241
...
...
@@ -32,19 +32,17 @@ if instance_tree is not None:
context
.
start
(
comment
=
comment
)
context
.
stop
(
comment
=
comment
)
first_period_payment
=
context
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
if
not
first_period_payment
:
#
Payment isn't available for the user
invoice
=
context
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
if
not
invoice
:
#
Invoice isn't available for the user to Pay
return
"Skipped (Payment isn't ready)"
if
not
context
.
SubscriptionRequest_verifyInstanceIsAllocated
():
# Only continue if instance is ready
return
"Skipped (Instance isn't ready)"
invoice
=
first_period_payment
.
getCausalityValue
()
# Link to be sent is the invoice one
if
context
.
SubscriptionRequest_notifyPaymentIsReady
(
payment
=
invoice
):
if
context
.
SubscriptionRequest_notifyPaymentIsReady
(
invoice
):
context
.
confirm
(
comment
=
"Payment is ready for the user"
)
return
"Payment is ready for the user"
...
...
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_testPaymentBalance.py
View file @
21504241
portal
=
context
.
getPortalObject
()
payment
=
context
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
invoice
=
context
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
if
payment
is
not
None
:
if
payment
.
getSimulationState
()
in
[
'stopped'
,
'delivered'
]
:
#
Payment Transaction
is payed
if
invoice
is
not
None
:
if
invoice
.
SaleInvoiceTransaction_isLettered
()
:
#
Invoice
is payed
return
True
person
=
context
.
getDestinationSectionValue
()
...
...
@@ -18,5 +18,5 @@ if payment is not None:
not
(
person
.
Entity_statSlapOSOutstandingAmount
()
>
0
)):
return
True
#
Payment Transaction
isn't payed
#
Invoice
isn't payed
return
False
master/bt5/slapos_subscription_request/SkinTemplateItem/portal_skins/slapos_subscription_request/SubscriptionRequest_verifyPaymentBalanceIsReady.py
View file @
21504241
...
...
@@ -25,12 +25,10 @@ for packing_list in portal.portal_catalog(
):
for
invoice
in
packing_list
.
getCausalityRelatedValueList
(
portal_type
=
"Sale Invoice Transaction"
):
for
payment
in
invoice
.
getCausalityRelatedValueList
(
portal_type
=
[
"Payment Transaction"
,
"Sale Invoice Transaction"
]):
if
payment
.
getSimulationState
()
in
[
"stopped"
,
"delivered"
,
"started"
]:
# Invoice is already paied so we just move foward
if
not
payment
.
checkConsistency
():
return
payment
# XXX How to check if the invoice is ready to be payed
if
invoice
.
getSimulationState
()
in
[
'stopped'
,
'delivered'
]
and
\
not
invoice
.
checkConsistency
():
return
invoice
# Payment isn't ready
return
# Invoice inst ready to be payed
master/bt5/slapos_subscription_request/TestTemplateItem/portal_components/test.erp5.testSlapOSSubscriptionCancellationScenario.py
View file @
21504241
...
...
@@ -170,20 +170,6 @@ class TestSlapOSSubscriptionCancellationScenario(TestSlapOSSubscriptionScenarioM
self
.
assertEqual
(
invoice
.
getSimulationState
(),
"stopped"
)
self
.
assertEqual
(
invoice
.
getCausalityState
(),
"solved"
)
builder
=
self
.
portal
.
portal_orders
.
slapos_payment_transaction_builder
for
_
in
range
(
500
):
# build the aggregated payment
self
.
stepCallSlaposTriggerPaymentTransactionOrderBuilderAlarm
()
self
.
tic
()
# If there is something unbuild recall alarm, this is mostly for
# live tests with date on the development sites.
if
not
len
(
builder
.
OrderBuilder_generateUnrelatedInvoiceList
()):
break
# start the payzen payment
self
.
stepCallSlaposPayzenUpdateConfirmedPaymentAlarm
()
self
.
tic
()
self
.
invokeBasicSimulationAlarmList
()
# Call alarm to check payment and invoice and move foward to planned.
...
...
master/bt5/slapos_subscription_request/TestTemplateItem/portal_components/test.erp5.testSlapOSSubscriptionCancellationScenario.xml
View file @
21504241
...
...
@@ -6,12 +6,6 @@
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOSSubscriptionCancellationScenario
</string>
</value>
...
...
@@ -61,28 +55,13 @@
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
I
=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
...
...
@@ -95,7 +74,7 @@
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
Q
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
</value>
</item>
</dictionary>
...
...
@@ -104,7 +83,7 @@
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
...
...
master/bt5/slapos_subscription_request/TestTemplateItem/portal_components/test.erp5.testSlapOSSubscriptionScenario.py
View file @
21504241
...
...
@@ -338,9 +338,9 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
notification_message
=
"subscription_request-payment-is-ready"
):
self
.
checkSubscriptionRequest
(
subscription_request
,
email
,
subscription_condition
)
payment
=
subscription_request
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
self
.
assertNotEqual
(
payment
,
None
)
self
.
assertEqual
(
payment
.
getSimulationState
(),
'start
ed'
)
invoice
=
subscription_request
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
self
.
assertNotEqual
(
invoice
,
None
)
self
.
assertEqual
(
invoice
.
getSimulationState
(),
'stopp
ed'
)
# Assert instance is allocated and without error
self
.
assertEqual
(
True
,
...
...
@@ -375,17 +375,13 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
person
=
subscription_request
.
getDestinationSectionValue
()
self
.
login
(
person
.
getUserId
())
payment
=
self
.
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
"started"
)
sale_transaction_invoice
=
payment
.
getCausalityValue
(
portal_type
=
"Sale Invoice Transaction"
)
invoice_list
=
person
.
Entity_getOutstandingAmountList
()
self
.
assertEqual
(
len
(
invoice_list
),
1
)
sale_transaction_invoice
=
invoice_list
[
0
].
getObject
()
self
.
logout
()
self
.
login
()
sale_transaction_invoice
.
SaleInvoiceTransaction_createReversal
PayzenTransaction
(
)
sale_transaction_invoice
.
SaleInvoiceTransaction_createReversal
SaleInvoiceTransaction
(
batch_mode
=
1
)
def
checkSubscriptionRequestPayment
(
self
,
subscription_request
,
authAmount
):
...
...
@@ -447,8 +443,11 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
quantity
=
subscription_request
.
getQuantity
()
self
.
login
(
person
.
getUserId
())
self
.
usePayzenManually
(
self
.
web_site
,
person
.
getUserId
(),
is_email_expected
=
False
)
self
.
usePaymentManually
(
self
.
web_site
,
person
.
getUserId
(),
is_email_expected
=
False
,
subscription_request
=
subscription_request
)
self
.
logout
()
self
.
login
()
...
...
@@ -485,7 +484,10 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
quantity
=
subscription_request
.
getQuantity
()
self
.
login
(
person
.
getUserId
())
self
.
usePayzenManually
(
self
.
web_site
,
person
.
getUserId
())
self
.
usePaymentManually
(
self
.
web_site
,
person
.
getUserId
(),
subscription_request
=
subscription_request
)
self
.
logout
()
self
.
login
()
...
...
@@ -524,7 +526,11 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
self
.
portal
.
portal_secure_payments
.
slapos_wechat_test
.
setWechatMode
(
"UNITTEST"
)
self
.
login
(
person
.
getUserId
())
self
.
useWechatManually
(
self
.
web_site
,
person
.
getUserId
(),
is_email_expected
=
False
)
self
.
usePaymentManually
(
self
.
web_site
,
person
.
getUserId
(),
is_email_expected
=
False
,
subscription_request
=
subscription_request
)
self
.
logout
()
self
.
login
()
...
...
@@ -556,7 +562,10 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
self
.
portal
.
portal_secure_payments
.
slapos_wechat_test
.
setWechatMode
(
"UNITTEST"
)
self
.
login
(
person
.
getUserId
())
self
.
useWechatManually
(
self
.
web_site
,
person
.
getUserId
())
self
.
usePaymentManually
(
self
.
web_site
,
person
.
getUserId
(),
subscription_request
=
subscription_request
)
self
.
logout
()
self
.
login
()
...
...
@@ -882,23 +891,6 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
builder
=
self
.
portal
.
portal_orders
.
slapos_payment_transaction_builder
for
_
in
range
(
500
):
# build the aggregated payment
self
.
stepCallSlaposTriggerPaymentTransactionOrderBuilderAlarm
()
self
.
tic
()
# If there is something unbuild recall alarm.
if
not
len
(
builder
.
OrderBuilder_generateUnrelatedInvoiceList
()):
break
# start the payzen payment
self
.
stepCallSlaposPayzenUpdateConfirmedPaymentAlarm
()
self
.
tic
()
# stabilise the payment deliveries and expand them
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
# trigger the CRM interaction
self
.
stepCallSlaposCrmCreateRegularisationRequestAlarm
()
self
.
tic
()
...
...
@@ -989,9 +981,8 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
"TestSubscriptionSkins Notification Message %s %s"
%
(
subscription_request
.
getLanguage
(),
notification_message
),
mail_message
.
getTitle
())
payment
=
subscription_request
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
self
.
assertEqual
(
payment
.
getSimulationState
(),
'started'
)
invoice
=
payment
.
getCausalityValue
()
invoice
=
subscription_request
.
SubscriptionRequest_verifyPaymentBalanceIsReady
()
self
.
assertEqual
(
invoice
.
getSimulationState
(),
'stopped'
)
self
.
assertTrue
(
invoice
.
getRelativeUrl
()
in
\
mail_message
.
getTextContent
())
self
.
assertTrue
(
subscription_request
.
getDestinationSectionTitle
()
in
\
...
...
@@ -1407,23 +1398,6 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
builder
=
self
.
portal
.
portal_orders
.
slapos_payment_transaction_builder
for
_
in
range
(
500
):
# build the aggregated payment
self
.
stepCallSlaposTriggerPaymentTransactionOrderBuilderAlarm
()
self
.
tic
()
# If there is something unbuild recall alarm.
if
not
len
(
builder
.
OrderBuilder_generateUnrelatedInvoiceList
()):
break
# start the payzen payment
self
.
stepCallSlaposPayzenUpdateConfirmedPaymentAlarm
()
self
.
tic
()
# stabilise the payment deliveries and expand them
self
.
stepCallSlaposManageBuildingCalculatingDeliveryAlarm
()
self
.
tic
()
# trigger the CRM interaction
self
.
stepCallSlaposCrmCreateRegularisationRequestAlarm
()
self
.
tic
()
...
...
master/bt5/slapos_subscription_request/TestTemplateItem/portal_components/test.erp5.testSlapOSSubscriptionScenario.xml
View file @
21504241
...
...
@@ -6,12 +6,6 @@
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOSSubscriptionScenario
</string>
</value>
...
...
@@ -55,28 +49,13 @@
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
I
=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
...
...
@@ -89,7 +68,7 @@
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
Q
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
</value>
</item>
</dictionary>
...
...
@@ -98,7 +77,7 @@
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
...
...
master/bt5/slapos_wechat/PathTemplateItem/portal_alarms/slapos_wechat_update_confirmed_payment.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Alarm"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
active_sense_method_id
</string>
</key>
<value>
<string>
Alarm_updateWechatConfirmedPaymentTransaction
</string>
</value>
</item>
<item>
<key>
<string>
automatic_solve
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
slapos_wechat_update_confirmed_payment
</string>
</value>
</item>
<item>
<key>
<string>
periodicity_hour
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_minute
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_minute_frequency
</string>
</key>
<value>
<int>
5
</int>
</value>
</item>
<item>
<key>
<string>
periodicity_month
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_month_day
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
periodicity_start_date
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1288051200.0
</float>
<string>
GMT
</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
periodicity_week
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Alarm
</string>
</value>
</item>
<item>
<key>
<string>
sense_method_id
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Handles confirmed Payment Transactions with Wechat interface
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/Alarm_updateWechatConfirmedPaymentTransaction.py
deleted
100644 → 0
View file @
5128c902
portal
=
context
.
getPortalObject
()
portal
.
portal_catalog
.
searchAndActivate
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
[
"confirmed"
],
causality_state
=
[
"draft"
],
payment_mode_uid
=
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
(),
method_id
=
'PaymentTransaction_startWechatPayment'
,
packet_size
=
1
,
# just one to minimise errors
activate_kw
=
{
'tag'
:
tag
}
)
context
.
activate
(
after_tag
=
tag
).
getId
()
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/Alarm_updateWechatConfirmedPaymentTransaction.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
tag, fixit, params
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
Alarm_updateWechatConfirmedPaymentTransaction
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/PaymentTransaction_startWechatPayment.py
deleted
100644 → 0
View file @
5128c902
from
DateTime
import
DateTime
state
=
context
.
getSimulationState
()
transaction_amount
=
int
(
round
((
context
.
PaymentTransaction_getTotalPayablePrice
()
*
-
100
),
2
))
if
(
state
!=
'confirmed'
)
or
(
context
.
getPaymentMode
()
!=
'wechat'
)
or
(
transaction_amount
==
0
):
if
(
transaction_amount
==
0
):
invoice
=
context
.
getCausalityValue
(
portal_types
=
"Sale Invoice Transaction"
)
if
invoice
is
not
None
and
round
(
invoice
.
getTotalPrice
(),
2
)
==
0
:
context
.
edit
(
payment_mode
=
"wire_transfer"
)
return
else
:
# Request manual payment
context
.
start
(
comment
=
'Requested manual payment'
)
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/SaleInvoiceTransaction_createReversalWechatTransaction.py
deleted
100644 → 0
View file @
5128c902
""" Create a reversal transaction from current wechat transaction. """
from
zExceptions
import
Unauthorized
if
REQUEST
is
not
None
:
raise
Unauthorized
portal
=
context
.
getPortalObject
()
# Check that we are in state that we are waiting for user manual payment
assert
context
.
getPortalType
()
==
'Sale Invoice Transaction'
assert
context
.
getPaymentMode
()
==
'wechat'
assert
context
.
getSimulationState
()
==
'stopped'
assert
context
.
getTotalPrice
()
!=
0
assert
context
.
getSpecialise
()
==
"sale_trade_condition_module/slapos_aggregated_trade_condition"
paid
=
True
for
line
in
context
.
getMovementList
(
portal
.
getPortalAccountingMovementTypeList
()):
node_value
=
line
.
getSourceValue
(
portal_type
=
'Account'
)
if
node_value
.
getAccountType
()
==
'asset/receivable'
:
if
not
line
.
hasGroupingReference
():
paid
=
False
break
assert
not
paid
payment
=
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
"started"
,
default_causality_uid
=
context
.
getUid
(),
default_payment_mode_uid
=
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
(),
)
assert
payment
is
not
None
assert
payment
.
getSimulationState
()
==
'started'
assert
payment
.
getPaymentMode
()
==
'wechat'
assert
payment
.
PaymentTransaction_getWechatId
()[
1
]
is
None
# Should be safe now to fix everything
context
.
SaleInvoiceTransaction_resetPaymentMode
()
payment
.
edit
(
payment_mode
=
None
)
reversal_transaction
=
context
.
Base_createCloneDocument
(
batch_mode
=
1
)
payment
.
cancel
(
comment
=
"Reversal sale invoice transaction created %s"
%
reversal_transaction
.
getRelativeUrl
())
reversal_transaction
.
edit
(
title
=
"Reversal Transaction for %s"
%
context
.
getTitle
(),
causality_value
=
context
,
description
=
"Reversal Transaction for %s"
%
context
.
getTitle
(),
specialise_value
=
portal
.
sale_trade_condition_module
.
slapos_manual_accounting_trade_condition
,
)
for
line
in
reversal_transaction
.
getMovementList
():
line
.
edit
(
quantity
=
(
-
line
.
getQuantity
()))
reversal_transaction
.
confirm
(
comment
=
"Automatic because of reversal creation"
)
reversal_transaction
.
stop
(
comment
=
"Automatic because of reversal creation"
)
return
reversal_transaction
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/SaleInvoiceTransaction_getWechatPaymentRelatedValue.py
deleted
100644 → 0
View file @
5128c902
portal
=
context
.
getPortalObject
()
return
portal
.
portal_catalog
.
getResultValue
(
portal_type
=
"Payment Transaction"
,
simulation_state
=
"started"
,
default_causality_uid
=
context
.
getUid
(),
default_payment_mode_uid
=
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
(),
)
master/bt5/slapos_wechat/SkinTemplateItem/portal_skins/slapos_wechat/SaleInvoiceTransaction_getWechatPaymentRelatedValue.xml
deleted
100644 → 0
View file @
5128c902
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"PythonScript"
module=
"Products.PythonScripts.PythonScript"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
Script_magic
</string>
</key>
<value>
<int>
3
</int>
</value>
</item>
<item>
<key>
<string>
_bind_names
</string>
</key>
<value>
<object>
<klass>
<global
name=
"NameAssignments"
module=
"Shared.DC.Scripts.Bindings"
/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key>
<string>
_asgns
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
name_container
</string>
</key>
<value>
<string>
container
</string>
</value>
</item>
<item>
<key>
<string>
name_context
</string>
</key>
<value>
<string>
context
</string>
</value>
</item>
<item>
<key>
<string>
name_m_self
</string>
</key>
<value>
<string>
script
</string>
</value>
</item>
<item>
<key>
<string>
name_subpath
</string>
</key>
<value>
<string>
traverse_subpath
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
_params
</string>
</key>
<value>
<string>
**kw
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
SaleInvoiceTransaction_getWechatPaymentRelatedValue
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatAlarm.py
View file @
21504241
# Copyright (c) 2002-2012 Nexedi SA and Contributors. All Rights Reserved.
# -*- coding:utf-8 -*-
##############################################################################
#
# Copyright (c) 2022 Nexedi SA and Contributors. All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
from
erp5.component.test.SlapOSTestCaseMixin
import
SlapOSTestCaseMixinWithAbort
from
Products.ERP5Type.tests.utils
import
createZODBPythonScript
from
DateTime
import
DateTime
class
TestSlapOSWechatUpdateConfirmedPayment
(
SlapOSTestCaseMixinWithAbort
):
def
_simulatePaymentTransaction_startWechatPayment
(
self
):
script_name
=
'PaymentTransaction_startWechatPayment'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
raise
ValueError
(
'Precondition failed: %s exists in custom'
%
script_name
)
createZODBPythonScript
(
self
.
portal
.
portal_skins
.
custom
,
script_name
,
'*args, **kwargs'
,
'# Script body
\
n
'
"""portal_workflow = context.portal_workflow
portal_workflow.doActionFor(context, action='edit_action', comment='Visited by PaymentTransaction_startWechatPayment') """
)
self
.
commit
()
def
_dropPaymentTransaction_startWechatPayment
(
self
):
script_name
=
'PaymentTransaction_startWechatPayment'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
self
.
portal
.
portal_skins
.
custom
.
manage_delObjects
(
script_name
)
self
.
commit
()
def
test_alarm_confirmed_draft_wechat
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"wechat"
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
self
.
tic
()
self
.
_simulatePaymentTransaction_startWechatPayment
()
try
:
self
.
portal
.
portal_alarms
.
slapos_wechat_update_confirmed_payment
.
activeSense
()
self
.
tic
()
finally
:
self
.
_dropPaymentTransaction_startWechatPayment
()
self
.
tic
()
self
.
assertEqual
(
'Visited by PaymentTransaction_startWechatPayment'
,
transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
def
test_alarm_not_confirmed
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"wechat"
,
)
self
.
tic
()
self
.
_simulatePaymentTransaction_startWechatPayment
()
try
:
self
.
portal
.
portal_alarms
.
slapos_wechat_update_confirmed_payment
.
activeSense
()
self
.
tic
()
finally
:
self
.
_dropPaymentTransaction_startWechatPayment
()
self
.
tic
()
self
.
assertNotEqual
(
'Visited by PaymentTransaction_startWechatPayment'
,
transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
def
test_alarm_not_draft
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"wechat"
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'solved'
)
self
.
tic
()
self
.
_simulatePaymentTransaction_startWechatPayment
()
try
:
self
.
portal
.
portal_alarms
.
slapos_wechat_update_confirmed_payment
.
activeSense
()
self
.
tic
()
finally
:
self
.
_dropPaymentTransaction_startWechatPayment
()
self
.
tic
()
self
.
assertNotEqual
(
'Visited by PaymentTransaction_startWechatPayment'
,
transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
def
test_alarm_not_wechat
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
self
.
tic
()
self
.
_simulatePaymentTransaction_startWechatPayment
()
try
:
self
.
portal
.
portal_alarms
.
slapos_wechat_update_confirmed_payment
.
activeSense
()
self
.
tic
()
finally
:
self
.
_dropPaymentTransaction_startWechatPayment
()
self
.
tic
()
self
.
assertNotEqual
(
'Visited by PaymentTransaction_startWechatPayment'
,
transaction
.
workflow_history
[
'edit_workflow'
][
-
1
][
'comment'
])
def
_simulatePaymentTransaction_getTotalPayablePrice
(
self
):
script_name
=
'PaymentTransaction_getTotalPayablePrice'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
raise
ValueError
(
'Precondition failed: %s exists in custom'
%
script_name
)
createZODBPythonScript
(
self
.
portal
.
portal_skins
.
custom
,
script_name
,
'*args, **kwargs'
,
'# Script body
\
n
'
"""return 1"""
)
self
.
commit
()
def
_simulatePaymentTransaction_getZeroTotalPayablePrice
(
self
):
script_name
=
'PaymentTransaction_getTotalPayablePrice'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
raise
ValueError
(
'Precondition failed: %s exists in custom'
%
script_name
)
createZODBPythonScript
(
self
.
portal
.
portal_skins
.
custom
,
script_name
,
'*args, **kwargs'
,
'# Script body
\
n
'
"""return 0"""
)
self
.
commit
()
def
_dropPaymentTransaction_getTotalPayablePrice
(
self
):
script_name
=
'PaymentTransaction_getTotalPayablePrice'
if
script_name
in
self
.
portal
.
portal_skins
.
custom
.
objectIds
():
self
.
portal
.
portal_skins
.
custom
.
manage_delObjects
(
script_name
)
self
.
commit
()
def
test_not_confirmed_payment
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"wechat"
,
)
simulation_state
=
transaction
.
getSimulationState
()
modification_date
=
transaction
.
getModificationDate
()
self
.
_simulatePaymentTransaction_getTotalPayablePrice
()
try
:
transaction
.
PaymentTransaction_startWechatPayment
()
finally
:
self
.
_dropPaymentTransaction_getTotalPayablePrice
()
self
.
assertEqual
(
transaction
.
getSimulationState
(),
simulation_state
)
self
.
assertEqual
(
transaction
.
getModificationDate
(),
modification_date
)
def
test_not_wechat_payment
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
simulation_state
=
transaction
.
getSimulationState
()
modification_date
=
transaction
.
getModificationDate
()
self
.
_simulatePaymentTransaction_getTotalPayablePrice
()
try
:
transaction
.
PaymentTransaction_startWechatPayment
()
finally
:
self
.
_dropPaymentTransaction_getTotalPayablePrice
()
self
.
assertEqual
(
transaction
.
getSimulationState
(),
simulation_state
)
self
.
assertEqual
(
transaction
.
getModificationDate
(),
modification_date
)
def
test_zero_amount_payment
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"wechat"
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
simulation_state
=
transaction
.
getSimulationState
()
modification_date
=
transaction
.
getModificationDate
()
self
.
_simulatePaymentTransaction_getZeroTotalPayablePrice
()
try
:
transaction
.
PaymentTransaction_startWechatPayment
()
finally
:
self
.
_dropPaymentTransaction_getTotalPayablePrice
()
self
.
assertEqual
(
transaction
.
getSimulationState
(),
simulation_state
)
self
.
assertEqual
(
transaction
.
getModificationDate
(),
modification_date
)
def
test_expected_payment
(
self
):
new_id
=
self
.
generateNewId
()
transaction
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
'Payment Transaction'
,
title
=
"Transaction %s"
%
new_id
,
reference
=
"TESTTRANS-%s"
%
new_id
,
payment_mode
=
"wechat"
,
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
transaction
,
'confirmed'
)
self
.
_simulatePaymentTransaction_getTotalPayablePrice
()
try
:
transaction
.
PaymentTransaction_startWechatPayment
()
finally
:
self
.
_dropPaymentTransaction_getTotalPayablePrice
()
self
.
assertEqual
(
transaction
.
getSimulationState
(),
'started'
)
class
TestSlapOSWechatUpdateStartedPayment
(
SlapOSTestCaseMixinWithAbort
):
def
test_not_started_payment
(
self
):
...
...
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatAlarm.xml
View file @
21504241
...
...
@@ -6,12 +6,6 @@
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_recorded_property_dict
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOSWechatAlarm
</string>
</value>
...
...
@@ -55,28 +49,13 @@
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
I
=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
...
...
@@ -89,7 +68,7 @@
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
Q
=
</string>
</persistent>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAA
M
=
</string>
</persistent>
</value>
</item>
</dictionary>
...
...
@@ -98,7 +77,7 @@
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
...
...
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatBuilder.py
deleted
100644 → 0
View file @
5128c902
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2012 Nexedi SA and Contributors. All Rights Reserved.
#
##############################################################################
from
erp5.component.test.testSlapOSPayzenBuilder
import
TestSlapOSPaymentTransactionOrderBuilderMixin
class
TestSlapOSWechatPaymentTransactionOrderBuilder
(
TestSlapOSPaymentTransactionOrderBuilderMixin
):
payment_mode
=
"wechat"
test
=
TestSlapOSPaymentTransactionOrderBuilderMixin
.
_test
test_twice
=
TestSlapOSPaymentTransactionOrderBuilderMixin
.
_test_twice
test_twice_transaction
=
TestSlapOSPaymentTransactionOrderBuilderMixin
.
_test_twice_transaction
test_twice_indexation
=
TestSlapOSPaymentTransactionOrderBuilderMixin
.
_test_twice_indexation
test_cancelled_payment
=
TestSlapOSPaymentTransactionOrderBuilderMixin
.
_test_cancelled_payment
test_two_invoices
=
TestSlapOSPaymentTransactionOrderBuilderMixin
.
_test_two_invoices
test_two_lines
=
TestSlapOSPaymentTransactionOrderBuilderMixin
.
_test_two_lines
\ No newline at end of file
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatEntityCreatePayment.py
0 → 100644
View file @
21504241
# -*- coding:utf-8 -*-
##############################################################################
#
# Copyright (c) 2022 Nexedi SA and Contributors. All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
##############################################################################
from
erp5.component.test.testSlapOSEntityCreatePayment
import
TestSlapOSEntityCreatePaymentMixin
class
TestSlapOSWechatEntityCreatePayment
(
TestSlapOSEntityCreatePaymentMixin
):
payment_mode
=
"wechat"
test
=
TestSlapOSEntityCreatePaymentMixin
.
_test
test_twice
=
TestSlapOSEntityCreatePaymentMixin
.
_test_twice
test_twice_transaction
=
TestSlapOSEntityCreatePaymentMixin
.
_test_twice_transaction
test_twice_indexation
=
TestSlapOSEntityCreatePaymentMixin
.
_test_twice_indexation
test_cancelled_payment
=
TestSlapOSEntityCreatePaymentMixin
.
_test_cancelled_payment
test_two_invoices
=
TestSlapOSEntityCreatePaymentMixin
.
_test_two_invoices
test_two_lines
=
TestSlapOSEntityCreatePaymentMixin
.
_test_two_lines
master/bt5/slapos_
payzen/PathTemplateItem/portal_orders/slapos_payment_transaction_builder
.xml
→
master/bt5/slapos_
wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatEntityCreatePayment
.xml
View file @
21504241
...
...
@@ -2,120 +2,105 @@
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"
Order Builder
"
module=
"erp5.portal_type"
/>
<global
name=
"
Test Component
"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_count
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
testSlapOSWechatEntityCreatePayment
</string>
</value>
</item>
<item>
<key>
<string>
_mt_index
</string>
</key>
<key>
<string>
description
</string>
</key>
<value>
<
persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent
>
<
none/
>
</value>
</item>
<item>
<key>
<string>
_tree
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAQ=
</string>
</persistent>
</value>
<key>
<string>
id
</string>
</key>
<value>
<string>
test.erp5.testSlapOSWechatEntityCreatePayment
</string>
</value>
</item>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
destination/organisation_module/slapos
</string>
<string>
destination_section/organisation_module/slapos
</string>
</tuple>
</value>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Test Component
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<key>
<string>
sid
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
delivery_after_generation_script_id
</string>
</key>
<value>
<string>
PaymentTransaction_postOrderBuild
</string>
</value>
</item>
<item>
<key>
<string>
delivery_cell_portal_type
</string>
</key>
<value>
<string>
Delivery Cell
</string>
</value>
</item>
<item>
<key>
<string>
delivery_cell_separate_order
</string>
</key>
<key>
<string>
text_content_error_message
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
delivery_line_portal_type
</string>
</key>
<value>
<string>
Accounting Transaction Line
</string>
</value>
</item>
<item>
<key>
<string>
delivery_module
</string>
</key>
<value>
<string>
accounting_module
</string>
</value>
</item>
<item>
<key>
<string>
delivery_portal_type
</string>
</key>
<value>
<string>
Payment Transaction
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<key>
<string>
text_content_warning_message
</string>
</key>
<value>
<
non
e/>
<
tupl
e/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
slapos_payment_transaction_builder
</string>
</value>
<key>
<string>
version
</string>
</key>
<value>
<string>
erp5
</string>
</value>
</item>
<item>
<key>
<string>
language
</string>
</key>
<key>
<string>
workflow_history
</string>
</key>
<value>
<
none/
>
<
persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent
>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Order Builder
</string>
</value>
</item>
<item>
<key>
<string>
simulation_select_method_id
</string>
</key>
<value>
<string>
OrderBuilder_generateUnrelatedInvoiceList
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Payment Builder
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"Length"
module=
"BTrees.Length"
/>
</pickle>
<pickle>
<int>
0
</int>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"OOBTree"
module=
"BTrees.OOBTree"
/>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<none/>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
component_validation_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"
4"
aka=
"AAAAAAAAAAQ
="
>
<record
id=
"
3"
aka=
"AAAAAAAAAAM
="
>
<pickle>
<global
name=
"
OOBTree"
module=
"BTrees.OOBTree
"
/>
<global
name=
"
WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow
"
/>
</pickle>
<pickle>
<none/>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
validate
</string>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
validated
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
master/bt5/slapos_wechat/TestTemplateItem/portal_components/test.erp5.testSlapOSWechatSkins.py
View file @
21504241
...
...
@@ -534,85 +534,6 @@ class TestSlapOSWechatBase_getWechatServiceRelativeUrl(SlapOSTestCaseMixinWithAb
result
=
self
.
portal
.
Base_getWechatServiceRelativeUrl
()
self
.
assertEqual
(
result
,
'portal_secure_payments/slapos_wechat_test'
)
class
TestSlapOSWechatAccountingTransaction_getPaymentState
(
SlapOSTestCaseMixinWithAbort
):
def
test_AccountingTransaction_getPaymentState_draft_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_deleted_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
delete
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_cancelled_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
cancel
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_planned_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
plan
()
self
.
assertEqual
(
"Ongoing"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_confirmed_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
setStartDate
(
DateTime
())
invoice
.
confirm
()
self
.
assertEqual
(
"Ongoing"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_started_payment
(
self
):
invoice
=
self
.
createSaleInvoiceTransaction
()
invoice
.
start
()
self
.
assertEqual
(
"Ongoing"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_reversed_payment
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
self
.
tic
()
reversal
=
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
()
self
.
tic
()
self
.
assertEqual
(
"Cancelled"
,
invoice
.
AccountingTransaction_getPaymentState
())
self
.
assertEqual
(
0
,
invoice
.
getTotalPrice
()
+
reversal
.
getTotalPrice
())
def
test_AccountingTransaction_getPaymentState_free_payment
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
(
price
=
0
)
self
.
tic
()
self
.
assertEqual
(
"Free!"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_unpaid_payment
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
# If payment is not indexed or not started the state should be unpaid
self
.
assertEqual
(
"Unpaid"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_paynow_payment
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createWechatSaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
self
.
login
(
person
.
getUserId
())
self
.
assertEqual
(
"Pay Now"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_waiting_payment
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createWechatSaleInvoiceTransaction
(
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
payment
=
invoice
.
SaleInvoiceTransaction_getWechatPaymentRelatedValue
()
payment
.
PaymentTransaction_generateWechatId
()
self
.
login
(
person
.
getUserId
())
self
.
assertEqual
(
"Waiting for payment confirmation"
,
invoice
.
AccountingTransaction_getPaymentState
())
def
test_AccountingTransaction_getPaymentState_paid_payment
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
self
.
tic
()
for
line
in
invoice
.
getMovementList
(
self
.
portal
.
getPortalAccountingMovementTypeList
()):
node_value
=
line
.
getSourceValue
(
portal_type
=
'Account'
)
if
node_value
.
getAccountType
()
==
'asset/receivable'
:
line
.
setGroupingReference
(
"TEST%s"
%
self
.
new_id
)
self
.
assertEqual
(
"Paid"
,
invoice
.
AccountingTransaction_getPaymentState
())
class
TestSlapOSWechatPaymentTransaction_redirectToManualWechatPayment
(
SlapOSTestCaseMixinWithAbort
):
...
...
@@ -657,11 +578,19 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
def
test_PaymentTransaction_redirectToManualWechatPayment_redirect
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createWechatSaleInvoiceTransaction
(
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
payment_mode
=
"wechat"
,
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
payment
=
invoice
.
SaleInvoiceTransaction_getWechatPaymentRelatedValue
()
payment
.
setResourceValue
(
self
.
portal
.
currency_module
.
EUR
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
'wechat'
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
resource_value
=
self
.
portal
.
currency_module
.
CNY
,
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
payment_transaction_id
=
payment
.
getId
()
self
.
tic
()
...
...
@@ -693,11 +622,19 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
def
test_PaymentTransaction_redirectToManualWechatPayment_redirect_with_website
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createWechatSaleInvoiceTransaction
(
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
payment_mode
=
"wechat"
,
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
payment
=
invoice
.
SaleInvoiceTransaction_getWechatPaymentRelatedValue
()
payment
.
setResourceValue
(
self
.
portal
.
currency_module
.
EUR
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
'wechat'
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
resource_value
=
self
.
portal
.
currency_module
.
CNY
,
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
payment_transaction_id
=
payment
.
getId
()
web_site
=
self
.
portal
.
web_site_module
.
newContent
(
portal_type
=
'Web Site'
)
...
...
@@ -725,11 +662,20 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
def
test_PaymentTransaction_redirectToManualWechatPayment_already_registered
(
self
):
person
=
self
.
makePerson
()
invoice
=
self
.
createWechatSaleInvoiceTransaction
(
invoice
=
self
.
createStoppedSaleInvoiceTransaction
(
payment_mode
=
"wechat"
,
destination_section
=
person
.
getRelativeUrl
())
self
.
tic
()
payment
=
invoice
.
SaleInvoiceTransaction_getWechatPaymentRelatedValue
()
payment
.
setResourceValue
(
self
.
portal
.
currency_module
.
EUR
)
payment
=
self
.
portal
.
accounting_module
.
newContent
(
portal_type
=
"Payment Transaction"
,
payment_mode
=
'wechat'
,
causality_value
=
invoice
,
destination_section
=
invoice
.
getDestinationSection
(),
resource_value
=
self
.
portal
.
currency_module
.
CNY
,
created_by_builder
=
1
# to prevent init script to create lines
)
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'started'
)
payment
.
PaymentTransaction_generateWechatId
()
self
.
tic
()
self
.
login
(
person
.
getUserId
())
...
...
@@ -742,164 +688,5 @@ return dict(vads_url_already_registered="%s/already_registered" % (payment_trans
self
.
assertEqual
(
"%s/already_registered"
%
payment
.
getRelativeUrl
(),
redirect
)
class
TestSlapOSWechatSaleInvoiceTransaction_getWechatPaymentRelatedValue
(
SlapOSTestCaseMixinWithAbort
):
def
test_SaleInvoiceTransaction_getWechatPaymentRelatedValue
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
SaleInvoiceTransaction_getWechatPaymentRelatedValue
()
self
.
assertNotEqual
(
None
,
payment
)
self
.
assertEqual
(
payment
.
getSimulationState
(),
"started"
)
self
.
assertEqual
(
payment
.
getCausalityValue
(),
invoice
)
self
.
assertEqual
(
payment
.
getPaymentModeUid
(),
self
.
portal
.
portal_categories
.
payment_mode
.
wechat
.
getUid
())
payment
.
setStartDate
(
DateTime
())
payment
.
stop
()
payment
.
immediateReindexObject
()
payment
=
invoice
.
SaleInvoiceTransaction_getWechatPaymentRelatedValue
()
self
.
assertEqual
(
None
,
payment
)
class
TestSlapOSWechatSaleInvoiceTransaction_createReversalWechatTransaction
(
SlapOSTestCaseMixinWithAbort
):
def
test_createReversalWechatTransaction_REQUEST_disallowed
(
self
):
self
.
assertRaises
(
Unauthorized
,
self
.
portal
.
SaleInvoiceTransaction_createReversalWechatTransaction
,
REQUEST
=
{})
def
test_createReversalWechatTransaction_bad_portal_type
(
self
):
self
.
assertRaises
(
AssertionError
,
self
.
portal
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_bad_payment_mode
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
invoice
.
edit
(
payment_mode
=
"cash"
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_bad_state
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
invoice
,
'delivered'
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_zero_price
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
invoice
.
manage_delObjects
(
invoice
.
contentIds
())
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_wrong_trade_condition
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
invoice
.
edit
(
specialise
=
None
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_paid
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
line
=
invoice
.
contentValues
(
portal_type
=
"Sale Invoice Transaction Line"
)[
0
]
line
.
edit
(
grouping_reference
=
"azerty"
)
self
.
tic
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_no_payment
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
# Do not reindex payment. portal_catalog will not find it.
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_no_wechat_payment
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
getCausalityRelatedValue
()
payment
.
edit
(
payment_mode
=
"cash"
)
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_no_payment_state
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
getCausalityRelatedValue
()
self
.
portal
.
portal_workflow
.
_jumpToStateFor
(
payment
,
'cancelled'
)
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_registered_payment
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
getCausalityRelatedValue
()
payment
.
PaymentTransaction_generateWechatId
()
self
.
assertRaises
(
AssertionError
,
invoice
.
SaleInvoiceTransaction_createReversalWechatTransaction
)
def
test_createReversalWechatTransaction_ok
(
self
):
invoice
=
self
.
createWechatSaleInvoiceTransaction
()
self
.
tic
()
payment
=
invoice
.
getCausalityRelatedValue
()
reversale_invoice
=
invoice
.
\
SaleInvoiceTransaction_createReversalWechatTransaction
()
self
.
assertEqual
(
invoice
.
getPaymentMode
(
""
),
""
)
self
.
assertEqual
(
payment
.
getPaymentMode
(
""
),
""
)
self
.
assertEqual
(
payment
.
getSimulationState
(),
"cancelled"
)
self
.
assertEqual
(
reversale_invoice
.
getTitle
(),
"Reversal Transaction for %s"
%
invoice
.
getTitle
())
self
.
assertEqual
(
reversale_invoice
.
getDescription
(),
"Reversal Transaction for %s"
%
invoice
.
getTitle
())
self
.
assertEqual
(
reversale_invoice
.
getCausality
(),
invoice
.
getRelativeUrl
())
self
.
assertEqual
(
reversale_invoice
.
getSimulationState
(),
"stopped"
)
self
.
assertEqual
(
invoice
.
getSimulationState
(),
"stopped"
)
invoice_line_id
=
invoice
.
contentValues
(
portal_type
=
"Invoice Line"
)[
0
].
getId
()
transaction_line_id
=
invoice
.
contentValues
(
portal_type
=
"Sale Invoice Transaction Line"
)[
0
].
getId
()
self
.
assertEqual
(
invoice
[
invoice_line_id
].
getQuantity
(),
-
reversale_invoice
[
invoice_line_id
].
getQuantity
())
self
.
assertEqual
(
reversale_invoice
[
invoice_line_id
].
getQuantity
(),
2
)
self
.
assertEqual
(
invoice
[
transaction_line_id
].
getQuantity
(),
-
reversale_invoice
[
transaction_line_id
].
getQuantity
())
self
.
assertEqual
(
reversale_invoice
[
transaction_line_id
].
getQuantity
(),
3
)
self
.
assertEqual
(
len
(
invoice
.
getMovementList
()),
2
)
# Both invoice should have a grouping reference
self
.
assertNotEqual
(
invoice
[
transaction_line_id
].
getGroupingReference
(
""
),
""
)
self
.
assertEqual
(
invoice
[
transaction_line_id
].
getGroupingReference
(
"1"
),
reversale_invoice
[
transaction_line_id
].
getGroupingReference
(
"2"
))
# All references should be regenerated
self
.
assertNotEqual
(
invoice
.
getReference
(
""
),
reversale_invoice
.
getReference
(
""
))
self
.
assertNotEqual
(
invoice
.
getSourceReference
(
""
),
reversale_invoice
.
getSourceReference
(
""
))
self
.
assertNotEqual
(
invoice
.
getDestinationReference
(
""
),
reversale_invoice
.
getDestinationReference
(
""
))
# Another trade condition
self
.
assertEqual
(
reversale_invoice
.
getSpecialise
(),
"sale_trade_condition_module/slapos_manual_accounting_trade_condition"
)
self
.
tic
()
system_event_list
=
payment
.
getDestinationRelatedValueList
(
portal_type
=
"Payzen Event"
)
self
.
assertEqual
(
len
(
system_event_list
),
0
)
\ No newline at end of file
master/bt5/slapos_wechat/bt/template_path_list
View file @
21504241
image_module/wechat**
portal_alarms/slapos_wechat_update_confirmed_payment
portal_alarms/slapos_wechat_update_started_payment
portal_integrations/slapos_wechat_test_integration
portal_integrations/slapos_wechat_test_integration/Causality
...
...
master/bt5/slapos_wechat/bt/template_test_id_list
View file @
21504241
test.erp5.testSlapOSWechatSkins
test.erp5.testSlapOSWechatWorkflow
test.erp5.testSlapOSWechatAlarm
test.erp5.testSlapOSWechatBuilder
\ No newline at end of file
test.erp5.testSlapOSWechatEntityCreatePayment
\ No newline at end of file
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