Commit 90c563db authored by Boxiang Sun's avatar Boxiang Sun

erp5_user_tutorial: Update user-Howto.Manage.Packing.Lists

parent 9c53df82
<section class="master">
<h1>How to Manage Packing Lists</h1>
<footer>
by <a href="http://www.osoe-project.org/contact">OSOE Project</a>
</footer>
<details open="open">
<p>
When you validate a Sale Order, as seen in the previous tutorial <a href="user-Howto.Create.Sale.Orders/view">"How to create Sale Orders"</a>, ERP5 automatically creates the related <strong>“Sale Packing List”</strong>
. Thanks to it, you will be able to track the shipment of the goods related to the order.
</p><p>The goal of this tutorial is to explain how to manage Sale Packing Lists, in order to have the goods shipped and delivered.</p><p>
This is a two step procedure: first, the order needs to be shipped and, when it reaches the clients warehouse, the status must be turned into <strong>“Delivered”</strong>
.
</p>
</details>
<test>
<table style="display: none;" class="test">
<tbody>
<tr class="" style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/init_test_environment"&gt;init&lt;/span&gt;</td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td>openAndWait</td>
<td>${base_url}/Zuite_createFunctionalTestUser</td>
<td></td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td>verifyTextPresent</td>
<td>Done.</td>
<td></td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td>openAndWait</td>
<td>${base_url}/Zuite_setUpSaleOrderTest</td>
<td></td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td>verifyTextPresent</td>
<td>Init Ok</td>
<td></td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td>openAndWait</td>
<td>${base_url}/Zuite_setUpSalePackingListTest</td>
<td></td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Init Ok</td>
<td></td>
</tr>
<tr class="" style="opacity: 1; z-index: 0;">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr class="" style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/login_as_functional_test_user"&gt;Login As Functional Test User&lt;/span&gt;</td>
</tr>
</tbody>
</table>
</test>
</section><section class="">
<h1>Agenda</h1>
<ul>
<li>How to reach a Packing List</li>
<li>How to define Packing Lists</li>
<li>How to declare a shipment</li>
<li>How to generate invoices from packing lists</li>
</ul>
<test>
<table style="display: none;" class="test">
<tbody>
<tr style="opacity: 1; z-index: 0;" class="">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/invoke_simulation_alarms"&gt; Invoke simulation alarms &lt;/span&gt;</td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
</tbody>
</table>
</test>
</section><section class="illustration">
<h1>Managing a Packing List</h1>
<img type="image/png" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Model?format=png" title="Delivery Flow" alt="Delivery Flow">
<details open="open">
<p>As you can see in the drawing, the different steps of managing a Packing List can be linked with real people in the company.</p><p>The principle of workflow based application makes sense in this case. Indeed, once the Sale Order has been registered and confirmed by the sales manager, the employee from the warehouse will prepare the automatically generated Sale Packing List related to the order. Thanks to the workflow, the sales manager will be aware that the order is ready to be sent and will give the order to “Ship” the goods. Once the client receives the goods, checks them and gives feedback, the sales manager will then change the status to “Delivered”.</p><p>In this way, it is possible to track the whole shipment process, thanks to ERP5.</p>
</details>
<test>
<table style="display: none;" class="test">
<tbody></tbody>
</table>
</test>
</section><section class="screenshot">
<h1>Sale Packing List</h1>
<img type="image/png" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.View?format=png" title="Packing List View Tab" alt="Packing List View Tab">
<details open="open">
<p>
From the previous tutorial <a href="user-Howto.Create.Sale.Orders/view">"How to create Sale Orders"</a>, you have learned to generate the related Sale Packing List automatically by confirming the Sale Order, and reach the Sale Packing List by using the "Jump ..." menu.
</p><p>
Now that you are on the initial view form of the Packing List related to your Sale Order, you can start <strong>filling out the the missing information</strong>
where it is not filled automatically.
</p><p>
Note: <strong>Most data in the View tab and the other tabs (Details, Payment, Profile) should have been updated automatically from the Sale Order</strong>
, so you will not have much to do now. If some fields have not been updated, it means that those fields have not been filled out correctly in the related Sale Order. This is why we recommend to properly fill out the Sale Orders before generating Packing Lists.
</p>
</details>
<test>
<table style="display: none;" class="test">
<tbody>
<tr style="opacity: 1; z-index: 0;">
<td>openAndWait</td>
<td>${base_url}</td>
<td></td>
</tr>
<tr>
<td>selectAndWait</td>
<td>//select[@name="select_module"]</td>
<td>Sale Packing Lists</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td colspan="3">&lt;tal:block tal:content="structure python: here.Zuite_generateListboxBrowsing(listbox_selection=(['title', 'ZUITE-TEST-SALEORDER-PRODUCT-001'],), enter_object=True)"/&gt;</td>
</tr>
<tr>
<td>verifyText</td>
<td>//div[@id="breadcrumb"]/a[2]</td>
<td>Sale Packing Lists</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td>verifyText</td>
<td>//div[@id="breadcrumb"]/a[3]</td>
<td>ZUITE-TEST-SALEORDER-PRODUCT-001</td>
</tr>
<tr>
<td>type</td>
<td>//textarea[@name="field_my_comment"]</td>
<td>Delivery by the test.</td>
</tr>
<tr class="" style="opacity: 1;">
<td>clickAndWait</td>
<td>//button[@name="Base_edit:method"]</td>
<td></td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_title"]</td>
<td>ZUITE-TEST-SALEORDER-PRODUCT-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_source_section_title"]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_source_title"]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_source_administration_title"]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_destination_section_title"]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-002</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_destination_section_title"]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-002</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_destination_administration_title"]</td>
<td>ZUITE-TEST-SALEORDER USER-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name="field_my_specialise_title"]</td>
<td>General Sale Trade Condition</td>
</tr>
<tr class="" style="opacity: 1;">
<td>verifyTextPresent</td>
<td>1 records</td>
<td></td>
</tr>
<tr class="" style="opacity: 1;">
<td>verifyValue</td>
<td>//tr[@class='listbox-data-line-0 DataA']/td[6]/input</td>
<td>100 000.0</td>
</tr>
</tbody>
</table>
</test>
</section><section class="screenshot">
<h1>Ship</h1>
<img type="image/png" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Ship?format=png" title="Selecting Ship on Action Menu" alt="Selecting Ship on Action Menu">
<details open="open">
<p>After the sales manager confirms the Sale Order, the employees in the warehouse will prepare the shipment and ship it. If the shipment corresponds with the information in the Sale Packing List, you have to tell ERP5 that your order has been shipped.</p><p>
To do so, browse the “Action” menu at the top of the screen, and click on <strong>“Ship Packing List”</strong>
.
</p><p>
This will change the status of the Sale Packing List from "Confirmed" to <strong>"Shipped"</strong>
, as you can see on the next page's screenshot.
</p><p>The next step will be to set the packing list as delivered after the clients acknowledges the shipment.</p>
</details>
<test>
<table style="display: none;" class="test">
<tbody>
<tr>
<td>storeAttribute</td>
<td>//div[@id="breadcrumb"]/a[3]@href</td>
<td>wait</td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr>
<td>open</td>
<td>${wait}</td>
<td></td>
</tr>
<tr>
<td>selectAndWait</td>
<td>//select[@name="select_action"]</td>
<td>Ship Packing List</td>
</tr>
<tr>
<td>clickAndWait</td>
<td>//button[@id="dialog_submit_button"]</td>
<td></td>
</tr>
<tr>
<td>verifyText</td>
<td>//label[normalize-space(text())='State']/../div</td>
<td>Shipped</td>
</tr>
<tr class="" style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr>
<td>open</td>
<td>${wait}</td>
<td></td>
</tr>
</tbody>
</table>
</test>
</section><section class="screenshot">
<h1>Deliver</h1>
<img type="image/png" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Deliver?format=png" title="Selecting Delivery on Action Menu" alt="Selecting Delivery on Action Menu">
<details open="open">
<p>When the shipment has been received by the customer, if the goods have been checked and are in good condition, you would like to set the packing list as delivered.</p><p>
To do so, please browse the “Action” menu and click on the line <strong>“Deliver Packing List”</strong>
.
</p><p>
This will change the status of the Sale Packing List from <strong>"Shipped" to “Delivered”</strong>
, and this will also
<strong>generate the related invoice</strong>
, as you can see on the following two pages.
</p>
</details>
<test>
<table style="display: none;" class="test">
<tbody>
<tr>
<td>selectAndWait</td>
<td>//select[@name="select_action"]</td>
<td>Deliver Packing List</td>
</tr>
<tr>
<td>clickAndWait</td>
<td>//button[@id="dialog_submit_button"]</td>
<td></td>
</tr>
<tr>
<td>verifyText</td>
<td>//label[normalize-space(text())='State']/../div</td>
<td>Delivered</td>
</tr>
<tr>
<td>storeAttribute</td>
<td>//div[@id="breadcrumb"]/a[3]@href</td>
<td>spl</td>
</tr>
<tr class="" style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
</tbody>
</table>
</test>
</section><section class="screenshot">
<h1>Jump to "Related Sale Invoice Transaction"</h1>
<img alt="Jump to &quot;Related Sale Transaction Invoice&quot;" title="Jump to &quot;Related Sale Transaction Invoice&quot;" type="image/svg+xml" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Jump.To.Related.Invoice?format=png">
<details open="open">
<p>
After the Packing List is in the "Delivered" state, you can access the related invoice by <strong>clicking the "Related Sale Invoice Transaction" in the "Jump..." menu</strong>
.
</p>
</details>
</section><section class="screenshot">
<h1>Generated Sale Invoice Transaction</h1>
<img alt="Generated Sale Transaction Invoice" title="Generated Sale Transaction Invoice" type="image/svg+xml" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Related.Invoice?format=png">
<details open="open">
<p>Now you can have a look at the Sale Invoice Transaction generated from the Sale Packing List. If you need to go back to the initial Sale Order or Sale Packing List, you can either use the "Jump..." list again, or by browsing the Sale Orders or Sale Packing Lists in the "Modules" list.</p><p>In the next tutorial, you will learn how to manage invoices.</p>
</details>
</section><section class="illustration">
<h1>Diverged Packing List</h1>
<img type="image/png" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Manage.Shipped.Quantity.Difference.Acknowledge?format=png" title="Diverged Packing List" alt="Diverged Packing List">
<details open="open">
<p>
Sale Packing Lists can <strong>generate an invoice</strong>
for the related transaction with a simple action:
<strong>Ship Packing List</strong>
, if the number of items shipped (in the Sale Packing List) matches the number of items ordered (in the Sale Order). This means that you do not have to bother clicking on anything, the invoice will be automatically generated after you ship the Packing List.
<br>
The same as the "Related Sale Packing List", you can
<strong>reach the "Related Sale Invoice Transaction" from the "Jump ..." menu</strong>
.
</p><p>However, ERP5 also allows you to manage the difference that can exist between what has been ordered and what has been exactly shipped.</p><p>For example, your client ordered 1000 products from you, but after the sales manager registered the Sale Order and confirmed it, the warehouse agent discovers that there is only 900 products left, due to a strike that obstructed your shipment to be delivered on time.</p><p>
The warehouse agent, who is in charge of preparing the shipment, verifying the Sale Packing List on ERP5 and shipping the goods, decides to pack the 900 products available, and changed the quantity in the Sale Packing List. Technically speaking, this means that the order and the shipment are not convergent, because 1000 products have been ordered and only 900 have been shipped. For this reason, the invoice generation will be up to the sales manager. If he/she approves the shipment, he/she can <strong>first "Split and Defer" the initial Sale Packing List</strong>
, which will create another Sale Packing List for this order with the quantity left to be shipped later. The warehouse can
<strong>then "Ship" and finally "Deliver" the first Packing List</strong>
. After the second part of the products are prepared, the warehouse can
<strong>"Ship" and "Deliver" the second Packing List</strong>
. In this way, the diverged Packing List can be solved.
</p><p>
Note that <strong>once you Ship the Packing List, the action generates an invoice for the related Packing List automatically, with the updated quantity shipped</strong>
. So finally, you will have two sale invoices, corresponding to each diverged Sale Packing List.
</p>
</details>
<test>
<table style="display: none;" class="test">
<tbody>
<tr style="opacity: 1; z-index: 0;" class="">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/invoke_simulation_alarms"&gt; Invoke simulation alarms &lt;/span&gt;</td>
</tr>
<tr style="opacity: 1; z-index: 0;" class="">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr>
<td>open</td>
<td>${spl}</td>
<td></td>
</tr>
<tr>
<td>selectAndWait</td>
<td>//select[@name="select_jump"]</td>
<td>Related Sale Invoice Transaction</td>
</tr>
<tr>
<td>verifyText</td>
<td>//div[@id="breadcrumb"]/a[1]</td>
<td>ERP5</td>
</tr>
<tr>
<td>verifyText</td>
<td>//div[@id="breadcrumb"]/a[2]</td>
<td>Accounting</td>
</tr>
<tr class="" style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr class="" style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/login_as_manager"&gt;Login As Manager&lt;/span&gt;</td>
</tr>
<tr>
<td>open</td>
<td>${base_url}/Zuite_tearDownSaleOrderTest</td>
<td></td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Clean Ok</td>
<td></td>
</tr>
<tr class="" style="opacity: 1; z-index: 0;">
<td colspan="3">&lt;span metal:use-macro="container/Zuite_viewTestMacroLibrary/macros/wait_for_activities"&gt; Wait for activities &lt;/span&gt;</td>
</tr>
</tbody>
</table>
</test>
</section>
\ No newline at end of file
<section class="master">
<h1>How to Manage Packing Lists</h1>
<footer>by <a href="http://www.osoe-project.org/contact">OSOE Project</a></footer>
<details open="open">
<p>When you validate a Sale Order, as seen in the previous tutorial <a href="user-Howto.Create.Sale.Orders/view">&quot;How to create Sale Orders&quot;</a>, ERP5 automatically creates the related <strong>&ldquo;Sale Packing List&rdquo;</strong> . Thanks to it, you will be able to track the shipment of the goods related to the order.</p>
<p>The goal of this tutorial is to explain how to manage Sale Packing Lists, in order to have the goods shipped and delivered.</p>
<p>This is a two step procedure: first, the order needs to be shipped and, when it reaches the clients warehouse, the status must be turned into <strong>&ldquo;Delivered&rdquo;</strong> .</p>
</details>
<test>
<table class="test" style="display: none;">
<tbody>
<tr style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/init_test_environment&quot;&gt;init&lt;/span&gt;</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td>openAndWait</td>
<td>${base_url}/Zuite_createFunctionalTestUser</td>
<td>&nbsp;</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td>verifyTextPresent</td>
<td>Done.</td>
<td>&nbsp;</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/wait_for_activities&quot;&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td>openAndWait</td>
<td>${base_url}/Zuite_setUpSaleOrderTest</td>
<td>&nbsp;</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td>verifyTextPresent</td>
<td>Init Ok</td>
<td>&nbsp;</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/wait_for_activities&quot;&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td>openAndWait</td>
<td>${base_url}/Zuite_setUpSalePackingListTest</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Init Ok</td>
<td>&nbsp;</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/wait_for_activities&quot;&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/login_as_functional_test_user&quot;&gt;Login As Functional Test User&lt;/span&gt;</td>
</tr>
</tbody>
</table>
</test></section>
<section>
<h1>Agenda</h1>
<ul>
<li>How to reach a Packing List</li>
<li>How to define Packing Lists</li>
<li>How to declare a shipment</li>
<li>How to generate invoices from packing lists</li>
</ul>
<test>
<table class="test" style="display: none;">
<tbody>
<tr style="opacity: 1; z-index: 0;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/invoke_simulation_alarms&quot;&gt; Invoke simulation alarms &lt;/span&gt;</td>
</tr>
</tbody>
</table>
</test></section>
<section class="illustration">
<h1>Managing a Packing List</h1>
<img alt="Delivery Flow" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Model?format=png" title="Delivery Flow" type="image/png" />
<details open="open">
<p>As you can see in the drawing, the different steps of managing a Packing List can be linked with real people in the company.</p>
<p>The principle of workflow based application makes sense in this case. Indeed, once the Sale Order has been registered and confirmed by the sales manager, the employee from the warehouse will prepare the automatically generated Sale Packing List related to the order. Thanks to the workflow, the sales manager will be aware that the order is ready to be sent and will give the order to &ldquo;Ship&rdquo; the goods. Once the client receives the goods, checks them and gives feedback, the sales manager will then change the status to &ldquo;Delivered&rdquo;.</p>
<p>In this way, it is possible to track the whole shipment process, thanks to ERP5.</p>
</details>
<test>
<table class="test" style="display: none;">
<tbody>
<tr style="opacity: 1; z-index: 0;">
<td>openAndWait</td>
<td>${base_url}</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_app_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
</tbody>
</table>
</test></section>
<section class="screenshot">
<h1>Sale Packing List</h1>
<img alt="Packing List View Tab" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.View?format=png" title="Packing List View Tab" type="image/png" />
<details open="open">
<p>From the previous tutorial <a href="user-Howto.Create.Sale.Orders/view">&quot;How to create Sale Orders&quot;</a>, you have learned to generate the related Sale Packing List automatically by confirming the Sale Order, and reach the Sale Packing List by using the &quot;Jump ...&quot; menu.</p>
<p>Now that you are on the initial view form of the Packing List related to your Sale Order, you can start <strong>filling out the the missing information</strong> where it is not filled automatically.</p>
<p>Note: <strong>Most data in the View tab and the other tabs (Details, Payment, Profile) should have been updated automatically from the Sale Order</strong> , so you will not have much to do now. If some fields have not been updated, it means that those fields have not been filled out correctly in the related Sale Order. This is why we recommend to properly fill out the Sale Orders before generating Packing Lists.</p>
</details>
<test>
<table class="test" style="display: none;">
<tbody>
<tr>
<td colspan="3">&lt;tal:block tal:define=&quot;click_configuration python: {&#39;text&#39;: &#39;Modules&#39;}&quot;&gt; &lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/click_on_panel_link&quot;&gt; &lt;/tal:block&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block tal:define=&quot;click_configuration python: {&#39;text&#39;: &#39;Sale Packing Lists&#39;}&quot;&gt; &lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/click_on_page_link&quot;&gt; &lt;/tal:block&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_listbox_loaded&quot; /&gt;</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[contains(text(), &quot;ZUITE-TEST-SALEORDER-PRODUCT-001&quot;)]</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>click</td>
<td>//a[contains(text(), &quot;ZUITE-TEST-SALEORDER-PRODUCT-001&quot;)]</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td>click</td>
<td>//input[@name=&quot;editable&quot;]</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//div[@data-gadget-scope=&quot;field_my_comment&quot;]//textarea</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>type</td>
<td>//div[@data-gadget-scope=&quot;field_my_comment&quot;]//textarea</td>
<td>Delivery by the test.</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/save&quot;&gt; &lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt; &lt;/tal:block&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name=&quot;field_my_title&quot;]</td>
<td>ZUITE-TEST-SALEORDER-PRODUCT-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name=&quot;field_my_source_section_title&quot;]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name=&quot;field_my_source_title&quot;]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name=&quot;field_my_source_administration_title&quot;]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name=&quot;field_my_destination_section_title&quot;]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-002</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name=&quot;field_my_destination_section_title&quot;]</td>
<td>ZUITE-TEST-SALEORDER-ORGANISATION-002</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name=&quot;field_my_destination_administration_title&quot;]</td>
<td>ZUITE-TEST-SALEORDER USER-001</td>
</tr>
<tr>
<td>verifyValue</td>
<td>//input[@name=&quot;field_my_specialise_title&quot;]</td>
<td>General Sale Trade Condition</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//a[contains(text(), &quot;ZUITE-TEST-SALEORDER-PRODUCT-001&quot;)]</td>
<td>&nbsp;</td>
</tr>
<tr style="opacity: 1;">
<td>waitForElementPresent</td>
<td>//p[contains(text(), &quot;100 000.00&quot;)]</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
</test></section>
<section class="screenshot">
<h1>Ship</h1>
<img alt="Selecting Ship on Action Menu" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Ship?format=png" title="Selecting Ship on Action Menu" type="image/png" />
<details open="open">
<p>After the sales manager confirms the Sale Order, the employees in the warehouse will prepare the shipment and ship it. If the shipment corresponds with the information in the Sale Packing List, you have to tell ERP5 that your order has been shipped.</p>
<p>To do so, browse the &ldquo;Action&rdquo; menu at the top of the screen, and click on <strong>&ldquo;Ship Packing List&rdquo;</strong> .</p>
<p>This will change the status of the Sale Packing List from &quot;Confirmed&quot; to <strong>&quot;Shipped&quot;</strong> , as you can see on the next page&#39;s screenshot.</p>
<p>The next step will be to set the packing list as delivered after the clients acknowledges the shipment.</p>
</details>
<test>
<table class="test" style="display: none;">
<tbody>
<tr>
<td>storeLocation</td>
<td>packing_list</td>
<td>&nbsp;</td>
</tr>
<tr style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/wait_for_activities&quot;&gt; Wait for activities &lt;/span&gt;</td>
</tr>
<tr>
<td>open</td>
<td>${packing_list}</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_app_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block tal:define=&quot;click_configuration python: {&#39;text&#39;: &#39;Ship Packing List&#39;}&quot;&gt; &lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/click_on_panel_link&quot;&gt; &lt;/tal:block&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/submit_dialog&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//p[@id=&quot;field_my_translated_simulation_state_title&quot;]</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>verifyText</td>
<td>//p[@id=&quot;field_my_translated_simulation_state_title&quot;]</td>
<td>Shipped</td>
</tr>
</tbody>
</table>
</test></section>
<section class="screenshot">
<h1>Deliver</h1>
<img alt="Selecting Delivery on Action Menu" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Deliver?format=png" title="Selecting Delivery on Action Menu" type="image/png" />
<details open="open">
<p>When the shipment has been received by the customer, if the goods have been checked and are in good condition, you would like to set the packing list as delivered.</p>
<p>To do so, please browse the &ldquo;Action&rdquo; menu and click on the line <strong>&ldquo;Deliver Packing List&rdquo;</strong> .</p>
<p>This will change the status of the Sale Packing List from <strong>&quot;Shipped&quot; to &ldquo;Delivered&rdquo;</strong> , and this will also <strong>generate the related invoice</strong> , as you can see on the following two pages.</p>
</details>
<test>
<table class="test" style="display: none;">
<tbody>
<tr>
<td colspan="3">&lt;tal:block tal:define=&quot;click_configuration python: {&#39;text&#39;: &#39;Deliver Packing List&#39;}&quot;&gt; &lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/click_on_panel_link&quot;&gt; &lt;/tal:block&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/submit_dialog&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td>waitForElementPresent</td>
<td>//p[@id=&quot;field_my_translated_simulation_state_title&quot;]</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>verifyText</td>
<td>//p[@id=&quot;field_my_translated_simulation_state_title&quot;]</td>
<td>Delivered</td>
</tr>
<tr>
<td>storeLocation</td>
<td>spl</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
</test></section>
<section class="screenshot">
<h1>Jump to &quot;Related Sale Invoice Transaction&quot;</h1>
<img alt="Jump to &quot;Related Sale Transaction Invoice&quot;" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Jump.To.Related.Invoice?format=png" title="Jump to &quot;Related Sale Transaction Invoice&quot;" type="image/svg+xml" />
<details open="open">
<p>After the Packing List is in the &quot;Delivered&quot; state, you can access the related invoice by <strong>clicking the &quot;Related Sale Invoice Transaction&quot; in the &quot;Jump...&quot; menu</strong> .</p>
</details>
</section>
<section class="screenshot">
<h1>Generated Sale Invoice Transaction</h1>
<img alt="Generated Sale Transaction Invoice" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Related.Invoice?format=png" title="Generated Sale Transaction Invoice" type="image/svg+xml" />
<details open="open">
<p>Now you can have a look at the Sale Invoice Transaction generated from the Sale Packing List. If you need to go back to the initial Sale Order or Sale Packing List, you can either use the &quot;Jump...&quot; list again, or by browsing the Sale Orders or Sale Packing Lists in the &quot;Modules&quot; list.</p>
<p>In the next tutorial, you will learn how to manage invoices.</p>
</details>
</section>
<section class="illustration">
<h1>Diverged Packing List</h1>
<img alt="Diverged Packing List" src="http://img.erp5.cn/user-Howto.Manage.Sale.Packing.Lists.Manage.Shipped.Quantity.Difference.Acknowledge?format=png" title="Diverged Packing List" type="image/png" />
<details open="open">
<p>Sale Packing Lists can <strong>generate an invoice</strong> for the related transaction with a simple action: <strong>Ship Packing List</strong> , if the number of items shipped (in the Sale Packing List) matches the number of items ordered (in the Sale Order). This means that you do not have to bother clicking on anything, the invoice will be automatically generated after you ship the Packing List.<br />
The same as the &quot;Related Sale Packing List&quot;, you can <strong>reach the &quot;Related Sale Invoice Transaction&quot; from the &quot;Jump ...&quot; menu</strong> .</p>
<p>However, ERP5 also allows you to manage the difference that can exist between what has been ordered and what has been exactly shipped.</p>
<p>For example, your client ordered 1000 products from you, but after the sales manager registered the Sale Order and confirmed it, the warehouse agent discovers that there is only 900 products left, due to a strike that obstructed your shipment to be delivered on time.</p>
<p>The warehouse agent, who is in charge of preparing the shipment, verifying the Sale Packing List on ERP5 and shipping the goods, decides to pack the 900 products available, and changed the quantity in the Sale Packing List. Technically speaking, this means that the order and the shipment are not convergent, because 1000 products have been ordered and only 900 have been shipped. For this reason, the invoice generation will be up to the sales manager. If he/she approves the shipment, he/she can <strong>first &quot;Split and Defer&quot; the initial Sale Packing List</strong> , which will create another Sale Packing List for this order with the quantity left to be shipped later. The warehouse can <strong>then &quot;Ship&quot; and finally &quot;Deliver&quot; the first Packing List</strong> . After the second part of the products are prepared, the warehouse can <strong>&quot;Ship&quot; and &quot;Deliver&quot; the second Packing List</strong> . In this way, the diverged Packing List can be solved.</p>
<p>Note that <strong>once you Ship the Packing List, the action generates an invoice for the related Packing List automatically, with the updated quantity shipped</strong> . So finally, you will have two sale invoices, corresponding to each diverged Sale Packing List.</p>
</details>
<test>
<table class="test" style="display: none;">
<tbody>
<tr style="opacity: 1; z-index: 0;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/invoke_simulation_alarms&quot;&gt; Invoke simulation alarms &lt;/span&gt;</td>
</tr>
<tr>
<td>open</td>
<td>${spl}</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_app_loaded&quot;&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block tal:define=&quot;click_configuration python: {&#39;text&#39;: &#39;Related Sale Invoice Transaction&#39;}&quot;&gt; &lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/click_on_panel_link&quot;&gt; &lt;/tal:block&gt; &lt;/tal:block&gt;</td>
</tr>
<tr>
<td colspan="3">&lt;tal:block metal:use-macro=&quot;here/Zuite_CommonTemplateForRenderjsUi/macros/wait_for_content_loaded&quot;&gt;&lt;/tal:block&gt;</td>
</tr>
<tr style="opacity: 1;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/login_as_manager&quot;&gt;Login As Manager&lt;/span&gt;</td>
</tr>
<tr>
<td>open</td>
<td>${base_url}/Zuite_tearDownSaleOrderTest</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Clean Ok</td>
<td>&nbsp;</td>
</tr>
<tr style="opacity: 1; z-index: 0;">
<td colspan="3">&lt;span metal:use-macro=&quot;container/Zuite_viewTestMacroLibrary/macros/wait_for_activities&quot;&gt; Wait for activities &lt;/span&gt;</td>
</tr>
</tbody>
</table>
</test></section>
......@@ -1094,104 +1094,108 @@ gf8DLYRWb6+I+wgAAAAASUVORK5CYII=</string> </value>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>jingjing</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>0.0.0.0</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global id="6.1" name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1354790650.97</float>
<string>GMT</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>jingjing</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>0.0.0.0</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass> <reference id="6.1"/> </klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1354790650.99</float>
<string>GMT</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</tuple>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>jingjing</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>0.0.0.0</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global id="6.1" name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1354790650.97</float>
<string>GMT</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>jingjing</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>0.0.0.0</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass> <reference id="6.1"/> </klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1354790650.99</float>
<string>GMT</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
......
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