Commit 3a217f5b authored by Romain Courteaud's avatar Romain Courteaud

slapos_accounting: add script to generate the deposit

parent 6c05b890
'''
Script to be used as API whenever we want to get an account for a
specific use. Returns the Account object
'''
id = {
'asset_receivable_subscriber': 'receivable',
'asset_deposit_subscriber': 'deposit',
'collection': 'payment_to_encash'
}[use]
account, = context.getPortalObject().portal_catalog(
portal_type='Account',
id=id,
validation_state='validated',
limit=2,
)
return account.getObject()
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</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>use</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Base_getAccountForUse</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
from DateTime import DateTime
portal = context.getPortalObject()
payment_transaction = context
payment_transaction.stop()
start_date = DateTime()
stop_date = None
resource_value = portal.restrictedTraverse('service_module/slapos_deposit')
quantity_unit_value = resource_value.getQuantityUnitValue()
order_portal_type = 'Sale Packing List'
order_line_portal_type = 'Sale Packing List Line'
activate_kw = None
#######################################################
# Open Sale Order
#raise NotImplementedError('Fix dates')
open_sale_order = portal.getDefaultModule(portal_type=order_portal_type).newContent(
portal_type=order_portal_type,
start_date=start_date,
stop_date=stop_date,
specialise_value=payment_transaction.getSpecialiseValue(),
source_value=payment_transaction.getSourceValue(),
source_section_value=payment_transaction.getSourceSectionValue(),
source_decision_value=payment_transaction.getSourceDecisionValue(),
source_project_value=payment_transaction.getSourceProjectValue(),
destination_value=payment_transaction.getDestinationValue(),
destination_section_value=payment_transaction.getDestinationSectionValue(),
destination_decision_value=payment_transaction.getDestinationDecisionValue(),
destination_project_value=payment_transaction.getDestinationProjectValue(),
ledger_value=portal.portal_categories.ledger.automated,
causality_value=payment_transaction,
price_currency_value=payment_transaction.getResourceValue(),
activate_kw=activate_kw
)
open_sale_order.newContent(
portal_type=order_line_portal_type,
resource_value=resource_value,
quantity_unit_value=quantity_unit_value,
base_contribution_list=resource_value.getBaseContributionList(),
use=resource_value.getUse(),
quantity=1,
#price=-payment_transaction.getTotalPrice(),
price=-payment_transaction.PaymentTransaction_getTotalPayablePrice(),
activate_kw=activate_kw
)
open_sale_order.confirm()
open_sale_order.stop()
open_sale_order.deliver()
return open_sale_order
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</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></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>PaymentTransaction_acceptDepositPayment</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
from DateTime import DateTime
from Products.ERP5Type.Message import translateString
portal = context.getPortalObject()
######################################################
# Find Sale Trade Condition
source_section = context
# Create a temp Sale Order to calculate the real price and find the trade condition
now = DateTime()
module = portal.portal_trash
tmp_sale_order = module.newContent(
portal_type='Sale Order',
temp_object=True,
start_date=now,
destination_value=source_section,
destination_section_value=source_section,
destination_decision_value=source_section,
ledger_value=portal.portal_categories.ledger.automated,
price_currency=currency_relative_url
)
tmp_sale_order.SaleOrder_applySaleTradeCondition(batch_mode=1, force=1)
if tmp_sale_order.getSpecialise(None) is None:
raise AssertionError('Can not find a trade condition to generate the Payment Transaction')
if currency_relative_url != tmp_sale_order.getPriceCurrency():
raise AssertionError('Unexpected different currency: %s %s' % (currency_relative_url, tmp_sale_order.getPriceCurrency()))
# If no accounting is needed, no need to check the price
if (tmp_sale_order.getSourceSection(None) == tmp_sale_order.getDestinationSection(None)) or \
(tmp_sale_order.getSourceSection(None) is None):
raise AssertionError('The trade condition does not generate accounting: %s' % tmp_sale_order.getSpecialise())
#######################################################
payment_transaction = portal.accounting_module.newContent(
title="reservation payment",
portal_type="Payment Transaction",
start_date=now,
stop_date=now,
specialise_value=tmp_sale_order.getSpecialiseValue(),
source_value=tmp_sale_order.getSourceValue(),
source_section_value=tmp_sale_order.getSourceSectionValue(),
source_decision_value=tmp_sale_order.getSourceDecisionValue(),
source_project_value=tmp_sale_order.getSourceProjectValue(),
destination_value=tmp_sale_order.getDestinationValue(),
destination_section_value=tmp_sale_order.getDestinationSectionValue(),
destination_decision_value=tmp_sale_order.getDestinationDecisionValue(),
destination_project_value=tmp_sale_order.getDestinationProjectValue(),
ledger_value=portal.portal_categories.ledger.automated,
resource_value=tmp_sale_order.getPriceCurrencyValue(),
created_by_builder=1, # XXX this prevent init script from creating lines.
activate_kw={'tag':'%s_init' % context.getRelativeUrl()}
)
getAccountForUse = context.Base_getAccountForUse
# receivable
payment_transaction.newContent(
id='receivable',
portal_type='Accounting Transaction Line',
quantity=price,
source_value=getAccountForUse('asset_receivable_subscriber'),
# XXX XXX XXX fetch from Business process instead of hardcoding?
# drop destination
destination='account_module/payable'
)
# bank
payment_transaction.newContent(
id='bank',
portal_type='Accounting Transaction Line',
quantity=-price,
source_value=getAccountForUse('collection')
)
if len(payment_transaction.checkConsistency()) != 0:
raise AssertionError(payment_transaction.checkConsistency()[0])
#tag = '%s_update' % context.getDestinationReference()
comment = translateString("Deposit payment.")
payment_transaction.PaymentTransaction_start(comment=comment)
return payment_transaction
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</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>price, currency_relative_url, batch=0</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Person_addDepositPayment</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
from Products.ERP5Type.Cache import CachingMethod
portal = context.getPortalObject()
def getPriceAndVAT():
assert date is not None
temp_sale_order = portal.sale_order_module.newContent(
id=str(DateTime().timeTime()), # XXX: workaround for an obscure transactional cache (?) bug
temp_object=True,
portal_type='Sale Order',
start_date=date,
)
temp_sale_order.Order_applyTradeCondition(context)
temp_sale_order_line = temp_sale_order.newContent(
id=str(DateTime().timeTime()), # XXX: workaround for an obscure transactional cache (?) bug
portal_type='Sale Order Line',
resource_value=resource_value,
# XXX Try without variation for now
quantity=quantity,
price=price
)
temp_sale_order_line.setBaseContributionList(resource_value.getBaseContributionList())
amount_list = temp_sale_order_line.getAggregatedAmountList(rounding=False)
if len(amount_list) == 0:
raise ValueError(
'No amount generated for resource %s with Sale Trade Condition %s' % (
resource_value.getPath(),
context.getPath(),
)
)
total_price = temp_sale_order_line.getTotalPrice() or 0.0
# XXX does not work if quantity === total_price
amount = [amount for amount in amount_list if amount.getQuantity() == total_price][0]
return price, amount.getPrice()
cache_index = 0#portal.sale_supply_module.getIntIndex(0)
return CachingMethod(
getPriceAndVAT,
id=(script.id, cache_index, context.getRelativeUrl(), resource_value.getRelativeUrl(), date.strftime('%Y%m%d'), quantity),
cache_factory='erp5_content_long',
)()
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="_reconstructor" module="copy_reg"/>
</klass>
<tuple>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
<global name="object" module="__builtin__"/>
<none/>
</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>date, resource_value, quantity, price</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SaleTradeCondition_getPriceAndVAT</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment