2023-07-29 18:02:18 +00:00
< ? php
2023-06-02 16:50:27 +00:00
2023-07-28 06:04:16 +00:00
require_once './src/Label/vendor/autoload.php' ;
2023-06-02 16:50:27 +00:00
use Cloudlog\Label\PDF_Label ;
2023-06-12 06:20:24 +00:00
use Cloudlog\Label\tfpdf ;
use Cloudlog\Label\font\unifont\ttfonts ;
2023-06-02 16:50:27 +00:00
if ( ! defined ( 'BASEPATH' )) exit ( 'No direct script access allowed' );
class Labels extends CI_Controller {
2023-07-28 07:51:52 +00:00
/*
2023-06-02 16:50:27 +00:00
|--------------------------------------------------------------------------
| Controller : Labels
|--------------------------------------------------------------------------
2023-07-29 18:02:18 +00:00
|
2023-06-02 16:50:27 +00:00
| This Controller handles all things Labels , creating , editing and printing
|
|
2023-07-28 07:51:52 +00:00
*/
2023-06-02 16:50:27 +00: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
|--------------------------------------------------------------------------
2023-07-29 18:02:18 +00:00
|
| Nothing fancy just shows the main display of how many labels are waiting
2023-06-02 16:50:27 +00:00
| to be printed per station profile .
|
2023-07-28 07:51:52 +00:00
*/
2023-06-02 16:50:27 +00:00
public function index () {
$data [ 'page_title' ] = " QSL Card Labels " ;
$this -> load -> model ( 'labels_model' );
$data [ 'labels' ] = $this -> labels_model -> fetchLabels ( $this -> session -> userdata ( 'user_id' ));
2023-08-02 08:05:24 +00:00
$data [ 'papertypes' ] = $this -> labels_model -> fetchPapertypes ( $this -> session -> userdata ( 'user_id' ));
2023-06-02 16:50:27 +00: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-07-28 07:51:52 +00:00
2023-06-02 16:50:27 +00:00
}
/*
|--------------------------------------------------------------------------
| Function : create
|--------------------------------------------------------------------------
2023-07-29 18:02:18 +00:00
|
2023-06-02 16:50:27 +00:00
| Shows the form used to create a label type .
|
2023-07-28 07:51:52 +00:00
*/
2023-06-02 16:50:27 +00:00
public function create () {
2023-07-28 07:51:52 +00:00
2023-06-02 16:50:27 +00:00
$data [ 'page_title' ] = " Create Label Type " ;
$this -> load -> library ( 'form_validation' );
2023-08-02 08:34:19 +00:00
$this -> load -> model ( 'labels_model' );
$data [ 'papertypes' ] = $this -> labels_model -> fetchPapertypes ( $this -> session -> userdata ( 'user_id' ));
2023-06-02 16:50:27 +00:00
$this -> form_validation -> set_rules ( 'label_name' , 'Label Name' , 'required' );
if ( $this -> form_validation -> run () == FALSE )
{
$this -> load -> view ( 'interface_assets/header' , $data );
$this -> load -> view ( 'labels/create' );
$this -> load -> view ( 'interface_assets/footer' );
}
else
2023-07-29 18:02:18 +00:00
{
2023-06-02 16:50:27 +00:00
$this -> load -> model ( 'labels_model' );
$this -> labels_model -> addLabel ();
2023-07-28 07:51:52 +00:00
2023-06-02 16:50:27 +00:00
redirect ( 'labels' );
}
2023-07-28 07:51:52 +00:00
2023-06-02 16:50:27 +00:00
}
2023-08-01 16:59:05 +00:00
/*
|--------------------------------------------------------------------------
| Function : createpaper
|--------------------------------------------------------------------------
|
| Shows the form used to create a paper type .
|
*/
public function createpaper () {
$data [ 'page_title' ] = " Create Paper Type " ;
$this -> load -> library ( 'form_validation' );
$this -> form_validation -> set_rules ( 'paper_name' , 'Paper Name' , 'required' );
if ( $this -> form_validation -> run () == FALSE )
{
$this -> load -> view ( 'interface_assets/header' , $data );
$this -> load -> view ( 'labels/createpaper' );
$this -> load -> view ( 'interface_assets/footer' );
}
else
{
$this -> load -> model ( 'labels_model' );
2023-08-02 17:10:35 +00:00
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 16:59:05 +00:00
redirect ( 'labels' );
}
}
2023-06-27 13:03:12 +00:00
public function printids () {
$ids = xss_clean ( json_decode ( $this -> input -> post ( 'id' )));
2023-08-01 08:30:05 +00:00
$offset = xss_clean ( $this -> input -> post ( 'startat' ));
2023-08-05 09:42:39 +00:00
$grid = $this -> input -> post ( 'grid' ) === " true " ? 1 : 0 ;
2023-10-26 09:10:38 +00:00
$via = $this -> input -> post ( 'via' ) === " true " ? 1 : 0 ;
2023-06-27 13:03:12 +00:00
$this -> load -> model ( 'labels_model' );
$result = $this -> labels_model -> export_printrequestedids ( $ids );
2023-10-26 09:10:38 +00:00
$this -> prepareLabel ( $result , true , $offset , $grid , $via );
2023-06-27 13:03:12 +00:00
}
2023-06-02 16:50:27 +00:00
public function print ( $station_id ) {
$clean_id = xss_clean ( $station_id );
2023-07-29 18:49:45 +00:00
$offset = xss_clean ( $this -> input -> post ( 'startat' ));
2023-08-05 05:49:12 +00:00
$grid = xss_clean ( $this -> input -> post ( 'grid' ) ? ? 0 );
2023-10-26 09:10:38 +00:00
$via = xss_clean ( $this -> input -> post ( 'via' ) ? ? 0 );
2023-07-30 17:25:52 +00:00
$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 14:28:12 +00:00
2023-10-26 09:10:38 +00:00
$this -> prepareLabel ( $result , false , $offset , $grid , $via );
2023-07-30 17:25:52 +00:00
} else {
redirect ( 'labels' );
}
2023-06-27 13:03:12 +00:00
}
2023-07-28 07:51:52 +00:00
2023-10-26 09:10:38 +00:00
function prepareLabel ( $qsos , $jscall = false , $offset = 1 , $grid = false , $via = false ) {
2023-06-27 13:03:12 +00:00
$this -> load -> model ( 'labels_model' );
2023-06-02 16:50:27 +00:00
$label = $this -> labels_model -> getDefaultLabel ();
2023-07-28 07:51:52 +00:00
2023-06-03 16:22:11 +00: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
2023-08-03 08:55:16 +00:00
if (( $ptype -> paper_id ? ? '' ) != '' ) {
2023-08-04 04:45:10 +00:00
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 ;
}
2023-08-03 08:55:16 +00:00
$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 ,
2023-08-04 04:45:10 +00:00
'pgX' => $paper_width ,
'pgY' => $paper_height
2023-08-03 08:55:16 +00:00
));
} 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 16:22:11 +00:00
} else {
2023-06-28 10:24:38 +00:00
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 {
2023-07-29 18:02:18 +00:00
$this -> session -> set_flashdata ( 'error' , 'You need to create a label and set it to be used for print.' );
2023-06-28 10:24:38 +00:00
redirect ( 'labels' );
}
2023-06-03 16:22:11 +00:00
}
} catch ( \Throwable $th ) {
2023-06-28 10:24:38 +00:00
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 {
2023-07-29 18:02:18 +00:00
$this -> session -> set_flashdata ( 'error' , 'Something went wrong! The label could not be generated. Check label size and font size.' );
2023-06-28 10:24:38 +00:00
redirect ( 'labels' );
}
2023-06-02 16:50:27 +00:00
}
2023-06-12 06:20:24 +00:00
define ( 'FPDF_FONTPATH' , './src/Label/font/' );
2023-07-28 07:51:52 +00:00
2023-08-02 10:20:38 +00:00
$pdf -> AddPage ( $ptype -> orientation );
2023-07-28 07:51:52 +00:00
if ( $label -> font == 'DejaVuSans' ) { // leave this here, for future Use
2023-06-12 06:20:24 +00:00
$pdf -> AddFont ( $label -> font , '' , 'DejaVuSansMono.ttf' , true );
2023-08-03 08:55:16 +00:00
$pdf -> SetFont ( $label -> font , '' );
2023-06-12 06:20:24 +00:00
} else {
$pdf -> AddFont ( $label -> font );
$pdf -> SetFont ( $label -> font );
}
2023-07-28 07:51:52 +00:00
2023-06-27 13:03:12 +00:00
if ( $qsos -> num_rows () > 0 ) {
2023-06-06 15:36:30 +00:00
if ( $label -> qsos == 1 ) {
2023-10-26 09:10:38 +00:00
$this -> makeMultiQsoLabel ( $qsos -> result (), $pdf , 1 , $offset , $ptype -> orientation , $grid , $via );
2023-06-05 14:53:06 +00:00
} else {
2023-10-26 09:10:38 +00:00
$this -> makeMultiQsoLabel ( $qsos -> result (), $pdf , $label -> qsos , $offset , $ptype -> orientation , $grid , $via );
2023-06-02 16:50:27 +00:00
}
} else {
2023-07-29 18:02:18 +00:00
$this -> session -> set_flashdata ( 'message' , '0 QSOs found for print!' );
2023-06-05 14:53:06 +00:00
redirect ( 'labels' );
2023-06-02 16:50:27 +00:00
}
$pdf -> Output ();
2023-06-05 14:53:06 +00:00
}
2023-10-26 09:10:38 +00:00
function makeMultiQsoLabel ( $qsos , $pdf , $numberofqsos , $offset , $orientation , $grid , $via ) {
2023-06-05 14:53:06 +00:00
$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 = '' ;
2023-06-05 14:53:06 +00:00
$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
}
}
2023-06-05 14:53:06 +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))) {
2023-06-05 14:53:06 +00:00
if ( ! empty ( $qso_data )) {
2023-10-26 09:10:38 +00:00
$this -> finalizeData ( $pdf , $current_callsign , $qso_data , $numberofqsos , $orientation , $grid , $via );
2023-06-05 14:53:06 +00:00
$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 ? ? '' ;
2023-06-05 14:53:06 +00:00
}
$qso_data [] = [
'time' => $qso -> COL_TIME_ON ,
'band' => $qso -> COL_BAND ,
'mode' => $qso -> COL_MODE ,
'rst' => $qso -> COL_RST_SENT ,
'mygrid' => $qso -> station_gridsquare ,
2023-10-26 09:10:38 +00:00
'via' => $qso -> COL_QSL_VIA ,
2023-06-05 14:53:06 +00:00
'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 ? ? '' ),
2023-08-05 05:49:12 +00:00
'qsl_recvd' => $qso -> COL_QSL_RCVD ,
'mycall' => $qso -> COL_STATION_CALLSIGN
2023-06-05 14:53:06 +00:00
];
}
if ( ! empty ( $qso_data )) {
2023-10-26 09:10:38 +00:00
$this -> finalizeData ( $pdf , $current_callsign , $qso_data , $numberofqsos , $orientation , $grid , $via );
2023-06-05 14:53:06 +00:00
}
}
2023-07-28 07:51:52 +00:00
// New begin
2023-07-30 06:50:08 +00:00
function pretty_sat_mode ( $sat_mode ) {
2023-07-30 07:59:38 +00: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
2023-10-26 09:10:38 +00:00
function finalizeData ( $pdf , $current_callsign , & $preliminaryData , $qso_per_label , $orientation , $grid , $via ) {
2023-07-29 18:49:45 +00:00
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' ]);
2023-07-28 13:13:21 +00:00
$myFormatForView = date ( " d.m.y H:i " , $time );
2023-07-28 06:36:57 +00:00
$rowData = [
2023-08-04 05:35:43 +00:00
'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 ){
2023-10-26 09:10:38 +00:00
$this -> generateLabel ( $pdf , $current_callsign , $tableData , $count_qso , $qso , $orientation , $grid , $via );
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 ){
2023-10-26 09:10:38 +00:00
$this -> generateLabel ( $pdf , $current_callsign , $tableData , $count_qso , $qso , $orientation , $grid , $via );
2023-07-28 06:36:57 +00:00
$preliminaryData = []; // reset the data
}
}
2023-07-28 06:04:16 +00:00
2023-10-26 09:10:38 +00:00
function generateLabel ( $pdf , $current_callsign , $tableData , $numofqsos , $qso , $orientation , $grid = true , $via = false ){
2023-07-28 07:51:52 +00:00
$builder = new \AsciiTable\Builder ();
$builder -> addRows ( $tableData );
2023-08-05 05:49:12 +00:00
$text = " Confirming QSO " . ( $numofqsos > 1 ? 's' : '' ) . " with " ;
2023-10-26 09:10:38 +00:00
$text .= $current_callsign ;
if (( $via ) && ( $qso [ 'via' ] ? ? '' != '' )) {
2023-10-26 11:29:58 +00:00
$text .= ' via ' . substr ( $qso [ 'via' ], 0 , 8 );
2023-10-26 09:10:38 +00:00
}
$text .= " \n " ;
2023-08-05 05:49:12 +00:00
$text .= $builder -> renderTable ();
2023-07-28 07:51:52 +00:00
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
}
2023-06-05 14:53:06 +00:00
}
2023-08-05 05:49:12 +00:00
$text .= " \n " ;
if ( $grid ) { $text .= " My call: " . $qso [ 'mycall' ] . " Grid: " . $qso [ 'mygrid' ] . " \n " ; }
$text .= " Thanks for the QSO " . ( $numofqsos > 1 ? 's' : '' );
2023-07-28 09:31:39 +00:00
$text .= " | " . ( $qso [ 'qsl_recvd' ] == 'Y' ? 'TNX' : 'PSE' ) . " QSL " ;
2023-08-02 10:20:38 +00:00
$pdf -> Add_Label ( $text , $orientation );
2023-06-02 16:50:27 +00:00
}
2023-07-28 07:51:52 +00:00
// New End
2023-06-03 06:46:52 +00:00
public function edit ( $id ) {
$this -> load -> model ( 'labels_model' );
$cleanid = $this -> security -> xss_clean ( $id );
2023-08-03 06:53:22 +00:00
$data [ 'label' ] = $this -> labels_model -> getLabel ( $cleanid , $this -> session -> userdata ( 'user_id' ));
2023-06-02 16:50:27 +00:00
2023-08-02 08:17:22 +00:00
$data [ 'papertypes' ] = $this -> labels_model -> fetchPapertypes ( $this -> session -> userdata ( 'user_id' ));
2023-06-03 06:46:52 +00:00
$data [ 'page_title' ] = " Edit Label " ;
$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' );
$this -> labels_model -> updateLabel ( $id );
2023-07-29 18:02:18 +00:00
$this -> session -> set_flashdata ( 'message' , 'Label was saved.' );
2023-06-03 06:46:52 +00:00
redirect ( 'labels' );
2023-06-02 16:50:27 +00:00
}
public function delete ( $id ) {
$this -> load -> model ( 'labels_model' );
$this -> labels_model -> deleteLabel ( $id );
2023-07-29 18:02:18 +00:00
$this -> session -> set_flashdata ( 'warning' , 'Label was deleted.' );
2023-06-02 16:50:27 +00:00
redirect ( 'labels' );
}
public function saveDefaultLabel () {
$id = $this -> input -> post ( 'id' );
$this -> load -> model ( 'labels_model' );
$this -> labels_model -> saveDefaultLabel ( $id );
}
2023-07-29 18:02:18 +00:00
public function startAtLabel () {
2023-07-29 18:49:45 +00:00
$data [ 'stationid' ] = xss_clean ( $this -> input -> post ( 'stationid' ));
2023-07-29 18:02:18 +00:00
$this -> load -> view ( 'labels/startatform' , $data );
}
2023-08-02 08:05:24 +00:00
public function editPaper ( $id ) {
$this -> load -> model ( 'labels_model' );
$cleanid = $this -> security -> xss_clean ( $id );
$data [ 'paper' ] = $this -> labels_model -> getPaper ( $cleanid );
$data [ 'page_title' ] = " Edit Paper " ;
$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' );
2023-08-02 17:10:35 +00:00
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 );
}
2023-08-02 08:05:24 +00:00
$this -> session -> set_flashdata ( 'message' , 'Paper was saved.' );
redirect ( 'labels' );
}
2023-08-03 06:15:51 +00: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 08:05:24 +00: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
}