# Product Controllers Analysis

## Overview
Found 3 product-related controllers in the application:
1. **Front/ProductController.php** - Customer-facing shop frontend
2. **ProductController.php** - Admin/Backend product management
3. **Modules/Event/Http/Controllers/BackEnd/ShopManagement/ProductController.php** - Event module shop management

---

## 1. FRONT ProductController (`app/Http/Controllers/Front/ProductController.php`)

### Purpose
Handles all customer-facing product display, shopping cart, checkout, and payment processing.

### Key Methods

#### **shop($category_slug = '')**
- Displays products in shop listing
- Filters by category (supports subcategories)
- Applies price range filters from `$_GET['price']` parameter
- Supports sorting: `default`, `date`, `price`, `price-desc`, `popularity`
- Respects customer group permissions (can_add_to_cart, can_view_price)
- Returns max 12 products per page
- Loads with min/max variant prices via subquery
- **View**: `front.shop.index`

#### **loadMoreProducts(Request $request)**
- AJAX endpoint for pagination
- Takes: category_slug, page, price range, sort
- Same filtering logic as shop() but for dynamic loading
- Returns 24 products per page (after initial 12)
- **View**: `front.shop.load_more`

#### **searchProducts(Request $request)**
- Autocomplete search endpoint
- Filters by product name
- Returns JSON with id, value, slug, url
- Max 10 results
- Respects customer group visibility

#### **product($slug = '')**
- Displays single product detail page
- Loads product variants (filtered by status)
- Fetches default variant (or first ordered variant)
- Loads product images (including variant-specific images)
- Increments product view count
- Handles AJAX requests separately (returns partial HTML)
- Sets SEO meta tags
- **Views**: 
  - Full: `front.shop.details`
  - AJAX: `front.shop.partials._product-details`

#### **fetchVariant(Request $request)**
- AJAX endpoint for variant selection
- Takes: product_id, attributes[]
- Matches variant by product_attribute_id + product_attribute_value_id combinations
- Applies customer group discounts (percent or fixed)
- Returns JSON with variant details, price, SKU, stock, name

#### **cart()**
- Displays shopping cart page
- Loads cart items from session `CartID`
- Supports abandoned cart recovery via `cart_id` parameter
- Updates recovery_status to 'clicked' when recovery link accessed
- Calculates subtotal from cart items
- Shows discount if applied (type = 'discount')
- Redirects to shop if cart empty
- **View**: `front.shop.cart`

#### **checkout(Request $request)**
- Displays checkout form
- Validates billing/shipping fields (physical products require full address)
- Pre-fills customer info if logged in
- POST: Saves checkout data to OrderCart
- Redirects to payment page
- **View**: `front.shop.checkout`

#### **payment(Request $request)**
- Displays payment method selection page
- Loads payment gateway credentials (Stripe, PayPal, Razorpay)
- Calculates taxes using Stripe API or product tax settings
- Determines if order contains physical/recurring products
- Checks if Missio-owned products (uses different Stripe account)
- Handles POST for order placement
- Sends emails to admin and customer
- **View**: `front.shop.payment`

#### **Additional Payment Methods**
- `paypalCreatePayment()` - Creates PayPal payment agreement
- `paypalExecutePayment()` - Completes PayPal transaction
- `stripeCreatePayment()` - Creates Stripe payment intent
- `executeRazorpayPayment()` - Processes Razorpay payment

### Key Features

**Cart Management**:
- Session-based cart storage (`CartID`)
- Cart item type: 'item' or 'discount'
- Abandoned cart recovery with unique `cart_id`
- Checkout data JSON stored in OrderCart

**Variant System**:
- Product types: simple or variable
- Attributes assigned to products
- Variants have price, SKU, stock, images
- Default variant selection logic

**Customer Groups**:
- Controls product visibility per group
- Applies group-based discounts
- Guest-only products support
- Pricing visibility control

**Security/Features**:
- Company-based data isolation
- Customer group restrictions
- Price filtering via variant prices
- Product view tracking
- SEO meta tags

### Models Used
- Product, ProductCategory, ProductFiles
- OrderCart, Order, OrderItems
- ProductAttribute, ProductVariant, ProductVariantValue
- Customer, Company
- Coupons, CouponUsage
- Payment, Invoice, RecurringSubscription
- PaymentGatewayCredentials

---

## 2. Admin ProductController (`app/Http/Controllers/ProductController.php`)

### Purpose
Backend product management for admins/managers. CRUD operations, inventory, variants, attributes.

### Key Methods

#### **dashboard(Request $request)**
- Shows product revenue and order widgets
- Displays dashboard with top-selling products data
- **View**: `products.create` with `products.dashboard` view

