ERRO AO SALVAR SOMA DETALHES NO MESTRE Boa tarde, Tenho um formulário mestre detalhes, onde estou tentando implementar para que some os ítens do detalhe no campo do mestre. Após salvar a som dos detalhes, ele exclui todos os ítens do detalhe. Tentei seguir o exemplo do tutor más não está dando certo. Onde estou errando? Segue código do Form abaixo. Desde já agradeço. ...
AR
ERRO AO SALVAR SOMA DETALHES NO MESTRE  
Boa tarde,
Tenho um formulário mestre detalhes, onde estou tentando implementar para que some os ítens do detalhe no campo do mestre.
Após salvar a som dos detalhes, ele exclui todos os ítens do detalhe.

Tentei seguir o exemplo do tutor más não está dando certo.

Onde estou errando?

Segue código do Form abaixo. Desde já agradeço.

<?php/** * ReceitaForm Master/Detail * @author  Alexandre M. Roberto */class ReceitaForm extends TPage{    protected $form; // form    protected $detail_list;    // trait with saveFile, saveFiles, ...    use Adianti\Base\AdiantiFileSaveTrait;            /**     * Page constructor     */    public function __construct()    {        parent::__construct();                        // creates the form        $this->form = new BootstrapFormBuilder('form_Receita');        $this->form->setFormTitle('Receita');                // master fields        $id = new TEntry('id');        $dt_receita = new TDate('dt_receita');        $mes = new TCombo('mes');        $ano = new TCombo('ano');        $contribuicoes = new TEntry('contribuicoes');        $ofertas = new TEntry('ofertas');        $promocoes = new TEntry('promocoes');        $patrimonial = new TEntry('patrimonial');        $outros = new TEntry('outros');        $total = new TEntry('total');        $dizimo = new TEntry('dizimo');        $ofertas_a_repassar = new TEntry('ofertas_a_repassar');        $comprovantes = new TMultiFile('comprovantes');        $dep_receitas = new TDate('dep_receitas');        $dep_ofertas_a_repassar = new TDate('dep_ofertas_a_repassar');        $observacoes = new TText('observacoes');                $dt_receita->setMask('dd/mm/yyyy');        $dt_receita->setDatabaseMask('yyyy-mm-dd');        $dt_receita->setValue( date('Y-m-d') );        $total->setEditable(FALSE);        $dizimo->setEditable(FALSE);        $ofertas_a_repassar->setEditable(FALSE);                $current = (int) date('Y');        $mes->addItems( ['01' => 'Janeiro',                         '02' => 'Fevereiro',                         '03' => 'Março',                         '04' => 'Abril',                         '05' => 'Maio',                         '06' => 'Junho',                         '07' => 'Julho',                         '08' => 'Agosto',                          '09' => 'Setembro',                          '10' => 'Outubro',                          '11' => 'Novembro',                          '12' => 'Dezembro'] );        $ano->addItems( [ ($current -5) => ($current -5), ($current -4) => ($current -4), ($current -3) => ($current -3), ($current -2) => ($current -2), ($current -1) => ($current -1), $current => $current ] );                $comprovantes->setAllowedExtensions( ['png', 'jpg', 'pdf'] );        $comprovantes->enableFileHandling();        $comprovantes->enableImageGallery();        $comprovantes->enablePopover('Preview', '<img style="max-width:300px" src="download.php?file={file_name}">');        $id->setSize('100%');        $dt_receita->setSize('100%');        $mes->setSize('100%');        $ano->setSize('100%');        $contribuicoes->setSize('100%');        $ofertas->setSize('100%');        $promocoes->setSize('100%');        $patrimonial->setSize('100%');        $outros->setSize('100%');        $total->setSize('100%');        $dizimo->setSize('100%');        $ofertas_a_repassar->setSize('100%');        $comprovantes->setSize('100%');        $dep_receitas->setSize('100%');        $dep_ofertas_a_repassar->setSize('100%');        $observacoes->setSize('100%');                        // detail fields        $detail_uniqid = new THidden('detail_uniqid');        $detail_id = new THidden('detail_id');        $detail_dt_oferta = new TDate('detail_dt_oferta');        $detail_dt_oferta->setMask('dd/mm/yyyy');        $detail_dt_oferta->setDatabaseMask('yyyy-mm-dd');                $detail_plano_id = new TDBCombo('detail_plano_id', 'sudeste', 'Plano', 'id', 'favorecido');        $detail_plano_id->setEditable(FALSE);        $detail_plano_id->setSize('100%');                $detail_valor = new TEntry('detail_valor');        $detail_valor->setNumericMask(2, ',', '.', true);                                // exit action        $detail_dt_oferta->setExitAction(new TAction([$this,'onExitDate']));        if (!empty($id))        {            $id->setEditable(FALSE);        }                // master fields        $row = $this->form->addFields( [ new TLabel('Id'),         $id ],                                       [ new TLabel('Dt Receita'), $dt_receita ],                                       [ new TLabel('Mês'),        $mes ],                                       [ new TLabel('Ano'),        $ano ] );        $row->layout = ['col-sm-3', 'col-sm-3', 'col-sm-3', 'col-sm-3' ];        $row = $this->form->addFields( [ new TLabel('Contribuições'),  $contribuicoes ],                                       [ new TLabel('Ofertas'),        $ofertas ],                                       [ new TLabel('Promoções'),      $promocoes ],                                       [ new TLabel('R. Patrimonial'), $patrimonial ] );        $row->layout = ['col-sm-3', 'col-sm-3', 'col-sm-3', 'col-sm-3' ];        $row = $this->form->addFields( [ new TLabel('Outros'),         $outros ],                                       [ new TLabel('Total Receitas'), $total ],                                       [ new TLabel('Dízimo (10%)'),   $dizimo ],                                       [ new TLabel('Total Ofertas'),  $ofertas_a_repassar ] );        $row->layout = ['col-sm-3', 'col-sm-3', 'col-sm-3', 'col-sm-3' ];        $label2 = new TLabel('Depósitos e Comprovantes', '#5A73DB', 12, '');        $label2->style='text-align:left;border-bottom:1px solid #c0c0c0;width:100%; padding-top: 25px;';        $this->form->addContent( [$label2] );                $row = $this->form->addFields( [ new TLabel('Dep. Dízimo (10%)'),       $dep_receitas ],                                       [ new TLabel('Dep. Ofertas a Repassar'), $dep_ofertas_a_repassar ] );        $row->layout = ['col-sm-6', 'col-sm-6' ];        $row = $this->form->addFields( [ new TLabel('Comprovantes'),      $comprovantes ] );        $row->layout = ['col-sm-12' ];                // detail fields                $label3 = new TLabel('Ofertas a Repassar', '#5A73DB', 12, '');        $label3->style='text-align:left;border-bottom:1px solid #c0c0c0;width:100%; padding-top: 25px;';        $this->form->addContent( [$label3] );        $this->form->addFields( [$detail_uniqid] );        $this->form->addFields( [$detail_id] );                $row = $this->form->addFields( [ new TLabel('Dt. Oferta'),     $detail_dt_oferta ],                                       [ new TLabel('Favorecido'),     $detail_plano_id ],                                       [ new TLabel('Valor'),          $detail_valor ] );        $row->layout = ['col-sm-2', 'col-sm-8', 'col-sm-2' ];        $add = TButton::create('add', [$this, 'onDetailAdd'], _t('Register'), 'fa:plus-circle green');        $add->getAction()->setParameter('static','1');        $this->form->addFields( [], [$add] );                $this->detail_list = new BootstrapDatagridWrapper(new TDataGrid);        $this->detail_list->setId('Oferta_list');        $this->detail_list->generateHiddenFields();        $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";                // items        $this->detail_list->addColumn( new TDataGridColumn('uniqid', 'Uniqid', 'center') )->setVisibility(false);        $this->detail_list->addColumn( new TDataGridColumn('id', 'Id', 'center') )->setVisibility(false);        $dt = $this->detail_list->addColumn( new TDataGridColumn('dt_oferta', 'Dt Oferta', 'left', 50) );        $pl = $this->detail_list->addColumn( new TDataGridColumn('plano_id', 'Plano Id', 'left', 100) );        $vl = $this->detail_list->addColumn( new TDataGridColumn('valor', 'Valor', 'left', 100) );                $dt->setTransformer( function($value, $object) {        if ($value)           $value = TDate::convertToMask($value, 'yyyy-mm-dd', 'dd/mm/yyyy', true);        });                $pl->setTransformer(function($value) {            return Plano::findInTransaction('sudeste', $value)->favorecido;        });                $format_value = function($value) {            if (is_numeric($value)) {                return 'R$ '.number_format($value, 2, ',', '.');            }            return $value;        };                $vl->setTransformer( $format_value );                        // detail actions        $action1 = new TDataGridAction([$this, 'onDetailEdit'] );        $action1->setFields( ['uniqid', '*'] );                $action2 = new TDataGridAction([$this, 'onDetailDelete']);        $action2->setField('uniqid');                // add the actions to the datagrid        $this->detail_list->addAction($action1, _t('Edit'), 'fa:edit blue');        $this->detail_list->addAction($action2, _t('Delete'), 'far:trash-alt red');                $this->detail_list->createModel();                $panel = new TPanelGroup;        $panel->add($this->detail_list);        $panel->getBody()->style = 'overflow-x:auto';        $this->form->addContent( [$panel] );        $label4 = new TLabel('Obervações', '#5A73DB', 12, '');        $label4->style='text-align:left;border-bottom:1px solid #c0c0c0;width:100%; padding-top: 25px;';        $this->form->addContent( [$label4] );                $row = $this->form->addFields( [ new TLabel('Observações'),       $observacoes ] );        $row->layout = ['col-sm-12' ];                $this->form->addAction( 'Save',  new TAction([$this, 'onSave'], ['static'=>'1']), 'fa:save green');        $this->form->addAction( '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);    }        public static function onExitDate($params)    {        if( !empty($params['detail_dt_oferta']) )        {            try            {                TTransaction::open('sudeste');                                $criteria = new TCriteria;                $date = TDate::date2us( $params['detail_dt_oferta']);                $criteria->add( new TFilter( 'dt_oferta', '=', $date) );                                $repository = new TRepository('Plano');                $planos = $repository->load( $criteria );                                if ($planos)                {                    foreach ($planos as $plano)                    {                        TForm::sendData('form_Receita', (object) ['detail_plano_id' => $plano->id ]);                    }                }                else                {                    new TMessage('info', 'Verifique se existe oferta a repassar nesta data e tente novamente!');                }                                          }            catch (Exception $e)            {                new TMessage('error', $e->getMessage());                TTransaction::rollback();            }        }    }         /**     * Clear form     * @param $param URL parameters     */    public function onClear($param)    {        $this->form->clear(TRUE);    }        /**     * Add detail item     * @param $param URL parameters     */    public function onDetailAdd( $param )    {        try        {            $this->form->validate();            $data = $this->form->getData();                        /** validation sample            if (empty($data->fieldX))            {                throw new Exception('The field fieldX is required');            }            **/                        $uniqid = !empty($data->detail_uniqid) ? $data->detail_uniqid : uniqid();                        $grid_data = [];            $grid_data['uniqid'] = $uniqid;            $grid_data['id'] = $data->detail_id;            $grid_data['dt_oferta'] = $data->detail_dt_oferta;            $grid_data['plano_id'] = $data->detail_plano_id;            $grid_data['valor'] = $data->detail_valor;                        // insert row dynamically            $row = $this->detail_list->addItem( (object) $grid_data );            $row->id = $uniqid;                        TDataGrid::replaceRowById('Oferta_list', $uniqid, $row);                        // clear detail form fields            $data->detail_uniqid = '';            $data->detail_id = '';            $data->detail_dt_oferta = '';            $data->detail_plano_id = '';            $data->detail_valor = '';                        // send data, do not fire change/exit events            TForm::sendData( 'form_Receita', $data, false, false );        }        catch (Exception $e)        {            $this->form->setData( $this->form->getData());            new TMessage('error', $e->getMessage());        }    }        /**     * Edit detail item     * @param $param URL parameters     */    public static function onDetailEdit( $param )    {        $data = new stdClass;        $data->detail_uniqid = $param['uniqid'];        $data->detail_id = $param['id'];        $data->detail_dt_oferta = $param['dt_oferta'];        $data->detail_plano_id = $param['plano_id'];        $data->detail_valor = $param['valor'];                // send data, do not fire change/exit events        TForm::sendData( 'form_Receita', $data, false, false );    }        /**     * Delete detail item     * @param $param URL parameters     */    public static function onDetailDelete( $param )    {        // clear detail form fields        $data = new stdClass;        $data->detail_uniqid = '';        $data->detail_id = '';        $data->detail_dt_oferta = '';        $data->detail_plano_id = '';        $data->detail_valor = '';                // send data, do not fire change/exit events        TForm::sendData( 'form_Receita', $data, false, false );                // remove row        TDataGrid::removeRowById('Oferta_list', $param['uniqid']);    }        /**     * Load Master/Detail data from database to form     */    public function onEdit($param)    {        try        {            TTransaction::open('sudeste');                        if (isset($param['key']))            {                $key = $param['key'];                                $object = new Receita($key);                $items  = Oferta::where('receita_id', '=', $key)->load();                                foreach( $items as $item )                {                    $item->uniqid = uniqid();                    $row = $this->detail_list->addItem( $item );                    $row->id = $item->uniqid;                }                $this->form->setData($object);                TTransaction::close();            }            else            {                $this->form->clear(TRUE);            }        }        catch (Exception $e) // in case of exception        {            new TMessage('error', $e->getMessage());            TTransaction::rollback();        }    }        /**     * Save the Master/Detail data from form to database     */    public function onSave($param)    {        try        {            // open a transaction with database            TTransaction::open('sudeste');                        $data = $this->form->getData();            $this->form->validate();                        $master = new Receita;            $master->fromArray( (array) $data);            $master->total = $master->contribuicoes + $master->ofertas + $master->patrimonial + $master->promocoes + $master->outros;            $master->dizimo = $master->total * (10 / 100);            $master->system_user_id = TSession::getValue('userid');            $master->system_unit_id = TSession::getValue('userunitid');            $master->store();                        Oferta::where('receita_id', '=', $master->id)->delete();                        $total = 0;                       if( $param['Oferta_list_dt_oferta'] )            {                foreach( $param['Oferta_list_dt_oferta'] as $key => $item_id )                {                    $detail = new Oferta;                    $detail->dt_oferta  = $param['Oferta_list_dt_oferta'][$key];                    $detail->plano_id  = $param['Oferta_list_plano_id'][$key];                    $detail->valor  = $param['Oferta_list_valor'][$key];                    $detail->receita_id = $master->id;                    $total += $detail->valor;                    $detail->store();                                                       }            }            $master->ofertas_a_repassar = $total;            $master->store(); // stores the object                        TForm::sendData('form_Receita', (object) ['id' => $master->id]);                        TTransaction::close(); // close the transaction                                               new TMessage('info', AdiantiCoreTranslator::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();        }    }}

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (5)


NR

Provavelmente a função store do model Receita está chamando saveAggregate ou saveComposite. Essas funções fazem o delete dos itens antes de salvar os novos. No seu caso, como está controlando isso diretamente no onSave, pode apagar a função store do model
AR

Era isso mesmo.
Muito obrigado Nataniel.
Grande abraço!
AR

Boa tarde Natanael,

Neste mesmo formulário, coloquei as máscaras para os valores numéricos em todos os campos (->setNumericMask(2,',','.', true))

Ao salvar está multiplicando e salvando os valores informados por 100.

Se informo 100 ele salva 10.000.

Tem idéia do que pode ser isso?
AL

Boa tarde a todos, estou com o mesmo problema, quando salvo um registro no datails ele coloca o valor de 95.000,00 como 95000.00 e quando salva o registro ele coloca mais dois zeros, estou tentando tirar dois zeros antes de salvar o campo.
AL

Boa tarde a todos!

Estou com o mesmo problema, quando salvo um registro no datalhe ele coloca o valor de 95.000,00 como 95000.00 no formulário e quando salva o registro ele coloca mais dois zeros, estou tentando tirar dois zeros antes de salvar o campo.