// js/components/pages/Entradas.jsx
// [Wave 23 v224.4 NUCLEAR EXTRACT 2026-05-23] 1395L → ~400L (-71%)
// 4 arquivos novos extraídos (ZERO mudança lógica):
//   - js/lib/entradas/calcs.js (13 factories + 4 helpers + 2 constantes UUIDs)
//   - widgets/entradas/EntradaFormModal.jsx (modal Registrar Entrada)
//   - widgets/entradas/NotaFormModal.jsx (modal Nova Nota Freteiro)
//   - widgets/entradas/EntradasListPanel.jsx (aba Entradas com stats + filtros + tabela)
//
// Mantém 4 widgets externos existentes (Wave 4 KIMI + Backlog #590):
//   - AcabandoPanel, EntradaCancelModal, WarehouseTransferPanel, NotasFreteiroPanel
//
// Este arquivo agora é ORQUESTRADOR: states + refs + effects + handlers + render TabBar + panels + detail modal.
//
// Original: Extraído de index.html em Fase 6 (2026-04-29): L1617-L2036
// Deps runtime: fmt, fmtDate, today, nid, genIdUUID, toast, Modal, SmartSelect, Icon,
//   showConfirm, registerStockEntryAtomic, voidStockEntryAtomic, mapErrorToUX, znxGuard, sb, Sentry
(function() {
  'use strict';
  const {useState, useRef, useMemo, useEffect} = React;

  // [Wave 23 v224.4 + v224.55 2026-05-28] vars+check MOVED to component body (preventivo)
  // regra_validacao_helpers_runtime_quando_ordem_scripts_uncertain

function Entradas({user,products,setProducts,suppliers,entries,setEntries,notasFreteiro,setNotasFreteiro,sales,allUsers}){
  // [v224.55 FIX-PREV-3 2026-05-28] vars+check em render time
  // regra_estender_bloco_refs_fail_loud — 1 bloco agregado COM os existentes + 3 novos
  const calcs = window.ZNX && window.ZNX.entradas && window.ZNX.entradas.calcs;
  const entW = (window.ZNX && window.ZNX.widgets && window.ZNX.widgets.entradas) || {};
  const _missing = [];
  if(!calcs) _missing.push('entradas.calcs');
  if(!entW.AcabandoPanel) _missing.push('AcabandoPanel');
  if(!entW.EntradaCancelModal) _missing.push('EntradaCancelModal');
  if(!entW.WarehouseTransferPanel) _missing.push('WarehouseTransferPanel');
  if(!entW.NotasFreteiroPanel) _missing.push('NotasFreteiroPanel');
  if(!entW.EntradaFormModal) _missing.push('EntradaFormModal');
  if(!entW.NotaFormModal) _missing.push('NotaFormModal');
  if(!entW.EntradasListPanel) _missing.push('EntradasListPanel');
  if(_missing.length){
    const _msg = '[Entradas v224.4] widgets faltando: ' + _missing.join(', ');
    console.error(_msg);
    if(window.Sentry && typeof window.Sentry.captureMessage === 'function'){
      window.Sentry.captureMessage(_msg, 'error');
    }
  }
  const W_ALFONSO = (calcs && calcs.W_ALFONSO) || '507c0241-6ee7-491a-bc6c-aab8e4d630d8';
  const W_SENADOR = (calcs && calcs.W_SENADOR) || '05a89051-be3e-48e2-8ed0-c7674b72d97a';
  const AcabandoPanel = entW.AcabandoPanel;
  const EntradaCancelModal = entW.EntradaCancelModal;
  const WarehouseTransferPanel = entW.WarehouseTransferPanel;
  const NotasFreteiroPanel = entW.NotasFreteiroPanel;
  const EntradaFormModal = entW.EntradaFormModal;
  const NotaFormModal = entW.NotaFormModal;
  const EntradasListPanel = entW.EntradasListPanel;

  const canSeeCost = user.role==='admin';
  const isAdmin = user && user.role === 'admin';
  const canSeeWarehouseComparisons = user && (user.role === 'admin' || user.role === 'estoquista');

  // [v224.89 FIX 2026-05-30] Estoquista NÃO deve ver abas Entradas/Notas em Trânsito.
  // Default tab pra estoquista = 'depositos'. Pra admin mantém 'entradas'.
  const _defaultTab = (user && user.role === 'estoquista') ? 'depositos' : 'entradas';
  const [tab,setTab] = useState(_defaultTab);
  const [modal,setModal] = useState(false);
  const [notaModal,setNotaModal] = useState(false);
  const [viewNota,setViewNota] = useState(null);
  const [form,setForm] = useState({productId:'',supplierId:'',qty:1,unitCost:0,date:today(),notes:'',notaFreteiroId:'',alreadyPaid:false,createPayable:true,dueDays:30,warehouseId:W_SENADOR});
  const [notaForm,setNotaForm] = useState({number:'',freteiro:'',supplierId:'',date:today(),notes:'',items:[],warehouseId:W_SENADOR});
  const [notaItemForm,setNotaItemForm] = useState({productId:'',qtdEsperada:1});
  const [prodSearch,setProdSearch] = useState('');
  const [showDrop,setShowDrop] = useState(false);
  const [selectedProd,setSelectedProd] = useState(null);
  const [suppSearch,setSuppSearch] = useState('');
  const [showSuppDrop,setShowSuppDrop] = useState(false);
  const [selectedSupp,setSelectedSupp] = useState(null);
  const [voidModal,setVoidModal] = useState(null);
  const [voidReason,setVoidReason] = useState('');
  const [voidInFlight,setVoidInFlight] = useState(false);
  const [detailModalId,setDetailModalId] = useState(null);

  // Filtros aba Entradas
  const [searchTerm,setSearchTerm] = useState('');
  const [filterSupplier,setFilterSupplier] = useState('');
  const [filterDateFrom,setFilterDateFrom] = useState('');
  const [filterDateTo,setFilterDateTo] = useState('');
  const [showVoided,setShowVoided] = useState(false);
  const [groupByDay,setGroupByDay] = useState(true);
  const [sortBy,setSortBy] = useState('date_desc');

  // Loading refs (regra_loading_state_obrigatorio)
  const saveEntryInflightRef = useRef(false);
  const [isSavingEntry,setIsSavingEntry] = useState(false);
  const saveNotaInflightRef = useRef(false);
  const [isSavingNota,setIsSavingNota] = useState(false);

  // Warehouses
  const [warehouses,setWarehouses] = useState([
    {id:W_SENADOR,name:'Senador',is_principal:false},
    {id:W_ALFONSO,name:'Alfonso',is_principal:true}
  ]);
  useEffect(function(){
    if(typeof sb==='undefined'||typeof sb.from!=='function') return;
    sb.from('warehouses').select('id,name,is_principal,deleted_at').is('deleted_at',null).then(function(res){
      const data=res.data, error=res.error;
      if(error||!Array.isArray(data)||data.length===0) return;
      const sorted = data.slice().sort(function(a,b){return (a.is_principal?1:0)-(b.is_principal?1:0);});
      setWarehouses(sorted);
    });
  },[]);
  const warehouseName = function(id){
    const w = warehouses.find(function(w){return w.id===id;});
    return (w && w.name) || '—';
  };

  // Falta Alfonso/Senador selecionados (Map<id, qty>)
  const [selectedFaltAlf, setSelectedFaltAlf] = useState(function(){return new Map();});
  const [selectedFaltSen, setSelectedFaltSen] = useState(function(){return new Map();});
  const [bulkXferVer, setBulkXferVer] = useState(0);
  const bulkXferInflightRef = useRef(false);
  const [bulkXferProgress, setBulkXferProgress] = useState(null);

  // ABA Acabando
  const [acabandoWh,setAcabandoWh] = useState(W_ALFONSO);
  const [reorderRequests,setReorderRequests] = useState([]);
  const [loadingReorders,setLoadingReorders] = useState(false);
  const pediInflightRef = useRef(new Set());
  const [pediVer,setPediVer] = useState(0);

  // Fetch reorder_requests
  useEffect(function(){
    if(!canSeeWarehouseComparisons) return;
    if(typeof sb==='undefined'||typeof sb.from!=='function') return;
    setLoadingReorders(true);
    const since = new Date(Date.now()-7*86400000).toISOString();
    sb.from('reorder_requests')
      .select('id,product_id,warehouse_id,qty_suggested,velocity_per_day,current_stock_snapshot,requested_by_name,requested_at,fulfilled,fulfilled_at')
      .gte('requested_at',since)
      .order('requested_at',{ascending:false})
      .then(function(res){
        const data=res.data, error=res.error;
        if(error){
          console.error('[ZNX v215] fetch reorder_requests', error);
          if(typeof Sentry!=='undefined') try{Sentry.captureException(error,{tags:{feature:'acabando_fetch'}});}catch(_){}
        }else{
          setReorderRequests(data||[]);
        }
        setLoadingReorders(false);
      });
  },[canSeeWarehouseComparisons,tab]);

  // useMemo via factories (delegam pra calcs — ZERO lógica nova)
  const velocidade30dByProduct = useMemo(function(){return calcs.computeVelocidade30dByProduct(sales);},[sales]);
  const pedidoRecente72h = useMemo(function(){return calcs.computePedidoRecente72h(reorderRequests, acabandoWh);},[reorderRequests, acabandoWh]);
  const acabandoData = useMemo(function(){return calcs.computeAcabandoData(products, acabandoWh, velocidade30dByProduct, pedidoRecente72h);},[products, acabandoWh, velocidade30dByProduct, pedidoRecente72h, pediVer]);
  const acabandoStats = useMemo(function(){return calcs.computeAcabandoStats(acabandoData);},[acabandoData]);
  const faltaAlfonso = useMemo(function(){return calcs.computeFaltaAlfonso(products);},[products]);
  const faltaSenador = useMemo(function(){return calcs.computeFaltaSenador(products);},[products]);
  const faltaAlfonsoTotal = useMemo(function(){return calcs.computeFaltaAlfonsoTotal(faltaAlfonso);},[faltaAlfonso]);
  const faltaSenadorTotal = useMemo(function(){return calcs.computeFaltaSenadorTotal(faltaSenador);},[faltaSenador]);

  // Handler "Pedi" (inline — RPC + setState complexo)
  async function handlePedi(item){
    if(typeof sb==='undefined'||typeof sb.from!=='function'){
      if(typeof toast==='function') toast('⚠️ Conexão indisponível, recarregue a página','error');
      return;
    }
    if(pediInflightRef.current.has(item.id)){
      if(typeof toast==='function') toast('⏳ Já registrando esse pedido...','info');
      return;
    }
    pediInflightRef.current.add(item.id);
    setPediVer(function(v){return v+1;});
    try{
      const res = await sb.from('reorder_requests').insert({
        product_id: item.id, warehouse_id: acabandoWh,
        qty_suggested: item.qtySuggested, velocity_per_day: item.velocity,
        current_stock_snapshot: item.stock,
        requested_by: (user && user.id) || null,
        requested_by_name: (user && user.name) || '—'
      }).select().maybeSingle();
      const data = res.data, error = res.error;
      if(error){
        if(String(error.code)==='23505'){
          if(typeof toast==='function') toast('⚠️ Esse produto já tem pedido pendente — outro estoquista já marcou','warning');
        }else{
          console.error('[ZNX v215] handlePedi', error);
          if(typeof toast==='function') toast('❌ Falha ao registrar pedido: '+(error.message||error.code),'error');
          if(typeof Sentry!=='undefined') try{Sentry.captureException(error,{tags:{feature:'acabando_pedi',action:'insert'},extra:{product_id:item.id,warehouse_id:acabandoWh}});}catch(_){}
        }
      }else if(data){
        setReorderRequests(function(prev){return [data].concat(prev);});
        if(typeof toast==='function') toast('✅ Pedido registrado — '+item.name+' ('+item.qtySuggested+' un. sugeridas)','success');
      }
    }catch(e){
      console.error('[ZNX v215] handlePedi catch', e);
      if(typeof toast==='function') toast('❌ Erro inesperado, tente novamente','error');
      if(typeof Sentry!=='undefined') try{Sentry.captureException(e,{tags:{feature:'acabando_pedi'}});}catch(_){}
    }finally{
      pediInflightRef.current.delete(item.id);
      setPediVer(function(v){return v+1;});
    }
  }

  // bulkTransfer (inline — RPC loop complexo)
  async function bulkTransfer(direction){
    if(bulkXferInflightRef.current){toast('⏳ Já tem transferência em andamento');return;}
    const isFaltAlf = direction === 'senador_to_alfonso';
    const selected = isFaltAlf ? selectedFaltAlf : selectedFaltSen;
    const list = isFaltAlf ? faltaAlfonso : faltaSenador;
    const fromW = isFaltAlf ? W_SENADOR : W_ALFONSO;
    const toW = isFaltAlf ? W_ALFONSO : W_SENADOR;
    const fromName = isFaltAlf ? 'Senador' : 'Alfonso';
    const toName = isFaltAlf ? 'Alfonso' : 'Senador';
    if(!selected || selected.size===0){toast('Selecione pelo menos 1 SKU');return;}

    const ents = Array.from(selected.entries());
    const invalid = [];
    for(const pair of ents){
      const pid = pair[0], qty = pair[1];
      const item = list.find(function(x){return x.id===pid;});
      const max = (item && item.qty) || 0;
      const q = Number(qty)||0;
      if(q<=0) invalid.push({pid:pid, name:(item && item.name)||pid, reason:'qty inválida ('+q+')'});
      else if(q>max) invalid.push({pid:pid, name:(item && item.name)||pid, reason:'qty '+q+' > disponível '+max});
    }
    if(invalid.length>0){
      toast('❌ '+invalid.length+' SKU(s) com qty inválida: '+invalid.slice(0,3).map(function(x){return x.name;}).join(', ')+(invalid.length>3?'…':''));
      return;
    }
    const totalUn = ents.reduce(function(s,p){return s+(Number(p[1])||0);},0);
    if(!await showConfirm({
      title: 'Transferir '+fromName+' → '+toName,
      message: 'Transferir '+selected.size+' SKUs ('+totalUn+' un. total)?\nCada SKU será movido com a qty que você escolheu na tabela.\n(Depois pode acompanhar em Depósitos > Transferências.)',
      confirmText: 'Transferir',
      confirmColor: '#1B2A4A'
    })) return;

    bulkXferInflightRef.current = true;
    setBulkXferProgress({done:0,total:selected.size,fails:[]});
    let success = 0; const fails = [];
    for(const pair of ents){
      const pid = pair[0], qty = pair[1];
      const item = list.find(function(x){return x.id===pid;});
      if(!item){fails.push({id:pid,error:'item not found'}); continue;}
      try{
        const idem = (typeof crypto!=='undefined' && crypto.randomUUID) ? crypto.randomUUID() : (Date.now()+'-'+Math.random());
        const res = await sb.rpc('transfer_request',{
          p_product_id: pid,
          p_qty: Number(qty),
          p_from_warehouse_id: fromW,
          p_to_warehouse_id: toW,
          p_notes: 'Bulk via Entradas > Falta em '+toName,
          p_idem_key: idem
        });
        if(res.error) throw res.error;
        success++;
      }catch(e){
        fails.push({id:pid,name:item.name,error:(e && e.message)||String(e)});
        if(typeof Sentry!=='undefined') Sentry.captureException(e,{extra:{context:'bulk_transfer',direction:direction,product_id:pid,qty:qty}});
      }
      setBulkXferProgress(function(p){return Object.assign({},p,{done:((p && p.done)||0)+1, fails:fails});});
    }
    bulkXferInflightRef.current = false;
    setBulkXferProgress(null);
    if(isFaltAlf) setSelectedFaltAlf(new Map()); else setSelectedFaltSen(new Map());
    setBulkXferVer(function(v){return v+1;});
    toast('✅ '+success+' transferência(s) solicitada(s)'+(fails.length?' · ❌ '+fails.length+' falhou':'')+'. Veja em Depósitos > Transferências pra aprovar.');
  }

  function toggleSelect(direction, id, defaultQty){
    const setter = direction==='falt_alf' ? setSelectedFaltAlf : setSelectedFaltSen;
    setter(function(prev){
      const n = new Map(prev);
      if(n.has(id)) n.delete(id);
      else n.set(id, Math.max(1, Number(defaultQty)||1));
      return n;
    });
    setBulkXferVer(function(v){return v+1;});
  }
  function setItemQty(direction, id, newQty, max){
    const q = Math.max(0, Math.min(Number(max)||0, Math.floor(Number(newQty)||0)));
    const setter = direction==='falt_alf' ? setSelectedFaltAlf : setSelectedFaltSen;
    setter(function(prev){
      const n = new Map(prev);
      if(n.has(id)) n.set(id, q);
      return n;
    });
    setBulkXferVer(function(v){return v+1;});
  }
  function selectAll(direction, list){
    const m = new Map(list.map(function(x){return [x.id, x.qty];}));
    if(direction==='falt_alf') setSelectedFaltAlf(m); else setSelectedFaltSen(m);
    setBulkXferVer(function(v){return v+1;});
  }
  function clearSelection(direction){
    if(direction==='falt_alf') setSelectedFaltAlf(new Map()); else setSelectedFaltSen(new Map());
    setBulkXferVer(function(v){return v+1;});
  }

  // Pipeline filter/sort/group via factories
  const filteredEntries = useMemo(function(){
    return calcs.computeFilteredEntries(entries, searchTerm, filterSupplier, filterDateFrom, filterDateTo, showVoided, sortBy, products, suppliers);
  },[entries,searchTerm,filterSupplier,filterDateFrom,filterDateTo,showVoided,sortBy,products,suppliers]);
  const monthStats = useMemo(function(){return calcs.computeMonthStats(entries);},[entries]);
  const groupedByDay = useMemo(function(){return calcs.computeGroupedByDay(filteredEntries, groupByDay);},[filteredEntries,groupByDay]);

  // confirmVoid (inline — RPC + setState)
  async function confirmVoid(){
    if(voidInFlight) return;
    if(!voidReason.trim() || voidReason.trim().length < 3){
      toast('Motivo obrigatório (mínimo 3 caracteres)');
      return;
    }
    if(!voidModal || !voidModal.entry || !voidModal.entry.id) return;
    setVoidInFlight(true);
    try{
      const result = await window.voidStockEntryAtomic(voidModal.entry.id, voidReason.trim());
      if(!result.success){
        const msg = (typeof mapErrorToUX==='function' ? mapErrorToUX(result.errorCode, result.errorMessage) : null)
                  || result.errorMessage || 'Erro ao cancelar entrada';
        toast('❌ '+msg);
        return;
      }
      setEntries(function(prev){return prev.map(function(e){return e.id===voidModal.entry.id ? Object.assign({},e,{isVoid:true, voidedAt:result.voided_at}) : e;});});
      setProducts(function(prev){return prev.map(function(p){return p.id===result.product_id
        ? Object.assign({},p,{stock:result.new_stock, avgCost:result.new_avg_cost, avg_cost:result.new_avg_cost})
        : p;});});
      setVoidModal(null);
      setVoidReason('');
      toast('✅ Entrada cancelada — '+result.reverted_qty+' un. revertidas do estoque');
    } finally {
      setVoidInFlight(false);
    }
  }

  // inactiveLookup
  const [inactiveLookup,setInactiveLookup] = useState({});
  useEffect(function(){
    const missing = new Set();
    for(const n of (notasFreteiro||[])){
      for(const it of (n.items||[])){
        if(!products.find(function(p){return typeof nid==='function' ? nid(p.id,it.productId) : String(p.id)===String(it.productId);}) && !inactiveLookup[it.productId]){
          missing.add(it.productId);
        }
      }
    }
    if(missing.size===0) return;
    sb.from('products').select('id,name').in('id',Array.from(missing)).then(function(res){
      const data=res.data, error=res.error;
      if(error||!Array.isArray(data)||data.length===0) return;
      setInactiveLookup(function(prev){
        const out = Object.assign({},prev);
        data.forEach(function(p){out[p.id]=p;});
        return out;
      });
    });
  },[notasFreteiro,products,inactiveLookup]);

  // Search results via factories
  const prodResults = useMemo(function(){return calcs.computeProdResults(prodSearch, products);},[prodSearch,products]);
  const suppResults = useMemo(function(){return calcs.computeSuppResults(suppSearch, suppliers);},[suppSearch,suppliers]);

  // notaProgress/notaStatus wrappers (passam entries do contexto)
  function notaProgress(nota){return calcs.notaProgress(nota, entries);}
  function notaStatus(nota){return calcs.notaStatus(nota, entries);}

  function openModal(){
    const defaultWh = (function(){
      if(warehouses.length===1) return warehouses[0].id;
      const sen = warehouses.find(function(w){return !w.is_principal;});
      return sen ? sen.id : ((warehouses[0] && warehouses[0].id) || W_SENADOR);
    })();
    setForm({productId:'',supplierId:'',qty:1,unitCost:0,date:today(),notes:'',notaFreteiroId:'',alreadyPaid:false,createPayable:true,dueDays:30,warehouseId:defaultWh});
    setProdSearch(''); setSelectedProd(null); setShowDrop(false);
    setSuppSearch(''); setSelectedSupp(null); setShowSuppDrop(false);
    setModal(true);
  }

  function openNotaModal(){
    const nextNum = 'NFR-'+(String((notasFreteiro||[]).length+1).padStart(3,'0'));
    const defaultWh = (function(){
      if(warehouses.length===1) return warehouses[0].id;
      const sen = warehouses.find(function(w){return !w.is_principal;});
      return sen ? sen.id : ((warehouses[0] && warehouses[0].id) || W_SENADOR);
    })();
    setNotaForm({number:nextNum,freteiro:'',supplierId:'',date:today(),notes:'',items:[],warehouseId:defaultWh});
    setNotaItemForm({productId:'',qtdEsperada:1});
    setNotaModal(true);
  }

  async function saveNota(){
    if(!await znxGuard(['admin','estoquista'])) return;
    if(saveNotaInflightRef.current){toast('⏳ Salvando nota, aguarde…'); return;}
    if(!notaForm.freteiro.trim()){toast('Informe o nome do freteiro'); return;}
    if(notaForm.items.length===0){toast('Adicione ao menos um produto à nota'); return;}
    saveNotaInflightRef.current = true;
    setIsSavingNota(true);
    try{
      setNotasFreteiro(function(prev){return [Object.assign({},notaForm,{id:genIdUUID()})].concat(prev||[]);});
      setNotaModal(false);
    } finally {
      saveNotaInflightRef.current = false;
      setIsSavingNota(false);
    }
  }

  function selectProduct(p){
    setSelectedProd(p);
    setProdSearch(p.name);
    setShowDrop(false);
    const linkedSupp = suppliers.find(function(s){return s.id===p.supplierId;});
    setForm(function(f){return Object.assign({},f,{productId:p.id, unitCost:p.avgCost||0, supplierId:p.supplierId||f.supplierId||''});});
    if(linkedSupp && !selectedSupp){
      setSelectedSupp(linkedSupp);
      setSuppSearch(linkedSupp.name);
    }
  }
  function selectSupplier(s){
    setSelectedSupp(s);
    setSuppSearch(s.name);
    setShowSuppDrop(false);
    setForm(function(f){return Object.assign({},f,{supplierId:s.id});});
  }

  async function save(){
    if(!await znxGuard(['admin','estoquista'])) return;
    if(saveEntryInflightRef.current){toast('⏳ Registrando entrada, aguarde…'); return;}
    if(!form.productId){toast('Selecione um produto'); return;}
    const qty = Number(form.qty);
    const cost = Number(form.unitCost);
    if(!qty||qty<=0){toast('Qtd deve ser maior que 0'); return;}
    if(cost<0){toast('Custo inválido'); return;}
    if(!form.warehouseId){toast('Selecione o depósito de destino'); return;}
    saveEntryInflightRef.current = true;
    setIsSavingEntry(true);
    try {
      const result = await window.registerStockEntryAtomic({
        product_id: form.productId,
        supplier_id: form.supplierId || null,
        qty: qty,
        unit_cost: cost,
        notes: form.notes || null,
        nota_freteiro_id: form.notaFreteiroId || null,
        already_paid: form.alreadyPaid === true,
        create_payable: form.alreadyPaid === true ? false : (form.createPayable !== false),
        due_days: Number(form.dueDays) || 30,
        warehouse_id: form.warehouseId
      });
      if(!result.success){
        const msg = (typeof mapErrorToUX==='function' ? mapErrorToUX(result.errorCode, result.errorMessage) : null)
                  || result.errorMessage || 'Erro ao registrar entrada';
        toast('❌ '+msg);
        if(typeof Sentry!=='undefined') Sentry.captureException(
          new Error(result.errorCode || 'registerStockEntry failed'),
          {extra:{errorCode:result.errorCode, errorMessage:result.errorMessage, productId:form.productId}}
        );
        return;
      }
      setProducts(function(prev){return prev.map(function(p){
        if(p.id!==form.productId) return p;
        const sb_ = Object.assign({}, p.stock_breakdown||p.stockBreakdown||{});
        sb_[form.warehouseId] = (Number(sb_[form.warehouseId])||0) + qty;
        return Object.assign({},p,{stock:result.new_stock, avgCost:result.new_avg_cost, avg_cost:result.new_avg_cost, stock_breakdown:sb_, stockBreakdown:sb_, updatedAt:result.created_at});
      });});
      setEntries(function(prev){return [{
        id: result.entry_id,
        productId: form.productId,
        supplierId: form.supplierId || null,
        qty: qty,
        unitCost: cost,
        notes: form.notes || '',
        notaFreteiroId: form.notaFreteiroId || null,
        createdAt: result.created_at,
        createdBy: result.created_by_name,
        isVoid: false,
        payableId: result.payable_id || null,
        alreadyPaid: form.alreadyPaid === true,
        warehouseId: form.warehouseId,
        warehouse_id: form.warehouseId
      }].concat(prev);});
      setModal(false);
      toast('✅ Entrada registrada — '+qty+' un. → '+(result.warehouse_name || warehouseName(form.warehouseId))+(result.payable_id ? '\n💳 Conta a pagar criada: '+(typeof fmt==='function'?fmt(result.payable_value):'R$ '+(result.payable_value||0).toFixed(2))+' (vencimento '+(Number(form.dueDays)||30)+' dias)' : (form.alreadyPaid ? '\n✓ Pagamento já feito' : '')));
    } catch(e) {
      const msg = e.message || 'Erro inesperado. Tente novamente.';
      toast('❌ '+msg);
      if(typeof Sentry!=='undefined') Sentry.captureException(e,{extra:{context:'save_entradas',errorMessage:e.message}});
    } finally {
      saveEntryInflightRef.current = false;
      setIsSavingEntry(false);
    }
  }

  const notasAbertas = (notasFreteiro||[]).filter(function(n){return notaStatus(n)!=='Completo';});

  // ── RENDER ────────────────────────────────────────────────────
  return (
    <div>
      <div className="page-header">
        <div className="page-title">Entrada de Estoque</div>
        <div style={{display:'flex',gap:8}}>
          {tab==='notas' && <button className="btn-gold" onClick={openNotaModal} style={{display:'flex',alignItems:'center',gap:6}}><Icon n="plus" size={14}/>Nova Nota</button>}
          {tab==='entradas' && <button className="btn-gold" onClick={openModal} style={{display:'flex',alignItems:'center',gap:6}}><Icon n="plus" size={14}/>Registrar Entrada</button>}
        </div>
      </div>

      {/* [v224.40 PRIVACY] TabBar condicional · admin OR can_manage_notes_freteiro→tab "Notas do Freteiro" · outros estoquistas→tab read-only "Notas em Trânsito" */}
      <div style={{display:'flex',gap:4,marginBottom:20,borderBottom:'2px solid #F3F4F6',paddingBottom:0}}>
        {(function(){
          // [v224.89 FIX 2026-05-30] Estoquista NÃO vê Entradas nem Notas em Trânsito.
          // Antes: Entradas aparecia sempre + estoquista via Notas em Trânsito.
          // Agora: estoquista vê SÓ Depósitos + Falta Alfonso/Senador + Acabando.
          var canManageNotes = user.role==='admin' || user.can_manage_notes_freteiro === true;
          var canViewEntradasTab = user.role !== 'estoquista';
          var baseTabs = [];
          if(canViewEntradasTab) baseTabs.push(['entradas','📦 Entradas']);
          if(canManageNotes) baseTabs.push(['notas','🚚 Notas do Freteiro']);
          // canViewNotasTransito DEPRECATED em v224.89 · estoquista NÃO vê mais aba notas_transito
          baseTabs.push(['depositos','🏬 Depósitos']);
          return baseTabs;
        })().concat(canSeeWarehouseComparisons ? [
          ['falt_alf','⚠️ Falta em Alfonso'+(faltaAlfonsoTotal.skus?' ('+faltaAlfonsoTotal.skus+')':'')],
          ['falt_sen','ℹ️ Falta em Senador'+(faltaSenadorTotal.skus?' ('+faltaSenadorTotal.skus+')':'')],
          ['acabando','🔥 Acabando'+(acabandoStats.total?' ('+acabandoStats.total+')':'')]
        ] : []).map(function(pair){
          const id = pair[0], label = pair[1];
          return (
            <button key={id} onClick={function(){setTab(id);}}
              style={{padding:'9px 18px',borderRadius:'6px 6px 0 0',fontSize:13,fontWeight:tab===id?700:500,background:tab===id?'#FFFFFF':'transparent',border:tab===id?'2px solid #F3F4F6':'2px solid transparent',borderBottom:tab===id?'2px solid #FFFFFF':'none',color:tab===id?'#2563EB':'#6B7280',marginBottom:tab===id?-2:0,cursor:'pointer'}}>{label}</button>
          );
        })}
      </div>

      {/* ABA DEPÓSITOS */}
      {tab==='depositos' && window.Depositos && (
        <window.Depositos user={user} products={products} allUsers={allUsers}/>
      )}

      {/* ABA FALTA ALFONSO */}
      {tab==='falt_alf' && canSeeWarehouseComparisons && WarehouseTransferPanel && (
        <WarehouseTransferPanel
          list={faltaAlfonso} totals={faltaAlfonsoTotal} sel={selectedFaltAlf}
          variant="alfonso" canSeeCost={canSeeCost}
          clearSelection={clearSelection} selectAll={selectAll}
          toggleSelect={toggleSelect} setItemQty={setItemQty}
          bulkTransfer={bulkTransfer} totalSelectedUn={calcs.totalSelectedUn}
          bulkXferInflightRef={bulkXferInflightRef} bulkXferProgress={bulkXferProgress}/>
      )}

      {/* ABA FALTA SENADOR */}
      {tab==='falt_sen' && canSeeWarehouseComparisons && WarehouseTransferPanel && (
        <WarehouseTransferPanel
          list={faltaSenador} totals={faltaSenadorTotal} sel={selectedFaltSen}
          variant="senador" canSeeCost={canSeeCost}
          clearSelection={clearSelection} selectAll={selectAll}
          toggleSelect={toggleSelect} setItemQty={setItemQty}
          bulkTransfer={bulkTransfer} totalSelectedUn={calcs.totalSelectedUn}
          bulkXferInflightRef={bulkXferInflightRef} bulkXferProgress={bulkXferProgress}/>
      )}

      {/* ABA ACABANDO */}
      {tab==='acabando' && canSeeWarehouseComparisons && AcabandoPanel && (
        <AcabandoPanel
          acabandoWh={acabandoWh} setAcabandoWh={setAcabandoWh}
          acabandoData={acabandoData} acabandoStats={acabandoStats}
          loadingReorders={loadingReorders} pediInflightRef={pediInflightRef}
          handlePedi={handlePedi} warehouseName={warehouseName}
          W_ALFONSO={W_ALFONSO} W_SENADOR={W_SENADOR}/>
      )}

      {/* ABA ENTRADAS */}
      {tab==='entradas' && EntradasListPanel && (
        <EntradasListPanel
          entries={entries} filteredEntries={filteredEntries} groupedByDay={groupedByDay}
          monthStats={monthStats} suppliers={suppliers} products={products}
          notasFreteiro={notasFreteiro} warehouseName={warehouseName}
          searchTerm={searchTerm} setSearchTerm={setSearchTerm}
          filterSupplier={filterSupplier} setFilterSupplier={setFilterSupplier}
          filterDateFrom={filterDateFrom} setFilterDateFrom={setFilterDateFrom}
          filterDateTo={filterDateTo} setFilterDateTo={setFilterDateTo}
          showVoided={showVoided} setShowVoided={setShowVoided}
          groupByDay={groupByDay} setGroupByDay={setGroupByDay}
          sortBy={sortBy} setSortBy={setSortBy}
          canSeeCost={canSeeCost} isAdmin={isAdmin} user={user}
          onVoidClick={function(entry, productName){setVoidModal({entry:entry, productName:productName}); setVoidReason('');}}
          onDetailClick={function(id){setDetailModalId(id);}}
          onOpenNota={function(nf){setViewNota(nf);}}
          setTab={setTab}/>
      )}

      {/* ABA NOTAS · só admin OR can_manage_notes_freteiro */}
      {tab==='notas' && NotasFreteiroPanel && (
        <NotasFreteiroPanel
          notasFreteiro={notasFreteiro} viewNota={viewNota} products={products}
          inactiveLookup={inactiveLookup} suppliers={suppliers}
          setViewNota={setViewNota} setForm={setForm}
          setSelectedSupp={setSelectedSupp} setSuppSearch={setSuppSearch}
          setTab={setTab} setModal={setModal}
          notaProgress={notaProgress} notaStatus={notaStatus}/>
      )}

      {/* [v224.40 PRIVACY] ABA NOTAS EM TRÂNSITO · read-only pra estoquistas SEM can_manage_notes_freteiro */}
      {tab==='notas_transito' && (window.ZNX && window.ZNX.widgets && window.ZNX.widgets.entradas && window.ZNX.widgets.entradas.NotasEmTransitoPanel) && (
        <window.ZNX.widgets.entradas.NotasEmTransitoPanel
          notasFreteiro={notasFreteiro}
          products={products}
          inactiveLookup={inactiveLookup}
          suppliers={suppliers}
          notaProgress={notaProgress}
          notaStatus={notaStatus}/>
      )}

      {/* Modais */}
      {modal && EntradaFormModal && (
        <EntradaFormModal
          form={form} setForm={setForm} suppliers={suppliers} products={products}
          suppResults={suppResults} prodResults={prodResults}
          prodSearch={prodSearch} setProdSearch={setProdSearch} showDrop={showDrop} setShowDrop={setShowDrop}
          selectedProd={selectedProd} setSelectedProd={setSelectedProd}
          suppSearch={suppSearch} setSuppSearch={setSuppSearch} showSuppDrop={showSuppDrop} setShowSuppDrop={setShowSuppDrop}
          selectedSupp={selectedSupp} setSelectedSupp={setSelectedSupp}
          notasAbertas={notasAbertas} warehouses={warehouses}
          onSave={save} onCancel={function(){setModal(false);}}
          isSavingEntry={isSavingEntry} canSeeCost={canSeeCost}
          notaProgress={notaProgress}
          selectProduct={selectProduct} selectSupplier={selectSupplier}/>
      )}

      {notaModal && NotaFormModal && (
        <NotaFormModal
          notaForm={notaForm} setNotaForm={setNotaForm}
          notaItemForm={notaItemForm} setNotaItemForm={setNotaItemForm}
          suppliers={suppliers} products={products} warehouses={warehouses}
          onSave={saveNota} onCancel={function(){setNotaModal(false);}}
          isSavingNota={isSavingNota}/>
      )}

      {voidModal && EntradaCancelModal && (
        <EntradaCancelModal
          voidModal={voidModal} voidReason={voidReason} voidInFlight={voidInFlight}
          setVoidModal={setVoidModal} setVoidReason={setVoidReason}
          onConfirm={confirmVoid} warehouseName={warehouseName}/>
      )}

      {/* Detail modal (inline — usa Modal global) */}
      {detailModalId && (function(){
        const e = (entries||[]).find(function(x){return x.id === detailModalId;});
        if(!e){setTimeout(function(){setDetailModalId(null);}, 0); return null;}
        const p = (products||[]).find(function(x){return typeof nid==='function' ? nid(x.id, e.productId) : String(x.id)===String(e.productId);});
        const s = (suppliers||[]).find(function(x){return x.id === e.supplierId;});
        const nf = e.notaFreteiroId ? (notasFreteiro||[]).find(function(n){return n.id === e.notaFreteiroId;}) : null;
        const fmtTs = function(ts){
          if(!ts) return '—';
          const d = new Date(ts); if(isNaN(d)) return '—';
          return d.toLocaleString('pt-BR',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit',second:'2-digit'});
        };
        const createdTs = e.createdAt || e.created_at || e.date;
        const updatedTs = e.updatedAt || e.updated_at;
        const voidedTs = e.voidedAt || e.voided_at;
        const wasUpdated = updatedTs && createdTs && new Date(updatedTs).getTime() - new Date(createdTs).getTime() > 60000;
        return (
          <Modal title={'📦 Histórico — Entrada de '+((p && p.name)||'produto')} onClose={function(){setDetailModalId(null);}}>
            <div style={{display:'flex',flexDirection:'column',gap:16}}>
              <div style={{background:'#F0F9FF',border:'1px solid #BAE6FD',borderRadius:8,padding:14}}>
                <div style={{display:'grid',gridTemplateColumns:'repeat(2,1fr)',gap:10,fontSize:13}}>
                  <div><div style={{fontSize:10,color:'#6B7280',textTransform:'uppercase',letterSpacing:0.5}}>Produto</div><div style={{fontWeight:600,color:'#1B2A4A'}}>{(p && p.name)||'—'}</div></div>
                  <div><div style={{fontSize:10,color:'#6B7280',textTransform:'uppercase',letterSpacing:0.5}}>Quantidade</div><div style={{fontWeight:600,color:'#1B2A4A'}}>{e.qty} un.</div></div>
                  {canSeeCost && <div><div style={{fontSize:10,color:'#6B7280',textTransform:'uppercase',letterSpacing:0.5}}>Custo unitário</div><div style={{fontWeight:600,color:'#92700A'}}>{fmt(e.unitCost)}</div></div>}
                  {canSeeCost && <div><div style={{fontSize:10,color:'#6B7280',textTransform:'uppercase',letterSpacing:0.5}}>Total</div><div style={{fontWeight:700,color:'#92700A'}}>{fmt(e.qty*e.unitCost)}</div></div>}
                  {/* [v224.27 ESTOQUISTA-PRIVACY 20260526] esconde Fornecedor pra estoquista */}
                  {(typeof window!=='undefined' && window.canSeeSupplier && window.canSeeSupplier(user)) && (
                    <div><div style={{fontSize:10,color:'#6B7280',textTransform:'uppercase',letterSpacing:0.5}}>Fornecedor</div><div>{(s && s.name)||'—'}</div></div>
                  )}
                  <div><div style={{fontSize:10,color:'#6B7280',textTransform:'uppercase',letterSpacing:0.5}}>Origem</div><div>{nf ? '🚚 Frete '+nf.number : (e.freight_note_id ? '🚛 Frete (FRT)' : '🛒 Compra direta')}</div></div>
                  <div><div style={{fontSize:10,color:'#6B7280',textTransform:'uppercase',letterSpacing:0.5}}>Depósito</div><div style={{fontWeight:600,color:(e.warehouseId||e.warehouse_id)===W_ALFONSO?'#92400E':'#1E40AF'}}>{warehouseName(e.warehouseId||e.warehouse_id)}</div></div>
                </div>
                {e.notes && <div style={{marginTop:10,paddingTop:10,borderTop:'1px solid #BAE6FD',fontSize:12,color:'#374151'}}><strong>Obs:</strong> {e.notes}</div>}
              </div>
              <div>
                <div style={{fontSize:12,fontWeight:700,color:'#374151',textTransform:'uppercase',letterSpacing:1,marginBottom:10}}>📜 Histórico</div>
                <div style={{display:'flex',flexDirection:'column',gap:10}}>
                  <div style={{display:'flex',gap:12,alignItems:'flex-start',padding:10,background:'#F0FDF4',borderLeft:'3px solid #16A34A',borderRadius:6}}>
                    <div style={{fontSize:18}}>✨</div>
                    <div style={{flex:1}}>
                      <div style={{fontSize:13,fontWeight:600,color:'#15803D'}}>Entrada criada</div>
                      <div style={{fontSize:11,color:'#6B7280',marginTop:2}}>🕐 {fmtTs(createdTs)}</div>
                      <div style={{fontSize:12,color:'#374151',marginTop:4}}>Por: <strong>{e.createdBy || e.created_by_name || '—'}</strong></div>
                    </div>
                  </div>
                  {wasUpdated && !e.isVoid && (
                    <div style={{display:'flex',gap:12,alignItems:'flex-start',padding:10,background:'#EFF6FF',borderLeft:'3px solid #2563EB',borderRadius:6}}>
                      <div style={{fontSize:18}}>✏️</div>
                      <div style={{flex:1}}>
                        <div style={{fontSize:13,fontWeight:600,color:'#1D4ED8'}}>Última edição</div>
                        <div style={{fontSize:11,color:'#6B7280',marginTop:2}}>🕐 {fmtTs(updatedTs)}</div>
                        <div style={{fontSize:12,color:'#374151',marginTop:4}}>Por: <strong>{e.updatedBy || e.updated_by || '—'}</strong></div>
                      </div>
                    </div>
                  )}
                  {e.isVoid && (
                    <div style={{display:'flex',gap:12,alignItems:'flex-start',padding:10,background:'#FEF2F2',borderLeft:'3px solid #DC2626',borderRadius:6}}>
                      <div style={{fontSize:18}}>🗑️</div>
                      <div style={{flex:1}}>
                        <div style={{fontSize:13,fontWeight:600,color:'#991B1B'}}>Entrada CANCELADA (estoque revertido)</div>
                        <div style={{fontSize:11,color:'#6B7280',marginTop:2}}>🕐 {fmtTs(voidedTs)}</div>
                        <div style={{fontSize:12,color:'#374151',marginTop:4}}>Por: <strong>{e.voidedBy || e.voided_by || '—'}</strong></div>
                        {(e.voidReason || e.void_reason) && <div style={{fontSize:12,color:'#991B1B',marginTop:6,padding:8,background:'#fff',borderRadius:4}}><strong>Motivo:</strong> {e.voidReason || e.void_reason}</div>}
                      </div>
                    </div>
                  )}
                </div>
              </div>
              <div style={{display:'flex',justifyContent:'flex-end'}}>
                <button className="btn-outline" onClick={function(){setDetailModalId(null);}}>Fechar</button>
              </div>
            </div>
          </Modal>
        );
      })()}
    </div>
  );
}

  window.ZNX = window.ZNX || {};
  window.ZNX.components = window.ZNX.components || {};
  window.ZNX.components.Entradas = Entradas;
  window.Entradas = Entradas;
  window.ZNX.refactor_phase_6_loaded = window.ZNX.refactor_phase_6_loaded || {};
  window.ZNX.refactor_phase_6_loaded.Entradas = true;
  // [Wave 23 marker v224.4] confirma extract executado
  window.Entradas_v224_4_wave23 = true;
})();
