diff --git a/product/ERP5/Document/InvoiceTransactionRule.py b/product/ERP5/Document/InvoiceTransactionRule.py index 37493febdb96c7bac8cf788898c3683c59b0a352..1b01a0412580b5f55a08763493421ddacd88ce27 100755 --- a/product/ERP5/Document/InvoiceTransactionRule.py +++ b/product/ERP5/Document/InvoiceTransactionRule.py @@ -66,9 +66,8 @@ class InvoiceTransactionRule(Rule, XMLMatrix): Browse all cells and test them until match found """ for cell in self.getCellValueList(base_id = 'movement'): - LOG('?? Trying Cell', BLATHER, cell.getRelativeUrl()) if cell.test(movement): - LOG('Found Cell', BLATHER, cell.getRelativeUrl()) # XXX level + LOG('Found Cell', BLATHER, cell.getRelativeUrl()) return cell return None @@ -76,12 +75,14 @@ class InvoiceTransactionRule(Rule, XMLMatrix): """ Tests if the rule (still) applies """ - # An invoice transaction rule applies when the movement's parent is an invoice rule + # An invoice transaction rule applies when the movement's + # parent is an invoice rule parent = movement.getParentValue() parent_rule_value = parent.getSpecialiseValue() if parent_rule_value is None: return 0 - if parent_rule_value.getPortalType() in ('Invoicing Rule', 'Invoice Rule'): + if parent_rule_value.getPortalType() in ( + 'Invoicing Rule', 'Invoice Rule'): if self._getMatchingCell(movement) is not None: return 1 return 0 @@ -128,23 +129,35 @@ class InvoiceTransactionRule(Rule, XMLMatrix): # get the resource (in that order): # resource from the invoice (using deliveryValue) # price_currency from the invoice - # price_currency from the [parent]+ simulation movement's deliveryValue + # price_currency from the parents simulation movement's deliveryValue # price_currency from the top level simulation movement's orderValue - # FIXME: this must be discussed. for now we get the resource - # from the cell - #invoice_line = my_invoice_line_simulation.getDeliveryValue() - #invoice = invoice_line.getExplanationValue() - #resource = None - #if invoice.getResource() is not None : - # resource = invoice.getResource() - #elif hasattr(invoice, 'getPriceCurrency') and \ - # invoice.getPriceCurrency() is not None : - # resource = invoice.getPriceCurrency() - - # still TODO: search resource on parents (Order, Packing List ...) - #if resource is None : - # LOG("InvoiceTransactionRule", PROBLEM, - # "Unable to expand %s: no resource"%applied_rule.getPath()) + resource = None + invoice_line = my_invoice_line_simulation.getDeliveryValue() + if invoice_line is not None : + invoice = invoice_line.getExplanationValue() + if invoice.getResource() is not None : + resource = invoice.getResource() + elif hasattr(invoice, 'getPriceCurrency') and \ + invoice.getPriceCurrency() is not None : + resource = invoice.getPriceCurrency() + else: + # search the resource on parents simulation movement's deliveries + simulation_movement = applied_rule.getParent() + portal_simulation = self.getPortal().portal_simulation + while resource is None and simulation_movement != portal_simulation : + delivery = simulation_movement.getDeliveryValue() + if hasattr(delivery, 'getPriceCurrency') and \ + delivery.getPriceCurrency() is not None : + resource = delivery.getPriceCurrency() + if simulation_movement.getParent().getParent() \ + == portal_simulation : + # we are on the first simulation movement, + # we'll try to get the resource from it's order. + order = simulation_movement.getOrderValue() + if hasattr(order, 'getPriceCurrency') and \ + order.getPriceCurrency() is not None : + resource = order.getPriceCurrency() + simulation_movement = simulation_movement.getParent().getParent() # Add every movement from the Matrix to the Simulation for transaction_line in my_cell.objectValues() : @@ -152,15 +165,18 @@ class InvoiceTransactionRule(Rule, XMLMatrix): simulation_movement = applied_rule[transaction_line.getId()] else : simulation_movement = applied_rule.newContent( - portal_type=invoice_transaction_line_type) - - resource = transaction_line.getResource() or my_cell.getResource() - if resource in (None, '') : - LOG("InvoiceTransactionRule", PROBLEM, - "Unable to expand %s: no resource"%applied_rule.getPath()) - raise ValueError, 'no resource for %s' % \ + id = transaction_line.getId() + , portal_type=invoice_transaction_line_type) + + if resource is None : + # last resort : get the resource from the rule + resource = transaction_line.getResource() or my_cell.getResource() + if resource in (None, '') : + LOG("InvoiceTransactionRule", PROBLEM, + "Unable to expand %s: no resource"%applied_rule.getPath()) + raise ValueError, 'no resource for %s' % \ transaction_line.getPath() - simulation_movement._edit( + simulation_movement.edit( source = transaction_line.getSource() , destination = transaction_line.getDestination() , source_section = my_invoice_line_simulation.getSourceSection() @@ -175,14 +191,10 @@ class InvoiceTransactionRule(Rule, XMLMatrix): , stop_date = my_invoice_line_simulation.getStopDate() , force_update = 1 ) - - # Now we can set the last expand simulation state to the current state - #XXX Note : this is wrong, as there isn't always a sale invoice when we expand this rule. - #applied_rule.setLastExpandSimulationState(my_invoice.getSimulationState()) # Pass to base class Rule.expand(self, applied_rule, force=force, **kw) - + security.declareProtected(Permissions.ModifyPortalContent, 'solve') def solve(self, applied_rule, solution_list): """