root/dev/common/includes/class.contract.php

Revision 460, 23.4 KB (checked in by kovell, 13 years ago)

Fix: pilot corp changes update properly. Unused code removed.

Line 
1<?php
2require_once("db.php");
3require_once("class.killlist.php");
4require_once("class.graph.php");
5require_once("class.pagesplitter.php");
6
7class Contract
8{
9    function Contract($ctr_id = 0)
10    {
11        $this->ctr_id_ = intval($ctr_id);
12        $this->contracttargets_ = array();
13
14        // overall kill/losslist
15        $this->klist_ = new KillList();
16        $this->llist_ = new KillList();
17        involved::load($this->klist_,'kill');
18        involved::load($this->llist_,'loss');
19        $this->contractpointer_ = 0;
20        $this->qry_ = null;
21    }
22
23    function execQuery()
24    {
25        if ($this->qry_)
26            return;
27
28        $this->qry_ = new DBQuery();
29        // general
30        $sql = "select * from kb3_contracts ctr
31                where ctr.ctr_id = ".$this->ctr_id_;
32
33        $this->qry_ = new DBQuery();
34        if (!$this->qry_->execute($sql))
35            die($this->qry_->getErrorMsg());
36
37        $row = $this->qry_->getRow();
38        $this->ctr_name_ = $row['ctr_name'];
39        $this->ctr_started_ = $row['ctr_started'];
40        $this->ctr_ended_ = $row['ctr_ended'];
41        $this->campaign_ = ($row['ctr_campaign'] == "1");
42
43        // get corps & alliances for contract
44        $sql = "select ctd.ctd_crp_id, ctd.ctd_all_id, ctd.ctd_reg_id, ctd.ctd_sys_id
45                from kb3_contract_details ctd
46                where ctd.ctd_ctr_id = ".$row['ctr_id']."
47                    order by 3, 2, 1 -- get corps & alliances for contract";
48
49        $caqry = new DBQuery();
50        if (!$caqry->execute($sql))
51        {
52            include_once('autoupgrade.php');
53            check_contracts();
54            $caqry->execute($sql);
55        }
56
57        while ($carow = $caqry->getRow())
58        {
59            $contracttarget = new ContractTarget($this, $carow['ctd_crp_id'], $carow['ctd_all_id'], $carow['ctd_reg_id'], $carow['ctd_sys_id']);
60            array_push($this->contracttargets_, $contracttarget);
61            if ($carow['ctd_crp_id'])
62            {
63                $this->klist_->addVictimCorp($carow['ctd_crp_id']);
64                $this->llist_->addInvolvedCorp($carow['ctd_crp_id']);
65            }
66            elseif ($carow['ctd_all_id'])
67            {
68                $this->klist_->addVictimAlliance($carow['ctd_all_id']);
69                $this->llist_->addInvolvedAlliance($carow['ctd_all_id']);
70            }
71            elseif ($carow['ctd_reg_id'])
72            {
73                $this->klist_->addRegion($carow['ctd_reg_id']);
74                $this->llist_->addRegion($carow['ctd_reg_id']);
75            }
76            elseif ($carow['ctd_sys_id'])
77            {
78                $this->klist_->addSystem($carow['ctd_sys_id']);
79                $this->llist_->addSystem($carow['ctd_sys_id']);
80            }
81        }
82
83        $this->klist_->setStartDate($this->getStartDate());
84        $this->llist_->setStartDate($this->getStartDate());
85        if ($this->getEndDate() != "")
86        {
87            $this->klist_->setEndDate($this->getEndDate());
88            $this->llist_->setEndDate($this->getEndDate());
89        }
90    }
91
92    function getID()
93    {
94        return $this->ctr_id_;
95    }
96
97    function getName()
98    {
99        $this->execQuery();
100        return $this->ctr_name_;
101    }
102
103    function getStartDate()
104    {
105        $this->execQuery();
106        return $this->ctr_started_;
107    }
108
109    function getEndDate()
110    {
111        $this->execQuery();
112        return $this->ctr_ended_;
113    }
114
115    function getRunTime()
116    {
117        if (!$datet = $this->getEndDate())
118        {
119            $datet = 'now';
120        }
121
122        $diff = strtotime($datet) - strtotime($this->getStartDate());
123        return floor($diff/86400);
124    }
125
126    function getCampaign()
127    {
128        $this->execQuery();
129        return $this->campaign_;
130    }
131
132    function getCorps()
133    {
134        $this->execQuery();
135        return $this->corps_;
136    }
137
138    function getAlliances()
139    {
140        $this->execQuery();
141        return $this->alliances_;
142    }
143
144    function getKills()
145    {
146        $this->execQuery();
147        return $this->klist_->getCount();
148    }
149
150    function getLosses()
151    {
152        $this->execQuery();
153        return $this->llist_->getCount();
154    }
155
156    function getKillISK()
157    {
158        $this->execQuery();
159        if (!$this->klist_->getISK()) $this->klist_->getAllKills();
160        return $this->klist_->getISK();
161    }
162
163    function getLossISK()
164    {
165        $this->execQuery();
166        if (!$this->llist_->getISK()) $this->llist_->getAllKills();
167        return $this->llist_->getISK();
168    }
169
170    function getEfficiency()
171    {
172        $this->execQuery();
173        if ($this->klist_->getISK())
174            $efficiency = round($this->klist_->getISK() / ($this->klist_->getISK() + $this->llist_->getISK()) * 100, 2);
175        else
176            $efficiency = 0;
177
178        return $efficiency;
179    }
180
181    function getKillList()
182    {
183        $this->execQuery();
184        return $this->klist_;
185    }
186
187    function getLossList()
188    {
189        $this->execQuery();
190        return $this->llist_;
191    }
192
193    function getContractTarget()
194    {
195        if ($this->contractpointer_ > 30)
196            return null;
197
198        $target = $this->contracttargets_[$this->contractpointer_];
199        if ($target)
200            $this->contractpointer_++;
201        return $target;
202    }
203
204    function add($name, $type, $startdate, $enddate = "")
205    {
206        $qry = new DBQuery();
207        if ($type == "campaign") $campaign = 1;
208        else $campaign = 0;
209        if ($enddate != "") $enddate = "'".$enddate." 23:59:59'";
210        else $enddate = "null";
211
212        if (!$this->ctr_id_)
213        {
214            $sql = "insert into kb3_contracts values ( null, '".slashfix($name)."',
215                                                   '".KB_SITE."', ".$campaign.",
216                                                   '".$startdate." 00:00:00',
217                                                   ".$enddate." )";
218            $qry->execute($sql) or die($qry->getErrorMsg());
219            $this->ctr_id_ = $qry->getInsertID();
220        }
221        else
222        {
223            $sql = "update kb3_contracts set ctr_name = '".slashfix($name)."',
224                                         ctr_started = '".$startdate." 00:00:00',
225                                         ctr_ended = ".$enddate."
226                                     where ctr_id = ".$this->ctr_id_;
227            $qry->execute($sql) or die($qry->getErrorMsg());
228            $this->ctr_id_ = $qry->getInsertID();
229        }
230    }
231
232    function remove()
233    {
234        $qry = new DBQuery();
235
236        $qry->execute("delete from kb3_contracts
237                       where ctr_id = ".$this->ctr_id_);
238
239        $qry->execute("delete from kb3_contract_details
240                       where ctd_ctr_id = ".$this->ctr_id_);
241    }
242
243    function validate()
244    {
245        $qry = new DBQuery();
246
247        $qry->execute("select * from kb3_contracts
248                       where ctr_id = ".$this->ctr_id_."
249                         and ctr_site = '".KB_SITE."'");
250        return ($qry->recordCount() > 0);
251    }
252}
253
254class ContractTarget
255{
256    function ContractTarget($contract, $crp_id, $all_id, $reg_id , $sys_id)
257    {
258        $this->contract_ = $contract;
259        $this->crp_id_ = $crp_id;
260        $this->all_id_ = $all_id;
261        $this->reg_id_ = $reg_id;
262        $this->sys_id_ = $sys_id;
263
264        $this->klist_ = new KillList();
265        $this->llist_ = new KillList();
266
267        if ($this->crp_id_)
268        {
269            $this->type_ = "corp";
270            $this->klist_->addVictimCorp($this->crp_id_);
271            $this->llist_->addInvolvedCorp($this->crp_id_);
272            $this->id_ = $this->crp_id_;
273        }
274        elseif ($this->all_id_)
275        {
276            $this->type_ = "alliance";
277            $this->klist_->addVictimAlliance($this->all_id_);
278            $this->llist_->addInvolvedAlliance($this->all_id_);
279            $this->id_ = $this->all_id_;
280        }
281        elseif ($this->reg_id_)
282        {
283            $this->type_ = "region";
284            $this->klist_->addRegion($this->reg_id_);
285            $this->llist_->addRegion($this->reg_id_);
286            $this->id_ = $this->reg_id_;
287        }
288        elseif ($this->sys_id_)
289        {
290            $this->type_ = "system";
291            $this->klist_->addSystem($this->sys_id_);
292            $this->llist_->addSystem($this->sys_id_);
293            $this->id_ = $this->sys_id_;
294        }
295       
296        involved::load($this->klist_,'kill');
297        involved::load($this->llist_,'loss');
298
299        $this->klist_->setStartDate($contract->getStartDate());
300        $this->llist_->setStartDate($contract->getStartDate());
301        if ($contract->getEndDate() != "")
302        {
303            $this->klist_->setEndDate($contract->getEndDate());
304            $this->llist_->setEndDate($contract->getEndDate());
305        }
306    }
307
308    function getID()
309    {
310        return $this->id_;
311    }
312
313    function getName()
314    {
315        if ($this->name_ == "")
316        {
317            $qry = new DBQuery();
318            switch ($this->type_)
319            {
320                case "corp":
321                    $qry->execute("select crp_name as name from kb3_corps where crp_id = ".$this->crp_id_);
322                    break;
323                case "alliance":
324                    $qry->execute("select all_name as name from kb3_alliances where all_id = ".$this->all_id_);
325                    break;
326                case "region":
327                    $qry->execute("select reg_name as name from kb3_regions where reg_id = ".$this->reg_id_);
328                    break;
329                case "system":
330                    $qry->execute("select sys_name as name from kb3_systems where sys_id = ".$this->sys_id_);
331                    break;
332            }
333            $row = $qry->getRow();
334            $this->name_ = $row['name'];
335        }
336        return $this->name_;
337    }
338
339    function getType()
340    {
341        return $this->type_;
342    }
343
344    function getKillList()
345    {
346        return $this->klist_;
347    }
348
349    function getLossList()
350    {
351        return $this->llist_;
352    }
353
354    function getEfficiency()
355    {
356        if ($this->klist_->getISK())
357            $efficiency = round($this->klist_->getISK() / ($this->klist_->getISK() + $this->llist_->getISK()) * 100, 2);
358        else
359            $efficiency = 0;
360
361        return $efficiency;
362    }
363
364    function getKills()
365    {
366    }
367
368    function getLosses()
369    {
370    }
371
372    function add()
373    {
374        $qry = new DBQuery();
375        $sql = "insert into kb3_contract_details
376                     values ( ".$this->contract_->getID().",";
377        switch ($this->type_)
378        {
379            case "corp":
380                $sql .= $this->id_.", 0, 0, 0 )";
381                break;
382            case "alliance":
383                $sql .= "0, ".$this->id_.", 0, 0 )";
384                break;
385            case "region":
386                $sql .= "0, 0, ".$this->id_.",0 )";
387                break;
388            case "system":
389                $sql .= "0, 0, 0, ".$this->id_." )";
390                break;
391        }
392        $qry->execute($sql) or die($qry->getErrorMsg());
393    }
394
395    function remove()
396    {
397        $qry = new DBQuery();
398        $sql = "delete from kb3_contract_details
399                    where ctd_ctr_id = ".$this->contract_->getID();
400        switch ($this->type_)
401        {
402            case "corp":
403                $sql .= " and ctd_crp_id = ".$this->id_;
404                break;
405            case "alliance":
406                $sql .= " and ctd_all_id = ".$this->id_;
407                break;
408            case "region":
409                $sql .= " and ctd_reg_id = ".$this->id_;
410                break;
411            case "system":
412                $sql .= " and ctd_sys_id = ".$this->id_;
413                break;
414        }
415        $qry->execute($sql) or die($qry->getErrorMsg());
416    }
417}
418
419class ContractList
420{
421    function ContractList()
422    {
423        $this->qry_ = new DBQuery();
424        $this->active_ = "both";
425        $this->contractcounter_ = 1;
426    }
427
428    function execQuery()
429    {
430        if ($this->qry_->executed())
431            return;
432
433        $sql = "select ctr.ctr_id, ctr.ctr_started, ctr.ctr_ended, ctr.ctr_name
434                from kb3_contracts ctr
435               where ctr.ctr_site = '".KB_SITE."'";
436        if ($this->active_ == "yes")
437            $sql .= " and ( ctr_ended is null or now() <= ctr_ended )";
438        elseif ($this->active_ == "no")
439            $sql .= " and ( now() >= ctr_ended )";
440
441        if ($this->campaigns_)
442            $sql .= " and ctr.ctr_campaign = 1";
443        else
444            $sql .= " and ctr.ctr_campaign = 0";
445
446        $sql .= " order by ctr_ended, ctr_started desc";
447        // if ( $this->limit_ )
448        // $sql .= " limit ".( $this->page_ / $this->limit_ ).", ".$this->limit_;
449        $this->qry_ = new DBQuery();
450        $this->qry_->execute($sql) or die($this->qry_->getErrorMsg());
451    }
452
453    function setActive($active)
454    {
455        $this->active_ = $active;
456    }
457
458    function setCampaigns($campaigns)
459    {
460        $this->campaigns_ = $campaigns;
461    }
462
463    function setLimit($limit)
464    {
465        $this->limit_ = $limit;
466    }
467
468    function setPage($page)
469    {
470        $this->page_ = $page;
471        $this->offset_ = ($page * $this->limit_) - $this->limit_;
472    }
473
474    function getContract()
475    {
476        // echo "off: ".$this->offset_."<br>";
477        // echo "cnt: ".$this->contractcounter_."<br>";
478        // echo "limit: ".$this->limit_."<br>";
479        $this->execQuery();
480        if ($this->offset_ && $this->contractcounter_ < $this->offset_)
481        {
482            for ($i = 0; $i < $this->offset_; $i++)
483            {
484                $row = $this->qry_->getRow();
485                $this->contractcounter_++;
486            }
487        }
488        if ($this->limit_ && ($this->contractcounter_ - $this->offset_) > $this->limit_)
489            return null;
490
491        $row = $this->qry_->getRow();
492        if ($row)
493        {
494            $this->contractcounter_++;
495            return new Contract($row['ctr_id']);
496        }
497        else
498            return null;
499    }
500
501    function getCount()
502    {
503        $this->execQuery();
504        return $this->qry_->recordCount();
505    }
506
507    function getActive()
508    {
509        return $this->active_;
510    }
511}
512
513class ContractListTable
514{
515    function ContractListTable($contractlist)
516    {
517        $this->contractlist_ = $contractlist;
518    }
519
520    function paginate($paginate, $page = 1)
521    {
522        if (!$page) $page = 1;
523        $this->paginate_ = $paginate;
524        $this->contractlist_->setLimit($paginate);
525        $this->contractlist_->setPage($page);
526    }
527
528    function getTableStats()
529    {
530        $qry = new DBQuery();
531        while ($contract = $this->contractlist_->getContract())
532        {
533            // generate all neccessary objects within the contract
534            $contract->execQuery();
535
536
537            for ($i = 0; $i < 2; $i++)
538            {
539                if ($i == 0)
540                {
541                    $list = &$contract->llist_;
542                }
543                else
544                {
545                    $list = &$contract->klist_;
546                }
547
548                // take care of the subquery needed (mysql > 4.1)
549                if (KB_MYSQL41)
550                {
551                    $sql = 'select count(kll_id) AS ships, sum(kll_isk_loss) as isk from (select distinct kll_id,';
552                }
553                else
554                {
555                    $sql = 'select distinct kll_id,';
556                }
557
558/*
559                    $sql .= ' kll_isk_loss FROM kb3_kills kll
560                            INNER JOIN kb3_ships shp ON ( shp.shp_id = kll.kll_ship_id )
561                          INNER JOIN kb3_ship_classes scl ON ( scl.scl_id = shp.shp_class )
562                          inner join kb3_systems sys on ( sys.sys_id = kll.kll_system_id )';
563*/
564                    $sql .= ' kll_isk_loss FROM kb3_kills kll
565                          inner join kb3_systems sys on ( sys.sys_id = kll.kll_system_id )';
566                if ($list->regions_)
567                {
568                    $sql .= ' inner join kb3_constellations con
569                           on ( con.con_id = sys.sys_con_id
570                                   and con.con_reg_id in ( '.join(',', $list->regions_).' ) )';
571                }
572                if ($list->systems_)
573                {
574                    $sql .= ' and kll.kll_system_id in ( '.join(',', $list->systems_).')';
575                }
576                if ($list->inv_crp_ || $list->inv_all_ || $list->inv_plt_)
577                {
578                    $sql .= ' inner join kb3_inv_detail ind on ( kll.kll_id = ind.ind_kll_id ) ';
579                }
580
581                if($list->getDateFilter())
582                                {
583                                        $sql .= " WHERE ".$list->getDateFilter();
584                                        $sqlwhereop = ' AND ';
585                                }
586                else $sqlwhereop = ' WHERE ';
587
588                $tmp = array();
589                if ($list->vic_plt_)
590                {
591                    $tmp[] = 'kll.kll_victim_id in ( '.join(',', $list->vic_plt_).' )';
592                }
593                if ($list->vic_crp_)
594                {
595                    $tmp[] = 'kll.kll_crp_id in ( '.join(',', $list->vic_crp_).' )';
596                }
597                if ($list->vic_all_)
598                {
599                    $tmp[] = 'kll.kll_all_id in ( '.join(',', $list->vic_all_).' )';
600                }
601                if (count($tmp))
602                {
603                    $sql .= $sqlwhereop.' (';
604                    $sql .= join(' or ', $tmp);
605                    $sql .= ')';
606                                        $sqlwhereop = ' AND ';
607                }
608
609
610                $tmp = array();
611                if ($list->inv_crp_)
612                {
613                    $tmp[] = 'ind.ind_crp_id in ( '.join(',', $list->inv_crp_).')';
614                }
615                if ($list->inv_all_)
616                {
617                    $tmp[] = 'ind.ind_all_id in ( '.join(',', $list->inv_all_).')';
618                }
619                if ($list->inv_plt_)
620                {
621                    $tmp[] = 'ind.ind_plt_id in ( '.join(',', $list->inv_plt_).')';
622                }
623                if (count($tmp))
624                {
625                    $sql .= $sqlwhereop.' (';
626                    $sql .= join(' or ', $tmp);
627                    $sql .= ')';
628                                        $sqlwhereop = ' AND ';
629                }
630
631                if (KB_MYSQL41)
632                {
633                    // this is the last part from the outer query
634                    $sql .= ') as kb3_shadow';
635                }
636                $sql .= " -- contract: getTableStats";
637                $result = $qry->execute($sql);
638                if (KB_MYSQL41)
639                {
640                    $row = $qry->getRow($result);
641                }
642                else
643                {
644                    $sum = array();
645                    $sum['isk'] = 0;
646                    $sum['ships'] = 0;
647                    while ($row = $qry->getRow($result))
648                    {
649                        $sum['ships'] += 1;
650                        $sum['isk'] += $row['kll_isk_loss'];
651                    }
652                    $row = $sum;
653                }
654
655                if ($i == 0)
656                {
657                    $ldata = array('losses' => $row['ships'], 'lossisk' => $row['isk'] / 1000 );
658                }
659                else
660                {
661                    $kdata = array('kills' => $row['ships'], 'killisk' => $row['isk'] / 1000 );
662                }
663            }
664            if ($kdata['killisk'])
665            {
666                $efficiency = round($kdata['killisk'] / ($kdata['killisk']+$ldata['lossisk']) *100, 2);
667            }
668            else
669            {
670                $efficiency = 0;
671            }
672            $bar = new BarGraph($efficiency, 100, 75);
673
674            $tbldata[] = array_merge(array('name' => $contract->getName(), 'startdate' => $contract->getStartDate(), 'bar' => $bar->generate(),
675                                     'enddate' => $contract->getEndDate(), 'efficiency' => $efficiency, 'id' => $contract->getID()), $kdata, $ldata);
676        }
677        $this->contractlist_->contractcounter_ = 1;
678        $this->contractlist_->qry_->rewind();
679        return $tbldata;
680    }
681
682    function generate()
683    {
684        if ($table = $this->getTableStats())
685        {
686            global $smarty;
687
688            $smarty->assign('contract_getactive', $this->contractlist_->getActive());
689            $smarty->assign_by_ref('contracts', $table);
690            $pagesplitter = new PageSplitter($this->contractlist_->getCount(), 10);
691
692            return $smarty->fetch(get_tpl('contractlisttable')).$pagesplitter->generate();
693        }
694
695        // old stuff, not used anymore (kept for reference)
696        if ($this->contractlist_->getCount())
697        {
698            $rowid = 0;
699            $html .= "<table class=kb-table width=\"98%\" align=center cellspacing=1>";
700            $html .= "<tr class=kb-table-header>";
701            $html .= "<td class=kb-table-cell width=180>Name</td>";
702            $html .= "<td class=kb-table-cell width=80 align=center>Start date</td>";
703            if ($this->contractlist_->getActive() == "no")
704                $html .= "<td class=kb-table-cell width=80 align=center>End date</td>";
705            $html .= "<td class=kb-table-cell width=50 align=center>Kills</td>";
706            $html .= "<td class=kb-table-cell width=70 align=center>ISK (M)</td>";
707            $html .= "<td class=kb-table-cell width=50 align=center>Losses</td>";
708            $html .= "<td class=kb-table-cell width=70 align=center>ISK (M)</td>";
709            $html .= "<td class=kb-table-cell width=70 align=center colspan=2>Efficiency</td>";
710            $html .= "</tr>";
711
712            $odd = false;
713            $rowclass = "kb-table-row-even";
714            while ($contract = $this->contractlist_->getContract())
715            {
716                if ($odd)
717                {
718                    $rowclass = "kb-table-row-even";
719                    $odd = false;
720                }
721                else
722                {
723                    $rowclass = "kb-table-row-odd";
724                    $odd = true;
725                }
726
727                $html .= "<tr class=".$rowclass." onmouseover=\"this.className='kb-table-row-hover';\" onmouseout=\"this.className='".$rowclass."';\" onClick=\"window.location.href='?a=cc_detail&ctr_id=".$contract->getID()."';\">";
728                $html .= "<td class=kb-table-cell><b>".$contract->getName()."</b></td>";
729                $html .= "<td class=kb-table-cell align=center>".substr($contract->getStartDate(), 0, 10)."</td>";
730                if ($this->contractlist_->getActive() == "no")
731                {
732                    if ($contract->getEndDate() == "")
733                        $ended = "Active";
734                    else
735                        $ended = substr($contract->getEndDate(), 0, 10);
736                    $html .= "<td class=kb-table-cell align=center>".$ended."</td>";
737                }
738                if ($contract->getKills() == 0)
739                    $kclass = "kl-null";
740                else
741                    $kclass = "kl-kill";
742
743                if ($contract->getLosses() == 0)
744                    $lclass = "kl-null";
745                else
746                    $lclass = "kl-loss";
747
748                $html .= "<td class=".$kclass." align=center>".$contract->getKills()."</td>";
749                $html .= "<td class=".$kclass." align=center>".round($contract->getKillISK()/1000000, 2)."</td>";
750                $html .= "<td class=".$lclass." align=center>".$contract->getLosses()."</td>";
751                $html .= "<td class=".$lclass." align=center>".round($contract->getLossISK()/1000000, 2)."</td>";
752                $bar = new BarGraph($contract->getEfficiency(), 100, 75);
753                $html .= "<td class=kb-table-cell align=center width=40><b>".$contract->getEfficiency()."%</b></td>";
754                $html .= "<td class=kb-table-cell align=left width=75>".$bar->generate()."</td>";
755                $html .= "</tr>";
756            }
757            $html .= "</table>";
758            $pagesplitter = new PageSplitter($this->contractlist_->getCount(), 10);
759            $html .= $pagesplitter->generate();
760        }
761        else $html .= "None.";
762
763        return $html;
764    }
765}
766?>
Note: See TracBrowser for help on using the browser.