[Erp5-report] r20231 - /erp5/trunk/products/ERP5/Document/PaymentRule.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon Mar 31 16:17:38 CEST 2008
Author: jerome
Date: Mon Mar 31 16:17:37 2008
New Revision: 20231
URL: http://svn.erp5.org?rev=20231&view=rev
Log:
generate payment transactions from payment conditions (prototype state).
Modified:
erp5/trunk/products/ERP5/Document/PaymentRule.py
Modified: erp5/trunk/products/ERP5/Document/PaymentRule.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/PaymentRule.py?rev=20231&r1=20230&r2=20231&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/PaymentRule.py (original)
+++ erp5/trunk/products/ERP5/Document/PaymentRule.py Mon Mar 31 16:17:37 2008
@@ -33,14 +33,11 @@
from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
from Products.ERP5.Document.Rule import Rule
-from zLOG import LOG
+from zLOG import LOG, INFO
class PaymentRule(Rule):
- """
- Payment Rule generates payment simulation movement from invoice transaction simulation movements.
- This one is a very s(imple|tupid) one : if the parent movement is a 'receivable' one,
- we just create two submovements : 'receivable' (as credit)
- and 'bank' (as debit) with the same quantity as the parent.
+ """Payment Rule generates payment simulation movement from invoice
+ transaction simulation movements.
"""
# CMF Type Definition
@@ -65,59 +62,115 @@
, PropertySheet.Task
)
+ receivable_account_type_list = ('asset/receivable', )
+ payable_account_type_list = ('liability/payable', )
+
+
+ def _getPaymentConditionList(self, movement):
+ """Returns payment conditions for this movement.
+ """
+ while 1:
+ delivery_movement = movement.getDeliveryValue()
+ if delivery_movement is not None:
+ explanation = delivery_movement.getExplanationValue()
+ payment_condition_list = explanation.contentValues(
+ filter=dict(portal_type='Payment Condition'))
+ if payment_condition_list:
+ return payment_condition_list
+
+ order_movement = movement.getOrderValue()
+ if order_movement is not None:
+ explanation = order_movement.getExplanationValue()
+ payment_condition_list = explanation.contentValues(
+ filter=dict(portal_type='Payment Condition'))
+ if payment_condition_list:
+ return payment_condition_list
+
+ movement = movement.getParentValue().getParentValue()
+ if movement.getPortalType() != 'Simulation Movement':
+ LOG('ERP5', INFO, "PaymentRule couldn't find payment condition")
+ return []
+
+ def _createMovementsForPaymentCondition(self,
+ applied_rule, payment_condition):
+ """Create simulation movements for this payment condition.
+ """
+ simulation_movement = applied_rule.getParentValue()
+ date = payment_condition.TradeCondition_getDueDate()
+
+ if payment_condition.getQuantity():
+ quantity = payment_condition.getQuantity()
+ else:
+ ratio = payment_condition.getEfficiency(1)
+ quantity = simulation_movement.getQuantity() * ratio
+
+ edit_dict = dict(
+ causality_value=payment_condition,
+ payment_mode=payment_condition.getPaymentMode(),
+ source=simulation_movement.getSource(),
+ source_section=simulation_movement.getSourceSection(),
+ source_payment=payment_condition.getSourcePayment() or
+ simulation_movement.getSourcePayment(),
+ destination=simulation_movement.getDestination(),
+ destination_section=simulation_movement.getDestinationSection(),
+ destination_payment=payment_condition.getDestinationPayment() or
+ simulation_movement.getDestinationPayment(),
+ resource=simulation_movement.getResource(),
+ start_date=date,
+ price=1,
+ quantity= - quantity,)
+
+ applied_rule.newContent( **edit_dict )
+
+ edit_dict['source'] = self.getSourcePayment()
+ edit_dict['destination'] = self.getDestinationPayment()
+ edit_dict['quantity'] = - edit_dict['quantity']
+ applied_rule.newContent( **edit_dict )
+
+
security.declareProtected(Permissions.ModifyPortalContent, 'expand')
def expand(self, applied_rule, **kw):
- """
- Expands the current movement downward.
-
- -> new status -> expanded
-
- An applied rule can be expanded only if its parent movement
- is expanded.
+ """Expands the current movement downward.
"""
payment_line_type = 'Simulation Movement'
my_parent_movement = applied_rule.getParentValue()
+ # generate for source
+ bank_account = self.getDestinationPaymentValue(
+ portal_type='Account')
+ assert bank_account is not None
- if my_parent_movement.getQuantity() is not None:
- bank_id = 'bank'
- if bank_id in applied_rule.objectIds():
- bank_movement = applied_rule[bank_id]
+ for payment_condition in self._getPaymentConditionList(
+ my_parent_movement):
+ payment_condition_url = payment_condition.getRelativeUrl()
+ # look for a movement for this payment condition:
+ corresponding_movement_list = []
+ for simulation_movement in applied_rule.contentValues():
+ if simulation_movement.getCausality() == payment_condition_url:
+ corresponding_movement_list.append(simulation_movement)
+ if not corresponding_movement_list:
+ self._createMovementsForPaymentCondition(applied_rule,
+ payment_condition)
else:
- bank_movement = applied_rule.newContent(
- portal_type=payment_line_type,
- id = bank_id)
- receivable_id = 'receivable'
- if receivable_id in applied_rule.objectIds():
- receivable_movement = applied_rule[receivable_id]
- else:
- receivable_movement = applied_rule.newContent(
- portal_type=payment_line_type,
- id = receivable_id)
-
- # TODO: specify this using a rule in portal_rules
- # TODO: generate many movement according to different trade conditions
- bank_movement.edit(
- resource = my_parent_movement.getResource(),
- quantity = my_parent_movement.getQuantity(),
- source = 'account/banques_etablissements_financiers', # XXX Not Generic
- destination = 'account/banques_etablissements_financiers', # XXX Not Generic
- source_section = my_parent_movement.getSourceSection(),
- destination_section = my_parent_movement.getDestinationSection(),
- )
- receivable_movement.edit(
- resource = my_parent_movement.getResource(),
- quantity = - my_parent_movement.getQuantity(),
- source = 'account/creance_client', # XXX Not Generic
- destination = 'account/dette_fournisseur', # XXX Not Generic
- source_section = my_parent_movement.getSourceSection(),
- destination_section = my_parent_movement.getDestinationSection(),
- )
-
- Rule.expand(self, applied_rule, **kw)
+ # TODO: update corresponding_movement_list
+ pass
+
+ #Rule.expand(self, applied_rule, **kw)
+ def test(self, context, tested_base_category_list=None):
+ """Test if this rule apply.
+ """
+ if context.getParentValue()\
+ .getSpecialiseValue().getPortalType() == 'Payment Rule':
+ return False
- def isDeliverable(self, m):
- if m.getSimulationState() in self.getPortalDraftOrderStateList():
- return 0
- return 1
+ for account in ( context.getSourceValue(portal_type='Account'),
+ context.getDestinationValue(portal_type='Account')):
+ if account is not None:
+ account_type = account.getAccountType()
+ if account_type in self.receivable_account_type_list or \
+ account_type in self.payable_account_type_list:
+ return True
+
+ return False
+
More information about the Erp5-report
mailing list