Initial commit: Odoo 18.0-20251222 extra-addons
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import res_company
|
||||
from . import res_config_settings
|
||||
from . import res_partner
|
||||
from . import sale_invoicing_grouping_criteria
|
||||
from . import sale_order
|
||||
13
sale_order_invoicing_grouping_criteria/models/res_company.py
Normal file
13
sale_order_invoicing_grouping_criteria/models/res_company.py
Normal file
@@ -0,0 +1,13 @@
|
||||
# Copyright 2019 Tecnativa - Pedro M. Baeza
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResCompany(models.Model):
|
||||
_inherit = "res.company"
|
||||
|
||||
default_sale_invoicing_grouping_criteria_id = fields.Many2one(
|
||||
string="Default Sales Invoicing Grouping Criteria",
|
||||
comodel_name="sale.invoicing.grouping.criteria",
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
# Copyright 2019 Tecnativa - Pedro M. Baeza
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ResConfigSettings(models.TransientModel):
|
||||
_inherit = "res.config.settings"
|
||||
|
||||
res_default_sale_invoicing_grouping_criteria_id = fields.Many2one(
|
||||
related="company_id.default_sale_invoicing_grouping_criteria_id", readonly=False
|
||||
)
|
||||
21
sale_order_invoicing_grouping_criteria/models/res_partner.py
Normal file
21
sale_order_invoicing_grouping_criteria/models/res_partner.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# Copyright 2019 Tecnativa - Pedro M. Baeza
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = "res.partner"
|
||||
|
||||
sale_invoicing_grouping_criteria_id = fields.Many2one(
|
||||
string="Sales Invoicing Grouping Criteria",
|
||||
comodel_name="sale.invoicing.grouping.criteria",
|
||||
help="If empty, company default (if any) or default will be applied.",
|
||||
)
|
||||
|
||||
@api.model
|
||||
def _commercial_fields(self):
|
||||
"""Add this field to commercial fields, as it should be propagated
|
||||
to children.
|
||||
"""
|
||||
return super()._commercial_fields() + ["sale_invoicing_grouping_criteria_id"]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Copyright 2019 Tecnativa - Pedro M. Baeza
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class SaleInvoicingGroupingCriteria(models.Model):
|
||||
_name = "sale.invoicing.grouping.criteria"
|
||||
_description = "Sales Invoicing Grouping Criteria"
|
||||
|
||||
name = fields.Char()
|
||||
field_ids = fields.Many2many(
|
||||
string="Grouping Fields",
|
||||
comodel_name="ir.model.fields",
|
||||
domain="[('model', '=', 'sale.order')]",
|
||||
help="Fields used for grouping sales orders when invoicing. "
|
||||
"Invoicing address, company and currency will always be applied.",
|
||||
)
|
||||
51
sale_order_invoicing_grouping_criteria/models/sale_order.py
Normal file
51
sale_order_invoicing_grouping_criteria/models/sale_order.py
Normal file
@@ -0,0 +1,51 @@
|
||||
# Copyright 2019-2020 Tecnativa - Pedro M. Baeza
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models
|
||||
|
||||
|
||||
class SaleOrder(models.Model):
|
||||
_inherit = "sale.order"
|
||||
|
||||
def _get_grouping_partner(self):
|
||||
"""
|
||||
Get the partner who contains the grouping criteria.
|
||||
On sale.order, the default should be the invoice address.
|
||||
If not set, use the partner_id.
|
||||
:return: res.partner recordset
|
||||
"""
|
||||
self.ensure_one()
|
||||
return self.partner_invoice_id or self.partner_id
|
||||
|
||||
def _get_sale_invoicing_group_key(self):
|
||||
"""Prepare extended grouping criteria for sales orders."""
|
||||
self.ensure_one()
|
||||
group_key = [
|
||||
self.company_id.id,
|
||||
self.partner_invoice_id.id,
|
||||
self.currency_id.id,
|
||||
]
|
||||
partner = self._get_grouping_partner()
|
||||
criteria = (
|
||||
partner.sale_invoicing_grouping_criteria_id
|
||||
or self.company_id.default_sale_invoicing_grouping_criteria_id
|
||||
)
|
||||
for field in criteria.field_ids.sudo():
|
||||
group_key.append(self[field.name])
|
||||
return tuple(group_key)
|
||||
|
||||
def _create_invoices(self, grouped=False, final=False, date=None):
|
||||
"""Slice the batch according grouping criteria."""
|
||||
order_groups = {}
|
||||
for order in self:
|
||||
group_key = order._get_sale_invoicing_group_key()
|
||||
if group_key not in order_groups:
|
||||
order_groups[group_key] = order
|
||||
else:
|
||||
order_groups[group_key] += order
|
||||
moves = self.env["account.move"]
|
||||
for group in order_groups.values():
|
||||
moves += super(SaleOrder, group)._create_invoices(
|
||||
grouped=grouped, final=final, date=date
|
||||
)
|
||||
return moves
|
||||
Reference in New Issue
Block a user