Merge branch 'master' into resource_calendar_improvement

This commit is contained in:
Fabien BOURGEOIS 2018-03-26 18:51:52 +02:00
commit 00d2eccf74
19 changed files with 981 additions and 22 deletions

View File

@ -159,7 +159,7 @@ msgstr "Membres de la famille"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_form
msgid "Family form"
msgstr "Family form"
msgstr "Fiche Famille"
#. module: golem_family
#: model:ir.ui.view,arch_db:golem_family.golem_family_form

View File

@ -18,7 +18,7 @@
{
'name': 'GOLEM non-profit membership handling',
'summary': 'Extends Odoo membership',
'version': '10.0.1.1.2',
'version': '10.0.1.1.3',
'category': 'GOLEM',
'author': 'Fabien Bourgeois, Michel Dessenne',
'license': 'AGPL-3',
@ -27,5 +27,5 @@
'depends': ['golem_member', 'account', 'decimal_precision'],
'data': ['views/golem_membership_invoice.xml',
'views/golem_member_view.xml',
'report/golem_member_card_template.xml']
'report/golem_member_card_templates.xml']
}

View File

@ -20,7 +20,7 @@
'name': 'GOLEM non-profit resources',
'summary': 'GOLEM resources management',
'description': ''' GOLEM resources management ''',
'version': '10.0.1.10.0',
'version': '10.0.1.12.0',
'category': 'GOLEM',
'author': 'Youssef El Ouahby, Fabien Bourgeois',
'license': 'AGPL-3',

View File

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-17 08:07+0000\n"
"PO-Revision-Date: 2018-03-17 08:07+0000\n"
"POT-Creation-Date: 2018-03-26 15:36+0000\n"
"PO-Revision-Date: 2018-03-26 15:36+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@ -95,6 +95,11 @@ msgstr "Confirmer"
msgid "Confirmed"
msgstr "Confirmé"
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Confirmed, to Validate"
msgstr "Confirmé, à valider"
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_create_uid
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_create_uid
@ -134,6 +139,7 @@ msgstr "Nom affiché"
#. module: golem_resource
#: selection:golem.resource.reservation,state:0
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Draft"
msgstr "Brouillon"
@ -320,6 +326,7 @@ msgstr "Rejet"
#. module: golem_resource
#: selection:golem.resource.reservation,state:0
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Rejected"
msgstr "Rejeté"
@ -344,11 +351,6 @@ msgstr "Nombre de réservations"
msgid "Reservation id"
msgstr "Reservation id"
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Reservation to Validate"
msgstr "Réservation à valider"
#. module: golem_resource
#: model:ir.actions.act_window,name:golem_resource.golem_resource_reservation_action
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_ids
@ -407,6 +409,11 @@ msgstr "Ressources"
msgid "Saturday"
msgstr "Samedi"
#. module: golem_resource
#: model:ir.ui.menu,name:golem_resource.product_template_menu
msgid "Sellable Products"
msgstr "Articles en vente"
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_form
msgid "Set to draft"
@ -499,6 +506,7 @@ msgstr "Valider"
#. module: golem_resource
#: selection:golem.resource.reservation,state:0
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Validated"
msgstr "Validé"

View File

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-17 08:07+0000\n"
"PO-Revision-Date: 2018-03-17 08:07+0000\n"
"POT-Creation-Date: 2018-03-26 15:37+0000\n"
"PO-Revision-Date: 2018-03-26 15:37+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@ -95,6 +95,11 @@ msgstr ""
msgid "Confirmed"
msgstr ""
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Confirmed, to Validate"
msgstr ""
#. module: golem_resource
#: model:ir.model.fields,field_description:golem_resource.field_golem_reservation_rejection_wizard_create_uid
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_create_uid
@ -134,6 +139,7 @@ msgstr ""
#. module: golem_resource
#: selection:golem.resource.reservation,state:0
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Draft"
msgstr ""
@ -320,6 +326,7 @@ msgstr ""
#. module: golem_resource
#: selection:golem.resource.reservation,state:0
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Rejected"
msgstr ""
@ -344,11 +351,6 @@ msgstr ""
msgid "Reservation id"
msgstr ""
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Reservation to Validate"
msgstr ""
#. module: golem_resource
#: model:ir.actions.act_window,name:golem_resource.golem_resource_reservation_action
#: model:ir.model.fields,field_description:golem_resource.field_golem_resource_reservation_ids
@ -407,6 +409,11 @@ msgstr ""
msgid "Saturday"
msgstr ""
#. module: golem_resource
#: model:ir.ui.menu,name:golem_resource.product_template_menu
msgid "Sellable Products"
msgstr ""
#. module: golem_resource
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_form
msgid "Set to draft"
@ -499,6 +506,7 @@ msgstr ""
#. module: golem_resource
#: selection:golem.resource.reservation,state:0
#: model:ir.ui.view,arch_db:golem_resource.golem_resource_reservation_view_search
msgid "Validated"
msgstr ""

