Commit Graph

26 Commits

Author SHA1 Message Date
Knee Cola
6c43c69934 (bugfix) ViewLocationCard: hub3a string was calculated even if this option was disabled 2025-11-23 21:39:05 +01:00
Knee Cola
3368e56124 refactoring components to match the optimized projections 2025-11-23 12:00:12 +01:00
Knee Cola
89c06e2799 Refactor: Complete barcodeImage to hub3aText migration across codebase
Database & Types:
- Added hub3aText field to Bill interface in db-types.ts
- Marked barcodeImage as @deprecated legacy field

Server Actions:
- Updated billActions to read/write hub3aText instead of barcodeImage
- Commented out legacy barcodeImage code with migration notes

Barcode Decoder:
- Renamed image2canvas to file2canvas for clarity
- Added new image2canvas function for base64 encoded images (migration support)
- Added hub3aText to DecodeResult type
- Exported decodeFromImage function for legacy data migration
- Updated decoding logic to extract and return hub3aText

UI Components:
- Refactored Pdf417Barcode to accept hub3aText string instead of PaymentParams
- Removed EncodePayment call from Pdf417Barcode (now expects pre-encoded text)
- Updated ViewLocationCard to encode payment params before passing to Pdf417Barcode

This completes the refactoring from storing bitmap images to storing decoded
HUB-3A payment strings, providing more efficient storage and easier data manipulation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 08:25:06 +01:00
Knee Cola
dbe2b08e1c Improve proof of payment upload UI with fieldset styling
Changes:
- Wrapped upload section in a styled fieldset with legend
- Adjusted spacing and layout for better visual hierarchy
- Updated translations:
  - Added "upload-proof-of-payment-legend" key
  - English: "Proof of payment"
  - Croatian: "Potvrda o uplati"
  - Updated label text to be more descriptive
  - English: "Here you can upload proof of payment:"
  - Croatian: "Ovdje možete priložiti potvrdu o uplati:"

The upload section now has a consistent fieldset styling
matching other sections of the form.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 23:56:56 +01:00
Knee Cola
6df9557921 Add utility bills proof of payment file upload functionality
Changes:
- Updated BillingLocation interface:
  - Added utilBillsProofOfPaymentAttachment field (BillAttachment type)
- Added server action uploadUtilBillsProofOfPayment:
  - Validates PDF file type
  - Serializes file attachment to base64
  - Stores attachment in BillingLocation document
  - Returns success/error status
- Updated ViewLocationCard component:
  - Added file upload input with PDF-only accept
  - Implemented handleFileChange with immediate upload
  - Added upload state management (isUploading, uploadError, attachment)
  - Shows spinner while uploading
  - Input disabled during upload
  - Conditionally renders file input or download link
  - Link displayed after successful upload
- Created route handler for serving proof of payment PDFs:
  - GET /share/proof-of-payment/[id]/route.tsx
  - Fetches attachment from database
  - Converts base64 to binary
  - Returns PDF with proper headers
- Added not-found page for proof of payment route
- Updated middleware to include proof-of-payment in public pages
- Added translations:
  - en: "Upload proof of payment (PDF only)"
  - hr: "Priložite potvrdu o uplati:"

File uploads immediately on selection without page reload.
Only PDF files accepted with client and server-side validation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 23:47:08 +01:00
Knee Cola
82d29b39c3 Rename proof of payment file input and update link text in ViewLocationCard component 2025-11-22 23:33:32 +01:00
Knee Cola
c235b94a72 Rename file input for proof of payment in ViewLocationCard component 2025-11-22 23:31:58 +01:00
Knee Cola
0753f9be1b Add upload proof of payment feature to ViewLocationCard component 2025-11-22 23:31:15 +01:00
Knee Cola
c025c6f2ce Update formatCurrency to use currency code from UserSettings
Changes:
- Updated formatCurrency function:
  - Added currencyCode parameter with EUR default
  - Implemented Intl.NumberFormat for proper currency formatting
  - Added fallback for invalid currency codes
- Updated component hierarchy to pass currency:
  - HomePage: Fetch userSettings and pass to MonthLocationList
  - MonthLocationList: Accept and pass currency to child components
  - LocationCard: Accept currency prop and use in formatCurrency
  - MonthCard: Accept currency prop and use in formatCurrency
  - ViewLocationCard: Pass currency from userSettings to formatCurrency
- Removed hardcoded $ symbols, now using proper currency formatting

