diff --git a/app/Console/Commands/MiningTaxes/MiningTaxesInvoicesNew.php b/app/Console/Commands/MiningTaxes/MiningTaxesInvoicesNew.php index 0c1e9167e..ffb576e2d 100644 --- a/app/Console/Commands/MiningTaxes/MiningTaxesInvoicesNew.php +++ b/app/Console/Commands/MiningTaxes/MiningTaxesInvoicesNew.php @@ -6,6 +6,8 @@ namespace App\Console\Commands\MiningTaxes; use Illuminate\Console\Command; use Log; use Carbon\Carbon; +use Illuminate\Support\Collection; +use Illuminate\Support\Str; //Application Library use Commands\Library\CommandHelper; @@ -48,6 +50,10 @@ class MiningTaxesInvoicesNew extends Command /** * Execute the console command. + * Get all of the users, then build a list of alts. From the main user and list of alts, + * check for mining ledgers which haven't been invoiced, and invoice them. + * Once the main check of all characters is completed, then create a separate list of characters + * to send as one offs who haven't registered alts for this process. * * @return int */ @@ -59,70 +65,309 @@ class MiningTaxesInvoicesNew extends Command $task = new CommandHelper('MiningTaxesInvoicesNew'); $mainsAlts = array(); $mailDelay = 15; + $mainIds = new Collection; + //Set the task as started $task->SetStartStatus(); - //Get the characters for each non-invoiced ledger entry + //Get all of the users in the database + $charIds = User::all(); + + //Get a list of the alts for each character, then process the ledgers and combine them to send one mail out + //in this first part + foreach($charIds as $charId) { + //Gather up all of the ledgers from the character and its alts. + $ledgers = $this->LedgersWithAlts($charId); + + //Create an invoice from the ledger rows + $this->CreateInvoice($charId, $ledgers, $mailDelay); + } + + //Get the ledgers characters which haven't had an invoice created yet. $charIds = Ledger::where([ 'invoiced' => 'No', - ])->distinct('character_id') - ->pluck('character_id'); - - //If character ids are null, then there are no ledgers to process. - if($charIds->count() == 0) { - //Set the task status as done and Log the issue - $task->SetStopStatus(); - Log::warning("No characters found to send invoices to in MiningTaxesInvoices Command."); + ])->distinct('character_id') + ->pluck('character_id'); + + if($charIds == null) { return 0; } - /** - * From the list of character ids, create an array of mains and alts to group together. - */ - foreach($charIds as $charId) { - $invoice = array(); - $ores = array(); - $totalPrice = 0.00; - $body = null; - $mainId = null; - - //Determine if this character is an alt of someone else - $foundAlt = UserAlt::where([ - 'character_id' => $charId, - ])->get(); - - //If we found an alt, then take the main's id and use it for the next set of calculations - if($foundAlt->count() > 0) { - $mainId = $foundAlt->main_id; - } else { - //If we didn't find an alt, then we assume this is the main character's id - $mainId = $charId; - } - - //Build a character Id list for the characters before processing the ledgers. - $alts = UserAlt::where([ - 'main_id' => $mainId, - ])->get(); - - //First check to see if the main character had a mining ledger from a corp moon - $mainIdLedgerFound = Ledger::where([ - 'character_id' => $mainId, - 'invoiced' => 'No', - ])->count(); - - //If there are mining ledgers, then this is the character want to send the invoice to once everything has been tallied up. - if($mainIdLedgerFound > 0) { - - } else { - - } - - - } + $this->CreateOtherInvoices($charIds, $mailDelay); //Set the task as stopped $task->SetStopStatus(); return 0; } + + private function CreateOtherInvoices($charIds, $mailDelay) { + foreach($charIds as $charId) { + $invoice = array(); + $ores = array(); + $totalPrice = 0.00; + $body = null; + $lookup = new LookupHelper; + + //Get the actual rows + $rows = Ledger::where([ + 'character_id' => $charId, + 'invoiced' => 'No', + ])->get()->toArray(); + + //Taly up the item composition from each row and multiply by the quantity + if(sizeof($rows) > 0) { + foreach($rows as $row) { + if(!isset($ores[$row['type_id']])) { + $ores[$row['type_id']] = 0; + } + $ores[$row['type_id']] = $ores[$row['type_id']] + $row['quantity']; + + //Add up the total price from the ledger rows for the report later + $totalPrice = $totalPrice + $row['amount']; + } + + //Reduce the total price by the take percentage + $invoiceAmount = $totalPrice * $config['mining_tax']; + $invoiceAmount = round($invoiceAmount, 2); + + //Get the character name from the character id + $charName = $lookup->CharacterIdToName($charId); + + //Generate a unique invoice id + $invoiceId = uniqid(); + //Set the due date of the invoice + $dateDue = Carbon::now()->addDays(7); + $invoiceDate = Carbon::now(); + + //Format the mining tax into a human readable number + $numberMiningTax = number_format(($config['mining_tax'] * 100.00), 2, ".", ","); + + //Create the mail body + $body .= "Dear Miner,

