File "UpdateOrderRequest.php"

Full Path: /home/clickysoft/public_html/jmapi5.clickysoft.net/app/Http/Requests/Admin/UpdateOrderRequest.php
File size: 10.69 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Http\Requests\Admin;

use App\Models\Coupon;
use App\Models\Order;
use App\Rules\AddressBelongsToUser;
use App\Rules\LimitProductQuantityIncrease;
use App\Rules\ValidateCoupon;
use App\Rules\ValidateDate;
use App\Rules\ValidateImage;
use App\Rules\ValidateRange;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Http\FormRequest;

class UpdateOrderRequest extends FormRequest
{
    public function authorize()
    {
        return Gate::allows('order_edit');
    }

    public function rules()
    {
        $order = request()->route('order')->id;
        $order = Order::find($order);
        $rules =  [
            'user_id' => [
                'required',
                'integer',
                'exists:users,id',
            ],
            'order_type' => [
                'nullable',
                'in:'. implode(',', Order::ORDER_TYPE_RADIO),
            ],
            'rush_order' => [
                'nullable',
                'in:'. implode(',', Order::RUSH_ORDER_RADIO),
            ],
            'delivery_date' => [
                'nullable',
                'date',
            ],
            'event_date' => [
                'required',
                'date',
                'after_or_equal:delivery_date',
                'after_or_equal:date_scheduled',
            ],
            'date_scheduled' => [
                'nullable',
                'date',
                new ValidateDate,
            ],
            'date_pick_or_ship_by' => [
                'nullable',
                'date',
                'after_or_equal:date_scheduled',
                new ValidateDate,
            ],
            'current_status_id' => [
                'required',
                'integer',
                'exists:statuses,id',
            ],
            'admin_approved' => [
                'nullable',
                'in:0,1',
            ],
            'delivery_type' => [
                'required',
                'in:'. implode(',', Order::DELIVERY_TYPE),
            ],
            'description' => [
                'nullable',
                'string',
            ],
            'waive_off_sales_tax' => [
                'nullable',
                'boolean',
            ],
            'waive_off_sales_tax_reason' => [
                'required_if:waive_off_sales_tax,1',
                'in:'. implode(',', Order::WAIVE_OFF_OPTIONS),
            ],
            'resale_number' => [
                'required_if:waive_off_sales_tax_reason,Reseller Exemption',
            ],
            'shipping_address_id' => [
                'exclude_if:delivery_type,Pickup',
                'required_if:delivery_type,Shipping',
                'integer',
                'exists:address_books,id',
                new AddressBelongsToUser
            ],
            'is_residential' => [
                'exclude_if:delivery_type,Pickup',
                'required_if:delivery_type,Shipping',
                'boolean',
            ],
            'billing_address_id' => [
                'required',
                'integer',
                'exists:address_books,id',
                new AddressBelongsToUser
            ],
            'pickup_location_id' => [
                'exclude_if:delivery_type,Shipping',
                'required_if:delivery_type,Pickup',
                'integer',
                'exists:store_locations,id',
            ],
            'payment_status' => [
                'required',
                'in:'. implode(',', Order::PAYMENT_STATUS_RADIO),
            ],
            'payment_mode' => [
                'required',
                'in:'. implode(',', Order::PAYMENT_MODE_RADIO),
            ],
            'payment_amount' => [
                'nullable',
                'numeric',
            ],
            'coupon_code' => [
                'nullable',
                'exists:coupons,code',
                new ValidateCoupon,
            ],
            'products' => [
                'required',
                'array',
            ],
            'products.*.product_id' => [
                'required',
                'integer',
                'exists:products,id',
            ],
            'products.*.item_id' => [
                'nullable',
                new LimitProductQuantityIncrease,
            ],
            'products.*.price_id' => [
                'required',
                'integer',
                'exists:product_prices,id',
            ],
            'products.*.quantity' => [
                'required',
                'integer',
                'min:1',
                new ValidateRange,
            ],
            'products.*.template' => [
                'nullable',
                'mimes:pdf,application/pdf',
                'max:5120',
            ],
            'products.*.notes' => [
                'nullable',
                'string',
            ],
        ];

        if ($order->coupon_id != null) { //If order previously had discount
            $existing_coupon = Coupon::find($order->coupon_id);
            if ($existing_coupon?->id == $order->coupon_id) { //If current discount code & existing discount code are same
                $rules['coupon_code'] = [
                    'nullable',
                    'exists:coupons,code',
                ];
            } else { //If order does not have discount or the discount coupon has changed
                $rules['coupon_code'] = [
                    'nullable',
                    'exists:coupons,code',
                    new ValidateCoupon,
                ];
            }
        }

        if ($this->input('payment_status') == 'Paid' && $order->payment_status != "Paid") {
            $rules['payment_type'] = [
                'required',
                'in:'. implode(',', Order::PAYMENT_TYPE_RADIO),
            ];

            if ($this->input('payment_type') == 'Credit Card') {
                if ($this->input('vault_id')) {
                    $rules['vault_id'] = [
                        'exclude_if:payment_status,Unpaid',
                        'exclude_if:payment_type,Purchase Order',
                        'gt:0',
                    ];
                } else if($this->input('card_number') && $this->input('expiry_year') && $this->input('expiry_month') && $this->input('ccv')) {
                    $rules['expiry_year'] = [
                        'exclude_if:payment_status,Unpaid',
                        'exclude_if:payment_type,Purchase Order',
                        'date_format:Y',
                    ];
                    $rules['expiry_month'] = [
                        'exclude_if:payment_status,Unpaid',
                        'exclude_if:payment_type,Purchase Order',
                        'date_format:m',
                    ];
                    $rules['ccv'] = [
                        'exclude_if:payment_status,Unpaid',
                        'exclude_if:payment_type,Purchase Order',
                        'regex:/^[0-9]+$/',
                    ];
                    $rules['save_card'] = [
                        'exclude_if:payment_status,Unpaid',
                        'exclude_if:payment_type,Purchase Order',
                        'boolean',
                        'nullable',
                    ];
                } else {
                    $rules['payment_method'] = [
                        'required',
                    ];
                }

            } else if($this->input('payment_type') == 'Purchase Order') {

                $rules['purchase_order_number'] = [
                    'exclude_if:payment_status,Unpaid',
                    'required',
                    'string',
                    'max:25',
                ];

                if ($order->purchase_order_copy == null) {
                    $rules['purchase_order_copy'] = [
                        'exclude_if:payment_status,Unpaid',
                        'required',
                        'mimes:pdf,jpg,jpeg,png,xlsx',
                    ];
                }

            } else if($this->input('payment_type') == 'Check') {
                $rules['cheque_number'] = [
                    'exclude_if:payment_status,Unpaid',
                    'required',
                    'string',
                    'max:25',
                ];
            }
        }

        return $rules;
    }