View File

@ -75,7 +75,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</header>
<sheet>
<group>
<group string="Resource">
<group name="resource" string="Resource">
<field name="id" invisible="1" />
<field name="resource_id" options="{'no_create': True}" />
<field name="resource_avaibility_24_7" readonly="1" />
@ -84,7 +84,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<field name="resource_timetable_ids" readonly="1"
attrs="{'invisible': [('resource_avaibility_24_7', '=', True)]}" />
</group>
<group string="Reservation">
<group name="reservation" string="Reservation">
<group>
<field name="date_start" />
<field name="date_stop" />
@ -114,13 +114,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<search>
<field name="date_start" />
<field name="date_stop" />
<field name="day_start"/>
<field name="resource_id" />
<field name="user_id" />
<field name="partner_id" />
<field name="state" />
<field name="day_start"/>
<filter name="to_validate" string="Reservation to Validate"
<filter name="state_draft" string="Draft"
domain="[('state', '=', 'draft')]" />
<filter name="state_confirmed" string="Confirmed, to Validate"
domain="[('state', '=', 'confirmed')]" />
<filter name="state_validated" string="Validated"
domain="[('state', '=', 'validated')]" />
<filter name="state_rejected" string="Rejected"
domain="[('state', '=', 'rejected')]" />
<separator />
<filter name="day_reservation" string="Day Reservation"
domain="[('day_start', '=', context_today().strftime('%%Y-%%m-%%d'))]" />
<filter name="7days_reservation" string="7 Days Reservations"

View File

@ -135,6 +135,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<menuitem id="resource_configuration_menu" name="Configuration"
parent="golem_resource_menu" groups="golem_base.group_golem_manager"
sequence="90" />
<menuitem id="product_template_menu" name="Sellable Products"
parent="resource_configuration_menu"
action="product.product_template_action" sequence="20" />
</data>
</odoo>

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
# Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from . import models, wizard

View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
# Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
{
'name': 'GOLEM resources invoicing',
'summary': 'GOLEM resources invoicing',
'description': ''' GOLEM resources invoicing ''',
'version': '10.0.0.0.2',
'category': 'GOLEM',
'author': 'Youssef El Ouahby, Fabien Bourgeois',
'license': 'AGPL-3',
'application': True,
'installable': True,
'depends': ['golem_resource', 'account'],
'data': ['wizard/golem_reservation_invoice_views.xml',
'views/golem_resource_reservation_views.xml']
}

View File

