diff --git a/energy_communities_service_invoicing/__manifest__.py b/energy_communities_service_invoicing/__manifest__.py
index 38cac035e4d73ddd1aa517b358cc68d78cfbf68d..1a6ac870a39b3aaed9d188d830b91446ec95ff3e 100644
--- a/energy_communities_service_invoicing/__manifest__.py
+++ b/energy_communities_service_invoicing/__manifest__.py
@@ -22,6 +22,7 @@
         "contract_variable_quantity",
         "energy_communities",
         "energy_communities_cooperator",  # TODO: This dependency is needed for active members formula. Need to refactor this.
+        "account_invoice_inter_company",
     ],
     # always loaded
     "data": [
diff --git a/energy_communities_service_invoicing/components/contract_utils.py b/energy_communities_service_invoicing/components/contract_utils.py
index 3269860b8ca723b845ed8bf1ef5e82948a4ed82f..bd18f5196ec91da92b102a2fd9e5cc9942a60269 100644
--- a/energy_communities_service_invoicing/components/contract_utils.py
+++ b/energy_communities_service_invoicing/components/contract_utils.py
@@ -55,10 +55,12 @@ class ContractUtils(Component):
         for line in self.work.record.contract_line_ids:
             line.write({"discount": discount})
 
-    def set_configuration_service_invoicing_journal_if_defined(self):
-        journal_id = self.work.record.company_id.service_invoicing_journal_id
-        if journal_id:
-            self.work.record.write({"journal_id": journal_id.id})
+    # method to be extended if using component for another pack_type
+    def set_configuration_journal_if_defined(self):
+        if self.work.record.pack_type == "platform_pack":
+            journal_id = self.work.record.company_id.service_invoicing_sale_journal_id
+            if journal_id:
+                self.work.record.write({"journal_id": journal_id.id})
 
     def clean_non_service_lines(self):
         for line in self.work.record.contract_line_ids:
diff --git a/energy_communities_service_invoicing/components/sale_order_utils.py b/energy_communities_service_invoicing/components/sale_order_utils.py
index 24c5ae56f0b88cc370fc2d7e6f38c171128f7b41..e3e241ddc8fcab97c22abcad81212fea181002f5 100644
--- a/energy_communities_service_invoicing/components/sale_order_utils.py
+++ b/energy_communities_service_invoicing/components/sale_order_utils.py
@@ -77,7 +77,7 @@ class SaleOrderUtils(Component):
             component.clean_non_service_lines()
             component.set_start_date(start_date)
             component.set_discount(discount)
-            component.set_configuration_service_invoicing_journal_if_defined()
+            component.set_configuration_journal_if_defined()
         return service_invoicing_id
 
     def create_service_invoicing_initial(
diff --git a/energy_communities_service_invoicing/models/__init__.py b/energy_communities_service_invoicing/models/__init__.py
index 7ba9edcc621a7fa8407557d49028a8327fc587ca..8d39612f6697b9ab190a26858de73839f714a189 100644
--- a/energy_communities_service_invoicing/models/__init__.py
+++ b/energy_communities_service_invoicing/models/__init__.py
@@ -1,3 +1,4 @@
+from . import pack_type_mixin
 from . import abstract_contract
 from . import account_move
 from . import contract
diff --git a/energy_communities_service_invoicing/models/account_move.py b/energy_communities_service_invoicing/models/account_move.py
index 381e6c69bfd828123edd2477168fe5ea57df7030..fdfc3e71ede0f761cc9def327a190d4240803963 100644
--- a/energy_communities_service_invoicing/models/account_move.py
+++ b/energy_communities_service_invoicing/models/account_move.py
@@ -1,28 +1,26 @@
 from odoo import api, fields, models
 
+from ..utils import PACK_VALUES
+
 
 class AccountMove(models.Model):
-    _inherit = "account.move"
+    _name = "account.move"
+    _inherit = ["account.move", "pack.type.mixin"]
 
     ref_invoice_id = fields.Many2one(
         comodel_name="account.move",
-        compute="_compute_ref_invoice_id_related_contract_id_pack_type_is_contract",
+        compute="_compute_ref_invoice_id_related_contract_id_is_contract",
         compute_sudo=True,
         store=False,
     )
     related_contract_id = fields.Many2one(
         comodel_name="contract.contract",
-        compute="_compute_ref_invoice_id_related_contract_id_pack_type_is_contract",
+        compute="_compute_ref_invoice_id_related_contract_id_is_contract",
         compute_sudo=True,
         store=False,
     )
-    pack_type = fields.Boolean(
-        compute="_compute_ref_invoice_id_related_contract_id_pack_type_is_contract",
-        compute_sudo=True,
-        store=True,
-    )
     is_contract = fields.Boolean(
-        compute="_compute_ref_invoice_id_related_contract_id_pack_type_is_contract",
+        compute="_compute_ref_invoice_id_related_contract_id_is_contract",
         compute_sudo=True,
         store=True,
     )
@@ -34,11 +32,10 @@ class AccountMove(models.Model):
     )
 
     @api.depends("invoice_line_ids", "ref")
-    def _compute_ref_invoice_id_related_contract_id_pack_type_is_contract(self):
+    def _compute_ref_invoice_id_related_contract_id_is_contract(self):
         for record in self:
             record.ref_invoice_id = False
             record.related_contract_id = False
-            record.pack_type = 'none'
             record.is_contract = False
             rel_inv = False
             if record.ref:
@@ -49,7 +46,6 @@ class AccountMove(models.Model):
                 )
                 if rel_inv:
                     record.ref_invoice_id = rel_inv.id
