コード例 #1
0
 public function invoice()
 {
     $items = PastTime::query()->whereIn('id', Input::get('items'))->where('invoice_id', 0)->orderBy('ressource_id', 'ASC')->orderBy('time_start', 'ASC')->get();
     $lines = array();
     $ressources = array();
     $users = array();
     $user = null;
     foreach ($items as $item) {
         $ressources[$item->ressource_id] = $item->ressource()->getResults();
         $lines[$item->ressource_id][] = $item;
         $users[$item->user_id] = true;
         if (null == $user) {
             /** @var User $user */
             $user = $item->user()->getResults();
         }
     }
     if (count($users) > 1) {
         return Redirect::route('pasttime_list')->with('mError', 'Impossible de générer la facture pour plusieurs utilisateurs à la fois');
     }
     if (count($users) == 0) {
         return Redirect::route('pasttime_list');
     }
     $organisation = $user->organisations->first();
     $invoice = new Invoice();
     $invoice->user_id = $user->id;
     $invoice->created_at = new \DateTime();
     $invoice->organisation_id = $organisation->id;
     $invoice->type = 'F';
     $invoice->days = date('Ym');
     $invoice->number = $invoice->next_invoice_number($invoice->type, $invoice->days);
     $invoice->address = $organisation->fulladdress;
     $invoice->date_invoice = new \DateTime();
     $invoice->deadline = new \DateTime(date('Y-m-d', strtotime('+1 month')));
     $invoice->save();
     $vat = VatType::where('value', 20)->first();
     $orderIndex = 0;
     foreach ($lines as $ressource_id => $line) {
         $ressource = $ressources[$ressource_id];
         $invoice_line = new InvoiceItem();
         $invoice_line->invoice_id = $invoice->id;
         $invoice_line->amount = 0;
         $invoice_line->order_index = $orderIndex++;
         if ($ressource_id == Ressource::TYPE_COWORKING) {
             $invoice_line->text = 'Coworking';
             $sum_duration = 0;
             foreach ($line as $item) {
                 $duration = ceil((strtotime($item->time_end) - strtotime($item->time_start)) / 3600 / self::COWORKING_HALF_DAY_MAX_DURATION);
                 $sum_duration += $duration;
                 $invoice_line->text .= sprintf("\n - %s de %s à %s (%s demi journée%s)", date('d/m/Y', strtotime($item->time_start)), date('H:i', strtotime($item->time_start)), date('H:i', strtotime($item->time_end)), $duration, $duration > 1 ? 's' : '');
                 $invoice_line->amount += $duration * (self::COWORKING_HALF_DAY_PRICING / 1.2);
                 $item->invoice_id = $invoice->id;
                 $item->save();
             }
             $invoice_line->text .= sprintf("\nTotal : %s demi journée%s", $sum_duration, $sum_duration > 1 ? 's' : '');
         } else {
             $invoice_line->text = sprintf('Location d\'espace de réunion - %s', $ressource->name);
             foreach ($line as $item) {
                 $invoice_line->text .= sprintf("\n - %s de %s à %s", date('d/m/Y', strtotime($item->time_start)), date('H:i', strtotime($item->time_start)), date('H:i', strtotime($item->time_end)));
                 $invoice_line->amount += min(7, (strtotime($item->time_end) - strtotime($item->time_start)) / 3600) * $ressource->amount;
                 $item->invoice_id = $invoice->id;
                 $item->save();
             }
         }
         $invoice_line->vat_types_id = $vat->id;
         $invoice_line->ressource_id = $item->ressource_id;
         $invoice_line->save();
     }
     return Redirect::route('invoice_modify', $invoice->id)->with('mSuccess', 'La facture a bien été générée');
 }
