diff --git a/app/Export/CSV/ActivityExport.php b/app/Export/CSV/ActivityExport.php new file mode 100644 index 000000000000..09d555fc1954 --- /dev/null +++ b/app/Export/CSV/ActivityExport.php @@ -0,0 +1,121 @@ + 'date', + 'activity' => 'activity', + 'address' => 'address', + ]; + + private array $decorate_keys = [ + + ]; + + public function __construct(Company $company, array $input) + { + $this->company = $company; + $this->input = $input; + $this->entity_transformer = new ActivityTransformer(); + } + + public function run() + { + MultiDB::setDb($this->company->db); + App::forgetInstance('translator'); + App::setLocale($this->company->locale()); + $t = app('translator'); + $t->replace(Ninja::transformTranslations($this->company->settings)); + + $this->date_format = DateFormat::find($this->company->settings->date_format_id)->format; + + //load the CSV document from a string + $this->csv = Writer::createFromString(); + + ksort($this->entity_keys); + + if (count($this->input['report_keys']) == 0) { + $this->input['report_keys'] = array_values($this->entity_keys); + } + + //insert the header + $this->csv->insertOne($this->buildHeader()); + + $query = Activity::query() + ->where('company_id', $this->company->id); + + $query = $this->addDateRange($query); + + $query->cursor() + ->each(function ($entity) { + $this->buildRow($entity); + }); + + return $this->csv->toString(); + } + + private function buildRow(Activity $activity) + { + + $this->csv->insertOne([ + Carbon::parse($activity->created_at)->format($this->date_format), + ctrans("texts.activity_{$activity->activity_type_id}",[ + 'client' => $activity->client ? $activity->client->present()->name() : '', + 'contact' => $activity->contact ? $activity->contact->present()->name() : '', + 'quote' => $activity->quote ? $activity->quote->number : '', + 'user' => $activity->user ? $activity->user->present()->name() : 'System', + 'expense' => $activity->expense ? $activity->expense->number : '', + 'invoice' => $activity->invoice ? $activity->invoice->number : '', + 'recurring_invoice' => $activity->recurring_invoice ? $activity->recurring_invoice->number : '', + 'payment' => $activity->payment ? $activity->payment->number : '', + 'credit' => $activity->credit ? $activity->credit->number : '', + 'task' => $activity->task ? $activity->task->number : '', + 'vendor' => $activity->vendor ? $activity->vendor->present()->name() : '', + 'purchase_order' => $activity->purchase_order ? $activity->purchase_order->number : '', + 'subscription' => $activity->subscription ? $activity->subscription->name : '', + 'vendor_contact' => $activity->vendor_contact ? $activity->vendor_contact->present()->name() : '', + 'recurring_expense' => $activity->recurring_expense ? $activity->recurring_expense->number : '', + ]), + $activity->ip, + ]); + + + } + + private function decorateAdvancedFields(Task $task, array $entity) :array + { + return $entity; + } +} diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 89e3b194040b..5d3d67fa619b 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -114,7 +114,6 @@ class ActivityController extends BaseController 'credit' => $activity->credit ? $activity->credit : '', 'task' => $activity->task ? $activity->task : '', 'vendor' => $activity->vendor ? $activity->vendor : '', - 'vendor_contact' => $activity->vendor_contact ? $activity->vendor_contact : '', 'purchase_order' => $activity->purchase_order ? $activity->purchase_order : '', 'subscription' => $activity->subscription ? $activity->subscription : '', 'vendor_contact' => $activity->vendor_contact ? $activity->vendor_contact : '', diff --git a/app/Http/Controllers/Reports/ActivityReportController.php b/app/Http/Controllers/Reports/ActivityReportController.php new file mode 100644 index 000000000000..24e1feb2e587 --- /dev/null +++ b/app/Http/Controllers/Reports/ActivityReportController.php @@ -0,0 +1,54 @@ +has('send_email') && $request->get('send_email')) { + SendToAdmin::dispatch(auth()->user()->company(), $request->all(), ActivityExport::class, $this->filename); + + return response()->json(['message' => 'working...'], 200); + } + // expect a list of visible fields, or use the default + + $export = new ActivityExport(auth()->user()->company(), $request->all()); + + $csv = $export->run(); + + $headers = [ + 'Content-Disposition' => 'attachment', + 'Content-Type' => 'text/csv', + ]; + + return response()->streamDownload(function () use ($csv) { + echo $csv; + }, $this->filename, $headers); + } +} diff --git a/routes/api.php b/routes/api.php index 26be8a89aedc..4eed06948c5f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -10,93 +10,94 @@ | is assigned the "api" middleware group. Enjoy building your API! | */ -use App\Http\Controllers\AccountController; -use App\Http\Controllers\ActivityController; -use App\Http\Controllers\Auth\ForgotPasswordController; -use App\Http\Controllers\Auth\LoginController; -use App\Http\Controllers\Bank\YodleeController; -use App\Http\Controllers\BankIntegrationController; -use App\Http\Controllers\BankTransactionController; -use App\Http\Controllers\BankTransactionRuleController; +use Illuminate\Support\Facades\Route; use App\Http\Controllers\BaseController; +use App\Http\Controllers\PingController; +use App\Http\Controllers\TaskController; +use App\Http\Controllers\UserController; use App\Http\Controllers\ChartController; +use App\Http\Controllers\EmailController; +use App\Http\Controllers\QuoteController; +use App\Http\Controllers\TokenController; use App\Http\Controllers\ClientController; -use App\Http\Controllers\ClientGatewayTokenController; -use App\Http\Controllers\ClientStatementController; -use App\Http\Controllers\CompanyController; -use App\Http\Controllers\CompanyGatewayController; -use App\Http\Controllers\CompanyLedgerController; -use App\Http\Controllers\CompanyUserController; -use App\Http\Controllers\ConnectedAccountController; use App\Http\Controllers\CreditController; use App\Http\Controllers\DesignController; -use App\Http\Controllers\DocumentController; -use App\Http\Controllers\EmailController; -use App\Http\Controllers\ExpenseCategoryController; -use App\Http\Controllers\ExpenseController; use App\Http\Controllers\ExportController; use App\Http\Controllers\FilterController; -use App\Http\Controllers\GroupSettingController; -use App\Http\Controllers\HostedMigrationController; use App\Http\Controllers\ImportController; -use App\Http\Controllers\ImportJsonController; -use App\Http\Controllers\InAppPurchase\AppleController; +use App\Http\Controllers\LogoutController; +use App\Http\Controllers\StaticController; +use App\Http\Controllers\StripeController; +use App\Http\Controllers\TwilioController; +use App\Http\Controllers\VendorController; +use App\Http\Controllers\AccountController; +use App\Http\Controllers\CompanyController; +use App\Http\Controllers\ExpenseController; use App\Http\Controllers\InvoiceController; use App\Http\Controllers\LicenseController; -use App\Http\Controllers\LogoutController; -use App\Http\Controllers\MigrationController; -use App\Http\Controllers\OneTimeTokenController; use App\Http\Controllers\PaymentController; -use App\Http\Controllers\PaymentNotificationWebhookController; -use App\Http\Controllers\PaymentTermController; -use App\Http\Controllers\PaymentWebhookController; -use App\Http\Controllers\PingController; -use App\Http\Controllers\PostMarkController; use App\Http\Controllers\PreviewController; -use App\Http\Controllers\PreviewPurchaseOrderController; use App\Http\Controllers\ProductController; use App\Http\Controllers\ProjectController; +use App\Http\Controllers\TaxRateController; +use App\Http\Controllers\WebCronController; +use App\Http\Controllers\WebhookController; +use App\Http\Controllers\ActivityController; +use App\Http\Controllers\DocumentController; +use App\Http\Controllers\PostMarkController; +use App\Http\Controllers\TemplateController; +use App\Http\Controllers\MigrationController; +use App\Http\Controllers\SchedulerController; +use App\Http\Controllers\SubdomainController; +use App\Http\Controllers\SystemLogController; +use App\Http\Controllers\TwoFactorController; +use App\Http\Controllers\Auth\LoginController; +use App\Http\Controllers\ImportJsonController; +use App\Http\Controllers\SelfUpdateController; +use App\Http\Controllers\TaskStatusController; +use App\Http\Controllers\Bank\YodleeController; +use App\Http\Controllers\CompanyUserController; +use App\Http\Controllers\PaymentTermController; +use App\Http\Controllers\GroupSettingController; +use App\Http\Controllers\OneTimeTokenController; +use App\Http\Controllers\SubscriptionController; +use App\Http\Controllers\CompanyLedgerController; use App\Http\Controllers\PurchaseOrderController; -use App\Http\Controllers\QuoteController; +use App\Http\Controllers\TaskSchedulerController; +use App\Http\Controllers\CompanyGatewayController; +use App\Http\Controllers\PaymentWebhookController; +use App\Http\Controllers\RecurringQuoteController; +use App\Http\Controllers\BankIntegrationController; +use App\Http\Controllers\BankTransactionController; +use App\Http\Controllers\ClientStatementController; +use App\Http\Controllers\ExpenseCategoryController; +use App\Http\Controllers\HostedMigrationController; +use App\Http\Controllers\ConnectedAccountController; use App\Http\Controllers\RecurringExpenseController; use App\Http\Controllers\RecurringInvoiceController; -use App\Http\Controllers\RecurringQuoteController; -use App\Http\Controllers\Reports\ClientContactReportController; +use App\Http\Controllers\ClientGatewayTokenController; +use App\Http\Controllers\Reports\TaskReportController; +use App\Http\Controllers\Auth\ForgotPasswordController; +use App\Http\Controllers\BankTransactionRuleController; +use App\Http\Controllers\InAppPurchase\AppleController; +use App\Http\Controllers\Reports\QuoteReportController; +use App\Http\Controllers\PreviewPurchaseOrderController; use App\Http\Controllers\Reports\ClientReportController; use App\Http\Controllers\Reports\CreditReportController; -use App\Http\Controllers\Reports\DocumentReportController; use App\Http\Controllers\Reports\ExpenseReportController; -use App\Http\Controllers\Reports\InvoiceItemReportController; use App\Http\Controllers\Reports\InvoiceReportController; use App\Http\Controllers\Reports\PaymentReportController; use App\Http\Controllers\Reports\ProductReportController; -use App\Http\Controllers\Reports\ProductSalesReportController; use App\Http\Controllers\Reports\ProfitAndLossController; +use App\Http\Controllers\Reports\ActivityReportController; +use App\Http\Controllers\Reports\DocumentReportController; use App\Http\Controllers\Reports\QuoteItemReportController; -use App\Http\Controllers\Reports\QuoteReportController; -use App\Http\Controllers\Reports\RecurringInvoiceReportController; -use App\Http\Controllers\Reports\TaskReportController; -use App\Http\Controllers\SchedulerController; -use App\Http\Controllers\SelfUpdateController; -use App\Http\Controllers\StaticController; -use App\Http\Controllers\StripeController; -use App\Http\Controllers\SubdomainController; -use App\Http\Controllers\SubscriptionController; use App\Http\Controllers\Support\Messages\SendingController; -use App\Http\Controllers\SystemLogController; -use App\Http\Controllers\TaskController; -use App\Http\Controllers\TaskSchedulerController; -use App\Http\Controllers\TaskStatusController; -use App\Http\Controllers\TaxRateController; -use App\Http\Controllers\TemplateController; -use App\Http\Controllers\TokenController; -use App\Http\Controllers\TwilioController; -use App\Http\Controllers\TwoFactorController; -use App\Http\Controllers\UserController; -use App\Http\Controllers\VendorController; -use App\Http\Controllers\WebCronController; -use App\Http\Controllers\WebhookController; -use Illuminate\Support\Facades\Route; +use App\Http\Controllers\Reports\InvoiceItemReportController; +use App\Http\Controllers\PaymentNotificationWebhookController; +use App\Http\Controllers\Reports\ProductSalesReportController; +use App\Http\Controllers\Reports\ClientContactReportController; +use App\Http\Controllers\Reports\RecurringInvoiceReportController; Route::group(['middleware' => ['throttle:api', 'api_secret_check']], function () { Route::post('api/v1/signup', [AccountController::class, 'store'])->name('signup.submit'); @@ -269,6 +270,7 @@ Route::group(['middleware' => ['throttle:api', 'api_db', 'token_auth', 'locale'] Route::post('refresh', [LoginController::class, 'refresh'])->middleware('throttle:refresh'); Route::post('reports/clients', ClientReportController::class); + Route::post('reports/activities', ActivityReportController::class); Route::post('reports/contacts', ClientContactReportController::class); Route::post('reports/credits', CreditReportController::class); Route::post('reports/documents', DocumentReportController::class);