diff --git a/conversor_relatorio_estruturas.html b/conversor_relatorio_estruturas.html
index 21f5684..c6e9ab5 100644
--- a/conversor_relatorio_estruturas.html
+++ b/conversor_relatorio_estruturas.html
@@ -626,8 +626,17 @@
if (isSubComp) {
currentAssembly.isComposed = 'SIM';
+
+ let cleanCompMark = itemMark;
+ const subMatch = itemMark.match(/-?(\d{4,})$/) || itemMark.match(/(\d{4,})/);
+ if (subMatch) {
+ cleanCompMark = subMatch[1];
+ } else if (itemMark === '-' || !/^\d{4}$/.test(itemMark)) {
+ cleanCompMark = String(1000 + currentAssembly.components.length);
+ }
+
currentAssembly.components.push({
- marca: itemMark,
+ marca: cleanCompMark,
quantidade: itemQuant,
perfil: itemDesc || currentAssembly.descricao,
material: detectedMaterial || 'A36',
diff --git a/public/conversor_relatorio_estruturas.html b/public/conversor_relatorio_estruturas.html
index 21f5684..c6e9ab5 100644
--- a/public/conversor_relatorio_estruturas.html
+++ b/public/conversor_relatorio_estruturas.html
@@ -626,8 +626,17 @@
if (isSubComp) {
currentAssembly.isComposed = 'SIM';
+
+ let cleanCompMark = itemMark;
+ const subMatch = itemMark.match(/-?(\d{4,})$/) || itemMark.match(/(\d{4,})/);
+ if (subMatch) {
+ cleanCompMark = subMatch[1];
+ } else if (itemMark === '-' || !/^\d{4}$/.test(itemMark)) {
+ cleanCompMark = String(1000 + currentAssembly.components.length);
+ }
+
currentAssembly.components.push({
- marca: itemMark,
+ marca: cleanCompMark,
quantidade: itemQuant,
perfil: itemDesc || currentAssembly.descricao,
material: detectedMaterial || 'A36',
diff --git a/src/components/conversores/AdvanceSteelConverter.tsx b/src/components/conversores/AdvanceSteelConverter.tsx
index 2ff4a8b..b0627ba 100644
--- a/src/components/conversores/AdvanceSteelConverter.tsx
+++ b/src/components/conversores/AdvanceSteelConverter.tsx
@@ -500,8 +500,17 @@ const AdvanceSteelConverterContent: React.FC = () => {
if (isSubComp) {
currentAssembly.isComposed = 'SIM';
+
+ let cleanCompMark = itemMark;
+ const subMatch = itemMark.match(/-?(\d{4,})$/) || itemMark.match(/(\d{4,})/);
+ if (subMatch) {
+ cleanCompMark = subMatch[1];
+ } else if (itemMark === '-' || !/^\d{4}$/.test(itemMark)) {
+ cleanCompMark = String((labels.faixaComponenteMin || 1000) + currentAssembly.components.length);
+ }
+
currentAssembly.components.push({
- marca: itemMark,
+ marca: cleanCompMark,
quantidade: itemQuant,
perfil: itemDesc || currentAssembly.descricao,
material: detectedMaterial || 'A36',
diff --git a/src/hooks/usePecas.tsx b/src/hooks/usePecas.tsx
index db358df..2a97131 100644
--- a/src/hooks/usePecas.tsx
+++ b/src/hooks/usePecas.tsx
@@ -442,13 +442,35 @@ export function usePecas() {
pecasMap.set(pecaKey, pecaData);
}
- if (item.marca_componente && item.marca_componente.trim()) {
+ if (item.marca_componente && String(item.marca_componente).trim()) {
+ const rawMarca = String(item.marca_componente).trim();
+ let cleanMarca = rawMarca;
+
+ // Extrair a marca numérica pura entre 1000 e 9999 (requisito do banco PostgreSQL)
+ const matchSuffix = rawMarca.match(/-?(\d{4,})$/) || rawMarca.match(/(\d{4,})/);
+ if (matchSuffix) {
+ cleanMarca = matchSuffix[1];
+ } else {
+ const digits = rawMarca.replace(/\D/g, '');
+ if (digits.length >= 4) {
+ cleanMarca = digits.slice(-4);
+ } else {
+ cleanMarca = String(1000 + (componentesMap.get(pecaKey)?.length || 0));
+ }
+ }
+
+ let numVal = parseInt(cleanMarca, 10);
+ if (isNaN(numVal) || numVal < 1000 || numVal > 9999) {
+ numVal = 1000 + (componentesMap.get(pecaKey)?.length || 0);
+ }
+ cleanMarca = String(numVal);
+
const componenteData = {
- marca_componente: item.marca_componente.trim(),
- descricao: item.descricao_componente || '',
- perfil: item.perfil_componente || '',
+ marca_componente: cleanMarca,
+ descricao: item.descricao_componente || item.descricao || '',
+ perfil: item.perfil_componente || item.perfil_principal || '',
peso_unitario: Number(item.peso_unitario_componente) || 0,
- quantidade_por_peca: Number(item.quantidade_por_peca) || 1,
+ quantidade_por_peca: Math.max(1, Math.round(Number(item.quantidade_por_peca) || 1)),
user_id: user.id
};