"; + $body .= "Mining Taxes are due for the following ores mined from alliance moons:
"; + foreach($ores as $ore => $quantity) { + $oreName = $lookup->ItemIdToName($ore); + $body .= $oreName . ": " . number_format($quantity, 0, ".", ",") . "
"; + } + $body .= "Total Value of Ore Mined: " . number_format($totalPrice, 2, ".", ",") . " ISK."; + $body .= "

"; + $body .= "Please remit " . number_format($invoiceAmount, 2, ".", ",") . " ISK to Spatial Forces by " . $dateDue . "
"; + $body .= "Set the reason for transfer as MMT: " . $invoiceId . "
"; + $body .= "The mining taxes are currently set to " . $numberMiningTax . "%.
"; + $body .= "

"; + $body .= "You can also send a contract with the following ores in the contract with the reason set as MMT: " . $invoiceId . "
"; + foreach($ores as $ore => $quantity) { + $oreName = $lookup->ItemIdToName($ore); + $body .= $oreName . ": " . number_format(round($quantity * $config['mining_tax']), 0, ".", ",") . "
"; + } + $body .= "
"; + $body .= "
Sincerely,
Warped Intentions Leadership
"; + + //Check if the mail body is greater than 2000 characters. If greater than 2,000 characters, then + if(strlen($body) > 2000) { + $body = "Dear Miner,

"; + $body .= "Total Value of Ore Mined: " . number_format($totalPrice, 2, ".", ",") . " ISK."; + $body .= "

"; + $body .= "Please remit " . number_format($invoiceAmount, 2, ".", ",") . " ISK to Spatial Forces by " . $dateDue . "
"; + $body .= "Set the reason for transfer as MMT: " . $invoiceId . "
"; + $body .= "The mining taxes are currently set to " . $numberMiningTax . "%.
"; + $body .= "
"; + $body .= "
Sincerely,
Warped Intentions Leadership
"; + } + + //Mail the invoice to the character if the character is in + //Warped Intentions or Legacy + $subject = 'Warped Intentions Mining Taxes'; + $sender = $config['primary']; + $recipientType = 'character'; + $recipient = $charId; + + //Send the Eve Mail Job to the queue to be dispatched + ProcessSendEveMailJob::dispatch($body, $recipient, $recipientType, $subject, $sender)->onQueue('mail')->delay(Carbon::now()->addSeconds($mailDelay)); + + //Save the invoice model + $invoice = new Invoice; + $invoice->character_id = $charId; + $invoice->character_name = $charName; + $invoice->invoice_id = $invoiceId; + $invoice->invoice_amount = $invoiceAmount; + $invoice->date_issued = $invoiceDate; + $invoice->date_due = $dateDue; + $invoice->status = 'Pending'; + $invoice->mail_body = $body; + $invoice->save(); + + //Update the ledger entries + Ledger::where([ + 'character_id' => $charId, + 'invoiced' => 'No', + ])->update([ + 'invoiced' => 'Yes', + 'invoice_id' => $invoiceId, + ]); + + //update the delay + $mailDelay = $mailDelay + 20; + } + } + + return 0; + } + + private function CreateInvoice($charId, $ledgers, &$mailDelay) { + $invoice = array(); + $ores = array(); + $totalPrice = 0.00; + $body = null; + $lookup = new LookupHelper; + + if(sizeof($ledgers) > 0) { + foreach($ledgers as $ledger) { + if(!isset($ores[$row['type_id']])) { + $ores[$row['type_id']] = 0; + } + $ores[$row['type_id']] = $ores[$row['type_id']] + $row['quantity']; + $totalPrice = $totalPrice + $row['amount']; + } + + $invoiceAmount = round(($totalPrice * $config['mining_tax']), 2); + + $charName = $lookup->CharacterIdToName($charId); + + $invoiceId = uniqid(); + $datedue = Carbon::now()->addDays(7); + $invoiceDate = Carbon::now(); + + $numberMiningTax = number_format(($config['mining_tax'] * 100.00), 2, ".", ","); + + //Create the mail body + $body .= "Dear Miner,

