Commit 8e9bd755 authored by Arnaud Fontaine's avatar Arnaud Fontaine

ZODB Components: erp5_trade: Migrate TestOrder{Mixin} and all Unit Tests...

ZODB Components: erp5_trade: Migrate TestOrder{Mixin} and all Unit Tests inheriting from these classes.

Also, Split testInvoice to a Module Component in erp5_invoicing for Mixins used
by several other tests and Test Component in erp5_simplified_invoicing (initially
everything was migrated to erp5_invoicing but this does not work as Alarm_buildInvoice
is different in simplified and advanced invoicing).
parent db5d183b
......@@ -36,8 +36,8 @@ from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase
from AccessControl.SecurityManagement import newSecurityManager
from DateTime import DateTime
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testInvoice import TestSaleInvoiceMixin
from Products.ERP5.tests.utils import newSimulationExpectedFailure
from erp5.component.module.TestInvoiceMixin import TestSaleInvoiceMixin
class TestAdvancedInvoice(TestSaleInvoiceMixin, ERP5TypeTestCase):
"""Test methods for sale and purchase invoice.
......@@ -149,7 +149,7 @@ class TestAdvancedInvoice(TestSaleInvoiceMixin, ERP5TypeTestCase):
invoice.start()
self.assertEqual('started', invoice.getSimulationState())
def stepAddInvoiceTransactionLines(self, sequence=None, sequence_list=[]):
def stepAddInvoiceTransactionLines(self, sequence=None, sequence_list=None):
"""
add some invoice and accounting lines to the invoice
"""
......@@ -164,7 +164,7 @@ class TestAdvancedInvoice(TestSaleInvoiceMixin, ERP5TypeTestCase):
id='income', source='account_module/sale',
destination='account_module/purchase', quantity=1665)
def stepAddInvoiceLinesManyTransactions(self, sequence=None, sequence_list=[]):
def stepAddInvoiceLinesManyTransactions(self, sequence=None, sequence_list=None):
"""
add some invoice and accounting lines to the invoice
"""
......@@ -384,7 +384,7 @@ class TestAdvancedInvoice(TestSaleInvoiceMixin, ERP5TypeTestCase):
source_section_value=vendor,
destination_value=client,
destination_section_value=client)
line = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource,
quantity=10,
price=3)
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</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>testAdvancedInvoicing</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testAdvancedInvoicing</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testAdvancedInvoicing</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</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>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>component_validation_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
test.erp5.testAdvancedInvoicing
\ No newline at end of file
erp5_full_text_mroonga_catalog
erp5_core_proxy_field_legacy
erp5_base
erp5_simulation
erp5_apparel
erp5_project
erp5_simulation_test
erp5_configurator_standard_solver
erp5_configurator_standard_accounting_template
erp5_configurator_standard_invoicing_template
erp5_configurator_standard_trade_template
\ No newline at end of file
......@@ -30,7 +30,7 @@
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from zLOG import LOG
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testOrder import TestOrderMixin
from erp5.component.test.testOrder import TestOrderMixin
class TestApparelTransformation(TestOrderMixin, ERP5TypeTestCase):
"""
......
......@@ -32,7 +32,7 @@ import unittest
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from zLOG import LOG
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testOrder import TestOrderMixin
from erp5.component.test.testOrder import TestOrderMixin
from Products.ERP5.tests.utils import newSimulationExpectedFailure
class TestProductionOrderApparelMixin(TestOrderMixin):
......
##############################################################################
#
# Copyright (c) 2004-2008 Nexedi SA and Contributors. All Rights Reserved.
# Sebastien Robin <seb@nexedi.com>
# Jerome Perrin <jerome@nexedi.com>
#
# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
from Products.DCWorkflow.DCWorkflow import ValidationFailed
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
from Acquisition import aq_parent
from zLOG import LOG
from Products.ERP5Type.tests.Sequence import SequenceList
from erp5.component.test.testPackingList import TestPackingListMixin
class TestInvoiceMixin(TestPackingListMixin):
"""Test methods for invoices
"""
default_region = "europe/west/france"
vat_gap = 'fr/pcg/4/44/445/4457/44571'
vat_rate = 0.196
sale_gap = 'fr/pcg/7/70/707/7071/70712'
customer_gap = 'fr/pcg/4/41/411'
bank_gap = 'fr/pcg/5/51/512'
mail_delivery_mode = 'by_mail'
cpt_incoterm = 'cpt'
unit_piece_quantity_unit = 'unit/piece'
mass_quantity_unit = 'mass/kg'
oldMailhost = None
# (account_id, account_gap, account_type)
account_definition_list = (
('receivable_vat', vat_gap, 'liability/payable/collected_vat',),
('sale', sale_gap, 'income'),
('customer', customer_gap, 'asset/receivable'),
('refundable_vat', vat_gap, 'asset/receivable/refundable_vat'),
('purchase', sale_gap, 'expense'),
('supplier', customer_gap, 'liability/payable'),
('bank', bank_gap, 'asset/cash/bank'),
)
# (line_id, source_account_id, destination_account_id, line_quantity)
transaction_line_definition_list = (
('income', 'sale', 'purchase', 1.0),
('receivable', 'customer', 'supplier', -1.0 - vat_rate),
('collected_vat', 'receivable_vat', 'refundable_vat', vat_rate),
)
def getTitle(self):
return "Invoices"
def getBusinessTemplateList(self):
return super(TestInvoiceMixin, self).getBusinessTemplateList() + (
'erp5_accounting', 'erp5_invoicing', 'erp5_simplified_invoicing',
'erp5_configurator_standard_accounting_template',
'erp5_configurator_standard_invoicing_template')
@UnrestrictedMethod
def createCategories(self):
"""Create the categories for our test. """
# pull in the TestOrderMixin categories first
super(TestInvoiceMixin, self).createCategories()
for cat_string in self.getNeededCategoryList() :
base_cat = cat_string.split("/")[0]
path = self.getPortal().portal_categories[base_cat]
for cat in cat_string.split("/")[1:] :
if not cat in path.objectIds() :
path = path.newContent(
portal_type='Category',
id=cat,)
else:
path = path[cat]
# check categories have been created
for cat_string in self.getNeededCategoryList() :
self.assertNotEquals(None,
self.getCategoryTool().restrictedTraverse(cat_string),
cat_string)
def getNeededCategoryList(self):
"""return a list of categories that should be created."""
return ('region/%s' % self.default_region,
'gap/%s' % self.vat_gap,
'gap/%s' % self.sale_gap,
'gap/%s' % self.customer_gap,
'gap/%s' % self.bank_gap,
'delivery_mode/%s' % self.mail_delivery_mode,
'incoterm/%s' % self.cpt_incoterm,
'quantity_unit/%s' % self.unit_piece_quantity_unit,
'quantity_unit/%s' % self.mass_quantity_unit,
'base_amount/tax1',
'base_amount/tax2',
'base_amount/tax3',
'use/trade/tax',
)
def afterSetUp(self):
self.createUser('test_user',
['Assignee', 'Assignor', 'Member',
'Associate', 'Auditor', 'Author'])
self.createUser('manager', ['Manager'])
self.loginByUserName('manager')
self.createCategories()
self.validateRules()
self.createBusinessProcess()
self.loginByUserName('test_user')
def beforeTearDown(self):
self.abort()
self.loginByUserName('manager')
super(TestInvoiceMixin, self).beforeTearDown()
for folder in (self.portal.accounting_module,
self.portal.organisation_module,
self.portal.sale_order_module,
self.portal.purchase_order_module,
self.portal.sale_packing_list_module,
self.portal.purchase_packing_list_module,
self.portal.portal_simulation,):
folder.manage_delObjects([x for x in folder.objectIds() if x not in ('organisation_1','organisation_2','ppl_1','ppl_2')])
self.tic()
def stepCreateSaleInvoiceTransactionRule(self, sequence, **kw) :
pass # see createBusinessProcess
## XXX move this to "Sequence class"
def playSequence(self, sequence_string, quiet=0) :
sequence_list = SequenceList()
sequence_list.addSequenceString(sequence_string)
sequence_list.play(self, quiet=quiet)
def createBusinessProcess(self):
portal = self.portal
business_process_id = self.__class__.__name__
try:
business_process = portal.business_process_module[business_process_id]
except KeyError:
business_process = portal.business_process_module.newContent(
business_process_id, 'Business Process',
specialise=self.__class__.business_process)
kw = dict(portal_type='Trade Model Path',
trade_phase='default/accounting',
trade_date='trade_phase/default/invoicing',
membership_criterion_base_category_list=('destination_region',
'product_line'),
membership_criterion_category=(
'destination_region/region/' + self.default_region,
'product_line/apparel'))
account_module = portal.account_module
for account_id, account_gap, account_type in self.account_definition_list:
if not account_module.has_key(account_id):
account = account_module.newContent(account_id, gap=account_gap,
account_type=account_type)
account.validate()
for line_id, line_source_id, line_destination_id, line_ratio in \
self.transaction_line_definition_list:
trade_model_path = business_process.newContent(
reference='accounting_' + line_id,
efficiency=line_ratio,
source_value=account_module[line_source_id],
destination_value=account_module[line_destination_id],
**kw)
# A trade model path already exist for root simulation movements
# (Accounting Transaction Root Simulation Rule).
# The ones we are creating are for Invoice Transaction Simulation Rule.
trade_model_path._setCriterionPropertyList(('portal_type',))
trade_model_path.setCriterion('portal_type', 'Simulation Movement')
self.business_process = business_process.getRelativeUrl()
def stepCreateEntities(self, sequence, **kw) :
"""Create a vendor and two clients. """
self.stepCreateOrganisation1(sequence, **kw)
self.stepCreateOrganisation2(sequence, **kw)
self.stepCreateOrganisation3(sequence, **kw)
self.stepCreateProject1(sequence, **kw)
self.stepCreateProject2(sequence, **kw)
vendor = sequence.get('organisation1')
vendor.setRegion(self.default_region)
vendor.validate()
sequence.edit(vendor=vendor)
client1 = sequence.get('organisation2')
client1.setRegion(self.default_region)
self.assertNotEquals(client1.getRegionValue(), None)
client1.validate()
sequence.edit(client1=client1)
client2 = sequence.get('organisation3')
self.assertEqual(client2.getRegionValue(), None)
client2.validate()
sequence.edit(client2=client2)
def stepCheckOrderRule(self, sequence=None, sequence_list=None, **kw):
"""Check we have a related Order Rule"""
order = sequence.get('order')
simulation_tool = self.getSimulationTool()
# Check that there is an applied rule for our packing list
rule_list = [x for x in simulation_tool.objectValues()
if x.getCausalityValue()==order]
self.assertNotEquals(len(rule_list), 0)
sequence.edit(order_rule_list = rule_list)
self.assertEqual(len(order.getMovementList()),
sum([len(rule.objectIds()) for rule in rule_list]))
def stepCheckInvoicingRule(self, sequence=None, sequence_list=None, **kw):
"""
Checks that the invoicing rule is applied and its values are correct.
"""
order_rule_list = sequence.get('order_rule_list')
invoicing_rule_list = []
invoice_transaction_rule_list = []
for order_rule in order_rule_list :
for order_simulation_movement in order_rule.objectValues() :
temp_invoicing_rule_list = [ar for ar in order_simulation_movement.objectValues()[0].objectValues()[0].objectValues()
if ar.getSpecialiseValue().getPortalType() == 'Invoice Simulation Rule']
self.assertEqual(len(temp_invoicing_rule_list), 1)
invoicing_rule_list.extend(temp_invoicing_rule_list)
sequence.edit(invoicing_rule_list=invoicing_rule_list)
invoicing_rule = invoicing_rule_list[0]
sequence.edit(invoicing_rule = invoicing_rule)
for invoicing_rule in invoicing_rule_list:
self.assertEqual(invoicing_rule.getSpecialiseReference(),
'default_invoicing_rule')
self.assertEqual(invoicing_rule.getPortalType(),
'Applied Rule')
simulation_movement_list = invoicing_rule.objectValues()
self.assertNotEquals(len(simulation_movement_list), 0)
for simulation_movement in simulation_movement_list :
invoice_transaction_rule_list.extend([applied_rule for applied_rule
in simulation_movement.objectValues() if applied_rule \
.getSpecialiseValue().getPortalType()
== 'Invoice Transaction Simulation Rule'])
resource_list = sequence.get('resource_list')
self.assertEqual(simulation_movement.getPortalType(),
'Simulation Movement')
self.assertTrue(simulation_movement.getResourceValue() in
resource_list)
self.assertTrue(simulation_movement.isConvergent())
# TODO: What is the invoice dates supposed to be ?
# is this done through profiles ?
#self.assertEqual(simulation_movement.getStartDate(),
# sequence.get('order').getStartDate())
#self.assertEqual(simulation_movement.getStopDate(),
# sequence.get('order').getStopDate())
sequence.edit(invoice_transaction_rule_list=invoice_transaction_rule_list)
def stepCheckInvoiceTransactionRule(self, sequence=None, sequence_list=None,
**kw):
"""
Checks that the applied invoice_transaction_rule is expanded and its movements are
consistent with its parent movement
"""
invoice_transaction_rule_list = \
sequence.get('invoice_transaction_rule_list')
for applied_invoice_transaction_rule in invoice_transaction_rule_list:
parent_movement = aq_parent(applied_invoice_transaction_rule)
self.assertEqual(3, len(applied_invoice_transaction_rule.objectValues()))
for _, line_source_id, line_destination_id, line_ratio in \
self.transaction_line_definition_list:
movement = None
for simulation_movement in \
applied_invoice_transaction_rule.objectValues():
if simulation_movement.getSourceId() == line_source_id and\
simulation_movement.getDestinationId() == line_destination_id:
movement = simulation_movement
break
self.assertTrue(movement is not None)
self.assertEqual(movement.getCorrectedQuantity(), parent_movement.getPrice() *
parent_movement.getCorrectedQuantity() * line_ratio)
self.assertEqual(movement.getStartDate(),
parent_movement.getStartDate())
self.assertEqual(movement.getStopDate(),
parent_movement.getStopDate())
def modifyPackingListState(self, transition_name,
sequence,packing_list=None):
""" calls the workflow for the packing list """
if packing_list is None:
packing_list = sequence.get('packing_list')
packing_list.portal_workflow.doActionFor(packing_list, transition_name)
def stepSetReadyPackingList(self, sequence=None, sequence_list=None, **kw):
""" set the Packing List as Ready. This must build the invoice. """
self.modifyPackingListState('set_ready_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'ready')
def stepSetReadyNewPackingList(self, sequence=None,
sequence_list=None, **kw):
""" set the Packing List as Ready. This must build the invoice. """
packing_list = sequence.get('new_packing_list')
self.modifyPackingListState('set_ready_action', sequence=sequence,
packing_list=packing_list)
self.assertEqual(packing_list.getSimulationState(), 'ready')
def stepStartPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('start_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'started')
def stepStartNewPackingList(self, sequence=None, sequence_list=None, **kw):
packing_list = sequence.get('new_packing_list')
self.modifyPackingListState('start_action', sequence=sequence,
packing_list=packing_list)
self.assertEqual(packing_list.getSimulationState(), 'started')
def stepStopPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('stop_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'stopped')
def stepDeliverPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('deliver_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'delivered')
def stepCancelPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('cancel_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'cancelled')
def modifyInvoiceState(self, transition_name,
sequence,invoice=None):
""" calls the workflow for the invoice """
if invoice is None:
invoice = sequence.get('invoice')
invoice.portal_workflow.doActionFor(invoice, transition_name)
def stepStartInvoice(self, sequence=None, sequence_list=None, **kw):
self.modifyInvoiceState('start_action', sequence=sequence)
invoice = sequence.get('invoice')
self.assertEqual(invoice.getSimulationState(), 'started')
def stepStartNewInvoice(self, sequence=None, sequence_list=None, **kw):
invoice = sequence.get('new_invoice')
self.modifyInvoiceState('start_action', sequence=sequence,
invoice=invoice)
self.assertEqual(invoice.getSimulationState(), 'started')
def stepStopInvoice(self, sequence=None, sequence_list=None, **kw):
self.modifyInvoiceState('stop_action', sequence=sequence)
invoice = sequence.get('invoice')
self.assertEqual(invoice.getSimulationState(), 'stopped')
def stepDeliverInvoice(self, sequence=None, sequence_list=None, **kw):
self.modifyInvoiceState('deliver_action', sequence=sequence)
invoice = sequence.get('invoice')
self.assertEqual(invoice.getSimulationState(), 'delivered')
def stepCancelInvoice(self, sequence=None, sequence_list=None, **kw):
self.modifyInvoiceState('cancel_action', sequence=sequence)
invoice = sequence.get('invoice')
self.assertEqual(invoice.getSimulationState(), 'cancelled')
def stepSwitchPackingLists(self, sequence=None, sequence_list=None, **kw):
packing_list = sequence.get('packing_list')
new_packing_list = sequence.get('new_packing_list')
#invoice = new_packing_list.getDefaultCausalityRelatedValue(
#portal_type=self.invoice_portal_type)
sequence.edit(packing_list=new_packing_list,
new_packing_list=packing_list)#, invoice=invoice)
def stepSwitchInvoices(self, sequence=None, sequence_list=None, **kw):
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
sequence.edit(invoice=new_invoice, new_invoice=invoice)
def stepCheckPackingListSimulation(self, sequence=None, sequence_list=None, **kw):
""" checks that simulation movements related to the packing list are OK """
packing_list = sequence.get('packing_list')
order = sequence.get('order')
order_root_applied_rule = order.getCausalityRelatedValueList(
portal_type = 'Applied Rule')[0]
# check simulation movements from this packing list
for movement in packing_list.getMovementList() :
simulation_movement_list = movement.getOrderRelatedValueList()
self.assertNotEquals(len(simulation_movement_list), 0)
total_quantity = 0
for simulation_movement in simulation_movement_list :
total_quantity += simulation_movement.getQuantity()
# check that those movements come from the same root applied
# rule than the order.
self.assertEqual( simulation_movement.getRootAppliedRule(),
order_root_applied_rule)
self.assertEqual(total_quantity, movement.getQuantity())
def checkMirrorAcquisition(self, obj, acquired_object):
"""
Check if properties are well acquired for mirrored case
"""
# packing_list_movement, simulation_movement
self.assertEqual(acquired_object.getStartDate(), obj.getStopDate())
self.assertEqual(acquired_object.getStopDate(), obj.getStartDate())
self.assertEqual(acquired_object.getSourceValue(), \
obj.getDestinationValue())
self.assertEqual(acquired_object.getDestinationValue(), \
obj.getSourceValue())
self.assertEqual(acquired_object.getSourceSectionValue(), \
obj.getDestinationSectionValue())
self.assertEqual(acquired_object.getDestinationSectionValue(), \
obj.getSourceSectionValue())
def stepCheckInvoiceBuilding(self, sequence=None, sequence_list=None, **kw):
"""
checks that the invoice is built with the default_invoice_builder
"""
packing_list = sequence.get('packing_list')
related_invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
if packing_list.getPortalType() == 'Purchase Packing List':
packing_list_building_state = 'stopped'
else:
packing_list_building_state = 'started'
packing_list_state = packing_list.getSimulationState()
if packing_list_state != packing_list_building_state :
self.assertEqual(0, len(related_invoice_list))
else:
self.assertEqual(1, len(related_invoice_list))
invoice = related_invoice_list[0].getObject()
self.assertTrue(invoice is not None)
# Invoices created by Delivery Builder are in confirmed state
self.assertEqual(invoice.getSimulationState(), 'confirmed')
# Get the list of simulation movements of packing list ...
packing_list_simulation_movement_list = []
for packing_list_movement in packing_list.getMovementList():
packing_list_simulation_movement_list.extend(
packing_list_movement.getDeliveryRelatedValueList())
# ... invoice simulation movement are their childrens.
simulation_movement_list = []
for p_l_simulation_movement in packing_list_simulation_movement_list :
for applied_rule in p_l_simulation_movement.objectValues() :
simulation_movement_list.extend(applied_rule.objectValues())
# First, test if each Simulation Movement is related to an
# Invoice Movement
invoice_relative_url = invoice.getRelativeUrl()
for simulation_movement in simulation_movement_list:
invoice_movement_list = simulation_movement.getDeliveryValueList()
self.assertEqual(len(invoice_movement_list), 1)
invoice_movement = invoice_movement_list[0]
self.assertTrue(invoice_movement is not None)
self.assert_(invoice_movement.getRelativeUrl().\
startswith(invoice_relative_url))
# Then, test if each Invoice movement is equals to the sum of somes
# Simulation Movements
for invoice_movement in invoice.getMovementList(portal_type = [
self.invoice_cell_portal_type,
self.invoice_line_portal_type]) :
related_simulation_movement_list = invoice_movement.\
getDeliveryRelatedValueList(portal_type='Simulation Movement')
quantity = 0
total_price = 0
invoice_movement_quantity = invoice_movement.getQuantity()
for related_simulation_movement in related_simulation_movement_list:
quantity += related_simulation_movement.getQuantity()
total_price += related_simulation_movement.getPrice() *\
related_simulation_movement.getQuantity()
# Test resource
self.assertEqual(invoice_movement.getResource(), \
related_simulation_movement.getResource())
# Test resource variation
self.assertEqual(invoice_movement.getVariationText(), \
related_simulation_movement.getVariationText())
self.assertEqual(invoice_movement.getVariationCategoryList(), \
related_simulation_movement.getVariationCategoryList())
# Test acquisition
self.checkAcquisition(invoice_movement,
related_simulation_movement)
# Test delivery ratio
self.assertEqual(related_simulation_movement.getQuantity() /\
invoice_movement_quantity, \
related_simulation_movement.getDeliveryRatio())
self.assertEqual(quantity, invoice_movement.getQuantity())
# Test price
self.assertEqual(total_price / quantity, invoice_movement.getPrice())
sequence.edit(invoice = invoice)
# Test causality
self.assertEqual(len(invoice.getCausalityValueList(
portal_type = self.packing_list_portal_type)), 1)
self.assertEqual(invoice.getCausalityValue(), packing_list)
# Finally, test getTotalQuantity and getTotalPrice on Invoice
self.assertEqual(packing_list.getTotalQuantity(),
invoice.getTotalQuantity())
self.assertEqual(packing_list.getTotalPrice(),
invoice.getTotalPrice())
def stepCheckInvoicesConsistency(self, sequence=None, sequence_list=None,
**kw):
"""
Checks that all invoices are consistent:
- transaction lines match invoice lines
- no movement is divergent
"""
invoice_list = self.getPortal()['accounting_module'].objectValues()
for invoice in invoice_list:
accounting_state_list = \
list(self.getPortal().getPortalCurrentInventoryStateList())
accounting_state_list.append('cancelled')
if invoice.getSimulationState() in accounting_state_list:
invoice_line_list = invoice.contentValues(
portal_type=self.invoice_line_portal_type)
invoice_transaction_line_list = invoice.contentValues(
portal_type=self.invoice_transaction_line_portal_type)
self.assertEqual(3, len(invoice_transaction_line_list))
expected_price = 0.0
for line in invoice_line_list:
expected_price += line.getTotalPrice()
for line_id, line_source, line_dest, line_ratio in \
self.transaction_line_definition_list:
for line in invoice.contentValues(
portal_type=self.invoice_transaction_line_portal_type):
if line.getSource() == 'account_module/%s' % line_source and \
line.getDestination() == 'account_module/%s' % line_dest:
break
else:
self.fail('No line found that matches %s' % line_id)
resource_precision = line.getResourceValue().getQuantityPrecision()
self.assertEqual(round(line.getQuantity(), resource_precision),
round(expected_price * line_ratio, resource_precision))
def stepCheckInvoiceLineHasReferenceAndIntIndex(self, sequence=None, **kw):
"""Check that the unique invoice line in the invoice has reference and int
index.
"""
invoice = sequence.get('invoice')
invoice_line_list = invoice.contentValues(
portal_type=self.invoice_line_portal_type)
self.assertEqual(1, len(invoice_line_list))
invoice_line = invoice_line_list[0]
self.assertEqual(1, invoice_line.getIntIndex())
self.assertEqual('1', invoice_line.getReference())
def stepCheckPackingListInvoice(
self, sequence=None, sequence_list=None, **kw):
""" Checks if the delivery builder is working as expected,
coping the atributes from packing list to invoice."""
packing_list = sequence.get('packing_list')
related_invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
self.assertEqual(len(related_invoice_list), 1)
invoice = related_invoice_list[0]
self.assertEqual(packing_list.getSource(), invoice.getSource())
self.assertEqual(packing_list.getDestination(), invoice.getDestination())
self.assertEqual(packing_list.getDestinationSection(), \
invoice.getDestinationSection())
self.assertEqual(packing_list.getSourceSection(), \
invoice.getSourceSection())
self.assertEqual(packing_list.getDestinationDecision(), \
invoice.getDestinationDecision())
self.assertEqual(packing_list.getSourceDecision(), \
invoice.getSourceDecision())
self.assertEqual(packing_list.getDestinationAdministration(), \
invoice.getDestinationAdministration())
self.assertEqual(packing_list.getSourceAdministration(), \
invoice.getSourceAdministration())
self.assertEqual(packing_list.getDestinationProject(), \
invoice.getDestinationProject())
self.assertEqual(packing_list.getSourceProject(), \
invoice.getSourceProject())
self.assertEqual(packing_list.getPriceCurrency(), \
invoice.getPriceCurrency())
def stepCheckDeliveryRuleForDeferred(
self, sequence=None, sequence_list=None, **kw):
""" Checks that a delivery rule has been created when we took 'split
and defer' decision on the divergeant Packing List. """
# TODO
def stepCheckDeliveryRuleIsEmpty(
self, sequence=None, sequence_list=None, **kw):
""" Checks that an empty delivery rule is created for the
convergeant Packing List"""
packing_list = sequence.get('packing_list')
self.assertTrue(packing_list is not None)
simulation_tool = self.getSimulationTool()
# Check that there is an applied rule for our packing list
rule_list = [x for x in simulation_tool.objectValues()
if x.getCausalityValue()==packing_list]
self.assertEqual(len(rule_list),1)
packing_list_rule = rule_list[0]
sequence.edit(packing_list_rule=packing_list_rule)
rule_line_list = packing_list_rule.objectValues()
packing_list_line_list = packing_list.objectValues()
self.assertEqual(len(packing_list_line_list),
len(rule_line_list))
self.assertEqual(1, len(rule_line_list))
rule_line = rule_line_list[0]
packing_list_line = packing_list_line_list[0]
self.assertEqual(rule_line.getQuantity(), 10)
self.assertEqual(rule_line.getPrice(), 100)
self.assertEqual(rule_line.getDeliveryValue(),
packing_list_line)
self.assertEqual(rule_line.getStartDate(),
packing_list_line.getStartDate())
self.assertEqual(rule_line.getStopDate(),
packing_list_line.getStopDate())
self.assertEqual(rule_line.getPortalType(),
'Simulation Movement')
def stepCheckPackingList(self,sequence=None, sequence_list=None,**kw):
""" """
packing_list_module = self.getSalePackingListModule()
order = sequence.get('order')
sale_packing_list_list = []
for o in packing_list_module.objectValues():
if o.getCausalityValue() == order:
sale_packing_list_list.append(o)
self.assertEqual(len(sale_packing_list_list), 1)
sale_packing_list = sale_packing_list_list[0]
sale_packing_list_line_list = sale_packing_list.objectValues()
self.assertEqual(len(sale_packing_list_line_list),1)
sale_packing_list_line = sale_packing_list_line_list[0]
product = sequence.get('resource')
self.assertEqual(sale_packing_list_line.getResourceValue(),
product)
self.assertEqual(sale_packing_list_line.getPrice(),
self.price1)
LOG('sale_packing_list_line.showDict()',0,
sale_packing_list_line.showDict())
self.assertEqual(sale_packing_list_line.getQuantity(),
self.quantity1)
self.assertEqual(sale_packing_list_line.getTotalPrice(),
self.total_price1)
sequence.edit(packing_list = sale_packing_list)
def stepCheckTwoInvoices(self,sequence=None, sequence_list=None, **kw):
""" checks invoice properties are well set. """
# Now we will check that we have two invoices created
for x in '', 'new_':
packing_list = sequence.get(x + 'packing_list')
invoice, = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
self.assertEqual(invoice.getSimulationState(), 'confirmed')
sequence.set(x + 'invoice', invoice)
def stepStartTwoInvoices(self,sequence=None, sequence_list=None, **kw):
""" start both invoices. """
portal = self.getPortal()
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
portal.portal_workflow.doActionFor(invoice, 'start_action')
portal.portal_workflow.doActionFor(new_invoice, 'start_action')
def stepCheckTwoInvoicesTransactionLines(self,sequence=None,
sequence_list=None, **kw):
""" checks invoice properties are well set. """
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
self.assertEqual(3,len(invoice.objectValues(
portal_type=self.invoice_transaction_line_portal_type)))
self.assertEqual(3,len(new_invoice.objectValues(
portal_type=self.invoice_transaction_line_portal_type)))
found_dict = {}
for line in invoice.objectValues(
portal_type=self.invoice_transaction_line_portal_type):
source_id = line.getSourceId()
found_dict[source_id] = line.getQuantity()
total_price = (self.default_quantity-1) * self.default_price
expected_dict = {
'sale' : total_price,
'receivable_vat' : total_price * self.vat_rate,
'customer' : - (total_price + total_price * self.vat_rate)
}
self.failIfDifferentSet(expected_dict.keys(),found_dict.keys())
for key in found_dict.keys():
self.assertAlmostEquals(expected_dict[key],found_dict[key],places=2)
found_dict = {}
for line in new_invoice.objectValues(
portal_type=self.invoice_transaction_line_portal_type):
source_id = line.getSourceId()
found_dict[source_id] = line.getQuantity()
total_price = 1 * self.default_price
expected_dict = {
'sale' : total_price,
'receivable_vat' : total_price * self.vat_rate,
'customer' : - (total_price + total_price * self.vat_rate)
}
self.failIfDifferentSet(expected_dict.keys(), found_dict.keys())
for key in found_dict.keys():
self.assertAlmostEquals(expected_dict[key], found_dict[key], places=2)
def stepRebuildAndCheckNothingIsCreated(self, sequence=None,
sequence_list=None, **kw):
"""Rebuilds with sale_invoice_builder and checks nothing more is
created. """
accounting_module = self.portal.accounting_module
portal_type_list = ('Sale Invoice Transaction', 'Purchase Invoice Transaction')
sale_invoice_transaction_count = len(accounting_module.objectValues(
portal_type=portal_type_list))
for builder in self.getPortal().portal_deliveries.objectValues():
builder.build()
self.assertEqual(sale_invoice_transaction_count,
len(accounting_module.objectValues(
portal_type=portal_type_list)))
def stepModifyInvoicesDate(self, sequence=None,
sequence_list=None, **kw):
"""Change invoice date"""
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
invoice.edit(start_date=self.datetime,
stop_date=self.datetime+1)
new_invoice.edit(start_date=self.datetime,
stop_date=self.datetime+1)
def stepEditInvoice(self, sequence=None, sequence_list=None, **kw):
"""Edit the current invoice, to trigger updateSimulation."""
invoice = sequence.get('invoice')
invoice.edit(description='This invoice was edited!')
def stepCheckInvoiceRuleNotAppliedOnInvoiceEdit(self,
sequence=None, sequence_list=None, **kw):
"""If we call edit on the invoice, invoice rule should not be
applied on lines created by delivery builder."""
invoice = sequence.get('invoice')
self.assertEqual([], invoice.getCausalityRelatedValueList())
def stepEditPackingList(self, sequence=None, sequence_list=None, **kw):
"""Edit the current packing list, to trigger updateSimulation."""
packing_list = sequence.get('packing_list')
packing_list.edit(description='This packing list was edited!')
def stepAcceptDecisionDescriptionPackingList(self,sequence=None, sequence_list=None):
packing_list = sequence.get('packing_list')
self._solveDivergence(packing_list, 'description', 'Accept Solver')
def stepAssertCausalityStateIsNotSolvedInConsistencyMessage(self,
sequence=None, sequence_list=None, **kw):
packing_list = sequence.get('packing_list')
self.assertEqual(
['Causality State is not "Solved". Please wait or take action'
+ ' for causality state to reach "Solved".'],
[str(message.message) for message in packing_list.checkConsistency()])
def stepSetReadyWorkflowTransitionIsBlockByConsistency(self,
sequence=None, sequence_list=None, **kw):
packing_list = sequence.get('packing_list')
with self.assertRaisesRegexp(ValidationFailed,
'.*Causality State is not "Solved"*'):
self.getPortal().portal_workflow.doActionFor(
packing_list, 'set_ready_action')
def stepCheckDeliveryRuleNotAppliedOnPackingListEdit(self,
sequence=None, sequence_list=None, **kw):
"""If we call edit on the packing list, delivery rule should not be
applied on lines created by delivery builder."""
packing_list = sequence.get('packing_list')
self.assertEqual([], packing_list.getCausalityRelatedValueList())
def stepDecreaseInvoiceLineQuantity(self, sequence=None, sequence_list=None,
**kw):
"""
Set a decreased quantity on invoice lines
"""
invoice = sequence.get('invoice')
quantity = sequence.get('line_quantity',default=self.default_quantity)
quantity = quantity - 1
sequence.edit(line_quantity=quantity)
for invoice_line in invoice.objectValues(
portal_type=self.invoice_line_portal_type):
invoice_line.edit(quantity=quantity)
sequence.edit(last_delta = sequence.get('last_delta', 0.0) - 1.0)
def stepIncreaseInvoiceLineQuantity(self, sequence=None, sequence_list=None,
**kw):
"""
Set a Increased quantity on invoice lines
"""
invoice = sequence.get('invoice')
quantity = sequence.get('line_quantity',default=self.default_quantity)
quantity = quantity + 1
sequence.edit(line_quantity=quantity)
for invoice_line in invoice.objectValues(
portal_type=self.invoice_line_portal_type):
invoice_line.edit(quantity=quantity)
sequence.edit(last_delta = sequence.get('last_delta', 0.0) + 1.0)
def stepSetInvoiceLineQuantityToZero(self, sequence=None, sequence_list=None,
**kw):
"""
Set the quantity on invoice lines to zero
"""
invoice = sequence.get('invoice')
#default_quantity = sequence.get('line_quantity',default_quantity)
quantity = 0.0
sequence.edit(line_quantity=quantity)
for invoice_line in invoice.objectValues(
portal_type=self.invoice_line_portal_type):
invoice_line.edit(quantity=quantity)
sequence.edit(last_delta = - self.default_quantity)
def stepChangeInvoiceStartDate(self, sequence=None, sequence_list=None, **kw):
"""
Change the start_date of the invoice.
"""
invoice = sequence.get('invoice')
invoice.edit(start_date=self.datetime + 15)
def stepCheckInvoiceIsCalculating(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is calculating
"""
invoice = sequence.get('invoice')
self.assertEqual('calculating',invoice.getCausalityState())
def stepCheckInvoiceIsDiverged(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is diverged
"""
invoice = sequence.get('invoice')
self.assertEqual('diverged',invoice.getCausalityState())
def stepCheckInvoiceIsSolved(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is solved
"""
invoice = sequence.get('invoice')
self.assertEqual('solved', invoice.getCausalityState(),
invoice.getDivergenceList())
def stepCheckInvoiceIsDivergent(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is divergent
"""
invoice = sequence.get('invoice')
self.assertTrue(invoice.isDivergent())
def stepCheckInvoiceIsNotDivergent(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is not divergent
"""
invoice = sequence.get('invoice')
if invoice.isDivergent():
self.fail(invoice.getDivergenceList())
def stepSplitAndDeferInvoice(self, sequence=None, sequence_list=None,
**kw):
invoice = sequence.get('invoice')
solver_process = self.portal.portal_solver_processes.newSolverProcess(invoice)
quantity_solver_decision, = [x for x in solver_process.contentValues()
if x.getCausalityValue().getTestedProperty() == 'quantity']
# use Quantity Split Solver.
quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Quantity Split Solver'])
# configure for Quantity Split Solver.
kw = {'delivery_solver':'FIFO Delivery Solver',
'start_date':self.datetime + 15,
'stop_date':self.datetime + 25}
quantity_solver_decision.updateConfiguration(**kw)
solver_process.buildTargetSolverList()
solver_process.solve()
def stepUnifyStartDateWithDecisionInvoice(self, sequence=None,
sequence_list=None):
invoice = sequence.get('invoice')
self._solveDivergence(invoice, 'start_date', 'Unify Solver',
value=invoice.getStartDate())
def stepAdoptPrevisionQuantityInvoice(self,sequence=None, sequence_list=None):
invoice = sequence.get('invoice')
self._solveDivergence(invoice, 'quantity', 'Adopt Solver')
def stepAcceptDecisionQuantityInvoice(self,sequence=None, sequence_list=None):
invoice = sequence.get('invoice')
self._solveDivergence(invoice, 'quantity', 'Accept Solver')
def stepAcceptDecisionInvoice(self, sequence=None, sequence_list=None,
**kw):
"""
accept decision at the invoice level
"""
invoice = sequence.get('invoice')
invoice.portal_workflow.doActionFor(invoice,'accept_decision_action')
def stepCheckInvoiceSplitted(self, sequence=None, sequence_list=None, **kw):
"""
Test if invoice was splitted
"""
packing_list = sequence.get('packing_list')
invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
self.assertEqual(2,len(invoice_list))
invoice1 = None
invoice2 = None
for invoice in invoice_list:
if invoice.getUid() == sequence.get('invoice').getUid():
invoice1 = invoice
else:
invoice2 = invoice
sequence.edit(new_invoice=invoice2)
for line in invoice1.objectValues(
portal_type=self.invoice_line_portal_type):
self.assertEqual(self.default_quantity-1,line.getQuantity())
for line in invoice2.objectValues(
portal_type=self.invoice_line_portal_type):
self.assertEqual(1,line.getQuantity())
def stepCheckInvoiceNotSplitted(self, sequence=None, sequence_list=None, **kw):
"""
Test if invoice was not splitted
"""
packing_list = sequence.get('packing_list')
invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
self.assertEqual(1,len(invoice_list))
invoice1 = None
for invoice in invoice_list:
if invoice.getUid() == sequence.get('invoice').getUid():
invoice1 = invoice
last_delta = sequence.get('last_delta', 0.0)
for line in invoice1.objectValues(
portal_type=self.invoice_line_portal_type):
self.assertEqual(self.default_quantity + last_delta,
line.getQuantity())
def stepAddInvoiceLines(self, sequence=None, sequence_list=None):
"""
add some invoice and accounting lines to the invoice
"""
invoice = sequence.get('invoice')
invoice.newContent(portal_type='Invoice Line',
resource_value=sequence.get('resource'), quantity=3, price=555)
invoice.newContent(portal_type='Sale Invoice Transaction Line',
id ='receivable', source='account_module/customer',
destination='account_module/supplier', quantity=-1665)
invoice.newContent(portal_type='Sale Invoice Transaction Line',
id='income', source='account_module/sale',
destination='account_module/purchase', quantity=1665)
def stepAddWrongInvoiceLines(self, sequence=None, sequence_list=None):
"""
add some wrong invoice and accounting lines to the invoice
"""
invoice = sequence.get('invoice')
invoice.newContent(portal_type='Sale Invoice Transaction Line',
id='bad_movement', source='account_module/sale',
destination='account_module/purchase', quantity=2, price=4)
invoice.newContent(portal_type='Sale Invoice Transaction Line',
id='counter_bad_movement', source='account_module/sale',
destination='account_module/purchase', quantity=-2, price=4)
for movement in invoice.getMovementList():
movement.edit(resource_value=sequence.get('resource'))
def stepCheckStartInvoiceFail(self, sequence=None, sequence_list=None):
"""
checks that it's not possible to start an invoice with really wrong
lines
"""
try:
self.tic()
except RuntimeError, exc:
invoice = sequence.get('invoice')
# check which activities are failing
self.assertTrue(str(exc).startswith('tic is looping forever.'),
'%s does not start with "tic is looping forever."' % str(exc))
msg_list = [('/'.join(x.object_path), x.method_id)
for x in self.getActivityTool().getMessageList()]
self.assertTrue((invoice.getPath(), '_localBuild') in msg_list, msg_list)
# flush failing activities
activity_tool = self.getActivityTool()
activity_tool.manageClearActivities(keep=0)
else:
self.fail("Error: stepStartInvoice didn't fail, the builder script"
+ " InvoiceTransaction_postTransactionLineGeneration should have"
+ " complained that accounting movements use multiple resources")
def stepCheckSimulationTrees(self, sequence=None, sequence_list=None):
"""
check that rules are created in the order we expect them
"""
applied_rule_set = set()
invoice = sequence.get('invoice')
for movement in invoice.getMovementList():
for sm in movement.getDeliveryRelatedValueList():
applied_rule_set.add(sm.getRootAppliedRule())
rule_dict = {
'Order Root Simulation Rule': {
'movement_type_list': ['Sale Order Line', 'Sale Order Cell'],
'next_rule_list': ['Delivery Simulation Rule', ],
},
'Delivery Simulation Rule': {
'movement_type_list': ['Sale Packing List Line', 'Sale Packing List Cell'],
'next_rule_list': ['Invoice Simulation Rule', ],
},
'Trade Model Simulation Rule': {
'next_rule_list': ['Invoice Transaction Simulation Rule'],
},
'Invoice Simulation Rule': {
'movement_type_list': invoice.getPortalInvoiceMovementTypeList() \
+ invoice.getPortalAccountingMovementTypeList(),
'next_rule_list': ['Invoice Transaction Simulation Rule', 'Payment Simulation Rule',
'Trade Model Simulation Rule'],
},
'Invoice Transaction Simulation Rule': {
'parent_movement_type_list': invoice.getPortalInvoiceMovementTypeList(),
'movement_type_list': invoice.getPortalAccountingMovementTypeList(),
'next_rule_list': ['Payment Simulation Rule'],
},
'Payment Simulation Rule': {
'parent_movement_type_list': invoice.getPortalAccountingMovementTypeList(),
'next_rule_list': [],
},
}
def checkTree(rule):
"""
checks the tree recursively
"""
rule_type = rule.getSpecialiseValue().getPortalType()
rule_def = rule_dict.get(rule_type, {})
for k, v in rule_def.iteritems():
if k == 'movement_type_list':
for movement in rule.objectValues():
if movement.getDeliveryValue() is not None:
self.assertTrue(movement.getDeliveryValue().getPortalType() in v,
'looking for %s in %s on %s' % (
movement.getDeliveryValue().getPortalType(), v,
movement.getPath()))
elif k == 'next_rule_list':
for movement in rule.objectValues():
found_rule_dict = {}
for next_rule in movement.objectValues():
next_rule_type = next_rule.getSpecialiseValue().getPortalType()
self.assertTrue(next_rule_type in v,
'looking for %s in %s on %s' % (
next_rule_type, v, next_rule.getPath()))
n = found_rule_dict.get(next_rule_type, 0)
found_rule_dict[next_rule_type] = n + 1
# for each movement, we want to make sure that each rule is not
# instanciated more than once
if len(found_rule_dict):
self.assertEqual(set(found_rule_dict.itervalues()), {1})
elif k == 'parent_movement_type_list':
if rule.getParentValue().getDeliveryValue() is not None:
parent_type = rule.getParentValue().getDeliveryValue().getPortalType()
self.assertTrue(parent_type in v, 'looking for %s in %s on %s' % (
parent_type, v, rule.getParentValue().getPath()))
elif k == 'parent_id_list':
self.assertTrue(rule.getParentId() in v, 'looking for %s in %s on %s'
% (rule.getParentId(), v, rule.getPath()))
for movement in rule.objectValues():
for next_rule in movement.objectValues():
checkTree(next_rule)
for applied_rule in applied_rule_set:
checkTree(applied_rule)
def stepAddInvoiceLinesManyTransactions(self, sequence=None, sequence_list=None):
"""
add some invoice and accounting lines to the invoice
"""
invoice = sequence.get('invoice')
invoice_line = invoice.newContent(portal_type='Invoice Line')
transaction_line_1 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
transaction_line_2 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
self.tic()
invoice_line.edit(resource_value=sequence.get('resource'), quantity=3,
price=555)
transaction_line_1.edit(id ='receivable', source='account_module/customer',
destination='account_module/supplier', quantity=-1665)
transaction_line_2.edit(
id='income', source='account_module/sale',
destination='account_module/purchase', quantity=1665)
def stepInvoiceBuilderAlarm(self, sequence=None,
sequence_list=None, **kw):
self.portal.portal_alarms.invoice_builder_alarm.activeSense()
class TestSaleInvoiceMixin(TestInvoiceMixin,
ERP5TypeTestCase):
"""Test sale invoice are created from orders then packing lists.
Those tests methods only work for sale, because sale and purchase invoice
are not built at the same time on packing list workflow.
"""
quiet = 0
invoice_portal_type = 'Sale Invoice Transaction'
invoice_line_portal_type = 'Invoice Line'
invoice_cell_portal_type = 'Invoice Cell'
invoice_transaction_line_portal_type = 'Sale Invoice Transaction Line'
payment_portal_type = 'Payment Transaction'
# default sequence for one line of not varianted resource.
PACKING_LIST_DEFAULT_SEQUENCE = """
stepCreateEntities
stepCreateCurrency
stepCreateOrder
stepSetOrderProfile
stepSetOrderPriceCurrency
stepCreateNotVariatedResource
stepTic
stepCreateOrderLine
stepSetOrderLineResource
stepSetOrderLineDefaultValues
stepOrderOrder
stepTic
stepCheckDeliveryBuilding
stepConfirmOrder
stepTic
stepPackingListBuilderAlarm
stepTic
stepCheckOrderRule
stepCheckOrderSimulation
stepCheckDeliveryBuilding
stepAddPackingListContainer
stepAddPackingListContainerLine
stepSetContainerLineFullQuantity
stepTic
stepCheckPackingListIsPacked
"""
# default sequence for two lines of not varianted resource.
PACKING_LIST_TWO_LINES_DEFAULT_SEQUENCE = """
stepCreateEntities
stepCreateCurrency
stepCreateOrder
stepSetOrderProfile
stepSetOrderPriceCurrency
stepCreateNotVariatedResource
stepTic
stepCreateOrderLine
stepSetOrderLineResource
stepSetOrderLineDefaultValues
stepCreateNotVariatedResource
stepTic
stepCreateOrderLine
stepSetOrderLineResource
stepSetOrderLineDefaultValues
stepOrderOrder
stepTic
stepCheckDeliveryBuilding
stepConfirmOrder
stepTic
stepPackingListBuilderAlarm
stepTic
stepCheckOrderRule
stepCheckOrderSimulation
stepCheckDeliveryBuilding
stepAddPackingListContainer
stepAddPackingListContainerLine
stepTic
stepSetContainerFullQuantity
stepTic
stepCheckPackingListIsPacked
"""
# default sequence for one line of not varianted resource.
TWO_PACKING_LIST_DEFAULT_SEQUENCE = """
stepCreateEntities
stepCreateCurrency
stepCreateOrder
stepSetOrderProfile
stepSetOrderPriceCurrency
stepCreateNotVariatedResource
stepTic
stepCreateOrderLine
stepSetOrderLineResource
stepSetOrderLineDefaultValues
stepOrderOrder
stepTic
stepCheckDeliveryBuilding
stepConfirmOrder
stepTic
stepPackingListBuilderAlarm
stepTic
stepCheckOrderRule
stepCheckOrderSimulation
stepCheckDeliveryBuilding
stepDecreasePackingListLineQuantity
stepCheckPackingListIsCalculating
stepTic
stepCheckPackingListIsDiverged
stepSplitAndDeferPackingList
stepTic
stepCheckPackingListIsSolved
stepCheckPackingListSplitted
stepAddPackingListContainer
stepAddPackingListContainerLine
stepSetContainerLineFullQuantity
stepTic
stepCheckPackingListIsPacked
stepDefineNewPackingListContainer
stepTic
stepCheckNewPackingListIsPacked
"""
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Module Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>TestInvoiceMixin</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testInvoice</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>module.erp5.TestInvoiceMixin</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Module Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -28,7 +28,7 @@
import unittest
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.utils import createZODBPythonScript
from Products.ERP5.tests.testOrder import TestOrderMixin
from erp5.component.test.testOrder import TestOrderMixin
class TestRuleMixin(TestOrderMixin):
"""
......@@ -138,7 +138,7 @@ class TestRule(TestRuleMixin, ERP5TypeTestCase) :
test that when a rule's test method returns False, it will not apply
"""
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'wrong_script', 'rule',
createZODBPythonScript(skin_folder, 'wrong_script', 'rule',
'return False')
delivery_rule = self.getRule('default_delivery_rule')
delivery_rule.setTestMethodId('wrong_script')
......@@ -154,7 +154,7 @@ class TestRule(TestRuleMixin, ERP5TypeTestCase) :
test that when a rule's test method returns True, it will apply
"""
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'good_script', 'rule',
createZODBPythonScript(skin_folder, 'good_script', 'rule',
'return True')
delivery_rule = self.getRule('default_delivery_rule')
delivery_rule.setTestMethodId('good_script')
......@@ -171,7 +171,7 @@ class TestRule(TestRuleMixin, ERP5TypeTestCase) :
a good script
"""
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'good_script', 'rule',
createZODBPythonScript(skin_folder, 'good_script', 'rule',
'return True')
delivery_rule = self.getRule('default_delivery_rule')
delivery_rule.setTestMethodId('good_script')
......@@ -189,7 +189,7 @@ class TestRule(TestRuleMixin, ERP5TypeTestCase) :
it will not apply
"""
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'good_script', 'rule',
createZODBPythonScript(skin_folder, 'good_script', 'rule',
'return True')
delivery_rule = self.getRule('default_delivery_rule')
delivery_rule.setTestMethodId('good_script')
......@@ -208,7 +208,7 @@ class TestRule(TestRuleMixin, ERP5TypeTestCase) :
apply
"""
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'good_script', 'rule',
createZODBPythonScript(skin_folder, 'good_script', 'rule',
'return True')
delivery_rule = self.getRule('default_delivery_rule')
delivery_rule.setTestMethodId('good_script')
......@@ -359,7 +359,7 @@ return context.generatePredicate(
XXX as expand is triggered here, make sure rules won't be created forever
"""
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'rule_script', 'rule',
createZODBPythonScript(skin_folder, 'rule_script', 'rule',
"return False")
# wrong reference
......@@ -408,11 +408,11 @@ return context.generatePredicate(
XXX as expand is triggered here, make sure rules won't be created forever
"""
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'delivery_rule_script', 'rule',
createZODBPythonScript(skin_folder, 'delivery_rule_script', 'rule',
"return False")
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'invoice_rule_script', 'rule',
createZODBPythonScript(skin_folder, 'invoice_rule_script', 'rule',
"return context.getParentValue().getSpecialiseReference() == 'default_delivery_rule'")
delivery_rule = self.getRule('default_delivery_rule')
......@@ -536,11 +536,11 @@ return context.generatePredicate(
- test that nothing is changed if at least one child is delivered
"""
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'delivery_rule_script', 'rule',
createZODBPythonScript(skin_folder, 'delivery_rule_script', 'rule',
"return False")
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'invoice_rule_script', 'rule',
createZODBPythonScript(skin_folder, 'invoice_rule_script', 'rule',
"return context.getParentValue().getSpecialiseReference() == 'default_delivery_rule'")
delivery_rule = self.getRule('default_delivery_rule')
......@@ -622,11 +622,11 @@ return context.generatePredicate(
- test that nothing is changed if at least one child is delivered
"""
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'delivery_rule_script', 'rule',
createZODBPythonScript(skin_folder, 'delivery_rule_script', 'rule',
"return False")
skin_folder = self.getPortal().portal_skins.custom
skin = createZODBPythonScript(skin_folder, 'invoice_rule_script', 'rule',
createZODBPythonScript(skin_folder, 'invoice_rule_script', 'rule',
"return context.getParentValue().getSpecialiseReference() == 'default_delivery_rule'")
delivery_rule = self.getRule('default_delivery_rule')
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testRule</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testRule</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testRule</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
module.erp5.TestInvoiceMixin
\ No newline at end of file
test.erp5.testRule
\ No newline at end of file
erp5_full_text_mroonga_catalog
erp5_core_proxy_field_legacy
erp5_base
erp5_apparel
erp5_project
erp5_configurator_standard_solver
erp5_simulation_test_trade_template
erp5_simulation_test
erp5_administration
erp5_dummy_movement
erp5_configurator_standard_accounting_template
erp5_configurator_standard_invoicing_template
\ No newline at end of file
......@@ -32,7 +32,7 @@ from DateTime import DateTime
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.utils import reindex
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testInvoice import TestSaleInvoiceMixin
from erp5.component.module.TestInvoiceMixin import TestSaleInvoiceMixin
from Products.ERP5.tests.utils import newSimulationExpectedFailure
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
......
......@@ -34,7 +34,7 @@ import unittest
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from zLOG import LOG
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testOrder import TestOrderMixin
from erp5.component.test.testOrder import TestOrderMixin
from Products.ERP5.tests.utils import newSimulationExpectedFailure
class TestProductionOrderMixin(TestOrderMixin):
......
......@@ -33,7 +33,7 @@ import unittest
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.Sequence import SequenceList
from erp5.component.test.testProductionOrder import TestProductionOrderMixin
from Products.ERP5.tests.testPackingList import TestPackingListMixin
from erp5.component.test.testPackingList import TestPackingListMixin
from Products.ERP5.tests.utils import newSimulationExpectedFailure
class TestProductionPackingReportListMixin(TestProductionOrderMixin, TestPackingListMixin, \
......
......@@ -32,7 +32,7 @@ from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5Type.tests.utils import createZODBPythonScript
from Products.ERP5.tests.testInvoice import TestSaleInvoiceMixin
from erp5.component.module.TestInvoiceMixin import TestSaleInvoiceMixin
from Products.ERP5.tests.utils import newSimulationExpectedFailure
class TestNestedLineMixin(TestSaleInvoiceMixin):
......@@ -335,7 +335,8 @@ class TestNestedLine(TestNestedLineMixin, ERP5TypeTestCase):
return True
return False
self.tic(stop_condition=stop_condition)
update_causality_message_uid, = prioritize_uid_list
self.assertEqual(len(prioritize_uid_list), 1)
update_causality_message_uid = prioritize_uid_list[0]
for table in 'message', 'message_queue':
self.portal.cmf_activity_sql_connection.manage_test("""
update %s
......@@ -348,7 +349,7 @@ class TestNestedLine(TestNestedLineMixin, ERP5TypeTestCase):
@expectedFailure
def test_04_MergingMultipleSaleOrders(self, quiet=quiet):
sequence_list = SequenceList()
sequence = sequence_list.addSequenceString(self.DEFAULT_SEQUENCE + \
sequence_list.addSequenceString(self.DEFAULT_SEQUENCE + \
"""
stepCreateOrder
stepSetOrderProfile
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testDeliveryBuilderToSupportMultipleLines</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testDeliveryBuilderToSupportMultipleLines</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testDeliveryBuilderToSupportMultipleLines</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -33,1095 +33,15 @@
import xml.dom.minidom
import zipfile
from Products.DCWorkflow.DCWorkflow import ValidationFailed
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.utils import FileUpload
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
from Products.ERP5OOo.OOoUtils import OOoParser
from AccessControl.SecurityManagement import newSecurityManager
from DateTime import DateTime
from Acquisition import aq_parent
from zLOG import LOG
from Products.ERP5Type.tests.Sequence import SequenceList
from testPackingList import TestPackingListMixin
from erp5.component.test.testPackingList import TestPackingListMixin
from Products.ERP5.tests.utils import newSimulationExpectedFailure
class TestInvoiceMixin(TestPackingListMixin):
"""Test methods for invoices
"""
default_region = "europe/west/france"
vat_gap = 'fr/pcg/4/44/445/4457/44571'
vat_rate = 0.196
sale_gap = 'fr/pcg/7/70/707/7071/70712'
customer_gap = 'fr/pcg/4/41/411'
bank_gap = 'fr/pcg/5/51/512'
mail_delivery_mode = 'by_mail'
cpt_incoterm = 'cpt'
unit_piece_quantity_unit = 'unit/piece'
mass_quantity_unit = 'mass/kg'
oldMailhost = None
# (account_id, account_gap, account_type)
account_definition_list = (
('receivable_vat', vat_gap, 'liability/payable/collected_vat',),
('sale', sale_gap, 'income'),
('customer', customer_gap, 'asset/receivable'),
('refundable_vat', vat_gap, 'asset/receivable/refundable_vat'),
('purchase', sale_gap, 'expense'),
('supplier', customer_gap, 'liability/payable'),
('bank', bank_gap, 'asset/cash/bank'),
)
# (line_id, source_account_id, destination_account_id, line_quantity)
transaction_line_definition_list = (
('income', 'sale', 'purchase', 1.0),
('receivable', 'customer', 'supplier', -1.0 - vat_rate),
('collected_vat', 'receivable_vat', 'refundable_vat', vat_rate),
)
def getTitle(self):
return "Invoices"
def getBusinessTemplateList(self):
return super(TestInvoiceMixin, self).getBusinessTemplateList() + (
'erp5_accounting', 'erp5_invoicing', 'erp5_simplified_invoicing',
'erp5_configurator_standard_accounting_template',
'erp5_configurator_standard_invoicing_template')
@UnrestrictedMethod
def createCategories(self):
"""Create the categories for our test. """
# pull in the TestOrderMixin categories first
super(TestInvoiceMixin, self).createCategories()
for cat_string in self.getNeededCategoryList() :
base_cat = cat_string.split("/")[0]
path = self.getPortal().portal_categories[base_cat]
for cat in cat_string.split("/")[1:] :
if not cat in path.objectIds() :
path = path.newContent(
portal_type='Category',
id=cat,)
else:
path = path[cat]
# check categories have been created
for cat_string in self.getNeededCategoryList() :
self.assertNotEquals(None,
self.getCategoryTool().restrictedTraverse(cat_string),
cat_string)
def getNeededCategoryList(self):
"""return a list of categories that should be created."""
return ('region/%s' % self.default_region,
'gap/%s' % self.vat_gap,
'gap/%s' % self.sale_gap,
'gap/%s' % self.customer_gap,
'gap/%s' % self.bank_gap,
'delivery_mode/%s' % self.mail_delivery_mode,
'incoterm/%s' % self.cpt_incoterm,
'quantity_unit/%s' % self.unit_piece_quantity_unit,
'quantity_unit/%s' % self.mass_quantity_unit,
'base_amount/tax1',
'base_amount/tax2',
'base_amount/tax3',
'use/trade/tax',
)
def afterSetUp(self):
self.createUser('test_user',
['Assignee', 'Assignor', 'Member',
'Associate', 'Auditor', 'Author'])
self.createUser('manager', ['Manager'])
self.loginByUserName('manager')
self.createCategories()
self.validateRules()
self.createBusinessProcess()
self.loginByUserName('test_user')
def beforeTearDown(self):
self.abort()
self.loginByUserName('manager')
super(TestInvoiceMixin, self).beforeTearDown()
for folder in (self.portal.accounting_module,
self.portal.organisation_module,
self.portal.sale_order_module,
self.portal.purchase_order_module,
self.portal.sale_packing_list_module,
self.portal.purchase_packing_list_module,
self.portal.portal_simulation,):
folder.manage_delObjects([x for x in folder.objectIds() if x not in ('organisation_1','organisation_2','ppl_1','ppl_2')])
self.tic()
def stepCreateSaleInvoiceTransactionRule(self, sequence, **kw) :
pass # see createBusinessProcess
## XXX move this to "Sequence class"
def playSequence(self, sequence_string, quiet=0) :
sequence_list = SequenceList()
sequence_list.addSequenceString(sequence_string)
sequence_list.play(self, quiet=quiet)
def createBusinessProcess(self):
portal = self.portal
business_process_id = self.__class__.__name__
try:
business_process = portal.business_process_module[business_process_id]
except KeyError:
business_process = portal.business_process_module.newContent(
business_process_id, 'Business Process',
specialise=self.__class__.business_process)
kw = dict(portal_type='Trade Model Path',
trade_phase='default/accounting',
trade_date='trade_phase/default/invoicing',
membership_criterion_base_category_list=('destination_region',
'product_line'),
membership_criterion_category=(
'destination_region/region/' + self.default_region,
'product_line/apparel'))
account_module = portal.account_module
for account_id, account_gap, account_type in self.account_definition_list:
if not account_module.has_key(account_id):
account = account_module.newContent(account_id, gap=account_gap,
account_type=account_type)
account.validate()
for line_id, line_source_id, line_destination_id, line_ratio in \
self.transaction_line_definition_list:
trade_model_path = business_process.newContent(
reference='accounting_' + line_id,
efficiency=line_ratio,
source_value=account_module[line_source_id],
destination_value=account_module[line_destination_id],
**kw)
# A trade model path already exist for root simulation movements
# (Accounting Transaction Root Simulation Rule).
# The ones we are creating are for Invoice Transaction Simulation Rule.
trade_model_path._setCriterionPropertyList(('portal_type',))
trade_model_path.setCriterion('portal_type', 'Simulation Movement')
self.business_process = business_process.getRelativeUrl()
def stepCreateEntities(self, sequence, **kw) :
"""Create a vendor and two clients. """
self.stepCreateOrganisation1(sequence, **kw)
self.stepCreateOrganisation2(sequence, **kw)
self.stepCreateOrganisation3(sequence, **kw)
self.stepCreateProject1(sequence, **kw)
self.stepCreateProject2(sequence, **kw)
vendor = sequence.get('organisation1')
vendor.setRegion(self.default_region)
vendor.validate()
sequence.edit(vendor=vendor)
client1 = sequence.get('organisation2')
client1.setRegion(self.default_region)
self.assertNotEquals(client1.getRegionValue(), None)
client1.validate()
sequence.edit(client1=client1)
client2 = sequence.get('organisation3')
self.assertEqual(client2.getRegionValue(), None)
client2.validate()
sequence.edit(client2=client2)
def stepCheckOrderRule(self, sequence=None, sequence_list=None, **kw):
"""Check we have a related Order Rule"""
order = sequence.get('order')
simulation_tool = self.getSimulationTool()
# Check that there is an applied rule for our packing list
rule_list = [x for x in simulation_tool.objectValues()
if x.getCausalityValue()==order]
self.assertNotEquals(len(rule_list), 0)
sequence.edit(order_rule_list = rule_list)
self.assertEqual(len(order.getMovementList()),
sum([len(rule.objectIds()) for rule in rule_list]))
def stepCheckInvoicingRule(self, sequence=None, sequence_list=None, **kw):
"""
Checks that the invoicing rule is applied and its values are correct.
"""
order_rule_list = sequence.get('order_rule_list')
invoicing_rule_list = []
invoice_transaction_rule_list = []
for order_rule in order_rule_list :
for order_simulation_movement in order_rule.objectValues() :
temp_invoicing_rule_list = [ar for ar in order_simulation_movement.objectValues()[0].objectValues()[0].objectValues()
if ar.getSpecialiseValue().getPortalType() == 'Invoice Simulation Rule']
self.assertEqual(len(temp_invoicing_rule_list), 1)
invoicing_rule_list.extend(temp_invoicing_rule_list)
sequence.edit(invoicing_rule_list=invoicing_rule_list)
invoicing_rule = invoicing_rule_list[0]
sequence.edit(invoicing_rule = invoicing_rule)
for invoicing_rule in invoicing_rule_list:
self.assertEqual(invoicing_rule.getSpecialiseReference(),
'default_invoicing_rule')
self.assertEqual(invoicing_rule.getPortalType(),
'Applied Rule')
simulation_movement_list = invoicing_rule.objectValues()
self.assertNotEquals(len(simulation_movement_list), 0)
for simulation_movement in simulation_movement_list :
invoice_transaction_rule_list.extend([applied_rule for applied_rule
in simulation_movement.objectValues() if applied_rule \
.getSpecialiseValue().getPortalType()
== 'Invoice Transaction Simulation Rule'])
resource_list = sequence.get('resource_list')
self.assertEqual(simulation_movement.getPortalType(),
'Simulation Movement')
self.assertTrue(simulation_movement.getResourceValue() in
resource_list)
self.assertTrue(simulation_movement.isConvergent())
# TODO: What is the invoice dates supposed to be ?
# is this done through profiles ?
#self.assertEqual(simulation_movement.getStartDate(),
# sequence.get('order').getStartDate())
#self.assertEqual(simulation_movement.getStopDate(),
# sequence.get('order').getStopDate())
sequence.edit(invoice_transaction_rule_list=invoice_transaction_rule_list)
def stepCheckInvoiceTransactionRule(self, sequence=None, sequence_list=None,
**kw):
"""
Checks that the applied invoice_transaction_rule is expanded and its movements are
consistent with its parent movement
"""
invoice_transaction_rule_list = \
sequence.get('invoice_transaction_rule_list')
for applied_invoice_transaction_rule in invoice_transaction_rule_list:
parent_movement = aq_parent(applied_invoice_transaction_rule)
invoice_transaction_rule = \
applied_invoice_transaction_rule.getSpecialiseValue()
self.assertEqual(3, len(applied_invoice_transaction_rule.objectValues()))
for line_id, line_source_id, line_destination_id, line_ratio in \
self.transaction_line_definition_list:
movement = None
for simulation_movement in \
applied_invoice_transaction_rule.objectValues():
if simulation_movement.getSourceId() == line_source_id and\
simulation_movement.getDestinationId() == line_destination_id:
movement = simulation_movement
break
self.assertTrue(movement is not None)
self.assertEqual(movement.getCorrectedQuantity(), parent_movement.getPrice() *
parent_movement.getCorrectedQuantity() * line_ratio)
self.assertEqual(movement.getStartDate(),
parent_movement.getStartDate())
self.assertEqual(movement.getStopDate(),
parent_movement.getStopDate())
def modifyPackingListState(self, transition_name,
sequence,packing_list=None):
""" calls the workflow for the packing list """
if packing_list is None:
packing_list = sequence.get('packing_list')
packing_list.portal_workflow.doActionFor(packing_list, transition_name)
def stepSetReadyPackingList(self, sequence=None, sequence_list=None, **kw):
""" set the Packing List as Ready. This must build the invoice. """
self.modifyPackingListState('set_ready_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'ready')
def stepSetReadyNewPackingList(self, sequence=None,
sequence_list=None, **kw):
""" set the Packing List as Ready. This must build the invoice. """
packing_list = sequence.get('new_packing_list')
self.modifyPackingListState('set_ready_action', sequence=sequence,
packing_list=packing_list)
self.assertEqual(packing_list.getSimulationState(), 'ready')
def stepStartPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('start_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'started')
def stepStartNewPackingList(self, sequence=None, sequence_list=None, **kw):
packing_list = sequence.get('new_packing_list')
self.modifyPackingListState('start_action', sequence=sequence,
packing_list=packing_list)
self.assertEqual(packing_list.getSimulationState(), 'started')
def stepStopPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('stop_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'stopped')
def stepDeliverPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('deliver_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'delivered')
def stepCancelPackingList(self, sequence=None, sequence_list=None, **kw):
self.modifyPackingListState('cancel_action', sequence=sequence)
packing_list = sequence.get('packing_list')
self.assertEqual(packing_list.getSimulationState(), 'cancelled')
def modifyInvoiceState(self, transition_name,
sequence,invoice=None):
""" calls the workflow for the invoice """
if invoice is None:
invoice = sequence.get('invoice')
invoice.portal_workflow.doActionFor(invoice, transition_name)
def stepStartInvoice(self, sequence=None, sequence_list=None, **kw):
self.modifyInvoiceState('start_action', sequence=sequence)
invoice = sequence.get('invoice')
self.assertEqual(invoice.getSimulationState(), 'started')
def stepStartNewInvoice(self, sequence=None, sequence_list=None, **kw):
invoice = sequence.get('new_invoice')
self.modifyInvoiceState('start_action', sequence=sequence,
invoice=invoice)
self.assertEqual(invoice.getSimulationState(), 'started')
def stepStopInvoice(self, sequence=None, sequence_list=None, **kw):
self.modifyInvoiceState('stop_action', sequence=sequence)
invoice = sequence.get('invoice')
self.assertEqual(invoice.getSimulationState(), 'stopped')
def stepDeliverInvoice(self, sequence=None, sequence_list=None, **kw):
self.modifyInvoiceState('deliver_action', sequence=sequence)
invoice = sequence.get('invoice')
self.assertEqual(invoice.getSimulationState(), 'delivered')
def stepCancelInvoice(self, sequence=None, sequence_list=None, **kw):
self.modifyInvoiceState('cancel_action', sequence=sequence)
invoice = sequence.get('invoice')
self.assertEqual(invoice.getSimulationState(), 'cancelled')
def stepSwitchPackingLists(self, sequence=None, sequence_list=None, **kw):
packing_list = sequence.get('packing_list')
new_packing_list = sequence.get('new_packing_list')
#invoice = new_packing_list.getDefaultCausalityRelatedValue(
#portal_type=self.invoice_portal_type)
sequence.edit(packing_list=new_packing_list,
new_packing_list=packing_list)#, invoice=invoice)
def stepSwitchInvoices(self, sequence=None, sequence_list=None, **kw):
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
sequence.edit(invoice=new_invoice, new_invoice=invoice)
def stepCheckPackingListSimulation(self, sequence=None, sequence_list=None, **kw):
""" checks that simulation movements related to the packing list are OK """
packing_list = sequence.get('packing_list')
order = sequence.get('order')
order_root_applied_rule = order.getCausalityRelatedValueList(
portal_type = 'Applied Rule')[0]
# check simulation movements from this packing list
for movement in packing_list.getMovementList() :
simulation_movement_list = movement.getOrderRelatedValueList()
self.assertNotEquals(len(simulation_movement_list), 0)
total_quantity = 0
for simulation_movement in simulation_movement_list :
total_quantity += simulation_movement.getQuantity()
# check that those movements come from the same root applied
# rule than the order.
self.assertEqual( simulation_movement.getRootAppliedRule(),
order_root_applied_rule)
self.assertEqual(total_quantity, movement.getQuantity())
def checkMirrorAcquisition(self, object, acquired_object):
"""
Check if properties are well acquired for mirrored case
"""
# packing_list_movement, simulation_movement
self.assertEqual(acquired_object.getStartDate(), object.getStopDate())
self.assertEqual(acquired_object.getStopDate(), object.getStartDate())
self.assertEqual(acquired_object.getSourceValue(), \
object.getDestinationValue())
self.assertEqual(acquired_object.getDestinationValue(), \
object.getSourceValue())
self.assertEqual(acquired_object.getSourceSectionValue(), \
object.getDestinationSectionValue())
self.assertEqual(acquired_object.getDestinationSectionValue(), \
object.getSourceSectionValue())
def stepCheckInvoiceBuilding(self, sequence=None, sequence_list=None, **kw):
"""
checks that the invoice is built with the default_invoice_builder
"""
packing_list = sequence.get('packing_list')
related_invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
if packing_list.getPortalType() == 'Purchase Packing List':
packing_list_building_state = 'stopped'
else:
packing_list_building_state = 'started'
packing_list_state = packing_list.getSimulationState()
if packing_list_state != packing_list_building_state :
self.assertEqual(0, len(related_invoice_list))
else:
self.assertEqual(1, len(related_invoice_list))
invoice = related_invoice_list[0].getObject()
self.assertTrue(invoice is not None)
# Invoices created by Delivery Builder are in confirmed state
self.assertEqual(invoice.getSimulationState(), 'confirmed')
# Get the list of simulation movements of packing list ...
packing_list_simulation_movement_list = []
for packing_list_movement in packing_list.getMovementList():
packing_list_simulation_movement_list.extend(
packing_list_movement.getDeliveryRelatedValueList())
# ... invoice simulation movement are their childrens.
simulation_movement_list = []
for p_l_simulation_movement in packing_list_simulation_movement_list :
for applied_rule in p_l_simulation_movement.objectValues() :
simulation_movement_list.extend(applied_rule.objectValues())
# First, test if each Simulation Movement is related to an
# Invoice Movement
invoice_relative_url = invoice.getRelativeUrl()
for simulation_movement in simulation_movement_list:
invoice_movement_list = simulation_movement.getDeliveryValueList()
self.assertEqual(len(invoice_movement_list), 1)
invoice_movement = invoice_movement_list[0]
self.assertTrue(invoice_movement is not None)
self.assert_(invoice_movement.getRelativeUrl().\
startswith(invoice_relative_url))
# Then, test if each Invoice movement is equals to the sum of somes
# Simulation Movements
for invoice_movement in invoice.getMovementList(portal_type = [
self.invoice_cell_portal_type,
self.invoice_line_portal_type]) :
related_simulation_movement_list = invoice_movement.\
getDeliveryRelatedValueList(portal_type='Simulation Movement')
quantity = 0
total_price = 0
invoice_movement_quantity = invoice_movement.getQuantity()
for related_simulation_movement in related_simulation_movement_list:
quantity += related_simulation_movement.getQuantity()
total_price += related_simulation_movement.getPrice() *\
related_simulation_movement.getQuantity()
# Test resource
self.assertEqual(invoice_movement.getResource(), \
related_simulation_movement.getResource())
# Test resource variation
self.assertEqual(invoice_movement.getVariationText(), \
related_simulation_movement.getVariationText())
self.assertEqual(invoice_movement.getVariationCategoryList(), \
related_simulation_movement.getVariationCategoryList())
# Test acquisition
self.checkAcquisition(invoice_movement,
related_simulation_movement)
# Test delivery ratio
self.assertEqual(related_simulation_movement.getQuantity() /\
invoice_movement_quantity, \
related_simulation_movement.getDeliveryRatio())
self.assertEqual(quantity, invoice_movement.getQuantity())
# Test price
self.assertEqual(total_price / quantity, invoice_movement.getPrice())
sequence.edit(invoice = invoice)
# Test causality
self.assertEqual(len(invoice.getCausalityValueList(
portal_type = self.packing_list_portal_type)), 1)
self.assertEqual(invoice.getCausalityValue(), packing_list)
# Finally, test getTotalQuantity and getTotalPrice on Invoice
self.assertEqual(packing_list.getTotalQuantity(),
invoice.getTotalQuantity())
self.assertEqual(packing_list.getTotalPrice(),
invoice.getTotalPrice())
def stepCheckInvoicesConsistency(self, sequence=None, sequence_list=None,
**kw):
"""
Checks that all invoices are consistent:
- transaction lines match invoice lines
- no movement is divergent
"""
invoice_list = self.getPortal()['accounting_module'].objectValues()
for invoice in invoice_list:
accounting_state_list = \
list(self.getPortal().getPortalCurrentInventoryStateList())
accounting_state_list.append('cancelled')
if invoice.getSimulationState() in accounting_state_list:
invoice_line_list = invoice.contentValues(
portal_type=self.invoice_line_portal_type)
invoice_transaction_line_list = invoice.contentValues(
portal_type=self.invoice_transaction_line_portal_type)
self.assertEqual(3, len(invoice_transaction_line_list))
expected_price = 0.0
for line in invoice_line_list:
expected_price += line.getTotalPrice()
for line_id, line_source, line_dest, line_ratio in \
self.transaction_line_definition_list:
for line in invoice.contentValues(
portal_type=self.invoice_transaction_line_portal_type):
if line.getSource() == 'account_module/%s' % line_source and \
line.getDestination() == 'account_module/%s' % line_dest:
break
else:
self.fail('No line found that matches %s' % line_id)
resource_precision = line.getResourceValue().getQuantityPrecision()
self.assertEqual(round(line.getQuantity(), resource_precision),
round(expected_price * line_ratio, resource_precision))
def stepCheckInvoiceLineHasReferenceAndIntIndex(self, sequence=None, **kw):
"""Check that the unique invoice line in the invoice has reference and int
index.
"""
invoice = sequence.get('invoice')
invoice_line_list = invoice.contentValues(
portal_type=self.invoice_line_portal_type)
self.assertEqual(1, len(invoice_line_list))
invoice_line = invoice_line_list[0]
self.assertEqual(1, invoice_line.getIntIndex())
self.assertEqual('1', invoice_line.getReference())
def stepCheckPackingListInvoice(
self, sequence=None, sequence_list=None, **kw):
""" Checks if the delivery builder is working as expected,
coping the atributes from packing list to invoice."""
packing_list = sequence.get('packing_list')
related_invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
self.assertEqual(len(related_invoice_list), 1)
invoice = related_invoice_list[0]
self.assertEqual(packing_list.getSource(), invoice.getSource())
self.assertEqual(packing_list.getDestination(), invoice.getDestination())
self.assertEqual(packing_list.getDestinationSection(), \
invoice.getDestinationSection())
self.assertEqual(packing_list.getSourceSection(), \
invoice.getSourceSection())
self.assertEqual(packing_list.getDestinationDecision(), \
invoice.getDestinationDecision())
self.assertEqual(packing_list.getSourceDecision(), \
invoice.getSourceDecision())
self.assertEqual(packing_list.getDestinationAdministration(), \
invoice.getDestinationAdministration())
self.assertEqual(packing_list.getSourceAdministration(), \
invoice.getSourceAdministration())
self.assertEqual(packing_list.getDestinationProject(), \
invoice.getDestinationProject())
self.assertEqual(packing_list.getSourceProject(), \
invoice.getSourceProject())
self.assertEqual(packing_list.getPriceCurrency(), \
invoice.getPriceCurrency())
def stepCheckDeliveryRuleForDeferred(
self, sequence=None, sequence_list=None, **kw):
""" Checks that a delivery rule has been created when we took 'split
and defer' decision on the divergeant Packing List. """
# TODO
def stepCheckDeliveryRuleIsEmpty(
self, sequence=None, sequence_list=None, **kw):
""" Checks that an empty delivery rule is created for the
convergeant Packing List"""
packing_list = sequence.get('packing_list')
self.assertTrue(packing_list is not None)
simulation_tool = self.getSimulationTool()
# Check that there is an applied rule for our packing list
rule_list = [x for x in simulation_tool.objectValues()
if x.getCausalityValue()==packing_list]
self.assertEqual(len(rule_list),1)
packing_list_rule = rule_list[0]
sequence.edit(packing_list_rule=packing_list_rule)
rule_line_list = packing_list_rule.objectValues()
packing_list_line_list = packing_list.objectValues()
self.assertEqual(len(packing_list_line_list),
len(rule_line_list))
self.assertEqual(1, len(rule_line_list))
rule_line = rule_line_list[0]
packing_list_line = packing_list_line_list[0]
self.assertEqual(rule_line.getQuantity(), 10)
self.assertEqual(rule_line.getPrice(), 100)
self.assertEqual(rule_line.getDeliveryValue(),
packing_list_line)
self.assertEqual(rule_line.getStartDate(),
packing_list_line.getStartDate())
self.assertEqual(rule_line.getStopDate(),
packing_list_line.getStopDate())
self.assertEqual(rule_line.getPortalType(),
'Simulation Movement')
def stepCheckPackingList(self,sequence=None, sequence_list=None,**kw):
""" """
packing_list_module = self.getSalePackingListModule()
order_rule = sequence.get('order_rule')
order = sequence.get('order')
sale_packing_list_list = []
for o in packing_list_module.objectValues():
if o.getCausalityValue() == order:
sale_packing_list_list.append(o)
self.assertEqual(len(sale_packing_list_list), 1)
sale_packing_list = sale_packing_list_list[0]
sale_packing_list_line_list = sale_packing_list.objectValues()
self.assertEqual(len(sale_packing_list_line_list),1)
sale_packing_list_line = sale_packing_list_line_list[0]
product = sequence.get('resource')
self.assertEqual(sale_packing_list_line.getResourceValue(),
product)
self.assertEqual(sale_packing_list_line.getPrice(),
self.price1)
LOG('sale_packing_list_line.showDict()',0,
sale_packing_list_line.showDict())
self.assertEqual(sale_packing_list_line.getQuantity(),
self.quantity1)
self.assertEqual(sale_packing_list_line.getTotalPrice(),
self.total_price1)
sequence.edit(packing_list = sale_packing_list)
def stepCheckTwoInvoices(self,sequence=None, sequence_list=None, **kw):
""" checks invoice properties are well set. """
# Now we will check that we have two invoices created
for x in '', 'new_':
packing_list = sequence.get(x + 'packing_list')
invoice, = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
self.assertEqual(invoice.getSimulationState(), 'confirmed')
sequence.set(x + 'invoice', invoice)
def stepStartTwoInvoices(self,sequence=None, sequence_list=None, **kw):
""" start both invoices. """
portal = self.getPortal()
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
portal.portal_workflow.doActionFor(invoice, 'start_action')
portal.portal_workflow.doActionFor(new_invoice, 'start_action')
def stepCheckTwoInvoicesTransactionLines(self,sequence=None,
sequence_list=None, **kw):
""" checks invoice properties are well set. """
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
self.assertEqual(3,len(invoice.objectValues(
portal_type=self.invoice_transaction_line_portal_type)))
self.assertEqual(3,len(new_invoice.objectValues(
portal_type=self.invoice_transaction_line_portal_type)))
account_module = self.portal.account_module
found_dict = {}
for line in invoice.objectValues(
portal_type=self.invoice_transaction_line_portal_type):
source_id = line.getSourceId()
found_dict[source_id] = line.getQuantity()
total_price = (self.default_quantity-1) * self.default_price
expected_dict = {
'sale' : total_price,
'receivable_vat' : total_price * self.vat_rate,
'customer' : - (total_price + total_price * self.vat_rate)
}
self.failIfDifferentSet(expected_dict.keys(),found_dict.keys())
for key in found_dict.keys():
self.assertAlmostEquals(expected_dict[key],found_dict[key],places=2)
found_dict = {}
for line in new_invoice.objectValues(
portal_type=self.invoice_transaction_line_portal_type):
source_id = line.getSourceId()
found_dict[source_id] = line.getQuantity()
total_price = 1 * self.default_price
expected_dict = {
'sale' : total_price,
'receivable_vat' : total_price * self.vat_rate,
'customer' : - (total_price + total_price * self.vat_rate)
}
self.failIfDifferentSet(expected_dict.keys(), found_dict.keys())
for key in found_dict.keys():
self.assertAlmostEquals(expected_dict[key], found_dict[key], places=2)
def stepRebuildAndCheckNothingIsCreated(self, sequence=None,
sequence_list=None, **kw):
"""Rebuilds with sale_invoice_builder and checks nothing more is
created. """
accounting_module = self.portal.accounting_module
portal_type_list = ('Sale Invoice Transaction', 'Purchase Invoice Transaction')
sale_invoice_transaction_count = len(accounting_module.objectValues(
portal_type=portal_type_list))
for builder in self.getPortal().portal_deliveries.objectValues():
builder.build()
self.assertEqual(sale_invoice_transaction_count,
len(accounting_module.objectValues(
portal_type=portal_type_list)))
def stepModifyInvoicesDate(self, sequence=None,
sequence_list=None, **kw):
"""Change invoice date"""
invoice = sequence.get('invoice')
new_invoice = sequence.get('new_invoice')
invoice.edit(start_date=self.datetime,
stop_date=self.datetime+1)
new_invoice.edit(start_date=self.datetime,
stop_date=self.datetime+1)
def stepEditInvoice(self, sequence=None, sequence_list=None, **kw):
"""Edit the current invoice, to trigger updateSimulation."""
invoice = sequence.get('invoice')
invoice.edit(description='This invoice was edited!')
def stepCheckInvoiceRuleNotAppliedOnInvoiceEdit(self,
sequence=None, sequence_list=None, **kw):
"""If we call edit on the invoice, invoice rule should not be
applied on lines created by delivery builder."""
invoice = sequence.get('invoice')
self.assertEqual([], invoice.getCausalityRelatedValueList())
def stepEditPackingList(self, sequence=None, sequence_list=None, **kw):
"""Edit the current packing list, to trigger updateSimulation."""
packing_list = sequence.get('packing_list')
packing_list.edit(description='This packing list was edited!')
def stepAcceptDecisionDescriptionPackingList(self,sequence=None, sequence_list=None):
packing_list = sequence.get('packing_list')
self._solveDivergence(packing_list, 'description', 'Accept Solver')
def stepAssertCausalityStateIsNotSolvedInConsistencyMessage(self,
sequence=None, sequence_list=None, **kw):
packing_list = sequence.get('packing_list')
self.assertEqual(
['Causality State is not "Solved". Please wait or take action'
+ ' for causality state to reach "Solved".'],
[str(message.message) for message in packing_list.checkConsistency()])
def stepSetReadyWorkflowTransitionIsBlockByConsistency(self,
sequence=None, sequence_list=None, **kw):
packing_list = sequence.get('packing_list')
with self.assertRaisesRegexp(ValidationFailed,
'.*Causality State is not "Solved"*'):
self.getPortal().portal_workflow.doActionFor(
packing_list, 'set_ready_action')
def stepCheckDeliveryRuleNotAppliedOnPackingListEdit(self,
sequence=None, sequence_list=None, **kw):
"""If we call edit on the packing list, delivery rule should not be
applied on lines created by delivery builder."""
packing_list = sequence.get('packing_list')
self.assertEqual([], packing_list.getCausalityRelatedValueList())
def stepDecreaseInvoiceLineQuantity(self, sequence=None, sequence_list=None,
**kw):
"""
Set a decreased quantity on invoice lines
"""
invoice = sequence.get('invoice')
quantity = sequence.get('line_quantity',default=self.default_quantity)
quantity = quantity - 1
sequence.edit(line_quantity=quantity)
for invoice_line in invoice.objectValues(
portal_type=self.invoice_line_portal_type):
invoice_line.edit(quantity=quantity)
sequence.edit(last_delta = sequence.get('last_delta', 0.0) - 1.0)
def stepIncreaseInvoiceLineQuantity(self, sequence=None, sequence_list=None,
**kw):
"""
Set a Increased quantity on invoice lines
"""
invoice = sequence.get('invoice')
quantity = sequence.get('line_quantity',default=self.default_quantity)
quantity = quantity + 1
sequence.edit(line_quantity=quantity)
for invoice_line in invoice.objectValues(
portal_type=self.invoice_line_portal_type):
invoice_line.edit(quantity=quantity)
sequence.edit(last_delta = sequence.get('last_delta', 0.0) + 1.0)
def stepSetInvoiceLineQuantityToZero(self, sequence=None, sequence_list=None,
**kw):
"""
Set the quantity on invoice lines to zero
"""
invoice = sequence.get('invoice')
#default_quantity = sequence.get('line_quantity',default_quantity)
quantity = 0.0
sequence.edit(line_quantity=quantity)
for invoice_line in invoice.objectValues(
portal_type=self.invoice_line_portal_type):
invoice_line.edit(quantity=quantity)
sequence.edit(last_delta = - self.default_quantity)
def stepChangeInvoiceStartDate(self, sequence=None, sequence_list=None, **kw):
"""
Change the start_date of the invoice.
"""
invoice = sequence.get('invoice')
invoice.edit(start_date=self.datetime + 15)
def stepCheckInvoiceIsCalculating(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is calculating
"""
invoice = sequence.get('invoice')
self.assertEqual('calculating',invoice.getCausalityState())
def stepCheckInvoiceIsDiverged(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is diverged
"""
invoice = sequence.get('invoice')
self.assertEqual('diverged',invoice.getCausalityState())
def stepCheckInvoiceIsSolved(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is solved
"""
invoice = sequence.get('invoice')
self.assertEqual('solved', invoice.getCausalityState(),
invoice.getDivergenceList())
def stepCheckInvoiceIsDivergent(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is divergent
"""
invoice = sequence.get('invoice')
self.assertTrue(invoice.isDivergent())
def stepCheckInvoiceIsNotDivergent(self, sequence=None, sequence_list=None,
**kw):
"""
Test if invoice is not divergent
"""
invoice = sequence.get('invoice')
if invoice.isDivergent():
self.fail(invoice.getDivergenceList())
def stepSplitAndDeferInvoice(self, sequence=None, sequence_list=None,
**kw):
invoice = sequence.get('invoice')
solver_process = self.portal.portal_solver_processes.newSolverProcess(invoice)
quantity_solver_decision, = [x for x in solver_process.contentValues()
if x.getCausalityValue().getTestedProperty() == 'quantity']
# use Quantity Split Solver.
quantity_solver_decision.setSolverValue(self.portal.portal_solvers['Quantity Split Solver'])
# configure for Quantity Split Solver.
kw = {'delivery_solver':'FIFO Delivery Solver',
'start_date':self.datetime + 15,
'stop_date':self.datetime + 25}
quantity_solver_decision.updateConfiguration(**kw)
solver_process.buildTargetSolverList()
solver_process.solve()
def stepUnifyStartDateWithDecisionInvoice(self, sequence=None,
sequence_list=None):
invoice = sequence.get('invoice')
self._solveDivergence(invoice, 'start_date', 'Unify Solver',
value=invoice.getStartDate())
def stepAdoptPrevisionQuantityInvoice(self,sequence=None, sequence_list=None):
invoice = sequence.get('invoice')
self._solveDivergence(invoice, 'quantity', 'Adopt Solver')
def stepAcceptDecisionQuantityInvoice(self,sequence=None, sequence_list=None):
invoice = sequence.get('invoice')
self._solveDivergence(invoice, 'quantity', 'Accept Solver')
def stepAcceptDecisionInvoice(self, sequence=None, sequence_list=None,
**kw):
"""
accept decision at the invoice level
"""
invoice = sequence.get('invoice')
invoice.portal_workflow.doActionFor(invoice,'accept_decision_action')
def stepCheckInvoiceSplitted(self, sequence=None, sequence_list=None, **kw):
"""
Test if invoice was splitted
"""
packing_list = sequence.get('packing_list')
invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
self.assertEqual(2,len(invoice_list))
invoice1 = None
invoice2 = None
for invoice in invoice_list:
if invoice.getUid() == sequence.get('invoice').getUid():
invoice1 = invoice
else:
invoice2 = invoice
sequence.edit(new_invoice=invoice2)
for line in invoice1.objectValues(
portal_type=self.invoice_line_portal_type):
self.assertEqual(self.default_quantity-1,line.getQuantity())
for line in invoice2.objectValues(
portal_type=self.invoice_line_portal_type):
self.assertEqual(1,line.getQuantity())
def stepCheckInvoiceNotSplitted(self, sequence=None, sequence_list=None, **kw):
"""
Test if invoice was not splitted
"""
packing_list = sequence.get('packing_list')
invoice_list = packing_list.getCausalityRelatedValueList(
portal_type=self.invoice_portal_type)
self.assertEqual(1,len(invoice_list))
invoice1 = None
for invoice in invoice_list:
if invoice.getUid() == sequence.get('invoice').getUid():
invoice1 = invoice
last_delta = sequence.get('last_delta', 0.0)
for line in invoice1.objectValues(
portal_type=self.invoice_line_portal_type):
self.assertEqual(self.default_quantity + last_delta,
line.getQuantity())
def stepAddInvoiceLines(self, sequence=None, sequence_list=[]):
"""
add some invoice and accounting lines to the invoice
"""
invoice = sequence.get('invoice')
invoice.newContent(portal_type='Invoice Line',
resource_value=sequence.get('resource'), quantity=3, price=555)
invoice.newContent(portal_type='Sale Invoice Transaction Line',
id ='receivable', source='account_module/customer',
destination='account_module/supplier', quantity=-1665)
invoice.newContent(portal_type='Sale Invoice Transaction Line',
id='income', source='account_module/sale',
destination='account_module/purchase', quantity=1665)
def stepAddWrongInvoiceLines(self, sequence=None, sequence_list=[]):
"""
add some wrong invoice and accounting lines to the invoice
"""
invoice = sequence.get('invoice')
invoice.newContent(portal_type='Sale Invoice Transaction Line',
id='bad_movement', source='account_module/sale',
destination='account_module/purchase', quantity=2, price=4)
invoice.newContent(portal_type='Sale Invoice Transaction Line',
id='counter_bad_movement', source='account_module/sale',
destination='account_module/purchase', quantity=-2, price=4)
for movement in invoice.getMovementList():
movement.edit(resource_value=sequence.get('resource'))
def stepCheckStartInvoiceFail(self, sequence=None, sequence_list=[]):
"""
checks that it's not possible to start an invoice with really wrong
lines
"""
try:
self.tic()
except RuntimeError, exc:
invoice = sequence.get('invoice')
# check which activities are failing
self.assertTrue(str(exc).startswith('tic is looping forever.'),
'%s does not start with "tic is looping forever."' % str(exc))
msg_list = [('/'.join(x.object_path), x.method_id)
for x in self.getActivityTool().getMessageList()]
self.assertTrue((invoice.getPath(), '_localBuild') in msg_list, msg_list)
# flush failing activities
activity_tool = self.getActivityTool()
activity_tool.manageClearActivities(keep=0)
else:
self.fail("Error: stepStartInvoice didn't fail, the builder script"
+ " InvoiceTransaction_postTransactionLineGeneration should have"
+ " complained that accounting movements use multiple resources")
def stepCheckSimulationTrees(self, sequence=None, sequence_list=[]):
"""
check that rules are created in the order we expect them
"""
applied_rule_set = set()
invoice = sequence.get('invoice')
for movement in invoice.getMovementList():
for sm in movement.getDeliveryRelatedValueList():
applied_rule_set.add(sm.getRootAppliedRule())
rule_dict = {
'Order Root Simulation Rule': {
'movement_type_list': ['Sale Order Line', 'Sale Order Cell'],
'next_rule_list': ['Delivery Simulation Rule', ],
},
'Delivery Simulation Rule': {
'movement_type_list': ['Sale Packing List Line', 'Sale Packing List Cell'],
'next_rule_list': ['Invoice Simulation Rule', ],
},
'Invoice Simulation Rule': {
'movement_type_list': invoice.getPortalInvoiceMovementTypeList(),
'next_rule_list': ['Invoice Transaction Simulation Rule', 'Trade Model Simulation Rule'],
},
'Trade Model Simulation Rule': {
'next_rule_list': ['Invoice Transaction Simulation Rule'],
},
'Invoice Simulation Rule': {
'movement_type_list': invoice.getPortalInvoiceMovementTypeList() \
+ invoice.getPortalAccountingMovementTypeList(),
'next_rule_list': ['Invoice Transaction Simulation Rule', 'Payment Simulation Rule',
'Trade Model Simulation Rule'],
},
'Invoice Transaction Simulation Rule': {
'parent_movement_type_list': invoice.getPortalInvoiceMovementTypeList(),
'movement_type_list': invoice.getPortalAccountingMovementTypeList(),
'next_rule_list': ['Payment Simulation Rule'],
},
'Payment Simulation Rule': {
'parent_movement_type_list': invoice.getPortalAccountingMovementTypeList(),
'next_rule_list': [],
},
}
def checkTree(rule):
"""
checks the tree recursively
"""
rule_type = rule.getSpecialiseValue().getPortalType()
rule_def = rule_dict.get(rule_type, {})
for k, v in rule_def.iteritems():
if k == 'movement_type_list':
for movement in rule.objectValues():
if movement.getDeliveryValue() is not None:
self.assertTrue(movement.getDeliveryValue().getPortalType() in v,
'looking for %s in %s on %s' % (
movement.getDeliveryValue().getPortalType(), v,
movement.getPath()))
elif k == 'next_rule_list':
for movement in rule.objectValues():
found_rule_dict = {}
for next_rule in movement.objectValues():
next_rule_type = next_rule.getSpecialiseValue().getPortalType()
self.assertTrue(next_rule_type in v,
'looking for %s in %s on %s' % (
next_rule_type, v, next_rule.getPath()))
n = found_rule_dict.get(next_rule_type, 0)
found_rule_dict[next_rule_type] = n + 1
# for each movement, we want to make sure that each rule is not
# instanciated more than once
if len(found_rule_dict):
self.assertEqual(set(found_rule_dict.itervalues()), {1})
elif k == 'parent_movement_type_list':
if rule.getParentValue().getDeliveryValue() is not None:
parent_type = rule.getParentValue().getDeliveryValue().getPortalType()
self.assertTrue(parent_type in v, 'looking for %s in %s on %s' % (
parent_type, v, rule.getParentValue().getPath()))
elif k == 'parent_id_list':
self.assertTrue(rule.getParentId() in v, 'looking for %s in %s on %s'
% (rule.getParentId(), v, rule.getPath()))
for movement in rule.objectValues():
for next_rule in movement.objectValues():
checkTree(next_rule)
for applied_rule in applied_rule_set:
checkTree(applied_rule)
def stepAddInvoiceLinesManyTransactions(self, sequence=None, sequence_list=[]):
"""
add some invoice and accounting lines to the invoice
"""
invoice = sequence.get('invoice')
invoice_line = invoice.newContent(portal_type='Invoice Line')
transaction_line_1 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
transaction_line_2 = invoice.newContent(portal_type='Sale Invoice Transaction Line')
self.tic()
invoice_line.edit(resource_value=sequence.get('resource'), quantity=3,
price=555)
transaction_line_1.edit(id ='receivable', source='account_module/customer',
destination='account_module/supplier', quantity=-1665)
transaction_line_2.edit(
id='income', source='account_module/sale',
destination='account_module/purchase', quantity=1665)
def stepInvoiceBuilderAlarm(self, sequence=None,
sequence_list=None, **kw):
self.portal.portal_alarms.invoice_builder_alarm.activeSense()
from erp5.component.module.TestInvoiceMixin import TestInvoiceMixin, TestSaleInvoiceMixin
class TestInvoice(TestInvoiceMixin):
"""Test methods for sale and purchase invoice.
......@@ -1162,7 +82,7 @@ class TestInvoice(TestInvoiceMixin):
start_date=DateTime(2008, 1, 1),
price_currency_value=currency,
title='Order')
order_line = order.newContent(portal_type=self.order_line_portal_type,
order.newContent(portal_type=self.order_line_portal_type,
resource_value=resource,
quantity=1,
price=2)
......@@ -1594,42 +514,42 @@ class TestInvoice(TestInvoiceMixin):
source_section_value=vendor,
destination_value=client,
destination_section_value=client)
product_line1 = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource,
quantity=10,
base_contribution='base_amount/tax1',
price=3)
product_line2 = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource,
quantity=20,
base_contribution='base_amount/tax1',
price=5)
product_line3 = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource,
quantity=60,
base_contribution='base_amount/tax2',
price=5)
product_line4 = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource,
quantity=60,
price=3)
product_line5 = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource,
quantity=7,
price=20)
tax_line1 = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource_tax,
use='trade/tax',
base_contribution='base_amount/tax1',
quantity=130,
price=0.2)
tax_line2 = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource_tax,
use='trade/tax',
base_contribution='base_amount/tax2',
quantity=300,
price=0.05)
tax_line3 = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource_tax,
use='trade/tax',
base_contribution='base_amount/tax3',
......@@ -1679,7 +599,7 @@ class TestInvoice(TestInvoiceMixin):
title='Resource',)
client = self.portal.organisation_module.newContent(
portal_type='Organisation', title='Client')
client_logo = client.newContent(portal_type='Embedded File',
client.newContent(portal_type='Embedded File',
id='default_image')
vendor = self.portal.organisation_module.newContent(
portal_type='Organisation', title='Vendor')
......@@ -1697,7 +617,7 @@ class TestInvoice(TestInvoiceMixin):
source_section_value=vendor,
destination_value=client,
destination_section_value=client)
line = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource,
quantity=10,
price=3)
......@@ -1722,15 +642,16 @@ class TestInvoice(TestInvoiceMixin):
self.resource_portal_type).newContent(
portal_type=self.resource_portal_type,
title='Resource',)
file_data = FileUpload(__file__)
import Products.ERP5Type
file_data = FileUpload(Products.ERP5Type.__file__)
client = self.portal.organisation_module.newContent(
portal_type='Organisation', title='Client')
client_logo = client.newContent(portal_type='Embedded File',
client.newContent(portal_type='Embedded File',
id='default_image',
file=file_data)
vendor = self.portal.organisation_module.newContent(
portal_type='Organisation', title='Vendor')
vendor_logo = vendor.newContent(portal_type='Embedded File',
vendor.newContent(portal_type='Embedded File',
id='default_image',
file=file_data)
......@@ -1748,7 +669,7 @@ class TestInvoice(TestInvoiceMixin):
source_section_value=vendor,
destination_value=client,
destination_section_value=client)
line = invoice.newContent(portal_type=self.invoice_line_portal_type,
invoice.newContent(portal_type=self.invoice_line_portal_type,
resource_value=resource,
quantity=10,
price=3)
......@@ -1770,7 +691,6 @@ class TestInvoice(TestInvoiceMixin):
).newContent(
portal_type=self.resource_portal_type,
title='Resource',)
file_data = FileUpload(__file__)
client = self.portal.organisation_module.newContent(
portal_type='Organisation',
title='Client')
......@@ -2229,7 +1149,7 @@ self.portal.getDefaultModule(self.packing_list_portal_type).newContent(
delivery_mode=self.mail_delivery_mode,
incoterm=self.cpt_incoterm,
title='Order')
order_line = order.newContent(portal_type=self.order_line_portal_type,
order.newContent(portal_type=self.order_line_portal_type,
resource_value=resource,
quantity=5,
price=2)
......@@ -2361,9 +1281,6 @@ self.portal.getDefaultModule(self.packing_list_portal_type).newContent(
sequence_list.play(self, quiet=quiet)
packing_list = sequence.get('packing_list')
packing_list_line = packing_list.getMovementList()[0]
previous_quantity = packing_list_line.getQuantity()
packing_list.setReady()
packing_list.start()
packing_list.stop()
......@@ -2577,124 +1494,6 @@ self.portal.getDefaultModule(self.packing_list_portal_type).newContent(
sale_invoice_brain, = self.portal.portal_catalog(uid=sale_invoice.getUid(), select_list=["specialise_trade_condition_title"], limit=1)
self.assertEqual(sale_invoice_brain.specialise_trade_condition_title, sale_trade_condition_title)
class TestSaleInvoiceMixin(TestInvoiceMixin,
ERP5TypeTestCase):
"""Test sale invoice are created from orders then packing lists.
Those tests methods only work for sale, because sale and purchase invoice
are not built at the same time on packing list workflow.
"""
quiet = 0
invoice_portal_type = 'Sale Invoice Transaction'
invoice_line_portal_type = 'Invoice Line'
invoice_cell_portal_type = 'Invoice Cell'
invoice_transaction_line_portal_type = 'Sale Invoice Transaction Line'
payment_portal_type = 'Payment Transaction'
# default sequence for one line of not varianted resource.
PACKING_LIST_DEFAULT_SEQUENCE = """
stepCreateEntities
stepCreateCurrency
stepCreateOrder
stepSetOrderProfile
stepSetOrderPriceCurrency
stepCreateNotVariatedResource
stepTic
stepCreateOrderLine
stepSetOrderLineResource
stepSetOrderLineDefaultValues
stepOrderOrder
stepTic
stepCheckDeliveryBuilding
stepConfirmOrder
stepTic
stepPackingListBuilderAlarm
stepTic
stepCheckOrderRule
stepCheckOrderSimulation
stepCheckDeliveryBuilding
stepAddPackingListContainer
stepAddPackingListContainerLine
stepSetContainerLineFullQuantity
stepTic
stepCheckPackingListIsPacked
"""
# default sequence for two lines of not varianted resource.
PACKING_LIST_TWO_LINES_DEFAULT_SEQUENCE = """
stepCreateEntities
stepCreateCurrency
stepCreateOrder
stepSetOrderProfile
stepSetOrderPriceCurrency
stepCreateNotVariatedResource
stepTic
stepCreateOrderLine
stepSetOrderLineResource
stepSetOrderLineDefaultValues
stepCreateNotVariatedResource
stepTic
stepCreateOrderLine
stepSetOrderLineResource
stepSetOrderLineDefaultValues
stepOrderOrder
stepTic
stepCheckDeliveryBuilding
stepConfirmOrder
stepTic
stepPackingListBuilderAlarm
stepTic
stepCheckOrderRule
stepCheckOrderSimulation
stepCheckDeliveryBuilding
stepAddPackingListContainer
stepAddPackingListContainerLine
stepTic
stepSetContainerFullQuantity
stepTic
stepCheckPackingListIsPacked
"""
# default sequence for one line of not varianted resource.
TWO_PACKING_LIST_DEFAULT_SEQUENCE = """
stepCreateEntities
stepCreateCurrency
stepCreateOrder
stepSetOrderProfile
stepSetOrderPriceCurrency
stepCreateNotVariatedResource
stepTic
stepCreateOrderLine
stepSetOrderLineResource
stepSetOrderLineDefaultValues
stepOrderOrder
stepTic
stepCheckDeliveryBuilding
stepConfirmOrder
stepTic
stepPackingListBuilderAlarm
stepTic
stepCheckOrderRule
stepCheckOrderSimulation
stepCheckDeliveryBuilding
stepDecreasePackingListLineQuantity
stepCheckPackingListIsCalculating
stepTic
stepCheckPackingListIsDiverged
stepSplitAndDeferPackingList
stepTic
stepCheckPackingListIsSolved
stepCheckPackingListSplitted
stepAddPackingListContainer
stepAddPackingListContainerLine
stepSetContainerLineFullQuantity
stepTic
stepCheckPackingListIsPacked
stepDefineNewPackingListContainer
stepTic
stepCheckNewPackingListIsPacked
"""
class TestSaleInvoice(TestSaleInvoiceMixin, TestInvoice, ERP5TypeTestCase):
"""Tests for sale invoice.
"""
......@@ -2755,9 +1554,9 @@ class TestSaleInvoice(TestSaleInvoiceMixin, TestInvoice, ERP5TypeTestCase):
title='Resource',
sale_supply_line_source_account="account_module/sale",
product_line='apparel')
product_line = invoice.newContent(portal_type="Invoice Line",
invoice.newContent(portal_type="Invoice Line",
resource_value=resource, quantity=1, price=0.014)
product_line = invoice.newContent(portal_type="Invoice Line",
invoice.newContent(portal_type="Invoice Line",
resource_value=resource, quantity=1, price=0.014)
self.tic()
invoice.plan()
......@@ -3671,9 +2470,6 @@ class TestSaleInvoice(TestSaleInvoiceMixin, TestInvoice, ERP5TypeTestCase):
sequence_list.play(self, quiet=quiet)
packing_list = sequence.get('packing_list')
packing_list_line = packing_list.getMovementList()[0]
previous_quantity = packing_list_line.getQuantity()
packing_list.setReady()
packing_list.start()
self.assertEqual('started', packing_list.getSimulationState())
......@@ -3811,26 +2607,26 @@ class TestPurchaseInvoice(TestInvoice, ERP5TypeTestCase):
"""
class OpenDocumentTextFile :
def __init__ (self, filelikeobj) :
zip = zipfile.ZipFile(filelikeobj)
self.content = xml.dom.minidom.parseString(zip.read("content.xml"))
def __init__ (self, filelikeobj):
with zipfile.ZipFile(filelikeobj) as z:
self.content = xml.dom.minidom.parseString(z.read("content.xml"))
def toString (self) :
""" Converts the document to a string. """
buffer = u""
buffer_ = u""
for val in ["text:p", "text:h", "text:list"]:
for paragraph in self.content.getElementsByTagName(val) :
buffer += self.textToString(paragraph) + "\n"
return buffer
buffer_ += self.textToString(paragraph) + "\n"
return buffer_
def textToString(self, element) :
buffer = u""
buffer_ = u""
for node in element.childNodes :
if node.nodeType == xml.dom.Node.TEXT_NODE :
buffer += node.nodeValue
buffer_ += node.nodeValue
elif node.nodeType == xml.dom.Node.ELEMENT_NODE :
buffer += self.textToString(node)
return buffer
buffer_ += self.textToString(node)
return buffer_
import unittest
def test_suite():
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</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>testInvoice</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testInvoice</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</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>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>component_validation_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
test.erp5.testDeliveryBuilderToSupportMultipleLines
test.erp5.testInvoice
\ No newline at end of file
erp5_full_text_mroonga_catalog
erp5_core_proxy_field_legacy
erp5_base
erp5_simulation
erp5_apparel
erp5_project
erp5_configurator_standard_solver
erp5_simulation_test_trade_template
erp5_simulation_test
erp5_administration
erp5_dummy_movement
erp5_configurator_standard_accounting_template
erp5_configurator_standard_invoicing_template
\ No newline at end of file
......@@ -29,7 +29,7 @@
import unittest
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.Sequence import Sequence
from Products.ERP5.tests.testPackingList import TestPackingListMixin
from erp5.component.test.testPackingList import TestPackingListMixin
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
class TestDivergenceTester(TestPackingListMixin, ERP5TypeTestCase):
......@@ -65,7 +65,7 @@ class TestDivergenceTester(TestPackingListMixin, ERP5TypeTestCase):
@UnrestrictedMethod
def stepResetDeliveringRule(self, sequence):
original_rule = rule = self.getDeliveringRule()
rule = self.getDeliveringRule()
self.assertEqual(rule.getId(), 'new_delivery_simulation_rule')
# We clone the rule and clean it up to be able to experiment with it
portal_rules = self.portal.portal_rules
......@@ -97,7 +97,6 @@ class TestDivergenceTester(TestPackingListMixin, ERP5TypeTestCase):
packing_list = sequence['packing_list']
# XXX-Leo can't we just use sequence['packing_list_line']?
movement = packing_list.getMovementList()[0]
rule = self.getDeliveringRule()
sequence.edit(
packing_list=packing_list,
movement=movement,
......@@ -108,7 +107,6 @@ class TestDivergenceTester(TestPackingListMixin, ERP5TypeTestCase):
"""
Modify the quantity of the delivery movement
"""
packing_list = sequence.get('packing_list')
movement = sequence.get('movement')
movement.setQuantity(movement.getQuantity()+1234)
......@@ -442,7 +440,6 @@ class TestDivergenceTester(TestPackingListMixin, ERP5TypeTestCase):
def stepSetNewPrice(self, sequence=None,
sequence_list=None, **kw):
packing_list = sequence.get('packing_list')
movement = sequence.get('movement')
movement.setPrice(movement.getPrice()+1234)
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testDivergenceTester</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testDivergenceTester</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testDivergenceTester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -32,7 +32,7 @@ This test is experimental for new simulation implementation.
from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase
from Products.ERP5Type.tests.Sequence import SequenceList
from testPackingList import TestPackingListMixin
from erp5.component.test.testPackingList import TestPackingListMixin
from Products.PythonScripts.Utility import allow_class
class DummySolverConfiguration(object):
......@@ -97,9 +97,9 @@ class TestERP5Simulation(TestPackingListMixin, SecurityTestCase):
solver_process_tool = self.portal.portal_solver_processes
solver_process = solver_process_tool.newSolverProcess(packing_list)
sequence.edit(solver_process=solver_process)
quantity_solver_decision = filter(
lambda x:x.getCausalityValue().getTestedProperty()=='quantity',
solver_process.contentValues())[0]
quantity_solver_decision = [
x for x in solver_process.contentValues()
if x.getCausalityValue().getTestedProperty()=='quantity'][0]
# use Quantity Split Solver.
quantity_solver_decision.setSolverValue(
self.portal.portal_solvers['Quantity Split Solver'])
......@@ -113,8 +113,6 @@ class TestERP5Simulation(TestPackingListMixin, SecurityTestCase):
# build split deliveries manually. XXX ad-hoc
previous_tag = None
for delivery_builder in packing_list.getBuilderList():
this_builder_tag = '%s_split_%s' % (packing_list.getPath(),
delivery_builder.getId())
after_tag = []
if previous_tag:
after_tag.append(previous_tag)
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testERP5Simulation</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testERP5Simulation</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testERP5Simulation</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -28,7 +28,7 @@
import unittest
from testPurchaseOrder import TestPurchaseOrder
from erp5.component.test.testPurchaseOrder import TestPurchaseOrder
class TestInternalOrder(TestPurchaseOrder):
"""
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testInternalOrder</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testInternalOrder</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testInternalOrder</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -50,7 +50,7 @@ from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from DateTime import DateTime
from zLOG import LOG
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testOrder import TestOrderMixin
from erp5.component.test.testOrder import TestOrderMixin
from Products.ERP5Form.Selection import DomainSelection
from Products.ERP5Type.tests.utils import createZODBPythonScript
from textwrap import dedent
......@@ -96,7 +96,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
preference.enable()
self.tic()
def afterSetUp(self, quiet=1, run=run_all_test):
def afterSetUp(self):
self.login()
self.category_tool = self.getCategoryTool()
self.createCategories()
......@@ -124,7 +124,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
def createCategory(self, parent, id_list):
last_category = None
for category_id in id_list:
if type(category_id) == type('a'):
if isinstance(category_id, str):
last_category = parent.newContent(portal_type='Category',
id=category_id)
else:
......@@ -245,7 +245,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
inventory = self.createInventory(sequence=sequence)
inventory_list = sequence.get('inventory_list',[])
inventory.edit(full_inventory=True)
inventory_line = inventory.newContent(
inventory.newContent(
portal_type = self.inventory_line_portal_type,
resource_value = sequence.get("second_resource"),
inventory = 101)
......@@ -260,7 +260,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
inventory = self.createInventory(sequence=sequence)
inventory_list = sequence.get('inventory_list',[])
inventory.edit(full_inventory=False)
inventory_line = inventory.newContent(
inventory.newContent(
portal_type = self.inventory_line_portal_type,
resource_value = sequence.get("second_resource"),
inventory = 101)
......@@ -272,7 +272,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test partial inventory behavior with multiple resource
"""
inventory_list = sequence.get('inventory_list')
simulation = self.getPortal().portal_simulation
# First resource, must not have changed
......@@ -353,7 +352,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
section = sequence.get('section')
mirror_node = sequence.get('mirror_node')
mirror_section = sequence.get('mirror_section')
resource = sequence.get('resource')
packing_list_module = self.getPortal().getDefaultModule(
portal_type=self.packing_list_portal_type)
packing_list = packing_list_module.newContent(
......@@ -478,7 +476,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
- node 9
"""
organisation_list = []
for i in range(10):
for _ in range(10):
self.stepCreateOrganisation(sequence=sequence, sequence_list=sequence_list, **kw)
organisation_list.append(sequence.get('organisation'))
......@@ -500,7 +498,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
Create some variated resources to manipulate during the test
"""
resource_list = []
for i in range(3):
for _ in range(3):
self.stepCreateVariatedResource(sequence=sequence, sequence_list=sequence_list, **kw)
resource_list.append(sequence.get('resource'))
sequence.edit(
......@@ -647,7 +645,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
delivery_line_list = []
organisation_list = sequence.get('organisation_list')
resource_list = sequence.get('resource_list')
order = sequence.get('order')
packing_list_module = self.getPortal().getDefaultModule(self.packing_list_portal_type)
for data in data_list:
......@@ -662,7 +659,8 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
[x for x in data.items() if x[0] in ('start_date',)]
property_dict = {}
property_dict['price_currency'] = self.price_currency
for (id, value) in property_list: property_dict[id] = value
for (id_, value) in property_list:
property_dict[id_] = value
packing_list.edit(**property_dict)
for line in data['lines']:
# Create Packing List Line
......@@ -920,7 +918,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
"""
simulation = self.getPortal().portal_simulation
delivery = sequence.get('packing_list_list')[0]
expected_values_list = [
{'text':delivery['1']['movement_0_0_0'],
......@@ -1113,7 +1110,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test getInventory with a section_category argument
"""
organisation_list = sequence.get('organisation_list')
expected_values_list = [
{'id':'testing_category/a/aa', 'values':[{'inventory':274.5},] },
{'id':'testing_category/z/zc', 'values':[{'inventory':152.},] },
......@@ -1135,7 +1131,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test getInventory with a payment_category argument
"""
organisation_list = sequence.get('organisation_list')
expected_values_list = [
{'id':'testing_category/a/aa', 'values':[{'inventory':274.5},] },
{'id':'testing_category/z/zc', 'values':[{'inventory':-426.5},] },
......@@ -1157,7 +1152,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test getInventory with a node_category argument
"""
organisation_list = sequence.get('organisation_list')
expected_values_list = [
{'id':'testing_category/z/zb/zba', 'values':[{'inventory':162.},] },
{'id':'testing_category/z/zb/zbb', 'values':[{'inventory':112.5},] },
......@@ -1178,7 +1172,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test getInventory with a section_category argument
"""
organisation_list = sequence.get('organisation_list')
expected_values_list = [
{'id':'testing_category/a/aa', 'values':[{'inventory':-274.5},] },
{'id':'testing_category/z/zc', 'values':[{'inventory':-152.},] },
......@@ -1308,7 +1301,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
if method is None:
LOG('TEST ERROR : Simulation Tool has no %s method'
% method_name, 0, '')
self.assertTrue(0)
raise AssertionError
a_inventory = method(section=organisation_url,
omit_transit=omit_transit,
transit_simulation_state=transit_simulation_state,
......@@ -1705,12 +1698,12 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
if not hasattr(inventory, attr):
LOG('TEST ERROR : Result of getInventoryList has no %s attribute' % attr, 0, '')
LOG('SQL Query was : ', 0, repr(simulation.getInventoryList(src__=1, **kw)))
self.assertTrue(0)
raise RuntimeError
a_attributes[attr] = getattr(inventory, attr)
a_inventory = inventory.inventory
# Build a function to filter on attributes
def cmpfunction(item):
for (key, value) in a_attributes.items():
for (key, value) in a_attributes.items(): # pylint: disable=cell-var-from-loop
if item[key] != value:
return 0
return 1
......@@ -1722,7 +1715,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
expected_list.append(dict(exp))
expected_list[-1].update({'id':i})
# Now, look in these lines for one which has the same inventory
found_list = filter(lambda x:x['inventory'] == a_inventory, expected_list)
found_list = [x for x in expected_list if x['inventory'] == a_inventory]
if len(found_list) == 0:
LOG('TEST ERROR : Found a line with getInventoryList which is not expected.', 0, 'Found line : %s (inventory : %s) ; expected values with these attributes : %s' % (a_attributes, a_inventory, expected_list))
LOG('SQL Query was : ', 0, repr(simulation.getInventoryList(src__=1, **kw)))
......@@ -1757,7 +1750,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test Inventory Module behavior
"""
resource = sequence.get('resource')
variation_category_list = sequence.get('variation_1')
quantity = 1
self.checkVariatedInventory(variation_category_list=variation_category_list,
......@@ -1771,7 +1763,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test Inventory Module behavior
"""
resource = sequence.get('resource')
variation_category_list = sequence.get('variation_1')
quantity = 100
self.checkVariatedInventory(variation_category_list=variation_category_list,
......@@ -1785,7 +1776,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test Inventory Module behavior
"""
resource = sequence.get('resource')
variation_category_list = sequence.get('variation_1')
quantity = 5
self.checkVariatedInventory(variation_category_list=variation_category_list,
......@@ -1799,7 +1789,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test Inventory Module behavior
"""
resource = sequence.get('resource')
variation_category_list = sequence.get('variation_1')
quantity = 5
self.checkVariatedInventory(variation_category_list=variation_category_list,
......@@ -1813,7 +1802,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test full inventory with variated resource
"""
resource = sequence.get('resource')
variation_category_list = sequence.get('variation_1')
# Test first resource
quantity = 55
......@@ -1862,7 +1850,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Test Full inventory behavior
"""
inventory_list = sequence.get('inventory_list')
sequence.get('inventory_list')
simulation = self.getPortal().portal_simulation
# First resource, must be zero
......@@ -1935,27 +1923,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
resource_value.setProductLine('level1/level2')
sequence.edit(first_resource=resource_value)
def stepCreateTwoResourceFullInventory(self,
sequence=None,
sequence_list=None,
**kw):
""" Create a full Inventory which includes two inventory lines """
inventory = self.createInventory(sequence=sequence)
inventory_list = sequence.get('inventory_list',[])
inventory.edit(full_inventory=True)
inventory_line = inventory.newContent(
portal_type = self.inventory_line_portal_type,
resource_value = sequence.get("first_resource"),
inventory = 10)
inventory_line = inventory.newContent(
portal_type = self.inventory_line_portal_type,
resource_value = sequence.get("second_resource"),
inventory = 100)
inventory.deliver()
inventory_list.append(inventory)
sequence.edit(inventory_list=inventory_list)
def stepTestFullInventoryWithResourceCategory(self,
sequence=None,
sequence_list=None,
......@@ -2035,7 +2002,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
Make sure that we can use section_category parameter with Full inventory.
"""
node = sequence.get('node')
section = sequence.get('section')
getInventory = self.getSimulationTool().getInventory
self.assertEqual(202, getInventory(node_uid=node.getUid()))
self.assertEqual(101, getInventory(section_category='group/level1/level2',
......@@ -2065,7 +2031,6 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
"""
Make sure that we can use node_category parameter with Full inventory.
"""
node = sequence.get('node')
section = sequence.get('section')
getInventory = self.getSimulationTool().getInventory
self.assertEqual(202, getInventory(section_uid=section.getUid()))
......@@ -2097,7 +2062,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
destination_section_value=sequence.get('section'),
destination_value=destination_value,
start_date=start_date)
inventory_line = inventory.newContent(
inventory.newContent(
portal_type = self.inventory_line_portal_type,
resource_value = resource_value,
inventory = 100)
......@@ -2301,7 +2266,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
inventory = self.createInventory(sequence=sequence,
full=False, start_date=start_date)
inventory_list = sequence.get('inventory_list',[])
inventory_line = inventory.newContent(
inventory.newContent(
portal_type=self.inventory_line_portal_type,
resource_value=resource_value,
inventory=inventory_quantity)
......@@ -2416,11 +2381,11 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
inventory = self.createInventory(sequence=sequence)
inventory_list = sequence.get('inventory_list',[])
inventory.edit(full_inventory=True)
inventory_line = inventory.newContent(
inventory.newContent(
portal_type = self.inventory_line_portal_type,
resource_value = sequence.get("first_resource"),
inventory = 10)
inventory_line = inventory.newContent(
inventory.newContent(
portal_type = self.inventory_line_portal_type,
resource_value = sequence.get("second_resource"),
inventory = 100)
......@@ -2439,7 +2404,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
if kw.get('inventory1', None) is not None:
inventory1 = kw['inventory1']
else:
inventory_1 = 10
inventory1 = 10
if kw.get('inventory2', None) is not None:
inventory2 = kw['inventory2']
else:
......@@ -2449,11 +2414,11 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
inventory_list = sequence.get('inventory_list',[])
inventory.edit(full_inventory=True,
start_date=start_date)
inventory_line = inventory.newContent(
inventory.newContent(
portal_type = self.inventory_line_portal_type,
resource_value = sequence.get("resource"),
inventory = inventory1)
inventory_line = inventory.newContent(
inventory.newContent(
portal_type = self.inventory_line_portal_type,
resource_value = sequence.get("second_resource"),
inventory = inventory2)
......@@ -2558,7 +2523,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
to_date=DateTime(self.two_resource_full_inventory2_start_date)
self.getPortalObject().portal_simulation.getCurrentInventoryList(
to_date=to_date,
section=section_value.getRelativeUrl(),
section=section_value.getRelativeUrl(), # pylint: disable=undefined-variable
node=node_value.getRelativeUrl(),
group_by_variation=1,
group_by_sub_variation=1,
......@@ -3279,7 +3244,7 @@ class TestInventory(TestOrderMixin, ERP5TypeTestCase):
def test_15_FullInventoryCanCreatesManyVirtualCompensationMovement(self, quiet=0, run=run_all_test):
organisation = self.portal.organisation_module.newContent(portal_type='Organisation')
resource_value_list = []
for i in range(2000):
for _ in range(2000):
resource_value_list.append(self.portal.product_module.newContent(portal_type='Product'))
self.commit()
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testInventory</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testInventory</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testInventory</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -30,7 +30,7 @@ import unittest
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from DateTime import DateTime
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testOrder import TestOrderMixin
from erp5.component.test.testOrder import TestOrderMixin
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
......@@ -275,7 +275,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
We will put default values for an inventory
"""
date = DateTime(self.first_date_string)
inventory = self.createInventory(start_date=date,sequence=sequence)
self.createInventory(start_date=date,sequence=sequence)
quantity = self.default_quantity
self.createVariatedInventoryLine(start_date=date,
sequence=sequence, quantity=quantity)
......@@ -286,7 +286,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
We will put default values for an inventory
"""
date = DateTime(self.second_date_string)
inventory = self.createInventory(start_date=date,sequence=sequence)
self.createInventory(start_date=date,sequence=sequence)
quantity = self.default_quantity - 10
self.createVariatedInventoryLine(start_date=date,
sequence=sequence, quantity=quantity)
......@@ -392,7 +392,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
- size/Child/34 100 item1,item2
"""
date = DateTime(self.first_date_string)
inventory = self.createInventory(start_date=date,sequence=sequence)
self.createInventory(start_date=date,sequence=sequence)
quantity = self.default_quantity
self.createVariatedInventoryLine(start_date=date,
sequence=sequence, quantity=quantity)
......@@ -464,7 +464,7 @@ class TestInventoryModule(TestOrderMixin, ERP5TypeTestCase):
- size/Child/34 90 item1
"""
date = DateTime(self.second_date_string)
inventory = self.createInventory(start_date=date,sequence=sequence)
self.createInventory(start_date=date,sequence=sequence)
quantity = self.default_quantity - 10
item_list = sequence.get('item_list')
self.createVariatedInventoryLine(start_date=date,
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testInventoryModule</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testInventoryModule</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testInventoryModule</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -30,8 +30,7 @@ import unittest
from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase
from DateTime import DateTime
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testOrder import TestOrderMixin
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
from erp5.component.test.testOrder import TestOrderMixin
class TestInventoryReportModule(TestOrderMixin, SecurityTestCase):
"""
......@@ -45,7 +44,6 @@ class TestInventoryReportModule(TestOrderMixin, SecurityTestCase):
"""
return super(TestInventoryReportModule, self).getBusinessTemplateList() + ('erp5_accounting', 'erp5_mrp',)
def getTitle(self):
return "Inventory Report Module"
......@@ -858,5 +856,5 @@ class TestInventoryReportModule(TestOrderMixin, SecurityTestCase):
def _test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestInventoryModule))
suite.addTest(unittest.makeSuite(TestInventoryReportModule))
return suite
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testInventoryReportModule</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testInventoryReportModule</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testInventoryReportModule</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -39,7 +39,8 @@ from DateTime import DateTime
from zLOG import LOG
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
from Products.CMFCore.utils import getToolByName
import Products.ERP5.tests
class TestOrderMixin(SubcontentReindexingWrapper):
......@@ -106,7 +107,7 @@ class TestOrderMixin(SubcontentReindexingWrapper):
self.createUser('manager', ['Manager'])
self.loginByUserName('manager')
self.category_tool = self.getCategoryTool()
portal_catalog = self.getCatalogTool()
#portal_catalog = self.getCatalogTool()
#portal_catalog.manage_catalogClear()
self.createCategories()
self.validateRules()
......@@ -138,30 +139,30 @@ class TestOrderMixin(SubcontentReindexingWrapper):
size_category_list = ['Baby', 'Child', 'Man', 'Woman']
if len(category_tool.size.contentValues()) == 0 :
for category_id in size_category_list:
o = category_tool.size.newContent(portal_type='Category',
category_tool.size.newContent(portal_type='Category',
id=category_id)
for category_id in ['32', '34']:
o = category_tool.size.Child.newContent(portal_type='Category',
category_tool.size.Child.newContent(portal_type='Category',
id=category_id)
colour_category_list = ['blue', 'green']
if len(category_tool.colour.contentValues()) == 0 :
for category_id in colour_category_list:
o = category_tool.colour.newContent(portal_type='Category',
category_tool.colour.newContent(portal_type='Category',
id=category_id)
industrial_phase_category_list = ['phase1', 'phase2',
'supply_phase1', 'supply_phase2']
if len(category_tool.industrial_phase.contentValues()) == 0:
for category_id in industrial_phase_category_list:
o = category_tool.industrial_phase.newContent(
category_tool.industrial_phase.newContent(
portal_type='Category',
id=category_id)
product_line_category_list = ['apparel', 'cancel']
if len(category_tool.product_line.contentValues()) == 0:
for category_id in product_line_category_list:
o = category_tool.product_line.newContent(
category_tool.product_line.newContent(
portal_type='Category',
id=category_id)
......@@ -311,7 +312,7 @@ class TestOrderMixin(SubcontentReindexingWrapper):
portal_type=organisation_portal_type)
organisation = organisation_module.newContent( \
portal_type=organisation_portal_type)
bank_account = organisation.newContent(id='bank',
organisation.newContent(id='bank',
portal_type='Bank Account',
title='bank%s' % organisation.getId())
organisation.setDefaultAddressStreetAddress('rue xv')
......@@ -420,7 +421,7 @@ class TestOrderMixin(SubcontentReindexingWrapper):
Check if the matrix of the current order line is empty.
"""
order_line = sequence.get('order_line')
base_id = 'movement'
# base_id = 'movement'
# vcl = list(order_line.getVariationCategoryList())
# cell_key_list = order_line.getCellKeyList(base_id=base_id)
cell_list = order_line.objectValues(portal_type=self.order_cell_portal_type)
......@@ -450,22 +451,21 @@ class TestOrderMixin(SubcontentReindexingWrapper):
"""
order_line = sequence.get('order_line')
cell_list = order_line.objectValues(portal_type=self.order_cell_portal_type)
order_line.deleteContent( map(lambda x: x.getId(), cell_list) )
order_line.deleteContent([x.getId() for x in cell_list])
def stepSetOrderLineEmptyVCL(self,sequence=None, sequence_list=None, **kw):
"""
Delete the current order line's variation category list
"""
order_line = sequence.get('order_line')
resource = sequence.get('resource')
order_line.setVariationCategoryList([])
def splitList(self, list):
def splitList(self, l):
"""
Split a list and return tuple with the 2 half
"""
middle = len(list)/2 + len(list)%2
return ( list[:middle] , list[middle:] )
middle = len(l)/2 + len(l)%2
return ( l[:middle] , l[middle:] )
def stepSetOrderLineHalfVCL(self,sequence=None, sequence_list=None, **kw):
"""
......@@ -509,13 +509,13 @@ class TestOrderMixin(SubcontentReindexingWrapper):
cell_range = order_line.OrderLine_asCellRange(matrixbox=0)
l = len(vcl)
s = sum(map(lambda x: len(x), cell_range))
s = sum([len(x) for x in cell_range])
self.assertEqual(l,s)
cell_key_list = order_line.getCellKeyList(base_id=base_id)
if cell_range == []:
self.assertEqual(len(cell_key_list), 0)
else:
len_range = map(lambda x: len(x), cell_range)
len_range = [len(x) for x in cell_range]
self.assertEqual(len(cell_key_list), reduce(lambda x,y: x*y, len_range))
def stepCompleteOrderLineMatrix(self,sequence=None, sequence_list=None, \
......@@ -550,8 +550,8 @@ class TestOrderMixin(SubcontentReindexingWrapper):
cell_key_list.sort()
cell_list = order_line.objectValues(portal_type=self.order_cell_portal_type)
self.assertEqual(len(cell_list), len(cell_key_list))
price = 100
quantity = 200
# price = 100
# quantity = 200
for cell_key in cell_key_list:
self.assertTrue(order_line.hasCell(base_id=base_id, *cell_key))
cell = order_line.getCell(base_id=base_id, *cell_key)
......@@ -561,8 +561,8 @@ class TestOrderMixin(SubcontentReindexingWrapper):
# self.assertEqual(quantity, cell.getProperty('quantity'))
# self.failIfDifferentSet(cell.getMembershipCriterionCategoryList(),
# cell_key)
price += 1
quantity += 1
# price += 1
# quantity += 1
def stepCheckOrderLineVRCL(self, sequence=None, sequence_list=None, **kw):
"""
......@@ -586,7 +586,7 @@ class TestOrderMixin(SubcontentReindexingWrapper):
order_line = sequence.get('order_line')
vrcl = order_line.getVariationRangeCategoryList()
vrcil = order_line.getVariationRangeCategoryItemList()
self.failIfDifferentSet(vrcl, map(lambda x: x[1], vrcil))
self.failIfDifferentSet(vrcl, [x[1] for x in vrcil])
def stepSetOrderLineDefaultValues(self, sequence=None, \
sequence_list=None, **kw):
......@@ -715,7 +715,7 @@ class TestOrderMixin(SubcontentReindexingWrapper):
order = sequence.get('order')
order_line_list = order.objectValues( \
portal_type=self.order_line_portal_type)
order_line_list = map(lambda x: x.getObject(), order_line_list)
order_line_list = [x.getObject() for x in order_line_list]
total_quantity = 0
for order_line in order_line_list:
total_quantity += order_line.getTotalQuantity()
......@@ -735,7 +735,7 @@ class TestOrderMixin(SubcontentReindexingWrapper):
order = sequence.get('order')
order_line_list = order.objectValues( \
portal_type=self.order_line_portal_type)
order_line_list = map(lambda x: x.getObject(), order_line_list)
order_line_list = [x.getObject() for x in order_line_list]
total_price = 0
for order_line in order_line_list:
total_price += order_line.getTotalPrice()
......@@ -755,7 +755,7 @@ class TestOrderMixin(SubcontentReindexingWrapper):
order = sequence.get('order')
order_line_list = order.objectValues( \
portal_type=self.order_line_portal_type)
order_line_list = map(lambda x: x.getObject(), order_line_list)
order_line_list = [x.getObject() for x in order_line_list]
total_price = 0
for order_line in order_line_list:
total_price += order_line.getTotalPrice()
......@@ -800,24 +800,24 @@ class TestOrderMixin(SubcontentReindexingWrapper):
order = sequence.get('order')
self.assertEqual('planned', order.getSimulationState())
def checkAcquisition(self, object, acquired_object):
def checkAcquisition(self, obj, acquired_object):
"""
Check if properties are well acquired
"""
# packing_list_movement, simulation_movement
self.assertEqual(acquired_object.getStartDate(), object.getStartDate())
self.assertEqual(acquired_object.getStopDate(), object.getStopDate())
self.assertEqual(acquired_object.getStartDate(), obj.getStartDate())
self.assertEqual(acquired_object.getStopDate(), obj.getStopDate())
self.assertEqual(acquired_object.getSourceValue(), \
object.getSourceValue())
obj.getSourceValue())
self.assertEqual(acquired_object.getDestinationValue(), \
object.getDestinationValue())
obj.getDestinationValue())
self.assertEqual(acquired_object.getSourceSectionValue(), \
object.getSourceSectionValue())
obj.getSourceSectionValue())
self.assertEqual(acquired_object.getDestinationSectionValue(), \
object.getDestinationSectionValue())
obj.getDestinationSectionValue())
def stepCheckOrderLineAcquisition(self, sequence=None, \
sequence_list=None, **kw):
......@@ -880,7 +880,6 @@ class TestOrderMixin(SubcontentReindexingWrapper):
self.assertTrue(applied_rule is not None)
# Test if applied rule has a specialise value with passed rule_reference
portal_rules = getToolByName(order, 'portal_rules')
self.assertEqual(rule_reference,
applied_rule.getSpecialiseReference())
......@@ -2254,7 +2253,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
# Create recursively sub lines, and check that the ovement number
# is still the same.
for i in range(5):
for _ in range(5):
sub_order_line = sub_order_line.newContent(
portal_type=self.order_line_portal_type)
self.assertEqual(2, len(order.getMovementList()))
......@@ -2287,7 +2286,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
cell_key_list = list(sub_order_line.getCellKeyList(base_id=base_id))
cell_key_list.sort()
for cell_key in cell_key_list:
cell = sub_order_line.newCell(base_id=base_id,
sub_order_line.newCell(base_id=base_id,
portal_type=self.order_cell_portal_type,
*cell_key)
self.assertEqual(2-1+len(cell_key_list), len(order.getMovementList()))
......@@ -2301,7 +2300,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
cell_key_list = list(order_line.getCellKeyList(base_id=base_id))
cell_key_list.sort()
for cell_key in cell_key_list:
cell = order_line.newCell(base_id=base_id,
order_line.newCell(base_id=base_id,
portal_type=self.order_cell_portal_type,
*cell_key)
self.assertEqual(2-1+len(cell_key_list), len(order.getMovementList()))
......@@ -2491,7 +2490,6 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
# add sub_cell to sub_line, only sub_cell is movement
sub_order_line.setVariationCategoryList(order_line_vcl)
sub_cell_key = sub_order_line.getCellKeyList(base_id=base_id)[0]
sub_cell = sub_order_line.newCell(
base_id=base_id,
portal_type=self.order_cell_portal_type,
......@@ -2740,7 +2738,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
destination_value=client,
destination_section_value=client)
order.setReference('OrderReference')
line = order.newContent(portal_type=self.order_line_portal_type,
order.newContent(portal_type=self.order_line_portal_type,
resource_value=resource,
quantity=10,
price=3)
......@@ -2776,7 +2774,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
source_section_value=vendor,
destination_value=client,
destination_section_value=client)
line = order.newContent(portal_type=self.order_line_portal_type,
order.newContent(portal_type=self.order_line_portal_type,
resource_value=resource,
quantity=10,
price=3)
......@@ -2797,7 +2795,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
self.resource_portal_type).newContent(
portal_type=self.resource_portal_type,
title='Resource',)
image = FileUpload(os.path.join(os.path.dirname(__file__),
image = FileUpload(os.path.join(os.path.dirname(Products.ERP5.tests.__file__),
'test_data', 'images', 'erp5_logo.png'))
client = self.portal.organisation_module.newContent(
portal_type='Organisation', title='Client',
......@@ -2814,7 +2812,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
source_section_value=vendor,
destination_value=client,
destination_section_value=client)
line = order.newContent(portal_type=self.order_line_portal_type,
order.newContent(portal_type=self.order_line_portal_type,
resource_value=resource,
quantity=10,
price=3)
......@@ -2834,7 +2832,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
self.resource_portal_type).newContent(
portal_type=self.resource_portal_type,
title='Resource',)
image = FileUpload(os.path.join(os.path.dirname(__file__),
image = FileUpload(os.path.join(os.path.dirname(Products.ERP5.tests.__file__),
'test_data', 'images', 'erp5_logo.bmp'))
client = self.portal.organisation_module.newContent(
portal_type='Organisation', title='Client',
......@@ -2844,7 +2842,6 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
vendor = self.portal.organisation_module.newContent(
portal_type='Organisation', title='Vendor',
default_image_file=image)
from OFS.Image import Pdata
self.assertTrue(isinstance(vendor.getDefaultImageValue().data, Pdata))
order = self.portal.getDefaultModule(self.order_portal_type).newContent(
portal_type=self.order_portal_type,
......@@ -2855,7 +2852,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
source_section_value=vendor,
destination_value=client,
destination_section_value=client)
line = order.newContent(portal_type=self.order_line_portal_type,
order.newContent(portal_type=self.order_line_portal_type,
resource_value=resource,
quantity=10,
price=3)
......@@ -2898,7 +2895,7 @@ class TestOrder(TestOrderMixin, ERP5TypeTestCase):
source_section_value=vendor,
destination_value=client,
destination_section_value=client)
line = order.newContent(portal_type=self.order_line_portal_type,
order.newContent(portal_type=self.order_line_portal_type,
reference='à',
resource_value=resource,
quantity=10,
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testOrder</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testOrder</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testOrder</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -27,14 +27,11 @@
#
##############################################################################
import unittest
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from DateTime import DateTime
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testOrder import TestOrderMixin
from erp5.component.test.testOrder import TestOrderMixin
from Products.ERP5.tests.testInventoryAPI import InventoryAPITestCase
from Products.ERP5Type.tests.utils import createZODBPythonScript
class TestOrderBuilderMixin(TestOrderMixin, InventoryAPITestCase):
......@@ -425,9 +422,6 @@ class TestOrderBuilder(TestOrderBuilderMixin, ERP5TypeTestCase):
sequence_list.play(self)
def createSelectMethodForBuilder(self):
portal = self.getPortal()
def checkOrderBuilderStockOptimisationResult(self, expected_result, **kw):
result_list = [(x.getResource(), x.getVariationText(), x.getQuantity(),
x.getStartDate().strftime("%Y/%m/%d"),
......@@ -449,7 +443,6 @@ class TestOrderBuilder(TestOrderBuilderMixin, ERP5TypeTestCase):
self.pinDateTime(fixed_date)
self.createOrderBuilder()
self.fillOrderBuilder()
node_1_uid = node_1.getUid()
self.checkOrderBuilderStockOptimisationResult([], node_uid=node_1.getUid())
self._makeMovement(quantity=-3, destination_value=node_1, simulation_state='confirmed')
resource_url = self.resource.getRelativeUrl()
......@@ -465,7 +458,6 @@ class TestOrderBuilder(TestOrderBuilderMixin, ERP5TypeTestCase):
"""
node_1 = self.node_1
node_2 = self.node_2
resource = self.resource
self.createOrderBuilder()
self.fillOrderBuilder()
fixed_date = DateTime('2016/08/10')
......@@ -506,7 +498,6 @@ class TestOrderBuilder(TestOrderBuilderMixin, ERP5TypeTestCase):
fixed_date = DateTime('2018/01/03')
self.pinDateTime(fixed_date)
resource_url = self.resource.getRelativeUrl()
node_uid_list = [node_1.getUid(), self.node_2.getUid()]
self.checkOrderBuilderStockOptimisationResult([], node_uid=node_1.getUid())
movement = self._makeMovement(quantity=3, destination_value=node_1, simulation_state='delivered',
start_date=DateTime('2018/01/10'), variation_category_list=variation_category_list)
......@@ -549,7 +540,6 @@ class TestOrderBuilder(TestOrderBuilderMixin, ERP5TypeTestCase):
self.portal.portal_caches.clearAllCache()
self.assertTrue('auto_planned' in self.portal.getPortalFutureInventoryStateList())
# end of patch
resource = self.resource
self.createOrderBuilder()
self.fillOrderBuilder()
fixed_date = DateTime('2018/09/21')
......@@ -563,10 +553,10 @@ class TestOrderBuilder(TestOrderBuilderMixin, ERP5TypeTestCase):
self._makeMovement(quantity=-5, destination_value=self.node_1, simulation_state='confirmed',
start_date=DateTime('2018/09/21'))
checkStockOptimisationForTwoNodes([(resource_url, '', 5.0, '2018/09/21', '2018/09/21')])
auto_planned_one = self._makeMovement(quantity=3, destination_value=self.node_2, simulation_state='auto_planned',
self._makeMovement(quantity=3, destination_value=self.node_2, simulation_state='auto_planned',
start_date=DateTime('2018/09/18'))
checkStockOptimisationForTwoNodes([(resource_url, '', 2.0, '2018/09/21', '2018/09/21')])
auto_planned_two = self._makeMovement(quantity=2, destination_value=self.node_1, simulation_state='auto_planned',
self._makeMovement(quantity=2, destination_value=self.node_1, simulation_state='auto_planned',
start_date=DateTime('2018/09/19'))
checkStockOptimisationForTwoNodes([])
# But if we more stock than expected, auto planned movements should be reduced
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testOrderBuilder</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testOrderBuilder</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testOrderBuilder</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -34,7 +34,7 @@ from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
from Products.ERP5.Document.BusinessTemplate import getChainByType
from zLOG import LOG
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testOrder import TestOrderMixin
from erp5.component.test.testOrder import TestOrderMixin
from DateTime import DateTime
def getTree(self):
......@@ -526,7 +526,6 @@ class TestPackingListMixin(TestOrderMixin):
simulation_movement_list = applied_rule.objectValues()
self.assertEqual(len(simulation_movement_list),1)
order_line = sequence.get('order_line')
packing_list = sequence.get('packing_list')
packing_list_line = sequence.get('packing_list_line')
for simulation_movement in simulation_movement_list:
self.assertEqual(simulation_movement.getDeliveryValue(), order_line)
......@@ -679,16 +678,16 @@ class TestPackingListMixin(TestOrderMixin):
packing_list = sequence.get('packing_list')
self._solveDivergence(packing_list, 'quantity', 'Adopt Solver')
def _solveDivergence(self, document, property, solver, **kw):
def _solveDivergence(self, document, property_, solver, **kw):
"""Solve divergence by using solver tool"""
solver_process_tool = self.portal.portal_solver_processes
solver_process = solver_process_tool.newSolverProcess(document)
solver_decision, = [x for x in solver_process.contentValues()
if x.getCausalityValue().getTestedProperty() == property]
if x.getCausalityValue().getTestedProperty() == property_]
# use Quantity Accept Solver.
solver_decision.setSolverValue(self.portal.portal_solvers[solver])
# configure for Accept Solver.
solver_decision.updateConfiguration(tested_property_list=[property], **kw)
solver_decision.updateConfiguration(tested_property_list=[property_], **kw)
solver_process.buildTargetSolverList()
solver_process.solve()
......@@ -729,8 +728,6 @@ class TestPackingListMixin(TestOrderMixin):
"""
Look if the packing list has new previsions
"""
old_packing_list_line = sequence.get('packing_list_line')
packing_list_line = old_packing_list_line.aq_parent[str(int(old_packing_list_line.getId())-1)]
resource = sequence.get('resource')
for line in sequence.get('packing_list').getMovementList():
self.assertEqual(line.getResourceValue(), resource)
......@@ -1033,7 +1030,6 @@ class TestPackingListMixin(TestOrderMixin):
def checkLineSet(delivery, expected_set):
line_list = delivery.getMovementList()
self.assertEqual(len(line_list), len(expected_set))
found_set = set([(x.getResource(), x.getQuantity(), x.getPrice()) for x in line_list])
expected_set = set([(resource, self.default_quantity, 555),
(resource, self.default_quantity+1, 555)])
checkLineSet(packing_list1, expected_set)
......@@ -1780,7 +1776,7 @@ class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) :
source_section_value=vendor,
destination_value=client,
destination_section_value=client)
line = packing_list.newContent(
packing_list.newContent(
portal_type=self.packing_list_line_portal_type,
resource_value=resource,
quantity=10,
......@@ -1865,11 +1861,11 @@ class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) :
self.assertEqual('cancelled', simulation_movement.getSimulationState())
def stepCreateSourceAccount(self, sequence=None, **kw):
organisation = self.stepCreateOrganisation(sequence, None, 'dummy_source')
self.stepCreateOrganisation(sequence, None, 'dummy_source')
sequence.edit(source_account = sequence.get('dummy_source')['bank'])
def stepCreateDestinationAccount(self, sequence=None, **kw):
organisation = self.stepCreateOrganisation(sequence, None,
self.stepCreateOrganisation(sequence, None,
'dummy_destination')
sequence.edit(destination_account = sequence.get('dummy_destination')
['bank'])
......@@ -2238,7 +2234,7 @@ class TestPackingList(TestPackingListMixin, ERP5TypeTestCase) :
class TestSolvingPackingList(TestPackingListMixin, ERP5TypeTestCase):
quiet = 0
def afterSetUp(self, quiet=1, run=1):
def afterSetUp(self):
TestPackingListMixin.afterSetUp(self)
solver_process_type_info = self.portal.portal_types['Solver Process']
self.original_allowed_content_types = \
......@@ -2246,7 +2242,7 @@ class TestSolvingPackingList(TestPackingListMixin, ERP5TypeTestCase):
self.added_target_solver_list = []
@UnrestrictedMethod
def beforeTearDown(self, quiet=1, run=1):
def beforeTearDown(self):
super(TestSolvingPackingList, self).beforeTearDown()
self.portal.portal_rules.new_delivery_simulation_rule.quantity_tester.edit(
solver=())
......@@ -2317,9 +2313,10 @@ class TestSolvingPackingList(TestPackingListMixin, ERP5TypeTestCase):
sequence_list=None):
packing_list = sequence.get('packing_list')
order = packing_list.getCausalityValue()
new_packing_list = filter(lambda x:x != packing_list,
order.getCausalityRelatedValueList(
portal_type=packing_list.getPortalType()))[0]
new_packing_list = [
x for x in order.getCausalityRelatedValueList(
portal_type=packing_list.getPortalType())
if x != packing_list][0]
self.assertEqual(len(packing_list.getMovementList()),
len(order.getMovementList()) - 10)
self.assertEqual(len(new_packing_list.getMovementList()), 10)
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testPackingList</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testPackingList</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testPackingList</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -27,7 +27,7 @@
##############################################################################
import unittest
from testPackingList import TestPackingList
from erp5.component.test.testPackingList import TestPackingList
class TestPackingListRoundingPrecision(TestPackingList):
"""
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testPackingListRoundingPrecision</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testPackingListRoundingPrecision</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testPackingListRoundingPrecision</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -28,7 +28,7 @@
import unittest
from testOrder import TestOrder
from erp5.component.test.testOrder import TestOrder
class TestPurchaseOrder(TestOrder):
"""
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testPurchaseOrder</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testPurchaseOrder</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testPurchaseOrder</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -28,7 +28,7 @@
import unittest
from testOrder import TestOrder
from erp5.component.test.testOrder import TestOrder
class TestReturnedSaleOrder(TestOrder):
"""
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testReturnedOrder</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testReturnedOrder</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testReturnedOrder</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
......@@ -31,7 +31,7 @@ import unittest
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from AccessControl.SecurityManagement import newSecurityManager
from Products.ERP5Type.tests.Sequence import SequenceList
from Products.ERP5.tests.testPackingList import TestPackingListMixin
from erp5.component.test.testPackingList import TestPackingListMixin
from DateTime import DateTime
from Products.ERP5Type.Errors import UnsupportedWorkflowMethod
from Products.ERP5.tests.utils import newSimulationExpectedFailure
......@@ -60,7 +60,6 @@ class ReturnedSalePackingListMixin(TestPackingListMixin):
def beforeTearDown(self):
self.abort()
self.tic()
for folder in (self.portal.organisation_module,
self.portal.sale_order_module,
self.portal.inventory_module,
......@@ -84,9 +83,8 @@ class ReturnedSalePackingListMixin(TestPackingListMixin):
user = uf.getUserById('member').__of__(uf)
newSecurityManager(None, user)
def afterSetUp(self, quiet=1, run=1):
def afterSetUp(self):
self.loginAsManager()
portal = self.getPortal()
self.createCategories()
self.validateRules()
self.setUpPreferences()
......@@ -231,7 +229,6 @@ class ReturnedSalePackingListMixin(TestPackingListMixin):
"""
create a inventory
"""
portal = self.getPortal()
organisation = sequence.get('organisation1')
inventory = self._getInventoryModule().newContent()
inventory.edit(start_date=self.first_date_string,
......@@ -407,7 +404,7 @@ class ReturnedSalePackingListMixin(TestPackingListMixin):
portal_type=self.returned_packing_list_cell_portal_type)
self.assertEqual(2, len(cell_list))
# delete cells
rplwc_line.deleteContent(map(lambda x: x.getId(), cell_list))
rplwc_line.deleteContent([x.getId() for x in cell_list])
self.commit()
cell_list = rplwc_line.objectValues(
......@@ -518,8 +515,8 @@ class TestReturnedSalePackingList(ReturnedSalePackingListMixin, ERP5TypeTestCase
sequence_list.addSequenceString(sequence_string)
try:
sequence_list.play(self, quiet=quiet)
except UnsupportedWorkflowMethod, e:
self.assertTrue(True)
except UnsupportedWorkflowMethod:
pass
def test_04_ReturnedSalePackingListCreating(self, quiet=quiet,
run=run_all_test):
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Test Component" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>default_reference</string> </key>
<value> <string>testReturnedSalePackingList</string> </value>
</item>
<item>
<key> <string>default_source_reference</string> </key>
<value> <string>Products.ERP5.tests.testReturnedSalePackingList</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>test.erp5.testReturnedSalePackingList</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Test Component</string> </value>
</item>
<item>
<key> <string>sid</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content_error_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>text_content_warning_message</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>erp5</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</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>
<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="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<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>
interface.erp5.IBusinessLink
interface.erp5.ITradeModelPath
interface.erp5.IBuildableBusinessLinkProcess
interface.erp5.IBusinessLink
interface.erp5.IBusinessLinkProcess
interface.erp5.IBusinessProcessUnionProvider
interface.erp5.ISimulationMovementProcess
interface.erp5.ITradeModelPath
interface.erp5.ITradeModelPathProcess
interface.erp5.ITradePhaseProcess
interface.erp5.ITradeStateProcess
\ No newline at end of file
test.erp5.testDeliveryNode
test.erp5.testDivergenceTester
test.erp5.testERP5Simulation
test.erp5.testInternalOrder
test.erp5.testInventory
test.erp5.testInventoryModule
test.erp5.testInventoryReportModule
test.erp5.testOrder
test.erp5.testOrderBuilder
test.erp5.testPackingList
test.erp5.testPackingListRoundingPrecision
test.erp5.testPurchaseOrder
test.erp5.testReturnedOrder
test.erp5.testReturnedSalePackingList
\ No newline at end of file
erp5_full_text_myisam_catalog
erp5_core_proxy_field_legacy
erp5_apparel
erp5_project
erp5_configurator_standard_solver
erp5_simulation_test_trade_template
erp5_simulation_test
erp5_administration
erp5_mrp
erp5_accounting
erp5_dummy_movement
\ No newline at end of file
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