diff --git a/hotel/__manifest__.py b/hotel/__manifest__.py index b1d1b9cfc..634c2b78f 100644 --- a/hotel/__manifest__.py +++ b/hotel/__manifest__.py @@ -40,6 +40,7 @@ 'views/inherited_res_partner_views.xml', 'views/hotel_room_type_views.xml', 'views/hotel_room_views.xml', + 'views/hotel_shared_room_views.xml', 'views/hotel_room_type_class_views.xml', 'views/general.xml', 'views/inherited_product_template_views.xml', diff --git a/hotel/i18n/es.po b/hotel/i18n/es.po index 27f44e1d2..f5586adac 100644 --- a/hotel/i18n/es.po +++ b/hotel/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-04-28 21:22+0000\n" -"PO-Revision-Date: 2019-04-28 23:37+0200\n" +"POT-Creation-Date: 2019-05-13 08:15+0000\n" +"PO-Revision-Date: 2019-05-13 10:24+0200\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -17,6 +17,1057 @@ msgstr "" "Language: es\n" "X-Generator: Poedit 1.8.7.1\n" +#. module: hotel +#: model:mail.template,body_html:hotel.mail_template_hotel_cancel +msgid "" +"\n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" \"Alda\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" www.aldahotels.com\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
Tu reserva se ha cancelado en ${object.company_id.property_name}
\n" +" \n" +" \n" +" \n" +" \n" +"
 \n" +"\n" +"
