DolibarrAccountBuilder.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\ApiResourceBuilder\Dolibarr;
  4. use App\ApiResources\Dolibarr\DolibarrAccount;
  5. use App\ApiResources\Dolibarr\DolibarrBill;
  6. use App\ApiResources\Dolibarr\DolibarrContract;
  7. use App\ApiResources\Dolibarr\DolibarrContractLine;
  8. use App\Service\Dolibarr\DolibarrApiService;
  9. class DolibarrAccountBuilder
  10. {
  11. public const PRODUCT_MAPPING = [
  12. 'Opentalent Artist' => 'PRODUCT_ARTIST', // OT Artist
  13. 'Opentalent Artist Premium' => 'PRODUCT_ARTIST_PREMIUM', // OT Artist Premium
  14. 'Opentalent Artist Premium (Essai)' => 'PRODUCT_ARTIST_PREMIUM_TRIAL', // OT Artist Premium (trial)
  15. 'Opentalent School' => 'PRODUCT_SCHOOL', // OT School Standard
  16. 'Opentalent School Premium' => 'PRODUCT_SCHOOL_PREMIUM', // OT School Premium
  17. 'Opentalent Manager' => 'PRODUCT_MANAGER', // OT Manager
  18. ];
  19. public function __construct(
  20. private DolibarrApiService $dolibarrApiService,
  21. ) {
  22. }
  23. public function getDolibarrAccount(int $id): DolibarrAccount
  24. {
  25. // Get dolibarr account (society)
  26. $accountData = $this->dolibarrApiService->getSociety($id);
  27. $dolibarrAccount = $this->createDolibarrAccount($id, $accountData);
  28. if ($dolibarrAccount->getSocId() === null) {
  29. return $dolibarrAccount;
  30. }
  31. // Get active contract and services
  32. $contractData = $this->dolibarrApiService->getActiveContract($dolibarrAccount->getSocId());
  33. if ($contractData !== null) {
  34. $contract = $this->createDolibarrContract($contractData);
  35. $dolibarrAccount->setContract($contract);
  36. }
  37. // get bills
  38. $billsData = $this->dolibarrApiService->getBills($dolibarrAccount->getSocId());
  39. foreach ($billsData as $billData) {
  40. $bill = $this->createDolibarrBill($billData);
  41. $dolibarrAccount->addBill($bill);
  42. }
  43. return $dolibarrAccount;
  44. }
  45. /**
  46. * @param array<mixed>|null $accountData
  47. */
  48. public function createDolibarrAccount(int $organizationId, ?array $accountData): DolibarrAccount
  49. {
  50. $dolibarrAccount = new DolibarrAccount();
  51. $dolibarrAccount->setOrganizationId($organizationId);
  52. if ($accountData === null) {
  53. return $dolibarrAccount;
  54. }
  55. $dolibarrAccount->setSocId((int) $accountData['id'])
  56. ->setClientNumber($accountData['code_client']);
  57. if (
  58. array_key_exists('options_2iopen_software_opentalent', $accountData['array_options'])
  59. && !empty($accountData['array_options']['options_2iopen_software_opentalent'])
  60. ) {
  61. $dolibarrAccount->setProduct(
  62. self::PRODUCT_MAPPING[$accountData['array_options']['options_2iopen_software_opentalent']]
  63. );
  64. }
  65. return $dolibarrAccount;
  66. }
  67. /**
  68. * @param array<mixed> $contractData
  69. */
  70. public function createDolibarrContract(array $contractData): DolibarrContract
  71. {
  72. $contract = new DolibarrContract();
  73. $contract->setRef($contractData['ref'] ?? '')
  74. ->setSocId((int) $contractData['socid']);
  75. foreach ($contractData['lines'] as $lineData) {
  76. $line = $this->createDolibarrContractLine($lineData);
  77. $contract->addLine($line);
  78. }
  79. return $contract;
  80. }
  81. /**
  82. * @param array<mixed> $lineData
  83. *
  84. * @throws \Exception
  85. */
  86. public function createDolibarrContractLine(array $lineData): DolibarrContractLine
  87. {
  88. $line = new DolibarrContractLine();
  89. return $line->setId((int) $lineData['id'])
  90. ->setContractId((int) $lineData['fk_contrat'])
  91. ->setServiceRef($lineData['product_ref'])
  92. ->setServiceLabel($lineData['product_label'])
  93. ->setDateStart(new \DateTime(date('c', (int) $lineData['date_start'])))
  94. ->setDateEnd(new \DateTime(date('c', (int) $lineData['date_end'])));
  95. }
  96. /**
  97. * @param array<mixed> $billData
  98. *
  99. * @throws \Exception
  100. */
  101. public function createDolibarrBill(array $billData): DolibarrBill
  102. {
  103. $bill = new DolibarrBill();
  104. return $bill->setId((int) $billData['id'])
  105. ->setRef($billData['ref'])
  106. ->setTaxExcludedAmount((float) $billData['total_ht'])
  107. ->setTaxIncludedAmount((float) $billData['total_ttc'])
  108. ->setDate(new \DateTime(date('c', (int) $billData['date'])))
  109. ->setPaid((bool) $billData['paye']);
  110. }
  111. }