コード例 #2
0
 /**
  * Update existing invoice
  *
  * @param void
  * @return null
  */
 function edit()
 {
     $this->wireframe->print_button = false;
     if ($this->active_invoice->isNew()) {
         $this->httpError(HTTP_ERR_NOT_FOUND);
     }
     // if
     if (!$this->active_invoice->canEdit($this->logged_user)) {
         $this->httpError(HTTP_ERR_FORBIDDEN);
     }
     // if
     $invoice_data = $this->request->post('invoice');
     if (!is_array($invoice_data)) {
         $invoice_data = array('number' => $this->active_invoice->getNumber(), 'due_on' => $this->active_invoice->getDueOn(), 'issued_on' => $this->active_invoice->getIssuedOn(), 'currency_id' => $this->active_invoice->getCurrencyId(), 'comment' => $this->active_invoice->getComment(), 'company_id' => $this->active_invoice->getCompanyId(), 'company_address' => $this->active_invoice->getCompanyAddress(), 'project_id' => $this->active_invoice->getProjectId(), 'note' => $this->active_invoice->getNote(), 'language_id' => $this->active_invoice->getLanguageId());
         if (is_foreachable($this->active_invoice->getItems())) {
             $invoice_data['items'] = array();
             foreach ($this->active_invoice->getItems() as $item) {
                 $invoice_data['items'][] = array('description' => $item->getDescription(), 'unit_cost' => $item->getUnitCost(), 'quantity' => $item->getQuantity(), 'tax_rate_id' => $item->getTaxRateId(), 'total' => $item->getTotal(), 'subtotal' => $item->getSubtotal(), 'time_record_ids' => $item->getTimeRecordIds());
             }
             // foreach
         }
         // if
     }
     // if
     $invoice_notes = InvoiceNoteTemplates::findAll();
     $invoice_item_templates = InvoiceItemTemplates::findAll();
     $this->smarty->assign(array('invoice_data' => $invoice_data, 'invoice_item_templates' => $invoice_item_templates, 'tax_rates' => TaxRates::findAll(), 'invoice_notes' => $invoice_notes, 'original_note' => $this->active_invoice->getNote()));
     $cleaned_notes = array();
     if (is_foreachable($invoice_notes)) {
         foreach ($invoice_notes as $invoice_note) {
             $cleaned_notes[$invoice_note->getId()] = $invoice_note->getContent();
         }
         // foreach
     }
     // if
     js_assign('invoice_notes', $cleaned_notes);
     js_assign('original_note', $this->active_invoice->getNote());
     $cleaned_item_templates = array();
     if (is_foreachable($invoice_item_templates)) {
         foreach ($invoice_item_templates as $invoice_item_template) {
             $cleaned_item_templates[$invoice_item_template->getId()] = array('description' => $invoice_item_template->getDescription(), 'unit_cost' => $invoice_item_template->getUnitCost(), 'quantity' => $invoice_item_template->getQuantity(), 'tax_rate_id' => $invoice_item_template->getTaxRateId());
         }
         // foreach
     }
     // if
     js_assign('invoice_item_templates', $cleaned_item_templates);
     js_assign('company_details_url', assemble_url('invoice_company_details'));
     js_assign('move_icon_url', get_image_url('move.gif'));
     if ($this->request->isSubmitted()) {
         $this->active_invoice->setAttributes($invoice_data);
         $invoice_company = Companies::findById(array_var($invoice_data, 'company_id', null));
         $this->active_invoice->setCompanyName($invoice_company->getName());
         $save = $this->active_invoice->save();
         if ($save && !is_error($save)) {
             InvoiceItems::deleteByInvoice($this->active_invoice);
             $counter = 1;
             if (is_foreachable($invoice_data['items'])) {
                 foreach ($invoice_data['items'] as $invoice_item_data) {
                     $invoice_item = new InvoiceItem();
                     $invoice_item->setAttributes($invoice_item_data);
                     $invoice_item->setInvoiceId($this->active_invoice->getId());
                     $invoice_item->setPosition($counter);
                     $item_save = $invoice_item->save();
                     if ($item_save && !is_error($item_save)) {
                         $invoice_item->setTimeRecordIds(array_var($invoice_item_data, 'time_record_ids', null));
                         $counter++;
                     } else {
                         $this->smarty->assign('errors', new ValidationErrors(array('items' => lang('Invoice items data is not valid. All descriptions are required and there need to be at least one unit with cost set per item!'))));
                     }
                     // if
                 }
                 // foreach
                 flash_success('":number" has been updated', array('number' => $this->active_invoice->getName()));
                 if ($this->active_invoice->isIssued()) {
                     $invoice_company = $this->active_invoice->getCompany();
                     if (instance_of($invoice_company, 'Company') && $invoice_company->hasManagers()) {
                         $this->redirectTo('invoice_notify', array('invoice_id' => $this->active_invoice->getId()));
                     }
                     // if
                 }
                 // if
                 $this->redirectToUrl($this->active_invoice->getViewUrl());
             } else {
                 $this->smarty->assign('errors', $save);
             }
             // if
         }
         // if
     }
     // if
 }
