const assert = require('node:assert/strict'); const test = require('node:test'); const { extractObservationFields, parseFinalizedProductionOrderCsv } = require('../services/productionOrderCsvImportService'); test('extractObservationFields reads Brazilian production notes without using the OP quantity as rolls', () => { const result = extractObservationFields(`MALHA\nFORNECEDOR: TECEBEM\nBOBINAS: 10 - 209,94KG\nRENDIMENTO: 3,6\nLOTE: 0245163`); assert.deepEqual(result, { supplier: 'TECEBEM', lotCode: '0245163', yieldPiecesPerKg: 3.6, rollQuantity: 10, fabricKg: 209.94, ribKg: null }); }); test('extractObservationFields supports the validated Olist bobbin multiplier, lot, kg and ribana formats', () => { const result = extractObservationFields('FORNECEDOR: ALTUS\nBOBINAS: 07(X2) - 287KG\nRENDIMENTO: 5,55 - 494KG\n- Lote 01\nRIBANA: 3,59'); assert.deepEqual(result, { supplier: 'ALTUS', lotCode: '01', yieldPiecesPerKg: 5.55, rollQuantity: 14, fabricKg: 287, ribKg: 3.59 }); }); test('extractObservationFields reads standalone KG lines for fabric weight', () => { const result = extractObservationFields('FORNECEDOR: GOL\nBOBINAS: 06\nKG : 204,38\nRENDIMENTO: 5,0\nLote 02'); assert.equal(result.rollQuantity, 6); assert.equal(result.fabricKg, 204.38); assert.equal(result.lotCode, '02'); }); test('parseFinalizedProductionOrderCsv supports multiline observations and skips non-finalized OPs', () => { const csv = `id_op,numero_op,sku_produto,descricao_produto,quantidade_produzida,data_emissao,data_conclusao,situacao,observacoes,pedido_relacionado\n1,10,BLCS.PTO.G,Camiseta preta G,100,2026-08-01T00:00:00.000Z,2026-08-02T00:00:00.000Z,Finalizada,"FORNECEDOR: NEXSTAR\nRENDIMENTO: 5,44\nQUANTIDADE DE ROLOS: 30\nQUILOS DE MALHA: 577,90",PLANO-1\n2,11,BLCS.PTO.M,Camiseta preta M,100,2026-08-01,2026-08-02,Em andamento,Teste,`; const result = parseFinalizedProductionOrderCsv(csv); assert.equal(result.totalRows, 2); assert.equal(result.records.length, 1); assert.equal(result.issues.length, 1); assert.equal(result.records[0].familyKey, 'BLCS'); assert.equal(result.records[0].rollQuantity, 30); assert.equal(result.records[0].fabricKg, 577.9); assert.equal(result.records[0].yieldPiecesPerKg, 5.44); }); test('parseFinalizedProductionOrderCsv accepts structured production fields from a completed template', () => { const csv = 'id_op,numero_op,sku_produto,descricao_produto,quantidade_produzida,data_emissao,data_conclusao,situacao,observacoes,fornecedor,lote,quantidade_rolos,quilos_malha,quilos_ribana,rendimento\n1,10,BLCS.PTO.G,Camiseta preta G,100,2026-08-01,2026-08-02,Finalizada,,TECEBEM,0245163,30,"577,90","28,89","5,44"'; const result = parseFinalizedProductionOrderCsv(csv); assert.equal(result.records.length, 1); assert.equal(result.records[0].supplier, 'TECEBEM'); assert.equal(result.records[0].lotCode, '0245163'); assert.equal(result.records[0].rollQuantity, 30); assert.equal(result.records[0].fabricKg, 577.9); assert.equal(result.records[0].ribKg, 28.89); assert.equal(result.records[0].yieldPiecesPerKg, 5.44); });