#### **index(ProductsDataTable $dataTable)**
- Lists all products with DataTable
- Shows total products, cart items count
- Loads categories, subcategories, unit types
- Loads custom fields and configured columns
- **View**: `products.index`

#### **create()**
- Form for creating new product
- Loads taxes, categories, attributes, customer groups, unit types
- Loads custom field groups
- AJAX: Returns HTML only
- **View**: `products.ajax.create` or `products.create`

#### **store(StoreProductRequest $request)**
- Saves new product with validation
- Creates product with details: name, slug, price, SKU, stock
- Sets product_type (Physical/Digital), PaymentType (OneTime/Recurring)
- Handles downloadable files
- Syncs categories (many-to-many)
- Syncs product attributes and generates variants
- Syncs customer groups
- Sets first variant as default
- Handles custom fields
- **Returns**: JSON success with redirectUrl or productID

#### **show($id)**
- Displays product details read-only
- Shows tax information
- Loads custom fields
- **View**: `products.ajax.show` or `products.create`

#### **edit($id)**
- Product edit form with tabs
- Loads assigned attributes
- Tab options: 'details' or 'variations'
- Variations tab calls `variations($id)`
- **View**: `products.edit`

#### **variations($id)**
- Shows product variants in DataTable
- Tab-based view
- **View**: `products.ajax.variations`

#### **all_variations()**
- Lists all product variants across all products
- **View**: `products.variations`

#### **update(UpdateProductRequest $request, $id)**
- Updates product details
- Syncs categories, attributes, customer groups
- Regenerates variants via `generate()`
- Handles custom field updates
- **Returns**: JSON success with redirectUrl

#### **generate(Product $product)**
- **Core variant generation logic**
- Fetches assigned attributes and generates all combinations (Cartesian product)
- Compares with existing variants
- **Creates new variants** for new combinations
- **Soft-deletes variants** that no longer exist
- Sets variant SKU, price, stock, description
- Links variant attribute values
- Calls `generateSku()` helper
- **Returns**: JSON response

### Helper Methods

#### **SyncProductAttributeAssignment($product)**
- Syncs product attributes from request
- Removes attributes not in request
- Creates/updates ProductAtrributeAssignValue records
- Handles attribute values filtering

#### **cartesianProduct($arrays)**
- Generates all combinations of attribute values
- Used for variant generation logic
- Input: array of attributes with their values
- Output: array of all possible combinations

#### **generateSku($productSku, $combination)**
- Creates unique SKU for variant
- Format: original_sku-ATTR1-VALUE1-ATTR2-VALUE2
- Ensures uniqueness with random suffix if needed

### Key Features

**Product Types**:
- Simple products (single variant)
- Variable products (multiple variants from attributes)
- Physical (requires shipping details)
- Digital/Downloadable

**Attributes & Variants**:
- Product attributes with multiple values
- Variants auto-generated from attribute combinations
- Each variant has separate: price, SKU, stock, images
- Variant soft-delete support

**File Management**:
- Product images (position-based ordering)
- Downloadable files for digital products
- Support for local and S3 storage

**Customer Groups**:
- Associate products with customer groups
- Group-specific pricing/visibility control

**Tax & Pricing**:
- Multiple taxes per product
- Product pricing
- Variant-specific pricing

### Models Used
- Product, ProductCategory, ProductSubCategory
- ProductAttribute, ProductAttributeValue, ProductAtrributeAssignValue
- ProductVariant, ProductVariantValue
- ProductFiles, Tax
- OrderCart, Order, OrderItems
- CustomerGroup, CustomField, CustomFieldGroup
- UnitType

---

## 3. Event Module ProductController (`Modules/Event/Http/Controllers/BackEnd/ShopManagement/ProductController.php`)

### Purpose
Product management within Event module (separate shop system with multi-language support).

### Key Methods

#### **index()**
- Lists digital and physical product counts
- **View**: `backend.product.index`

#### **settings()**
- Displays product settings page
- Loads Basic settings
- **View**: `backend.product.settings`

#### **setting_update(Request $request)**
- Updates basic settings
- **Returns**: JSON success

#### **create(Request $request)**
- Show product creation form
- Loads available languages
- **View**: `backend.product.create`

#### **imgstore(Request $request)**
- Handles product gallery image upload (AJAX)
- Validates: jpg, png, jpeg only
- Stores in: `/assets/admin/img/product/gallery/`
- Creates ProductImage record
- **Returns**: JSON with file_id

#### **imgrmv(Request $request)**
- Removes gallery image by file ID
- Deletes physical file
- **Returns**: File ID

