1
Changeset 979 – MultiMag

Changeset 979


Ignore:
Timestamp:
Jul 31, 2018, 1:06:18 AM (3 weeks ago)
Author:
blacklight
Message:
  • В отчёт *остатки тоавра на дату* добавлена группировка по производителю
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/web/include/reports/ostatkinadatu.php

    r963 r979  
    2121/// Остатки товара на складе на выбранную дату
    2222class Report_OstatkiNaDatu extends BaseGSReport {
    23 
     23   
     24    protected $group_filter;
     25    protected $col_cfg;
     26    protected $orders = [
     27            'name' => 'По наименованию',
     28            'code' => 'По коду производителя',
     29            'base_price' => 'По базовой цене',
     30        ];
     31   
    2432    function getName($short = 0) {
    2533        if ($short) {
     
    3341        global $tmpl, $db;
    3442        $curdate = date("Y-m-d");
     43        $def_order = \cfg::get('doc', 'sklad_default_order');
     44        if($def_order == 'vc') {
     45            $def_order = 'code';
     46        }
     47        else if($def_order == 'cost') {
     48            $def_order = 'base_price';
     49        }
     50       
    3551        $tmpl->addContent("<h1>" . $this->getName() . "</h1>");
    3652        $tmpl->addContent("
    3753            <script type=\"text/javascript\">
    38             function dtinit() {
    39                     initCalendar('dt',false)
    40             }
    41             addEventListener('load',dtinit,false)       
     54            addEventListener('load', function() {initCalendar('dt',false);},false);
    4255            </script>
    4356            <form action='' method='post'>
     
    4558            Дата:<br>
    4659            <input type='text' name='date' id='dt' value='$curdate'><br>
    47             Склад:<br>
    48             <select name='sklad'>");
    49         $res = $db->query("SELECT `id`, `name` FROM `doc_sklady`");
    50         while ($nxt = $res->fetch_row()) {
    51             $tmpl->addContent("<option value='$nxt[0]'>" . html_out($nxt[1]) . "</option>");
    52         }
    53         $tmpl->addContent("</select><br>Группа товаров:<br>");
     60            ");
     61        $ldo = new \Models\LDO\skladnames();
     62        $store_names = $ldo->getData();       
     63        $tmpl->addContent("Склад:<br>". \widgets::getEscapedSelect('store', $store_names) ."<br>" );
     64        $tmpl->addContent("Сортировка:<br>". \widgets::getEscapedSelect('order', $this->orders, $def_order) ."<br>" );
     65        $tmpl->addContent("Группа товаров:<br>");
    5466        $this->GroupSelBlock();
    55         $tmpl->addContent("Формат: <select name='opt'><option>pdf</option><option>html</option></select><br>
     67        $tmpl->addContent("<label><input type='checkbox' name='group_vendor' value='1'>Группировать по производителю</labe><br>
     68            Формат: <select name='opt'><option>pdf</option><option>html</option></select><br>           
    5669            <button type='submit'>Создать отчет</button></form>");
    5770    }
    58 
    59     function Make($engine) {
    60         global $db, $CONFIG;
    61         $sklad = rcvint('sklad');
    62         $date = rcvdate('date');
    63         $unixtime = strtotime($date . " 23:59:59");
    64         $pdate = date("Y-m-d", $unixtime);
    65         $gs = request('gs');
    66         $g = request('g');
    67 
    68         $res = $db->query("SELECT `name` FROM `doc_sklady` WHERE `id`='$sklad'");
    69         if (!$res->num_rows) {
    70             throw new Exception("Склад не найден!");
    71         }
    72         list($sklad_name) = $res->fetch_row();
    73 
    74         $this->loadEngine($engine);
    75 
    76         $this->header("Остатки товара на складе N$sklad ($sklad_name) на дату $pdate");
    77 
    78         $col_count = 1;
    79         $widths = array(6);
    80         $headers = array('ID');
    81 
    82         if ($CONFIG['poseditor']['vc']) {
    83             $widths[] = 7;
    84             $headers[] = 'Код';
    85             $widths[] = 60;
    86             $headers[] = 'Наименование';
    87             $col_count +=2;
    88         } else {
    89             $widths[] = 67;
    90             $headers[] = 'Наименование';
    91             $col_count +=1;
    92         }
    93 
    94         $headers = array_merge($headers, array('Кол-во', 'Б. цена', 'Сумма'));
    95         $widths = array_merge($widths, array(9, 9, 9));
    96         $col_count+=3;
    97 
    98         $this->tableBegin($widths);
    99         $this->tableHeader($headers);
    100 
    101         switch (@$CONFIG['doc']['sklad_default_order']) {
    102             case 'vc': $order = '`doc_base`.`vc`';
     71   
     72    protected function setColumn($id, $name, $width, $flexible = false) {
     73        $this->col_cfg[$id] = [
     74            'name' => $name,
     75            'width' => $width,
     76            'flex' => $flexible,
     77            'hidden' => false,
     78        ];
     79    }
     80   
     81    protected function fixColumnWidth($all_width = 100) {
     82        $sum_width_flex = $sum_width_noflex = 0;
     83        $flex = [];
     84        foreach($this->col_cfg as $id => $col) {
     85            if($col['hidden']) {
     86                continue;
     87            }
     88            if($col['flex']) {
     89                $sum_width_flex += $col['width'];
     90                $flex[] = $id;
     91            }
     92            else {
     93                $sum_width_noflex += $col['width'];
     94            }
     95        }
     96        $all_sum = $sum_width_noflex + $sum_width_flex;
     97        if($all_width == $all_sum) {
     98            return;
     99        }
     100        else {
     101            $flex_mod = ($all_width - $sum_width_noflex) / $sum_width_flex;
     102            foreach($this->col_cfg as $id => $col) {
     103                if($col['flex']) {
     104                    $this->col_cfg[$id]['width'] *= $flex_mod;
     105                }
     106            }
     107        }   
     108       
     109    }
     110   
     111    protected function groupsMakeTable($options) {
     112        global $db;
     113        $c_count = 0;
     114        foreach($this->col_cfg as $col) {
     115            if(!$col['hidden']) {
     116                $c_count++;
     117            }
     118        }
     119        switch ($options['order']) {
     120            case 'code':
     121                $order = '`doc_base`.`vc`';
    103122                break;
    104             case 'cost': $order = '`doc_base`.`cost`';
     123            case 'base_price':
     124                $order = '`doc_base`.`cost`';
    105125                break;
    106             default: $order = '`doc_base`.`name`';
    107         }
    108 
    109         $zeroflag = $bsum = $summass = 0;
     126            default:
     127                $order = '`doc_base`.`name`';
     128        }
     129       
    110130        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
    111131        while ($group_line = $res_group->fetch_assoc()) {
    112             if ($gs && !in_array($group_line['id'], $g)) {
     132            if ($this->group_filter && !in_array($group_line['id'], $this->group_filter)) {
    113133                continue;
    114134            }
    115135
    116136            $this->tableAltStyle();
    117             $this->tableSpannedRow(array($col_count), array(html_out("{$group_line['id']}. {$group_line['name']}")));
     137            $this->tableSpannedRow(array($c_count), array(html_out("{$group_line['id']}. {$group_line['name']}")));
    118138            $this->tableAltStyle(false);
    119139
    120140            $res = $db->query("SELECT `doc_base`.`id`, CONCAT(`doc_base`.`name`, ' - ', `doc_base`.`proizv`) AS `name` , `doc_base`.`cost`,
    121                                 `doc_base`.`mass`, `doc_base`.`vc`
    122                         FROM `doc_base`
    123                         WHERE `doc_base`.`group`='{$group_line['id']}'
    124                         ORDER BY $order");
     141                    `doc_base`.`mass`, `doc_base`.`vc`
     142                FROM `doc_base`
     143                WHERE `doc_base`.`group`='{$group_line['id']}'
     144                ORDER BY $order");
    125145            while ($nxt = $res->fetch_row()) {
    126                 $count = getStoreCntOnDate($nxt[0], $sklad, $unixtime, 1);
     146                $count = getStoreCntOnDate($nxt[0], $options['store_id'], $this->time, 1);
    127147                if ($count == 0) {
    128148                    continue;
    129149                }
    130150                if ($count < 0) {
    131                     $zeroflag = 1;
     151                    $this->zeroflag = 1;
    132152                }
    133153                $cost_p = sprintf("%0.2f", $nxt[2]);
    134154                $bsum_p = sprintf("%0.2f", $nxt[2] * $count);
    135155                $count_p = round($count, 3);
    136                 $bsum+=$nxt[2] * $count;
    137                 $summass+=$count * $nxt[3];
    138 
    139                 if ($CONFIG['poseditor']['vc']) {
    140                     $a = array($nxt[0], $nxt[4], $nxt[1], $count_p, $cost_p, $bsum_p);
     156                $this->bsum+=$nxt[2] * $count;
     157                $this->summass+=$count * $nxt[3];
     158
     159                if (!$this->col_cfg['code']['hidden']) {
     160                    $a = array($nxt[0], $nxt[4], $nxt[1], $count_p, $cost_p, $count * $nxt[3], $bsum_p);
    141161                } else {
    142                     $a = array($nxt[0], $nxt[1], $count_p, $cost_p, $bsum_p);
     162                    $a = array($nxt[0], $nxt[1], $count_p, $cost_p, $count * $nxt[3], $bsum_p);
    143163                }
    144164                $this->tableRow($a);
    145165            }
    146166        }
    147         $bsum = sprintf("%0.2f", $bsum);
     167    }
     168   
     169    protected function tableSort($a, $b) {
     170        return strcmp($a['name'], $b['name']);
     171    }
     172
     173    protected function vendorMakeTable($options) {
     174        global $db;
     175        $c_count = 0;
     176        foreach($this->col_cfg as $col) {
     177            if(!$col['hidden']) {
     178                $c_count++;
     179            }
     180        }
     181        $res = $db->query("SELECT `doc_base`.`id`, `doc_base`.`proizv` AS `name` , `doc_base`.`cost` AS `base_price`,
     182                `doc_base`.`mass`
     183            FROM `doc_base`");
     184        $data = [];
     185        while ($line = $res->fetch_assoc()) {
     186            $id = $line['name'];
     187            /*if($id === null) {
     188                continue;
     189            }*/
     190            $count = getStoreCntOnDate($line['id'], $options['store_id'], $this->time, 1);
     191            if ($count == 0) {
     192                continue;
     193            }
     194            if ($count < 0) {
     195                $this->zeroflag = 1;
     196            }
     197           
     198            if(!isset($data[$id])) {
     199                $data[$id] = [
     200                    'name' => $id,
     201                    'mass' => 0,
     202                    'count' => 0,
     203                    'sum' => 0,
     204                ];
     205            }
     206            $data[$id]['count'] += $count;
     207            $data[$id]['mass'] += $count * $line['mass'];
     208            $data[$id]['sum'] += $count * $line['base_price'];
     209        }
     210       
     211        uasort($data, [$this, 'tableSort']);
     212       
     213        foreach($data as $line) {           
     214            $sum_p = sprintf("%0.2f", $line['sum']);
     215            $count_p = round($line['count'], 3);
     216            $this->bsum += $line['sum'];
     217            $this->summass += $line['mass'];
     218            $a = array($line['name'], $count_p, $line['mass'], $sum_p);
     219            $this->tableRow($a);
     220        }
     221       
     222    }
     223           
     224    function Make($engine) {
     225        global $db, $CONFIG;
     226        $store = rcvint('store');
     227        $date = rcvdate('date');       
     228        $gs = request('gs');
     229        $g = request('g');
     230        $group_vendor = rcvint('group_vendor');
     231        $order = request('order');
     232       
     233        // Prepare options
     234        $this->time = strtotime($date . " 23:59:59");       
     235        if(!in_array($order, $this->orders)) {
     236            $order = 'name';
     237        }
     238        $this->group_filter = false;
     239        if($g && is_array($gs)) {
     240            $this->group_filter = $gs;
     241        }       
     242       
     243        $res = $db->query("SELECT `name` FROM `doc_sklady` WHERE `id`='$store'");
     244        if (!$res->num_rows) {
     245            throw new \Exception("Склад не найден!");
     246        }
     247        list($sklad_name) = $res->fetch_row();
     248
     249        $this->loadEngine($engine);
     250       
     251        $this->setColumn('id', 'N', 7);
     252        $this->setColumn('code', 'Код', 7);
     253        $this->setColumn('name', 'Наименование', 60, true);
     254        $this->setColumn('count', 'Кол-во', 9);
     255        $this->setColumn('base_price', 'Б. цена', 9);
     256        $this->setColumn('mass', 'Масса', 9);
     257        $this->setColumn('sum', 'Сумма', 9);       
     258       
     259        $this->col_cfg['code']['hidden'] = !\cfg::get('poseditor', 'vc');
     260       
     261        $h_text = "Остатки товара на складе N$store ($sklad_name) на дату ".date("Y-m-d", $this->time);
     262        if($group_vendor) {
     263            $h_text .= ", сгруппированный по производителю";
     264            $this->col_cfg['id']['hidden'] = true;
     265            $this->col_cfg['code']['hidden'] = true;
     266            $this->col_cfg['base_price']['hidden'] = true;
     267            $this->col_cfg['name']['name'] = 'Производитель';
     268        }
     269        $this->header($h_text);
     270       
     271        $this->fixColumnWidth();
     272       
     273        $c_widths = [];
     274        $c_captions = [];
     275        $c_count = 0;
     276        foreach($this->col_cfg as $col) {
     277            if(!$col['hidden']) {
     278                $c_widths[] = $col['width'];
     279                $c_captions[] = $col['name'];
     280                $c_count++;
     281            }
     282        } 
     283        $this->tableBegin($c_widths);
     284        $this->tableHeader($c_captions);
     285
     286        $this->zeroflag = $this->bsum = $this->summass = 0;
     287        if($group_vendor) {
     288            $this->vendorMakeTable( [
     289                'order' => $order,
     290                'store_id' => $store,
     291            ]);
     292        }
     293        else {
     294            $this->groupsMakeTable( [
     295                'order' => $order,
     296                'store_id' => $store,
     297            ]);
     298        }
     299       
     300        $this->bsum = sprintf("%0.2f", $this->bsum);
    148301        $this->tableAltStyle();
    149         $this->tableSpannedRow(array($col_count - 1, 1), array('Итого:', $bsum));
    150         if (!$zeroflag) {
    151             $this->tableSpannedRow(array($col_count), array("Общая масса склада: $summass кг."));
     302        $this->tableSpannedRow(array($c_count - 1, 1), array('Итого:', $this->bsum));
     303        if (!$this->zeroflag) {
     304            $this->tableSpannedRow(array($c_count), array("Общая масса склада: $this->summass кг."));
    152305        } else {
    153             $this->tableSpannedRow(array($col_count), array("Общая масса склада: невозможно определить из-за отрицательных остатков"));
     306            $this->tableSpannedRow(array($c_count), array("Общая масса склада: невозможно определить из-за отрицательных остатков"));
    154307        }
    155308        $this->tableAltStyle(false);
Note: See TracChangeset for help on using the changeset viewer.