Passed
Branch develop (477450)
by JAIME ELMER
06:26
created

DocumentGenerator::generateFactura()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 2
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * MÓDULO DE EMISIÓN ELECTRÓNICA F72X
5
 * UBL 2.1
6
 * Version 1.1
7
 * 
8
 * Copyright 2018, Jaime Cruz
9
 */
10
11
namespace F72X\Sunat;
12
13
use InvalidArgumentException;
14
use F72X\Tools\XmlDSig;
15
use F72X\Tools\PdfGenerator;
16
use F72X\Repository;
17
use F72X\Sunat\Catalogo;
18
use F72X\Tools\XmlService;
19
use F72X\Sunat\Document\Factura;
20
use F72X\Sunat\Document\Boleta;
21
use F72X\Sunat\Document\NotaCredito;
22
use F72X\Sunat\Document\NotaDebito;
23
use F72X\Exception\InvalidInputException;
24
25
class DocumentGenerator {
26
27
    /**
28
     * Crear Boleta o Factua
29
     * 
30
     * Procesa la data proporcionada para el tipo de documento indicado
31
     * 
32
     * @param string $shortCode FAC|BOL
33
     * @param array $data
34
     * @param string $currencyCode
35
     */
36
    public static function createInvoice($shortCode, array $data) {
37
        // Validate type
38
        if (!in_array($shortCode, ['FAC', 'BOL'])) {
39
            throw new InvalidArgumentException("El tipo $shortCode, es invalido use FAC|BOL");
40
        }
41
        $docType = Catalogo::getDocumentType($shortCode);
42
        // Validate input
43
        self::validateData($data, $docType);
44
        // Core invoice
45
        $Invoice = new DataMap($data, $docType);
46
        // Documento XML para la factura
47
        if ($docType == Catalogo::DOCTYPE_BOLETA) {
48
            return new Boleta($Invoice);
49
        }
50
        return new Factura($Invoice);
51
    }
52
53
    public static function createCreditNote(array $data) {
54
        // Validate input
55
        self::validateData($data, Catalogo::DOCTYPE_NOTA_CREDITO);
56
        // Core invoice
57
        $dataMap = new DataMap($data, Catalogo::DOCTYPE_NOTA_CREDITO);
58
        return new NotaCredito($dataMap);
59
    }
60
61
    public static function createDebitNote(array $data) {
62
        // Validate input
63
        self::validateData($data, Catalogo::DOCTYPE_NOTA_DEBITO);
64
        // Core invoice
65
        $dataMap = new DataMap($data, Catalogo::DOCTYPE_NOTA_DEBITO);
66
        return new NotaDebito($dataMap);
67
    }
68
69
    private static function validateData(array $data, $type) {
70
        $validator = new InputValidator($data, $type);
71
        // Input validation
72
        if (!$validator->isValid()) {
73
            throw new InvalidInputException($validator->getErrors());
74
        }
75
    }
76
77
    /**
78
     * 
79
     * @param Factura|Boleta|NotaCredito|NotaDebito $XmlDoc
80
     */
81
    public static function generateFiles($XmlDoc) {
82
        // Save Input
83
        self::saveBillInput($XmlDoc);
84
        // Save Document
85
        self::saveBill($XmlDoc);
86
        // Sign Document
87
        self::singBill($XmlDoc);
88
        // Compress Document
89
        self::zipBill($XmlDoc);
90
        // Generate PDF
91
        self::generatePdf($XmlDoc);
92
    }
93
94
    private static function saveBillInput($XmlDoc) {
95
        $billName = $XmlDoc->getBillName();
96
        Repository::saveBillInput($billName, json_encode($XmlDoc->getDataMap()->getRawData(), JSON_PRETTY_PRINT));
97
    }
98
99
    private static function singBill($XmlDoc) {
100
        $billName = $XmlDoc->getBillName();
101
        XmlDSig::sign($billName);
102
    }
103
104
    private static function zipBill($XmlDoc) {
105
        $billName = $XmlDoc->getBillName();
106
        Repository::zipBill($billName);
107
    }
108
109
    private static function generatePdf($XmlDoc) {
110
        $billName = $XmlDoc->getBillName();
111
        $Invoice = $XmlDoc->getDataMap();
112
        PdfGenerator::generateFactura($Invoice, $billName);
113
    }
114
115
    private static function saveBill($Bill) {
116
        $xmlService = new XmlService('1.0', 'ISO-8859-1');
117
        $documentType = $Bill->getDataMap()->getDocumentType();
118
        // Set namespaces
119
        $xmlService->namespaceMap = self::getNamespaceMap($documentType);
120
        $billName = $Bill->getBillName();
121
        // Xml Root
122
        $xmlRoot = self::getXmlRoot($documentType);
123
        $billContent = $xmlService->write($xmlRoot, $Bill);
124
        Repository::saveBill($billName, $billContent);
125
    }
126
127
    /**
128
     * 
129
     * @param string $documentType 01|03|07|08
130
     * @return string Invoice|CreditNote|DebitNote
131
     */
132
    private static function getXmlRoot($documentType) {
133
        switch ($documentType) {
134
            case Catalogo::DOCTYPE_FACTURA      :
135
            case Catalogo::DOCTYPE_BOLETA       : return 'Invoice';
136
            case Catalogo::DOCTYPE_NOTA_CREDITO : return 'CreditNote';
137
            case Catalogo::DOCTYPE_NOTA_DEBITO  : return 'DebitNote';
138
        }
139
    }
140
 
141
    /**
142
     * 
143
     * @param string $documentType 01|03|07|08
144
     * @return array
145
     */
146
    private static function getNamespaceMap($documentType) {
147
        switch ($documentType) {
148
            case Catalogo::DOCTYPE_FACTURA :
149
            case Catalogo::DOCTYPE_BOLETA :
150
                $topNamespace = 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2';
151
                break;
152
            case Catalogo::DOCTYPE_NOTA_CREDITO :
153
                $topNamespace = 'urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2';
154
                break;
155
            case Catalogo::DOCTYPE_NOTA_DEBITO :
156
                $topNamespace = 'urn:oasis:names:specification:ubl:schema:xsd:DebitNote-2';
157
                break;
158
        }
159
        return [
160
            $topNamespace                                                                 => '',
161
            'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2'    => 'cac',
162
            'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2'        => 'cbc',
163
            'urn:un:unece:uncefact:documentation:2'                                       => 'ccts',
164
            'http://www.w3.org/2000/09/xmldsig#'                                          => 'ds',
165
            'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2'    => 'ext',
166
            'urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2'           => 'qdt',
167
            'urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2' => 'udt',
168
            'http://www.w3.org/2001/XMLSchema-instance'                                   => 'xsi'
169
        ];
170
    }
171
172
}
173