#### **store(ProductStoreRequest $request)**
- Creates new product
- Uploads feature image
- Uploads downloadable file (if digital product)
- Creates ProductImage records for gallery
- **Creates ProductContent for each language** (multilingual)
- ProductContent includes: title, slug, summary, description, meta tags
- **Returns**: JSON success

#### **show(Request $request)**
- Lists products filtered by language
- Shows product info with category
- Paginated (10 per page)
- **View**: `backend.product.show`

#### **status_update(Request $request)**
- Updates product status
- **Returns**: Redirect back

#### **feature_update(Request $request)**
- Updates is_feature flag
- **Returns**: Redirect back

#### **edit(Request $request)**
- Shows edit form with product data
- Loads all languages
- **View**: `backend.product.edit`

#### **load_images($id)**
- AJAX endpoint returning product gallery images
- **Returns**: JSON array of ProductImage records

#### **imagedbrmv(Request $request)**
- Removes database/gallery image record
- **Returns**: File ID

#### **update(ProductUpdateRequest $request)**
- Updates product details
- Updates feature image
- Updates download file
- **Updates ProductContent for each language**
- Updates gallery images assignment
- **Returns**: JSON success

#### **destroy(Request $request)**
- Deletes product and related data
- Deletes feature image, download file
- Deletes all ProductContent records
- Deletes all ProductImage gallery files
- Cascades to delete: order_items, product_reviews
- **Returns**: Redirect back

#### **bulk_destroy(Request $request)**
- Batch delete multiple products
- Same cleanup as destroy()
- **Returns**: JSON success

### Key Features

**Multi-Language Support**:
- ProductContent table stores content per language
- Title, slug, description in each language
- Meta tags per language
- Auto-creates content for all available languages

**File Management**:
- Feature image (main product image)
- Gallery images (multiple product images)
- Downloadable file (for digital products)
- All files stored in `/assets/admin/img/product/`

**Product Types**:
- Digital products
- Physical products
- Tracked separately with counts

**Gallery System**:
- Image upload with validation
- Image positioning/ordering
- Image removal
- Temporary image creation before product creation

**Cleanup on Delete**:
- Cascading deletion of related records
- Physical file deletion
- Related order items and reviews cleanup

### Models Used
- Product (ShopManagement), ProductContent, ProductImage
- Language, Basic

---

## Comparison Table

| Feature | Front | Admin | Event Module |
|---------|-------|-------|--------------|
| Purpose | Customer shop | Product management | Event shop mgmt |
| Cart Management | ✓ | ✓ (limited) | ✗ |
| Checkout/Payment | ✓ | ✗ | ✗ |
| Variants | Display | Create/Manage | ✗ |
| Attributes | Display | Manage | ✗ |
| Customer Groups | Filtering | Assignment | ✗ |
| Multi-Language | ✗ | ✗ | ✓ |
| Taxes | Apply | Setup | ✗ |
| Images | Display | Upload/Manage | ✓ |
| Downloadable Files | Download | Manage | ✓ |
| SEO Meta | ✓ | Limited | ✓ |
| Custom Fields | ✗ | ✓ | ✗ |

---

## Data Flow Summary

### Shopping Flow (Front ProductController)
1. **shop()** → List products with filtering
2. **product()** → View single product details
3. **fetchVariant()** → Get variant details (AJAX)
4. **cart()** → View cart (from session)
5. **checkout()** → Enter billing/shipping
6. **payment()** → Select payment method & process
7. Order created, emails sent

### Product Management Flow (Admin ProductController)
1. **create()** → Show form
2. **store()** → Save product + attributes
3. **generate()** → Auto-create variants from attribute combinations
4. **edit()** → Modify product
5. **update()** → Save changes, regenerate variants
6. **variations()** → Manage variant details

---

## Important Notes

### Session/Cart Management
- Cart stored in session with key `CartID`
- Cart items tracked in `OrderCart` table
- Supports abandoned cart recovery with unique cart IDs

### Variant Generation Strategy
- Admin creates attributes on product
- `generate()` method auto-creates all attribute combinations
- Soft-deletes variants when attributes are removed
- Each variant can have different price/stock

### Customer Group Security
- Products filtered by customer group membership
- Group members see: group products + guest-only products
- Can restrict both add-to-cart and price visibility

### Payment Processing
- Multiple gateway support: Stripe, PayPal, Razorpay
- Recurring subscriptions via PayPal/Stripe
- Tax calculated at checkout (Stripe API or product tax settings)
- Special handling for Missio-owned products (connected Stripe account)

### File Storage
- Product images: `user-uploads/products/{product_id}/`
- Downloadable files: `user-uploads/products/{product_id}/`
- Supports local and S3 storage
- Image compression available

