Acentuação em Grid do Mestre Detalhe Boa noite. Tenho um form Mestre Detalhe que funciona tudo perfeitamente. Só que quando incluo um produto que tenha acentuação ele simplesmente envia tudo codificado, exemplo: Aliança Ele adiciona como: ALIANÇA Já olhei em outros posts e até mesmo pelo google mas não encontro nada que resolva. Obrigado. Segue meu código: ...
CM
Acentuação em Grid do Mestre Detalhe  
Boa noite.
Tenho um form Mestre Detalhe que funciona tudo perfeitamente.
Só que quando incluo um produto que tenha acentuação ele simplesmente envia tudo codificado, exemplo:
Aliança
Ele adiciona como:
ALIANÇA

Já olhei em outros posts e até mesmo pelo google mas não encontro nada que resolva.

Obrigado.

Segue meu código:

 
  1. <?php
 
  1. <?php
  2. class ComprasFormMaster extends TPage
  3. {
  4. protected $form; // form
  5. protected $detail_list;
  6. public function __construct()
  7. {
  8. parent::__construct();
  9. // creates the form
  10. $this->form = new BootstrapFormBuilder('form_Compras');
  11. $this->form->setFormTitle('REGISTRO COMPRA');
  12. $this->form->setFieldSizes('100%');
  13. // master fields
  14. $id_compra = new TEntry('id_compra');
  15. $data_compra = new TDate('data_compra');
  16. $tipo_compra_txt = new TEntry('tipo_compra_txt');
  17. $finalizada = new TEntry('finalizada');
  18. $finalizada = new THidden('finalizada');
  19. $criteria = new TCriteria;
  20. $criteria->setProperty('order', 'nome_cliente');
  21. $cliente_id = new ">TDBSeekButton('cliente_id', 'ourorio', 'form_Compras', 'Clientes', 'nome_cliente', 'cliente_id', 'cliente_txt', $criteria);
  22. $cliente_txt = new TEntry('cliente_txt');
  23. $cliente_txt->setEditable(FALSE);
  24. // define ação de saída do campo
  25. $cliente_id->setExitAction(new TAction(array($this, 'onExitCliente')));
  26. $cliente_cep = new THidden('cliente_cep');
  27. $cliente_endereco_tipo = new THidden('cliente_endereco_tipo');
  28. $cliente_endereco = new THidden('cliente_endereco');
  29. $cliente_endereco_numero = new THidden('cliente_endereco_numero');
  30. $cliente_bairro = new THidden('cliente_bairro');
  31. $cliente_cidade = new THidden('cliente_cidade');
  32. $cliente_estado = new THidden('cliente_estado');
  33. $cliente_telefone = new THidden('cliente_telefone');
  34. $cliente_nascimento = new THidden('cliente_nascimento');
  35. $cliente_identidade = new THidden('cliente_identidade');
  36. $cliente_email = new THidden('cliente_email');
  37. $cliente_cpf = new THidden('cliente_cpf');
  38. $anexo_nf_joia_cliente = new TFile('anexo_nf_joia_cliente');
  39. $vendedor_txt = new TEntry('vendedor_txt');
  40. $vendedor_id = new THidden('vendedor_id');
  41. $loja_id = new TEntry('loja_id');
  42. $loja_id = new THidden('loja_id');
  43. $loja_txt = new TEntry('loja_txt');
  44. $finalizada = new TEntry('finalizada');
  45. $movimento_fechado = new TEntry('movimento_fechado');
  46. $movimento_fechado_em = new TDate('movimento_fechado_em');
  47. $valor_total = new TDate('valor_total');
  48. //Campos Obrigatórios
  49. $cliente_id->addValidation('Id do Cliente', new TRequiredValidator);
  50. $cliente_txt->addValidation('Nome do Cliente', new TRequiredValidator);
  51. $data_compra->addValidation('Data da Compra', new TRequiredValidator);
  52. // máscara Master
  53. $data_compra ->setDatabaseMask('yyyy-mm-dd');
  54. $data_compra ->setMask('dd/mm/yyyy');
  55. $data_compra->setValue(date("Y-m-d"));
  56. $loja_id->setValue(TSession::getValue('userunitid')) ; //id da unidade
  57. $loja_id->setEditable(FALSE);
  58. $loja_txt->setValue(TSession::getValue('userunitname')); //nome da unidade
  59. $loja_txt->setEditable(FALSE);
  60. $vendedor_txt->setEditable(FALSE);
  61. $vendedor_txt->setValue(TSession::getValue('username')); //nome do usuário
  62. $vendedor_id->setValue(TSession::getValue('userid'));//id usuario
  63. $finalizada->setValue('1');
  64. // set sizes Master
  65. $cliente_id->setSize('100%');
  66. $cliente_txt->setSize('100%');
  67. $vendedor_txt->setSize('100%');
  68. $loja_txt->setSize('100%');
  69. // detail fields
  70. $detail_uniqid = new THidden('detail_uniqid');
  71. $detail_id_automatico = new THidden('detail_id_automatico');
  72. $detail_loja_sub_id = new THidden('detail_loja_sub_id');
  73. $detail_loja_sub_txt = new THidden('detail_loja_sub_txt');
  74. $detail_vendedor_sub_id = new THidden('detail_vendedor_sub_id');
  75. $detail_vendedor_sub_txt = new THidden('detail_vendedor_sub_txt');
  76. $detail_quantidade = new TEntry('detail_quantidade');
  77. $detail_quantidade = new TNumeric('detail_quantidade', 2, '', '', true);
  78. $detail_unidade = new TEntry('detail_unidade');
  79. $detail_descricao = new TEntry('detail_descricao');
  80. $detail_valor_unit = new TEntry('detail_valor_unit');
  81. $detail_subtotal = new TEntry('detail_subtotal');
  82. $detail_tipo_compra_id = new TDBCombo('detail_tipo_compra_id', 'ourorio', 'ComprasTipo', 'id_tipo_compra', 'descricao','descricao');
  83. $detail_tipo_compra_txt = new TEntry('detail_tipo_compra_txt');
  84. $detail_tipo_compra_txt = new THidden('detail_tipo_compra_txt');
  85. $detail_kilate_id = new TDBCombo('detail_kilate_id', 'ourorio', 'ComprasKilate', 'id_kilate', 'descricao_kilate','descricao_kilate');
  86. $detail_kilate_txt = new TEntry('detail_kilate_txt');
  87. $detail_kilate_txt = new THidden('detail_kilate_txt');
  88. $detail_valor_unit->setEditable(FALSE);
  89. $detail_subtotal->setEditable(FALSE);
  90. // define ação ao Sair doo Campo
  91. $detail_quantidade->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  92. // define ação ao alterar a Combo
  93. $detail_kilate_id->setChangeAction(new TAction(array($this, 'onChangeKilate')));
  94. $detail_tipo_compra_id->setChangeAction(new TAction(array($this, 'onChangeTipoCompra')));
  95. // mascara detalhes
  96. $detail_descricao->forceUpperCase();
  97. $detail_unidade->forceUpperCase();
  98. $detail_unidade->setValue('GR');
  99. $detail_quantidade->setNumericMask(2, ',', '.', true, true);
  100. $detail_valor_unit->setNumericMask(2, ',', '.', true);
  101. $detail_subtotal->setNumericMask(2, ',', '.', true);
  102. if (!empty($id_compra))
  103. {
  104. $id_compra->setEditable(FALSE);
  105. }
  106. // master fields
  107. $row = $this->form->addFields ([new TLabel('Código')], [$id_compra] ,
  108. [new TLabel('Data')], [$data_compra] ,
  109. [new TLabel('Oper.')], [$vendedor_txt],
  110. [new THidden('Loja')], [$loja_txt]);
  111. $row->layout = ['col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-2','col-sm-0','col-3'];
  112. $row = $this->form->addFields( [new TLabel('Anexo N.F. Joia')], [$anexo_nf_joia_cliente],
  113. [new TLabel('ID')], [$cliente_id],
  114. [new TLabel('Cliente')], [$cliente_txt]);
  115. $row->layout = ['col-sm-1', 'col-sm-2','col-sm-1', 'col-sm-2','col-sm-1', 'col-sm-5'];
  116. $row = $this->form->addFields([new THidden('CEP')], [$cliente_cep],
  117. [new THidden('Tipo')], [$cliente_endereco_tipo],
  118. [new THidden('Endereço')], [$cliente_endereco],
  119. [new THidden('Numero')], [$cliente_endereco_numero],
  120. [new THidden('Bairro')], [$cliente_bairro],
  121. [new THidden('Cidade')], [$cliente_cidade],
  122. [new THidden('Estado')], [$cliente_estado],
  123. [new THidden('Telefone')], [$cliente_telefone],
  124. [new THidden('Nasc')], [$cliente_nascimento],
  125. [new THidden('Identidade')], [$cliente_identidade],
  126. [new THidden('Email')], [$cliente_email],
  127. [new THidden('CPF')], [$cliente_cpf],
  128. [new THidden('Op. ID')], [$vendedor_id]);
  129. $row->layout = ['col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-4','col-sm-1','col-sm-2','col-sm-1', 'col-sm-2', 'col-sm-1','col-sm-2', 'col-sm-1','col-sm-2', 'col-sm-1','col-sm-2', 'col-sm-1','col-sm-2', 'col-sm-1','col-sm-2', 'col-sm-1','col-sm-2'];
  130. $row = $this->form->addFields([new THidden('ID')], [$loja_id] );
  131. $row->layout = ['col-sm-1', 'col-sm-3','col-sm-1', 'col-sm-3','col-sm-1','col-sm-3'];
  132. // detail fields
  133. $this->form->addContent( ['<h4>Item(s) da Compra</h4><hr>'] );
  134. $this->form->addFields( [$detail_uniqid] );
  135. $this->form->addFields( [$detail_id_automatico] );
  136. $row = $this->form->addFields( [new TLabel('Tipo')], [$detail_tipo_compra_id],
  137. [new TLabel('Kilate')], [$detail_kilate_id],
  138. [new TLabel('Quant')], [$detail_quantidade],
  139. [new TLabel('Unidade')], [$detail_unidade] );
  140. $row->layout = ['col-sm-1', 'col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-2'];
  141. $row = $this->form->addFields([new THidden('TipoTxt')], [$detail_tipo_compra_txt],
  142. [new THidden('KilateTxt')], [$detail_kilate_txt]);
  143. $row->layout = ['col-sm-1', 'col-sm-2','col-sm-1','col-sm-2'];
  144. $row = $this->form->addFields( [new TLabel('Produto')], [$detail_descricao],
  145. [new TLabel('Valor')], [$detail_valor_unit],
  146. [new TLabel('Subtotal')], [$detail_subtotal]);
  147. $row->layout = ['col-sm-1', 'col-sm-5','col-sm-1','col-sm-2','col-sm-1','col-sm-2'];
  148. $btn_add = TButton::create('add', [$this, 'onDetailAdd'], 'Lança Produto', 'fa:plus-circle green');
  149. $btn_add->getAction()->setParameter('static','1');
  150. $this->form->addFields( [], [$btn_add] );
  151. $this->detail_list = new BootstrapDatagridWrapper(new TDataGrid);
  152. $this->detail_list->setId('ComprasSub_list');
  153. $this->detail_list->generateHiddenFields();
  154. $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
  155. // items
  156. $this->detail_list->addColumn( new TDataGridColumn('uniqid', 'Uniqid', 'center') )->setVisibility(false);
  157. $this->detail_list->addColumn( new TDataGridColumn('id_automatico', 'Id', 'center') )->setVisibility(false);
  158. $quant = $this->detail_list->addColumn( new TDataGridColumn('quantidade', 'Quant', 'right', 50) );
  159. $this->detail_list->addColumn( new TDataGridColumn('unidade', 'Unid', 'center', 50) );
  160. $this->detail_list->addColumn( new TDataGridColumn('descricao', 'Descrição', 'left', 100) );
  161. $this->detail_list->addColumn( new TDataGridColumn('tipo_compra_txt', 'Tipo', 'left', 50) );
  162. $this->detail_list->addColumn( new TDataGridColumn('kilate_txt', 'Kilate', 'left', 50) );
  163. $vlr_unit = $this->detail_list->addColumn( new TDataGridColumn('valor_unit', 'Valor Unit', 'right', 50) );
  164. $this->detail_list->addColumn( new TDataGridColumn('loja_sub_id', 'Loja Id', 'left', 100) )->setVisibility(false);
  165. $this->detail_list->addColumn( new TDataGridColumn('loja_sub_txt', 'Loja txt', 'left', 100) )->setVisibility(false);
  166. $this->detail_list->addColumn( new TDataGridColumn('vendedor_sub_id', 'Vendedor id', 'left', 100) )->setVisibility(false);
  167. $this->detail_list->addColumn( new TDataGridColumn('vendedor_sub_txt', 'Vendedor txt', 'left', 100) )->setVisibility(false);
  168. $this->detail_list->addColumn( new TDataGridColumn('tipo_compra_id', 'Tipo Compra Id', 'left', 50))->setVisibility(false);
  169. $this->detail_list->addColumn( new TDataGridColumn('kilate_id', 'Kilate Id', 'left', 50) )->setVisibility(false);
  170. $formula = '={quantidade} * {valor_unit}';
  171. $st = $this->detail_list->addColumn( new TDataGridColumn($formula, 'SubTotal', 'right', 100) );
  172. // definir o método do transformador sobre o Valor
  173. $format_value = function($value) {
  174. if (is_numeric($value))
  175. {
  176. return ' ' . number_format($value, 2, ',', '.');
  177. }
  178. return $value;
  179. };
  180. $st->setTransformer($format_value);
  181. $vlr_unit->setTransformer($format_value);
  182. $quant->setTransformer($format_value);
  183. // detail actions
  184. $btn_edita_item = new TDataGridAction([$this, 'onDetailEdit'] );
  185. //$btn_edita_item->setDisplayCondition( array($this, 'mostrar') );
  186. $btn_edita_item->setFields( ['uniqid', '*'] );
  187. $btn_deleta_item = new TDataGridAction([$this, 'onDetailDelete']);
  188. //$btn_deleta_item->setDisplayCondition( array($this, 'mostrar') );
  189. $btn_deleta_item->setField('uniqid');
  190. // add the actions to the datagrid
  191. $this->detail_list->addAction($btn_edita_item, _t('Edit'), 'fa:edit blue');
  192. $this->detail_list->addAction($btn_deleta_item, _t('Delete'), 'far:trash-alt red');
  193. $this->detail_list->createModel();
  194. $panel = new TPanelGroup;
  195. $panel->add($this->detail_list);
  196. $panel->getBody()->style = 'overflow-x:auto';
  197. $this->form->addContent( [$panel] );
  198. $btn_gravar = $this->form->addAction( 'SALVAR', new TAction([$this, 'onSave'], ['static'=>'1']), 'fa:save white');
  199. $btn_gravar->class = 'btn btn-sm btn-primary';
  200. $btn_voltar = $this->form->addAction('VOLTAR',new TAction(array('ComprasList','onReload')),'far:arrow-alt-circle-left white');
  201. $btn_voltar->class = 'btn btn-sm btn-danger';
  202. //BOTÃO PARA GERAR PDF
  203. $btn_print = $this->form->addAction('RECIBO COMPRA', new TAction(array($this, 'OnPDF')),'far:arrow-alt-circle-left white');
  204. $btn_print->class = 'btn btn-sm btn-secondary';
  205. //BOTÃO FINALIZAR
  206. //$btn_finaliza = $this->form->addAction('FINALIZA', new TAction(array($this, 'onConfirma')),'far:arrow-alt-circle-left white');
  207. //$btn_finaliza->class = 'btn btn-sm btn-secondary';
  208. // create the page container
  209. $container = new TVBox;
  210. $container->style = 'width: 100%';
  211. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  212. $container->add(TBreadCrumb::create(['COMPRAS', 'REGISTRO DE COMPRA']));
  213. $container->add($this->form);
  214. parent::add($container);
  215. }
  216. public function mostrar( $object )
  217. {
  218. if ($object->finalizada == 1)
  219. {
  220. return TRUE;
  221. }
  222. return FALSE;
  223. }
  224. /**
  225. * Clear form
  226. * @param $param URL parameters
  227. */
  228. public function onClear($param)
  229. {
  230. $this->form->clear(TRUE);
  231. }
  232. /**
  233. * Add detail item
  234. * @param $param URL parameters
  235. */
  236. public function onDetailAdd( $param )
  237. {
  238. try
  239. {
  240. $this->form->validate();
  241. $data = $this->form->getData();
  242. (new TRequiredValidator)->validate("Tipo de Compra", $data->detail_tipo_compra_id);
  243. (new TRequiredValidator)->validate("Kilate do Produto", $data->detail_kilate_id);
  244. (new TRequiredValidator)->validate("Quantidade", $data->detail_quantidade);
  245. (new TRequiredValidator)->validate("Unidade", $data->detail_unidade);
  246. (new TRequiredValidator)->validate("Produto", $data->detail_descricao);
  247. $uniqid = !empty($data->detail_uniqid) ? $data->detail_uniqid : uniqid();
  248. $grid_data = [];
  249. $grid_data['uniqid'] = $uniqid;
  250. $grid_data['id_automatico'] = $data->detail_id_automatico;
  251. $grid_data['quantidade'] = $data->detail_quantidade;
  252. $grid_data['descricao'] = $data->detail_descricao;
  253. $grid_data['unidade'] = $data->detail_unidade;
  254. $grid_data['valor_unit'] = $data->detail_valor_unit;
  255. $grid_data['subtotal'] = $data->detail_subtotal;
  256. $grid_data['tipo_compra_id'] = $data->detail_tipo_compra_id;
  257. $grid_data['tipo_compra_txt'] = $data->detail_tipo_compra_txt;
  258. $grid_data['kilate_id'] = $data->detail_kilate_id;
  259. $grid_data['kilate_txt'] = $data->detail_kilate_txt;
  260. $grid_data['loja_sub_id'] = $data->loja_id;
  261. $grid_data['loja_sub_txt'] = $data->loja_txt;
  262. $grid_data['vendedor_sub_id'] = $data->vendedor_id;
  263. $grid_data['vendedor_sub_txt'] = $data->vendedor_txt;
  264. // insert row dynamically
  265. $row = $this->detail_list->addItem( (object) $grid_data );
  266. $row->id = $uniqid;
  267. TDataGrid::replaceRowById('ComprasSub_list', $uniqid, $row);
  268. // clear detail form fields
  269. $data->detail_uniqid = '';
  270. $data->detail_id_automatico = '';
  271. $data->detail_quantidade = '';
  272. $data->detail_descricao = '';
  273. $data->detail_unidade = '';
  274. $data->detail_valor_unit = '';
  275. $data->detail_subtotal = '';
  276. $data->detail_tipo_compra_id = '';
  277. $data->detail_tipo_compra_txt = '';
  278. $data->detail_kilate_id = '';
  279. $data->detail_kilate_txt = '';
  280. $data->detail_loja_sub_id = '';
  281. $data->detail_loja_sub_txt = '';
  282. $data->detail_vendedor_sub_id = '';
  283. $data->detail_vendedor_sub_txt = '';
  284. // send data, do not fire change/exit events
  285. TForm::sendData( 'form_Compras', $data, false, false );
  286. }
  287. catch (Exception $e)
  288. {
  289. $this->form->setData( $this->form->getData());
  290. new TMessage('error', $e->getMessage());
  291. }
  292. }
  293. /**
  294. * Edit detail item
  295. * @param $param URL parameters
  296. */
  297. public static function onDetailEdit( $param )
  298. {
  299. $data = new stdClass;
  300. $data->detail_uniqid = $param['uniqid'];
  301. $data->detail_id_automatico = $param['id_automatico'];
  302. $data->detail_quantidade = $param['quantidade'];
  303. $data->detail_descricao = $param['descricao'];
  304. $data->detail_unidade = $param['unidade'];
  305. $data->detail_valor_unit = $param['valor_unit'];
  306. $data->detail_subtotal = $param['subtotal'];
  307. $data->detail_tipo_compra_id = $param['tipo_compra_id'];
  308. $data->detail_tipo_compra_txt = $param['tipo_compra_txt'];
  309. $data->detail_kilate_id = $param['kilate_id'];
  310. $data->detail_kilate_txt = $param['kilate_txt'];
  311. $data->detail_loja_sub_id = $param['detail_loja_sub_id'];
  312. $data->detail_loja_sub_txt = $param['detail_loja_sub_txt'];
  313. $data->detail_vendedor_sub_id = $param['detail_vendedor_sub_id'];
  314. $data->detail_vendedor_sub_txt = $param['detail_vendedor_sub_txt'];
  315. // send data, do not fire change/exit events
  316. TForm::sendData( 'form_Compras', $data, false, false );
  317. }
  318. /**
  319. * Delete detail item
  320. * @param $param URL parameters
  321. */
  322. public static function onDetailDelete( $param )
  323. {
  324. // clear detail form fields
  325. $data = new stdClass;
  326. $data->detail_uniqid = '';
  327. $data->detail_id_automatico = '';
  328. $data->detail_quantidade = '';
  329. $data->detail_descricao = '';
  330. $data->detail_unidade = '';
  331. $data->detail_valor_unit = '';
  332. $data->detail_subtotal = '';
  333. $data->detail_tipo_compra_id = '';
  334. $data->detail_tipo_compra_txt = '';
  335. $data->detail_kilate_id = '';
  336. $data->detail_kilate_txt = '';
  337. $data->detail_loja_sub_id = '';
  338. $data->detail_loja_sub_txt = '';
  339. $data->detail_vendedor_sub_id = '';
  340. $data->detail_vendedor_sub_txt = '';
  341. // send data, do not fire change/exit events
  342. TForm::sendData( 'form_Compras', $data, false, false );
  343. // remove row
  344. TDataGrid::removeRowById('ComprasSub_list', $param['uniqid']);
  345. }
  346. /**
  347. * Load Master/Detail data from database to form
  348. */
  349. public function onEdit($param)
  350. {
  351. try
  352. {
  353. TTransaction::open('ourorio');
  354. if (isset($param['key']))
  355. {
  356. $key = $param['key'];
  357. $object = new Compras($key);
  358. //Bloquear campos de acordo com o Status
  359. if ($object->finalizada=='0')
  360. {
  361. TDate::enableField('form_Compras', 'data_compra');
  362. TDBCombo::enableField('form_Compras', 'cliente_id');
  363. ">TDBSeekButton::enableField('form_Compras', 'cliente_id');
  364. TButton::enableField('form_Compras', 'btn_limpar');
  365. TButton::enableField('form_Compras', 'btn_salvar');
  366. }
  367. if ($object->finalizada=='1')
  368. {
  369. TDate::disableField('form_Compras', 'data_compra');
  370. TDBCombo::disableField('form_Compras', 'cliente_id');
  371. TButton::disableField('form_Compras', 'btn_limpar');
  372. TButton::disableField('form_Compras', 'btn_salvar');
  373. }
  374. $items = ComprasSub::where('compra_id', '=', $key)->load();
  375. foreach( $items as $item )
  376. {
  377. $item->uniqid = uniqid();
  378. $row = $this->detail_list->addItem( $item );
  379. $row->id = $item->uniqid;
  380. }
  381. $this->form->setData($object);
  382. TTransaction::close();
  383. }
  384. else
  385. {
  386. $this->form->clear(TRUE);
  387. }
  388. }
  389. catch (Exception $e) // in case of exception
  390. {
  391. new TMessage('error', $e->getMessage());
  392. TTransaction::rollback();
  393. }
  394. }
  395. /**
  396. * Save the Master/Detail data from form to database
  397. */
  398. public function onSave($param)
  399. {
  400. try
  401. {
  402. // open a transaction with database
  403. TTransaction::open('ourorio');
  404. $data = $this->form->getData();
  405. $this->form->validate();
  406. $master = new Compras;
  407. $master->fromArray( (array) $data);
  408. $master->store();
  409. ComprasSub::where('compra_id', '=', $master->id_compra)->delete();
  410. if( $param['ComprasSub_list_quantidade'] )
  411. {
  412. foreach( $param['ComprasSub_list_quantidade'] as $key => $item_id )
  413. {
  414. $detail = new ComprasSub;
  415. $detail->quantidade = $param['ComprasSub_list_quantidade'][$key];
  416. $detail->descricao = $param['ComprasSub_list_descricao'][$key];
  417. $detail->unidade = $param['ComprasSub_list_unidade'][$key];
  418. $detail->valor_unit = $param['ComprasSub_list_valor_unit'][$key];
  419. $detail->tipo_compra_id = $param['ComprasSub_list_tipo_compra_id'][$key];
  420. $detail->tipo_compra_txt = $param['ComprasSub_list_tipo_compra_txt'][$key];
  421. $detail->kilate_id = $param['ComprasSub_list_kilate_id'][$key];
  422. $detail->kilate_txt = $param['ComprasSub_list_kilate_txt'][$key];
  423. $detail->loja_sub_id = $param['ComprasSub_list_loja_sub_id'][$key];
  424. $detail->loja_sub_txt = $param['ComprasSub_list_loja_sub_txt'][$key];
  425. $detail->vendedor_sub_id = $param['ComprasSub_list_vendedor_sub_id'][$key];
  426. $detail->vendedor_sub_txt = $param['ComprasSub_list_vendedor_sub_txt'][$key];
  427. $detail->compra_id = $master->id_compra;
  428. $detail->subtotal = ($detail->quantidade * $detail->valor_unit);
  429. $master->valor_total += $detail->subtotal;
  430. $detail->store();
  431. }
  432. }
  433. //FINALIZAR A VENDA
  434. $master->finalizada = 1;
  435. $master->store();
  436. TTransaction::close(); // close the transaction
  437. TForm::sendData('form_Compras', (object) ['id' => $master->id_compra]);
  438. TToast::show('show','COMPRA GRAVADA COM SUCESSO!', 'center', 'fas fa-check');
  439. AdiantiCoreApplication::loadPage( 'ComprasList' );
  440. exit;
  441. }
  442. catch (Exception $e) // in case of exception
  443. {
  444. new TMessage('error', $e->getMessage());
  445. $this->form->setData( $this->form->getData() ); // keep form data
  446. TTransaction::rollback();
  447. }
  448. }
  449. public function OnPDF($param)
  450. {
  451. // open a transaction with database 'samples'
  452. TTransaction::open('ourorio');
  453. // load all customers
  454. $repository = new TRepository('ComprasSub');
  455. $criteria = new TCriteria;
  456. $ComprasSub = $repository->load($criteria);
  457. $data = $this->form->getData('ComprasSub');
  458. $this->form->validate();
  459. $pdf = new TPDFDesigner;
  460. $pdf->fromXml('app/reports/recibo_compra_cliente.pdf.xml');
  461. // cabeçalho
  462. $pdf->replace('{id_compra}',$data->id_compra);
  463. $pdf->replace('{data_compra}',DateTime::createFromFormat('Y-m-d', $data->data_compra)->format( 'd/m/Y' ));
  464. $pdf->replace('{cliente_txt}',utf8_decode($data->cliente_txt));
  465. $pdf->replace('{endereco_tipo}',utf8_decode($data->cliente_endereco_tipo), 0, 0, 'L');
  466. $pdf->replace('{endereco_numero}',utf8_decode($data->cliente_endereco_numero), 0, 0, 'L');
  467. $pdf->replace('{endereco}',utf8_decode($data->cliente_endereco), 0, 0, 'L');
  468. $pdf->replace('{bairro}',utf8_decode($data->cliente_bairro), 0, 0, 'L');
  469. $pdf->replace('{cpf}',utf8_decode($data->cliente_cpf), 0, 0, 'L');
  470. $pdf->replace('{identidade}',utf8_decode($data->cliente_identidade), 0, 0, 'L');
  471. $pdf->replace('{telefone}',utf8_decode($data->cliente_telefone), 0, 0, 'L');
  472. $pdf->replace('{nascimento}',DateTime::createFromFormat('Y-m-d', $data->cliente_nascimento)->format( 'd/m/Y' ));
  473. $pdf->replace('{cidade}',utf8_decode($data->cliente_cidade), 0, 0, 'L');
  474. $pdf->replace('{estado}',utf8_decode($data->cliente_estado), 0, 0, 'L');
  475. $pdf->replace('{email}',utf8_decode($data->cliente_email), 0, 0, 'L');
  476. $pdf->replace('{vendedor_txt}',utf8_decode($data->vendedor_txt));
  477. $pdf->replace('{loja_txt}',utf8_decode($data->loja_txt));
  478. $pdf->replace('{loja_id}',utf8_decode($data->loja_id));
  479. $pdf->generate();
  480. $fill = TRUE;
  481. // Itens do Pedido
  482. $tot = 0; // acrescentei aqui
  483. foreach ($ComprasSub as $pedido_list)
  484. {
  485. if($pedido_list->compra_id == $data->id_compra) // alterei aqui para testar
  486. {
  487. $pdf->gotoAnchorX('detalhes');
  488. $pdf->Ln(20);
  489. $pdf->Cell(50, 12, utf8_decode($pedido_list->quantidade), 0, 0, 'R');
  490. $pdf->Cell(25, 12, utf8_decode($pedido_list->unidade), 0, 0, 'R');
  491. $pdf->Cell(100, 12, utf8_decode($pedido_list->descricao), 0, 0, 'L');
  492. $pdf->Cell(170, 12, utf8_decode($pedido_list->kilate_txt), 0, 0, 'R');
  493. $pdf->Cell(50, 12, utf8_decode($pedido_list->tipo_compra_txt), 0, 0, 'R');
  494. $pdf->Cell(115, 12, number_format((double)$pedido_list->valor_unit, 2, ',', '.'), 0, 0, 'R');
  495. $pdf->Cell(70, 12, number_format((double)$pedido_list->subtotal, 2, ',', '.'), 0, 0, 'R');
  496. $tot = $tot + $pedido_list->subtotal; // acrescentei aqui
  497. // grid background
  498. $fill = !$fill;
  499. }
  500. }
  501. $pdf->Ln(4);
  502. $pdf->SetX(18);
  503. $pdf->Cell(570, 14, utf8_decode(""),'B','R', $fill);
  504. $pdf->Ln(20);
  505. $pdf->SetX(50);
  506. $pdf->Cell(530, 14, utf8_decode("Total R$ ". number_format((double)$tot, 2, ',', '.')),0,0,'R'); // acrescentei aqui
  507. $pdf->Ln(50);
  508. $pdf->SetX(18);
  509. $pdf->MultiCell(560, 14, utf8_decode(" Eu, ". utf8_decode($data->cliente_txt) . ", declaro, para todos os fins, de direito e sob as penas da Lei 12.683 de * de julho de 2012 e artigos 155, 156 e 157 todos do Código Penal Brasileiro, em todas as esferas,em juízo ou fora dele, ser o(a) legítimo(a) Proprietário(a) do(s) objeto(s) e/ou ouro velho que, no presente ato vendo a Quality Serviços e Comércio de Metais Preciosos Ltda, declarando ainda que não transfiro em caráter absoluto nenhuma de minhas responsabilidades a referida empresa quanto a procedência, descrição e autenticidade do(s) objeto(s) e/ou ouro velho o(s) qual(is) foi(ram) por mim legalmente adquirido(s) e está(ão) livre(s) e desembaraçada(s) de quaisquer ônus ou pendência(s).
  510. Respondo sempre e, em quaisquer circunstâncias, pelos termos desta Declaração a qual assino em via única."),0,'J', $fill);
  511. $pdf->Ln(200);
  512. $pdf->SetX(20);
  513. $pdf->Cell(560, 14,DateTime::createFromFormat('Y-m-d', $data->data_compra)->format( 'd' ). ' de ' .DateTime::createFromFormat('Y-m-d', $data->data_compra)->format( 'M' ). ' de ' .DateTime::createFromFormat('Y-m-d', $data->data_compra)->format( 'Y' ),0,0,'L');
  514. // inicio do rodapé
  515. $pdf->SetY(-25);
  516. $pdf->SetFont('Arial', '', 8);
  517. $pdf->setFontColorRGB( '#000000' );
  518. $pdf->Cell(590, 10, utf8_decode('Pág. ').$pdf->PageNo().' de {nb}',0,0,'R');
  519. $pdf->SetY(-25);
  520. $pdf->Cell(140, 10, utf8_decode('Sistema Gestor OuroRio © 2021 '),0,0,'R');
  521. $pdf->SetY(-25);
  522. $pdf->Cell(340,10,utf8_decode("Impresso em ".date("d/m/Y H:i:s"."")),0,1,'R');
  523. $pdf->SetY(-25);
  524. $pdf->Cell(420,10,utf8_decode(" Por ".TSession::getValue('username')),0,1,'R'); //nome do usuário
  525. // fim do rodapé
  526. $file="app/output/Recibo - ".$data->loja_txt.".pdf";
  527. if (!file_exists($file) OR is_writable($file))
  528. {
  529. $pdf->save($file);
  530. //Abrir PDF em Janela Modal dentro do Sistema
  531. $window = TWindow::create($data->loja_txt, 0.8, 0.8);
  532. $object = new TElement('object');
  533. $object->data = $file;
  534. $object->type = 'application/pdf';
  535. $object->style = "width: 100%; height:calc(100% - 10px)";
  536. $window->add($object);
  537. $window->show();
  538. }
  539. else
  540. {
  541. throw new Exception(_t('Permission denied') . ': ' . $file);
  542. }
  543. TToast::show('success','RECIBO GERADO COM SUCESSO!', 'top left', 'fas fa-check');
  544. TTransaction::close();
  545. AdiantiCoreApplication::loadPage( 'ComprasList' );
  546. exit;
  547. }
  548. // CÓDIGO PARA PASSAR DADOS DO CLIENTE AOS CAMPOS
  549. public static function onExitCliente($param)
  550. {
  551. $cliente_id = $param['cliente_id']; // get the product code
  552. try
  553. {
  554. TTransaction::open('ourorio');
  555. $cliente = new Clientes($cliente_id); // reads the product
  556. $obj = new StdClass;
  557. $obj->cliente_cep = ($cliente->cep);
  558. $obj->cliente_endereco_tipo = ($cliente->endereco_tipo);
  559. $obj->cliente_endereco = ($cliente->endereco);
  560. $obj->cliente_endereco_numero = ($cliente->endereco_numero);
  561. $obj->cliente_bairro = ($cliente->bairro);
  562. $obj->cliente_cidade = ($cliente->cidade);
  563. $obj->cliente_estado = ($cliente->estado);
  564. $obj->cliente_telefone = ($cliente->telefone);
  565. $obj->cliente_nascimento = ($cliente->data_nascimento);
  566. $obj->cliente_identidade = ($cliente->identidade);
  567. $obj->cliente_email = ($cliente->email);
  568. $obj->cliente_cpf = ($cliente->cpf);
  569. TTransaction::close();
  570. TForm::sendData('form_Compras', $obj);
  571. }
  572. catch (Exception $e)
  573. {
  574. new TMessage('error', $e->getMessage());
  575. $this->form->setData( $this->form->getData() ); // keep form data
  576. TTransaction::rollback();
  577. }
  578. }
  579. // CÓDIGO PARA PASSAR VALORES DO COMBO KILATE AO CAMPO VALOR UNITÁRIO E DESCRIÇÃO
  580. public static function onChangeKilate($param)
  581. {
  582. $detail_kilate_id = $param['detail_kilate_id']; // get the product code
  583. try
  584. {
  585. TTransaction::open('ourorio');
  586. $kilate = new ComprasKilate($detail_kilate_id); // reads the product
  587. $obj = new StdClass;
  588. $obj->detail_valor_unit = number_format($kilate->valor_unit, 2, ',', '.');
  589. $obj->detail_kilate_txt = utf8_decode($kilate->descricao_kilate);
  590. // CÁLCULO DO PRODUTO
  591. $detail_quantidade = (double) str_replace(['.', ','], ['', '.'], $param['detail_quantidade']);
  592. $obj->detail_subtotal = number_format($kilate->valor_unit * $detail_quantidade, 2, ',', '.');
  593. TScript::create('setTimeout(function() { $("input[name=\'detail_quantidade\']").focus() }, 500);');
  594. TTransaction::close();
  595. TForm::sendData('form_Compras', $obj);
  596. }
  597. catch (Exception $e)
  598. {
  599. new TMessage('error', $e->getMessage());
  600. $this->form->setData( $this->form->getData() ); // keep form data
  601. TTransaction::rollback();
  602. }
  603. }
  604. // CÓDIGO PARA CALCULAR VALOR TOTAL DOS PRODUTOS
  605. public static function onUpdateTotal($param)
  606. {
  607. $detail_valor_unit = (double) str_replace(['.', ','], ['', '.'], $param['detail_valor_unit']);
  608. $detail_quantidade = (double) str_replace(['.', ','], ['', '.'], $param['detail_quantidade']);
  609. $obj = new StdClass;
  610. $obj->detail_subtotal = number_format( ($detail_valor_unit * $detail_quantidade), 2, ',', '.');
  611. TForm::sendData('form_Compras', $obj);
  612. }
  613. // CÓDIGO PARA PASSAR VALORES DO COMBO TIPO DE COMPRA AO CAMPO DO DETALHE
  614. public static function onChangeTipoCompra($param)
  615. {
  616. $detail_tipo_compra_id = $param['detail_tipo_compra_id']; // get the product code
  617. try
  618. {
  619. TTransaction::open('ourorio');
  620. $tipo_compraId = new ComprasTipo($detail_tipo_compra_id); // reads the product
  621. $obj = new StdClass;
  622. $obj->detail_tipo_compra_txt = ($tipo_compraId->descricao);
  623. TScript::create('setTimeout(function() { $("input[name=\'detail_kilate_id\']").focus() }, 500);');
  624. TTransaction::close();
  625. TForm::sendData('form_Compras', $obj);
  626. }
  627. catch (Exception $e)
  628. {
  629. new TMessage('error', $e->getMessage());
  630. $this->form->setData( $this->form->getData() ); // keep form data
  631. TTransaction::rollback();
  632. }
  633. }
  634. public static function onConfirma($param)
  635. {
  636. $action = new TAction(array(__CLASS__, 'ConfirmarCompra'));
  637. $action->setParameters($param);
  638. new TQuestion('Confirma os Dados da Compra ?', $action);
  639. }
  640. public static function ConfirmarCompra( $param )
  641. {
  642. try
  643. {
  644. TTransaction::open('ourorio');
  645. $repository = new TRepository('Compras');
  646. TToast::show('show','COMPRA REGISTRADA COM SUCESSO!', 'center', 'fas fa-check');
  647. AdiantiCoreApplication::loadPage( 'ComprasList' );
  648. //TPage::openFile('app/output/Recibo.pdf');
  649. TTransaction::close();
  650. }
  651. catch (Exception $e)
  652. {
  653. new TMessage('error', 'Error ' . $e->getMessage());
  654. TTransaction::rollback();
  655. }
  656. }
  657. }
  658. ?>

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 (24)


MG

Veja este artigo:

https://www.adianti.com.br/forum/pt/view_572?acentos-utf-8
CM

Marcelo já havia visto este post.
Como o próprio Pablo explicou que nas próximas versões ja viria corrigido.

E este post é de 2013.

Não resolve, inclusive a classe TConnection já está desta forma.

Esse meu problema só acontece no detalhe. O mestre está correto.
MG

Verificou o charset/collation do banco/tabela?
CM

Uso:

Charset: utf8mb4
Collation:utf8mb4_general_ci
MG

Veja se este artigo pode ajudar?
https://pt.stackoverflow.com/questions/72139/qual-codifica%C3%A7%C3%A3o-de-caracteres-collation-devo-usar-em-mysql
NR

Qual a versão do Adianti? Se não me engano, esse problema ocorria ao adicionar um item de forma estática na grid, mas foi corrigido na última versão.
CM

Oi Nataniel. Estou com a última mais atualizada. Studio: 5
Framework: 7
NR

A última versão do Studio é a 7.0.0 e a do framework é a 7.3.0
CM

Eu enviei pelo telefone. Mas as minhas versões são essas mesmas Nataniel.
Studio: 7.0.0
Framework: 7.3.0
CM

Marcelo, já havia lido este site.
Fiz a modificação, mas não adiantou.
MG

Claudio
Se o Nataniel ( que é um dos adm do Fw) não conseguiu te ajudar!!!
Aqui comigo isso não ocorre.
O meu studio está usando a última versão do FW e meus projetos também e não tive problemas.
Não sei como ajudar mais.

CM

Imagino Marcelo. Sei que o Nataniel é o fera do FW.
Obrigado pela ajuda.
Vou me virar aqui.
Abraço
CM

Nataniel, será que haveria possibilidade de ver se o Pablo pode ajudar?
Rapaz, só falta isso pra terminar meu sistema, tenho que entregar ao Cliente semana que vem e não consigo resolver esse problema.
Até aqui não encontrei nada que ajude.
Obrigado.
B

Cláudio,

Já tentou apelar para como converter a string
 
  1. <?php
  2. if ( mb_detect_encoding($string, 'UTF-8', true)!='UTF-8' ){
  3. //$string= iconv('ISO-8859-1', 'UTF-8', $string);
  4. $string = utf8_encode($string);
  5. //$string = mb_convert_encoding($string, 'UTF-8');
  6. }
  7. ?>


Pelo que vc já está ultima versão do FrameWork e o banco já está em UTF-8. A minha sugestão é algo meio tentativa e erro.
CM

Boa tarde Bjverde.
Poderia explicar como e onde aplico esse código?
Sou novato. Rsrs
Obrigado
B

Cláudio vc tentar fazer setTransformer


 
  1. <?php
  2. $descricao = $this->detail_list->addColumn( new TDataGridColumn('descricao', 'Descrição', 'left', 100) );
  3. $formatDescricaoString = function($value) {
  4. if ( mb_detect_encoding($value, 'UTF-8', true)!='UTF-8' ){
  5. //$value= iconv('ISO-8859-1', 'UTF-8', $value);
  6. $value = utf8_encode($value);
  7. //$value = mb_convert_encoding($value, 'UTF-8');
  8. }
  9. return $value;
  10. };
  11. $descricao->setTransformer($formatDescricaoString);
  12. ?>
CM

Nada feito irmão. Fica na mesma.
É incrível como um problema ocorre e não temos a quem recorrer a não ser os amigos do fórum. Não existe suporte.
O próprio Pablo não dá nem as caras no fórum pra ajudar as pessoas, sei que ele não tem obrigação e muito menos tempo pra isso.
Mas acho que em certos momentos deveria aparecer pra dá uma luz.
Estou encrencado em um problema que é do próprio framework e não consigo resolver, até no grupo do Telegram a galera está tentando ajudar.
Lamentável.
NR

Cole aqui a função ttable_replace_row_by_id do arquivo lib/adianti/include/ttable/ttable.js, quero ver um detalhe.
CM

Oi Nataniel, segue.

 
  1. <?php
  2. function ttable_replace_row_by_id(table_id, id, row)
  3. {
  4. if ($('#' + table_id + ' tbody').find('#'+id).length > 0) {
  5. $('#' + table_id + ' tbody').find('#'+id).replaceWith(atob(row));
  6. }
  7. else {
  8. $('#' + table_id + ' tbody').append(atob(row));
  9. }
  10. ?>
NR

Você deve estar rodando a versão 7.0 do Framework, a partir da 7.1 essa função foi modificada.

Como você criou o projeto? Baixou o Studio e criou um novo projeto? Se sim, a versão padrão do framework que vem com o Studio é a 7.0.

Para atualizar a base de códigos para os próximos projetos criados com o Studio, veja o link abaixo:
https://www.adianti.com.br/forum/pt/view_6407?dica-em-video-como-atualizar-na-ad

Para atualizar projetos já existentes:
https://www.adianti.com.br/framework-migration
CM

Versão atualizada para 7.1, mas não resolveu o problema.

Segue o código modificado após a atualização.

 
  1. <?php
  2. function ttable_replace_row_by_id(table_id, id, row)
  3. {
  4. if ($('#' + table_id + ' tbody').find('#'+id).length > 0) {
  5. $('#' + table_id + ' tbody').find('#'+id).replaceWith(base64_decode(row));
  6. }
  7. else {
  8. $('#' + table_id + ' tbody').append(base64_decode(row));
  9. }
  10. ?>
B

Cláudio,

Baixa um versão limpa do Adianti 7.3 (só frame work, sem o template) e testa só essa tela com mestra detalhe. Para ver se resolve o problema
CM

O que você diz com versão limpa?
Baixar uma nova versão do Framerork 7.3?
Vou fazer isso amanhã.
Hoje estou morto.
Me inscrevi no seu canal hoje hein!!
Obrigado irmão.
CM

Bjverde boa tarde.
Não adiantou. Tudo na mesma irmão.
Que coisa isso, não é possível que um problema desse não tenha solução.