/**
  * Update an invoice
  *
  * @param invoice array. The array defining the invoice to create, example:
  *
  * \code
  * array(
  *    'id'                     => 4, // the invoice ID
  *    'type'                   => 'invoice', // or 'quotation'
  *    'paid'                   => false, // or true
  *    'vat'                    => 20.0,  // %
  *    'period'                 => 'none', // 'monthly', 'quarterly', 'yearly'
  *    'periodic_next_deadline' => 2012-01-04, // YYYY-MM-DD
  *    'delivery'               => 'email', // or 'postal'
  *    'payment_method'         => 'unknown', // 'direct_debit', 'check' or
  *                                           // 'wire_transfer'
  *    'items'  => array(
  *       0 => array(
  *          'description' => 'the item description',
  *          'price'       => 123.32, // the unit price, excluding VAT
  *          'quantity'    => 3,
  *       ),
  *       1 => array(
  *          'description' => 'the second item description',
  *          'price'       => 23,
  *          'quantity'    => 1,
  *       ),
  *    )
  * )
  * \endcode
  *
  */
 function InvoiceUpdate(array $invoice = array())
 {
     CybPHP_Validate::ValidateInt($this->_company_id);
     CybPHP_Validate::ValidateInt($invoice['id']);
     WebfinanceCompany::ValidateInvoiceExists($invoice['id']);
     WebfinanceCompany::ValidateInvoiceType($invoice['type']);
     WebfinanceCompany::ValidateInvoicePeriod($invoice['period']);
     WebfinanceCompany::ValidateInvoiceDelivery($invoice['delivery']);
     WebfinanceCompany::ValidateInvoicePaymentMethod($invoice['payment_method']);
     if ($invoice['period'] != 'none') {
         CybPHP_Validate::ValidateDate($invoice['periodic_next_deadline']);
     }
     CybPHP_Validate::ValidateFloat($invoice['vat']);
     CybPHP_Validate::ValidateBool($invoice['paid']);
     # Define empty items if needed
     if (empty($invoice['items'])) {
         $invoice['items'] = array();
     }
     # Define periodic_next_deadline if needed
     if (empty($invoice['periodic_next_deadline'])) {
         $invoice['periodic_next_deadline'] = '0000-00-00';
     }
     foreach ($invoice['items'] as &$item) {
         CybPHP_Validate::ValidateFloat($item['price']);
         CybPHP_Validate::ValidateInt($item['quantity']);
         $item['description'] = mysql_escape_string($item['description']);
     }
     $type_translation = array('invoice' => 'facture', 'quotation' => 'devis');
     $invoice['type'] = $type_translation[$invoice['type']];
     $invoice['paid'] = $invoice['paid'] ? 1 : 0;
     $invoice['reference'] = WebfinanceCompany::GenerateInvoiceReference();
     CybPHP_MySQL::Query('BEGIN');
     CybPHP_MySQL::Query('UPDATE webfinance_invoices SET ' . 'date_created           = NOW(), ' . "type_doc               = '{$invoice['type']}', " . "is_paye                = {$invoice['paid']}, " . "tax                    = {$invoice['vat']}, " . "period                 = '{$invoice['period']}', " . "periodic_next_deadline = '{$invoice['periodic_next_deadline']}', " . "delivery               = '{$invoice['delivery']}', " . "payment_method         = '{$invoice['payment_method']}', " . "num_facture            = '{$invoice['reference']}' " . "WHERE id_facture       = {$invoice['id']}");
     $invoice_id = mysql_insert_id();
     CybPHP_MySQL::Query('DELETE FROM webfinance_invoice_rows ' . "WHERE id_facture = {$invoice_id}");
     $ordre = 1;
     foreach ($invoice['items'] as $item) {
         CybPHP_MySQL::Query('INSERT INTO webfinance_invoice_rows SET ' . "id_facture  = {$invoice_id}, " . "description = '{$item['description']}', " . "qtt         = {$item['quantity']}, " . "prix_ht     = {$item['price']}, " . "ordre       = {$ordre}");
         $ordre++;
     }
     CybPHP_MySQL::Query('COMMIT');
 }
 function testGenerateInvoiceReferenceOK()
 {
     $invoice_reference = WebfinanceCompany::GenerateInvoiceReference();
     $this->assertEquals(date('Ymd') . 0, $invoice_reference);
     CybPHP_MySQL::Query('INSERT INTO webfinance_invoices SET ' . "num_facture = '{$invoice_reference}'");
     $invoice_reference = WebfinanceCompany::GenerateInvoiceReference();
     $this->assertEquals(date('Ymd') . 01, $invoice_reference);
     CybPHP_MySQL::Query('INSERT INTO webfinance_invoices SET ' . "num_facture = '{$invoice_reference}'");
     $invoice_reference = WebfinanceCompany::GenerateInvoiceReference();
     $this->assertEquals(date('Ymd') . 02, $invoice_reference);
 }