Formulários de documentos para impressão para Eloquent em 0 linhas de código

Recentemente, em um projeto no Laravel + Eloquent, precisei fazer formulários para impressão de documentos - faturas, contratos em formato Word. Como existem muitos documentos diferentes no sistema, decidi torná-lo universal para que pudesse ser usado posteriormente em outros projetos.



O resultado é uma implementação que requer um mínimo de custos para a integração no projeto.





Como costumava fazer chapas de impressão. Usou abordagens diferentes



  • Marcas colocadas no modelo de documento e substituídas durante a geração.
  • .
  • 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}.



Agora que o documento está descrito, resta simplesmente começar a gerar a impressão



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);


O arquivo gerado $tempFileNameconterá um imprimível preparado.



Em um projeto Laravel, o método controlador responsável por gerar o imprimível pode ser parecido com este



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();
}


Resumindo, direi que me aliviei decentemente fazendo esta pequena biblioteca em um projeto com muitos formulários para impressão. Não preciso escrever meu próprio código exclusivo para cada um deles. Eu apenas descrevo as variáveis ​​acima e obtenho o resultado muito rapidamente. Ficarei feliz se o pacote o ajudará a economizar tempo.



Link para o projeto no github




All Articles