diff --git a/__init__.py b/__init__.py index d548d15f3ac4eb2d20bc8b7882455236d4fe3a89..83a8b401fff61f6ea7d9b9b5a260d6025e3bd7bf 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,5 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import models -from . import controllers \ No newline at end of file +from . import controllers +from . import wizard \ No newline at end of file diff --git a/__manifest__.py b/__manifest__.py index f846dcefd6cc09ef6d78b7562e39a010e11e847b..c3905e2772a1b82357385549512e77fbd40e6fb2 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -19,6 +19,8 @@ "views/vracoop_sale_retrait_views.xml", "views/vracoop_templates.xml", "views/sale_order.xml", - "views/delivery_views.xml" + "views/delivery_views.xml", + "views/account_invoice_views.xml", + "report/account_invoice_template.xml" ] } diff --git a/models/__init__.py b/models/__init__.py index bf52ecf5312fdb04e8afcac333a80dbaf101be9a..52f7c5c9b28848faae7f0a01bcdd32f8a83eff8b 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -5,4 +5,5 @@ from . import vracoop_point_retrait from . import vracoop_retrait_time from . import vracoop_retrait_suivi from . import sale_order +from . import account_invoice from . import delivery \ No newline at end of file diff --git a/models/account_invoice.py b/models/account_invoice.py new file mode 100644 index 0000000000000000000000000000000000000000..c74e9ff3987c9241da4c180b20abfda86b3fcd4b --- /dev/null +++ b/models/account_invoice.py @@ -0,0 +1,48 @@ +# Copyright 2021 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models +from datetime import datetime + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + # ------------------------------------------------------ + # Fields declaration + # ------------------------------------------------------ + vracoop_point_retrait_id = fields.Many2one( + comodel_name='vracoop.point.retrait', + string="Point retrait") + day_retrait = fields.Date("Jour du retrait") + hour_retrait = fields.Float("Heure du retrait") + carrier_point_retrait = fields.Boolean( + string='Est un point retrait') + + # ------------------------------------------------------ + # SQL Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Default methods + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Onchange / Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD methods (ORM overrides) + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Business methods + # ------------------------------------------------------ diff --git a/models/sale_order.py b/models/sale_order.py index 7a49fc23af864afd8b40550d71b73a06c7edeb64..5c40a1f69b31c6ab67260d93c516b4863fd4c7ac 100644 --- a/models/sale_order.py +++ b/models/sale_order.py @@ -1,7 +1,7 @@ # © 2019 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import models, fields +from odoo import models, fields, api from datetime import datetime class SaleOrder(models.Model): @@ -42,4 +42,16 @@ class SaleOrder(models.Model): 'day_retrait': day_retrait, 'vracoop_point_retrait_id': retrait.id}) - return True \ No newline at end of file + return True + + @api.multi + def _prepare_invoice(self): + self.ensure_one() + res = super(SaleOrder, self)._prepare_invoice() + res.update({ + 'vracoop_point_retrait_id': self.vracoop_point_retrait_id.id, + 'day_retrait': self.day_retrait, + 'hour_retrait': self.hour_retrait, + 'carrier_point_retrait': self.carrier_point_retrait + }) + return res \ No newline at end of file diff --git a/models/vracoop_point_retrait.py b/models/vracoop_point_retrait.py index 1c01c6935fdbc5e615e7b0ba55cfa4f3c6bbb448..b6d3d5c9de90141e30d9de1c19189c039bbe82e7 100644 --- a/models/vracoop_point_retrait.py +++ b/models/vracoop_point_retrait.py @@ -2,14 +2,8 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api -import pytz -# import dateutil.rrule as rrule -# from datetime import date -from dateutil.relativedelta import * -from dateutil.easter import * -from dateutil.rrule import rrule, DAILY, MINUTELY, rruleset -from dateutil.parser import * -# from datetime import * +from dateutil.rrule import rrule, DAILY, MINUTELY +from dateutil.relativedelta import relativedelta from datetime import datetime, timedelta from pytz import timezone @@ -67,6 +61,8 @@ class VracoopPointRetrait(models.Model): "Nombre de retrait max par tranche horaire") nb_day_available = fields.Integer( "Nombre de jours pour commande", default=7) + nb_hours_preparation = fields.Float( + "Nombre d'heures de préparation", default=0.0) @api.multi def slot_calculate(self): @@ -103,10 +99,11 @@ class VracoopPointRetrait(models.Model): # Liste des jours où je peux récupérer la commande # en fonction nombre de jour dispo sur la fiche du point retrait + first_day = datetime.today() + relativedelta(hours=rec.nb_hours_preparation) list_week = list(rrule( DAILY, count=count_day, - dtstart=datetime.today())) + dtstart=first_day)) for week in list_week: # On exclut les jours où la journée @@ -172,7 +169,7 @@ class VracoopPointRetrait(models.Model): # Heure disponible pour un retrait # en fonction du temps de préparation today_hour_available = today_datetime + timedelta( - hours=corresponding_line.preparation_time) + hours=(corresponding_line.preparation_time + rec.nb_hours_preparation)) # Boucle pour les créneaux du matin for slot_elem in list_slot_per_day_morning: @@ -194,7 +191,8 @@ class VracoopPointRetrait(models.Model): last_slot = slot_elem_last.strftime("%H:%M") # Si le jour est égal à la date du jour - if slot_elem.date() == today_datetime.date(): + day_first = today_datetime.date() + relativedelta(hours=rec.nb_hours_preparation) + if slot_elem.date() == day_first: if (slot_elem_last > last_morning_hour_week): if (today_hour_available > last_morning_hour_week): continue diff --git a/report/account_invoice_template.xml b/report/account_invoice_template.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d9173dff046caf52e45a63d3d727bc1ba010ac3 --- /dev/null +++ b/report/account_invoice_template.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <data> + <template id="report_invoice_document" inherit_id="account.report_invoice_document"> + <p t-if="o.reference" position="before"> + <p t-if="o.vracoop_point_retrait_id"> + Point de retrait: <span t-field="o.vracoop_point_retrait_id"/><br/> + Jour de retrait: <span t-field="o.day_retrait"/><br/> + Heure de retrait: <span t-field="o.hour_retrait" t-options= '{"widget": "float_time"}'/> + </p> + </p> + </template> + + </data> +</odoo> diff --git a/views/account_invoice_views.xml b/views/account_invoice_views.xml new file mode 100644 index 0000000000000000000000000000000000000000..49965d27a69929baa845f44a5bd886d016ca84de --- /dev/null +++ b/views/account_invoice_views.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <data> + + <record id="invoice_form" model="ir.ui.view"> + <field name="name">account.invoice.form.view.with_retrait</field> + <field name="model">account.invoice</field> + <field name="inherit_id" ref="account.invoice_form"/> + <field name="arch" type="xml"> + <data> + <field name="payment_term_id" position="after"> + <field name="carrier_point_retrait" invisible="1"/> + <field name="vracoop_point_retrait_id" attrs="{'invisible': [('carrier_point_retrait', '=', False)]}"/> + <field name="day_retrait" attrs="{'invisible': [('carrier_point_retrait', '=', False)]}" /> + <field name="hour_retrait" widget="float_time" attrs="{'invisible': [('carrier_point_retrait', '=', False)]}"/> + </field>> + </data> + </field> + </record> + + </data> +</odoo> \ No newline at end of file diff --git a/views/vracoop_retrait_views.xml b/views/vracoop_retrait_views.xml index 11b74f16f3bf7d0ee3b492978f617a2f9837c19f..564826c8ba40e56592337777a522cbef6ce2baac 100644 --- a/views/vracoop_retrait_views.xml +++ b/views/vracoop_retrait_views.xml @@ -98,6 +98,7 @@ <group> <field name="nb_max_retrait"/> <field name="nb_day_available"/> + <field name="nb_hours_preparation"/> </group> </group> <notebook> diff --git a/wizard/__init__.py b/wizard/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..91dfca524aed2f875310317c003eb6bfbacf4cba --- /dev/null +++ b/wizard/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2020 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import sale_make_invoice_advance diff --git a/wizard/__pycache__/__init__.cpython-37.pyc b/wizard/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f711a543533a940ce57d39e5f85d14c7cf8411eb Binary files /dev/null and b/wizard/__pycache__/__init__.cpython-37.pyc differ diff --git a/wizard/__pycache__/sale_make_invoice_advance.cpython-37.pyc b/wizard/__pycache__/sale_make_invoice_advance.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d79faca6d487bd6f7280fadc468dc3cc2c30a485 Binary files /dev/null and b/wizard/__pycache__/sale_make_invoice_advance.cpython-37.pyc differ diff --git a/wizard/sale_make_invoice_advance.py b/wizard/sale_make_invoice_advance.py new file mode 100644 index 0000000000000000000000000000000000000000..acf6251c93adf49dd26f94ddfdfadef2a14c5cbe --- /dev/null +++ b/wizard/sale_make_invoice_advance.py @@ -0,0 +1,50 @@ +# Copyright 2021 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + +from odoo import api, fields, models, _ + + +class SaleAdvancePaymentInv(models.TransientModel): + _inherit = "sale.advance.payment.inv" + + # ------------------------------------------------------ + # Fields declaration + # ------------------------------------------------------ + @api.multi + def _create_invoice(self, order, so_line, amount): + inv = super(SaleAdvancePaymentInv, self)._create_invoice(order, so_line, amount) + inv.write({ + 'vracoop_point_retrait_id': order.vracoop_point_retrait_id.id, + 'day_retrait': order.day_retrait, + 'hour_retrait': order.hour_retrait, + 'carrier_point_retrait': order.carrier_point_retrait + }) + return inv + # ------------------------------------------------------ + # SQL Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Default methods + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Onchange / Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD methods (ORM overrides) + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Business methods + # ------------------------------------------------------