All currency amounts now display with the user's selected currency code
from their settings, using locale-appropriate formatting (hr-HR).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 23:04:42 +01:00
Knee Cola
4655b342f2 Conditionally render payment info based on user and location settings
Changes:
- Destructure generateTenantCode from location props
- Wrap payment information and PDF417 barcode in conditional rendering
- Only show payment details when BOTH conditions are met:
  - userSettings.show2dCodeInMonthlyStatement === true
  - location.generateTenantCode === true

This ensures payment information and barcode are only displayed when
both the user has enabled the feature globally AND the specific location
has it enabled.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 22:59:00 +01:00
Knee Cola
1e89e59d42 Rearrange payment information display in ViewLocationCard 2025-11-22 22:54:24 +01:00
Knee Cola
54ab3fa375 Improve payment description formatting in ViewLocationCard
Changes:
- Renamed destructured 'name' to 'locationName' for clarity
- Added locationNameTrimmed_max20 to limit location name to 19 chars
- Updated PozivNaBroj to use formatYearMonth() helper
- Updated OpisPlacanja with trimmed location name and formatYearMonth()
- Added comment documenting 35 character max length constraint
- Updated card title to use renamed locationName variable

This ensures payment descriptions fit within HUB-3A barcode constraints.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 22:49:21 +01:00
Knee Cola
4db56f8383 Rename 'iban' to 'ownerIBAN' in UserSettings
Changes:
- Updated UserSettings interface: iban -> ownerIBAN
- Updated userSettingsActions.ts:
  - Changed State type to use ownerIBAN
  - Updated FormSchema validation to reference ownerIBAN
  - Updated validation refinements to check ownerIBAN
  - Updated form data parsing to read ownerIBAN
  - Renamed normalizedIban to normalizedOwnerIBAN
  - Updated database write operations to use ownerIBAN
- Updated UserSettingsForm.tsx:
  - Changed state tracking to use ownerIBAN
  - Updated validation check to reference ownerIBAN (cleanedOwnerIBAN)
  - Updated input field: id, name, and event handlers
- Updated ViewLocationCard.tsx to use ownerIBAN instead of iban
- Updated English translations:
  - iban-label -> owner-iban-label
  - iban-placeholder -> owner-iban-placeholder
  - iban-required -> owner-iban-required
  - iban-invalid -> owner-iban-invalid
- Updated Croatian translations with corresponding ownerIBAN keys

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 22:43:30 +01:00
Knee Cola
e6adb10689 Rename 'town' to 'ownerTown' in UserSettings with 27 character max length
Changes:
- Updated UserSettings interface: town -> ownerTown
- Updated userSettingsActions.ts:
  - Changed State type to use ownerTown
  - Added max length validation (27 characters) to FormSchema
  - Updated validation refinement to check ownerTown
  - Updated form data parsing to read ownerTown
  - Updated database write operations to use ownerTown
- Updated UserSettingsForm.tsx:
  - Changed state tracking to use ownerTown
  - Updated validation check to reference ownerTown
  - Updated input field: id, name, maxLength={27}
- Updated ViewLocationCard.tsx to use ownerTown instead of town
- Updated English translations:
  - town-label -> owner-town-label: "Your Postal Code and Town"
  - town-placeholder -> owner-town-placeholder
  - town-required -> owner-town-required
- Updated Croatian translations with corresponding ownerTown keys

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 22:40:12 +01:00
Knee Cola
387b7e0256 Rename 'street' to 'ownerStreet' in UserSettings with 25 character max length
Changes:
- Updated UserSettings interface: street -> ownerStreet
- Updated userSettingsActions.ts:
  - Changed State type to use ownerStreet
  - Added max length validation (25 characters) to FormSchema
  - Updated validation refinement to check ownerStreet
  - Updated form data parsing to read ownerStreet
  - Updated database write operations to use ownerStreet
- Updated UserSettingsForm.tsx:
  - Changed state tracking to use ownerStreet
  - Updated validation check to reference ownerStreet
  - Updated input field: id, name, maxLength={25}
- Updated ViewLocationCard.tsx to use ownerStreet instead of street
- Updated English translations:
  - street-label -> owner-street-label: "Your Street and House Number"
  - street-placeholder -> owner-street-placeholder
  - street-required -> owner-street-required
