chore: import enterprise addons 19.0 bulk snapshot

This commit is contained in:
1b-agent committed 2026-09-16 10:13:08 +00:00
commit ca4af030d3
39951 files changed
+15570005

No files matched your search

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="appointment.appointment_answer_input_action" model="ir.actions.act_window">
<field name="domain">[('calendar_event_id', '!=', False)]</field>
</record>
</odoo>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="appointment_info" inherit_id="appointment.appointment_meeting_details">
<xpath expr="//div[hasclass('o_appointment_details_location')]" position="before">
<div t-if="appointment_type.product_id" class="d-flex py-1 px-0 bg-transparent o-cc1-text border-0">
<t t-set="isDetailsManageCapacity" t-value="appointment_type.manage_capacity and isDetails"/>
<i class="fa fa-credit-card fa-fw me-2 mt-1 text-muted"/>
<span class="o_appointment_details_price">
<t t-out="appointment_type.product_lst_price * asked_capacity if isDetailsManageCapacity else appointment_type.product_lst_price"
t-options="{'widget': 'monetary', 'display_currency': appointment_type.product_currency_id}"/>
</span>
<span t-if="appointment_type.manage_capacity and not isDetails" class="ms-1">per seat</span>
</div>
</xpath>
</template>
</odoo>
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="appointment_progress_bar" inherit_id="appointment.appointment_progress_bar">
<xpath expr="//li[contains(@t-att-class, 'step==STEP_FORM')]" position="after">
<t t-set="STEP_PAYMENT" t-value="35"/>
<li t-if="appointment_type.has_payment_step and appointment_type.product_id"
t-att-class="'d-flex align-items-center ' + (step==STEP_PAYMENT and 'fw-bold' or step&gt;STEP_PAYMENT and '' or 'text-muted')">
<span>Payment</span>
<span class="d-inline-block mx-sm-3 fa fa-angle-right text-muted fs-5"/>
</li>
</xpath>
</template>
<template id="appointment_payment" name="Appointment Payment Providers">
<t t-set="no_breadcrumbs" t-value="True"/>
<t t-call="portal.portal_layout">
<div id="wrap" class="bg-o-color-4 h-100 pb-4 px-4">
<t t-set="o_portal_fullwidth_alert" groups="appointment.group_appointment_manager">
<t t-call="portal.portal_back_in_edit_mode">
<t t-set="backend_url" t-value="'/odoo/action-appointment.appointment_type_action/%s' % appointment_type.id"/>
<t t-set="custom_html">This is a preview of the customer appointment payment form.</t>
</t>
</t>
<div class="container mt-4">
<nav class="d-print-none d-flex justify-content-between">
<t t-call="appointment.appointment_progress_bar">
<t t-set="step" t-value="35"/>
</t>
</nav>
</div>
<div class="oe_structure container o_appointment o_appointment_payment">
<t t-set="based_on_users" t-value="appointment_type.schedule_based_on == 'users'"/>
<t t-set="staff_user" t-value="booking.staff_user_id"/>
<t t-set="resources" t-value="booking.booking_line_ids.appointment_resource_id"/>
<div class="d-flex align-items-baseline justify-content-between mt-4">
<h4 class="me-2">
Payment for "<span t-out="appointment_type.name"/>"
</h4>
<a t-att-href="cancel_booking_route"><i class="fa fa-pencil fa-fw me-1"/>Edit my appointment</a>
</div>
<div t-if="not amount" class="text-center alert alert-info mt-4">
There is nothing to pay.
</div>
<div t-elif="invoice_state == 'paid'" class="text-center alert alert-success mt-4">
This invoice is already paid for.
</div>
<div t-elif="not currency" class="text-center alert alert-warning mt-4">
<strong>Warning</strong> The currency is missing or incorrect.
</div>
<div t-elif="not partner_id" class="text-center alert alert-warning mt-4">
<strong>Warning</strong> You must be logged in to pay.
</div>
<div t-elif="company_mismatch">
<t t-call="payment.company_mismatch_warning"/>
</div>
<div t-else="" class="row gx-0">
<div t-if="partner_is_different" class="col-12 alert alert-warning text-center mb-2 py-2">
<strong>Warning</strong> Make sure you are logged in as the right partner before making this payment.
</div>
<div class="o_cc o_cc2 row row-cols-1 row-cols-md-2 mx-0 py-2 rounded">
<t t-call="payment.summary_item">
<t t-set="name" t-value="'amount'"/>
<t t-set="label">Amount</t>
<t t-set="value" t-value="amount"/>
<t t-set="options"
t-value="{'widget': 'monetary', 'display_currency': currency}"
/>
</t>
<t t-call="payment.summary_item">
<t t-set="name" t-value="'service'"/>
<t t-set="label">Service</t>
<t t-set="value" t-value="booking.product_id.name"/>
<t t-set="include_separator" t-value="True"/>
</t>
</div>
<t t-call="payment.form"/>
</div>
<div class="oe_structure"/>
</div>
</div>
</t>
</template>
</odoo>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="appointment_form" inherit_id="appointment.appointment_form">
<xpath expr="//button[hasclass('o_appointment_form_confirm_btn')]" position="replace">
<button t-if="appointment_type.has_payment_step and appointment_type.product_id.lst_price" type="button" class="btn btn-primary o_appointment_form_confirm_btn">
Proceed to Payment
</button>
<button t-else="" type="button" class="btn btn-primary o_appointment_form_confirm_btn">Confirm Appointment</button>
</xpath>
</template>
</odoo>
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="appointment_validated" inherit_id="appointment.appointment_validated">
<xpath expr="//h2[@t-if='is_cancelled']" position="after">
<t t-elif="state == 'no_cancel_paid'">
<div role="alert" class="alert alert-danger">
Oops! Paid appointment cannot be cancelled via our website.<br/>
<t t-if="cancel_responsible">
To make any changes, please contact
<t t-out="cancel_responsible.name"/> at <t t-out="cancel_responsible.email"/>
<t t-if="cancel_responsible.partner_id.phone"> or <t t-out="cancel_responsible.partner_id.phone"/> </t>.
</t>
<t t-else="">
To make any changes, please contact us.
</t>
</div>
<h2 role="alert">
<i class="fa fa-check-circle text-success me-3"/>Appointment Scheduled!
</h2>
</t>
</xpath>
</template>
</odoo>
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="appointment_type_view_form" model="ir.ui.view">
<field name="name">appointment.type.view.form.inherit.appointment.account.payment</field>
<field name="model">appointment.type</field>
<field name="inherit_id" ref="appointment.appointment_type_view_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='options_left_details']" position="inside">
<label for="has_payment_step"/>
<div>
<div class="o_row mw-75 mw-md-100">
<field name="has_payment_step"/>
<field name="product_id" invisible="not has_payment_step" required="has_payment_step"
context="{
'default_type': 'service',
'default_purchase_ok': False
}"
placeholder="Pick a Product"
class="oe_inline"/>
<div invisible="not has_payment_step">
<field name="product_currency_id" invisible='1'/> <!-- necessary to evaluate product_currency_field option of 'product_lst_price' field -->
<field name="product_lst_price" class="oe_inline" widget="monetary" options="{'currency_field': 'product_currency_id', 'field_digits': True}"/>
<span invisible="manage_capacity" class="ms-1">per booking</span>
<span invisible="not manage_capacity" class="ms-1">per seat</span>
</div>
</div>
<div invisible="not has_payment_step" groups="base.group_system">
<a type="action" name="%(payment.action_payment_provider)d" class="btn btn-link ps-0 pb-2" role="button">
<i class="oi oi-fw o_button_icon oi-arrow-right"/> Configure Payment Providers
</a>
</div>
</div>
</xpath>
</field>
</record>
</data>
</odoo>
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="calendar_booking_view" name="Website Appointment: Booking Not Confirmed">
<t t-set="no_breadcrumbs" t-value="True"/>
<t t-call="portal.portal_layout">
<t t-set="appointment_type" t-value="booking.appointment_type_id"/>
<t t-set="staff_user" t-value="booking.staff_user_id"/>
<t t-set="resources" t-value="booking.booking_line_ids.appointment_resource_id"/>
<t t-set="based_on_users" t-value="appointment_type.schedule_based_on == 'users'"/>
<t t-set="total_capacity_reserved" t-value="booking.asked_capacity"/>
<div id="wrap" class="o_appointment d-flex bg-o-color-4 p-4 mt-3">
<div class="oe_structure"/>
<div class="oe_structure container">
<div class="o_appointment_edit_in_backend alert alert-info alert-dismissible fade show d-print-none css_editable_mode_hidden" groups="appointment.group_appointment_manager">
<t t-call="appointment.appointment_edit_in_backend"/>
</div>
<h2 t-if="booking.not_available">
<i class="fa fa-times-circle text-danger me-3"/>Appointment Unavailable!
<h5>Unfortunately, it looks like this booking is not possible anymore. Please contact us to find an alternative.</h5>
</h2>
<h2 t-else="">
<i class="fa fa-pencil-square-o text-warning me-3"/>Appointment waiting for payment
</h2>
<h4 class="py-3 fw-normal">
<t t-if="based_on_users and staff_user and staff_user.name not in appointment_type.name">
<span t-out="staff_user.name"/> -
</t>
<span t-out="appointment_type.name"/>
</h4>
<div class="oe_structure"/>
<div class="o_appointment_validation_details row justify-content-between">
<div class="col-12 col-md-8 pe-md-4 pe-lg-5 o_not_editable">
<div class="row mb-4">
<div class="col-3">
<label class="text-muted">When</label>
</div>
<div class="col-9 col-lg-6">
<strong t-out="start_dt"/>
<span t-if="not appointment_type.hide_timezone" class="text-muted"> (<t t-out="timezone"/>)</span>
</div>
</div>
<div class="row mb-4">
<div class="col-3">
<label class="text-muted">Duration</label>
</div>
<div class="col-9 col-lg-6">
<t t-out="booking.duration" t-options="{'widget': 'duration', 'unit': 'hour', 'round': 'minute'}"/>
</div>
</div>
<div t-if="total_capacity_reserved > 1" class="row mb-4">
<div class="col-3">
<label class="text-muted">For</label>
</div>
<div class="col-9 col-lg-6">
<t t-out="total_capacity_reserved"/> people
</div>
</div>
<div t-if="(not appointment_type.is_auto_assign or appointment_type.show_avatars) and
(appointment_type.manage_capacity or
(len(resources) == 1 and not appointment_type.show_avatars and is_html_empty(resources[0].description))
)" class="row mb-4">
<div class="col-3">
<label class="text-muted">Resources</label>
</div>
<div class="col-9 col-lg-6">
<div t-foreach="resources" t-as="resource" class="d-flex flex-nowrap gap-2 align-items-center mb-1">
<div t-if="appointment_type.show_avatars"
class="o_appointment_avatar_container o_appointment_avatar_multi_resource ratio ratio-1x1">
<div t-attf-style="background-image: url('/appointment/#{appointment_type.id}/resource_avatar?resource_id=#{resource.id}');"
class="o_appointment_avatar_background rounded-circle"/>
</div>
<t t-out="resource.name"/>
</div>
</div>
</div>
<div t-if="based_on_users or appointment_type.location_id" class="row mb-4">
<div class="col-3">
<label class="text-muted">Where</label>
</div>
<div class="col-9 col-lg-6">
<span t-if="appointment_type.location_id">
<div t-att-class="str(appointment_type.location_id.contact_address).strip() and 'fw-bold' or ''"
t-field="appointment_type.location_id" t-options="{'widget': 'contact', 'fields': ['name']}"/>
<div t-field="appointment_type.location_id" t-options="{'widget': 'contact', 'fields': ['address'], 'no_marker': true}"/>
</span>
<t t-elif="based_on_users" ><span>Online</span></t>
</div>
</div>
<div t-if="based_on_users" class="row mb-4">
<div class="col-3">
<label class="text-muted">Attendees</label>
</div>
<div class="col-9">
<div class="list-group">
<div class="list-group-item" t-foreach="attendees" t-as="attendee">
<t t-out="attendee.display_name"/>
</div>
</div>
</div>
</div>
<div t-if="not is_html_empty(booking.description)" class="row mb-4">
<div class="col-3">
<label class="text-muted">Details</label>
</div>
<div class="col-9 col-lg-6">
<div t-field="booking.description"/>
</div>
</div>
<div t-if="appointment_type" t-out="appointment_type.message_confirmation" class="mt-4"/>
</div>
<div class="col-12 col-md-4 px-md-4">
<t t-if="not appointment_type.is_auto_assign or appointment_type.show_avatars"
t-call="appointment.appointment_validated_card"/>
</div>
</div>
</div>
<div class="oe_structure"/>
</div>
</t>
</template>
</odoo>
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="calendar_booking_view_form" model="ir.ui.view">
<field name="name">calendar.booking.view.form</field>
<field name="model">calendar.booking</field>
<field name="arch" type="xml">
<form string="Booking" create="False" edit="0">
<sheet>
<group>
<group>
<field name="partner_id"/>
<field name="start"/>
<field name="stop"/>
<field name="appointment_type_id"/>
<field name="staff_user_id"/>
<field name="product_id"/>
<field name="account_move_id"/>
</group>
<group>
<field name="appointment_invite_id"/>
<field name="name"/>
<field name="guest_ids" widget="many2many_tags"/>
<field name="asked_capacity"/>
<field name="not_available"/>
<field name="description"/>
</group>
</group>
<notebook>
<page string="Resources" name="resources">
<field name="booking_line_ids">
<list create="0" delete="0" edit="0">
<field name="appointment_resource_id"/>
<field name="capacity_reserved"/>
<field name="capacity_used"/>
</list>
</field>
</page>
<page string="Answers" name="answers">
<field name="appointment_answer_input_ids">
<list create="0" delete="0" edit="0">
<field name="question_id"/>
<field name="value_answer_id"/>
<field name="value_text_box"/>
</list>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
</odoo>