/home/smartonegroup/public_html/system/system/controllers/ps.php
<?php
/*
|--------------------------------------------------------------------------
| Controller
|--------------------------------------------------------------------------
|
*/

if (!defined('APP_RUN')) {
    exit('No direct access allowed');
}

_auth();
$ui->assign('selected_navigation', 'ps');
$ui->assign(
    '_title',
    $_L['Products n Services'] . '- ' . $config['CompanyName']
);
$action = $routes['1'];
$user = authenticate_admin();

if (!has_access($user->roleid, 'products_n_services', 'view')) {
    permissionDenied();
}

switch ($action) {
    case 'modal-list':
        if (!has_access($user->roleid, 'products_n_services', 'view')) {
            permissionDenied();
        }

        $d = ORM::for_table('sys_items')
            ->order_by_asc('name')
            ->find_array();

        $format_currency_override = [];

        if (isset($config['decimal_places_products_and_services'])) {
            $format_currency_override['precision'] =
                $config['decimal_places_products_and_services'];
        }

        $format_currency_override['prefix'] = '';
        $format_currency_override['suffix'] = '';

        \view('ps_modal_list', [
            'd' => $d,
            'format_currency_override' => $format_currency_override,
        ]);

        break;

    case 'p-new':
        if (!has_access($user->roleid, 'products_n_services', 'create')) {
            permissionDenied();
        }

//        $units = ORM::for_table('sys_units')
//            ->order_by_asc('sorder')
//            ->find_array();

        $units = ItemUnit::query()
            ->orderBy('sorder', 'asc')
            ->get()
            ->keyBy('id')
            ->all();

        $ui->assign('units', $units);

        $ui->assign('type', 'Product');

        $max = ORM::for_table('sys_items')->max('id');
        $nxt = $max + 1;
        $ui->assign('nxt', $nxt);

        view('add-ps');

        break;

    case 's-new':
        if (!has_access($user->roleid, 'products_n_services', 'create')) {
            permissionDenied();
        }

        $ui->assign('type', 'Service');

        $max = ORM::for_table('sys_items')->max('id');
        $nxt = $max + 1;
        $ui->assign('nxt', $nxt);
        view('add-ps');

        break;

    case 'add-post':
        if (is_demo()) {
            exit('Disabled in demo.');
        }

        if (!has_access($user->roleid, 'products_n_services', 'edit')) {
            permissionDenied();
        }

        $msg = '';

        $data = $request->all();

        $name = _post('name');
        $sales_price = _post('sales_price', '0.00');
        $sales_price = Finance::amount_fix($sales_price);
        $item_number = _post('item_number');
        $description = _post('description');
        $type = _post('type');

        // other variables

        // check item number already exist

        if ($item_number != '') {
            $check = ORM::for_table('sys_items')
                ->where('item_number', $item_number)
                ->first();
            if ($check) {
                $msg .= 'Item number already exist <br>';
            }
        }

        $inventory = _post('inventory');

        if (!is_numeric($inventory)) {
            $inventory = '0';
        }

        $unit = _post('unit');

        if ($name == '') {
            $msg .= 'Item Name is required <br>';
        }

        $tax_code = _post('tax_code');
        $sales_price = Finance::amount_fix($sales_price);

        if (!is_numeric($sales_price)) {
            $sales_price = '0.00';
        }

        $cost_price = _post('cost_price', '0.00');

        $cost_price = Finance::amount_fix($cost_price);

        $tax1_rate = $data['tax1_rate'] ?? 0;
        $tax1_rate = createFromCurrency($tax1_rate, $config['currency_code']);

        if(empty($tax1_rate)){
            $tax1_rate = null;
        }


        if (!is_numeric($cost_price)) {
            $cost_price = '0.00';
        }

        $show_in_catalog = _post('show_in_catalog');



        if ($msg == '') {
            $d = ORM::for_table('sys_items')->create();
            $d->name = $name;
            $d->sales_price = $sales_price;
            $d->item_number = $item_number;
            $d->description = $description;
            $d->type = $type;
            $d->unit = $unit;
            $d->inventory = $inventory;
            $d->tax1_rate = $tax1_rate;
            $d->e = '';

            $d->image = _post('file_link');
            $d->cost_price = $cost_price;

            $d->tax_code = $tax_code;

            if (isset($data['sku'])) {
                $d->sku = $data['sku'];
            }

            if (isset($data['width'])) {
                $d->width = createFromCurrency(
                    (float) $data['width'],
                    $config['home_currency']
                );
            }

            if (isset($data['length'])) {
                $d->length = createFromCurrency(
                    (float) $data['length'],
                    $config['home_currency']
                );
            }

            if (isset($data['height'])) {
                $d->height = createFromCurrency(
                    (float) $data['height'],
                    $config['home_currency']
                );
            }

            if (isset($data['weight'])) {
                $d->weight = createFromCurrency(
                    (float) $data['weight'],
                    $config['home_currency']
                );
            }

            $d->save();

            _msglog('s', $_L['Item Added Successfully']);

            echo $d->id();
        } else {
            echo $msg;
        }
        break;

    case 'p-list':
        if (!has_access($user->roleid, 'products_n_services', 'view')) {
            permissionDenied();
        }

        $paginator = Paginator::bootstrap('sys_items', 'type', 'Product');
        $d = ORM::for_table('sys_items')
            ->where('type', 'Product')
            ->offset($paginator['startpoint'])
            ->limit($paginator['limit'])
            ->order_by_desc('id')
            ->find_many();
        $ui->assign('d', $d);
        $ui->assign('type', 'Product');
        $ui->assign('paginator', $paginator);

        view('ps-list');
        break;

    case 's-list':
        $paginator = Paginator::bootstrap('sys_items', 'type', 'Service');
        $d = ORM::for_table('sys_items')
            ->where('type', 'Service')
            ->offset($paginator['startpoint'])
            ->limit($paginator['limit'])
            ->order_by_desc('id')
            ->find_many();
        $ui->assign('d', $d);
        $ui->assign('type', 'Service');
        $ui->assign('paginator', $paginator);

        view('ps-list');

        break;

    case 'products':
    case 'services':
        $items = Item::select([
            'id',
            'name',
            'item_number',
            'sales_price',
            'cost_price',
            'available',
            'image',
            'category_id',
            'show_in_catalog',
        ]);

        $items = $action === 'products' ? $items->where('type', 'Product') : $items->where('type', 'Service');

        $items = $items->get();

        $format_currency_override = [];

        if (isset($config['decimal_places_products_and_services'])) {
            $format_currency_override['precision'] =
                $config['decimal_places_products_and_services'];
        }

        \view('products_and_services', [
            'action' => $action,
            'items' => $items,
            'format_currency_override' => $format_currency_override,
            'can_edit' => has_access(
                $user->roleid,
                'products_n_services',
                'edit'
            ),
            'can_delete' => has_access(
                $user->roleid,
                'products_n_services',
                'delete'
            ),
        ]);

        break;

    case 'edit-post':
        if (is_demo()) {
            exit('Disabled in demo.');
        }

        if (!has_access($user->roleid, 'products_n_services', 'edit')) {
            permissionDenied();
        }

        $msg = '';

        $data = $request->all();

        $id = _post('id');

        $name = _post('name');
        $sales_price = _post('sales_price', '0.00');
        $sales_price = Finance::amount_fix($sales_price);
        $item_number = _post('item_number');
        $description = _post('description');
        $type = _post('type');

        // other variables

        $inventory = _post('inventory');

        $inventory = Finance::amount_fix($inventory);

        if (!is_numeric($inventory)) {
            $inventory = '0';
        }

        $unit = _post('unit');

        $msg = '';

        if ($name == '') {
            $msg .= 'Item Name is required <br>';
        }

        $sales_price = Finance::amount_fix($sales_price);

        if (!is_numeric($sales_price)) {
            $sales_price = '0.00';
        }

        $cost_price = _post('cost_price', '0.00');

        $cost_price = Finance::amount_fix($cost_price);

        if (!is_numeric($cost_price)) {
            $cost_price = '0.00';
        }

        $tax1_rate = $data['tax1_rate'] ?? 0;
        $tax1_rate = createFromCurrency($tax1_rate, $config['currency_code']);
        $tax1_rate = (float) $tax1_rate;

        if ($msg == '') {
            $d = ORM::for_table('sys_items')->find($id);
            if ($d) {
                if ($item_number != '' && $item_number != $d->item_number) {
                    $check = ORM::for_table('sys_items')
                        ->where('item_number', $item_number)
                        ->first();
                    if ($check) {
                        i_close('Item Number already exist.');
                    }
                }

                $d->name = $name;
                $d->item_number = $item_number;
                $d->sales_price = $sales_price;
                $d->description = $description;
                $d->unit = $unit;
                $d->inventory = $inventory;

                // other variables

                $d->image = _post('file_link');
                $d->cost_price = $cost_price;

                if (isset($data['sku'])) {
                    $d->sku = $data['sku'];
                }

                $d->tax1_rate = $tax1_rate;

                if (isset($data['width'])) {
                    $d->width = createFromCurrency(
                        $data['width'],
                        $config['home_currency']
                    );
                }

                if (isset($data['length'])) {
                    $d->length = createFromCurrency(
                        $data['length'],
                        $config['home_currency']
                    );
                }

                if (isset($data['height'])) {
                    $d->height = createFromCurrency(
                        $data['height'],
                        $config['home_currency']
                    );
                }

                if (isset($data['weight'])) {
                    $d->weight = createFromCurrency(
                        $data['weight'],
                        $config['home_currency']
                    );
                }

                $d->tax_code = _post('tax_code');

                $d->save();
                echo $d->id();
            } else {
                echo 'Not Found';
            }
        } else {
            echo $msg;
        }

        break;
    case 'delete':
        if (is_demo()) {
            exit('Disabled in demo.');
        }

        if (!has_access($user->roleid, 'products_n_services', 'delete')) {
            permissionDenied();
        }

        $id = $routes['2'];
        if (APP_STAGE == 'Demo') {
            r2(
                U . 'accounts/list',
                'e',
                'Sorry! Deleting Account is disabled in the demo mode.'
            );
        }
        $d = Account::find($id);
        if ($d) {
            $d->delete();
            r2(U . 'accounts/list', 's', $_L['account_delete_successful']);
        }

        break;

    case 'edit-form':
        if (!has_access($user->roleid, 'products_n_services', 'edit')) {
            exit();
        }

        $id = $routes['2'];
        $item = Item::find($id);

        if ($item) {
            $price = number_format(
                $item->sales_price,
                2,
                $config['dec_point'],
                $config['thousands_sep']
            );
            $has_img = '';
            if ($item->image != '') {
                $has_img =
                    '<hr>
<img src="' .
                    APP_URL .
                    '/storage/items/' .
                    $item->image .
                    '" class="img-fluid">
';
            }

            $type = $item->type;

            $units = ItemUnit::query()
                ->orderBy('sorder', 'asc')
                ->get()
                ->keyBy('id')
                ->all();

            \view('ps_edit', [
                'has_img' => $has_img,
                'item' => $item,
                'type' => $type,
                'units' => $units,
            ]);
        } else {
            echo 'not found';
        }

        break;

    case 'json_get':
        if (!has_access($user->roleid, 'products_n_services', 'view')) {
            permissionDenied();
        }

        header('Content-Type: application/json');

        $pid = route(2);

        $d = ORM::for_table('sys_items')->find($pid);

        if ($d) {
            $i = [];
            $i['sales_price'] = $d->sales_price;

            echo json_encode($i);
        }

        break;

    case 'cats':
        break;

    case 'upload':
        if (!has_access($user->roleid, 'products_n_services', 'create')) {
            permissionDenied();
        }

        if (APP_STAGE == 'Demo') {
            exit();
        }

        $uploader = new Uploader();
        $uploader->setDir('storage/items/');
        $uploader->sameName(false);
        $uploader->setExtensions(['jpg', 'jpeg', 'png', 'gif']); //allowed extensions list//
        if ($uploader->uploadFile('file')) {
            $uploaded = $uploader->getUploadName(); //get uploaded file name, renames on upload//

            $file = $uploaded;
            $msg = $_L['Uploaded Successfully'];
            $success = 'Yes';

            // create thumb

            $image = new Img();

            // indicate a source image (a GIF, PNG or JPEG file)
            $image->source_path = 'storage/items/' . $file;

            // indicate a target image
            // note that there's no extra property to set in order to specify the target
            // image's type -simply by writing '.jpg' as extension will instruct the script
            // to create a 'jpg' file
            $image->target_path = 'storage/items/thumb' . $file;

            // since in this example we're going to have a jpeg file, let's set the output
            // image's quality
            $image->jpeg_quality = 100;

            // some additional properties that can be set
            // read about them in the documentation
            $image->preserve_aspect_ratio = true;
            $image->enlarge_smaller_images = true;
            $image->preserve_time = true;

            $image->resize(100, 100, ZEBRA_IMAGE_CROP_CENTER);
            $image->target_path = 'storage/items/thumb_400' . $file;

            $image->resize(400, 400, ZEBRA_IMAGE_CROP_CENTER);
        } else {
            //upload failed
            $file = '';
            $msg = $uploader->getMessage();
            $success = 'No';
        }

        $a = [
            'success' => $success,
            'msg' => $msg,
            'file' => $file,
        ];

        header('Content-Type: application/json');

        echo json_encode($a);

        break;

    case 'show-in-catalog':

        $data = request()->all();

        $item_id = $data['id'] ?? null;
        $show_in_catalog = $data['show_in_catalog'] ?? 0;

        ray($item_id);

        if ($item_id) {
            $item = Item::find($item_id);
            $item->show_in_catalog = $show_in_catalog;
            $item->save();
        }

        break;

    default:
        echo 'action not defined';
}