/** * 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); }