@ -0,0 +1,207 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * golem_resource_account
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-26 16:32+0000\n"
"PO-Revision-Date: 2018-03-26 16:32+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: golem_resource_account
#: model:ir.model.fields,help:golem_resource_account.field_golem_resource_reservation_invoice_state
msgid " * The 'Draft' status is used when a user is encoding a new and unconfirmed Invoice.\n"
" * The 'Pro-forma' status is used when the invoice does not have an invoice number.\n"
" * The 'Open' status is used when user creates invoice, an invoice number is generated. It stays in the open status till the user pays the invoice.\n"
" * The 'Paid' status is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled.\n"
" * The 'Cancelled' status is used when user cancel invoice."
msgstr "* L'état \"Brouillon\" est utilisé lorsqu'un utilisateur est en train de saisir ou de modifier une nouvelle facture non confirmée.\n"
"* L'état \"Pro-forma\" est utilisé lorsque la facture n'a pas de numéro de facture.\n"
"* L'état 'Ouvert' est utilisé lorsque l'utilisateur crée une facture, celle-ci a alors un numéro de facture. La facture reste dans l'état \"Ouvert\" tant qu'elle n'est pas payée.\n"
"* L'état 'Payé' est affecté automatiquement lorsque la facture est payée. Les écritures correspondantes dans les journaux peuvent ou non être lettrées.\n"
"* L'état \"Annulé\" est utilisé lorsque l'utilisateur annule la facture."
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "<strong>\n"
" Only one invoice will be created in draft with corresponding reservations.\n"
" Then, you will be redirected to the new invoice and can review it before validation.\n"
" </strong>"
msgstr "<strong>\n"
" Seule unef acture sera créée en brouillon avec les réservations sélectionnées.\n"
" Ensuite, vous serez redirigé vers cette facture et pourrez la visionner avant de la valider.\n"
" </strong>"
#. module: golem_resource_account
#: model:ir.model.fields,help:golem_resource_account.field_golem_resource_reservation_resource_product_id
msgid "A generic product can be linked, in order to sell reservations (work in progress)"
msgstr "Un article générique peut être lié, dans l'objectif de monétiser des réservations (à venir)"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_line_price_subtotal
msgid "Amount"
msgstr "Montant"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "Cancel"
msgstr "Annuler"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_form_inherit_golem_resource_account
msgid "Create Invoice"
msgstr "Créer une facture"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "Create and view invoice"
msgstr "Créer et afficher la facture"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "Create invoice and Close"
msgstr "Créer la facture et fermer"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_create_uid
msgid "Created by"
msgstr "Créé par"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_create_date
msgid "Created on"
msgstr "Créé le"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_currency_id
msgid "Currency"
msgstr "Devise"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: golem_resource_account
#: model:ir.model,name:golem_resource_account.model_golem_resource_reservation
msgid "GOLEM Reservation Model"
msgstr "GOLEM Reservation Model"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_id
msgid "ID"
msgstr "ID"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_id
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_search_inherit_golem_resource_account
msgid "Invoice"
msgstr "Facture"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_line_id
msgid "Invoice line id"
msgstr "Ligne de facturation"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_search_inherit_golem_resource_account
msgid "Invoice state"
msgstr "État de la facture"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_tree_inherit_golem_resource_account
msgid "Invoice status"
msgstr "État de facturation"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_search_inherit_golem_resource_account
msgid "Invoiced"
msgstr "Facturé"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_form_inherit_golem_resource_account
msgid "Invoicing"
msgstr "Facturation"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard___last_update
msgid "Last Modified on"
msgstr "Dernière Modification le"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_resource_product_id
msgid "Linked product"
msgstr "Article lié"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_search_inherit_golem_resource_account
msgid "Not invoiced"
msgstr "Non facturé"
#. module: golem_resource_account
#: model:ir.actions.act_window,name:golem_resource_account.action_golem_reservation_invoice_wizard
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_reservation_ids
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "Reservations to invoice"
msgstr "Facturer les réservations"
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_form_inherit_golem_resource_account
msgid "Show invoice"
msgstr "Voir la facture"
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_state
msgid "Status"
msgstr "État"
#. module: golem_resource_account
#: code:addons/golem_resource_account/models/golem_resource_reservation.py:46
#, python-format
msgid "The reservation \"{}\" is not validated, please validate it before creating invoice"
msgstr "La réservation \"{}\" n'est pas validée, merci de la valider avant de créer une facture"
#. module: golem_resource_account
#: code:addons/golem_resource_account/models/golem_resource_reservation.py:62
#, python-format
msgid "There is no income account defined for this product: \"{}\". You have to configure it on the product form."
msgstr "Il n'y a pas de compte de revenus défini pour cet article: \"{}\". Vous devez en configurer un sur la fiche article."
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_amount_total
msgid "Total"
msgstr "Total"
#. module: golem_resource_account
#: code:addons/golem_resource_account/models/golem_resource_reservation.py:48
#, python-format
msgid "You can not create an invoice as there is already one."
msgstr "Vous ne pouvez pa créer une facture s'il y en a déjà une existante."
#. module: golem_resource_account
#: code:addons/golem_resource_account/models/golem_resource_reservation.py:53
#, python-format
msgid "You can not create an invoice without linked product on the resource reserved."
msgstr "Vous ne pouvez pas créer de facture sans article liée à la ressource réservée."
#. module: golem_resource_account
#: model:ir.model,name:golem_resource_account.model_golem_reservation_invoice_wizard
msgid "golem.reservation.invoice.wizard"
msgstr "golem.reservation.invoice.wizard"

