Commit 69857c83 authored by Nicolas Godbert's avatar Nicolas Godbert Committed by Romain Courteaud

Fix usage report packing list generation.

Squashed commit of the following:

commit 0bf141f580edc36fef556343c74dcb68f90b70fe
Author: Romain Courteaud <romain@nexedi.com>
Date:   Wed Aug 31 09:59:44 2011 +0200

    Follow step renaming.
    ce9a2cbcb305643821478e80668f7293fc10d6d0 renamed the step LoginManager.

commit 6216fee47a85ab4ea631397c1ab9434e82817505
Author: Romain Courteaud <romain@nexedi.com>
Date:   Tue Aug 30 16:14:38 2011 +0200

    Remove duplicated sequences definition.

commit ce9a2cbcb305643821478e80668f7293fc10d6d0
Author: Romain Courteaud <romain@nexedi.com>
Date:   Tue Aug 30 16:09:32 2011 +0200

    Remove unwanted code.
    This will ease merge with master

commit 898b9e9497090e89215871785cedf6f98787361c
Merge: 271a0d2 05992113
Author: Romain Courteaud <romain@nexedi.com>
Date:   Tue Aug 30 15:48:09 2011 +0200

    Merge branch 'master' into usage_report

commit 271a0d226d333b3cdd51381eece553bfbccb625a
Author: Romain Courteaud <romain@nexedi.com>
Date:   Tue Aug 30 14:58:14 2011 +0200

    Calculate movement price from specialised packing list.
    This will allow to quickly get a working invoice generation until pricing model/trade condition management is improved.

commit a18ee17164e9819b5091d91707003031a5f39033
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 30 14:55:27 2011 +0200

    We remove Sale Packing Lists and Accounting Transactions generated by the first test to avoid that the second fails.

commit fc334ec0a1b3cc54d0c1ed5951587beb25e646e1
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 30 10:33:43 2011 +0200

    UsageReport and UsageReportTwoPartitions unit tests were merged into the single file testVifibUsageReport.py

commit 44e5fa1058f59714b1cd86019480976c89e15540
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 30 10:23:51 2011 +0200

    We don't need to delete 'group_on_delivery' property movement with the new builder.

commit 192f3abf8a3951db5c121a74e7fa1c7f18f62a56
Author: Romain Courteaud <romain@nexedi.com>
Date:   Tue Aug 30 10:08:10 2011 +0200

    If not needed, do not export it in bt5.

commit e0c8309dbbf52adf59d3b531cc495e37ac5c8b1e
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 30 09:40:22 2011 +0200

    Not needed whitespace.

commit 1ab88d5ffb3d38f50ad26a0789f5773ba228939d
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 29 17:47:27 2011 +0200

    We replace the builder to use the last one.

commit f69b5db8fc5081264cdf008ca60b298a5c25ddad
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 29 17:28:56 2011 +0200

    We don't use Purchase Packing Lists anymore in the unit test.

commit 46112fac5825aae9ab98fa8869df3d0133f38745
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Aug 29 14:14:53 2011 +0200

    Remove unwanted code.
    Such configuration has to be done on bt5 level.

commit c5661a80b744173f0b1e582c0b193afaf59afc15
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Aug 29 14:12:58 2011 +0200

    Remove unwanted code.
    Such configuration has to be done on bt5 level.

commit de47c8dfa74be2d3a2fe92565f2773d98dbf3337
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Aug 29 14:05:47 2011 +0200

    Put all sequence strings in the same location.

commit d305ee97921cc3e97ded00e03db8b14542f4d089
Merge: dc1a027 ebaa618
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 29 11:34:42 2011 +0200

    Merge remote-tracking branch 'origin/usage_report' into usage_report

commit ebaa618506db079de7276a2269f3a9d1f97131f3
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Aug 29 11:27:33 2011 +0200

    Restore all tests written for slave instance.
    This will ease merge with the master.

commit dc1a027a9a0f0bec093d436dd4b61047033b26b7
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 29 11:13:45 2011 +0200

    We don't raise strings anymore.

commit 052eddb753e9e31aa2a6b7cb48a2e509e7765449
Merge: ca430f2 bdb89b0
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 29 10:55:06 2011 +0200

    Merge remote-tracking branch 'origin/usage_report' into usage_report

commit ca430f2968788c2115a11ef34eb50b9756c273d8
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 29 10:44:56 2011 +0200

    We create a builder for Vifib Master to generate invoices.

commit bdb89b063e728ac76e64b85a3e3559b28b498c65
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Aug 26 18:52:59 2011 +0200

    Remove french comments...

commit 305b73480081736c53cd899edc46c057e40ec29b
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Aug 26 18:10:13 2011 +0200

    Revert not needed modifications.
    Those modifications make the merge with master more difficult.

commit 5f9fb533ee05a78f1b86d57a0f6a997e5921cfc1
Merge: 42a7fb3 aaf2e015
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Aug 26 17:33:23 2011 +0200

    Merge remote branch 'origin/master' into usage_report

commit 42a7fb3d7d8de51360427a875fcc09fecb5caaa6
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 24 15:50:07 2011 +0200

    Fill the item box of Sale Packing List Lines to generate invoices.

commit 3dd045b205ff555061e854848b2dd2bb1433a325
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 24 14:50:32 2011 +0200

    Forgot to update local roles to let Computers access erp5_default_business_process.

commit c02d2593b16026927ce9d63617152b70a2404396
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 24 14:30:32 2011 +0200

    Forgot to commit some files to let Computers access erp5_default_business_process.

commit cba81c574d8767c2886dd1c76436b178b8e52184
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 24 13:58:41 2011 +0200

    Recover SlapTool.py file from last merge.

commit c1611dcf62136d7e6d5290df1f515fc1bbf88d9b
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 24 13:31:53 2011 +0200

    Add role for Computer  in Business Process portal type to generate invoices.

commit 013a5b762bb48d91cd741a8427ec9a485cc16d42
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 24 12:06:51 2011 +0200

    Recover some files from last merge.

commit a6922dee5c3b16cc2565c73e9963581019e1e8ad
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 24 10:38:37 2011 +0200

    Computers can search Sale Trade Condition to generate invoices.

commit 11445d6f853717a8204ee2904a72dbcb3017a773
Merge: 7a7f2c4 b194e337
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 23 18:22:13 2011 +0200

    Merge branch 'usage_report', remote-tracking branch 'origin' into usage_report

commit 7a7f2c4d4af6e426a64e7f8d5f1c34b8c7a9e6c9
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 23 18:06:38 2011 +0200

    We apply Sale Trade Condition on Sale Packing List Line.

commit 791484d678f24e19c6ba13c224f3ec196845b1b6
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 23 13:26:25 2011 +0200

    Use same partition IDs  than partitions generated by testVifibSlapWebService unit test.

commit 1c553c14ab0996b96812422276e2aaf09ce52580
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 23 11:41:20 2011 +0200

    Export local roles for CPU and Memory consumption services.

commit babfdef982d2c1423bf808eba3f7aa3ec62fc0c2
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 23 10:56:43 2011 +0200

    Configuration of CPU and Memory Consumption services were incomplete.

commit 8dfb773b08469c887090f6df0e6ceb3aacfbb324
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 22 14:56:16 2011 +0200

    Remove some hardcoded values when the conduit creates the Sale Packing List

commit cee87cedb157d1bf0d06124496bdd86bf98f5667
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 22 11:03:00 2011 +0200

    Forgot to define portal object.

commit 393f3744a192b5a3f441ba30d8b3065290290b39
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 22 10:47:57 2011 +0200

    We let the validation of objects in the stepConfigureInstance of the unit test.

commit c20c342dca49cb534b2e574feefba94670233ab5
Merge: d45782d 12fd245b
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 22 09:19:34 2011 +0200

    Merge branch 'usage_report', remote-tracking branch 'origin' into usage_report

commit d45782d287e66f773a881754ca59962f7b57ef8c
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Aug 19 18:29:17 2011 +0200

    Remove some useless files.

commit ae50e0d471fec336c5dec904e4209636bf0c0881
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Aug 19 18:24:29 2011 +0200

    Export configuration of vifib master to generate invoices.

commit 7618100d8951222aa0c78d05f17269315bcad2f4
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Aug 19 17:48:55 2011 +0200

    Update roles on Person, Organisation, Business Process, Sale Trade Condition and Accounting Transaction module.

commit bd4de501682dec1c4e86294aff6c2128d1b64c0f
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Aug 19 17:10:18 2011 +0200

    Add CPU and Memory consumption services to generate invoice.

commit bd528e7f86d0a794620967e7a4e1487d16e0fd7f
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Aug 19 13:42:35 2011 +0200

    Export of sale invoice builder and invoice simulation rules in vifib_invoicing bt5.

commit 6d21db83f0fbf9b03560fd1dffeaff0f087859f8
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Aug 19 12:16:21 2011 +0200

    Some log, typo, comments and exception management improvements

commit fdba478cebbf1a7d6b7bc87aed4ac348a94e342d
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Aug 18 18:05:44 2011 +0200

    Configuration of roles in Person and Organisation portal types.

commit a8c1e48f724888805ee2d96cb8824f758aae33c1
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 17 18:39:04 2011 +0200

    Improvement to avoid duplication code in unit test.

commit 6eb65edd95b7410129e585e9739ab98dcc803de0
Merge: 411e6f0 5bbfd76
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 17 18:29:30 2011 +0200

    Merge remote-tracking branch 'origin/usage_report' into usage_report

commit 411e6f0c3d9ea5d96e9cf05b4feea8b3a739f50f
Merge: 06d80c2 567e4683
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 17 18:20:52 2011 +0200

    Merge branch 'usage_report', remote-tracking branch 'origin' into usage_report

commit 5bbfd7631e8a0f89e29ea260a93a5bfdd60d5359
Author: Romain Courteaud <romain@nexedi.com>
Date:   Wed Aug 17 17:13:13 2011 +0200

    Some nice comments.
    Export configuration in bt5 instead of creating it in test.

commit 06d80c2573b96e586e990a3c6c5b83db911c49c9
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Aug 12 14:08:24 2011 +0200

    Merge of the testUsageReport and testUsageReportTwoPartitions tests to avoid duplication code.

commit c3dc4f955ba22fae4b301fb3b92e5ed2dce0ad05
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Aug 12 10:27:20 2011 +0200

    Removal of SaleTradeCondition_asPredicate to use the original one from erp5_trade bt5 and avoid duplication code.

commit 72538e146245b860c9c41952926e103e77205eb3
Merge: 53364b4 ea09a424
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Aug 11 18:04:14 2011 +0200

    Merge branch 'usage_report', remote-tracking branch 'origin' into usage_report

commit 53364b4943342c75f937d84f74be4ca80281e8ae
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Aug 11 16:28:03 2011 +0200

    Merge of two usage report test sample to avoid duplication XML files into a unique python script which will be used to generate usage report sample for testing purposes.

commit 5dedefd80b6871e0a87000c698ddae985eb67787
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Aug 11 16:09:13 2011 +0200

    Removal of useless code because erp5_simulation_legacy bt5 is not used.

commit e4a1b3d9f4b750392a8a2a2c804bb54db6d6fcd4
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Aug 11 15:59:38 2011 +0200

    Replacement of portal_catalog method with searchFolder method to extract planned Sale Invoice list in Accounting module.

commit 8db0a993eaa01c270c62a08c338dda57b5ea3189
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Aug 11 10:12:07 2011 +0200

    String construction improvement to generate usage report from existing sale packing list.

commit e86123ae78b24c49e18e07307ed296b2d4ad0684
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 3 18:16:35 2011 +0200

    Typo.

commit 911999208b7b13c44457a4af1610255dc9333d8d
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 3 13:26:31 2011 +0200

    Forgot to rename the new usageReport classname to usageReportTwoPartitions.

commit 8c130647b8d096feecbee8b7910d3aad4619b51d
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Aug 3 13:21:33 2011 +0200

    Some code lines exceeded 80 characters.

commit 2ec939150ad7cf5b788203a47f542ed348d402b6
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 2 10:34:27 2011 +0200

    Modify usageReport test following vifib_invoicing and vifib_test bt5 commit.

commit dceaba701131399a7fb507a68d6adaacd090ef6a
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Aug 2 09:24:24 2011 +0200

    Add unit test to check if sale invoices are updated when SlapTool is called several times.

commit 7b0c93e830260c6506e9ffb308ef233813bcbd10
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 1 18:18:36 2011 +0200

    Indentation improvement.

commit f0d220d50268cbb63ff48048c9d875229bbbd738
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 1 17:59:21 2011 +0200

    Load a new bt5 for unit testing which contains invoicing related scripts.

