Files
opensourcepos/app/Models/Reports/Detailed_receivings.php
BudsieBuds e83c23cf0c Improve code style and PSR-12 compliance (#4204)
* Improve code style and PSR-12 compliance
- refactored code formatting to adhere to PSR-12 guidelines
- standardized coding conventions across the codebase
- added missing framework files and reverted markup changes
- reformatted arrays for enhanced readability
- updated language files for consistent styling and clarity
- minor miscellaneous improvements
2025-05-02 19:37:06 +02:00

182 lines
7.0 KiB
PHP

<?php
namespace App\Models\Reports;
use App\Models\Receiving;
/**
*
*
* @property receiving receiving
*
*/
class Detailed_receivings extends Report
{
/**
* @param array $inputs
* @return void
*/
public function create(array $inputs): void
{
// Create our temp tables to work with the data in our report
$receiving = model(Receiving::class);
$receiving->create_temp_table($inputs);
}
/**
* @return array
*/
public function getDataColumns(): array
{
return [
'summary' => [
['id' => lang('Reports.receiving_id')],
['receiving_time' => lang('Reports.date'), 'sortable' => false],
['quantity' => lang('Reports.quantity')],
['employee_name' => lang('Reports.received_by')],
['supplier_name' => lang('Reports.supplied_by')],
['total' => lang('Reports.total'), 'sorter' => 'number_sorter'],
['payment_type' => lang('Reports.payment_type')],
['comment' => lang('Reports.comments')],
['reference' => lang('Receivings.reference')]
],
'details' => [
lang('Reports.item_number'),
lang('Reports.name'),
lang('Reports.category'),
lang('Reports.quantity'),
lang('Reports.total'),
lang('Reports.discount')
]
];
}
/**
* @param string $receiving_id
* @return array
*/
public function getDataByReceivingId(string $receiving_id): array
{
$builder = $this->db->table('receivings_items_temp');
$builder->select('receiving_id,
MAX(receiving_time) as receiving_time,
SUM(quantity_purchased) AS items_purchased,
MAX(CONCAT(employee.first_name, " ", employee.last_name)) AS employee_name,
MAX(supplier.company_name) AS supplier_name,
SUM(subtotal) AS subtotal,
SUM(total) AS total,
SUM(profit) AS profit,
MAX(payment_type) as payment_type,
MAX(comment) as comment,
MAX(reference) as reference');
$builder->join('people AS employee', 'receivings_items_temp.employee_id = employee.person_id');
$builder->join('suppliers AS supplier', 'receivings_items_temp.supplier_id = supplier.person_id', 'left');
$builder->where('receiving_id', $receiving_id);
$builder->groupBy('receiving_id');
return $builder->get()->getRowArray();
}
/**
* @param array $inputs
* @return array
*/
public function getData(array $inputs): array
{
$builder = $this->db->table('receivings_items_temp AS receivings_items_temp');
$builder->select('receiving_id,
MAX(receiving_time) as receiving_time,
SUM(quantity_purchased) AS items_purchased,
MAX(CONCAT(employee.first_name," ",employee.last_name)) AS employee_name,
MAX(supplier.company_name) AS supplier_name,
SUM(total) AS total,
SUM(profit) AS profit,
MAX(payment_type) AS payment_type,
MAX(comment) AS comment,
MAX(reference) AS reference');
$builder->join('people AS employee', 'receivings_items_temp.employee_id = employee.person_id');
$builder->join('suppliers AS supplier', 'receivings_items_temp.supplier_id = supplier.person_id', 'left');
if ($inputs['location_id'] != 'all') {
$builder->where('item_location', $inputs['location_id']);
}
if ($inputs['receiving_type'] == 'receiving') { // TODO: These if statements should be replaced with a switch statement
$builder->where('quantity_purchased >', 0);
} elseif ($inputs['receiving_type'] == 'returns') {
$builder->where('quantity_purchased <', 0);
} elseif ($inputs['receiving_type'] == 'requisitions') {
$builder->having('items_purchased = 0');
}
$builder->groupBy('receiving_id', 'receiving_time');
$builder->orderBy('MAX(receiving_id)');
$data = [];
$data['summary'] = $builder->get()->getResultArray();
$data['details'] = [];
$builder = $this->db->table('receivings_items_temp');
foreach ($data['summary'] as $key => $value) {
$builder->select('
MAX(name) AS name,
MAX(item_number) AS item_number,
MAX(category) AS category,
MAX(quantity_purchased) AS quantity_purchased,
MAX(serialnumber) AS serialnumber,
MAX(total) AS total,
MAX(discount) AS discount,
MAX(discount_type) AS discount_type,
MAX(item_location) AS item_location,
MAX(item_receiving_quantity) AS receiving_quantity');
$builder->join('items', 'receivings_items_temp.item_id = items.item_id');
if (count($inputs['definition_ids']) > 0) {
$format = $this->db->escape(dateformat_mysql());
$builder->select('GROUP_CONCAT(DISTINCT CONCAT_WS(\'_\', definition_id, attribute_value) ORDER BY definition_id SEPARATOR \'|\') AS attribute_values');
$builder->select("GROUP_CONCAT(DISTINCT CONCAT_WS('_', definition_id, DATE_FORMAT(attribute_date, $format)) SEPARATOR '|') AS attribute_dtvalues");
$builder->select('GROUP_CONCAT(DISTINCT CONCAT_WS(\'_\', definition_id, attribute_decimal) SEPARATOR \'|\') AS attribute_dvalues');
$builder->join('attribute_links', 'attribute_links.item_id = items.item_id AND attribute_links.receiving_id = receivings_items_temp.receiving_id AND definition_id IN (' . implode(',', $inputs['definition_ids']) . ')', 'left');
$builder->join('attribute_values', 'attribute_values.attribute_id = attribute_links.attribute_id', 'left');
}
$builder->where('receivings_items_temp.receiving_id', $value['receiving_id']);
$builder->groupBy('receivings_items_temp.receiving_id, receivings_items_temp.item_id');
$data['details'][$key] = $builder->get()->getResultArray();
}
return $data;
}
/**
* @param array $inputs
* @return array
*/
public function getSummaryData(array $inputs): array
{
$builder = $this->db->table('receivings_items_temp');
$builder->select('SUM(total) AS total');
if ($inputs['location_id'] != 'all') {
$builder->where('item_location', $inputs['location_id']);
}
switch ($inputs['receiving_type']) {
case 'receiving':
$builder->where('quantity_purchased >', 0);
break;
case 'returns':
$builder->where('quantity_purchased <', 0);
break;
case 'requisitions':
$builder->where('quantity_purchased', 0);
break;
}
return $builder->get()->getRowArray();
}
}