Formulaires de document imprimables pour Eloquent en 0 lignes de code

Récemment, dans un projet sur Laravel + Eloquent, j'avais besoin de réaliser des formulaires imprimables de documents - factures, contrats au format Word. Puisqu'il existe de nombreux documents différents dans le système, j'ai décidé de le rendre universel afin qu'il puisse être utilisé plus tard dans d'autres projets.



Le résultat est une mise en œuvre qui nécessite un minimum de coûts d'intégration dans le projet.





Comme je faisais des formulaires imprimables. Utilisé différentes approches



  • .
  • .
  • html word.
  • , , .


. Eloquent, , .



,



composer require mnvx/eloquent-print-form


Eloquent, . , .



use Illuminate\Database\Eloquent\Model;

/**
 * @property string $number
 * @property string $start_at
 * @property Customer $customer
 * @property ContractAppendix[] $appendixes
 */
class Contract extends Model
{

    public function customer()
    {
        return $this->belongsTo(Customer::class);
    }

    public function appendixes()
    {
        return $this->hasMany(ContractAppendix::class);
    }
}

/**
 * @property string $name
 * @property CustomerCategory $category
 */
class Customer extends Model
{
    public function category()
    {
        return $this->belongsTo(CustomerCategory::class);
    }

}

/**
 * @property string $number
 * @property string $date
 * @property float $tax
 */
class ContractAppendix extends Model
{

    public function getTaxAttribute()
    {
        $tax = 0;
        foreach ($this->items as $item) {
            $tax += $item->total_amount * (1 - 100 / (100+($item->taxStatus->vat_rate ?? 0)));
        }
        return $tax;
    }
}


,





(Contract), (Customer), . (ContractAppendix).



— . docx





Eloquent. , , , ${customer.category.name}.



, |, ${number|placeholder}. , , ${start_at|date|placeholder}.





  • placeholder — "____",
  • date — 24.12.2020,
  • dateTime — - 24.12.2020 23:11,
  • int — 2`145,
  • decimal — 2`145.07.


. ${entities.#row_number}.



Maintenant que le document est décrit, il ne reste plus qu'à commencer à générer le document imprimable



use Mnvx\EloquentPrintForm\PrintFormProcessor;

$entity = Contract::find($id);
$printFormProcessor = new PrintFormProcessor();
$templateFile = resource_path('path_to_print_forms/your_print_form.docx');
$tempFileName = $printFormProcessor->process($templateFile, $entity);


Le fichier généré $tempFileNamecontiendra un imprimable préparé.



Dans un projet Laravel, la méthode de contrôleur responsable de la génération de l'imprimable pourrait ressembler à ceci



public function downloadPrintForm(FormRequest $request)
{
    $id = $request->get('id');
    $entity = Contract::find($id);
    $printFormProcessor = new PrintFormProcessor();
    $templateFile = resource_path('path_to_print_forms/your_print_form.docx');
    $tempFileName = $printFormProcessor->process($templateFile, $entity);
    $filename = 'contract_' . $id;
    return response()
        ->download($tempFileName, $filename . '.docx')
        ->deleteFileAfterSend();
}


En résumé, je dirai que je me suis décemment déchargé en créant cette petite bibliothèque dans un projet avec beaucoup de formulaires imprimables. Je n'ai pas besoin d'écrire mon propre code pour chacun d'eux. Je décris simplement les variables comme ci-dessus et j'obtiens le résultat très rapidement. Je serai heureux si le package vous aidera à gagner du temps.



Lien vers le projet sur github




All Articles