\n" +"
Hola ${object.partner_id.firstname}
\n" +" Tu reserva en ${object.company_id.property_name} se ha anulado correctamente. No es necesario que hagas nada más.\n" +" Si la cancelación conlleva la devolución de alguna cantidad, nos pondremos en contacto contigo.\n" +" En caso de que tengas alguna duda, estaremos encantados de atenderte.\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +"
Contactar\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \"Cancelación\"\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
Datos de tu reserva cancelada
\n" +" ${object.partner_id.name}\n" +"
\n" +" % if object.partner_id.contact_address:\n" +" ${object.partner_id.contact_address}
\n" +" % endif\n" +"
\n" +" % for rline in object.get_grouped_reservations_json('cancelled'):\n" +" ${rline['num']} x ${rline['room_type']['name']}\n" +" % if rline['childrens'] > 0:\n" +" (${rline['adults']} Adults + ${rline['childrens']} Childrens)\n" +" % else:\n" +" (${rline['adults']} Adults)\n" +" %endif\n" +" \n" +"
\n" +" Entrada: ${format_tz(rline['checkin'], format=\"%d de %B de %Y\")}
\n" +" Salida: ${format_tz(rline['checkout'], format=\"%d de %B de %Y\")}
\n" +" Nº de noches: ${rline['nights']}

\n" +" % endfor\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \"Pago\"\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
IMPORTES
\n" +" Noches: ${len(object.room_lines[0].reservation_lines)}
\n" +" Base imponible: ${object.amount_untaxed} €
\n" +" I.V.A (10%): ${object.amount_tax} €
\n" +" Precio total: ${object.amount_total} €
\n" +" Coste de cancelación: [[importe]]
\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
NUESTRAS REDES SOCIALES 
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \"Facebook\"\n" +" \n" +"
Facebook
\n" +" \n" +" \n" +" \n" +" \n" +"
 \n" +"
\n" +"
Toda la actualidad de nuestros alojamientos, así como ofertas y promociones.
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +"
Dale a Me gusta
\n" +"
\n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \"Instagram\"\n" +" \n" +"
Instagram
\n" +" \n" +" \n" +" \n" +" \n" +"
 \n" +"
\n" +"
Cada detalle cuenta, y es por eso que tratamos de reflejarlo en nuestras fotos.
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +"
#Entra\n" +"
\n" +"
\n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \"Twitter\"\n" +" \n" +"
Twitter
\n" +" \n" +" \n" +" \n" +" \n" +"
 \n" +"
\n" +"
Propuestas al minuto para hacer de tu viaje una experiencia inmejorable.
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +"
Síguenos\n" +"
\n" +"
\n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
¡Esperamos verte pronto!
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" \"Alda\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
En cumplimiento de la Ley 34/2002 de Servicios de la Sociedad de la Información y del Comercio Electrónico, así como de la Ley Orgánica 15/1999 del 13 de Diciembre de Protección de Datos de Carácter Personal y demás legislación concordante, se le informa que sus datos personales figuran en un fichero automatizado cuya responsabilidad es de ALDA COMPOSTELA S.L. Praza da Algalia de Arriba, 3 C.P. 15704 Santiago de Compostela. Los datos personales que existen en nuestro poder están protegidos por nuestra Política de Privacidad y solo serán utilizados para los fines propios de nuestra actividad. Para ejercer sus derechos de acceso, rectificación, cancelación u oposición debe enviar un correo electrónico a info@aldahotels.com indicándonos la opción a realizar. Este correo podría ser confidencial. Si recibe este e-mail por error, por favor elimínelo, así como cualquier documento adjunto, y notifíquelo a su emisor. Si usted no es el destinatario del mensaje, sepa que no está permitida ninguna difusión, copia o utilización no autorizada.
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" Antes de imprimir este mensaje, compruebe que es verdaderamente necesario. El medioambiente es cosa de todos. \n" +"
\n" +"
\n" +" \n" +"
\n" +"
\n" +" \n" +" " +msgstr "" +"\n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" \"Alda\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" www.aldahotels.com\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
Tu reserva se ha cancelado en ${object.company_id.property_name}
\n" +" \n" +" \n" +" \n" +" \n" +"
 \n" +"\n" +"
\n" +"
Hola ${object.partner_id.firstname}
\n" +" Tu reserva en ${object.company_id.property_name} se ha anulado correctamente. No es necesario que hagas nada más.\n" +" Si la cancelación conlleva la devolución de alguna cantidad, nos pondremos en contacto contigo.\n" +" En caso de que tengas alguna duda, estaremos encantados de atenderte.\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +"
Contactar\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \"Cancelación\"\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
Datos de tu reserva cancelada
\n" +" ${object.partner_id.name}\n" +"
\n" +" % if object.partner_id.contact_address:\n" +" ${object.partner_id.contact_address}
\n" +" % endif\n" +"
\n" +" % for rline in object.get_grouped_reservations_json('cancelled'):\n" +" ${rline['num']} x ${rline['room_type']['name']}\n" +" % if rline['childrens'] > 0:\n" +" (${rline['adults']} Adults + ${rline['childrens']} Childrens)\n" +" % else:\n" +" (${rline['adults']} Adults)\n" +" %endif\n" +" \n" +"
\n" +" Entrada: ${format_tz(rline['checkin'], format=\"%d de %B de %Y\")}
\n" +" Salida: ${format_tz(rline['checkout'], format=\"%d de %B de %Y\")}
\n" +" Nº de noches: ${rline['nights']}

\n" +" % endfor\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \"Pago\"\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
IMPORTES
\n" +" Noches: ${len(object.room_lines[0].reservation_lines)}
\n" +" Base imponible: ${object.amount_untaxed} €
\n" +" I.V.A (10%): ${object.amount_tax} €
\n" +" Precio total: ${object.amount_total} €
\n" +" Coste de cancelación: [[importe]]
\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
NUESTRAS REDES SOCIALES 
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \"Facebook\"\n" +" \n" +"
Facebook
\n" +" \n" +" \n" +" \n" +" \n" +"
 \n" +"
\n" +"
Toda la actualidad de nuestros alojamientos, así como ofertas y promociones.
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +"
Dale a Me gusta
\n" +"
\n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \"Instagram\"\n" +" \n" +"
Instagram
\n" +" \n" +" \n" +" \n" +" \n" +"
 \n" +"
\n" +"
Cada detalle cuenta, y es por eso que tratamos de reflejarlo en nuestras fotos.
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +"
#Entra\n" +"
\n" +"
\n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \"Twitter\"\n" +" \n" +"
Twitter
\n" +" \n" +" \n" +" \n" +" \n" +"
 \n" +"
\n" +"
Propuestas al minuto para hacer de tu viaje una experiencia inmejorable.
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +"
Síguenos\n" +"
\n" +"
\n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
¡Esperamos verte pronto!
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" \"Alda\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
En cumplimiento de la Ley 34/2002 de Servicios de la Sociedad de la Información y del Comercio Electrónico, así como de la Ley Orgánica 15/1999 del 13 de Diciembre de Protección de Datos de Carácter Personal y demás legislación concordante, se le informa que sus datos personales figuran en un fichero automatizado cuya responsabilidad es de ALDA COMPOSTELA S.L. Praza da Algalia de Arriba, 3 C.P. 15704 Santiago de Compostela. Los datos personales que existen en nuestro poder están protegidos por nuestra Política de Privacidad y solo serán utilizados para los fines propios de nuestra actividad. Para ejercer sus derechos de acceso, rectificación, cancelación u oposición debe enviar un correo electrónico a info@aldahotels.com indicándonos la opción a realizar. Este correo podría ser confidencial. Si recibe este e-mail por error, por favor elimínelo, así como cualquier documento adjunto, y notifíquelo a su emisor. Si usted no es el destinatario del mensaje, sepa que no está permitida ninguna difusión, copia o utilización no autorizada.
\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" Antes de imprimir este mensaje, compruebe que es verdaderamente necesario. El medioambiente es cosa de todos. \n" +"
\n" +"
\n" +" \n" +"
\n" +"
\n" +" \n" +" " + #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_product_variant_count msgid "# Product Variants" @@ -49,7 +1100,7 @@ msgid "%s limit exceeded for %s" msgstr "%s limite excedido por %s" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:655 +#: code:addons/hotel/models/hotel_reservation.py:653 #, python-format msgid "%s people do not fit in this room! ;)" msgstr "%s personas no caben en esta habitación!" @@ -171,1395 +1222,6 @@ msgstr "Total" msgid "Your Reference:" msgstr "Su referencia:" -#. module: hotel -#: model:mail.template,body_html:hotel.mail_template_hotel_cancel -msgid "" -"\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \"Alda\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" www.aldahotels.com\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
Tu reserva se ha cancelado en ${object.company_id.property_name}
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
 \n" -"\n" -"
\n" -"
Hola ${object.partner_id.firstname}
\n" -" Tu reserva en ${object.company_id.property_name} se ha anulado correctamente. No es necesario que hagas nada más.\n" -" Si la cancelación conlleva la devolución de alguna cantidad, nos pondremos en contacto contigo.\n" -" En caso de que tengas alguna duda, estaremos encantados de atenderte.\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -"
Contactar\n" -"
\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \"Cancelación\"\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
Datos de tu reserva cancelada
\n" -" ${object.partner_id.name}\n" -"
\n" -" % if object.partner_id.contact_address:\n" -" ${object.partner_id.contact_address}
\n" -" % endif\n" -"
\n" -" % for rline in object.get_grouped_reservations_json('cancelled'):\n" -" ${rline['num']} x ${rline['room_type']['name']}\n" -" % if rline['childrens'] > 0:\n" -" (${rline['adults']} Adults + ${rline['childrens']} Childrens)\n" -" % else:\n" -" (${rline['adults']} Adults)\n" -" %endif\n" -" \n" -"
\n" -" Entrada: ${format_tz(rline['checkin'], format=\"%d de %B de %Y\")}
\n" -" Salida: ${format_tz(rline['checkout'], format=\"%d de %B de %Y\")}
\n" -" Nº de noches: ${rline['nights']}

\n" -" % endfor\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \"Pago\"\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
IMPORTES
\n" -" Noches: ${len(object.room_lines[0].reservation_lines)}
\n" -" Base imponible: ${object.amount_untaxed} €
\n" -" I.V.A (10%): ${object.amount_tax} €
\n" -" Precio total: ${object.amount_total} €
\n" -" Coste de cancelación: [[importe]]
\n" -"
\n" -"
\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
NUESTRAS REDES SOCIALES 
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \"Facebook\"\n" -" \n" -"
Facebook
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
 \n" -"
\n" -"
Toda la actualidad de nuestros alojamientos, así como ofertas y promociones.
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -"
Dale\n" -" a Me gusta
\n" -"
\n" -" \n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \"Instagram\"\n" -" \n" -"
Instagram
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
 \n" -"
\n" -"
Cada detalle cuenta, y es por eso que tratamos de reflejarlo en nuestras fotos.
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -"
#Entra\n" -"
\n" -"
\n" -" \n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \"Twitter\"\n" -" \n" -"
Twitter
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
 \n" -"
\n" -"
Propuestas al minuto para hacer de tu viaje una experiencia inmejorable.
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -"
Síguenos\n" -"
\n" -"
\n" -" \n" -"
\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
¡Esperamos verte\n" -" pronto!
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \"Alda\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
“En cumplimiento de la Ley 34/2002 de Servicios de la Sociedad de la Información y del Comercio Electrónico (LSSI-CE), así como lo dispuesto en el Reglamento General de Protección de Datos y demás legislación concordante, le informamos de que sus datos personales figuran en un sistema de tratamiento automatizado cuya responsabilidad es de Hoteles Rías Altas SL, con dirección postal a efecto de notificación en PLAZA DE ALGALIA DE ARRIBA, Nº 3 – 15704 SANTIAGO DE COMPOSTELA. Los datos personales que existen en nuestro poder están protegidos por nuestra Política de Privacidad y serán tratados con la finalidad de atender su solicitud de información o contacto, así como mantenerle informado de nuestros productos y servicios, actuales o futuros. Los datos no se cederán a terceros salvo en los casos en que exista una obligación legal. Para ejercer sus derechos de acceso, rectificación, cancelación, oposición, limitación, supresión y/o portabilidad debe enviar un correo electrónico a protecciondatos@aldahotels.com” “Este correo podría ser confidencial. Si recibe este e-mail por error, por favor elimínelo, así como cualquier documento adjunto, y notifíquelo a su emisor. Si usted no es el destinatario del mensaje, sepa que no está permitida ninguna difusión, copia o utilización no autorizada.”
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" Antes de imprimir este mensaje, compruebe que es verdaderamente necesario. El medioambiente es cosa de todos. \n" -"
\n" -"
\n" -" \n" -"
\n" -"
\n" -msgstr "" -"\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \"Alda\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" www.aldahotels.com\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
Tu reserva se ha cancelado en ${object.company_id.property_name}
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"\n" -"
\n" -"
Hola ${object.partner_id.firstname}
\n" -" Tu reserva en ${object.company_id.property_name} se ha anulado correctamente. No es necesario que hagas nada más.\n" -" Si la cancelación conlleva la devolución de alguna cantidad, nos pondremos en contacto contigo.\n" -" En caso de que tengas alguna duda, estaremos encantados de atenderte.\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -"
Contactar\n" -"
\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \"Cancelación\"\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
Datos de tu reserva cancelada
\n" -" ${object.partner_id.name}\n" -"
\n" -" % if object.partner_id.contact_address:\n" -" ${object.partner_id.contact_address}
\n" -" % endif\n" -"
\n" -" % for rline in object.get_grouped_reservations_json('cancelled'):\n" -" \n" -" ${rline['num']} x ${rline['room_type']['name']}\n" -" % if rline['childrens'] == 0:\n" -" (${rline['adults']} Adultos)\n" -" % else:\n" -" (${rline['adults']} Adultos + ${rline['childrens']} Niños)\n" -" % endif\n" -"
\n" -"
\n" -"
\n" -" Entrada: ${format_tz(rline['checkin']+ ' 00:00:00', format=\"%d de %B de %Y\")}
\n" -" Salida: ${format_tz(rline['checkout']+ ' 00:00:00', format=\"%d de %B de %Y\")}
\n" -" Nº de noches: ${rline['nights']}

\n" -" % endfor\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \"Pago\"\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
IMPORTES
\n" -" Noches: ${len(object.room_lines[0].reservation_lines)}
\n" -" Base imponible: ${object.amount_untaxed} €
\n" -" I.V.A (10%): ${object.amount_tax} €
\n" -" Precio total: ${object.amount_total} €
\n" -" Coste de cancelación: [[importe]]
\n" -"
\n" -"
\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
NUESTRAS REDES SOCIALES
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \"Facebook\"\n" -" \n" -"
Facebook
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"
\n" -"
Toda la actualidad de nuestros alojamientos, así como ofertas y promociones.
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -"
Dale\n" -" a Me gusta
\n" -"
\n" -" \n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \"Instagram\"\n" -" \n" -"
Instagram
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"
\n" -"
Cada detalle cuenta, y es por eso que tratamos de reflejarlo en nuestras fotos.
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -"
#Entra\n" -"
\n" -"
\n" -" \n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \"Twitter\"\n" -" \n" -"
Twitter
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"
\n" -"
Propuestas al minuto para hacer de tu viaje una experiencia inmejorable.
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -"
Síguenos\n" -"
\n" -"
\n" -" \n" -"
\n" -"
\n" -"
\n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
¡Esperamos verte\n" -" pronto!
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \"Alda\n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
“En cumplimiento de la Ley 34/2002 de Servicios de la Sociedad de la Información y del Comercio Electrónico (LSSI-CE), así como lo dispuesto en el Reglamento General de Protección de Datos y demás legislación concordante, le informamos de que sus datos personales figuran en un sistema de tratamiento automatizado cuya responsabilidad es de Hoteles Rías Altas SL, con dirección postal a efecto de notificación en PLAZA DE ALGALIA DE ARRIBA, Nº 3 – 15704 SANTIAGO DE COMPOSTELA. Los datos personales que existen en nuestro poder están protegidos por nuestra Política de Privacidad y serán tratados con la finalidad de atender su solicitud de información o contacto, así como mantenerle informado de nuestros productos y servicios, actuales o futuros. Los datos no se cederán a terceros salvo en los casos en que exista una obligación legal. Para ejercer sus derechos de acceso, rectificación, cancelación, oposición, limitación, supresión y/o portabilidad debe enviar un correo electrónico a protecciondatos@aldahotels.com” “Este correo podría ser confidencial. Si recibe este e-mail por error, por favor elimínelo, así como cualquier documento adjunto, y notifíquelo a su emisor. Si usted no es el destinatario del mensaje, sepa que no está permitida ninguna difusión, copia o utilización no autorizada.”
\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" Antes de imprimir este mensaje, compruebe que es verdaderamente necesario. El medioambiente es cosa de todos. \n" -"
\n" -"
\n" -" \n" -"
\n" -"
\n" - #. module: hotel #: model:mail.template,body_html:hotel.mail_template_hotel_reservation msgid "" @@ -1571,34 +1233,28 @@ msgid "" " padding: 0;\n" " min-width: 100% !important;\n" " }\n" -"\n" " a {\n" " color: #5e96ea;\n" " text-decoration: none;\n" " font-weight: bold;\n" " }\n" -"\n" " img {\n" " height: auto;\n" " }\n" -"\n" " .content {\n" " border: 1px solid #eeeeee;\n" " }\n" -"\n" " .logo {\n" " font-family: sans-serif;\n" " font-size: 36px;\n" " font-weight: bold;\n" " color: #ffffff;\n" " }\n" -"\n" " .link a {\n" " font-family: sans-serif;\n" " font-size: 12px;\n" " color: #ffffff;\n" " }\n" -"\n" " .subheading {\n" " font-size: 14px;\n" " color: #cccccc;\n" @@ -1608,7 +1264,6 @@ msgid "" " text-transform: uppercase;\n" " letter-spacing: 1px;\n" " }\n" -"\n" " .h1 {\n" " font-family: sans-serif;\n" " font-size: 48px;\n" @@ -1617,7 +1272,6 @@ msgid "" " color: #ffffff;\n" " padding: 0 0 0 0;\n" " }\n" -"\n" " .h2 {\n" " font-family: sans-serif;\n" " font-size: 18px;\n" @@ -1627,7 +1281,6 @@ msgid "" " text-transform: uppercase;\n" " letter-spacing: 0.5px;\n" " }\n" -"\n" " .h3 {\n" " font-family: sans-serif;\n" " font-size: 24px;\n" @@ -1635,7 +1288,6 @@ msgid "" " color: #555555;\n" " padding: 0 0 0 0;\n" " }\n" -"\n" " .h4 {\n" " font-family: sans-serif;\n" " font-size: 18px;\n" @@ -1643,7 +1295,6 @@ msgid "" " color: #666666;\n" " padding: 0 0 0 0;\n" " }\n" -"\n" " .paragraph {\n" " font-family: sans-serif;\n" " font-size: 14px;\n" @@ -1652,7 +1303,6 @@ msgid "" " font-weight: 200;\n" " padding: 20px 0 0 0;\n" " }\n" -"\n" " .listitem {\n" " font-family: sans-serif;\n" " font-size: 15px;\n" @@ -1660,39 +1310,32 @@ msgid "" " font-weight: 200;\n" " padding: 0 0 20px 0;\n" " }\n" -"\n" " .smalltext {\n" " font-family: sans-serif;\n" " font-size: 14px;\n" " color: #cccccc;\n" " padding: 3px 0 0 0;\n" " }\n" -"\n" " .borderbottom {\n" " border-bottom: 1px solid #f2eeed;\n" " }\n" -"\n" " /*Media Queries*/\n" " @media only screen and (max-width: 651px) {\n" " .columns {\n" " width: 100% !important;\n" " }\n" -"\n" " .columncontainer {\n" " display: block !important;\n" " width: 100% !important;\n" " }\n" -"\n" " .paragraph,\n" " .listitem {\n" " font-size: 18px;\n" " }\n" -"\n" " .link {\n" " float: left;\n" " }\n" " }\n" -"\n" " @media only screen and (min-width: 651px) {\n" " .content {\n" " width: 650px !important;\n" @@ -1859,13 +1502,13 @@ msgid "" " \n" " \"Restauracion\"\n" " \n" -" Restauración\n" +" Desayunos\n" " \n" " \n" " \n" " \"Parking\"\n" " \n" -" Parking\n" +" Parking concertado\n" " \n" " \n" " \n" @@ -2180,8 +1823,7 @@ msgid "" " conocer como llegar desde su ubicación actual\n" "

\n" "\n" -"

Si vienes en coche, podrás aparcar en los alrededores del hotel, aunque la zona de playa cuenta con zona azul. También disponemos de parking propio para clientes (bajo disponibilidad).

\n" -" \n" +"

Si vienes en coche, podrás aparcar en los alrededores del hotel, aunque cuentan con zona azul, de lunes a viernes, de 10:00 a 14:00 h y de 16:00 a 20:00 h. Los sábados de 10:00 a 14:00 h. También disponemos de convenio con un parking en la misma calle del hotel.

\n" " \n" " \n" " \n" @@ -2222,8 +1864,7 @@ msgid "" " \n" " \n" " \n" -" Si vienes en autobús podrás venir desde A Coruña en las líneas 20, 22 y 1A, que te dejarán cerca de Ponte da Pasaxe. Desde allí, tendrás unos 15 minutos andando hasta el hotel.
\n" -" \n" +" Si vienes en autobús, la mayoría de líneas tienen parada en la Plaza de Galicia. Una vez en esta parada, el hotel se cuentra a 5 minutos andando.
\n" " \n" " \n" " \n" @@ -2253,7 +1894,7 @@ msgid "" " ${object.company_id.city}\n" " \n" " \n" -" Santa Cristina es un lugar privilegiado. Playas de arena fina y blanca, paisajes impresionantes y unos alrededores dignos de conocer.\n" +" Ciudad declarada Patrimonio de la Humanidad por la UNESCO y meta de una milenaria ruta de peregrinación: el Camino de Santiago.\n" " \n" " \n" " \n" @@ -2264,7 +1905,7 @@ msgid "" "
\n" " \n" "
\n" -" Más\n" +" Más\n" " información\n" "
\n" " \n" -"

Si vienes en coche, podrás aparcar en los alrededores del hotel, aunque la zona de playa cuenta con zona azul. También disponemos de parking propio para clientes (bajo disponibilidad).

\n" -" \n" +"

Si vienes en coche, podrás aparcar en los alrededores del hotel, aunque cuentan con zona azul, de lunes a viernes, de 10:00 a 14:00 h y de 16:00 a 20:00 h. Los sábados de 10:00 a 14:00 h. También disponemos de convenio con un parking en la misma calle del hotel.

\n" " \n" " \n" " \n" @@ -3248,8 +2869,7 @@ msgstr "" " \n" " \n" " \n" -" Si vienes en autobús podrás venir desde A Coruña en las líneas 20, 22 y 1A, que te dejarán cerca de Ponte da Pasaxe. Desde allí, tendrás unos 15 minutos andando hasta el hotel.
\n" -" \n" +" Si vienes en autobús, la mayoría de líneas tienen parada en la Plaza de Galicia. Una vez en esta parada, el hotel se cuentra a 5 minutos andando.
\n" " \n" " \n" " \n" @@ -3279,7 +2899,7 @@ msgstr "" " ${object.company_id.city}\n" " \n" " \n" -" Santa Cristina es un lugar privilegiado. Playas de arena fina y blanca, paisajes impresionantes y unos alrededores dignos de conocer.\n" +" Ciudad declarada Patrimonio de la Humanidad por la UNESCO y meta de una milenaria ruta de peregrinación: el Camino de Santiago.\n" " \n" " \n" " \n" @@ -3290,7 +2910,7 @@ msgstr "" "
\n" " \n" "
\n" -" Más\n" +" Más\n" " información\n" "
\n" " \n" " \n" -" \n" +"
\n" "\n" " \n" -" \n" +" \n" "
\n" -" \n" -" \n" +"
\n" +" \n" " \n" -"
\n" -" \"Alda\n" -" \n" -" \n" -" \n" " \n" -"
\n" -" \n" -" \n" -"
\n" -" \n" -" \n" -"
www.aldahotels.com\n" +"
\n" +" \"Alda\n" +" \n" +" \n" +" \n" " \n" -"
\n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" -"
www.aldahotels.com\n" "
\n" +"
\n" "
\n" +"
\n" "
\n" +"
\n" " \n" " \n" "\n" @@ -4258,104 +3878,104 @@ msgstr "" " \n" " \n" " \n" -" \n" -" \n" -"
¡Muchas gracias por tu visita!\n" +" \n" +" \n" +" \n" " \n" " \n" -" \n" " \n" " \n" -" \n" " \n" " \n" " \n" -"
¡Muchas gracias por tu visita!\n" "
\n" -"

__

\n" +"
\n" +"

__

\n" "
Hola ${object.partner_id.firstname},
\n" -" Esperamos que hayas disfrutado de la ciudad, y que muy especialmente te hayas sentido a gusto en nuestro alojamiento. Todo el equipo de ${object.company_id.property_name} te agradece tu estancia en nuestro centro y te desea un feliz regreso.
\n" -" Recibe un cordial saludo y esperamos volver a verte.
\n" +"
Hola ${object.partner_id.firstname},
\n" +" Esperamos que hayas disfrutado de la ciudad, y que muy especialmente te hayas sentido a gusto en nuestro alojamiento. Todo el equipo de ${object.company_id.property_name} te agradece tu estancia en nuestro centro y te desea un feliz regreso.
\n" +" Recibe un cordial saludo y esperamos volver a verte.
\n" "
\n" +"
\n" " \n" " \n" " \n" " \n" " \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" " \n" -"
\n" -" \n" -" \n" -"
Disfruta de tu descuento de cliente\n" +" \n" +" \n" +" \n" " \n" -"
\n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" " \n" -" \n" " \n" " \n" " \n" -"
Disfruta de tu descuento de cliente\n" "
\n" -"

__

\n" +"
\n" +"

__

\n" "
\n" -" \n" -" \n" -"
Solo por ser cliente de Alda Hotels disfruta, automáticamente, de hasta un 10% de descuento en cualquiera de nuestros establecimientos, totalmente transferible y sin fecha de caducidad.
\n" +"
\n" +" \n" +" \n" +" \n" " \n" " \n" " \n" -"
Solo por ser cliente de Alda Hotels disfruta, automáticamente, de hasta un 10% de descuento en cualquiera de nuestros establecimientos, totalmente transferible y sin fecha de caducidad.
\n" "
\n" +"
\n" "
\n" -" \"Descuento\n" -" \n" -" \n" +"
\n" +" \"Descuento\n" +" \n" +" \n" " \n" -"
\n" +"
\n" "
\n" +"
\n" " \n" " \n" " \n" " \n" " \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" " \n" -"
\n" -" \n" -" \n" -"
¿Tienes algo que comentarnos?\n" +" \n" +" \n" +" \n" " \n" -"
\n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" " \n" -" \n" " \n" " \n" " \n" -"
¿Tienes algo que comentarnos?\n" "
\n" -"

__

\n" +"
\n" +"

__

\n" "
\n" -" \n" -" \n" -"
Cada día intentamos dar un mejor servicio, es por ello que si quieres aportar alguna propuesta o crítica constructiva, te invitamos a utilizar el siguiente formulario. Estamos encantados de recibir tus propuestas. Todas serán leídas y tenidas en cuenta, y atenderemos aquellas que nos permitan nuestros medios y posibilidades.
\n" +"
\n" +" \n" +" \n" +" \n" " \n" " \n" -" \n" " \n" -"
Cada día intentamos dar un mejor servicio, es por ello que si quieres aportar alguna propuesta o crítica constructiva, te invitamos a utilizar el siguiente formulario. Estamos encantados de recibir tus propuestas. Todas serán leídas y tenidas en cuenta, y atenderemos aquellas que nos permitan nuestros medios y posibilidades.
\n" "
\n" +" \n" " \n" -" \n" -"
\n" -" \n" -" \n" +"
\n" +" \n" +" \n" " \n" " \n" " \n" -"
\n" +"
\n" "
\n" +"
\n" "
\n" +"
\n" " \n" " \n" " \n" @@ -4396,58 +4016,58 @@ msgstr "" " \n" " \n" " \n" -" \n" -" \n" -" \n" " \n" -"
\n" -" \n" -" \n" -" \n" -"
\n" -" \"Localización\"\n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" -"
\n" +" \"Localización\"\n" "
\n" +"
\n" "
\n" -" \n" -" \n" -" \n" " \n" -"
\n" -" \n" -" \n" -" \n" +" \n" +"
nuestros alojamientos\n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" " \n" -" \n" " \n" " \n" -" \n" " \n" -"
nuestros alojamientos
Descubre dónde estamos\n" +" Descubre dónde estamos\n" "
Estamos presentes a lo largo del territorio peninsular. Si quieres saber dónde puedes alojarte con nosotros, pincha en el mapa.
\n" +"
Estamos presentes a lo largo del territorio peninsular. Si quieres saber dónde puedes alojarte con nosotros, pincha en el mapa.
\n" "
\n" +"
\n" "
\n" -" \"Mapa\"\n" +" \"Mapa\"\n" " \n" -" \n" -" \n" -" \n" +"
\n" +" \n" +" \n" " \n" " \n" " \n" -"
\n" -"
\n" +"
\n" -" \n" -" \n" +"
\n" +" \n" +" \n" " \n" -"
\n" -" \n" -" \n" +"
\n" +" \n" +" \n" " \n" -"
\n" +"
\n" "
\n" +" \n" " \n" " \n" " \n" @@ -4461,60 +4081,60 @@ msgstr "" " \n" " \n" " \n" -" \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" " \n" " \n" -" \n" -" \n" " \n" -"
\n" -" \n" -" \n" +"
\n" +" \n" +" \n" +" \n" " \n" -"
\n" +" \n" +" \n" +"
\n" +" \n" +" \n" " \n" -"
\n" +"
\n" "
\n" +"
\n" "
\n" -" \n" -" \n" +"
\n" +" \n" +" \n" " \n" -"
\n" +"
\n" "
\n" -" \n" -" \n" +"
\n" +" \n" +" \n" " \n" -"
\n" +"
\n" "
\n" -" \n" -" \n" -"
\n" -" \n" -" \n" +" \n" " \n" -"
\n" +" \n" +" \n" +"
\n" +" \n" +" \n" " \n" -"
\n" +"
\n" "
\n" +"
\n" "
\n" +"
\n" " \n" " \n" " \n" " \n" " \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" " \n" -"
NUESTRAS REDES SOCIALES\n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" @@ -4523,103 +4143,103 @@ msgstr "" " \n" " \n" " \n" -"
NUESTRAS REDES SOCIALES\n" "  \n" "
\n" +"
\n" "
\n" +"
\n" " \n" " \n" " \n" " \n" " \n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" -" \n" -" \n" " \n" -"
\n" -" \n" -" \n" -"
\"Facebook\"\n" +" \n" +" \n" +" \n" " \n" -"
\n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" " \n" -" \n" +" \n" " \n" " \n" -" \n" " \n" " \n" -" \n" +" \n" " \n" " \n" -" \n" " \n" -"
\"Facebook\"\n" "
Facebook Facebook
\n" -" \n" -" \n" -"
 \n" +" \n" +" \n" +" \n" +" \n" " \n" -"
 \n" "
\n" +"
\n" "
Toda la actualidad de nuestros alojamientos, así como ofertas y promociones. Toda la actualidad de nuestros alojamientos, así como ofertas y promociones.
\n" -" \n" -" \n" -"
\n" +" \n" +" \n" +" \n" +" \n" " \n" -"
\n" " \n" "\n" -" \n" -"
Dale a Me gusta
\n" +"
\n" +"
Dale a Me gusta
\n" "
\n" " \n" "
\n" +"
\n" "
\n" +"
\n" "
\n" +"
\n" "
\n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" " \n" -"
\"Instagram\"\n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" " \n" -" \n" +" \n" " \n" " \n" -" \n" " \n" " \n" -" \n" " \n" " \n" -" \n" " \n" -"
\"Instagram\"\n" "
Instagram Instagram
\n" -" \n" -" \n" -"
 \n" +" \n" +" \n" +" \n" +" \n" " \n" -"
 \n" "
\n" +"
\n" "
Cada detalle cuenta, y es por eso que tratamos de reflejarlo en nuestras fotos.\n" +" Cada detalle cuenta, y es por eso que tratamos de reflejarlo en nuestras fotos.\n" "
\n" -" \n" -" \n" -"
\n" +" \n" +" \n" +" \n" +" \n" " \n" -"
\n" " \n" -" \n" -"
\n" +"
\n" "
\n" +"
\n" "
\n" +"
\n" "
\n" -" \n" -" \n" -"
\n" -" \n" -" \n" -" \n" " \n" -"
\"Twitter\"\n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" " \n" " \n" -" \n" " \n" " \n" -" \n" " \n" " \n" -" \n" " \n" " \n" -" \n" " \n" -"
\"Twitter\"\n" "
Twitter\n" +" Twitter\n" "
\n" -" \n" -" \n" -"
 \n" +" \n" +" \n" +" \n" +" \n" " \n" -"
 \n" "
\n" +"
\n" "
Propuestas al minuto para hacer de tu viaje una experiencia inmejorable.\n" +" Propuestas al minuto para hacer de tu viaje una experiencia inmejorable.\n" "
\n" -" \n" -" \n" -"
\n" +" \n" +" \n" +" \n" +" \n" " \n" -"
\n" " \n" -" \n" -"
\n" +"
\n" "
\n" +"
\n" "
\n" +"
\n" "
\n" +"
\n" " \n" " \n" " \n" @@ -4697,49 +4317,49 @@ msgstr "" " \n" " \n" " \n" -" \n" -" \n" -"
¡Muchas gracias por alojarte con nosotros!\n" +" \n" +" \n" +" \n" " \n" " \n" " \n" -"
¡Muchas gracias por alojarte con nosotros!\n" "
\n" +"
\n" " \n" " \n" " \n" -" \n" -" \n" -" \n" +"
\n" +" \n" +" \n" " \n" -"
\n" -" \"Alda\n" -" \n" -" \n" +"
\n" +" \"Alda\n" +" \n" +" \n" " \n" -"
\n" +"
\n" " \n" " \n" " \n" " \n" -" \n" -" \n" -" \n" -" \n" +"
En cumplimiento de la Ley 34/2002 de Servicios de la Sociedad de la Información y del Comercio Electrónico, así como de la Ley Orgánica 15/1999 del 13 de Diciembre de Protección de Datos de Carácter Personal y demás legislación concordante, se le informa que sus datos personales figuran en un fichero automatizado cuya responsabilidad es de ALDA COMPOSTELA S.L. Praza da Algalia de Arriba, 3 C.P. 15704 Santiago de Compostela. Los datos personales que existen en nuestro poder están protegidos por nuestra Política de Privacidad y solo serán utilizados para los fines propios de nuestra actividad. Para ejercer sus derechos de acceso, rectificación, cancelación u oposición debe enviar un correo electrónico a info@aldahotels.com indicándonos la opción a realizar. Este correo podría ser confidencial. Si recibe este e-mail por error, por favor elimínelo, así como cualquier documento adjunto, y notifíquelo a su emisor. Si usted no es el destinatario del mensaje, sepa que no está permitida ninguna difusión, copia o utilización no autorizada.\n" +" \n" +" \n" +" \n" " \n" " \n" " \n" -"
En cumplimiento de la Ley 34/2002 de Servicios de la Sociedad de la Información y del Comercio Electrónico, así como de la Ley Orgánica 15/1999 del 13 de Diciembre de Protección de Datos de Carácter Personal y demás legislación concordante, se le informa que sus datos personales figuran en un fichero automatizado cuya responsabilidad es de ALDA COMPOSTELA S.L. Praza da Algalia de Arriba, 3 C.P. 15704 Santiago de Compostela. Los datos personales que existen en nuestro poder están protegidos por nuestra Política de Privacidad y solo serán utilizados para los fines propios de nuestra actividad. Para ejercer sus derechos de acceso, rectificación, cancelación u oposición debe enviar un correo electrónico a info@aldahotels.com indicándonos la opción a realizar. Este correo podría ser confidencial. Si recibe este e-mail por error, por favor elimínelo, así como cualquier documento adjunto, y notifíquelo a su emisor. Si usted no es el destinatario del mensaje, sepa que no está permitida ninguna difusión, copia o utilización no autorizada.
\n" -" \n" -" \n" -"
Antes de imprimir este mensaje, compruebe que es verdaderamente necesario. El medioambiente es cosa de todos. \n" +"
\n" +" \n" +" \n" +" \n" " \n" " \n" -"
Antes de imprimir este mensaje, compruebe que es verdaderamente necesario. El medioambiente es cosa de todos. \n" "
\n" +"
\n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" -" \n" +" \n" "
" #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_room_description_sale +#: model:ir.model.fields,help:hotel.field_hotel_shared_room_description_sale msgid "A description of the Product that you want to communicate to your customers. This description will be copied to every Sales Order, Delivery Order and Customer Invoice/Credit Note" msgstr "Descripción que quieras comunicar a tus cleintes. Este descripción será copiada en los pedidos de venta, y otros documentos de cliente" @@ -4778,15 +4399,15 @@ msgid "" "A service is a non-material product you provide.\n" "A digital content is a non-material product you sell online. The files attached to the products are the one that are sold on the e-commerce such as e-books, music, pictures,... The \"Digital Product\" module has to be installed." msgstr "" -"Un producto almacenable es un producto para el que gestiona el stock. La aplicación \"Inventario\" debe instalarse.\n" +"Un producto almacenable es un producto para el que usted gestiona el stock. La aplicación \"Inventario\" debe instalarse.\n" "Por el contrario, un producto consumible es un producto para el que no se gestiona el stock.\n" "Un servicio es un producto no material que usted proporciona.\n" -"Un contenido digital es un producto no material que vende en línea. Los archivos adjuntos a los productos son los que se venden en el comercio electrónico, tales como libros electrónicos, música, fotos... El módulo \"Producto Digital\" tiene que estar instalado." +"Un contenido digital es un producto no material que vende en línea. Los archivos adjuntos a los productos son los que se venden en el comercio electrónico, tales como libros electrónicos, música, fotos, ... El módulo \"Producto Digital\" debe instalado." #. module: hotel #: model:ir.model.fields,help:hotel.field_folio_advance_payment_inv_deposit_account_id msgid "Account used for deposits" -msgstr "Cuenta utilizada para depósitos" +msgstr "Cuenta utilizada para los depósitos" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_message_needaction @@ -4807,6 +4428,7 @@ msgstr "Acción Checkin" #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_class_active #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_restriction_active #: model:ir.model.fields,field_description:hotel.field_hotel_service_line_active +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_active msgid "Active" msgstr "Activo" @@ -4945,7 +4567,7 @@ msgstr "Cuenta analítica" #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_analytic_tag_ids #: model:ir.model.fields,field_description:hotel.field_hotel_service_analytic_tag_ids msgid "Analytic Tags" -msgstr "Etiquetas analíticas" +msgstr "Etiquetas Analíticas" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_changes_applied_on @@ -4975,6 +4597,7 @@ msgstr "Artículos" #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_room_floor_id +#: model:ir.model.fields,help:hotel.field_hotel_shared_room_floor_id msgid "At which floor the room is located." msgstr "En qué piso está ubicada la habitación." @@ -4986,7 +4609,7 @@ msgstr "Atributos" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_folio_advance_payment_inv_auto_invoice msgid "Auto Payment Invoice" -msgstr "Asociar Pagos automáticamete" +msgstr "Autoasociar pago a la factura" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_preconfirm @@ -5008,7 +4631,7 @@ msgstr "Checkout automático de reservas pasadas" #. module: hotel #: model:ir.model.fields,help:hotel.field_folio_advance_payment_inv_auto_invoice msgid "Automatic validation and link payment to invoice" -msgstr "Validar y Asociar pagos automáticamente" +msgstr "Validación y asociación del pago de la ficha automático" #. module: hotel #: selection:hotel.wizard.massive.changes,section:0 @@ -5025,6 +4648,17 @@ msgstr "Código de barras" msgid "Base price to compute the customer price. Sometimes called the catalog price." msgstr "Precio base para calcular el precio de los clientes. A veces llamado precio de catálogo." +#. module: hotel +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_bed_ids +msgid "Bed" +msgstr "Cama" + +#. module: hotel +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_beds +#: model:ir.ui.view,arch_db:hotel.hotel_shared_shared_room_view_kanban +msgid "Beds" +msgstr "Camas" + #. module: hotel #: selection:product.template,consumed_on:0 msgid "Before night" @@ -5047,7 +4681,7 @@ msgstr "Nombre" #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_wizard_board_service_room_id #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_wizard_board_service_room_id msgid "Board Service" -msgstr "Board Service" +msgstr "Servicio" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_board_service_board_service_line_ids @@ -5060,7 +4694,7 @@ msgstr "Línea de BoardService" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_board_service_room_type_line_hotel_board_service_room_type_id msgid "Board Service Room" -msgstr "Board Service Habitación" +msgstr "Board Service Room" #. module: hotel #: model:ir.model,name:hotel.model_hotel_board_service_room_type @@ -5317,7 +4951,7 @@ msgstr "Checkin Pendiente" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_checkin_partner_pending_count msgid "Checkin Pending Num" -msgstr "Checkins Pendientes" +msgstr "Checkin Pending Num" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_checkin_partner_view_search @@ -5480,7 +5114,7 @@ msgstr "Confirmación de los detalles de su reserva en ${object.company_id.prope #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_folio_confirmation_date msgid "Confirmation Date" -msgstr "Fecha confirmación" +msgstr "Fecha de confirmación" #. module: hotel #: selection:hotel.folio,state:0 @@ -5492,7 +5126,7 @@ msgstr "Confirmado" #: model:ir.model.fields,field_description:hotel.field_product_product_consumed_on #: model:ir.model.fields,field_description:hotel.field_product_template_consumed_on msgid "Consumed" -msgstr "Consumed" +msgstr "Consumido" #. module: hotel #: model:ir.model,name:hotel.model_res_partner @@ -5598,6 +5232,7 @@ msgstr "Creado por" #: model:ir.model.fields,field_description:hotel.field_hotel_service_create_uid #: model:ir.model.fields,field_description:hotel.field_hotel_service_line_create_uid #: model:ir.model.fields,field_description:hotel.field_hotel_service_wizard_create_uid +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_create_uid #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_duplicate_reservation_create_uid #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_changes_create_uid #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_price_reservation_days_create_uid @@ -5632,6 +5267,7 @@ msgstr "Creado por" #: model:ir.model.fields,field_description:hotel.field_hotel_service_create_date #: model:ir.model.fields,field_description:hotel.field_hotel_service_line_create_date #: model:ir.model.fields,field_description:hotel.field_hotel_service_wizard_create_date +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_create_date #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_duplicate_reservation_create_date #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_changes_create_date #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_price_reservation_days_create_date @@ -5705,14 +5341,14 @@ msgstr "Ref. Cliente" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_folio_client_order_ref msgid "Customer Reference" -msgstr "Referencia cliente" +msgstr "Referencia de cliente" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_folio_advance_payment_inv_deposit_taxes_id #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_taxes_id #: model:ir.ui.view,arch_db:hotel.hotel_amenity_view_form msgid "Customer Taxes" -msgstr "Impuestos cliente" +msgstr "Impuestos de cliente" #. module: hotel #: model:ir.ui.menu,name:hotel.menu_hotel_customer @@ -5740,7 +5376,7 @@ msgid "Date" msgstr "Fecha" #. module: hotel -#: code:addons/hotel/models/hotel_room_type.py:137 +#: code:addons/hotel/models/hotel_room_type.py:135 #, python-format msgid "Date From and days are mandatory" msgstr "Fecha desde y días son obligatorios" @@ -5815,7 +5451,7 @@ msgstr "Hora de Salida por defecto (HH:MM)" #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_room_type_uom_id msgid "Default Unit of Measure used for all stock operation." -msgstr "Unidad de medida predeterminada utilizada para todas las operaciones de stock." +msgstr "Unidad de medida por defecto utilizada para todas las operaciones de stock." #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_room_type_uom_po_id @@ -5898,6 +5534,7 @@ msgstr "Descripción en Recepciones" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_amenity_view_form #: model:ir.ui.view,arch_db:hotel.hotel_room_view_form +#: model:ir.ui.view,arch_db:hotel.hotel_shared_room_view_form msgid "Descriptions" msgstr "Descripciones" @@ -5915,7 +5552,7 @@ msgstr "Desc.(%)" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_service_line_discount msgid "Discount" -msgstr "Descuento" +msgstr "Discount" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_line_discount @@ -5959,6 +5596,7 @@ msgstr "Habitación con descuento" #: model:ir.model.fields,field_description:hotel.field_hotel_service_display_name #: model:ir.model.fields,field_description:hotel.field_hotel_service_line_display_name #: model:ir.model.fields,field_description:hotel.field_hotel_service_wizard_display_name +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_display_name #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_duplicate_reservation_display_name #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_changes_display_name #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_price_reservation_days_display_name @@ -5992,13 +5630,13 @@ msgstr "Adelanto" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_folio_advance_payment_inv_amount msgid "Down Payment Amount" -msgstr "Cantidad del Depósito" +msgstr "Cantidad de pago anticipado" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_line_advance_inv_product_id #: model:ir.ui.view,arch_db:hotel.view_folio_advance_payment_inv msgid "Down Payment Product" -msgstr "Producto de Depósito" +msgstr "Producto de pago anticipado" #. module: hotel #: selection:folio.advance.payment.inv,advance_payment_method:0 @@ -6153,7 +5791,7 @@ msgstr "Fichas" #. module: hotel #: model:ir.model,name:hotel.model_folio_advance_payment_inv msgid "Folios Advance Payment Invoice" -msgstr "Wizard de facturación de Fichas" +msgstr "Folios Advance Payment Invoice" #. module: hotel #: model:ir.model.fields,help:hotel.field_folio_advance_payment_inv_folio_ids @@ -6271,7 +5909,7 @@ msgstr "Agrupar por" #: model:ir.ui.view,arch_db:hotel.hotel_amenity_search #: model:ir.ui.view,arch_db:hotel.hotel_service_view_search msgid "Group By..." -msgstr "Agrupar Por..." +msgstr "Agrupar por..." #. module: hotel #: model:ir.model.fields,field_description:hotel.field_folio_advance_payment_inv_group_folios @@ -6295,19 +5933,19 @@ msgstr "Formato HH:mm" #: model:ir.model.fields,field_description:hotel.field_hotel_folio_has_cancelled_reservations_to_send #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_has_cancelled_reservations_to_send msgid "Has Cancelled Reservations To Send" -msgstr "Tienes reservas Canceladas por enviar" +msgstr "Tiene reservas canceladas para enviar por mail" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_folio_has_checkout_to_send #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_has_checkout_to_send msgid "Has Checkout To Send" -msgstr "Tiene Checkout por enviar" +msgstr "Has Checkout To Send" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_folio_has_confirmed_reservations_to_send #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_has_confirmed_reservations_to_send msgid "Has Confirmed Reservations To Send" -msgstr "Tiene reservas confirmadas por enviar" +msgstr "Has Confirmed Reservations To Send" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_account_invoice_has_folios_outstanding @@ -6424,6 +6062,7 @@ msgstr "Motivos de Cierre de habitaciones" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_room_type_id +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_room_type_id #: model:ir.ui.view,arch_db:hotel.hotel_room_type_class_view_form #: model:ir.ui.view,arch_db:hotel.hotel_room_type_view_form #: model:ir.ui.view,arch_db:hotel.hotel_room_type_view_tree @@ -6456,10 +6095,19 @@ msgstr "Servicios" msgid "Hotel Services and its charges" msgstr "Hotel Services and its charges" +#. module: hotel +#: model:ir.actions.act_window,name:hotel.action_hotel_shared_room_form +#: model:ir.model,name:hotel.model_hotel_shared_room +#: model:ir.ui.view,arch_db:hotel.hotel_shared_room_view_form +#: model:ir.ui.view,arch_db:hotel.hotel_shared_room_view_tree +#: model:ir.ui.view,arch_db:hotel.hotel_shared_shared_room_view_search +msgid "Hotel Shared Room" +msgstr "Habitación Compartida" + #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_class_id msgid "Hotel Type Class" -msgstr "Categoría de Habitación" +msgstr "Hotel Type Class" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_floor_view_form @@ -6506,6 +6154,7 @@ msgstr "Hotel services detail provide to customer and it will include in main In #: model:ir.model.fields,field_description:hotel.field_hotel_service_id #: model:ir.model.fields,field_description:hotel.field_hotel_service_line_id #: model:ir.model.fields,field_description:hotel.field_hotel_service_wizard_id +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_id #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_duplicate_reservation_id #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_changes_id #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_price_reservation_days_id @@ -6540,7 +6189,7 @@ msgstr "Si el idioma seleccionado está cargado en el sistema, todos los documen #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_room_type_restriction_active msgid "If unchecked, it will allow you to hide the restriction plan without removing it." -msgstr "Si lo deseleccionar, se desactivará el plan de restricciones sin eliminarlo." +msgstr "If unchecked, it will allow you to hide the restriction plan without removing it." #. module: hotel #: code:addons/hotel/wizard/folio_make_invoice_advance.py:458 @@ -6600,6 +6249,7 @@ msgstr "Inform Guest About Reservation Before 24 Hours" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_amenity_view_form #: model:ir.ui.view,arch_db:hotel.hotel_room_view_form +#: model:ir.ui.view,arch_db:hotel.hotel_shared_room_view_form msgid "Information" msgstr "Información" @@ -6633,7 +6283,7 @@ msgid "International Article Number used for product identification." msgstr "Número de artículo internacional usado para la identificación de producto." #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:1239 +#: code:addons/hotel/models/hotel_reservation.py:1237 #, python-format msgid "Invalid Nights! Max is '%d'" msgstr "Núm de noches inválidad! Máximo s on '%d'" @@ -6670,7 +6320,7 @@ msgstr "Factura" #: model:ir.model.fields,field_description:hotel.field_hotel_folio_partner_invoice_id #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_partner_invoice_id msgid "Invoice Address" -msgstr "Dirección de factura" +msgstr "Dirección de Factura" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_folio_view_search @@ -6681,7 +6331,7 @@ msgstr "Dirección de Facturación" #: model:ir.model.fields,field_description:hotel.field_hotel_folio_invoice_count #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_invoice_count msgid "Invoice Count" -msgstr "Contador de Facturas" +msgstr "Invoice Count" #. module: hotel #: model:ir.actions.act_window,name:hotel.action_view_folio_advance_payment_inv @@ -6700,7 +6350,7 @@ msgstr "Linea de Factura" #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_line_invoice_line_ids #: model:ir.model.fields,field_description:hotel.field_hotel_service_invoice_line_ids msgid "Invoice Lines" -msgstr "Líneas de factura" +msgstr "Líneas de la factura" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_folio_invoice_status @@ -6791,11 +6441,6 @@ msgstr "Es Operadora Tuística" msgid "Is extra bed" msgstr "Es cama supletoria" -#. module: hotel -#: model:ir.ui.view,arch_db:hotel.hotel_room_view_form -msgid "It allows several reservations on the same room simultaneously based on the capacity of people" -msgstr "Permite varias reservas en la misma habitación contando solo la capacidad de plazas" - #. module: hotel #: code:addons/hotel/models/hotel_checkin_partner.py:142 #, python-format @@ -6854,6 +6499,7 @@ msgstr "Fecha del último mensaje" #: model:ir.model.fields,field_description:hotel.field_hotel_service___last_update #: model:ir.model.fields,field_description:hotel.field_hotel_service_line___last_update #: model:ir.model.fields,field_description:hotel.field_hotel_service_wizard___last_update +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room___last_update #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_duplicate_reservation___last_update #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_changes___last_update #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_price_reservation_days___last_update @@ -6893,6 +6539,7 @@ msgstr "Actualizado el" #: model:ir.model.fields,field_description:hotel.field_hotel_service_line_write_uid #: model:ir.model.fields,field_description:hotel.field_hotel_service_wizard_write_uid #: model:ir.model.fields,field_description:hotel.field_hotel_service_write_uid +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_write_uid #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_duplicate_reservation_write_uid #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_changes_write_uid #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_price_reservation_days_write_uid @@ -6927,6 +6574,7 @@ msgstr "Última actualización de" #: model:ir.model.fields,field_description:hotel.field_hotel_service_line_write_date #: model:ir.model.fields,field_description:hotel.field_hotel_service_wizard_write_date #: model:ir.model.fields,field_description:hotel.field_hotel_service_write_date +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_write_date #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_duplicate_reservation_write_date #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_changes_write_date #: model:ir.model.fields,field_description:hotel.field_hotel_wizard_massive_price_reservation_days_write_date @@ -6956,7 +6604,7 @@ msgstr "Pago restrasado" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_cancelation_rule_apply_on_late msgid "Late apply on" -msgstr "Apllicar cancelación tardía en" +msgstr "Aplicar cancelación tardía en" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_cancelation_rule_days_late @@ -6976,7 +6624,7 @@ msgstr "Líneas" #. module: hotel #: model:ir.model,name:hotel.model_line_advance_inv msgid "Lines Advance Invoice" -msgstr "Líneas de factura" +msgstr "Lines Advance Invoice" #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_room_type_room_amenity_ids @@ -7113,7 +6761,7 @@ msgstr "Máx. días en tiempo antes del checkin" #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_cancelation_rule_days_intime msgid "Maximum number of days for free cancellation before Checkin" -msgstr "Máximo número de días antes del Checkin para la cancelación sin cargos" +msgstr "Máximo número de días de libre cancelación antes del Checkin" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_image_medium @@ -7187,12 +6835,14 @@ msgstr "Mis Reservas" #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_name #: model:ir.model.fields,field_description:hotel.field_room_closure_reason_name #: model:ir.ui.view,arch_db:hotel.hotel_room_view_form +#: model:ir.ui.view,arch_db:hotel.hotel_shared_room_view_form #: model:ir.ui.view,arch_db:hotel.room_type_restriction_view_form msgid "Name" msgstr "Nombre" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_room_view_form +#: model:ir.ui.view,arch_db:hotel.hotel_shared_room_view_form msgid "Name in reports" msgstr "Nombre en Informes" @@ -7244,7 +6894,7 @@ msgid "Nights" msgstr "Noches" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:572 +#: code:addons/hotel/models/hotel_reservation.py:570 #, python-format msgid "No Checkins!" msgstr "Sin Checkins!" @@ -7261,7 +6911,7 @@ msgid "No Show apply on" msgstr "No Show aplicar en" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:571 +#: code:addons/hotel/models/hotel_reservation.py:569 #, python-format msgid "No checkin was made for this reservation" msgstr "No se ha llegado a realizar ningún checkin en esta reserva!" @@ -7301,7 +6951,7 @@ msgstr "Número de acciones" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_wizard_rooms_num msgid "Number of Rooms" -msgstr "Número de habitaciones" +msgstr "Number of Rooms" #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_reservation_children @@ -7742,7 +7392,7 @@ msgstr "Tarifa" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_product_id msgid "Product Room Type" -msgstr "Producto del tipo de habitación" +msgstr "Producto Tipo Habitación" #. module: hotel #: model:ir.model,name:hotel.model_product_template @@ -7854,7 +7504,7 @@ msgstr "Referencia" #. module: hotel #: code:addons/hotel/models/hotel_folio.py:317 -#: code:addons/hotel/models/hotel_reservation.py:1079 +#: code:addons/hotel/models/hotel_reservation.py:1077 #: model:ir.ui.view,arch_db:hotel.account_payment_view_form_folio #, python-format msgid "Register Payment" @@ -7913,13 +7563,13 @@ msgstr "Detalles de la Reseva" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_reservation_line_ids msgid "Reservation Line" -msgstr "Reservation Line" +msgstr "Línea Reserva" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_account_invoice_line_reservation_line_ids #: model:ir.model.fields,field_description:hotel.field_line_advance_inv_reservation_line_ids msgid "Reservation Lines" -msgstr "Reservation Lines" +msgstr "Líneas Reserva" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_reservation_no @@ -7951,7 +7601,7 @@ msgstr "Servicios" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_reservation_view_form msgid "Reservation Total" -msgstr "Reservation Total" +msgstr "Total Reserva" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_folio_wizard @@ -7959,13 +7609,13 @@ msgid "Reservation Wizard" msgstr "Reservation Wizard" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:642 +#: code:addons/hotel/models/hotel_reservation.py:640 #, python-format msgid "Reservation has no adults" msgstr "La reserva no tiene adultos" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:640 +#: code:addons/hotel/models/hotel_reservation.py:638 #, python-format msgid "Reservation persons can't be higher than room capacity" msgstr "Las personas de la reserva no pueden superiores a la capacidad de la habitación" @@ -8008,7 +7658,7 @@ msgstr "Reservas a 7 días" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_reservation_view_tree msgid "Reserved Unit Type" -msgstr "Reserved Unit Type" +msgstr "Tipo Reservado" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_folio_wizard_reservation_wizard_ids @@ -8126,6 +7776,7 @@ msgstr "Líneas de habitación" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_name +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_name msgid "Room Name" msgstr "Nombre Habitación" @@ -8137,7 +7788,7 @@ msgstr "Habitación No" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_price_room_services_set msgid "Room Services Total" -msgstr "Total de servicios de habitación" +msgstr "Total Servicios Habitación" #. module: hotel #: selection:hotel.wizard.massive.changes,applied_on:0 @@ -8151,19 +7802,20 @@ msgstr "Total de servicios de habitación" #: model:ir.ui.view,arch_db:hotel.hotel_folio_wizard #: model:ir.ui.view,arch_db:hotel.hotel_reservation_view_search #: model:ir.ui.view,arch_db:hotel.hotel_room_view_form +#: model:ir.ui.view,arch_db:hotel.hotel_shared_room_view_form msgid "Room Type" msgstr "Tipo de Habitación" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_room_amenity_ids msgid "Room Type Amenities" -msgstr "Características del tipo de habitación" +msgstr "Room Type Amenities" #. module: hotel #: model:ir.actions.act_window,name:hotel.open_hotel_room_type_class_form_tree #: model:ir.model,name:hotel.model_hotel_room_type_class msgid "Room Type Class" -msgstr "Tipo Habitación" +msgstr "Categoría del Tipo de Habitación" #. module: hotel #: sql_constraint:hotel.room.type:0 @@ -8172,6 +7824,7 @@ msgstr "El código de la habitación debe ser único!" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_room_view_kanban +#: model:ir.ui.view,arch_db:hotel.hotel_shared_shared_room_view_kanban msgid "Room Type:" msgstr "Tipo de Habitación:" @@ -8194,7 +7847,7 @@ msgid "Room capacity can't be less than one" msgstr "La capacidad de la habitación no puede ser menor que uno" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:1160 +#: code:addons/hotel/models/hotel_reservation.py:1158 #, python-format msgid "Room line Check In Date Should be less than the Check Out Date!" msgstr "La fecha de entrada debe ser menor que la fecha de salida!" @@ -8210,7 +7863,7 @@ msgstr "Habitaciones" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_wizard_room_type_id msgid "Rooms Type" -msgstr "Tipos de Habitación" +msgstr "Tipo Habitación" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_route_ids @@ -8220,6 +7873,7 @@ msgstr "Rutas" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_description_sale #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_description_sale +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_description_sale msgid "Sale Description" msgstr "Descripción de venta" @@ -8260,7 +7914,7 @@ msgstr "Sábado" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_account_payment_save_date msgid "Save Date" -msgstr "Fecha guardada\t" +msgstr "Fecha Guardada\t" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_account_payment_save_journal_id @@ -8276,7 +7930,7 @@ msgstr "Sección" #: model:ir.model.fields,field_description:hotel.field_hotel_folio_segmentation_ids #: model:ir.model.fields,field_description:hotel.field_hotel_reservation_segmentation_ids msgid "Segmentation" -msgstr "Segmentación" +msgstr "Segmentation" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_folio_view_form @@ -8323,6 +7977,7 @@ msgstr "Enviar Mail de Salida" #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_class_sequence #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_sequence #: model:ir.model.fields,field_description:hotel.field_hotel_service_sequence +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_sequence msgid "Sequence" msgstr "Secuencia" @@ -8357,7 +8012,7 @@ msgstr "Líneas de servicio" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_service_line_service_id msgid "Service Room" -msgstr "Servicios habitación" +msgstr "Servicio Habitación" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_service_name @@ -8430,17 +8085,17 @@ msgstr "Establecer hora de salida por defecto" #. module: hotel #: model:ir.ui.view,arch_db:hotel.view_hotel_config_settings msgid "Set pricelist default" -msgstr "Establecer tarifa por defecto" +msgstr "Establcer tarifa por defecto" #. module: hotel #: model:ir.ui.view,arch_db:hotel.view_hotel_config_settings msgid "Set restrictions default" -msgstr "Establecer plan de restricciones por defecto" +msgstr "Establcer plan de restricciones por defecto" #. module: hotel #: model:ir.ui.view,arch_db:hotel.view_hotel_config_settings msgid "Set time-zone" -msgstr "Establecer Zona Horaria" +msgstr "Establcer Zona Horaria" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_folio_view_form @@ -8458,10 +8113,16 @@ msgid "Shared Folio" msgstr "Compartir Ficha" #. module: hotel -#: model:ir.model.fields,field_description:hotel.field_hotel_room_shared_room +#: model:ir.model.fields,field_description:hotel.field_hotel_room_shared_room_id +#: model:ir.model.fields,field_description:hotel.field_hotel_room_type_shared_room msgid "Shared Room" msgstr "Habitación Compartida" +#. module: hotel +#: model:ir.ui.menu,name:hotel.menu_open_hotel_shared_room_form +msgid "Shared Rooms" +msgstr "Habitaciones Compartidas" + #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_checkin_partner_view_search msgid "Show all checkins for Tomorrow" @@ -8611,7 +8272,7 @@ msgstr "Cuenta de entrada de stock" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_stock_move_ids msgid "Stock Move" -msgstr "Movimiento de stock" +msgstr "Movimiento de Stock" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_property_stock_account_output @@ -8718,7 +8379,7 @@ msgstr "Términos y condiciones" #: model:ir.model.fields,help:hotel.field_hotel_room_type_active #: model:ir.model.fields,help:hotel.field_hotel_room_type_class_active msgid "The active field allows you to hide the category without removing it." -msgstr "El campo activo te permite ocultar la categoría sin eliminarla." +msgstr "The active field allows you to hide the category without removing it." #. module: hotel #: model:ir.model.fields,help:hotel.field_folio_advance_payment_inv_amount @@ -8759,8 +8420,8 @@ msgid "The product used to invoice a down payment should have an invoice policy msgstr "The product used to invoice a down payment should have an invoice policy set to \"Ordered quantities\". Please update your deposit product to be able to create a deposit invoice." #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:697 -#: code:addons/hotel/models/hotel_reservation.py:1188 +#: code:addons/hotel/models/hotel_reservation.py:695 +#: code:addons/hotel/models/hotel_reservation.py:1186 #, python-format msgid "The room already is completed" msgstr "La habitación ya está completa" @@ -8828,7 +8489,7 @@ msgid "This guest is already registered in the room" msgstr "Este huésped ya está registrado en ésta habitación" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:1366 +#: code:addons/hotel/models/hotel_reservation.py:1364 #, python-format msgid "This is the parent reservation" msgstr "Esta es la reserva padre" @@ -8845,13 +8506,13 @@ msgid "This pay is related with msgstr "Este pago esta vínculado con más de una Reserva." #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:1288 +#: code:addons/hotel/models/hotel_reservation.py:1286 #, python-format msgid "This reservation can't be unified" msgstr "Esta reserva no se puede unificar" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:1317 +#: code:addons/hotel/models/hotel_reservation.py:1315 #, python-format msgid "This reservation can't be unified: They all need to be in the same room" msgstr "Esta reserva no se puede unificar: todos deben estar en la misma habitación" @@ -8873,6 +8534,11 @@ msgstr "Esta reserva es solo una parte de una reserva dividida, puedes revisarlo msgid "This room is occupied!, please, choice other room or change the reservation date" msgstr "Esta habitación está ocupada, elige otra habitación u otras fechas para la estancia" +#. module: hotel +#: model:ir.model.fields,help:hotel.field_hotel_room_type_shared_room +msgid "This room type is reservation by beds" +msgstr "This room type is reservation by beds" + #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_room_type_property_stock_production msgid "This stock location will be used, instead of the default one, as the source location for stock moves generated by manufacturing orders." @@ -8968,7 +8634,7 @@ msgstr "Total" #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_wizard_total_price #: model:ir.ui.view,arch_db:hotel.report_folio_document msgid "Total Price" -msgstr "Precio total" +msgstr "Precio Total" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_hotel_room_type_total_rooms_count @@ -8979,12 +8645,12 @@ msgstr "Total Habitaciones" #: model:ir.ui.view,arch_db:hotel.hotel_folio_view_form #: model:ir.ui.view,arch_db:hotel.hotel_folio_view_tree msgid "Total amount" -msgstr "Importe total" +msgstr "Cantidad Total" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_account_payment_amount_total_folio msgid "Total amount in folio" -msgstr "Cantidad total en ficha de reserva" +msgstr "Monto total en ficha de reserva" #. module: hotel #: model:ir.ui.view,arch_db:hotel.hotel_folio_view_tree @@ -9040,7 +8706,9 @@ msgstr "Tipos" #. module: hotel #: model:ir.model,name:hotel.model_hotel_floor #: model:ir.model.fields,field_description:hotel.field_hotel_room_floor_id +#: model:ir.model.fields,field_description:hotel.field_hotel_shared_room_floor_id #: model:ir.ui.view,arch_db:hotel.hotel_room_view_form +#: model:ir.ui.view,arch_db:hotel.hotel_shared_room_view_form msgid "Ubication" msgstr "Ubicación" @@ -9067,7 +8735,7 @@ msgid "Unexpected Error: Can't found a f msgstr "Unexpected Error: Can't found a free room" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:1274 +#: code:addons/hotel/models/hotel_reservation.py:1272 #, python-format msgid "Unexpected error copying record. Can't split reservation!" msgstr "Ouch!. No hemos podido dividir la reserva!" @@ -9202,7 +8870,7 @@ msgid "Warning" msgstr "Aviso" #. module: hotel -#: code:addons/hotel/models/hotel_service.py:332 +#: code:addons/hotel/models/hotel_service.py:337 #, python-format msgid "Warning for %s" msgstr "Aviso para %s" @@ -9222,7 +8890,7 @@ msgstr "No podemos crear una ficha vacía" #: code:addons/hotel/wizard/wizard_reservation.py:221 #, python-format msgid "We need know the customer!" -msgstr "Necesitamos conocer el cliente!" +msgstr "Necesitamos conoces el cliente!" #. module: hotel #: code:addons/hotel/models/inherited_account_invoice.py:50 @@ -9267,7 +8935,7 @@ msgstr "Peso" #. module: hotel #: model:ir.model.fields,field_description:hotel.field_folio_advance_payment_inv_advance_payment_method msgid "What do you want to invoice?" -msgstr "Qué quieres facturar?" +msgstr "¿Qué quiere facturar?" #. module: hotel #: model:ir.model.fields,help:hotel.field_hotel_room_type_property_stock_account_input @@ -9282,16 +8950,22 @@ msgstr "Cuando se realiza una valoración de inventario en tiempo real, la contr #. module: hotel #: model:ir.ui.menu,name:hotel.menu_account_finance_xls_reports msgid "XLS Reports" -msgstr "Informe XLS" +msgstr "XLS Reports" #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:772 +#: code:addons/hotel/models/inherited_account_invoice.py:119 +#, python-format +msgid "You cannot delete an invoice after it has been validated (and received a number). You can set it back to \"Draft\" state and modify its content, then re-confirm it." +msgstr "You cannot delete an invoice after it has been validated (and received a number). You can set it back to \"Draft\" state and modify its content, then re-confirm it." + +#. module: hotel +#: code:addons/hotel/models/hotel_reservation.py:770 #, python-format msgid "You tried to change/confirm reservation with room those already reserved in this reservation period: %s " msgstr "Estás intentando cambiar/confirmar una reserva con una habitación ya reservada en este periodo: %s " #. module: hotel -#: code:addons/hotel/models/hotel_reservation.py:1174 +#: code:addons/hotel/models/hotel_reservation.py:1172 #, python-format msgid "You tried to change/confirm reservation with room those already reserved in this reservation period: %s " msgstr "Estás intentando hacer una reserva en una habitación que ya está reservada en este periódo: %s " diff --git a/hotel/models/__init__.py b/hotel/models/__init__.py index ae46acfd3..b56e8af46 100644 --- a/hotel/models/__init__.py +++ b/hotel/models/__init__.py @@ -8,6 +8,7 @@ from . import hotel_floor from . import hotel_folio from . import hotel_reservation from . import hotel_room +from . import hotel_shared_room from . import hotel_amenity from . import hotel_amenity_type from . import hotel_room_type diff --git a/hotel/models/hotel_folio.py b/hotel/models/hotel_folio.py index a121a1a96..bd7a68a2c 100644 --- a/hotel/models/hotel_folio.py +++ b/hotel/models/hotel_folio.py @@ -99,7 +99,8 @@ class HotelFolio(models.Model): default=lambda self: _('New')) client_order_ref = fields.Char(string='Customer Reference', copy=False) partner_id = fields.Many2one('res.partner', - track_visibility='onchange') + track_visibility='onchange', + ondelete='restrict',) room_lines = fields.One2many('hotel.reservation', 'folio_id', readonly=False, @@ -107,19 +108,20 @@ class HotelFolio(models.Model): help="Hotel room reservation detail.",) service_ids = fields.One2many('hotel.service', 'folio_id', - readonly=False, - states={'done': [('readonly', True)]}, - help="Hotel services detail provide to " - "customer and it will include in " - "main Invoice.") + readonly=False, + states={'done': [('readonly', True)]}, + help="Hotel services detail provide to " + "customer and it will include in " + "main Invoice.") company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env['res.company']._company_default_get('hotel.folio')) analytic_account_id = fields.Many2one('account.analytic.account', 'Analytic Account', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="The analytic account related to a folio.", copy=False) currency_id = fields.Many2one('res.currency', related='pricelist_id.currency_id', - string='Currency', readonly=True, required=True) + string='Currency', readonly=True, required=True, ondelete='restrict',) pricelist_id = fields.Many2one('product.pricelist', string='Pricelist', required=True, + ondelete='restrict', states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Pricelist for current folio.") @@ -136,10 +138,11 @@ class HotelFolio(models.Model): ('agency', 'Agencia'), ('operator', 'Tour operador'), ('virtualdoor', 'Virtual Door'),], 'Sales Channel', default='door') - user_id = fields.Many2one('res.users', string='Salesperson', index=True, + user_id = fields.Many2one('res.users', string='Salesperson', index=True, ondelete='restrict', track_visibility='onchange', default=lambda self: self.env.user) tour_operator_id = fields.Many2one('res.partner', 'Tour Operator', + ondelete='restrict', domain=[('is_tour_operator', '=', True)]) date_order = fields.Datetime( string='Order Date', @@ -245,12 +248,14 @@ class HotelFolio(models.Model): help='Margin in days to create a notice if a payment \ advance has not been recorded') segmentation_ids = fields.Many2many('res.partner.category', - string='Segmentation') + string='Segmentation', + ondelete='restrict') client_order_ref = fields.Char(string='Customer Reference', copy=False) note = fields.Text('Terms and conditions') sequence = fields.Integer(string='Sequence', default=10) team_id = fields.Many2one('crm.team', 'Sales Channel', + ondelete='restrict', change_default=True, default=_get_default_team, oldname='section_id') diff --git a/hotel/models/hotel_reservation.py b/hotel/models/hotel_reservation.py index 27ff6d72d..50d61279e 100644 --- a/hotel/models/hotel_reservation.py +++ b/hotel/models/hotel_reservation.py @@ -171,7 +171,7 @@ class HotelReservation(models.Model): name = fields.Text('Reservation Description', required=True) sequence = fields.Integer(string='Sequence', default=10) - room_id = fields.Many2one('hotel.room', string='Room') + room_id = fields.Many2one('hotel.room', string='Room', ondelete='restrict') reservation_no = fields.Char('Reservation No', size=64, readonly=True) adults = fields.Integer('Adults', size=64, readonly=False, @@ -316,8 +316,9 @@ class HotelReservation(models.Model): ], string='Invoice Status', compute='_compute_invoice_status', store=True, readonly=True, default='no') tax_ids = fields.Many2many('account.tax', - string='Taxes', - domain=['|', ('active', '=', False), ('active', '=', True)]) + string='Taxes', + ondelete='restrict', + domain=['|', ('active', '=', False), ('active', '=', True)]) qty_to_invoice = fields.Float( compute='_get_to_invoice_qty', string='To Invoice', store=True, readonly=True, digits=dp.get_precision('Product Unit of Measure')) diff --git a/hotel/models/hotel_room.py b/hotel/models/hotel_room.py index fcbf4224e..5e7501ce0 100644 --- a/hotel/models/hotel_room.py +++ b/hotel/models/hotel_room.py @@ -17,16 +17,16 @@ class HotelRoom(models.Model): active = fields.Boolean('Active', default=True) sequence = fields.Integer('Sequence', default=0) room_type_id = fields.Many2one('hotel.room.type', 'Hotel Room Type', - required=True, - ondelete='restrict') + required=True, + ondelete='restrict') floor_id = fields.Many2one('hotel.floor', 'Ubication', help='At which floor the room is located.') max_adult = fields.Integer('Max Adult') max_child = fields.Integer('Max Child') capacity = fields.Integer('Capacity') - # FIXME not used to_be_cleaned = fields.Boolean('To be Cleaned', default=False) - shared_room = fields.Boolean('Shared Room', default=False) + shared_room_id = fields.Many2one('hotel.shared.room', 'Shared Room', + default=False) description_sale = fields.Text( 'Sale Description', translate=True, help="A description of the Product that you want to communicate to " @@ -36,11 +36,36 @@ class HotelRoom(models.Model): default='0', required=True) + @api.constrains('room_type_id') + def _constrain_shared_room_type(self): + for record in self: + if record.shared_room_id: + if not record.room_type_id.shared_room: + raise ValidationError(_('We cant save normal rooms \ + in a shared room type')) + else: + if record.room_type_id.shared_room: + raise ValidationError(_('We cant save shared rooms \ + in a normal room type')) + + @api.constrains('shared_room_id') + def _constrain_shared_room(self): + for record in self: + if record.shared_room_id: + if not record.capacity > 1: + raise ValidationError(_('We cant save normal rooms \ + in a shared room type')) + @api.constrains('capacity') def _check_capacity(self): - if self.capacity < 1: - raise ValidationError(_("Room capacity can't be less than one")) + for record in self: + if record.shared_room_id and record.capacity != 1: + raise ValidationError(_("A Bed only can has capacity one")) + if record.capacity < 1: + raise ValidationError(_("Room capacity can't be less than one")) @api.multi def get_capacity(self, extra_bed=0): - return self.capacity + extra_bed + if not self.shared_room_id: + return self.capacity + extra_bed + return self.capacity diff --git a/hotel/models/hotel_room_type.py b/hotel/models/hotel_room_type.py index 0d21fd957..eb6783d0a 100644 --- a/hotel/models/hotel_room_type.py +++ b/hotel/models/hotel_room_type.py @@ -34,6 +34,8 @@ class HotelRoomType(models.Model): active = fields.Boolean('Active', default=True, help="The active field allows you to hide the \ category without removing it.") + shared_room = fields.Boolean('Shared Room', default=False, + help="This room type is reservation by beds") # Used for ordering sequence = fields.Integer('Sequence', default=0) @@ -47,7 +49,7 @@ class HotelRoomType(models.Model): _sql_constraints = [('code_unique', 'unique(code_type)', 'Room Type Code must be unique!')] - @api.depends('room_ids') + @api.depends('room_ids', 'room_ids.active') def _compute_total_rooms(self): for record in self: record.total_rooms_count = len(record.room_ids) @@ -107,6 +109,18 @@ class HotelRoomType(models.Model): }) return super().create(vals) + @api.constrains('shared_room', 'room_ids') + def _constrain_shared_room(self): + for record in self: + if record.shared_room: + if any(not room.shared_room_id for room in record.room_ids): + raise ValidationError(_('We cant save normal rooms \ + in a shared room type')) + else: + if any(room.shared_room_id for room in record.room_ids): + raise ValidationError(_('We cant save shared rooms \ + in a normal room type')) + @api.multi def unlink(self): for record in self: diff --git a/hotel/models/hotel_service.py b/hotel/models/hotel_service.py index c822e115c..23db11ef5 100644 --- a/hotel/models/hotel_service.py +++ b/hotel/models/hotel_service.py @@ -115,7 +115,8 @@ class HotelService(models.Model): name = fields.Char('Service description', required=True) sequence = fields.Integer(string='Sequence', default=10) - product_id = fields.Many2one('product.product', 'Service', required=True) + product_id = fields.Many2one('product.product', 'Service', + ondelete='restrict', required=True) folio_id = fields.Many2one('hotel.folio', 'Folio', ondelete='cascade', default=_default_folio_id) @@ -132,10 +133,11 @@ class HotelService(models.Model): product_image = fields.Binary('Product Image', related="product_id.image", store=False, related_sudo=True) company_id = fields.Many2one(related='folio_id.company_id', string='Company', store=True, readonly=True) invoice_status = fields.Selection([ - ('invoiced', 'Fully Invoiced'), - ('to invoice', 'To Invoice'), - ('no', 'Nothing to Invoice') - ], string='Invoice Status', compute='_compute_invoice_status', store=True, readonly=True, default='no') + ('invoiced', 'Fully Invoiced'), + ('to invoice', 'To Invoice'), + ('no', 'Nothing to Invoice') + ], string='Invoice Status', compute='_compute_invoice_status', + store=True, readonly=True, default='no') channel_type = fields.Selection([ ('door', 'Door'), ('mail', 'Mail'), diff --git a/hotel/models/hotel_shared_room.py b/hotel/models/hotel_shared_room.py new file mode 100644 index 000000000..5e6c49d93 --- /dev/null +++ b/hotel/models/hotel_shared_room.py @@ -0,0 +1,101 @@ +# Copyright 2017 Alexandre Díaz +# Copyright 2017 Dario Lodeiros +# Copyright 2018 Pablo Quesada +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError + + +class HotelSharedRoom(models.Model): + _name = 'hotel.shared.room' + _description = 'Hotel Shared Room' + _order = "room_type_id, name" + + name = fields.Char('Room Name', required=True) + active = fields.Boolean('Active', default=True) + room_type_id = fields.Many2one( + 'hotel.room.type', 'Hotel Room Type', + required=True, ondelete='restrict', + domain=[('shared_room', '=', True)] + ) + floor_id = fields.Many2one('hotel.floor', 'Ubication', + help='At which floor the room is located.', + ondelete='restrict',) + sequence = fields.Integer('Sequence', required=True) + beds = fields.Integer('Beds') + bed_ids = fields.One2many('hotel.room', + 'shared_room_id', + readonly=True, + ondelete='restrict',) + description_sale = fields.Text( + 'Sale Description', translate=True, + help="A description of the Product that you want to communicate to " + " your customers. This description will be copied to every Sales " + " Order, Delivery Order and Customer Invoice/Credit Note") + + @api.constrains('beds') + def _constrain_beds(self): + self.ensure_one() + if self.beds < 1: + raise ValidationError(_("Room beds can't be less than one")) + if len(self.bed_ids) > self.beds: + raise ValidationError(_( + "If you want to eliminate beds in the \ + room you must deactivate the beds from your form")) + beds = [] + inactive_beds = self.env['hotel.room'].search([ + ('active', '=', False), + ('shared_room_id', '=', self.id) + ]) + for i in range(len(self.bed_ids), self.beds): + if inactive_beds: + bed = inactive_beds[0] + bed.update({'active': True}) + inactive_beds -= bed + continue + name = u'%s (%s)' % (self.name, i) + bed_vals = { + 'name': name, + 'max_adult': 1, + 'max_child': 0, + 'capacity': 1, + 'room_type_id': self.room_type_id.id, + 'sequence': self.sequence, + 'floor_id': self.floor_id.id if self.floor_id else False, + 'shared_room_id': self.id, + } + beds.append((0, False, bed_vals)) + if beds: + self.update({ + 'bed_ids': beds + }) + + @api.constrains('active') + def _constrain_active(self): + self.bed_ids.write({ + 'active': self.active, + }) + + @api.constrains('room_type_id') + def _constrain_room_type_id(self): + self.bed_ids.write({ + 'room_type_id': self.room_type_id.id, + }) + + @api.constrains('floor_id') + def _constrain_floor_id(self): + self.bed_ids.write({ + 'floor_id': self.floor_id.id, + }) + + @api.constrains('sequence') + def _constrain_sequence(self): + self.bed_ids.write({ + 'sequence': self.sequence, + }) + + @api.constrains('descrition_sale') + def _constrain_descrition_sale(self): + self.bed_ids.write({ + 'description_sale': self.descrition_sale, + }) diff --git a/hotel/security/ir.model.access.csv b/hotel/security/ir.model.access.csv index af083d8f4..65f761c03 100644 --- a/hotel/security/ir.model.access.csv +++ b/hotel/security/ir.model.access.csv @@ -11,6 +11,7 @@ user_access_hotel_board_service,user_access_hotel_board_service,model_hotel_boar user_access_hotel_checkin_partner,user_access_hotel_checkin_partner,model_hotel_checkin_partner,hotel.group_hotel_user,1,1,1,1 user_access_hotel_room_type_class,user_access_hotel_room_type_class,model_hotel_room_type_class,hotel.group_hotel_user,1,0,0,0 user_access_hotel_room,user_access_hotel_room,model_hotel_room,hotel.group_hotel_user,1,0,0,0 +user_access_shared_hotel_room,user_access_hotel_shared_room,model_hotel_shared_room,hotel.group_hotel_user,1,0,0,0 user_access_hotel_room_type_restriction_item,user_access_hotel_room_type_restriction_item,model_hotel_room_type_restriction_item,hotel.group_hotel_user,1,0,0,0 user_access_hotel_reservation,user_access_hotel_reservation,model_hotel_reservation,hotel.group_hotel_user,1,1,1,1 user_access_hotel_folio,user_access_hotel_folio,model_hotel_folio,hotel.group_hotel_user,1,1,1,1 @@ -32,6 +33,7 @@ manager_access_hotel_board_service,manager_access_hotel_board_service,model_hote manager_access_hotel_checkin_partner,manager_access_hotel_checkin_partner,model_hotel_checkin_partner,hotel.group_hotel_manager,1,1,1,1 manager_access_hotel_room_type_class,manager_access_hotel_room_type_class,model_hotel_room_type_class,hotel.group_hotel_manager,1,1,1,1 manager_access_hotel_room,manager_access_hotel_room,model_hotel_room,hotel.group_hotel_manager,1,1,1,1 +manager_access_hotel_shared_room,manager_access_hotel_shared_room,model_hotel_shared_room,hotel.group_hotel_manager,1,1,1,1 manager_access_hotel_room_type_restriction_item,manager_access_hotel_room_type_restriction_item,model_hotel_room_type_restriction_item,hotel.group_hotel_manager,1,1,1,1 manager_access_hotel_reservation,manager_access_hotel_reservation,model_hotel_reservation,hotel.group_hotel_manager,1,1,1,1 manager_access_hotel_folio,manager_access_hotel_folio,model_hotel_folio,hotel.group_hotel_manager,1,1,1,1 @@ -52,6 +54,7 @@ call_access_hotel_board_service,call_access_hotel_board_service,model_hotel_boar call_access_hotel_checkin_partner,call_access_hotel_checkin_partner,model_hotel_checkin_partner,hotel.group_hotel_call,1,1,1,1 call_access_hotel_room_type_class,call_access_hotel_room_type_class,model_hotel_room_type_class,hotel.group_hotel_call,1,0,0,0 call_access_hotel_room,call_access_hotel_room,model_hotel_room,hotel.group_hotel_call,1,0,0,0 +call_access_hotel_shared_room,call_access_hotel_shared_room,model_hotel_shared_room,hotel.group_hotel_call,1,0,0,0 call_access_hotel_room_type_restriction_item,call_access_hotel_room_type_restriction_item,model_hotel_room_type_restriction_item,hotel.group_hotel_call,1,0,0,0 call_access_hotel_reservation,call_access_hotel_reservation,model_hotel_reservation,hotel.group_hotel_call,1,1,1,1 call_access_hotel_folio,call_access_hotel_folio,model_hotel_folio,hotel.group_hotel_call,1,1,1,1 diff --git a/hotel/views/hotel_reservation_views.xml b/hotel/views/hotel_reservation_views.xml index 0e0b223ed..cafbe4e78 100644 --- a/hotel/views/hotel_reservation_views.xml +++ b/hotel/views/hotel_reservation_views.xml @@ -395,7 +395,7 @@ OverBooking!

+ options="{'no_create': True,'no_open': True}" style="margin-right: 30px;" /> @@ -463,7 +463,7 @@ 'exit_date': checkout,'reservation_id': id, 'hidden_checkin_partner': True, 'edit_checkin_partner': True }" attrs="{'invisible':['|','|', ('state','not in',('confirm','booking')),('checkin_partner_pending_count','=', 0),('parent_reservation','!=',False)]}" /> - + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + hotel.shared.room.kanban + hotel.shared.room + kanban + + + false + + + + +
+
+
    +
  • + +
  • +
  • Room Type:
  • +
  • + Beds +
  • +
+
+
+
+
+
+
+
+ + + + hotel.shared.room.search + hotel.shared.room + + + + + + + + + + + + hotel.shared.room.tree + hotel.shared.room + + + + + + + + + + + + + + Hotel Shared Room + hotel.shared.room + form + + + kanban,tree,form + + + + + diff --git a/hotel_calendar/models/inherited_hotel_reservation.py b/hotel_calendar/models/inherited_hotel_reservation.py index 234697d86..7fa767d11 100644 --- a/hotel_calendar/models/inherited_hotel_reservation.py +++ b/hotel_calendar/models/inherited_hotel_reservation.py @@ -141,7 +141,7 @@ class HotelReservation(models.Model): 'capacity': room.capacity, 'class_name': room.room_type_id.class_id.name, 'class_id': room.room_type_id.class_id.id, - 'shared': room.shared_room, + 'shared_id': room.shared_room_id, 'price': room.room_type_id and ['pricelist', room.room_type_id.id, pricelist_id, room.room_type_id.name] or 0, diff --git a/hotel_channel_connector/models/hotel_reservation/common.py b/hotel_channel_connector/models/hotel_reservation/common.py index 68bcd5302..df87bd51f 100644 --- a/hotel_channel_connector/models/hotel_reservation/common.py +++ b/hotel_channel_connector/models/hotel_reservation/common.py @@ -188,7 +188,7 @@ class HotelReservation(models.Model): @api.model def create(self, vals): from_channel = False - if 'channel_bind_ids' in vals and vals.get('channel_bind_ids')[0][2] and \ + if vals.get('channel_bind_ids') and vals.get('channel_bind_ids')[0][2] and \ vals.get('channel_bind_ids')[0][2].get('external_id') is not None: vals.update({'preconfirm': False}) from_channel = True diff --git a/hotel_channel_connector/models/hotel_room_type/common.py b/hotel_channel_connector/models/hotel_room_type/common.py index 629988c64..8c5b6224a 100644 --- a/hotel_channel_connector/models/hotel_room_type/common.py +++ b/hotel_channel_connector/models/hotel_room_type/common.py @@ -31,8 +31,8 @@ class ChannelHotelRoomType(models.Model): string='Room Type', required=True, ondelete='cascade') - channel_short_code = fields.Char("Channel Short Code", old_name='wscode') - ota_capacity = fields.Integer("OTA's Capacity", default=1, old_name='wcapacity', + channel_short_code = fields.Char("Channel Short Code") + ota_capacity = fields.Integer("OTA's Capacity", default=1, help="The capacity of the room for OTAs.") default_quota = fields.Integer("Default Quota", @@ -52,8 +52,8 @@ class ChannelHotelRoomType(models.Model): max_price = fields.Float('Max. Price', default=200.0, digits=dp.get_precision('Product Price'), help="Setup the max price to prevent incidents while editing your prices.") - @api.onchange('default_quota', 'default_max_avail') - def _onchange_availability(self): + @api.constrains('default_quota', 'default_max_avail', 'total_rooms_count') + def _constrains_availability(self): for rec in self: to_eval = [] to_eval.append(rec.total_rooms_count) @@ -64,8 +64,8 @@ class ChannelHotelRoomType(models.Model): rec.default_availability = min(to_eval) - @api.onchange('room_ids') - def _get_capacity(self): + @api.constrains('room_ids') + def _constrain_capacity(self): for rec in self: rec.ota_capacity = rec.odoo_id.get_capacity() diff --git a/hotel_channel_connector_wubook/models/channel_backend/common.py b/hotel_channel_connector_wubook/models/channel_backend/common.py index 3c3197d30..db7f59134 100644 --- a/hotel_channel_connector_wubook/models/channel_backend/common.py +++ b/hotel_channel_connector_wubook/models/channel_backend/common.py @@ -22,10 +22,16 @@ class ChannelBackend(models.Model): def _get_default_server(self): return 'https://wired.wubook.net/xrws/' + def _get_default_wubook_parity(self): + return self.env['ir.default'].sudo().get('res.config.settings', 'default_pricelist_id') + lcode = fields.Char('Channel Service lcode') pkey = fields.Char('Channel Service PKey') server = fields.Char('Channel Service Server', default=_get_default_server) + wubook_parity_pricelist_id = fields.Many2one('product.pricelist', 'WuBook Parity Pricelist', + required=True, + default=_get_default_wubook_parity) @contextmanager @api.multi diff --git a/hotel_channel_connector_wubook/models/hotel_reservation/importer.py b/hotel_channel_connector_wubook/models/hotel_reservation/importer.py index e05277326..a653d0614 100644 --- a/hotel_channel_connector_wubook/models/hotel_reservation/importer.py +++ b/hotel_channel_connector_wubook/models/hotel_reservation/importer.py @@ -121,6 +121,8 @@ class HotelReservationImporter(Component): if 'tax_inclusive' in broom['ancillary'] and not broom['ancillary']['tax_inclusive']: _logger.info("--- Incoming Reservation without taxes included!") tax_inclusive = False + # rate_id ( 0: WuBook Parity (aka standard rate); > 0: the id of the booked pricing plan) + rate_id = 0 # Generate Reservation Day Lines reservation_lines = [] tprice = 0.0 @@ -141,6 +143,16 @@ class HotelReservationImporter(Component): 'price': room_day_price, })) tprice += room_day_price + rate_id = brday['rate_id'] + # TODO: Review different pricelist in the different booked rooms (folio in Odoo) + if rate_id > 0: + rate_id = self.env['channel.product.pricelist'].search( + 'external_id', '=', rate_id).odoo_id.id + if rate_id <= 0: + rate_id = self.env['channel.backend'].sudo().search([ + ('id', '=', self.backend_record.id) + ]).wubook_parity_pricelist_id.id + # Get OTA ota_id = self.env['channel.ota.info'].search([ ('backend_id', '=', self.backend_record.id), @@ -163,6 +175,7 @@ class HotelReservationImporter(Component): 'checkout': checkout_str, 'adults': persons, 'children': book['children'], + 'pricelist_id': rate_id, 'reservation_line_ids': reservation_lines, 'to_assign': True, 'state': is_cancellation and 'cancelled' or 'confirm', diff --git a/hotel_channel_connector_wubook/views/inherited_channel_connector_backend_views.xml b/hotel_channel_connector_wubook/views/inherited_channel_connector_backend_views.xml index 4014bed20..b21995300 100644 --- a/hotel_channel_connector_wubook/views/inherited_channel_connector_backend_views.xml +++ b/hotel_channel_connector_wubook/views/inherited_channel_connector_backend_views.xml @@ -9,6 +9,15 @@ + + + + + + + + + diff --git a/hotel_data_bi/README.rst b/hotel_data_bi/README.rst new file mode 100644 index 000000000..accc16833 --- /dev/null +++ b/hotel_data_bi/README.rst @@ -0,0 +1,74 @@ +REVENUE EXPORTER +============= + +Export Odoo data for Revenue MyDataBI + +Usage +======= +To use this module, you need to: + +Create a user and give the "Hotel Management / Export data BI" permission. + +To connect to Odoo via xmlrpc there are examples in https://www.odoo.com/documentation/10.0/api_integration.html in the "Calling methods" section with examples in several languages. + +A python example: +import xmlrpclib + +url = 'https://www.example.org' + +username = 'username@example.org' + +password = '123passwordexample' + +db = 'example_db_name' + +common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(url)) + +uid = common.authenticate(db, username, password, {}) + +models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(url)) + +models.execute_kw(db, uid, password,'data_bi','export_data_bi', [ 8, '2018-01-01']) + +In the parameters of export_data_bi: + +archivo == 1 'Tarifa' + +archivo == 2 'Canal' + +archivo == 3 'Hotel' + +archivo == 4 'Pais' + +archivo == 5 'Regimen' + +archivo == 6 'Reservas' + +archivo == 7 'Capacidad' + +archivo == 8 'Tipo Habitación' + +archivo == 9 'Budget' + +archivo == 10 'Bloqueos' + +archivo == 11 'Motivo Bloqueo' + +archivo == 12 'Segmentos' + +archivo == 13 'Clientes' + +archivo == 14 'Estado Reservas' + +fechafoto = start date to take data + +in the example recive 8 'Tipo Habitación' from '2018-01-01' + + +Credits +======= + +Creator +------------ + +* Jose Luis Algara (Alda hotels) diff --git a/hotel_data_bi/__init__.py b/hotel_data_bi/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/hotel_data_bi/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/hotel_data_bi/__manifest__.py b/hotel_data_bi/__manifest__.py new file mode 100644 index 000000000..2b398871e --- /dev/null +++ b/hotel_data_bi/__manifest__.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Copyright 2018-2019 Jose Luis Algara Toledo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Hotel Data Bi', + 'description': """ + Export hotel data for business intelligence + + To use this module you need to: + + Create a user and give the 'Hotel Management/Export data BI' permission. + """, + 'summary': "Export hotel data for business intelligence", + 'version': '2.0', + 'license': 'AGPL-3', + 'author': "Jose Luis Algara (Alda hotels) ", + 'website': 'www.aldahotels.com', + 'depends': ['hotel', 'hotel_l10n_es', 'hotel_channel_connector'], + 'category': 'hotel/revenue', + 'data': [ + 'views/budget.xml', + 'views/inherit_res_company.xml', + 'security/data_bi.xml', + 'security/ir.model.access.csv', + ], + 'demo': [ + ], + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/hotel_data_bi/models/__init__.py b/hotel_data_bi/models/__init__.py new file mode 100644 index 000000000..1de849e11 --- /dev/null +++ b/hotel_data_bi/models/__init__.py @@ -0,0 +1,3 @@ +from . import inherit_res_company +from . import budget +from . import data_bi diff --git a/hotel_data_bi/models/budget.py b/hotel_data_bi/models/budget.py new file mode 100644 index 000000000..b184fbad4 --- /dev/null +++ b/hotel_data_bi/models/budget.py @@ -0,0 +1,48 @@ +# Copyright 2019 Jose Luis Algara (Alda hotels) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from datetime import date + + +def get_years(): + """Return a year list, to select in year field.""" + year_list = [] + for i in range(2018, 2036): + year_list.append((i, str(i))) + return year_list + + +class Budget(models.Model): + """Establish and save the budget for DataBI control by revenue""" + + _name = 'budget' + + # fecha Primer día del mes + month = fields.Selection([(1, 'January'), (2, 'February'), (3, 'March'), + (4, 'April'), (5, 'May'), (6, 'June'), + (7, 'July'), (8, 'August'), (9, 'September'), + (10, 'October'), (11, 'November'), + (12, 'December'), ], + string='Month', required=True) + year = fields.Selection(get_years(), string='Year', required=True) + room_nights = fields.Float("Room Nights", required=True, digits=(6, 2)) + # Número de Room Nights + room_revenue = fields.Float("Room Revenue", required=True, digits=(6, 2)) + # Ingresos por Reservas + estancias = fields.Integer("Number of Stays") # Número de Estancias + # ID_Tarifa numérico Código de la Tarifa + # ID_Canal numérico Código del Canal + # ID_Pais numérico Código del País + # ID_Regimen numérico Cóigo del Régimen + # ID_Tipo_Habitacion numérico Código del Tipo de Habitación + # iD_Segmento numérico Código del Segmento + # ID_Cliente numérico Código del Cliente + # Pension_Revenue numérico con dos decimales Ingresos por Pensión + + @api.model + def export_data_bi(self, + archivo=False, + fechafoto=date.today().strftime('%Y-%m-%d')): + apidata = self.env['data_bi'] + return apidata.export_data_bi(self) diff --git a/hotel_data_bi/models/data_bi.py b/hotel_data_bi/models/data_bi.py new file mode 100644 index 000000000..bd7ce8ec4 --- /dev/null +++ b/hotel_data_bi/models/data_bi.py @@ -0,0 +1,548 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2018 -2019 Alda Hotels +# Jose Luis Algara +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp import models, api, _ +from datetime import date, datetime, timedelta +import json +import logging +_logger = logging.getLogger(__name__) + + +def inv_percent(amount, percent): + """Return the amount to which a percentage was applied.""" + return round(amount*(100/float(100-percent)) - amount, 2) + + +class Data_Bi(models.Model): + """Management and export data for MopSolution MyDataBI.""" + + _name = 'data_bi' + + @api.model + def export_data_bi(self, + archivo=False, + fechafoto=date.today().strftime('%Y-%m-%d')): + u"""Prepare a Json Objet to export data for MyDataBI. + + Generate a dicctionary to by send in JSON + archivo = response file type + archivo == 0 'ALL' + archivo == 1 'Tarifa' + archivo == 2 'Canal' + archivo == 3 'Hotel' + archivo == 4 'Pais' + archivo == 5 'Regimen' + archivo == 6 'Reservas' + archivo == 7 'Capacidad' + archivo == 8 'Tipo Habitación' + archivo == 9 'Budget' + archivo == 10 'Bloqueos' + archivo == 11 'Motivo Bloqueo' + archivo == 12 'Segmentos' + archivo == 13 'Clientes' + archivo == 14 'Estado Reservas' + fechafoto = start date to take data + """ + + if type(fechafoto) is dict: + fechafoto = date.today() + else: + fechafoto = datetime.strptime(fechafoto, '%Y-%m-%d').date() + + _logger.warning("Init Export Data_Bi Module") + if not isinstance(archivo, int): + archivo = 0 + dic_param = [] + dic_param.append({'Archivo': archivo, + 'Fechafoto': fechafoto.strftime('%Y-%m-%d')}) + compan = self.env.user.company_id + limit_ago = (fechafoto - timedelta( + days=self.env.user.company_id.data_bi_days)).strftime('%Y-%m-%d') + + dic_export = [] # Diccionario con todo lo necesario para exportar. + if (archivo == 0) or (archivo == 7) or (archivo == 8): + room_types = self.env['hotel.room.type'].search([]) + if (archivo == 0) or (archivo == 10) or (archivo == 6): + line_res = self.env['hotel.reservation.line'].search( + [('date', '>=', limit_ago)], order="id") + estado_array = ['draft', 'confirm', 'booking', 'done', 'cancelled'] + + if (archivo == 0) or (archivo == 1): + dic_tarifa = self.data_bi_tarifa(compan.id_hotel) + dic_export.append({'Tarifa': dic_tarifa}) + if (archivo == 0) or (archivo == 2): + dic_canal = self.data_bi_canal(compan.id_hotel) + dic_export.append({'Canal': dic_canal}) + if (archivo == 0) or (archivo == 3): + dic_hotel = self.data_bi_hotel(compan) + dic_export.append({'Hotel': dic_hotel}) + if (archivo == 0) or (archivo == 4): + dic_pais = self.data_bi_pais(compan.id_hotel) + dic_export.append({'Pais': dic_pais}) + if (archivo == 0) or (archivo == 5): + dic_regimen = self.data_bi_regimen(compan.id_hotel) + dic_export.append({'Regimen': dic_regimen}) + if (archivo == 0) or (archivo == 7): + dic_capacidad = self.data_bi_capacidad(compan.id_hotel, room_types) + dic_export.append({'Capacidad': dic_capacidad}) + if (archivo == 0) or (archivo == 8): + dic_tipo_habitacion = self.data_bi_habitacione(compan.id_hotel, + room_types) + dic_export.append({'Tipo Habitación': dic_tipo_habitacion}) + if (archivo == 0) or (archivo == 9): + dic_budget = self.data_bi_budget(compan.id_hotel) + dic_export.append({'Budget': dic_budget}) + if (archivo == 0) or (archivo == 10): + dic_bloqueos = self.data_bi_bloqueos(compan.id_hotel, line_res) + dic_export.append({'Bloqueos': dic_bloqueos}) + if (archivo == 0) or (archivo == 11): + dic_moti_bloq = self.data_bi_moti_bloq(compan.id_hotel) + dic_export.append({'Motivo Bloqueo': dic_moti_bloq}) + if (archivo == 0) or (archivo == 12): + dic_segmentos = self.data_bi_segment(compan.id_hotel) + dic_export.append({'Segmentos': dic_segmentos}) + if (archivo == 0) or (archivo == 13) or (archivo == 6): + dic_clientes = self.data_bi_client(compan.id_hotel) + dic_export.append({'Clientes': dic_clientes}) + if (archivo == 0) or (archivo == 14): + dic_estados = self.data_bi_estados(compan.id_hotel, estado_array) + dic_export.append({'Estado Reservas': dic_estados}) + if (archivo == 0) or (archivo == 6): + dic_reservas = self.data_bi_reservas(compan.id_hotel, + line_res, + estado_array, + dic_clientes) + dic_export.append({'Reservas': dic_reservas}) + + dictionaryToJson = json.dumps(dic_export) + _logger.warning("End Export Data_Bi Module to Json") + # Debug Stop ------------------- + # import wdb; wdb.set_trace() + # Debug Stop ------------------- + + return dictionaryToJson + + @api.model + def data_bi_tarifa(self, compan): + _logger.info("DataBi: Calculating all fees") + dic_tarifa = [] # Diccionario con las tarifas + tarifas = self.env['product.pricelist'].search_read([], ['name']) + for tarifa in tarifas: + dic_tarifa.append({'ID_Hotel': compan, + 'ID_Tarifa': tarifa['id'], + 'Descripcion': tarifa['name']}) + return dic_tarifa + + @api.model + def data_bi_canal(self, compan): + _logger.info("DataBi: Calculating all channels") + dic_canal = [] # Diccionario con los Canales + canal_array = ['Puerta', 'Mail', 'Telefono', 'Call Center', 'Web', + 'Agencia', 'Touroperador', 'Virtual Door'] + for i in range(0, len(canal_array)): + dic_canal.append({'ID_Hotel': compan, + 'ID_Canal': i, + 'Descripcion': canal_array[i]}) + return dic_canal + + @api.model + def data_bi_hotel(self, compan): + _logger.info("DataBi: Calculating hotel names") + dic_hotel = [] # Diccionario con el/los nombre de los hoteles + dic_hotel.append({'ID_Hotel': compan.id_hotel, + 'Descripcion': compan.property_name}) + return dic_hotel + + @api.model + def data_bi_pais(self, compan): + _logger.info("DataBi: Calculating all countries") + dic_pais = [] + # Diccionario con los nombre de los Paises usando los del INE + paises = self.env['code.ine'].search_read([], ['code', 'name']) + for pais in paises: + dic_pais.append({'ID_Hotel': compan, + 'ID_Pais': pais['code'], + 'Descripcion': pais['name']}) + return dic_pais + + @api.model + def data_bi_regimen(self, compan): + _logger.info("DataBi: Calculating all board services") + dic_regimen = [] # Diccionario con los Board Services + board_services = self.env['hotel.board.service'].search_read([]) + dic_regimen.append({'ID_Hotel': compan, + 'ID_Regimen': 0, + 'Descripcion': 'Sin régimen'}) + for board_service in board_services: + dic_regimen.append({'ID_Hotel': compan, + 'ID_Regimen': board_service['id'], + 'Descripcion': board_service['name']}) + return dic_regimen + + @api.model + def data_bi_estados(self, compan, estado_array): + _logger.info("DataBi: Calculating all the states of the reserves") + dic_estados = [] # Diccionario con los Estados Reserva + estado_array_txt = ['Borrador', 'Confirmada', 'Hospedandose', + 'Checkout', 'Cancelada'] + # estado_array = ['draft', 'confirm', 'booking', 'done', 'cancelled'] + for i in range(0, len(estado_array)): + dic_estados.append({'ID_Hotel': compan, + 'ID_EstadoReserva': i, + 'Descripcion': estado_array_txt[i]}) + return dic_estados + + @api.model + def data_bi_habitacione(self, compan, rooms): + _logger.info("DataBi: Calculating all room types") + dic_tipo_habitacion = [] # Diccionario con Rooms types + for room in rooms: + dic_tipo_habitacion.append({ + 'ID_Hotel': compan, + 'ID_Tipo_Habitacion': room['id'], + 'Descripcion': room['name'], + 'Estancias': room['capacity']}) + return dic_tipo_habitacion + + @api.model + def data_bi_capacidad(self, compan, rooms): + _logger.info("DataBi: Calculating all the capacitys") + dic_capacidad = [] # Diccionario con las capacidades + for room in rooms: + dic_capacidad.append({ + 'ID_Hotel': compan, + 'Hasta_Fecha': + (date.today() + timedelta(days=365 * 3)).strftime("%Y-%m-%d"), + 'ID_Tipo_Habitacion': room['id'], + 'Nro_Habitaciones': room['total_rooms_count']}) + return dic_capacidad + + @api.model + def data_bi_budget(self, compan): + _logger.info("DataBi: Calculating budget") + budgets = self.env['budget'].search([]) + dic_budget = [] # Diccionario con las previsiones Budget + for budget in budgets: + dic_budget.append({'ID_Hotel': compan, + 'Fecha': str(budget.year) + '-' + + str(budget.month).zfill(2) + '-01', + # 'ID_Tarifa': 0, + # 'ID_Canal': 0, + # 'ID_Pais': 0, + # 'ID_Regimen': 0, + # 'ID_Tipo_Habitacion': 0, + # 'ID_Cliente': 0, + 'Room_Nights': budget.room_nights, + 'Room_Revenue': budget.room_revenue, + # 'Pension_Revenue': 0, + 'Estancias': budget.estancias}) + # Fecha fecha Primer día del mes + # ID_Tarifa numérico Código de la Tarifa + # ID_Canal numérico Código del Canal + # ID_Pais numérico Código del País + # ID_Regimen numérico Cóigo del Régimen + # ID_Tipo_Habitacion numérico Código del Tipo de Habitación + # iD_Segmento numérico Código del Segmento + # ID_Cliente numérico Código del Cliente + # Pension_Revenue numérico con dos decimales Ingresos por Pensión + return dic_budget + + @api.model + def data_bi_moti_bloq(self, compan): + _logger.info("DataBi: Calculating all blocking reasons") + dic_moti_bloq = [] # Diccionario con Motivo de Bloqueos + bloqeo_array = ['Staff', _('Out of Service')] + for i in range(0, len(bloqeo_array)): + dic_moti_bloq.append({'ID_Hotel': compan, + 'ID_Motivo_Bloqueo': i, + 'Descripcion': bloqeo_array[i]}) + return dic_moti_bloq + + @api.model + def data_bi_segment(self, compan): + _logger.info("DataBi: Calculating all the segmentations") + dic_segmentos = [] # Diccionario con Segmentación + lineas = self.env['res.partner.category'].search([]) + for linea in lineas: + if linea.parent_id.name: + seg_desc = linea.parent_id.name + " / " + linea.name + dic_segmentos.append({'ID_Hotel': compan, + 'ID_Segmento': linea.id, + 'Descripcion': seg_desc}) + return dic_segmentos + + @api.model + def data_bi_client(self, compan): + dic_clientes = [] # Diccionario con Clientes (OTAs y agencias) + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 0, + 'Descripcion': u'Ninguno'}) + lineas = self.env['channel.ota.info'].search([]) + + for linea in lineas: + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': linea.id, + 'Descripcion': linea.name}) + + lineas = self.env['res.partner'].search([('is_tour_operator', + '=', True)]) + id_cli_count = 700 + for linea in lineas: + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': id_cli_count, + 'Descripcion': linea.name}) + id_cli_count += 1 + + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 999, + 'Descripcion': u'Web Propia'}) + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 901, + 'Descripcion': u'Expedia Empaquedata'}) + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 902, + 'Descripcion': u'Expedia Sin Comisión'}) + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 903, + 'Descripcion': u'Puerta'}) + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 904, + 'Descripcion': u'E-Mail'}) + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 905, + 'Descripcion': u'Teléfono'}) + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 906, + 'Descripcion': u'Call-Center'}) + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 907, + 'Descripcion': u'Agencia'}) + dic_clientes.append({'ID_Hotel': compan, + 'ID_Cliente': 908, + 'Descripcion': u'Touroperador'}) + return dic_clientes + + @api.model + def data_bi_bloqueos(self, compan, lines): + _logger.info("DataBi: Calculating all reservations blocked") + dic_bloqueos = [] # Diccionario con Bloqueos + lines = lines.filtered( + lambda n: (n.reservation_id.reservation_type != 'normal') and ( + n.reservation_id.state != 'cancelled')) + for line in lines: + # if linea.reservation_id.state != 'cancelled': + if line.reservation_id.reservation_type == 'out': + id_m_b = 1 + else: + id_m_b = 0 + dic_bloqueos.append({ + 'ID_Hotel': compan, + 'Fecha_desde': line.date, + 'Fecha_hasta': (datetime.strptime(line.date, "%Y-%m-%d") + + timedelta(days=1)).strftime("%Y-%m-%d"), + 'ID_Tipo_Habitacion': line.reservation_id.room_type_id.id, + 'ID_Motivo_Bloqueo': id_m_b, + 'Nro_Habitaciones': 1}) + return dic_bloqueos + + @api.model + def data_bi_reservas(self, compan, lineas, estado_array, dic_clientes): + dic_reservas = [] + lineas = lineas.filtered( + lambda n: (n.reservation_id.reservation_type == 'normal') and ( + n.price > 0)) + channels = {'door': 0, + 'mail': 1, + 'phone': 2, + 'call': 3, + 'web': 4, + 'agency': 5, + 'operator': 6, + 'virtualdoor': 7} + + for linea in lineas: + id_segmen = 0 + if len(linea.reservation_id.segmentation_ids) > 0: + id_segmen = linea.reservation_id.segmentation_ids[0].id + elif len(linea.reservation_id.partner_id.category_id) > 0: + id_segmen = ( + linea.reservation_id.partner_id.category_id[0].id) + precio_neto = linea.price + precio_dto = 0 + precio_iva = 0 + precio_comision = 0 + + if linea.reservation_id.ota_id.id: + ota_prices = self.data_bi_comisiones_ota(linea) + precio_neto = ota_prices[0]['precio_neto'] + precio_dto = ota_prices[0]['precio_dto'] + precio_iva = ota_prices[0]['precio_iva'] + precio_comision = ota_prices[0]['precio_comision'] + + # if linea.reservation_id.id == 6742: + # # # Debug Stop ------------------- + # import wdb; wdb.set_trace() + # # # Debug Stop ------------------- + if linea.reservation_id.discount != 0: + precio_dto = linea.price * ( + linea.reservation_id.discount/100) + + dic_reservas.append({ + 'ID_Reserva': linea.reservation_id.folio_id.name, + 'ID_Hotel': compan, + 'ID_EstadoReserva': estado_array.index( + linea.reservation_id.state), + 'FechaVenta': linea.reservation_id.create_date[0:10], + 'ID_Segmento': id_segmen, + # 'ID_Cliente': channel_c, + 'ID_Canal': channels[linea.reservation_id.channel_type], + 'FechaExtraccion': date.today().strftime('%Y-%m-%d'), + 'Entrada': linea.date, + 'Salida': (datetime.strptime(linea.date, "%Y-%m-%d") + + timedelta(days=1)).strftime("%Y-%m-%d"), + 'Noches': 1, + 'ID_TipoHabitacion': linea.reservation_id.room_type_id.id, + 'ID_HabitacionDuerme': + linea.reservation_id.room_id.room_type_id.id, + 'ID_Regimen': 0, + 'Adultos': linea.reservation_id.adults, + 'Menores': linea.reservation_id.children, + 'Cunas': 0, + 'PrecioDiario': precio_neto, + 'PrecioComision': precio_comision, + 'PrecioIva': precio_iva, + 'PrecioDto': precio_dto, + 'ID_Tarifa': linea.reservation_id.pricelist_id.id, + # 'ID_Pais': id_codeine + }) + # ID_Reserva numérico Código único de la reserva + # ID_Hotel numérico Código del Hotel + # ID_EstadoReserva numérico Código del estado de la reserva + # FechaVenta fecha Fecha de la venta de la reserva + # ID_Segmento numérico Código del Segmento de la reserva + # ID_Cliente Numérico Código del Cliente de la reserva + # ID_Canal numérico Código del Canal + # FechaExtraccion fecha Fecha de la extracción de los datos (Foto) + # Entrada fecha Fecha de entrada + # Salida fecha Fecha de salida + # Noches numérico Nro. de noches de la reserva + # ID_TipoHabitacion numérico Código del Tipo de Habitación + # ID_Regimen numérico Código del Tipo de Régimen + # Adultos numérico Nro. de adultos + # Menores numérico Nro. de menores + # Cunas numérico Nro. de cunas + # PrecioDiario numérico con 2 decimales Precio por noche de la reserva + # ID_Tarifa numérico Código de la tarifa aplicada a la reserva + # ID_Pais numérico Código del país + return dic_reservas + + @api.model + def data_bi_comisiones_ota(self, reserva): + response_dic = [] + precio_neto = reserva.price + precio_comision = 0 + precio_iva = 0 + precio_dto = 0 + if reserva.reservation_id.ota_id.ota_id == "2": + # Booking. 15% comision + precio_comision = (precio_neto*15/100) + precio_neto -= precio_comision + precio_iva = (precio_neto*10/100) + precio_neto -= precio_iva + + if reserva.reservation_id.ota_id.ota_id == "9": + # Hotelbeds 20% comision + precio_comision = (precio_neto*20/100) + precio_neto -= precio_comision + precio_iva = (precio_neto*10/100) + precio_neto -= precio_iva + + if reserva.reservation_id.ota_id.ota_id == "11": + # HRS 20% comision + precio_comision = (precio_neto*20/100) + precio_neto -= precio_comision + precio_iva = (precio_neto*10/100) + precio_neto -= precio_iva + + if reserva.reservation_id.ota_id.ota_id == "1": + # Expedia. + precio_comision = (precio_neto*15/100) + precio_neto -= precio_comision + precio_iva = (precio_neto*10/100) + precio_neto -= precio_iva + data = json.loads( + reserva.reservation_id.channel_bind_ids.channel_raw_data) + + jsonBooked = data['booked_rooms'][0] + if jsonBooked.get('ancillary').get( + 'channel_rate_name') is not None: + jsonRate = jsonBooked.get('ancillary').get( + 'channel_rate_name') + # _logger.warning("EXPEDIA ancillary : %s - %s", + # jsonRate, reserva.id) + + elif jsonBooked.get('roomdays')[0].get( + 'ancillary').get( + 'channel_rate_name') is not None: + jsonRate = jsonBooked.get( + 'roomdays')[0].get( + 'ancillary').get('channel_rate_name') + # _logger.warning("EXPEDIA roomdays : %s - %s", + # jsonRate, reserva.id) + + else: + _logger.critical( + "EXPEDIA Tarifa No Contemplada : " + + jsonBooked) + + jsonRefundable = jsonRate.upper().find('REFUNDABLE') + # _logger.warning("EXPEDIA Tarifa : %s", jsonRate) + # _logger.warning("EXPEDIA Tarifa : %s y %s", + # jsonRate, str(jsonRefundable)) + + # 10 % Iva + precio_iva = round((precio_neto-(precio_neto/1.1)), 2) + # 18 % comision ? + precio_comision = inv_percent( + precio_neto, self.env.user.company_id.expedia_rate) + precio_neto += precio_comision + # 3% Refundable ? + if jsonRefundable >= 0: + precio_dto = inv_percent(precio_neto, 3) + precio_neto += precio_dto + # _logger.warning("ODOO: %s , precio_neto: %s , precio_comision: \ + # %s , precio_iva: %s , precio_dto: %s", reserva.price, + # precio_neto, precio_comision, precio_iva, + # precio_dto) + + response_dic.append({'ota': reserva.reservation_id.ota_id.id, + 'ota_id': reserva.reservation_id.ota_id.ota_id, + 'precio_odoo': reserva.price, + 'precio_neto': precio_neto, + 'precio_comision': precio_comision, + 'precio_iva': precio_iva, + 'precio_dto': precio_dto, + }) + return response_dic + + # # Debug Stop ------------------- + # import wdb; wdb.set_trace() + # # Debug Stop ------------------- diff --git a/hotel_data_bi/models/inherit_res_company.py b/hotel_data_bi/models/inherit_res_company.py new file mode 100644 index 000000000..303bf541a --- /dev/null +++ b/hotel_data_bi/models/inherit_res_company.py @@ -0,0 +1,24 @@ +# Copyright 2019 Jose Luis Algara (Alda hotels) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class Inherit_res_company(models.Model): + _inherit = 'res.company' + + id_hotel = fields.Integer( + 'Unique ID for DataBI', default=0, + help='It must be unique to be able to identify the hotel, \ + within a hotel group.') + expedia_rate = fields.Integer( + 'Expedia Rate DataBI', + default=18, required=True, digits=(2), + help='It is the commission percentage negotiated with the \ + Expedia company, expressed with two digits. \ + Example: 18 = 18% commission.') + data_bi_days = fields.Integer( + 'Days to download', + default=60, required=True, digits=(3), + help='Number of days, which are downloaded data, \ + backwards, by default are 60 days to download.') diff --git a/hotel_data_bi/security/data_bi.xml b/hotel_data_bi/security/data_bi.xml new file mode 100644 index 000000000..521038794 --- /dev/null +++ b/hotel_data_bi/security/data_bi.xml @@ -0,0 +1,10 @@ + + + + + + + Hotel Management / Export data BI + + + diff --git a/hotel_data_bi/security/ir.model.access.csv b/hotel_data_bi/security/ir.model.access.csv new file mode 100644 index 000000000..99a2df307 --- /dev/null +++ b/hotel_data_bi/security/ir.model.access.csv @@ -0,0 +1,14 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +ir_model_hotel_budget,hoteldatabi.budget.manager,hotel_data_bi.model_budget,hotel.group_hotel_manager,1,1,1,1 +ir_model_hotel_budget_user,hoteldatabi.budget.user,hotel_data_bi.model_budget,hotel.group_hotel_user,0,0,0,0 +ir_model_hotel_data_bi_export_data,hoteldatabi.data_bi.export_data,hotel_data_bi.model_data_bi,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_room_type,hoteldatabi.hotel_room_type,hotel.model_hotel_room_type,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_hotel_reservation_line,hoteldatabi.hotel_reservation_line,hotel.model_hotel_reservation_line,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_hotel_reservation,hoteldatabi.hotel_reservation,hotel.model_hotel_reservation,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_hotel_board_service,hoteldatabi.hotel_board_service,hotel.model_hotel_board_service,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_code_ine,hoteldatabi.code_ine,hotel_l10n_es.model_code_ine,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_budget ,hoteldatabi.budget,hotel_data_bi.model_budget,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_channel_ota_info,hoteldatabi.channel_ota_info,hotel_channel_connector.model_channel_ota_info,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_hotel_folio,hoteldatabi.hotel_folio,hotel.model_hotel_folio,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_hotel_room,hoteldatabi.hotel_room,hotel.model_hotel_room,hotel_data_bi.group_hotel_export_data,1,0,0,0 +access_channel_hotel_reservation,hoteldatabi.channel_hotel_reservation,hotel_channel_connector.model_channel_hotel_reservation,hotel_data_bi.group_hotel_export_data,1,0,0,0 diff --git a/hotel_data_bi/static/description/icon.png b/hotel_data_bi/static/description/icon.png new file mode 100644 index 000000000..0ad91d0d3 Binary files /dev/null and b/hotel_data_bi/static/description/icon.png differ diff --git a/hotel_data_bi/views/budget.xml b/hotel_data_bi/views/budget.xml new file mode 100644 index 000000000..6c380fb6b --- /dev/null +++ b/hotel_data_bi/views/budget.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + budget.form (in hotel_data_bi) + budget + +
+ + + + +
+
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + budget.tree (in hotel_data_bi) + budget + + + + + + + + + + + +
diff --git a/hotel_data_bi/views/inherit_res_company.xml b/hotel_data_bi/views/inherit_res_company.xml new file mode 100644 index 000000000..05b3865ab --- /dev/null +++ b/hotel_data_bi/views/inherit_res_company.xml @@ -0,0 +1,23 @@ + + + + + + + + databi.config.view_company_form + res.company + + + + + + + + + + + + + + diff --git a/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml b/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml index b263b170b..853dd6c65 100755 --- a/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml +++ b/hotel_l10n_es/views/inherit_hotel_checkin_partner_views.xml @@ -69,42 +69,19 @@ + ]}" /> + ]}" /> - - - - - + ]}" /> + + + + + {"no_create": True}