51 Commits

Author SHA1 Message Date
9a7b42dea5 Update .github/workflows/gemini-pr-review.yaml
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 16s
Laravel Pint / pint (pull_request) Successful in 2m33s
Laravel Larastan / larastan (pull_request) Failing after 3m38s
2026-01-13 09:18:16 +00:00
0ce59ebe22 Merge pull request 'changed time in scheduler for invoice in transit' (#178) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #178
2026-01-08 04:26:24 +00:00
dhanabalan
053c07bcfb changed time in scheduler for invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 37s
Laravel Pint / pint (pull_request) Successful in 2m15s
Laravel Larastan / larastan (pull_request) Failing after 3m20s
2026-01-08 09:56:12 +05:30
c032cdc58d Merge pull request 'changed time in invoice in transit' (#177) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #177
2026-01-07 04:59:13 +00:00
dhanabalan
b09ed3481a changed time in invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 23s
Laravel Pint / pint (pull_request) Successful in 2m40s
Laravel Larastan / larastan (pull_request) Failing after 3m38s
2026-01-07 10:29:01 +05:30
4074374614 Merge pull request 'Added logic for columns missing invoice in transit' (#176) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 17s
Reviewed-on: #176
2026-01-07 03:59:10 +00:00
dhanabalan
c2d840d772 Added logic for columns missing invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 42s
Laravel Pint / pint (pull_request) Successful in 2m37s
Laravel Larastan / larastan (pull_request) Failing after 3m49s
2026-01-07 09:28:57 +05:30
15712c44b6 Merge pull request 'changed report time for invoice in transit' (#175) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #175
2026-01-07 02:52:28 +00:00
dhanabalan
119262405c changed report time for invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / review (pull_request) Failing after 33s
Laravel Pint / pint (pull_request) Successful in 2m5s
Laravel Larastan / larastan (pull_request) Failing after 3m11s
2026-01-07 08:21:52 +05:30
99f7450e5e Merge pull request 'changed logic in testing temp resource page' (#174) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #174
2026-01-06 13:48:37 +00:00
dhanabalan
84748c5e3d changed logic in testing temp resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 23s
Laravel Pint / pint (pull_request) Successful in 3m49s
Laravel Larastan / larastan (pull_request) Failing after 4m51s
2026-01-06 19:18:22 +05:30
f6f6f0924e Merge pull request 'Added testing temp policy file' (#173) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #173
2026-01-06 13:28:27 +00:00
dhanabalan
4ec781b942 Added testing temp policy file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Gemini PR Review / review (pull_request) Failing after 26s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Pint / pint (pull_request) Successful in 2m33s
Laravel Larastan / larastan (pull_request) Failing after 3m35s
2026-01-06 18:58:16 +05:30
3bab0310a1 Merge pull request 'Added testing temp resource files' (#172) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #172
2026-01-06 13:26:55 +00:00
dhanabalan
f0f7bffe74 Added testing temp resource files
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 28s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Pint / pint (pull_request) Successful in 2m25s
Laravel Larastan / larastan (pull_request) Failing after 3m26s
2026-01-06 18:56:45 +05:30
6924990ace Merge pull request 'Added testing temp model file' (#171) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #171
2026-01-06 13:25:41 +00:00
dhanabalan
40889f8802 Added testing temp model file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 30s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Pint / pint (pull_request) Successful in 2m9s
Laravel Larastan / larastan (pull_request) Failing after 3m28s
2026-01-06 18:55:30 +05:30
ba0b2c2709 Merge pull request 'Added Testing temp migration file' (#170) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #170
2026-01-06 13:24:52 +00:00
dhanabalan
62272df783 Added Testing temp migration file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / review (pull_request) Failing after 26s
Laravel Pint / pint (pull_request) Successful in 2m19s
Laravel Larastan / larastan (pull_request) Failing after 3m24s
2026-01-06 18:54:39 +05:30
51416cdf37 Merge pull request 'Added 10 am for mauil trigger invoice in transit' (#169) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #169
2026-01-06 12:25:35 +00:00
dhanabalan
53d55555d8 Added 10 am for mauil trigger invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 19s
Gemini PR Review / review (pull_request) Failing after 22m14s
Laravel Larastan / larastan (pull_request) Failing after 27m34s
Laravel Pint / pint (pull_request) Successful in 7m16s
2026-01-06 17:54:50 +05:30
a8ff5b5120 Merge pull request 'modified logic for proper pending days in invoice in transit' (#168) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #168
2026-01-06 07:16:55 +00:00
dhanabalan
8c0a404665 modified logic for proper pending days in invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 25s
Laravel Larastan / larastan (pull_request) Failing after 3m19s
Laravel Pint / pint (pull_request) Successful in 3m28s
2026-01-06 12:46:41 +05:30
4ca965ccb1 Merge pull request 'chnaged time for invoice in transit' (#167) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #167
2026-01-06 06:36:03 +00:00
dhanabalan
def447e12b chnaged time for invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 31s
Laravel Pint / pint (pull_request) Successful in 3m31s
Laravel Larastan / larastan (pull_request) Failing after 13m46s
2026-01-06 12:05:52 +05:30
22cbb6c4d3 Merge pull request 'changed time for invoice transit' (#166) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #166
2026-01-06 04:28:11 +00:00
dhanabalan
f0b80554d2 changed time for invoice transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 26s
Laravel Pint / pint (pull_request) Successful in 2m35s
Laravel Larastan / larastan (pull_request) Failing after 3m26s
2026-01-06 09:57:58 +05:30
6db07e1825 Merge pull request 'Added delete logic inside the invoice in transits resource page' (#165) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #165
2026-01-04 10:37:33 +00:00
dhanabalan
469e0e1bbe Added delete logic inside the invoice in transits resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 52s
Laravel Pint / pint (pull_request) Successful in 2m10s
Laravel Larastan / larastan (pull_request) Failing after 2m55s
2026-01-04 16:07:21 +05:30
1bc0a4b01d Merge pull request 'chnaged logic for lr aw br date for pending days' (#164) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #164
2026-01-04 10:30:47 +00:00
dhanabalan
d03b803bae chnaged logic for lr aw br date for pending days
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 50s
Laravel Larastan / larastan (pull_request) Failing after 2m59s
Laravel Pint / pint (pull_request) Successful in 2m35s
2026-01-04 16:00:26 +05:30
dc77a51c3c Merge pull request 'Added permissions to view process order upload and download button' (#163) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #163
2026-01-04 09:59:05 +00:00
dhanabalan
5be689a9c1 Added permissions to view process order upload and download button
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 33s
Laravel Pint / pint (pull_request) Successful in 2m30s
Laravel Larastan / larastan (pull_request) Failing after 3m15s
2026-01-04 15:28:51 +05:30
b07a9596e5 Merge pull request 'Added order quantity in process order importer' (#162) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #162
2026-01-04 09:26:15 +00:00
dhanabalan
59b94b2b26 Added order quantity in process order importer
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 55s
Laravel Pint / pint (pull_request) Successful in 2m8s
Laravel Larastan / larastan (pull_request) Failing after 2m56s
2026-01-04 14:56:03 +05:30
b96a54aae5 Merge pull request 'Added alert mail rule exporter file' (#161) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #161
2026-01-04 06:07:42 +00:00
dhanabalan
09b756b35b Added alert mail rule exporter file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 1m24s
Laravel Larastan / larastan (pull_request) Failing after 3m3s
Laravel Pint / pint (pull_request) Successful in 2m14s
2026-01-04 11:37:30 +05:30
fe0e1e139e Merge pull request 'Added alert mail rule importer file' (#160) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #160
2026-01-04 06:06:52 +00:00
dhanabalan
ed26b4c705 Added alert mail rule importer file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / review (pull_request) Failing after 1m7s
Laravel Pint / pint (pull_request) Successful in 2m18s
Laravel Larastan / larastan (pull_request) Failing after 2m56s
2026-01-04 11:36:41 +05:30
a95766fd45 Merge pull request 'Added import and export inside the alert mail resource page' (#159) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #159
2026-01-04 06:06:04 +00:00
dhanabalan
9789f2828f Added import and export inside the alert mail resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 1m47s
Laravel Larastan / larastan (pull_request) Failing after 3m2s
Laravel Pint / pint (pull_request) Successful in 2m14s
2026-01-04 11:35:51 +05:30
d5d5a6d193 Merge pull request 'Added logic for invoice rule empty invoice in transit' (#158) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #158
2026-01-04 04:24:30 +00:00
dhanabalan
f27ba80475 Added logic for invoice rule empty invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 38s
Laravel Pint / pint (pull_request) Successful in 2m6s
Laravel Larastan / larastan (pull_request) Failing after 3m12s
2026-01-04 09:54:18 +05:30
25125cfead Merge pull request 'chnaged report timing to acctual time of invoice in transit' (#157) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #157
2026-01-04 04:23:23 +00:00
dhanabalan
1f657a626a chnaged report timing to acctual time of invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 37s
Laravel Larastan / larastan (pull_request) Failing after 3m3s
Laravel Pint / pint (pull_request) Successful in 2m44s
2026-01-04 09:53:09 +05:30
d6c6cf0c69 Merge pull request 'changed report time for invoice in transit' (#156) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #156
2026-01-04 04:17:22 +00:00
dhanabalan
ca9261d75a changed report time for invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 1m5s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 44s
Gemini PR Review / review (pull_request) Failing after 2m43s
Laravel Larastan / larastan (pull_request) Failing after 3m4s
Laravel Pint / pint (pull_request) Successful in 2m22s
2026-01-04 09:47:10 +05:30
99a95dc150 Merge pull request 'removed manual trigger of invoice data report button from alert mail resource' (#155) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #155
2026-01-03 11:13:49 +00:00
dhanabalan
99afa82c75 removed manual trigger of invoice data report button from alert mail resource
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 48s
Laravel Pint / pint (pull_request) Successful in 1m58s
Laravel Larastan / larastan (pull_request) Failing after 3m16s
2026-01-03 16:43:35 +05:30
6d26307c4a Merge pull request 'Added invoice master id in alert mail rules' (#154) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #154
2026-01-03 11:07:06 +00:00
dhanabalan
efaf876df3 Added invoice master id in alert mail rules
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 46s
Laravel Pint / pint (pull_request) Successful in 2m16s
Laravel Larastan / larastan (pull_request) Failing after 2m51s
2026-01-03 16:36:54 +05:30
18 changed files with 845 additions and 56 deletions

View File

@@ -5,15 +5,20 @@ name: Gemini PR Review
on:
pull_request:
types: [opened, reopened, synchronize]
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
review:
gemini-pr-review:
runs-on: ubuntu-latest
name: Gemini PR Review
steps:
- name: Checkout code
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0 # This fetches the full history
@@ -22,7 +27,6 @@ jobs:
with:
node-version: '24'
- name: Get npm cache directory
id: npm-cache-dir
run: |
@@ -36,8 +40,14 @@ jobs:
restore-keys: |
${{ runner.os }}-npm-global-
# - name: Install Gemini CLI globally
# run: npm install -g --loglevel=http @google/gemini-cli
- name: Install Gemini CLI globally (if not already installed)
run: |
if ! command -v gemini &> /dev/null; then
echo "Gemini CLI not found, installing..."
npm install -g --loglevel=http @google/gemini-cli
else
echo "Gemini CLI already installed."
fi
- name: Generate git diff and review with Gemini
id: review
@@ -52,7 +62,6 @@ jobs:
cat /tmp/gemini-client-error*.json || true
- name: Post output to PR comment
id: post_comment
run: |

View File

@@ -220,7 +220,6 @@ class Scheduler extends Command
}
}
/**
* Helper to call Artisan commands with parameters.
*/

View File

@@ -67,13 +67,21 @@ class SendInvoiceTransitReport extends Command
'im.id as invoice_master_id',
'im.transport_name',
DB::raw('CAST(im.transit_days AS INTEGER) as transit_days'),
DB::raw('(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE)) as delayed_days')
// DB::raw('(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE)) as delayed_days')
DB::raw('
GREATEST(
0,
(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE) - 1)
- CAST(im.transit_days AS INTEGER)
) AS delayed_days
')
)
->when($plantId != 0, fn($q) => $q->where('it.plant_id', $plantId))
->whereNotNull('it.lr_bl_aw_date')
->whereRaw(
'(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE)) >= CAST(im.transit_days AS INTEGER)'
)
->whereRaw('
(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE))
- CAST(im.transit_days AS INTEGER) > 0
')
->get();
@@ -87,6 +95,13 @@ class SendInvoiceTransitReport extends Command
foreach ($mailRules as $rule) {
$ruleInvoices = $results->where('invoice_master_id', $rule->invoice_master_id);
//$ruleInvoices = $results->filter(fn($item) => $item->invoice_master_id == (int)$rule->invoice_master_id);
if ($ruleInvoices->isEmpty()) {
$this->info("Skipping rule {$rule->id} — no invoice transit data.");
continue; // ❌ DO NOT SEND MAIL
}
$invoiceMaster = InvoiceMaster::find($rule->invoice_master_id);

View File

@@ -0,0 +1,73 @@
<?php
namespace App\Filament\Exports;
use App\Models\AlertMailRule;
use App\Models\Plant;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class AlertMailRuleExporter extends Exporter
{
protected static ?string $model = AlertMailRule::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('module')
->label('MODULE'),
ExportColumn::make('rule_name')
->label('RULE NAME'),
ExportColumn::make('email')
->label('EMAIL'),
ExportColumn::make('schedule_type')
->label('SCHEDULE TYPE'),
ExportColumn::make('plant')
->label('PLANT CODE')
->formatStateUsing(function ($state) {
// $state is the plant ID from the database
if ($state == 0) {
return 'All Plants';
}
$plant = Plant::find($state);
return $plant ? $plant->code : 'Unknown';
}),
ExportColumn::make('cc_emails')
->label('CC EMAILS'),
ExportColumn::make('invoiceMaster.receiving_plant_name')
->label('RECEIVING PLANT NAME'),
ExportColumn::make('invoiceMaster.transport_name')
->label('TRANSPORT NAME'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your alert mail rule export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,141 @@
<?php
namespace App\Filament\Imports;
use App\Models\AlertMailRule;
use App\Models\Plant;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Facades\Filament;
use Str;
class AlertMailRuleImporter extends Importer
{
protected static ?string $model = AlertMailRule::class;
public static function getColumns(): array
{
return [
ImportColumn::make('module')
->requiredMapping()
->exampleHeader('Module')
->example('ProductionQuantities/InvoiceValidation/QualityValidation/InvoiceDataReport/InvoiceTransit')
->label('Module')
->rules(['required']),
ImportColumn::make('rule_name')
->requiredMapping()
->exampleHeader('Rule Name')
->example('ProductionMail/InvoiceMail/QualityMail/InvoiceDataMail/InvoiceTransitMail')
->label('Rule Name')
->rules(['required']),
ImportColumn::make('email')
->requiredMapping()
->exampleHeader('Email')
->example('admin@cripumps.com,ranjith.bala@cripumps.com')
->label('Email')
->rules(['required']),
ImportColumn::make('schedule_type')
->exampleHeader('Schedule Type')
->example('Daily/Live/Hourly')
->label('Schedule Type'),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Code')
->example('1000 or All Plants')
->label('Plant Code')
->rules(['required']),
ImportColumn::make('cc_emails')
->exampleHeader('CC Email')
->example('admin@cripumps.com,ranjith.bala@cripumps.com')
->label('CC Email')
->rules(['nullable', 'string']),
//->rules(['cc_emails']),
// ImportColumn::make('invoiceMaster')
// ->relationship(),
ImportColumn::make('receiving_plant_name')
->exampleHeader('Receiving Plant Name')
->example('BANGALORE')
->label('Receiving Plant Name')
->requiredMapping(),
ImportColumn::make('transporter_name')
->exampleHeader('Transporter Name')
->example('SAFEXPRESS PRIVATE LIMITED')
->label('Transporter Name')
->requiredMapping(),
];
}
public function resolveRecord(): ?AlertMailRule
{
$warnMsg = [];
$user = Filament::auth()->user();
$operatorName = $user->name;
if (strtolower($this->data['plant']) == 'all plants') {
$this->data['plant'] = 0;
} else {
$plant = Plant::where('code', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant code '{$this->data['plant']}' not found.";
$this->data['plant'] = null;
} else {
$this->data['plant'] = $plant->id;
}
}
$receivingPlantName = $this->data['receiving_plant_name'] ?? null;
$transporterName = $this->data['transporter_name'] ?? null;
if (!$receivingPlantName || !$transporterName)
{
$warnMsg [] = 'Both Receiving Plant Name and Transporter Name are required.';
}
$invoiceMaster = \App\Models\InvoiceMaster::where('receiving_plant_name', $receivingPlantName)
->where('transport_name', $transporterName)
->first();
if (!$invoiceMaster) {
$warnMsg [] = "Invoice Master not found for Receiving Plant '{$receivingPlantName}' and Transporter '{$transporterName}'.";
}
$this->data['invoice_master_id'] = $invoiceMaster->id;
unset($this->data['receiving_plant_name'], $this->data['transporter_name']);
if(! empty($warnMsg)){
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return AlertMailRule::Create([
'module' => $this->data['module'],
'rule_name' => $this->data['rule_name'],
'email' => $this->data['email'],
'schedule_type' => $this->data['schedule_type'],
'plant' => $this->data['plant'],
'cc_emails' => $this->data['cc_emails'] ?? null,
'invoice_master_id' => $invoiceMaster->id,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
//return new AlertMailRule();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your alert mail rule import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -10,6 +10,7 @@ use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;
class ProcessOrderImporter extends Importer
@@ -38,41 +39,57 @@ class ProcessOrderImporter extends Importer
->example('202500123456')
->label('PROCESS ORDER')
->rules(['required']),
ImportColumn::make('created_by')
->exampleHeader('CREATED BY')
->example('RAW01234')
->label('CREATED BY')
ImportColumn::make('order_quantity')
->exampleHeader('ORDER QUANTITY')
->example('100')
->label('ORDER QUANTITY')
->rules(['required']),
// ImportColumn::make('created_by')
// ->exampleHeader('CREATED BY')
// ->example('RAW01234')
// ->label('CREATED BY')
// ->rules(['required']),
];
}
public function resolveRecord(): ?ProcessOrder
{
$warnMsg = [];
$plant = Plant::where('code', $this->data['plant'])->first();
$itemCode = Item::where('code', $this->data['item'])->first();
$plantCod = $this->data['plant'];
$plant = null;
$iCode = trim($this->data['item']);
$processOrder = trim($this->data['process_order'] ?? '');
$user = Filament::auth()->user();
$operatorName = $user->name;
if (Str::length($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
$warnMsg[] = 'Invalid plant code found';
} else {
$plant = Plant::where('code', $plantCod)->first();
if (! $plant) {
$warnMsg[] = 'Plant not found';
} elseif (Str::length($iCode) < 6 || ! ctype_alnum($iCode)) {
$warnMsg[] = 'Invalid item code found';
} elseif (! $itemCode) {
$warnMsg[] = 'Item Code not found';
}
}
$processOrder = trim($this->data['process_order'] ?? '');
if (Str::length($iCode) < 6 || ! ctype_alnum($iCode)) {
$warnMsg[] = 'Invalid item code found';
} else {
$itemCode = Item::where('code', $iCode)->first();
if (! $itemCode) {
$warnMsg[] = 'Item Code not found';
}
}
if ($processOrder == '') {
$warnMsg[] = 'Process Order cannot be empty';
}
$user = User::where('name', $this->data['created_by'])->first();
if (! $user) {
$warnMsg[] = 'User not found';
}
// $user = User::where('name', $this->data['created_by'])->first();
// if (! $user) {
// $warnMsg[] = 'User not found';
// }
if ($plant && $processOrder != '') {
if ($plant && $itemCode && $processOrder != '') {
$existingOrder = ProcessOrder::where('plant_id', $plant->id)
->where('process_order', $processOrder)
@@ -94,7 +111,7 @@ class ProcessOrderImporter extends Importer
'coil_number' => '0',
'order_quantity' => 0,
'received_quantity' => 0,
'created_by' => $user->name,
'created_by' => $operatorName,
]);
// return new ProcessOrder();

View File

@@ -2,6 +2,8 @@
namespace App\Filament\Resources;
use App\Filament\Exports\AlertMailRuleExporter;
use App\Filament\Imports\AlertMailRuleImporter;
use App\Filament\Resources\AlertMailRuleResource\Pages;
use App\Filament\Resources\AlertMailRuleResource\RelationManagers;
use App\Models\AlertMailRule;
@@ -23,6 +25,8 @@ use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException as ValidationValidationException;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Actions\ExportAction;
class AlertMailRuleResource extends Resource
{
@@ -118,31 +122,31 @@ class AlertMailRuleResource extends Resource
->label('All Plants Reports')
->afterStateUpdated(fn ($state, callable $set) => $state ? $set('plant', null) : null)
->reactive(),
Forms\Components\Actions::make([
Action::make('sendInvoiceData')
->label('Invoice Data Report')
->action(function ($get) {
// Forms\Components\Actions::make([
// Action::make('sendInvoiceData')
// ->label('Invoice Data Report')
// ->action(function ($get) {
$plantIds = AlertMailRule::where('module', 'InvoiceDataReport')
->orderBy('plant')
->pluck('plant')
->toArray();
// $plantIds = AlertMailRule::where('module', 'InvoiceDataReport')
// ->orderBy('plant')
// ->pluck('plant')
// ->toArray();
foreach ($plantIds as $plantId) {
Artisan::call('send:invoice-data-report', [
'schedule_type' => 'Daily',
'plant' => $plantId,
]);
}
// foreach ($plantIds as $plantId) {
// Artisan::call('send:invoice-data-report', [
// 'schedule_type' => 'Daily',
// 'plant' => $plantId,
// ]);
// }
// Notify user in Filament
Notification::make()
->title('Invoice data report sent successfully!')
->success()
->send();
}),
// // Notify user in Filament
// Notification::make()
// ->title('Invoice data report sent successfully!')
// ->success()
// ->send();
// }),
]),
// ]),
Forms\Components\Hidden::make('created_by')
->default(fn () => Filament::auth()->user()?->name),
Forms\Components\Hidden::make('updated_by')
@@ -250,6 +254,22 @@ class AlertMailRuleResource extends Resource
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->label('Import Alert Mail Rule')
->color('warning')
->importer(AlertMailRuleImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import alert mail rule');
}),
ExportAction::make()
->label('Export Alert Mail Rule')
->color('warning')
->exporter(AlertMailRuleExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export alert mail rule');
}),
]);
}

View File

@@ -256,6 +256,7 @@ class InvoiceInTransitResource extends Resource
->directory('uploads/temp'),
])
->action(function (array $data) {
InvoiceInTransit::truncate();
$uploadedFile = $data['invoice_in_transit_file'];
$disk = Storage::disk('local');
@@ -453,6 +454,22 @@ class InvoiceInTransitResource extends Resource
return;
}
$mandatoryColumns = 23;
$firstRow = $rows[0] ?? [];
if (count($firstRow) < $mandatoryColumns) {
Notification::make()
->title('Invalid Excel Format')
->body('Few columns not found. Columns A to W are mandatory.')
->danger()
->persistent()
->send();
return;
}
foreach ($rows as $index => $row)
{
if ($index == 0) {

View File

@@ -30,6 +30,8 @@ use Filament\Forms\Components\Select;
use App\Models\Line;
use Filament\Forms\Components\TextInput;
use App\Models\Item;
use App\Models\User;
// use App\Models\PalletValidation;
// use Dom\Text;
@@ -286,10 +288,16 @@ class ProcessOrderResource extends Resource
->disk('local')
->directory('uploads/temp')
->preserveFilenames()
->visible(function() {
return Filament::auth()->user()->can('view process order packing slip');
})
->reactive(),
Forms\Components\Actions::make([
Action::make('uploadNow')
->label('Upload PDF Now')
->visible(function() {
return Filament::auth()->user()->can('view process order packing slip');
})
->action(function ($get, callable $set) {
$uploadedFiles = $get('attachment');
@@ -377,6 +385,9 @@ class ProcessOrderResource extends Resource
Action::make('downloadAttachment')
->label('Download PDF')
->visible(function() {
return Filament::auth()->user()->can('view process order packing slip');
})
->action(function ($get) {
$equipmentNumber = $get('process_order');

View File

@@ -0,0 +1,252 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\TestingTempResource\Pages;
use App\Filament\Resources\TestingTempResource\RelationManagers;
use App\Models\TestingTemp;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Actions\Action;
use Filament\Notifications\Notification;
use Storage;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
class TestingTempResource extends Resource
{
protected static ?string $model = TestingTemp::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\TextInput::make('name')
->label('File Name'),
Forms\Components\Select::make('selected_file')
->label('Select Uploaded File')
->options(function () {
return collect(Storage::disk('local')->files('uploads'))
->mapWithKeys(function ($file) {
return [
$file => basename($file), // value => label
];
})
->toArray();
})
->searchable()
->reactive(),
Forms\Components\FileUpload::make('attachment')
->label('Upload')
// ->acceptedFileTypes(['application/pdf'])
->storeFiles(false)
->disk('local')
->directory('uploads/temp')
->preserveFilenames()
->reactive(),
Forms\Components\Actions::make([
Action::make('uploadNow')
->label('File Upload')
->color('success')
->action(function ($get) {
$uploadedFiles = $get('attachment');
if (is_array($uploadedFiles) && count($uploadedFiles) > 0) {
$uploaded = reset($uploadedFiles);
if ($uploaded instanceof TemporaryUploadedFile) {
$baseName = $get('name');
$extension = $uploaded->getClientOriginalExtension();
$finalFileName = $baseName . '.' . $extension;
$uploaded->storeAs(
'uploads',
$finalFileName,
'local'
);
Notification::make()
->title("File uploaded successfully: {$finalFileName}")
->success()
->send();
}
} else {
Notification::make()
->title('No file selected to upload')
->warning()
->send();
}
}),
// Action::make('downloadAttachment')
// ->label('Download File')
// ->action(function ($get) {
// $fileName = basename($get('selected_file'));
// //dd($fileName);
// // if (!$fileName) {
// // Notification::make()
// // ->title('Enter file name to download')
// // ->danger()
// // ->send();
// // return;
// // }
// $files = Storage::disk('local')->files('uploads');
// foreach ($files as $file) {
// if (pathinfo($file, PATHINFO_FILENAME) === $fileName) {
// dd($fileName);
// Notification::make()
// ->title("File downloaded successfully")
// ->success()
// ->send();
// return response()->download(
// Storage::disk('local')->path($file)
// );
// }
// }
// // Notification::make()
// // ->title('File not found')
// // ->danger()
// // ->send();
// }),
Action::make('downloadAttachment')
->label('Download File')
->action(function ($get) {
$filePath = $get('selected_file'); // uploads/filename.pdf
if (!$filePath || !Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
->send();
return;
}
Notification::make()
->title('File downloaded successfully')
->success()
->send();
return response()->download(
Storage::disk('local')->path($filePath)
);
}),
Action::make('deleteAttachment')
->label('Delete File')
->color('danger')
->requiresConfirmation()
->action(function ($get) {
$filePath = $get('selected_file'); // uploads/filename.pdf
if (!$filePath || !Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
->send();
return;
}
Storage::disk('local')->delete($filePath);
Notification::make()
->title('File deleted successfully')
->success()
->send();
}),
]),
Forms\Components\Hidden::make('created_by')
->label('Created By')
->default(Filament::auth()->user()?->name),
Forms\Components\Hidden::make('updated_by')
->label('Updated By')
->default(Filament::auth()->user()?->name),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListTestingTemps::route('/'),
'create' => Pages\CreateTestingTemp::route('/create'),
'view' => Pages\ViewTestingTemp::route('/{record}'),
'edit' => Pages\EditTestingTemp::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\TestingTempResource\Pages;
use App\Filament\Resources\TestingTempResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateTestingTemp extends CreateRecord
{
protected static string $resource = TestingTempResource::class;
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Filament\Resources\TestingTempResource\Pages;
use App\Filament\Resources\TestingTempResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditTestingTemp extends EditRecord
{
protected static string $resource = TestingTempResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\TestingTempResource\Pages;
use App\Filament\Resources\TestingTempResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListTestingTemps extends ListRecords
{
protected static string $resource = TestingTempResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\TestingTempResource\Pages;
use App\Filament\Resources\TestingTempResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewTestingTemp extends ViewRecord
{
protected static string $resource = TestingTempResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -13,6 +13,7 @@ class AlertMailRule extends Model
protected $fillable = [
'module',
'plant',
'invoice_master_id',
'rule_name',
'email',
'cc_emails',
@@ -23,8 +24,9 @@ class AlertMailRule extends Model
'updated_by',
];
// public function plant(): BelongsTo
// {
// return $this->belongsTo(Plant::class);
// }
public function invoiceMaster(): BelongsTo
{
return $this->belongsTo(InvoiceMaster::class);
//return $this->belongsTo(InvoiceMaster::class, 'invoice_master_id');
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class TestingTemp extends Model
{
use SoftDeletes;
protected $fillable = [
'name',
'created_at',
'updated_at',
'created_by',
'updated_by',
];
}

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\Response;
use App\Models\TestingTemp;
use App\Models\User;
class TestingTempPolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->checkPermissionTo('view-any TestingTemp');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, TestingTemp $testingtemp): bool
{
return $user->checkPermissionTo('view TestingTemp');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->checkPermissionTo('create TestingTemp');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, TestingTemp $testingtemp): bool
{
return $user->checkPermissionTo('update TestingTemp');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, TestingTemp $testingtemp): bool
{
return $user->checkPermissionTo('delete TestingTemp');
}
/**
* Determine whether the user can delete any models.
*/
public function deleteAny(User $user): bool
{
return $user->checkPermissionTo('delete-any TestingTemp');
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, TestingTemp $testingtemp): bool
{
return $user->checkPermissionTo('restore TestingTemp');
}
/**
* Determine whether the user can restore any models.
*/
public function restoreAny(User $user): bool
{
return $user->checkPermissionTo('restore-any TestingTemp');
}
/**
* Determine whether the user can replicate the model.
*/
public function replicate(User $user, TestingTemp $testingtemp): bool
{
return $user->checkPermissionTo('replicate TestingTemp');
}
/**
* Determine whether the user can reorder the models.
*/
public function reorder(User $user): bool
{
return $user->checkPermissionTo('reorder TestingTemp');
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, TestingTemp $testingtemp): bool
{
return $user->checkPermissionTo('force-delete TestingTemp');
}
/**
* Determine whether the user can permanently delete any models.
*/
public function forceDeleteAny(User $user): bool
{
return $user->checkPermissionTo('force-delete-any TestingTemp');
}
}

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql = <<<'SQL'
CREATE TABLE testing_temps (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
name TEXT DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
created_by TEXT DEFAULT NULL,
updated_by TEXT DEFAULT NULL,
deleted_at TIMESTAMP
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('testing_temps');
}
};