src/Service/Xero/InvoiceService.php line 28

Open in your IDE?
  1. <?php
  2. // src/Service/UserService.php
  3. namespace App\Service\Xero;
  4. use App\Entity\OrderDetails;
  5. use App\Authenticator\XeroAuthenticator;
  6. use App\Entity\Donation;
  7. use App\Entity\User;
  8. use App\Entity\FilmProject;
  9. use App\Repository\XeroTrackingCategoryRepository;
  10. use App\Repository\XeroTrackingOptionRepository;
  11. use App\Serializer\XeroObjectConverter;
  12. use App\Service\Xero\XeroService;
  13. use App\String\Constant;
  14. use DateTime;
  15. use Exception;
  16. use Stripe\Order;
  17. use XeroAPI\XeroPHP\Models\Accounting\Invoice;
  18. use XeroAPI\XeroPHP\Models\Accounting\Payments;
  19. final class InvoiceService extends XeroService
  20. {
  21.     private const SUMMARIZE_ERRORS true;
  22.     private const UNIT_DP 4;
  23.     private $xeroObjectConverter;
  24.     public function __construct(XeroAuthenticator $xeroAuthenticatorXeroObjectConverter $xeroObjectConverter)
  25.     {        
  26.         parent::__construct($xeroAuthenticator);
  27.         $this->xeroObjectConverter $xeroObjectConverter;
  28.     }
  29.     /**
  30.      * Create Xero Invoice
  31.      *
  32.      * @param OrderDetails $orderDetails
  33.      * @param [type] $xeroContactId
  34.      * @return OrderDetails
  35.      */
  36.     public function createFilmInvoice(FilmProject $filmProject$product$xeroContactIdOrderDetails $order, ?User $user null): OrderDetails
  37.     {
  38.         $contact $this->xeroObjectConverter->createContactObj($xeroContactId);
  39.         $lineItems $this->xeroObjectConverter->CreateLineItemObjFromEntity($filmProject$product);
  40.         if ($user->isAdmin()) {
  41.             $lineItems $this->xeroObjectConverter->createFreeLineItemObjFromProject($filmProject$product);
  42.         }
  43.         $invoices $this->xeroObjectConverter->createInvoiceObj($contact$lineItems$orderConstant::XERO_INVOICE_THEME_APPLICATION);
  44.   
  45.         $apiResponse $this->xeroAccountingManager->createInvoices($this->xeroTenantId$invoices$this::SUMMARIZE_ERRORS$this::UNIT_DP);
  46.         if ($apiResponse[0]['has_validation_errors']) {
  47.             $this->throwExceptionMessage($apiResponse[0]['validation_errors'][0]['message']);
  48.         }
  49.         
  50.         $orderDetails $filmProject->getOrderDetails();
  51.         $orderDetails
  52.             ->setXeroId($apiResponse[0]['invoice_id'])
  53.             ->setInvoiceNumber($apiResponse[0]['invoice_number'])
  54.         ;
  55.         return $orderDetails;
  56.     }
  57.     /**
  58.      * Create invoice based on percentage splits donation
  59.      *
  60.      * @param OrderDetails $orderDetails
  61.      * @param [type] $xeroContactId
  62.      * @return OrderDetails
  63.      */
  64.     public function createDonationInvoice(Donation $donation$xeroContactId): OrderDetails
  65.     {
  66.         $contact $this->xeroObjectConverter->createContactObj($xeroContactId);
  67.         $lineItems $this->xeroObjectConverter->CreateLineItemObjFromEntity($donation);
  68.         $invoices $this->xeroObjectConverter->createInvoiceObj($contact$lineItems$donation->getOrderDetails(), Constant::XERO_INVOICE_THEME_DONATION);
  69.         $apiResponse $this->xeroAccountingManager->createInvoices($this->xeroTenantId$invoices$this::SUMMARIZE_ERRORS$this::UNIT_DP);
  70.         if ($apiResponse[0]['has_validation_errors']) {
  71.             $this->throwExceptionMessage($apiResponse[0]['validation_errors'][0]['message']);
  72.         }
  73.         
  74.         $orderDetails $donation->getOrderDetails();
  75.         $orderDetails
  76.             ->setXeroId($apiResponse[0]['invoice_id'])
  77.             ->setInvoiceNumber($apiResponse[0]['invoice_number'])
  78.         ;
  79.         // if ($apiResponse[0]['invoice_id']) {
  80.         //     $arr_payments = $this->xeroObjectConverter->createDonationPaymentObj($donation);
  81.         //     if ($arr_payments) {
  82.         //         $payments = (new Payments())->setPayments($arr_payments);
  83.         //         $apiResponse = $this->xeroAccountingManager->createPayments($this->xeroTenantId, $payments, $this::SUMMARIZE_ERRORS);
  84.         //     }
  85.         // }
  86.         return $orderDetails;
  87.     }
  88.     /**
  89.      * Get invoice pdf
  90.      *
  91.      * @param [type] $invoiceId
  92.      * @return string
  93.      */
  94.     public function getInvoiceAsPdf($invoiceId): string
  95.     {
  96.         $result $this->xeroAccountingManager->getInvoiceAsPdf($this->xeroTenantId$invoiceId'application/pdf');                         
  97.         return $result->getPathName();
  98.     }
  99.     /**
  100.      * Get invoices by contact id
  101.      *
  102.      * @param [type] $contactId
  103.      * @return array
  104.      */
  105.     public function getInvoicesByContactId($contactId)
  106.     {
  107.         $ifModifiedSince = new \DateTime("2022-06-01T12:00:00.202-08:00");
  108.         $where 'Type=="' Invoice::TYPE_ACCREC '"';
  109.         $order 'InvoiceNumber ASC';
  110.         $iDs null;
  111.         $invoiceNumbers null;
  112.         $contactIDs = [$contactId]; // website donation, Jane Rybarz, Website Donation - credit cards
  113.         $statuses = [Invoice::STATUS_PAID]; // PAID UNTIL PAGE 65
  114.         $page 15;
  115.         $includeArchived true;
  116.         $createdByMyApp false;
  117.         $unitdp 2;
  118.         $summaryOnly false;
  119.         try {
  120.             $invoices $this->xeroAccountingManager->getInvoices($this->xeroTenantId$ifModifiedSince$where$order$iDs$invoiceNumbers$contactIDs$statuses$page$includeArchived$createdByMyApp$unitdp$summaryOnly);
  121.         }
  122.         catch (Exception $e) {
  123.             $this->throwExceptionMessage($e->getMessage());
  124.         }
  125.         $unpermittedItemCodes = [4112];
  126.         $result = [];
  127.         foreach ($invoices as $invoice) {
  128.             $lineItems $invoice['line_items'];
  129.             array_push($result$invoice);
  130.         }
  131.         return $result;
  132.     
  133.     }
  134.     /**
  135.      * Get invoices by contact id
  136.      *
  137.      * @param [type] $contactId
  138.      * @return array
  139.      */
  140.     public function getDonationInvoicesWithPage($pageNumber)
  141.     {
  142.         $ifModifiedSince = new \DateTime("2022-06-01T12:00:00.202-08:00");
  143.         $where 'Type=="' Invoice::TYPE_ACCREC '"';
  144.         $order 'InvoiceNumber ASC';
  145.         $iDs null;
  146.         $invoiceNumbers null;
  147.         $contactIDs = ['4e5843b1-0847-4073-9b87-b54d9826e97c']; // website donation, Jane Rybarz, Website Donation - credit cards
  148.         $statuses = [Invoice::STATUS_PAID]; // PAID UNTIL PAGE 65
  149.         $page $pageNumber;
  150.         $includeArchived true;
  151.         $createdByMyApp false;
  152.         $unitdp 2;
  153.         $summaryOnly false;
  154.         try {
  155.             $invoices $this->xeroAccountingManager->getInvoices($this->xeroTenantId$ifModifiedSince$where$order$iDs$invoiceNumbers$contactIDs$statuses$page$includeArchived$createdByMyApp$unitdp$summaryOnly);
  156.         }
  157.         catch (Exception $e) {
  158.             $this->throwExceptionMessage($e->getMessage());
  159.         }
  160.         
  161.         if ($invoices) {
  162.             return $invoices;
  163.         }
  164.     
  165.     }
  166.     /**
  167.      * get invoices by start date
  168.      *
  169.      * @param DateTime $ifModifiedSince
  170.      * @return array
  171.      */
  172.     public function getInvoicesByStartDate(DateTime $ifModifiedSince): array
  173.     {
  174.         $where 'Type=="' Invoice::TYPE_ACCREC '"';
  175.         $order 'InvoiceNumber ASC';
  176.         $iDs null;
  177.         $invoiceNumbers null;
  178.         $contactIDs null;
  179.         $statuses = [Invoice::STATUS_PAID]; // PAID UNTIL PAGE 65
  180.         $page 1;
  181.         $includeArchived true;
  182.         $createdByMyApp false;
  183.         $unitdp 2;
  184.         $summaryOnly false;
  185.         try {
  186.             $invoices $this->xeroAccountingManager->getInvoices($this->xeroTenantId$ifModifiedSince$where$order$iDs$invoiceNumbers$contactIDs$statuses$page$includeArchived$createdByMyApp$unitdp$summaryOnly);
  187.         }
  188.         catch (Exception $e) {
  189.             $this->throwExceptionMessage($e->getMessage());
  190.         }
  191.         $permittedItemCodes = [4112];
  192.         $result = [];
  193.         $result['4112'] = [];
  194.         foreach ($invoices as $invoice) {
  195.             $projectName $invoice['name'];
  196.             $fromContact $invoice['contact_id'];
  197.             $invoiceNumber $invoice['invoice_number'];
  198.             $invoiceId $invoice['invoice_id'];
  199.             $lineItems $invoice['line_items'];
  200.             foreach ($lineItems as $lineItem) {
  201.                 $subTotal $lineItem['total'];
  202.                 $itemCode $lineItem['item_code'];
  203.                 $lineItemTracking $lineItem['trakcing'];
  204.                 
  205.                 if (in_array($itemCode$permittedItemCodes)) {
  206.                     array_push($result['4112'], $invoice);
  207.                     continue;
  208.                 }
  209.             }
  210.         }
  211.         return $result;
  212.     }
  213.     /**
  214.      * Update Invoice pdf
  215.      *
  216.      * @param [type] $invoiceId
  217.      * @return string
  218.      */
  219.     public function updateInvoice(Donation $donation$invoiceId$amount): void
  220.     {
  221.         $unitdp 2;
  222.         $lineItems $this->xeroObjectConverter->CreateLineItemObjFromEntity($donation); 
  223.         $invoices $this->xeroObjectConverter->createUpdateInvoiceObj($donation$lineItems);
  224.         $result $this->xeroAccountingManager->updateInvoice($this->xeroTenantId$invoiceId$invoices$unitdp);                         
  225.         return;
  226.     }
  227.     /**
  228.      * Create Xero REFUND FILM APPLICATION Invoice
  229.      *
  230.      * @param OrderDetails $orderDetails
  231.      * @param [type] $xeroContactId
  232.      * @return OrderDetails
  233.      */
  234.     public function createFilmRefundInvoice(FilmProject $filmProject$product$xeroContactIdOrderDetails $order): OrderDetails
  235.     {
  236.         $contact $this->xeroObjectConverter->createContactObj($xeroContactId);
  237.         $lineItems $this->xeroObjectConverter->createRefundLineItemObjFromEntity($filmProject$product);
  238.         $invoices $this->xeroObjectConverter->createRefundInvoiceObj($contact$lineItems$orderConstant::XERO_INVOICE_THEME_APPLICATION);
  239.   
  240.         $apiResponse $this->xeroAccountingManager->createInvoices($this->xeroTenantId$invoices$this::SUMMARIZE_ERRORS$this::UNIT_DP);
  241.         if ($apiResponse[0]['has_validation_errors']) {
  242.             $this->throwExceptionMessage($apiResponse[0]['validation_errors'][0]['message']);
  243.         }
  244.         
  245.         $orderDetails $filmProject->getOrderDetails();
  246.         $order
  247.             ->setIsRefund(true)
  248.             ->setRefundXeroId($apiResponse[0]['invoice_id'])
  249.             // ->setInvoiceNumber($apiResponse[0]['invoice_number'])
  250.         ;
  251.         return $orderDetails;
  252.     }
  253.     /**
  254.      * Create Xero REFUND Invoice
  255.      *
  256.      * @param OrderDetails $orderDetails
  257.      * @param [type] $xeroContactId
  258.      * @return OrderDetails
  259.      */
  260.     public function createDonationRefundInvoice(Donation $donation$xeroContactId): OrderDetails
  261.     {
  262.         $order $donation->getOrderDetails();
  263.         $contact $this->xeroObjectConverter->createContactObj($xeroContactId);
  264.         $lineItems $this->xeroObjectConverter->createRefundLineItemObjFromEntity($donation);
  265.         $invoices $this->xeroObjectConverter->createRefundInvoiceObj($contact$lineItems$orderConstant::XERO_INVOICE_THEME_APPLICATION);
  266.   
  267.         $apiResponse $this->xeroAccountingManager->createInvoices($this->xeroTenantId$invoices$this::SUMMARIZE_ERRORS$this::UNIT_DP);
  268.         if ($apiResponse[0]['has_validation_errors']) {
  269.             $this->throwExceptionMessage($apiResponse[0]['validation_errors'][0]['message']);
  270.         }
  271.         
  272.         $order
  273.             ->setIsRefund(true)
  274.             ->setRefundXeroId($apiResponse[0]['invoice_id'])
  275.             // ->setInvoiceNumber($apiResponse[0]['invoice_number'])
  276.         ;
  277.         return $order;
  278.     }
  279.     /**
  280.      * Create Xero Invoice
  281.      *
  282.      * @param OrderDetails $orderDetails
  283.      * @param [type] $xeroContactId
  284.      * @return OrderDetails
  285.      */
  286.     public function createPartialDonationRefundInvoice(Donation $donation$xeroContactId): OrderDetails
  287.     {
  288.         $order $donation->getOrderDetails();
  289.         $contact $this->xeroObjectConverter->createContactObj($xeroContactId);
  290.         $lineItems $this->xeroObjectConverter->createSupportDafLineItem($donation);
  291.         $invoices $this->xeroObjectConverter->createRefundInvoiceObj($contact$lineItems$orderConstant::XERO_INVOICE_THEME_APPLICATION);
  292.   
  293.         $apiResponse $this->xeroAccountingManager->createInvoices($this->xeroTenantId$invoices$this::SUMMARIZE_ERRORS$this::UNIT_DP);
  294.         if ($apiResponse[0]['has_validation_errors']) {
  295.             $this->throwExceptionMessage($apiResponse[0]['validation_errors'][0]['message']);
  296.         }
  297.         
  298.         $order
  299.             ->setIsRefund(true)
  300.             ->setRefundXeroId($apiResponse[0]['invoice_id'])
  301.             // ->setInvoiceNumber($apiResponse[0]['invoice_number'])
  302.         ;
  303.         return $order;
  304.     }
  305. }