    public function messages()
    {
        return [
            'date_pick_or_ship_by.required' => 'The date pick up / ship by is required.',
            'date_pick_or_ship_by.after_or_equal' => 'The date pick up / ship by must be date after or equal today.',
            'date_pick_or_ship_by.date' => 'Date pick up / ship by must be a valid date.',
            'waive_off_sales_tax.boolean' => 'The waive off sales tax field must be 0 or 1.',
            'products.*.product_id.required' => 'Product id for product #:position is required.',
            'products.*.product_id.integer' => 'Product id for product #:position must be an integer.',
            'products.*.product_id.exists' => 'Product id for product #:position is invalid.',
            'products.*.price_id.required' => 'Price id for product #:position is required.',
            'products.*.price_id.integer' => 'Price id for product #:position must be an integer.',
            'products.*.price_id.exists' => 'Price id for product #:position is invalid.',
            'products.*.quantity.required' => 'Quantity for product #:position is required.',
            'products.*.quantity.integer' => 'Quantity for product #:position must be an integer.',
            'products.*.quantity.min' => 'Quantity for product #:position must be greater than 0.',
            'products.*.customization.required' => 'Customization for product #:position required.',
            'products.*.customization.array' => 'Customization for product #:position must be an array.',
            'products.*.template.mimes' => 'Template for product #:position must be of type pdf.',
            'products.*.template.max' => 'Template size for product #:position can not exceed 5MB.',
            'products.*.image.mimes' => 'Image for product #:position must be of type jpg, jpeg, png.',
            'products.*.image.max' => 'Image size for product #:position can not exceed 5MB.',
            'rush_order.in' => ':attribute can only be '. implode(',', Order::RUSH_ORDER_RADIO),
            'payment_method.required' => 'Credit card details or vault id needed when payment type is credit card.',
            'waive_off_sales_tax_reason.required_if' => 'The waive off sales tax reason is required when waive off sales tax is true.',
            'ccv.regex' => 'Ccv must be a valid number.',
            'cheque_number.required' => 'The check number field is required.',
            'is_residential.required_if' => 'The residential field is required when delivery type is "Shipping".',
        ];
    }
}