-                    record.pack_type = rel_inv.pack_type
                     record.is_contract = rel_inv.is_contract
                     if rel_inv.related_contract_id:
                         record.related_contract_id = rel_inv.related_contract_id.id
@@ -58,6 +54,24 @@ class AccountMove(models.Model):
                     first_move_line = record.invoice_line_ids[0]
                     if first_move_line.contract_line_id:
                         rel_contract = first_move_line.contract_line_id.contract_id
-                        record.pack_type = rel_contract.pack_type
                         record.related_contract_id = rel_contract.id
                         record.is_contract = True
+
+    def custom_compute_pack_type(self):
+        self._set_custom_pack_type_on_invoice()
+
+    @api.depends("ref", "invoice_line_ids")
+    def _compute_pack_type(self):
+        super()._compute_pack_type()
+
+    # define configuration intercompany journal
+    def _prepare_invoice_data(self, dest_company):
+        inv_data = super()._prepare_invoice_data(dest_company)
+        if (
+            self.pack_type == "platform_pack"
+            and dest_company.sudo().service_invoicing_purchase_journal_id
+        ):
+            inv_data[
+                "journal_id"
+            ] = dest_company.sudo().service_invoicing_purchase_journal_id.id
+        return inv_data
diff --git a/energy_communities_service_invoicing/models/contract_template.py b/energy_communities_service_invoicing/models/contract_template.py
index 440855b79dcdd0415102d44cde7907d7ff192cec..e39c381630f0b64315f688f9cd4cf8905f43e456 100644
--- a/energy_communities_service_invoicing/models/contract_template.py
+++ b/energy_communities_service_invoicing/models/contract_template.py
@@ -1,45 +1,14 @@
-from odoo import api, fields, models, _
+from odoo import _, api, fields, models
 
-PACK_VALUES = [
-    ("platform_pack", _("Platform Pack")),
-    ("none", _("None")),
-]
 
 class ContractTemplate(models.Model):
     _name = "contract.template"
-    _inherit = "contract.template"
+    _inherit = ["contract.template", "pack.type.mixin"]
 
     is_free_pack = fields.Boolean(string="Is a free pack")