View File

@ -0,0 +1,201 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * golem_resource_account
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-26 16:31+0000\n"
"PO-Revision-Date: 2018-03-26 16:31+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: golem_resource_account
#: model:ir.model.fields,help:golem_resource_account.field_golem_resource_reservation_invoice_state
msgid " * The 'Draft' status is used when a user is encoding a new and unconfirmed Invoice.\n"
" * The 'Pro-forma' status is used when the invoice does not have an invoice number.\n"
" * The 'Open' status is used when user creates invoice, an invoice number is generated. It stays in the open status till the user pays the invoice.\n"
" * The 'Paid' status is set automatically when the invoice is paid. Its related journal entries may or may not be reconciled.\n"
" * The 'Cancelled' status is used when user cancel invoice."
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "<strong>\n"
" Only one invoice will be created in draft with corresponding reservations.\n"
" Then, you will be redirected to the new invoice and can review it before validation.\n"
" </strong>"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,help:golem_resource_account.field_golem_resource_reservation_resource_product_id
msgid "A generic product can be linked, in order to sell reservations (work in progress)"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_line_price_subtotal
msgid "Amount"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "Cancel"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_form_inherit_golem_resource_account
msgid "Create Invoice"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "Create and view invoice"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "Create invoice and Close"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_create_uid
msgid "Created by"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_create_date
msgid "Created on"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_currency_id
msgid "Currency"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_display_name
msgid "Display Name"
msgstr ""
#. module: golem_resource_account
#: model:ir.model,name:golem_resource_account.model_golem_resource_reservation
msgid "GOLEM Reservation Model"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_id
msgid "ID"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_id
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_search_inherit_golem_resource_account
msgid "Invoice"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_line_id
msgid "Invoice line id"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_search_inherit_golem_resource_account
msgid "Invoice state"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_tree_inherit_golem_resource_account
msgid "Invoice status"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_search_inherit_golem_resource_account
msgid "Invoiced"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_form_inherit_golem_resource_account
msgid "Invoicing"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard___last_update
msgid "Last Modified on"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_write_uid
msgid "Last Updated by"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_write_date
msgid "Last Updated on"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_resource_product_id
msgid "Linked product"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_search_inherit_golem_resource_account
msgid "Not invoiced"
msgstr ""
#. module: golem_resource_account
#: model:ir.actions.act_window,name:golem_resource_account.action_golem_reservation_invoice_wizard
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_reservation_invoice_wizard_reservation_ids
#: model:ir.ui.view,arch_db:golem_resource_account.golem_reservation_invoice_wizard_form
msgid "Reservations to invoice"
msgstr ""
#. module: golem_resource_account
#: model:ir.ui.view,arch_db:golem_resource_account.golem_resource_reservation_form_inherit_golem_resource_account
msgid "Show invoice"
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_state
msgid "Status"
msgstr ""
#. module: golem_resource_account
#: code:addons/golem_resource_account/models/golem_resource_reservation.py:46
#, python-format
msgid "The reservation \"{}\" is not validated, please validate it before creating invoice"
msgstr ""
#. module: golem_resource_account
#: code:addons/golem_resource_account/models/golem_resource_reservation.py:62
#, python-format
msgid "There is no income account defined for this product: \"{}\". You have to configure it on the product form."
msgstr ""
#. module: golem_resource_account
#: model:ir.model.fields,field_description:golem_resource_account.field_golem_resource_reservation_invoice_amount_total
msgid "Total"
msgstr ""
#. module: golem_resource_account
#: code:addons/golem_resource_account/models/golem_resource_reservation.py:48
#, python-format
msgid "You can not create an invoice as there is already one."
msgstr ""
#. module: golem_resource_account
#: code:addons/golem_resource_account/models/golem_resource_reservation.py:53
#, python-format
msgid "You can not create an invoice without linked product on the resource reserved."
msgstr ""
#. module: golem_resource_account
#: model:ir.model,name:golem_resource_account.model_golem_reservation_invoice_wizard
msgid "golem.reservation.invoice.wizard"
msgstr ""

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
# Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from . import golem_resource_reservation

