hunk.code_window:                 <field name="user_id"/>
                   <field name="partner_id"/>
                   <field name="session_id"/>
                   <field name="lines" string="Product" filter_domain="[('lines.product_id', 'ilike', self)]"/>
                   <filter string="Invoiced" name="invoiced" domain="[('state', '=', 'invoiced')]"/>
                   <filter string="Posted" name="posted" domain="[('state', '=', 'done')]"/>
  
hunk.labels: keep keep add keep keep keep
hunk.after_edit:                 <field name="config_id"/>
  
hunk.file_path: addons/point_of_sale/views/pos_order_view.xml
hunk.type: add
file: # -*- coding: utf-8 -*-
  # Part of Odoo. See LICENSE file for full copyright and licensing details.
  
  from odoo import fields, models, api
  
  from odoo.addons.sale_timesheet.models.account import TIMESHEET_INVOICE_TYPES
  
  
  class TimesheetsAnalysisReport(models.Model):
      _inherit = "timesheets.analysis.report"
  
      order_id = fields.Many2one("sale.order", string="Sales Order", readonly=True)
      so_line = fields.Many2one("sale.order.line", string="Sales Order Item", readonly=True)
      timesheet_invoice_type = fields.Selection(TIMESHEET_INVOICE_TYPES, string="Billable Type", readonly=True)
      timesheet_invoice_id = fields.Many2one("account.move", string="Invoice", readonly=True, help="Invoice created from the timesheet")
      timesheet_revenues = fields.Float("Timesheet Revenues", readonly=True, help="Number of hours spent multiplied by the unit price per hour/day.")
      margin = fields.Float("Margin", readonly=True, help="Timesheets revenues minus the costs")
      billable_time = fields.Float("Billable Hours", readonly=True, help="Number of hours/days linked to a SOL.")
      non_billable_time = fields.Float("Non-billable Hours", readonly=True, help="Number of hours/days not linked to a SOL.")
  
      @property
      def _table_query(self):
          return """
              SELECT A.*,
                  (timesheet_revenues + A.amount) AS margin,
                  (A.unit_amount - billable_time) AS non_billable_time
              FROM (
                  %s %s %s
              ) A
          """ % (self._select(), self._from(), self._where())
  
      @api.model
      def _select(self):
          return super()._select() + """,
              A.order_id AS order_id,
              A.so_line AS so_line,
              A.timesheet_invoice_type AS timesheet_invoice_type,
              A.timesheet_invoice_id AS timesheet_invoice_id,
              CASE
                  WHEN A.order_id IS NULL OR T.service_type in ('manual', 'milestones')
                  THEN 0
                  WHEN T.invoice_policy = 'order' AND SOL.qty_delivered != 0
                  THEN (SOL.price_total / SOL.qty_delivered) * A.unit_amount
                  ELSE A.unit_amount * SOL.price_unit * sol_product_uom.factor / a_product_uom.factor
              END AS timesheet_revenues,
              CASE WHEN A.order_id IS NULL THEN 0 ELSE A.unit_amount END AS billable_time
          """
  
      @api.model
      def _from(self):
          return super()._from() + """
              LEFT JOIN sale_order_line SOL ON A.so_line = SOL.id
              LEFT JOIN uom_uom sol_product_uom ON sol_product_uom.id = SOL.product_uom
              INNER JOIN uom_uom a_product_uom ON a_product_uom.id = A.product_uom_id
              LEFT JOIN product_product P ON P.id = SOL.product_id
              LEFT JOIN product_template T ON T.id = P.product_tmpl_id
          """
  