JP
Gerar relatorio PDF e imprimi-lo
A principio eu criei um formulário mestre/detalhe para cadastrar Vendas (mestre) e ItensVenda (detalhes , até então tudo certo. Agora preciso de um página que liste todas as despesas com seus respectivos itens e com opção para gerar um relatório em PDF e impressão.
- <?php
- /**
- * VendaForm Master/Detail
- * @author <your name here>
- */
- class VendaForm extends TPage
- {
- protected $form; // form
- protected $detail_list;
- /**
- * Page constructor
- */
- public function __construct()
- {
- parent::__construct();
- // creates the form
- $this->form = new BootstrapFormBuilder('form_Venda');
- $this->form->setFormTitle('Venda');
- // master fields
- $ven_cod = new TEntry('ven_cod');
- $cliente = new TEntry('cliente');
- $cli_cod_fk = new TDBUniqueSearch('cli_cod_fk', 'bd_venda', 'Cliente', 'cli_cod', 'cli_nome');
- // detail fields
- $detail_itv_cod = new THidden('detail_itv_cod');
- $detail_cod_prod = new TDBUniqueSearch('detail_cod_prod', 'bd_venda', 'Produto', 'pro_cod', 'pro_nome');
- $detail_preco_venda = new TEntry('detail_preco_venda');
- $detail_quantidade = new TEntry('detail_quantidade');
- $detail_cod_prod->setChangeAction( new TAction([$this, 'onProductChange']));
- if (!empty($ven_cod))
- {
- $ven_cod->setEditable(FALSE);
- }
- // master fields
- $this->form->addFields( [new TLabel('Código')], [$ven_cod] );
- $this->form->addFields( [new TLabel('Cliente')], [$cliente] );
- $this->form->addFields( [new TLabel('Cliente Fidelizado')], [$cli_cod_fk] );
- // detail fields
- $this->form->addContent( ['<h4>Detalhes da Venda</h4><hr>'] );
- $this->form->addFields( [$detail_itv_cod] );
- $this->form->addFields( [new TLabel('Produto')], [$detail_cod_prod] );
- $this->form->addFields( [new TLabel('Preço ')], [$detail_preco_venda] );
- $this->form->addFields( [new TLabel('Quantidade')], [$detail_quantidade] );
- $add = TButton::create('add', [$this, 'onSaveDetail'], 'Register', 'fa:save');
- $this->form->addFields( [], [$add] )->style = 'background: whitesmoke; padding: 5px; margin: 1px;';
- $this->detail_list = new BootstrapDatagridWrapper(new TQuickGrid);
- $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
- $this->detail_list->setId('Venda_list');
- // items
- $prod= $this->detail_list->addQuickColumn('Produto', 'cod_prod', 'left', 50);
- $preco= $this->detail_list->addQuickColumn('Preço ', 'preco_venda', 'left', 30);
- $this->detail_list->addQuickColumn('Quantidade', 'quantidade', 'left', 30);
- //Calcula o total da datagrid
- $subtotal = $this->detail_list->addQuickColumn('Subtotal', '={quantidade} * {preco_venda}', 'right', 50);
- //Converte o valor numerico em milhares
- $format_value = function($value){
- if (is_numeric($value))
- {
- return 'Kz ' . number_format ($value, 2, ' , ' , ' . ');
- }
- return $value;
- };
- $subtotal->setTransformer($format_value);
- $preco->setTransformer($format_value);
- $subtotal->setTotalFunction(function($values){
- return array_sum((array) $values);
- });
- $prod-> setTransformer( function ($value) {
- return Produto :: findInTransaction ( 'bd_venda' , $value )->pro_nome;
- });
- // detail actions
- $this->detail_list->addQuickAction( 'Edit', new TDataGridAction([$this, 'onEditDetail']), 'itv_cod', 'fa:edit blue');
- $this->detail_list->addQuickAction( 'Delete', new TDataGridAction([$this, 'onDeleteDetail']), 'itv_cod', 'fa:trash red');
- $this->detail_list->createModel();
- $panel = new TPanelGroup;
- $panel->add($this->detail_list);
- $panel->getBody()->style = 'overflow-x:auto';
- $this->form->addContent( [$panel] );
- $btn = $this->form->addAction( _t('Save'), new TAction([$this, 'onSave']), 'fa:save');
- $btn->class = 'btn btn-sm btn-primary';
- $this->form->addAction( _t('Clear'), new TAction([$this, 'onClear']), 'fa:eraser red');
- // create the page container
- $container = new TVBox;
- $container->style = 'width: 100%';
- // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
- $container->add($this->form);
- parent::add($container);
- }
- //METODO QUE BUSCA O PREÇO DO ITEM
- public static function onProductChange( $params )
- {
- if(!empty($params['detail_cod_prod']))
- {
- try
- {
- TTransaction :: open('bd_venda');
- $produto = Produto :: find($params['detail_cod_prod']);
- $fill_data = new StdClass;
- $fill_data->detail_preco_venda = $produto->pro_preco;
- TForm :: sendData ('form_Venda', $fill_data);
- TTransaction::close();
- }
- catch(Exception $e)
- {
- new TMessage('error', $e->getMessage());
- TTransaction::rollback();
- }
- }
- }
- /**
- * Clear form
- * @param $param URL parameters
- */
- public function onClear($param)
- {
- $this->form->clear(TRUE);
- TSession::setValue(__CLASS__.'_items', array());
- $this->onReload( $param );
- }
- /**
- * Save an item from form to session list
- * @param $param URL parameters
- */
- public function onSaveDetail( $param )
- {
- try
- {
- TTransaction::open('bd_venda');
- $data = $this->form->getData();
- /** validation sample
- if (empty($data->fieldX))
- {
- throw new Exception('The field fieldX is required');
- }
- **/
- $items = TSession::getValue(__CLASS__.'_items');
- $key = empty($data->detail_itv_cod) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_itv_cod;
- $items[ $key ] = array();
- $items[ $key ]['itv_cod'] = $key;
- $items[ $key ]['cod_prod'] = $data->detail_cod_prod;
- $items[ $key ]['preco_venda'] = $data->detail_preco_venda;
- $items[ $key ]['quantidade'] = $data->detail_quantidade;
- TSession::setValue(__CLASS__.'_items', $items);
- // clear detail form fields
- $data->detail_itv_cod = '';
- $data->detail_cod_prod = '';
- $data->detail_preco_venda = '';
- $data->detail_quantidade = '';
- TTransaction::close();
- $this->form->setData($data);
- $this->onReload( $param ); // reload the items
- }
- catch (Exception $e)
- {
- $this->form->setData( $this->form->getData());
- new TMessage('error', $e->getMessage());
- }
- $this->form->clear(TRUE); //Para Limpar os campos do formulario Mestre
- }
- /**
- * Load an item from session list to detail form
- * @param $param URL parameters
- */
- public static function onEditDetail( $param )
- {
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- // get the session item
- $item = $items[ $param['key'] ];
- $data = new stdClass;
- $data->detail_itv_cod = $item['itv_cod'];
- $data->detail_cod_prod = $item['cod_prod'];
- $data->detail_preco_venda = $item['preco_venda'];
- $data->detail_quantidade = $item['quantidade'];
- // fill detail fields
- TForm::sendData( 'form_Venda', $data );
- }
- /**
- * Delete an item from session list
- * @param $param URL parameters
- */
- public static function onDeleteDetail( $param )
- {
- // reset items
- $data = new stdClass;
- $data->detail_cod_prod = '';
- $data->detail_preco_venda = '';
- $data->detail_quantidade = '';
- // clear form data
- TForm::sendData('form_Venda', $data );
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- // get detail id
- $detail_id = $param['key'];
- // delete the item from session
- unset($items[ $detail_id ] );
- // rewrite session items
- TSession::setValue(__CLASS__.'_items', $items);
- // delete item from screen
- TScript::create("ttable_remove_row_by_id('Venda_list', '{$detail_id}')");
- }
- /**
- * Load the items list from session
- * @param $param URL parameters
- */
- public function onReload($param)
- {
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- $this->detail_list->clear(); // clear detail list
- if ($items)
- {
- foreach ($items as $list_item)
- {
- $item = (object) $list_item;
- $row = $this->detail_list->addItem( $item );
- $row->id = $list_item['itv_cod'];
- }
- }
- $this->loaded = TRUE;
- }
- /**
- * Load Master/Detail data from database to form/session
- */
- public function onEdit($param)
- {
- try
- {
- TTransaction::open('bd_venda');
- if (isset($param['key']))
- {
- $key = $param['key'];
- $object = new Venda($key);
- $items = Itensvenda::where('cod_venda', '=', $key)->load();
- $session_items = array();
- foreach( $items as $item )
- {
- $item_key = $item->itv_cod;
- $session_items[$item_key] = $item->toArray();
- $session_items[$item_key]['itv_cod'] = $item->itv_cod;
- $session_items[$item_key]['cod_prod'] = $item->cod_prod;
- $session_items[$item_key]['preco_venda'] = $item->preco_venda;
- $session_items[$item_key]['quantidade'] = $item->quantidade;
- // $session_items[$item_key]['desconto'] = $item->desconto;
- }
- TSession::setValue(__CLASS__.'_items', $session_items);
- $this->form->setData($object); // fill the form with the active record data
- $this->onReload( $param ); // reload items list
- TTransaction::close(); // close transaction
- }
- else
- {
- $this->form->clear(TRUE);
- TSession::setValue(__CLASS__.'_items', null);
- $this->onReload( $param );
- }
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage());
- TTransaction::rollback();
- }
- }
- /**
- * Save the Master/Detail data from form/session to database
- */
- public function onSave()
- {
- try
- {
- // open a transaction with database
- TTransaction::open('bd_venda');
- $data = $this->form->getData();
- $master = new Venda;
- $master->fromArray( (array) $data);
- $this->form->validate(); // Valida a data do formulario
- $master->store(); // save master object
- // delete details
- $old_items = Itensvenda::where('cod_venda', '=', $master->ven_cod)->load();
- $keep_items = array();
- // get session items
- $items = TSession::getValue(__CLASS__.'_items');
- if( $items )
- {
- foreach( $items as $item )
- {
- if (substr($item['itv_cod'],0,1) == 'X' ) // new record
- {
- $detail = new Itensvenda;
- }
- else
- {
- $detail = Itensvenda::find($item['itv_cod']);
- }
- $detail->cod_prod = $item['cod_prod'];
- $detail->preco_venda = $item['preco_venda'];
- $detail->quantidade = $item['quantidade'];
- $detail->cod_venda = $master->ven_cod;
- // Criamos um Campo ven_total para guardar o total da venda
- $detail->ven_total = ($detail->quantidade * ($detail->preco_venda));
- $detail->store(); // Guarda os itens dos detalhes
- $this->form->setData($data); // Preencha a Data no Formulário
- $master->ven_total += $detail->ven_total;
- $master->venda_data = date('Y-m-d H:m:s');
- $keep_items[] = $detail->itv_cod;
- }
- $master->store();
- }
- if ($old_items)
- {
- foreach ($old_items as $old_item)
- {
- if (!in_array( $old_item->itv_cod, $keep_items))
- {
- $old_item->delete();
- }
- }
- }
- TTransaction::close(); // close the transaction
- // reload form and session items
- $this->onEdit(array('key'=>$master->ven_cod));
- new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage());
- $this->form->setData( $this->form->getData() ); // keep form data
- TTransaction::rollback();
- }
- $this->form->clear(TRUE); //Para Limpar os campos do formulario Mestre
- }
- /**
- * Show the page
- */
- public function show()
- {
- // check if the datagrid is already loaded
- if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
- {
- $this->onReload( func_get_arg(0) );
- }
- parent::show();
- }
- }
Alguns links que podem ajudar:
adianti.com.br/framework_files/tutor/index.php?class=TabularReportVi
adianti.com.br/framework_files/tutor/index.php?class=DocumentHtmlPdf
adianti.com.br/framework_files/tutor/index.php?class=PDFDesignNFEVie