app\models\Invoice::shouldSendToday PHP Метод

shouldSendToday() публичный Метод

public shouldSendToday ( ) : boolean
Результат boolean
    public function shouldSendToday()
    {
        if (!$this->user->confirmed) {
            return false;
        }
        if (!$this->start_date || strtotime($this->start_date) > strtotime('now')) {
            return false;
        }
        if ($this->end_date && strtotime($this->end_date) < strtotime('now')) {
            return false;
        }
        $dayOfWeekToday = date('w');
        $dayOfWeekStart = date('w', strtotime($this->start_date));
        $dayOfMonthToday = date('j');
        $dayOfMonthStart = date('j', strtotime($this->start_date));
        if (!$this->last_sent_date) {
            return true;
        } else {
            $date1 = new DateTime($this->last_sent_date);
            $date2 = new DateTime();
            $diff = $date2->diff($date1);
            $daysSinceLastSent = $diff->format('%a');
            $monthsSinceLastSent = $diff->format('%y') * 12 + $diff->format('%m');
            if ($daysSinceLastSent == 0) {
                return false;
            }
        }
        switch ($this->frequency_id) {
            case FREQUENCY_WEEKLY:
                return $daysSinceLastSent >= 7;
            case FREQUENCY_TWO_WEEKS:
                return $daysSinceLastSent >= 14;
            case FREQUENCY_FOUR_WEEKS:
                return $daysSinceLastSent >= 28;
            case FREQUENCY_MONTHLY:
                return $monthsSinceLastSent >= 1;
            case FREQUENCY_THREE_MONTHS:
                return $monthsSinceLastSent >= 3;
            case FREQUENCY_SIX_MONTHS:
                return $monthsSinceLastSent >= 6;
            case FREQUENCY_ANNUALLY:
                return $monthsSinceLastSent >= 12;
            default:
                return false;
        }
        return false;
    }

Usage Example

 /**
  * @param Invoice $recurInvoice
  * @return mixed
  */
 public function createRecurringInvoice(Invoice $recurInvoice)
 {
     $recurInvoice->load('account.timezone', 'invoice_items', 'client', 'user');
     if ($recurInvoice->client->deleted_at) {
         return false;
     }
     if (!$recurInvoice->user->confirmed) {
         return false;
     }
     if (!$recurInvoice->shouldSendToday()) {
         return false;
     }
     $invoice = Invoice::createNew($recurInvoice);
     $invoice->invoice_type_id = INVOICE_TYPE_STANDARD;
     $invoice->client_id = $recurInvoice->client_id;
     $invoice->recurring_invoice_id = $recurInvoice->id;
     $invoice->invoice_number = $recurInvoice->account->getNextInvoiceNumber($invoice);
     $invoice->amount = $recurInvoice->amount;
     $invoice->balance = $recurInvoice->amount;
     $invoice->invoice_date = date_create()->format('Y-m-d');
     $invoice->discount = $recurInvoice->discount;
     $invoice->po_number = $recurInvoice->po_number;
     $invoice->public_notes = Utils::processVariables($recurInvoice->public_notes);
     $invoice->terms = Utils::processVariables($recurInvoice->terms);
     $invoice->invoice_footer = Utils::processVariables($recurInvoice->invoice_footer);
     $invoice->tax_name1 = $recurInvoice->tax_name1;
     $invoice->tax_rate1 = $recurInvoice->tax_rate1;
     $invoice->tax_name2 = $recurInvoice->tax_name2;
     $invoice->tax_rate2 = $recurInvoice->tax_rate2;
     $invoice->invoice_design_id = $recurInvoice->invoice_design_id;
     $invoice->custom_value1 = $recurInvoice->custom_value1 ?: 0;
     $invoice->custom_value2 = $recurInvoice->custom_value2 ?: 0;
     $invoice->custom_taxes1 = $recurInvoice->custom_taxes1 ?: 0;
     $invoice->custom_taxes2 = $recurInvoice->custom_taxes2 ?: 0;
     $invoice->custom_text_value1 = Utils::processVariables($recurInvoice->custom_text_value1);
     $invoice->custom_text_value2 = Utils::processVariables($recurInvoice->custom_text_value2);
     $invoice->is_amount_discount = $recurInvoice->is_amount_discount;
     $invoice->due_date = $recurInvoice->getDueDate();
     $invoice->save();
     foreach ($recurInvoice->invoice_items as $recurItem) {
         $item = InvoiceItem::createNew($recurItem);
         $item->product_id = $recurItem->product_id;
         $item->qty = $recurItem->qty;
         $item->cost = $recurItem->cost;
         $item->notes = Utils::processVariables($recurItem->notes);
         $item->product_key = Utils::processVariables($recurItem->product_key);
         $item->tax_name1 = $recurItem->tax_name1;
         $item->tax_rate1 = $recurItem->tax_rate1;
         $item->tax_name2 = $recurItem->tax_name2;
         $item->tax_rate2 = $recurItem->tax_rate2;
         $item->custom_value1 = Utils::processVariables($recurItem->custom_value1);
         $item->custom_value2 = Utils::processVariables($recurItem->custom_value2);
         $invoice->invoice_items()->save($item);
     }
     foreach ($recurInvoice->documents as $recurDocument) {
         $document = $recurDocument->cloneDocument();
         $invoice->documents()->save($document);
     }
     foreach ($recurInvoice->invitations as $recurInvitation) {
         $invitation = Invitation::createNew($recurInvitation);
         $invitation->contact_id = $recurInvitation->contact_id;
         $invitation->invitation_key = str_random(RANDOM_KEY_LENGTH);
         $invoice->invitations()->save($invitation);
     }
     $recurInvoice->last_sent_date = date('Y-m-d');
     $recurInvoice->save();
     if ($recurInvoice->getAutoBillEnabled() && !$recurInvoice->account->auto_bill_on_due_date) {
         // autoBillInvoice will check for ACH, so we're not checking here
         if ($this->paymentService->autoBillInvoice($invoice)) {
             // update the invoice reference to match its actual state
             // this is to ensure a 'payment received' email is sent
             $invoice->invoice_status_id = INVOICE_STATUS_PAID;
         }
     }
     return $invoice;
 }