tax = model(Tax::class); $this->tax_category = model(Tax_category::class); $this->tax_code = model(Tax_code::class); $this->tax_jurisdiction = model(Tax_jurisdiction::class); $this->tax_lib = new Tax_lib(); $this->config = config(OSPOS::class)->settings; helper('tax_helper'); } /** * @return void */ public function getIndex(): void { $data['tax_codes'] = $this->tax_code->get_all()->getResultArray(); if (count($data['tax_codes']) == 0) { $data['tax_codes'] = $this->tax_code->get_empty_row(); } $data['tax_categories'] = $this->tax_category->get_all()->getResultArray(); if (count($data['tax_categories']) == 0) { $data['tax_categories'] = $this->tax_category->get_empty_row(); } $data['tax_jurisdictions'] = $this->tax_jurisdiction->get_all()->getResultArray(); if (count($data['tax_jurisdictions']) == 0) { $data['tax_jurisdictions'] = $this->tax_jurisdiction->get_empty_row(); } $data['tax_rate_table_headers'] = get_tax_rates_manage_table_headers(); $data['tax_categories_table_headers'] = get_tax_categories_table_headers(); $data['tax_types'] = $this->tax_lib->get_tax_types(); if($this->config['tax_included']) { $data['default_tax_type'] = Tax_lib::TAX_TYPE_INCLUDED; } else { $data['default_tax_type'] = Tax_lib::TAX_TYPE_EXCLUDED; } $data['tax_type_options'] = $this->tax_lib->get_tax_type_options($data['default_tax_type']); echo view('taxes/manage', $data); } /** * Returns tax_codes table data rows. This will be called with AJAX. * * @return void */ public function getSearch(): void { $search = $this->request->getGet('search'); $limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT); $offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT); $sort = $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $tax_rates = $this->tax->search($search, $limit, $offset, $sort, $order); $total_rows = $this->tax->get_found_rows($search); $data_rows = []; foreach($tax_rates->getResult() as $tax_rate_row) { $data_rows[] = get_tax_rates_data_row($tax_rate_row); } echo json_encode (['total' => $total_rows, 'rows' => $data_rows]); } /** * Gives search suggestions based on what is being searched for */ public function suggest_search(): void { $search = $this->request->getPost('term'); $suggestions = $this->tax->get_search_suggestions($search); //TODO: There is no get_search_suggestions function in the tax model echo json_encode($suggestions); } /** * Provides list of tax categories to select from * * @return void */ public function suggest_tax_categories(): void { $search = $this->request->getPost('term'); $suggestions = $this->tax_category->get_tax_category_suggestions($search); echo json_encode($suggestions); } /** * @param int $row_id * @return void */ public function getRow(int $row_id): void { $data_row = get_tax_rates_data_row($this->tax->get_info($row_id)); echo json_encode($data_row); } /** * @param int $tax_code * @return void */ public function getView_tax_codes(int $tax_code = NEW_ENTRY): void { $tax_code_info = $this->tax->get_info($tax_code); $default_tax_category_id = 1; // Tax category id is always the default tax category //TODO: Replace 1 with constant $default_tax_category = $this->tax->get_tax_category($default_tax_category_id); //TODO: this variable is never used in the code. $tax_rate_info = $this->tax->get_rate_info($tax_code, $default_tax_category_id); if($this->config['tax_included']) { $data['default_tax_type'] = Tax_lib::TAX_TYPE_INCLUDED; } else { $data['default_tax_type'] = Tax_lib::TAX_TYPE_EXCLUDED; } $data['rounding_options'] = rounding_mode::get_rounding_options(); $data['html_rounding_options'] = $this->get_html_rounding_options(); if($tax_code == NEW_ENTRY) {//TODO: Duplicated code $data['tax_code'] = ''; $data['tax_code_name'] = ''; $data['tax_code_type'] = '0'; $data['city'] = ''; $data['state'] = ''; $data['tax_rate'] = '0.0000'; $data['rate_tax_code'] = ''; $data['rate_tax_category_id'] = 1; $data['tax_category'] = ''; $data['add_tax_category'] = ''; $data['rounding_code'] = '0'; } else { $data['tax_code'] = $tax_code; $data['tax_code_name'] = $tax_code_info->tax_code_name; $data['tax_code_type'] = $tax_code_info->tax_code_type; $data['city'] = $tax_code_info->city; $data['state'] = $tax_code_info->state; $data['rate_tax_code'] = $tax_code_info->rate_tax_code; $data['rate_tax_category_id'] = $tax_code_info->rate_tax_category_id; $data['tax_category'] = $tax_code_info->tax_category; $data['add_tax_category'] = ''; $data['tax_rate'] = $tax_rate_info->tax_rate; $data['rounding_code'] = $tax_rate_info->rounding_code; } $tax_rates = []; foreach($this->tax->get_tax_code_rate_exceptions($tax_code) as $tax_code_rate) //TODO: get_tax_code_rate_exceptions doesn't exist. This was deleted by @steveireland in https://github.com/opensourcepos/opensourcepos/commit/32204698379c230f2a6756655f40334308023de9#diff-e746bab6720cf5dbf855de6cda68f7aca9ecea7ddd5a39bb852e9b9047a7a838L435 but it's unclear if that was on purpose or accidental. { $tax_rate_row = []; $tax_rate_row['rate_tax_category_id'] = $tax_code_rate['rate_tax_category_id']; $tax_rate_row['tax_category'] = $tax_code_rate['tax_category']; $tax_rate_row['tax_rate'] = $tax_code_rate['tax_rate']; $tax_rate_row['rounding_code'] = $tax_code_rate['rounding_code']; $tax_rates[] = $tax_rate_row; } $data['tax_rates'] = $tax_rates; echo view('taxes/tax_code_form', $data); } /** * @param int $tax_rate_id * @return void */ public function getView(int $tax_rate_id = NEW_ENTRY): void { $tax_rate_info = $this->tax->get_info($tax_rate_id); $data['tax_rate_id'] = $tax_rate_id; $data['rounding_options'] = rounding_mode::get_rounding_options(); $data['tax_code_options'] = $this->tax_lib->get_tax_code_options(); $data['tax_category_options'] = $this->tax_lib->get_tax_category_options(); $data['tax_jurisdiction_options'] = $this->tax_lib->get_tax_jurisdiction_options(); if($tax_rate_id == NEW_ENTRY) { $data['rate_tax_code_id'] = $this->config['default_tax_code']; $data['rate_tax_category_id'] = $this->config['default_tax_category']; $data['rate_jurisdiction_id'] = $this->config['default_tax_jurisdiction']; $data['tax_rounding_code'] = rounding_mode::HALF_UP; $data['tax_rate'] = '0.0000'; } else { $data['rate_tax_code_id'] = $tax_rate_info->rate_tax_code_id; $data['rate_tax_code'] = $tax_rate_info->tax_code; $data['rate_tax_category_id'] = $tax_rate_info->rate_tax_category_id; $data['rate_jurisdiction_id'] = $tax_rate_info->rate_jurisdiction_id; $data['tax_rounding_code'] = $tax_rate_info->tax_rounding_code; $data['tax_rate'] = $tax_rate_info->tax_rate; } echo view('taxes/tax_rates_form', $data); } /** * @param int $tax_code * @return void */ public function getView_tax_categories(int $tax_code = NEW_ENTRY): void //TODO: This appears to be called no where in the code. { $tax_code_info = $this->tax->get_info($tax_code); //TODO: Duplicated Code $default_tax_category_id = 1; // Tax category id is always the default tax category //TODO: replace with a constant. $default_tax_category = $this->tax->get_tax_category($default_tax_category_id); $tax_rate_info = $this->tax->get_rate_info($tax_code, $default_tax_category_id); $data['rounding_options'] = rounding_mode::get_rounding_options(); $data['html_rounding_options'] = $this->get_html_rounding_options(); if($this->config['tax_included']) { $data['default_tax_type'] = Tax_lib::TAX_TYPE_INCLUDED; } else { $data['default_tax_type'] = Tax_lib::TAX_TYPE_EXCLUDED; } if($tax_code == NEW_ENTRY) { $data['tax_code'] = ''; $data['tax_code_name'] = ''; $data['tax_code_type'] = '0'; $data['city'] = ''; $data['state'] = ''; $data['tax_rate'] = '0.0000'; $data['rate_tax_code'] = ''; $data['rate_tax_category_id'] = 1; $data['tax_category'] = ''; $data['add_tax_category'] = ''; $data['rounding_code'] = '0'; } else { $data['tax_code'] = $tax_code; $data['tax_code_name'] = $tax_code_info->tax_code_name; $data['tax_code_type'] = $tax_code_info->tax_code_type; $data['city'] = $tax_code_info->city; $data['state'] = $tax_code_info->state; $data['rate_tax_code'] = $tax_code_info->rate_tax_code; $data['rate_tax_category_id'] = $tax_code_info->rate_tax_category_id; $data['tax_category'] = $tax_code_info->tax_category; $data['add_tax_category'] = ''; $data['tax_rate'] = $tax_rate_info->tax_rate; $data['rounding_code'] = $tax_rate_info->rounding_code; } $tax_rates = []; foreach($this->tax->get_tax_code_rate_exceptions($tax_code) as $tax_code_rate) //TODO: get_tax_code_rate_exceptions doesn't exist in the tax model { $tax_rate_row = []; $tax_rate_row['rate_tax_category_id'] = $tax_code_rate['rate_tax_category_id']; $tax_rate_row['tax_category'] = $tax_code_rate['tax_category']; $tax_rate_row['tax_rate'] = $tax_code_rate['tax_rate']; $tax_rate_row['rounding_code'] = $tax_code_rate['rounding_code']; $tax_rates[] = $tax_rate_row; } $data['tax_rates'] = $tax_rates; echo view('taxes/tax_category_form', $data); } /** * @param int $tax_code * @return void */ public function getView_tax_jurisdictions(int $tax_code = NEW_ENTRY): void //TODO: This appears to be called no where in the code. { $tax_code_info = $this->tax->get_info($tax_code); //TODO: Duplicated code $default_tax_category_id = 1; // Tax category id is always the default tax category $default_tax_category = $this->tax->get_tax_category($default_tax_category_id); //TODO: This variable is not used anywhere in the code $tax_rate_info = $this->tax->get_rate_info($tax_code, $default_tax_category_id); $data['rounding_options'] = rounding_mode::get_rounding_options(); $data['html_rounding_options'] = $this->get_html_rounding_options(); if($this->config['tax_included']) { $data['default_tax_type'] = Tax_lib::TAX_TYPE_INCLUDED; } else { $data['default_tax_type'] = Tax_lib::TAX_TYPE_EXCLUDED; } if($tax_code == NEW_ENTRY) { $data['tax_code'] = ''; $data['tax_code_name'] = ''; $data['tax_code_type'] = '0'; $data['city'] = ''; $data['state'] = ''; $data['tax_rate'] = '0.0000'; $data['rate_tax_code'] = ''; $data['rate_tax_category_id'] = 1; $data['tax_category'] = ''; $data['add_tax_category'] = ''; $data['rounding_code'] = '0'; } else { $data['tax_code'] = $tax_code; $data['tax_code_name'] = $tax_code_info->tax_code_name; $data['tax_code_type'] = $tax_code_info->tax_code_type; $data['city'] = $tax_code_info->city; $data['state'] = $tax_code_info->state; $data['rate_tax_code'] = $tax_code_info->rate_tax_code; $data['rate_tax_category_id'] = $tax_code_info->rate_tax_category_id; $data['tax_category'] = $tax_code_info->tax_category; $data['add_tax_category'] = ''; $data['tax_rate'] = $tax_rate_info->tax_rate; $data['rounding_code'] = $tax_rate_info->rounding_code; } $tax_rates = []; foreach($this->tax->get_tax_code_rate_exceptions($tax_code) as $tax_code_rate) //TODO: get_tax_code_rate_exceptions doesn't exist in the tax model { $tax_rate_row = []; $tax_rate_row['rate_tax_category_id'] = $tax_code_rate['rate_tax_category_id']; $tax_rate_row['tax_category'] = $tax_code_rate['tax_category']; $tax_rate_row['tax_rate'] = $tax_code_rate['tax_rate']; $tax_rate_row['rounding_code'] = $tax_code_rate['rounding_code']; $tax_rates[] = $tax_rate_row; } $data['tax_rates'] = $tax_rates; echo view('taxes/tax_jurisdiction_form', $data); } /** * @return string */ public static function get_html_rounding_options(): string { return rounding_mode::get_html_rounding_options(); } /** * @param int $tax_rate_id * @return void */ public function postSave(int $tax_rate_id = NEW_ENTRY): void { $raw_tax_rate = prepare_decimal($this->request->getPost('tax_rate')); $tax_category_id = $this->request->getPost('rate_tax_category_id', FILTER_SANITIZE_NUMBER_INT); $tax_rate = parse_tax(filter_var($raw_tax_rate, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)); if ($tax_rate == 0) //TODO: Replace 0 with constant? { $tax_category_info = $this->tax_category->get_info($tax_category_id); //TODO: this variable is not used anywhere in the code } $tax_rate_data = [ 'rate_tax_code_id' => $this->request->getPost('rate_tax_code_id', FILTER_SANITIZE_NUMBER_INT), 'rate_tax_category_id' => $this->request->getPost('rate_tax_category_id', FILTER_SANITIZE_NUMBER_INT), 'rate_jurisdiction_id' => $this->request->getPost('rate_jurisdiction_id', FILTER_SANITIZE_NUMBER_INT), 'tax_rate' => $tax_rate, 'tax_rounding_code' => $this->request->getPost('tax_rounding_code', FILTER_SANITIZE_NUMBER_INT) ]; if($this->tax->save_value($tax_rate_data, $tax_rate_id)) { if($tax_rate_id == NEW_ENTRY) {//TODO: this needs to be replaced with ternary notation echo json_encode (['success' => true, 'message' => lang('Taxes.tax_rate_successfully_added')]); } else //Existing tax_code { echo json_encode (['success' => true, 'message' => lang('Taxes.tax_rate_successful_updated')]); } } else { echo json_encode (['success' => false, 'message' => lang('Taxes.tax_rate_error_adding_updating')]); } } /** * @return void */ public function postDelete(): void { $tax_codes_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT); if($this->tax->delete_list($tax_codes_to_delete)) //TODO: this needs to be replaced with ternary notation { echo json_encode (['success' => true, 'message' => lang('Taxes.tax_code_successful_deleted')]); } else { echo json_encode (['success' => false, 'message' => lang('Taxes.tax_code_cannot_be_deleted')]); } } /** * Get search suggestions for tax codes. Used in app/Views/customers/form.php * * @return void * @noinspection PhpUnused */ public function getSuggestTaxCodes(): void { $search = $this->request->getPostGet('term'); $suggestions = $this->tax_code->get_tax_codes_search_suggestions($search); echo json_encode($suggestions); } /** * Saves Tax Codes. Used in app/Views/taxes/tax_codes.php * * @return void * @noinspection PhpUnused */ public function save_tax_codes(): void { $tax_code_id = $this->request->getPost('tax_code_id', FILTER_SANITIZE_NUMBER_INT); $tax_code = $this->request->getPost('tax_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $tax_code_name = $this->request->getPost('tax_code_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $city = $this->request->getPost('city', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $state = $this->request->getPost('state', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $array_save = []; //TODO: the naming of this variable is not good. foreach($tax_code_id as $key=>$val) { $array_save[] = [ 'tax_code_id'=>$val, 'tax_code'=>$tax_code[$key], 'tax_code_name'=>$tax_code_name[$key], 'city'=>$city[$key], 'state'=>$state[$key] ]; } $success = $this->tax_code->save_tax_codes($array_save); echo json_encode ([ 'success' => $success, 'message' => lang('Taxes.tax_codes_saved_' . ($success ? '' : 'un') . 'successfully') ]); } /** * Saves given tax jurisdiction. Used in app/Views/taxes/tax_jurisdictions.php. * * @return void * @noinspection PhpUnused */ public function save_tax_jurisdictions(): void { $jurisdiction_id = $this->request->getPost('jurisdiction_id', FILTER_SANITIZE_NUMBER_INT); $jurisdiction_name = $this->request->getPost('jurisdiction_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $tax_group = $this->request->getPost('tax_group', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $tax_type = $this->request->getPost('tax_type', FILTER_SANITIZE_NUMBER_INT); $reporting_authority = $this->request->getPost('reporting_authority', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $tax_group_sequence = $this->request->getPost('tax_group_sequence', FILTER_SANITIZE_NUMBER_INT); $cascade_sequence = $this->request->getPost('cascade_sequence', FILTER_SANITIZE_NUMBER_INT); $array_save = []; $unique_tax_groups = []; foreach($jurisdiction_id as $key => $val) { $array_save[] = [ 'jurisdiction_id'=>$val, 'jurisdiction_name'=>$jurisdiction_name[$key], 'tax_group'=>$tax_group[$key], 'tax_type'=>$tax_type[$key], 'reporting_authority'=>$reporting_authority[$key], 'tax_group_sequence'=>$tax_group_sequence[$key], 'cascade_sequence'=>$cascade_sequence[$key] ]; if (in_array($tax_group[$key], $unique_tax_groups)) //TODO: This can be replaced with `in_array($tax_group[$key], $unique_tax_groups)` { echo json_encode ([ 'success' => false, 'message' => lang('Taxes.tax_group_not_unique', [$tax_group[$key]]) ]); return; } else { $unique_tax_groups[] = $tax_group[$key]; } } $success = $this->tax_jurisdiction->save_jurisdictions($array_save); echo json_encode ([ 'success' => $success, 'message' => lang('Taxes.tax_jurisdictions_saved_' . ($success ? '' : 'un') . 'successfully') ]); } /** * Saves tax categories. Used in app/Views/taxes/tax_categories.php * * @return void * @noinspection PhpUnused */ public function save_tax_categories(): void { $tax_category_id = $this->request->getPost('tax_category_id', FILTER_SANITIZE_NUMBER_INT); $tax_category = $this->request->getPost('tax_category', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $tax_group_sequence = $this->request->getPost('tax_group_sequence', FILTER_SANITIZE_NUMBER_INT); $array_save= []; foreach($tax_category_id as $key => $val) { $array_save[] = [ 'tax_category_id'=>$val, 'tax_category'=>$tax_category[$key], 'tax_group_sequence'=>$tax_group_sequence[$key] ]; } $success = $this->tax_category->save_categories($array_save); echo json_encode ([ 'success' => $success, 'message' => lang('Taxes.tax_categories_saved_' . ($success ? '' : 'un') . 'successfully') ]); } /** * Gets tax codes partial view. Used in app/Views/taxes/tax_codes.php. * * @return void * @noinspection PhpUnused */ public function ajax_tax_codes(): void { $tax_codes = $this->tax_code->get_all()->getResultArray(); echo view('partial/tax_codes', ['tax_codes' => $tax_codes]); } /** * Gets current tax categories. Used in app/Views/taxes/tax_categories.php * * @return void * @noinspection PhpUnused */ public function ajax_tax_categories(): void { $tax_categories = $this->tax_category->get_all()->getResultArray(); echo view('partial/tax_categories', ['tax_categories' => $tax_categories]); } /** * Gets the tax jurisdiction partial view. Used in app/Views/taxes/tax_jurisdictions.php. * * @return void * @noinspection PhpUnused */ public function ajax_tax_jurisdictions(): void { $tax_jurisdictions = $this->tax_jurisdiction->get_all()->getResultArray(); if($this->config['tax_included']) //TODO: ternary notation { $default_tax_type = Tax_lib::TAX_TYPE_INCLUDED; } else { $default_tax_type = Tax_lib::TAX_TYPE_EXCLUDED; } $tax_types = $this->tax_lib->get_tax_types(); echo view('partial/tax_jurisdictions', [ 'tax_jurisdictions' => $tax_jurisdictions, 'tax_types' => $tax_types, 'default_tax_type' => $default_tax_type ]); } }