diff --git a/apps/batch-sim/index.js b/apps/batch-sim/index.js
index 921fd57eeda9ee1701436b8164418fb892340a94..a4e34282e485218cb614565512f8d4b87496be8e 100644
--- a/apps/batch-sim/index.js
+++ b/apps/batch-sim/index.js
@@ -27,7 +27,10 @@ const signInAs = async (apiClient, userMail, password) => {
 
 const createAssetAndSendToCone = async (apiClient, name) => {
   const assetId = await createAsset(apiClient, name)
-  await editComposition(apiClient, { assetId })
+  await editComposition(apiClient, {
+    assetId,
+    caoPercentage: faker.datatype.number({ min: 40, max: 70 })
+  })
   return sendToCone(apiClient, { assetId })
 }
 
diff --git a/apps/sidenor-cli/lib.js b/apps/sidenor-cli/lib.js
index 94ee5ee96263907bc1b07f9a0338b6a70d77f0b3..59e43241d33cc10c8a79388225f25b13b56cba27 100644
--- a/apps/sidenor-cli/lib.js
+++ b/apps/sidenor-cli/lib.js
@@ -15,7 +15,7 @@ const createAsset = async (apiClient, { assetName }) => {
     id: `asst_${faker.datatype.uuid()}`,
     type: TYPES.RESIDUO_PROCESOS_TERMICOS,
     units: "kg",
-    quantity: faker.datatype.number({ min: 0, max: 5000 }),
+    quantity: faker.datatype.number({ min: 400, max: 5000 }),
     fields: {
       description: "Escoria",
       name: assetName,
@@ -69,6 +69,24 @@ const editComposition = async (
   console.log("New composition measure for", assetId)
 }
 
+const updateBatchRange = (batch = {}, individualSlag = {}) => {
+  const { cao = null } = (individualSlag.fields || {}).composition || {}
+  const { cao: caoRange = null } = (batch.fields || {}).composition || {}
+
+  if (cao === null) {
+    return caoRange
+  }
+
+  if (caoRange === null) {
+    return { min: cao, max: cao }
+  }
+
+  return {
+    min: cao < caoRange.min ? cao : caoRange.min,
+    max: cao > caoRange.max ? cao : caoRange.max
+  }
+}
+
 const sendToCone = async (apiClient, { assetId: paramAssetId }) => {
   const assetId =
     paramAssetId ||
@@ -81,13 +99,12 @@ const sendToCone = async (apiClient, { assetId: paramAssetId }) => {
     ))
 
   const assetToBeSent = await apiClient.getAsset(assetId)
-  const assetsInCone = await apiClient.richQuery({
+  const [firstAsset = false] = await apiClient.richQuery({
     fields: {
       status: STATUSES.SLAG_BATCH
     }
   })
 
-  const [firstAsset] = assetsInCone
   const newConeQuantity =
     assetToBeSent.quantity + (firstAsset ? firstAsset.quantity : 0)
 
@@ -97,29 +114,50 @@ const sendToCone = async (apiClient, { assetId: paramAssetId }) => {
     { parentsShouldExist: false, bidirectional: true },
     {
       type: TYPES.RESIDUO_HIERRO_ACERO,
-      location:
-        assetsInCone.length === 0
-          ? assetToBeSent.location
-          : assetsInCone[0].location,
+      location: firstAsset ? firstAsset.location : assetToBeSent.location,
       units: "kg",
       quantity: newConeQuantity,
       fields: {
         name: "Slag batch (in cone)",
-        status: STATUSES.SLAG_BATCH
+        status: STATUSES.SLAG_BATCH,
+        composition: {
+          cao: updateBatchRange(firstAsset, assetToBeSent)
+        }
       }
     }
   )
 
   // Archive individual slag and previous cone
   await apiClient.deleteAsset(assetId)
-  if (assetsInCone.length > 0) await apiClient.deleteAsset(assetsInCone[0].id)
+  if (firstAsset) await apiClient.deleteAsset(firstAsset.id)
 
   console.log("Moved to cone", coneAsset.id)
 
   return coneAsset.id
 }
 
-const sendToStock = async (apiClient, { assetId: paramAssetId }) => {
+const updateStockRange = (stock = {}, batch = {}) => {
+  const { cao: caoRange = null } = (stock.fields || {}).composition || {}
+  const { cao: newCaoRange = null } = (batch.fields || {}).composition || {}
+
+  if (caoRange === null) {
+    return newCaoRange
+  }
+
+  if (newCaoRange === null) {
+    return caoRange
+  }
+
+  return {
+    min: newCaoRange.min < caoRange.min ? newCaoRange.min : caoRange.min,
+    max: newCaoRange.max > caoRange.max ? newCaoRange.max : caoRange.max
+  }
+}
+
+const sendToStock = async (
+  apiClient,
+  { assetId: paramAssetId, stockId: paramStockId }
+) => {
   const assetId =
     paramAssetId ||
     (await promptAssetSelection(
@@ -136,28 +174,30 @@ const sendToStock = async (apiClient, { assetId: paramAssetId }) => {
     return
   }
 
-  const selectedStockId = await promptAssetSelection(
-    [
-      ...(await apiClient.richQuery({
-        fields: {
-          status: STATUSES.STOCK
+  const selectedStockId =
+    paramStockId ||
+    (await promptAssetSelection(
+      [
+        ...(await apiClient.richQuery({
+          fields: {
+            status: STATUSES.STOCK
+          }
+        })),
+        {
+          id: "newStock",
+          type: TYPES.RESIDUO_HIERRO_ACERO,
+          fields: { name: "New stock", status: STATUSES.STOCK }
         }
-      })),
-      {
-        id: "newStock",
-        type: TYPES.RESIDUO_HIERRO_ACERO,
-        fields: { name: "New stock", status: STATUSES.STOCK }
-      }
-    ],
-    "Select the stock where the cone will be merged"
-  )
+      ],
+      "Select the stock where the cone will be merged"
+    ))
 
   if (!selectedStockId) {
     console.error("You must select a stock")
     return
   }
 
-  let previousStock = false
+  let previousStock = undefined
   if (selectedStockId !== "newStock") {
     previousStock = await apiClient.getAsset(selectedStockId)
   }
@@ -179,7 +219,10 @@ const sendToStock = async (apiClient, { assetId: paramAssetId }) => {
       quantity: newStockQuantity,
       fields: {
         status: STATUSES.STOCK,
-        name: "Stock"
+        name: "Stock",
+        composition: {
+          cao: updateStockRange(previousStock, assetToBeSent)
+        }
       }
     }
   )