View File

@ -0,0 +1,115 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
# Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
""" GOLEM Resource Reservation Adaptation"""
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class GolemResourceReservation(models.Model):
""" GOLEM Resource Reservation Adaptation """
_inherit = 'golem.resource.reservation'
resource_product_id = fields.Many2one(related='resource_id.product_tmpl_id')
invoice_line_id = fields.Many2one('account.invoice.line', copy=False)
invoice_line_price_subtotal = fields.Monetary(related='invoice_line_id.price_subtotal')
invoice_id = fields.Many2one(related='invoice_line_id.invoice_id',
string='Invoice')
invoice_state = fields.Selection(related='invoice_id.state', store=True,
copy=False)
invoice_amount_total = fields.Monetary(related='invoice_id.amount_total')
currency_id = fields.Many2one(related='invoice_id.currency_id')
@api.multi
def check_before_invoicing(self):
""" Checks data coherence before invoicing """
for reservation in self:
if reservation.state != "validated":
raise ValidationError(
_('The reservation "{}" is not validated, please validate '
'it before creating invoice'.format(reservation.name)))
if reservation.invoice_line_id:
raise ValidationError(_('You can not create an invoice as there '
'is already one.'))
product = reservation.resource_id.product_tmpl_id
if not product:
raise ValidationError(_('You can not create an invoice without '
'linked product on the resource reserved.'))
account_id = product.property_account_income_id.id or \
product.categ_id.property_account_income_categ_id.id
if not account_id:
raise ValidationError(
_('There is no income account defined for this product: "{}"'
'. You have to configure it on the product form.'.format(product.name)))
@api.multi
def create_invoice_line(self, invoice_id):
""" Create invoice line corresponding to reservation """
for reservation in self:
product = reservation.resource_id.product_tmpl_id
amount = product.list_price
account_id = product.property_account_income_id.id or \
product.categ_id.property_account_income_categ_id.id
delta = fields.Datetime.from_string(reservation.date_stop) - \
fields.Datetime.from_string(reservation.date_start)
quantity = (delta.days * 24) + (delta.seconds/3600.0)
line_id = self.env['account.invoice.line'].create({
'invoice_id': invoice_id.id,
'name': product.name,
'origin': reservation.name,
'price_unit': amount,
'quantity': quantity,
'uom_id': product.uom_id.id,
'account_id': account_id,
'product_id': product.id,
})
reservation.invoice_line_id = line_id
@api.multi
def create_invoice(self):
""" Invoice creation """
for reservation in self:
reservation.check_before_invoicing()
inv_obj = self.env['account.invoice']
partner_id = reservation.partner_id
invoice_id = inv_obj.create({
'origin': reservation.name,
'type': 'out_invoice',
'reference': False,
'account_id': partner_id.property_account_receivable_id.id,
'partner_id': partner_id.id
})
reservation.create_invoice_line(invoice_id)
@api.multi
def show_invoice(self):
""" Redirects to linked invoice """
self.ensure_one()
reservation = self[0]
if reservation.invoice_id:
return {'type': 'ir.actions.act_window',
'res_model': 'account.invoice',
'res_id': reservation.invoice_id.id,
'view_mode': 'form',
'view_id': self.env.ref('account.invoice_form').id}

View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
# Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from . import test_golem_reservation_invoice

View File

