SunatInvoice::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 33
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 18
nc 1
nop 1
dl 0
loc 33
rs 9.6666
c 1
b 0
f 0
1
<?php
2
3
/**
4
 * MÓDULO DE EMISIÓN ELECTRÓNICA F72X
5
 * UBL 2.1
6
 * Version 1.0
7
 *
8
 * Copyright 2019, Jaime Cruz
9
 */
10
11
namespace F72X\Sunat\Document;
12
13
use F72X\Company;
14
use F72X\UblComponent\Invoice;
15
use F72X\Sunat\DataMap;
16
use F72X\Sunat\SunatVars;
17
use F72X\Sunat\Operations;
18
use F72X\Sunat\Catalogo;
19
use F72X\Tools\UblHelper;
20
use F72X\Tools\LogoMgr;
21
use F72X\Tools\QrGenerator;
22
23
abstract class SunatInvoice extends Invoice {
24
25
    use BillMixin;
26
    const UBL_VERSION_ID = '2.1';
27
    const CUSTUMIZATION_ID = '2.0';
28
29
    public function __construct(DataMap $DataMap) {
30
        $this->dataMap = $DataMap;
31
        $currencyCode = $DataMap->getCurrencyCode();
32
        // Invoice Type
33
        $this->setInvoiceTypeCode($DataMap->getDocumentType());
34
        // ID
35
        $this->setID($DataMap->getDocumentId());
36
        // Tipo de operación
37
        $this->setProfileID($DataMap->getOperationType());
38
        // Fecha de emisión
39
        $this->setIssueDate($DataMap->getIssueDate());
40
        // Tipo de moneda
41
        $this->setDocumentCurrencyCode($currencyCode);
42
        // Orden de compra
43
        $this->addInvoiceOrderReference();
44
        // Información de la empresa
45
        $this->addInvoiceAccountingSupplierParty();
46
        // Información del cliente
47
        $this->addInvoiceAccountingCustomerParty();
48
        // Información de pago
49
        $this->addPaymentTerms();
50
        // Total items
51
        $this->setLineCountNumeric($DataMap->getTotalItems());
52
        // Detalle
53
        $this->addDocumentItems('InvoiceLine');
54
        // Impuestos
55
        $this->addDocumentTaxes();
56
        // Descuentos globales
57
        $ac = $DataMap->getAllowancesAndCharges();
58
        $baseAmount = $DataMap->getBillableAmount();
59
        UblHelper::addAllowancesCharges($this, $ac, $baseAmount, $currencyCode);
60
        // Totales
61
        $this->addInvoiceLegalMonetaryTotal();
62
    }
63
64
    public function getReadyToPrintData() {
65
        $dataMap = $this->getDataMap();
66
        $currency = Catalogo::getCurrencyPlural($dataMap->getCurrencyCode());
67
        $payableAmount = $dataMap->getPayableAmount();
68
        $payableInWords = Operations::getAmountInWords($payableAmount, $currency);
69
        return [
70
            'companyRuc'           => Company::getRUC(),
71
            'companyAddress'       => Company::getAddress(),
72
            'companyCity'          => Company::getCity(),
73
            'edocHeaderContent'    => Company::getEdocHeaderContent(),
74
            'edocFooterContent'    => Company::getEdocFooterContent(),
75
            'documentSeries'       => $dataMap->getDocumentSeries(),
76
            'documentNumber'       => $dataMap->getDocumentNumber(),
77
            'officialDocumentName' => $dataMap->getOfficialDocumentName(),
78
            'currency'             => $currency,
79
            'customerRegName'      => $dataMap->getCustomerRegName(),
80
            'customerDocNumber'    => $dataMap->getCustomerDocNumber(),
81
            'customerAddress'      => $dataMap->getCustomerAddress(),
82
            'issueDate'            => $dataMap->getIssueDate()->format('d-m-Y'),
83
            'igvPercent'           => SunatVars::IGV_PERCENT,
84
            'logo'                 => LogoMgr::getLogoString(),
85
            'qr'                   => QrGenerator::getQrString($dataMap), // QR Code
86
            'taxableOperations'    => Operations::formatAmount($dataMap->getTotalTaxableOperations()),    // Total operaciones gravadas
87
            'freeOperations'       => Operations::formatAmount($dataMap->getTotalFreeOperations()),       // Total operaciones gratuitas
88
            'unaffectedOperations' => Operations::formatAmount($dataMap->getTotalUnaffectedOperations()), // Total operaciones inafectas
89
            'exemptedOperations'   => Operations::formatAmount($dataMap->getTotalExemptedOperations()),   // Total operaciones exoneradas
90
            'totalAllowances'      => Operations::formatAmount($dataMap->getTotalAllowances()),           // Total operaciones exoneradas
91
            'igvAmount'            => Operations::formatAmount($dataMap->getIGV()),                       // Total a pagar
92
            'payableAmount'        => Operations::formatAmount($payableAmount),                           // Total a pagar
93
            'payableInWords'       => $payableInWords,                          // Monto en palabras
94
            'items'                => self::getReadyToPrintDataItems($dataMap)      // Items
95
        ];
96
    }
97
98
    private static function getReadyToPrintDataItems(DataMap $inv) {
99
        $Items = $inv->getItems();
100
        $ln = $Items->getCount();
101
        $items2 = [];
102
        for ($i = 0; $i < $ln; $i++) {
103
            $items2[]= [
104
                'productCode'       => $Items->getProductCode($i),
105
                'quantity'          => $Items->getQunatity($i),
106
                'unitName'          => Catalogo::getUnitName($Items->getUnitCode($i)),
107
                'unitBillableValue' => Operations::formatAmount($Items->getUnitBillableValue($i)),
108
                'itemPayableAmount' => Operations::formatAmount($Items->getPayableAmount($i)),
109
                'description'       => $Items->getDescription($i)
110
            ];
111
        }
112
        return $items2;
113
    }
114
}
115