Pegar dados do Item via Array Boa noite pessoal. Gostaria de uma ajuda, estou precisando pegar os dados de um Mestre Detalhe para complementar Nota Fiscal, já consigo pegar os dados do Mestre, mas não consigo pegar os itens, ocorre sempre o mesmo erro. Segue o código: ...
CM
Pegar dados do Item via Array  
Boa noite pessoal.

Gostaria de uma ajuda, estou precisando pegar os dados de um Mestre Detalhe para complementar Nota Fiscal, já consigo pegar os dados do Mestre, mas não consigo pegar os itens, ocorre sempre o mesmo erro.

Segue o código:

 
  1. <?php
  2. TTransaction::open('ourorio');
  3. $items = ComprasSub::where('compra_id', '=', $key)->load(); // O ERRO OCORRE SEMPRE NESTA LINHA, SEI QUE FALTA ALGO, MAS NÃO CONSEGUI IDENTIFICAR.
  4. foreach($items as $key => $itemCompra) {
  5. $item = array(
  6. "numero_item" => strval($key + 1),
  7. "codigo_produto" => $itemCompra->codigo,
  8. "descricao" => $itemCompra->descricao,
  9. "codigo_ncm" => $item->codigo_ncm,
  10. "cfop" => $item->cfop,
  11. "unidade_comercial" => $item->unidade,
  12. "quantidade_comercial" => $item->quantidade,
  13. "valor_unitario_comercial" => $item->valor_unit,
  14. "valor_bruto" => $item->subtotal,
  15. "unidade_tributavel" => $item->unidade,
  16. "quantidade_tributavel" => $item->quantidade,
  17. "valor_unitario_tributavel" => $item->valor_unit,
  18. "origem" => "0",
  19. "inclui_no_total" => "1",
  20. "imposto" => array(
  21. "valor_total_tributos" => 0,
  22. "icms" => array(
  23. "situacao_tributaria" => "102", // meio fixo, ver com o contador
  24. "aliquota_credito_simples" => "0",
  25. "valor_credito_simples" => "0",
  26. "modalidade_base_calculo" => "3",
  27. "valor_base_calculo" => "0.00",
  28. "modalidade_base_calculo_st" => "4",
  29. "aliquota_reducao_base_calculo" => "0.00",
  30. "aliquota" => "0.00",
  31. "aliquota_final" => "0.00",
  32. "valor" => "0.00",
  33. "aliquota_margem_valor_adicionado_st" => "0.00",
  34. "aliquota_reducao_base_calculo_st" => "0.00",
  35. "aliquota_base_calculo_st" => "0.00",
  36. "aliquota_st" => "0.00",
  37. "valor_st" => "0.00"
  38. ),
  39. ?>

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


NR

Qual o erro?
CM

Desculpe Nataniel, não postei o erro.
Vou postar o código completo e informar o erro pra ficar mais fácil entender.
Obrigado

Este é o erro:
 
  1. <?php
  2. Notice: Undefined variable: key in C:\xampp\htdocs\adianti\ourorio\app\control\ourorio\ComprasFormMaster.php on line 950
  3. array(1) {
  4. [0]=>
  5. object(stdClass)#17 (4) {
  6. ["campo"]=>
  7. string(5) "itens"
  8. ["erro"]=>
  9. string(40) "[] - A propriedade itens é obrigatório"
  10. ["descricao"]=>
  11. string(0) ""
  12. ["detalhes"]=>
  13. string(0) ""
  14. }
  15. }
  16. ?>


Aqui o código completo.
 
  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. TButton::disableField('form_Compras', 'btn_recibo_compra');
  10. // creates the form
  11. $this->form = new BootstrapFormBuilder('form_Compras');
  12. $this->form->setFormTitle('REGISTRO COMPRA');
  13. $this->form->setFieldSizes('100%');
  14. // master fields
  15. $id_compra = new TEntry('id_compra');
  16. $data_compra = new TDate('data_compra');
  17. $tipo_compra_txt = new TEntry('tipo_compra_txt');
  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_endereco_complem = new THidden('cliente_endereco_complem');
  31. $cliente_bairro = new THidden('cliente_bairro');
  32. $cliente_cidade = new THidden('cliente_cidade');
  33. $cliente_codigo_municipio = new THidden('cliente_codigo_municipio');
  34. $cliente_estado = new THidden('cliente_estado');
  35. $cliente_telefone = new THidden('cliente_telefone');
  36. $cliente_nascimento = new THidden('cliente_nascimento');
  37. $cliente_identidade = new THidden('cliente_identidade');
  38. $cliente_email = new THidden('cliente_email');
  39. $cliente_cpf = new THidden('cliente_cpf');
  40. $anexo_nf_joia_cliente = new TMultiFile('anexo_nf_joia_cliente');
  41. $vendedor_txt = new TEntry('vendedor_txt');
  42. $vendedor_id = new THidden('vendedor_id');
  43. $loja_id = new TEntry('loja_id');
  44. $loja_id = new THidden('loja_id');
  45. $loja_txt = new TEntry('loja_txt');
  46. $loja_cnpj = new TEntry('loja_cnpj');
  47. $loja_cnpj = new THidden('loja_cnpj');
  48. $movimento_fechado = new TEntry('movimento_fechado');
  49. $movimento_fechado_em = new TDate('movimento_fechado_em');
  50. $valor_total = new TEntry('valor_total');
  51. //Campos Obrigatórios
  52. $cliente_id->addValidation('Id do Cliente', new TRequiredValidator);
  53. $cliente_txt->addValidation('Nome do Cliente', new TRequiredValidator);
  54. $data_compra->addValidation('Data da Compra', new TRequiredValidator);
  55. $valor_total->addValidation('Valor da Compra', new TRequiredValidator);
  56. // máscara Master
  57. $data_compra ->setDatabaseMask('yyyy-mm-dd');
  58. $data_compra ->setMask('dd/mm/yyyy');
  59. $data_compra->setValue(date("Y-m-d"));
  60. $loja_id->setEditable(FALSE);
  61. $loja_txt->setEditable(FALSE);
  62. $vendedor_txt->setEditable(FALSE);
  63. $finalizada->setValue(0);
  64. $loja_id->setValue(TSession::getValue('userunitid')) ; //id da unidade
  65. $loja_txt->setValue(TSession::getValue('userunitname')); //nome da unidade
  66. $loja_cnpj->setValue(TSession::getValue('loja_cnpj')); //cnpj da unidade
  67. $vendedor_txt->setValue(TSession::getValue('username')); //nome do usuário
  68. $vendedor_id->setValue(TSession::getValue('userid'));//id usua
  69. // set sizes Master
  70. $cliente_id->setSize('100%');
  71. $cliente_txt->setSize('100%');
  72. $vendedor_txt->setSize('100%');
  73. $loja_txt->setSize('100%');
  74. // detail fields
  75. $detail_uniqid = new THidden('detail_uniqid');
  76. $detail_id_automatico = new THidden('detail_id_automatico');
  77. $detail_data_compra_sub = new THidden('detail_data_compra_sub');
  78. $detail_loja_sub_id = new THidden('detail_loja_sub_id');
  79. $detail_loja_sub_txt = new THidden('detail_loja_sub_txt');
  80. $detail_vendedor_sub_id = new THidden('detail_vendedor_sub_id');
  81. $detail_vendedor_sub_txt = new THidden('detail_vendedor_sub_txt');
  82. $detail_quantidade = new TEntry('detail_quantidade');
  83. $detail_quantidade = new TNumeric('detail_quantidade', 2, '', '', true);
  84. $detail_unidade = new TEntry('detail_unidade');
  85. $detail_descricao = new TEntry('detail_descricao');
  86. $detail_valor_unit = new TEntry('detail_valor_unit');
  87. $detail_subtotal = new TEntry('detail_subtotal');
  88. $detail_tipo_compra_id = new TDBCombo('detail_tipo_compra_id', 'ourorio', 'ComprasTipo', 'id_tipo_compra', 'descricao','descricao');
  89. $detail_tipo_compra_txt = new TEntry('detail_tipo_compra_txt');
  90. $detail_tipo_compra_txt = new THidden('detail_tipo_compra_txt');
  91. $detail_kilate_id = new TDBCombo('detail_kilate_id', 'ourorio', 'ComprasKilate', 'id_kilate', 'descricao_kilate','descricao_kilate');
  92. $detail_kilate_txt = new TEntry('detail_kilate_txt');
  93. $cfop = new THidden('cfop');
  94. $codigo_ncm = new THidden('codigo_ncm');
  95. $cest = new THidden('cest');
  96. $origem = new THidden('origem');
  97. $detail_subtotal->setEditable(FALSE);
  98. // define ação ao Sair doo Campo
  99. $detail_quantidade->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  100. $detail_valor_unit->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  101. // define ação ao alterar a Combo
  102. $detail_tipo_compra_id->setChangeAction(new TAction(array($this, 'onChangeTipoCompra')));
  103. $detail_kilate_id->setChangeAction(new TAction(array($this, 'onChangeKilate')));
  104. // mascara detalhes
  105. $detail_descricao->forceUpperCase();
  106. $detail_unidade->forceUpperCase();
  107. $detail_unidade->setValue('GR');
  108. $detail_quantidade->setNumericMask(2, ',', '.', true, true);
  109. $detail_valor_unit->setNumericMask(2, ',', '.', true);
  110. $detail_subtotal->setNumericMask(2, ',', '.', true);
  111. $detail_data_compra_sub->setValue(date("Y-m-d"));
  112. $detail_loja_sub_id->setValue($loja_id);
  113. $detail_loja_sub_txt->setValue($loja_txt);
  114. $detail_vendedor_sub_id->setValue($vendedor_id);
  115. $detail_vendedor_sub_txt->setValue($vendedor_txt);
  116. if (!empty($id_compra))
  117. {
  118. $id_compra->setEditable(FALSE);
  119. } else {
  120. $finalizada = 0;
  121. }
  122. // master fields
  123. $row = $this->form->addFields ([new TLabel('Código')], [$id_compra] ,
  124. [new TLabel('Data')], [$data_compra] ,
  125. [new TLabel('Oper.')], [$vendedor_txt],
  126. [new THidden('Loja')], [$loja_txt],
  127. [new THidden('CNPJ')], [$loja_cnpj]);
  128. $row->layout = ['col-sm-1','col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-2','col-sm-0','col-3','col-sm-0','col-0'];
  129. $row = $this->form->addFields( [new TLabel('Anexo N.F. Joia')], [$anexo_nf_joia_cliente],
  130. [new TLabel('ID')], [$cliente_id],
  131. [new TLabel('Cliente')], [$cliente_txt]);
  132. $row->layout = ['col-sm-1', 'col-sm-2','col-sm-1', 'col-sm-2','col-sm-1', 'col-sm-5'];
  133. $row = $this->form->addFields([new THidden('CEP')], [$cliente_cep],
  134. [new THidden('Tipo')], [$cliente_endereco_tipo],
  135. [new THidden('Endereço')], [$cliente_endereco],
  136. [new THidden('Compl')], [$cliente_endereco_complem],
  137. [new THidden('Numero')], [$cliente_endereco_numero],
  138. [new THidden('Bairro')], [$cliente_bairro],
  139. [new THidden('Cidade')], [$cliente_cidade],
  140. [new THidden('Cód. Mun.')], [$cliente_codigo_municipio],
  141. [new THidden('Estado')], [$cliente_estado],
  142. [new THidden('Telefone')], [$cliente_telefone],
  143. [new THidden('Nasc')], [$cliente_nascimento],
  144. [new THidden('Identidade')], [$cliente_identidade],
  145. [new THidden('Email')], [$cliente_email],
  146. [new THidden('CPF')], [$cliente_cpf] );
  147. $row->layout = ['col-sm-1','col-sm-1','col-sm-1','col-sm-1','col-sm-1','col-sm-1','col-sm-1','col-sm-1','col-sm-1','col-sm-1','col-sm-1','col-sm-1','col-sm-1','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'];
  148. $row = $this->form->addFields([new THidden('ID')], [$loja_id] );
  149. $row->layout = ['col-sm-1', 'col-sm-3','col-sm-1', 'col-sm-3','col-sm-1','col-sm-3'];
  150. // detail fields
  151. $this->form->addContent( ['<h4>Item(s) da Compra</h4><hr>'] );
  152. $this->form->addFields( [$detail_uniqid] );
  153. $this->form->addFields( [$detail_id_automatico] );
  154. $row = $this->form->addFields( [new TLabel('Tipo')], [$detail_tipo_compra_id],
  155. [new TLabel('Kilate')], [$detail_kilate_id],
  156. [new TLabel('Quant')], [$detail_quantidade],
  157. [new TLabel('Unidade')], [$detail_unidade] );
  158. $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'];
  159. $row = $this->form->addFields([new THidden('TipoTxt')], [$detail_tipo_compra_txt],
  160. [new THidden('KilateTxt')], [$detail_kilate_txt],
  161. [new THidden('Data Compra')], [$detail_data_compra_sub]);
  162. $row->layout = ['col-sm-1', 'col-sm-2','col-sm-1','col-sm-2','col-sm-1','col-sm-2'];
  163. $row = $this->form->addFields( [new TLabel('Produto')], [$detail_descricao],
  164. [new TLabel('Valor')], [$detail_valor_unit],
  165. [new TLabel('Subtotal')], [$detail_subtotal]);
  166. $row->layout = ['col-sm-1', 'col-sm-5','col-sm-1','col-sm-2','col-sm-1','col-sm-2'];
  167. $btn_add = TButton::create('add', [$this, 'onDetailAdd'], 'Lança Produto', 'fa:plus-circle green');
  168. $btn_add->getAction()->setParameter('static','1');
  169. $this->form->addFields( [], [$btn_add] );
  170. $this->detail_list = new BootstrapDatagridWrapper(new TDataGrid);
  171. $this->detail_list->setId('ComprasSub_list');
  172. $this->detail_list->generateHiddenFields();
  173. $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
  174. // items
  175. $this->detail_list->addColumn( new TDataGridColumn('uniqid', 'Uniqid', 'center') )->setVisibility(false);
  176. $this->detail_list->addColumn( new TDataGridColumn('id_automatico', 'Id', 'center') )->setVisibility(false);
  177. $quant = $this->detail_list->addColumn( new TDataGridColumn('quantidade', 'Quant', 'right', 50) );
  178. $this->detail_list->addColumn( new TDataGridColumn('unidade', 'Unid', 'center', 50) );
  179. $this->detail_list->addColumn( new TDataGridColumn('descricao', 'Descrição', 'left', 100) );
  180. $this->detail_list->addColumn( new TDataGridColumn('tipo_compra_txt', 'Tipo', 'left', 50) );
  181. $this->detail_list->addColumn( new TDataGridColumn('kilate_txt', 'Kilate', 'left', 50) );
  182. $vlr_unit = $this->detail_list->addColumn( new TDataGridColumn('valor_unit', 'Valor Unit', 'right', 50) );
  183. $this->detail_list->addColumn( new TDataGridColumn('loja_sub_id', 'Loja Id', 'left', 100) )->setVisibility(false);
  184. $this->detail_list->addColumn( new TDataGridColumn('loja_sub_txt', 'Loja txt', 'left', 100) )->setVisibility(false);
  185. $this->detail_list->addColumn( new TDataGridColumn('vendedor_sub_id', 'Vendedor id', 'left', 100) )->setVisibility(false);
  186. $this->detail_list->addColumn( new TDataGridColumn('vendedor_sub_txt', 'Vendedor txt', 'left', 100) )->setVisibility(false);
  187. $this->detail_list->addColumn( new TDataGridColumn('tipo_compra_id', 'Tipo Compra Id', 'left', 50))->setVisibility(false);
  188. $this->detail_list->addColumn( new TDataGridColumn('kilate_id', 'Kilate Id', 'left', 50) )->setVisibility(false);
  189. $this->detail_list->addColumn( new TDataGridColumn('data_compra_sub', 'Data Compra', 'left', 50) )->setVisibility(false);
  190. $formula = '={quantidade} * {valor_unit}';
  191. $st = $this->detail_list->addColumn( new TDataGridColumn($formula, 'SubTotal', 'right', 100) );
  192. // definir o método do transformador sobre o Valor
  193. $format_value = function($value) {
  194. if (is_numeric($value))
  195. {
  196. return ' ' . number_format($value, 2, ',', '.');
  197. }
  198. return $value;
  199. };
  200. $st->setTransformer($format_value);
  201. $vlr_unit->setTransformer($format_value);
  202. $quant->setTransformer($format_value);
  203. // detail actions
  204. $btn_edita_item = new TDataGridAction([$this, 'onDetailEdit'] );
  205. //$btn_edita_item->setDisplayCondition( array($this, 'mostrar') );
  206. $btn_edita_item->setFields( ['uniqid', '*'] );
  207. $btn_deleta_item = new TDataGridAction([$this, 'onDetailDelete']);
  208. //$btn_deleta_item->setDisplayCondition( array($this, 'mostrar') );
  209. $btn_deleta_item->setField('uniqid');
  210. // add the actions to the datagrid
  211. $this->detail_list->addAction($btn_edita_item, _t('Edit'), 'fa:edit blue');
  212. $this->detail_list->addAction($btn_deleta_item, _t('Delete'), 'far:trash-alt red');
  213. $this->detail_list->createModel();
  214. $panel = new TPanelGroup;
  215. $panel->add($this->detail_list);
  216. $panel->getBody()->style = 'overflow-x:auto';
  217. $this->form->addContent( [$panel] );
  218. $btn_gravar = $this->form->addAction( 'SALVAR', new TAction([$this, 'onSave'], ['static'=>'1']), 'fa:save white');
  219. $btn_gravar->class = 'btn btn-sm btn-primary';
  220. $btn_voltar = $this->form->addAction('VOLTAR',new TAction(array('ComprasList','onReload')),'far:arrow-alt-circle-left white');
  221. $btn_voltar->class = 'btn btn-sm btn-danger';
  222. Tbutton::disablefield('form_Compras','btn_print');
  223. //BOTÃO PARA GERAR PDF
  224. $btn_print = $this->form->addAction('RECIBO COMPRA', new TAction(array($this, 'OnPDF')),'fa:print white');
  225. $btn_print->class = 'btn btn-sm btn-secondary';
  226. $btn_nfe = $this->form->addAction('GERAR NFe', new TAction(array($this, 'OnNfe')),'fa:print white');
  227. $btn_nfe->class = 'btn btn-sm btn-success';
  228. $btn_cancelar_nfe = $this->form->addAction('CANCELAR NFe', new TAction(array($this, 'OnCancelarNfe')),'fa:print white');
  229. $btn_cancelar_nfe->class = 'btn btn-sm btn-danger';
  230. //BOTÃO FINALIZAR
  231. //$btn_finaliza = $this->form->addAction('FINALIZA', new TAction(array($this, 'onConfirma')),'far:arrow-alt-circle-left white');
  232. //$btn_finaliza->class = 'btn btn-sm btn-secondary';
  233. //Tbutton::disablefield('form_Compras','btn_finaliza');
  234. // create the page container
  235. $container = new TVBox;
  236. $container->style = 'width: 100%';
  237. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  238. $container->add(TBreadCrumb::create(['COMPRAS', 'REGISTRO DE COMPRA']));
  239. $container->add($this->form);
  240. parent::add($container);
  241. }
  242. /**
  243. * Clear form
  244. * @param $param URL parameters
  245. */
  246. public function onClear($param)
  247. {
  248. $this->form->clear(TRUE);
  249. }
  250. /**
  251. * Add detail item
  252. * @param $param URL parameters
  253. */
  254. public function onDetailAdd( $param )
  255. {
  256. try
  257. {
  258. $this->form->validate();
  259. $data = $this->form->getData();
  260. (new TRequiredValidator)->validate("Tipo de Compra", $data->detail_tipo_compra_id);
  261. (new TRequiredValidator)->validate("Kilate do Produto", $data->detail_kilate_id);
  262. (new TRequiredValidator)->validate("Quantidade", $data->detail_quantidade);
  263. (new TRequiredValidator)->validate("Unidade", $data->detail_unidade);
  264. (new TRequiredValidator)->validate("Produto", $data->detail_descricao);
  265. $uniqid = !empty($data->detail_uniqid) ? $data->detail_uniqid : uniqid();
  266. $grid_data = [];
  267. $grid_data['uniqid'] = $uniqid;
  268. $grid_data['id_automatico'] = $data->detail_id_automatico;
  269. $grid_data['data_compra_sub'] = $data->detail_data_compra_sub;
  270. $grid_data['quantidade'] = $data->detail_quantidade;
  271. $grid_data['descricao'] = $data->detail_descricao;
  272. $grid_data['unidade'] = $data->detail_unidade;
  273. $grid_data['valor_unit'] = $data->detail_valor_unit;
  274. $grid_data['subtotal'] = $data->detail_subtotal;
  275. $grid_data['tipo_compra_id'] = $data->detail_tipo_compra_id;
  276. $grid_data['tipo_compra_txt'] = $data->detail_tipo_compra_txt;
  277. $grid_data['kilate_id'] = $data->detail_kilate_id;
  278. $grid_data['kilate_txt'] = $data->detail_kilate_txt;
  279. $grid_data['cfop'] = $data->cfop;
  280. $grid_data['codigo_ncm'] = $data->codigo_ncm;
  281. $grid_data['cest'] = $data->cest;
  282. $grid_data['origem'] = $data->origem;
  283. $grid_data['data_compra_sub'] = $data->data_compra;
  284. $grid_data['loja_sub_id'] = $data->loja_id;
  285. $grid_data['loja_sub_txt'] = $data->loja_txt;
  286. $grid_data['vendedor_sub_id'] = $data->vendedor_id;
  287. $grid_data['vendedor_sub_txt'] = $data->vendedor_txt;
  288. // insert row dynamically
  289. $row = $this->detail_list->addItem( (object) $grid_data );
  290. $row->id = $uniqid;
  291. TDataGrid::replaceRowById('ComprasSub_list', $uniqid, $row);
  292. // clear detail form fields
  293. $data->detail_uniqid = '';
  294. $data->detail_id_automatico = '';
  295. $data->detail_data_compra_sub = '';
  296. $data->detail_quantidade = '';
  297. $data->detail_descricao = '';
  298. $data->detail_unidade = '';
  299. $data->detail_valor_unit = '';
  300. $data->detail_subtotal = '';
  301. $data->detail_tipo_compra_id = '';
  302. $data->detail_tipo_compra_txt = '';
  303. $data->detail_kilate_id = '';
  304. $data->detail_kilate_txt = '';
  305. $data->detail_cfop = '';
  306. $data->detail_codigo_ncm = '';
  307. $data->detail_cest = '';
  308. $data->detail_origem = '';
  309. $data->detail_loja_sub_id = '';
  310. $data->detail_loja_sub_txt = '';
  311. $data->detail_vendedor_sub_id = '';
  312. $data->detail_vendedor_sub_txt = '';
  313. // send data, do not fire change/exit events
  314. TForm::sendData( 'form_Compras', $data, false, false );
  315. }
  316. catch (Exception $e)
  317. {
  318. $this->form->setData( $this->form->getData());
  319. new TMessage('error', $e->getMessage());
  320. }
  321. }
  322. /**
  323. * Edit detail item
  324. * @param $param URL parameters
  325. */
  326. public static function onDetailEdit( $param )
  327. {
  328. $data = new stdClass;
  329. $data->detail_uniqid = $param['uniqid'];
  330. $data->detail_id_automatico = $param['id_automatico'];
  331. $data->detail_quantidade = number_format($param['quantidade'],2,',','.');
  332. $data->detail_descricao = utf8_decode($param['descricao']);
  333. $data->detail_unidade = utf8_decode($param['unidade']);
  334. $data->detail_valor_unit = number_format($param['valor_unit'],2,',','.');
  335. $data->detail_subtotal = number_format($param['subtotal'],2,',','.');
  336. $data->detail_tipo_compra_id = $param['tipo_compra_id'];
  337. $data->detail_tipo_compra_txt = utf8_decode($param['tipo_compra_txt']);
  338. $data->detail_kilate_id = $param['kilate_id'];
  339. $data->detail_kilate_txt = utf8_decode($param['kilate_txt']);
  340. $data->detail_loja_sub_id = $param['loja_sub_id'];
  341. $data->detail_loja_sub_txt = utf8_decode($param['loja_sub_txt']);
  342. $data->detail_vendedor_sub_id = $param['vendedor_sub_id'];
  343. $data->detail_vendedor_sub_txt = utf8_decode($param['vendedor_sub_txt']);
  344. // send data, do not fire change/exit events
  345. TForm::sendData( 'form_Compras', $data, false, false );
  346. }
  347. /**
  348. * Delete detail item
  349. * @param $param URL parameters
  350. */
  351. public static function onDetailDelete( $param )
  352. {
  353. // clear detail form fields
  354. $data = new stdClass;
  355. $data->detail_uniqid = '';
  356. $data->detail_id_automatico = '';
  357. $data->detail_data_compra_sub = '';
  358. $data->detail_quantidade = '';
  359. $data->detail_descricao = '';
  360. $data->detail_unidade = '';
  361. $data->detail_valor_unit = '';
  362. $data->detail_subtotal = '';
  363. $data->detail_tipo_compra_id = '';
  364. $data->detail_tipo_compra_txt = '';
  365. $data->detail_kilate_id = '';
  366. $data->detail_kilate_txt = '';
  367. $data->detail_cfop = '';
  368. $data->detail_codigo_ncm = '';
  369. $data->detail_cest = '';
  370. $data->detail_origemt = '';
  371. $data->detail_loja_sub_id = '';
  372. $data->detail_loja_sub_txt = '';
  373. $data->detail_vendedor_sub_id = '';
  374. $data->detail_vendedor_sub_txt = '';
  375. // send data, do not fire change/exit events
  376. TForm::sendData( 'form_Compras', $data, false, false );
  377. // remove row
  378. TDataGrid::removeRowById('ComprasSub_list', $param['uniqid']);
  379. }
  380. public function onEdit($param)
  381. {
  382. try
  383. {
  384. TTransaction::open('ourorio');
  385. if (isset($param['key']))
  386. {
  387. $key = $param['key'];
  388. $object = new Compras($key);
  389. //Bloquear campos de acordo com o Status
  390. if ($object->finalizada == 0)
  391. {
  392. TDate::enableField('form_Compras', 'data_compra');
  393. TDBCombo::enableField('form_Compras', 'cliente_id');
  394. ">TDBSeekButton::enableField('form_Compras', 'cliente_id');
  395. TButton::enableField('form_Compras', 'btn_limpar');
  396. TButton::enableField('form_Compras', 'btn_salvar');
  397. TButton::disableField('form_Compras', 'btn_recibo_compra');
  398. }
  399. if ($object->finalizada== 1)
  400. {
  401. TDate::disableField('form_Compras', 'data_compra');
  402. TDBCombo::disableField('form_Compras', 'cliente_id');
  403. TButton::disableField('form_Compras', 'btn_limpar');
  404. TButton::disableField('form_Compras', 'btn_salvar');
  405. TButton::enableField('form_Compras', 'btn_recibo_compra');
  406. }
  407. $items = ComprasSub::where('compra_id', '=', $key)->load();
  408. foreach( $items as $item )
  409. {
  410. $item->uniqid = uniqid();
  411. $row = $this->detail_list->addItem( $item );
  412. $row->id = $item->uniqid;
  413. }
  414. $this->form->setData($object);
  415. TTransaction::close();
  416. }
  417. else
  418. {
  419. $this->form->clear(TRUE);
  420. }
  421. }
  422. catch (Exception $e) // in case of exception
  423. {
  424. new TMessage('error', $e->getMessage());
  425. TTransaction::rollback();
  426. }
  427. }
  428. public function onSave($param)
  429. {
  430. try
  431. {
  432. // open a transaction with database
  433. TTransaction::open('ourorio');
  434. $data = $this->form->getData();
  435. $this->form->validate();
  436. $master = new Compras;
  437. $master->fromArray( (array) $data);
  438. $master->store();
  439. ComprasSub::where('compra_id', '=', $master->id_compra)->delete();
  440. if( $param['ComprasSub_list_quantidade'] )
  441. {
  442. foreach( $param['ComprasSub_list_quantidade'] as $key => $item_id )
  443. {
  444. $detail = new ComprasSub;
  445. $detail->quantidade = $param['ComprasSub_list_quantidade'][$key];
  446. $detail->data_compra_sub = $param['ComprasSub_list_data_compra_sub'][$key];
  447. $detail->descricao = utf8_decode($param['ComprasSub_list_descricao'][$key]);
  448. $detail->unidade = utf8_decode($param['ComprasSub_list_unidade'][$key]);
  449. $detail->valor_unit = $param['ComprasSub_list_valor_unit'][$key];
  450. $detail->tipo_compra_id = $param['ComprasSub_list_tipo_compra_id'][$key];
  451. $detail->tipo_compra_txt = utf8_decode($param['ComprasSub_list_tipo_compra_txt'][$key]);
  452. $detail->kilate_id = $param['ComprasSub_list_kilate_id'][$key];
  453. $detail->kilate_txt = utf8_decode($param['ComprasSub_list_kilate_txt'][$key]);
  454. $detail->cfop = utf8_decode($param['ComprasSub_list_cfop'][$key]);
  455. $detail->codigo_ncm = utf8_decode($param['ComprasSub_list_codigo_ncm'][$key]);
  456. $detail->cest = utf8_decode($param['ComprasSub_list_cest'][$key]);
  457. $detail->origem = utf8_decode($param['ComprasSub_list_origem'][$key]);
  458. $detail->loja_sub_id = $param['ComprasSub_list_loja_sub_id'][$key];
  459. $detail->loja_sub_txt = utf8_decode($param['ComprasSub_list_loja_sub_txt'][$key]);
  460. $detail->vendedor_sub_id = $param['ComprasSub_list_vendedor_sub_id'][$key];
  461. $detail->vendedor_sub_txt = utf8_decode($param['ComprasSub_list_vendedor_sub_txt'][$key]);
  462. $detail->compra_id = $master->id_compra;
  463. $detail->subtotal = ($detail->quantidade * $detail->valor_unit);
  464. $master->valor_total += $detail->subtotal;
  465. $detail->store();
  466. }
  467. }
  468. //FINALIZAR A VENDA
  469. $master->finalizada = 1;
  470. $master->loja_id = TSession::getValue('userunitid') ; //id da unidade
  471. $master->loja_txt =TSession::getValue('userunitname'); //nome da unidade
  472. $master->vendedor_txt =TSession::getValue('username'); //nome do usuário
  473. $master->vendedor_id =TSession::getValue('userid');//id usuario
  474. $master->store();
  475. TTransaction::close(); // close the transaction
  476. TForm::sendData('form_Compras', (object) ['id' => $master->id_compra]);
  477. TToast::show('show','COMPRA GRAVADA COM SUCESSO!', 'center', 'fas fa-check');
  478. AdiantiCoreApplication::loadPage( 'ComprasList' );
  479. exit;
  480. //$param["id_compra"]=$master->id_compra;
  481. //$this->OnPDF($param);
  482. }
  483. catch (Exception $e) // in case of exception
  484. {
  485. new TMessage('error', $e->getMessage());
  486. $this->form->setData( $this->form->getData() ); // keep form data
  487. TTransaction::rollback();
  488. }
  489. }
  490. public function OnPDF($param)
  491. {
  492. // open a transaction with database 'samples'
  493. TTransaction::open('ourorio');
  494. // load all customers
  495. $repository = new TRepository('ComprasSub');
  496. $criteria = new TCriteria;
  497. $ComprasSub = $repository->load($criteria);
  498. setlocale(LC_TIME, 'portuguese');
  499. date_default_timezone_set('America/Sao_Paulo');
  500. $data_atual = strftime("%A, %d de %B de %Y", strtotime(date("Y-m-d")));
  501. $data = $this->form->getData('ComprasSub');
  502. $this->form->validate();
  503. $pdf = new TPDFDesigner;
  504. $pdf->fromXml('app/reports/recibo_compra_cliente.pdf.xml');
  505. // cabeçalho
  506. $pdf->replace('{id_compra}',$data->id_compra);
  507. $pdf->replace('{data_compra}',DateTime::createFromFormat('Y-m-d', $data->data_compra)->format( 'd/m/Y' ));
  508. $pdf->replace('{cliente_txt}',utf8_decode($data->cliente_txt));
  509. $pdf->replace('{endereco_tipo}',utf8_decode($data->cliente_endereco_tipo), 0, 0, 'L');
  510. $pdf->replace('{endereco_numero}',utf8_decode($data->cliente_endereco_numero), 0, 0, 'L');
  511. $pdf->replace('{endereco}',utf8_decode($data->cliente_endereco), 0, 0, 'L');
  512. $pdf->replace('{bairro}',utf8_decode($data->cliente_bairro), 0, 0, 'L');
  513. $pdf->replace('{cpf}',utf8_decode($data->cliente_cpf), 0, 0, 'L');
  514. $pdf->replace('{identidade}',utf8_decode($data->cliente_identidade), 0, 0, 'L');
  515. $pdf->replace('{telefone}',utf8_decode($data->cliente_telefone), 0, 0, 'L');
  516. $pdf->replace('{nascimento}',DateTime::createFromFormat('Y-m-d', $data->cliente_nascimento)->format( 'd/m/Y' ));
  517. $pdf->replace('{cidade}',utf8_decode($data->cliente_cidade), 0, 0, 'L');
  518. $pdf->replace('{estado}',utf8_decode($data->cliente_estado), 0, 0, 'L');
  519. $pdf->replace('{email}',utf8_decode($data->cliente_email), 0, 0, 'L');
  520. $pdf->replace('{vendedor_txt}',utf8_decode($data->vendedor_txt));
  521. $pdf->replace('{loja_txt}',utf8_decode($data->loja_txt));
  522. $pdf->replace('{loja_id}',utf8_decode($data->loja_id));
  523. $pdf->generate();
  524. $fill = TRUE;
  525. // Itens do Pedido
  526. $tot = 0; // acrescentei aqui
  527. foreach ($ComprasSub as $pedido_list)
  528. {
  529. if($pedido_list->compra_id == $data->id_compra) // alterei aqui para testar
  530. {
  531. $pdf->gotoAnchorX('detalhes');
  532. $pdf->Ln(20);
  533. $pdf->Cell(50, 12, number_format((double)$pedido_list->quantidade, 2, ',', '.'), 0, 0, 'R');
  534. $pdf->Cell(25, 12, utf8_decode($pedido_list->unidade), 0, 0, 'R');
  535. $pdf->Cell(100, 12, utf8_decode($pedido_list->descricao), 0, 0, 'L');
  536. $pdf->Cell(180, 12, utf8_decode($pedido_list->kilate_txt), 0, 0, 'R');
  537. $pdf->Cell(80, 12, utf8_decode($pedido_list->tipo_compra_txt), 0, 0, 'L');
  538. $pdf->Cell(75, 12, number_format((double)$pedido_list->valor_unit, 2, ',', '.'), 0, 0, 'R');
  539. $pdf->Cell(70, 12, number_format((double)$pedido_list->subtotal, 2, ',', '.'), 0, 0, 'R');
  540. $tot = $tot + $pedido_list->subtotal; // acrescentei aqui
  541. // grid background
  542. $fill = !$fill;
  543. }
  544. }
  545. $pdf->Ln(4);
  546. $pdf->SetX(18);
  547. $pdf->Cell(570, 14, utf8_decode(""),'B','R', $fill);
  548. $pdf->Ln(20);
  549. $pdf->SetX(50);
  550. $pdf->Cell(530, 14, utf8_decode("Total R$ ". number_format((double)$tot, 2, ',', '.')),0,0,'R'); // acrescentei aqui
  551. $pdf->Ln(50);
  552. $pdf->SetX(18);
  553. $pdf->MultiCell(560, 14, utf8_decode(" Eu, ".$data->cliente_txt. ", declaro, para todos os fins, de direito e sob as penas da Lei 12.683 de 9 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 OuroRio Quiosques & Comércio de Metais 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).
  554. Respondo sempre e, em quaisquer circunstâncias, pelos termos desta Declaração a qual assino em via única."),0,'J', $fill);
  555. $pdf->Ln(200);
  556. $pdf->SetX(20);
  557. $pdf->Cell(560, 14,$data_atual);
  558. // inicio do rodapé
  559. $pdf->SetY(-25);
  560. $pdf->SetFont('Arial', '', 8);
  561. $pdf->setFontColorRGB( '#000000' );
  562. $pdf->Cell(590, 10, utf8_decode('Pág. ').$pdf->PageNo().' de {nb}',0,0,'R');
  563. $pdf->SetY(-25);
  564. $pdf->Cell(140, 10, utf8_decode('Sistema Gestor OuroRio © '.date("Y"."")),0,0,'R');
  565. $pdf->SetY(-25);
  566. $pdf->Cell(340,10,utf8_decode("Impresso em ".date("d/m/Y H:i:s"."")),0,1,'R');
  567. $pdf->SetY(-25);
  568. $pdf->Cell(460,10,utf8_decode(" Por ".TSession::getValue('username')),0,1,'R'); //nome do usuário
  569. // fim do rodapé
  570. $file="app/output/Recibo - ".$data->loja_txt.".pdf";
  571. if (!file_exists($file) OR is_writable($file))
  572. {
  573. $pdf->save($file);
  574. //Abrir PDF em Janela Modal dentro do Sistema
  575. $window = TWindow::create($data->loja_txt, 0.8, 0.8);
  576. $object = new TElement('object');
  577. $object->data = $file;
  578. $object->type = 'application/pdf';
  579. $object->style = "width: 100%; height:calc(100% - 10px)";
  580. $window->add($object);
  581. $window->show();
  582. }
  583. else
  584. {
  585. throw new Exception(_t('Permission denied') . ': ' . $file);
  586. }
  587. TForm::sendData('form_Compras',$data);
  588. TToast::show('success','RECIBO GERADO COM SUCESSO!', 'top left', 'fas fa-check');
  589. TTransaction::close();
  590. AdiantiCoreApplication::loadPage( 'ComprasList' );
  591. exit;
  592. }
  593. // CÓDIGO PARA PASSAR DADOS DO CLIENTE AOS CAMPOS
  594. public static function onExitCliente($param)
  595. {
  596. $cliente_id = $param['cliente_id']; // get the product code
  597. try
  598. {
  599. TTransaction::open('ourorio');
  600. $cliente = new Clientes($cliente_id); // reads the product
  601. $obj = new StdClass;
  602. $obj->cliente_cep = ($cliente->cep);
  603. $obj->cliente_endereco_tipo = ($cliente->endereco_tipo);
  604. $obj->cliente_endereco = ($cliente->endereco);
  605. $obj->cliente_endereco_numero = ($cliente->endereco_numero);
  606. $obj->cliente_bairro = ($cliente->bairro);
  607. $obj->cliente_cidade = ($cliente->cidade);
  608. $obj->cliente_codigo_municipio = ($cliente->codigo_municipio);
  609. $obj->cliente_estado = ($cliente->estado);
  610. $obj->cliente_telefone = ($cliente->telefone);
  611. $obj->cliente_nascimento = ($cliente->data_nascimento);
  612. $obj->cliente_identidade = ($cliente->identidade);
  613. $obj->cliente_email = ($cliente->email);
  614. $obj->cliente_cpf = ($cliente->cpf);
  615. TTransaction::close();
  616. TForm::sendData('form_Compras', $obj);
  617. }
  618. catch (Exception $e)
  619. {
  620. new TMessage('error', $e->getMessage());
  621. $this->form->setData( $this->form->getData() ); // keep form data
  622. TTransaction::rollback();
  623. }
  624. }
  625. // CÓDIGO PARA PASSAR VALORES DO COMBO KILATE AO CAMPO VALOR UNITÁRIO E DESCRIÇÃO
  626. public static function onChangeKilate($param)
  627. {
  628. $detail_kilate_id = $param['detail_kilate_id']; // get the product code
  629. try
  630. {
  631. TTransaction::open('ourorio');
  632. $kilate = new ComprasKilate($detail_kilate_id); // reads the product
  633. $obj = new StdClass;
  634. $obj->detail_valor_unit = number_format($kilate->valor_unit, 2, ',', '.');
  635. $obj->detail_kilate_txt = utf8_decode($kilate->descricao_kilate);
  636. // CÁLCULO DO PRODUTO
  637. $detail_quantidade = (double) str_replace(['.', ','], ['', '.'], $param['detail_quantidade']);
  638. $obj->detail_subtotal = number_format($kilate->valor_unit * $detail_quantidade, 2, ',', '.');
  639. TScript::create('setTimeout(function() { $("input[name=\'detail_quantidade\']").focus() }, 200);');
  640. TTransaction::close();
  641. TForm::sendData('form_Compras', $obj);
  642. }
  643. catch (Exception $e)
  644. {
  645. new TMessage('error', $e->getMessage());
  646. $this->form->setData( $this->form->getData() ); // keep form data
  647. TTransaction::rollback();
  648. }
  649. }
  650. // CÓDIGO PARA CALCULAR VALOR TOTAL DOS PRODUTOS
  651. public static function onUpdateTotal($param)
  652. {
  653. $detail_valor_unit = (double) str_replace(['.', ','], ['', '.'], $param['detail_valor_unit']);
  654. $detail_quantidade = (double) str_replace(['.', ','], ['', '.'], $param['detail_quantidade']);
  655. $obj = new StdClass;
  656. $obj->detail_subtotal = number_format( ($detail_valor_unit * $detail_quantidade), 2, ',', '.');
  657. TForm::sendData('form_Compras', $obj);
  658. }
  659. // CÓDIGO PARA PASSAR VALORES DO COMBO TIPO DE COMPRA AO CAMPO DO DETALHE
  660. public static function onChangeTipoCompra($param)
  661. {
  662. $detail_tipo_compra_id = $param['detail_tipo_compra_id']; // get the product code
  663. try
  664. {
  665. TTransaction::open('ourorio');
  666. $tipo_compraId = new ComprasTipo($detail_tipo_compra_id); // reads the product
  667. $obj = new StdClass;
  668. $obj->detail_tipo_compra_txt = utf8_decode($tipo_compraId->descricao);
  669. TScript::create('setTimeout(function() { $("input[name=\'detail_kilate_id\']").focus() }, 200);');
  670. TTransaction::close();
  671. TForm::sendData('form_Compras', $obj);
  672. }
  673. catch (Exception $e)
  674. {
  675. new TMessage('error', $e->getMessage());
  676. $this->form->setData( $this->form->getData() ); // keep form data
  677. TTransaction::rollback();
  678. }
  679. }
  680. public static function onConfirma($param)
  681. {
  682. $action = new TAction(array(__CLASS__, 'ConfirmarCompra'));
  683. $action->setParameters($param);
  684. new TQuestion('Confirma os Dados da Compra ?', $action);
  685. }
  686. public static function ConfirmarCompra( $param )
  687. {
  688. try
  689. {
  690. $nome_loja = TSession::getValue('userunitname');;
  691. TPage::openFile("app/output/Recibo - ".$nome_loja.".pdf");
  692. TToast::show('show','COMPRA REGISTRADA COM SUCESSO!', 'center', 'fas fa-check');
  693. TTransaction::close();
  694. }
  695. catch (Exception $e)
  696. {
  697. new TMessage('error', 'Error ' . $e->getMessage());
  698. TTransaction::rollback();
  699. }
  700. }
  701. public static function enviaAPI($ambiente, $endpoint, $method, $token, $data)
  702. {
  703. $url = "https://hom.api.cloud-dfe.com.br/v1";
  704. if ($ambiente == 1) {
  705. $url = "https://api.cloud-dfe.com.br/v1";
  706. }
  707. $ch = curl_init("{$url}/{$endpoint}");
  708. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  709. curl_setopt($ch, CURLOPT_PORT, 443);
  710. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
  711. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  712. curl_setopt($ch, CURLOPT_HTTPHEADER, [
  713. "Authorization: {$token}",
  714. "Content-Type: application/json"
  715. ]);
  716. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  717. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  718. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
  719. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  720. $resp = curl_exec($ch);
  721. return json_decode($resp);
  722. }
  723. public static function OnNfe( $param )
  724. {
  725. try
  726. {
  727. TTransaction::open('ourorio');
  728. $data = array(
  729. "natureza_operacao" => "VENDA DENTRO DO ESTADO", // fixo
  730. "serie" => "18",
  731. "numero" => "1111225",
  732. "data_emissao" => "2021-09-17T13:00:00-03:00",
  733. "data_entrada_saida" => "2021-09-17T13:00:00-03:00",
  734. "tipo_operacao" => "0", // fixo, 0 = ENTRADA, 1 = SAÍDA
  735. "finalidade_emissao" => "1", // fixo, 1 - Nota normal, 2 - Nota complementar, 3 - Nota de ajuste, 4 - Devolução de mercadoria
  736. "consumidor_final" => "1", // fixo, 0 - Normal, 1 - Consumidor final
  737. "presenca_comprador" => "1", // fixo
  738. "intermediario" => array(
  739. "indicador" => "0" // fixo
  740. ),
  741. "destinatario" => array(
  742. "cpf" => $param['cliente_cpf'],
  743. "nome" => $param['cliente_txt'],
  744. "indicador_inscricao_estadual" => "9",
  745. "inscricao_estadual" => null,
  746. "endereco" => array(
  747. "logradouro" => $param['cliente_endereco'],
  748. "numero" => $param['cliente_endereco_numero'],
  749. "bairro" => $param['cliente_bairro'],
  750. "complemento" => $param['cliente_endereco_complem'],
  751. "codigo_municipio" => $param['cliente_codigo_municipio'],
  752. "nome_municipio" => $param['cliente_cidade'],
  753. "uf" => $param['cliente_estado'],
  754. "cep" => $param['cliente_cep'],
  755. "codigo_pais" => "1058",
  756. "nome_pais" => "BRASIL",
  757. "telefone" => $param['cliente_telefone']
  758. )
  759. ),
  760. "itens" => array(),
  761. "frete" => array(
  762. "modalidade_frete" => "0" // fixo
  763. ),
  764. "pagamento" => array(
  765. "formas_pagamento" => array(
  766. array(
  767. "meio_pagamento" => "01", // 01 - Dinheiro
  768. "valor" => "224.50"
  769. )
  770. )
  771. )
  772. );
  773. TTransaction::open('ourorio');
  774. $items = ComprasSub::where('compra_id', '=', $key)->load();
  775. foreach($items as $key => $itemCompra) {
  776. $item = array(
  777. "numero_item" => strval($key + 1),
  778. "codigo_produto" => $itemCompra->codigo,
  779. "descricao" => $itemCompra->descricao,
  780. "codigo_ncm" => $item->codigo_ncm,
  781. "cfop" => $item->cfop,
  782. "unidade_comercial" => $item->unidade,
  783. "quantidade_comercial" => $item->quantidade,
  784. "valor_unitario_comercial" => $item->valor_unit,
  785. "valor_bruto" => $item->subtotal,
  786. "unidade_tributavel" => $item->unidade,
  787. "quantidade_tributavel" => $item->quantidade,
  788. "valor_unitario_tributavel" => $item->valor_unit,
  789. "origem" => "0",
  790. "inclui_no_total" => "1",
  791. "imposto" => array(
  792. "valor_total_tributos" => 0,
  793. "icms" => array(
  794. "situacao_tributaria" => "102", // meio fixo, ver com o contador
  795. "aliquota_credito_simples" => "0",
  796. "valor_credito_simples" => "0",
  797. "modalidade_base_calculo" => "3",
  798. "valor_base_calculo" => "0.00",
  799. "modalidade_base_calculo_st" => "4",
  800. "aliquota_reducao_base_calculo" => "0.00",
  801. "aliquota" => "0.00",
  802. "aliquota_final" => "0.00",
  803. "valor" => "0.00",
  804. "aliquota_margem_valor_adicionado_st" => "0.00",
  805. "aliquota_reducao_base_calculo_st" => "0.00",
  806. "aliquota_base_calculo_st" => "0.00",
  807. "aliquota_st" => "0.00",
  808. "valor_st" => "0.00"
  809. ),
  810. "pis" => array(
  811. "situacao_tributaria" => "99",
  812. "valor_base_calculo" => 0,
  813. "aliquota" => "0",
  814. "valor" => "0"
  815. ),
  816. "cofins" => array(
  817. "situacao_tributaria" => "99",
  818. "valor_base_calculo" => 0,
  819. "aliquota" => "0",
  820. "valor" => "0"
  821. )
  822. ),
  823. "valor_desconto" => 0,
  824. "valor_frete" => 0,
  825. "valor_seguro" => 0,
  826. "valor_outras_despesas" => 0
  827. );
  828. $data["itens"][] = $item;
  829. }
  830. $ambiente = 2; // 1 = producao, 2 = homologação
  831. //$token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbXAiOjQ1LCJ1c3IiOjE5LCJ0cCI6MiwiaWF0IjoxNTkyODI1MDkwfQ.SmZhXytS1jgYab4BoCOHglFutn-VobYd9693c4pE2Yk";
  832. $token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbXAiOjMwMywidXNyIjoxNTIsInRwIjoyLCJpYXQiOjE2MzIwMDQ2NDd9.AItuUuMVTu5yuN37ayUWljyF-E0RvKzwtFUE_ZkYhbE";
  833. $resp = self::enviaAPI($ambiente, "nfe", "POST", $token, $data);
  834. if ($resp->sucesso) {
  835. sleep(5);
  836. $chave = $resp->chave;
  837. if ($resp->codigo == 5023) {
  838. /**
  839. * Em alguns casos a SEFAZ pode demorar mais do que esperado pela api
  840. * para processar o lote, devido a trafego na rede ou sobrecarga de processamento
  841. * então nesse caso quando vir codigo 5023 é necessario buscar a NFe pela chave de acesso
  842. */
  843. $tentativa = 1;
  844. while ($tentativa <= 5) {
  845. $resp = self::enviaAPI($ambiente, "nfe/{$chave}", "GET", $token, array());
  846. if ($resp->codigo != 5023) {
  847. if ($resp->sucesso) {
  848. // autorizado
  849. var_dump($resp);
  850. $pdf = base64_decode($resp->pdf);
  851. $xml = base64_decode($resp->xml);
  852. break;
  853. } else {
  854. // rejeição
  855. var_dump($resp);
  856. break;
  857. }
  858. }
  859. $tentativa++;
  860. sleep(10);
  861. }
  862. } else {
  863. // autorizado
  864. var_dump($resp);
  865. }
  866. } else if (in_array($resp->codigo, array(5001, 5002))) {
  867. // erro nos campos
  868. var_dump($resp->erros);
  869. } else if ($resp->codigo >= 7000) {
  870. // erro de timout ou de conexão
  871. var_dump($resp);
  872. // recomendamos fazer a consulta pela chave para sincronizar o documento
  873. $resp = self::enviaAPI($ambiente, "nfe/{$resp->chave}", "GET", $token, array());
  874. if ($resp->sucesso) {
  875. // autorizado
  876. var_dump($resp);
  877. } else {
  878. // rejeição
  879. var_dump($resp);
  880. }
  881. } else {
  882. // rejeição
  883. var_dump($resp);
  884. }
  885. TTransaction::close();
  886. }
  887. catch (Exception $e)
  888. {
  889. new TMessage('error', 'Error ' . $e->getMessage());
  890. TTransaction::rollback();
  891. }
  892. }
  893. public static function OnCancelarNfe( $param )
  894. {
  895. try
  896. {
  897. TTransaction::open('ourorio');
  898. $ambiente = 2;
  899. $token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbXAiOjQ1LCJ1c3IiOjE5LCJ0cCI6MiwiaWF0IjoxNTkyODI1MDkwfQ.SmZhXytS1jgYab4BoCOHglFutn-VobYd9693c4pE2Yk";
  900. $data = array(
  901. "chave" => "41210922545265000108550180011112251837890220",
  902. "justificativa" => "Teste de carta de correcao"
  903. );
  904. $resp = self::enviaAPI($ambiente, "nfe/cancela", "POST", $token, $data);
  905. if ($resp->sucesso) {
  906. // cancelou com sucesso
  907. var_dump($resp);
  908. $pdf = base64_decode($resp->pdf);
  909. $xml = base64_decode($resp->xml);
  910. } else {
  911. // rejeição
  912. var_dump($resp);
  913. }
  914. TTransaction::close();
  915. }
  916. catch (Exception $e)
  917. {
  918. new TMessage('error', 'Error ' . $e->getMessage());
  919. TTransaction::rollback();
  920. }
  921. }
  922. }
  923. ?>
NR

"Undefined variable: key" - Você está usando uma variável que não existe, $key não tem valor nenhum. Não seria "$param['id_compra']"?
CM

Desculpe a demora.
Obrigado Nataniel, resolvido.
Abraço irmão.