Formularios de documentos imprimibles para Eloquent en 0 líneas de código

Recientemente, en un proyecto en Laravel + Eloquent, necesitaba hacer formularios imprimibles de documentos: facturas, contratos en formato Word. Dado que hay muchos documentos diferentes en el sistema, decidí hacerlo universalmente para que luego pudiera usarse en otros proyectos.



El resultado es una implementación que requiere un mínimo de costos para la integración en el proyecto.





Como solía hacer formularios imprimibles. Usó diferentes enfoques



  • .
  • .
  • 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}.



Ahora que se describe el documento, queda simplemente comenzar a generar el imprimible



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


El archivo generado $tempFileNamecontendrá un archivo imprimible preparado.



En un proyecto de Laravel, el método del controlador responsable de generar el imprimible podría verse así



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


Resumiendo, diré que me descargué decentemente al hacer esta pequeña biblioteca en un proyecto con muchos formularios imprimibles. No necesito escribir mi propio código único para cada uno de ellos. Solo describo las variables como arriba y obtengo el resultado muy rápidamente. Me alegrará que el paquete le ayude a ahorrar tiempo.



Enlace al proyecto en github




All Articles