'use server'; import { getDbClient } from '../dbClient'; import { BillingLocation } from '../db-types'; import { AuthenticatedUser } from '../types/next-auth'; import { withUser } from '../auth'; import { unstable_noStore as noStore } from 'next/cache'; export interface PrintBarcodeData { locationName: string; billName: string; barcodeImage: string; payedAmount?: number | null; } /** * Fetches all bills with barcode images for a specific month for printing * @param year - Year to fetch data for * @param month - Month to fetch data for (1-12) * @returns Array of barcode data for printing */ export const fetchBarcodeDataForPrint = withUser(async (user: AuthenticatedUser, year: number, month: number): Promise => { noStore(); const { id: userId } = user; const dbClient = await getDbClient(); const yearMonth = `${year}-${month.toString().padStart(2, '0')}`; // Fetch all locations for the specific month const locations = await dbClient.collection("lokacije") .find({ userId, // ensure data belongs to authenticated user "yearMonth.year": year, "yearMonth.month": month }) .toArray(); // Extract and flatten barcode data const printData: PrintBarcodeData[] = []; for (const location of locations) { for (const bill of location.bills) { // Only include bills that have barcode images if (bill.barcodeImage && bill.barcodeImage.trim() !== "") { printData.push({ locationName: location.name, billName: bill.name, barcodeImage: bill.barcodeImage, payedAmount: bill.payedAmount }); } } } // Sort by location name, then by bill name for consistent ordering printData.sort((a, b) => { if (a.locationName !== b.locationName) { return a.locationName.localeCompare(b.locationName); } return a.billName.localeCompare(b.billName); }); return printData; });