Path: C:\
<?php
require_once __DIR__ . '/includes/functions.php';
$tipoExport = strtolower(trim($_GET['tipo'] ?? 'movimentacoes'));
$clienteDocFilter = trim($_GET['cliente_documento'] ?? '');
$search = trim($_GET['search'] ?? '');
$dataInicio = trim($_GET['data_inicio'] ?? '');
$dataFim = trim($_GET['data_fim'] ?? '');
if ($tipoExport === 'estoque') {
// -------------------------------------------------------------
// EXPORTAÇÃO 1: Posição Consolidada de Saldo de Estoque
// -------------------------------------------------------------
$estoque = get_estoque_consolidado(!empty($clienteDocFilter) ? $clienteDocFilter : null);
if (!empty($search)) {
$estoque = array_filter($estoque, function($item) use ($search) {
return (stristr($item['codigo'], $search) !== false || stristr($item['nome'], $search) !== false);
});
}
$filename = 'posicao_estoque_armazenagem_' . date('Ymd_His') . '.csv';
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Pragma: no-cache');
header('Expires: 0');
$output = fopen('php://output', 'w');
// UTF-8 BOM para Excel
fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));
// Cabeçalho CSV
fputcsv($output, [
'CNPJ/CPF Cliente',
'Codigo SKU',
'Nome Produto',
'Fator Palete',
'Qtd Entradas',
'Qtd Saidas',
'Saldo Pecas Estoque',
'Paletes Exatos Estoque',
'Posicoes Paletes Ceil Estoque',
'Status Estoque'
], ';');
foreach ($estoque as $item) {
$status = ($item['saldo_pecas'] < 0) ? 'ESTOQUE NEGATIVO' : ($item['has_fator'] ? 'OK' : 'PENDENTE FATOR');
fputcsv($output, [
$item['cliente_documento'],
$item['codigo'],
$item['nome'],
$item['has_fator'] ? number_format((float)$item['fator_palete'], 2, ',', '.') : 'PENDENTE',
number_format($item['entradas'], 2, ',', '.'),
number_format($item['saidas'], 2, ',', '.'),
number_format($item['saldo_pecas'], 2, ',', '.'),
number_format($item['paletes_exato'], 2, ',', '.'),
$item['paletes_ceil'],
$status
], ';');
}
fclose($output);
exit;
} else {
// -------------------------------------------------------------
// EXPORTAÇÃO 2: Relatório Diário de Movimentações
// -------------------------------------------------------------
$movimentacoes = load_json('movimentacoes.json');
$produtosMap = get_produtos_map();
// Filtrar por cliente
if (!empty($clienteDocFilter)) {
$movimentacoes = array_filter($movimentacoes, function($m) use ($clienteDocFilter) {
$doc = !empty($m['destinatario_documento']) ? $m['destinatario_documento'] : 'GERAL';
return $doc === $clienteDocFilter;
});
}
// Filtrar por data
if (!empty($dataInicio) || !empty($dataFim)) {
$movimentacoes = array_filter($movimentacoes, function($m) use ($dataInicio, $dataFim) {
$d = $m['data_emissao'] ?? '';
if (!empty($dataInicio) && $d < $dataInicio) return false;
if (!empty($dataFim) && $d > $dataFim) return false;
return true;
});
}
usort($movimentacoes, function($a, $b) {
return strcmp($a['data_emissao'] ?? '', $b['data_emissao'] ?? '');
});
$filename = 'fechamento_armazenagem_' . date('Ymd_His') . '.csv';
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Pragma: no-cache');
header('Expires: 0');
$output = fopen('php://output', 'w');
fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($output, [
'Data Emissao',
'Tipo Movimento',
'Numero NF',
'Chave NFe',
'CNPJ/CPF Destinatario',
'Nome Destinatario',
'Codigo Produto',
'Nome Produto',
'Quantidade Pecas',
'Fator Palete',
'Paletes Exatos',
'Posicoes Paletes Ceil',
'Valor Item (RS)',
'Valor Total NF (RS)'
], ';');
foreach ($movimentacoes as $mov) {
$dataEmissao = !empty($mov['data_emissao']) ? date('d/m/Y', strtotime($mov['data_emissao'])) : '';
$tipoMov = $mov['tipo'] ?? 'SAIDA';
$numeroNfe = $mov['numero_nfe'] ?? '';
$chaveNfe = $mov['chave_nfe'] ?? '';
$destDoc = !empty($mov['destinatario_documento']) ? $mov['destinatario_documento'] : 'GERAL';
$destNome = !empty($mov['destinatario_nome']) ? $mov['destinatario_nome'] : 'Cliente Não Informado';
$valorNfe = number_format((float)($mov['valor_nfe'] ?? 0), 2, ',', '.');
if (!empty($mov['itens']) && is_array($mov['itens'])) {
foreach ($mov['itens'] as $item) {
$codigo = $item['codigo'] ?? '';
$nome = $item['nome'] ?? '';
$qtd = (float)($item['quantidade'] ?? 0);
$vTotItem = (float)($item['valor_total'] ?? 0);
$compositeKey = $destDoc . '|' . $codigo;
$fator = null;
if (isset($produtosMap[$compositeKey])) {
$fator = $produtosMap[$compositeKey]['fator_palete'];
} elseif (isset($produtosMap[$codigo])) {
$fator = $produtosMap[$codigo]['fator_palete'];
}
$calc = calculate_item_pallets($qtd, $fator);
fputcsv($output, [
$dataEmissao,
$tipoMov,
$numeroNfe,
$chaveNfe,
$destDoc,
$destNome,
$codigo,
$nome,
number_format($qtd, 2, ',', '.'),
$calc['has_fator'] ? number_format((float)$fator, 2, ',', '.') : 'PENDENTE',
number_format($calc['exato'], 2, ',', '.'),
$calc['ceil'],
number_format($vTotItem, 2, ',', '.'),
$valorNfe
], ';');
}
}
}
fclose($output);
exit;
}