PageRenderTime 87ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/module/Estoque/src/Estoque/Service/Descarte.php

https://gitlab.com/SFMSP/Hagape
PHP | 346 lines | 205 code | 59 blank | 82 comment | 36 complexity | cd79cc678f98d89b41bbead0b366135e MD5 | raw file
  1. <?php
  2. namespace Estoque\Service;
  3. use Application\Service\BaseApplicationService;
  4. use Estoque\Entity\SolicitacaoDescarte as SolicitacaoDescarteEntity;
  5. use Estoque\Repository\SolicitacaoDescarteRepository;
  6. use Estoque\Repository\ItemDescarteRepository;
  7. use Admin\Repository\EstoqueRepository;
  8. use Estoque\Service\ItemDescarte as ItemDescarteService;
  9. use Estoque\Service\EstoqueProduto as EstoqueProdutoService;
  10. use Estoque\Service\Movimentacao as MovimentacaoService;
  11. use Estoque\Entity\Movimentacao as MovimentacaoEntity;
  12. /**
  13. * Classe que contém as operações realizadas na entidade de item de descarte
  14. *
  15. * @autor Eduardo Praxedes Heinske <praxeduardo@gmail.com>
  16. */
  17. class Descarte extends BaseApplicationService {
  18. /**
  19. *
  20. * @var SolicitacaoDescarteRepository
  21. */
  22. protected $solicitacaoDescarteRepository;
  23. /**
  24. *
  25. * @var ItemDescarteService
  26. */
  27. protected $itemDescarteService;
  28. /**
  29. *
  30. * @var ItemDescarteRepository
  31. */
  32. protected $itemDescarteRepository;
  33. /**
  34. *
  35. * @var EstoqueRepository
  36. */
  37. protected $estoqueRepository;
  38. /**
  39. *
  40. * @var EstoqueProdutoService
  41. */
  42. protected $estoqueProdutoService;
  43. /**
  44. *
  45. * @var MovimentacaoService
  46. */
  47. protected $movimentacaoService;
  48. /**
  49. *
  50. * @param SolicitacaoDescarteRepository $solicitacaoDescarteRepository
  51. * @return \Estoque\Service\SolicitacaoDescarte
  52. */
  53. public function setSolicitacaoDescarteRepository(SolicitacaoDescarteRepository $solicitacaoDescarteRepository) {
  54. $this->solicitacaoDescarteRepository = $solicitacaoDescarteRepository;
  55. return $this;
  56. }
  57. /**
  58. *
  59. * @param ItemDescarteService $itemDescarteService
  60. * @return \Estoque\Service\SolicitacaoDescarte
  61. */
  62. public function setItemDescarteService(ItemDescarteService $itemDescarteService) {
  63. $this->itemDescarteService = $itemDescarteService;
  64. return $this;
  65. }
  66. /**
  67. *
  68. * @param ItemDescarteRepository $itemDescarteRepository
  69. * @return \Estoque\Service\SolicitacaoDescarte
  70. */
  71. public function setItemDescarteRepository(ItemDescarteRepository $itemDescarteRepository) {
  72. $this->itemDescarteRepository = $itemDescarteRepository;
  73. return $this;
  74. }
  75. /**
  76. *
  77. * @param EstoqueRepository $estoqueRepository
  78. * @return \Estoque\Service\Descarte
  79. */
  80. public function setEstoqueRepository(EstoqueRepository $estoqueRepository) {
  81. $this->estoqueRepository = $estoqueRepository;
  82. return $this;
  83. }
  84. /**
  85. *
  86. * @param EstoqueProdutoService $estoqueProdutoService
  87. * @return \Estoque\Service\SolicitacaoDescarte
  88. */
  89. public function setEstoqueProdutoService(EstoqueProdutoService $estoqueProdutoService) {
  90. $this->estoqueProdutoService = $estoqueProdutoService;
  91. return $this;
  92. }
  93. /**
  94. *
  95. * @param MovimentacaoService $movimentacaoService
  96. * @return \Estoque\Service\SolicitacaoDescarte
  97. */
  98. public function setMovimentacaoService(MovimentacaoService $movimentacaoService) {
  99. $this->movimentacaoService = $movimentacaoService;
  100. return $this;
  101. }
  102. public function save(array $data) {
  103. try {
  104. //Em caso de edição, verifica se o registro de fato pode ser alterado, de acordo com o seu status
  105. if (!empty($data['id'])) {
  106. $solicitacaoDescarte = $this->getEm()->find('Estoque\Entity\SolicitacaoDescarte', $data['id']);
  107. if (($data['acao'] == 'C' || $data['acao'] == 'CE') && $solicitacaoDescarte->getSituacaoDescarte()->getId() != SolicitacaoDescarteEntity::STATUS_CADASTRADO) {
  108. return false;
  109. }
  110. }
  111. //Formata os dados para serem salvos
  112. $data['dataDescarte'] = new \DateTime($this->dateTimeFormat->formatUs($data['dataDescarte']));
  113. $data['estoqueOrigem'] = $this->getEm()->getReference("Admin\Entity\Estoque", $this->dadosUser['filtrosSelecionados']['estoque']['id']);
  114. $data['estoqueDestino'] = $this->getEm()->getReference("Admin\Entity\Estoque", $this->estoqueRepository->getEstoqueCentral()->getId());
  115. $data['usuario'] = $this->getEm()->getReference('Application\Entity\Usuario', $this->dadosUser['idUsuario']);
  116. if ($data['acao'] == 'CE') {
  117. $data['situacaoDescarte'] = $this->getEm()->getReference("Estoque\Entity\SituacaoDescarte", SolicitacaoDescarteEntity::STATUS_SOLICITADO);
  118. } else {
  119. $data['situacaoDescarte'] = $this->getEm()->getReference("Estoque\Entity\SituacaoDescarte", SolicitacaoDescarteEntity::STATUS_CADASTRADO);
  120. }
  121. if (empty($data['id'])) {
  122. $data['numeroDescarte'] = $this->solicitacaoDescarteRepository->getNumeroDescarteDisponivel();
  123. }
  124. $this->getEm()->beginTransaction();
  125. $solicitacaoDescarte = parent::save($data);
  126. //Deleta os itens do pedido caso existam ids para deletar
  127. if (!empty($data['idItensExcluidos']) && !empty($data['id'])) {
  128. $itensExcluidos = substr($data['idItensExcluidos'], 0, -1);
  129. $itensExcluidos = explode(',', $itensExcluidos);
  130. $itensExcluidos = $this->itemDescarteRepository->findIn($itensExcluidos);
  131. foreach ($itensExcluidos as $itemExcluido) {
  132. $deleteItem = $this->itemDescarteService->delete($itemExcluido->getId());
  133. $adicionaEstoque = $this->estoqueProdutoService->adicionarEstoque($itemExcluido->getProduto()->getId(), $itemExcluido->getSolicitacaoDescarte()->getEstoqueOrigem()->getId(), $itemExcluido->getQtd(), '+', false);
  134. if (!$deleteItem || !$adicionaEstoque) {
  135. $this->getEm()->rollback();
  136. return false;
  137. }
  138. $dadosMovimentacao['qtd'] = $itemExcluido->getQtd();
  139. $dadosMovimentacao['valorTotal'] = $itemExcluido->getValorTotal();
  140. $dadosMovimentacao['dataMovimentacao'] = new \DateTime('now');
  141. $dadosMovimentacao['tipoMovimentacao'] = MovimentacaoEntity::TIPO_MOVIMENTACAO_ENTRADA;
  142. $dadosMovimentacao['acaoMovimentacao'] = MovimentacaoEntity::ACAO_MOVIMENTACAO_DESCARTE;
  143. $dadosMovimentacao['estoque'] = $itemExcluido->getSolicitacaoDescarte()->getEstoqueOrigem()->getId();
  144. $dadosMovimentacao['produto'] = $itemExcluido->getProduto()->getId();
  145. $dadosMovimentacao['usuario'] = $this->dadosUser['idUsuario'];
  146. $dadosMovimentacao['descarte'] = $itemExcluido->getSolicitacaoDescarte()->getId();
  147. if (!$this->movimentacaoService->save($dadosMovimentacao)) {
  148. $this->getEm()->rollback();
  149. return false;
  150. }
  151. }
  152. }
  153. $itensDescarte = $this->itemDescarteRepository->findBy(array('solicitacaoDescarte' => $solicitacaoDescarte->getId()));
  154. $itensDesc = array();
  155. if ($itensDescarte) {
  156. foreach ($itensDescarte as $itemDesc) {
  157. $itensDesc[$itemDesc->getProduto()->getId()] = $itemDesc->getId();
  158. }
  159. }
  160. if ($solicitacaoDescarte) {
  161. foreach ($data['id-produto'] as $key => $item) {
  162. if (!isset($itensDesc[$item])) {
  163. $itemDescarte['qtd'] = $data['qtd-produto'][$key];
  164. $itemDescarte['custoMedio'] = $data['preco-medio'][$key];
  165. $itemDescarte['valorTotal'] = $data['valor-total'][$key];
  166. $itemDescarte['solicitacaoDescarte'] = $this->getEm()->getReference('Estoque\Entity\SolicitacaoDescarte', $solicitacaoDescarte->getId());
  167. $itemDescarte['produto'] = $this->getEm()->getReference('Estoque\Entity\Produto', $data['id-produto'][$key]);
  168. if (!$this->itemDescarteService->save($itemDescarte)) {
  169. $this->getEm()->rollback();
  170. return false;
  171. }
  172. if (!$this->estoqueProdutoService->adicionarEstoque($data['id-produto'][$key], $solicitacaoDescarte->getEstoqueOrigem()->getId(), $data['qtd-produto'][$key], '-', false)) {
  173. $this->getEm()->rollback();
  174. return false;
  175. }
  176. $dadosMovimentacao = array();
  177. $dadosMovimentacao['qtd'] = $data['qtd-produto'][$key];
  178. $dadosMovimentacao['valorTotal'] = $data['valor-total'][$key];
  179. $dadosMovimentacao['dataMovimentacao'] = new \DateTime('now');
  180. $dadosMovimentacao['tipoMovimentacao'] = MovimentacaoEntity::TIPO_MOVIMENTACAO_SAIDA;
  181. $dadosMovimentacao['acaoMovimentacao'] = MovimentacaoEntity::ACAO_MOVIMENTACAO_DESCARTE;
  182. $dadosMovimentacao['estoque'] = $this->dadosUser['filtrosSelecionados']['estoque']['id'];
  183. $dadosMovimentacao['produto'] = $data['id-produto'][$key];
  184. $dadosMovimentacao['usuario'] = $this->dadosUser['idUsuario'];
  185. $dadosMovimentacao['descarte'] = $solicitacaoDescarte->getId();
  186. if (!$this->movimentacaoService->save($dadosMovimentacao)) {
  187. $this->getEm()->rollback();
  188. return false;
  189. }
  190. }
  191. }
  192. }
  193. $this->getEm()->commit();
  194. return true;
  195. } catch (\Exception $ex) {
  196. $this->log->log(\Zend\Log\Logger::ERR, $ex->getMessage());
  197. $this->getEm()->rollback();
  198. return false;
  199. }
  200. }
  201. /**
  202. * Método que muda o status da solicitação para cancelado
  203. *
  204. * @param integer $id
  205. * @return boolean
  206. */
  207. public function cancelar($id) {
  208. $this->getEm()->beginTransaction();
  209. //Busca os dados da solicitação
  210. $solicitacao = $this->getEm()->find('Estoque\Entity\SolicitacaoDescarte', $id);
  211. //Verifica se é possível realizar o cancelamento
  212. if ($solicitacao->getSituacaoDescarte()->getId() == SolicitacaoDescarteEntity::STATUS_CADASTRADO) {
  213. $update = $this->update(array('id' => $solicitacao->getId(), 'situacaoDescarte' => $this->getEm()->getReference('Estoque\Entity\SituacaoDescarte', SolicitacaoDescarteEntity::STATUS_CANCELADO)));
  214. if ($update) {
  215. $solicitacao = $this->getEm()->find('Estoque\Entity\SolicitacaoDescarte', $id);
  216. foreach ($solicitacao->getItensDescarte() as $item) {
  217. if (!$this->estoqueProdutoService->adicionarEstoque($item->getProduto()->getId(), $solicitacao->getEstoqueOrigem()->getId(), $item->getQtd(), '+', false)) {
  218. $this->getEm()->rollback();
  219. return false;
  220. }
  221. }
  222. //Remove todas as movimentacoes pertencentes ao pedido de transferencia
  223. $delete = $this->getEm()->createQueryBuilder()->delete('Estoque\Entity\Movimentacao', 'm')->where('m.descarte = :id ')->setParameter('id', $id)->getQuery()->execute();
  224. if ($delete) {
  225. $this->getEm()->commit();
  226. return true;
  227. } else {
  228. $this->getEm()->rollback();
  229. return false;
  230. }
  231. } else {
  232. return false;
  233. }
  234. } else {
  235. return false;
  236. }
  237. }
  238. /**
  239. * Método que deleta as solicitações de descarte em massa
  240. *
  241. * @param type $ids
  242. * @return boolean
  243. */
  244. public function deleteAll($ids) {
  245. try {
  246. //Busca todas as solicitações requisitadas para exclusão
  247. $solicitacoesDescarte = $this->solicitacaoDescarteRepository->findIn($ids);
  248. //Inicia a transação
  249. $this->getEm()->beginTransaction();
  250. //Percorre oas solicitações e verifica se eles podem ser excluídos
  251. foreach ($solicitacoesDescarte as $solicitacao) {
  252. if ($solicitacao->getSituacaoDescarte()->getId() == SolicitacaoDescarteEntity::STATUS_CADASTRADO) {
  253. foreach ($solicitacao->getItensDescarte() as $item) {
  254. $this->getEm()->remove($this->getEm()->getReference('Estoque\Entity\ItemDescarte', $item->getId()));
  255. $this->getEm()->flush();
  256. $this->getEm()->clear();
  257. if (!$this->estoqueProdutoService->adicionarEstoque($item->getProduto()->getId(), $solicitacao->getEstoqueOrigem()->getId(), $item->getQtd(), '+', false)) {
  258. $this->getEm()->rollback();
  259. return false;
  260. }
  261. }
  262. //Remove todas as movimentacoes pertencentes ao pedido de transferencia
  263. $deleteMovimentacao = $this->getEm()->createQueryBuilder()->delete('Estoque\Entity\Movimentacao', 'm')->where('m.descarte = :id ')->setParameter('id', $solicitacao->getId())->getQuery()->execute();
  264. if (!$deleteMovimentacao) {
  265. $this->getEm()->rollback();
  266. return false;
  267. }
  268. $delete = parent::delete($solicitacao->getId());
  269. if (!$delete) {
  270. $this->getEm()->rollback();
  271. return false;
  272. }
  273. } else {
  274. $this->getEm()->rollback();
  275. return false;
  276. }
  277. }
  278. //Commita a transação
  279. $this->getEm()->commit();
  280. return true;
  281. } catch (\Exception $ex) {
  282. $this->log->log(\Zend\Log\Logger::ERR, $ex->getMessage());
  283. $this->getEm()->rollback();
  284. return false;
  285. }
  286. }
  287. }