Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View File

@@ -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

View 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",
)

View File

@@ -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
)

View 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"]

View File

@@ -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.",
)

View 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