src/Repository/Idempiere/AdSequenceRepository.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Repository\Idempiere;
  3. use App\Entity\Idempiere\AdSequence;
  4. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  5. use Doctrine\Persistence\ManagerRegistry;
  6. /**
  7. * @method AdSequence|null find($id, $lockMode = null, $lockVersion = null)
  8. * @method AdSequence|null findOneBy(array $criteria, array $orderBy = null)
  9. * @method AdSequence[] findAll()
  10. * @method AdSequence[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  11. */
  12. class AdSequenceRepository extends ServiceEntityRepository
  13. {
  14. public function __construct(ManagerRegistry $registry)
  15. {
  16. parent::__construct($registry, AdSequence::class);
  17. }
  18. /**
  19. * Buscar el correlativo siguiente de una
  20. * secuencia
  21. *
  22. * @param AdSequence $sequence Secuencia
  23. * @param object $entity Entidad base
  24. *
  25. * @return string Correlativo
  26. */
  27. public function findNextSequence(AdSequence $sequence, Object $entity = null): String
  28. {
  29. $connection = $this->getEntityManager()->getConnection();
  30. if( $sequence->getIsorglevelsequence() )
  31. return $this->findNextSequenceByOrg($sequence, $entity);
  32. $stmt = $connection->prepare("SELECT nextid(:sequence_id, 'N')");
  33. $resultSet = $stmt->executeQuery(['sequence_id' => $sequence->getId() ]);
  34. return $resultSet->fetchOne();
  35. }
  36. /**
  37. * Buscar el correlativo siguiente
  38. * de una secuencia correspondiente a
  39. * una organizacion
  40. *
  41. * @param AdSequence $sequence Secuencia
  42. * @param object $entity Entidad base
  43. *
  44. * @return string Correlativo
  45. */
  46. protected function findNextSequenceByOrg(AdSequence $sequence, Object $entity): String
  47. {
  48. $connection = $this->getEntityManager()->getConnection();
  49. // Get Current Next
  50. $stmt = $connection->prepare(
  51. "SELECT currentnext FROM ad_sequence_no
  52. WHERE ad_sequence_id = :sequence_id AND ad_org_id = :org_id");
  53. $resultSet = $stmt->executeQuery([
  54. 'sequence_id' => $sequence->getId(),
  55. 'org_id' => $entity->getAdOrg()->getAdOrgId()
  56. ]);
  57. $currentnext = $resultSet->fetchOne();
  58. // Get Prefix
  59. $prefix = $this->buildPrefex($sequence->getPrefix(), $entity);
  60. // Update Sequence No
  61. $stmt = $connection->prepare(
  62. "UPDATE ad_sequence_no SET currentnext = :currentnext
  63. WHERE ad_sequence_id = :sequence_id AND ad_org_id = :org_id"
  64. );
  65. $stmt->executeQuery([
  66. 'currentnext' => $currentnext + 1,
  67. 'sequence_id' => $sequence->getId(),
  68. 'org_id' => $entity->getAdOrg()->getAdOrgId()
  69. ]);
  70. return $prefix . $currentnext;
  71. }
  72. /**
  73. * Genera un RowGUID
  74. *
  75. * @return string RowGUID
  76. */
  77. public function findNextUU(): String
  78. {
  79. $connection = $this->getEntityManager()->getConnection();
  80. $stmt = $connection->prepare("SELECT generate_uuid()");
  81. $resultSet = $stmt->executeQuery();
  82. return $resultSet->fetchOne();
  83. }
  84. /**
  85. * Construir prefijos de secuencias
  86. *
  87. * @param string $prefix Prefijo de la secuencia
  88. * @param object $entity Entidad base
  89. *
  90. * @return string Prefijo
  91. */
  92. protected function buildPrefex(String $prefix, Object $entity): String
  93. {
  94. if ( !empty($prefix) ) {
  95. $prefix = preg_split('([<@.>\s])', $prefix);
  96. $prefix = array_filter($prefix, 'trim');
  97. $_prefix = $prefix[0];
  98. if (count($prefix) === 4) {
  99. $connection = $this->getEntityManager()->getConnection();
  100. $getObject = 'get' . implode( array_map('ucfirst', explode('_', $prefix[2]) ) );
  101. $sql = "SELECT {$prefix[3]} FROM {$prefix[2]} WHERE {$prefix[1]} = :value";
  102. $stmt = $connection->prepare($sql);
  103. $resultSet = $stmt->executeQuery( ['value' => $entity->$getObject()->getId()] );
  104. $_prefix .= $resultSet->fetchOne();
  105. }
  106. return $_prefix;
  107. }
  108. return '';
  109. }
  110. }