diff --git a/carpenter/__manifest__.py b/carpenter/__manifest__.py
new file mode 100644
index 000000000..e2e942f4a
--- /dev/null
+++ b/carpenter/__manifest__.py
@@ -0,0 +1,66 @@
+{
+    'name': 'Carpenter',
+    'version': '1.0',
+    'category': 'Retail',
+    'description': """
+""",
+    'depends': [
+        'base_automation',
+        'contacts',
+        'knowledge',
+        'project',
+        'purchase',
+        'sale_management',
+        'sale_timesheet',
+        'stock',
+        'web_studio',
+    ],
+    'data': [
+        'data/res_config_settings.xml',
+        'data/ir_model_fields.xml',
+        'data/report_view.xml',
+        'data/ir_actions_report.xml',
+        'data/mail_template.xml',
+        'data/ir_actions_server.xml',
+        'data/ir_ui_view.xml',
+        'data/base_automation.xml',
+        'data/ir_attachment_pre.xml',
+        'data/project_task_type.xml',
+        'data/project_tags.xml',
+        'data/project_project.xml',
+        'data/project_task.xml',
+        'data/product_product.xml',
+        'data/sale_order_spreadsheet.xml',
+        'data/sale_order_template.xml',
+        'data/sale_order_template_line.xml',
+        'data/knowledge_cover.xml',
+        'data/knowledge_article.xml',
+        'data/knowledge_article_favorite.xml',
+        'data/mail_message.xml',
+        'data/knowledge_tour.xml',
+    ],
+    'demo': [
+        'demo/res_partner.xml',
+        'demo/res_user.xml',
+        'demo/product_supplierinfo.xml',
+        'demo/sale_order.xml',
+        'demo/sale_order_line.xml',
+        'demo/sale_order_confirm.xml',
+        'demo/purchase_order.xml',
+        'demo/purchase_order_line.xml',
+        'demo/purchase_order_confirm.xml',
+    ],
+    'license': 'OPL-1',
+    'assets': {
+        'web.assets_backend': [
+            'carpenter/static/src/js/my_tour.js',
+        ]
+    },
+    'author': 'Odoo S.A.',
+    "cloc_exclude": [
+        "data/knowledge_article.xml",
+        "data/ir_ui_view.xml",
+        "static/src/js/my_tour.js",
+    ],
+    'images': ['images/main.png'],
+}
diff --git a/carpenter/data/base_automation.xml b/carpenter/data/base_automation.xml
new file mode 100644
index 000000000..d88bbdeec
--- /dev/null
+++ b/carpenter/data/base_automation.xml
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo>
+  <record id="modify_portal_sale_order" model="base.automation">
+    <field name="model_id" ref="base.model_res_config_settings"/>
+    <field name="action_server_ids" eval="[(6, 0, [ref('replace_portal')])]"/>
+    <field name="trigger">on_create_or_write</field>
+    <field name="name">Modify Portal</field>
+  </record>
+</odoo>
diff --git a/carpenter/data/ir_actions_report.xml b/carpenter/data/ir_actions_report.xml
new file mode 100644
index 000000000..3017465e8
--- /dev/null
+++ b/carpenter/data/ir_actions_report.xml
@@ -0,0 +1,16 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo>
+  <record id="simplified_sale_report" model="ir.actions.report">
+    <field name="binding_model_id" ref="sale.model_sale_order"/>
+    <field name="model">sale.order</field>
+    <field name="name">Simplified Report</field>
+    <field name="report_name">carpenter.simplified_sales_order</field>
+  </record>
+  <record id="simplified_invoice_report" model="ir.actions.report">
+    <field name="binding_model_id" ref="account.model_account_move"/>
+    <field name="model">account.move</field>
+    <field name="name">Simplified Report</field>
+    <field name="report_name">carpenter.simplified_invoice</field>
+    <field name="is_invoice_report">True</field>
+  </record>
+</odoo>
diff --git a/carpenter/data/ir_actions_server.xml b/carpenter/data/ir_actions_server.xml
new file mode 100644
index 000000000..704040c3e
--- /dev/null
+++ b/carpenter/data/ir_actions_server.xml
@@ -0,0 +1,39 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo>
+  <record id="carpenter.replace_so_email" model="ir.actions.server">
+    <field name="binding_model_id" ref="sale.model_sale_order"/>
+    <field name="model_id" ref="sale.model_sale_order"/>
+    <field name="state">code</field>
+    <field name="name">Execute Code</field>
+    <field name="code">
+      <![CDATA[
+action = record.action_quotation_send()
+action['context']['default_template_id'] = env.ref("carpenter.mail_template_24").id
+    ]]>
+    </field>
+  </record>
+  <!-- <record id="carpenter.replace_invoice_email" model="ir.actions.server" forcecreate="1">
+    <field name="binding_model_id" ref="account.model_account_move"/>
+    <field name="code"><![CDATA[action = record.action_invoice_sent()
+action['context']['default_pdf_report_id'] = env.ref('carpenter.simplified_invoice_report').id]]></field>
+    <field name="model_id" ref="account.model_account_move"/>
+    <field name="state">code</field>
+    <field name="name">Replace</field>
+  </record> -->
+  <record id="replace_portal" model="ir.actions.server">
+    <field name="code">
+      <![CDATA[
+view = env.ref('carpenter.portal_sale_view')
+view.write({'active': record.x_simplify_so})
+view = env.ref('carpenter.portal_sale_view_2')
+view.write({'active': record.x_simplify_so})
+view = env.ref('sale_stock.sale_order_portal_content_inherit_sale_stock')
+view.write({'active': not record.x_simplify_so})
+    ]]>
+    </field>
+    <field name="model_id" ref="base.model_res_config_settings"/>
+    <field name="state">code</field>
+    <field name="name">Execute Code</field>
+    <field name="usage">base_automation</field>
+  </record>
+</odoo>
diff --git a/carpenter/data/ir_attachment_pre.xml b/carpenter/data/ir_attachment_pre.xml
new file mode 100644
index 000000000..580e8d288
--- /dev/null
+++ b/carpenter/data/ir_attachment_pre.xml
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="ir_attachment_210" model="ir.attachment">
+        <field name="name">unsplash_iZgQKxuMRHc_.jpg</field>
+        <field name="datas" type="base64" file="carpenter/static/src/binary/ir_attachment/240-cover.jpg"/>
+    </record>
+</odoo>
diff --git a/carpenter/data/ir_model_fields.xml b/carpenter/data/ir_model_fields.xml
new file mode 100644
index 000000000..975d7af2b
--- /dev/null
+++ b/carpenter/data/ir_model_fields.xml
@@ -0,0 +1,31 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo>
+  <record id="x_studio_unit_cost" model="ir.model.fields">
+    <field name="ttype">float</field>
+    <field name="related">product_id.standard_price</field>
+    <field name="field_description">Unit Cost</field>
+    <field name="model_id" ref="sale.model_sale_order_line"/>
+    <field name="name">x_studio_unit_cost</field>
+    <field name="on_delete" eval="False"/>
+    <field name="readonly" eval="True"/>
+    <field name="store" eval="False"/>
+  </record>
+  <record id="x_simplify_so" model="ir.model.fields">
+    <field name="ttype">boolean</field>
+    <field name="copied" eval="True"/>
+    <field name="field_description">Simplified SO</field>
+    <field name="model_id" ref="base.model_res_config_settings"/>
+    <field name="name">x_simplify_so</field>
+    <field name="on_delete" eval="False"/>
+  </record>
+
+  <record id="x_report" model="ir.model.fields">
+    <field name="ttype">many2one</field>
+    <field name="related">invoice_template_pdf_report_id</field>
+    <field name="field_description">Report</field>
+    <field name="model_id" ref="base.model_res_partner"/>
+    <field name="name">x_report</field>
+    <field name="relation">ir.actions.report</field>
+    <field name="store" eval="True"/>
+  </record>
+</odoo>
diff --git a/carpenter/data/ir_ui_view.xml b/carpenter/data/ir_ui_view.xml
new file mode 100644
index 000000000..bd4504a2d
--- /dev/null
+++ b/carpenter/data/ir_ui_view.xml
@@ -0,0 +1,144 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo>
+    <record id="sale_res_config_settings_inherit_view" model="ir.ui.view">
+        <field name="name">res.config.settings.inherit.sale.view</field>
+        <field name="model">res.config.settings</field>
+        <field name="mode">extension</field>
+        <field name="active" eval="True"/>
+        <field name="inherit_id" ref="sale.res_config_settings_view_form"/>
+        <field name="arch" type="xml">
+            <xpath expr="//block[@name='quotation_order_setting_container']" position="inside">
+                <div class="col-12 col-lg-6 o_setting_box" id="x_simplify_so ">
+                    <div class="o_setting_left_pane">
+                        <field name="x_simplify_so"/>
+                    </div>
+                    <div class="o_setting_right_pane">
+                        <label for="x_simplify_so" string="Simplified Sales Order"/>
+                        <div class="text-muted mb16">
+                            Simplified Sales Order
+                        </div>
+                    </div>
+                </div>
+            </xpath>
+        </field>
+    </record>
+    <record id="contact_report_default" model="ir.ui.view">
+        <field name="arch" type="xml">
+          <data>
+            <xpath expr="//field[@name='category_id']" position="after">
+              <field name="x_report" domain="[(&quot;binding_model_id&quot;, &quot;in&quot;, [471])]"/>
+            </xpath>
+          </data>
+        </field>
+        <field name="inherit_id" ref="base.view_partner_form"/>
+        <field name="mode">extension</field>
+        <field name="model">res.partner</field>
+        <field name="active" eval="True"/>
+        <field name="name">Odoo Studio: res.partner.form customization</field>
+        <field name="priority">360</field>
+        <field name="type">form</field>
+      </record>
+    <record id="sale_order_custom_view" model="ir.ui.view" >
+        <field name="arch" type="xml">
+          <data>
+            <xpath expr="//form[1]/header[1]/field[@name='state']" position="after">
+                <button string="Send Simplified Email" name="carpenter.replace_so_email" type="action"/>
+              </xpath>
+            <xpath expr="//form[1]/sheet[1]/notebook[1]/page[@name='order_lines']/field[@name='order_line']/list[1]/field[@name='product_uom']" position="after">
+              <field optional="show" name="x_studio_unit_cost"/>
+              <attribute name="column_invisible">True</attribute>
+            </xpath>
+            <xpath expr="//form[1]/sheet[1]/notebook[1]/page[@name='order_lines']/field[@name='order_line']/list[1]/field[@name='discount']" position="attributes">
+              <attribute name="column_invisible">True</attribute>
+            </xpath>
+          </data>
+        </field>
+        <field name="inherit_id" ref="sale.view_order_form"/>
+        <field name="mode">extension</field>
+        <field name="model">sale.order</field>
+        <field name="name">Odoo Studio: sale.order.form customization</field>
+        <field name="priority">160</field>
+        <field name="type">form</field>
+        <field name="active" eval="True"/>
+      </record>
+      <record id="portal_sale_view_2" model="ir.ui.view">
+        <field name="name">portal_sale_view.customization2</field>
+        <field name="inherit_id" ref="sale.sale_order_portal_template"/>
+        <field name="mode">extension</field>
+        <field name="model"></field>
+        <field name="active" eval="False"/>
+        <field name="priority">160</field>
+        <field name="type">qweb</field>
+        <field name="arch" type="xml">
+            <xpath expr="//div[hasclass('o_download_pdf', 'd-flex', 'gap-2', 'flex-lg-column', 'flex-xl-row', 'flex-wrap')]" position="replace"/>
+        </field>
+    </record>
+    <record id="portal_sale_view" model="ir.ui.view">
+        <field name="name">portal_sale_view.customization</field>
+        <field name="inherit_id" ref="sale.sale_order_portal_content"/>
+        <field name="mode">extension</field>
+        <field name="model"></field>
+        <field name="active" eval="False"/>
+        <field name="priority">160</field>
+        <field name="type">qweb</field>
+        <field name="arch" type="xml">
+            <data inherit_id="sale.sale_order_portal_content" name="Default">
+                <xpath expr="//table[@id='sales_order_table']" position="replace">
+                    <table t-att-data-order-id="sale_order.id" t-att-data-token="sale_order.access_token" class="table table-sm" id="sales_order_table">
+                        <thead>
+                            <tr>
+                                <th class="text-start">Product</th>
+                                <th class="text-end text-nowrap">Total Amount</th>
+                            </tr>
+                        </thead>
+                        <tbody class="sale_tbody">
+                            <t t-set="current_subtotal" t-value="0"/>
+                            <t t-set="lines_to_report" t-value="sale_order._get_order_lines_to_report()"/>
+                            <t t-set="has_section" t-value="any(line.display_type == 'line_section' or line.product_type == 'combo' for line in lines_to_report)"/>
+                
+                            <t t-if="has_section">
+                                <t t-foreach="lines_to_report" t-as="line">
+                                    <t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal"/>
+                                    <t t-if="line.display_type == 'line_section' or line.product_type == 'combo'">
+                                        <tr>
+                                            <td colspan="99">
+                                                <span t-field="line.name"/>
+                                            </td>
+                                            <t t-set="current_section" t-value="line"/>
+                                            <t t-set="current_subtotal" t-value="0"/>
+                                        </tr>
+                                    </t>
+                                    <t t-if="current_section and (line_last or lines_to_report[line_index+1].display_type == 'line_section')">
+                                        <tr class="is-subtotal text-end">
+                                            <td colspan="99">
+                                                <strong class="mr16">Subtotal</strong>
+                                                <span t-out="current_subtotal" t-options="{'widget': 'monetary', 'display_currency': sale_order.currency_id}"/>
+                                            </td>
+                                        </tr>
+                                        <t t-set="current_section" t-value="None"/>
+                                    </t>
+                                </t>
+                            </t>
+                
+                            <t t-else="">
+                                <tr>
+                                    <td colspan="99">
+                                        <strong>Project: </strong>
+                                            <span t-field="sale_order.name"/> 
+                                    </td>
+                                </tr>
+                                <tr class="is-subtotal text-end">
+                                    <td colspan="99">
+                                        <strong class="mr16">Total</strong>
+                                        <span t-out="sale_order.amount_total" t-options="{'widget': 'monetary', 'display_currency': sale_order.currency_id}"/>
+                                    </td>
+                                </tr>
+                            </t>
+                        </tbody>
+                    </table>
+                </xpath>
+                
+</data>
+</field>
+</record>
+</odoo>
diff --git a/carpenter/data/knowledge_article.xml b/carpenter/data/knowledge_article.xml
new file mode 100644
index 000000000..d19e8d345
--- /dev/null
+++ b/carpenter/data/knowledge_article.xml
@@ -0,0 +1,116 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<odoo>
+        <template id="welcome_article_body">
+            <p><span class="h1-fs"><strong>Mastering Odoo: A Guide to Streamlining Your Carpentry Business</strong></span></p>
+
+            <p>Welcome, carpenters! This guide will help you elevate your custom table business using Odoo, a platform that br/ings together sales, stock, purchases, and customer contacts in one place. Let's dive into Odoo's features and see how to get the most out of each tool step-by-step.</p><div data-embedded="tableOfContent"></div><p><br/></p>
+            
+            <h2>Why Choose Odoo?</h2>
+            <p>With Odoo, you can streamline operations like Sales Management, Stock Management, and Purchase Management to save time and improve customer satisfaction. This integrated approach helps you focus more on crafting your products and providing exceptional service.</p>
+            
+            <h2>Setting Up Odoo for Carpentry Business</h2>
+            <p>Here’s a br/eakdown of how to set up and use Odoo to organize and manage your carpentry business effectively:</p><h3>1. Sales Management</h3>
+            <p>Begin with the <strong>Sales Management</strong> app to organize and track your sales orders.</p>
+            <ul>
+                <li>Click on the <strong>Sales</strong> app on the dashboard.</li>
+                <li>Select <strong>Create</strong> to open a new sale order form.</li>
+                <li>Enter customer details and add product specifics, including quantity and price.</li><li>You can chose a quotation template. This will load a Quote Calculator.</li><li class="oe-nested"><ul><li>In this you have a template, where you can set the area of your framework (b9).</li><li>Filling this will automatically adjust the quantity.</li><li>You can also set the margin as you wish!</li><li>Click on Save and the quotation is automatically changed.</li></ul></li><li>After filling in all necessary details, select <strong>Save</strong> to store the sale order.</li>
+            </ul>
+            
+            <h3>2. Inventory Management</h3>
+            <p>Efficient inventory management is crucial for tracking materials and finished products. Here’s how to manage your stock:</p>
+            <ul>
+                <li>Access the <strong>Inventory</strong> app.</li>
+                <li>Click on <strong>Products</strong> to view current stock levels.</li>
+                <li>Adjust quantities as needed by selecting a product and editing stock levels.</li>
+                <li>Routinely check inventory to ensure you're prepared to meet customer demand.</li>
+            </ul>
+            
+            <h3>3. Purchase Management</h3>
+            <p>Odoo's <strong>Purchases</strong> app allows you to manage material orders efficiently.</p>
+            <ul>
+                <li>Navigate to the <strong>Purchases</strong> app.</li>
+                <li>Click <strong>Create</strong> to open a new purchase order.</li>
+                <li>Select your supplier, specify materials needed, and complete the order form.</li>
+                <li>Finalize by clicking <strong>Confirm</strong> to process the purchase order.</li>
+            </ul>
+            
+            <h3>4. Contact Management</h3>
+            <p>Keeping an organized contact list helps maintain customer relationships and supplier connections.</p>
+            <ul>
+                <li>Go to the <strong>Contacts</strong> app.</li>
+                <li>Click <strong>Create</strong> to add a new contact with relevant details.</li>
+                <li>Link contacts to their respective sales orders for easy reference.</li><li>From this view you can also add a report. This lets you chose whether you want a simplified invoice or a complete one per customer.</li>
+            </ul>
+            
+            <h2>Advanced Tips and Best Practices</h2>
+            <p>Optimize your Odoo experience with these additional features:</p>
+            <ul>
+                <li><strong>Custom Products:</strong> Add your custom tables as products in Odoo for smoother order processing.</li>
+                <li><strong>Email Templates:</strong> Use templates to enhance customer communication, such as welcoming new clients or thanking them after purchase.</li>
+                <li><strong>Analytics:</strong> Review sales analytics regularly to determine popular products and focus on what sells best.</li></ul><h1>Project and Task Automation for Carpentry Services</h1>
+            <p>Odoo can automate project and task creation for service-oriented products, which is useful for managing time-based tasks like custom carpentry work. Here’s an overview of what Odoo can automate:</p>
+            
+            <h3>Projects Based on Templates</h3>
+            <p>For products like custom tables or wood frames, Odoo can automatically create a new project based on a pre-defined template upon sale. Key benefits include:</p>
+            <ul>
+                <li>Automatic project creation for new orders.</li>
+                <li>Consistency in project structure, tasks, and timesheets.</li>
+                <li>Ability to invoice clients based on completion or milestones.</li>
+            </ul>
+            
+            <h3>Tasks in a Global Project</h3>
+            <p>For items such as custom desks, tasks can be created within a larger, ongoing project, which allows for:</p>
+            <ul>
+                <li>Task creation upon sale within an existing project framework.</li>
+                <li>Tracking time spent on individual tasks through timesheets for billing accuracy.</li>
+                <li>Billing upon task or service completion.</li>
+            </ul>
+            
+            <h3>Advantages of Automated Projects and Tasks</h3>
+            <ul>
+                <li><strong>Automation:</strong> Projects and tasks are created without manual input, improving efficiency.</li>
+                <li><strong>Standardization:</strong> Pre-defined templates ensure consistent project structure.</li>
+                <li><strong>Time Tracking:</strong> Timesheets make it easy to track work hours and bill clients accordingly.</li>
+            </ul>
+            
+            <h2>Using Quotation Templates for Roofing Projects</h2>
+            <p>Odoo’s quotation templates simplify complex estimates, especially for projects like roofing where material calculations are needed.</p>
+            
+            <h3>Automatic Material Calculations</h3>
+            <p>Using a quotation template, you can set up material requirements based on project dimensions. This feature enables you to:</p>
+            <ul>
+                <li>Calculate exact quantities of materials like tiles, beams, and insulation based on project dimensions.</li>
+                <li>Adjust margins on materials directly in the quotation to ensure profitability.</li>
+            </ul>
+            
+            <h3>Simplified Quotations</h3>
+            <p>For a clean, professional look, Odoo allows you to present a summarized quotation:</p>
+            <ul>
+                <li>Select <strong>Send Simplified Quotation</strong> to hide detailed lines and provide an overview for customers.</li><li>If you wish to change the portal view too you can select in sales settings the "Simplified Quotations</li>
+                <li>If using sections, sales order lines will be grouped under each section for better clarity.</li>
+                <li>Sections without sales order lines will display only the project name.</li>
+            </ul><h3>Simplified Invoices</h3>
+            <p>Following the same logic, you can also send simplified invoices. To do so:</p><ul><li>Select <strong>Simplified Invoice</strong>in report in the contact view to hide detailed lines and provide an overview for customers.</li><li>If using sections, sales order lines will be grouped under each section for better clarity.</li></ul><h3>Benefits of Customized Quotations</h3>
+            <ul>
+                <li><strong>Efficiency:</strong> Automated material calculations save time and reduce errors.</li>
+                <li><strong>Flexibility:</strong> Adjust margins and create tailored quotations for various project sizes.</li>
+                <li><strong>Presentation:</strong> Simplified quotation views help communicate effectively with customers.</li>
+            </ul>
+            
+            <h2>Conclusion</h2>
+            <p>By using Odoo’s powerful suite of tools, you can manage your carpentry business more effectively and focus on what matters most—your craftsmanship. From sales and inventory management to automated project creation and customized quotations, Odoo empowers you to run a streamlined, professional operation. Embr/ace these tools to grow your business and take on new opportunities with confidence!</p>
+</template>
+<record id="welcome_article" model="knowledge.article">
+    <field name="name">Cake Store</field>
+    <field name="internal_permission">write</field>
+    <field name="category">private</field>
+    <field name="is_locked" eval="True"/>
+    <field name="icon">🪵</field>
+    <field name="cover_image_id" ref="knowledge_cover_2"/>
+    <field name="is_article_visible_by_everyone" eval="True"/>
+    <field name="body">
+        <![CDATA[]]></field>
+</record>
+</odoo>
diff --git a/carpenter/data/knowledge_article_favorite.xml b/carpenter/data/knowledge_article_favorite.xml
new file mode 100644
index 000000000..3d5b6471e
--- /dev/null
+++ b/carpenter/data/knowledge_article_favorite.xml
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="knowledge_favorite" model="knowledge.article.favorite">
+        <field name="article_id" ref="welcome_article"/>
+        <field name="user_id" ref="base.user_admin"/>
+    </record>
+</odoo>
diff --git a/carpenter/data/knowledge_cover.xml b/carpenter/data/knowledge_cover.xml
new file mode 100644
index 000000000..6f09a5d94
--- /dev/null
+++ b/carpenter/data/knowledge_cover.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="knowledge_cover_2" model="knowledge.cover">
+        <field name="attachment_id" ref="ir_attachment_210"/>
+    </record>
+</odoo>
diff --git a/carpenter/data/knowledge_tour.xml b/carpenter/data/knowledge_tour.xml
new file mode 100644
index 000000000..f0ac7a335
--- /dev/null
+++ b/carpenter/data/knowledge_tour.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <record id="knowledge_tour" model="web_tour.tour">
+        <field name="name">knowledge_tour</field>
+        <field name="sequence">2</field>
+        <field name="rainbow_man_message">Welcome! Happy exploring.</field>    
+    </record>
+</odoo>
diff --git a/carpenter/data/mail_message.xml b/carpenter/data/mail_message.xml
new file mode 100644
index 000000000..f4fed14ec
--- /dev/null
+++ b/carpenter/data/mail_message.xml
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record model="mail.message" id="notification_knowledge">
+        <field name="model">discuss.channel</field>
+        <field name="res_id" ref="mail.channel_all_employees"/>
+        <field name="message_type">email</field>
+        <field name="author_id" ref="base.partner_root"/>
+        <field name="subtype_id" ref="mail.mt_comment"/>
+        <field name="subject">🚀 Get started with Odoo Carpenter</field>
+        <field name="body" model="knowledge.article" eval="
+            '&lt;span>&#x1F44B; Hi! Follow this &lt;a href=\''
+             + obj().env.ref('carpenter.welcome_article').article_url
+             + '\'>onboarding guide&lt;/a>. You can find it anytime in the Knowledge app.&lt;/span>'"/>
+    </record>
+</odoo>
diff --git a/carpenter/data/mail_template.xml b/carpenter/data/mail_template.xml
new file mode 100644
index 000000000..1e6eaae40
--- /dev/null
+++ b/carpenter/data/mail_template.xml
@@ -0,0 +1,231 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+<record id="mail_template_24" model="mail.template">
+    <field name="body_html"><![CDATA[<div style="margin: 0px; padding: 0px;">
+    <p style="margin: 0px; padding: 0px; font-size: 12px;">
+        Hello,
+        <br><br>
+        <t t-set="tx_sudo" t-value="object.get_portal_last_transaction()"></t>
+        Your order <span style="font-weight:bold;" t-out="object.name or ''">S00049</span> amounting in <span style="font-weight:bold;" t-out="format_amount(object.amount_total, object.currency_id) or ''">$ 10.00</span>
+        <t t-if="object.state == 'sale' or (tx_sudo and tx_sudo.state in ('done', 'authorized'))">
+            has been confirmed.<br>
+            Thank you for your trust!
+        </t>
+        <t t-elif="tx_sudo and tx_sudo.state == 'pending'">
+            is pending. It will be confirmed when the payment is received.
+            <t t-if="object.reference">
+                Your payment reference is <span style="font-weight:bold;" t-out="object.reference or ''"></span>.
+            </t>
+        </t>
+        <br>
+        <t t-set="documents" t-value="object._get_product_documents()"></t>
+        <t t-if="documents">
+            <br> 
+            <t t-if="len(documents)&gt;1">
+                Here are some additional documents that may interest you:
+            </t>
+            <t t-else="">
+                Here is an additional document that may interest you:
+            </t>
+            <ul style="margin-bottom: 0;">
+                <t t-foreach="documents" t-as="document">
+                    <li style="font-size: 13px;">
+                        <a t-out="document.ir_attachment_id.name" t-att-href="object.get_portal_url('/document/' + str(document.id))" t-att-target="target"></a>
+                    </li>
+                </t>
+            </ul>
+        </t>
+        <br>
+        Do not hesitate to contact us if you have any questions.
+        <t t-if="not is_html_empty(object.user_id.signature)">
+            <br><br>
+            <t t-out="object.user_id.signature or ''">--<br>Mitchell Admin</t>
+        </t>
+        <br><br>
+    </p>
+<t t-if="hasattr(object, 'website_id') and object.website_id">
+    <div style="margin: 0px; padding: 0px;">
+        <table width="100%" style="color: #454748; font-size: 12px; border-collapse: collapse; white-space: nowrap;">
+            <tr style="border-bottom: 2px solid #dee2e6;">
+                <td style="width: 150px;"><span style="font-weight:bold;">Products</span></td>
+                <td></td>
+                <td width="15%" align="center"><span style="font-weight:bold;">Quantity</span></td>
+                <td width="20%" align="right">
+                    <span style="font-weight:bold;">
+                        <t t-if="object.website_id.show_line_subtotals_tax_selection == 'tax_excluded'">
+                            Tax Excl.
+                        </t>
+                        <t t-else="">
+                            Tax Incl.
+                        </t>
+                    </span>
+                </td>
+            </tr>
+        </table>
+        <t t-set="current_subtotal" t-value="0"></t>
+        <t t-foreach="object.order_line" t-as="line">
+            <t t-set="line_subtotal" t-value="                     line.price_subtotal                     if object.website_id.show_line_subtotals_tax_selection == 'tax_excluded'                     else line.price_total                 "></t>
+            <t t-set="current_subtotal" t-value="current_subtotal + line_subtotal"></t>
+            <t t-if="(not hasattr(line, 'is_delivery') or not line.is_delivery) and (                     line.display_type in ['line_section', 'line_note']                     or line.product_type == 'combo'                 )">
+                <table width="100%" style="color: #454748; font-size: 12px; border-collapse: collapse;">
+                    <t t-set="loop_cycle_number" t-value="loop_cycle_number or 0"></t>
+                    <tr t-att-style="'background-color: #f2f2f2' if loop_cycle_number % 2 == 0 else 'background-color: #ffffff'">
+                        <t t-set="loop_cycle_number" t-value="loop_cycle_number + 1"></t>
+                        <td colspan="4">
+                            <t t-if="line.display_type == 'line_section' or line.product_type == 'combo'">
+                                <span style="font-weight:bold;" t-out="line.name or ''">Taking care of Trees Course</span>
+                                <t t-set="current_section" t-value="line"></t>
+                                <t t-set="current_subtotal" t-value="0"></t>
+                            </t>
+                            <t t-elif="line.display_type == 'line_note'">
+                                <i t-out="line.name or ''">Taking care of Trees Course</i>
+                            </t>
+                        </td>
+                    </tr>
+                </table>
+            </t>
+            <t t-elif="(not hasattr(line, 'is_delivery') or not line.is_delivery)">
+                <table width="100%" style="color: #454748; font-size: 12px; border-collapse: collapse;">
+                    <t t-set="loop_cycle_number" t-value="loop_cycle_number or 0"></t>
+                    <tr t-att-style="'background-color: #f2f2f2' if loop_cycle_number % 2 == 0 else 'background-color: #ffffff'">
+                        <t t-set="loop_cycle_number" t-value="loop_cycle_number + 1"></t>
+                        <td style="width: 150px;">
+                            <img t-attf-src="/web/image/product.product/{{ line.product_id.id }}/image_128" style="width: 64px; height: 64px; object-fit: contain;" alt="Product image">
+                        </td>
+                        <td align="left" t-out="line.product_id.name or ''">	Taking care of Trees Course</td>
+                        <td width="15%" align="center" t-out="line.product_uom_qty or ''">1</td>
+                        <td width="20%" align="right"><span style="font-weight:bold; white-space: nowrap;">
+                        <t t-if="object.website_id.show_line_subtotals_tax_selection == 'tax_excluded'">
+                            <t t-out="format_amount(line.price_reduce_taxexcl, object.currency_id) or ''">$ 10.00</t>
+                        </t>
+                        <t t-else="">
+                            <t t-out="format_amount(line.price_reduce_taxinc, object.currency_id) or ''">$ 10.00</t>
+                        </t>
+                        </span></td>
+                    </tr>
+                </table>
+            </t>
+            <t t-if="current_section and (                     line_last                     or object.order_line[line_index+1].display_type == 'line_section'                     or object.order_line[line_index+1].product_type == 'combo'                     or (                         line.combo_item_id                         and not object.order_line[line_index+1].combo_item_id                     )                 ) and not line.is_downpayment">
+                <t t-set="current_section" t-value="None"></t>
+                <table width="100%" style="color: #454748; font-size: 12px; border-collapse: collapse;">
+                    <t t-set="loop_cycle_number" t-value="loop_cycle_number or 0"></t>
+                    <tr t-att-style="'background-color: #f2f2f2' if loop_cycle_number % 2 == 0 else 'background-color: #ffffff'">
+                        <t t-set="loop_cycle_number" t-value="loop_cycle_number + 1"></t>
+                        <td style="width: 100%" align="right">
+                            <span style="font-weight: bold;">Subtotal:</span>
+                            <span t-out="format_amount(current_subtotal, object.currency_id) or ''">$ 10.00</span>
+                        </td>
+                    </tr>
+                </table>
+            </t>
+        </t>
+    </div>
+    <div style="margin: 0px; padding: 0px;" t-if="hasattr(object, 'carrier_id') and object.carrier_id">
+        <table width="100%" style="color: #454748; font-size: 12px; border-spacing: 0px 4px; white-space: nowrap;" align="right">
+            <tr>
+                <td style="width: 60%"></td>
+                <td style="width: 30%; border-top: 1px solid #dee2e6;" align="right"><span style="font-weight:bold;">Delivery:</span></td>
+                <td style="width: 10%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_delivery, object.currency_id) or ''">$ 0.00</td>
+            </tr>
+            <tr>
+                <td style="width: 60%"></td>
+                <td style="width: 30%;" align="right"><span style="font-weight:bold;">Untaxed Amount:</span></td>
+                <td style="width: 10%;" align="right" t-out="format_amount(object.amount_untaxed, object.currency_id) or ''">$ 10.00</td>
+            </tr>
+        </table>
+    </div>
+    <div style="margin: 0px; padding: 0px;" t-else="">
+        <table width="100%" style="color: #454748; font-size: 12px; border-spacing: 0px 4px; white-space: nowrap;" align="right">
+            <tr>
+                <td style="width: 60%"></td>
+                <td style="width: 30%; border-top: 1px solid #dee2e6;" align="right"><span style="font-weight:bold;">Untaxed Amount:</span></td>
+                <td style="width: 10%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_untaxed, object.currency_id) or ''">$ 10.00</td>
+            </tr>
+        </table>
+    </div>
+    <div style="margin: 0px; padding: 0px;">
+        <table width="100%" style="color: #454748; font-size: 12px; border-spacing: 0px 4px; white-space: nowrap;" align="right">
+            <tr>
+                <td style="width: 60%"></td>
+                <td style="width: 30%;" align="right"><span style="font-weight:bold;">Taxes:</span></td>
+                <td style="width: 10%;" align="right" t-out="format_amount(object.amount_tax, object.currency_id) or ''">$ 0.00</td>
+            </tr>
+            <tr>
+                <td style="width: 60%"></td>
+                <td style="width: 30%; border-top: 1px solid #dee2e6;" align="right"><span style="font-weight:bold;">Total:</span></td>
+                <td style="width: 10%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_total, object.currency_id) or ''">$ 10.00</td>
+            </tr>
+        </table>
+    </div>
+    <div t-if="object.partner_invoice_id" style="margin: 0px; padding: 0px;">
+        <table width="100%" style="color: #454748; font-size: 12px;">
+            <tr>
+                <td style="padding-top: 10px;">
+                    <span style="font-weight:bold;">Bill to:</span>
+                    <t t-out="object.partner_invoice_id.street or ''">1201 S Figueroa St</t>
+                    <t t-out="object.partner_invoice_id.city or ''">Los Angeles</t>
+                    <t t-out="object.partner_invoice_id.state_id.name or ''">California</t>
+                    <t t-out="object.partner_invoice_id.zip or ''">90015</t>
+                    <t t-out="object.partner_invoice_id.country_id.name or ''">United States</t>
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    <span style="font-weight:bold;">Payment Method:</span>
+                    <t t-if="tx_sudo.token_id">
+                        <t t-out="tx_sudo.token_id.display_name or ''"></t>
+                    </t>
+                    <t t-else="">
+                        <t t-out="tx_sudo.provider_id.sudo().name or ''"></t>
+                    </t>
+                    (<t t-out="format_amount(tx_sudo.amount, object.currency_id) or ''">$ 10.00</t>)
+                </td>
+            </tr>
+        </table>
+    </div>
+    <div t-if="object.partner_shipping_id and not object.only_services" style="margin: 0px; padding: 0px;">
+        <table width="100%" style="color: #454748; font-size: 12px;">
+            <tr>
+                <td>
+                    <br>
+                    <span style="font-weight:bold;">Ship to:</span>
+                    <t t-out="object.partner_shipping_id.street or ''">1201 S Figueroa St</t>
+                    <t t-out="object.partner_shipping_id.city or ''">Los Angeles</t>
+                    <t t-out="object.partner_shipping_id.state_id.name or ''">California</t>
+                    <t t-out="object.partner_shipping_id.zip or ''">90015</t>
+                    <t t-out="object.partner_shipping_id.country_id.name or ''">United States</t>
+                </td>
+            </tr>
+        </table>
+        <table t-if="hasattr(object, 'carrier_id') and object.carrier_id" width="100%" style="color: #454748; font-size: 12px;">
+            <tr>
+                <td>
+                    <span style="font-weight:bold;">Shipping Method:</span>
+                    <t t-out="object.carrier_id.name or ''"></t>
+                    <t t-if="object.amount_delivery == 0.0">
+                        (Free)
+                    </t>
+                    <t t-else="">
+                        (<t t-out="format_amount(object.amount_delivery, object.currency_id) or ''">$ 10.00</t>)
+                    </t>
+                </td>
+            </tr>
+            <tr t-if="object.carrier_id.carrier_description">
+                <td>
+                    <strong>Shipping Description:</strong>
+                    <t t-out="object.carrier_id.carrier_description"></t>
+                </td>
+            </tr>
+        </table>
+    </div>
+</t>
+</div>]]></field>
+    <field name="email_from">{{ (object.user_id.email_formatted or object.company_id.email_formatted or user.email_formatted) }}</field>
+    <field name="lang">{{ object.partner_id.lang }}</field>
+    <field name="model_id" ref="sale.model_sale_order"/>
+    <field name="name">Sales: Order Confirmation simplified</field>
+    <field name="partner_to">{{ object.partner_id.id }}</field>
+    <field name="report_template_ids" eval="[(6, 0, [ref('simplified_sale_report')])]"/>
+    <field name="subject">{{ object.company_id.name }} {{ (object.get_portal_last_transaction().state == 'pending') and 'Pending Order' or 'Order' }} (Ref {{ object.name or 'n/a' }})</field>
+  </record>
+  </odoo>
diff --git a/carpenter/data/product_product.xml b/carpenter/data/product_product.xml
new file mode 100644
index 000000000..433c52081
--- /dev/null
+++ b/carpenter/data/product_product.xml
@@ -0,0 +1,258 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="product_category_wood_framing" model="product.category">
+        <field name="name">Wood Framing</field>
+    </record>
+    <record id="product_product_3" model="product.product">
+        <field name="name">Wood Frame</field>
+        <field name="type">service</field>
+        <field name="service_tracking">project_only</field>
+        <field name="list_price">100.0</field>
+        <field name="purchase_ok" eval="False"/>
+        <field name="uom_id" ref="uom.product_uom_hour"/>
+        <field name="uom_po_id" ref="uom.product_uom_hour"/>
+        <field name="service_type">timesheet</field>
+        <field name="invoice_policy">delivery</field>
+        <field name="project_template_id" ref="project_project_6"/>
+    </record>
+    <record id="product_product_5" model="product.product">
+        <field name="name">Custom Desk</field>
+        <field name="type">service</field>
+        <field name="service_tracking">task_global_project</field>
+        <field name="list_price">100.0</field>
+        <field name="purchase_ok" eval="False"/>
+        <field name="uom_id" ref="uom.product_uom_hour"/>
+        <field name="uom_po_id" ref="uom.product_uom_hour"/>
+        <field name="service_type">timesheet</field>
+        <field name="invoice_policy">delivery</field>
+        <field name="project_id" ref="project_project_3"/>
+    </record>
+    <record id="product_product_4" model="product.product">
+        <field name="name">Custom Table</field>
+        <field name="type">service</field>
+        <field name="service_tracking">project_only</field>
+        <field name="list_price">100.0</field>
+        <field name="purchase_ok" eval="False"/>
+        <field name="uom_id" ref="uom.product_uom_hour"/>
+        <field name="uom_po_id" ref="uom.product_uom_hour"/>
+        <field name="service_type">timesheet</field>
+        <field name="invoice_policy">delivery</field>
+        <field name="project_template_id" ref="project_project_4"/>
+    </record>
+    <record id="product_template_wood_beam" model="product.template" context="{'create_product_product': False}">
+        <field name="name">Wood Beam</field>
+        <field name="type">consu</field>
+        <field name="invoice_policy">order</field>
+        <field name="expense_policy">no</field>
+        <field name="list_price">50.00</field>
+        <field name="standard_price">35.00</field>
+        <field name="categ_id" ref="product_category_wood_framing"/>
+        <field name="description_sale">High-quality wood beam for framing structures.</field>
+        <field name="description_purchase">Purchase premium wood beams for construction projects.</field>
+        <field name="sale_ok">True</field>
+        <field name="purchase_ok">True</field>
+    </record>
+    <record id="product_product_wood_beam_std" model="product.product">
+        <field name="name">Standard Wood Beam</field>
+        <field name="default_code">WB-ST-01</field>
+        <field name="barcode">1234567890123</field>
+        <field name="product_tmpl_id" ref="product_template_wood_beam"/>
+        <field name="lst_price">50.00</field>
+        <field name="standard_price">35.00</field>
+        <field name="weight">15.00</field>
+        <field name="volume">0.10</field>
+        <field name="active">True</field>
+    </record>
+    <record id="product_template_wood_plank" model="product.template" context="{'create_product_product': False}">
+        <field name="name">Wood Plank</field>
+        <field name="type">consu</field>
+        <field name="invoice_policy">order</field>
+        <field name="expense_policy">no</field>
+        <field name="list_price">30.00</field>
+        <field name="standard_price">20.00</field>
+        <field name="categ_id" ref="product_category_wood_framing"/>
+        <field name="description_sale">Durable wood planks for building stable structures.</field>
+        <field name="description_purchase">Source quality wood planks for carpentry.</field>
+        <field name="sale_ok">True</field>
+        <field name="purchase_ok">True</field>
+    </record>
+    <record id="product_product_wood_plank_std" model="product.product">
+        <field name="name">Standard Wood Plank</field>
+        <field name="default_code">WP-ST-01</field>
+        <field name="barcode">1234567890124</field>
+        <field name="product_tmpl_id" ref="product_template_wood_plank"/>
+        <field name="lst_price">30.00</field>
+        <field name="standard_price">20.00</field>
+        <field name="weight">8.00</field>
+        <field name="volume">0.05</field>
+        <field name="active">True</field>
+    </record>
+    <record id="product_template_nail_pack" model="product.template" context="{'create_product_product': False}">
+        <field name="name">Nail Pack</field>
+        <field name="type">consu</field>
+        <field name="invoice_policy">order</field>
+        <field name="expense_policy">no</field>
+        <field name="list_price">10.00</field>
+        <field name="standard_price">5.00</field>
+        <field name="categ_id" ref="product_category_wood_framing"/>
+        <field name="description_sale">Pack of durable nails crucial for framing work.</field>
+        <field name="description_purchase">Order high-quality nail packs for construction needs.</field>
+        <field name="sale_ok">True</field>
+        <field name="purchase_ok">True</field>
+    </record>
+    <record id="product_product_nail_pack_std" model="product.product">
+        <field name="name">Standard Nail Pack</field>
+        <field name="default_code">NP-ST-01</field>
+        <field name="barcode">1234567890125</field>
+        <field name="product_tmpl_id" ref="product_template_nail_pack"/>
+        <field name="lst_price">10.00</field>
+        <field name="standard_price">5.00</field>
+        <field name="weight">2.00</field>
+        <field name="volume">0.02</field>
+        <field name="active">True</field>
+    </record>
+    <record id="product_template_hammer" model="product.template" context="{'create_product_product': False}">
+        <field name="name">Hinges</field>
+        <field name="type">consu</field>
+        <field name="invoice_policy">order</field>
+        <field name="expense_policy">no</field>
+        <field name="list_price">25.00</field>
+        <field name="standard_price">15.00</field>
+        <field name="categ_id" ref="product_category_wood_framing"/>
+        <field name="description_sale">Reliable hammer for carpentry and construction tasks.</field>
+        <field name="description_purchase">Get the best hammer quality for precise work.</field>
+        <field name="sale_ok">True</field>
+        <field name="purchase_ok">True</field>
+    </record>
+    <record id="product_product_hammer_std" model="product.product">
+        <field name="name">Standard Hinges</field>
+        <field name="default_code">HM-ST-01</field>
+        <field name="barcode">1234567890126</field>
+        <field name="product_tmpl_id" ref="product_template_hammer"/>
+        <field name="lst_price">25.00</field>
+        <field name="standard_price">15.00</field>
+        <field name="weight">1.5</field>
+        <field name="volume">0.03</field>
+        <field name="active">True</field>
+    </record>
+    <record id="product_template_saw" model="product.template" context="{'create_product_product': False}">
+        <field name="name">Edges</field>
+        <field name="type">consu</field>
+        <field name="invoice_policy">order</field>
+        <field name="expense_policy">no</field>
+        <field name="list_price">40.00</field>
+        <field name="standard_price">28.00</field>
+        <field name="categ_id" ref="product_category_wood_framing"/>
+        <field name="description_sale">High-performance saw for accurate wood cutting.</field>
+        <field name="description_purchase">Acquire robust saws for efficient carpentry tasks.</field>
+        <field name="sale_ok">True</field>
+        <field name="purchase_ok">True</field>
+    </record>
+    <record id="product_product_saw_std" model="product.product">
+        <field name="name">Standard Edges</field>
+        <field name="default_code">SW-ST-01</field>
+        <field name="barcode">1234567890127</field>
+        <field name="product_tmpl_id" ref="product_template_saw"/>
+        <field name="lst_price">40.00</field>
+        <field name="standard_price">28.00</field>
+        <field name="weight">2.5</field>
+        <field name="volume">0.1</field>
+        <field name="active">True</field>
+    </record>
+    <record id="product_template_wood_glue" model="product.template" context="{'create_product_product': False}">
+        <field name="name">Wood Glue</field>
+        <field name="type">consu</field>
+        <field name="invoice_policy">order</field>
+        <field name="expense_policy">no</field>
+        <field name="list_price">15.00</field>
+        <field name="standard_price">7.50</field>
+        <field name="categ_id" ref="product_category_wood_framing"/>
+        <field name="description_sale">Strong adhesive for wood joinery.</field>
+        <field name="description_purchase">Secure wood glue for permanent bonding.</field>
+        <field name="sale_ok">True</field>
+        <field name="purchase_ok">True</field>
+    </record>
+    <record id="product_product_wood_glue_std" model="product.product">
+        <field name="name">Standard Wood Glue</field>
+        <field name="default_code">WG-ST-01</field>
+        <field name="barcode">1234567890128</field>
+        <field name="product_tmpl_id" ref="product_template_wood_glue"/>
+        <field name="lst_price">15.00</field>
+        <field name="standard_price">7.50</field>
+        <field name="weight">0.5</field>
+        <field name="volume">0.02</field>
+        <field name="active">True</field>
+    </record>
+    <record id="product_template_measuring_tape" model="product.template" context="{'create_product_product': False}">
+        <field name="name">Screw</field>
+        <field name="type">consu</field>
+        <field name="invoice_policy">order</field>
+        <field name="expense_policy">no</field>
+        <field name="list_price">12.00</field>
+        <field name="standard_price">6.00</field>
+        <field name="categ_id" ref="product_category_wood_framing"/>
+        <field name="description_sale">Accurate measuring tape for precise measurements.</field>
+        <field name="description_purchase">Invest in durable measuring tapes.</field>
+        <field name="sale_ok">True</field>
+        <field name="purchase_ok">True</field>
+    </record>
+    <record id="product_product_measuring_tape_std" model="product.product">
+        <field name="name">Screw</field>
+        <field name="default_code">MT-ST-01</field>
+        <field name="barcode">1234567890129</field>
+        <field name="product_tmpl_id" ref="product_template_measuring_tape"/>
+        <field name="lst_price">12.00</field>
+        <field name="standard_price">6.00</field>
+        <field name="weight">0.3</field>
+        <field name="volume">0.01</field>
+        <field name="active">True</field>
+    </record>
+    <record id="product_template_sandpaper" model="product.template" context="{'create_product_product': False}">
+        <field name="name">Sandpaper</field>
+        <field name="type">consu</field>
+        <field name="invoice_policy">order</field>
+        <field name="expense_policy">no</field>
+        <field name="list_price">5.00</field>
+        <field name="standard_price">2.50</field>
+        <field name="categ_id" ref="product_category_wood_framing"/>
+        <field name="description_sale">Essential sandpaper for smooth finishing.</field>
+        <field name="description_purchase">Order sandpaper for refined surface work.</field>
+        <field name="sale_ok">True</field>
+        <field name="purchase_ok">True</field>
+    </record>
+    <record id="product_product_sandpaper_std" model="product.product">
+        <field name="name">Standard Sandpaper</field>
+        <field name="default_code">SP-ST-01</field>
+        <field name="barcode">1234567890130</field>
+        <field name="product_tmpl_id" ref="product_template_sandpaper"/>
+        <field name="lst_price">5.00</field>
+        <field name="standard_price">2.50</field>
+        <field name="weight">0.1</field>
+        <field name="volume">0.01</field>
+        <field name="active">True</field>
+    </record>
+    <record id="product_template_wrench" model="product.template" context="{'create_product_product': False}">
+        <field name="name">Wrench</field>
+        <field name="type">consu</field>
+        <field name="invoice_policy">order</field>
+        <field name="expense_policy">no</field>
+        <field name="list_price">20.00</field>
+        <field name="standard_price">10.00</field>
+        <field name="categ_id" ref="product_category_wood_framing"/>
+        <field name="description_sale">Reliable wrench for assembling and adjustments.</field>
+        <field name="description_purchase">Purchase wrenches for carpentry maintenance.</field>
+        <field name="sale_ok">True</field>
+        <field name="purchase_ok">True</field>
+    </record>
+    <record id="product_product_wrench_std" model="product.product">
+        <field name="name">Standard Wrench</field>
+        <field name="default_code">WR-ST-01</field>
+        <field name="barcode">1234567890131</field>
+        <field name="product_tmpl_id" ref="product_template_wrench"/>
+        <field name="lst_price">20.00</field>
+        <field name="standard_price">10.00</field>
+        <field name="weight">0.6</field>
+        <field name="volume">0.02</field>
+        <field name="active">True</field>
+    </record>
+</odoo>
diff --git a/carpenter/data/project_project.xml b/carpenter/data/project_project.xml
new file mode 100644
index 000000000..f1875962d
--- /dev/null
+++ b/carpenter/data/project_project.xml
@@ -0,0 +1,24 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="project_project_4" model="project.project">
+        <field name="name">Custom Table</field>
+        <field name="allow_billable" eval="True"/>
+        <field name="tag_ids" eval="[(6, 0, [ref('project_tags_1')])]"/>
+        <field name="type_ids" eval="[(6, 0, [ref('project_task_type_12'), ref('project_task_type_13'), ref('project_task_type_14')])]"/>
+        <field name="favorite_user_ids" eval="[(6, 0, [ref('base.user_admin')])]"/>
+    </record>
+    <record id="project_project_6" model="project.project">
+        <field name="name">Wood Framing</field>
+        <field name="tag_ids" eval="[(6, 0, [ref('project_tags_1')])]"/>
+        <field name="allow_billable" eval="True"/>
+        <field name="favorite_user_ids" eval="[(6, 0, [ref('base.user_admin')])]"/>
+        <field name="type_ids" eval="[(6, 0, [ref('project_task_type_26'), ref('project_task_type_27'), ref('project_task_type_28')])]"/>
+    </record>
+    <record id="project_project_3" model="project.project">
+        <field name="name">Custom Desk</field>
+        <field name="allow_billable" eval="True"/>
+        <field name="favorite_user_ids" eval="[(6, 0, [ref('base.user_admin')])]"/>        
+        <field name="type_ids" eval="[(6, 0, [ref('project_task_type_15'), ref('project_task_type_16'), ref('project_task_type_17'), ref('project_task_type_18')])]"/>
+        <field name="last_update_status">on_track</field>
+    </record>
+</odoo>
diff --git a/carpenter/data/project_tags.xml b/carpenter/data/project_tags.xml
new file mode 100644
index 000000000..1b0dde3ff
--- /dev/null
+++ b/carpenter/data/project_tags.xml
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="project_tags_3" model="project.tags">
+        <field name="name">Customer Projects</field>
+    </record>
+    <record id="project_tags_1" model="project.tags">
+        <field name="name">Template</field>
+    </record>
+</odoo>
diff --git a/carpenter/data/project_task.xml b/carpenter/data/project_task.xml
new file mode 100644
index 000000000..5b0a368d3
--- /dev/null
+++ b/carpenter/data/project_task.xml
@@ -0,0 +1,135 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="project_task_7" model="project.task">
+        <field name="name">Initial Consultation</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_8" model="project.task">
+        <field name="name">Site Measurements</field>
+        <field name="sequence">1</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_9" model="project.task">
+        <field name="name">Material Planning</field>
+        <field name="sequence">2</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_13" model="project.task">
+        <field name="name">Cutting and Shaping</field>
+        <field name="sequence">4</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_14" model="project.task">
+        <field name="name">Assembly</field>
+        <field name="sequence">5</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_15" model="project.task">
+        <field name="name">Installation</field>
+        <field name="sequence">6</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_16" model="project.task">
+        <field name="name">Finishing</field>
+        <field name="sequence">7</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_17" model="project.task">
+        <field name="name">Quality Check</field>
+        <field name="sequence">8</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_18" model="project.task">
+        <field name="name">Final Touches</field>
+        <field name="sequence">9</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_19" model="project.task">
+        <field name="name">Client Review</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_20" model="project.task">
+        <field name="name">Clean-up</field>
+        <field name="sequence">11</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_21" model="project.task">
+        <field name="name">Post-Installation Follow-Up</field>
+        <field name="sequence">12</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_12" model="project.task">
+        <field name="name">Material Sourcing</field>
+        <field name="sequence">3</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_11" model="project.task">
+        <field name="name">Final Report</field>
+        <field name="sequence">14</field>
+        <field name="project_id" ref="project_project_6"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="depend_on_ids" eval="[(6, 0, [ref('project_task_12'), ref('project_task_13'), ref('project_task_14'), ref('project_task_15'), ref('project_task_16'), ref('project_task_17'), ref('project_task_18'), ref('project_task_19'), ref('project_task_20'), ref('project_task_21')])]"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_201" model="project.task">
+        <field name="name">Wood Selection and Preparation</field>
+        <field name="sequence">1</field>
+        <field name="project_id" ref="project_project_4"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_202" model="project.task">
+        <field name="name">Cutting the Components</field>
+        <field name="sequence">2</field>
+        <field name="project_id" ref="project_project_4"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_203" model="project.task">
+        <field name="name">Assembly of Table</field>
+        <field name="sequence">3</field>
+        <field name="project_id" ref="project_project_4"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_204" model="project.task">
+        <field name="name">Sanding and Smoothing</field>
+        <field name="sequence">4</field>
+        <field name="project_id" ref="project_project_4"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+    <record id="project_task_205" model="project.task">
+        <field name="name">Finishing and Painting</field>
+        <field name="sequence">5</field>
+        <field name="project_id" ref="project_project_4"/>
+        <field name="stage_id" ref="project_task_type_26"/>
+        <field name="display_in_project" eval="True"/>
+    </record>
+</odoo>
diff --git a/carpenter/data/project_task_type.xml b/carpenter/data/project_task_type.xml
new file mode 100644
index 000000000..d6add1212
--- /dev/null
+++ b/carpenter/data/project_task_type.xml
@@ -0,0 +1,54 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="project_task_type_12" model="project.task.type">
+        <field name="name">New Job</field>
+        <field name="sequence" eval="False"/>
+        <field name="user_id" eval="False"/>
+    </record>
+    <record id="project_task_type_15" model="project.task.type">
+        <field name="name">Pending Materials</field>
+        <field name="sequence" eval="False"/>
+        <field name="user_id" eval="False"/>
+    </record>
+    <record id="project_task_type_26" model="project.task.type">
+        <field name="name">To Start</field>
+        <field name="sequence" eval="False"/>
+        <field name="user_id" eval="False"/>
+    </record>
+    <record id="project_task_type_2" model="project.task.type">
+        <field name="name">Design Review</field>
+        <field name="user_id" ref="base.user_root"/>
+    </record>
+    <record id="project_task_type_13" model="project.task.type">
+        <field name="name">In Progress</field>
+        <field name="user_id" eval="False"/>
+    </record>
+    <record id="project_task_type_16" model="project.task.type">
+        <field name="name">Measurement</field>
+        <field name="user_id" eval="False"/>
+    </record>
+    <record id="project_task_type_27" model="project.task.type">
+        <field name="name">Cutting/Assembling</field>
+        <field name="user_id" eval="False"/>
+    </record>
+    <record id="project_task_type_14" model="project.task.type">
+        <field name="name">Finished</field>
+        <field name="sequence">2</field>
+        <field name="user_id" eval="False"/>
+    </record>
+    <record id="project_task_type_17" model="project.task.type">
+        <field name="name">Installation</field>
+        <field name="sequence">2</field>
+        <field name="user_id" eval="False"/>
+    </record>
+    <record id="project_task_type_28" model="project.task.type">
+        <field name="name">Completed</field>
+        <field name="sequence">2</field>
+        <field name="user_id" eval="False"/>
+    </record>
+    <record id="project_task_type_18" model="project.task.type">
+        <field name="name">Inspection</field>
+        <field name="sequence">3</field>
+        <field name="user_id" eval="False"/>
+    </record>
+</odoo>
diff --git a/carpenter/data/report_view.xml b/carpenter/data/report_view.xml
new file mode 100644
index 000000000..049214238
--- /dev/null
+++ b/carpenter/data/report_view.xml
@@ -0,0 +1,479 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo>
+  <record id="simplified_sales_order" model="ir.ui.view">
+    <field name="arch" type="xml">
+      <t t-name="sale.report_saleorder_document">
+        <t t-call="web.external_layout">
+          <t t-set="doc" t-value="doc.with_context(lang=doc.partner_id.lang)"/>
+          <t t-set="forced_vat" t-value="doc.fiscal_position_id.foreign_vat"/>
+          <t t-set="address">
+            <div t-field="doc.partner_id" t-options="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;], &quot;no_marker&quot;: True}"/>
+            <p t-if="doc.partner_id.vat"><t t-if="doc.company_id.account_fiscal_country_id.vat_label" t-out="doc.company_id.account_fiscal_country_id.vat_label"/><t t-else="">Tax ID</t>: <span t-field="doc.partner_id.vat"/></p>
+          </t>
+          <t t-if="doc.partner_shipping_id == doc.partner_invoice_id and doc.partner_invoice_id != doc.partner_id or doc.partner_shipping_id != doc.partner_invoice_id">
+            <t t-set="information_block">
+              <strong>
+                <t t-if="doc.partner_shipping_id == doc.partner_invoice_id">Invoicing and Shipping Address</t>
+                <t t-else="">Invoicing Address</t>
+              </strong>
+              <div t-field="doc.partner_invoice_id" t-options="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;, &quot;phone&quot;], &quot;no_marker&quot;: True, &quot;phone_icons&quot;: True}"/>
+              <t t-if="doc.partner_shipping_id != doc.partner_invoice_id">
+                <strong>Shipping Address</strong>
+                <div t-field="doc.partner_shipping_id" t-options="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;, &quot;phone&quot;], &quot;no_marker&quot;: True, &quot;phone_icons&quot;: True}"/>
+              </t>
+            </t>
+          </t>
+          <div class="page">
+            <div class="oe_structure"/>
+            <t t-set="is_proforma" t-value="env.context.get('proforma', False) or is_pro_forma"/>
+            <t t-set="layout_document_title">
+              <span t-if="is_proforma">Pro-Forma Invoice # </span>
+              <span t-elif="doc.state in ['draft','sent']">Quotation # </span>
+              <span t-else="">Order # </span>
+              <span t-field="doc.name">SO0000</span>
+            </t>
+            <div class="row mb-4" id="informations">
+              <div t-if="doc.client_order_ref" class="col" name="informations_reference">
+                <strong>Your Reference</strong>
+                <div t-field="doc.client_order_ref">SO0000</div>
+              </div>
+              <div t-if="doc.date_order" class="col" name="informations_date">
+                <strong t-if="is_proforma">Issued Date</strong>
+                <strong t-elif="doc.state in ['draft', 'sent']">Quotation Date</strong>
+                <strong t-else="">Order Date</strong>
+                <div t-field="doc.date_order" t-options="{&quot;widget&quot;: &quot;date&quot;}">2023-12-31</div>
+              </div>
+              <div t-if="doc.validity_date and doc.state in ['draft', 'sent']" class="col" name="expiration_date">
+                <strong>Expiration</strong>
+                <div t-field="doc.validity_date">2023-12-31</div>
+              </div>
+              <div t-if="doc.user_id.name" class="col">
+                <strong>Salesperson</strong>
+                <div t-field="doc.user_id">Mitchell Admin</div>
+              </div>
+            </div>
+            <t t-set="lines_to_report" t-value="doc._get_order_lines_to_report()"/>
+            <t t-set="display_discount" t-value="any(l.discount for l in lines_to_report)"/>
+            <div class="oe_structure"/>
+            <xpath expr="//table[@class='o_has_total_table table o_main_table table-borderless'][thead[@style='display: table-row-group']]" position="replace">
+              <table class="o_has_total_table table o_main_table table-borderless">
+                <thead>
+                  <tr>
+                    <th class="text-start">Product</th>
+                    <th class="text-end text-nowrap">Total Amount</th>
+                  </tr>
+                </thead>
+                <tbody class="sale_tbody">
+                  <t t-set="current_subtotal" t-value="0"/>
+                  <t t-set="has_section" t-value="any(line.display_type == 'line_section' or line.product_type == 'combo' for line in lines_to_report)"/>
+                  <t t-if="has_section">
+                    <t t-foreach="lines_to_report" t-as="line">
+                      <t t-if="line.display_type == 'line_section' or line.product_type == 'combo'">
+                        <tr>
+                          <td colspan="99">
+                            <span t-field="line.name"/>
+                          </td>
+                          <t t-set="current_section" t-value="line"/>
+                          <t t-set="current_subtotal" t-value="0"/>
+                        </tr>
+                      </t>
+                      <t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal"/>
+                      <t t-if="current_section and (line_last or lines_to_report[line_index+1].display_type == 'line_section')">
+                        <tr class="is-subtotal text-end">
+                          <td colspan="99">
+                            <strong class="mr16">Subtotal</strong>
+                            <span t-out="current_subtotal" t-options="{'widget': 'monetary', 'display_currency': doc.currency_id}"/>
+                          </td>
+                        </tr>
+                        <t t-set="current_section" t-value="None"/>
+                      </t>
+                    </t>
+                  </t>
+                  <t t-else="">
+                    <tr>
+                      <td colspan="99">
+                        <strong>Project: </strong>
+                          <span t-field="doc.name"/>
+                      </td>
+                    </tr>
+                    <tr class="is-subtotal text-end">
+                      <td colspan="99">
+                        <strong class="mr16">Total</strong>
+                        <span t-out="doc.amount_total" t-options="{'widget': 'monetary', 'display_currency': doc.currency_id}"/>
+                      </td>
+                    </tr>
+                  </t>
+                </tbody>
+              </table>
+            </xpath>
+            <div class="clearfix" name="so_total_summary">
+              <div id="total" class="row mt-n3" name="total">
+                <div t-attf-class="#{'col-6' if report_type != 'html' else 'col-sm-7 col-md-6'} ms-auto">
+                  <table class="o_total_table table table-borderless">
+                    <t t-call="sale.document_tax_totals">
+                      <t t-set="tax_totals" t-value="doc.tax_totals"/>
+                      <t t-set="currency" t-value="doc.currency_id"/>
+                    </t>
+                  </table>
+                </div>
+              </div>
+            </div>
+            <div class="oe_structure"/>
+            <div t-if="not doc.signature" class="oe_structure"/>
+            <div t-else="" class="mt-4 ml64 mr4" name="signature">
+              <div class="offset-8">
+                <strong>Signature</strong>
+              </div>
+              <div class="offset-8">
+                <img t-att-src="image_data_uri(doc.signature)" style="max-height: 4cm; max-width: 8cm;"/>
+              </div>
+              <div class="offset-8 text-center">
+                <span t-field="doc.signed_by">Oscar Morgan</span>
+              </div>
+            </div>
+            <div>
+              <span t-field="doc.note" t-attf-style="#{'text-align:justify;text-justify:inter-word;' if doc.company_id.terms_type != 'html' else ''}" name="order_note"/>
+              <p t-if="not is_html_empty(doc.payment_term_id.note)">
+                <span t-field="doc.payment_term_id.note">The payment should also be transmitted with love</span>
+              </p>
+              <div class="oe_structure"/>
+              <p t-if="doc.fiscal_position_id and not is_html_empty(doc.fiscal_position_id.sudo().note)" id="fiscal_position_remark">
+                <strong>Fiscal Position Remark:</strong>
+                <span t-field="doc.fiscal_position_id.sudo().note">No further requirements for this payment</span>
+              </p>
+            </div>
+            <div class="oe_structure"/>
+          </div>
+        </t>
+      </t>
+    </field>
+    <field name="key">carpenter.simplified_sales_order_document</field>
+    <field name="name">carpenter.simplified_sales_order_document</field>
+    <field name="type">qweb</field>
+  </record>
+  <record id="simplified_sale_report_document" model="ir.ui.view">
+    <field name="arch" type="xml">
+      <t t-name="studio_main_report">
+        <t t-call="web.html_container">
+          <t t-foreach="docs" t-as="doc">
+            <t t-call="carpenter.simplified_sales_order_document"/>
+          </t>
+        </t>
+      </t>
+    </field>
+    <field name="key">carpenter.simplified_sales_order</field>
+    <field name="name">carpenter.simplified_sales_order</field>
+    <field name="type">qweb</field>
+  </record>
+
+
+  <record id="simplified_invoice" model="ir.ui.view">
+    <field name="arch" type="xml">
+        <t t-name="account.report_invoice_document">
+            <t t-call="web.external_layout">
+                <t t-set="o" t-value="doc.with_context(lang=lang)"/>
+                <t t-set="forced_vat" t-value="o.fiscal_position_id.foreign_vat"/> <!-- So that it appears in the footer of the report instead of the company VAT if it's set -->
+                <div class="row">
+                    <t t-if="o.partner_shipping_id and (o.partner_shipping_id != o.partner_id)">
+                        <div class="col-6">
+                            <t t-set="information_block">
+                                <div groups="account.group_delivery_invoice_address" name="shipping_address_block">
+                                    <strong>Shipping Address</strong>
+                                    <div t-field="o.partner_shipping_id" t-options="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;], &quot;no_marker&quot;: True}"/>
+                                </div>
+                            </t>
+                        </div>
+                        <div class="col-6" name="address_not_same_as_shipping">
+                            <t t-set="address">
+                                <address class="mb-0" t-field="o.partner_id" t-options="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;], &quot;no_marker&quot;: True}"/>
+                                <div t-if="o.partner_id.vat" id="partner_vat_address_not_same_as_shipping">
+                                    <t t-if="o.company_id.account_fiscal_country_id.vat_label" t-out="o.company_id.account_fiscal_country_id.vat_label" id="inv_tax_id_label"/>
+                                    <t t-else="">Tax ID</t>: <span t-field="o.partner_id.vat"/>
+                                </div>
+                            </t>
+                        </div>
+                    </t>
+                    <t t-elif="o.partner_shipping_id and (o.partner_shipping_id == o.partner_id)">
+                        <div class="offset-col-6 col-6" name="address_same_as_shipping">
+                            <t t-set="address">
+                                <address class="mb-0" t-field="o.partner_id" t-options="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;], &quot;no_marker&quot;: True}"/>
+                                <div t-if="o.partner_id.vat" id="partner_vat_address_same_as_shipping">
+                                    <t t-if="o.company_id.account_fiscal_country_id.vat_label" t-out="o.company_id.account_fiscal_country_id.vat_label" id="inv_tax_id_label"/>
+                                    <t t-else="">Tax ID</t>: <span t-field="o.partner_id.vat"/>
+                                </div>
+                            </t>
+                        </div>
+                    </t>
+                    <t t-else="">
+                        <div class="offset-col-6 col-6" name="no_shipping">
+                            <t t-set="address">
+                                <address class="mb-0" t-field="o.partner_id" t-options="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;], &quot;no_marker&quot;: True}"/>
+                                <div t-if="o.partner_id.vat" id="partner_vat_no_shipping">
+                                    <t t-if="o.company_id.account_fiscal_country_id.vat_label" t-out="o.company_id.account_fiscal_country_id.vat_label" id="inv_tax_id_label"/>
+                                    <t t-else="">Tax ID</t>: <span t-field="o.partner_id.vat"/>
+                                </div>
+                            </t>
+                        </div>
+                    </t>
+                </div>
+                <div class="clearfix invoice_main">
+                    <div class="page mb-4">
+                        <t t-set="layout_document_title">
+                            <span t-if="not proforma"/>
+                            <span t-else="">PROFORMA</span>
+                            <span t-if="o.move_type == 'out_invoice' and o.state == 'posted'">Invoice</span>
+                            <span t-elif="o.move_type == 'out_invoice' and o.state == 'draft'">Draft Invoice</span>
+                            <span t-elif="o.move_type == 'out_invoice' and o.state == 'cancel'">Cancelled Invoice</span>
+                            <span t-elif="o.move_type == 'out_refund' and o.state == 'posted'">Credit Note</span>
+                            <span t-elif="o.move_type == 'out_refund' and o.state == 'draft'">Draft Credit Note</span>
+                            <span t-elif="o.move_type == 'out_refund' and o.state == 'cancel'">Cancelled Credit Note</span>
+                            <span t-elif="o.move_type == 'in_refund'">Vendor Credit Note</span>
+                            <span t-elif="o.move_type == 'in_invoice'">Vendor Bill</span>
+                            <span t-if="o.name != '/'" t-field="o.name">INV/2023/0001</span>
+                        </t>
+                        <div class="oe_structure"/>
+                        <div id="informations" class="row mb-4">
+                            <div class="col" t-if="o.invoice_date" name="invoice_date">
+                                <t t-if="o.move_type == 'out_invoice'"><strong>Invoice Date</strong></t>
+                                <t t-elif="o.move_type == 'out_refund'"><strong>Credit Note Date</strong></t>
+                                <t t-elif="o.move_type == 'out_receipt'"><strong>Receipt Date</strong></t>
+                                <t t-else=""><strong>Date</strong></t>
+                                <div t-field="o.invoice_date">2023-09-12</div>
+                            </div>
+                            <div class="col" t-if="o.invoice_date_due and o.move_type == 'out_invoice' and o.state == 'posted'" name="due_date">
+                                <strong>Due Date</strong>
+                                <div t-field="o.invoice_date_due">2023-10-31</div>
+                            </div>
+                            <div class="col" t-if="o.delivery_date" name="delivery_date">
+                                <strong>Delivery Date</strong>
+                                <div t-field="o.delivery_date">2023-09-25</div>
+                            </div>
+                            <div class="col" t-if="o.invoice_origin" name="origin">
+                                <strong>Source</strong>
+                                <div t-field="o.invoice_origin">SO123</div>
+                            </div>
+                            <div class="col" t-if="o.partner_id.ref" name="customer_code">
+                                <strong>Customer Code</strong>
+                                <div t-field="o.partner_id.ref"/>
+                            </div>
+                            <div class="col" t-if="o.ref" name="reference">
+                                <strong>Reference</strong>
+                                <div t-field="o.ref">INV/2023/00001</div>
+                            </div>
+                            <div class="col" t-if="o.invoice_incoterm_id" name="incoterm_id">
+                                <strong>Incoterm</strong>
+                                <div t-if="o.incoterm_location">
+                                    <span t-field="o.invoice_incoterm_id.code"/> <br/>
+                                    <span t-field="o.incoterm_location"/>
+                                </div>
+                                <div t-else="" t-field="o.invoice_incoterm_id.code" class="m-0"/>
+                            </div>
+                        </div>
+
+                        <t t-set="display_discount" t-value="any(l.discount for l in o.invoice_line_ids)"/>
+                        <div class="oe_structure"/>
+<table class="o_has_total_table table o_main_table table-borderless" name="invoice_line_table">
+                    <thead>
+                        <tr>
+                            <th class="text-start">Product</th>
+                            <th class="text-end text-nowrap">Total Amount</th>
+                        </tr>
+                    </thead>
+                    <tbody class="invoice_tbody">
+                        <t t-foreach="o.invoice_line_ids.mapped('sale_line_ids.order_id')" t-as="order">
+                            <t t-if="order.order_line.filtered(lambda l: l.invoice_status == 'invoiced')">
+                                <tr class="o_line_section">
+                                    <td colspan="99">
+                                        <strong>Project: </strong>
+                                            <span t-field="order.name"/>
+                                    </td>
+                                </tr>
+    
+                                <t t-set="current_subtotal" t-value="0"/>
+                                <t t-set="lines" t-value="o.invoice_line_ids.sorted(key=lambda l: (-l.sequence, l.date, l.move_name, -l.id), reverse=True)"/>
+                                
+                                <t t-set="has_section" t-value="any(line.display_type == 'line_section' for line in lines)"/>
+                                
+                                <t t-if="has_section">
+                                    <t t-foreach="lines" t-as="line">
+                                        <t t-if="line.display_type == 'line_section'">
+                                            <tr style="padding-left: 20px;">
+                                                <td name="td_section_line" colspan="99" style="padding-left: 20px;">
+                                                    <span t-field="line.name"/> 
+                                                </td>
+                                                <t t-set="current_section" t-value="line"/>
+                                                <t t-set="current_subtotal" t-value="0"/>
+                                            </tr>
+                                        </t>
+                                
+                                        <t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal"/>
+                                
+                                        <t t-if="current_section and (line_last or lines[line_index+1].display_type == 'line_section')">
+                                            <tr class="is-subtotal text-end">
+                                                <td name="td_section_subtotal" colspan="99" style="padding-left: 20px;"> 
+                                                    <strong class="mr16">Subtotal</strong>
+                                                    <span t-out="current_subtotal" t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/>
+                                                </td>
+                                            </tr>
+                                            <t t-set="current_section" t-value="None"/>
+                                        </t>
+                                    </t>
+                                </t>
+                                
+    
+                <t t-else="">
+                    <tr class="is-subtotal text-end">
+                        <td colspan="99">
+                            <strong>Total</strong>
+                            <span t-out="sum(order.order_line.filtered(lambda l: l.invoice_status == 'invoiced').mapped('price_total'))" t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/>
+                        </td>
+                    </tr>
+                </t>
+            </t>
+        </t>
+        </tbody>
+        </table>
+                        <div>
+                            <div id="right-elements" t-attf-class="#{'col-5' if report_type != 'html' else 'col-12 col-md-5'} ms-5 d-inline-block float-end">
+                                <div id="total" class="clearfix row mt-n3">
+                                    <div class="ms-auto">
+                                        <table class="o_total_table table table-borderless avoid-page-break-inside">
+
+                                            <!-- Tax totals summary (invoice currency) -->
+                                            <t t-if="o.tax_totals" t-call="account.document_tax_totals">
+                                                <t t-set="tax_totals" t-value="o.tax_totals"/>
+                                                <t t-set="currency" t-value="o.currency_id"/>
+                                            </t>
+
+                                            <!--Payments-->
+                                            <t t-if="print_with_payments">
+                                                <t t-if="o.payment_state != 'invoicing_legacy'">
+                                                    <t t-set="payments_vals" t-value="o.sudo().invoice_payments_widget and o.sudo().invoice_payments_widget['content'] or []"/>
+                                                    <t t-foreach="payments_vals" t-as="payment_vals">
+                                                        <tr t-if="payment_vals['is_exchange'] == 0">
+                                                            <td>
+                                                                <i class="oe_form_field text-end oe_payment_label">Paid on <t t-out="payment_vals['date']" t-options="{&quot;widget&quot;: &quot;date&quot;}">2021-09-19</t></i>
+                                                            </td>
+                                                            <td class="text-end">
+                                                                <span t-out="payment_vals['amount']" t-options="{&quot;widget&quot;: &quot;monetary&quot;, &quot;display_currency&quot;: o.currency_id}">20.00</span>
+                                                            </td>
+                                                        </tr>
+                                                    </t>
+                                                    <t t-if="len(payments_vals) &gt; 0">
+                                                        <tr class="fw-bold">
+                                                            <td>Amount Due</td>
+                                                            <td class="text-end">
+                                                                <span t-field="o.amount_residual">11.05</span>
+                                                            </td>
+                                                        </tr>
+                                                    </t>
+                                                </t>
+                                            </t>
+                                        </table>
+                                    </div>
+                                </div>
+                                <div class="mb-2">
+                                    <p class="text-end lh-sm" t-if="o.company_id.display_invoice_amount_total_words">
+                                        Total amount in words: <br/>
+                                        <small class="text-muted lh-sm"><span t-field="o.amount_total_words">Thirty one dollar and Five cents</span></small>
+                                    </p>
+                                </div>
+
+                                <!-- Tax totals summary (company currency) -->
+                                <t t-if="o.tax_totals.get('display_in_company_currency')">
+                                    <t t-set="tax_totals" t-value="o.tax_totals"/>
+                                    <t t-call="account.document_tax_totals_company_currency_template"/>
+                                </t>
+                                <t t-else="">
+                                    <div class="oe_structure"/>
+                                </t>
+                            </div>
+                            <div id="payment_term" class="clearfix">
+                                <div class="justify-text">
+                                    <p t-if="not is_html_empty(o.fiscal_position_id.note)" name="note" class="mb-2">
+                                        <span t-field="o.fiscal_position_id.note"/>
+                                    </p>
+                                </div>
+                                <div class="justify-text">
+                                    <p t-if="not is_html_empty(o.taxes_legal_notes)" name="taxes_legal_notes" class="mb-2">
+                                        <span t-field="o.taxes_legal_notes"/>
+                                    </p>
+                                </div>
+                                <t t-set="payment_term_details" t-value="o.payment_term_details"/>
+                                <div class="mb-3">
+                                    <span id="payment_terms_note_id" t-if="o.invoice_payment_term_id.note" t-field="o.invoice_payment_term_id.note" name="payment_term">Payment within 30 calendar day</span><br/>
+                                    <t t-if="o.invoice_payment_term_id.display_on_invoice and payment_term_details">
+                                        <div t-if="o.show_payment_term_details" id="total_payment_term_details_table" class="row">
+                                            <div t-attf-class="#{'col-10' if report_type != 'html' else 'col-sm-10 col-md-9'}">
+                                                <t t-if="o._is_eligible_for_early_payment_discount(o.currency_id,o.invoice_date)">
+                                                    <td>
+                                                        <span t-options="{&quot;widget&quot;: &quot;monetary&quot;, &quot;display_currency&quot;: o.currency_id}" t-out="o.invoice_payment_term_id._get_amount_due_after_discount(o.amount_total, o.amount_tax)">30.00</span> due if paid before
+                                                        <span t-out="o.invoice_payment_term_id._get_last_discount_date_formatted(o.invoice_date)">2024-01-01</span>
+                                                    </td>
+                                                </t>
+                                                <t t-if="len(payment_term_details) &gt; 1" t-foreach="payment_term_details" t-as="term">
+                                                    <div>
+                                                        <span t-out="term_index + 1">1</span> - Installment of
+                                                        <t t-options="{&quot;widget&quot;: &quot;monetary&quot;, &quot;display_currency&quot;: o.currency_id}" t-out="term.get('amount')" class="text-end">31.05</t>
+                                                        <span> due on </span>
+                                                        <t t-out="term.get('date')" class="text-start">2024-01-01</t>
+                                                    </div>
+                                                </t>
+                                            </div>
+                                        </div>
+                                    </t>
+                                </div>
+                                <div class="mb-3" t-if="o.move_type in ('out_invoice', 'in_refund') and o.payment_reference">
+                                    <p name="payment_communication">
+                                        Payment Communication: <span class="fw-bold" t-field="o.payment_reference">INV/2023/00001</span>
+                                        <t t-if="o.partner_bank_id">
+                                            <br/> on this account: <span t-field="o.partner_bank_id" class="fw-bold"/>
+                                        </t>
+                                    </p>
+                                </div>
+                                <t t-set="show_qr" t-value="o.display_qr_code and o.amount_residual &gt; 0"/>
+                                <div t-if="not show_qr" name="qr_code_placeholder" class="oe_structure"/>
+                                <div id="qrcode" class="d-flex mb-3 avoid-page-break-inside" t-else="">
+                                    <div class="qrcode me-3" id="qrcode_image">
+                                        <t t-set="qr_code_url" t-value="o._generate_qr_code(silent_errors=True)"/>
+                                        <p t-if="qr_code_url" class="position-relative mb-0">
+                                            <img t-att-src="qr_code_url"/>
+                                        </p>
+                                    </div>
+                                    <div class="d-inline text-muted lh-sm fst-italic" id="qrcode_info" t-if="qr_code_url">
+                                        <p>Scan this QR Code with<br/>your banking application</p>
+                                    </div>
+                                </div>
+                                <!--terms and conditions-->
+                                <div class="text-muted mb-3" t-attf-style="#{'text-align:justify;text-justify:inter-word;' if o.company_id.terms_type != 'html' else ''}" t-if="not is_html_empty(o.narration)" name="comment">
+                                    <span t-field="o.narration"/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </t>
+        </t>
+    </field>
+    <field name="key">carpenter.simplified_invoice_document</field>
+    <field name="name">carpenter.simplified_invoice_document</field>
+    <field name="type">qweb</field>
+  </record>
+
+
+
+  <record id="simplified_invoice_report_document" model="ir.ui.view">
+    <field name="arch" type="xml">
+      <t t-name="studio_main_report">
+        <t t-call="web.html_container">
+          <t t-foreach="docs" t-as="doc">
+            <t t-call="carpenter.simplified_invoice_document"/>
+          </t>
+        </t>
+      </t>
+    </field>
+    <field name="key">carpenter.simplified_invoice</field>
+    <field name="name">carpenter.simplified_invoice</field>
+    <field name="type">qweb</field>
+  </record>
+</odoo>
diff --git a/carpenter/data/res_config_settings.xml b/carpenter/data/res_config_settings.xml
new file mode 100644
index 000000000..ab73847b3
--- /dev/null
+++ b/carpenter/data/res_config_settings.xml
@@ -0,0 +1,11 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record model="res.config.settings" id="res_config_settings_enable">
+        <field name="group_sale_order_template" eval="1"/>
+        <field name="group_project_task_dependencies" eval="1"/>
+    </record>
+
+    <function model="res.config.settings" name="execute">
+        <value eval="[ref('res_config_settings_enable')]"/>
+    </function>
+</odoo>
diff --git a/carpenter/data/sale_order_spreadsheet.xml b/carpenter/data/sale_order_spreadsheet.xml
new file mode 100644
index 000000000..fcd7bba01
--- /dev/null
+++ b/carpenter/data/sale_order_spreadsheet.xml
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="sale_order_spreadsheet_1" model="sale.order.spreadsheet">
+        <field name="name">Wood Frame - Estimator</field>
+        <field name="spreadsheet_binary_data" type="base64" file="carpenter/static/src/json/Wood_Frame_Estimator.json"/>
+    </record>
+</odoo>
diff --git a/carpenter/data/sale_order_template.xml b/carpenter/data/sale_order_template.xml
new file mode 100644
index 000000000..552518390
--- /dev/null
+++ b/carpenter/data/sale_order_template.xml
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+  <record id="sale_order_template_1" model="sale.order.template">
+    <field name="name">Wood Frame</field>
+    <field name="require_signature" eval="True"/>
+    <field name="prepayment_percent">1.0</field>
+    <field name="spreadsheet_template_id" ref="sale_order_spreadsheet_1"/>
+  </record>
+</odoo>
diff --git a/carpenter/data/sale_order_template_line.xml b/carpenter/data/sale_order_template_line.xml
new file mode 100644
index 000000000..1bc8c89b2
--- /dev/null
+++ b/carpenter/data/sale_order_template_line.xml
@@ -0,0 +1,46 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+  <record id="sale_order_template_line_1" model="sale.order.template.line">
+    <field name="sale_order_template_id" ref="sale_order_template_1"/>
+    <field name="company_id" ref="base.main_company"/>
+    <field name="name"><![CDATA[Labor]]></field>
+    <field name="product_uom_qty" eval="False"/>
+    <field name="display_type">line_section</field>
+  </record>
+  <record id="sale_order_template_line_6" model="sale.order.template.line">
+    <field name="sale_order_template_id" ref="sale_order_template_1"/>
+    <field name="sequence">11</field>
+    <field name="company_id" ref="base.main_company"/>
+    <field name="product_id" ref="product_product_3"/>
+    <field name="product_uom_id" ref="uom.product_uom_hour"/>
+  </record>
+  <record id="sale_order_template_line_2" model="sale.order.template.line">
+    <field name="sale_order_template_id" ref="sale_order_template_1"/>
+    <field name="sequence">12</field>
+    <field name="company_id" ref="base.main_company"/>
+    <field name="name"><![CDATA[Materials]]></field>
+    <field name="product_uom_qty" eval="False"/>
+    <field name="display_type">line_section</field>
+  </record>
+  <record id="sale_order_template_line_3" model="sale.order.template.line">
+    <field name="sale_order_template_id" ref="sale_order_template_1"/>
+    <field name="sequence">13</field>
+    <field name="company_id" ref="base.main_company"/>
+    <field name="product_id" ref="product_product_measuring_tape_std"/>
+    <field name="product_uom_id" ref="uom.product_uom_unit"/>
+  </record>
+  <record id="sale_order_template_line_4" model="sale.order.template.line">
+    <field name="sale_order_template_id" ref="sale_order_template_1"/>
+    <field name="sequence">14</field>
+    <field name="company_id" ref="base.main_company"/>
+    <field name="product_id" ref="product_product_wood_glue_std"/>
+    <field name="product_uom_id" ref="uom.product_uom_unit"/>
+  </record>
+  <record id="sale_order_template_line_5" model="sale.order.template.line">
+    <field name="sale_order_template_id" ref="sale_order_template_1"/>
+    <field name="sequence">15</field>
+    <field name="company_id" ref="base.main_company"/>
+    <field name="product_id" ref="product_product_wood_beam_std"/>
+    <field name="product_uom_id" ref="uom.product_uom_unit"/>
+  </record>
+</odoo>
diff --git a/carpenter/demo/product_supplierinfo.xml b/carpenter/demo/product_supplierinfo.xml
new file mode 100644
index 000000000..319a7aaec
--- /dev/null
+++ b/carpenter/demo/product_supplierinfo.xml
@@ -0,0 +1,57 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="product_supplierinfo_wood_beam" model="product.supplierinfo">
+        <field name="partner_id" ref="res_partner_14"/>
+        <field name="min_qty">1.0</field>
+        <field name="price">35.00</field>
+        <field name="product_tmpl_id" ref="product_template_wood_beam"/>
+    </record>
+    <record id="product_supplierinfo_wood_plank" model="product.supplierinfo">
+        <field name="partner_id" ref="res_partner_14"/>
+        <field name="min_qty">1.0</field>
+        <field name="price">20.00</field>
+        <field name="product_tmpl_id" ref="product_template_wood_plank"/>
+    </record>
+    <record id="product_supplierinfo_nail_pack" model="product.supplierinfo">
+        <field name="partner_id" ref="res_partner_13"/>
+        <field name="min_qty">1.0</field>
+        <field name="price">5.00</field>
+        <field name="product_tmpl_id" ref="product_template_nail_pack"/>
+    </record>
+    <record id="product_supplierinfo_hammer" model="product.supplierinfo">
+        <field name="partner_id" ref="res_partner_14"/>
+        <field name="min_qty">1.0</field>
+        <field name="price">15.00</field>
+        <field name="product_tmpl_id" ref="product_template_hammer"/>
+    </record>
+    <record id="product_supplierinfo_saw" model="product.supplierinfo">
+        <field name="partner_id" ref="res_partner_14"/>
+        <field name="min_qty">1.0</field>
+        <field name="price">28.00</field>
+        <field name="product_tmpl_id" ref="product_template_saw"/>
+    </record>
+    <record id="product_supplierinfo_wood_glue" model="product.supplierinfo">
+        <field name="partner_id" ref="res_partner_13"/>
+        <field name="min_qty">1.0</field>
+        <field name="price">7.50</field>
+        <field name="product_tmpl_id" ref="product_template_wood_glue"/>
+    </record>
+    <record id="product_supplierinfo_measuring_tape" model="product.supplierinfo">
+        <field name="partner_id" ref="res_partner_14"/>
+        <field name="min_qty">1.0</field>
+        <field name="price">6.00</field>
+        <field name="product_tmpl_id" ref="product_template_measuring_tape"/>
+    </record>
+    <record id="product_supplierinfo_sandpaper" model="product.supplierinfo">
+        <field name="partner_id" ref="res_partner_13"/>
+        <field name="min_qty">1.0</field>
+        <field name="price">2.50</field>
+        <field name="product_tmpl_id" ref="product_template_sandpaper"/>
+    </record>
+    <record id="product_supplierinfo_wrench" model="product.supplierinfo">
+        <field name="partner_id" ref="res_partner_14"/>
+        <field name="min_qty">1.0</field>
+        <field name="price">10.00</field>
+        <field name="product_tmpl_id" ref="product_template_wrench"/>
+    </record>
+</odoo>
diff --git a/carpenter/demo/purchase_order.xml b/carpenter/demo/purchase_order.xml
new file mode 100644
index 000000000..78f22a64f
--- /dev/null
+++ b/carpenter/demo/purchase_order.xml
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="purchase_order_201" model="purchase.order">
+        <field name="partner_id" ref="res_partner_14"/>
+        <field name="user_id" ref="base.user_admin"/>
+    </record>    
+    <function model="stock.picking" name="button_validate" eval="[(
+        obj().env.ref('carpenter.purchase_order_201') 
+    ).picking_ids.ids]"/>
+</odoo>
diff --git a/carpenter/demo/purchase_order_confirm.xml b/carpenter/demo/purchase_order_confirm.xml
new file mode 100644
index 000000000..ec5858518
--- /dev/null
+++ b/carpenter/demo/purchase_order_confirm.xml
@@ -0,0 +1,4 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <function name="button_confirm" model="purchase.order" eval="[[ref('purchase_order_201')]]"/>
+</odoo>
diff --git a/carpenter/demo/purchase_order_line.xml b/carpenter/demo/purchase_order_line.xml
new file mode 100644
index 000000000..b9ab21e46
--- /dev/null
+++ b/carpenter/demo/purchase_order_line.xml
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="purchase_order_line_201" model="purchase.order.line">
+        <field name="order_id" ref="purchase_order_201"/>
+        <field name="product_id" ref="product_product_wood_plank_std"/>
+        <field name="product_qty">50.0</field>
+        <field name="price_unit">20.00</field>
+    </record>
+    <record id="purchase_order_line_202" model="purchase.order.line">
+        <field name="order_id" ref="purchase_order_201"/>
+        <field name="product_id" ref="product_product_wood_beam_std"/>
+        <field name="product_qty">40.0</field>
+        <field name="price_unit">35.00</field>
+    </record>
+    <record id="purchase_order_line_203" model="purchase.order.line">
+        <field name="order_id" ref="purchase_order_201"/>
+        <field name="product_id" ref="product_product_nail_pack_std"/>
+        <field name="product_qty">100.0</field>
+        <field name="price_unit">5.00</field>
+    </record>
+    <record id="purchase_order_line_204" model="purchase.order.line">
+        <field name="order_id" ref="purchase_order_201"/>
+        <field name="product_id" ref="product_product_hammer_std"/>
+        <field name="product_qty">30.0</field>
+        <field name="price_unit">15.00</field>
+    </record>
+    <record id="purchase_order_line_205" model="purchase.order.line">
+        <field name="order_id" ref="purchase_order_201"/>
+        <field name="product_id" ref="product_product_wood_glue_std"/>
+        <field name="product_qty">25.0</field>
+        <field name="price_unit">7.50</field>
+    </record>
+</odoo>
diff --git a/carpenter/demo/res_partner.xml b/carpenter/demo/res_partner.xml
new file mode 100644
index 000000000..7ee8874f5
--- /dev/null
+++ b/carpenter/demo/res_partner.xml
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="res_partner_13" model="res.partner">
+        <field name="name">Construction Vendor</field>
+    </record>
+    <record id="res_partner_14" model="res.partner">
+        <field name="name">DIY shop</field>
+    </record>
+    <record id="res_partner_22" model="res.partner">
+        <field name="name">Olivia Patel</field>
+        <field name="user_id" ref="base.user_admin"/>
+        <field name="is_company" eval="True"/>
+        <field name="customer_rank">1</field>
+    </record>
+    <record id="res_partner_23" model="res.partner">
+        <field name="name">Michael Andersen</field>
+        <field name="user_id" ref="base.user_admin"/>
+        <field name="is_company" eval="True"/>
+        <field name="customer_rank">1</field>
+    </record>
+    <record id="res_partner_24" model="res.partner">
+        <field name="name">Sarah Klein</field>
+        <field name="user_id" ref="base.user_admin"/>
+        <field name="is_company" eval="True"/>
+        <field name="customer_rank">1</field>
+    </record>
+    <record id="res_partner_25" model="res.partner">
+        <field name="name">David Nguyen</field>
+        <field name="user_id" ref="base.user_admin"/>
+        <field name="is_company" eval="True"/>
+        <field name="customer_rank">1</field>
+    </record>
+    <record id="res_partner_29" model="res.partner">
+        <field name="name">Jessica Yamamoto</field>
+        <field name="user_id" ref="base.user_admin"/>
+        <field name="is_company" eval="True"/>
+        <field name="customer_rank">1</field>
+    </record>
+    <record id="res_partner_30" model="res.partner">
+        <field name="name">Éléonore Chidée</field>
+        <field name="email">eleonore.chidee@carpenter.odoo</field>
+        <field name="image_1920" type="base64" file="carpenter/static/src/binary/hr_employee/eleonore.jpg"/>
+    </record>
+    <record id="res_partner_31" model="res.partner">
+        <field name="name">Tom Mates</field>
+        <field name="image_1920" type="base64" file="carpenter/static/src/binary/hr_employee/tomate.jpg"/>
+        <field name="email">tom.mates@carpenter.odoo</field>
+    </record>
+</odoo>
diff --git a/carpenter/demo/res_user.xml b/carpenter/demo/res_user.xml
new file mode 100644
index 000000000..7cb635eb4
--- /dev/null
+++ b/carpenter/demo/res_user.xml
@@ -0,0 +1,20 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="tomate" model="res.users">
+        <field name="login">tom.mates</field>
+        <field name="phone">+1 650-691-3277</field>
+        <field name="partner_id" ref="res_partner_31"/>
+        <field name="partner_share" eval="True" />
+        <field name="company_id" ref="base.main_company"/>
+        <field name="image_1920" type="base64" file="carpenter/static/src/binary/hr_employee/tomate.jpg"/>
+    </record>
+    <record id="eleonore" model="res.users">
+        <field name="login">eleonore.chidee</field>
+        <field name="phone">+1 650-691-3277</field>
+        <field name="partner_id" ref="res_partner_30"/>
+        <field name="partner_share" eval="True" />
+        <field name="password">123456</field> 
+        <field name="company_id" ref="base.main_company"/>
+        <field name="image_1920" type="base64" file="carpenter/static/src/binary/hr_employee/eleonore.jpg"/>
+    </record>
+</odoo>
diff --git a/carpenter/demo/sale_order.xml b/carpenter/demo/sale_order.xml
new file mode 100644
index 000000000..6fedc9b9a
--- /dev/null
+++ b/carpenter/demo/sale_order.xml
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="sale_order_101" model="sale.order">
+        <field name="partner_id" ref="res_partner_22"/>
+        <field name="user_id" ref="base.user_admin"/>
+    </record>
+    <record id="sale_order_102" model="sale.order">
+        <field name="partner_id" ref="res_partner_23"/>
+        <field name="user_id" ref="base.user_admin"/>
+    </record>
+    <record id="sale_order_103" model="sale.order">
+        <field name="partner_id" ref="res_partner_24"/>
+        <field name="user_id" ref="base.user_admin"/>
+    </record>    
+</odoo>
diff --git a/carpenter/demo/sale_order_confirm.xml b/carpenter/demo/sale_order_confirm.xml
new file mode 100644
index 000000000..02336aa6c
--- /dev/null
+++ b/carpenter/demo/sale_order_confirm.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <function name="action_confirm" model="sale.order" eval="[[
+        ref('sale_order_101'),
+        ref('sale_order_102'),
+        ref('sale_order_103')
+    ]]"/>
+</odoo>
diff --git a/carpenter/demo/sale_order_line.xml b/carpenter/demo/sale_order_line.xml
new file mode 100644
index 000000000..0ae4a1f2b
--- /dev/null
+++ b/carpenter/demo/sale_order_line.xml
@@ -0,0 +1,21 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<odoo noupdate="1">
+    <record id="sale_order_line_101" model="sale.order.line">
+        <field name="product_id" ref="product_product_5"/>
+        <field name="order_id" ref="sale_order_101"/>
+        <field name="product_uom_qty">5.0</field>
+        <field name="price_unit">30.00</field>
+    </record>
+    <record id="sale_order_line_102" model="sale.order.line">
+        <field name="product_id" ref="product_product_3"/>
+        <field name="order_id" ref="sale_order_102"/>
+        <field name="product_uom_qty">10.0</field>
+        <field name="price_unit">10.00</field>
+    </record>
+    <record id="sale_order_line_103" model="sale.order.line">
+        <field name="product_id" ref="product_product_4"/>
+        <field name="order_id" ref="sale_order_103"/>
+        <field name="product_uom_qty">7.0</field>
+        <field name="price_unit">15.00</field>
+    </record>    
+</odoo>
diff --git a/carpenter/images/main.png b/carpenter/images/main.png
new file mode 100644
index 000000000..ae1f7f1ce
Binary files /dev/null and b/carpenter/images/main.png differ
diff --git a/carpenter/static/description/icon.png b/carpenter/static/description/icon.png
new file mode 100644
index 000000000..3b0401b0b
Binary files /dev/null and b/carpenter/static/description/icon.png differ
diff --git a/carpenter/static/src/binary/hr_employee/eleonore.jpg b/carpenter/static/src/binary/hr_employee/eleonore.jpg
new file mode 100644
index 000000000..98dba1b6d
Binary files /dev/null and b/carpenter/static/src/binary/hr_employee/eleonore.jpg differ
diff --git a/carpenter/static/src/binary/hr_employee/tomate.jpg b/carpenter/static/src/binary/hr_employee/tomate.jpg
new file mode 100644
index 000000000..71d198559
Binary files /dev/null and b/carpenter/static/src/binary/hr_employee/tomate.jpg differ
diff --git a/carpenter/static/src/binary/ir_attachment/240-cover.jpg b/carpenter/static/src/binary/ir_attachment/240-cover.jpg
new file mode 100644
index 000000000..82d54df6f
Binary files /dev/null and b/carpenter/static/src/binary/ir_attachment/240-cover.jpg differ
diff --git a/carpenter/static/src/js/my_tour.js b/carpenter/static/src/js/my_tour.js
new file mode 100644
index 000000000..0aae0bae0
--- /dev/null
+++ b/carpenter/static/src/js/my_tour.js
@@ -0,0 +1,17 @@
+/** @odoo-module **/
+
+import { _t } from "@web/core/l10n/translation";
+import { registry } from "@web/core/registry";
+
+registry.category("web_tour.tours").add("knowledge_tour", {
+    url: "/odoo",
+    
+    steps: () => [
+        {
+            trigger: '.o_app[data-menu-xmlid="knowledge.knowledge_menu_root"]',
+            content: _t("Get on track and explore our recommendations for your Odoo usage here!"),
+            position: "bottom",
+            run: "click",
+        },
+    ],
+});
diff --git a/carpenter/static/src/json/Wood_Frame_Estimator.json b/carpenter/static/src/json/Wood_Frame_Estimator.json
new file mode 100644
index 000000000..78cbed946
--- /dev/null
+++ b/carpenter/static/src/json/Wood_Frame_Estimator.json
@@ -0,0 +1 @@
+{"version":22,"sheets":[{"id":"sheet1","name":"Sheet1","colNumber":17,"rowNumber":101,"rows":{},"cols":{},"merges":[],"cells":{"A1":{"content":"MATERIALS"},"A3":{"content":"=ODOO.LIST(1,1,\"display_name\")"},"A4":{"content":"=ODOO.LIST(1,2,\"display_name\")"},"A5":{"content":"=ODOO.LIST(1,3,\"display_name\")"},"A6":{"content":"=ODOO.LIST(1,4,\"display_name\")"},"A9":{"content":"Roof size"},"B9":{"content":"5"},"C9":{"content":"m2"},"E1":{"content":"Cost"},"E3":{"content":"=ODOO.LIST(1,1,\"x_studio_unit_cost\")"},"E4":{"content":"=ODOO.LIST(1,2,\"x_studio_unit_cost\")"},"E5":{"content":"=ODOO.LIST(1,3,\"x_studio_unit_cost\")"},"E6":{"content":"=ODOO.LIST(1,4,\"x_studio_unit_cost\")"},"F1":{"content":"Margin (%)"},"F4":{"content":"20"},"F5":{"content":"20"},"F6":{"content":"20"},"H1":{"content":"Price HVAT"},"H3":{"content":"=ODOO.LIST(1,1,\"price_unit\")"},"H4":{"content":"=E4*(1+F4/100)"},"H5":{"content":"=E5*(1+F5/100)"},"H6":{"content":"=E6*(1+F6/100)"},"I1":{"content":"Quantity"},"I3":{"content":"=10*B9"},"I4":{"content":"=5*B9"},"I5":{"content":"=2*B9"},"I6":{"content":"=4*B9"},"I8":{"content":"Total HVAT"},"J8":{"content":"=SUM(K3:K6)"},"K1":{"content":"Total HVAT"},"K3":{"content":"=H3*I3"},"K4":{"content":"=H4*I4"},"K5":{"content":"=H5*I5"},"K6":{"content":"=H6*I6"}},"styles":{},"formats":{},"borders":{},"conditionalFormats":[],"figures":[],"tables":[],"areGridLinesVisible":true,"isVisible":true,"headerGroups":{"ROW":[],"COL":[]},"dataValidationRules":[],"comments":{},"fieldSyncs":{"H3":{"listId":"1","indexInList":0,"fieldName":"price_unit"},"H4":{"listId":"1","indexInList":1,"fieldName":"price_unit"},"H5":{"listId":"1","indexInList":2,"fieldName":"price_unit"},"H6":{"listId":"1","indexInList":3,"fieldName":"price_unit"},"I3":{"listId":"1","indexInList":0,"fieldName":"product_uom_qty"},"I4":{"listId":"1","indexInList":1,"fieldName":"product_uom_qty"},"I5":{"listId":"1","indexInList":2,"fieldName":"product_uom_qty"},"I6":{"listId":"1","indexInList":3,"fieldName":"product_uom_qty"}}}],"styles":{},"formats":{},"borders":{},"revisionId":"302905fe-af81-41df-a66a-83e5df39588f","uniqueFigureIds":true,"settings":{"locale":{"name":"English (US)","code":"en_US","thousandsSeparator":",","decimalSeparator":".","dateFormat":"mm/dd/yyyy","timeFormat":"hh:mm:ss","formulaArgSeparator":",","weekStart":7}},"pivots":{},"pivotNextId":1,"customTableStyles":{},"odooVersion":12,"globalFilters":[{"id":"order_filter_id","type":"relation","label":"Quote","modelName":"sale.order"}],"lists":{"1":{"columns":["product_id","product_uom_qty","qty_delivered","qty_invoiced","qty_to_invoice","product_uom","price_unit","price_tax","price_subtotal"],"domain":[["display_type","=",false]],"model":"sale.order.line","context":{},"orderBy":[],"id":"1","name":"Sale order lines","fieldMatching":{"order_filter_id":{"chain":"order_id","type":"many2one"}}}},"listNextId":2,"chartOdooMenusReferences":{}}
\ No newline at end of file