コード例 #3
0
 public function renew($id)
 {
     $subscription = $this->dataExist($id);
     $invoice = new Invoice();
     $invoice->type = 'F';
     $invoice->user_id = $subscription->user_id;
     $invoice->organisation_id = $subscription->organisation_id;
     $invoice->days = date('Ym');
     $invoice->date_invoice = date('Y-m-d');
     $invoice->number = Invoice::next_invoice_number($invoice->type, $invoice->days);
     $invoice->address = $subscription->organisation->fulladdress;
     $date = new DateTime($invoice->date_invoice);
     $date->modify('+1 month');
     $invoice->deadline = $date->format('Y-m-d');
     $invoice->save();
     $invoice_line = new InvoiceItem();
     $invoice_line->invoice_id = $invoice->id;
     $invoice_line->ressource_id = Ressource::TYPE_COWORKING;
     $invoice_line->amount = $subscription->kind->price;
     $date = new \DateTime($subscription->renew_at);
     $date2 = new \DateTime($subscription->renew_at);
     $invoice_line->subscription_from = $date->format('Y-m-d');
     $date2->modify('next month');
     $invoice_line->subscription_to = $date2->format('Y-m-d');
     $invoice_line->subscription_hours_quota = $subscription->kind->hours_quota;
     // update invoices_items set subscription_to = date_add(subscription_from, interval 1 MONTH) where subscription_from <> '0000-00-00 00:00:00'
     $date2->modify('-1 day');
     $invoice_line->text = sprintf("%s - %s\nDu %s au %s", $subscription->kind->name, $subscription->user->fullname, $date->format('d/m/Y'), $date2->format('d/m/Y'));
     $invoice_line->vat_types_id = VatType::whereValue(20)->first()->id;
     $invoice_line->ressource_id = Ressource::TYPE_COWORKING;
     $invoice_line->save();
     $invoice_line->order_index = 1;
     $date = new DateTime($subscription->renew_at);
     $date->modify('+1 month');
     $subscription->renew_at = $date->format('Y-m-d');
     $subscription->save();
     return Redirect::route('invoice_modify', $invoice->id)->with('mSuccess', 'La facture a été créée');
 }
コード例 #4
0
ファイル: invoice_controller.php プロジェクト: laazz/talpa
 public static function create_invoice($user_id)
 {
     $user = User::find($user_id);
     $current_user = self::get_user_logged_in();
     if ($user) {
         if ($user->id == $current_user->id || $current_user->manager) {
             $reservations = Reservation::all_past_not_invoiced($user->id);
             $invoice_number = -1;
             foreach ($reservations as $r) {
                 $invoice_number = max($invoice_number, $r->id);
             }
             $invoice = new Invoice(array('user' => $user, 'invoice_date' => new DateTime(), 'paid' => false, 'invoice_number' => $invoice_number));
             $invoice->save();
             foreach ($reservations as $r) {
                 $item = new InvoiceItem(array('invoice' => $invoice, 'reservation' => $r));
                 $item->save();
             }
             Redirect::to(\Slim\Slim::getInstance()->urlFor('invoices_index'), array('message' => 'Lasku luotu'));
         }
     } else {
         Redirect::to(\Slim\Slim::getInstance()->urlFor('invoices_index'), array('message' => 'Käyttäjää ei löytynyt!', 'error' => true));
     }
 }