commit 0eb8aee1bb3d114590d31711be92ac16cac12eb5
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 1 17:33:36 2011 +0200

    Creation of business_template_skin_layer_priority property to make sure that scripts in vifib_test will be executed

commit 0621182dfcd9183930633d25786b0cec0ff99f1f
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 1 17:32:00 2011 +0200

    Creation of business_template_skin_layer_priority property to make sure that scripts in vifib_invoicing will be executed.

commit 31c95681604c56e8f431de4791df7bdd48cec679
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Aug 1 10:04:34 2011 +0200

    Fixing the previous commit, exception type was not defined

commit fb0ca92995d29ab991c0c467fbb41e8800eb2a2b
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 29 18:52:39 2011 +0200

    XSD models will be loaded from parts/vifib/slapos/slap with relative path until they are available in eggs/slapos/slap

commit 9eb8314d5cf501fb16fe2a695253ccc5bca448a2
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 29 10:59:18 2011 +0200

    Create new bt5 vifib_invoicing to adapt sale invoice building related scripts from erp5_invoicing.

commit bac07625e09596a156ee9cefa5e0f31c9b322e98
Merge: 7742eda 1188342
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 29 10:28:24 2011 +0200

    Merge remote-tracking branch 'origin/usage_report' into usage_report

commit 7742eda2227de9f2f04290cb3d9947bb99d7d1d4
Merge: a516965 e29e96be
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 29 10:19:01 2011 +0200

    Merge remote-tracking branch 'origin' into usage_report

commit 1188342184b7dbce8e0223be4f8859ae5a343980
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Jul 25 15:42:48 2011 +0200

    Removal of an if statement

commit 5eac1e61f9d0fbe2c24d52a40dc0b07568ee562f
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Jul 25 15:41:00 2011 +0200

    Add vifib_test in skin folders

commit e1a7384103e5452d380a889dc34bd6ea416a868e
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 22 19:04:33 2011 +0200

    Replace 't' by 'T' in class names

commit a516965e4ecf2d69f449d3ded1ac31a7825aff37
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Jul 21 10:01:10 2011 +0200

    Add a XML usage report with two partitions

commit 9fc22632a80a1d1cf424c3b61b2c5905116d958e
Merge: f1d39ce 2c62e63f
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Jul 20 10:52:10 2011 +0200

    Merge remote-tracking branch 'origin' into usage_report

commit f1d39ce5d4399eed0307cd688d18c089d6137e03
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Jul 19 17:57:00 2011 +0200

    Works in Live Test

commit f61f7aa480e6cb0360f1154e4feee9458d14f4f8
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Jul 19 11:29:40 2011 +0200

    Add a instance configuration method

commit 7c0939605185892e5de4953b70f4db3ede1d856d
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Jul 19 11:20:21 2011 +0200

    Typo

commit ccab5b208fbea0ac4fe1a6ae7c0631499f2aac51
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Jul 19 11:17:00 2011 +0200

    Add a source section in Sale Packing List

commit 053851e8356aa2f39f786aa625178260df6978e4
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Jul 6 13:42:44 2011 +0200

    Add a Computer role in Sale Trade Condition/Module portal types

commit d746946aef6e7acc1ee0c5451c7d34ed031e89d8
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Jul 6 13:39:42 2011 +0200

    Paths to XSD models are not hardcoded anymore

commit 453031a6250cb21a3aff9246d876f390c893f8bd
Author: Sebastien Robin <seb@nexedi.com>
Date:   Fri Jul 1 18:20:22 2011 +0200

    temporary backup of this schema for usage reporting

    This xsd file must be commited in a better place as soon as possible

commit 072a24fd68b0c2cb8e18b8fbb0ec8bd3dcbe2ce7
Merge: b570020 c5b5897c
Author: Sebastien Robin <seb@nexedi.com>
Date:   Fri Jul 1 17:49:04 2011 +0200

    Merge remote-tracking branch 'remotes/origin/master' into usage_report

    Conflicts:
    	master/bt5/vifib_slap/bt/revision

commit b570020a317c9a7b90b4a78cd1b05ce9267cff94
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 1 16:05:57 2011 +0200

    Add a source and destination section in Sale Packing List

commit 5b99e5a7828acab084c8808c8f74f154c9cbd80a
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 1 14:04:07 2011 +0200

    Update of the sequence_string

commit 6f33b898f1fb5632d63c8e02bdee89d648f466dc
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 1 13:57:09 2011 +0200

    Add stepCreatePurchasePackingList method

commit 812bd89335dde86a10fe50817b6f55c2717af899
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 1 13:52:18 2011 +0200

    Add stepSetPurchasePackingListLineAggregate method

commit bf330befc49c92d131a1123816a6e6f688a1d2b2
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jul 1 13:41:13 2011 +0200

    Add CheckSaleInvoiceExists method

commit f40cf47f167f76fbb6ffcaf7c8f63ae0fe3efd6c
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Jun 29 10:04:02 2011 +0200

    Creation of SaleTradeCondition_asPredicate file

commit 8f285061bf6440f1f7a568b93875656311d2192e
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Jun 20 11:56:08 2011 +0200

    Typo.

commit e1daa1632f90640c60a43c99a0f4677614985426
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Jun 20 11:55:22 2011 +0200

    Move some code into the VifibSlapWebServiceMixin method.

commit 1e3a43b4d204eff858bf5c899a27dbb6922912d9
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon Jun 20 11:53:28 2011 +0200

    Typo.

commit 3fcd8757597acc879ae203a30db8b66cd2e2e069
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jun 17 18:07:32 2011 +0200

    Fix: Manager user does not exist

commit 6afbf419f0c03a84fc6ba7344380bd87c798a1fe
Author: Sebastien Robin <seb@nexedi.com>
Date:   Fri Jun 17 16:56:54 2011 +0200

    move testUsageReport with other tests

commit fe2f81dbd1d3ea01c354883bb13037da9b05aa1a
Merge: b04e9f6 3f32cfa9
Author: Sebastien Robin <seb@nexedi.com>
Date:   Fri Jun 17 16:53:58 2011 +0200

    Merge remote-tracking branch 'remotes/origin/master' into usage_report

    Conflicts:
    	master/bt5/vifib_slap/bt/revision
    	master/product/Vifib/Tool/SlapTool.py
    	master/product/Vifib/tests/testVifibSlapWebService.py

commit b04e9f6f34999bf11577d085e55087cf338a32d6
Author: Sebastien Robin <seb@nexedi.com>
Date:   Fri Jun 17 16:33:26 2011 +0200

    Nicolas applied manually commit 4afe99a5 by mistake, revert it

commit 5edd91c5d60e6014fa04c09a211466a2088e0ce2
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jun 17 15:38:22 2011 +0200

    We retrieve an XML report sample from vifib_test bt5.

commit 2384da761bcc475d979dee9a63e8caa7095d3ac6
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jun 17 13:58:57 2011 +0200

    Adding vifib_test bt5

commit 388f6eda386d42844a94d558c46bf5a54e0ff6ca
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Fri Jun 17 13:57:57 2011 +0200

    Rename the stepLoginERP5TypeTestCase method to stepLoginManager

commit 6a2c04aeeb605c2ed0c40edcd51c7a0a71fd67fb
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Jun 16 17:01:36 2011 +0200

    Move some code from TestVifibSlapWebService to a new class TestVifibSlapWebServiceMixin

commit fa5d5edcc9590076ecd8a9833d77d4878ada60f6
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Jun 16 16:43:10 2011 +0200

    Improvement of the usageReport Unit Test.

commit 91d807716cbd4a2805329a4c8f910fd2e0e48d62
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Jun 16 16:36:12 2011 +0200

    We check if a Certificate Authority is already set up.

commit 800483dd4e9f5d79decbc7770812d6925e95e401
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Jun 9 16:45:54 2011 +0200

    In the XML report, we check that the title of the transaction exists and it is not empty

commit f9a28b54dc594871547b5545903767cd279b0aef
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Jun 9 15:29:08 2011 +0200

    Add title for the Sale Packing List created by Vifib Conduit

commit 13ea58fdcebbbf8a84f5b96cefb987a9810fe60e
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Jun 9 14:25:55 2011 +0200

    Creation of a template which contains tools to test Vifib

commit 2e868c705b84b1001f7e66612c4b5f9dca14bc6c
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Thu Jun 9 11:30:07 2011 +0200

    Regenerate XML usage report from Sale Packing List

commit ab973d8eb4b56632309a708270af161f42ffa2d9
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Jun 7 18:13:48 2011 +0200

    Creation of a Unit Test to test the useComputer method of SlapTool

commit ca2d8a16690b7b9d7ebd402078a97d99a81d4201
Merge: 1e7bdfc d699957b
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue Jun 7 17:03:54 2011 +0200

    Merge remote branch 'remotes/origin/master' into usage_report

commit 1e7bdfc1340f4d1a0a912c29cee2607cd6fb7764
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Wed Jun 1 10:43:22 2011 +0200

    Creation of the asXML method which generate the final XML report

commit a81166f1391e21067d821d23f673bf380d3d79a9
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue May 31 18:48:52 2011 +0200

    Validation of XML reports generated by the partitions and Slapgrid

commit eb13d4913fde37cfbd2bf7758fc49e52a13876e9
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue May 31 18:40:04 2011 +0200

    Modification of the agregateAndSendUsage method

commit 77577d4b7980e7483b2abd99c0f0ec8d8763118a
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue May 31 15:54:52 2011 +0200

    In the XML report, we check that tags exist and their value is not empty

commit fac116291459a496fe6b416fd8b510602511a24c
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue May 31 15:05:52 2011 +0200

    Creation of the ReportParser class

commit c5acd8d2445b1739afdd133934f0d85fce782b47
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue May 31 15:04:30 2011 +0200

    Modification of log messages

commit 22f465cfb210cb2f228b09f05c38ff832b8f4047
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue May 31 14:01:57 2011 +0200

    We don't need to send a computer object anymore

commit 898f9398358a78c04f444e6e0459e64ce4b9a1af
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue May 31 10:08:43 2011 +0200

    A Sale Packing List Line is created for each movement node of the XML report

commit d5128815433a8b77ab8118010a3b717f7d9a7ae1
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue May 31 09:46:10 2011 +0200

    VifibConduit creates a Sale Packing List linked to partition consumptions of a computer

commit e2383538caff603b5a946a0798f2dcd3684b3286
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Tue May 31 09:32:49 2011 +0200

    Extraction of informations from XML report

commit 713286a55fb1dff9e17892557d45a6aa44f4b917
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon May 30 18:29:35 2011 +0200

    The Master checks if the XML report sent by a node is valid or not.

commit e702754f45de9a6b7bc538d6e493de73d373d36f
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon May 30 18:22:38 2011 +0200

    The XML report is forwarded to the Vifib Conduit.

commit 0d142be6dcb0564b24a4ed8ba77c2d65cf4a4354
Author: Nicolas Godbert <ngodbert@tiolive.com>
Date:   Mon May 30 18:12:51 2011 +0200

    Now, a node only send a xml report to the Master, no a python object