"; + $body .= "Mining Taxes are due for the following ores mined from alliance moons:
"; + foreach($ores as $ore => $quantity) { + $oreName = $lookup->ItemIdToName($ore); + $body .= $oreName . ": " . number_format($quantity, 0, ".", ",") . "
"; + } + $body .= "Total Value of Ore Mined: " . number_format($totalPrice, 2, ".", ",") . " ISK."; + $body .= "

"; + $body .= "Please remit " . number_format($invoiceAmount, 2, ".", ",") . " ISK to Spatial Forces by " . $dateDue . "
"; + $body .= "Set the reason for transfer as MMT: " . $invoiceId . "
"; + $body .= "The mining taxes are currently set to " . $numberMiningTax . "%.
"; + $body .= "

"; + $body .= "You can also send a contract with the following ores in the contract with the reason set as MMT: " . $invoiceId . "
"; + foreach($ores as $ore => $quantity) { + $oreName = $lookup->ItemIdToName($ore); + $body .= $oreName . ": " . number_format(round($quantity * $config['mining_tax']), 0, ".", ",") . "
"; + } + $body .= "
"; + $body .= "
Sincerely,
Warped Intentions Leadership
"; + + //Check if the mail body is greater than 2000 characters. If greater than 2,000 characters, then + if(strlen($body) > 2000) { + $body = "Dear Miner,

"; + $body .= "Total Value of Ore Mined: " . number_format($totalPrice, 2, ".", ",") . " ISK."; + $body .= "

"; + $body .= "Please remit " . number_format($invoiceAmount, 2, ".", ",") . " ISK to Spatial Forces by " . $dateDue . "
"; + $body .= "Set the reason for transfer as MMT: " . $invoiceId . "
"; + $body .= "The mining taxes are currently set to " . $numberMiningTax . "%.
"; + $body .= "
"; + $body .= "
Sincerely,
Warped Intentions Leadership
"; + } + + //Mail the invoice to the character if the character is in + //Warped Intentions or Legacy + $subject = 'Warped Intentions Mining Taxes'; + $sender = $config['primary']; + $recipientType = 'character'; + $recipient = $charId; + + //Send the Eve Mail Job to the queue to be dispatched + ProcessSendEveMailJob::dispatch($body, $recipient, $recipientType, $subject, $sender)->onQueue('mail')->delay(Carbon::now()->addSeconds($mailDelay)); + + //Save the invoice model + $invoice = new Invoice; + $invoice->character_id = $charId; + $invoice->character_name = $charName; + $invoice->invoice_id = $invoiceId; + $invoice->invoice_amount = $invoiceAmount; + $invoice->date_issued = $invoiceDate; + $invoice->date_due = $dateDue; + $invoice->status = 'Pending'; + $invoice->mail_body = $body; + $invoice->save(); + + foreach($ledgers as $ledger) { + Ledger::where([ + 'character_id' => $ledger['character_id'], + 'invoiced' => 'No', + ])->update([ + 'invoiced' => 'Yes', + 'invoice_id' => $invoiceId, + ]); + + $mailDelay += 20; + } + } else { + return null; + } + + return 0; + } + + private function LedgersWithAlts($charId) { + $ledgers = array(); + + $alts = UserAlt::where([ + 'main_id' => $charId, + ])->get(); + + $rows = Ledger::where([ + 'character_id' => $charId, + 'invoiced' => 'No', + ])->get(); + + if($rows->count() > 0) { + foreach($rows as $row) { + array_push($ledgers, [ + 'character_id' => $row->character_id, + 'character_name' => $row->character_name, + 'observer_id' => $row->observer_id, + 'last_updated' => $row->last_updated, + 'type_id' => $row->type_id, + 'ore_name' => $row->ore_name, + 'quantity' => $row->quantity, + 'amount' => $row->amount, + 'invoiced' => $row->invoiced, + 'invoice_id' => $row->invoice_id, + ]); + } + } + + if($alts->count() > 0) { + foreach($alts as $alt) { + $rows = Ledger::where([ + 'character_id' => $alt->character_id, + 'invoiced' => 'No', + ])->get(); + + foreach($rows as $row) { + array_push($ledgers, [ + 'character_id' => $row->character_id, + 'character_name' => $row->character_name, + 'observer_id' => $row->observer_id, + 'last_updated' => $row->last_updated, + 'type_id' => $row->type_id, + 'ore_name' => $row->ore_name, + 'quantity' => $row->quantity, + 'amount' => $row->amount, + 'invoiced' => $row->invoiced, + 'invoice_id' => $row->invoice_id, + ]); + } + } + } + + //Return the ledgers + return $ledgers; + } }