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 $tempFileName
conterá 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.