|
2 | 2 | Invoice project milestones |
3 | 3 | ========================== |
4 | 4 |
|
5 | | -Invoicing based on project milestones can be used for expensive or large-scale projects with |
6 | | -discrete, measurable deliverables. The series of milestones in a project represent a clear sequence |
7 | | -of work that will inevitably result in the completion of a project and/or contract. |
| 5 | +.. |SO| replace:: :abbr:`SO (Sales Order)` |
| 6 | +.. |SOs| replace:: :abbr:`SOs (Sales Orders)` |
8 | 7 |
|
9 | | -This method of invoicing ensures the company gets a consistent flow of money throughout the lifetime |
10 | | -of the project. Customers can closely monitor every phase of the project's development as it |
11 | | -happens, in addition to paying a large bill in several installments, instead of all at once. |
| 8 | +Invoicing based on project milestones allows companies to bill large or long-running projects |
| 9 | +progressively as key deliverables are completed. Each milestone represents a measurable stage of |
| 10 | +work that triggers invoicing upon completion. This approach helps maintain predictable cash flow and |
| 11 | +provides customers with visibility into project progress, all while allowing payments to occur in |
| 12 | +manageable installments. |
12 | 13 |
|
13 | | -Create milestone products |
14 | | -========================= |
15 | | - |
16 | | -In Odoo, each milestone of a project is considered as an individual product. |
17 | | - |
18 | | -To create and/or configure products to work like this, first navigate to :menuselection:`Sales app |
19 | | ---> Products --> Products`. Then, click on a product, or create a new one by clicking |
20 | | -:guilabel:`New`. |
21 | | - |
22 | | -The option to invoice based on milestones is only available for certain product types. |
23 | | - |
24 | | -On the product form, under the :guilabel:`General Information` tab, the :guilabel:`Product Type` |
25 | | -field *must* be set on any of the following options: :guilabel:`Service`, :guilabel:`Event Ticket`, |
26 | | -:guilabel:`Event Booth`, or :guilabel:`Course`. |
27 | | - |
28 | | -.. image:: milestone/product-type-field.png |
29 | | - :align: center |
30 | | - :alt: The invoicing policy field drop-down menu with options on product form. |
31 | | - |
32 | | -With any of those :guilabel:`Product Type` options selected, choose :guilabel:`Based on Milestones` |
33 | | -from the :guilabel:`Invoicing Policy` drop-down menu. |
34 | | - |
35 | | -.. image:: milestone/invoicing-policy-field.png |
36 | | - :align: center |
37 | | - :alt: The invoicing policy field drop-down menu with options on product form. |
38 | | - |
39 | | -Beneath that is the :guilabel:`Create on Order` field. |
40 | | - |
41 | | -To ensure workflows are as seamless as possible, it is recommended that an option in the |
42 | | -:guilabel:`Create on Order` field is selected. |
43 | | - |
44 | | -.. note:: |
45 | | - Leaving it on the default :guilabel:`Nothing` option won't negatively affect the desired |
46 | | - workflow. However, a project *must* then be created directly from a sales order form with that |
47 | | - specific product. Once a project is created *then* milestones and tasks can be created and |
48 | | - configured. |
49 | | - |
50 | | -When the :guilabel:`Create on Order` default option of :guilabel:`Nothing` is clicked, a drop-down |
51 | | -menu is revealed with the following options: |
52 | | - |
53 | | -- :guilabel:`Task`: Odoo creates a task related to this milestone product in the *Projects* app when |
54 | | - this specific product is ordered. |
55 | | -- :guilabel:`Project \& Task`: Odoo creates a project and task related to this milestone product in |
56 | | - the *Projects* app when this specific product is ordered. |
57 | | -- :guilabel:`Project`: Odoo creates a project related to this milestone product in the *Projects* |
58 | | - app when this specific product is ordered. |
59 | | - |
60 | | -When :guilabel:`Task` is selected, a :guilabel:`Project` field appears. In this field, select to |
61 | | -which existing project in the *Projects* app this created task should be connected. |
62 | | - |
63 | | -.. image:: milestone/task-option-project-field.png |
64 | | - :align: center |
65 | | - :alt: The Project field appears when the Task option is selected in Create on Order field. |
66 | | - |
67 | | -When :guilabel:`Project \& Task` or :guilabel:`Project` is selected, two new fields appear: |
68 | | -:guilabel:`Project Template` and :guilabel:`Workspace Template`. |
| 14 | +In Odoo, milestone invoicing is configured at the product level in the **Sales** app, with milestone |
| 15 | +progress and completion managed in the **Projects** app. When a milestone is marked as reached, the |
| 16 | +delivered quantity on the sales order (SO) is updated and can be invoiced. |
69 | 17 |
|
70 | | -.. image:: milestone/project-task-option-project-workspace-fields.png |
71 | | - :align: center |
72 | | - :alt: The Project template and workspace template fields that appear on milestone product. |
| 18 | +In Odoo, this workflow is driven by two key elements: |
73 | 19 |
|
74 | | -The :guilabel:`Project Template` field provides template options to use for the project that will be |
75 | | -created when this specific product is ordered. |
| 20 | + - A service product configured with a *Based on Milestones* invoicing policy |
| 21 | + - One or more milestones that represent the phases of work |
76 | 22 |
|
77 | | -The :guilabel:`Workspace Template` field provides template options to use for the workspace (for the |
78 | | -*Documents* app, not the *Projects* app) that will be automatically generated for the project when |
79 | | -this specific product is ordered. |
| 23 | +As project work is completed, milestones are marked as reached, which automatically updates the |
| 24 | +delivered quantities and makes the milestone eligible for invoicing. |
80 | 25 |
|
81 | | -.. tip:: |
82 | | - For organizational purposes, click the :guilabel:`Sales` tab on the product form, and enter a |
83 | | - custom 'Milestone' related descriptor in the :guilabel:`Sales Description` field. This |
84 | | - information appears in the :guilabel:`Description` column on the :guilabel:`Order Lines` tab of |
85 | | - the sales order. |
| 26 | +.. important:: |
| 27 | + This document covers the **Sales** app configuration and invoicing flow for invoicing based on |
| 28 | + project milestones. For more information on creating, managing, and completing milestones, and |
| 29 | + how to link them to tasks, see :doc:`Project milestones |
| 30 | + <../../../services/project/project_management/project_milestones>`. |
86 | 31 |
|
87 | | - Or, directly edit/modify the :guilabel:`Description` field on the :guilabel:`Order Lines` tab of |
88 | | - the sales order. |
| 32 | +Create milestone products |
| 33 | +========================= |
89 | 34 |
|
90 | | - This is *not* a requirement. |
| 35 | +To begin, a product must be configured specifically for milestone-based invoicing. Navigate to |
| 36 | +:menuselection:`Sales app --> Products --> Products` and click :guilabel:`New`. Enter the necessary |
| 37 | +information, including the product title and :guilabel:`Sales Price`. |
91 | 38 |
|
92 | | -Invoice milestones |
93 | | -================== |
| 39 | +For the :guilabel:`Product Type`, select :guilabel:`Service`. Doing so reveals the :guilabel:`Create |
| 40 | +on Order` field. Select either :guilabel:`Project`, :guilabel:`Project and Task`, or |
| 41 | +:guilabel:`Task`, depending on how the product is tracked in the **Project** app. |
94 | 42 |
|
95 | 43 | .. note:: |
96 | | - The following flow features a trio of milestone products that have :guilabel:`Service` set as |
97 | | - their :guilabel:`Product Type`, and :guilabel:`Task` set on their :guilabel:`Create on Order` |
98 | | - field. |
99 | | - |
100 | | - .. image:: milestone/settings-for-workflow.png |
101 | | - :align: center |
102 | | - :alt: Product with Service "Product Type" and "Task" in the Create on Order field on form. |
103 | | - |
104 | | - Those tasks are then attached to a pre-existing :guilabel:`Project`, which, in this case, is |
105 | | - titled, :guilabel:`Rebranding Projects`. |
106 | | - |
107 | | -To invoice milestones, create a sales order with the milestone product(s). To do that, go to |
108 | | -:menuselection:`Sales app --> New`. Doing so reveals a blank quotation form. |
109 | | - |
110 | | -From this quotation form, add a :guilabel:`Customer`. Then, click :guilabel:`Add a product` in the |
111 | | -:guilabel:`Order Lines` tab. Next, add the milestone product(s) to the :guilabel:`Order Lines` tab. |
112 | | - |
113 | | -Once the corresponding milestone product(s) have been added, click :guilabel:`Confirm` to confirm |
114 | | -the order, which turns the quotation into a sales order. |
115 | | - |
116 | | -When the order is confirmed, new smart buttons appear at the top of the sales order based on what |
117 | | -was selected in the :guilabel:`Create on Order` field on the product form. |
118 | | - |
119 | | -From the sales order, click the :guilabel:`Milestones` smart button. Doing so reveals a blank |
120 | | -:guilabel:`Milestones` page. Click :guilabel:`New` to add milestones. |
121 | | - |
122 | | -.. image:: milestone/adding-milestones.png |
123 | | - :align: center |
124 | | - :alt: Adding milestones to a sales order with milestone products. |
125 | | - |
126 | | -Enter a :guilabel:`Name` for the milestone. Next, apply it to the corresponding :guilabel:`Sales |
127 | | -Order Item`. Lastly, assign a :guilabel:`Deadline` to the milestone, if desired. |
128 | | - |
129 | | -Repeat that process for all milestone sales order items. |
130 | | - |
131 | | -Then, return to the sales order, via the breadcrumbs. From the sales order, click the |
132 | | -:guilabel:`Tasks` smart button. Doing so reveals a :guilabel:`Tasks` page with a task for each sales |
133 | | -order item with that option designated in the :guilabel:`Create on Order` field. |
134 | | - |
135 | | -.. image:: milestone/tasks-page.png |
136 | | - :align: center |
137 | | - :alt: Sample tasks page accessed via the smart button from a sales order with milestone products. |
138 | | - |
139 | | -To manually assign a configured milestone to a task, click the desired task, which reveals the task |
140 | | -form. On the task form, select the appropriate milestone to which this task should be connected, in |
141 | | -the :guilabel:`Milestone` field. |
142 | | - |
143 | | -.. image:: milestone/milestone-field-on-task-form.png |
144 | | - :align: center |
145 | | - :alt: The milestone field on the task form when dealing with milestone products in Odoo Sales. |
146 | | - |
147 | | -Repeat this process for all milestone tasks. |
148 | | - |
149 | | -With those tasks properly configured, employees log in their progress as they work on the task, in |
150 | | -addition to adding any notes related to the task. |
151 | | - |
152 | | -Then, when that task is complete, that means that milestone has been reached. At that point, it is |
153 | | -time to invoice that milestone. |
154 | | - |
155 | | -To invoice a milestone, first return to the sales order — either via the breadcrumb links, or by |
156 | | -navigating to :menuselection:`Sales app --> Orders --> Orders` and picking the appropriate sales |
157 | | -order. |
158 | | - |
159 | | -Back on the sales order form, click the :guilabel:`Milestones` smart button, and check the box in |
160 | | -the :guilabel:`Reached` column for that particular task. |
161 | | - |
162 | | -.. image:: milestone/reached-milestone.png |
163 | | - :align: center |
164 | | - :alt: What it looks like to mark a milestone as reached via the milestone smart button. |
165 | | - |
166 | | -Next, return to the sales order — either by clicking :guilabel:`View Sales Order` on the |
167 | | -:guilabel:`Milestones` page, or via the breadcrumb links. |
168 | | - |
169 | | -Back on the sales order, the line item for the milestone that's been reached has its |
170 | | -:guilabel:`Delivered` column filled. That's because the milestone has been reached, and therefore |
171 | | -delivered. |
172 | | - |
173 | | -.. image:: milestone/delivered-milestone-product-sales-order.png |
174 | | - :align: center |
175 | | - :alt: A milestone product that's been reached marked as delivered on the sales order in Odoo. |
176 | | - |
177 | | -Click :guilabel:`Create Invoice` in the upper-left corner. Doing so reveals a :guilabel:`Create |
178 | | -invoices` pop-up window. |
179 | | - |
180 | | -.. image:: milestone/create-invoices-pop-up.png |
181 | | - :align: center |
182 | | - :alt: The create invoices pop-up window that appears when create invoice button is clicked. |
183 | | - |
184 | | -On the :guilabel:`Create invoices` pop-up window, leave the :guilabel:`Create Invoice` option on the |
185 | | -default :guilabel:`Regular Invoice` selection, and click the :guilabel:`Create Draft Invoice` |
186 | | -button. |
187 | | - |
188 | | -Upon clicking :guilabel:`Create Draft Invoice`, Odoo reveals the :guilabel:`Customer Invoice Draft`, |
189 | | -*only* showing that reached milestone in the :guilabel:`Invoice Lines` tab. |
| 44 | + A :guilabel:`Project Template` can also be selected for the product. See :doc:`Project templates |
| 45 | + <../../../services/project/project_management/project_templates>` for more information. |
190 | 46 |
|
191 | | -.. image:: milestone/invoice-draft-milestone.png |
192 | | - :align: center |
193 | | - :alt: A customer invoice draft showing only the milestone product that's been reached. |
| 47 | +For the :guilabel:`Invoicing Policy`, select :guilabel:`Based on Milestones`. This option ensures |
| 48 | +that the product's delivered quantities update automatically once a milestone is completed. |
194 | 49 |
|
195 | | -From this invoice page, click the :guilabel:`Confirm` button to confirm the invoice. Then, when the |
196 | | -customer has paid for this milestone, click :guilabel:`Register Payment`. |
| 50 | +.. important:: |
| 51 | + *Based on Milestones* is only available if there is at least one project with *Milestones* |
| 52 | + enabled. |
197 | 53 |
|
198 | | -When :guilabel:`Register Payment` is clicked, a :guilabel:`Register Payment` pop-up window appears. |
| 54 | +Creating milestones from a sales order |
| 55 | +====================================== |
199 | 56 |
|
200 | | -.. image:: milestone/register-payment-pop-up.png |
201 | | - :align: center |
202 | | - :alt: The Register Payment pop-up window that appears when Register Payment is clicked. |
| 57 | +After the milestone product has been sold, a *Milestones* smart button is added to the |SO|. Click |
| 58 | +the smart button to view, edit, or create new milestones. |
203 | 59 |
|
204 | | -On this pop-up window, confirm the accuracy of the auto-populated fields, then click |
205 | | -:guilabel:`Create Payment`. |
| 60 | +.. image:: milestone/view-milestones.png |
| 61 | + :alt: The milestones for a sales order line. |
206 | 62 |
|
207 | | -When clicked, the pop-up window disappears, and Odoo returns to the invoice for that milestone, |
208 | | -which now has a green :guilabel:`In Payment` banner in the upper-right corner. This banner signifies |
209 | | -the invoice has been paid. |
| 63 | +From here, the :guilabel:`Delivered %` can be altered. This amount equates to the total cost of the |
| 64 | +|SO| that is billed when the milestone is reached. |
210 | 65 |
|
211 | | -.. image:: milestone/in-payment-invoice.png |
212 | | - :align: center |
213 | | - :alt: An invoice with a milestone product that has been paid with an In Payment banner. |
| 66 | +.. example:: |
| 67 | + A company sells a *Custom furniture design* product with four milestones: |
214 | 68 |
|
215 | | -Then, return to the sales order, via the breadcrumb links. Back on the sales order, in the |
216 | | -:guilabel:`Order Lines` tab, the reached milestone that's been invoiced and paid for, now has its |
217 | | -:guilabel:`Invoiced` column filled. |
| 69 | + - Initial design consult |
| 70 | + - Preliminary designs submitted |
| 71 | + - Final design submission |
| 72 | + - Final product delivered |
218 | 73 |
|
219 | | -.. image:: milestone/invoiced-column-filled-milestone.png |
220 | | - :align: center |
221 | | - :alt: The Invoiced column of a milestone product that's been paid for is filled. |
| 74 | + Each of these milestones has a *Delivered %* of `25%`. As each milestone is marked complete, a |
| 75 | + corresponding `25%` of the total number of hours is marked as *Delievered* on the invoice. |
222 | 76 |
|
223 | | -There is also a new :guilabel:`Invoices` smart button at the top of the sales order. Clicking that |
224 | | -reveals all the invoices that are connected to this sales order. |
| 77 | +Invoicing a completed milestone |
| 78 | +=============================== |
225 | 79 |
|
226 | | -.. image:: milestone/invoices-smart-button.png |
227 | | - :align: center |
228 | | - :alt: The invoices smart button that appears at the top of a sales order with milestones. |
| 80 | +Milestones can be tracked through the **Project** app (see :ref:`Using milestones |
| 81 | +<project/using-milestones>`). Additionally, a milestone can be marked as :guilabel:`Reached` on the |
| 82 | +*Milestones* page by ticking the checkbox for that milestone. |
229 | 83 |
|
230 | | -Simply repeat the above process for each milestone as it is worked on, and subsequently, completed. |
| 84 | +Then, click :guilabel:`View Sales Order` or use the breadcrumbs to return to the |SO|. The |
| 85 | +:guilabel:`Delivered` column will be updated to reflect the *Delivered %* for the milestone reached. |
| 86 | +Click :guilabel:`Create Invoice`. |
231 | 87 |
|
232 | | -Continue that process until the entire project has been completed, each milestone has been invoiced, |
233 | | -and the entire order has been paid for in full. |
| 88 | +These steps can be repeated as additional milestones are reached until the |SO| has been fulfilled. |
234 | 89 |
|
235 | 90 | .. seealso:: |
236 | 91 | - :doc:`time_materials` |
|
0 commit comments