-    pack_type = fields.Selection(PACK_VALUES, compute="_compute_pack_type", string="Pack Type", store=True)
-    
-    def _get_pack_product_from_category(self, category_id, value):
-        return value if bool(
-                    self.env["product.template"].search(
-                        [
-                            ("property_contract_template_id", "=", self.id),
-                            (
-                                "categ_id",
-                                "=",
-                                category_id,
-                            ),
-                        ]
-                    )
-                ) else 'none'
-    
-    def _set_custom_pack_type(self, ref_category, value):
-        try:
-            categ_id = self.env.ref(
-                ref_category
-            ).id
-        except:
-            categ_id = False
-        if categ_id:
-            self.pack_type = self._get_pack_product_from_category(categ_id, value)
 
     def custom_compute_pack_type(self):
-        self._set_custom_pack_type("energy_communities_service_invoicing.product_category_platform_pack", 'platform_pack')
-
-    def _compute_pack_type(self):
-        for record in self:
-            record.custom_compute_pack_type()
-
+        self._set_custom_pack_type_on_contract_template(
+            "platform_pack",
+            "energy_communities_service_invoicing.product_category_platform_pack",
+        )
diff --git a/energy_communities_service_invoicing/models/pack_type_mixin.py b/energy_communities_service_invoicing/models/pack_type_mixin.py
new file mode 100644
index 0000000000000000000000000000000000000000..7d3ce9e2a25637119b45e2cc97a59b16d45a401e
--- /dev/null
+++ b/energy_communities_service_invoicing/models/pack_type_mixin.py
@@ -0,0 +1,65 @@
+from odoo import fields, models
+
+from ..utils import PACK_VALUES
+
+
+class PackTypeMixin(models.AbstractModel):
+    _name = "pack.type.mixin"
+    _description = "Add pack_type to any model"
+
+    pack_type = fields.Selection(
+        PACK_VALUES,
+        compute="_compute_pack_type",
+        compute_sudo=True,
+        string="Pack Type",
+        store=True,
+    )
+
+    def _get_pack_type_from_product_category(self, pack_type, category_id):
+        return (
+            pack_type
+            if bool(
+                self.env["product.template"].search(
+                    [
+                        ("property_contract_template_id", "=", self.id),
+                        ("categ_id", "=", category_id),
+                    ]
+                )
+            )
+            else "none"
+        )
+
+    def _set_custom_pack_type_on_contract_template(self, pack_type, ref_category):
+        try:
+            categ_id = self.env.ref(ref_category).id
+        except:
+            categ_id = False
+        if categ_id:
+            self.pack_type = self._get_pack_type_from_product_category(
+                pack_type, categ_id
+            )
+
+    def _set_custom_pack_type_on_invoice(self):
+        if self.ref:
+            rel_inv = (
+                self.env["account.move"]
+                .sudo()
+                .search([("name", "=", self.ref)], limit=1)
+            )
+            if rel_inv:
+                self.pack_type = rel_inv.pack_type
+        else:
+            if self.invoice_line_ids:
+                first_move_line = self.invoice_line_ids[0]
+                if first_move_line.contract_line_id:
+                    rel_contract = first_move_line.contract_line_id.contract_id
+                    self.pack_type = rel_contract.pack_type
+
+    # method to be overwriten on implementations
+    def custom_compute_pack_type(self):
+        pass
+
+    def _compute_pack_type(self):
+        for record in self:
+            record.pack_type = "none"
+            record.custom_compute_pack_type()
diff --git a/energy_communities_service_invoicing/models/res_company.py b/energy_communities_service_invoicing/models/res_company.py
index 0264c69bb7ff60435d7c52292404dc03bc3ca8f6..7ce76cc08ea34dcff81b4011fb0c6645797442a4 100644
--- a/energy_communities_service_invoicing/models/res_company.py
+++ b/energy_communities_service_invoicing/models/res_company.py
@@ -6,14 +6,14 @@ class ResCompany(models.Model):
     _name = "res.company"
     _inherit = ["res.company"]
 