- Updated Croatian translations with corresponding ownerStreet keys

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 22:37:04 +01:00
Knee Cola
db1df76ed6 Rename firstName to ownerName with updated validation
- Renamed firstName to ownerName in UserSettings interface
- Updated UserSettingsForm field to accept full name (first and last)
- Set maximum length to 25 characters for owner name field
- Updated all database operations to use ownerName
- Changed English label from "First Name" to "Your First and Last Name"
- Updated Croatian translations to match (Vaše ime i prezime)
- Updated form validation schema and error messages
- Removed old lastName-related translations
- Updated ViewLocationCard to use ownerName for recipient

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 22:31:07 +01:00
Knee Cola
c1762f7157 Remove lastName field from UserSettings and database
- Removed lastName from UserSettings interface
- Updated UserSettingsForm to remove lastName input field
- Removed lastName from all database operations
- Updated form validation schema to remove lastName validation
- Updated ViewLocationCard to use only firstName for recipient name
- Removed lastName from user settings form state tracking
- Updated Croatian translations to reflect changes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 22:26:41 +01:00
Knee Cola
b4e459b2d5 Rename tenantFirstName to tenantName with updated validation
- Renamed tenantFirstName to tenantName in BillingLocation interface
- Updated LocationEditForm field to accept full name (first and last)
- Set maximum length to 30 characters for tenant name field
- Updated all database operations to use tenantName
- Changed English label from "Tenant First Name" to "Tenant First and Last Name"
- Updated Croatian translations to match (Ime i prezime podstanara)
- Updated form validation schema and error messages
- Removed old tenantLastName-related translations

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 22:17:10 +01:00
Knee Cola
a1c683528c Remove tenantLastName field from LocationEditForm and database
- Removed tenantLastName from BillingLocation interface
- Updated LocationEditForm to remove tenantLastName input field
- Removed tenantLastName from all database operations (insert and update)
- Updated form validation schema to remove tenantLastName validation
- Updated ViewLocationCard to use only tenantFirstName for payer name
- Removed tenantLastName from tenant field state tracking

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 22:09:13 +01:00
Knee Cola
280e2ec029 Populate paymentParams with actual data from database
- Updated ViewLocationCard to accept userSettings prop
- Replaced all hardcoded payment values with dynamic data:
  * Amount calculated from monthly expenses
  * Payer info from tenant fields (name, street, town)
  * Recipient info from userSettings (name, street, town, IBAN)
  * Reference number and description generated from location data
- Created getUserSettingsByUserId function for fetching owner settings on public pages
- Updated LocationViewPage to fetch and pass userSettings to ViewLocationCard

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 15:47:07 +01:00
Knee Cola
38a1e9d1b8 Add localized payment information labels
Replaces hardcoded Croatian text in ViewLocationCard with i18n translations.
Adds payment information labels (amount, recipient, IBAN, etc.) to both
Croatian and English language files for proper internationalization support.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 14:46:35 +01:00
Knee Cola
371333802a Add PDF417 barcode rendering component
Implements client-side PDF417 barcode rendering with React component.
Uses useEffect to prevent hydration mismatch by generating barcodes
only after component mount. Integrates barcode display in location cards.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 14:22:57 +01:00
Knee Cola
1605eec5fb Replace billedToTenant boolean with billedTo enum
Migrated from boolean checkbox to enum-based radio buttons for better
flexibility and clarity in tracking bill payment responsibility.

Changes:
- Added BilledTo enum with values 'tenant' and 'landlord'
- Replaced Bill.billedToTenant (boolean) with Bill.billedTo (enum)
- Updated BillEditForm to use radio buttons instead of checkbox
- Updated billActions to handle billedTo enum values
- Updated all display filtering to use enum comparison
- Updated printActions barcode filtering
- Updated translations for radio button labels (en/hr)

The billedTo property is optional for backward compatibility -
undefined values default to BilledTo.Tenant, maintaining current
behavior where only tenant bills are displayed and calculated.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 13:48:28 +01:00
Knee Cola
f0ccac3f68 Filter bills display to show only billedToTenant bills
Updated all components to respect the billedToTenant flag:

- LocationCard: Filter bills display and monthlyExpense calculation
- ViewLocationCard: Filter bills display and monthlyExpense calculation
- HomePage: Update monthlyExpense calculations for month grouping
- printActions: Filter barcode print data to only include tenant bills

All filtering uses (bill.billedToTenant ?? true) for backward
compatibility with existing bills that don't have this property set.

This ensures users only see and calculate expenses for bills that
are the tenant's responsibility.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 13:36:42 +01:00
9c9ddc28c1 povećavanje UI elemenata na view ekranu 2024-12-14 09:12:03 +01:00
4ab61f9917 implementiran share by link 2024-12-13 17:50:12 +01:00