|
|
@@ -0,0 +1,643 @@
|
|
|
+# Inventory Management System
|
|
|
+
|
|
|
+A comprehensive inventory management system built with Vue 3 frontend and PHP backend, featuring inventory tracking, client management, project management, bookkeeping, and authentication.
|
|
|
+
|
|
|
+## 🚀 **Latest Features**
|
|
|
+
|
|
|
+### **Core Inventory Management**
|
|
|
+- **Item Management** - Full CRUD operations with serial number tracking
|
|
|
+- **Picture Upload** - Image attachment system for inventory items
|
|
|
+- **Rental Pricing** - Dynamic pricing with date ranges and client assignments
|
|
|
+- **Document Attachments** - Multi-format document management (Receipt, Warranty, Other)
|
|
|
+
|
|
|
+### **Advanced Client Management**
|
|
|
+- **Customer Profiles** - Complete contact information with y-tunnus support
|
|
|
+- **Contact Persons** - Individual contact management with primary contact designation
|
|
|
+- **Hourly Rates** - Customer-specific billing rates for project management
|
|
|
+- **Address Management** - Full address support with international formatting
|
|
|
+
|
|
|
+### **Project & Subproject Management**
|
|
|
+- **Project Tracking** - Customer project management with status monitoring
|
|
|
+- **Subproject Breakdown** - Detailed task management within projects
|
|
|
+- **Progress Monitoring** - Visual progress bars and completion tracking
|
|
|
+- **Budget Management** - Financial control and cost tracking
|
|
|
+- **Date Range Management** - Start and end date tracking
|
|
|
+
|
|
|
+### **Financial Management**
|
|
|
+- **Invoice System** - Complete billing with line items and payment tracking
|
|
|
+- **Payment Processing** - Multiple payment methods (Cash, Check, Credit Card, Bank Transfer)
|
|
|
+- **Double-Entry Bookkeeping** - Professional accounting with debit/credit tracking
|
|
|
+- **Chart of Accounts** - Hierarchical account structure (Assets, Liabilities, Equity, Revenue, Expenses)
|
|
|
+- **Journal Entries** - Transaction recording with automatic entry numbering
|
|
|
+
|
|
|
+### **Enterprise Security**
|
|
|
+- **User Authentication** - Secure login with password hashing
|
|
|
+- **Role-Based Access** - Admin, Manager, User roles
|
|
|
+- **Session Management** - Secure session handling and automatic cleanup
|
|
|
+- **API Protection** - Middleware-based endpoint security
|
|
|
+
|
|
|
+## 🏗 **Technology Stack**
|
|
|
+
|
|
|
+### **Frontend**
|
|
|
+- **Vue 3** - Progressive JavaScript framework
|
|
|
+- **Axios** - HTTP client for API communication
|
|
|
+- **Vite** - Fast development server
|
|
|
+- **TailwindCSS** - Utility-first CSS framework
|
|
|
+- **Responsive Design** - Mobile-friendly interface
|
|
|
+
|
|
|
+### **Backend**
|
|
|
+- **PHP 7.4+** - Modern server-side language
|
|
|
+- **MySQL/MariaDB** - Reliable database system
|
|
|
+- **RESTful API** - Standard HTTP methods and JSON responses
|
|
|
+- **PDO** - Secure database connections
|
|
|
+- **Password Hashing** - PHP's built-in security functions
|
|
|
+
|
|
|
+## 📋 **Database Schema**
|
|
|
+
|
|
|
+The system uses a normalized database structure with proper relationships:
|
|
|
+
|
|
|
+### **Core Tables**
|
|
|
+- **items** - Inventory with serial numbers and pictures
|
|
|
+- **clients** - Customer management with y-tunnus and hourly rates
|
|
|
+- **contact_persons** - Individual contacts linked to clients
|
|
|
+- **rental_prices** - Item pricing with date ranges and client assignments
|
|
|
+- **attachments** - Document management with categorization
|
|
|
+
|
|
|
+### **Financial Tables**
|
|
|
+- **invoices** - Billing with line items and payment tracking
|
|
|
+- **invoice_items** - Detailed invoice line items
|
|
|
+- **payments** - Transaction recording with multiple payment methods
|
|
|
+
|
|
|
+### **Project Management Tables**
|
|
|
+- **projects** - Customer project management with status tracking
|
|
|
+- **subprojects** - Detailed project breakdown and task management
|
|
|
+
|
|
|
+### **Bookkeeping Tables**
|
|
|
+- **chart_of_accounts** - Hierarchical account structure
|
|
|
+- **journal_entries** - Double-entry transaction recording
|
|
|
+- **account_transactions** - Detailed debit/credit tracking
|
|
|
+
|
|
|
+### **Authentication Tables**
|
|
|
+- **users** - Secure user management with role-based access
|
|
|
+
|
|
|
+## 🚀 **Getting Started**
|
|
|
+
|
|
|
+### **Prerequisites**
|
|
|
+- PHP 7.4+ with MySQL/MariaDB extension
|
|
|
+- Node.js 14+ and npm
|
|
|
+- Modern web browser (Chrome, Firefox, Safari, Edge)
|
|
|
+- MySQL server or MariaDB
|
|
|
+
|
|
|
+### **Quick Setup**
|
|
|
+
|
|
|
+#### **Option 1: Fresh Installation**
|
|
|
+1. **Clone the repository:**
|
|
|
+ ```bash
|
|
|
+ git clone <repository-url>
|
|
|
+ cd inventory
|
|
|
+ ```
|
|
|
+
|
|
|
+2. **Database Setup:**
|
|
|
+ ```bash
|
|
|
+ # Create database and import complete schema
|
|
|
+ mysql -u root -p < backend/migrate_complete.sql
|
|
|
+
|
|
|
+ # Update database credentials
|
|
|
+ nano backend/config/database.php
|
|
|
+ ```
|
|
|
+
|
|
|
+3. **Backend Server:**
|
|
|
+ ```bash
|
|
|
+ cd backend
|
|
|
+ php -S localhost:8000
|
|
|
+ ```
|
|
|
+
|
|
|
+4. **Frontend Setup:**
|
|
|
+ ```bash
|
|
|
+ cd frontend
|
|
|
+ npm install
|
|
|
+ npm run dev
|
|
|
+ ```
|
|
|
+
|
|
|
+5. **Access Application:**
|
|
|
+ - Backend: `http://localhost:8000` (API)
|
|
|
+ - Frontend: `http://localhost:3000` (Web Interface)
|
|
|
+
|
|
|
+#### **Option 2: Existing Database Upgrade**
|
|
|
+1. **Backup existing database:**
|
|
|
+ ```bash
|
|
|
+ mysqldump -u root -p inventory_db > backup.sql
|
|
|
+ ```
|
|
|
+
|
|
|
+2. **Run migration script:**
|
|
|
+ ```bash
|
|
|
+ mysql -u root -p inventory_db < backend/migrate_complete.sql
|
|
|
+ ```
|
|
|
+
|
|
|
+3. **Restart services:**
|
|
|
+ ```bash
|
|
|
+ # Restart PHP server if running
|
|
|
+ sudo systemctl restart apache2
|
|
|
+ # or
|
|
|
+ sudo systemctl restart nginx
|
|
|
+ ```
|
|
|
+
|
|
|
+## 🔧 **Configuration**
|
|
|
+
|
|
|
+### **Database Configuration**
|
|
|
+Update `backend/config/database.php` with your database credentials:
|
|
|
+```php
|
|
|
+<?php
|
|
|
+class Database {
|
|
|
+ private $host = "localhost";
|
|
|
+ private $db_name = "inventory_db";
|
|
|
+ private $username = "root";
|
|
|
+ private $password = "your_password";
|
|
|
+
|
|
|
+ public function getConnection() {
|
|
|
+ $conn = null;
|
|
|
+
|
|
|
+ try {
|
|
|
+ $conn = new PDO(
|
|
|
+ "mysql:host={$this->host};dbname={$this->db_name}",
|
|
|
+ $this->username,
|
|
|
+ $this->password
|
|
|
+ );
|
|
|
+
|
|
|
+ $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
+ $conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
|
|
|
+
|
|
|
+ return $conn;
|
|
|
+ } catch(PDOException $exception) {
|
|
|
+ echo "Connection error: " . $exception->getMessage();
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+?>
|
|
|
+```
|
|
|
+
|
|
|
+### **Environment Variables (Recommended)**
|
|
|
+Create `.env` file for sensitive configuration:
|
|
|
+```env
|
|
|
+DB_HOST=localhost
|
|
|
+DB_NAME=inventory_db
|
|
|
+DB_USER=root
|
|
|
+DB_PASSWORD=your_password
|
|
|
+```
|
|
|
+
|
|
|
+### **Frontend Configuration**
|
|
|
+Update `frontend/src/main.js` if needed for different API endpoints:
|
|
|
+```javascript
|
|
|
+axios.defaults.baseURL = 'http://localhost:8000/api';
|
|
|
+```
|
|
|
+
|
|
|
+## 📚 **API Documentation**
|
|
|
+
|
|
|
+### **Authentication Endpoints**
|
|
|
+- **POST** `/api/auth.php` - Login, Register, Logout
|
|
|
+ ```json
|
|
|
+ {
|
|
|
+ "action": "login|register|logout",
|
|
|
+ "username": "string",
|
|
|
+ "password": "string",
|
|
|
+ "email": "string",
|
|
|
+ "first_name": "string",
|
|
|
+ "last_name": "string"
|
|
|
+ }
|
|
|
+ ```
|
|
|
+
|
|
|
+- **GET** `/api/auth.php?action=status` - Check authentication status
|
|
|
+
|
|
|
+### **Item Management**
|
|
|
+- **GET** `/api/items.php` - List all items
|
|
|
+- **GET** `/api/items.php?id={id}` - Get single item
|
|
|
+- **POST** `/api/items.php` - Create new item
|
|
|
+- **PUT** `/api/items.php` - Update existing item
|
|
|
+- **DELETE** `/api/items.php?id={id}` - Delete item
|
|
|
+
|
|
|
+### **Client Management**
|
|
|
+- **GET** `/api/clients.php` - List all clients
|
|
|
+- **GET** `/api/clients.php?id={id}` - Get single client
|
|
|
+- **GET** `/api/clients.php?search={term}` - Search clients
|
|
|
+- **POST** `/api/clients.php` - Create new client
|
|
|
+- **PUT** `/api/clients.php` - Update existing client
|
|
|
+- **DELETE** `/api/clients.php?id={id}` - Delete client
|
|
|
+
|
|
|
+### **Contact Persons**
|
|
|
+- **GET** `/api/contact_persons.php?client_id={id}` - Get contact persons for client
|
|
|
+- **GET** `/api/contact_persons.php?id={id}` - Get single contact person
|
|
|
+- **POST** `/api/contact_persons.php` - Create new contact person
|
|
|
+- **PUT** `/api/contact_persons.php` - Update existing contact person
|
|
|
+- **DELETE** `/api/contact_persons.php?id={id}` - Delete contact person
|
|
|
+
|
|
|
+### **Rental Prices**
|
|
|
+- **GET** `/api/rental_prices.php?item_id={id}` - Get rental prices for item
|
|
|
+- **GET** `/api/rental_prices.php?id={id}` - Get single rental price
|
|
|
+- **POST** `/api/rental_prices.php` - Create new rental price
|
|
|
+- **PUT** `/api/rental_prices.php` - Update existing rental price
|
|
|
+- **DELETE** `/api/rental_prices.php?id={id}` - Delete rental price
|
|
|
+
|
|
|
+### **Document Attachments**
|
|
|
+- **GET** `/api/attachments.php?item_id={id}` - Get attachments for item
|
|
|
+- **GET** `/api/attachments.php?id={id}` - Get single attachment
|
|
|
+- **POST** `/api/attachments.php` - Upload attachment file
|
|
|
+- **DELETE** `/api/attachments.php?id={id}` - Delete attachment
|
|
|
+
|
|
|
+### **File Upload**
|
|
|
+- **POST** `/api/upload.php` - Upload picture files
|
|
|
+ - Form: `multipart/form-data`
|
|
|
+ - Max size: 5MB
|
|
|
+
|
|
|
+### **Project Management**
|
|
|
+- **GET** `/api/projects.php` - List all projects
|
|
|
+- **GET** `/api/projects.php?id={id}` - Get single project
|
|
|
+- **GET** `/api/projects.php?customer_id={id}` - Get projects for customer
|
|
|
+- **POST** `/api/projects.php` - Create new project
|
|
|
+- **PUT** `/api/projects.php` - Update existing project
|
|
|
+- **DELETE** `/api/projects.php?id={id}` - Delete project
|
|
|
+
|
|
|
+### **Subproject Management**
|
|
|
+- **GET** `/api/subprojects.php?project_id={id}` - Get subprojects for project
|
|
|
+- **GET** `/api/subprojects.php?id={id}` - Get single subproject
|
|
|
+- **POST** `/api/subprojects.php` - Create new subproject
|
|
|
+- **PUT** `/api/subprojects.php` - Update existing subproject
|
|
|
+- **DELETE** `/api/subprojects.php?id={id}` - Delete subproject
|
|
|
+
|
|
|
+### **Financial Management**
|
|
|
+- **GET** `/api/invoices.php` - List all invoices
|
|
|
+- **GET** `/api/invoices.php?id={id}` - Get single invoice with items and payments
|
|
|
+- **POST** `/api/invoices.php` - Create new invoice
|
|
|
+- **PUT** `/api/invoices.php` - Update existing invoice
|
|
|
+- **DELETE** `/api/invoices.php?id={id}` - Delete invoice
|
|
|
+
|
|
|
+### **Bookkeeping**
|
|
|
+- **GET** `/api/chart_of_accounts.php` - List chart of accounts
|
|
|
+- **GET** `/api/chart_of_accounts.php?id={id}` - Get single account
|
|
|
+- **POST** `/api/chart_of_accounts.php` - Create new account
|
|
|
+- **PUT** `/api/chart_of_accounts.php` - Update existing account
|
|
|
+- **DELETE** `/api/chart_of_accounts.php?id={id}` - Delete account
|
|
|
+
|
|
|
+- **GET** `/api/journal_entries.php` - List journal entries
|
|
|
+- **GET** `/api/journal_entries.php?id={id}` - Get single journal entry with transactions
|
|
|
+- **POST** `/api/journal_entries.php` - Create new journal entry with transactions
|
|
|
+- **PUT** `/api/journal_entries.php` - Update existing journal entry
|
|
|
+- **DELETE** `/api/journal_entries.php?id={id}` - Delete journal entry
|
|
|
+
|
|
|
+- **GET** `/api/account_transactions.php?journal_entry_id={id}` - Get transactions for journal entry
|
|
|
+- **GET** `/api/account_transactions.php?id={id}` - Get single transaction
|
|
|
+- **POST** `/api/account_transactions.php` - Create new transaction
|
|
|
+- **PUT** `/api/account_transactions.php` - Update existing transaction
|
|
|
+- **DELETE** `/api/account_transactions.php?id={id}` - Delete transaction
|
|
|
+
|
|
|
+## 🎯 **Usage Examples**
|
|
|
+
|
|
|
+### **Authentication**
|
|
|
+```javascript
|
|
|
+// Login
|
|
|
+const loginResponse = await axios.post('/api/auth.php', {
|
|
|
+ action: 'login',
|
|
|
+ username: 'admin',
|
|
|
+ password: 'password123'
|
|
|
+});
|
|
|
+
|
|
|
+// Register
|
|
|
+const registerResponse = await axios.post('/api/auth.php', {
|
|
|
+ action: 'register',
|
|
|
+ username: 'newuser',
|
|
|
+ email: 'user@example.com',
|
|
|
+ password: 'password123',
|
|
|
+ first_name: 'John',
|
|
|
+ last_name: 'Doe'
|
|
|
+});
|
|
|
+
|
|
|
+// Check authentication status
|
|
|
+const authStatus = await axios.get('/api/auth.php?action=status');
|
|
|
+```
|
|
|
+
|
|
|
+### **Item Management**
|
|
|
+```javascript
|
|
|
+// Get all items
|
|
|
+const items = await axios.get('/api/items.php');
|
|
|
+
|
|
|
+// Create new item with picture
|
|
|
+const formData = new FormData();
|
|
|
+formData.append('name', 'Laptop');
|
|
|
+formData.append('description', 'High-performance laptop');
|
|
|
+formData.append('quantity', 10);
|
|
|
+formData.append('price', 1299.99);
|
|
|
+formData.append('serial_number', 'LP001');
|
|
|
+formData.append('picture', fileInput.files[0]); // File upload
|
|
|
+
|
|
|
+const newItem = await axios.post('/api/items.php', formData, {
|
|
|
+ headers: {
|
|
|
+ 'Content-Type': 'multipart/form-data'
|
|
|
+ }
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+### **Client Management**
|
|
|
+```javascript
|
|
|
+// Create new client with y-tunnus
|
|
|
+const newClient = await axios.post('/api/clients.php', {
|
|
|
+ y_tunnus: '1234567-8',
|
|
|
+ company_name: 'Tech Corp',
|
|
|
+ first_name: 'Jane',
|
|
|
+ last_name: 'Smith',
|
|
|
+ email: 'jane@techcorp.com',
|
|
|
+ hour_price: 150.00,
|
|
|
+ address: '123 Business St',
|
|
|
+ city: 'Helsinki',
|
|
|
+ country: 'Finland'
|
|
|
+});
|
|
|
+
|
|
|
+// Add contact person
|
|
|
+const newContact = await axios.post('/api/contact_persons.php', {
|
|
|
+ client_id: 1,
|
|
|
+ first_name: 'John',
|
|
|
+ last_name: 'Doe',
|
|
|
+ email: 'john.doe@techcorp.com',
|
|
|
+ position: 'Project Manager',
|
|
|
+ is_primary: true
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+### **Project Management**
|
|
|
+```javascript
|
|
|
+// Create new project
|
|
|
+const newProject = await axios.post('/api/projects.php', {
|
|
|
+ customer_id: 1,
|
|
|
+ project_name: 'Website Redesign',
|
|
|
+ description: 'Complete website overhaul project',
|
|
|
+ status: 'planning',
|
|
|
+ start_date: '2024-01-15',
|
|
|
+ end_date: '2024-03-15',
|
|
|
+ budget: 50000.00
|
|
|
+});
|
|
|
+
|
|
|
+// Add subproject
|
|
|
+const newSubproject = await axios.post('/api/subprojects.php', {
|
|
|
+ project_id: 1,
|
|
|
+ subproject_name: 'Frontend Development',
|
|
|
+ description: 'Create responsive frontend design',
|
|
|
+ status: 'in_progress',
|
|
|
+ budget: 15000.00
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+### **Financial Management**
|
|
|
+```javascript
|
|
|
+// Create invoice with line items
|
|
|
+const newInvoice = await axios.post('/api/invoices.php', {
|
|
|
+ client_id: 1,
|
|
|
+ invoice_number: 'INV-2024-001',
|
|
|
+ issue_date: '2024-01-15',
|
|
|
+ due_date: '2024-02-15',
|
|
|
+ status: 'sent',
|
|
|
+ subtotal: 10000.00,
|
|
|
+ tax_amount: 2400.00,
|
|
|
+ total_amount: 12400.00,
|
|
|
+ transactions: [
|
|
|
+ {
|
|
|
+ account_id: 1, // Revenue account
|
|
|
+ debit_amount: 0,
|
|
|
+ credit_amount: 12400.00,
|
|
|
+ description: 'Website redesign services'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ account_id: 2, // Bank account
|
|
|
+ debit_amount: 12400.00,
|
|
|
+ credit_amount: 0,
|
|
|
+ description: 'Payment received'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+### **Bookkeeping**
|
|
|
+```javascript
|
|
|
+// Create journal entry with double-entry
|
|
|
+const newJournalEntry = await axios.post('/api/journal_entries.php', {
|
|
|
+ entry_number: 'JE-2024-001',
|
|
|
+ entry_date: '2024-01-15',
|
|
|
+ description: 'Monthly revenue entry',
|
|
|
+ reference_number: 'REF-001',
|
|
|
+ transactions: [
|
|
|
+ {
|
|
|
+ account_id: 1, // Revenue account
|
|
|
+ debit_amount: 15000.00,
|
|
|
+ credit_amount: 0,
|
|
|
+ description: 'Service revenue'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ account_id: 2, // Bank account
|
|
|
+ debit_amount: 0,
|
|
|
+ credit_amount: 15000.00,
|
|
|
+ description: 'Bank deposit'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+## 🔒 **Security Considerations**
|
|
|
+
|
|
|
+### **Authentication Security**
|
|
|
+- Password hashing using PHP's `password_hash()` function
|
|
|
+- Session-based authentication with secure session management
|
|
|
+- SQL injection prevention with prepared statements
|
|
|
+- Input sanitization with `htmlspecialchars()`
|
|
|
+- CORS headers for cross-origin requests
|
|
|
+
|
|
|
+### **API Security**
|
|
|
+- Request validation and error handling
|
|
|
+- Role-based access control (Admin, Manager, User)
|
|
|
+- Secure file upload with file type and size validation
|
|
|
+- Database transaction integrity with foreign key constraints
|
|
|
+
|
|
|
+## 🎨 **Frontend Features**
|
|
|
+
|
|
|
+### **User Interface**
|
|
|
+- **Responsive Design** - Mobile-friendly layout
|
|
|
+- **Real-time Updates** - Live data synchronization
|
|
|
+- **Modal Dialogs** - User-friendly forms and confirmations
|
|
|
+- **Search Functionality** - Global search across all entities
|
|
|
+- **Status Indicators** - Visual badges and progress bars
|
|
|
+- **Tabbed Navigation** - Organized interface sections
|
|
|
+
|
|
|
+### **Interactive Elements**
|
|
|
+- **Drag & Drop** - File upload and organization
|
|
|
+- **Auto-complete** - Smart form suggestions
|
|
|
+- **Date Pickers** - Calendar-based date selection
|
|
|
+- **Rich Text Editors** - Enhanced text input areas
|
|
|
+
|
|
|
+## 📊 **Data Management**
|
|
|
+
|
|
|
+### **Import/Export**
|
|
|
+- CSV export functionality for reports
|
|
|
+- Data backup and restore capabilities
|
|
|
+- Bulk operations for efficiency
|
|
|
+
|
|
|
+### **Reporting**
|
|
|
+- Financial reports with charts and graphs
|
|
|
+- Inventory reports with stock levels and values
|
|
|
+- Project progress reports with timelines
|
|
|
+- Customer activity reports with engagement metrics
|
|
|
+
|
|
|
+## 🚀 **Deployment**
|
|
|
+
|
|
|
+### **Production Setup**
|
|
|
+1. **Environment Configuration**
|
|
|
+ ```bash
|
|
|
+ export NODE_ENV=production
|
|
|
+ export DB_HOST=your-production-host
|
|
|
+ ```
|
|
|
+
|
|
|
+2. **Web Server Configuration**
|
|
|
+ - Apache with mod_rewrite for clean URLs
|
|
|
+ - Nginx with PHP-FPM for performance
|
|
|
+ - SSL/TLS certificates for HTTPS
|
|
|
+
|
|
|
+3. **Database Optimization**
|
|
|
+ - Enable query caching
|
|
|
+ - Configure connection pooling
|
|
|
+ - Set up read replicas for scaling
|
|
|
+
|
|
|
+### **Monitoring**
|
|
|
+- Application performance monitoring
|
|
|
+- Database query performance tracking
|
|
|
+- Error logging and alerting
|
|
|
+- User activity analytics
|
|
|
+
|
|
|
+## 📄 **License**
|
|
|
+
|
|
|
+This project is licensed under the MIT License - feel free to use, modify, and distribute according to your needs.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+**Last Updated:** April 2026
|
|
|
+**Version:** 2.0.0
|
|
|
+**Compatible with:** PHP 7.4+, MySQL 5.7+, Node.js 14+, Vue 3
|
|
|
+
|
|
|
+## 🗂 **Project Structure**
|
|
|
+
|
|
|
+```
|
|
|
+inventory/
|
|
|
+├── backend/
|
|
|
+│ ├── config/
|
|
|
+│ │ └── database.php
|
|
|
+│ ├── models/
|
|
|
+│ │ ├── Item.php
|
|
|
+│ │ ├── RentalPrice.php
|
|
|
+│ │ ├── Attachment.php
|
|
|
+│ │ ├── Client.php
|
|
|
+│ │ ├── ContactPerson.php
|
|
|
+│ │ ├── Project.php
|
|
|
+│ │ ├── Subproject.php
|
|
|
+│ │ ├── ChartOfAccounts.php
|
|
|
+│ │ ├── JournalEntry.php
|
|
|
+│ │ ├── AccountTransaction.php
|
|
|
+│ │ └── User.php
|
|
|
+│ ├── api/
|
|
|
+│ │ ├── items.php
|
|
|
+│ │ ├── rental_prices.php
|
|
|
+│ │ ├── attachments.php
|
|
|
+│ │ ├── clients.php
|
|
|
+│ │ ├── contact_persons.php
|
|
|
+│ │ ├── projects.php
|
|
|
+│ │ ├── subprojects.php
|
|
|
+│ │ ├── invoices.php
|
|
|
+│ │ ├── chart_of_accounts.php
|
|
|
+│ │ ├── journal_entries.php
|
|
|
+│ │ ├── account_transactions.php
|
|
|
+│ │ ├── auth.php
|
|
|
+│ │ └── upload.php
|
|
|
+│ ├── migrate_complete.sql
|
|
|
+│ ├── migrate_y_tunnus.sql
|
|
|
+│ ├── migrate_new_tables.sql
|
|
|
+│ ├── migrate_clients.sql
|
|
|
+│ ├── migrate_projects.sql
|
|
|
+│ ├── migrate_bookkeeping.sql
|
|
|
+│ └── migrate_auth.sql
|
|
|
+├── frontend/
|
|
|
+│ ├── src/
|
|
|
+│ │ ├── App.vue
|
|
|
+│ │ └── main.js
|
|
|
+│ ├── index.html
|
|
|
+│ ├── package.json
|
|
|
+│ └── vite.config.js
|
|
|
+└── README.md
|
|
|
+```
|
|
|
+
|
|
|
+## 🎓 **Support & Maintenance**
|
|
|
+
|
|
|
+### **Regular Updates**
|
|
|
+- Security patches and updates
|
|
|
+- Feature enhancements based on user feedback
|
|
|
+- Performance optimizations
|
|
|
+- Database maintenance and optimization
|
|
|
+
|
|
|
+### **Backup Strategy**
|
|
|
+- Automated daily database backups
|
|
|
+- File system backups
|
|
|
+- Disaster recovery planning
|
|
|
+
|
|
|
+### **Troubleshooting**
|
|
|
+- Common issues and solutions
|
|
|
+- Performance tuning guides
|
|
|
+- Security best practices
|
|
|
+- Debugging techniques
|
|
|
+
|
|
|
+## 📄 **Migration Scripts**
|
|
|
+
|
|
|
+### **Complete Migration**
|
|
|
+For new installations, use the complete migration script:
|
|
|
+```bash
|
|
|
+mysql -u root -p < backend/migrate_complete.sql
|
|
|
+```
|
|
|
+
|
|
|
+### **Individual Migrations**
|
|
|
+For upgrading existing installations:
|
|
|
+```bash
|
|
|
+# Add y-tunnus and contact persons
|
|
|
+mysql -u root -p < backend/migrate_y_tunnus.sql
|
|
|
+
|
|
|
+# Add rental prices and attachments
|
|
|
+mysql -u root -p < backend/migrate_new_tables.sql
|
|
|
+
|
|
|
+# Add client management
|
|
|
+mysql -u root -p < backend/migrate_clients.sql
|
|
|
+
|
|
|
+# Add project management
|
|
|
+mysql -u root -p < backend/migrate_projects.sql
|
|
|
+- `postal_code` - Postal code (optional)
|
|
|
+- `country` - Country (optional)
|
|
|
+- `notes` - Additional notes (optional)
|
|
|
+- `created_at` - Creation timestamp
|
|
|
+- `updated_at` - Last update timestamp
|
|
|
+
|
|
|
+### Contact Persons Table
|
|
|
+- `id` - Primary key
|
|
|
+- `client_id` - Foreign key to clients table
|
|
|
+- `first_name` - First name (required)
|
|
|
+- `last_name` - Last name (required)
|
|
|
+- `email` - Email address (optional)
|
|
|
+- `phone` - Phone number (optional)
|
|
|
+- `position` - Job position/title (optional)
|
|
|
+- `is_primary` - Primary contact flag (boolean)
|
|
|
+- `created_at` - Creation timestamp
|
|
|
+- `updated_at` - Last update timestamp
|
|
|
+
|
|
|
+## File Upload
|
|
|
+
|
|
|
+### Pictures
|
|
|
+- Uploaded to `backend/api/uploads/` directory
|
|
|
+- Supported formats: JPEG, PNG, GIF, WebP
|
|
|
+- Maximum file size: 5MB
|
|
|
+- Files are automatically renamed with unique IDs
|
|
|
+
|
|
|
+### Attachments
|
|
|
+- Uploaded to `backend/api/attachments/` directory
|
|
|
+- Supported formats: PDF, DOC, DOCX, TXT, JPEG, PNG, GIF
|
|
|
+- Maximum file size: 10MB
|
|
|
+- Files are automatically renamed with unique IDs
|
|
|
+- Documents are categorized by type (receipt, warranty, other)
|