Compare commits
2 Commits
7959e18210
...
f6d4be1afb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6d4be1afb | ||
|
|
e66a90d583 |
@@ -38,6 +38,9 @@ const initDB = async () => {
|
|||||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
);
|
);
|
||||||
`);
|
`);
|
||||||
|
|
||||||
|
await pool.query(`ALTER TABLE orders ADD COLUMN IF NOT EXISTS pedido_id VARCHAR(100);`).catch(() => {});
|
||||||
|
|
||||||
console.log("Database initialized successfully.");
|
console.log("Database initialized successfully.");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("Failed to initialize database:", err);
|
console.error("Failed to initialize database:", err);
|
||||||
@@ -81,7 +84,8 @@ const formatRow = (row) => ({
|
|||||||
Descricao_Produto: row.produto_descricao,
|
Descricao_Produto: row.produto_descricao,
|
||||||
Quantidade: row.quantidade,
|
Quantidade: row.quantidade,
|
||||||
Valor_Unitario: parseFloat(row.valor_unitario),
|
Valor_Unitario: parseFloat(row.valor_unitario),
|
||||||
Recebido_Em: row.created_at
|
Recebido_Em: row.created_at,
|
||||||
|
ID_Pedido: row.pedido_id
|
||||||
});
|
});
|
||||||
|
|
||||||
// GET data (for the frontend)
|
// GET data (for the frontend)
|
||||||
@@ -124,20 +128,23 @@ app.post('/api/data', authenticateAPIKey, async (req, res) => {
|
|||||||
const insertQuery = `
|
const insertQuery = `
|
||||||
INSERT INTO orders (
|
INSERT INTO orders (
|
||||||
cliente_nome, data_pedido, valor_pedido,
|
cliente_nome, data_pedido, valor_pedido,
|
||||||
produto_id, produto_descricao, quantidade, valor_unitario
|
produto_id, produto_descricao, quantidade, valor_unitario, pedido_id
|
||||||
) VALUES ($1, $2, $3, $4, $5, $6, $7)
|
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
||||||
`;
|
`;
|
||||||
|
|
||||||
for (const item of payload) {
|
for (const item of payload) {
|
||||||
// Handle potential missing fields gracefully
|
// Handle potential missing fields gracefully
|
||||||
|
const orderId = item.id || item.ID_Pedido || (item.json && item.json.body && item.json.body.id) || '';
|
||||||
|
|
||||||
const values = [
|
const values = [
|
||||||
item.Nome_Cliente || 'Unknown',
|
item.Nome_Cliente || 'Unknown',
|
||||||
item.Data_Pedido || '',
|
item.Data_Pedido || '',
|
||||||
item.Valor_Pedido || 0,
|
parseFloat(item.Valor_Pedido) || 0,
|
||||||
item.ID_Produto || '',
|
item.ID_Produto || '',
|
||||||
item.Descricao_Produto || '',
|
item.Descricao_Produto || '',
|
||||||
item.Quantidade || 0,
|
parseInt(item.Quantidade) || 0,
|
||||||
item.Valor_Unitario || 0
|
parseFloat(item.Valor_Unitario) || 0,
|
||||||
|
String(orderId)
|
||||||
];
|
];
|
||||||
await client.query(insertQuery, values);
|
await client.query(insertQuery, values);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ const ClientDetails = () => {
|
|||||||
return clientName === decodedName;
|
return clientName === decodedName;
|
||||||
});
|
});
|
||||||
|
|
||||||
const groupedOrdersMap: Record<string, { date: string, orderTotal: number, items: OrderData[] }> = {};
|
const groupedOrdersMap: Record<string, { date: string, orderId: string, orderTotal: number, items: OrderData[] }> = {};
|
||||||
let totalSpent = 0;
|
let totalSpent = 0;
|
||||||
let totalItems = 0;
|
let totalItems = 0;
|
||||||
|
|
||||||
@@ -24,11 +24,12 @@ const ClientDetails = () => {
|
|||||||
totalSpent += (order.Quantidade * order.Valor_Unitario);
|
totalSpent += (order.Quantidade * order.Valor_Unitario);
|
||||||
totalItems += order.Quantidade;
|
totalItems += order.Quantidade;
|
||||||
|
|
||||||
// Use date and total order value as a unique cart/order identifier
|
// Use ID_Pedido if available, otherwise fallback to date and total order value
|
||||||
const key = `${order.Data_Pedido}_${order.Valor_Pedido}`;
|
const key = order.ID_Pedido || `${order.Data_Pedido}_${order.Valor_Pedido}`;
|
||||||
if (!groupedOrdersMap[key]) {
|
if (!groupedOrdersMap[key]) {
|
||||||
groupedOrdersMap[key] = {
|
groupedOrdersMap[key] = {
|
||||||
date: order.Data_Pedido,
|
date: order.Data_Pedido,
|
||||||
|
orderId: order.ID_Pedido || key,
|
||||||
orderTotal: order.Valor_Pedido,
|
orderTotal: order.Valor_Pedido,
|
||||||
items: []
|
items: []
|
||||||
};
|
};
|
||||||
@@ -89,14 +90,14 @@ const ClientDetails = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Orders List */}
|
{/* Orders List */}
|
||||||
<div className="flex flex-col gap-6">
|
<div className="flex flex-col gap-6">
|
||||||
{groupedOrders.map((group, groupIndex) => (
|
{groupedOrders.map((group, groupIndex) => (
|
||||||
<div key={groupIndex} className="bg-white dark:bg-dark-card border border-zinc-200 dark:border-dark-border rounded-2xl overflow-hidden shadow-sm">
|
<div key={groupIndex} className="bg-white dark:bg-dark-card border border-zinc-200 dark:border-dark-border rounded-2xl overflow-hidden shadow-sm">
|
||||||
<div className="p-4 border-b border-zinc-100 dark:border-dark-border bg-zinc-50/50 dark:bg-dark-header flex justify-between items-center">
|
<div className="p-4 border-b border-zinc-100 dark:border-dark-border bg-zinc-50/50 dark:bg-dark-header flex justify-between items-center">
|
||||||
<h2 className="text-sm font-bold uppercase tracking-wider text-zinc-500 dark:text-dark-muted">
|
<h2 className="text-sm font-bold uppercase tracking-wider text-zinc-500 dark:text-dark-muted flex items-center gap-2">
|
||||||
Data do Pedido: {group.date}
|
<Tag className="w-4 h-4 text-brand-primary" />
|
||||||
|
Pedido ID: {group.orderId}
|
||||||
</h2>
|
</h2>
|
||||||
<span className="text-sm font-bold text-brand-primary">
|
<span className="text-sm font-bold text-brand-primary">
|
||||||
Total do Pedido: {formatCurrency(group.orderTotal)}
|
Total do Pedido: {formatCurrency(group.orderTotal)}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ export interface OrderData {
|
|||||||
Quantidade: number;
|
Quantidade: number;
|
||||||
Valor_Unitario: number;
|
Valor_Unitario: number;
|
||||||
Recebido_Em?: string;
|
Recebido_Em?: string;
|
||||||
|
ID_Pedido?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DateRange {
|
export interface DateRange {
|
||||||
|
|||||||
32
test-payload.json
Normal file
32
test-payload.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"Nome_Cliente": "Fabrcio Araujo leme",
|
||||||
|
"Data_Pedido": "13/02/2025",
|
||||||
|
"Valor_Pedido": 94.95,
|
||||||
|
"ID_Pedido": "942384335",
|
||||||
|
"ID_Produto": "942384336",
|
||||||
|
"Descricao_Produto": "Camiseta Plus Size Premium Algodão Estampada Paris Tira G4 Grafite",
|
||||||
|
"Quantidade": "1.0000",
|
||||||
|
"Valor_Unitario": "31.650000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Nome_Cliente": "Fabrcio Araujo leme",
|
||||||
|
"Data_Pedido": "13/02/2025",
|
||||||
|
"Valor_Pedido": 94.95,
|
||||||
|
"ID_Pedido": "942384335",
|
||||||
|
"ID_Produto": "942384339",
|
||||||
|
"Descricao_Produto": "Camiseta Plus Size Premium Algodão Estampada Fichas Rolando G4 Preto",
|
||||||
|
"Quantidade": "1.0000",
|
||||||
|
"Valor_Unitario": "31.650000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Nome_Cliente": "Fabrcio Araujo leme",
|
||||||
|
"Data_Pedido": "13/02/2025",
|
||||||
|
"Valor_Pedido": 94.95,
|
||||||
|
"ID_Pedido": "942384335",
|
||||||
|
"ID_Produto": "942384342",
|
||||||
|
"Descricao_Produto": "Camiseta Plus Size Unissex T-Shirt Premium Sorte Nas Cartas G4 Preto",
|
||||||
|
"Quantidade": "1.0000",
|
||||||
|
"Valor_Unitario": "31.650000"
|
||||||
|
}
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user