parent 05992113
<local_roles_item>
<local_roles>
<role id='ERP5TypeTestCase'>
<item>Owner</item>
</role>
<role id='IS-SYSAD'>
<item>Auditor</item>
</role>
<role id='PROD'>
<item>Auditor</item>
</role>
<role id='customer'>
<item>Auditor</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
<local_roles_item>
<local_roles>
<role id='ERP5TypeTestCase'>
<item>Owner</item>
</role>
<role id='IS-SYSAD'>
<item>Auditor</item>
</role>
<role id='PROD'>
<item>Auditor</item>
</role>
<role id='customer'>
<item>Auditor</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Service" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>quantity_unit/unit/piece</string>
</tuple>
</value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>cpu_consumption</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>cpu_consumption</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Service</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>CPU Consumption</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Service" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>quantity_unit/unit/piece</string>
</tuple>
</value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>memory_consumption</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>memory_consumption</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Service</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Memory Consumption</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
77 80
\ No newline at end of file \ No newline at end of file
currency_module/EUR currency_module/EUR
service_module/cpu_consumption
service_module/memory_consumption
service_module/vifib_instance_cleanup service_module/vifib_instance_cleanup
service_module/vifib_instance_hosting service_module/vifib_instance_hosting
service_module/vifib_instance_setup service_module/vifib_instance_setup
......
currency_module/EUR
service_module/cpu_consumption
service_module/memory_consumption
service_module/vifib_instance_cleanup service_module/vifib_instance_cleanup
service_module/vifib_instance_hosting service_module/vifib_instance_hosting
service_module/vifib_instance_setup service_module/vifib_instance_setup
service_module/vifib_software_setup service_module/vifib_software_setup
service_module/vifib_usage_report service_module/vifib_usage_report
\ No newline at end of file
currency_module/EUR
\ No newline at end of file
currency_module/EUR currency_module/EUR
document_module/1 document_module/1
notification_message_module/vifib* notification_message_module/vifib*
service_module/cpu_consumption
service_module/memory_consumption
service_module/vifib_instance_cleanup service_module/vifib_instance_cleanup
service_module/vifib_instance_hosting service_module/vifib_instance_hosting
service_module/vifib_instance_setup service_module/vifib_instance_setup
......
<local_roles_item>
<local_roles>
<role id='PROD-MAN'>
<item>Auditor</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
<local_roles_item>
<local_roles>
<role id='PROD-MAN'>
<item>Auditor</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
<local_roles_item>
<local_roles>
<role id='PROD-MAN'>
<item>Auditor</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
<role id='IS-SYSAD'> <role id='IS-SYSAD'>
<item>Auditor</item> <item>Auditor</item>
</role> </role>
<role id='PROD-MAN'>
<item>Auditor</item>
</role>
<role id='admin'> <role id='admin'>
<item>Owner</item> <item>Owner</item>
</role> </role>
......
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
<role id='IS-SYSAD'> <role id='IS-SYSAD'>
<item>Auditor</item> <item>Auditor</item>
</role> </role>
<role id='PROD-MAN'>
<item>Auditor</item>
</role>
<role id='admin'> <role id='admin'>
<item>Owner</item> <item>Owner</item>
</role> </role>
......
<local_roles_item> <local_roles_item>
<local_roles> <local_roles>
<role id='PROD-MAN'>
<item>Auditor</item>
</role>
<role id='admin'> <role id='admin'>
<item>Owner</item> <item>Owner</item>
</role> </role>
......
...@@ -3,5 +3,8 @@ ...@@ -3,5 +3,8 @@
<role id='ERP5TypeTestCase'> <role id='ERP5TypeTestCase'>
<item>Owner</item> <item>Owner</item>
</role> </role>
<role id='PROD-MAN'>
<item>Auditor</item>
</role>
</local_roles> </local_roles>
</local_roles_item> </local_roles_item>
\ No newline at end of file
<type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>destination_section</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles> <type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Auditor'> <role id='Auditor'>
<property id='title'>Vifib Customer</property> <property id='title'>Vifib Customer</property>
<multi_property id='category'>function/customer</multi_property> <multi_property id='category'>function/customer</multi_property>
......
<type_roles> <type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Auditor'> <role id='Auditor'>
<property id='title'>Vifib Customer</property> <property id='title'>Vifib Customer</property>
<multi_property id='category'>function/customer</multi_property> <multi_property id='category'>function/customer</multi_property>
......
<type_roles> <type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Auditor; Author'> <role id='Auditor; Author'>
<property id='title'>Vifib Customer</property> <property id='title'>Vifib Customer</property>
<multi_property id='category'>function/customer</multi_property> <multi_property id='category'>function/customer</multi_property>
......
<type_roles> <type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<multi_property id='category'>function/production/manager</multi_property>
<multi_property id='base_category'>function</multi_property>
</role>
<role id='Assignor'> <role id='Assignor'>
<property id='title'>Customer</property> <property id='title'>Customer</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property> <property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
......
accounting_module
business_process_module
business_process_module/erp5_default_business_process
computer_module computer_module
computer_module/test_computer computer_module/test_computer
credential_update_module credential_update_module
...@@ -13,7 +16,6 @@ person_module/test_hr_admin ...@@ -13,7 +16,6 @@ person_module/test_hr_admin
person_module/test_updated_vifib_user person_module/test_updated_vifib_user
person_module/test_vifib_admin person_module/test_vifib_admin
person_module/test_vifib_customer person_module/test_vifib_customer
person_module/test_vifib_customer_a
person_module/test_vifib_developer person_module/test_vifib_developer
person_module/test_vifib_member person_module/test_vifib_member
person_module/test_vifib_user_admin person_module/test_vifib_user_admin
......
accounting_module
business_process_module
business_process_module/erp5_default_business_process
computer_module computer_module
computer_module/test_computer computer_module/test_computer
credential_update_module
currency_module currency_module
currency_module/EUR currency_module/EUR
hosting_subscription_module hosting_subscription_module
...@@ -12,7 +16,6 @@ person_module/test_hr_admin ...@@ -12,7 +16,6 @@ person_module/test_hr_admin
person_module/test_updated_vifib_user person_module/test_updated_vifib_user
person_module/test_vifib_admin person_module/test_vifib_admin
person_module/test_vifib_customer person_module/test_vifib_customer
person_module/test_vifib_customer_a
person_module/test_vifib_developer person_module/test_vifib_developer
person_module/test_vifib_member person_module/test_vifib_member
person_module/test_vifib_user_admin person_module/test_vifib_user_admin
...@@ -29,4 +32,3 @@ software_product_module ...@@ -29,4 +32,3 @@ software_product_module
software_product_module/test_software_product software_product_module/test_software_product
software_release_module software_release_module
software_release_module/test_software_release software_release_module/test_software_release
\ No newline at end of file
credential_update_module
Accounting Transaction
Accounting Transaction Module
Assignment Assignment
Business Process
Business Process Module
Computer Computer
Computer Module Computer Module
Credential Update Module Credential Update Module
......
Assignment Assignment
Accounting Transaction
Accounting Transaction Module
Business Process
Business Process Module
Computer Computer
Computer Module Computer Module
Credential Update Module Credential Update Module
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Delivery Builder" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>collect_order</string> </key>
<value>
<tuple>
<string>OrderMovementGroup</string>
<string>PathMovementGroup</string>
<string>DateMovementGroup</string>
<string>ResourceMovementGroup</string>
<string>VariantMovementGroup</string>
</tuple>
</value>
</item>
<item>
<key> <string>collect_order_list</string> </key>
<value>
<list>
<string>test</string>
<string>test2</string>
</list>
</value>
</item>
<item>
<key> <string>collect_order_list_id</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>delivery_after_generation_method_id</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>delivery_after_generation_script_id</string> </key>
<value> <string>InvoiceTransaction_postGeneration</string> </value>
</item>
<item>
<key> <string>delivery_cell_collect_order</string> </key>
<value>
<tuple>
<string>VariantMovementGroup</string>
</tuple>
</value>
</item>
<item>
<key> <string>delivery_cell_portal_type</string> </key>
<value> <string>Invoice Cell</string> </value>
</item>
<item>
<key> <string>delivery_cell_separate_order</string> </key>
<value>
<tuple>
<string>calculateSeparatePrice</string>
</tuple>
</value>
</item>
<item>
<key> <string>delivery_collect_order</string> </key>
<value>
<tuple>
<string>DateMovementGroup</string>
<string>PathMovementGroup</string>
<string>SectionPathMovementGroup</string>
<string>CausalityMovementGroup</string>
<string>DecisionPathMovementGroup</string>
<string>AdministrationPathMovementGroup</string>
<string>PriceCurrencyMovementGroup</string>
</tuple>
</value>
</item>
<item>
<key> <string>delivery_line_collect_order</string> </key>
<value>
<tuple>
<string>ResourceMovementGroup</string>
<string>BaseVariantMovementGroup</string>
<string>BaseContributionMovementGroup</string>
<string>AggregateMovementGroup</string>
</tuple>
</value>
</item>
<item>
<key> <string>delivery_line_portal_type</string> </key>
<value> <string>Invoice Line</string> </value>
</item>
<item>
<key> <string>delivery_module</string> </key>
<value> <string>accounting_module</string> </value>
</item>
<item>
<key> <string>delivery_portal_type</string> </key>
<value> <string>Sale Invoice Transaction</string> </value>
</item>
<item>
<key> <string>delivery_select_method_id</string> </key>
<value> <string>InvoiceBuilder_selectPlannedSaleInvoiceList</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>Builds Sale Invoices from Packing list related simulation movements</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>vifib_sale_invoice_builder</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>4</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Delivery Builder</string> </value>
</item>
<item>
<key> <string>resource_portal_type</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>simulation_select_method_id</string> </key>
<value> <string>SaleInvoiceTransaction_selectPackingListMovement</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Vifib Sale Invoice Builder</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Base Variant Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>collect_order_group/line</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>base_variant_movement_group_in_line</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Base Variant Movement Group</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>base_variant_movement_group_in_line</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>divergence_scope/category</string>
<string>collect_order_group/delivery</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>category_movement_group_on_delivery</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Movement Group</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>specialise</string>
<string>delivery_mode</string>
<string>incoterm</string>
<string>source</string>
<string>destination</string>
<string>source_section</string>
<string>destination_section</string>
<string>source_decision</string>
<string>destination_decision</string>
<string>source_administration</string>
<string>destination_administration</string>
<string>source_project</string>
<string>destination_project</string>
<string>source_payment</string>
<string>destination_payment</string>
<string>price_currency</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>category_movement_group_on_delivery</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>divergence_scope/category</string>
<string>collect_order_group/line</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>category_movement_group_on_line</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Movement Group</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>resource</string>
<string>aggregate</string>
<string>quantity_unit</string>
<string>base_contribution</string>
<string>base_application</string>
<string>source_function</string>
<string>destination_function</string>
<string>source_account</string>
<string>destination_account</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>category_movement_group_on_line</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Causality Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>collect_order_group/delivery</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>causality_movement_group_on_delivery</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Causality Movement Group</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>causality_movement_group_on_delivery</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Delivery Causality Assignment Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>collect_order_group/delivery</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>delivery_causality_assignement_movement_group_on_delivery</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>100</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Delivery Causality Assignment Movement Group</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Delivery Causality Assignement Movement Group On Delivery</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Property Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>divergence_scope/property</string>
<string>collect_order_group/line</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>property_movement_group_on_line</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Property Movement Group</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>description</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variant Movement Group" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>collect_order_group/cell</string>
<string>divergence_scope/category</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variant_movement_group_on_cell</string> </value>
</item>
<item>
<key> <string>int_index</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variant Movement Group</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>variant_movement_group_on_cell</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Invoice Simulation Rule" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>trade_phase/default/invoicing</string>
</tuple>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>default_invoicing_rule</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>new_invoice_simulation_rule</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>20</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Invoice Simulation Rule</string> </value>
</item>
<item>
<key> <string>test_method_id</string> </key>
<value>
<tuple>
<string>SimulationMovement_testInvoiceSimulationRule</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>New Default Invoice Simulation Rule</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>3</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>start_date</string> </key>
<value>
<tuple>
<none/>
<none/>
</tuple>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>aggregate_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>aggregate</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>aggregate divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>divergence_provider</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>base_application_tester</string> </value>
</item>
<item>
<key> <string>matching_provider</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>base_application</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>base_application divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>divergence_provider</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>base_contribution_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>base_contribution</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>base_contribution divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>divergence_provider</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>delivery_mode_divergence_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>delivery_mode</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>delivery_mode divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="String Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>description_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>String Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>description</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>description divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>destination_account_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>destination_account</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>destination_account divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>destination_administration_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>destination_administration</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>destination_administration divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>destination_decision_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>destination_decision</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>destination_decision divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>destination_function_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>destination_function</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>destination_function divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>destination_payment_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>destination_payment</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>destination_payment divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>destination_project_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>destination_project</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>destination_project divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>destination_section_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>destination_section</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>destination_section divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>destination_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>destination</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>destination divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>divergence_provider</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>incoterm_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>incoterm</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>incoterm divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>divergence_provider</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>price_currency_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>price_currency</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>price_currency divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Float Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>quantity_range_min</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>int</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>quantity_range_max</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>int</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>divergence_provider</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>price_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Float Divergence Tester</string> </value>
</item>
<item>
<key> <string>quantity_range_max</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>quantity_range_min</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>price</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>price divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Net Converted Quantity Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>use_delivery_ratio</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>int</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>quantity_range_min</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>int</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>quantity_range_max</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>int</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>solver/portal_solvers/Consolidating Sale Invoice Line</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>quantity_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Net Converted Quantity Divergence Tester</string> </value>
</item>
<item>
<key> <string>quantity_range_max</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>quantity_range_min</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>quantity</string>
<string>quantity_unit</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>quantity divergence tester</string> </value>
</item>
<item>
<key> <string>use_delivery_ratio</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>resource_tester</string> </value>
</item>
<item>
<key> <string>matching_provider</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>resource</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>resource divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>source_account_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>source_account</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>source_account divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>source_administration_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>source_administration</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>source_administration divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>source_decision_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>source_decision</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>source_decision divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>source_function_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>source_function</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>source_function divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>source_payment_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>source_payment</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>source_payment divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>source_project_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>source_project</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>source_project divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>source_section_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>source_section</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>source_section divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>source_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>source</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>source divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Specialise Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>specialise_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Specialise Divergence Tester</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Business Process must be consistent to make good prevision</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="DateTime Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>quantity</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>int</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>start_date_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>DateTime Divergence Tester</string> </value>
</item>
<item>
<key> <string>quantity</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>start_date</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>start_date divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="DateTime Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>quantity</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>int</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>stop_date_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>DateTime Divergence Tester</string> </value>
</item>
<item>
<key> <string>quantity</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>stop_date</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>stop_date divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category Membership Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>divergence_provider</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>use_tester</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category Membership Divergence Tester</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>use</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>use divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variation Divergence Tester" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>quantity</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>int</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>divergence_provider</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variation_tester</string> </value>
</item>
<item>
<key> <string>matching_provider</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Variation Divergence Tester</string> </value>
</item>
<item>
<key> <string>quantity</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>variation_category_list</string>
<string>variation_property_dict</string>
</tuple>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>variation divergence tester</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<global name="PersistentMapping" module="Persistence.mapping"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Solver Type" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>_property_domain_dict</string> </key>
<value>
<dictionary>
<item>
<key> <string>short_title</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
</value>
</item>
<item>
<key> <string>acquire_local_roles</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>automatic_solver</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>configuration_form_id</string> </key>
<value> <string>Solver_viewConfigurationFormBox</string> </value>
</item>
<item>
<key> <string>configuration_groupable</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>content_icon</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>The adoption solver resets the value of the delivery movement to the total of the values of related simulations. It eventually updates the delivery_ratio in the simulations.</string> </value>
</item>
<item>
<key> <string>factory</string> </key>
<value> <string>addAdoptSolver</string> </value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<tuple>
<string>target_solver</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Consolidating Sale Invoice Line</string> </value>
</item>
<item>
<key> <string>init_script</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>3</string> </value>
</item>
<item>
<key> <string>line_exclusive</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>line_groupable</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>permission</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Solver Type</string> </value>
</item>
<item>
<key> <string>process_exclusive</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>solver_action_title</string> </key>
<value> <string>Replace value</string> </value>
</item>
<item>
<key> <string>tested_property</string> </key>
<value>
<tuple>
<string>quantity</string>
</tuple>
</value>
</item>
<item>
<key> <string>type_class</string> </key>
<value> <string>AdoptSolver</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </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/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<tuple>
<global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>domain_name</string> </key>
<value> <string>erp5_content</string> </value>
</item>
<item>
<key> <string>property_name</string> </key>
<value> <string>short_title</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<tuple>
<global name="TranslationInformation" module="Products.ERP5Type.TranslationProviderBase"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>domain_name</string> </key>
<value> <string>erp5_content</string> </value>
</item>
<item>
<key> <string>property_name</string> </key>
<value> <string>title</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<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="8" aka="AAAAAAAAAAg=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Action Information" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>action_permission</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>float_index</string> </key>
<value> <float>2.0</float> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>1</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>reference</string> </key>
<value> <string>configuration</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Configuration</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="Expression" module="Products.CMFCore.Expression"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/Solver_viewConfiguration</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Action Information" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>action_permission</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>float_index</string> </key>
<value> <float>1.0</float> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>2</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>reference</string> </key>
<value> <string>view</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>View</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<global name="Expression" module="Products.CMFCore.Expression"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/TargetSolver_view</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Role Information" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>3</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Role Information</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<allowed_content_type_list>
<portal_type id="Solver Process">
<item>Consolidating Sale Invoice Line</item>
</portal_type>
</allowed_content_type_list>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>business_template_skin_layer_priority</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>float</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>business_template_skin_layer_priority</string> </key>
<value> <float>60.0</float> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>vifib_invoicing</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>portal = context.getPortalObject()\n
accounting_module = portal.getDefaultModule(\'Sale Invoice Transaction\')\n
\n
invoice = accounting_module.searchFolder(\n
portal_type=\'Sale Invoice Transaction\',\n
simulation_state=\'planned\')\n
\n
return invoice\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>**kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>InvoiceBuilder_selectPlannedSaleInvoiceList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[
"""This script is called on the Invoice after the delivery builder has created\n
the new Invoice.\n
"""\n
from Products.ERP5Type.Message import translateString\n
\n
try:\n
from Products.CMFCore.WorkflowCore import WorkflowException\n
except ImportError:\n
# WorkflowException has not always been allowed in restricted\n
# environment, in this case, make sure WorkflowException is \n
# defined \n
class WorkflowException(Exception):\n
pass\n
\n
if related_simulation_movement_path_list is None:\n
raise RuntimeError, \'related_simulation_movement_path_list is missing. Update ERP5 Product.\'\n
\n
invoice = context\n
\n
# if installed erp5_simplified_invoicing, set resource from price currency\n
if not invoice.Invoice_isAdvanced():\n
if not invoice.getResource():\n
invoice.setResource(invoice.getPriceCurrency())\n
\n
related_packing_list = invoice.getDefaultCausalityValue()\n
related_order = related_packing_list.getDefaultCausalityValue()\n
\n
# copy payment conditions from packing list\n
# if missing, try to copy from order (for compatibility)\n
if not invoice.contentValues(portal_type=\'Payment Condition\'):\n
payment_condition_copy_id_list = []\n
if related_packing_list is not None:\n
payment_condition_copy_id_list = related_packing_list.contentIds(filter={\'portal_type\':\'Payment Condition\'})\n
if len(payment_condition_copy_id_list) > 0:\n
clipboard = related_packing_list.manage_copyObjects(ids=payment_condition_copy_id_list)\n
invoice.manage_pasteObjects(clipboard)\n
elif related_order is not None:\n
payment_condition_copy_id_list = related_order.contentIds(\n
filter={\'portal_type\':\'Payment Condition\'})\n
if len(payment_condition_copy_id_list) > 0:\n
clipboard = related_order.manage_copyObjects(ids=payment_condition_copy_id_list)\n
invoice.manage_pasteObjects(clipboard)\n
\n
# copy title, if not updating a new delivery\n
if not invoice.hasTitle() and related_packing_list.hasTitle():\n
invoice.setTitle(related_packing_list.getTitle())\n
\n
# initialize accounting_workflow to confirmed state\n
if invoice.getSimulationState() == \'draft\':\n
invoice.plan(comment=translateString(\'Initialised by Delivery Builder.\'),)\n
\n
# First set the invoice in the building state on the causality workflow\n
invoice.startBuilding()\n
\n
# Then an activity should put the causality state in diverged or solved\n
invoice.activate(after_path_and_method_id=(related_simulation_movement_path_list,\n
(\'immediateReindexObject\',\'recursiveImmediateReindexObject\'))).updateCausalityState()\n
]]></string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>related_simulation_movement_path_list=None, **kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>InvoiceTransaction_postGeneration</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
2011-07-29 Nicolas Godbert
* initial version
\ No newline at end of file
Nexedi SA
\ No newline at end of file
vifib_base
vifib_core
\ No newline at end of file
Vifib objects used for invoicing
\ No newline at end of file
GPL
\ No newline at end of file
Nicolas Godbert
\ No newline at end of file
7
\ No newline at end of file
portal_deliveries/vifib_sale_invoice_builder
portal_deliveries/vifib_sale_invoice_builder/**
portal_rules/new_invoice_simulation_rule
portal_rules/new_invoice_simulation_rule/**
portal_solvers/Consolidating Sale Invoice Line
portal_solvers/Consolidating Sale Invoice Line/**
\ No newline at end of file
Solver Process | Consolidating Sale Invoice Line
\ No newline at end of file
vifib_invoicing
\ No newline at end of file
vifib_invoicing
\ No newline at end of file
1.0
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>def getRelatedTradeConditionList(trade_condition):\n
related_trade_condition_list = trade_condition.getSpecialiseValueList(\n
portal_type=(\'Sale Trade Condition\', \'Purchase Trade Condition\'))\n
for related_trade_condition in trade_condition.getSpecialiseValueList(\n
portal_type=(\'Sale Trade Condition\', \'Purchase Trade Condition\')):\n
related_trade_condition_list.extend(\n
getRelatedTradeConditionList(related_trade_condition))\n
return related_trade_condition_list\n
\n
for trade_condition in getRelatedTradeConditionList(movement):\n
for supply_line in trade_condition.contentValues(\n
portal_type=movement.getPortalSupplyPathTypeList(),\n
checked_permission=\'View\'):\n
# if supply_line.test(movement):\n
if supply_line.getResource() == movement.getResource():\n
if supply_line.getBasePrice():\n
return {\'price\': supply_line.getBasePrice()}\n
\n
return None\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>default=None, movement=None, REQUEST=None, **kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Service_getPriceCalculationOperandDict</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[
#We extract informations from SPL\n
packing_list_dict = {\'packing_list_title\': context.getTitle()}\n
\n
#We extract informations from SPLL\n
sale_packing_list_line_list = [line for line in context.objectValues(\n
portal_type=\'Sale Packing List Line\')\n
]\n
\n
xml_head = ""\n
xml_movements = ""\n
xml_foot = ""\n
\n
xml_head = "<?xml version=\'1.0\' encoding=\'utf-8\'?>" \\\n
"<journal>" \\\n
"<transaction type=\\"Sale Packing List\\">" \\\n
"<title>%(packing_list_title)s</title>" \\\n
"<start_date></start_date>" \\\n
"<stop_date></stop_date>" \\\n
"<reference></reference>" \\\n
"<currency></currency>" \\\n
"<payment_mode></payment_mode>" \\\n
"<category></category>" \\\n
"<arrow type=\\"Administration\\">" \\\n
"<source></source>" \\\n
"<destination></destination>" \\\n
"</arrow>" \\\n
% packing_list_dict\n
\n
for sale_packing_list_line in sale_packing_list_line_list:\n
\n
packing_list_line_dict = {\'packing_list_line_title\': sale_packing_list_line.getTitle(),\n
\'packing_list_line_resource\': sale_packing_list_line.getResourceTitle(),\n
\'packing_list_line_reference\': sale_packing_list_line.getAggregateValue().getTitle(),\n
\'packing_list_line_quantity\': sale_packing_list_line.getQuantity(),\n
}\n
\n
xml_movements += "<movement>" \\\n
"<resource>%(packing_list_line_resource)s</resource>" \\\n
"<title>%(packing_list_line_title)s</title>" \\\n
"<reference>%(packing_list_line_reference)s</reference>" \\\n
"<quantity>%(packing_list_line_quantity)s</quantity>" \\\n
"<price>0.00</price>" \\\n
"<VAT>None</VAT>" \\\n
"<category>None</category>" \\\n
"</movement>" \\\n
% packing_list_line_dict\n
\n
xml_foot = "</transaction>" \\\n
"</journal>"\n
\n
xml = xml_head + xml_movements + xml_foot\n
return xml\n
]]></string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>PackingList_generateUsageReport</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>business_template_skin_layer_priority</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>float</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>business_template_skin_layer_priority</string> </key>
<value> <float>60.0</float> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>vifib_test</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>vifib_test</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[
""" \n
This script generate a usage report test sample for one or two partitions\n
"""\n
\n
# First we check the number of partition to invoice\n
if number in [1, 2]:\n
\n
# We build movements\n
movement = """\n
<movement>\n
<resource>%s</resource>\n
<title>%s</title>\n
<reference>%s</reference> \n
<quantity>%s</quantity>\n
<price>0.00</price> \n
<VAT>None</VAT>\n
<category>None</category>\n
</movement>"""\n
\n
# Then, we create two movements for each partition, one for the CPU consumption, and the other for the memory\n
movements = ""\n
for nb in range(number):\n
if nb == 0:\n
movements += movement % (\'CPU Consumption\', \'Title Sale Packing List Line 1\', \'slappart0\', \'42.42\')\n
movements += movement % (\'Memory Consumption\', \'Title Sale Packing List Line 2\', \'slappart0\', \'42.42\')\n
else:\n
movements += movement % (\'CPU Consumption\', \'Title Sale Packing List Line 1\', \'slappart1\', \'46.46\')\n
movements += movement % (\'Memory Consumption\', \'Title Sale Packing List Line 2\', \'slappart1\', \'46.46\')\n
\n
# Finally, we build the XML usage report\n
xml = """<?xml version=\'1.0\' encoding=\'utf-8\'?>\n
<journal>\n
<transaction type="Sale Packing List">\n
<title>Resource consumptions</title>\n
<start_date></start_date>\n
<stop_date></stop_date>\n
<reference></reference>\n
<currency></currency>\n
<payment_mode></payment_mode>\n
<category></category>\n
<arrow type="Administration">\n
<source></source>\n
<destination></destination>\n
</arrow>""" + movements + """\n
</transaction>\n
</journal>"""\n
\n
return xml\n
\n
else:\n
return \'This script can generate movements for one or two partitions maximum\'\n
]]></string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>number</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>ERP5Site_getUsageReportTestSample</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
2011-06-09 Nicolas Godbert
* initial version
\ No newline at end of file
Nexedi SA
\ No newline at end of file
vifib_base
vifib_core
\ No newline at end of file
Vifib objects used for tests
\ No newline at end of file
GPL
\ No newline at end of file
Nicolas Godbert
\ No newline at end of file
378
\ No newline at end of file
vifib_test
\ No newline at end of file
vifib_test
\ No newline at end of file
5.4.6
\ No newline at end of file
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#from zLOG import LOG, INFO from zLOG import LOG, INFO
#import xml_marshaller from OFS.Traversable import NotFound
from lxml import etree from lxml import etree
from DateTime import DateTime
parser = etree.XMLParser(remove_blank_text=True) parser = etree.XMLParser(remove_blank_text=True)
class ReportParser:
"""
This parser is used to extract all informations
from the XML report given by SlapTool
"""
class VifibConduit: def __init__(self, xml):
"""This conduit is used to synchronize tiosafe packing list and erp5""" self.transaction_dict = {}
tags_text_transaction = {}
arrow_list = []
movement_list = []
tags_text_movement = {}
tags_text_arrow = {}
def __init__(self): xmltree = self.convertToXml(xml)
pass
#We fill up a list of movement extracted from xml with (tag - text) pairs
for transaction in xmltree.findall('transaction'):
for children in transaction.getchildren():
if children.tag == "movement":
for toddler in children.getchildren():
tags_text_movement[toddler.tag] = toddler.text
movement_list.append(tags_text_movement)
tags_text_movement = {}
elif children.tag == "arrow":
for toddler in children.getchildren():
tags_text_arrow[toddler.tag] = toddler.text
arrow_list.append(tags_text_arrow)
tags_text_arrow = {}
else:
tags_text_transaction[children.tag] = children.text
self.transaction_dict['element_dict'] = tags_text_transaction
self.transaction_dict['arrow_list'] = arrow_list
self.transaction_dict['movement_list'] = movement_list
tags_text_transaction = {}
arrow_list = []
movement_list = []
def convertToXml(self, xml): def convertToXml(self, xml):
""" """
if xml is a string, convert it in a node Converts xml in a node if it is a string
""" """
if xml is None: return None if xml is None: return None
if isinstance(xml, (str, unicode)): if isinstance(xml, (str, unicode)):
...@@ -27,43 +59,123 @@ class VifibConduit: ...@@ -27,43 +59,123 @@ class VifibConduit:
xml = xml[0] xml = xml[0]
return xml return xml
def getTransactionDict(self):
return self.transaction_dict
def getTransactionElementDict(self):
return self.transaction_dict['element_dict']
def getArrowList(self):
return self.transaction_dict['arrow_list']
def getMovementList(self):
return self.transaction_dict['movement_list']
def checkComplete(self):
"""
Checks if a report is complete
"""
#We check that the XML report sent by the node got a title
if None in [self.transaction_dict['element_dict'].get('title')]:
return False
#We check that this title is not empty
if None in [self.transaction_dict['element_dict']['title']]:
return False
for movement in self.transaction_dict['movement_list']:
#First, we check that following tags exist in the XML report
if None in [movement.get('title'), movement.get('reference'),
movement.get('resource')]:
return False
#Then, if they exist, we check that they are not empty
if None in [movement['title'], movement['reference'],
movement['resource']]:
return False
return True
def addNode(self, object=None, xml=None): class VifibConduit:
"""Synchronizes tiosafe packing list and erp5"""
def __init__(self):
pass
def addNode(self, object=None, xml=None, computer_id=None):
""" """
This method create an object Creates a Sale Packing List from a XML report sent by a node
""" """
#LOG('VifibConduit-check-3', INFO, '%s' % xml, error=True)
xml = self.convertToXml(xml) xml = ReportParser(xml)
tags_text = {}
#fill up a dict with (tag - text) pairs #We retrieve the sale packing list module
for element in xml.iter():
tags_text[element.tag] = element.text
#retrieve the packing list module
sale_packing_list_portal_type = 'Sale Packing List' sale_packing_list_portal_type = 'Sale Packing List'
portal = object.getPortalObject()
sale_packing_list_module = \ sale_packing_list_module = \
object.getPortalObject().getDefaultModule(sale_packing_list_portal_type) portal.getDefaultModule(sale_packing_list_portal_type)
#We create the new packing list
#We retrieve the computer
computer_module = portal.getDefaultModule('Computer')
computer = \
computer_module.searchFolder(reference=computer_id)[0].getObject()
if xml.checkComplete():
#We create a SPL
usage_report_sale_packing_list_document = \ usage_report_sale_packing_list_document = \
sale_packing_list_module.newContent( sale_packing_list_module.newContent(
portal_type = 'Sale Packing List', portal_type = 'Sale Packing List',
) title = xml.getTransactionElementDict()['title'],
start_date = DateTime())
#We create SPLLs for each movements
for movement in xml.getMovementList():
usage_report_sale_packing_list_document_line = \
usage_report_sale_packing_list_document.newContent(
portal_type='Sale Packing List Line')
service_list = portal.portal_catalog(
portal_type='Service',
title=movement['resource'])
if len(service_list) == 1:
service = service_list[0].getObject()
else:
LOG('VifibConduit', INFO,
'Error, nonexistent service : %s' % movement['resource'])
raise NotFound, "Error, nonexistent service : %s" % movement['resource']
#We retrieve the partition
partition = \
computer.searchFolder(reference=movement['reference'])[0].getObject()
# We retrieve the latest SPL (Instance Setup) related to the partition
instance_setup_packing_list_line = \
partition.Item_getInstancePackingListLine()
instance_setup_packing_list = \
instance_setup_packing_list_line.getParent()
# We edit the SPLL
usage_report_sale_packing_list_document_line.edit(
resource = service.getRelativeUrl(),
source = instance_setup_packing_list.getSource(),
source_section = instance_setup_packing_list.getSourceSection(),
destination = instance_setup_packing_list.getDestination(),
destination_section = \
instance_setup_packing_list.getDestinationSection(),
specialise = instance_setup_packing_list.getSpecialise(),
start_date = DateTime(),
title = movement['title'],
reference = movement['reference'],
quantity = movement['quantity'],
aggregate_list = instance_setup_packing_list_line.getAggregateList())
usage_report_sale_packing_list_document_line.SaleOrder_applySaleTradeCondition(
batch_mode=1)
usage_report_sale_packing_list_document.confirm() usage_report_sale_packing_list_document.confirm()
usage_report_sale_packing_list_document.start() usage_report_sale_packing_list_document.start()
#Note inverted time and date---remember to correct in slapreport else:
usage_report_sale_packing_list_document.edit( LOG('VifibConduit', INFO,
start_date=tags_text['time'], 'The XML report sent by the node is not complete')
start_time=tags_text['date'], raise NotImplementedError("The XML report sent by the node is not complete")
memory=tags_text['Memory'],
cpu_time=tags_text['CpuTime'],
cpu_percent=tags_text['CPU'],
rss=tags_text['RSS'],
)
return usage_report_sale_packing_list_document
#software_release_module_id = object.getDefaultModuleId(portal_type = 'Sale Packing List')
#software_release_module_id = self.portal.restrictedTraverse(software_release_module_id)
#software_release = software_release_module.newContent(portal_type = 'Sale Packing List')
...@@ -60,6 +60,8 @@ except ImportError: ...@@ -60,6 +60,8 @@ except ImportError:
from zLOG import LOG, INFO from zLOG import LOG, INFO
import xml_marshaller import xml_marshaller
import StringIO
import pkg_resources
from Products.Vifib.Conduit import VifibConduit from Products.Vifib.Conduit import VifibConduit
class SoftwareInstanceNotReady(Exception): class SoftwareInstanceNotReady(Exception):
pass pass
...@@ -282,23 +284,28 @@ class SlapTool(BaseTool): ...@@ -282,23 +284,28 @@ class SlapTool(BaseTool):
'useComputer') 'useComputer')
def useComputer(self, computer_id, use_string): def useComputer(self, computer_id, use_string):
"""Entry point to reporting usage of a computer.""" """Entry point to reporting usage of a computer."""
#computer_document = self._getComputerDocument(computer_id) #We retrieve XSD model
# easy way to start to store usage messages sent by client in related Web try:
# Page text_content... computer_consumption_model = \
pkg_resources.resource_string(
#self._reportComputerUsage(computer_document, use_string) 'slapos.slap',
#LOG("check-1", 0, "%s" % use_string) 'doc/computer_consumption.xsd')
unmarshalled_usage = xml_marshaller.xml_marshaller.loads(use_string) except IOError:
#res = unmarshalled_usage.computer_partition_usage_list computer_consumption_model = \
pkg_resources.resource_string(
#LOG("check-2", 0, "%s" % res[0].usage) __name__,
'../../../../slapos/slap/doc/computer_consumption.xsd')
if self._validateXML(use_string, computer_consumption_model):
vifib_conduit_instance = VifibConduit.VifibConduit() vifib_conduit_instance = VifibConduit.VifibConduit()
#sub_object = vifib_conduit_instance.addNode(object=self,
vifib_conduit_instance.addNode(object=self,
xml=unmarshalled_usage.computer_partition_usage_list[0].usage)
#sub_object = vifib_conduit_instance.addNode(object=self, xml=res[0].usage) #We create the SPL
#self._reportComputerUsage(computer_document, use_string) vifib_conduit_instance.addNode(
object=self,
xml=use_string,
computer_id=computer_id)
else:
raise NotImplementedError("XML file sent by the node is not valid !")
return 'Content properly posted.' return 'Content properly posted.'
...@@ -345,6 +352,28 @@ class SlapTool(BaseTool): ...@@ -345,6 +352,28 @@ class SlapTool(BaseTool):
# Internal methods # Internal methods
#################################################### ####################################################
def _validateXML(self, to_be_validated, xsd_model):
"""Will validate the xml file"""
#We parse the XSD model
xsd_model = StringIO.StringIO(xsd_model)
xmlschema_doc = etree.parse(xsd_model)
xmlschema = etree.XMLSchema(xmlschema_doc)
string_to_validate = StringIO.StringIO(to_be_validated)
try:
document = etree.parse(string_to_validate)
except (etree.XMLSyntaxError, etree.DocumentInvalid) as e:
LOG('SlapTool::_validateXML', INFO,
'Failed to parse this XML reports : %s\n%s' % \
(to_be_validated, _formatXMLError(e)))
return False
if xmlschema.validate(document):
return True
return False
def _instanceXmlToDict(self, xml): def _instanceXmlToDict(self, xml):
result_dict = {} result_dict = {}
if xml is not None and xml != '': if xml is not None and xml != '':
......
...@@ -110,6 +110,8 @@ class testVifibMixin(ERP5TypeTestCase): ...@@ -110,6 +110,8 @@ class testVifibMixin(ERP5TypeTestCase):
'vifib_data_category', 'vifib_data_category',
'vifib_data_web', 'vifib_data_web',
'vifib_erp5', 'vifib_erp5',
'vifib_test',
'vifib_invoicing',
] ]
return result return result
......
...@@ -106,11 +106,13 @@ vifib_cash ...@@ -106,11 +106,13 @@ vifib_cash
vifib_core vifib_core
vifib_crm vifib_crm
vifib_forge_release vifib_forge_release
vifib_invoicing
vifib_jauks_theme vifib_jauks_theme
vifib_jauks_widget_library vifib_jauks_widget_library
vifib_open_trade vifib_open_trade
vifib_slap vifib_slap
vifib_software_pdm vifib_software_pdm
vifib_test
vifib_web vifib_web
erp5_km_theme erp5_km_theme
erp5_knowledge_pad erp5_knowledge_pad
...@@ -190,11 +192,13 @@ vifib_core ...@@ -190,11 +192,13 @@ vifib_core
vifib_crm vifib_crm
vifib_fiber_theme vifib_fiber_theme
vifib_forge_release vifib_forge_release
vifib_invoicing
vifib_jauks_theme vifib_jauks_theme
vifib_jauks_widget_library vifib_jauks_widget_library
vifib_open_trade vifib_open_trade
vifib_slap vifib_slap
vifib_software_pdm vifib_software_pdm
vifib_test
vifib_web vifib_web
erp5_free_fiber_request erp5_free_fiber_request
erp5_km_theme erp5_km_theme
...@@ -276,11 +280,13 @@ vifib_crm ...@@ -276,11 +280,13 @@ vifib_crm
vifib_forge_release vifib_forge_release
vifib_hosting vifib_hosting
vifib_hosting_theme vifib_hosting_theme
vifib_invoicing
vifib_jauks_theme vifib_jauks_theme
vifib_jauks_widget_library vifib_jauks_widget_library
vifib_open_trade vifib_open_trade
vifib_slap vifib_slap
vifib_software_pdm vifib_software_pdm
vifib_test
vifib_web vifib_web
erp5_km_theme erp5_km_theme
erp5_knowledge_pad erp5_knowledge_pad
...@@ -359,9 +365,11 @@ vifib_base ...@@ -359,9 +365,11 @@ vifib_base
vifib_core vifib_core
vifib_crm vifib_crm
vifib_forge_release vifib_forge_release
vifib_invoicing
vifib_open_trade vifib_open_trade
vifib_slap vifib_slap
vifib_software_pdm vifib_software_pdm
vifib_test
erp5_knowledge_pad erp5_knowledge_pad
erp5_simulation erp5_simulation
erp5_dms_base erp5_dms_base
...@@ -437,9 +445,11 @@ vifib_base ...@@ -437,9 +445,11 @@ vifib_base
vifib_core vifib_core
vifib_crm vifib_crm
vifib_forge_release vifib_forge_release
vifib_invoicing
vifib_open_trade vifib_open_trade
vifib_slap vifib_slap
vifib_software_pdm vifib_software_pdm
vifib_test
erp5_knowledge_pad erp5_knowledge_pad
erp5_simulation erp5_simulation
erp5_dms_base erp5_dms_base
...@@ -515,9 +525,11 @@ vifib_base ...@@ -515,9 +525,11 @@ vifib_base
vifib_core vifib_core
vifib_crm vifib_crm
vifib_forge_release vifib_forge_release
vifib_invoicing
vifib_open_trade vifib_open_trade
vifib_slap vifib_slap
vifib_software_pdm vifib_software_pdm
vifib_test
vifib_web vifib_web
erp5_free_fiber_request erp5_free_fiber_request
erp5_knowledge_pad erp5_knowledge_pad
...@@ -597,9 +609,11 @@ vifib_base ...@@ -597,9 +609,11 @@ vifib_base
vifib_core vifib_core
vifib_crm vifib_crm
vifib_forge_release vifib_forge_release
vifib_invoicing
vifib_open_trade vifib_open_trade
vifib_slap vifib_slap
vifib_software_pdm vifib_software_pdm
vifib_test
erp5_km erp5_km
erp5_km_theme erp5_km_theme
erp5_knowledge_pad erp5_knowledge_pad
...@@ -679,9 +693,11 @@ vifib_base ...@@ -679,9 +693,11 @@ vifib_base
vifib_core vifib_core
vifib_crm vifib_crm
vifib_forge_release vifib_forge_release
vifib_invoicing
vifib_open_trade vifib_open_trade
vifib_slap vifib_slap
vifib_software_pdm vifib_software_pdm
vifib_test
erp5_commerce_multiflex_layout erp5_commerce_multiflex_layout
erp5_knowledge_pad erp5_knowledge_pad
erp5_simulation erp5_simulation
...@@ -757,9 +773,11 @@ vifib_base ...@@ -757,9 +773,11 @@ vifib_base
vifib_core vifib_core
vifib_crm vifib_crm
vifib_forge_release vifib_forge_release
vifib_invoicing
vifib_open_trade vifib_open_trade
vifib_slap vifib_slap
vifib_software_pdm vifib_software_pdm
vifib_test
erp5_web_download_theme erp5_web_download_theme
erp5_knowledge_pad erp5_knowledge_pad
erp5_simulation erp5_simulation
......
...@@ -84,7 +84,7 @@ def unfakeSlapAuth(): ...@@ -84,7 +84,7 @@ def unfakeSlapAuth():
delattr(HTTPConnection, '_original_request') delattr(HTTPConnection, '_original_request')
class TestVifibSlapWebService(testVifibMixin): class TestVifibSlapWebServiceMixin(testVifibMixin):
""" """
Check the slap behaviour on ERP5 documents Check the slap behaviour on ERP5 documents
""" """
...@@ -920,6 +920,177 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -920,6 +920,177 @@ class TestVifibSlapWebService(testVifibMixin):
Logout \ Logout \
' '
prepare_children_a_children_b_sequence_string = \
prepare_install_requested_computer_partition_sequence_string + \
"""
LoginDefaultUser
SetRootSoftwareInstanceCurrentInstance
SelectRequestedReferenceChildrenA
SelectEmptyRequestedParameterDict
Logout
SlapLoginCurrentSoftwareInstance
RequestComputerPartitionNotReadyResponse
Tic
RequestComputerPartition
Tic
SlapLogout
LoginDefaultUser
SetChildrenAComputerPartition
SelectRequestedReferenceChildrenB
SelectEmptyRequestedParameterDict
Logout
SlapLoginCurrentSoftwareInstance
RequestComputerPartitionNotReadyResponse
Tic
RequestComputerPartition
Tic
SlapLogout
LoginDefaultUser
SetChildrenBComputerPartition
Logout
"""
computer_with_software_release = """
CreateComputer
Tic
CreatePurchasePackingList
Tic
CreatePurchasePackingListLine
Tic
SelectNewSoftwareReleaseUri
CreateSoftwareRelease
Tic \
SubmitSoftwareRelease \
Tic \
CreateSoftwareProduct \
Tic \
ValidateSoftwareProduct \
Tic \
SetSoftwareProductToSoftwareRelease \
PublishByActionSoftwareRelease \
Tic
SetPurchasePackingListLineSetupResource
SetPurchasePackingListLineAggregate
ConfirmPurchasePackingList
StopPurchasePackingList
Tic
"""
requesting_computer_partition_with_software_instance = """
SelectNewComputerPartitionReference
CreateComputerPartition
CreateSalePackingList
Tic
CreateSalePackingListLine
Tic
SetSalePackingListLineSetupResource
SetSalePackingListLineAggregate
ConfirmSalePackingList
Tic
"""
slave_owner_computer_partition_with_software_instance = """
SelectNewComputerPartitionReference
CreateComputerPartition
SetSoftwareInstanceTitle
CreateSalePackingList
Tic
CreateSalePackingListLine
Tic
SetSalePackingListLineSetupResource
SetSalePackingListLineAggregate
ConfirmSalePackingList
Tic
SetComputerPartitionQuantity
Tic
SelectCurrentComputerPartitionAsSlaveOwner
"""
check_positive_request_shared = """
RequestSharedComputerPartitionNotReadyResponse
Tic
RequestSharedComputerPartition
CheckSoftwareInstanceAndRelatedSlavePartition
CheckRequestedSoftwareInstanceAndRelatedSlavePartition
"""
prepare_two_purchase_packing_list = \
prepare_software_release_purchase_packing_list + '\
LoginDefaultUser \
SetCurrentPurchasePackingListAsA \
StartPurchasePackingList \
StopPurchasePackingList \
Tic \
Logout \
SlapLoginCurrentComputer \
CheckEmptyComputerGetSoftwareReleaseListCall \
SlapLogout ' + \
prepare_software_release_confirmed_packing_list + '\
LoginDefaultUser \
SetCurrentPurchasePackingListAsB \
CheckStoppedPurchasePackingListA \
CheckConfirmedPurchasePackingListB \
Logout'
prepare_another_computer_sequence_string = """
StoreComputerReference
LoginTestVifibAdmin
CreateComputer
Tic
Logout
SlapLoginCurrentComputer
FormatComputer
Tic
SlapLogout""" + prepare_software_release_confirmed_packing_list + """
LoginTestVifibAdmin
RequestSoftwareInstallation
Tic
Logout
SlapLoginCurrentComputer
ComputerSoftwareReleaseAvailable
Tic
SlapLogout
SetRequestedFilterParameterDict
RestoreComputerReference
"""
prepare_started_slave_instance_sequence_string = \
prepare_started_computer_partition_sequence_string + """
LoginTestVifibCustomer
PersonRequestSlaveInstance
SlapLogout
LoginDefaultUser
ConfirmOrderedSaleOrderActiveSense
Tic
SlapLogout
SlapLoginCurrentComputer
SoftwareInstanceAvailable
Tic
LoginTestVifibCustomer
RequestStopSoftwareInstanceFromCurrentComputerPartition
Tic
SoftwareInstanceStopped
Tic
StartSoftwareInstanceFromCurrentComputerPartition
Tic
SoftwareInstanceStarted
Tic
Logout
LoginDefaultUser
SetDeliveryLineAmountEqualTwo
CheckComputerPartitionInstanceHostingSalePackingListStarted
CheckComputerPartitionInstanceSetupSalePackingListStopped
Logout
"""
######################################## ########################################
# Steps # Steps
######################################## ########################################
...@@ -3193,6 +3364,7 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -3193,6 +3364,7 @@ class TestVifibSlapWebService(testVifibMixin):
self._checkSoftwareInstanceAndRelatedPartition(predecessor) self._checkSoftwareInstanceAndRelatedPartition(predecessor)
class TestVifibSlapWebService(TestVifibSlapWebServiceMixin):
######################################## ########################################
# slap.initializeConnection # slap.initializeConnection
######################################## ########################################
...@@ -4085,40 +4257,6 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -4085,40 +4257,6 @@ class TestVifibSlapWebService(testVifibMixin):
sequence_list.addSequenceString(sequence_string) sequence_list.addSequenceString(sequence_string)
sequence_list.play(self) sequence_list.play(self)
prepare_children_a_children_b_sequence_string = \
prepare_install_requested_computer_partition_sequence_string + \
"""
LoginDefaultUser
SetRootSoftwareInstanceCurrentInstance
SelectRequestedReferenceChildrenA
SelectEmptyRequestedParameterDict
Logout
SlapLoginCurrentSoftwareInstance
RequestComputerPartitionNotReadyResponse
Tic
RequestComputerPartition
Tic
SlapLogout
LoginDefaultUser
SetChildrenAComputerPartition
SelectRequestedReferenceChildrenB
SelectEmptyRequestedParameterDict
Logout
SlapLoginCurrentSoftwareInstance
RequestComputerPartitionNotReadyResponse
Tic
RequestComputerPartition
Tic
SlapLogout
LoginDefaultUser
SetChildrenBComputerPartition
Logout
"""
def test_ComputerPartition_request_twiceDifferentParent(self): def test_ComputerPartition_request_twiceDifferentParent(self):
""" """
Checks that requesting twice with same arguments from different Computer Checks that requesting twice with same arguments from different Computer
...@@ -4404,32 +4542,6 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -4404,32 +4542,6 @@ class TestVifibSlapWebService(testVifibMixin):
sequence['requested_filter_dict'] = dict( sequence['requested_filter_dict'] = dict(
computer_guid=sequence['computer_reference']) computer_guid=sequence['computer_reference'])
prepare_another_computer_sequence_string = """
StoreComputerReference
LoginTestVifibAdmin
CreateComputer
Tic
Logout
SlapLoginCurrentComputer
FormatComputer
Tic
SlapLogout""" + prepare_software_release_confirmed_packing_list + """
LoginTestVifibAdmin
RequestSoftwareInstallation
Tic
Logout
SlapLoginCurrentComputer
ComputerSoftwareReleaseAvailable
Tic
SlapLogout
SetRequestedFilterParameterDict
RestoreComputerReference
"""
def test_ComputerPartition_request_filter_computer_guid(self): def test_ComputerPartition_request_filter_computer_guid(self):
""" """
Check that requesting with filter computer_guid key works as expected Check that requesting with filter computer_guid key works as expected
...@@ -5199,35 +5311,6 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -5199,35 +5311,6 @@ class TestVifibSlapWebService(testVifibMixin):
sequence_list.addSequenceString(sequence_string) sequence_list.addSequenceString(sequence_string)
sequence_list.play(self) sequence_list.play(self)
prepare_started_slave_instance_sequence_string = \
prepare_started_computer_partition_sequence_string + """
LoginTestVifibCustomer
PersonRequestSlaveInstance
SlapLogout
LoginDefaultUser
ConfirmOrderedSaleOrderActiveSense
Tic
SlapLogout
SlapLoginCurrentComputer
SoftwareInstanceAvailable
Tic
LoginTestVifibCustomer
RequestStopSoftwareInstanceFromCurrentComputerPartition
Tic
SoftwareInstanceStopped
Tic
StartSoftwareInstanceFromCurrentComputerPartition
Tic
SoftwareInstanceStarted
Tic
Logout
LoginDefaultUser
SetDeliveryLineAmountEqualTwo
CheckComputerPartitionInstanceHostingSalePackingListStarted
CheckComputerPartitionInstanceSetupSalePackingListStopped
Logout
"""
def test_SlaveInstance_call_destroy_from_SoftwareInstance(self): def test_SlaveInstance_call_destroy_from_SoftwareInstance(self):
""" """
Check that the Slave Instance will be stopped correctly when Check that the Slave Instance will be stopped correctly when
...@@ -6642,24 +6725,6 @@ class TestVifibSlapWebService(testVifibMixin): ...@@ -6642,24 +6725,6 @@ class TestVifibSlapWebService(testVifibMixin):
def stepSetDeliveryLineAmountEqualOne(self, sequence): def stepSetDeliveryLineAmountEqualOne(self, sequence):
sequence.edit(delivery_line_amount=1) sequence.edit(delivery_line_amount=1)
prepare_two_purchase_packing_list = \
prepare_software_release_purchase_packing_list + '\
LoginDefaultUser \
SetCurrentPurchasePackingListAsA \
StartPurchasePackingList \
StopPurchasePackingList \
Tic \
Logout \
SlapLoginCurrentComputer \
CheckEmptyComputerGetSoftwareReleaseListCall \
SlapLogout ' + \
prepare_software_release_confirmed_packing_list + '\
LoginDefaultUser \
SetCurrentPurchasePackingListAsB \
CheckStoppedPurchasePackingListA \
CheckConfirmedPurchasePackingListB \
Logout'
def test_Computer_getSoftwareReleaseList_twoPurchasePackingList(self): def test_Computer_getSoftwareReleaseList_twoPurchasePackingList(self):
""" """
Check that calling Computer.getSoftwareReleaseList uses the Check that calling Computer.getSoftwareReleaseList uses the
......
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (c) 2010 Nexedi SA and Contributors. All Rights Reserved.
# Nicolas Godbert <ngodbert@tiolive.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 advised 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.
#
#############################################################################
import unittest
import time
import transaction
from DateTime import DateTime
from lxml import etree
from slapos import slap
from testVifibSlapWebService import TestVifibSlapWebServiceMixin
from Products.ERP5Type.tests.Sequence import SequenceList
from Testing.ZopeTestCase.PortalTestCase import PortalTestCase
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestVifibUsageReport))
return suite
class TestVifibUsageReportMixin(TestVifibSlapWebServiceMixin):
prepare_confirmed_cleanup_resource_packing_list2 = """ \
LoginTestVifibAdmin \
RequestSoftwareInstallation \
Tic \
Logout \
\
SlapLoginCurrentComputer \
ComputerSoftwareReleaseAvailable \
Tic \
SlapLogout \
\
LoginTestVifibCustomer \
PersonRequestSoftwareInstance \
Tic \
Logout \
\
LoginDefaultUser \
ConfirmOrderedSaleOrderActiveSense \
Tic \
SetSelectedComputerPartition \
SelectCurrentlyUsedSalePackingListUid \
Logout \
\
LoginDefaultUser \
CheckComputerPartitionInstanceSetupSalePackingListConfirmed \
Logout \
\
SlapLoginCurrentComputer \
SoftwareInstanceBuilding \
Tic \
SlapLogout \
\
LoginDefaultUser \
CheckComputerPartitionInstanceSetupSalePackingListStarted \
Logout \
\
SlapLoginCurrentComputer \
SoftwareInstanceAvailable \
Tic \
SlapLogout \
\
LoginDefaultUser \
SetSelectedComputerPartition \
CheckComputerPartitionInstanceSetupSalePackingListStopped \
CheckComputerPartitionInstanceHostingSalePackingListConfirmed \
Logout \
\
LoginDefaultUser \
CreateSalePackingList \
Tic \
CreateSalePackingListLine \
Tic \
SetSalePackingListLineCleanupResource \
SetSalePackingListLineAggregate \
ConfirmSalePackingList \
Tic \
Logout \
"""
prepare_configured_instance = """ \
InitializeTime \
\
LoginERP5TypeTestCase \
ConfigureInstance \
Tic \
Logout""" + \
TestVifibSlapWebServiceMixin.prepare_confirmed_cleanup_resource_packing_list
prepare_reported_usage_call = """ \
SlapLoginCurrentComputer \
SlapReportUsageCall \
Tic \
SlapLogout"""
def stepInitializeTime(self, sequence=None):
sequence['start'] = DateTime()
sequence['first_call'] = False
sequence['second_call'] = False
def stepConfigureInstance(self, sequence, **kw):
"""
Configures the Instance
"""
portal = self.getPortalObject()
# We validate some documents
for rule in portal.portal_rules.contentValues():
if rule.getObject().getValidationState() == 'draft':
rule.getObject().validate()
for person in portal.person_module.contentValues():
if person.getObject().getValidationState() == 'draft':
person.getObject().validate()
for business_process in portal.business_process_module.contentValues():
if business_process.getObject().getValidationState() == 'draft':
business_process.getObject().validate()
for sale_trade in portal.sale_trade_condition_module.contentValues():
if sale_trade.getObject().getValidationState() == 'draft':
sale_trade.getObject().validate()
def stepSlapReportUsageCall(self, sequence, **kw):
"""
Checks that slap.reportUsage is successfully called.
"""
# We check if this is the first time that a node send a usage report
if sequence['first_call'] == True:
sequence['second_call'] = True
else:
sequence['first_call'] = True
# We retrieve an example of XML report sent by a node
vifib_test_folder = self.getPortalObject().portal_skins.vifib_test
usage_string = \
vifib_test_folder.ERP5Site_getUsageReportTestSample(
self.purchase_packing_list_quantity)
sequence['initial_xml'] = usage_string
#We send the XML report to the Master
slap_object = slap.slap()
slap_object.initializeConnection(self.server_url)
slap_object._connection_helper.POST(
'/useComputer',
{'computer_id': sequence['computer_reference'],
'use_string': usage_string})
def stepBuildSalePackingList(self, sequence, **kw):
"""
Builds Sale Packing List
"""
portal = self.getPortalObject()
# We retrieve vifib_sale_invoice_builder object
portal_deliveries_object = \
portal['portal_deliveries']
vifib_sale_invoice_builder = \
portal_deliveries_object['vifib_sale_invoice_builder']
# Then, we build existing Sale Packing List
vifib_sale_invoice_builder.build()
def stepCheckCreatedSalePackingList(self, sequence, **kw):
"""
Checks that it is present in the system.
"""
#We retrieve the sale packing list module
sale_packing_list_portal_type = 'Sale Packing List'
portal = self.getPortalObject()
sale_packing_list_module = \
portal.getDefaultModule(sale_packing_list_portal_type)
#We retrieve the Sale Packing List
sale_packing_list_list = sale_packing_list_module.searchFolder(
title='Resource consumptions',
creation_date={
'query' : sequence['start'],
'range' : 'min'})
self.assertEquals(len(sale_packing_list_list), 1)
sale_packing_list = sale_packing_list_list[0]
sequence['sale_packing_list'] = sale_packing_list
def stepCheckCompleteSalePackingList(self, sequence, **kw):
"""
Checks if the Sale Packing List is properly completed
"""
#We retrieve the Sale Packing List Lines
sale_packing_list = sequence['sale_packing_list']
xml = sale_packing_list.PackingList_generateUsageReport()
initial_xml = sequence['initial_xml']
#We parse XML reports to check if they are the same
parser = etree.XMLParser(remove_blank_text=True)
initial_xml = etree.tostring(etree.XML(initial_xml, parser))
xml = etree.tostring(etree.XML(xml, parser))
sequence.edit(check_quantity='first')
self.assertEquals(xml, initial_xml)
def stepCheckSaleInvoiceExists(self, sequence, **kw):
"""
Checks if a sale invoice exists.
"""
#We retrieve the Accounting module
accounting_portal_type = 'Accounting'
portal = self.getPortalObject()
accounting_module = \
portal.getDefaultModule(accounting_portal_type)
#We retrieve the Sale Invoice
sale_invoice_list = accounting_module.searchFolder(
title='Resource consumptions',
creation_date={
'query' : sequence['start'],
'range' : 'min'})
self.assertEquals(len(sale_invoice_list), self.sale_invoice_list_quantity)
for sale_invoice in sale_invoice_list:
self.assertEquals(sale_invoice.getTitle(), 'Resource consumptions')
self.assertEquals(sale_invoice.getSimulationState(), 'planned')
sequence.edit(sale_invoice_list=sale_invoice_list)
def stepCheckSaleInvoiceQuantitySinglePartition(self, sequence, **kw):
"""
Checks quantities in the new sale invoice
"""
# We retrieve the sale invoice
sale_invoice = sequence['sale_invoice_list']
self.assertEquals(len(sale_invoice), self.sale_invoice_list_quantity)
sale_invoice_line_list = sale_invoice[0].getObject().contentValues(
portal_type='Invoice Line')
self.assertEquals(
len(sale_invoice_line_list),
self.sale_invoice_line_list_quantity)
# Then, we check quantities in sale invoice's lines
for sale_invoice_line in sale_invoice_line_list:
self.assertEquals(
sale_invoice_line.getQuantity(),
self.sale_invoice_line_quantity)
def stepClearModules(self, sequence, **kw):
"""
Clear the Sale Packing List and Accounting Modules before to begin the other test
"""
portal = self.getPortalObject()
module_portal_type_list = [
'Accounting',
'Sale Packing List']
for module_portal_type in module_portal_type_list:
module_object = \
portal.getDefaultModule(module_portal_type)
result_tuple = module_object.searchFolder(
title='Resource consumptions',
creation_date={
'query' : sequence['start'],
'range' : 'min'})
for result in result_tuple:
document = result.getObject()
module_object.manage_delObjects(document.getId())
def stepCheckSaleInvoiceQuantityTwoPartitions(self, sequence, **kw):
"""
Checks quantities in new sale invoices
"""
# If this is the second call, we check if quantities have been doubled
if sequence['second_call'] == True:
quantity1 = self.sale_invoice1_line_quantity * 2
quantity2 = self.sale_invoice2_line_quantity * 2
else:
quantity1 = self.sale_invoice1_line_quantity
quantity2 = self.sale_invoice2_line_quantity
# We retrieve sale invoice list
sale_invoice_list = sequence['sale_invoice_list']
self.assertEquals(len(sale_invoice_list), self.sale_invoice_list_quantity)
# We retrieve computer
computer_id = sequence['computer_reference']
computer = self.getPortal().computer_module.searchFolder(
title = computer_id)[0].getObject()
for sale_invoice in sale_invoice_list:
sale_invoice_line_list = \
sale_invoice.contentValues(portal_type='Invoice Line')
# We check the number of line in sale invoices
self.assertEquals(
len(sale_invoice_line_list),
self.sale_invoice_line_list_quantity)
# Then, we check quantities in these lines
for sale_invoice_line in sale_invoice_line_list:
partition_id = \
sale_invoice_line.getItemIdList()[0]
partition_title = computer.searchFolder(
id = partition_id)[0].getObject().getTitle()
if partition_title == 'slappart0':
self.assertEquals(sale_invoice_line.getQuantity(), quantity1)
else:
self.assertEquals(sale_invoice_line.getQuantity(), quantity2)
class TestVifibUsageReport(TestVifibUsageReportMixin):
def getTitle(self):
return "testVifibUsageReport"
def test_usageReportWithSinglePartition(self):
"""
Checks if useComputer method of SlapTool is properly called one time.
"""
self.computer_partition_amount = 1
self.purchase_packing_list_quantity = 1
self.sale_invoice_list_quantity = 1
self.sale_invoice_line_list_quantity = 2
self.sale_invoice_line_quantity = 42.42
sequence_list = SequenceList()
sequence_string = \
self.prepare_configured_instance + \
self.prepare_reported_usage_call + """ \
LoginERP5TypeTestCase \
BuildSalePackingList \
Tic \
CheckCreatedSalePackingList \
CheckCompleteSalePackingList \
CheckSaleInvoiceExists \
CheckSaleInvoiceQuantitySinglePartition \
ClearModules \
Logout"""
sequence_list.addSequenceString(sequence_string)
sequence_list.play(self)
def test_usageReportWithTwoPartitions(self):
"""
Checks if useComputer method of SlapTool is properly called two times.
"""
self.computer_partition_amount = 2
self.purchase_packing_list_quantity = 2
self.sale_invoice_list_quantity = 2
self.sale_invoice_line_list_quantity = 2
self.sale_invoice1_line_quantity = 42.42
self.sale_invoice2_line_quantity = 46.46
sequence_list = SequenceList()
sequence_string = \
self.prepare_configured_instance + \
self.prepare_confirmed_cleanup_resource_packing_list2 + \
self.prepare_reported_usage_call + """ \
LoginERP5TypeTestCase \
BuildSalePackingList \
Tic \
CheckCreatedSalePackingList \
CheckCompleteSalePackingList \
CheckSaleInvoiceExists \
CheckSaleInvoiceQuantityTwoPartitions \
Logout """ + self.prepare_reported_usage_call + """ \
LoginERP5TypeTestCase \
BuildSalePackingList \
Tic \
CheckSaleInvoiceExists \
CheckSaleInvoiceQuantityTwoPartitions \
Logout"""
sequence_list.addSequenceString(sequence_string)
sequence_list.play(self)
...@@ -53,6 +53,7 @@ from utils import dropPrivileges ...@@ -53,6 +53,7 @@ from utils import dropPrivileges
from utils import SlapPopen from utils import SlapPopen
from svcbackend import launchSupervisord from svcbackend import launchSupervisord
import tempfile import tempfile
from time import strftime
import StringIO import StringIO
from lxml import etree from lxml import etree
...@@ -531,22 +532,85 @@ class Slapgrid(object): ...@@ -531,22 +532,85 @@ class Slapgrid(object):
logger.info("Finished computer partitions...") logger.info("Finished computer partitions...")
return clean_run return clean_run
def validateXML(self, to_be_validated): def validateXML(self, to_be_validated, xsd_model):
"""Will validate the xml file""" """Validates a given xml file"""
#We get the xsd model logger = logging.getLogger('XMLValidating')
fed = open('choose_the_path', 'r')
model = StringIO.StringIO(fed.read()) #We retrieve the xsd model
xmlschema_doc = etree.parse(model) xsd_model = StringIO.StringIO(xsd_model)
xmlschema_doc = etree.parse(xsd_model)
xmlschema = etree.XMLSchema(xmlschema_doc) xmlschema = etree.XMLSchema(xmlschema_doc)
string_to_validate = StringIO.StringIO(to_be_validated) string_to_validate = StringIO.StringIO(to_be_validated)
try:
document = etree.parse(string_to_validate) document = etree.parse(string_to_validate)
except (etree.XMLSyntaxError, etree.DocumentInvalid) as e:
logger.info('Failed to parse this XML report : %s\n%s' % \
(to_be_validated, _formatXMLError(e)))
logger.error(_formatXMLError(e))
return False
if xmlschema.validate(document): if xmlschema.validate(document):
return True return True
return False return False
def asXML(self, computer_partition_usage_list):
"""Generates a XML report from computer partition usage list
"""
xml_head = ""
xml_movements = ""
xml_foot = ""
xml_head = "<?xml version='1.0' encoding='utf-8'?>" \
"<journal>" \
"<transaction type=\"Sale Packing List\">" \
"<title>Resource consumptions</title>" \
"<start_date></start_date>" \
"<stop_date>%s</stop_date>" \
"<reference>%s</reference>" \
"<currency></currency>" \
"<payment_mode></payment_mode>" \
"<category></category>" \
"<arrow type=\"Administration\">" \
"<source></source>" \
"<destination></destination>" \
"</arrow>" \
% (strftime("%Y-%m-%d at %H:%M:%S"),
self.computer_id)
for computer_partition_usage in computer_partition_usage_list:
try:
usage_string = StringIO.StringIO(computer_partition_usage.usage)
root = etree.parse(usage_string)
except UnicodeError:
logger.info("Failed to read %s." % (computer_partition_usage.usage))
logger.error(UnicodeError)
raise "Failed to read %s." % (computer_partition_usage.usage)
except (etree.XMLSyntaxError, etree.DocumentInvalid) as e:
logger.info("Failed to parse %s." % (usage_string))
logger.error(e)
raise _formatXMLError(e)
except Exception:
raise "Failed to generate XML report."
for movement in root.findall('movement'):
xml_movements += "<movement>"
for children in movement.getchildren():
if children.tag == "reference":
xml_movements += "<%s>%s</%s>" % (children.tag, computer_partition_usage.getId(), children.tag)
else:
xml_movements += "<%s>%s</%s>" % (children.tag, children.text, children.tag)
xml_movements += "</movement>"
xml_foot = "</transaction>" \
"</journal>"
xml = xml_head + xml_movements + xml_foot
return xml
def agregateAndSendUsage(self): def agregateAndSendUsage(self):
"""Will agregate usage from each Computer Partition. """Will agregate usage from each Computer Partition.
""" """
...@@ -555,6 +619,29 @@ class Slapgrid(object): ...@@ -555,6 +619,29 @@ class Slapgrid(object):
logger = logging.getLogger('UsageReporting') logger = logging.getLogger('UsageReporting')
logger.info("Aggregating and sending usage reports...") logger.info("Aggregating and sending usage reports...")
#We retrieve XSD models
try:
computer_consumption_model = \
pkg_resources.resource_string(
'slapos.slap',
'doc/computer_consumption.xsd')
except IOError:
computer_consumption_model = \
pkg_resources.resource_string(
__name__,
'../../../../slapos/slap/doc/computer_consumption.xsd')
try:
partition_consumption_model = \
pkg_resources.resource_string(
'slapos.slap',
'doc/partition_consumption.xsd')
except IOError:
partition_consumption_model = \
pkg_resources.resource_string(
__name__,
'../../../../slapos/slap/doc/partition_consumption.xsd')
clean_run = True clean_run = True
#We loop on the different computer partitions #We loop on the different computer partitions
for computer_partition in slap_computer_usage.getComputerPartitionList(): for computer_partition in slap_computer_usage.getComputerPartitionList():
...@@ -617,6 +704,7 @@ class Slapgrid(object): ...@@ -617,6 +704,7 @@ class Slapgrid(object):
#Now we loop through the different computer partitions to ggetId()et reports #Now we loop through the different computer partitions to ggetId()et reports
report_usage_issue_cp_list = [] report_usage_issue_cp_list = []
for computer_partition in slap_computer_usage.getComputerPartitionList(): for computer_partition in slap_computer_usage.getComputerPartitionList():
filename_delete_list = []
computer_partition_id = computer_partition.getId() computer_partition_id = computer_partition.getId()
instance_path = os.path.join(self.instance_root, computer_partition_id) instance_path = os.path.join(self.instance_root, computer_partition_id)
dir_reports = os.path.join(instance_path, 'var', 'xml_report') dir_reports = os.path.join(instance_path, 'var', 'xml_report')
...@@ -634,36 +722,52 @@ class Slapgrid(object): ...@@ -634,36 +722,52 @@ class Slapgrid(object):
file_path = os.path.join(dir_reports, filename) file_path = os.path.join(dir_reports, filename)
if os.path.exists(file_path): if os.path.exists(file_path):
usage_file = open(file_path, 'r') usage_file = open(file_path, 'r')
usage += usage_file.read() usage = usage_file.read()
usage_file.close() usage_file.close()
#We check the validity of xml content of each reports
if not self.validateXML(usage, partition_consumption_model):
logger.info('WARNING: The XML file %s generated by slapreport is not valid - ' \
'This report is left as is at %s where you can inspect what went wrong ' % (filename, dir_reports))
#Warn the SlapOS Master that a partition generates corrupted xml report
else:
computer_partition_usage = self.slap.registerComputerPartition( computer_partition_usage = self.slap.registerComputerPartition(
self.computer_id, computer_partition_id) self.computer_id, computer_partition_id)
computer_partition_usage.setUsage(usage) computer_partition_usage.setUsage(usage)
computer_partition_usage_list.append(computer_partition_usage) computer_partition_usage_list.append(computer_partition_usage)
filename_delete_list.append(filename)
else: else:
logger.debug("Usage report %r not found, ignored" % file_path) logger.debug("Usage report %r not found, ignored" % file_path)
#-XXX-Here we'll have a "validate_xml" function
#if not self.validateXML(usage):
## logger.debug("WARNING: The file xml %s is not valid " %
# os.path.join(dir_reports, filename))
if filename_list:
logger.debug("Sending usage informations and terminating for "
"partition %s..." % os.path.basename(instance_path))
#logger.debug('file %s' % usage)
else:
logger.debug("No usage file created for partition %s..." \
% os.path.basename(instance_path))
#last_push_date = self.computer.getLastUsagePush() #last_push_date = self.computer.getLastUsagePush()
#periodicity_timedelta = datetime.timedelta( #periodicity_timedelta = datetime.timedelta(
# self.usage_report_periodicity) # self.usage_report_periodicity)
#if periodicity_timedelta + last_push_date < datetime.datetime.today(): #if periodicity_timedelta + last_push_date < datetime.datetime.today():
# Pushes informations, if any # Pushes informations, if any
#After sending the aggregated file we remove all the valid xml reports
for filename in filename_delete_list:
os.remove(os.path.join(dir_reports, filename))
for computer_partition_usage in computer_partition_usage_list:
logger.info('computer_partition_usage_list : %s - %s' % \
(computer_partition_usage.usage, computer_partition_usage.getId()))
#If there is, at least, one report
if computer_partition_usage_list != []:
try: try:
slap_computer_usage.reportUsage(computer_partition_usage_list) #We generate the final XML report with asXML method
computer_consumption = self.asXML(computer_partition_usage_list)
logger.info('Final xml report : %s' % computer_consumption)
#We test the XML report before sending it
if self.validateXML(computer_consumption, computer_consumption_model):
logger.info('XML file generated by asXML is valid')
slap_computer_usage.reportUsage(computer_consumption)
else:
logger.info('XML file generated by asXML is not valid !')
raise 'XML file generated by asXML is not valid !'
except Exception: except Exception:
computer_partition_id = computer_partition.getId() computer_partition_id = computer_partition.getId()
exception = traceback.format_exc() exception = traceback.format_exc()
...@@ -673,10 +777,6 @@ class Slapgrid(object): ...@@ -673,10 +777,6 @@ class Slapgrid(object):
computer_partition.error(issue) computer_partition.error(issue)
report_usage_issue_cp_list.append(computer_partition_id) report_usage_issue_cp_list.append(computer_partition_id)
#After sending the aggregated file we remove everything in the folder
for filename in filename_list:
os.remove(os.path.join(dir_reports, filename))
for computer_partition in slap_computer_usage.getComputerPartitionList(): for computer_partition in slap_computer_usage.getComputerPartitionList():
computer_partition_id = computer_partition.getId() computer_partition_id = computer_partition.getId()
try: try:
......
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Define the XML Schema of a transaction -->
<xs:element name="journal">
<xs:complexType>
<xs:sequence>
<xs:element name="transaction" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" minOccurs="0"/>
<xs:element name="start_date" type="xs:string"/>
<xs:element name="stop_date" type="xs:string"/>
<xs:element name="reference" type="xs:string"/>
<xs:element name="currency" type="xs:string"/>
<xs:element name="payment_mode" type="xs:string"/>
<xs:element name="category" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="arrow" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="source" type="xs:string" minOccurs="0"/>
<xs:element name="destination" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="type" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="movement" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="resource" type="xs:string"/>
<xs:element name="title" type="xs:string" minOccurs="0"/>
<xs:element name="reference" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:float"/>
<xs:element name="price" type="xs:float"/>
<xs:element name="VAT" type="xs:string"/>
<xs:element name="category" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="type" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Define the XML Schema of a consumption of a partition -->
<xs:element name="consumption">
<xs:complexType>
<xs:sequence>
<xs:element name="movement" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="resource" type="xs:string"/>
<xs:element name="title" type="xs:string" minOccurs="0"/>
<xs:element name="reference" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:float"/>
<xs:element name="price" type="xs:float"/>
<xs:element name="VAT" type="xs:string"/>
<xs:element name="category" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
...@@ -212,15 +212,12 @@ class Computer(SlapDocument): ...@@ -212,15 +212,12 @@ class Computer(SlapDocument):
def getComputerPartitionList(self): def getComputerPartitionList(self):
return [x for x in self._computer_partition_list if x._need_modification] return [x for x in self._computer_partition_list if x._need_modification]
def reportUsage(self, computer_partition_list): def reportUsage(self, computer_usage):
if computer_partition_list == []: if computer_usage == "":
return return
computer = Computer(self._computer_id)
computer.computer_partition_usage_list = computer_partition_list
marshalled_slap_usage = xml_marshaller.dumps(computer)
self._connection_helper.POST('/useComputer', { self._connection_helper.POST('/useComputer', {
'computer_id': self._computer_id, 'computer_id': self._computer_id,
'use_string': marshalled_slap_usage}) 'use_string': computer_usage})
def updateConfiguration(self, xml): def updateConfiguration(self, xml):
self._connection_helper.POST( self._connection_helper.POST(
......
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