From 1b13a509f4b59c08aaa8dfed5c448673e0fc8710 Mon Sep 17 00:00:00 2001 From: Sebastien Robin <seb@nexedi.com> Date: Fri, 23 Mar 2007 09:47:06 +0000 Subject: [PATCH] - CheckbookReception_generateIemList reviewed by Vincent - We now generate checks when we receive checkbooks - some allowed content types where missing for traveler check sale git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@13587 20353a03-c40f-0410-a6d1-a30d3c3de9de --- .../allowed_content_types.xml | 1 + .../scripts/updateCheckAndCheckbook.xml | 11 +- .../transitions/deliver.xml | 2 +- .../CheckbookReception_generateItemList.xml | 226 +++++++++++++----- .../traveler_check_purchase_workflow.xml | 16 +- .../traveler_check_sale_workflow.xml | 16 +- bt5/erp5_banking_check/bt/revision | 2 +- ...late_portal_type_allowed_content_type_list | 1 + 8 files changed, 212 insertions(+), 63 deletions(-) diff --git a/bt5/erp5_banking_check/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml b/bt5/erp5_banking_check/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml index a3573a4e5a..84837f6b79 100644 --- a/bt5/erp5_banking_check/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml +++ b/bt5/erp5_banking_check/PortalTypeAllowedContentTypeTemplateItem/allowed_content_types.xml @@ -49,6 +49,7 @@ <item>Traveler Check Purchase</item> </portal_type> <portal_type id="Traveler Check Sale"> + <item>Banking Operation Line</item> <item>Checkbook Delivery Line</item> </portal_type> <portal_type id="Traveler Check Sale Module"> diff --git a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_delivery_workflow/scripts/updateCheckAndCheckbook.xml b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_delivery_workflow/scripts/updateCheckAndCheckbook.xml index 0d9989a063..5f42806c2f 100644 --- a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_delivery_workflow/scripts/updateCheckAndCheckbook.xml +++ b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_delivery_workflow/scripts/updateCheckAndCheckbook.xml @@ -68,7 +68,12 @@ </item> <item> <key> <string>_body</string> </key> - <value> <string># We will need to create all checks for all checkbooks\n + <value> <string encoding="cdata"><![CDATA[ + +# XXX: this script is not used any more, since checks are already\n +# generated when checks & checkbooks are received.\n +\n +# We will need to create all checks for all checkbooks\n # Then all of them should be set as confirmed\n transaction = state_change[\'object\']\n \n @@ -88,7 +93,9 @@ for line in line_list:\n elif aggregate.getPortalType()==\'Check\':\n aggregate.setStartDate(transaction.getStartDate())\n aggregate.confirm()\n -</string> </value> + + +]]></string> </value> </item> <item> <key> <string>_code</string> </key> diff --git a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_delivery_workflow/transitions/deliver.xml b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_delivery_workflow/transitions/deliver.xml index 6ccb39a49b..c8ef5d17fb 100644 --- a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_delivery_workflow/transitions/deliver.xml +++ b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_delivery_workflow/transitions/deliver.xml @@ -38,7 +38,7 @@ </item> <item> <key> <string>after_script_name</string> </key> - <value> <string>updateCheckAndCheckbook</string> </value> + <value> <string></string> </value> </item> <item> <key> <string>description</string> </key> diff --git a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_reception_workflow/scripts/CheckbookReception_generateItemList.xml b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_reception_workflow/scripts/CheckbookReception_generateItemList.xml index d6289c4a99..403b1f6438 100644 --- a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_reception_workflow/scripts/CheckbookReception_generateItemList.xml +++ b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/checkbook_reception_workflow/scripts/CheckbookReception_generateItemList.xml @@ -73,69 +73,162 @@ from Products.DCWorkflow.DCWorkflow import ValidationFailed\n transaction = state_change.object\n \n +def getReference(reference):\n + """\n + Convert a reference into an int.\n + """\n + # First convert to float to avoid failing to convert if reference = \'1.0\'\n + return int(float(reference))\n +\n +def generateReference(reference, ignored):\n + """\n + Convert an int into a reference\n + """\n + return str(reference)\n +\n +def validateTravelerCheckReferenceFormat(traveler_check_reference):\n + """\n + Check provided traveler_check_reference format\n + """\n + if len(traveler_check_reference) != 10:\n + raise ValueError, \'Traveler check reference must be 10-char long.\'\n + int(traveler_check_reference[4:])\n +\n +def getTravelerCheckReferenceNumber(traveler_check_reference):\n + """\n + Extract traveler check reference number\n + """\n + validateTravelerCheckReferenceFormat(traveler_check_reference)\n + return int(traveler_check_reference[4:])\n +\n +def getTravelerCheckReferencePrefix(traveler_check_reference):\n + """\n + Extract traveler check reference prefix\n + """\n + validateTravelerCheckReferenceFormat(traveler_check_reference)\n + return traveler_check_reference[:4]\n +\n +def generateTravelerCheckReference(number, original_traveler_check_reference):\n + """\n + Generate a traveler check reference from an existing reference (to\n + extract its prefix) and a new numerical value.\n + """\n + if not same_type(number, 0):\n + raise ValueError, \'Traveler check number must be only numeric.\'\n + if len(str(number)) > 6:\n + raise ValueError, \'Traveler check number representation length must not exceed 6 char.\'\n + prefix = getTravelerCheckReferencePrefix(original_traveler_check_reference)\n + return \'%s%06d\' % (prefix, number)\n +\n +def assertReferenceMatchListEmpty(match_list):\n + """\n + Check that the list is empty, otherwise gather all conflicting references and display them in the error message.\n + TODO: make the error message Localizer-friendly\n + """\n + if len(match_list) > 0:\n + matched_reference_list = []\n + for match in match_list:\n + matched_reference_list.append(match.getReference())\n + raise ValidationError, \'The following references are already allocated : %s\' % (matched_reference_list, )\n +\n +portal_activities = conetxt.getPortalObject().portal_activities\n +def checkReferenceUniqueness(reference, model):\n + """\n + Check the given reference not to already exist.\n + """\n + match_list = portal.portal_catalog(portal_type=\'Check\', reference=reference)\n + assertReferenceMatchListEmpty(match_list)\n + if portal_activities.countMessageWithTag(\'check_%s_%s\' % (model, reference)) != 0:\n + raise ValidationError, \'This reference is alredy scheduled for indexing, and so is already allocated : %s\' % (reference, )\n +\n # Check getBaobabSource and getBaobabDestination\n transaction.Base_checkBaobabSourceAndDestination()\n \n -\n delivery = state_change.object\n portal = context.getPortalObject()\n \n # We must parse all lines of checkbook reception and then\n # generate all items. We do not need to check data\n # because everything is already checked in the fast input\n -line_portal_type = delivery.getPortalType() + \' Line\'\n -line_list = delivery.objectValues(portal_type=line_portal_type)\n +line_list = delivery.objectValues(portal_type=delivery.getPortalType() + \' Line\')\n \n for line in line_list:\n - quantity = line.getQuantity()\n - resource = line.getResourceValue()\n - reference_range_min = line.getReferenceRangeMin()\n - reference_range_max = line.getReferenceRangeMax()\n + quantity = line.getQuantity()\n + resource = line.getResourceValue()\n + reference_range_min = line.getReferenceRangeMin()\n +\n + # We will look where we should create as many items\n + # as necessary and construct by the same time\n + # the aggregate list that we will store on the line\n + resource_portal_type = resource.getPortalType()\n + if resource_portal_type == \'Checkbook Model\':\n + is_checkbook = True\n + module = portal.checkbook_module\n + model = resource.getTitle().replace(\'Ch\xc3\xa9quier\', \'Ch\xc3\xa8que\') # XXX: Yuck yuck.\n + # XXX: portal_type value is hardcoded because I don\'t want to get the\n + # portaltype on each created object as it will always be the same.\n + # We need a method to get the default content portaltype on a Folder.\n check_amount = line.getCheckAmount()\n + check_quantity = int(portal.restrictedTraverse(check_amount).getQuantity())\n + reference_to_int = getReference\n + int_to_reference = generateReference\n + else:\n + is_checkbook = False\n + module = portal.check_module\n + model = resource.getTitle()\n + # XXX: portal_type value is hardcoded, see XXX above.\n + if resource_portal_type == \'Check Model\' and resource.isFixedPrice():\n + reference_to_int = getTravelerCheckReferenceNumber\n + int_to_reference = generateTravelerCheckReference\n + else:\n + reference_to_int = getReference\n + int_to_reference = generateReference\n +\n + aggregate_list = []\n + for i in xrange(quantity):\n + item = module.newContent()\n + item.setDestinationPayment(line.getDestinationPayment())\n + item.setDestinationTrade(line.getDestinationTrade())\n + item.setResourceValue(resource)\n + if is_checkbook:\n + item.setReferenceRangeMin(reference_range_min)\n + last_reference_value = reference_to_int(reference_range_min) + check_quantity - 1\n + reference_range_max = int_to_reference(last_reference_value, reference_range_min)\n + item.setReferenceRangeMax(reference_range_max)\n + item.setTitle(\'%s - %s\' % (reference_range_min, reference_range_max))\n + item.setCheckAmount(check_amount)\n +\n + start_date = transaction.getStartDate()\n + destination_section = item.getDestinationSection()\n + item.setStartDate(start_date)\n + for j in xrange(reference_to_int(reference_range_min), last_reference_value + 1):\n + reference = int_to_reference(j, reference_range_min)\n + checkReferenceUniqueness(reference, model)\n + check = item.newContent(portal_type=\'Check\', title=str(reference), activate_kw={\'tag\': \'check_%s_%s\' % (model, reference)})\n + check.setDestination(destination_section)\n + check.setStartDate(start_date)\n + check.setReference(reference)\n + check.confirm()\n \n - # We will look where we should create as many items\n - # as necessary and construct by the same time\n - # the aggregate list that we will store on the line\n - checkbook = 0\n - if resource.getPortalType()==\'Checkbook Model\':\n - checkbook = 1\n - module = portal.checkbook_module\n else:\n - module = portal.check_module\n - if checkbook:\n - check_amount_value = portal.restrictedTraverse(check_amount)\n - check_quantity = check_amount_value.getQuantity()\n -\n - aggregate_list = []\n - for i in xrange(0,quantity):\n - item = module.newContent()\n - if checkbook:\n - item.setReferenceRangeMin(reference_range_min)\n - reference_range_max = str(int(float(reference_range_min)) + int(check_quantity)-1)\n - item.setReferenceRangeMax(reference_range_max)\n - item.setTitle(\'%s - %s\' % (reference_range_min, reference_range_max))\n - reference_range_min = str(int(reference_range_max) + 1)\n - item.setCheckAmount(check_amount)\n - else:\n - item.setReference(reference_range_min)\n - item.setTitle(reference_range_min)\n - if quantity>1:\n - reference_range_min = str(int(float(reference_range_min)) + 1)\n - if len(resource.objectValues())>0:\n - item_type = line.getCheckTypeValue()\n - item.setPrice(item_type.getPrice())\n - item.setPriceCurrency(line.getPriceCurrency())\n - item.setDestinationPayment(line.getDestinationPayment())\n - item.setDestinationTrade(line.getDestinationTrade())\n - item.setResourceValue(resource)\n - # I (seb) think this is a big mistake\n - #if item.getPortalType()==\'Check\':\n - # portal.portal_workflow.doActionFor(item,\'confirm_action\',\n - # wf_id=\'check_workflow\')\n - aggregate_list.append(item)\n -\n - # Finally set the aggregate list on the line\n - line.setAggregateValueList(aggregate_list)\n + checkReferenceUniqueness(reference_range_min, model)\n + item.setReference(reference_range_min)\n + item.setTitle(reference_range_min)\n + if len(resource.objectValues()) > 0:\n + item_type = line.getCheckTypeValue()\n + item.setPrice(item_type.getPrice())\n + item.setPriceCurrency(line.getPriceCurrency())\n + last_reference_value = reference_to_int(reference_range_min)\n + # update reference_range_min for the next pass\n + reference_range_min = int_to_reference(last_reference_value + 1, reference_range_min)\n + # I (seb) think this is a big mistake\n + #if item.getPortalType()==\'Check\':\n + # portal.portal_workflow.doActionFor(item,\'confirm_action\',\n + # wf_id=\'check_workflow\')\n + aggregate_list.append(item)\n +\n + # Finally set the aggregate list on the line\n + line.setAggregateValueList(aggregate_list)\n ]]></string> </value> @@ -191,29 +284,48 @@ for line in line_list:\n <string>ValidationFailed</string> <string>_getattr_</string> <string>transaction</string> + <string>getReference</string> + <string>generateReference</string> + <string>validateTravelerCheckReferenceFormat</string> + <string>getTravelerCheckReferenceNumber</string> + <string>getTravelerCheckReferencePrefix</string> + <string>generateTravelerCheckReference</string> + <string>assertReferenceMatchListEmpty</string> + <string>conetxt</string> + <string>portal_activities</string> + <string>portal</string> + <string>checkReferenceUniqueness</string> <string>delivery</string> <string>context</string> - <string>portal</string> - <string>line_portal_type</string> <string>line_list</string> <string>_getiter_</string> <string>line</string> <string>quantity</string> <string>resource</string> <string>reference_range_min</string> - <string>reference_range_max</string> - <string>check_amount</string> - <string>checkbook</string> + <string>resource_portal_type</string> + <string>True</string> + <string>is_checkbook</string> <string>module</string> - <string>check_amount_value</string> + <string>model</string> + <string>check_amount</string> + <string>int</string> <string>check_quantity</string> + <string>reference_to_int</string> + <string>int_to_reference</string> + <string>False</string> <string>aggregate_list</string> <string>xrange</string> <string>i</string> <string>item</string> + <string>last_reference_value</string> + <string>reference_range_max</string> + <string>start_date</string> + <string>destination_section</string> + <string>j</string> + <string>reference</string> <string>str</string> - <string>int</string> - <string>float</string> + <string>check</string> <string>len</string> <string>item_type</string> </tuple> diff --git a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/traveler_check_purchase_workflow.xml b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/traveler_check_purchase_workflow.xml index e20c40f07c..f582170946 100644 --- a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/traveler_check_purchase_workflow.xml +++ b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/traveler_check_purchase_workflow.xml @@ -30,6 +30,16 @@ <none/> </value> </item> + <item> + <key> <string>creation_guard</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>description</string> </key> + <value> <string></string> </value> + </item> <item> <key> <string>groups</string> </key> <value> @@ -44,6 +54,10 @@ <key> <string>initial_state</string> </key> <value> <string>draft</string> </value> </item> + <item> + <key> <string>manager_bypass</string> </key> + <value> <int>0</int> </value> + </item> <item> <key> <string>permissions</string> </key> <value> @@ -60,7 +74,7 @@ </item> <item> <key> <string>title</string> </key> - <value> <string>Checkbook Delivery Workflow</string> </value> + <value> <string>Traveler Check Purchase Workflow</string> </value> </item> </dictionary> </pickle> diff --git a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/traveler_check_sale_workflow.xml b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/traveler_check_sale_workflow.xml index 74ce18b930..6afa8f8343 100644 --- a/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/traveler_check_sale_workflow.xml +++ b/bt5/erp5_banking_check/WorkflowTemplateItem/portal_workflow/traveler_check_sale_workflow.xml @@ -30,6 +30,16 @@ <none/> </value> </item> + <item> + <key> <string>creation_guard</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>description</string> </key> + <value> <string></string> </value> + </item> <item> <key> <string>groups</string> </key> <value> @@ -44,6 +54,10 @@ <key> <string>initial_state</string> </key> <value> <string>draft</string> </value> </item> + <item> + <key> <string>manager_bypass</string> </key> + <value> <int>0</int> </value> + </item> <item> <key> <string>permissions</string> </key> <value> @@ -60,7 +74,7 @@ </item> <item> <key> <string>title</string> </key> - <value> <string>Checkbook Delivery Workflow</string> </value> + <value> <string>Traveler Check Sale Workflow</string> </value> </item> </dictionary> </pickle> diff --git a/bt5/erp5_banking_check/bt/revision b/bt5/erp5_banking_check/bt/revision index 8d9f781b52..8bc6583717 100644 --- a/bt5/erp5_banking_check/bt/revision +++ b/bt5/erp5_banking_check/bt/revision @@ -1 +1 @@ -118 \ No newline at end of file +120 \ No newline at end of file diff --git a/bt5/erp5_banking_check/bt/template_portal_type_allowed_content_type_list b/bt5/erp5_banking_check/bt/template_portal_type_allowed_content_type_list index 027b82c313..04ebfbfb0a 100644 --- a/bt5/erp5_banking_check/bt/template_portal_type_allowed_content_type_list +++ b/bt5/erp5_banking_check/bt/template_portal_type_allowed_content_type_list @@ -16,4 +16,5 @@ Stop Payment | Checkbook Delivery Line Traveler Check Purchase Module | Traveler Check Purchase Traveler Check Purchase | Checkbook Delivery Line Traveler Check Sale Module | Traveler Check Sale +Traveler Check Sale | Banking Operation Line Traveler Check Sale | Checkbook Delivery Line \ No newline at end of file -- 2.30.9