-    service_invoicing_journal_id = fields.Many2one(
+    service_invoicing_sale_journal_id = fields.Many2one(
         comodel_name="account.journal",
-        string="Service invoicing journal",
+        string="Service invoicing sale journal",
+    )
+    service_invoicing_purchase_journal_id = fields.Many2one(
+        comodel_name="account.journal",
+        string="Service invoicing purchase journal",
     )
-    # service_invoicing_payment_mode_id = fields.Many2one(
-    #     comodel_name="account.payment.mode",
-    #     string="Service invoicing payment mode",
-    # )
     service_invoicing_sale_team_id = fields.Many2one(
         comodel_name="crm.team",
         string="Service invoicing sales team",
diff --git a/energy_communities_service_invoicing/utils.py b/energy_communities_service_invoicing/utils.py
index 2f63628b5dbb590ff90d33ed07ae22b53ec8725e..a99e7c972c24489b726ee248f2610dbf43c4175c 100644
--- a/energy_communities_service_invoicing/utils.py
+++ b/energy_communities_service_invoicing/utils.py
@@ -4,6 +4,11 @@ from odoo.exceptions import ValidationError
 
 from odoo.addons.contract.models.contract import ContractContract
 
+PACK_VALUES = [
+    ("platform_pack", _("Platform Pack")),
+    ("none", _("None")),
+]
+
 _CONTRACT_STATUS_VALUES = [
     ("paused", _("Paused")),
     ("in_progress", _("In progress")),
@@ -77,19 +82,21 @@ def raise_existing_same_open_platform_pack_contract_error(existing_contract):
 
 
 def get_existing_open_pack_contract(
-    env, partner_id, pack_type, contract_id=False, custom_query=[]
+    env, partner_id, pack_type, contract_id=False, custom_query=False
 ):
-    #("community_company_id", "=", community_company_id.id),
+    # ("community_company_id", "=", community_company_id.id),
     query = [
-        ("partner_id", "=", partner_id.id), 
+        ("partner_id", "=", partner_id.id),
         ("pack_type", "=", pack_type),
         ("status", "in", ["paused", "in_progress"]),
     ]
     if contract_id:
         query.append(("id", "!=", contract_id.id))
-    query = custom_query + query
+    if custom_query:
+        query = custom_query + query
     return env["contract.contract"].search(query, limit=1)
 
+
 def get_existing_last_closed_pack_contract(
     env, partner_id, community_company_id, contract_id=False
 ):
diff --git a/energy_communities_service_invoicing/views/account_move_views.xml b/energy_communities_service_invoicing/views/account_move_views.xml
index 8778184dd8c87ec95dec2d50a76d33e76a8e69f9..6b2f823090fa0f94f7ea0159ca40d9745c4f920e 100644
--- a/energy_communities_service_invoicing/views/account_move_views.xml
+++ b/energy_communities_service_invoicing/views/account_move_views.xml
@@ -5,7 +5,7 @@
       <field name="inherit_id" ref="account.view_move_form" />
       <field name="arch" type="xml">
         <xpath expr="//field[@name='partner_id']" position="after">
-          <field name="pack_type" invisible="True" />
+          <field name="pack_type" />
           <field name="is_contract" invisible="True" />
           <field name="invoice_origin" attrs="{'invisible': [('is_contract','=',False)]}" />
           <field name="related_contract_id" attrs="{'invisible': [('is_contract','=',False)]}" />
diff --git a/energy_communities_service_invoicing/views/contract_views.xml b/energy_communities_service_invoicing/views/contract_views.xml
index 6e79bb9120d7c585b86c645bfe0a9fe2c4d04da9..3feaa068a04f9b745bf44981e4a74d8f3bb0eee3 100644
--- a/energy_communities_service_invoicing/views/contract_views.xml
+++ b/energy_communities_service_invoicing/views/contract_views.xml
@@ -137,6 +137,7 @@
           <group>
             <field name="name" />
             <field name="pack_id" options="{'no_open': True}" />
+            <field name="pack_type" />
             <field name="related_contract_product_ids" widget="one2many" >
               <tree editable="bottom">
                 <field name="name" readonly="1"/>
diff --git a/energy_communities_service_invoicing/views/res_company_views.xml b/energy_communities_service_invoicing/views/res_company_views.xml
index 7c49d6fa3c58a1719dd4002d12f770c7985fec1d..97e3c0b2c0fda756f446d2a3a7f0ff34e30f677e 100644
--- a/energy_communities_service_invoicing/views/res_company_views.xml
+++ b/energy_communities_service_invoicing/views/res_company_views.xml
@@ -19,7 +19,8 @@
         <page string="Services Invoicing">
           <group>
             <field name="id" invisible="1"/>
-            <field name="service_invoicing_journal_id" domain="[('company_id', '=', id)]" />
+            <field name="service_invoicing_sale_journal_id" domain="[('company_id', '=', id)]" />
+            <field name="service_invoicing_purchase_journal_id" domain="[('company_id', '=', id)]" />
             <field name="service_invoicing_sale_team_id" domain="[('company_id', '=', id)]" />
           </group>
         </page>
diff --git a/energy_selfconsumption/models/__init__.py b/energy_selfconsumption/models/__init__.py
index 17238e4128e51c9d2227b1e7e8c3f8cf63de9188..85657e9a782cd7ed64d0f1be2c39c28ea2aa2978 100644
--- a/energy_selfconsumption/models/__init__.py
+++ b/energy_selfconsumption/models/__init__.py
@@ -1,3 +1,4 @@
+from . import pack_type_mixin
 from . import account_move
 from . import contract
 from . import contract_csv_report
diff --git a/energy_selfconsumption/models/account_move.py b/energy_selfconsumption/models/account_move.py
index 760be4ee44304b609620e284ac175c4ced9cfc38..110e8e4bb407ad6be61fbe5d640505034e911791 100644
--- a/energy_selfconsumption/models/account_move.py
+++ b/energy_selfconsumption/models/account_move.py
@@ -11,7 +11,8 @@ class AccountMoveLine(models.Model):
 
 
 class AccountMove(models.Model):
-    _inherit = "account.move"
+    _name = "account.move"
+    _inherit = ["account.move", "pack.type.mixin"]
 
     selfconsumption_invoicing_mode = fields.Selection(
         [
diff --git a/energy_selfconsumption/models/contract_template.py b/energy_selfconsumption/models/contract_template.py
index 76734f7a3bb2c18d1bed4f4e8ad41fa60b4d05cd..e45bdbfd477840fb444bd8859fc4d04b3ce868fc 100644
--- a/energy_selfconsumption/models/contract_template.py
+++ b/energy_selfconsumption/models/contract_template.py
@@ -1,19 +1,14 @@
 from odoo import _, api, fields, models
 
-PACK_VALUES = [
-    ("selfconsumption_pack", _("Selfconsumption Pack")),
-]
-
 
 class ContractTemplate(models.Model):
-    _inherit = "contract.template"
-
-    pack_type = fields.Selection(selection_add=PACK_VALUES)
+    _name = "contract.template"
+    _inherit = ["contract.template", "pack.type.mixin"]
 
     def custom_compute_pack_type(self):
         super().custom_compute_pack_type()
         if self.pack_type == "none":
-            self._set_custom_pack_type(
-                "selfconsumption.product_category_selfconsumption_pack",
+            self._set_custom_pack_type_on_contract_template(
                 "selfconsumption_pack",
+                "selfconsumption.product_category_selfconsumption_pack",
             )
diff --git a/energy_selfconsumption/models/pack_type_mixin.py b/energy_selfconsumption/models/pack_type_mixin.py
new file mode 100644
index 0000000000000000000000000000000000000000..30bad5f15f2f5914393c7431612a9f153406f8f5
--- /dev/null
+++ b/energy_selfconsumption/models/pack_type_mixin.py
@@ -0,0 +1,11 @@
+from odoo import _, fields, models
+
+PACK_VALUES = [
+    ("selfconsumption_pack", _("Selfconsumption Pack")),
+]
+
+
+class PackTypeMixin(models.AbstractModel):
+    _inherit = "pack.type.mixin"
+
+    pack_type = fields.Selection(selection_add=PACK_VALUES)