public function addInvoiceFromTickets($clientId, $tickets, $month) { if (!$clientId) { return array('success' => false, 'message' => 'Le code client est inconnu sur Dolibarr', 'id' => null); } $now = new \Datetime(); $date31 = new \Datetime($month->format('Y-m') . '-01'); $date31->modify('+1 month'); $date31->modify('-1 day'); $invoice = new Invoice(); $invoice->setCustomerCode($clientId); $invoice->setAuthorId(1); $invoice->setDate($date31); $invoice->setDateDue($date31); $invoice->setDateCreated($now); $invoice->setType(0); usort($tickets, array($this, 'sortTicket')); foreach ($tickets as $ticket) { $description = ''; if (strpos($ticket['entity']['name'], 'MARE NOSTRUM >') || strpos($ticket['entity']['name'], 'MALURA')) { $description = $ticket['entity']['name'] . '<br/>'; } $invoice_line = new InvoiceLine($invoice); $invoice_line->setType(1); $invoice_line->setDescription('<em>' . $ticket['solvedate']->format('d-m-Y') . '</em> : ' . $description . $ticket['name'] . '<br/>' . $ticket['content']); $invoice_line->setTva($this->tva * 100); $invoice_line->setQuantity(number_format($this->formatActionTime($ticket['actiontime']) / 60 / 60, 2)); $invoice_line->setUnitPrice($this->unit_price); $invoice_line->setDateStart($ticket['date']); $invoice_line->setDateEnd($ticket['solvedate']); $invoice_line->calculTotals(); } $result = $this->dolibarr_invoice_connector->addInvoice($invoice); if ($result['result']->result_code == 'OK') { return array('success' => true, 'message' => $result['ref'], 'id' => $result['id']); } else { return array('success' => false, 'message' => $result['result']->result_label, 'id' => null); } }
public function billingClient(ClientInterface $client, $tickets, $month, $generate_facture = true) { $listBillableTicket = array(); $dateDu = \DateTime::createFromFormat('Y-m-d', date('Y-') . $month . '-01'); $dateDu->modify('+1 month')->modify('-1 day'); $invoice = new Invoice(); $invoice->setCustomerCode($client->getId()); $invoice->setAuthorId(1); $invoice->setType(0); $invoice->setDate($dateDu); $invoice->setDateDue($dateDu); $invoice->setDateCreated(new \Datetime()); $customer = $this->customerManager->getByCustomerCode($client->getCustomerCode()); $stat = array(); //Trie des tickets $ticketsTries = array(); foreach ($tickets as $ticket) { $dateLineEnd = new \DateTime($ticket["Changed"]); $ticketsTries[$dateLineEnd->format('Y-m-d')] = $ticket; } ksort($ticketsTries); foreach ($ticketsTries as $ticket) { if ($ticket) { $is_billiable = true; if ($ticket['ServiceID']) { $billableService = $this->defaultBillingServiceManager->getByService($ticket['ServiceID']); $is_default_billiable = true; if ($billableService instanceof OTRSDefaultBillingService) { $is_default_billiable = $billableService->getBillable(); } // Si le service doit être facturé par défaut if ($is_default_billiable) { if ($customer instanceof Customer) { // Si le client dispose d'un forfait pour ce service if (($suscription = $customer->getSuscription($billableService)) instanceof CustomerSuscription) { // Et que le forfait est en cours if ($suscription->getDateStart() <= new \DateTime() && ($suscription->getEnd() ? $suscription->getEnd()->getDateEnd() > new \DateTime() : true)) { // On veut des stats dans le mail de récap if (isset($stat[$suscription->getId()]['time'])) { $stat[$suscription->getId()]['time'] += $ticket['total_time']; } else { $stat[$suscription->getId()] = array('name' => $suscription->getName(), 'time' => $ticket['total_time'], 'max' => $suscription->getMonthlyHour() * 60); } $is_billiable = false; // Cas de MARE NOSTRUM if ($client->getCustomerCode() == 'CL11036') { $totalTicketTime = 0; foreach ($tickets as $t) { if ($t['ServiceID'] == $ticket['ServiceID']) { $totalTicketTime += $t['total_time']; } } if ($totalTicketTime > $suscription->getMonthlyHour() * 60) { $is_billiable = true; $ticket['info'] = 'MARE_SUP'; } } } } } } else { $is_billiable = false; } } else { $is_billiable = false; } // Si le ticket est facturable, on ajoute une ligne dans la facture if ($is_billiable) { $listBillableTicket[] = $ticket; $unit_price = $this->defaultUnitPrice; $round = 15; if ($customer) { if (($hourlyCost = $customer->getHourlyCost($billableService)) instanceof CustomerHourlyCost) { $unit_price = $hourlyCost->getHourlyCost(); $round = $hourlyCost->getRound(); } } // $dateLineStart = new \DateTime($ticket["Created"]); $dateLineEnd = new \DateTime($ticket["Changed"]); $contact = $this->dolibarrService->getContact($ticket["CustomerUserID"]); $_contact = ''; if ($contact instanceof ContactInterface) { $_contact = ' - ' . $contact->getFirstname() . ' ' . $contact->getName(); } $invoice_line = new InvoiceLine($invoice); $invoice_line->setType(1); $invoice_line->setDescription($dateLineEnd->format('d/m/Y') . $_contact . ' : ' . $ticket['Title']); if ($client->getCountry() == 'Switzerland') { $invoice_line->setTva(0); } else { $invoice_line->setTva($this->tva * 100); } $invoice_line->setQuantity($this->formatActionTime($ticket['total_time'], $round)); $invoice_line->setUnitPrice($unit_price); // $invoice_line->setDateStart(new \DateTime($ticket["Created"])); // $invoice_line->setDateEnd(new \DateTime($ticket["Changed"])); $invoice_line->calculTotals(); if ($ticket['info'] == 'MARE_SUP') { $invoice->setNotePublic('Dépassement de forfait'); } } } } $result = null; if ($invoice->getLines()->count() && $generate_facture) { $result = $this->dolibarrService->addInvoice($invoice); } if ($result) { if ($result['result']->result_code == 'OK') { $result = array('success' => true, 'message' => $result['ref'], 'id' => $result['id']); } else { $result = array('success' => false, 'message' => $result['result']->result_label, 'id' => null); } } else { $result = array('success' => true, 'message' => null, 'id' => null); } $result['stat'] = $stat; $result['client'] = $client->getName(); $result['listBillableTicket'] = $listBillableTicket; return $result; }