@@ -481,6 +481,10 @@ class DocumentController extends BackendController | |||
$json['orders_update_array'] = $document ? $this->initOrdersArray($orderModule->findOrdersByUserAndDeliveryNote($user, $document)) : []; | |||
} | |||
if ($typeAction == 'create' && ($classDocument == 'Invoice' || $classDocument == 'DeliveryNote')) { | |||
$json['name'] = $documentModule->getSolver()->getDefaultName($classDocument, $user); | |||
} | |||
return $json; | |||
} | |||
} |
@@ -69,7 +69,7 @@ $documentClass = $documentModule->getClass($model); | |||
<?php if ($action == 'update'): ?> | |||
<?= Html::hiddenInput('idDocument', $model->id, ['id' => 'id-document']) ?> | |||
<?php endif; ?> | |||
<?= $form->field($model, 'name')->label('Nom du document') ?> | |||
<?= $form->field($model, 'name')->textInput(['v-model' => 'document.name'])->label('Nom du document') ?> | |||
<?php if ($action == 'update'): ?> | |||
<?= $form->field($model, 'id_user', [ |
@@ -479,6 +479,8 @@ $this->addBreadcrumb($this->getTitle()); | |||
<?= $form->field($model, 'document_invoice_first_reference'); ?> | |||
<?= $form->field($model, 'document_delivery_note_prefix')->hint($hintKeywordsPrefix);; ?> | |||
<?= $form->field($model, 'document_delivery_note_first_reference'); ?> | |||
<?= $form->field($model, 'option_document_default_naming')->dropDownList(Dropdown::noYesChoices()); ?> | |||
<?= $form->field($model, 'option_document_name_as_filename')->dropDownList(Dropdown::noYesChoices()); ?> | |||
<?= $form->field($model, 'delivery_note_automatic_validation')->dropDownList(Dropdown::noYesChoices()); ?> | |||
<?= $form->field($model, 'option_invoice_only_based_on_delivery_notes')->dropDownList(Dropdown::noYesChoices()); ?> | |||
<?= $form->field($model, 'option_document_width_logo') |
@@ -145,12 +145,16 @@ if($(selector).length) { | |||
.then(function (response) { | |||
if (response.data.return == 'success') { | |||
Vue.set(app.document, 'address', response.data.address); | |||
if(response.data.name) { | |||
Vue.set(app.document, 'name', response.data.name); | |||
} | |||
app.deliveryNoteCreateArray = response.data.delivery_note_create_array; | |||
app.deliveryNoteUpdateArray = response.data.delivery_note_update_array; | |||
app.ordersCreateArray = response.data.orders_create_array; | |||
app.ordersUpdateArray = response.data.orders_update_array; | |||
} else { | |||
app.document.address = ''; | |||
app.document.name = ''; | |||
} | |||
setTimeout("opendistrib_check_all_checkboxes();", 500); | |||
}); |
@@ -0,0 +1,63 @@ | |||
<?php | |||
/** | |||
Copyright Guillaume Bourgeois (2024) | |||
contact@souke.fr | |||
Ce logiciel est un programme informatique servant à aider les producteurs | |||
à distribuer leur production en circuits courts. | |||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||
sur le site "http://www.cecill.info". | |||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||
de modification et de redistribution accordés par cette licence, il n'est | |||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||
titulaire des droits patrimoniaux et les concédants successifs. | |||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||
associés au chargement, à l'utilisation, à la modification et/ou au | |||
développement et à la reproduction du logiciel par l'utilisateur étant | |||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||
avertis possédant des connaissances informatiques approfondies. Les | |||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
termes. | |||
*/ | |||
use yii\db\Migration; | |||
use yii\db\Schema; | |||
/** | |||
* Class m240923_093142_add_column_producer_option_document_naming | |||
*/ | |||
class m240923_093142_add_column_producer_option_document_naming extends Migration | |||
{ | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeUp() | |||
{ | |||
$this->addColumn('producer', 'option_document_default_naming', Schema::TYPE_BOOLEAN); | |||
$this->addColumn('producer', 'option_document_name_as_filename', Schema::TYPE_BOOLEAN); | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function safeDown() | |||
{ | |||
$this->dropColumn('producer', 'option_document_default_naming'); | |||
$this->dropColumn('producer', 'option_document_name_as_filename'); | |||
} | |||
} |
@@ -43,14 +43,19 @@ use domain\Order\ProductOrder\ProductOrderSolver; | |||
use domain\PointSale\PointSale\PointSale; | |||
use domain\_\AbstractService; | |||
use domain\_\SolverInterface; | |||
use domain\Producer\Producer\ProducerSolver; | |||
use domain\User\User\User; | |||
use domain\User\User\UserSolver; | |||
class DocumentSolver extends AbstractService implements SolverInterface | |||
{ | |||
protected ProductOrderSolver $productOrderSolver; | |||
protected UserSolver $userSolver; | |||
public function loadDependencies(): void | |||
{ | |||
$this->productOrderSolver = $this->loadService(ProductOrderSolver::class); | |||
$this->userSolver = $this->loadService(UserSolver::class); | |||
} | |||
public function getAmount(DocumentInterface $document, string $type = Order::AMOUNT_TOTAL, bool $format = false) | |||
@@ -168,7 +173,11 @@ class DocumentSolver extends AbstractService implements SolverInterface | |||
public function getType(DocumentInterface $document): string | |||
{ | |||
$class = $this->getClass($document); | |||
return $this->getTypeStringByClass($class); | |||
} | |||
public function getTypeStringByClass(string $class): string | |||
{ | |||
if ($class == 'Invoice') { | |||
$documentType = 'Facture'; | |||
} elseif ($class == 'DeliveryNote') { | |||
@@ -270,15 +279,31 @@ class DocumentSolver extends AbstractService implements SolverInterface | |||
return '@app/web/pdf/' . $document->id_producer . '/'; | |||
} | |||
public function getDefaultName(string $documentClass, User $user): string | |||
{ | |||
$dateLastMonth = new \DateTime('last month'); | |||
return $this->getTypeStringByClass($documentClass) | |||
. ' '.$this->userSolver->getUsername($user) | |||
.' '.ucfirst(strftime('%B', $dateLastMonth->getTimestamp())) | |||
.' '.$dateLastMonth->format('Y'); | |||
} | |||
public function getFilename(DocumentInterface $document): string | |||
{ | |||
$filename = $this->getType($document) . '-'; | |||
$optionDocumentNameAsFilename = $document->producer->option_document_name_as_filename; | |||
if($this->isStatusValid($document)) { | |||
$filename .= $document->reference; | |||
if($optionDocumentNameAsFilename) { | |||
$filename = preg_replace("/[^a-zA-Z0-9_]+/", "", str_replace(' ', '_', $document->name)); | |||
} | |||
elseif($this->isStatusDraft($document)) { | |||
$filename .= 'Brouillon-'.$document->id; | |||
else { | |||
$filename = $this->getType($document) . '-'; | |||
if($this->isStatusValid($document)) { | |||
$filename .= $document->reference; | |||
} | |||
elseif($this->isStatusDraft($document)) { | |||
$filename .= 'Brouillon-'.$document->id; | |||
} | |||
} | |||
$filename .= '.pdf'; |
@@ -311,7 +311,9 @@ class Producer extends ActiveRecordCommon | |||
'option_leave_period_message_display', | |||
'sponsorship_sponsor_reward', | |||
'sponsorship_godson_reward', | |||
'export_shopping_cart_labels_pdf_in_cart_label_specific_format' | |||
'export_shopping_cart_labels_pdf_in_cart_label_specific_format', | |||
'option_document_default_naming', | |||
'option_document_name_as_filename' | |||
], | |||
'boolean' | |||
], | |||
@@ -554,6 +556,8 @@ class Producer extends ActiveRecordCommon | |||
'sponsorship_sponsor_reward' => 'Récompense parrain', | |||
'option_communicate_email_default_subject' => 'Sujet par défaut', | |||
'option_communicate_email_default_message' => 'Message par défaut', | |||
'option_document_default_naming' => 'Nommage par défaut à la création (TypeDocument Nom Mois Année)', | |||
'option_document_name_as_filename' => 'Utiliser le nom du document comme nom de fichier lors du téléchargement' | |||
]; | |||
} | |||