wavelog/application/controllers/Labels.php

492 lines
18 KiB
PHP
Raw Normal View History

<?php
2023-06-02 18:50:27 +02:00
2023-07-28 06:04:16 +00:00
require_once './src/Label/vendor/autoload.php';
use Wavelog\Label\PDF_Label;
use Wavelog\Label\tfpdf;
use Wavelog\Label\font\unifont\ttfonts;
2023-06-02 18:50:27 +02:00
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Labels extends CI_Controller {
/*
2023-06-02 18:50:27 +02:00
|--------------------------------------------------------------------------
| Controller: Labels
|--------------------------------------------------------------------------
|
2023-06-02 18:50:27 +02:00
| This Controller handles all things Labels, creating, editing and printing
|
|
*/
2023-06-02 18:50:27 +02:00
function __construct() {
parent::__construct();
$this->load->helper(array('form', 'url', 'psr4_autoloader'));
$this->load->model('user_model');
if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }
}
/*
|--------------------------------------------------------------------------
| Function: index
|--------------------------------------------------------------------------
|
| Nothing fancy just shows the main display of how many labels are waiting
2023-06-02 18:50:27 +02:00
| to be printed per station profile.
|
*/
2023-06-02 18:50:27 +02:00
public function index() {
2024-06-08 11:01:59 +02:00
$data['page_title'] = __("QSL Card Labels");
2023-06-02 18:50:27 +02:00
$this->load->model('labels_model');
$data['labels'] = $this->labels_model->fetchLabels($this->session->userdata('user_id'));
2023-08-02 10:05:24 +02:00
$data['papertypes'] = $this->labels_model->fetchPapertypes($this->session->userdata('user_id'));
2023-06-02 18:50:27 +02:00
$data['qsos'] = $this->labels_model->fetchQsos($this->session->userdata('user_id'));
$footerData = [];
$footerData['scripts'] = [
'assets/js/sections/labels.js',
];
$this->load->view('interface_assets/header', $data);
$this->load->view('labels/index');
$this->load->view('interface_assets/footer', $footerData);
2023-06-02 18:50:27 +02:00
}
/*
|--------------------------------------------------------------------------
| Function: create
|--------------------------------------------------------------------------
|
2023-06-02 18:50:27 +02:00
| Shows the form used to create a label type.
|
*/
2023-06-02 18:50:27 +02:00
public function create() {
2024-06-08 11:01:59 +02:00
$data['page_title'] = __("Create Label Type");
2023-06-02 18:50:27 +02:00
$this->load->library('form_validation');
$this->load->model('labels_model');
$data['papertypes'] = $this->labels_model->fetchPapertypes($this->session->userdata('user_id'));
2023-06-02 18:50:27 +02:00
$this->form_validation->set_rules('label_name', 'Label Name', 'required');
2024-02-12 06:41:25 +00:00
$this->form_validation->set_rules('paper_type_id', 'Paper Type', 'required');
$this->form_validation->set_rules('measurementType', 'Measurement', 'required');
$this->form_validation->set_rules('marginTop', 'Top Margin', 'required');
$this->form_validation->set_rules('marginLeft', 'Left Margin', 'required');
$this->form_validation->set_rules('NX', 'QSLs Horizontally', 'required');
$this->form_validation->set_rules('NY', 'QSLs Vertically', 'required');
$this->form_validation->set_rules('SpaceX', 'Horizontal Space', 'required');
$this->form_validation->set_rules('SpaceY', 'Vertical Space', 'required');
$this->form_validation->set_rules('width', 'Label width', 'required');
$this->form_validation->set_rules('height', 'Label height', 'required');
$this->form_validation->set_rules('font_size', 'Size of Font', 'required');
$this->form_validation->set_rules('label_qsos', 'Number of QSOs on label', 'required');
if ($this->form_validation->run() == FALSE) {
2023-06-02 18:50:27 +02:00
$this->load->view('interface_assets/header', $data);
$this->load->view('labels/create');
$this->load->view('interface_assets/footer');
2024-02-12 06:41:25 +00:00
} else {
2023-06-02 18:50:27 +02:00
$this->load->model('labels_model');
$this->labels_model->addLabel();
2023-06-02 18:50:27 +02:00
redirect('labels');
}
2023-06-02 18:50:27 +02:00
}
2023-08-01 18:59:05 +02:00
/*
|--------------------------------------------------------------------------
| Function: createpaper
|--------------------------------------------------------------------------
|
| Shows the form used to create a paper type.
|
*/
public function createpaper() {
2024-06-08 11:01:59 +02:00
$data['page_title'] = __("Create Paper Type");
2023-08-01 18:59:05 +02:00
$this->load->library('form_validation');
$this->form_validation->set_rules('paper_name', 'Paper Name', 'required');
2024-02-12 06:41:25 +00:00
$this->form_validation->set_rules('width', 'Paper Width', 'required');
$this->form_validation->set_rules('height', 'Paper Height', 'required');
2023-08-01 18:59:05 +02:00
2024-02-12 06:41:25 +00:00
if ($this->form_validation->run() == FALSE) {
2023-08-01 18:59:05 +02:00
$this->load->view('interface_assets/header', $data);
$this->load->view('labels/createpaper');
$this->load->view('interface_assets/footer');
2024-02-12 06:41:25 +00:00
} else {
2023-08-01 18:59:05 +02:00
$this->load->model('labels_model');
try {
$this->labels_model->addPaper();
} catch (\Throwable $th) {
$this->session->set_flashdata('error', 'Your paper could not be saved. Remember that it can\'t have the same name as existing paper types.');
redirect('labels/createpaper');
}
2023-08-01 18:59:05 +02:00
redirect('labels');
}
}
public function printids() {
$ids = xss_clean(json_decode($this->input->post('id')));
$offset = xss_clean($this->input->post('startat'));
$grid = $this->input->post('grid') === "true" ? 1 : 0;
2023-10-26 09:10:38 +00:00
$via = $this->input->post('via') === "true" ? 1 : 0;
2024-03-17 23:13:35 +01:00
$reference = $this->input->post('reference') == "true" ? 1 : 0;
$this->load->model('labels_model');
$result = $this->labels_model->export_printrequestedids($ids);
2024-03-17 23:13:35 +01:00
$this->prepareLabel($result, true, $offset, $grid, $via, $reference);
}
2023-06-02 18:50:27 +02:00
public function print($station_id) {
$clean_id = xss_clean($station_id);
$offset = xss_clean($this->input->post('startat'));
$grid = xss_clean($this->input->post('grid') ?? 0);
2023-10-26 09:10:38 +00:00
$via = xss_clean($this->input->post('via') ?? 0);
2024-03-17 23:13:35 +01:00
$reference = xss_clean($this->input->post('reference') ?? 0);
$this->load->model('stations');
if ($this->stations->check_station_is_accessible($station_id)) {
$this->load->model('labels_model');
$result = $this->labels_model->export_printrequested($clean_id);
2023-06-14 16:28:12 +02:00
2024-03-17 23:13:35 +01:00
$this->prepareLabel($result, false, $offset, $grid, $via, $reference);
} else {
redirect('labels');
}
}
2024-03-17 23:13:35 +01:00
function prepareLabel($qsos, $jscall = false, $offset = 1, $grid = false, $via = false, $reference = false) {
$this->load->model('labels_model');
2023-06-02 18:50:27 +02:00
$label = $this->labels_model->getDefaultLabel();
2023-06-03 18:22:11 +02:00
try {
if ($label) {
2023-08-03 11:34:29 +00:00
$label->font='DejaVuSans'; // Fix font to DejaVuSans
2023-08-03 04:37:25 +00:00
$ptype=$this->labels_model->getPaperType($label->paper_type_id); // fetch papersize out of paper-table
if (($ptype->paper_id ?? '') != '') {
if ($ptype->metric == 'in') { // convert papersize to mm if given in inch
$paper_width=$ptype->width*25.4;
$paper_height=$ptype->height*25.4;
} else {
$paper_width=$ptype->width;
$paper_height=$ptype->height;
}
$pdf = new PDF_Label(array(
'paper-size' => 'custom', // $label->paper_type, // The only Type left is "custom" because A4 and so on are also defined at paper_types
'metric' => $label->metric,
'marginLeft' => $label->marginleft,
'marginTop' => $label->margintop,
'NX' => $label->nx,
'NY' => $label->ny,
'SpaceX' => $label->spacex,
'SpaceY' => $label->spacey,
'width' => $label->width,
'height' => $label->height,
'font-size' => $label->font_size,
'pgX' => $paper_width,
'pgY' => $paper_height
));
} else {
if ($jscall) {
header('Content-Type: application/json');
echo json_encode(array('message' => 'You need to assign a paperType to the label before printing'));
return;
} else {
$this->session->set_flashdata('error', 'You need to assign a paperType to the label before printing');
redirect('labels');
}
}
2023-06-03 18:22:11 +02:00
} else {
if ($jscall) {
header('Content-Type: application/json');
echo json_encode(array('message' => 'You need to create a label and set it to be used for print.'));
return;
} else {
$this->session->set_flashdata('error', 'You need to create a label and set it to be used for print.');
redirect('labels');
}
2023-06-03 18:22:11 +02:00
}
} catch (\Throwable $th) {
if ($jscall) {
header('Content-Type: application/json');
echo json_encode(array('message' => 'Something went wrong! The label could not be generated. Check label size and font size.'));
return;
} else {
$this->session->set_flashdata('error', 'Something went wrong! The label could not be generated. Check label size and font size.');
redirect('labels');
}
2023-06-02 18:50:27 +02:00
}
define('FPDF_FONTPATH', './src/Label/font/');
2023-08-02 10:20:38 +00:00
$pdf->AddPage($ptype->orientation);
if ($label->font == 'DejaVuSans') { // leave this here, for future Use
$pdf->AddFont($label->font,'','DejaVuSansMono.ttf',true);
$pdf->SetFont($label->font,'');
} else {
$pdf->AddFont($label->font);
$pdf->SetFont($label->font);
}
if ($qsos->num_rows() > 0) {
2023-06-06 17:36:30 +02:00
if ($label->qsos == 1) {
2024-03-17 23:13:35 +01:00
$this->makeMultiQsoLabel($qsos->result(), $pdf, 1, $offset, $ptype->orientation, $grid, $via, $reference);
} else {
2024-03-17 23:13:35 +01:00
$this->makeMultiQsoLabel($qsos->result(), $pdf, $label->qsos, $offset, $ptype->orientation, $grid, $via, $reference);
2023-06-02 18:50:27 +02:00
}
} else {
$this->session->set_flashdata('message', '0 QSOs found for print!');
redirect('labels');
2023-06-02 18:50:27 +02:00
}
$pdf->Output();
}
2024-03-17 23:13:35 +01:00
function makeMultiQsoLabel($qsos, $pdf, $numberofqsos, $offset, $orientation, $grid, $via, $reference) {
$text = '';
$current_callsign = '';
2023-07-28 08:28:17 +00:00
$current_sat = '';
2023-07-30 06:08:01 +00:00
$current_sat_mode = '';
$current_sat_bandrx = '';
$qso_data = [];
2023-07-30 05:46:25 +00:00
if ($offset !== 1) {
for ($i = 1; $i < $offset; $i++) {
2023-08-02 10:20:38 +00:00
$pdf->Add_Label('',$orientation);
2023-07-30 05:46:25 +00:00
}
}
foreach($qsos as $qso) {
2023-07-30 06:50:08 +00:00
if (($this->pretty_sat_mode($qso->COL_SAT_MODE) !== $current_sat_mode) || ($qso->COL_SAT_NAME !== $current_sat) || ($qso->COL_CALL !== $current_callsign) || // Call, SAT or SAT-Mode differs?
( ($qso->COL_BAND_RX !== $current_sat_bandrx) && ($this->pretty_sat_mode($qso->COL_SAT_MODE) !== '')) ) {
// ((($qso->COL_SAT_NAME ?? '' !== $current_sat) || ($qso->COL_CALL !== $current_callsign)) && ($qso->COL_SAT_NAME ?? '' !== '') && ($col->COL_BAND_RX ?? '' !== $current_sat_bandrx))) {
if (!empty($qso_data)) {
2024-03-17 23:13:35 +01:00
$this->finalizeData($pdf, $current_callsign, $qso_data, $numberofqsos, $orientation, $grid, $via, $reference);
$qso_data = [];
}
$current_callsign = $qso->COL_CALL;
2023-07-28 08:28:17 +00:00
$current_sat = $qso->COL_SAT_NAME;
2023-07-30 06:50:08 +00:00
$current_sat_mode = $this->pretty_sat_mode($qso->COL_SAT_MODE);
$current_sat_bandrx = $qso->COL_BAND_RX ?? '';
}
$qso_data[] = [
'time' => $qso->COL_TIME_ON,
'band' => $qso->COL_BAND,
2024-03-11 14:15:03 +00:00
'mode' => (($qso->COL_SUBMODE ?? '') == '') ? $qso->COL_MODE : $qso->COL_SUBMODE,
'rst' => $qso->COL_RST_SENT,
'mygrid' => $qso->station_gridsquare,
2023-10-26 09:10:38 +00:00
'via' => $qso->COL_QSL_VIA,
'sat' => $qso->COL_SAT_NAME,
2023-07-30 06:50:08 +00:00
'sat_mode' => $this->pretty_sat_mode($qso->COL_SAT_MODE ?? ''),
2023-07-30 06:08:01 +00:00
'sat_band_rx' => ($qso->COL_BAND_RX ?? ''),
'qsl_recvd' => $qso->COL_QSL_RCVD,
2024-03-17 23:13:35 +01:00
'mycall' => $qso->COL_STATION_CALLSIGN,
'sig' => $qso->station_sig ?? '',
'sig_info' => $qso->station_sig_info ?? '',
'sota' => $qso->station_sota ?? '',
'iota' => $qso->station_iota ?? '',
'pota' => $qso->station_pota ?? '',
'wwff' => $qso->station_wwff ?? ''
];
}
if (!empty($qso_data)) {
2024-03-17 23:13:35 +01:00
$this->finalizeData($pdf, $current_callsign, $qso_data, $numberofqsos, $orientation, $grid, $via, $reference);
}
}
// New begin
2023-07-30 06:50:08 +00:00
function pretty_sat_mode($sat_mode) {
2023-07-30 09:59:38 +02:00
return(strlen($sat_mode ?? '') == 2 ? (strtoupper($sat_mode[0]).'/'.strtoupper($sat_mode[1])) : strtoupper($sat_mode ?? ''));
2023-07-30 06:50:08 +00:00
}
2023-07-28 06:04:16 +00:00
2024-03-17 23:13:35 +01:00
function finalizeData($pdf, $current_callsign, &$preliminaryData, $qso_per_label,$orientation, $grid, $via, $reference) {
2023-07-28 06:36:57 +00:00
$tableData = [];
$count_qso = 0;
$qso=[];
foreach ($preliminaryData as $key => $row) {
$qso=$row;
2023-07-28 10:13:15 +00:00
$time = strtotime($qso['time']);
$myFormatForView = date("d.m.y H:i", $time);
2023-07-28 06:36:57 +00:00
$rowData = [
'DD.MM.YY UTC' => $myFormatForView,
2023-07-28 06:36:57 +00:00
'Band' => $row['band'],
'Mode' => $row['mode'],
'RST' => $row['rst'],
];
$tableData[] = $rowData;
$count_qso++;
2023-07-30 05:46:25 +00:00
2023-07-28 06:36:57 +00:00
if($count_qso == $qso_per_label){
2024-03-17 23:13:35 +01:00
$this->generateLabel($pdf, $current_callsign, $tableData,$count_qso,$qso,$orientation, $grid, $via, $reference);
2023-07-28 06:36:57 +00:00
$tableData = []; // reset the data
$count_qso = 0; // reset the counter
}
unset($preliminaryData[$key]);
}
// generate label for remaining QSOs
if($count_qso > 0){
2024-03-17 23:13:35 +01:00
$this->generateLabel($pdf, $current_callsign, $tableData,$count_qso,$qso,$orientation, $grid, $via, $reference);
2023-07-28 06:36:57 +00:00
$preliminaryData = []; // reset the data
}
}
2023-07-28 06:04:16 +00:00
2024-03-17 23:13:35 +01:00
function generateLabel($pdf, $current_callsign, $tableData,$numofqsos,$qso,$orientation,$grid=true, $via=false, $reference = false){
$builder = new \AsciiTable\Builder();
$builder->addRows($tableData);
$text = "Confirming QSO".($numofqsos>1 ? 's' : '')." with ";
2023-10-26 09:10:38 +00:00
$text .= $current_callsign;
if (($via) && ($qso['via'] ?? '' != '')) {
$text.=' via '.substr($qso['via'],0,8);
2023-10-26 09:10:38 +00:00
}
$text .= "\n";
$text .= $builder->renderTable();
if($qso['sat'] != "") {
2023-07-30 06:08:01 +00:00
if (($qso['sat_mode'] == '') && ($qso['sat_band_rx'] !== '')) {
$text .= "\n".'Satellite: '.$qso['sat'].' Band RX: '.$qso['sat_band_rx'];
} elseif (($qso['sat_mode'] == '') && ($qso['sat_band_rx'] == '')) {
$text .= "\n".'Satellite: '.$qso['sat'];
} else {
2023-07-30 06:50:08 +00:00
$text .= "\n".'Satellite: '.$qso['sat'].' Mode: '.$qso['sat_mode'];
2023-07-30 06:08:01 +00:00
}
}
$text.="\n";
if ($grid) { $text .= "My call: ".$qso['mycall']." Grid: ".$qso['mygrid']."\n"; }
2024-03-17 23:13:35 +01:00
if ($reference) {
$ref_text = "";
2024-03-17 23:25:23 +01:00
$ref_avail = false;
if (!empty($qso['sig']) && !empty($qso['sig_info'])) { $ref_text .= $qso['sig'].":".$qso['sig_info']." "; $ref_avail = true;}
if (!empty($qso['sota'])) { $ref_text .= "SOTA:".$qso['sota']." "; $ref_avail = true;}
if (!empty($qso['iota'])) { $ref_text .= "IOTA:".$qso['iota']." "; $ref_avail = true;}
if (!empty($qso['pota'])) { $ref_text .= "POTA:".$qso['pota']." "; $ref_avail = true;}
if (!empty($qso['wwff'])) { $ref_text .= "WWFF:".$qso['wwff']; $ref_avail = true;}
if ($ref_avail == true) {$text .= $ref_text."\n";}
2024-03-17 23:13:35 +01:00
}
$text .= "Thanks for the QSO".($numofqsos>1 ? 's' : '');
2023-07-28 09:31:39 +00:00
$text .= " | ".($qso['qsl_recvd'] == 'Y' ? 'TNX' : 'PSE')." QSL";
2024-03-17 23:13:35 +01:00
$pdf->Add_Label($text,$orientation); }
2023-06-02 18:50:27 +02:00
// New End
2023-06-03 08:46:52 +02:00
public function edit($id) {
$this->load->model('labels_model');
$cleanid = $this->security->xss_clean($id);
$data['label'] = $this->labels_model->getLabel($cleanid,$this->session->userdata('user_id'));
2023-06-02 18:50:27 +02:00
$data['papertypes'] = $this->labels_model->fetchPapertypes($this->session->userdata('user_id'));
2024-06-08 11:01:59 +02:00
$data['page_title'] = __("Edit Label");
2023-06-03 08:46:52 +02:00
$this->load->view('interface_assets/header', $data);
$this->load->view('labels/edit');
$this->load->view('interface_assets/footer');
}
public function updateLabel($id) {
$this->load->model('labels_model');
2024-02-12 06:41:25 +00:00
$this->load->library('form_validation');
$this->form_validation->set_rules('label_name', 'Label Name', 'required');
$this->form_validation->set_rules('paper_type_id', 'Paper Type', 'required');
$this->form_validation->set_rules('measurementType', 'Measurement', 'required');
$this->form_validation->set_rules('marginTop', 'Top Margin', 'required');
$this->form_validation->set_rules('marginLeft', 'Left Margin', 'required');
$this->form_validation->set_rules('NX', 'QSLs Horizontally', 'required');
$this->form_validation->set_rules('NY', 'QSLs Vertically', 'required');
$this->form_validation->set_rules('SpaceX', 'Horizontal Space', 'required');
$this->form_validation->set_rules('SpaceY', 'Vertical Space', 'required');
$this->form_validation->set_rules('width', 'Label width', 'required');
$this->form_validation->set_rules('height', 'Label height', 'required');
$this->form_validation->set_rules('font_size', 'Size of Font', 'required');
$this->form_validation->set_rules('label_qsos', 'Number of QSOs on label', 'required');
if ($this->form_validation->run() == FALSE) {
$this->edit($id);
} else {
$this->labels_model->updateLabel($id);
$this->session->set_flashdata('message', 'Label was saved.');
redirect('labels');
}
2023-06-02 18:50:27 +02:00
}
public function delete($id) {
$this->load->model('labels_model');
$this->labels_model->deleteLabel($id);
$this->session->set_flashdata('warning', 'Label was deleted.');
2023-06-02 18:50:27 +02:00
redirect('labels');
}
public function saveDefaultLabel() {
$id = $this->input->post('id');
$this->load->model('labels_model');
$this->labels_model->saveDefaultLabel($id);
}
public function startAtLabel() {
$data['stationid'] = xss_clean($this->input->post('stationid'));
$this->load->view('labels/startatform', $data);
}
2023-08-02 10:05:24 +02:00
public function editPaper($id) {
$this->load->model('labels_model');
$cleanid = $this->security->xss_clean($id);
$data['paper'] = $this->labels_model->getPaper($cleanid);
2024-06-08 11:01:59 +02:00
$data['page_title'] = __("Edit Paper");
2023-08-02 10:05:24 +02:00
$this->load->view('interface_assets/header', $data);
$this->load->view('labels/editpaper');
$this->load->view('interface_assets/footer');
}
public function updatePaper($id) {
$this->load->model('labels_model');
2024-02-12 06:41:25 +00:00
$this->load->library('form_validation');
$this->form_validation->set_rules('paper_name', 'Paper Name', 'required');
$this->form_validation->set_rules('width', 'Paper Width', 'required');
$this->form_validation->set_rules('height', 'Paper Height', 'required');
if ($this->form_validation->run() == FALSE) {
$this->editPaper($id);
} else {
try {
$this->labels_model->updatePaper($id);
} catch (\Throwable $th) {
$this->session->set_flashdata('error', 'Your paper could not be saved. Remember that it can\'t have the same name as existing paper types.');
$cleanid = $this->security->xss_clean($id);
redirect('labels/editpaper/'.$cleanid);
}
$this->session->set_flashdata('message', 'Paper was saved.');
redirect('labels');
}
2023-08-02 10:05:24 +02:00
}
function label_cnt_with_paper($paper_id) {
$this->load->model('labels_model');
return $this->labels_model->label_cnt_with_paper($paper_id);
}
2023-08-02 10:05:24 +02:00
public function deletePaper($id) {
$this->load->model('labels_model');
$this->labels_model->deletePaper($id);
$this->session->set_flashdata('warning', 'Paper was deleted.');
redirect('labels');
}
2023-07-28 06:04:16 +00:00
}