/**
  * @Route("/{id}/approve", name="approveInvoice")
  */
 public function approveAction($id)
 {
     $invoice = $this->getDoctrine()->getRepository('InvoicingBundle:Invoice')->find($id);
     // handle not found
     if (!$invoice) {
         throw $this->createNotFoundException('No invoice found for id ' . $id);
     }
     // get user data
     $user = $this->getUser();
     // get approving date
     $date = new \DateTime();
     //  week calendar and monday / friday exclusions are hardcoded, but could be loaded from database, a config file, an iCal file...
     $am = array('09:00:00', '12:00:00');
     $pm = array('13:30:00', '17:00:00');
     $classicDay = array($am, $pm);
     $timeTable = array(array(), $classicDay, $classicDay, $classicDay, $classicDay, $classicDay, array());
     $timeExclusions = array(array(), $am, array(), array(), array(), $pm, array());
     // create a holliday callendar object, file path could be loaded dynamicly from database.
     $holidaysCalendar = new HolidaysCalendar('../data/Holidays.ics');
     // get email sending DateTime
     $interval = new \DateInterval('PT4H');
     // '04:00:00';
     $scheduler = new EmailScheduler($timeTable, $timeExclusions, $holidaysCalendar);
     $sendEmailOn = $scheduler->getSendDate(clone $date, $interval);
     // update
     $invoice->setApprovedBy($user);
     $invoice->setApprovedOn($date);
     $invoice->setSendEmailOn($sendEmailOn);
     // persist
     $em = $this->getDoctrine()->getManager();
     $em->persist($invoice);
     $em->flush();
     // feedback message
     $this->get('session')->getFlashBag()->add('notice', 'Invoice approved ! An email will be sent to ' . $invoice->getDebtor()->getEmail() . ' on ' . $sendEmailOn->format('m/d/Y H:i') . '.');
     return $this->redirectToRoute('invoiceDetails', array('id' => $id));
 }
 public function testHolidays()
 {
     $date = new \DateTime('2015-12-26  09:00:00');
     $expected = new \DateTime('2016-01-01 09:00:00');
     $interval = new \DateInterval('PT4H');
     // '04:00:00';
     //  week calendar and monday / friday exclusions are hardcoded, but could be loaded from database, a config file, an iCal file...
     $am = array('09:00:00', '12:00:00');
     $pm = array('13:30:00', '17:00:00');
     $classicDay = array($am, $pm);
     $timeTable = array(array(), $classicDay, $classicDay, $classicDay, $classicDay, $classicDay, array());
     $timeExclusions = array(array(), $am, array(), array(), array(), $pm, array());
     // create a holliday callendar object
     $holidaysCalendar = new HolidaysCalendar('C:/websites/invoicing-app2/data/Holidays.ics');
     $scheduler = new EmailScheduler($timeTable, $timeExclusions, $holidaysCalendar);
     $result = $scheduler->getSendDate($date, $interval);
     $this->assertEquals($result, $expected);
 }