@ -0,0 +1,109 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
# Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
""" GOLEM Resource Reservation testing """
import logging
from odoo.tests.common import TransactionCase
from odoo.exceptions import ValidationError, UserError
_LOGGER = logging.getLogger(__name__)
class TestGolemResourceReservation(TransactionCase):
""" GOLEM Resource Reservation testing """
def setUp(self, *args, **kwargs):
""" Bootstrap Resource Reservation """
super(TestGolemResourceReservation, self).setUp(*args, **kwargs)
self.resource = self.env['golem.resource'].create({
'name': 'Resource',
'avaibility_start': '2018-01-01',
'avaibility_stop': '2020-01-01',
'availibility_24_7': True
})
self.partner = self.env['res.partner'].create({'firstname': 'John',
'lastname': 'DOE',
'is_company': False})
self.partner2 = self.env['res.partner'].create({'firstname': 'John',
'lastname': 'DOE',
'is_company': False})
self.data = {
'resource_id': self.resource.id,
'date_start': '2018-02-05 11:00:00', # is monday
'date_stop': '2018-02-05 12:00:00',
'partner_id': self.partner.id
}
self.data2 = {
'resource_id': self.resource.id,
'date_start': '2018-03-05 11:00:00', # is monday
'date_stop': '2018-03-05 12:00:00',
'partner_id': self.partner2.id
}
self.res_obj = self.env['golem.resource.reservation']
def test_single_reservation_invoice(self):
""" Test reservation bases """
reservation = self.res_obj.create(self.data)
self.assertEqual(reservation.state, 'draft')
self.assertFalse(reservation.invoice_id)
#try to create invoice withoud validating reservation
with self.assertRaises(UserError) as err:
reservation.create_invoice()
self.assertIn(u'is not validated, please validate it', err.exception.args[0])
reservation.state_confirm()
#try to create invoice with no product linked
with self.assertRaises(UserError) as err:
reservation.create_invoice()
self.assertIn(u'no product linked to resource', err.exception.args[0])
reservation.resource_id.write({
'product_tmpl_id': self.env.ref('product.product_product_5').id})
reservation.create_invoice()
self.assertTrue(reservation.invoice_id)
self.assertEqual(reservation.invoice_state, "draft")
def test_multiple_reservation_in(self):
""" Test Multiple Reservation Invoices """
reservation_1 = self.res_obj.create(self.data)
reservation_2 = self.res_obj.create(self.data2)
#reservations = [reservation_1, reservation_2]
reservation_1.state_confirm()
reservation_2.state_confirm()
self.assertEqual(reservation_1.state, "validated")
self.assertEqual(reservation_2.state, "validated")
reservation_1.resource_id.write({
'product_tmpl_id': self.env.ref('product.product_product_5').id})
reservation_2.resource_id.write({
'product_tmpl_id': self.env.ref('product.product_product_5').id})
wizard = self.env['golem.reservation.invoice.wizard'].create({
'reservation_ids': [(4, reservation_1.id, 0), (4, reservation_2.id, 0)]})
self.assertTrue(wizard.reservation_ids)
self.assertEqual(wizard.reservation_ids[0], reservation_2)
self.assertEqual(wizard.reservation_ids[1], reservation_1)
#try to create invoice for to different client
with self.assertRaises(UserError) as err:
wizard.create_invoices()
self.assertIn(u'group reservations of multiple clients in the same', err.exception.args[0])
#fixing the same client for both reservation
reservation_2.write({'partner_id': self.partner.id})
wizard.create_invoices()
self.assertTrue(reservation_1.invoice_id)
self.assertTrue(reservation_2.invoice_id)

