diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 3391bd8..501fdbc 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -20,12 +20,17 @@ use App\Support\ApiDataTransformer; use DateTime; use tbQuar\Facades\Quar; +use App\Mail\Reminder; +use Illuminate\Support\Facades\Mail; + class InvoiceController extends Controller { public function show() { - return Inertia::render('Invoices', ['invoicesData' => $this->summaryThisYear()] + return Inertia::render( + 'Invoices', + ['invoicesData' => $this->summaryThisYear()] ); } @@ -569,7 +574,7 @@ public function update(Request $request, $id) } } - public function delete(Request $request, $id) + public function delete(Request $request, int $id) { DB::beginTransaction(); @@ -591,6 +596,34 @@ public function delete(Request $request, $id) } } + public function remind(Request $request, int $id) + { + $invoice = InvoiceController::single($id); + $to = $request->query('to'); + $cc = $request->query('cc'); + + // TODO: get from settings + $bcc = 'buchhaltung@tooloop.de'; + + if (empty($to) || !filter_var($to, FILTER_VALIDATE_EMAIL)) { + return response()->json([ + 'error' => 'Keine gültige E_Mail-Adresse ' . $to + ], 400); + } + + if (!empty($cc) && !filter_var($cc, FILTER_VALIDATE_EMAIL)) { + return response()->json([ + 'error' => 'Keine gültige E_Mail-Adresse ' . $cc + ], 400); + } + + Mail::to($to) + ->cc($cc) + ->bcc($cc) + ->send(new Reminder($invoice)); + // return new Reminder($invoice); + } + /** * Generate the next available invoice number */ diff --git a/app/Mail/Reminder.php b/app/Mail/Reminder.php index bcecac5..fc1cc61 100644 --- a/app/Mail/Reminder.php +++ b/app/Mail/Reminder.php @@ -28,7 +28,6 @@ public function envelope(): Envelope return new Envelope( // TODO: get from settings from: new Address('buchhaltung@tooloop.de', 'Tooloop Multimedia'), - bcc: [new Address('daniel.stock@tooloop.de', 'Daniel Stock')], subject: 'Zahlungserinnerung', ); } diff --git a/resources/js/components/documents/InvoiceDialog.vue b/resources/js/components/documents/InvoiceDialog.vue index ac11685..9e0f96f 100644 --- a/resources/js/components/documents/InvoiceDialog.vue +++ b/resources/js/components/documents/InvoiceDialog.vue @@ -163,7 +163,6 @@ watch(invoice, if (newValue.customerId && newValue.customerId !== 0) { // if (importCustomer.value != newValue.customer) // console.warn('trigger importCustomer watcher') - console.log(newValue, newValue.customerId) customers.value.find(customer => { if (customer.id === newValue.customerId) { if (invoice.value) invoice.value.customer = customer as Customer @@ -413,8 +412,8 @@ const openReminderDialog = function () { reminderDialogOpen.value = true } -const sendReminder = async function (recipient: string | undefined) { - if (!recipient) return +const sendReminder = async function (to: string | undefined, cc: string | undefined) { + if (!to) return if (!invoice.value || !invoice.value.id) return // Close dialog @@ -425,8 +424,12 @@ const sendReminder = async function (recipient: string | undefined) { try { // await axios call - await axios.get('/api/invoices/' + invoice.value.id + '/remind/' + recipient) - toast.success("Zahlungserinnerung gesendet", { description: recipient }) + let request = '/api/invoices/' + invoice.value.id + '/remind?to=' + to + if (cc) request += '&cc=' + cc + await axios.get(request) + invoice.value.paymentStatus = 'reminded' + save() + toast.success("Zahlungserinnerung gesendet", { description: to }) } catch (error: any) { toast.error(error?.title || 'Fehler', { description: error?.message || String(error) }) } finally { @@ -819,7 +822,7 @@ const updateLineItems = (newItems: LineItem[]) => { + :to="billingContactEmail" @send="(to, cc) => sendReminder(to, cc)" /> diff --git a/resources/js/components/ui/send-mail-dialog/SendMailDialog.vue b/resources/js/components/ui/send-mail-dialog/SendMailDialog.vue index fa32b15..1e7fd3b 100644 --- a/resources/js/components/ui/send-mail-dialog/SendMailDialog.vue +++ b/resources/js/components/ui/send-mail-dialog/SendMailDialog.vue @@ -9,17 +9,19 @@ import { Label } from "@/components/ui/label" const props = defineProps() -const recipient = ref(props.recipient) +const to = ref(props.to) +const cc = ref(props.cc) const emits = defineEmits() const forwarded = useForwardPropsEmits(props, emits) watch(() => props.open, (newValue, oldValue) => { - recipient.value = props.recipient + to.value = props.to } ) @@ -32,15 +34,15 @@ watch(() => props.open,
-
@@ -48,7 +50,7 @@ watch(() => props.open, Abbrechen - diff --git a/routes/api.php b/routes/api.php index fd370de..f44775e 100644 --- a/routes/api.php +++ b/routes/api.php @@ -4,11 +4,9 @@ use App\Http\Controllers\CustomerController; use App\Http\Controllers\InvoiceController; use App\Http\Controllers\LineItemController; -use App\Mail\Reminder; use App\Http\Controllers\PaymentTermsController; use App\Http\Controllers\SettingController; use App\Mail\OrderConfirmation; -use Illuminate\Support\Facades\Mail; Route::get('/customers/{id}', [CustomerController::class, 'single']); @@ -26,21 +24,12 @@ Route::get('/invoices/{id}', [InvoiceController::class, 'single']); Route::put('/invoices/{id}', [InvoiceController::class, 'update']); Route::delete('/invoices/{id}', [InvoiceController::class, 'delete']); +Route::get('/invoices/{id}/remind', [InvoiceController::class, 'remind']); -Route::get('/invoices/{id}/remind/{recipient}', function ($id, $recipient) { - if (empty($recipient) || !filter_var($recipient, FILTER_VALIDATE_EMAIL)) { - return response()->json([ - 'error' => 'Keine gültige E_Mail-Adresse' - ], 400); - } - - $invoice = InvoiceController::single($id); - Mail::to($recipient)->send(new Reminder($invoice)); - // return new Reminder($invoice); -}); Route::get('/lineitems/{invoiceId}', [LineItemController::class, 'index']); + Route::get('/offers/{id}/confirm', function ($id) { // $offer = offerController::single($id); $offer = [