src/Jaxon/Idempiere/Order.php line 292

Open in your IDE?
  1. <?php
  2. namespace App\Jaxon\Idempiere;
  3. use App\Entity\Idempiere\AdUser;
  4. use App\Entity\Idempiere\CBpartner;
  5. use App\Entity\Idempiere\CBpartnerLocation;
  6. use App\Entity\Idempiere\COrder;
  7. use App\Jaxon\Base;
  8. use App\Repository\Idempiere\AdUserRepository;
  9. use Doctrine\Common\Collections\ArrayCollection;
  10. use Doctrine\Common\Collections\Criteria;
  11. use Doctrine\Common\Collections\Expr\Comparison;
  12. use Jaxon\Response\Response;
  13. // TODO: Crear metodo para cambiar tercero de la orden "changeBpartner"
  14. // TODO: Crear metodo para cambiar vendedor de la orden "changeSalesrep"
  15. class Order extends Base
  16. {
  17. /**
  18. * Crear orden con los datos del formulario
  19. *
  20. * @param array $formData
  21. *
  22. * @return \App\Entity\COrder Respuesta
  23. */
  24. // public function create(
  25. // Array $formData
  26. // )
  27. // {
  28. // $user = $this->session->get('user', null);
  29. // $organization = $this->session->get('organization', null);
  30. // $warehouse = $this->session->get('warehouse', null);
  31. // $RSequence = $this->manager->getRepository(AdSequence::class);
  32. // $ROrder = $this->manager->getRepository(COrder::class);
  33. // $Order = new COrder();
  34. // $Order->setCOrderId( $RSequence->findNextSequence($ROrder->sequence) );
  35. // $date = new \DateTime("now");
  36. // $Order
  37. // ->setAdClientId( $organization->getAdClientId() )
  38. // ->setAdOrgId( $organization->getId() )
  39. // ->setDescription( $formData['description'] )
  40. // ->setIsactive('Y')
  41. // ->setIssotrx('Y')
  42. // ->setIsapproved('N')
  43. // ->setCOrderUu( $RSequence->findNextUU() )
  44. // ->setDateordered( $date )
  45. // ->setDateacct( $date )
  46. // ->setCreated( $date )
  47. // ->setCreatedby( $user->getId() )
  48. // ->setUpdated( $date )
  49. // ->setUpdatedby( $user->getId() );
  50. // $RUser = $this->manager->getRepository(AdUserR::class );
  51. // $salesrep = $RUser->find( $formData['salesrep_id'] );
  52. // $Order->setSalesrep( $salesrep );
  53. // $RDoctype = $this->manager->getRepository(CDoctype::class);
  54. // $doctype = $RDoctype->find($formData['documenttype']);
  55. // $sequence = $RSequence->find( $doctype->getDocnosequenceId() );
  56. // $Order
  57. // ->setCDoctype( $doctype )
  58. // ->setCDoctypeId( $doctype->getId() )
  59. // ->setDocumentno( $RSequence->findNextSequence($sequence, $Order) )
  60. // ->setDocstatus('DR')
  61. // ->setDocaction('PR')
  62. // ->setProcessing('Y')
  63. // ->setProcessed('N');
  64. // $RBpartner = $this->manager->getRepository(CBpartner::class);
  65. // $partner = $RBpartner->find( !empty($formData['bpartner_id']) ? $formData['bpartner_id'] : Constant::C_BPartner_ID );
  66. // $Order->setCBpartner( $partner );
  67. // $RPartnerLocation = $this->manager->getRepository(CBpartnerLocation::class);
  68. // $location = $RPartnerLocation->find( !empty($formData['bpartner_id']) ? $formData['address'] : Constant::C_BPartner_Location_ID ) ;
  69. // $Order->setCBpartnerLocation( $location );
  70. // $RPaymentterm = $this->manager->getRepository(CPaymentterm::class);
  71. // $paymentterm = $RPaymentterm->find($formData['paymentterm']);
  72. // $Order
  73. // ->setCPaymentterm( $paymentterm )
  74. // ->setPaymentrule('P');
  75. // $RCurrency = $this->manager->getRepository(CCurrency::class);
  76. // $currency = $RCurrency->find($formData['currency']);
  77. // $Order
  78. // ->setCCurrency($currency)
  79. // ->setInvoicerule('I')
  80. // ->setDeliveryrule('A')
  81. // ->setFreightcostrule('I')
  82. // ->setDeliveryviarule('P')
  83. // ->setPriorityrule('5');
  84. // $RPricelist = $this->manager->getRepository(MPricelist::class);
  85. // $pricelist = $RPricelist->find($formData['pricelist']);
  86. // $Order
  87. // ->setMPricelist($pricelist)
  88. // ->setMWarehouseId( $formData['warehouse'] )
  89. // ->setTotallines(0)
  90. // ->setGrandtotal(0);
  91. // $manager = $this->manager->getManager();
  92. // $manager->persist($Order);
  93. // try {
  94. // $manager->flush();
  95. // $manager->clear();
  96. // } catch(Exception $e) {
  97. // throw $e;
  98. // }
  99. // $this->session->set('order', $Order);
  100. // return $Order;
  101. // }
  102. /**
  103. * Elimina el pedido de las ordenes activas
  104. *
  105. * @param int $Order_ID Identificador de la orden
  106. * @param bool $IsTemp Bandera de pedidos temporales
  107. *
  108. * @return string/bool Mensaje de error / Estado de la consulta
  109. */
  110. // public function delete(
  111. // Int $Order_ID,
  112. // Bool $IsTemp = true
  113. // )
  114. // {
  115. // $jxnr = new Response;
  116. // $order = new ModelOrder;
  117. // if( $order->delete($Order_ID, $IsTemp) )
  118. // $jxnr->redirect('/dashboard');
  119. // else
  120. // $jxnr->script( self::displayError('Oops!', 'No fue posible eliminar el pedido.') );
  121. // return $jxnr;
  122. // }
  123. /**
  124. * Obtiene todos los terceros coincidentes
  125. *
  126. * @param string $value Codigo del tercero
  127. * @param int $salesrep_id Identificador del vendedor
  128. *
  129. * @return Jaxon\Response\Response Respuesta
  130. */
  131. public function getBpartners(
  132. String $value = '',
  133. Int $salesrep_id = 0
  134. ): Response
  135. {
  136. $jxnr = new Response;
  137. $user = $salesrep_id > 0 ?
  138. $this->manager->getRepository(AdUser::class)->find($salesrep_id) : $this->session()->get('user', null);
  139. $RBpartner = new $this->manager->getRepository(CBpartner::class);
  140. $criteria_bp = [
  141. 'iscustomer' => 'Y',
  142. 'issummary' => 'N',
  143. 'ismatriz' => 'N',
  144. 'isactive' => 'Y'
  145. ];
  146. // Buscar terceros asignados
  147. if ( $user->getCBpartnerId() && $RBpartner->find($user->getCBpartnerId())->getIssalesrep() )
  148. $criteria_bp['c_bpartner_id'] = $RBpartner->findBySalesRep($user->getId());
  149. $bpartners = new ArrayCollection( $RBpartner->findBy($criteria_bp) );
  150. // Seleccionar terceros coincidentes
  151. if ( !empty($value) ) {
  152. $searchN = new Comparison('name', 'CONTAINS', $value);
  153. $searchV = new Comparison('value', 'CONTAINS', $value);
  154. $criteria = new Criteria();
  155. $criteria->where($searchN)->orWhere($searchV);
  156. $bpartners = $bpartners->matching($criteria);
  157. }
  158. $html = '<table id="bpartnerTable" class="table"><thead><tr><th>Nombre</th><th>C&oacute;digo</th></tr></thead><tbody>';
  159. if( count($bpartners) > 0 ) {
  160. foreach ($bpartners as $bpartner) {
  161. $html .=
  162. '<tr class="btn-close" style="cursor: pointer;" onclick="App.Jaxon.Idempiere.Order.setBpartner(\''. $bpartner->getValue() .'\', $(\'#salesrep_id\').val() )">
  163. <td>'. $bpartner->getName() .'</td>
  164. <td>'. $bpartner->getValue() .'</td>
  165. </tr>';
  166. }
  167. } else {
  168. $html .= '<tr><td colspan="2">NO SE HA ENCONTRADO NINGUN CLIENTE</td></tr>';
  169. }
  170. $html .= '</tbody></table>';
  171. $jxnr
  172. ->assign('bpartners', 'innerHTML', $html)
  173. ->script('$("#bpartnerTable").dataTable({ columnDefs: [{ orderable: true, targets: 0 }], order: [[1, "asc" ]], responsive: true, lengthChange: false, autoWidth: false, dom: \'<"row"<"col-sm-12 col-md-12"f>><"row"<"col-sm-12"rt>><"row"<"col-sm-12 col-md-5"i><"col-sm-12 col-md-7"p>>\', buttons: ["copy", "csv", "excel", "pdf", "print", "colvis"] })');
  174. return $jxnr;
  175. }
  176. /**
  177. * Obtiene todos los vendedores coincidentes
  178. *
  179. * @param string $name Nombre del vendedor
  180. * @param int $ad_user_id Identificador del usuario
  181. *
  182. * @return Jaxon\Response\Response Respuesta
  183. */
  184. public function getSalesreps(
  185. String $name = '',
  186. Int $ad_user_id = 0
  187. ): Response
  188. {
  189. /** @var AdUserRepository AdUser Repository */
  190. $RUser = $this->manager->getRepository(AdUser::class);
  191. $salesreps = [];
  192. $user = $this->session->get('user', null);
  193. if ( $user->getCBpartnerId() > 0 )
  194. {
  195. $RBpartner = $this->manager->getRepository(CBpartner::class);
  196. $partner = $RBpartner->find( $user->getCBpartnerId() );
  197. if ( $partner->getIssalesrep() )
  198. {
  199. $smSalesreps = $partner->getSmSalesReps();
  200. foreach ($smSalesreps as $ss) {
  201. array_push($salesreps, $RUser->find($ss->getSalesrepId()));
  202. }
  203. }
  204. } else {
  205. $salesreps = $RUser->findSalesrep($name);
  206. }
  207. $html = '<table id="salesrepTable" class="table"><thead><tr><th>Nombre</th><th>Descripci&oacute;n</th><th>Correo</th></tr></thead><tbody>';
  208. if( count($salesreps) > 0 ) {
  209. foreach ($salesreps as $salesrep) {
  210. $html .=
  211. '<tr class="btn-close" style="cursor: pointer;" onclick="App.Jaxon.Idempiere.Order.setSalesrep(\''. $salesrep->getName() .'\')">
  212. <td>'. $salesrep->getName() .'</td>
  213. <td>'. $salesrep->getDescription() .'</td>
  214. <td>'. $salesrep->getEmail() .'</td>
  215. </tr>';
  216. }
  217. } else {
  218. $html .= '<tr><td colspan="2">NO SE HA ENCONTRADO NINGUN VENDEDOR</td></tr>';
  219. }
  220. $html .= '</tbody></table>';
  221. $jxnr = new Response;
  222. $jxnr
  223. ->assign('salesreps', 'innerHTML', $html)
  224. ->script('$("#salesrepTable").dataTable({ columnDefs: [{ orderable: true, targets: 0 }], order: [[1, "asc" ]], responsive: true, lengthChange: false, autoWidth: false })');
  225. return $jxnr;
  226. }
  227. /**
  228. * Obtiene el numero de la localizacion
  229. *
  230. * @param int $c_bpartner_location_id Identificador de la localizacion
  231. *
  232. * @return Jaxon\Response\Response Respuesta
  233. */
  234. public function getPhone(
  235. Int $c_bpartner_location_id
  236. ): Response
  237. {
  238. $partnerLocation = $this->manager->getRepository(CBpartnerLocation::class)->find($c_bpartner_location_id);
  239. $jxnr = new Response;
  240. if ($partnerLocation->getId() > 0)
  241. $jxnr->assign('phone', 'value', $partnerLocation->getPhone());
  242. else
  243. $jxnr->alert('No olvides seleccionar una direcion!');
  244. return $jxnr;
  245. }
  246. /**
  247. * Instanciar funciones jaxon en la orden
  248. *
  249. * @param int $c_order_id
  250. *
  251. * @return Jaxon Jaxon Response
  252. */
  253. public function init( Int $c_order_id = null ): Response
  254. {
  255. if ( isset($c_order_id) ) {
  256. $ROrder = new $this->manager->getRepository(COrder::class);
  257. $order = $ROrder->find( $c_order_id );
  258. $this->session->set('order', $order);
  259. }
  260. $jxnr = new Response;
  261. if( is_null($c_order_id) || $order->getDocstatus() == 'DR' ) {
  262. $jxnr
  263. ->setEvent('organization', 'onchange', rq('App.Jaxon.Idempiere.Organization')->call('getPricelist', pm()->select('organization')))
  264. // Cliente
  265. ->setEvent('address', 'onchange', rq('App.Jaxon.Idempiere.Order')->call('getPhone', pm()->select('address')))
  266. ->setEvent('getBpartners', 'onclick', rq('App.Jaxon.Idempiere.Order')->call('getBpartners', pm()->input('bpartner_value'), pm()->input('salesrep_id')))
  267. ->setEvent('setBpartner', 'onclick', rq('App.Jaxon.Idempiere.Order')->call('setBpartner', pm()->input('bpartner'), pm()->input('salesrep_id')))
  268. ->setEvent('bpartner_id', 'onchange', rq('App.Jaxon.Idempiere.Order')->call('changeBpartner', pm()->input('bpartner_id')))
  269. // Vendedor
  270. //->setEvent('getSalesreps', 'onclick', rq('App.Jaxon.Idempiere.Order')->call('getSalesreps', pm()->input('salesrep_value')))
  271. //->setEvent('setSalesrep', 'onclick', rq('App.Jaxon.Idempiere.Order')->call('setSalesrep', pm()->input('salesrep')))
  272. //->setEvent('salesrep_id', 'onchange', rq('App.Jaxon.Idempiere.Order')->call('changeSalesrep', pm()->input('salesrep_id')))
  273. // Productos
  274. ->setEvent('getProducts', 'onclick', rq('App.Jaxon.Idempiere.Orderline')->call('getProducts', pm()->input('product_value'), pm()->form('order')));
  275. }
  276. if( !is_null($c_order_id) )
  277. $jxnr->setEvent('process', 'onclick', rq('App.Jaxon.Idempiere.Order')->call('process', $c_order_id));
  278. return $jxnr;
  279. }
  280. /**
  281. * Asigna el tercero a la orden
  282. *
  283. * @param string $value Codigo del tercero
  284. * @param int $salesrep_id Identificador del vendedor
  285. *
  286. * @return Jaxon\Response\Response Respuesta
  287. */
  288. # TODO: Buscar coincidencias solo entre los clientes del vendedor
  289. public function setBpartner(
  290. String $value = '',
  291. Int $salesrep_id = 0
  292. ): Response
  293. {
  294. $jxnr = new Response;
  295. if(empty($value))
  296. return $jxnr->script('Swal.fire("Oops!", "El campo no puede estar vacio!", "warning")');
  297. $RBpartner = $this->manager->getRepository(CBpartner::class);
  298. $partner = $RBpartner->findOneBy(['value' => $value]);
  299. $bpLocation = $partner->getCBpartnerLocation();
  300. $address = '';
  301. $i = 0;
  302. foreach ($bpLocation as $location) {
  303. $checked = '';
  304. if($i == 0) {
  305. $phone = $location->getPhone();
  306. $checked = 'checked="true"';
  307. }
  308. $address .= '<option value="'. $location->getId() .'" '. $checked .'>'. $location->getCLocation()->getAddress1() .'</option>';
  309. $i++;
  310. }
  311. $user = $salesrep_id > 0 ?
  312. $this->manager->getRepository(AdUser::class)->find($salesrep_id) : $this->session()->get('user', null);
  313. $description = 'Pedido Web: ' . $user->getName() . ' - ' . $partner->getName();
  314. $jxnr
  315. ->assign('bpartner_id', 'value', $partner->getId())
  316. ->assign('bpartner', 'value', $partner->getValue())
  317. ->assign('description', 'value', $description)
  318. ->assign('address', 'innerHTML', $address)
  319. ->assign('phone', 'value', $phone)
  320. ->assign('address', 'disabled', false)
  321. ->script('$("#bpartnerModal").modal("hide")');
  322. return $jxnr;
  323. }
  324. /**
  325. * Asigna el vendedor a la orden
  326. *
  327. * @param string $name Nombre del vendedor
  328. * @param int $ad_user_id Identificador del usuario
  329. *
  330. * @return Jaxon\Response\Response Respuesta
  331. */
  332. # TODO: Busca que el vendedor sea de los asignados o el mismo
  333. public function setSalesrep(
  334. String $name = '',
  335. Int $ad_user_id = 0
  336. ): Response
  337. {
  338. $jxnr = new Response;
  339. if(empty($name))
  340. return $jxnr->script('Swal.fire("Oops!", "El campo no puede estar vacio!", "warning")');
  341. $RUser = $this->manager->getRepository(AdUser::class);
  342. $user = $RUser->findOneBy(['name' => $name]);
  343. $jxnr
  344. ->assign('salesrep_id', 'value', $user->getId())
  345. ->assign('salesrep', 'value', $user->getName())
  346. ->clear('bpartner_value', 'value')
  347. ->clear('address', 'value')
  348. ->clear('phone', 'value')
  349. ->clear('bpartner', 'value')
  350. ->clear('bpartner_id', 'value')
  351. ->clear('bpartners')
  352. ->clear('description', 'value')
  353. ->script('$("#salesrepModal").modal("hide")');
  354. return $jxnr;
  355. }
  356. }
  357. ?>