View File

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<odoo>
<data>
<!-- Trees -->
<record model="ir.ui.view" id="golem_resource_reservation_tree_inherit_golem_resource_account">
<field name="name">GOLEM Resource Reservation Tree Adaptation to invoicing</field>
<field name="model">golem.resource.reservation</field>
<field name='inherit_id' ref="golem_resource.golem_resource_reservation_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//tree" position="attributes">
<attribute name="colors">red : invoice_state=='open'; green : invoice_state=='paid'; black: state=='draft'; blue : state=='validated'; grey : state=='canceled'; orange : state=='rejected'</attribute>
</xpath>
<field name="state" position="after">
<field name="invoice_id" />
<field name="invoice_state" string="Invoice status" />
</field>
</field>
</record>
<!-- Forms -->
<record model="ir.ui.view"
id="golem_resource_reservation_form_inherit_golem_resource_account">
<field name="name"> GOLEM Resource Reservation Form Adaptations to invoicing</field>
<field name="model">golem.resource.reservation</field>
<field name='inherit_id' ref="golem_resource.golem_resource_reservation_view_form"/>
<field name="arch" type="xml">
<button name="state_rejected" position="after">
<button name="create_invoice" type="object" string="Create Invoice" class="oe_highlight"
attrs="{'invisible': ['|', ('state', '!=', 'validated'), '|', ('resource_product_id', '=', False), ('invoice_id', '!=', False)]}" />
<button name="show_invoice" type="object" string="Show invoice" class="oe_highlight"
attrs="{'invisible': [('invoice_id', '=', False)]}" />
</button>
<group name="reservation" position="after">
<group name="invoicing" string="Invoicing"
attrs="{'invisible': [('invoice_id', '=', False)]}">
<field name="resource_product_id" />
<field name="invoice_id" />
<field name="invoice_state" />
<field name="invoice_amount_total" />
<field name="invoice_line_id" />
<field name="invoice_line_price_subtotal" />
</group>
</group>
</field>
</record>
<!-- Searches -->
<record model="ir.ui.view"
id="golem_resource_reservation_search_inherit_golem_resource_account">
<field name="name"> GOLEM Resource Reservation Search Adaptations</field>
<field name="model">golem.resource.reservation</field>
<field name='inherit_id'
ref="golem_resource.golem_resource_reservation_view_search"/>
<field name="arch" type="xml">
<field name="state" position="after">
<field name="invoice_id" string="Invoice"
filter_domain="[('invoice_id.number', 'ilike', self)]" />
</field>
<filter name="state_rejected" position="after">
<separator />
<filter name="invoiced" string="Invoiced"
domain="[('invoice_line_id', '!=', False)]" />
<filter name="not_invoiced" string="Not invoiced"
domain="[('state', '=', 'validated'), ('invoice_line_id', '=', False)]" />
</filter>
<filter name="group_state" position="after">
<filter name="group_invoice_state" string="Invoice state"
context="{'group_by': 'invoice_state'}" />
</filter>
</field>
</record>
<!-- Add option to the "More" button -->
<act_window id="action_golem_reservation_invoice_wizard"
name="Reservations to invoice"
res_model="golem.reservation.invoice.wizard"
src_model="golem.resource.reservation"
view_mode="form"
multi="True"
target="new" />
</data>
</odoo>

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
# Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from . import golem_reservation_invoice

View File

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
# Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
""" GOLEM Reservation Invoice Wizard"""
from odoo import models, fields, api
class GolemReservationInvoiceWizard(models.TransientModel):
""" GOLEM Resource Reservation Invoice Wizard """
_name = 'golem.reservation.invoice.wizard'
reservation_ids = fields.Many2many(
'golem.resource.reservation', required=True, string='Reservations to invoice',
default=lambda self: self._context.get('active_ids', []))
@api.multi
def create_invoice(self):
""" Invoice creation """
self.ensure_one()
self.reservation_ids.check_before_invoicing()
self.reservation_ids[0].create_invoice()
invoice_id = self.reservation_ids[0].invoice_id
if len(self.reservation_ids) > 1:
self.reservation_ids[1:].create_invoice_line(invoice_id)
if self._context.get('open_invoice', False):
return self.reservation_ids[0].show_invoice()
return {'type': 'ir.actions.act_window_close'}

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2018 Youssef El Ouahby <youssef@yaltik.com>
Copyright 2018 Fabien Bourgeois <fabien@yaltik.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<odoo>
<data>
<!-- Forms -->
<record model="ir.ui.view"
id="golem_reservation_invoice_wizard_form">
<field name="name"> GOLEM Reservation Invoice Wizard Form</field>
<field name="model">golem.reservation.invoice.wizard</field>
<field name="arch" type="xml">
<form string="Reservations to invoice">
<p>
<strong>
Only one invoice will be created in draft with corresponding reservations.
Then, you will be redirected to the new invoice and can review it before validation.
</strong>
</p>
<footer>
<button name="create_invoice" string="Create and view invoice" type="object"
context="{'open_invoice': True}" class="oe_highlight" />
<button name="create_invoice" string="Create invoice and Close" type="object"
class="oe_highlight" />
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
</data>
</odoo>